Arcane Thesis
I've seen some old posts about this feat, but looking at the d20 feat it really does nothing as far as game mechanics (just fills in the text). This is fine if I'm not memorizing any metamagic feats with the spell in question but otherwise it is useless.
As a reminder here is Arcane Thesis: Prerequisite: Knowledge (arcana) 9 ranks; ability to cast arcane spells. Benefits: Choose one arcane spell that you can cast to be your thesis spell. When casting that spell, you do so at +2 caster level. When you apply any metamagic feats other than Heighten Spell to that spell, the enhanced spell uses up a spell slot one level lower than normal. Thus if you were to prepare an empowered maximized magic missile (assuming magic missile is the spell you choose for your Arcane Thesis), it would be prepared as a 4th level spell (+1 level for empowered, down from +2; and +2 levels for maximized, down from +3). A spell cannot be reduced to below its original level with the use of this feat. Special: Can be taken more than once, but you apply it to a new spell. I'm not really sure where to start with this mostly because I'm not super savvy with a lot of PrC abilities that may mimic this feat. If anyone has done the Easy Metamagic feat then that would give me a head start. |
Putting in a chooser is pretty straight forward. You'll need to use the Custom Expression field to do it. I'll take a look at it tomorrow if you need help putting it together. The +2 to caster level will have to be text-only, but you could make it show in specials so its more obvious to the user. The last one doesn't sound like it would be hard, but I've never really done anything with the metamagic feats. I'll take a look at this too, but I imagine there's a field that can be altered for the chosen spell.
|
For the custom expression, the simplest thing to do is to choose "Picks on Hero" in the Restrict To... dropdown then put 'component.BaseSpell'. This won't differentiate between arcane and divine spells if your character has classes in both, but depending on your situation, that may not matter. This will choose any spell your characters can cast.
|
To reduce the sLevel, this code does work, but I haven't been able to figure out the timing needed for use with a metamagic feat:
Code:
field[fChosen].chosen.field[sLevel].value -= 1 If you need more help, let me know. FYI, timing for most spells to set their sLevel is First 10000, so this would have to be after that. It may have to be later for metamagic spells (possibly even Final Phase). |
Okay, so metamagic feats on spells are a damn mess. I first chucked in a script that did a foreach through my custom spells. The idea was to find the ones whose base spell is the right one and then to check what metamagic feat is applied, then I was going to go through each metamagic feat and apply a -1 to sLevel if it wasn't heighten... the problem is that I find it unclear how the metamagic feat is stored. I will provide a detailed dump in a second.
|
Okay so here is the full deal. Eval Script 1 is bad, but works for me for now. In Eval Script 2 what I'm trying to do is to go to the gizmo for each CustomSpl and then check for specific pick id's... but that part is broken. Shown is my script just testing how to get to the gizmo (just checking to see if Heighten Spell is on it, and yeah, it ain't working.
Main Screen Stuff - Feat Category: General Restrict To...: Picks on Hero Custom Expression: component.BaseSpell <Checked> Show in Specials List? Eval Script 1 - Final Phase: 1000 ~Script to alter the text shown on the fly for the spell chosen ~Not all that good, probably only works when Arcane is highest total ~caster level var CL as number CL = 2 + herofield[tMaxCaster].value if (field[fChosen].ischosen <> 0) then field[livename].text = "Arcane Thesis: " & field[fChosen].chosen.field[name].text & " CL +" & CL endif Eval Script 2 - Final Phase: 1000 ~Go through each Custom Spell in my BaseSpells var test as number foreach pick in Hero from BaseSpell where "NeedHelper.CustomSpl" test=eachpick.gizmo.childfound[mmHeighten] nexteach |
Got it. It mostly works but there are two things: I keep getting "Attempt to access non-existent containing entity from script" error AND in the metamagic window shows the wrong Total Spell Level. Incidentally, this is going to form the start of my Easy Metamagic feats!
This is Eval Script 2- (timing is pretty arbitrarily chosen) Pre-levels: 5000 ~Set up vaiables var id as string var nlvl as number var spell as string var normLvl as number var LvlRed as number var strcom as string var result as number ~Exit if nothing chosen doneif (field[fChosen].ischosen = 0) ~Set some things id = field[fChosen].chosen.idstring ~the spell we're looking for, because it was chosen spell = "thingid." & id ~the minimum level of the spell normLvl=field[fChosen].chosen.field[sLevel].value ~we do not count Heighten in the entire calculation strcom="Height" ~look through each spell memorized that matches chosen foreach pick in hero where spell LvlRed=0 ~Goto the gizmos and look at the metamagics on them foreach pick in eachpick.gizmo from BaseMetamg ~If it is not heighten (compare works like a child made it) if (compare(eachpick.field[mmAbbr].text,strcom) <>0) then ~Increase potential level reduction by 1 LvlRed += 1 endif nexteach ~Once all metamagics have been looked at the new level is either the ~base level or newly adjusted level nlvl=maximum(normLvl,eachpick.field[sLevel].value-LvlRed) ~Delete the tag (Important because the metamagic spell shows the ~field value while the tag is what the spell list uses). result=eachpick.delete[sLevel.?] ~Set the field. eachpick.field[sLevel].value=nlvl ~Set the correct tag if (eachpick.field[sLevel].value = 0) then result = eachpick.assign[sLevel.0] elseif (eachpick.field[sLevel].value = 1) then result = eachpick.assign[sLevel.1] elseif (eachpick.field[sLevel].value = 2) then result = eachpick.assign[sLevel.2] elseif (eachpick.field[sLevel].value = 3) then result = eachpick.assign[sLevel.3] elseif (eachpick.field[sLevel].value = 4) then result = eachpick.assign[sLevel.4] elseif (eachpick.field[sLevel].value = 5) then result = eachpick.assign[sLevel.5] elseif (eachpick.field[sLevel].value = 6) then result = eachpick.assign[sLevel.6] elseif (eachpick.field[sLevel].value = 7) then result = eachpick.assign[sLevel.7] elseif (eachpick.field[sLevel].value = 8) then result = eachpick.assign[sLevel.8] else result = eachpick.assign[sLevel.9] endif nexteach |
Yeah so... Easy Metamagic is not really so easy off of this. The selector is fCategory.Metamagic but then there is no real slick way that I can find to connect any fields associated with the selected feat and any metamagic picks in the custom spell's gizmo. Any ideas?
|
I did a quick search for that error message, and fortunately found another thread that covers it. I have updated the code to reflect the necessary change (change in bold)
Code:
~Set up variables Incidentally, I tested this out on a CLR 2 WIZ 1. When I added the above doneif line, the cleric spells disappeared from the dropdown menu. This seems like a positive thing, but may be something to keep an eye on in case you use something other than a wizard. |
Quote:
|
Sendric, Thank you so much!
Well there is a straightforward way that is very prone to breaking should any of the tags change. The chosen pick will have the correct feat tag, e.g., fChainSpl, field. One can then code another huge if-statement block that goes through and if the chosen matches a particular one then set a string for the metamagic item. Pseudo code example: var str1 as string var str2 as string str1=field[fChosen].chosen.idstring if (str1="fHeightenSpl") then str2="mmHeighten" elseif (str1="fQuickenSpl") then str2="mmQuicken" elseif... ... endif Problem is (1) this feat will not function for a new metamagic feat unless it is added and (2) it will be a HUGE script. Quote:
|
Right. Here's another option. Use this feat to assign a tag to the spell. Then in the editor, go to each metamagic item and write a script to reduce the level adjustment by 1 if the tag exists. It would be a little tedious, but it should do the trick.
That's something I would be willing to add for the next community set (as well as the change to Arcane Thesis). |
I just did something similar, can you tell I'm avoiding work? I added a User.metaitem tag to mmQuicken. Then the pull down menu can be User.metaitem instead of the feats.
Each way is a pain in the butt... What if one were to standardize that each metamagic feat was named like fQuicken and each metamagic gizmo thingy was named mmQuicken. could you strip off the f in hero lab? Something like str="fQuicken" str=str(1-end) ~starting index at 0 str="mm"&str |
Quote:
|
Quote:
Yes, you could do that, but I'm not sure how that's necessarily easier/better than what I suggested. |
Quote:
|
Quote:
|
1 Attachment(s)
Ok, here's an idea. I'm attaching a file for you that includes the Easy Metamagic feat and a new version of the Quicken Spell metamagic item. I threw in a test to see if you could read the mmLevel value (which you can). You should be able to use this as a starting point. I think it will be easier, though of course we'd still have to modify all of the metamagic items. That's something I can do, though. Let me know what you think.
|
Sendric, I like this. I'll implement this on my side in my custom feats file. Look forward to seeing it in distro and I'll let you know if I hit a speed bump.
|
Quote:
|
doneif (isgizmo <> 0)
this actually breaks the entire script. It always seems to make it fail. EDIT: changed the spell string that we're using for the top foreach loop to spell = "thingid." & id&" & Helper.CustomItem" |
Easy Metamagic eval
So popping in the tag on the Metamagic feat and testing it out worked. As usual I put my timing in Final with a huge number.
First - Grab the metamagic feat chosen Second - Grab customized spells Third - Grab customized spell's level Fourth - Grab the original spell's level Fifth- Is our metamagic feat there? ->increment level reduction sixth - overhead. var Lvl as number var LvlRed as number var MMg as string var nlvl as number var BLvl as number doneif (field[fChosen].ischosen = 0) MMg = field[fChosen].chosen.field[mmAbbr].text foreach pick in hero where "NeedHelper.CustomSpl" ~Grab current level of the customized spell Lvl = eachpick.field[sLevel].value LvlRed=0 ~Need the level of the base spell; I anticipate that this foreach ~will only find one thing. foreach pick in eachpick.gizmo from BaseSpell BLvl=eachpick.field[sLevel].value nexteach ~Look for the metamagic chosen within the gizmos foreach pick in eachpick.gizmo from BaseMetamg if (compare(eachpick.field[mmAbbr].text,MMg) = 0) then LvlRed += 1 endif nexteach nlvl=maximum(Lvl-LvlRed,BLvl) perform eachpick.delete[sLevel.?] ~Set the field. eachpick.field[sLevel].value=nlvl ~Set the correct tag if (eachpick.field[sLevel].value = 0) then perform eachpick.assign[sLevel.0] elseif (eachpick.field[sLevel].value = 1) then perform eachpick.assign[sLevel.1] elseif (eachpick.field[sLevel].value = 2) then perform eachpick.assign[sLevel.2] elseif (eachpick.field[sLevel].value = 3) then perform eachpick.assign[sLevel.3] elseif (eachpick.field[sLevel].value = 4) then perform eachpick.assign[sLevel.4] elseif (eachpick.field[sLevel].value = 5) then perform eachpick.assign[sLevel.5] elseif (eachpick.field[sLevel].value = 6) then perform eachpick.assign[sLevel.6] elseif (eachpick.field[sLevel].value = 7) then perform eachpick.assign[sLevel.7] elseif (eachpick.field[sLevel].value = 8) then perform eachpick.assign[sLevel.8] else perform eachpick.assign[sLevel.9] endif nexteach |
Quote:
And thanks for the Easy Metamagic script. Looks good. |
The timing has to be adjusted to get all the levels to change correctly:
Pre-levels 5000 works Oh and the custom metamagic items are throwing: Live state of gizmo 'CustSpell' is being tested before live state of parent pick 'sCustomSpl' is resolved |
Quote:
|
I did:
Final Phase 30000 if (hero.pickexists[fRepeatSpl] <>0) then perform assign[User.EasyMM] endif and added the User Tags via the gui button and made sure to replace the stock metamagic item... it is working for me, except for the error. |
Quote:
Note: I am seeing the error now. Update: Reload the code (ctrl-r) and the error goes away. |
Hey Sendric, we just kicked those feats' ass.
|
Quote:
|
You guys just might have solved my years-old quandary about how to code the Forgotten Realms PrC Incantatrix' capstone power, which I had tried to script years ago but was told then that it probably couldn't be done without shenanigans such as rescripting the entire metamagic feats.
Kudos for that! Please try to craft your system so that said PrC could use it as well. Thanks. *the power in question reduces the cost of all metamagic used by the character by 1 level, without bringing it lower than 1 |
Quote:
|
1 Attachment(s)
Quote:
|
Quote:
|
1 Attachment(s)
Okay so a few things.
Arcane Thesis: I saw something really weird when I was testing this with the finished Incantatrix. It was allowing metamagic feats that do not adjust level to incur a -1 to the level, but only when they were not the only metamagic feat on the spell. I think this is not okay. In no way should it be easier. So I adjusted the code slightly to check to make sure the mmLevel>=1 before incrementing the potential level reduction (LvlRed). Example: You put City Spell and Maximize on a Ray of Frost and you have the Arcane Thesis: Ray of Frost feat. Normally Maximize gives a +3 level adjustment (LA) and City Spell gives a +0 LA incurring a total of +3 LA. But with arcane thesis each takes a -1 bonus so now the LA is +1. Compare this to when you just Maximize the spell as incur a +2 LA. See? That is stupid. Arcane Thesis also currently has an annoying functionality where all versions of spells in your spellbook and memorized are available for selection. Anyone know how to restrict this to just spellbook or known? Incantatrix: Holy crap what a bear. (1) Changed all the Focus Studies Custom Abilities to have Pick-reqs instead of Pre-reqs. This will prevent the selected school to go red once chosen (this happens because it is NOW on the forbidden list and is no longer eligable to be selected. Thus selecting it made it unselectable.). This way makes it less clear why a school is unselectable in the Add More Focused Studies window (now it only reads Precluded by XXX), but I think it is cleaner. (2) Deleted the Improved Metamagic feat and Improved Metamagic metamagic. (3) Added Arcane Thesis (fArcaneThe) and Easy Metamagic (fEasyMetaM). (4) Added mmQuicken2. This should serve as a template on how to get metamagic picks to agree with how we did Easy Metamagic. I believe Sendric will be supplying a full replacement of these in the future, or you can do them yourself. I just set them to Replace Thing Id the previous mmXXX and add the User Tag EasyMM. (5) Improved Metamagic now has a huge script which I provide here for people to make fun of, and the code in the Class Special is uncommented: Prelevels 5000 ~Set up Variables var LvlRed as number var OLvl as number var spell as string var ArcThe as number var spellid as string var MMg as string var MMg2 as string var EasyMM as number ~Go through each Spell with custom crap on it foreach pick in Hero from BaseSpell where "NeedHelper.CustomSpl" ~Level Reduction is 0 so far LvlRed=0 ~Unknown if this spell has Arcane Thesis associated with it ArcThe=0 ~Grab the old level OLvl=eachpick.field[sLevel].value ~Check for Arcane Thesis!! ~If you have the feat... if (#hasfeat[fArcaneThe] <> 0) then ~Grab the original spell name foreach pick in eachpick.gizmo from BaseSpell spell=eachpick.idstring nexteach ~Look through the Arcane Thesis Feats foreach pick in Hero from BaseFeat where "HasFeat.fArcaneThe" spellid=eachpick.field[fChosen].chosen.idstring ~If the current spell is the same as one we have Arcane Thesis for then set ArcThe to 1. if (compare(spellid,spell)=0) then ArcThe=1 endif nexteach endif ~Now go through all the metamagic feats applied to current spell foreach pick in eachpick.gizmo from BaseMetamg ~unsure if this metamagic feat is associated with the Easy Metamagic feat EasyMM=0 ~Grab the abbreviation of the current Metamagic on the spell MMg=eachpick.field[mmAbbr].text ~Look through each Easy Metamagic feat foreach pick in hero from BaseFeat where "HasFeat.fEasyMetaM" MMg2=eachpick.field[fChosen].chosen.field[mmAbbr].text ~if this matches the current metamagic ON the current spell set EasyMM=1 if (compare(MMg,MMg2)=0) then EasyMM=1 endif nexteach ~Now this is awesome... ~If the current spell is not arcane thesisized and if the current metamagic is not easy then so long as it incurs a +2 LA we subtract 1. ~If it is not thesisized and is easy then Easy Metamagic will already be taking 1 off so we need an LA of atleast 3 to bother ~If it is thesisized but not easy then Arcane Thesis will already be taking 1 off so we need an LA of atleast 3 to bother ~If it is thesisized and easy then they both will be taking 1 off so we need an LA of atleast 4 to bother if (ArcThe=0) then if (EasyMM=0) then if (eachpick.field[mmLevel].value>=2) then LvlRed +=1 endif else if (eachpick.field[mmLevel].value>=3) then LvlRed +=1 endif endif else if (EasyMM=0) then if (eachpick.field[mmLevel].value>=3) then LvlRed +=1 endif else if (eachpick.field[mmLevel].value>=4) then LvlRed +=1 endif endif endif nexteach ~Delete all sLevel tags perform eachpick.delete[sLevel.?] ~Take off all level reductions due to metamagics and put into field eachpick.field[sLevel].value=OLvl-LvlRed ~Assign the correct tag if (eachpick.field[sLevel].value = 0) then perform eachpick.assign[sLevel.0] elseif (eachpick.field[sLevel].value = 1) then perform eachpick.assign[sLevel.1] elseif (eachpick.field[sLevel].value = 2) then perform eachpick.assign[sLevel.2] elseif (eachpick.field[sLevel].value = 3) then perform eachpick.assign[sLevel.3] elseif (eachpick.field[sLevel].value = 4) then perform eachpick.assign[sLevel.4] elseif (eachpick.field[sLevel].value = 5) then perform eachpick.assign[sLevel.5] elseif (eachpick.field[sLevel].value = 6) then perform eachpick.assign[sLevel.6] elseif (eachpick.field[sLevel].value = 7) then perform eachpick.assign[sLevel.7] elseif (eachpick.field[sLevel].value = 8) then perform eachpick.assign[sLevel.8] else perform eachpick.assign[sLevel.9] endif nexteach |
Thanks a million times! Considering this was the first project I tried when I got HeroLab, I guess I now see it was way more than I could chew then... And even now.
|
Lord Magus,
Is this or anything else you have something you would be willing to share with the community? There's someone working on some Forgotten Realms stuff, but its largely not been covered in the community set. I would like to change that if possible. |
Doh! there is a mistake in all this that I hadn't noticed. Easy Metamagic cannot reduce a modified spell to less than one level higher than normal... so each metamagic has to add at least 1.
|
Quote:
|
Quote:
|
Quote:
|
All times are GMT -8. The time now is 07:48 AM. |
Powered by vBulletin® - Copyright ©2000 - 2024, vBulletin Solutions, Inc.
wolflair.com copyright ©1998-2016 Lone Wolf Development, Inc. View our Privacy Policy here.