Post reply

Warning: this topic has not been posted in for at least 120 days.
Unless you're sure you want to reply, please consider starting a new topic.
Name:
Email:
Subject:
Message icon:

Verification:
Type the letters shown in the picture
Listen to the letters / Request another image

Type the letters shown in the picture:
What color is grass?:
What is the seventh word in this sentence?:
What is five minus two (use the full word)?:

shortcuts: hit alt+s to submit/post or alt+p to preview


Topic Summary

Posted by: Wisp
« on: February 26, 2017, 08:42:35 AM »

For the TP2 part, your code could be a lot simpler. The loop logic and READLNs could be replaced with something like ACTION_GET_PREF key variable and a few conditionals and additional  GET_PREFs.

For the user, those who are disinclined to tinker would get whatever sane defaults you have configured. The rest, this stuff's still on the drawing board, but they could, for example, edit some kind of tree view, schematically:
Code: [Select]
-function {constraint: value between 1 and 3, inclusive}
-equation
-|_constant {constraint: value is an integer}
-|_level {constraint: value is an integer}
-|_etc.
-fixed
-|_timer1 {etc.}
-|_etc.
where -|_ is intended to mean the item is nested under another item. The constraints would limit the kind of values the user could enter and also their ranges and such, as appropriate.
Posted by: The Imp
« on: February 25, 2017, 05:58:26 PM »

How much harder would it be to code the custom numeric inputs within the new system ? The ACTION_READLN was ... kind easy, so I just want to ask.
Cause I have a mod that gets affected by this. I might have used too many READLN's in it, so that the BWS went and used a .txt to insert values to it. Which was not a big deal, but it wasn't definitely the optional solution for anyone.
I am hoping that this would remove the need to rely into .ini files during install phase, as those are good for game settings, but not for setups(as their results can't be changed after, while settings can). The reasoning is the same as with the BWS using a .txt file to configure the setup... it results into not being able to be interacted with.

I have been tinkering around the mod a couple times since the last and official update... well some of the new(er) weidu functions are GREAT (LPF ... )... but it's always a tide to turn it into a new way of making things, and I have already given up a few times.
And I ask this mostly because my mod is mostly about just using the ACTION_READLN as the essential feature. :/

If you want to see details, well just read this and try to understand it, yes, there's insults in it too... mocking the user for giving bad inserts. They are not intended to be seen by most users. And it doesn't work cause the LPF is not up to snuff, but the essential part about the READLN is in it.
Code: [Select]
BEGIN ~Arcane Spell Refreshment~ DESIGNATED 9

// we zero values and in preparation of the actual ones
OUTER_SET "function" = 0
OUTER_SET "constant" = 0
OUTER_SET "level_variable" = 0
OUTER_SET "ex_base" = 0
OUTER_SET "exponent" = 0
OUTER_SET "root" = 0
OUTER_SET "answer" = 0
OUTER_SET "timer1" = 0
OUTER_SET "timer2" = 0
OUTER_SET "timer3" = 0
OUTER_SET "timer4" = 0
OUTER_SET "timer5" = 0
OUTER_SET "timer6" = 0
OUTER_SET "timer7" = 0
OUTER_SET "timer8" = 0
OUTER_SET "timer9" = 0
OUTER_SET "timer11" = 0
OUTER_SET "timer12" = 0
OUTER_SET "timer13" = 0
OUTER_SET "timer14" = 0
OUTER_SET "timer15" = 0
OUTER_SET "timer16" = 0
OUTER_SET "timer17" = 0
OUTER_SET "timer18" = 0
OUTER_SET "timer19" = 0

OUTER_WHILE ("%answer%" STRING_COMPARE_REGEXP "[yY]") BEGIN

PRINT ~Which type would you like the timer to be for the arcane spells to be set at?
1) Timers are defined by a funtion, based on the spells own level.
2) Timers are set individually per level.
3) Timers are randomized for each level.~

PRINT ~So in:
1) timer = constant + spell level * level variable + exponential base * spell level ^ (exponent/root)
2 & 3) timer = ???
Do not worry, you'll get to see what the value is for each levels will end up being and you can cancel/reset them if you do not wish to install with the set timers.~

ACTION_READLN function
OUTER_WHILE (!(IS_AN_INT %function%) || (%function% > 4) || (%function% < 1)) BEGIN
  PRINT ~Which type of function would you like the timer to be for the arcane spells ?~
  PRINT ~So in:
1) timer = constant + spell level * level variable + exponential base * spell level ^ (exponent/root)
2 & 3) timer = ???
Do not worry, at the end you'll get to see what the for each levels will end up being and you can cancel/reset them if you do not wish to install with the set timers.~
  ACTION_READLN function
END

ACTION_IF (%function% = 1) THEN BEGIN
PRINT ~Set *constant* for all levels:
Timers = constant + spell level * level variable + exponential base * spell level ^ (exponent/root)~
ACTION_READLN constant
OUTER_WHILE !(IS_AN_INT %constant%) BEGIN
  PRINT ~We'll try to keep it on the level dude.
So set the darn *constant* to a number, dude. OK ?~
  ACTION_READLN constant
  END
END

ACTION_IF (%function% = 1 AND IS_AN_INT %constant%) THEN BEGIN
PRINT ~Set the *level variable* for the levels:
Timers = %constant% + spell level * level variable + exponential base * spell level ^ (exponent/root)~
ACTION_READLN level_variable
OUTER_WHILE !(IS_AN_INT %level_variable%) BEGIN
  PRINT ~We'll try to keep it on the level dude.
So set the darn *level variable* to a number, dude. OK? Dude.~
  ACTION_READLN level_variable
  END
END

ACTION_IF (%function% = 1 AND IS_AN_INT %constant% AND IS_AN_INT %level_variable%) THEN BEGIN
PRINT ~Set the exponential base:
Timers = %constant% + spell level * %level_variable% + exponential base * spell level ^ (exponent/root)~
ACTION_READLN ex_base
OUTER_WHILE !(IS_AN_INT %ex_base%) BEGIN
  PRINT ~Set the exponential base~
  ACTION_READLN ex_base
  END
END

ACTION_IF (%function% = 1 AND IS_AN_INT %constant% AND IS_AN_INT %level_variable% AND IS_AN_INT %ex_base%) THEN BEGIN
PRINT ~Set the *exponential base* value that will multiply the exponential and divided by the root you'll decide, later.
Timers = %constant% + spell level * %level_variable% + %ex_base% * spell level ^ (exponent/root)~
ACTION_READLN exponent
OUTER_WHILE !(IS_AN_INT %exponent%) BEGIN
  PRINT ~Try, well to keep it on the level dude.
So set the darn *exponent* to a number, dude. OK ?~
  ACTION_READLN exponent
  END
END

ACTION_IF (%function% = 1 AND IS_AN_INT %constant% AND IS_AN_INT %level_variable% AND IS_AN_INT %ex_base% AND IS_AN_INT %exponent%) THEN BEGIN
PRINT ~Set the exponential *root* or the exponents divider, remember that dividing a number with 1, is the number itself:
Timers = %constant% + spell level * %level_variable% + %ex_base% * spell level ^ ( %exponent% / root)~
ACTION_READLN root
OUTER_WHILE !(IS_AN_INT %root%) BEGIN
  PRINT ~We'll be trying to keep it on the level dude.
So set the darn *root* to a number, dude. K?~
  ACTION_READLN root
  END
END

ACTION_IF (%function% = 1 AND IS_AN_INT %constant% AND IS_AN_INT %level_variable% AND IS_AN_INT %ex_base% AND IS_AN_INT %exponent% AND IS_AN_INT %root%) THEN BEGIN
OUTER_SET timer1 = (%constant% + %level_variable% + %ex_base% * 1 ** (%exponent% %root%))
OUTER_SET timer2 = (%constant% + 2*%level_variable% + %ex_base% * 2 ** (%exponent% %root%))
OUTER_SET timer3 = (%constant% + 3*%level_variable% + %ex_base% * 3 ** (%exponent% %root%))
OUTER_SET timer4 = (%constant% + 4*%level_variable% + %ex_base% * 4 ** (%exponent% %root%))
OUTER_SET timer5 = (%constant% + 5*%level_variable% + %ex_base% * 5 ** (%exponent% %root%))
OUTER_SET timer6 = (%constant% + 6*%level_variable% + %ex_base% * 6 ** (%exponent% %root%))
OUTER_SET timer7 = (%constant% + 7*%level_variable% + %ex_base% * 7 ** (%exponent% %root%))
OUTER_SET timer8 = (%constant% + 8*%level_variable% + %ex_base% * 8 ** (%exponent% %root%))
OUTER_SET timer9 = (%constant% + 9*%level_variable% + %ex_base% * 9 ** (%exponent% %root%))
END

ACTION_IF (%function% = 2) THEN BEGIN
PRINT ~What would you like to set the first level refresh timer at?~
ACTION_READLN timer11
OUTER_WHILE !(IS_AN_INT %timer11%) BEGIN
  PRINT ~What would you like to set the first level refresh timer at? K.~
  ACTION_READLN timer11
  END
END

ACTION_IF (%function% = 2) THEN BEGIN
PRINT ~What would you like to set the second level refresh timer at?~
ACTION_READLN timer12
OUTER_WHILE !(IS_AN_INT %timer12%) BEGIN
  PRINT ~What would you like to set the second level refresh timer at? I.~
  ACTION_READLN timer12
  END
END

ACTION_IF (%function% = 2) THEN BEGIN
PRINT ~What would you like to set the third level refresh timer at?~
ACTION_READLN timer13
OUTER_WHILE !(IS_AN_INT %timer13%) BEGIN
  PRINT ~What would you like to set the third level refresh timer at? I.~
  ACTION_READLN timer13
  END
END

ACTION_IF (%function% = 2) THEN BEGIN
PRINT ~What would you like to set the forth level refresh timer at?~
ACTION_READLN timer14
OUTER_WHILE !(IS_AN_INT %timer14%) BEGIN
  PRINT ~What would you like to set the forth level refresh timer at? T.~
  ACTION_READLN timer14
  END
END

ACTION_IF (%function% = 2) THEN BEGIN
PRINT ~What would you like to set the fifth level refresh timer at?~
ACTION_READLN timer15
OUTER_WHILE !(IS_AN_INT %timer15%) BEGIN
  PRINT ~What would you like to set the fifth level refresh timer at? O.~
  ACTION_READLN timer11
  END
END

ACTION_IF (%function% = 2) THEN BEGIN
PRINT ~What would you like to set the sixth level refresh timer at?~
ACTION_READLN timer16
OUTER_WHILE !(IS_AN_INT %timer16%) BEGIN
  PRINT ~What would you like to set the sixth level refresh timer at? S.~
  ACTION_READLN timer16
  END
END

ACTION_IF (%function% = 2) THEN BEGIN
PRINT ~What would you like to set the seventh level refresh timer at?~
ACTION_READLN timer17
OUTER_WHILE !(IS_AN_INT %timer17%) BEGIN
  PRINT ~What would you like to set the seventh level refresh timer at? F.~
  ACTION_READLN timer17
  END
END

ACTION_IF (%function% = 2) THEN BEGIN
PRINT ~What would you like to set the eight level refresh timer at?~
ACTION_READLN timer18
OUTER_WHILE !(IS_AN_INT %timer18%) BEGIN
  PRINT ~What would you like to set the eight level refresh timer at? U.~
  ACTION_READLN timer18
  END
END

ACTION_IF (%function% = 2) THEN BEGIN
PRINT ~What would you like to set the ninth level refresh timer at?~
ACTION_READLN timer19
OUTER_WHILE !(IS_AN_INT %timer19%) BEGIN
  PRINT ~What would you like to set the ninth level refresh timer at? K.~
  ACTION_READLN timer19
  END
END

ACTION_IF (%function% = 2 AND IS_AN_INT %timer11% AND IS_AN_INT %timer12% AND IS_AN_INT %timer13% AND IS_AN_INT %timer14% AND IS_AN_INT %timer15% AND IS_AN_INT %timer16% AND IS_AN_INT %timer17% AND IS_AN_INT %timer18% AND IS_AN_INT %timer19% ) THEN BEGIN
OUTER_SET timer1 = (%timer11%)
OUTER_SET timer2 = (%timer12%)
OUTER_SET timer3 = (%timer13%)
OUTER_SET timer4 = (%timer14%)
OUTER_SET timer5 = (%timer15%)
OUTER_SET timer6 = (%timer16%)
OUTER_SET timer7 = (%timer17%)
OUTER_SET timer8 = (%timer18%)
OUTER_SET timer9 = (%timer19%)
END

ACTION_IF (%function% = 3) THEN BEGIN
RANDOM_SEED ~a~
PRINT ~Seed is set at %a%



~
PRINT ~The timers randomized~
OUTER_SET timer1 = RANDOM(1 100)
OUTER_SET timer2 = RANDOM(2 200)
OUTER_SET timer3 = RANDOM(115 298)
OUTER_SET timer4 = RANDOM(101 400)
OUTER_SET timer5 = RANDOM(20 500)
OUTER_SET timer6 = RANDOM(435 727)
OUTER_SET timer7 = RANDOM(350 619)
OUTER_SET timer8 = RANDOM(40 836)
OUTER_SET timer9 = RANDOM(482 1000)
END

ACTION_IF (IS_AN_INT %timer1% AND IS_AN_INT %timer2% AND IS_AN_INT %timer3% AND IS_AN_INT %timer4% AND IS_AN_INT %timer5% AND IS_AN_INT %timer6% AND IS_AN_INT %timer7% AND IS_AN_INT %timer8% AND IS_AN_INT %timer9%) THEN BEGIN

PRINT ~The timers for the Arcane Spell restorations will be as of following:
Level 1 spells: %timer1% real seconds
Level 2 spells: %timer2% real seconds
Level 3 spells: %timer3% real seconds
Level 4 spells: %timer4% real seconds
Level 5 spells: %timer5% real seconds
Level 6 spells: %timer6% real seconds
Level 7 spells: %timer7% real seconds
Level 8 spells: %timer8% real seconds
Level 9 spells: %timer9% real seconds~
    PRINT ~Are you sure you wish to use those ? [y]es/[n]o. I want to [q]uit.~
    ACTION_READLN answer
  END
  ACTION_IF (~%answer%~ STRING_EQUAL_CASE ~n~) THEN BEGIN
  OUTER_SET "function" = 0
  OUTER_SET "constant" = 0
  OUTER_SET "level_variable" = 0
  OUTER_SET "ex_base" = 0
  OUTER_SET "exponent" = 0
  OUTER_SET "root" = 0
  OUTER_SET "answer" = 0
  OUTER_SET "sucfail" = 0
  END
  ACTION_IF (~%answer%~ STRING_EQUAL_CASE ~q~) THEN BEGIN
  FAIL ~You exited from the installator with the q button, you can ignore the weidu error.~
  END
ACTION_IF (~%answer%~ STRING_EQUAL_CASE ~y~) THEN BEGIN
PRINT ~Now, do you wish that the spells are restored when:
1) Only when the casting is completelly successful
2) Even if it's not~
ACTION_READLN sucfail
OUTER_WHILE (!(IS_AN_INT %sucfail%) || (%sucfail% > 2) || (%sucfail% < 1)) BEGIN
  PRINT ~OK man, now you are getting to me nerves alright, answer 1 or 2, got it? Good.~
  ACTION_READLN sucfail
  END
END

//And then we actually set everything
ACTION_IF (timer1 > 0 AND timer2 > 0 AND timer3 > 0 AND timer4 > 0 AND timer5 > 0  AND timer6 > 0 AND timer7 > 0 AND timer8 > 0 AND timer9 > 0 AND %sucfail% = 1) THEN BEGIN
  COPY_EXISTING_REGEXP GLOB ~^.+\.spl$~ ~override~
  PATCH_IF (SOURCE_SIZE > 0x113) THEN BEGIN // protects against invalid files
//LPF ADD_SPELL_EFFECT

  READ_SHORT 0x1c "spl_type"
  READ_LONG  0x34 ~spell_level~

/*

    READ_LONG  0x64 "abil_off"
    READ_SHORT 0x68 "abil_num"
    READ_LONG  0x6a "fx_off"
    READ_SHORT 0x70 "fx_num"
    PATCH_IF ("%spl_type%" = "1") BEGIN

// after which the values are used in a LPF functionality ... that I failed to update into in this component, but I was able to get into it in another... that's not a big thing.
Yes, the functionally separated into 3 ways, the user gives inserts and according to those, it's chosen how many results are asked, and then it's asked if the values are ok, and then those are used in the LPF to modify the in games files, to put it shortly.
Posted by: DavidW
« on: February 25, 2017, 03:20:13 PM »

I don't have a slam-dunk replacement for READLN; if there was one, we wouldn't be here, talking about this. My preferred way of serving the same function would be to configure the mod prior to installation: you check that option, enter some value for the thing and so on. I'm working towards that, but it's going to be some time yet.

SCS does this via INI files (CHECK_INI function to read in the data, INI a straightforward text file) and anyone is welcome to borrow the code. Crude and simple compared to what could be done in a GUI, of course, but it has the advantage of being stably working right now.
Posted by: AL|EN
« on: February 18, 2017, 07:42:47 AM »

And I would love to do a fresh start with new BWS and web-based interface for mod db. It would not instantly kill old BWS but it would follow some adoption process for both old and new BWS. So maybe there is a third way for weidu? I mean, if you have any road map or plans for weidu (may'be it is nice idea to share them with community) you could fix remaining bugs and at*some*point you could stop adding new features. And then start preparing next weidu concept. It might also involve engine-related changes in order to improve compatibility between mods/saved games (for eg different .tlk files for each mod?) There is Avenger on the Beamdog team so there is a chance for discussion. I think that when next weidu could have new compatibility features, there is a chance to gain community attention.

When I think about it, there is also one thing: you are single point of fa..SUCCESS! Yet, still single. Moving to new, popular programming language could not only bring fresh blood but also save community from unexpected things which may happen in life. BWS facing the same issues: main developer left and nobody knows au3 and nobody want to learn this outdated and mostly useless language without decent tools nad unicode support. The au3 community wasn't really helpful in terms of conversion BWS into c#/java/python either :/ The same story might happen to weidu with OCalm.
Posted by: Wisp
« on: February 14, 2017, 03:41:48 PM »

I don't have a slam-dunk replacement for READLN; if there was one, we wouldn't be here, talking about this. My preferred way of serving the same function would be to configure the mod prior to installation: you check that option, enter some value for the thing and so on. I'm working towards that, but it's going to be some time yet.

Conceptually, I'd love to do a fresh start with a modding tool for IE (but then, who wouldn't?). Start from a mature scripting language embedded in a portable executable, be mindful of lessons learned and the sky's the limit. But aside from the amount of work, my crystal ball says adoption of a new tool would be poor to non-existent. Aside from the sheer number of mods that are in limbo or functionally or literally abandoned, ask any modder if they'd care to reimplement their stuff in new tool, new language and I think you'd find a rather complete lack of enthusiasm. Being rid of the technical problems isn't much good when there are few to no mods.
Posted by: AL|EN
« on: February 14, 2017, 02:59:12 AM »

Ok wisp, I'm all for getting rid of that interactive READLN shit in the first place. I really do! Because I think that you cannot possibly be happy about weidu not being able to provide data for unattended mod installation without need logic analyse and writing come custom answer file, which will be outdated as soon as modder change component number inside tp2. But how do you think I should solve this problem? I'm for any solution which allows modders/community tools to get list of all components and pre-defined answers directly from weidu output. Just tell me what's you solution for this.


I really don't see any way to do it, without support from "IE mod installer tool". It's not that I didn't try these problem on my own - the amount of custom regex which I've try to extract READLN data was scary. But it wasn't working due to how different various weidu code was. So please tell me how you want to get rid of READLN problem?

And when I say "nothing should prevent further progress" i mean literally nothing. It has been more than 10 years of weidu development and maybe it's time for a changes. You cannot have progress without changes.  If the "compatibility concerns" are preventing you from creating one of the most basic feature then ... the hell with backward compatibility! Create new "weiduNext" where you will be free from bad things of the past. And if the OCalm language is a limiting factor ... use the one which is more powerful, more popular ( you will get help from other developers) and without limitations. If you need it, then go for it! As far as I know, you don't have to explain oneself to anyone since currently there is only you who know OCalm/actively developing weidu.

Quick note about 2: for such component, I don't need to know every possible value in defined range. I just need to know that such subcomponent exist. And the whole "automatic installation" would be possible for everything except 5% of subcomponents - it's a light-year difference compared to current state. But removing READLN is way, way better solution.
Posted by: Wisp
« on: February 13, 2017, 04:06:51 PM »

Off-topic on the subject of config files, so I split it.

No, for vaguely the following reasons:
1. Not backward-compatible with existing READLN usage, nor am I coding optional add-ons to READLN. If it's more work for the modder, they'd only use it if they were already sympathetic to your plight, in which case I'd advise #3, below.
2. What about mods that ask you to enter a value between min_value and max_value, with more than a manageable number of possible values, or that otherwise have ambiguous input values?
3. The solution to your problem isn't layering more crap onto READLN, it's getting rid of that interactive shit in the first place. Subcomponents fill the same niche of small and finite sets that your proposed solution would occupy.
Posted by: AL|EN
« on: February 13, 2017, 04:47:11 AM »

Let me add my two cents into this matter as someone who see the bigger picture of the 'mod installation' state. Some time ago I've discovered "Mod-configuration system" topic and because recent post at G3 forums about "mod database" I was going to rise READLN issue again. It's the main blocker of any kind of progress in terms of "automatic mod installation" - please see http://forums.pocketplane.net/index.php/topic,29449.msg337315.html - if the mod contains READLN actions, it's impossible for the "current state of the weidu"  to get values and questions from components which require user interaction. It' is also not possible to create automatic solution for uploading required mod data into "mod database" - modders would have to manually fill some data for every component which require READLN. And when they update weidu code (add one more combination for the user typed value) and forgot to update ini, mod installation will fail.

My proposition is to add internal weidu framework for new mods (because I think that you cannot simply remove/replace READLN) : you have to define component values and answers in a 'standard' way, which could then output full data about component and choices. Most of the mods use 2-level deep so there shouldn't be a problem to create such framework. Even if the mods use n-subcomponetns, it sohuld nt be a problem for creating n-subcomponents tree.
Example existing code:
Code: [Select]
OUTER_SPRINT ~ajantimer~ ~placeholder_value~
  OUTER_WHILE (!(IS_AN_INT ~ajantimer~) OR (~ajantimer~ > 0x5) OR (~ajantimer~ < 0x1)) BEGIN
    PRINT @1108
    ACTION_READLN ~ajantimer~
  END
        ACTION_IF ("ajantimer" = 1) THEN BEGIN
        APPEND ~gtimes.ids~ ~3600 AJROM_TIMER~
        PRINT @1109
        END
        ACTION_IF ("ajantimer" = 2) THEN BEGIN
        APPEND ~gtimes.ids~ ~2700 AJROM_TIMER~
        PRINT @1110
        END
        ACTION_IF ("ajantimer" = 3) THEN BEGIN
        APPEND ~gtimes.ids~ ~1800 AJROM_TIMER~
        PRINT @1111
        END
        ACTION_IF ("ajantimer" = 4) THEN BEGIN
        APPEND ~gtimes.ids~ ~900 AJROM_TIMER~
        PRINT @1112
        END
        ACTION_IF ("ajantimer" = 5) THEN BEGIN
        APPEND ~gtimes.ids~ ~5400 AJROM_TIMER~
        PRINT @1113
        END

should be coded by 'framework' something like this:

Component-<componentNumber>-Main "variableName" "Name of the component"
variableName-Subcomponent-1 "valueForSubcomponent1" "descriptionForSubcomponent1" > { execute specific code }
variableName-Subcomponent-2 "valueForSubcomponent2" "descriptionForSubcomponent2" > { execute specific code }
variableName-Subcomponent-3 "valueForSubcomponent3" "descriptionForSubcomponent3" > { execute specific code }
variableName-Subcomponent-4 "valueForSubcomponent4" "descriptionForSubcomponent4" > { execute specific code }
variableName-Subcomponent-5 "valueForSubcomponent5" "descriptionForSubcomponent5" > { execute specific code }


Example:
Component-1-Main "ajantimer" "The BG1 NPC Project: Ajantis Romance Core (teen content)"
ajantimer-Subcomponent-1 "1" "Press 1 for 15 minutes banter time" { APPEND ~gtimes.ids~ ~900 AJROM_TIMER~ }
ajantimer-Subcomponent-2 "2" "Press 2 for 30 minutes banter time" { APPEND ~gtimes.ids~ ~1800 AJROM_TIMER~ }
...


The goal is to get output for each component, subcomponent and accepted value from --list-components. So instead of this output:
Code: [Select]
~BG1NPC\BG1NPC.TP2~ #0 #9 // The BG1 NPC Project: Ajantis Romance Core (teen content): v21_20150320we would get this:
Quote
~BG1NPC\BG1NPC.TP2~ #0 #9 // The BG1 NPC Project: Ajantis Romance Core (teen content): v21_20150320
~BG1NPC\BG1NPC.TP2~ #0 #9 #1 // The BG1 NPC Project: Ajantis Romance Core (teen content): v21_20150320 - Press 1 for 15 minutes banter time
~BG1NPC\BG1NPC.TP2~ #0 #9 #2 // The BG1 NPC Project: Ajantis Romance Core (teen content): v21_20150320 - Press 2 for 30 minutes banter time

It would allow for:
- automatic mod installation without creating custom answer file
- providing a special script for the modders which will gather all required info about mods and upload it into mod database every time when they will release new version of the mod, without any additional work at their side (no chances for errors/missing info)
- create website and backend service for uploading mod and testing successful installation (you upload mod, backend install you mod and  present results), testing install order of the various mod combination via automated way (choose mods, select install order, test it, see outcome, test another install order etc)

Th key factor is "current state of the weidu" - nothing should prevent further progress which will makes players, modders and "community tools maintainers" (as I'm not focusing only about BWS) easier. There is no other limitation/missing feature which have such devastating impact on the whole aspect of the mod installation. And there is currently nothing which could have bigger impact at it. Please reconsider implementing this feature.