Jump to content

cmorgan

Gibberlings
  • Posts

    7,198
  • Joined

  • Last visited

Everything posted by cmorgan

  1. Ok... now how I missed the TES thing is a mystery... except my Skyrim was probably dormant in favor of Civ and SWTOR. That link was massively eye-opening, K4thos.
  2. Cool stuff - and good to think about. And my stuff was *definitely* not giving legal advice - it was completely my own speculation and example! And I am going to go look up Fair Use Exception, as that sounds like something I would like to know more about...
  3. I'm silly - and I should change my license to Creative Commons Commercial use restricted BY-NC - but it was fun writing it. In retrospect I should have said something like "Hey - talk to me before writing for my stuff" in louder form than a whole tutorial blog post thread on how to proceed with crossmod without hurting other modder's feelings or accidentally stealing the entirety of another author's work, as time passes and not many folks read stuff they don't want to know about. So, I wrote this up as my "license": And the only phrase I would probably change is change "anything they want with it" to "anything they want with it as long as no one is restricted from using it behind a paywall, no one makes any money off of it, and they assume any and all liability when an angry company comes hunting for copyright infringement and cash." But truly, almost any license you use is just about the same as just admitting "I can't stop you from ripping off my stuff because I don't have money for lawyers, and even more importantly because while I worked my butt off and the creativity and work is mine, I was doing it on an already copyrighted piece of intellectually protected code without paying a license fee or even asking their formal legal permission to write my fanfic into a commercially available product". It does serve as something that modding sites can point to and say "ok, that is what the modder wanted". The modding community takes a dim view of other folks taking over a mod/copying most of a mod/rewriting content for other folk's mods without permission. And the license can help determine to the modding sites and the community what the author wanted.
  4. ...aaaaand back to "on topic" - a quick adjustment to the regexp, as the initial files are C-ARANJ and then the second drops the middle A (and I don''t trust my regexp-foo at all). I will gladly take my 6-to-2 reduction and run with it rather than the more efficient 6-to-1 reduction for an odd but specific reason - when I mod I use "find in files" with NotePad++ and when I look for stuff that touches "C-ARN25J" or similar, I won't find this a match without including this in the find. The rest of the timer I'd look for with RealSetGlobalTimer( and see what pops up before filtering, as a way to look for typos and mismatches across whatever I am looking for. REPLACE_ACTION_TEXT_REGEXP C-ARANJ ~RealSetGlobalTimer("c-aran\(friend\|rom\|flirt\)timer","GLOBAL",[^)]+)~ ~RealSetGlobalTimer("c-aran\1timer","GLOBAL",5405)~ REPLACE_ACTION_TEXT_REGEXP C-ARN25J ~RealSetGlobalTimer("c-aran\(friend\|rom\|flirt\)timer","GLOBAL",[^)]+)~ ~RealSetGlobalTimer("c-aran\1timer","GLOBAL",5405)~
  5. Cool discussion, though - lots of good ideas. I can see building a mod from scratch that follows @subtledoctor's posting, especially for an NPC mod. @Ardanis and @CamDawg I think are correct on the modder front - grab a simple set of ideas, build in a way for advanced users to tweak which content they want, and spend the time on developing new content. In Aran W I enjoyed doing crazy stuff back in the day, trying to look for situations to use WeiDU in non-standard ways, because the mod was supposed to also be a "blog" about problem solving and choosing as a modder - and pushing stuff that worked in BiggDu that I saw coming through the testing stuff but didn't see out there in (many) other mods. That time has long since passed, and much of the code used is handled much better in simpler ways now. That leaves me free to just tweak what I have and write new content. ( @jastey, I suspect also that CamDawg is gently reminding me that I can get easily distracted from content by looking at cool shiny new-to-me coding ideas and spend weeks playing about with that - and that most of us have dress shoes older than my as-yet-unfinished mods "development time"...) For this project, since I decided to move to SUBCOMPONENT and GROUP, I might even use several of these ideas, since I have spent a week rebuilding the portraits and timers into default->sc choice patched->sc choice patched. I still have to deal with the multiple .cre dual class, equipment, and weapon choices, so after a week working on content I can come back, poke around, and make a choice on some of the ideas presented here. The idea would be to make distinctions between "meaningless choices introduced by pushing overdone code examples" and "meaningful and targeted player options". I still enjoyed (most of) the discussion, though probably it should have been under a separate post like "Auto-Installers - Their Problem Or Ours?" or perhaps "Ways To Make Auto|Mega|Player|Multi|Ancient -Friendly Mods And Be Everything To Everyone While Coding A Mod"
  6. Dang, @CamDawg - I need to go refresh my (very limited) regexp knowledge - that is sweeeeeet - I will implement that on the next pass! Wow, @subtledoctor - mind... blown. So flip the traditional mod structure on its head. Instead of installing a base mod and then editing it, create a workflow that makes a decision up front and then adds the rest of the mod down the chain. It would even work with Alien's mod install tool. For me, though, there is way too much player choice to work it out without my brain going nuts. I would have to think backwards - and the initial subcomponents to establish the workflow would be BEGIN ~Twelve Hour Timers, Aran to Dual Class to Cleric, Portrait #9, Poor Equipment, Scale Armor, Long Sword, Shield, Long Bow~ SUBCOMPONENT ~How many Torm-Kissed Choices Do You Want Me To Go Through You Silly Modder?~ OUTER_SET ARAN_LTT = 3600 INCLUDE ~mod/outer_set_choice_pattern_176_or_a_zillion.tpa~ INCLUDE ~mod/rest_of_mod.tpa~ BEGIN ~Twelve Hour Timers, Aran to Dual Class to Cleric, Portrait #9, Poor Equipment, Scale Armor, Long Sword, Shield, Crossbow~ SUBCOMPONENT ~How many Torm-Kissed Choices Do You Want Me To Go Through You Silly Modder?~ INCLUDE ~mod/outer_set_choice_pattern_177_or_a_zillion.tpa~ INCLUDE ~mod/rest_of_mod.tpa~ although come to think of it that might be a cool way to handle it after all. I would just need to pare down the choices I am allowing. @jastey I know setting the values to 'non-standard" ones takes care of the problem but is overkill after using regexp to blow away the original value (I am not adding values to gtimes.ids the way we were, just trying to patch the darned stuff ) - I am just going to make very sure I can see the changes, and that the changes were made by my mod not something else. Or did I not understand you?
  7. And to answer my own question in another way - devSin and Smoketest spent some time really explaining all this symbolic referent to me, but it has taken over a decade for the lesson to sink in. In a nutshell, if you want to make sure that an .ids or something doesn't accidentally interfere on compilation/decompilation, then... get this... use a nonstandard value. So final .d for me is a series of files with different values, and set my initial .bcs as a non-standard value so that it can be easily picked up and sorted. file c-arantimer1h30min.d /* Change the installed timers in .dlg to values that are a minimum of 1 hour 30 minutes real time before the next talk can trigger */ /* all timers (after initial .bcs) in the project are set through dialog, and they all are the same length - the initial .bcs block staggers the start out to try to make it less likely that multiple events align */ REPLACE_ACTION_TEXT C-ARANJ ~RealSetGlobalTimer("c-aranfriendtimer","GLOBAL",\([^)]+\))~ ~RealSetGlobalTimer("c-aranromtimer","GLOBAL",5405)~ REPLACE_ACTION_TEXT C-ARANJ ~RealSetGlobalTimer("c-aranromtimer","GLOBAL",\([^)]+\))~ ~RealSetGlobalTimer("c-aranromtimer","GLOBAL",5405)~ REPLACE_ACTION_TEXT C-ARANJ ~RealSetGlobalTimer("c-aranflirttimer","GLOBAL",\([^)]+\))~ ~RealSetGlobalTimer("c-aranromtimer","GLOBAL",5405)~ REPLACE_ACTION_TEXT C-ARN25J ~RealSetGlobalTimer("c-aranfriendtimer","GLOBAL",\([^)]+\))~ ~RealSetGlobalTimer("c-aranromtimer","GLOBAL",5405)~ REPLACE_ACTION_TEXT C-ARN25J ~RealSetGlobalTimer("c-aranromtimer","GLOBAL",\([^)]+\))~ ~RealSetGlobalTimer("c-aranromtimer","GLOBAL",5405)~ REPLACE_ACTION_TEXT C-ARN25J ~RealSetGlobalTimer("c-aranromtimer","GLOBAL",\([^)]+\))~ ~RealSetGlobalTimer("c-aranflirttimer","GLOBAL",5405)~
  8. Found the workaround for printing to the log - DOSOMETHING @52 /* ~myTraline~ */ OUTER_SPRINT myVar @52 APPEND ~myFile~ %myVar% Don’t know if that helps, but the original idea was to create a user readable log of what banters were actually installed.
  9. Heh. So, leave it to me to try to reverse engineer a nuclear weapon to swat a fly... 1. that array won't work as the first column needs to have unique entries - the simplest answer would be to process each file once for each variable. 2. since the timers are setting in the dialog using the same value, I don't need to be careful about only replacing a very specific set without touching others 3. the wicked cool code above has the simplest answer - a regexp for "find all the flies and eat them". So using REPLACE_ACTION_TEXT C-ARANJ ~RealSetGlobalTimer("c-aranromtimer","GLOBAL",\([^)]+\))~ ~RealSetGlobalTimer("c-aranromtimer","GLOBAL",4000)~ does the job, bypassing the problem of parsing the .ids .bcs is another matter, but there are only two script blocks to manipulate, and they (hopefully) will not have the same problem. If they do, then I can always false() and rebuild. Thank you for getting me on the right track, @CamDawg
  10. Cool - that definitely worked! And, Dammit, that definitely worked. I will retest, but this brings up a rather awkward problem. If I am installing BG2 Fixpack, I am working with a clean GTIMES.IDS and can do R_A_T without fear of other entries in the .ids. If, on the other hand, I am an NPC mod that has other folks going first, I am not sure what values match the same entries. Since we have had mods in the field for years that use the .ids entries as shortcuts for timers. 3600 = a bunch of entries. And I can't account for what would be on a mega install... unless I parse the gtimes.ids for the value that the local install is going to use as the decompiled label? So which is more stable, using the "heck just slap MYNPC_TIMER in there and then edit the .ids to the new value", or "do it right by setting a static value, then try to account for what weidu is going to see when it decompiles my dialog?" I am looking carefully at what you do in Tweaks, here: ACTION_PHP_EACH cd_romances_timers AS script => variable BEGIN ACTION_IF FILE_EXISTS_IN_GAME ~%script%.bcs~ THEN BEGIN COPY_EXISTING ~%script%.bcs~ ~override~ DECOMPILE_AND_PATCH BEGIN REPLACE_EVALUATE ~RealSetGlobalTimer("%variable%","GLOBAL",\([^)]+\))~ BEGIN PATCH_IF IS_AN_INT MATCH1 BEGIN SET time = MATCH1 END ELSE BEGIN SET time = IDS_OF_SYMBOL (~GTIMES~ ~%MATCH1%~) // should convert stuff like EIGHT_HOURS to numeric value END SET time = ((time * romance_speed_factor) / 100) END ~RealSetGlobalTimer("%variable%","GLOBAL",%time%)~ END BUT_ONLY END END Just not sure of some stuff. Like, can that array have multiple passes at the same dialog file, such that C-ARANJ => c-aranBG2romtimer C-ARANJ => c-aranBG2friendtimer C-ARANJ => choseninitialflirt C-ARANJ => anothervalue C-ARN25J => etc. etc. etc. It looks promising, so I will go play about - unless someone comes along and fixes it all up for me.
  11. Hello, oh fellow Weidu-ites - I am having a little trouble messing about with R_A_T. Problem: I have timers as variables set by ACTION_READLN. I want to move that to individual SUBCOMPONENT to make it easier for unattended installs. Currently, I use OUTER_SET ARAN_LTT = 3600 to build the "default install values". The timers I need to adjust later are set almost exclusively through dialogue: IF ~Global("c-aranbg2rom","GLOBAL",7)~ THEN BEGIN a111 SAY @3864 ++ @3865 DO ~SetGlobal("c-aranbg2rom","GLOBAL",8) RealSetGlobalTimer("c-aranromtimer","GLOBAL",%ARAN_LTT%)~ + a112 I compile the file with E_B and things go fine: resulting file in NI shows a valid action RealSetGlobalTimer("c-aranromtimer","GLOBAL",3600) So everything is fine for creating the default! Now comes the part where oddity ensues... To test changing the timer values through patching the default settings, I create a second component that compiles a file timertest.d with only the following contents: REPLACE_ACTION_TEXT C-ARANJ ~RealSetGlobalTimer("c-aranromtimer","GLOBAL",3600)~ ~RealSetGlobalTimer("c-aranromtimer","GLOBAL",4000)~ It installs fine... unfortunately, there is no change to C-ARANJ. NI shows the original timer unchanged. Checked the usual: NI is not running on install, no typos, DLTCEP is not running, I am in the correct directory - .debug says the dialog file was loaded, but saved untouched. Perhaps I misunderstand how R_A_T is supposed to be formed? Doesn't it pick up all instances of that text in the .d and replace it with the second value?
  12. Thanks for the followup on the typo - I will get it fixed and up in the next batch (struggling with trying to get a way of changing the way the mod asks for user input to selected subcomponents right now and failing miserably ) I think, then, what is happening is the SoA import to ToB on EET is letting him use his SoA script. You can check on your imported .cre after ToB, and see what his script is - my bet is it is C-ARAN instead of C-ARN25. This is where i need to study an EET install myself; I need to do some work, setting up some different files and following the directions EET provides to cover this.
  13. That... shouldn't happen. They are in two separate dialog files. Wait a sec... EET docs... yep. Dammit. EET came to the same conclusion Acsension64 did with BGT, and stacked files. OK. well. The good news is that your solution will work well with those SoA PiDs. Unfortunately the inside of my head just exploded, with a million swearwords running around - I have no idea if the weighting and construction of the two dialogue files merger has any odd results on the project here. I know EET is well coded, but I don't know about my stuff, since they were build without interaction except where parts are duplicated with different variables (like Watcher's Keep). The old "fix" back in my BG1NPC days was to set a variable on BGT content that did not exist in BG only on BGT games - wait... yep. They kept that. Plus a new one: " InToB - vanilla variable that is set to 1 in the first area of Throne of Bhaal expansion (AR4000.BCS)". I probably need to play around with this. And the transition is covered here : " As mentioned in readme file EET uses new system for NPC transition from Siege of Dragonspear expansion to Shadows of Amn and from Shadows of Amn to Throne of Bhaal expansion. In order to make modder's life easier we've prepared a function designed to automatically add both types of transition to any kind of NPC mod. All you need to do to make your NPC fully compatible with EET is disabling your normal patching code for AR4000.BCS, AR4500.BCS, FATESP.DLG and using EET_NPC_TRANSITION function instead ".
  14. I *think* this is the same problem we just fixed in the post above this one... but we will have to re-test. I don't know enough about how EET keeps the party together to say for certain.
  15. This one is a little more awkward - a strictly EET thing I think (but might be BG2EE-SoA->BG2EE-ToB as I know moving your party to the expansion in the EEs has improved dramatically over Ye Olden Days of Yore). BG2 SoA did not have much functional "move between the parts". So much so that BGT was born. And it still didn't have much portability (though more than traditional stuff). So, the assumption is that an NPC is going to be summoned through the Fate Spirit. If it is, then the Fate Spirit dialog is used to set all the relevant variables - basically, a new PC or one brought up from SoA can "rewrite history" by stating that the NPC was her lover, or is her lover, or is just a friend. BUT. for the materials for Aran in ToB to be consistent, the romance check needs to run so that a newly created PC has the same opportunities to develop the relationship - especially the flirting and such. BUT. Apparently the new games bring over those variables (or you wouldn't be reporting a halt in the process). So the simplest solution is to split the blocks up to fire one at a time - one that sets the match if it is not set, the other that fires when it is set (it won't run in SoA as the .cre there is assigned the SoA script and this second check is run on the ToB script). Basically, if the variables are persisting and Aran is running his correct scripts for ToB, he should do his stuff. If the variables are not, then the first block catches that and sets it. Untested (other than the usual "it installs without error and NI and DLTCEP agree everything looks right) but activated: IF Global("c-aranmatch","GLOBAL",0) Global("c-arantobrom","GLOBAL",0) InParty(Myself) !StateCheck(Myself,CD_STATE_NOTVALID) !StateCheck(Player1,CD_STATE_NOTVALID) Gender(Player1,FEMALE) !HasItemEquiped("belt05",Player1) // Girdle of Gender THEN RESPONSE #100 SetGlobal("c-aranmatch","GLOBAL",1) RealSetGlobalTimer("c-aranromtimer","GLOBAL",EIGHT_HOURS) RealSetGlobalTimer("c-aranflirttimer","GLOBAL",FOUR_HOURS) END IF Global("c-aranmatch","GLOBAL",1) Global("c-arantobrom","GLOBAL",0) InParty(Myself) !StateCheck(Myself,CD_STATE_NOTVALID) !StateCheck(Player1,CD_STATE_NOTVALID) Gender(Player1,FEMALE) !HasItemEquiped("belt05",Player1) // Girdle of Gender THEN RESPONSE #100 SetGlobal("c-arantobrom","GLOBAL",1) RealSetGlobalTimer("c-aranromtimer","GLOBAL",EIGHT_HOURS) RealSetGlobalTimer("c-aranflirttimer","GLOBAL",FOUR_HOURS) END Going to recheck the IDS I am using as that EIGHT_HOURS and FOUR_HOURS is certainly not intended, unless it is the values for in-game time, rather than real time. Darn it - forgetting things. I used to know this. Commit code here.
  16. Hmmm.... I am not sure - checking against all other variants of this, it looks like a typo. D:\BeamDog\00783\aranw\dialog\c-arandialog.d (2 hits) Line 29603: ++ @11286 EXIT Line 29637: ++ @11286 EXIT D:\BeamDog\00783\aranw\dialog\c-arantobdialog.d (3 hits) Line 10761: ++ @11286 EXIT Line 10828: ++ @11286 EXIT Line 10907: ++ @11286 EXIT D:\BeamDog\00783\aranw\tra\english\C-ARANW.TRA (1 hit) Line 11670: @11286 = ~[PC] I was just wondering.~ Behavior now matches the SoA J and P files, and the other two ToB (A25 and P25) files. Commit made Here.
  17. Well, I found one possible source - I had one trigger on LOCALS and set GLOBAL. So that is fixed. IF ~~ THEN BEGIN 24 // from: 23.0 22.0 21.0 SAY #25178 /* ~It saddens me, but if it must be so, I shall worship my goddess from afar! Farewell, my goddess!~ */ IF ~ OR(4) Global("c-aransalvanas","GLOBAL",1) !InParty("c-aran") !InMyArea("c-aran") StateCheck("c-aran",CD_STATE_NOTVALID) ~ THEN EXIT IF ~ InParty("c-aran") InMyArea("c-aran") !StateCheck("c-aran",CD_STATE_NOTVALID) Global("c-aransalvanas","GLOBAL",0) ~ THEN EXTERN ~C-ARANJ~ 3144 END So the only condition that I could find that might lead to failure is that one condition on state 24: IF ~ OR(4) Global("c-aransalvanas","LOCALS",1) !InParty("c-aran") !InMyArea("c-aran") StateCheck("c-aran",CD_STATE_NOTVALID) ~ THEN EXIT as the LOCALS would be 0 and the GLOBAL would be 1. Untested in-game (installed and inspected with NI and DLTCEP) but repair is up right here on GitHub Also, thank you for the typos - all repaired and about to go up - since some are the adult stuff, not linking the commit, but it is on GitHub.
  18. Heh. I added the block to Aran's banter but used Myself instead of Hexxat's DV. Easy fix. Commit repair linked here.
  19. Search ""Chapter"" (96 hits in 4 files) D:\BeamDog\00783\aranw\baf\c-aran.baf (12 hits) D:\BeamDog\00783\aranw\baf\c-arand.baf (1 hit) D:\BeamDog\00783\aranw\dialog\c-arandialog.d (56 hits) D:\BeamDog\00783\aranw\dialog\c-arantobdialog.d (27 hits) All repaired to EET variable substitution Confirming .tp2 C E_B usage to make sure we really cover these files: Line 275: COMPILE EVALUATE_BUFFER ~aranw/dialog/c-arandialog.d~ Line 281: COMPILE EVALUATE_BUFFER ~aranw/dialog/c-arantobdialog.d~ Line 1069: COMPILE EVALUATE_BUFFER ~aranw/baf/c-aran.baf~ /* override script */ Line 1071: COMPILE ~aranw/baf/c-arand.baf~ /* SoA dreamscript */ Successful install on BG2EE + Gavin (latest) And NI says... in the DreamScript, GlobalLT("Chapter","GLOBAL",127514) OK. That looks... wrong. in dialogue files, no worries - IsGabber(Player1) Global("chapter","GLOBAL",5) shows up just fine for the underdark PiD. So I need to investigate that script. All instances repaired and integrated, though - commit linked here. Edit: AHA!! Modding While Drinking Scotch Is Fun But Silly(tm). Found it. No E_B on C-ARAND.BAF - right in front of my eyes. Repaired, test installed, NI and DLTCEP show a happier global! Repair commit linked here.
  20. No, absolutely great feedback! I will take a look and let you know what I find out. For one thing, I need to look at the way EET brings the characters along - I assume a ToB resummoning, and it looks like it must do something else. I will take a run at these tonight!
  21. Amellg, thank you for reporting - in addition to the odd area actor behavior listed as fixed in the beta thread, I have tracked down the Gavin <> Aran gift interaction error. (Credits to Roxanne and Berelinde for the idea and implementation, and to Berelinde for letting me add the gift option to her mod). Install order to see all content is Gavin BG2 then Aran Whitehand. Fix is up and checked by installing over Gavin on a clean install of BG2EE and checking the relevant files in NI. In addition I set up the dialogue and script conditioning to work on EET by shamelessly copying and pasting from Jastey's and CamDawg's latest releases. Luckily all the relevant code fell within files already using COMPILE EVALUATE_BUFFER... GitHub Commit 84d96a4ffe48372c3fd2d9069be9ac6577b55675 I expect the GitHub master for Aran to be moving to the G3 Organization within a week, if Mike1072 and I can make it happen; no worries if he vanishes from GitHub general access when that is in process. I have a full backup locally.
  22. Ok, now I need to get serious about my own work - this is breakneck speed!! If you don’t mind sharing, how the heck are you getting the voicework done?
  23. Please tell me more about this vanished mod... PM is fine... you do great stuff. No pressure. (pressure pressure pressure pressure )
×
×
  • Create New...