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

caliber
Kobold
Posts: 6
Joined: Mon Apr 11, 2011 12:27 pm

Re: DN's D&D4e Character Sheet Framework

Post by caliber »

Merkuri wrote:Well, you can let them move the tokens if they own them, but then they can see the sheet. I don't think you can move without ownership.

Do you know that you can hold down the space bar over the map to show an arrow? Your "pushy" player can use that to show you where he's pushing the NPCs.

You don't need to apologize for being a "newb". We've all been there. :)
We did stumble over that feature in the first game last Sunday. That's probably the way to go. Tested out saving tokens back to the library ... success!

By the by, how would I enter something like a dwarf's +5 saving throw vs poison? I have it stashed inside the resist block right now, but it seems like there should be a way to let saving throws vs poison know to add the +5 automatically, like you can for death saves ...

Also, is there a way to flag a power as un-usable (frex, the Channel Divinity power that only exists as a tracking power?)

heathan666
Giant
Posts: 192
Joined: Tue Dec 25, 2007 6:38 pm

Re: DN's D&D4e Character Sheet Framework

Post by heathan666 »

I was wondering is there an easier way to enter monsters??? The reason I ask, is I don't like entering 101 things like on a PCs sheet to create monsters it is very very time consuming. I really like this framework and think it is pretty awesome. I tried using Rumbles which was great, but was less familiar with it, so decided to run with this one.
"Nat 20 man, reroll a plate wearer next time."
Kugan - "All bless the god KA-CHING!"

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 »

caliber, For + vs Poison, I have it in the Resists as well.
Remember, this is just an aid and not a full fledged video game. It doesn't play the game for us.
Yet.
As for your Channel Divinity powers, what I have done is make a power called Channel Divinity that is an encounter power and put it in another group and close. Mine is labeled "Don't touch".
Then for all of your CD powers, just link to the Channel Divinity Power.
The first time you use one CD power it will trigger the CD power and mark it used, and all the other CD powers will mark as used as well, until you take a short rest. Works great.

heathan666, let me point you to this amazing thread here.
http://forums.rptools.net/viewtopic.php?f=8&t=16137
That will solve all your problems.
I am a special snowflake!

caliber
Kobold
Posts: 6
Joined: Mon Apr 11, 2011 12:27 pm

Re: DN's D&D4e Character Sheet Framework

Post by caliber »

Sweet gorilla of Manilla! That parser is something I desperately wanted and didn't even know. Awesome! :shock: :D :lol:

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 »

I know !!! Right?!!!
TravisT is a Demigod, just below DeviantNull.
I am a special snowflake!

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

Re: DN's D&D4e Character Sheet Framework

Post by dustyX »

PinkRose wrote: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.
Sorry, took me so long to figure this out. I have not coded in years, so took me a little while to decode what was going wrong (also wasn't a priority since I don't use hidden rolls). But finally, this fixs the bug of the damage not showing properly on a crit. Again, copy this code and paste it in to the PowerUseAttacks macro on the Lib:Execute Sheet.

Finally, Elusive Bug fixed

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> [T(DNT_TotalDamage): DamageDice + PowerDamage + WeaponDamage + DamageMods + CriticalDamage] [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]

heathan666
Giant
Posts: 192
Joined: Tue Dec 25, 2007 6:38 pm

Re: DN's D&D4e Character Sheet Framework

Post by heathan666 »

Thanks rose for that link, that should hopefully help out I'll play with it a bit today. I do have to say, that as a Player DN's was one of the best frameworks, lets see how well this monsterparser token thing works out.
"Nat 20 man, reroll a plate wearer next time."
Kugan - "All bless the god KA-CHING!"

heathan666
Giant
Posts: 192
Joined: Tue Dec 25, 2007 6:38 pm

Re: DN's D&D4e Character Sheet Framework

Post by heathan666 »

Ok, so I checked it out, and I like it. Still need to test things out, but over all its an awesome lay out.
"Nat 20 man, reroll a plate wearer next time."
Kugan - "All bless the god KA-CHING!"

Krissey
Kobold
Posts: 2
Joined: Wed May 04, 2011 9:05 pm

Re: DN's D&D4e Character Sheet Framework

Post by Krissey »

Is this compatible with Player's Handbook 2 Shaman, because a lot of my attacks are made through an NPC I summon (spirit companion) and I read through all your FAQ and I still couldnt figure out how to make my "Call Spirit Companion" create an NPC and I wasn't sure if I needed to make it an item or something to get it to be recognize with the Alternate #1/2 options for my attacks.

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 »

What I would do, as DN has pointed out, is put all the powers in a group on your PC.
That way the attacks scale as you level and the abilities match yours based on your equipment and trained abilities.

Remember, that the DN framework is a tool and not an automated system. There may still be things that need done by hand. Not a lot, I can tell you, but some. But as it stands, there is very little that I can't make it do and my players are level 11, paragon, and have been using DN since it was available.
I am a special snowflake!

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 »

dustyX, I finally patched that code in.
Works perfectly. DN will have to add it next time he updates.
Thank you very much.
I am a special snowflake!

User avatar
mfrizzell
Dragon
Posts: 762
Joined: Sat Feb 13, 2010 2:35 am
Location: California

Re: DN's D&D4e Character Sheet Framework

Post by mfrizzell »

How do you do add on damage?
Example; I have a Dwarf that has major advantages to charge in his attacks.
So setting the attack damage routine for the basic attack is fine but he also has another damage d8 for one magic item and another d6 for a different one. So how do add those in.
I tried putting in 1d6+1d8 but no joy.
Sort of tied to the above is the fact that the basic attack is not always used for charge is there way to make a power that has no attack roll but does have a damage roll?
DCI/RPGA# 7208328396 Skype ID mfrizzell77
Characters:
Strabor - Dwarf Avenger 5th Level
Tikkanan - Human Warlock 2nd Level
----------------------------------------------------
"People are more violently opposed to fur than leather because it's safer to harass rich women than motorcycle gangs."

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 »

I would just add the damage into the magic items. When they are used, trigger them with the Fast Forward button, and they should spit out the 1d8 and 1d6.

For the second, the answer is yes. Select 1 for attacks on the first page. Then on the attack page, choose NONE for the attack, and go ahead and put damage in.

If something always has extra damage, like a sword attack that does 2W + 3 damage AND 1d6 fire damage, you can do that as well. Choose 2 for attacks on the first page. Then set up the first attack as normal, and for the second, again, choose NONE for the attack and go ahead and put the 1d6 in for the damage and fire in the type.

If this makes no sense to you, e-mail me and send your token with the powers and feats listed and I'll put together an attack as an example for you.
I am a special snowflake!

User avatar
mfrizzell
Dragon
Posts: 762
Joined: Sat Feb 13, 2010 2:35 am
Location: California

Re: DN's D&D4e Character Sheet Framework

Post by mfrizzell »

Thanks make sense, I'll try it and see how it goes.
Thanks
DCI/RPGA# 7208328396 Skype ID mfrizzell77
Characters:
Strabor - Dwarf Avenger 5th Level
Tikkanan - Human Warlock 2nd Level
----------------------------------------------------
"People are more violently opposed to fur than leather because it's safer to harass rich women than motorcycle gangs."

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 »

http://forums.rptools.net/viewtopic.php?f=8&t=18434
Anyone see this thread?
Can anyone make that .dnd4e file load up into DN's framework?
I am a special snowflake!

Post Reply

Return to “D&D 4e Frameworks”