DN's D&D4e Character Sheet Framework

Framework(s) for D&D 4e, including Veggiesama's.

Moderators: dorpond, trevor, Azhrei, giliath, Gamerdude, jay, Mr.Ice

User avatar
Dielzen
Cave Troll
Posts: 85
Joined: Mon Nov 29, 2010 3:50 am
Location: Waterdeep
Contact:

Re: DN's D&D4e Character Sheet Framework

Post by Dielzen »

Sorry if this is mentioned somewhere, but I didn't see it in the FAQ -- how do I designate Oath of Enmity double rolls with DN?

Right now I'm faking it with making each attack a multi-target attack, but that does add a lot of extra clicks to the setup.

User avatar
Zalarian
Cave Troll
Posts: 90
Joined: Fri Aug 08, 2008 11:19 pm
Location: South Florida, USA

Re: DN's D&D4e Character Sheet Framework

Post by Zalarian »

Dielzen wrote:Sorry if this is mentioned somewhere, but I didn't see it in the FAQ -- how do I designate Oath of Enmity double rolls with DN?

Right now I'm faking it with making each attack a multi-target attack, but that does add a lot of extra clicks to the setup.
That is how I do it. That seems to me the best way of doing it. Other options is configuring it for 2 separate attacks. As far as set up, it usually doesn't impact too much since most powers are cut and paste from other attack powers.
Hybrid File
LFR Roster
LFR Roster:
P2 Zerin Stargazer / P2 Crymisil Silvershroud / E1 Llendil R'uthgalad Nelath
P3 Maddox "Mongoose" / P2 Vargaz / H3 Soulherder Vanya Mythseeker
E1 Kyla Marillion / H2 Ender/ P1 Locknar the Red of the Blue Order/ P3 Corinth Enilef
H3 Korben Airspur / H1 Alif Fluidsmith / H3 Navarre
Skype ID:Zalarian
I have no issues playing low

User avatar
Merkuri
Giant
Posts: 194
Joined: Sat Feb 28, 2009 3:20 pm
Location: Massachusetts, USA

Re: DN's D&D4e Character Sheet Framework

Post by Merkuri »

I make the same attack twice. We just know to use the damage roll from the first attack.
Adventure is not outside; it is within.
--Found in a fortune cookie on game night

MapTool Framework for Sufficiently Advanced

DamJ.NeT
Kobold
Posts: 1
Joined: Wed Mar 02, 2011 10:57 am

Re: DN's D&D4e Character Sheet Framework

Post by DamJ.NeT »

Sorry, I've found what i was asking for, I was blind...

Thx for the framework anyway !
Last edited by DamJ.NeT on Wed Mar 02, 2011 6:36 pm, edited 1 time in total.

User avatar
Dielzen
Cave Troll
Posts: 85
Joined: Mon Nov 29, 2010 3:50 am
Location: Waterdeep
Contact:

Re: DN's D&D4e Character Sheet Framework

Post by Dielzen »

Is there a variable that handles the loop counter for multi-attacks that we can call in our macros?

The reason I ask is that Thri-Kreen claws racial power adds on the number of targets, so it's 1 with 1 target, 2 with 2 targets, etc.

it'd be nice if I could make the power be 1d8+Strength+ =(Loop_Counter) for damage

User avatar
crowofpyke
Cave Troll
Posts: 30
Joined: Wed Feb 11, 2009 11:37 pm

Re: DN's D&D4e Character Sheet Framework

Post by crowofpyke »

Dielzen wrote:Sorry if this is mentioned somewhere, but I didn't see it in the FAQ -- how do I designate Oath of Enmity double rolls with DN?

Right now I'm faking it with making each attack a multi-target attack, but that does add a lot of extra clicks to the setup.
This is actually pretty simple IMHO.

On the first page where you are setting up the basics of the attack there is a field where you can enter the number of attacks. Enter '2' there. On the next screen where you tell it what hand item to use, what ability, set the damage, etc, set things up as you normally would for the FIRST attack. On the SECOND attack set your Attack line as normal, and then on the Damage line there is a drop-down menu that you can change to "No Damage". Save out the attack power.

When you invoke the power later you still only have to select the target once and not select it for the 2nd attack. It rolls two attack rolls and one damage roll. Voila! C'est fini!

User avatar
crowofpyke
Cave Troll
Posts: 30
Joined: Wed Feb 11, 2009 11:37 pm

Re: DN's D&D4e Character Sheet Framework

Post by crowofpyke »

I actually have a question of my own:

I know you can bring up the Character Sheet window with either the F2 key or the campaign window macro link. I seem to have "disappeared" the active CS window somehow.... Is there any way I can reset it and get it back? No, it is not pinned to another window, or pinned to the side of the main frame....

EDIT: Nevermind. I remembered the 'Restore Layout' command on the "Window" menu of RPTools. All fixed now.

horticulture
Kobold
Posts: 1
Joined: Tue Mar 15, 2011 11:06 pm

Re: DN's D&D4e Character Sheet Framework

Post by horticulture »

Darakonis wrote:Possible bug...

The Surprised condition icon (Yellow Exclamation mark) is not visible to my players, regardless of which token it's on. I can see it as host and GM, but my players cannot.

Peace,
-Darakonis
I think I may have figured out the cause for this. Go to Edit > Campaign Properties > select the States tab. In the "Show to:" box you'll see that all three are checked (GM, Owner, Everybody Else), however when you select the Yellow Surprised condition icon only the GM is checked. Check the other two and it should fix your issue.

Ta da?

User avatar
PinkRose
Dragon
Posts: 732
Joined: Sat Nov 15, 2008 2:28 pm
Location: The City of Roses, Oregon

Re: DN's D&D4e Character Sheet Framework

Post by PinkRose »

horticulture, well done.
I wonder though if that was intended, now that we know what the problem was.

For those regular posters, sorry, somehow I got unsubscribed from this thread so had no idea there were new replies.

And just as a reminder for anyone code-minded, if there is no attack roll, damage type doesn't show up. Just the damage amount.
I would love to see that fixed.
I am a special snowflake!

mystara
Kobold
Posts: 13
Joined: Sun Oct 03, 2010 5:43 am

Re: DN's D&D4e Character Sheet Framework

Post by mystara »

In the dice expressions, is there any way to specify that certain dice rolls should be increased to a certain number?

Eg: "Roll 1d12 and treat all rolls of 1, 2 or 3 as being 4"

Note that it's not the same as 1d12r3

dustyX
Kobold
Posts: 7
Joined: Fri Sep 03, 2010 9:27 pm

Re: DN's D&D4e Character Sheet Framework

Post by dustyX »

Fix to make damage type show up with no attack roll
Replace this code with the code currently in PowerUseAttacks on Lib:Execute.

Code: Select all

<!-- PowerUseAttack-->
[H: DNT_DiceString = " + %s(%s)"]
[H: DNT_ModString = "%s(%s)"]
[H, forEach(DNT_Variable, "Slot, HideRoll, AttackSlot, AttackCount"): set("DNT_" + DNT_Variable, json.get(macro.args, DNT_Variable))]
[H: DNT_AbilityScores = DNA_AbilityScores]

<!-- reads out power variables and stores them in DNT_EntryVARIABLE -->
[H: DNT_Entry = getProperty("DNA_Power" + DNT_Slot)]
[H, forEach(DNT_Variable, "AttackType, AttackWeapon, AttackAbility, AttackBonus, NoImplement, AttackVS, CriticalRange, DamageSpecial, DamageDice, DamageAbility, DamageBonus, DamageType, CriticalDamage, Hit, Miss"): set("DNT_Entry" + DNT_Variable, json.get(DNT_Entry, DNT_Variable + DNT_AttackSlot))]

[H, switch(DNT_EntryAttackType):
	case 1: DNT_TotalAttacks = 1;
	case "Multi": DNT_TotalAttacks = if(json.get(macro.args, "NumberOfAttacks" + DNT_AttackSlot) == "", 1, json.get(macro.args, "NumberOfAttacks" + DNT_AttackSlot));
	default: DNT_TotalAttacks = 0
]

<!-- Sets the equipped weapon and if empty (Due to either being a 0 slot item or a deleted item error) creates a virtual json object -->
[H: DNT_WeaponSlot = json.get(DNA_Equipped, DNT_EntryAttackWeapon) + 0]
[H: DNT_WeaponEntry = if(json.isEmpty(getProperty("DNA_Item" + DNT_WeaponSlot)) == 1, json.set("", "Name", "Nothing"), getProperty("DNA_Item" + DNT_WeaponSlot))]

<!-- reads out weapon variables and stores them in DNT_WeaponEntryVARIABLE-->
[H, forEach(DNT_Variable, "EnhancementAttack, EnhancementDamage, BaseProficiency, UserProficiency, CriticalRange, DamageDice, BaseDamage, UserDamage, CriticalDamage"): set("DNT_Weapon" + DNT_Variable, json.get(DNT_WeaponEntry, DNT_Variable))]

<!-- Determines power attack and damage bonus has to use the macro roll option of the regex because the eval does not work with the function version. unknown why. it then creates a evaled and a nonevaled version for display purposes-->
[H, if(DNT_EntryAttackAbility == ""): DNT_AttackAbility = 0; DNT_AttackAbility = json.get(json.get(DNT_AbilityScores, DNT_EntryAttackAbility), 2) + DNA_LevelBonus]
[H, macro("Replace@Lib:Sheet"): DNT_EntryAttackBonus]
[H: DNT_AttackBonus = macro.return]
[H, if(DNT_AttackBonus == ""): DNT_AttackBonus = 0]
[H, if(isNumber(DNT_AttackBonus) == 1), CODE:
	{
		[H: DNT_AttackBonusValue = DNT_AttackBonus]
	};{
		[H: DNT_AttackBonusValue = eval(DNT_AttackBonus)]
		[H: DNT_AttackBonus = strformat(DNT_DiceString, DNT_AttackBonus, DNT_AttackBonusValue)]
	}
]

[H, if(DNT_EntryDamageAbility == ""): DNT_DamageAbility = 0; DNT_DamageAbility = json.get(json.get(DNT_AbilityScores, DNT_EntryDamageAbility), 2)]
[H, macro("Replace@Lib:Sheet"): DNT_EntryDamageBonus]
[H: DNT_DamageBonus = macro.return]
[H, if(DNT_DamageBonus == ""): DNT_DamageBonus = 0]
[H, if(isNumber(DNT_DamageBonus) == 1), CODE:
	{
		[H: DNT_DamageBonusValue = DNT_DamageBonus]
	};{
		[H: DNT_DamageBonusValue = eval(DNT_DamageBonus)]
		[H: DNT_DamageBonus = strformat(DNT_DiceString, DNT_DamageBonus, DNT_DamageBonusValue)]
	}
]

[H: DNT_PowerAttack = DNT_AttackAbility + DNT_AttackBonusValue]
[H: PowerAttack = DNT_AttackAbility + DNT_AttackBonus]
[H: DNT_PowerDamage = DNT_DamageAbility + DNT_DamageBonusValue]
[H: PowerDamage = DNT_DamageAbility + DNT_DamageBonus]

<!-- determines the weapon attack and damage bonuses. if the power is implement keyword  and the power isn't flagged as noimplement it clears the base proficiency and damage to allow for weapon based implements to not add the weapon portion to the attack. if the power is keyword implement and the weapon is not an implement and the power isn't flagged as noimplement it resets the whole weapon value-->
[H, if(json.contains(DNT_Entry, "KeywordImplement") == 1 && DNT_EntryNoImplement != 1), CODE:
	{
		[DNT_WeaponBaseProficiency = 0]
		[DNT_WeaponBaseDamage = 0]
		[DNT_WeaponDamageDice = "0d0"]
	}
]	
[H: WeaponAttack = number(0 + DNT_WeaponEnhancementAttack) + number(0 + DNT_WeaponBaseProficiency) + number(0 + DNT_WeaponUserProficiency)]
[H: WeaponDamage = number(0 + DNT_WeaponEnhancementDamage) + number(0 + DNT_WeaponBaseDamage) + number(0 + DNT_WeaponUserDamage)]
[H, if(json.contains(DNT_Entry, "KeywordImplement") == 1 && json.contains(DNT_WeaponEntry, "WeaponGroupImplement") == 0 && DNT_EntryNoImplement != 1), CODE:
	{
		[WeaponAttack = 0]
		[WeaponDamage = 0]
	}
]

<!-- The damage dice -->
[H: DNT_RawDamageDice = PowerDice(DNT_WeaponDamageDice, DNT_EntryDamageDice)]

<!-- determines highest crit range between weapon and power -->
[H, if(DNT_EntryCriticalRange == ""): DNT_EntryCriticalRange = 20]
[H, if(DNT_WeaponCriticalRange == ""): DNT_WeaponCriticalRange = 20] 
[H: DNT_CriticalHit = min(DNT_EntryCriticalRange, DNT_WeaponCriticalRange)]

<!-- Determines crit damage -->
[H: DNT_MaxDamageRoll = listGet(stringToList(DNT_RawDamageDice, "d"), 0) * listGet(stringToList(stringToList(stringToList(stringToList(stringToList(DNT_RawDamageDice, "r"), "R"),"e"), "E"), "d"), 1)]
[H: PowerCritDamage = if(DNT_EntryCriticalDamage == "", 0, DNT_EntryCriticalDamage)]
[H: WeaponCritDamage = if(DNT_WeaponCriticalDamage == "", 0, DNT_WeaponCriticalDamage)]


[H: DNT_ScreenCheck = if(isGM() == 1 && getLibProperty("GMScreen", "Lib:Information") == 1, 1, 0)]

[R: if(DNT_AttackCount == 1 && DNT_ScreenCheck == 1, "<b>[Rolls behind the GM Screen]</b><br>", "")]

[R, for(DNT_AttackNumber, 1, DNT_TotalAttacks + 1, 1, ""), CODE:
	{
		<br>
		[H: Die = if(json.get(macro.args, "GMDieRoll" + DNT_AttackCount) == "", 1d20, json.get(macro.args, "GMDieRoll" + DNT_AttackCount))] 
	
		[H: DNT_StaticAtkMods = 0]
		[H, forEach(DNT_Mod, "Charge, Marked, CA, Long, Cover, Conceal"): DNT_StaticAtkMods = DNT_StaticAtkMods + json.get(macro.args, DNT_Mod + DNT_AttackCount)]
		[H: AttackMods = if(json.get(macro.args, "AtkMod" + DNT_AttackCount) == "", 0, json.get(macro.args, "AtkMod" + DNT_AttackCount))]
		[H, if(isNumber(AttackMods) == 1), CODE:
			{
				[H: AttackMods = AttackMods + DNT_StaticAtkMods]
				[H: DNT_AtkMods = AttackMods]
			};{
				[H: DNT_AtkMods = eval(AttackMods) + DNT_StaticAtkMods]
				[H: AttackMods = strformat(DNT_ModString, AttackMods + if(DNT_StaticAtkMods == 0, "", "+" + DNT_StaticAtkMods), DNT_AtkMods)]
			}
		]
				
		[H: DamageMods = if(json.get(macro.args, "DmgMod" + DNT_AttackCount) == "", 0, json.get(macro.args, "DmgMod" + DNT_AttackCount))]
		[H, if(isNumber(DamageMods) == 1), CODE:
			{
				[H: DNT_DmgMods = DamageMods]
			};{
				[H: DNT_DmgMods = eval(DamageMods)]
				[H: DamageMods = strformat(DNT_ModString, DamageMods, DNT_DmgMods)]
			}
		]
				
		<b>[R, switch(DNT_AttackSlot): case 1: "";	case 2: "2nd "; case 3: "3rd "; default: DNT_AttackSlot + "th "]Attack[R: if(DNT_EntryAttackType == "Multi", strformat(" #%{DNT_AttackNumber}"), "")]</b>[R, if(json.get(macro.args, "Target" + DNT_AttackCount) == ""): ""; " against " + getName(json.get(macro.args, "Target" + DNT_AttackCount))]: 
		
		[R, if(DNT_HideRoll == 1), CODE:
			{
				[GT, ST, T(if(Die == 1, "<b>Miss!</b>", Die + DNT_PowerAttack + WeaponAttack + DNT_AtkMods)): Die + PowerAttack + WeaponAttack + AttackMods]
			};{
				[T(if(Die == 1, "<b>Miss!</b>", Die + DNT_PowerAttack + WeaponAttack + DNT_AtkMods)): Die + PowerAttack + WeaponAttack + AttackMods]
			}
		]
		
		vs 
		
		[R: DNT_EntryAttackVs] 
		
		[R, if(DNT_AttackNumber == 1 && DNT_EntryDamageSpecial != 1 && DNT_HideRoll != 1), CODE:
			{ 
				[H: DNT_DmgDiceResult = DiceRoll(DNT_RawDamageDice)]
				[H: DamageDice = strformat("%s(%s)", DNT_RawDamageDice, DNT_DmgDiceResult)]		
				[H: DNT_TotalDamage = eval(string(DNT_DmgDiceResult)) + DNT_PowerDamage + WeaponDamage + DNT_DmgMods]
				     <b>Hit</b>: [T(DNT_TotalDamage): DamageDice + PowerDamage + WeaponDamage + DamageMods] [R: DNT_EntryDamageType] <span style="color:black">[R, switch(DNT_EntryDamageSpecial): case 2: macroLink("healing", "Health@Lib:Execute", "none", json.set("", "Type", 2, "Amount", DNT_TotalDamage), currentToken()); case 3: macroLink("HP + Surge", "Health@Lib:Execute", "none", json.set("", "Type", 3, "Amount", DNT_TotalDamage), currentToken()); case 4: macroLink("temp HP", "Health@Lib:Execute", "none", json.set("", "Type", 4, "Amount", DNT_TotalDamage), currentToken()); case 5: macroLink("HP + as if Surge", "Health@Lib:Execute", "none", json.set("", "Type", 5, "Amount", DNT_TotalDamage), currentToken()); case 6: macroLink("HP + costs Surge", "Health@Lib:Execute", "none", json.set("", "Type", 6, "Amount", DNT_TotalDamage), currentToken()); default: macroLink("damage", "Health@Lib:Execute", "none", json.set("", "Type", 0, "Amount", DNT_TotalDamage), currentToken())]</span>
			};{
				[H: ""]
			}
		]	
		
		[R, if(DNT_AttackNumber == 1 && DNT_EntryDamageSpecial != 1 && DNT_HideRoll == 1), CODE:
			{ 
				[H: DNT_DmgDiceResult = DiceRoll(DNT_RawDamageDice)]
				[H: DamageDice = strformat("%s(%s)", DNT_RawDamageDice, DNT_DmgDiceResult)]		
				[H: DNT_TotalDamage = eval(string(DNT_DmgDiceResult)) + DNT_PowerDamage + WeaponDamage + DNT_DmgMods]
				     <b>Hit</b>: [GT, ST, T(DNT_TotalDamage): DamageDice + PowerDamage + WeaponDamage + DamageMods] [R: DNT_EntryDamageType] <span style="color:black">[R, switch(DNT_EntryDamageSpecial): case 2: macroLink("healing", "Health@Lib:Execute", "none", json.set("", "Type", 2, "Amount", DNT_TotalDamage), currentToken()); case 3: macroLink("HP + Surge", "Health@Lib:Execute", "none", json.set("", "Type", 3, "Amount", DNT_TotalDamage), currentToken()); case 4: macroLink("temp HP", "Health@Lib:Execute", "none", json.set("", "Type", 4, "Amount", DNT_TotalDamage), currentToken()); case 5: macroLink("HP + as if Surge", "Health@Lib:Execute", "none", json.set("", "Type", 5, "Amount", DNT_TotalDamage), currentToken()); case 6: macroLink("HP + costs Surge", "Health@Lib:Execute", "none", json.set("", "Type", 6, "Amount", DNT_TotalDamage), currentToken()); default: macroLink("damage", "Health@Lib:Execute", "none", json.set("", "Type", 0, "Amount", DNT_TotalDamage), currentToken())]</span>
			};{
				[H: ""]
			}
		]			
	
		[R, if(Die >= DNT_CriticalHit && DNT_EntryDamageSpecial != 1 && DNT_HideRoll != 1), CODE:
			{				
				[H: CriticalDamage = eval(string(PowerCritDamage)) + eval(string(WeaponCritDamage))]
				[H: DamageDice = strformat("%s(%s)", DNT_RawDamageDice, DNT_MaxDamageRoll)]
				[H: DNT_TotalDamage = DNT_MaxDamageRoll + DNT_PowerDamage + WeaponDamage + DNT_DmgMods + CriticalDamage]
				     <span style='Color:red'><b>Critical:</b></span> [T(DNT_TotalDamage): DamageDice + PowerDamage + WeaponDamage + DamageMods + CriticalDamage] <span style="color:black">[R, switch(DNT_EntryDamageSpecial): case 2: macroLink("healing", "Health@Lib:Execute", "none", json.set("", "Type", 2, "Amount", DNT_TotalDamage), currentToken()); case 3: macroLink("HP + Surge", "Health@Lib:Execute", "none", json.set("", "Type", 3, "Amount", DNT_TotalDamage), currentToken()); case 4: macroLink("temp HP", "Health@Lib:Execute", "none", json.set("", "Type", 4, "Amount", DNT_TotalDamage), currentToken()); case 5: macroLink("HP + as if Surge", "Health@Lib:Execute", "none", json.set("", "Type", 5, "Amount", DNT_TotalDamage), currentToken()); case 6: macroLink("HP + costs Surge", "Health@Lib:Execute", "none", json.set("", "Type", 6, "Amount", DNT_TotalDamage), currentToken()); default: macroLink("damage", "Health@Lib:Execute", "none", json.set("", "Type", 0, "Amount", DNT_TotalDamage), currentToken())]</span>
			};{
				[H: ""]
			}
		]		
		
		[R, if(Die >= DNT_CriticalHit && DNT_EntryDamageSpecial != 1 && DNT_HideRoll == 1), CODE:
			{				
				[H: CriticalDamage = eval(string(PowerCritDamage)) + eval(string(WeaponCritDamage))]
				[H: DamageDice = strformat("%s(%s)", DNT_RawDamageDice, DNT_MaxDamageRoll)]
				[H: DNT_TotalDamage = DNT_MaxDamageRoll + DNT_PowerDamage + WeaponDamage + DNT_DmgMods + CriticalDamage]
				     <span style='Color:red'><b>Critical:</b></span>[R, switch(DNT_EntryDamageSpecial): case 2: macroLink("healing", "Health@Lib:Execute", "none", json.set("", "Type", 2, "Amount", DNT_TotalDamage), currentToken()); case 3: macroLink("HP + Surge", "Health@Lib:Execute", "none", json.set("", "Type", 3, "Amount", DNT_TotalDamage), currentToken()); case 4: macroLink("temp HP", "Health@Lib:Execute", "none", json.set("", "Type", 4, "Amount", DNT_TotalDamage), currentToken()); case 5: macroLink("HP + as if Surge", "Health@Lib:Execute", "none", json.set("", "Type", 5, "Amount", DNT_TotalDamage), currentToken()); case 6: macroLink("HP + costs Surge", "Health@Lib:Execute", "none", json.set("", "Type", 6, "Amount", DNT_TotalDamage), currentToken()); default: macroLink("damage", "Health@Lib:Execute", "none", json.set("", "Type", 0, "Amount", DNT_TotalDamage), currentToken())]</span>
			};{
				[H: ""]
			}
		]		
		
		[H: DNT_AttackCount = DNT_AttackCount + 1]
				
	}
]

[R, if(DNT_EntryAttackType == "" && DNT_EntryDamageSpecial != 1), CODE:
	{
				[H: DamageMods = if(json.get(macro.args, "DmgMod" + DNT_AttackCount) == "", 0, json.get(macro.args, "DmgMod" + DNT_AttackCount))]
		[H, if(isNumber(DamageMods) == 1), CODE:
			{
				[H: DNT_DmgMods = DamageMods]
			};{
				[H: DNT_DmgMods = eval(DamageMods)]
				[H: DamageMods = strformat(DNT_ModString, DamageMods, DNT_DmgMods)]
			}
		]
		<br>
		[R, if(DNT_HideRoll == 1), CODE:
			{
				[H: DNT_DmgDiceResult = DiceRoll(DNT_RawDamageDice)]
				[H: DamageDice = strformat("%s(%s)", DNT_RawDamageDice, DNT_DmgDiceResult)]	
				[H: DNT_TotalDamage = eval(string(DNT_DmgDiceResult)) + DNT_PowerDamage + WeaponDamage + DNT_DmgMods]
				<b>[R, switch(DNT_AttackSlot): case 1: ""; case 2: "2nd "; case 3: "3rd "; default: DNT_AttackSlot + "th "] Hit</b>[R, if(json.get(macro.args, "Target" + DNT_AttackCount) == ""): ""; " against " + getName(json.get(macro.args, "Target" + DNT_AttackCount))]: [GT, ST, T(DNT_TotalDamage): DamageDice + PowerDamage + WeaponDamage + DamageMods] [R: DNT_EntryDamageType] <span style="color:black">[R, switch(DNT_EntryDamageSpecial): case 2: macroLink("healing", "Health@Lib:Execute", "none", json.set("", "Type", 2, "Amount", DNT_TotalDamage), currentToken()); case 3: macroLink("HP + Surge", "Health@Lib:Execute", "none", json.set("", "Type", 3, "Amount", DNT_TotalDamage), currentToken()); case 4: macroLink("temp HP", "Health@Lib:Execute", "none", json.set("", "Type", 4, "Amount", DNT_TotalDamage), currentToken()); case 5: macroLink("HP + as if Surge", "Health@Lib:Execute", "none", json.set("", "Type", 5, "Amount", DNT_TotalDamage), currentToken()); case 6: macroLink("HP + costs Surge", "Health@Lib:Execute", "none", json.set("", "Type", 6, "Amount", DNT_TotalDamage), currentToken()); default: macroLink("damage", "Health@Lib:Execute", "none", json.set("", "Type", 0, "Amount", DNT_TotalDamage), currentToken())]</span>
			};{
				[H: DNT_DmgDiceResult = DiceRoll(DNT_RawDamageDice)]
				[H: DamageDice = strformat("%s(%s)", DNT_RawDamageDice, DNT_DmgDiceResult)]	
				[H: DNT_TotalDamage = eval(string(DNT_DmgDiceResult)) + DNT_PowerDamage + WeaponDamage + DNT_DmgMods]
				<b>[R, switch(DNT_AttackSlot): case 1: ""; case 2: "2nd "; case 3: "3rd "; default: DNT_AttackSlot + "th "] Hit</b>[R, if(json.get(macro.args, "Target" + DNT_AttackCount) == ""): ""; " against " + getName(json.get(macro.args, "Target" + DNT_AttackCount))]: [T(DNT_TotalDamage): DamageDice + PowerDamage + WeaponDamage + DamageMods] [R: DNT_EntryDamageType] <span style="color:black">[R, switch(DNT_EntryDamageSpecial): case 2: macroLink("healing", "Health@Lib:Execute", "none", json.set("", "Type", 2, "Amount", DNT_TotalDamage), currentToken()); case 3: macroLink("HP + Surge", "Health@Lib:Execute", "none", json.set("", "Type", 3, "Amount", DNT_TotalDamage), currentToken()); case 4: macroLink("temp HP", "Health@Lib:Execute", "none", json.set("", "Type", 4, "Amount", DNT_TotalDamage), currentToken()); case 5: macroLink("HP + as if Surge", "Health@Lib:Execute", "none", json.set("", "Type", 5, "Amount", DNT_TotalDamage), currentToken()); case 6: macroLink("HP + costs Surge", "Health@Lib:Execute", "none", json.set("", "Type", 6, "Amount", DNT_TotalDamage), currentToken()); default: macroLink("damage", "Health@Lib:Execute", "none", json.set("", "Type", 0, "Amount", DNT_TotalDamage), currentToken())]</span>
			}
		]
		[H: DNT_AttackCount = DNT_AttackCount + 1]
	};{
		[H: ""]
	}
]
[R, if(json.get(DNT_Entry, "ShowHit" + DNT_AttackSlot) == 1): strformat("<br><b>Hit:</b> %s", RegEx(json.get(DNT_Entry, "Hit" + DNT_AttackSlot)))]

[R, if(json.get(DNT_Entry, "ShowMiss" + DNT_AttackSlot) == 1): strformat("<br><b>Miss:</b> %s", RegEx(json.get(DNT_Entry, "Miss" + DNT_AttackSlot)))]

[H: macro.return = DNT_AttackCount]

User avatar
PinkRose
Dragon
Posts: 732
Joined: Sat Nov 15, 2008 2:28 pm
Location: The City of Roses, Oregon

Re: DN's D&D4e Character Sheet Framework

Post by PinkRose »

Thanks so much, dustyX!!
However, that causes a bug when there is a critical.
The total damage for the crit doesn't show, though if you click the critical link, the correct total shows in the damage box.

mystara, what power does that come from?
I am a special snowflake!

jffdougan
Cave Troll
Posts: 55
Joined: Mon Jan 04, 2010 1:50 pm
Location: Central IL

Re: DN's D&D4e Character Sheet Framework

Post by jffdougan »

The executioner assassin has a paragon-level feature that works that way, although I don't know for certain if that's what he's referring to.
LFR Characters:

Tiernan, Vestige'lock 9
Tiernan's adventure wishlist
CORE 1-12 (H3), AGLA 2-1 (H3)

Calisto, Arcas, Ganymede, & Thalia, Half-elf Sentinel Druid 2 and wall of fur
Knossos, Minotaur Lifespirit Warden 1

Darakonis
Cave Troll
Posts: 98
Joined: Sun Apr 19, 2009 5:49 pm
Contact:

Re: DN's D&D4e Character Sheet Framework

Post by Darakonis »

horticulture wrote:
Darakonis wrote:Possible bug...

The Surprised condition icon (Yellow Exclamation mark) is not visible to my players, regardless of which token it's on. I can see it as host and GM, but my players cannot.

Peace,
-Darakonis
I think I may have figured out the cause for this. Go to Edit > Campaign Properties > select the States tab. In the "Show to:" box you'll see that all three are checked (GM, Owner, Everybody Else), however when you select the Yellow Surprised condition icon only the GM is checked. Check the other two and it should fix your issue.

Ta da?
Ta da!

Thank you.

Peace,
-Darakonis
Visit the D&D Digest for RPG tips & reviews.

Listen to the adventures of a live MapTool voice-chat group: Dungeons & Drogans

User avatar
Merkuri
Giant
Posts: 194
Joined: Sat Feb 28, 2009 3:20 pm
Location: Massachusetts, USA

Re: DN's D&D4e Character Sheet Framework

Post by Merkuri »

I seem to have done something wrong to a power (I was experimenting with using variables like =(INT)) and now I can't edit it. When I click on it on the sheet I get a null pointer exception.

Is there a way I can strip out that power or just clear the "Effect" section of it so it becomes usable again? I'd prefer to be able to recover it so I don't have to recreate it, but if there's a way I can just delete it that would be okay.
Adventure is not outside; it is within.
--Found in a fortune cookie on game night

MapTool Framework for Sufficiently Advanced

Post Reply

Return to “D&D 4e Frameworks”