Jump to content

argent77

Modders
  • Posts

    1,701
  • Joined

Everything posted by argent77

  1. The Chaos Sorcerer Kit is a mod for BG:EE (with or without SoD), BG2:EE, EET and IWD:EE that introduces the new kit "Chaos Sorcerer" which can be seen as the Wild Mage counterpart for the Sorcerer class. It installs several unique spells for the kit and provides an optional component that scatters powerful artifact across the games which can unlock tremendous powers when combined. The mod is currently available in English and German. It supports both pre and post 2.0 patched games. Links: Download Project page Readme: English and German Discussion on SHS Forums Discussion on Beamdog Forums
  2. You do know that this is completely unneeded if you only want to insert the *'s into the table ? As the second rows same symbol is the default... meaning that the file is actually filled to without there needing to be those in place. Now of course if you then need to replace sets of those with legitimate replacement values, your solution can have a valid stance, but not in the default case.Thias can be seen for example in cases which the mx...2da file setting the default to 0 instead of something else. In my case it seems to be needed. I want to expand tooltip.2da to have individual names for the 4th and 5th ability of an item, which doesn't appear to work if some entries contain less columns. Besides, it improves compatibility with other mods that try to process the file. Otherwise, a COUNT_2DA_COLS followed by COUNT_2DA_ROWS would return a misleading number of rows.
  3. @kjeron Your code works nicely, thanks! The REMOVE_2DA_ROW / INSERT_2DA_ROW operation is a trick I haven't thought of. Instead I tried to extend the structure created by READ_2DA_ENTRIES_NOW directly, but SET_2DA_ENTRIES_NOW didn't catch any of these changes. I have slightly expanded the code and put it into a function if anyone is interested:
  4. I'm trying to add missing entries to a 2DA file, so that every line contains the same number of columns. Example: 2DA V1.0 * 1 2 3 NAME1 VAL1 VAL2 VAL3 NAME2 VAL1 NAME3 VAL1 VAL2 NAME4 VAL1 VAL2 VAL3 should be transformed into this: 2DA V1.0 * 1 2 3 NAME1 VAL1 VAL2 VAL3 NAME2 VAL1 * * NAME3 VAL1 VAL2 * NAME4 VAL1 VAL2 VAL3 I couldn't find any WeiDU commands that allow me to add new columns or detect the actual number of entries in a given row. Any ideas?
  5. Afaik, you can't save the game while an AoE projectile is active (e.g. a cloud spell). You could cast a dummy spell with an invisible AoE projectile to avoid saving, and remove it with opcode 273 (Zone of Sweet Air) after the scripted scene finished (or use a fixed duration for the AoE projectile). I think it's possible to use a custom 2DA for opcode 273 where you can add the dummy spell resref (so that other potentially active AoE spells are not affected).
  6. This is a patch function that can be used to add multiple effects to items or spells without much effort. It uses a simple syntax with short keywords to keep effect definitions plain and simple. I'm currently using it to dynamically add many game dependent effects to spells. The function code: Example (adds fully configured effects "Display String" and "Play Visual Effect" to a spell): COPY ~%MOD_FOLDER%/spells/myspell.spl~ ~override~ LPF a7_auto_apply_spl_effect INT_VAR // some predefined parameters for all effects def_target = 2 // Preset target def_savetype = 1 // Save vs. Spell def_savebonus = "-2" STR_VAR function_name = ~ADD_SPELL_EFFECT~ effect_codes = ~op=139,tmg=1,p1=8203;op=215,tmg=1,dur=2,p2=1,res=ICARMOR~ END
  7. Look like you're right. The black screen only lasts about 11 or 12 seconds before it is cleared. You could add another "FadeToColor([0.0],0)" after about 10 seconds to keep the screen black a while longer.
  8. I have noticed two issues with SR v4beta15: 1. The mod fails to install in BGEE (with or without SoD) because of a missing resource SPIN203.SPL. 2. SR seems to reset exclusion flags of all Wild Mage related spells (SPWI124, SPWI222 and SPWI723), so that they're available for all mages and sorcerers.
  9. I would prefer to see it integrated into Tweaks Anthology since a mod of this small size runs the risk of getting lost in the vast number of other mini-mod releases.
  10. Yeah, this action looks like a quick way to switch between thematically independent parts of the story. I can imagine the next IWDEE patch will also make use of it for the HoW and TotLM expansions.
  11. 372 MoveToCampaign(S:Campaign*) This action reinitializes important default values and resource references based on definitions from campaign.2da, such as world scripts, save folder name or starting area. Campaign refers to the name defined in the first column of that table. It is currently used to switch from BGEE to the Siege of Dragonspear campaign. 373 AddWorldmapAreaFlag(S:Area*,I:Type*WMPFLAG) This action can be used to set flags of an area on the worlmap that control visibility or accessibility. Flags are taken from wmpflag.ids. 374 RemoveWorldmapAreaFlag(S:Area*,I:Type*WMPFLAG) This action can be used to clear flags of an area on the worlmap that control visibility or accessibility. Flags are taken from wmpflag.ids. 377 SetGlobalTimerRandom(S:Name*,S:Area*,I:Min*GTimes,I:Max*GTimes) This action sets a global timer to a random value within the range of Min and Max specified by the 3rd and 4th parameter. Both parameters accept symbolic values from gtimes.ids. The timer is checked by the GlobalTimerExpired() and GlobalTimerNotExpired() triggers.
  12. 0x40F8 CanEquipRanged() Returns true only if the active creature can switch to a ranged weapon that is ready for use (e.g. a throwing weapon, such as darts, or a launcher with corresponding ammo, such as bow and arrow). 0x40F9 ImmuneToSpellLevel(O:Object*,I:Level*) Returns true if the specified object is immune to spells of the level specified by the 2nd parameter. 0x40FB IsForcedRandomEncounterActive(S:Area*) Returns true only if a random encounter to the specified area has been initialized by a preceding call of ForceRandomEncounter() or ForceRandomEncounterEntry(). 0x4103 CheckItemSlot(O:Object*,S:Item*,I:Slot*SLOTS) Returns true only if the item specified in the 2nd parameter can be found in the inventory slot (taken from SLOTS.IDS) of the specified object. 0x4104 CurrentAmmo(S:ResRef*,O:Object*) Returns true only if the specified object has a ranged weapon with the ammo specified by ResRef equipped.
  13. The following triggers appear to be related to the unselectable state from script action MakeUnselectable() or effect opcode 365: 0x406D UnselectableVariable(I:Num*) Returns true only if the active creature is for exactly the specified number of ticks (1/15th seconds) left under the effect of the script action MakeUnselectable() or opcode 365. Note: By default in BG2EE creatures stop processing scripts while under effect of the script action MakeUnselectable(). 0x406E UnselectableVariableGT(I:Num*) Returns true only if the active creature is for more than the specified number of ticks (1/15th seconds) left under the effect of the script action MakeUnselectable() or opcode 365. Note: By default in BG2EE creatures stop processing scripts while under effect of the script action MakeUnselectable(). 0x406F UnselectableVariableLT(I:Num*) Returns true only if the active creature is for less than the specified number of ticks (1/15th seconds) left under the effect of the script action MakeUnselectable() or opcode 365. Note: By default in BG2EE creatures stop processing scripts while under effect of the script action MakeUnselectable().
  14. This info is based on the GiveOrder() action description and verified by a quick test in BG1EE: 0x0006 ReceivedOrder(O:Object*,I:Order ID*) This trigger is used in conjunction with the GiveOrder action, and works in a similar way to the Heard trigger. Only one creature at a time responds to an order, and creatures do not detect their own orders. The creature must be in visual range for this trigger to work.
  15. Looks like ModalStateObject() does exactly what the name suggests: 0x40F1 ModalStateObject(O:Object*,I:ModalState*Modal) Returns true only if the specified object is in the state/mode specified. e.g. detecting traps.
  16. Unfortunately the PST section doesn't look much better in this regard.
  17. I assume G/GGT/GLT are all using GLOBAL scope implicitly (same as the SG() action counterpart)?
  18. I'll start with a first batch of actions. 376 DisplayStringNoNameDlg(O:Object*,I:StrRef*) This action behaves like DisplayStringNoName, except that it also works in dialogues. It displays the strref specified by the StrRef parameter in the message window, without attributing the text to an object. 378 ExportParty(S:Name*) This action will export all exportable characters of the party into the "Characters" folder of the game. "Name" specifies the prefix for each exported character, which is expanded by the character's party slot number. This action creates both .CHR and .BIO files. 387 SetCutSceneBreakable(I:Breakable*BOOLEAN) This action controls whether a cutscene can be skipped by pressing ESC. When set to TRUE the cutscene can be interrupted. Set it to FALSE to prevent the cutscene from being interrupted. When properly prepared a skipped cutscene can be detected and completed in a safe manner. Code snippet of the BG2EE opening cutscene (NEWGAME.BCS): IF True() THEN RESPONSE #100 CutSceneId("CSJon") SetAreaScript("cutskip2",OVERRIDE) SetGlobal("BD_CUTSCENE_BREAKABLE","GLOBAL",1) SetCutSceneBreakable(TRUE) CreateCreatureEffect("M05PCSPY","",[3374.3068],S) // more script actions... SetCutSceneBreakable(FALSE) SetGlobal("BD_CUTSCENE_BREAKABLE","GLOBAL",0) SetAreaScript("",OVERRIDE) ActionOverride("Imoen",EndCutSceneMode()) ActionOverride("Imoen",Dialogue(Player1)) DestroySelf() END SetAreaScript("cutskip2",OVERRIDE) defines a "failsafe" script to execute when the cutscene has been skipped. The OVERRIDE slot ensures it has precedence over the default area script. SetGlobal("BD_CUTSCENE_BREAKABLE","GLOBAL",1) is used to identify the cutscene that has been interrupted (if the failsafe script handles more than one cutscene). 388 DisplayStringHeadNoLog(O:Object*,I:StrRef*) This action displays the string specified by the StrRef parameter over the head of the given object on the game-screen, but not in the message log. 389 SetItemFlags(S:ItemName*,I:Flags*INVITEM,I:SetReset*BOOLEAN) This action sets or resets specific item flags, such as "IDENTIFIED" or "STOLEN". Setting the third parameter to TRUE sets the bit, setting it to FALSE clears the bit. Example from Siege of Dragonspear (BDINTRO.BCS): IF Global("SOD_fromimport","GLOBAL",0) !HasItemEquiped("ring05",Player1) // Sandthief's Ring InMyArea("safana") // Safana THEN RESPONSE #100 CutSceneId(Player1) GiveItemCreate("ring05","safana",7,0,0) // Sandthief's Ring ActionOverride("safana",SetItemFlags("ring05",IDENTIFIED,TRUE)) // Sandthief's Ring XEquipItem("ring05","safana",SLOT_RING_RIGHT,EQUIP) // Sandthief's Ring END 412 ZoomLock(I:Lock*BOOLEAN) This action can be used to set zoom to 100%. When set to TRUE zoom factor is locked at 100% and can not be changed by user input. Setting it to FALSE restores the original zoom factor. The zoom lock state is not saved.
  19. IESDP does not yet provide descriptions for many script actions introduced by the more recent Enhanced Editions patches. This topic is intended to present and discuss descriptions for new or existing script actions, so that they can be added to IESDP eventually. The following BG(2)EE actions are still lacking a meaningful description: The following PSTEE actions are not listed on IESDP yet:
  20. IESDP does not yet provide descriptions for a number of script triggers. This topic is intended to present and discuss descriptions for new or existing script triggers, so that they can be added to IESDP eventually. The following BG(2)EE triggers are still lacking a meaningful description: The following PSTEE triggers are not listed on IESDP yet:
  21. Previous versions are still available at the download page of the mod. Look for "Previous Versions" section at the right side of the page. You should find both SCS and SCS2 downloads there.
  22. that depends if Class(Myself,MAGE) trigger also detects multiclass character - needs to be tested. We can add !Class(Myself,MAGE_THIEF) trigger if needed. Dualclass with active thief class has the same problem of getting too much XP as with inactive thief class. You can probably use OriginalClass(Myself,THIEF) to better distinguish between dual- and multi-class. IF Global("BD_JOINXP","LOCALS",1) Global("K#OriginalClass","LOCALS",0) Class(Myself,MAGE_ALL) OriginalClass(Myself,THIEF) ClassLevel(Myself,ROGUE,2) THEN RESPONSE #100 SetGlobal("K#OriginalClass","LOCALS",2) END It should catch all valid dualclass states and skip multiclass variants at the same time.
  23. Well, there is an attempt for PST:EE to keep all seven companions around, over at Beamdog Forums.
  24. nice find, fixed locally. splprot.2da is now read during installation and remapped if needed (not in this case since both missing rows will get the same row number as in BG:EE)What I'm not sure about is this part of IESDP documentation: What projectile's ids field? 0x3e and 0x42? NI shows normal IDS files there, not SPLPROT.2DA references. IESDP doesn't have any info about it either (from what I see the documentation is outdated since it doesn't list anything after 0x2a offset). Yeah, IESDP's PRO format description doesn't include features added by EE patch 2.0 yet. Projectiles will use offsets 0x3e and 0x42 for splprot.2da entries when extended flags bit 30 (IWD-style check) is set. here is vanilla game code that handles Imoen's XP at the start of SoA (EET just resets BD_JOINXP variable since it's also set in BG1): Not sure how to handle it if XP trigger can't read original class experience. Any ideas? edit: maybe CheckStat / CheckStatGT / CheckStatLT triggers will take original class XP into account. Will test it soon (sooner if you can upload your save from the end of SoD ) Like I mentioned, it's not a big issue. Especially since it's apparently vanilla game behavior. I couldn't find an easy way to check for inactive class levels either. Edit: My SoD end save: 000000058-SoD finished.zip
×
×
  • Create New...