Converting huge project from Au3 to multiplatform GUI application

4 posts in this topic

#1 ·  Posted (edited)

Hello everyone,

Finally I decide to ask hard question about one of the project which I currently maintain:

Big World Setup aka mod installer for infinity engine games like BG, IWD, PST etc

Project page:

More screenshot:

General Features

  • downloading mods (please see remarks!)
  • easy mod installation
  • correct install order of mods/components
  • handle mod and components conflicts and auto solve them
  • easy backup creation/restoring
  • ability to add you own mods

Internal Features (every single feature which you see here is already working in autoit)


Big World Setup features list for developing new version of it:


General guides:
- next version of Big World Setup should not be named "Big World Setup <something>"
- threat changing of the options by players as hacking of the pentagon
- ideally, next BWS should be developed using language which doesn't require compilation for rapid development/recreation of every important features of old BWS


What things next Big World Setup don't need:
- beautiful GUI:


Next BWS needs a GUI Framework which will be able to dynamically add/modify/remove mod components/provided values directly from the mod list in order to add new mod components directly via right-click at mod name > "Add new component"


Auto-Update of the main application:
- this should be the first feature which you should develop and test. Do not make the same mistake as 90% of application aka "we will develop auto-update later, now we will just point to archive download" - it will stay this way forever
- proper, best and flawless auto-update process, exactly the same which Spotify application has:

1. No popups, questions, confirmation dialog etc for auto-update
2. Application silently check for updates
3. when it finds it, it  silently download and extract new version of the application to update folder
4. at the next start of the application, it will check if there is a new folder with new version of the app
5. if yes, app will be launched from the new folder
6. exept when the installation process was stoped and the application will resume already ongoing weidu mods installation

- this way, users will always get latest version of the app without any interference and without possibility to break ongoing installation with changes made to install order


Main Features:
- support for single game: BG2, BG1EE, BG2EE, IWD1, IWD1EE, IWD2, PST, PSTEE
- support for multi games: BGT, EET
- auto-detection of the game paths ( registry, default location )
- detection of the proper game installations for games with different releases (BG1/BG2 CD's full installation)
- detection of the missing patches for classic version of the games
- verifying clean installation state of the games, no files inside overide + empty weidu log
- creating and restoring special backups of the games which skips Data\* files for much smaller size

- ability to choose multiple languages for available mods list: PO,EN,GE means 'give me all mods in polish and use it as main language, when there is no polish, choose english, if there is no polish or english, choose greman, dont show mods without atleast one of the selected language)


Compilation of mods aka Custom Mod Packs
- build-in compilation of the mods: minimal, recommended, standard, expert + few user-made compilation
- enabling expert components should be possible only by choosing expert compilation
- different colors/icons for different mods category (expert=red, recommended=green)


- multi-thread mods download from various filehosting
- some of the filehosting require workarounds


- proper extraction of the mods archive, including taking care of unnecessary duplicated folders
- hacking of the NSIS installers which doesn't provide a way to extract the mod files unless extracted
  (invoke exe, redirect and wait for extraction, kill NSIS process)
- OverwriteFiles function

Conflicts types:
- All mods/components depend another, so the mods will not be allowed to be installed alone. Only in a bunch of all mods.
- Multiple mods/components need another (to coexist). The mods X1, X2, [...Xn] need Y if installed together. Y is not needed if any of X is missing.
- One mod/component need multiple others. The mod X needs Y1, Y2, [...Yn] to be installed. This does not mean that Y1 needs Y2.

- One (or more) components need one of multiple possible components. So if any of the components on the right are installed, the dependency is solved.

- Advanced conflict - check Splits String by ':' (lets call it area). If one of the items is selected (or all of a group if '&' is used), it's displayed as a conflict. Advantage to normal conflicts: *Mods in an area are not treated as conflicts. *Mods can have conflicts in groups. So if two combined mods have a conflict with a third one, this is the ways to go.
The mods X1, X2, [...Xn] all have a conflict with Y. X1 and X2 do not have a conflict, so they can be installed without problems.

- One mod needs another - not opposite
- One or more mod has conflicts with another
- One or more component has conflicts with another. You can use combination of (-) and (number).

- Mods that depend on BGT/EET, a special language-selection or a version of the game are listed in the Game.ini's [Purge]-section. These are not shown in the selection-menu if the conditions are not matched, so people don't get confused.
- a connection for some specific fix for another mod but only for main language of the mods translation that is on top of "BWS Translation" section.

Conflicts Solve:
- automatically
- manually via GUI

Additional Logic:
- continue installation
- report errors
- pause when errors occur
- ignore errors and continue installation
- do not pause installation for skipped components


Saving and loading user chosen mod/component lists
- export/import of the mod selection along with custom user answers


Comandline hook:
- save all output without affecting performance
- detect certain events (weidu errors, weidu skipped components)
- providing answers to questions displayed inside commandline


Save game backups
- since every installation is different, next BWS should backup all save games


- log for checking if the mod packages are online
- log for mod extraction
- log for weidu installation


It look as simple GUI application but it has quite complicated logic regarding "handle mod and components conflicts and auto solve them" - this is most important feature of the app.

This app needs to be converted into multi-platform GUI application because Enhanced Editions of the game can be played on OSX and Linux also. But for the past 6 years, there wasn't a single gamer/developer who would try to convert this app using multi-platform language and GUI. 

This is the moment when I'm asking for help:

- Which language would suit the best for multi-platform GUI application?  c#,python,java or other?

- Is there any general approach for such conversion? 

- Does autoit community/developer have some experience with converting autoit GUI applications into multi-platform GUI app by using multi-platform language like c#,python,java

- Is there someone who isn't scared by looking at the source code of the application and feature list to help me with converting or even begin with creating multi-platform GUI app template which will just simply run the same commandline for every system ? 

If there is something else which you would know, pleas ask and I will try to answer my best.


Edited by ALIENQuake

Share this post

Link to post
Share on other sites

One last thing: If we are talking about paid work, how much it would cost? It's hard to say how long it would take to recreate most important features but I would say it's minimum 3 months.

Share this post

Link to post
Share on other sites

#3 ·  Posted (edited)


Maybe my suspended project may help


First start with running the exampels under

The examples cover all the functions ( I wrote.
use the examples and play with them in depth.

I do not have much time at the moment to give a lot of support. I checked the functions but that does not guarantee they are bug free. If you find a problem, please report it (inside github platform) 


I would note that I am not going to continue to develop these functions in the coming months. Feel free to implement any missing function you need.
please share the code of these missing functions so I'll add them later (of course, I will mention the name of author).
If you want me to add missing functions in my project page, follow the same  standard of organizing the code:

  • If you make new function for GUI - The function must be inside gui.h under "CU3_NAMESPACE_START" .
  • If the function have the same name of it's parallel function (in Autoit), the function must be the same also in it's parameters and behavior (as described in the Help file of Autoit)
  • If the function is not exactly the same like in Autoit, The function name must end with "_C"
  • Use the the standard retun type "CU3_CTRL" If necessary.  If you think to change this standard, do it after very careful thought.
    • Don't make any changes that will force you to change the functions I worte




Oops, I had a misunderstanding .. I thought you wanted to do this work yourself. I understand that you are asking someone else to do it .. I do not have time to perform such work. I am currently busy with other things. 


Edited by gil900

Share this post

Link to post
Share on other sites

Currently locked and under review by the Mod team for:

  • Check whether this is in conflict with our Forum rules.
  • "rent-a-coder" type question.


Visit the SciTE4AutoIt3 Download page for the latest versions        Beta files                                                          Forum Rules
Live for the present,
Dream of the future,
Learn from the past.

Share this post

Link to post
Share on other sites
This topic is now closed to further replies.

  • Similar Content

    • Valnurat
      By Valnurat
      A user have to be a member of specific groups. If the user is a member of 1 of the below groups it has to a member of "Mailuser_". If not then I need to add user to the "Mailuser_".
      But how can I search in the array. In the code I do If...then, but it will just jump to my next if...then and search in that "index". But that is not what I want. It seems that I have to do a new For...To, right? But there have to be a easier way to do this.
      Func FindADInfo() Local $sUsersSource, $sBackupFolder, $sSiteHomePath, $sFileOpenDialog Local $aSamAccountName[1][1], $aTempSamAccountName[1] For $i = 0 to UBound($aAllMailSites) - 1 if $aAllMailSites[$i] <> "" then if $bDebugMode Then ConsoleWrite("Collecting AD info for " & StringRight($aAllMailSites[$i], 2) & StringMid($aAllMailSites[$i], StringInStr($aAllMailSites[$i], ",") - 2, 2) & @CRLF) Else _FileWriteLog($hFile, "Collecting AD info for " & StringRight($aAllMailSites[$i], 2) & StringMid($aAllMailSites[$i], StringInStr($aAllMailSites[$i], ",") - 2, 2)) EndIf $aSamAccountName = _AD_GetObjectsInOU($aAllMailSites[$i] & ",OU=company,DC=AD,DC=company,DC=ORG", "(&(objectcategory=person)(objectclass=user))",2, "sAMAccountName,distinguishedName,displayname", "displayname") _ArrayDelete($aSamAccountName, 0) for $x = 0 to UBound($aSamAccountName) -1 if StringInStr($aSamAccountName[$x][1],"Resources") = 0 Then local $aUserGroups = _AD_GetUserGroups($aSamAccountName[$x][1]) _ArrayDisplay($aUserGroups,$aSamAccountName[$x][0]) if IsArray($aUserGroups) Then for $y = 1 to UBound($aUserGroups) -1 ;MsgBox(0,"",$aUserGroups[$y]) If StringInStr($aUserGroups[$y],"Office365_E3_SharedMailBox") <> 0 Or StringInStr($aUserGroups[$y],"Office365_E3_OPP_EXO_SPO") <> 0 Or StringInStr($aUserGroups[$y],"Office365_E3_OPP_EXO_SFBPLUS") <> 0 Or StringInStr($aUserGroups[$y],"Office365_E3_OPP_EXO_SFB") <> 0 Or StringInStr($aUserGroups[$y],"Office365_E3_OPP") <> 0 Or StringInStr($aUserGroups[$y],"Office365_E3_FULL") <> 0 Or StringInStr($aUserGroups[$y],"Office365_E1_EXO") <> 0 Then If StringInStr($aUserGroups[$y],"Mailuser_") = 0 Then ConsoleWrite($aSamAccountName[$x][0] & " Add to mailgroup") EndIf EndIf Next EndIf EndIf Next EndIf Next EndFunc ;==>FindADInfo  
    • breakbadsp
      By breakbadsp
      I want to run a python script from autoit. 
      I know we can do this with shellexecute or run , but this python script takes 3 cmd line arguments.
      How to pass them from autoit script?
      I tried many ways.
      Following solution also not working 
      e.g. RunWait( 'fullpath\Python.exe Scriptpath\  -f "file.log" -k "key" -e "errMsg" ')
      PFB description:
    • VaishnaviBUtpat
      By VaishnaviBUtpat
      <!DOCTYPE html> <html lang="en" xml:lang="en" style="height: 100%;" xmlns=""> <head> <title></title> <style> * { margin: 0; padding: 0; } .th-lk { color: #3665d0; font-family: Arial; font-size: small; text-decoration: none; } .th-lk { vertical-align: 0px; } .th-menu2 .th-lk { line-height: 2em; margin-bottom: 0px; margin-right: 0px; overflow: hidden; padding: 0; text-decoration: none; text-overflow: ellipsis; white-space: nowrap; width: 100%; } .th-menu2 .th-lk { color: black; font-weight: bold; } .th-menu2 > li > .th-lk { display: block; padding-left: 8px; width: auto; } .th-menu2 .th-menu2-sub-item .th-lk, .th-menu2 .th-menu2-sub-item-hov .th-lk { margin-right: 20px; } .th-menu2-sub-item { position: relative !important; } .th-menu2 .th-menu2-item, .th-menu2 .th-menu2-item-hov, .th-menu2 .th-menu2-sub-item, .th-menu2 .th-menu2-sub-item-hov { background-repeat: repeat-x; border-left-style: solid; border-left-width: 1px; border-right-style: solid; border-right-width: 1px; border-top-style: solid; border-top-width: 1px; height: 2em; list-style: none; margin-bottom: 0px; padding: 0; width: 100%; } .th-menu2 .th-menu2-item, .th-menu2 .th-menu2-item-hov, .th-menu2 .th-menu2-sub-item, .th-menu2 .th-menu2-sub-item-hov { background-color: #ECECEC; background-image: url(sap_skins/default/styling/lshape/chg_butt_det_nav.gif); border-left-color: #d3d1ce; border-right-color: #d3d1ce; border-top-color: #d3d1ce; border-top-width: 0px; } .th-menu2 { border: 0 solid black; left: 0px; list-style: none; margin: 0; padding: 0; position: relative; } .th-menu2 { z-index: 10006; } .th-menu2 { background-color: white; } div { zoom: 1; } .th-sc-content { left: 0px; position: absolute; top: 0px; } .th-sc-container { left: 0px; overflow: hidden; position: relative; top: 0px; } .th-sc-top { position: relative; } .th-sc-top, .th-sc-content, .th-sc-container, .th-sc-buttondown, .th-sc-buttonup { width: 172px; } .th-sc-buttonup, .th-sc-container { z-index: 10101; } .th-sc-top { z-index: 10100; } body, td, th { font-family: Arial,Helvetica,sans-serif; font-size: small; } .th-l-navcontainer, .th_l_downcontainer { border-right-style: solid; border-right-width: 1px; width: 172px; } .th-l-navcontainer, .th_l_downcontainer { background-color: white; border-right-color: #d3d1ce; } body, html { margin: 0px; border: 0; margin: 0; } </style> </head> <body><form name="myFormId" id="myFormId" action="/sap(ZT1TVVJEWDFWVFVsOWZYMTlmTWpNNU9UWmZXWTlwZG5telZ1RGhBSUFBQ3Nyc2tBPT0=)/bc/bsp/sap/crm_ui_frame/;sap-language=EN&amp;sap-domainrelax=min" method="post" target="WorkAreaFrame2"><div class="th-ajax-area" id="rootAreaDiv"><div id="C1_W1_V2" tgt="" dhe="false"><table width="100%" style="table-layout: fixed;" cellspacing="0" cellpadding="0"><tbody><tr><td><table width="100%" style="table-layout: fixed;" cellspacing="0" cellpadding="0"><tbody><tr valign="top"><td class="th-l-navcontainer" id="th_l_navcontainer"><div class="th-sc-top" id="C1_W1_V2_thescroll" style="height: 786px;"><div class="th-sc-container" id="C1_W1_V2_thescroll_scbox" style="height: 786px;"><div class="th-sc-content" id="C1_W1_V2_thescroll_sccontent"><div class="th-ajax-area" id="C1_W1_V2_$navbar"><div id="C7_W35_V36" tgt="" dhe="true" excevt="" intevt=";" automode="true"><div class="th-ajax-area" id=""><ul class="th-menu2" id="C7_W35_V36_mainmenu" style="width: 171px;"><li class="th-menu2-sub-item"><a title="Sales Cycle" class="th-lk" id="C7_W35_V36_UTL-SLS" onclick="htmlbSubmitLib('htmlb',this,'thtmlb:link:click:0','myFormId','C7_W35_V36_UTL-SLS','UTL\x2dSLS\x2dWC',0);return false" onfocus="thSaveKbFocus(this);" oncontextmenu="return false;" href="javascript:void(0)">Sales Cycle</a></li></ul></div></div></div></div></div></div></td></tr></tbody></table></td></tr></tbody></table></div></div></form></body> </html> How to capture above HTML element using AutoIT
    • cu0x
      By cu0x
      Hello guys,
      im trying to solved a problem that I have.
      Need to get some chinese text from an old Wise script, and in the wise file says f.e. Ù×÷ϵͳ¡£ ÇëÉý¼¶Ä. Is there any way to convert it to traditional chinese?
      Already tryied the following code...
      #include <MsgBoxConstants.au3> Example() Func Example() ; Define the string that will be converted later. ; NOTE: This string may show up as ?? in the help file and even in some editors. ; This example is saved as UTF-8 with BOM. It should display correctly in editors ; which support changing code pages based on BOMs. Local Const $sString = "Ù×÷ϵͳ¡£ ÇëÉý¼¶Ä" ; Temporary variables used to store conversion results. $dBinary will hold ; the original string in binary form and $sConverted will hold the result ; afte it's been transformed back to the original format. Local $dBinary = Binary(""), $sConverted = "" ; Convert the original UTF-8 string to an ANSI compatible binary string. $dBinary = StringToBinary($sString) ; Convert the ANSI compatible binary string back into a string. $sConverted = BinaryToString($dBinary) ; Display the resulsts. Note that the last two characters will appear ; as ?? since they cannot be represented in ANSI. DisplayResults($sString, $dBinary, $sConverted, "ANSI") ; Convert the original UTF-8 string to an UTF16-LE binary string. $dBinary = StringToBinary($sString, 2) ; Convert the UTF16-LE binary string back into a string. $sConverted = BinaryToString($dBinary, 2) ; Display the resulsts. DisplayResults($sString, $dBinary, $sConverted, "UTF16-LE") ; Convert the original UTF-8 string to an UTF16-BE binary string. $dBinary = StringToBinary($sString, 3) ; Convert the UTF16-BE binary string back into a string. $sConverted = BinaryToString($dBinary, 3) ; Display the resulsts. DisplayResults($sString, $dBinary, $sConverted, "UTF16-BE") ; Convert the original UTF-8 string to an UTF-8 binary string. $dBinary = StringToBinary($sString, 4) ; Convert the UTF8 binary string back into a string. $sConverted = BinaryToString($dBinary, 4) ; Display the resulsts. DisplayResults($sString, $dBinary, $sConverted, "UTF8") EndFunc ;==>Example ; Helper function which formats the message for display. It takes the following parameters: ; $sOriginal - The original string before conversions. ; $dBinary - The original string after it has been converted to binary. ; $sConverted- The string after it has been converted to binary and then back to a string. ; $sConversionType - A human friendly name for the encoding type used for the conversion. Func DisplayResults($sOriginal, $dBinary, $sConverted, $sConversionType) MsgBox($MB_SYSTEMMODAL, "", "Original:" & @CRLF & $sOriginal & @CRLF & @CRLF & "Binary:" & @CRLF & $dBinary & @CRLF & @CRLF & $sConversionType & ":" & @CRLF & $sConverted) EndFunc ;==>DisplayResults Thanks a lot!
    • nacerbaaziz
      By nacerbaaziz
      Hi dear
      I want create retractable bar using autoit
      I tried creating slider, but there's a problem with screen reader for the blind, so is there another retractable tape?
      It is advisable to not accept dragging with the keybord only with  mouse
      This bar is needed in the process of raising and lowering the volume
      I hope that there is a solution to do that
      i waiting your responses.
      Thanks in advance to all members and administrators