-
Posts
664 -
Joined
-
Last visited
Content Type
Forums
Events
Downloads
Gallery
Mods
News
Store
Posts posted by Grammarsalad
-
-
I can think of one way to do it.
You could probably do something with REPLACE_TEXTUALLY that modifies your files before you compile them. Like, you would still need to create a new token, let's call it THE_HESHE. You would put <PRO_HESHE> in all the normal places, including at the beginning of sentences, etc. But, you would then copy your own files and do a REPLACE_TEXTUALLY replacing all instances of ". <PRO_HESHE>" or ". <PRO_HESHE>" with ". THE_HESHE". So, wherever your <PRO_HESHE> follows a period, it'll be replaced by the capitalized THE_HESHE. Otherwise, it'll stay lower case. Then you compile the file(s).
Edit: er, making it useful for any mod would involve more. Sorry, missed that.
Hmm, you could create a "workspace" in the override or the main folder, modify the text, copy it there, and then compile. I don't know all the details re compiling so I'm not sure how best to make this something like a replacement for the weidu command
-
2 hours ago, jastey said:
Prepare for the times where you know almost everything of the game(s) - but from reading the ressources, not from experiencing it while playing. Where you start thinking in internal file names when referring to game characters and ares. Where sentences like "Why is the install failing at all and not just printing the ~WARNING: could not find %textToReplace% in %SOURCE_FILESPEC%~ line in my first case?" seem completely normal to you!
Lol, so much this! I don't even play the game except to test something. Modding is just how I enjoy the game.
-
5 hours ago, Bubb said:
...
Any menu can be opened, the question is whether it is functional without it being invoked engine-side. What sort of things would you want to do with the HLA menu, for instance?
I just deleted a few paragraphs of blah blah blah. lol. Like, I was thinking of possible ways to bypass the limitation of not being able to select HLAs at character creation. Basically, I'm just interested in finding out what sorts of things can be done. Once I know that, the ideas will come. Like, is the class button array considered a menu that you could access with this? That's probably too good to be true. Well, I also just get excited at the possibility of doing new things.
-
Okay, I have two Identify related findings:
1) This does not work with SPWI110.spl. The original identify needs to be added to hidespl.2da and a new spell needs to be added.
2) the functions seems to work fine when run in two different mods on the same install. That is, I made a wiz version in one mod and installed it (over grease). Then, I made a cleric version in a second mod, and installed that (over detect evil). Both work just fine in BG2EE. I created a cleric/mage with the wiz and cleric version memorized. She cast both, and they both worked. The two quick and dirties are attached.
-
1 hour ago, subtledoctor said:
Sure! I was offering the use of our shared GitHub account anyway As long as Bubb is okay with it, of course, go to town. I'll note what I was thinking of, meanwhile.
As I said, I think it's already more or less ready to go with the .tph file and his example code. Feed the function a filename and it should modify a spell to work as shown in the video. My suggestion for avoiding duplication would be to either 1) add a marker file and wrap the necessary parts of the code in a function that won't run if the marker is already present; or 2) actually create a .2da file listing the RESREF or IDS name of each spell used with the function. This way if the function was already used on a spell (like WIZARD_IDENTIFY) it could gracefully decline to run again and move on to the rest of a mod's installation; but if the spell is not already in the 2da list the function would run and then append the spell to the list for future reference....
Yeah, it's easy peasy 123sy with the provided .tph. I did it in about ~5 mins on one of my comps (not sure which one atm).
It might work fine to run it over and over again in different mods. It's worth testing. (lol, I've borked my menu so many times with no long term repercussions). Also, if necessary, we could tweak the tph to deal with multiple iterations if necessary (once we've figured out a few basics re what it actually does).
QuoteMy suggestion for actual implementation in a mod would be to run the function a few times to make custom subspells with 1/2/3 identification 'uses;' and then add a new version of Identify with several headers to cast each subspell at an appropriate level. (It should be different from SPWI110, because we would want to actually remove the old inventory-screen method from the player; so SPWI110 should be added to HIDESPL.2da and SCRL75.itm would be altered to point to the new "Identify" spell.)
Agreed. Or, maaaybe SPWI110 could just be modified to cast the subspells(?) Not sure if it'll work. I used a modified detect evil spell. I tried to modify SPWI110 and it didn't work. But, I didn't change the headers, targets etc., and moved on to detect evil. I just wanted to create a proof of concept.
Edit: Nope. It doesn't work if you replace SPWI110 with an otherwise working version. You have to use a different res. So, yes to adding SPWI110 to HIDESPL.2da.
My thinking was also to investigate what else we can do; what other menus can be accessed (hla menu, proficiency menu, etc.)
-
Subtledoctor has given me a clue--lol, it pays to look and think--so that's something to start with.
Actually, @subtledoctor if you don't mind, I wouldn't mind trying to dissect the code here to see if I can figure it out in a public forum (where people can point out my dumb errors and/or make use of any 'breakthroughs' )Edit: Responding to this:
QuoteThis is one of the coolest things I've ever seen. "It's a thing of beauty, boss!" (sorry, couldn't resist the Buffy reference - yes, I'm a nerd) I wish I knew what to do with that TPH file but I'm such a newb at this, even that throws me. So I'm with @Grammarsalad, please talk to me as if I were 5, please. Maybe make that 3....
Edit2: I'll upload a quick and dirty example tomorrow if SD doesn't get to it first
-
On 1/18/2020 at 3:20 AM, Lauriel said:
If you want to start a sentence in a dialogue with <PRO_HESHE>, it doesn't auto-capitalize. Is there a way for me to force it to have the proper case?
Are you using EE? If so, you can create your own capitalized tokens that you would use in the appropriate places. *looking*
You need to append tokentxt.2da with (e.g.) the following (edit: er, just replace "Woman" with "She" and "Man" with "He"):
2DA V1.0 * TOKEN_TEXT PROTAGONIST STAT VALUE EQUALITY STRINGT STRINGF 0 RESERVE * * * * * * 1 NP_MANWOMAN 1 35 2 0 Woman Man
The entries are fairly straightforward, but here is the infos
Also worth checking out:
-
On 1/19/2020 at 8:29 PM, Bubb said:
I'm by no means good at WeiDU, but here's a tph that I've thrown together that installs all the necessary code:
B3Identify.tph 15.77 kB · 5 downloads
B3_IDENTIFY_INSTALL performs the necessary UI patches - make sure to run this before subsequent tasks.
A new identify spell that uses the menu has to be registered using a Lua function: B3Identify_RegisterResref("<resref no extension>", <use count>)
You can use WeiDU to register spells by appending lines to a M_*.lua file, or you can use B3_IDENTIFY_REGISTER to throw the same definitions into the interface's main file, like so:
LAF B3_IDENTIFY_REGISTER INT_VAR uses = 4 STR_VAR resref = ~B3IDEN~ END
Once the spell is registered, any Opcode #234 originating from the resref will trigger the interface. Note that the Opcode has to originate from a *spell*, however, you can use the mechanism from an item by first passing it through an Opcode #326. (if you attempt to directly call from an item, the engine crashes)
This is the small test tp2 I was using to install, as an example:
INCLUDE ~bubb_test/B3Identify.tph~ LAF B3_IDENTIFY_INSTALL END COPY ~bubb_test\copy\B3IDEN.SPL~ ~override~ SAY 0x8 ~Bubb Test Identify~ BUT_ONLY LAF B3_IDENTIFY_REGISTER INT_VAR uses = 4 STR_VAR resref = ~B3IDEN~ END
Edit: The above should work for vanilla BG:EE, BG2:EE, and IWD:EE. UI Overhauls will probably break the pattern matching.
Oh, this is sooo awesome! I just made a priest version of Identify. No big deal.
QuoteEdit: The above should work for vanilla BG:EE, BG2:EE, and IWD:EE. UI Overhauls will probably break the pattern matching.
What about EET?
So, when you talk about this 'pattern matching'. What sort of thing should we look for?
Edit: Please feel free to talk to me like I'm five... in fact, I'd prefer it!
Edit2:
QuoteI found out it's possible to hijack the contingency opcode & menu to open whatever interface you want on spell completion
This sounds REALLY intriguing....
Like, could it open the HLA menu? -
7 hours ago, subtledoctor said:
Don't know. That certainly won't work with any kits that are spontaneous casters already (which I guess doesn't really matter). FnP and various other mods add new priest spells, and I don't know whether Pecca's mod will modify all priest spells, or only the vanilla game's spells.
So... maybe? I would be cool if it is compatible. Worth testing!
It should be a part of fnp at some point in the (hopefully) near future. Pecca gave me permission to incorporate SC in a few mods, including fnp.
-
If anybody wants to get a preview of the readme, see the first post here.
Note that I'm updating it constantly, so it'll be (hopefully) more informative over time. Please let me know of any errors you happen to catch.Edit: e.g. Just added a warning about that Klatu component
-
2 hours ago, Daeros_Trollkiller said:
I have been working on correcting the way projectiles and portrait icons are set in my mod to be more compatible with other mods, and I have run into a snag. I have been able to get all the projectiles working correctly, but the portrait icons are another story. I'm sure its probably a syntax issue, but I havent been able to get past it. I am hoping someone could look at the code below for one of my spells, and tell me what I am doing wrong with trying to alter opcode 142. I referenced the IWDification mod for this, but what was done there doesn't seem to be working for me:
I'm not sure what might be wrong, but I do have working code. Let's see... Okay, I got help from Kjeron and Argent77 with is, so it is solid:
https://github.com/UnearthedArcana/B_Spells/blob/master/B_Spells/lib/fnp_new_spells.tpa#L870
Edit: I think this should also work in iwdee by now. I think the update I was waiting for has happened
-
On 11/30/2019 at 7:24 PM, Mike1072 said:
Thanks for your help to get it there!
P.S. We've got a v4b18 now too.
Yeah, I saw. Looks great!
-
Glad to see this out and about!
-
Oh, that's cool!
-
Oh yeah, that looks perfect. Thanks
-
Is there a simple way to check if a spl makes use of a particular opcode via PATCH_IF? I have to admit that I have not even tried as I have no idea how I would do such a thing, tbh. I have code that does basically what I want it to, but it's...wasteful, so to speak. That is, is applies INNER_ACTION much more often that it needs to. I can give the code snippet in case it'll help:
The problem is those darn INNER_ACTIONs...
SpoilerCOPY_EXISTING_REGEXP GLOB ~.[^abcde]*\.SPL~ ~override~ PATCH_IF (~%SOURCE_SIZE%~ > ~0x71~) BEGIN READ_BYTE 0x001C type //Spell type PATCH_IF type = 1 BEGIN //wiz spells READ_BYTE 0x0025 school //school type PATCH_IF school = 6 BEGIN //If invoker school (I think) READ_STRREF 0x50 ~sv_des~ //save description PATCH_IF ("%sv_des%" STRING_CONTAINS_REGEXP "Saving Throw: None" != 0) BEGIN //if spell text does NOT contain this phrase: Saving Throw: None READ_LONG 0x0034 level //spell level READ_LONG 0x0008 name //spell name READ_LONG 0x0050 desc //description READ_SHORT 0x007E target //Target-check READ_SHORT 0x0080 range //range-check READ_LONG 0x64 abil_off ELSE 0 READ_SHORT 0x68 abil_num ELSE 0 INNER_PATCH_SAVE cus0 ~%SOURCE_RES%~ BEGIN END INNER_PATCH_SAVE cus1 ~%cus0%~ BEGIN REPLACE_TEXTUALLY CASE_INSENSITIVE EXACT_MATCH ~SPWI~ ~B_S~ END INNER_PATCH_SAVE cus2 ~%cus1%~ BEGIN REPLACE_TEXTUALLY CASE_INSENSITIVE EXACT_MATCH ~SPWM~ ~B_S~ END LPF cd_apply_batch STR_VAR array_name = b_dex_evoc_arrays_sr END //dex apply spl LPF ALTER_EFFECT INT_VAR multi_match = 1 parameter1 = 15 parameter2 = %dex_ls% probability1 = 100 probability2 = 0 STR_VAR match_resource = ~ls_15~ resource = EVAL ~%cus2%A~ END // spl dex less than 15 LPF ALTER_EFFECT INT_VAR multi_match = 1 parameter1 = 15 parameter2 = %dex_eq% probability1 = 100 probability2 = 0 STR_VAR match_resource = ~is_15~ resource = EVAL ~%cus2%B~ END // spl dex = 15 LPF ALTER_EFFECT INT_VAR multi_match = 1 parameter1 = 16 parameter2 = %dex_eq% probability1 = 100 probability2 = 0 STR_VAR match_resource = ~is_16~ resource = EVAL ~%cus2%C~ END // spl dex = 15 LPF ALTER_EFFECT INT_VAR multi_match = 1 parameter1 = 17 parameter2 = %dex_eq% probability1 = 100 probability2 = 0 STR_VAR match_resource = ~is_17~ resource = EVAL ~%cus2%D~ END // spl dex = 15 LPF ALTER_EFFECT INT_VAR multi_match = 1 parameter1 = 18 parameter2 = %dex_eq% probability1 = 100 probability2 = 0 STR_VAR match_resource = ~is_18~ resource = EVAL ~%cus2%E~ END // spl dex = 15 LPF ALTER_EFFECT INT_VAR multi_match = 1 parameter1 = 18 parameter2 = %dex_gr% probability1 = 100 probability2 = 0 STR_VAR match_resource = ~gr_18~ resource = EVAL ~%cus2%F~ END // spl dex = 15 PATCH_IF !FILE_EXISTS_IN_GAME ~%cus2%A.SPL~ BEGIN // INNER_ACTION BEGIN COPY_EXISTING ~%cus0%.SPL~ ~override/%cus2%A.SPL~ WRITE_LONG 0x0008 ~%name%~ WRITE_LONG 0x0034 level //spell level WRITE_LONG 0x000c ~%name%~ WRITE_LONG 0x0054 ~%desc%~ WRITE_SHORT 0x007E target //Target-check WRITE_SHORT 0x0080 range //range-check END END PATCH_IF !FILE_EXISTS_IN_GAME ~%cus2%B.SPL~ BEGIN // INNER_ACTION BEGIN COPY_EXISTING ~%cus0%.SPL~ ~override/%cus2%B.SPL~ WRITE_LONG 0x0008 ~%name%~ WRITE_LONG 0x0034 level //spell level WRITE_LONG 0x000c ~%name%~ WRITE_LONG 0x0054 ~%desc%~ WRITE_SHORT 0x007E target //Target-check WRITE_SHORT 0x0080 range //range-check LPF ALTER_EFFECT_ADD INT_VAR savebonus_add = 1 // END // END END ELSE BEGIN INNER_ACTION BEGIN COPY_EXISTING ~%cus2%B.SPL~ ~override~ LPF ALTER_EFFECT_ADD INT_VAR savebonus_add = 1 // END // END END PATCH_IF !FILE_EXISTS_IN_GAME ~%cus2%C.SPL~ BEGIN // INNER_ACTION BEGIN COPY_EXISTING ~%cus0%.SPL~ ~override/%cus2%C.SPL~ WRITE_LONG 0x0008 ~%name%~ WRITE_LONG 0x0034 level //spell level WRITE_LONG 0x000c ~%name%~ WRITE_LONG 0x0054 ~%desc%~ WRITE_SHORT 0x007E target //Target-check WRITE_SHORT 0x0080 range //range-check LPF ALTER_EFFECT_ADD INT_VAR savebonus_add = 2 // END // END END ELSE BEGIN INNER_ACTION BEGIN COPY_EXISTING ~%cus2%C.SPL~ ~override~ LPF ALTER_EFFECT_ADD INT_VAR savebonus_add = 2 // END // END END PATCH_IF !FILE_EXISTS_IN_GAME ~%cus2%D.SPL~ BEGIN // INNER_ACTION BEGIN COPY_EXISTING ~%cus0%.SPL~ ~override/%cus2%D.SPL~ WRITE_LONG 0x0008 ~%name%~ WRITE_LONG 0x0034 level //spell level WRITE_LONG 0x000c ~%name%~ WRITE_LONG 0x0054 ~%desc%~ WRITE_SHORT 0x007E target //Target-check WRITE_SHORT 0x0080 range //range-check LPF ALTER_EFFECT_ADD INT_VAR savebonus_add = 3 // END // END END ELSE BEGIN INNER_ACTION BEGIN COPY_EXISTING ~%cus2%D.SPL~ ~override~ LPF ALTER_EFFECT_ADD INT_VAR savebonus_add = 3 // END // END END PATCH_IF !FILE_EXISTS_IN_GAME ~%cus2%E.SPL~ BEGIN // INNER_ACTION BEGIN COPY_EXISTING ~%cus0%.SPL~ ~override/%cus2%E.SPL~ WRITE_LONG 0x0008 ~%name%~ WRITE_LONG 0x0034 level //spell level WRITE_LONG 0x000c ~%name%~ WRITE_LONG 0x0054 ~%desc%~ WRITE_SHORT 0x007E target //Target-check WRITE_SHORT 0x0080 range //range-check LPF ALTER_EFFECT_ADD INT_VAR savebonus_add = 4 // END // END END ELSE BEGIN INNER_ACTION BEGIN COPY_EXISTING ~%cus2%E.SPL~ ~override~ LPF ALTER_EFFECT_ADD INT_VAR savebonus_add = 4 // END // END END PATCH_IF !FILE_EXISTS_IN_GAME ~%cus2%F.SPL~ BEGIN // INNER_ACTION BEGIN COPY_EXISTING ~%cus0%.SPL~ ~override/%cus2%F.SPL~ WRITE_LONG 0x0008 ~%name%~ WRITE_LONG 0x0034 level //spell level WRITE_LONG 0x000c ~%name%~ WRITE_LONG 0x0054 ~%desc%~ WRITE_SHORT 0x007E target //Target-check WRITE_SHORT 0x0080 range //range-check LPF ALTER_EFFECT_ADD INT_VAR savebonus_add = 5 // END // END END ELSE BEGIN INNER_ACTION BEGIN COPY_EXISTING ~%cus2%F.SPL~ ~override~ LPF ALTER_EFFECT_ADD INT_VAR savebonus_add = 5 // END // END END END //evoc school END //not no save(?) END //wiz spells END //source size BUT_ONLY
-
Well, this is very cool. I've found a reason to modify rather than set values of certain effect variables. Well, I'm only doing this for savebonus, but I could see it being useful for duration, dicesize, dicenumber, or in certain cases, param1 or 2 (e.g. opcode 12).
That is, right now I'm doing a thing where characters get a bonus based on dexterity to save vs. certain spells, such as fireball. Basically, I'm cloning the spell to cast different versions of itself based on the targets dexterity (i.e. giving bonuses for exceptional dex). But, certain spells--and certain mods and potential mods--already impose save bonuses or penalties for certain spells, and I want the code to be as unintrusive--as unintrusive as a modification like this could be--as possible, so I just modified alter_spell accordingly (i.e. as a new zombie function).
If you're already building a more expansive ALTER_SPELL, maybe you can add a few subfunctions that, if ticked, would add/subtract the inputted value rather than set it to that value for a given field. That is, for example, there could be a set_savebonus which could default to 0. If the value of set_savebonus is 0, then savebonus acts as normal (i.e. it sets the save bonus). But, if set_savebonus is non-zero, then save bonus = the previous value +/- savebonus. Similar for other fields
I'd offer my code, but it's not this sophisticated (I just hijacked savebonus). So, instead, I'm offering the suggestion.
-
This one is like spell_to_innate, but allows for a few more options (including changing spell types from any kind to any other kind). A lot of the text options are English only, but those can be traified to support other languages. Also, it won't replace any sphere text in spells with custom sphere names, but those could easily be added.
SpoilerDEFINE_PATCH_FUNCTION ALTER_SPELL_TYPE INT_VAR spell_type = "-1" //Special: (0); Wizard: (1); Cleric: (2); Psionic: (3); Innate: (4); Song: (5) spell_level = "-1" location = "-1" //none: (0); spell: (2); innate (4) - ONLY Necessary if other than specified by Spell type (otherwise location automatically changed) school = "-1" //school: 0 = None; 1 = abjuration; 2 = conjuration; 3= divination; 4 = enchantment; 5 = illusion; 6 = invoker; 7 = necromancer; 8 = transmuter; 9 = trueclass mage; 10 = wild mage only opposition_school = "-1" //opposition school: 0 = None; 1 = abjuration; 2 = conjuration; 3= divination; 4 = enchantment; 5 = illusion; 6 = invoker; 7 = necromancer; 8 = transmuter; 9 = trueclass mage; 10 = wild mage only prohibited_alignment = "-1" //or prohibited alignment: 1 = exclude chaotic; 2 = evil; 3 = good; 4 = ethical neutral; 5 = lawful 6 = moral neutral casting_graphics = "-1" //school: 0 = None; 1 = abjuration; 2 = conjuration; 3= divination; 4 = enchantment; 5 = illusion; 6 = invoker; 7 = necromancer; 8 = transmuter; 9 = black sparks cleric_druid_only = "-1" //0 = no restrictions; 1 = cleric/Pal exclusive (priest spells); 2 = druid/Ran exclusive (priest spells); 3 = prohibit all wild_mage = "-1" //0 = Wildmage restricted (wm can't cast); 1 = Wildmage can cast (mage spells) sec_type = "-1" //0 = none; 1 = Spell Protection; 2 = Specific Protections; 3 = Illusonary Protections; 4 = Magic Attack; 5 = Divination Attack; 6 = Conjuration; 7 = Combat Protections; 8 = Contingency; 9 = Battleground; 10 = Offensive Damage; 11 = Disabling; 12 = Combination; 13 = Non-Combat; 14 = Dorn's Sword failure = "-1" // 0 = Failure NOT possible; 1 = Failure possible (other values not accepted) indoors = "-1" // 0 = cannot be cast indoors; 1 = can cast indoors (other values not accepted) surge = "-1" // 0 = wildsurge not possible; 1 = wildsurge possible (other values not accepted) los = "-1" // 0 = Line of Sight required; 1 = no LOS required (other values not accepted) combat = "-1" // 0 = cannot be cast in combat; 1 = CAN be cast in combat (other values not accepted) hostile = "-1" // 0 = not hostile spell; 1 = Hostile (other values not accepted) ! spotting = "-1" // 0 = no spotting(?); 1 = spotting (other values not accepted) target_invisible = "-1" // 0 = cannot target invisible; 1 = can target invisibile (other values not accepted) silence = "-1" // 0 = cannot cast when silenced; 1 = can cast when silenced (other values not accepted) STR_VAR level_text = "SAME" //Only accepts values of 1-10, "Quest", "Cantrip" or "Orison"--Changes "Level: x" in spell description to "Level: y" where y is the value added TEST!!! school_text = "SAME" //Only necessary for user created schools sphere_text = "SAME" //Name of sphere c_icon = "NO" //"SAME" = %SOURCE_RES%C, "ADD" = %spell_res%C, else Exact name given of C icon BEGIN READ_LONG 0x64 abil_off ELSE 0 READ_SHORT 0x68 abil_num ELSE 0 READ_ASCII (abil_off + 0x04) bam (8) // reads the bam filename from ability // Handle spell_type if specified PATCH_IF (spell_type >= 0) //types: innate(4) BEGIN WRITE_SHORT 0x1C spell_type PATCH_IF (location < 0) BEGIN PATCH_IF (spell_type = 0) OR ((spell_type = 2) OR (spell_type = 4)) BEGIN FOR (index = 0 ; index < abil_num ; ++index) BEGIN WRITE_SHORT (abil_off + 0x02 + (0x28 * index)) spell_type END END ELSE BEGIN FOR (index = 0 ; index < abil_num ; ++index) BEGIN WRITE_SHORT (abil_off + 0x02 + (0x28 * index)) 0 END END END END // Handle spell level if specified PATCH_IF (spell_level > 0) BEGIN WRITE_LONG 0x34 spell_level END // Handle location if specified PATCH_IF (location >= 0) BEGIN FOR (index = 0 ; index < abil_num ; ++index) BEGIN WRITE_SHORT (abil_off + 0x02 + (0x28 * index)) location END END // Handle opp school if specified (mage only) PATCH_IF (opposition_school >= 0) BEGIN PATCH_IF (opposition_school = 0) BEGIN WRITE_LONG 0x001e 0x0000 //General spells, exclude nobody END PATCH_IF (opposition_school = 1) BEGIN WRITE_LONG 0x001e 0x0040 //General spells, exclude abjuration END PATCH_IF (opposition_school = 2) BEGIN WRITE_LONG 0x001e 0x0080 //General spells, exclude conjuration END PATCH_IF (opposition_school = 3) BEGIN WRITE_LONG 0x001e 0x0100 //General spells, exclude divination END PATCH_IF (opposition_school = 4) BEGIN WRITE_LONG 0x001e 0x0200 //General spells, exclude enchanter END PATCH_IF (opposition_school = 5) BEGIN WRITE_LONG 0x001e 0x0400 //General spells, exclude illusion END PATCH_IF (opposition_school = 6) BEGIN WRITE_LONG 0x001e 0x0800 //General spells, exclude invoker END PATCH_IF (opposition_school = 7) BEGIN WRITE_LONG 0x001e 0x1000 //General spells, exclude necro END PATCH_IF (opposition_school = 8) BEGIN WRITE_LONG 0x001e 0x2000 //General spells, exclude transmutation END PATCH_IF (opposition_school = 9) BEGIN WRITE_LONG 0x001e 0x4000 //General spells, exclude trueclass mage END PATCH_IF (opposition_school = 10) BEGIN WRITE_LONG 0x001e 0x7fc0 //General spells, wildmage only END END //prohibited_alignment if specified (priest only) PATCH_IF (prohibited_alignment > 0) BEGIN PATCH_IF (prohibited_alignment = 1) BEGIN WRITE_LONG 0x001e 0x0001 //exclude chaotic END PATCH_IF (prohibited_alignment = 2) BEGIN WRITE_LONG 0x001e 0x0002 //exclude evil END PATCH_IF (prohibited_alignment = 3) BEGIN WRITE_LONG 0x001e 0x0004 //exclude good END PATCH_IF (prohibited_alignment = 4) BEGIN WRITE_LONG 0x001e 0x0020 //exclude ethical neutral END PATCH_IF (prohibited_alignment = 5) BEGIN WRITE_LONG 0x001e 0x0010 //exclude lawful END PATCH_IF (prohibited_alignment = 6) BEGIN WRITE_LONG 0x001e 0x0008 //exclude moral neutral END END PATCH_IF (school >= 0) BEGIN PATCH_IF (school = 0) BEGIN WRITE_BYTE 0x0025 0x01 // None END PATCH_IF (school = 1) BEGIN WRITE_BYTE 0x0025 0x01 // Abjuration READ_LONG 0x50 "valid" PATCH_IF (%valid% >= 0) BEGIN // verify desc is valid READ_STRREF 0x50 ~desc~ INNER_PATCH_SAVE new_desc ~%desc%~ BEGIN //CHECK SPELLS: Wraithform, MMM, Fireshield REPLACE_TEXTUALLY ~Abjuration~ ~Abjuration~ //replacing old with new REPLACE_TEXTUALLY ~Conjuration~ ~Abjuration~ //replacing old with new REPLACE_TEXTUALLY ~Conjuration/Summoning~ ~Abjuration~ //replacing old with new REPLACE_TEXTUALLY ~Alteration~ ~Abjuration~ //replacing old with new REPLACE_TEXTUALLY ~Evocation~ ~Abjuration~ //replacing old with new REPLACE_TEXTUALLY ~Necromancy~ ~Abjuration~ //replacing old with new REPLACE_TEXTUALLY ~Enchantment/Charm~ ~Abjuration~ //replacing old with new REPLACE_TEXTUALLY ~Illusion/Phantasm~ ~Abjuration~ //replacing old with new REPLACE_TEXTUALLY ~(Divination)~ ~(Abjuration)~ //replacing old with new REPLACE_TEXTUALLY ~School: Divination~ ~School: Abjuration~ //replacing old with new END // SAY_EVALUATED 0x50 ~%new_desc%~ END // end text change END PATCH_IF (school = 2) BEGIN WRITE_BYTE 0x0025 0x02 // Conjuration READ_LONG 0x50 "valid" PATCH_IF (%valid% >= 0) BEGIN // verify desc is valid READ_STRREF 0x50 ~desc~ INNER_PATCH_SAVE new_desc ~%desc%~ BEGIN //CHECK SPELLS: Wraithform, MMM, Fireshield REPLACE_TEXTUALLY ~Abjuration~ ~Conjuration~ //replacing old with new REPLACE_TEXTUALLY ~Conjuration~ ~Conjuration~ //replacing old with new REPLACE_TEXTUALLY ~Conjuration/Summoning~ ~Conjuration/Summoning~ //replacing old with new REPLACE_TEXTUALLY ~Alteration~ ~Conjuration~ //replacing old with new REPLACE_TEXTUALLY ~Evocation~ ~Conjuration~ //replacing old with new REPLACE_TEXTUALLY ~Necromancy~ ~Conjuration~ //replacing old with new REPLACE_TEXTUALLY ~Enchantment/Charm~ ~Conjuration~ //replacing old with new REPLACE_TEXTUALLY ~Illusion/Phantasm~ ~Conjuration~ //replacing old with new REPLACE_TEXTUALLY ~(Divination)~ ~(Conjuration)~ //replacing old with new REPLACE_TEXTUALLY ~School: Divination~ ~School: Conjuration~ //replacing old with new END // SAY_EVALUATED 0x50 ~%new_desc%~ END // end text change END PATCH_IF (school = 3) BEGIN WRITE_BYTE 0x0025 0x03 // (Divination) READ_LONG 0x50 "valid" PATCH_IF (%valid% >= 0) BEGIN // verify desc is valid READ_STRREF 0x50 ~desc~ INNER_PATCH_SAVE new_desc ~%desc%~ BEGIN //CHECK SPELLS: Wraithform, MMM, Fireshield REPLACE_TEXTUALLY ~Abjuration~ ~Divination~ //replacing old with new REPLACE_TEXTUALLY ~Conjuration~ ~Divination~ //replacing old with new REPLACE_TEXTUALLY ~Conjuration/Summoning~ ~Divination~ //replacing old with new REPLACE_TEXTUALLY ~Alteration~ ~Divination~ //replacing old with new REPLACE_TEXTUALLY ~Evocation~ ~Divination~ //replacing old with new REPLACE_TEXTUALLY ~Necromancy~ ~Divination~ //replacing old with new REPLACE_TEXTUALLY ~Enchantment/Charm~ ~Divination~ //replacing old with new REPLACE_TEXTUALLY ~Illusion/Phantasm~ ~Divination~ //replacing old with new END // SAY_EVALUATED 0x50 ~%new_desc%~ END // end text change END PATCH_IF (school = 4) BEGIN WRITE_BYTE 0x0025 0x04 // Enchanter READ_LONG 0x50 "valid" PATCH_IF (%valid% >= 0) BEGIN // verify desc is valid READ_STRREF 0x50 ~desc~ INNER_PATCH_SAVE new_desc ~%desc%~ BEGIN //CHECK SPELLS: Wraithform, MMM, Fireshield REPLACE_TEXTUALLY ~Abjuration~ ~Enchantment/Charm~ //replacing old with new REPLACE_TEXTUALLY ~Conjuration~ ~Enchantment/Charm~ //replacing old with new REPLACE_TEXTUALLY ~Conjuration/Summoning~ ~Enchantment/Charm~ //replacing old with new REPLACE_TEXTUALLY ~Alteration~ ~Enchantment/Charm~ //replacing old with new REPLACE_TEXTUALLY ~Evocation~ ~Enchantment/Charm~ //replacing old with new REPLACE_TEXTUALLY ~Necromancy~ ~Enchantment/Charm~ //replacing old with new REPLACE_TEXTUALLY ~Enchantment/Charm~ ~Enchantment/Charm~ //replacing old with new REPLACE_TEXTUALLY ~Illusion/Phantasm~ ~Enchantment/Charm~ //replacing old with new REPLACE_TEXTUALLY ~(Divination)~ ~(Enchantment/Charm)~ //replacing old with new REPLACE_TEXTUALLY ~School: Divination~ ~School: Enchantment/Charm~ //replacing old with new END SAY_EVALUATED 0x50 ~%new_desc%~ // END // end text change END PATCH_IF (school = 5) BEGIN WRITE_BYTE 0x0025 0x05 // Illusion READ_LONG 0x50 "valid" PATCH_IF (%valid% >= 0) BEGIN // verify desc is valid READ_STRREF 0x50 ~desc~ INNER_PATCH_SAVE new_desc ~%desc%~ BEGIN //CHECK SPELLS: Wraithform, MMM, Fireshield REPLACE_TEXTUALLY ~Abjuration~ ~Illusion/Phantasm~ //replacing old with new REPLACE_TEXTUALLY ~Conjuration~ ~Illusion/Phantasm~ //replacing old with new REPLACE_TEXTUALLY ~Conjuration/Summoning~ ~Illusion/Phantasm~ //replacing old with new REPLACE_TEXTUALLY ~Alteration~ ~Illusion/Phantasm~ //replacing old with new REPLACE_TEXTUALLY ~Evocation~ ~Illusion/Phantasm~ //replacing old with new REPLACE_TEXTUALLY ~Necromancy~ ~Illusion/Phantasm~ //replacing old with new REPLACE_TEXTUALLY ~Enchantment/Charm~ ~Illusion/Phantasm~ //replacing old with new REPLACE_TEXTUALLY ~Illusion/Phantasm~ ~Illusion/Phantasm~ //replacing old with new REPLACE_TEXTUALLY ~(Divination)~ ~(Illusion/Phantasm)~ //replacing old with new REPLACE_TEXTUALLY ~School: Divination~ ~School: Illusion/Phantasm~ //replacing old with new END SAY_EVALUATED 0x50 ~%new_desc%~ // END // end text change END PATCH_IF (school = 6) BEGIN WRITE_BYTE 0x0025 0x06 // Invoker READ_LONG 0x50 "valid" PATCH_IF (%valid% >= 0) BEGIN // verify desc is valid READ_STRREF 0x50 ~desc~ INNER_PATCH_SAVE new_desc ~%desc%~ BEGIN //CHECK SPELLS: Wraithform, MMM, Fireshield REPLACE_TEXTUALLY ~Abjuration~ ~Evocation~ //replacing old with new REPLACE_TEXTUALLY ~Conjuration~ ~Evocation~ //replacing old with new REPLACE_TEXTUALLY ~Conjuration/Summoning~ ~Evocation~ //replacing old with new REPLACE_TEXTUALLY ~Alteration~ ~Evocation~ //replacing old with new REPLACE_TEXTUALLY ~Evocation~ ~Evocation~ //replacing old with new REPLACE_TEXTUALLY ~Necromancy~ ~Evocation~ //replacing old with new REPLACE_TEXTUALLY ~Enchantment/Charm~ ~Evocation~ //replacing old with new REPLACE_TEXTUALLY ~Illusion/Phantasm~ ~Evocation~ //replacing old with new REPLACE_TEXTUALLY ~(Divination)~ ~(Evocation)~ //replacing old with new REPLACE_TEXTUALLY ~School: Divination~ ~School: Evocation~ //replacing old with new END SAY_EVALUATED 0x50 ~%new_desc%~ // END // end text change END PATCH_IF (school = 7) BEGIN WRITE_BYTE 0x0025 0x07 // Necro READ_LONG 0x50 "valid" PATCH_IF (%valid% >= 0) BEGIN // verify desc is valid READ_STRREF 0x50 ~desc~ INNER_PATCH_SAVE new_desc ~%desc%~ BEGIN //CHECK SPELLS: Wraithform, MMM, Fireshield REPLACE_TEXTUALLY ~Abjuration~ ~Necromancy~ //replacing old with new REPLACE_TEXTUALLY ~Conjuration~ ~Necromancy~ //replacing old with new REPLACE_TEXTUALLY ~Conjuration/Summoning~ ~Necromancy~ //replacing old with new REPLACE_TEXTUALLY ~Alteration~ ~Necromancy~ //replacing old with new REPLACE_TEXTUALLY ~Evocation~ ~Necromancy~ //replacing old with new REPLACE_TEXTUALLY ~Necromancy~ ~Necromancy~ //replacing old with new REPLACE_TEXTUALLY ~Enchantment/Charm~ ~Necromancy~ //replacing old with new REPLACE_TEXTUALLY ~Illusion/Phantasm~ ~Necromancy~ //replacing old with new REPLACE_TEXTUALLY ~(Divination)~ ~(Necromancy)~ //replacing old with new REPLACE_TEXTUALLY ~School: Divination~ ~School: Necromancy~ //replacing old with new END SAY_EVALUATED 0x50 ~%new_desc%~ // END // end text change END PATCH_IF (school = 8) BEGIN WRITE_BYTE 0x0025 0x08 // Transmutation READ_LONG 0x50 "valid" PATCH_IF (%valid% >= 0) BEGIN // verify desc is valid READ_STRREF 0x50 ~desc~ INNER_PATCH_SAVE new_desc ~%desc%~ BEGIN //CHECK SPELLS: Wraithform, MMM, Fireshield REPLACE_TEXTUALLY ~Abjuration~ ~Alteration~ //replacing old with new REPLACE_TEXTUALLY ~Conjuration~ ~Alteration~ //replacing old with new REPLACE_TEXTUALLY ~Conjuration/Summoning~ ~Alteration~ //replacing old with new REPLACE_TEXTUALLY ~Alteration~ ~Alteration~ //replacing old with new REPLACE_TEXTUALLY ~Evocation~ ~Alteration~ //replacing old with new REPLACE_TEXTUALLY ~Necromancy~ ~Alteration~ //replacing old with new REPLACE_TEXTUALLY ~Enchantment/Charm~ ~Alteration~ //replacing old with new REPLACE_TEXTUALLY ~Illusion/Phantasm~ ~Alteration~ //replacing old with new REPLACE_TEXTUALLY ~(Divination)~ ~(Alteration)~ //replacing old with new REPLACE_TEXTUALLY ~School: Divination~ ~School: Alteration~ //replacing old with new END SAY_EVALUATED 0x50 ~%new_desc%~ // END // end text change END PATCH_IF (school = 9) BEGIN WRITE_BYTE 0x0025 0x09 // Generalist(?) END END PATCH_IF (cleric_druid_only >= 0) BEGIN PATCH_IF (cleric_druid_only = 0) BEGIN READ_BYTE 0x21 none // WRITE_BYTE 0x21 (none BAND 0b00000000) // reset END PATCH_IF (cleric_druid_only = 1) BEGIN READ_BYTE 0x21 none // WRITE_BYTE 0x21 (none BAND 0b00000000) // reset READ_BYTE 0x21 cleric // WRITE_BYTE 0x21 (cleric BOR 0b10000000) // set to cleric END PATCH_IF (cleric_druid_only = 2) BEGIN READ_BYTE 0x21 none // WRITE_BYTE 0x21 (none BAND 0b00000000) // reset READ_BYTE 0x21 druid // WRITE_BYTE 0x21 (druid BOR 0b01000000) // set to druid END PATCH_IF (cleric_druid_only = 3) BEGIN READ_BYTE 0x21 none // WRITE_BYTE 0x21 (none BAND 0b00000000) // reset READ_BYTE 0x21 no_wild // WRITE_BYTE 0x21 (no_wild BOR 0b11000000) // Restrict everybody END END //wild_mage if specified PATCH_IF (wild_mage >= 0) BEGIN PATCH_IF (wild_mage = 0) BEGIN //Wildmage Can't cast READ_BYTE 0x21 none // WRITE_BYTE 0x21 (none BAND 0b00000000) // reset READ_BYTE 0x21 no_wild // WRITE_BYTE 0x21 (no_wild BOR 0b11000000) // Restrict wildmage END PATCH_IF (wild_mage = 1) BEGIN //wildmage Can cast READ_BYTE 0x21 none // WRITE_BYTE 0x21 (none BAND 0b00000000) // wildmage enabled END END //casting graphics if specified PATCH_IF (casting_graphics >= 0) BEGIN PATCH_IF (casting_graphics = 0) BEGIN WRITE_SHORT 0x0022 00 // c.graphics -schooless END PATCH_IF (casting_graphics = 1) BEGIN WRITE_SHORT 0x0022 12 // c.graphics -abjuration END PATCH_IF (casting_graphics = 2) BEGIN WRITE_SHORT 0x0022 14 // c.graphics -conjuration END PATCH_IF (casting_graphics = 3) BEGIN WRITE_SHORT 0x0022 16 // c.graphics -divination END PATCH_IF (casting_graphics = 4) BEGIN WRITE_SHORT 0x0022 11 // c.graphics -enchantment END PATCH_IF (casting_graphics = 5) BEGIN WRITE_SHORT 0x0022 13 // c.graphics -illusion END PATCH_IF (casting_graphics = 6) BEGIN WRITE_SHORT 0x0022 15 // c.graphics -invoker END PATCH_IF (casting_graphics = 7) BEGIN WRITE_SHORT 0x0022 09 // c.graphics -necromancy END PATCH_IF (casting_graphics = 8) BEGIN WRITE_SHORT 0x0022 10 // c.graphics -alteration END PATCH_IF (casting_graphics = 9) BEGIN WRITE_SHORT 0x0022 18 // c.graphics -black sparks END END // Handle sec school if specified PATCH_IF (sec_type >= 0) BEGIN PATCH_IF (sec_type = 0) BEGIN WRITE_LONG 0x0027 0x0000 //None END PATCH_IF (sec_type = 1) BEGIN WRITE_LONG 0x0027 0x01 //Spell Protection END PATCH_IF (sec_type = 2) BEGIN WRITE_LONG 0x0027 0x02 //-SPECIFICPROTECTIONS END PATCH_IF (sec_type = 3) BEGIN WRITE_LONG 0x0027 0x03 //-ILLUSIONARYPROTECTIONS END PATCH_IF (sec_type = 4) BEGIN WRITE_LONG 0x0027 0x04 //-MAGICATTACK END PATCH_IF (sec_type = 5) BEGIN WRITE_LONG 0x0027 0x05 //DIVINATIONATTACK END PATCH_IF (sec_type = 6) BEGIN WRITE_LONG 0x0027 0x06 //CONJURATION END PATCH_IF (sec_type = 7) BEGIN WRITE_LONG 0x0027 0x07 //0x07-COMBATPROTECTIONS END PATCH_IF (sec_type = 8) BEGIN WRITE_LONG 0x0027 0x08 //0x08-CONTINGENCY END PATCH_IF (sec_type = 9) BEGIN WRITE_LONG 0x0027 0x09 //0x09-BATTLEGROUND END PATCH_IF (sec_type = 10) BEGIN WRITE_LONG 0x0027 0x0a //-OFFENSIVEDAMAGE END PATCH_IF (sec_type = 11) BEGIN WRITE_LONG 0x0027 0x0b //0x0b-DISABLING END PATCH_IF (sec_type = 12) BEGIN WRITE_LONG 0x0027 0x0c //0x0c-COMBINATION END PATCH_IF (sec_type = 13) BEGIN WRITE_LONG 0x0027 0x0d //0x0d-NON-COMBAT END PATCH_IF (sec_type = 14) BEGIN WRITE_LONG 0x0027 0x0e //0x0e-DORNS_SWORD END END //Handle hostile if specified PATCH_IF (hostile = 0) BEGIN READ_BYTE 0x19 no_hos // WRITE_BYTE 0x19 (no_hos BAND 0b11111011) // END PATCH_IF (hostile = 1) BEGIN READ_BYTE 0x19 hos // WRITE_BYTE 0x19 (hos BOR 0b00000100) // END // Handle failure if specified PATCH_IF (failure = 0) BEGIN WRITE_LONG 0x0018 (THIS | 0x4000) //No failure END PATCH_IF (failure = 1) BEGIN READ_BYTE 0x19 no_fail // WRITE_BYTE 0x19 (no_fail BAND 0b10111111) // not no fail END // Handle indoors if specified PATCH_IF (indoors = 0) BEGIN WRITE_LONG 0x0018 (THIS | 0x2000) //Not indoors END PATCH_IF (indoors = 1) BEGIN READ_BYTE 0x19 inside // WRITE_BYTE 0x19 (inside BAND 0b11011111) // Can be cast indoors END // Handle surge if specified PATCH_IF (surge = 0) BEGIN WRITE_LONG 0x0018 (THIS | 0x8000) //No wildsurge END PATCH_IF (surge = 1) BEGIN READ_BYTE 0x19 no_surge // WRITE_BYTE 0x19 (no_surge BAND 0b01111111) // not no surge END // Handle spotting if specified PATCH_IF (spotting = 0) BEGIN READ_BYTE 0x19 spot // WRITE_BYTE 0x19 (spot BAND 0b11101111) // not spot END PATCH_IF (spotting = 1) BEGIN WRITE_LONG 0x0018 (THIS | 0x1000) //allow spotting? END //Handle LOS if specified PATCH_IF (los = 0) BEGIN READ_BYTE 0x19 see // WRITE_BYTE 0x19 (see BAND 0b11110111) // LOS required END PATCH_IF (los = 1) BEGIN READ_BYTE 0x19 see // WRITE_BYTE 0x19 (see BOR 0b00001000) // los not required END // Handle combat if specified PATCH_IF (combat = 0) BEGIN READ_BYTE 0x001a fail //reads the byte WRITE_BYTE 0x001a (fail BOR 0b00000001) // CANNOT cast in combat END PATCH_IF (combat = 1) BEGIN READ_BYTE 0x001a fail //reads the byte WRITE_BYTE 0x001a (fail BAND 0b11111110) // CAN cast in combat END //target_invisible if specified PATCH_IF (target_invisible = 0) BEGIN READ_BYTE 0x001b invis //reads the byte WRITE_BYTE 0x001b (invis BAND 0b11111110) // CANNOT target invis END PATCH_IF (target_invisible = 1) BEGIN READ_BYTE 0x001b invis //reads the byte WRITE_BYTE 0x001b (invis BOR 0b00000001) // CAN target invis END //silence if specified PATCH_IF (silence = 0) BEGIN READ_BYTE 0x001b speak //reads the byte WRITE_BYTE 0x001b (speak BAND 0b11111101) // CANNOT cast silenced END PATCH_IF (silence = 1) BEGIN READ_BYTE 0x001b speak //reads the byte WRITE_BYTE 0x001b (speak BOR 0b00000010) // CAN cast silenced END //level text if specified PATCH_IF ("%level_text%" STRING_COMPARE_CASE "SAME" != 0) BEGIN // //lev x to lev y READ_LONG 0x50 "valid" PATCH_IF (%valid% >= 0) BEGIN // verify desc is valid READ_STRREF 0x50 ~desc~ INNER_PATCH_SAVE new_desc ~%desc%~ BEGIN REPLACE_TEXTUALLY ~Level: Cantrip~ ~Level: %level_text%~ //replacing old with new REPLACE_TEXTUALLY ~Level: Orison~ ~Level: %level_text%~ //replacing old with new REPLACE_TEXTUALLY ~Level: 1~ ~Level: %level_text%~ //replacing old with new REPLACE_TEXTUALLY ~Level: 2~ ~Level: %level_text%~ //replacing old with new REPLACE_TEXTUALLY ~Level: 3~ ~Level: %level_text%~ //replacing old with new REPLACE_TEXTUALLY ~Level: 4~ ~Level: %level_text%~ //replacing old with new REPLACE_TEXTUALLY ~Level: 5~ ~Level: %level_text%~ //replacing old with new REPLACE_TEXTUALLY ~Level: 6~ ~Level: %level_text%~ //replacing old with new REPLACE_TEXTUALLY ~Level: 7~ ~Level: %level_text%~ //replacing old with new REPLACE_TEXTUALLY ~Level: 8~ ~Level: %level_text%~ //replacing old with new REPLACE_TEXTUALLY ~Level: 9~ ~Level: %level_text%~ //replacing old with new REPLACE_TEXTUALLY ~Level: 10~ ~Level: %level_text%~ //replacing old with new REPLACE_TEXTUALLY ~Level: Quest~ ~Level: %level_text%~ //replacing old with new END SAY_EVALUATED 0x50 ~%new_desc%~ END // END //end lev text //level school if specified PATCH_IF ("%school_text%" STRING_COMPARE_CASE "SAME" != 0) BEGIN // READ_LONG 0x50 "valid" PATCH_IF (%valid% >= 0) BEGIN // verify desc is valid READ_STRREF 0x50 ~desc~ INNER_PATCH_SAVE new_desc ~%desc%~ BEGIN REPLACE_TEXTUALLY ~Abjuration~ ~%school_text%~ //replacing old with new REPLACE_TEXTUALLY ~Conjuration~ ~%school_text%~ //replacing old with new REPLACE_TEXTUALLY ~Conjuration/Summoning~ ~%school_text%~ //replacing old with new REPLACE_TEXTUALLY ~Alteration~ ~%school_text%~ //replacing old with new REPLACE_TEXTUALLY ~Evocation~ ~%school_text%~ //replacing old with new REPLACE_TEXTUALLY ~Necromancy~ ~%school_text%~ //replacing old with new REPLACE_TEXTUALLY ~Enchantment/Charm~ ~%school_text%~ //replacing old with new REPLACE_TEXTUALLY ~Illusion/Phantasm~ ~%school_text%~ //replacing old with new REPLACE_TEXTUALLY ~(Divination)~ ~(%school_text%)~ //replacing old with new REPLACE_TEXTUALLY ~School: Divination~ ~School: %school_text%~ //replacing old with new END SAY_EVALUATED 0x50 ~%new_desc%~ END // END//End school_text text //level school if specified PATCH_IF ("%sphere_text%" STRING_COMPARE_CASE "SAME" != 0) BEGIN // READ_LONG 0x50 "valid" PATCH_IF (%valid% >= 0) BEGIN // verify desc is valid READ_STRREF 0x50 ~desc~ INNER_PATCH_SAVE new_desc ~%desc%~ BEGIN REPLACE_TEXTUALLY ~Sphere: Affliction~ ~Sphere: %sphere_text%~ //replacing old with new REPLACE_TEXTUALLY ~Sphere: Air~ ~Sphere: %sphere_text%~ //replacing old with new REPLACE_TEXTUALLY ~Sphere: All~ ~Sphere: %sphere_text%~ //replacing old with new REPLACE_TEXTUALLY ~Sphere: Animal~ ~Sphere: %sphere_text%~ //replacing old with new REPLACE_TEXTUALLY ~Sphere: Animal, Summoning~ ~Sphere: %sphere_text%~ //replacing old with new REPLACE_TEXTUALLY ~Sphere: Benediction~ ~Sphere: %sphere_text%~ //replacing old with new REPLACE_TEXTUALLY ~Sphere: Chaos~ ~Sphere: %sphere_text%~ //replacing old with new REPLACE_TEXTUALLY ~Sphere: Charm~ ~Sphere: %sphere_text%~ //replacing old with new REPLACE_TEXTUALLY ~Sphere: Charm, Combat, Law~ ~Sphere: %sphere_text%~ //replacing old with new REPLACE_TEXTUALLY ~Sphere: Charm, Creation~ ~Sphere: %sphere_text%~ //replacing old with new REPLACE_TEXTUALLY ~Sphere: Charm, Law~ ~Sphere: %sphere_text%~ //replacing old with new REPLACE_TEXTUALLY ~Sphere: Charm, Protection~ ~Sphere: %sphere_text%~ //replacing old with new REPLACE_TEXTUALLY ~Sphere: Combat~ ~Sphere: %sphere_text%~ //replacing old with new REPLACE_TEXTUALLY ~Sphere: Combat, Necromantic~ ~Sphere: %sphere_text%~ //replacing old with new REPLACE_TEXTUALLY ~Sphere: Combat, Plant~ ~Sphere: %sphere_text%~ //replacing old with new REPLACE_TEXTUALLY ~Sphere: Combat, Summoning~ ~Sphere: %sphere_text%~ //replacing old with new REPLACE_TEXTUALLY ~Sphere: Creation~ ~Sphere: %sphere_text%~ //replacing old with new REPLACE_TEXTUALLY ~Sphere: Death~ ~Sphere: %sphere_text%~ //replacing old with new REPLACE_TEXTUALLY ~Sphere: Deception~ ~Sphere: %sphere_text%~ //replacing old with new REPLACE_TEXTUALLY ~Sphere: Destruction~ ~Sphere: %sphere_text%~ //replacing old with new REPLACE_TEXTUALLY ~Sphere: Divination~ ~Sphere: %sphere_text%~ //replacing old with new REPLACE_TEXTUALLY ~Sphere: Dread~ ~Sphere: %sphere_text%~ //replacing old with new REPLACE_TEXTUALLY ~Sphere: Earth~ ~Sphere: %sphere_text%~ //replacing old with new REPLACE_TEXTUALLY ~Sphere: Elemental~ ~Sphere: %sphere_text%~ //replacing old with new REPLACE_TEXTUALLY ~Sphere: Elemental (Air)~ ~Sphere: %sphere_text%~ //replacing old with new REPLACE_TEXTUALLY ~Sphere: Elemental Air~ ~Sphere: %sphere_text%~ //replacing old with new REPLACE_TEXTUALLY ~Sphere: Elemental (Earth)~ ~Sphere: %sphere_text%~ //replacing old with new REPLACE_TEXTUALLY ~Sphere: Elemental (Earth), Summoning~ ~Sphere: %sphere_text%~ //replacing old with new REPLACE_TEXTUALLY ~Sphere: Elemental Earth~ ~Sphere: %sphere_text%~ //replacing old with new REPLACE_TEXTUALLY ~Sphere: Elemental (Fire)~ ~Sphere: %sphere_text%~ //replacing old with new REPLACE_TEXTUALLY ~Sphere: Elemental (Fire), Summoning~ ~Sphere: %sphere_text%~ //replacing old with new REPLACE_TEXTUALLY ~Sphere: Elemental Fire~ ~Sphere: %sphere_text%~ //replacing old with new REPLACE_TEXTUALLY ~Sphere: Elemental (Water)~ ~Sphere: %sphere_text%~ //replacing old with new REPLACE_TEXTUALLY ~Sphere: Elemental Water~ ~Sphere: %sphere_text%~ //replacing old with new REPLACE_TEXTUALLY ~Sphere: Exploration~ ~Sphere: %sphere_text%~ //replacing old with new REPLACE_TEXTUALLY ~Sphere: Fire~ ~Sphere: %sphere_text%~ //replacing old with new REPLACE_TEXTUALLY ~Sphere: Guardian~ ~Sphere: %sphere_text%~ //replacing old with new REPLACE_TEXTUALLY ~Sphere: Guardian, Creation~ ~Sphere: %sphere_text%~ //replacing old with new REPLACE_TEXTUALLY ~Sphere: Healing~ ~Sphere: %sphere_text%~ //replacing old with new REPLACE_TEXTUALLY ~Sphere: Knowledge~ ~Sphere: %sphere_text%~ //replacing old with new REPLACE_TEXTUALLY ~Sphere: Law~ ~Sphere: %sphere_text%~ //replacing old with new REPLACE_TEXTUALLY ~Sphere: Life~ ~Sphere: %sphere_text%~ //replacing old with new REPLACE_TEXTUALLY ~Sphere: Light~ ~Sphere: %sphere_text%~ //replacing old with new REPLACE_TEXTUALLY ~Sphere: Magic~ ~Sphere: %sphere_text%~ //replacing old with new REPLACE_TEXTUALLY ~Sphere: Necromantic~ ~Sphere: %sphere_text%~ //replacing old with new REPLACE_TEXTUALLY ~Sphere: Necromantic, Protection~ ~Sphere: %sphere_text%~ //replacing old with new REPLACE_TEXTUALLY ~Sphere: Numbers~ ~Sphere: %sphere_text%~ //replacing old with new REPLACE_TEXTUALLY ~Sphere: Perdition~ ~Sphere: %sphere_text%~ //replacing old with new REPLACE_TEXTUALLY ~Sphere: Plant~ ~Sphere: %sphere_text%~ //replacing old with new REPLACE_TEXTUALLY ~Sphere: Protection~ ~Sphere: %sphere_text%~ //replacing old with new REPLACE_TEXTUALLY ~Sphere: Protection, Elemental (Fire)~ ~Sphere: %sphere_text%~ //replacing old with new REPLACE_TEXTUALLY ~Sphere: Protection, Plant~ ~Sphere: %sphere_text%~ //replacing old with new REPLACE_TEXTUALLY ~Sphere: Protection, Sun~ ~Sphere: %sphere_text%~ //replacing old with new REPLACE_TEXTUALLY ~Sphere: Protection, Weather~ ~Sphere: %sphere_text%~ //replacing old with new REPLACE_TEXTUALLY ~Sphere: Shadow~ ~Sphere: %sphere_text%~ //replacing old with new REPLACE_TEXTUALLY ~Sphere: Summoning~ ~Sphere: %sphere_text%~ //replacing old with new REPLACE_TEXTUALLY ~Sphere: Sun~ ~Sphere: %sphere_text%~ //replacing old with new REPLACE_TEXTUALLY ~Sphere: Thought~ ~Sphere: %sphere_text%~ //replacing old with new REPLACE_TEXTUALLY ~Sphere: Travelers~ ~Sphere: %sphere_text%~ //replacing old with new REPLACE_TEXTUALLY ~Sphere: Universal~ ~Sphere: %sphere_text%~ //replacing old with new REPLACE_TEXTUALLY ~Sphere: Vigor~ ~Sphere: %sphere_text%~ //replacing old with new REPLACE_TEXTUALLY ~Sphere: War~ ~Sphere: %sphere_text%~ //replacing old with new REPLACE_TEXTUALLY ~Sphere: Wards~ ~Sphere: %sphere_text%~ //replacing old with new REPLACE_TEXTUALLY ~Sphere: Wards, Elemental (Air)~ ~Sphere: %sphere_text%~ //replacing old with new REPLACE_TEXTUALLY ~Sphere: Water~ ~Sphere: %sphere_text%~ //replacing old with new REPLACE_TEXTUALLY ~Sphere: Weather~ ~Sphere: %sphere_text%~ //replacing old with new //missing sphere info REPLACE_TEXTUALLY ~1 Range~ ~1 Sphere: %sphere_text% Range~ //replacing old with new REPLACE_TEXTUALLY ~2 Range~ ~2 Sphere: %sphere_text% Range~ //replacing old with new REPLACE_TEXTUALLY ~3 Range~ ~3 Sphere: %sphere_text% Range~ //replacing old with new REPLACE_TEXTUALLY ~4 Range~ ~4 Sphere: %sphere_text% Range~ //replacing old with new REPLACE_TEXTUALLY ~5 Range~ ~5 Sphere: %sphere_text% Range~ //replacing old with new REPLACE_TEXTUALLY ~6 Range~ ~6 Sphere: %sphere_text% Range~ //replacing old with new REPLACE_TEXTUALLY ~7 Range~ ~7 Sphere: %sphere_text% Range~ //replacing old with new REPLACE_TEXTUALLY ~8 Range~ ~8 Sphere: %sphere_text% Range~ //replacing old with new REPLACE_TEXTUALLY ~9 Range~ ~9 Sphere: %sphere_text% Range~ //replacing old with new REPLACE_TEXTUALLY ~Quest Range~ ~Quest Sphere: %sphere_text% Range~ //replacing old with new REPLACE_TEXTUALLY ~Orison Range~ ~Orison Sphere: %sphere_text% Range~ //replacing old with new REPLACE_TEXTUALLY ~Cantrip Range~ ~Cantrip Sphere: %sphere_text% Range~ //replacing old with new END SAY_EVALUATED 0x50 ~%new_desc%~ END // END//End school_text text //c_icon if specified PATCH_IF ("%c_icon%" STRING_COMPARE_CASE "NO" != 0) BEGIN // PATCH_IF ("%c_icon%" STRING_COMPARE_CASE "SAME" = 0) BEGIN // WRITE_EVALUATED_ASCII 0x003a ~%SOURCE_RES%C~ END ELSE PATCH_IF ("%c_icon%" STRING_COMPARE_CASE "ADD" = 0) BEGIN WRITE_EVALUATED_ASCII 0x003a ~%spell_res%C~ END ELSE BEGIN WRITE_EVALUATED_ASCII 0x003a ~%c_icon%~ END END//End c_icon END
Sample uses:
SpoilerChanges Grease to an innate that cannot be cast indoors, but can be cast while silenced
COPY_EXISTING ~SPWI101.SPL~ ~override/B_TEST.SPL~ LPF ALTER_SPELL_TYPE INT_VAR spell_type = 4 //Special: (0); Wizard: (1); Cleric: (2); Psionic: (3); Innate: (4); Song: (5) indoors = 0 // 0 = cannot be cast indoors; 1 = can cast not indoors (other values not accepted) silence = 1 // 0 = cannot cast when silenced; 1 = can cast when silenced (other values not accepted) STR_VAR END
Adds that spell as a druid/ranger exclusive in the FOOEY sphere
ADD_SPELL ~override/B_TEST.SPL~ 1 1 ~TEST~ // LPF ALTER_SPELL_TYPE INT_VAR spell_type = 2 //Special: (0); Wizard: (1); Cleric: (2); Psionic: (3); Innate: (4); Song: (5) indoors = 1 // 0 = cannot be cast indoors; 1 = can cast indoors (other values not accepted) silence = 0 // 0 = cannot cast when silenced; 1 = can cast when silenced (other values not accepted) cleric_druid_only = 2 //0 = no restrictions; 1 = cleric/Pal exclusive (priest spells); 2 = druid/Ran exclusive (priest spells); 3 = prohibit all STR_VAR sphere_text = "FOOEY" END //
adding "C" icon to the above spell
LAF RES_NUM_OF_SPELL_NAME STR_VAR spell_name = ~TEST~ RET spell_res END COPY ~-path/bam.bam~ ~override/%spell_res%C.bam~ COPY_EXISTING ~%spell_res%.spl~ ~override~ LPF ALTER_SPELL_TYPE INT_VAR STR_VAR c_icon = "ADD" END //
This one is a lot smaller. It just adds additional prohibitions (i.e. school or alignment) to a given spell:
SpoilerDEFINE_PATCH_FUNCTION SECOND_OPP INT_VAR generalist = "-1" //1 = Prohibit Generalist (too)(NO OTHER VALUES ACCEPTED) TEST abjuration = "-1" //1 = Prohibit Abjuration (too)(NO OTHER VALUES ACCEPTED) TEST conjuration = "-1" //1 = Prohibit Conjuration (too)(NO OTHER VALUES ACCEPTED) TEST divination = "-1" //1 = Prohibit Divination (too)(NO OTHER VALUES ACCEPTED) TEST enchantment = "-1" //1 = Prohibit Enchantment (too)(NO OTHER VALUES ACCEPTED) TEST illusionist = "-1" //1 = Prohibit Illusion (too)(NO OTHER VALUES ACCEPTED) TEST invocation = "-1" //1 = Prohibit Invocation (too)(NO OTHER VALUES ACCEPTED) TEST necromancy = "-1" //1 = Prohibit Necromancy (too)(NO OTHER VALUES ACCEPTED) TEST alteration = "-1" //1 = Prohibit Transmutation (too)(NO OTHER VALUES ACCEPTED) TEST chaos = "-1" //1 = Prohibit Chaotic priests (too)(NO OTHER VALUES ACCEPTED) TEST evil = "-1" //1 = Prohibit Evil priests (too)(NO OTHER VALUES ACCEPTED) TEST good = "-1" //1 = Prohibit Good priests (too)(NO OTHER VALUES ACCEPTED) TEST geneutral = "-1" //1 = Prohibit moral neutral priests (too)(NO OTHER VALUES ACCEPTED) TEST law = "-1" //1 = Prohibit Lawful priests (too)(NO OTHER VALUES ACCEPTED) TEST lcneutral = "-1" //1 = Prohibit Morally neutral priests (too)(NO OTHER VALUES ACCEPTED) TEST STR_VAR BEGIN //Additional restricted schools if specified PATCH_IF (generalist = 1) BEGIN //Adds Generalist restriction to spell READ_BYTE 0x001f general //reads the byte WRITE_BYTE 0x001f (general BOR 0b01000000) // END PATCH_IF (abjuration = 1) BEGIN //Adds abjuration restriction to spell READ_BYTE 0x001e abj //reads the byte WRITE_BYTE 0x001e (abj BOR 0b01000000) // END PATCH_IF (conjuration = 1) BEGIN //Adds conjuration restriction to spell READ_BYTE 0x001e conj //reads the byte WRITE_BYTE 0x001e (conj BOR 0b10000000) // END PATCH_IF (divination = 1) BEGIN //Adds divination restriction to spell READ_BYTE 0x001f div //reads the byte WRITE_BYTE 0x001f (div BOR 0b00000001) // END PATCH_IF (enchantment = 1) BEGIN //Adds enchantment restriction to spell READ_BYTE 0x001f enc //reads the byte WRITE_BYTE 0x001f (enc BOR 0b00000010) // END PATCH_IF (illusionist = 1) BEGIN //Adds illusionist restriction to spell READ_BYTE 0x001f enc //reads the byte WRITE_BYTE 0x001f (enc BOR 0b00000100) // END PATCH_IF (invocation = 1) BEGIN //Adds invocation restriction to spell READ_BYTE 0x001f inv //reads the byte WRITE_BYTE 0x001f (inv BOR 0b00001000) // END PATCH_IF (necromancy = 1) BEGIN //Adds necromancy restriction to spell READ_BYTE 0x001f nec //reads the byte WRITE_BYTE 0x001f (nec BOR 0b00010000) // END PATCH_IF (alteration = 1) BEGIN //Adds alteration restriction to spell READ_BYTE 0x001f alt //reads the byte WRITE_BYTE 0x001f (alt BOR 0b00100000) // END PATCH_IF (chaos = 1) BEGIN //Adds chaos restriction to spell READ_BYTE 0x001e cha //reads the byte WRITE_BYTE 0x001e (cha BOR 0b00000001) // END PATCH_IF (evil = 1) BEGIN //Adds evil restriction to spell READ_BYTE 0x001e evi //reads the byte WRITE_BYTE 0x001e (evi BOR 0b00000010) // END PATCH_IF (good = 1) BEGIN //Adds good restriction to spell READ_BYTE 0x001e god //reads the byte WRITE_BYTE 0x001e (god BOR 0b00000100) // END PATCH_IF (geneutral = 1) BEGIN //Adds neutral moral restriction to spell READ_BYTE 0x001e nmor //reads the byte WRITE_BYTE 0x001e (nmor BOR 0b00001000) // END PATCH_IF (law = 1) BEGIN //Adds law restriction to spell READ_BYTE 0x001e lw //reads the byte WRITE_BYTE 0x001e (lw BOR 0b00010000) // END PATCH_IF (lcneutral = 1) BEGIN //Adds neutral ethical restriction to spell READ_BYTE 0x001e neth //reads the byte WRITE_BYTE 0x001e (neth BOR 0b00100000) // END END
-
-
Something like this should be done for splstates in the ees
-
Heh, I was actually thinking of Aristotle and his discussion of fatalism and naval battles. And Jarno is, I think, teasing out the difference between what we might call ' metaphysical' vs ' epistemic' possibility, which I think is relevant to the Aristotle conversation (lol, which I won't get into because, among other things, I feel like like this conversation is detailing this thread. At the same time, it felt rude to say nothing...I'm definitely not going to get into a 'my favorite philosopher is better than your favorite philosopher' discussion except to say that Kant rules; the ancients drool. )
More on topic: @CamDawg will this ordering issue and/or auto pause issue be fixed eventually? Is it fixable?
-
9 hours ago, DavidW said:
Though in any case there is absolutely no good reason to think that the chance of life in the universe is that low.
Yeah, I'm curious where these probabilities come from. Nobody has found a way to take measurements from other possible worlds, have they? There is a(t least one) probabilistic argument for the existence of God that relies on the improbability of life. The idea is that, given that the probability of life is so low, and given that there is, in fact, life, it is more likely than not that some supernatural Being intervened to create life--and thus, it is more likely than not that such a Being exists
Edit: of course, as Kant pointed out, such an argument, even if it is successful, doesn't actually get us to God. Maybe this being is just an alien Horror best described by Lovecraft. The only way to get to God is by some kind of ontological argument, and, well, that route is not promising...
-
On 2/14/2019 at 10:12 AM, Jarno Mikkola said:
Nope.
1 is still one, even if you F it with a *10^x
I think it's fairly clear that InKal was not saying that the probability that p, given p, is something other than 1:1. If I were to flip a coin, get heads, and ask: 'what are the chances of that result?', the most appropriate answer would be '~50%'.
Sure, you can point to the result and say, 'no, it's 100%' and, in a sense, you wouldn't be wrong. But, what has happened is that the question has been modified and that modified question has been answered.
-
Omg, dude. Just... Awesome!
Any chance of getting something like this for kit descriptions?
*Puppy dog eyes*
creating a modified "Identify" spell
in Modding Q&A
Posted · Edited by Grammarsalad
Still playing with the modified identify spell.
I was able to access Imoen's (and then Minsc's) inventory. When I tried casting on Jaheria, who had not yet joined my party, it showed Imoen's inventory instead. Non-allies should be protected from the spell. Anyway, very cool!
Also, I see how to restrict it to certain inventory slots. As such, you could give warriors an ability to identify a weapon (and/or armor/helmets) if they can swing it around it for a bit (i.e. if they hold it in one of their weapon slots). This, of course, makes them vulnerable to cursed items, but still, pretty cool and useful. I'm going to totally add this to a kit/class revision I'm working on. They're even going to do a little attack animation when the ability is activated. Good fun!
Edit: just comment out or delete all slots that you don't want them to access, e.g.:
-- button {area 26 347 52 52 bam "STONSLOT" slotinfo "characters[id].equipment.personal0" action "B3Identify_IdentifySlot(characters[id].equipment.personal0)"}
Basically, the only thing I know about lua is that "--" comments out a line
I see how to create my own M_* file.
Just replace all instances of "M_B3IDEN" with the alternate name.
lol, brain getting tired