Rod's D&D 5e Framework

Framework(s) for D&D 5e.

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

DiscoShimmy
Kobold
Posts: 2
Joined: Thu Mar 26, 2020 9:15 pm

Re: Rod's D&D 5e Framework

Post by DiscoShimmy »

Two of my players use extra races (Tabaxi, Gnoll)
and extra archetypes (Swashbuckler)

Is there any way to add these in to the character creation myself? I didn't see anything in the macros but I tend to be blind.

Sulo_Hayha
Kobold
Posts: 2
Joined: Sat Mar 28, 2020 9:32 pm

Re: Rod's D&D 5e Framework

Post by Sulo_Hayha »

I'm running a fairly heavily homebrewed campaign that we now had to move to VTT due to the lockdown...
Love the framework so far, this is the first time for me using MT and it's making it much easier that it seemed before.

Is there a way (and how hard would it be) for me to add two boxes in each character's sheets that track progress on two separate trackers (numbers 1-20 and 1-100)?

Sulo_Hayha
Kobold
Posts: 2
Joined: Sat Mar 28, 2020 9:32 pm

Re: Rod's D&D 5e Framework

Post by Sulo_Hayha »

rpt-steve wrote:
Sun Feb 23, 2020 5:39 pm
anathemort wrote:
Sun Feb 23, 2020 4:54 pm
Has anyone tried this with >= 1.5.11 and the changes to the JSON tooling? Any issues we should be aware of?
I tried it once and immediately started getting errors about undefined values that I had no idea how to solve.

I figure I'll take another crack at it (with 1.5.12 now) once I get more familiar with debugging macros in general. Some of the other bug fixes in this thread have been very educational in that regard, too!
So I literally know nothing about the code language MT uses but I've managed to fix the JSON errors in the NPC Statblocks.

I've changed the json.get(param=="") to json.contains(param) and reversed the order of the blocks in code: to match the new IF logic.
No idea if this breaks something else in some other place but hey, it made the statblock usable so that's good enough for me.

Here's the code to replace the macro in Lib:Bestiary -> Statblock (found on the 00 map).

Code: Select all

<table width=100% bgcolor=#E68C34 style="border:1px solid #503C22"></table>


[h:statblock=macro.args]





<font face=serif size=5 style="text-decoration: none" color=#6C1C0F;><b>
[r:macroLink( token.name,"[email protected]:Character","",token.name,token.name)]</b>
</font>
<br>
<font size=2 style="text-decoration: none"><i>
[h:size=json.get(statblock,"size")]
[r:if(size=="T","Tiny",if(size=="S","Small",if(size=="M","Medium",if(size=="L","Large",if(size=="H","Huge",if(size=="G","Gargantuan",size))))))]

[h:creaturetype=json.get(statblock,"type")]
[r,if(json.contains(creaturetype,"swarmSize")),code:{
	swarm of 
	[h:size=json.get(creaturetype,"swarmSize")]

[h:size=if(size=="T","Tiny",if(size=="S","Small",if(size=="M","Medium",if(size=="L","Large",if(size=="H","Huge",if(size=="G","Gargantuan",size))))))]
	[r:lower(size)]
	};{
		
		
		}]

[r,if(json.contains(creaturetype, "tags")==1),code:{
	[r:json.get(creaturetype,"type")][r:if(json.contains(creaturetype,"swarmSize"),"s","")]
	[h:tags=json.get(creaturetype,"tags")]
	([r,count(listcount(tags),", "),code:{
		[r:json.get(tags,roll.count)]
		}])
	};{
	[r,if(json.contains(creaturetype,"type")==1),code:{
		
[r:json.get(creaturetype,"type"))][r:if(json.contains(creaturetype,"swarmSize"),"s","")]
		
		};{
			
[r:json.get(statblock,"type"))][r:if(json.contains(creaturetype,"swarmSize"),"s","")]
			
			}]
}],

[h:alignment=json.get(statblock,"alignment")]
[h:fields=json.fields(alignment)]
[h:haschance=json.contains(json.get(alignment,0),"chance")]

[r,count(listCount(fields),""),code:{

[r,if(haschance==1),code:{
	
	[h:alignchance=json.get(alignment,roll.count)]
	[h:chance=json.get(alignchance,"chance")]
	[h:axis=json.get(alignchance,"alignment")]
	[h:axis=json.toList(axis," ")]
	[h:axis=replace(axis,"U","unaligned")]
	[h:axis=replace(axis,"N","neutral")]
	[h:axis=replace(axis,"L","lawful")]
	[h:axis=replace(axis,"C","chaotic")]
	[h:axis=replace(axis,"G","good")]
	[h:axis=replace(axis,"E","evil")]
	[h:axis=replace(axis,"X","(law/chaos axis)")]
	[h:axis=replace(axis,"Y","(good/evil axis)")]
	[h:axis=replace(axis,"A","any alignment")]
	[r:axis][r:" ("+chance+"%)"]
	
	[r:if(roll.count==0," or","")]
	
	};{
		
			[h:axis=json.get(alignment,roll.count)]
	[h:axis=replace(axis,"U","unaligned")]
	[h:axis=replace(axis,"N","neutral")]
	[h:axis=replace(axis,"L","lawful")]
	[h:axis=replace(axis,"C","chaotic")]
	[h:axis=replace(axis,"G","good")]
	[h:axis=replace(axis,"E","evil")]
	[h:axis=replace(axis,"X","(law/chaos axis)")]
	[h:axis=replace(axis,"Y","(good/evil axis)")]
	[h:axis=replace(axis,"A","any alignment")]
	[r:axis]
		
		
		
		}]


	
	
	}]



</i></font>

<hr noshade>
<font size=2 style="text-decoration: none" color=#6C1C0F;><b>Armor Class</b>

[h:ac=json.get(statblock,"ac")]



[h:acvalue=json.get(ac,0)]

[r,if(json.contains(acvalue,"ac")),count(listcount(ac,"},"),","),code:{


	[h:acvalue=json.get(ac,roll.count)]

	[r:ArmorClass=json.get(acvalue,"ac")]
	[h:from=json.get(acvalue,"from")]
		[h:items=""]
		[h:output=""]
	[r,count(listcount(from),""),code:{
		[h:item=listget(from,roll.count)]
		[h:item=replace(item,"(\\[.)\\s*","")]
		[h:item=replace(item,"(\\{@[a-z]+)\\s*","")]
		[h:item=replace(item,"(\\|[a-z]+\\}.)\\s*","")]
		[h:item=replace(item,"(\\])\\s*","")]
		[h:item=replace(item,'"',"")]
		[h:items=items+item+", "]
		[h:strcount=length(items)]
		[h:output="("+substring(items, 0, strcount-2)+")"]
		}]
		[r:output]
	
		[r:json.get(acvalue,"condition")]
		
	
	};{
	[r:ArmorClass=json.get(ac,0)]
	
	}]



<br>
<b>Hit Points</b>
[h:hp=json.get(statblock,"hp")]
[h:HitPointMaximum=json.get(hp,"average")][h:formula=json.get(hp,"formula")]
<font size=2 style="text-decoration: none" color=#D0000F;>
 [r:macroLink(HitPointMaximum+if(TemporaryHitPoints=="","",+"(+"+TemporaryHitPoints+")"),"Change [email protected]:Character","All","",token.name)]
</font>
<!--- replace hp formula --->
[r:entry=""]
[h:id=strfind(formula,"([0-9]+d[0-9]+\\s*[\\+\\-]*\\s*[0-9]*)\\s*")]
[r,if(getFindCount(id, 1, 1)==0), count(getFindCount(id, 1, 1),""),code:{
	};{
	[h:dmg=getGroup(id, roll.count+1, 1)]
	[h:dmgid=strfind(dmg,"([0-9]+d[0-9]+\\s*[\\+\\-]*\\s*[0-9]*)\\s*")]
	[h:dmgvalue=getGroup(dmgid, 1, 1)]
	[h:entry=replace(formula,"([0-9]+d[0-9]+\\s*[\\+\\-]*\\s*[0-9]*)\\s*",macroLink(dmgvalue,"[email protected]:Character","self","dmg1="+dmgvalue+";dmgtype1=Hit Points"),1)]
	}]

(<font size=2 style="text-decoration: none" color=#D0000F;>[r:entry]</font>)

<br>
<b>Speed</b>[h:move=json.get(statblock,"speed")]
[h:speed=move]
[h:speedlist=json.fields(move)]
[h:speedcount=listcount(speedlist)]
[r,count(speedcount," "),code:{
	[h:speeditem=listget(speedlist,roll.count)]
	[h:speedvalue=json.get(move,speeditem)]

[r,if(json.type(speedvalue)=="OBJECT"),code:{
	[r:speeditem]
	[r:json.get(speedvalue,"number")] ft.
	[r:json.get(speedvalue,"condition")]
	
	};{
		[r:if(speeditem=="canHover","",speeditem)]
		[r:if(speeditem=="canHover","",speedvalue+" ft.")]
		}]
	
	}]

<hr noshade>
<table width=100%>
<tr>
<td align=center>
<b><font size=2 style="text-decoration: none" color=#6C1C0F;>STR</b><br>
<font size=2 style="text-decoration: none" color=#D0000F;>
[h:Strenght=json.get(statblock,"str")]
[h:strmod=floor(json.get(statblock,"str")/2-5))]
[r:macroLink(Strenght+" ("+if(strmod<0,strmod,"+"+strmod)+")","Ability [email protected]:Character","self","skill=Strenght; value="+strmod)]
<td align=center>
<b><font size=2 style="text-decoration: none" color=#6C1C0F;>DEX</b><br>
<font size=2 style="text-decoration: none" color=#D0000F;>
[h:Dexterity=json.get(statblock,"dex")]
[h:dexmod=floor(json.get(statblock,"dex")/2-5))]
[r:macroLink(Dexterity+" ("+if(dexmod<0,dexmod,"+"+dexmod)+")","Ability [email protected]:Character","self","skill=Dexterity; value="+dexmod)]
<td align=center>
<b><font size=2 style="text-decoration: none" color=#6C1C0F;>CON</b><br>
<font size=2 style="text-decoration: none" color=#D0000F;>
[h:Constitution=json.get(statblock,"con")] 
[h:conmod=floor(json.get(statblock,"con")/2-5))]
[r:macroLink(Constitution+" ("+if(conmod<0,conmod,"+"+conmod)+")","Ability [email protected]:Character","self","skill=Constitution; value="+conmod)]
<td align=center>
<b><font size=2 style="text-decoration: none" color=#6C1C0F;>INT</b><br>
<font size=2 style="text-decoration: none" color=#D0000F;>
[h:Inteligence=json.get(statblock,"int")]
[h:intmod=floor(json.get(statblock,"int")/2-5))]
[r:macroLink(Inteligence+" ("+if(intmod<0,intmod,"+"+intmod)+")","Ability [email protected]:Character","self","skill=Inteligence; value="+intmod)]
<td align=center>
<b><font size=2 style="text-decoration: none" color=#6C1C0F;>WIS</b><br>
<font size=2 style="text-decoration: none" color=#D0000F;>
[h:Wisdom=json.get(statblock,"wis")]
[h:wismod=floor(json.get(statblock,"wis")/2-5))]
[r:macroLink(Wisdom+" ("+if(wismod<0,wismod,"+"+wismod)+")","Ability [email protected]:Character","self","skill=Wisdom; value="+wismod)]
<td align=center>
<b><font size=2 style="text-decoration: none" color=#6C1C0F;>CHA</b><br>
<font size=2 style="text-decoration: none" color=#D0000F;>
[h:Charisma=json.get(statblock,"cha")]
[h:chamod=floor(json.get(statblock,"cha")/2-5))]
[r:macroLink(Charisma+" ("+if(chamod<0,chamod,"+"+chamod)+")","Ability [email protected]:Character","self","skill=Charisma; value="+chamod)]
</table>
<hr noshade>

[h:Initiative=dexmod]

<font size=2 style="text-decoration: none" color=#6C1C0F;>
[r, if (json.contains(statblock, "save")==1 ), code:{
	<b>Saving Trows</b> 
[h:save=json.get(statblock,"save")]
[h:savecount=listCount(json.fields(save))]
[ count(savecount) , CODE:{
	[h:currentsave=listGet(json.fields(save),roll.count)]
	[r:upper(currentsave,1)]
	[h:savemod=json.get(save,currentsave)]
	<font size=2 style="text-decoration: none" color=#D0000F;>
	[r:macroLink(if(savemod<0,savemod,"+"+savemod),"Saving [email protected]:Character","self","skill="+upper(currentsave,1)+"; value="+savemod)]</font>
	}]
<br>
};{}]

[r, if (json.contains(statblock, "skill")==1 ), code:{
<b>Skills</b>
[h:skill=json.get(statblock,"skill")]
[h:skillcount=listCount(json.fields(skill))]
[ count(skillcount) , CODE:{
	[h:currentskill=listGet(json.fields(skill),roll.count)]
	[r:upper(currentskill,1)]
	[h:skillmod=json.get(skill,currentskill)]
	<font size=2 style="text-decoration: none" color=#D0000F;>
	[r:macroLink(if(skillmod<0,skillmod,"+"+skillmod),"Skill [email protected]:Character","self","skill="+upper(currentskill,1)+"; value="+skillmod)]</font>
	}]
<br>
};{}]

[h:list=""]
[r,if(json.get(statblock,"vulnerable")==""),code:{};{
<b>Damage Vulnerabilities</b>
[h:vulnerable=json.get(statblock,"vulnerable")]
[h:entry=json.fields(vulnerable)]}]
[h:itemlist=""]
[r,if(json.get(statblock,"vulnerable")==""),count(listcount(entry),""),code:{};{
[h:item=json.get(vulnerable,roll.count)]
[r,if(json.type(item)=="OBJECT"),code:{
[h:condition=json.get(item,"vulnerable")]
[r:if(roll.count==listcount(entry)-1,itemlist,"")]
[r:if(json.type(item)=="OBJECT",if(json.type(json.get(vulnerable,0))=="OBJECT","",";"),",")]
[h:list=json.toList(condition)]
[h:del=listCount(list)]
[h:last=listGet(list,del-1)]
[r:if(del==1,list,listDelete(list,del-1))][r:if(del==1,""," and "+last)]
[r:json.get(item,"note")]
};{
[h:itemlist=listAppend(itemlist,item,",")]
[r:if(roll.count==listcount(entry)-1,itemlist,"")]
}]}]
[r,if(json.get(statblock,"vulnerable")==""),code:{};{<br>}]

[h:list=""]
[r,if(json.contains(statblock,"resist")),code:{
<b>Damage Resistances</b>
[h:resist=json.get(statblock,"resist")]
[h:entry=json.fields(resist)]};{}]
[h:itemlist=""]
[r,if(json.contains(statblock,"resist")),count(listcount(entry),""),code:{
[h:item=json.get(resist,roll.count)]
[r,if(json.type(item)=="OBJECT"),code:{
[h:condition=json.get(item,"resist")]
[r:if(roll.count==listcount(entry)-1,itemlist,"")]
[r:if(json.type(item)=="OBJECT",if(json.type(json.get(resist,0))=="OBJECT","",";"),",")]
[h:list=json.toList(condition)]
[h:del=listCount(list)]
[h:last=listGet(list,del-1)]
[r:if(del==1,list,listDelete(list,del-1))][r:if(del==1,""," and "+last)]
[r:json.get(item,"note")]
};{
[h:itemlist=listAppend(itemlist,item,",")]
[r:if(roll.count==listcount(entry)-1,itemlist,"")]
}]};{}]
[r,if(json.contains(statblock,"resist")),code:{<br>};{}]

[h:list=""]
[r,if(json.contains(statblock,"immune")),code:
{
   <b>Damage Immunities</b>
   [h:immune=json.get(statblock,"immune")]
   [h:entry=json.fields(immune)]
};
{
   
}]
[h:itemlist=""]
[r,if(json.contains(statblock,"immune")),count(listcount(entry),""),code:
{
   [h:item=json.get(immune,roll.count)]
   [r,if(json.type(item)=="OBJECT"),code:{
   [h:condition=json.get(item,"immune")]
   [r:if(roll.count==listcount(entry)-1,itemlist,"")]
   [r:if(json.type(item)=="OBJECT",if(json.type(json.get(immune,0))=="OBJECT","",";"),",")]
   [h:list=json.toList(condition)]
   [h:del=listCount(list)]
   [h:last=listGet(list,del-1)]
   [r:if(del==1,list,listDelete(list,del-1))][r:if(del==1,""," and "+last)]
   [r:json.get(item,"note")]
   };{
   [h:itemlist=listAppend(itemlist,item,",")]
   [r:if(roll.count==listcount(entry)-1,itemlist,"")]
   }]
};
{

}]
[r,if(json.contains(statblock,"immune")),code:{<br>};{}]

[r, if (json.contains(statblock, "conditionImmune")==1 ), code:{
<b>Condition Immunities</b> [h:conditionImmune=json.get(statblock,"conditionImmune")]
	[r,count(listcount(conditionImmune)),code:{
	[r:json.get(conditionImmune,roll.count)]
	}]<br>
};{}]

<b>Senses</b>

[h:senses=json.get(statblock,"senses")]
	[r,count(listcount(senses)),code:{
	[r:json.get(senses,roll.count)]
	}]

passive Perception [r:PassivePerception=json.get(statblock,"passive")]<br>
<b>Languages</b>





[r,if(json.contains(statblock,"languages")),code:
{
   [h:languages=json.get(statblock,"languages")]
	[r,count(listcount(languages)),code:{
	[r:json.get(languages,roll.count)]
	}]
};
{
   -
}]





<br>
<b>Challenge</b> 
[h:cr=json.get(statblock,"cr")]
[h:list=json.fields(cr)]







[r,if(listget(list,1)==0),code:{
	[r:cr]

([r,switch(cr):
case "0":"0 or 10";
case "1/8":"25";
case "1/4":"50";
case "1/2":"100";
case "1":"200";
case "2":"450";
case "3":"700";
case "4":"1,100";
case "5":"1,800";
case "6":"2,300";
case "7":"2,900";
case "8":"3,900";
case "9":"5,000";
case "10":"5,900";
case "11":"7,200";
case "12":"8,400";
case "13":"10,000";
case "14":"11,500";
case "15":"13,000";
case "16":"15,000";
case "17":"18,000";
case "18":"20,000";
case "19":"22,000";
case "20":"25,000";
case "21":"33,000";
case "22":"41,000";
case "23":"50,000";
case "24":"62,000";
case "25":"75,000";
case "26":"90,000";
case "27":"105,000";
case "28":"120,000";
case "29":"135,000";
case "30":"155,000"] XP)
	
	};{
		[r,count(listcount(list)," or "),code:{

			[h:listcr=listget(list,roll.count)]
			[r:crvalue=json.get(cr,listcr)]

([r,switch(crvalue):
case "0":"0 or 10";
case "1/8":"25";
case "1/4":"50";
case "1/2":"100";
case "1":"200";
case "2":"450";
case "3":"700";
case "4":"1,100";
case "5":"1,800";
case "6":"2,300";
case "7":"2,900";
case "8":"3,900";
case "9":"5,000";
case "10":"5,900";
case "11":"7,200";
case "12":"8,400";
case "13":"10,000";
case "14":"11,500";
case "15":"13,000";
case "16":"15,000";
case "17":"18,000";
case "18":"20,000";
case "19":"22,000";
case "20":"25,000";
case "21":"33,000";
case "22":"41,000";
case "23":"50,000";
case "24":"62,000";
case "25":"75,000";
case "26":"90,000";
case "27":"105,000";
case "28":"120,000";
case "29":"135,000";
case "30":"155,000"] XP)

			
			[r:if(listcr=="lair","  when encountered in lair","")]
			[r:if(listcr=="coven","  when part of a coven","")]
			}]
		}]



<font size=2 style="text-decoration: none">


<hr noshade>


[h:traitcount=0]
[r, if (json.contains(statblock, "trait")==1 ), code:{


<font size=2 style="text-decoration: none">


[h:traits=json.get(statblock,"trait")]
[h:listoftraits=json.fields(traits)]
[h:traitcount=listCount(listoftraits)]
};{}]
[r,count(traitcount,""),code:{
	
[h:trait=json.get(traits, roll.count)]
<i><b>[r:json.get(trait, "name")].</b></i>

[h:entrylist=json.get(trait,"entries")]


<!--- replace traits --->
[h:id=strfind(entrylist,"(@[a-z]+\\s[0-9]*d[0-9]+\\s*[\\+\\-]*\\s*[0-9]*)\\s*")]
[r,if(getFindCount(id, 1, 1)==0), count(getFindCount(id, 1, 1),""),code:{
	};{
	[h:dmg=getGroup(id, roll.count+1, 1)]
	[h:dmgid=strfind(dmg,"([0-9]*d[0-9]+\\s*[\\+\\-]*\\s*[0-9]*)\\s*")]
	[h:dmgvalue=getGroup(dmgid, 1, 1)]
	[h:dmgvalue=if(indexOf(dmgvalue, "d")==0,"1"+dmgvalue,dmgvalue)]
	[h:link=macroLink(dmgvalue,"[email protected]:Character","self","dmg1="+dmgvalue+";dmgtype1=Roll;")]


[h:entrylist=replace(entrylist,dmg,"<font color=#D0000F;>"+link+"</font>")]
	}]
	
[h:entrylist=replace(entrylist,"@dc\\s*"," DC ")]
[h:entrylist=replace(entrylist,"\\{","")]
[h:entrylist=replace(entrylist,"}","")]
[h:entrylist=replace(entrylist,"@Lib","Placeholder")]
[h:entrylist=replace(entrylist,"@\\w*\\s*","")]

[h:entrylist=replace(entrylist,"Placeholder","@Lib")]

[h:DCfind=strfind(entrylist,"DC\\s(\\d+)")]
	[h,if(getFindCount(DCfind, 1, 1)==0),code:{};{
	[h:DC=getGroup(DCfind, 1, 1)]
	[h:entrylist=replace(entrylist,"DC\\s\\d+","DC <font color=#D0000F;>"+macroLink(DC,"[email protected]:Character","self","dmg1="+DC+";dmgtype1=DC")+"</font>")]
	}]


[h:entrycount=listcount(json.fields(entrylist))]
[r,count(entrycount,""),code:{

	[r:entry=json.get(entrylist, roll.count)]<br>&nbsp;&nbsp;

	}]


<br>
}]


[r, if (json.contains(statblock, "spellcasting")==1 ), code:{

[h:spellcasting=json.get(statblock,"spellcasting")]
<font size=2 style="text-decoration: none">
[h:spellcount=listCount(json.fields(spellcasting))]
[r,count(spellcount,"<br>"),code:{
	
[macro("[email protected]:Bestiary"):"count="+roll.count+";name="+spellcasting)]

	}]<br>

};{}]


[r, if (json.contains(statblock, "action")==1 ), code:{

<font face=sans size=4 color=#6C1C0F;>Actions
</font>
<hr noshade>
<font size=2 style="text-decoration: none">

[h:actions=json.get(statblock,"action")]
[h:listofactions=json.fields(actions)]
[h:attackcount=listCount(listofactions)]

[r,count(attackcount,""),code:{	
[h:action=json.get(actions,roll.count)]
[macro("[email protected]:Bestiary"):"count="+roll.count+";name="+action)]
}]
};{}]



[r, if (json.contains(statblock, "reaction")==1 ), code:{
[h:reactionlist=json.get(statblock,"reaction")]
[macro("[email protected]:Bestiary"):reactionlist]
};{}]

[r, if (json.contains(statblock, "legendary")==1 ), code:{
[macro("[email protected]:Bestiary"):macro.args]
};{}]

[r, if (json.contains(statblock, "lairActions")==1 ), code:{
[h:lair=json.get(statblock,"lairActions")]
[macro("[email protected]:Bestiary"):lair]
};{}]

[r, if (json.contains(statblock, "regionalEffects")==1 ), code:{
[h:region=json.get(statblock,"regionalEffects")]
[macro("[email protected]:Bestiary"):region]
};{}]

[r, if (json.contains(statblock, "variant")==1 ), code:{

<table width="100%">
<table style="border:1px solid #ABB3A1;" bgcolor=#DEEAD5 width=100%>
<tr><td><font  size=2 style="text-decoration: none">
[h:variant=json.get(statblock,"variant")]
[h:variant=json.get(variant,0)]
[h:variantlist=json.fields(variant)]
<b>
[r:if(json.get(variant,"type")=="variant","Variant: ","")]
[r:json.get(variant,"name")]
</b><br>
[h:entries=json.get(variant,"entries")]
[h:entrylist=json.fields(entries)]
[r,count(listcount(entrylist),""),code:{


[macro("[email protected]:Bestiary"):"repeat="+roll.count+";entries="+entries]

	}]

</table>
</table>

};{}]


<table width=100% bgcolor=#E68C34 style="border:1px solid #503C22"></table>

TigrisMorte
Kobold
Posts: 3
Joined: Wed Sep 03, 2014 7:36 pm

Re: Rod's D&D 5e Framework

Post by TigrisMorte »

Has this been tested with Wolph42's Bag of Tricks? Any issues one should note?

jschoudt
Kobold
Posts: 1
Joined: Mon Jan 21, 2019 11:28 am

Re: Rod's D&D 5e Framework

Post by jschoudt »

DiscoShimmy wrote:
Thu Mar 26, 2020 9:19 pm
Two of my players use extra races (Tabaxi, Gnoll)
and extra archetypes (Swashbuckler)

Is there any way to add these in to the character creation myself? I didn't see anything in the macros but I tend to be blind.
If you go to the "01.Characters" you'll see tokens for all the races the framework supports. I've added Water Genasi for my campaign. It was easiest to start with a copy of one of the existing race tokens.

Zytran
Kobold
Posts: 1
Joined: Tue Apr 07, 2020 4:00 pm

Re: Rod's D&D 5e Framework

Post by Zytran »

rtakehara wrote:
Fri Mar 06, 2020 2:43 pm
Hey guys, sorry for the absence and thanks for all the comments and fixes, I've been doing a rework on the character sheet. I didn't update the OP yet because
1 - It's not ready yet and
2 - It will change a lot, so even when its done it will break other parts of the framework, so I will have a lot of fixing to do

for now, if you wanna try it and/or give feedback the link is here

I am trying to remember to add comments, indentation and make it more robust so it wont break that easily, and to make it easier for people to change/fix/add/steal
The update to the character sheet looks and feels really good so far, can't wait to see what the finished version looks like.

User avatar
rtakehara
Cave Troll
Posts: 37
Joined: Mon Nov 11, 2019 5:11 pm
Contact:

Re: Rod's D&D 5e Framework

Post by rtakehara »

Its 6 a.m. and version 2.0 is finally done, link to download here (and in the OP), here's a video on how to use it https://youtu.be/5Tjg3HXnZpo (but the file has a welcome document explaining it)

Thanks for all the support. By the way, it may have less content -the old one had all classes, backgrounds, races and items from PHB, and all monsters from MM, this one has only the ones from SRD, and not all of them - but it's easier to create, export and import, so as I and others use it, it can be updated to include more content

clithgow
Kobold
Posts: 2
Joined: Sat Apr 11, 2020 5:47 pm

Re: Rod's D&D 5e Framework

Post by clithgow »

Really looking forward to diving into this 2.0 and using it for an Adventure in Middle Earth Campaign. Few questions up on first use:

1 - Trying to add a Skill through the settings menu. When I click skills I get the Input Values box that has the full string of ....Stealth=Dexterity;Survival=Wisdom....etc in it. I want to add ;Traditions=Intelligence to the end of this list. After doing so I get another pop-up Input Value box asking for Value For attributeList. Not sure what should be going in there. Any help?

2. It look like when using the character sheet or stat block to make rolls by clicking the modifier, atk bonus it throws a bit of an error in the gm view.
« if(matches(text,"Initiative.*")==1,macroLink("[Set initiative]","Set [email protected]:Character","","tokenName="+tokenName+";value="+formulaNormal),"") =  » « if(matches(text,"Initiative.*")==1,macroLink("[Adv]","Set [email protected]:Character","","tokenName="+tokenName+";value="+adv),"") =  » « if(matches(text,"Initiative.*")==1,macroLink("[Dis]","Set [email protected]:Character","","tokenName="+tokenName+";value="+dis),"") =  »
It does't appear to do this when rolling for damage.

Thanks for all your efforts!

Karyuu
Kobold
Posts: 1
Joined: Mon Apr 13, 2020 8:37 am

Re: Rod's D&D 5e Framework

Post by Karyuu »

clithgow wrote:
Sun Apr 12, 2020 12:35 pm
Really looking forward to diving into this 2.0 and using it for an Adventure in Middle Earth Campaign. Few questions up on first use:

1 - Trying to add a Skill through the settings menu. When I click skills I get the Input Values box that has the full string of ....Stealth=Dexterity;Survival=Wisdom....etc in it. I want to add ;Traditions=Intelligence to the end of this list. After doing so I get another pop-up Input Value box asking for Value For attributeList. Not sure what should be going in there. Any help?

2. It look like when using the character sheet or stat block to make rolls by clicking the modifier, atk bonus it throws a bit of an error in the gm view.
« if(matches(text,"Initiative.*")==1,macroLink("[Set initiative]","Set [email protected]:Character","","tokenName="+tokenName+";value="+formulaNormal),"") =  » « if(matches(text,"Initiative.*")==1,macroLink("[Adv]","Set [email protected]:Character","","tokenName="+tokenName+";value="+adv),"") =  » « if(matches(text,"Initiative.*")==1,macroLink("[Dis]","Set [email protected]:Character","","tokenName="+tokenName+";value="+dis),"") =  »
It does't appear to do this when rolling for damage.

Thanks for all your efforts!
Hi. Yeah I noticed the same thing, but it seems to be how MapTool works.

Write the following two lines in the chat:
[gm:"Hello there"]
[r:"Hello there"]

If you dont want to see it anymore, go to the DM map, select the [Lib:Character] token, in Selection find the "d20 Roller" macro, right click, edit, scroll all the way to the bottom and either change it to [r] or delete the last 3 lines.

Keep in mind that with the first, all players will be able to see the initiative Macro link in the chat - tell them to avoid clicking it - and with the other you'll miss the neat link in the chat that allows you to add the player's roll to the initiative.

Cadroni
Kobold
Posts: 1
Joined: Mon Apr 13, 2020 10:19 am

Re: Rod's D&D 5e Framework

Post by Cadroni »

clithgow wrote:
Sun Apr 12, 2020 12:35 pm
2. It look like when using the character sheet or stat block to make rolls by clicking the modifier, atk bonus it throws a bit of an error in the gm view.
« if(matches(text,"Initiative.*")==1,macroLink("[Set initiative]","Set [email protected]:Character","","tokenName="+tokenName+";value="+formulaNormal),"") =  » « if(matches(text,"Initiative.*")==1,macroLink("[Adv]","Set [email protected]:Character","","tokenName="+tokenName+";value="+adv),"") =  » « if(matches(text,"Initiative.*")==1,macroLink("[Dis]","Set [email protected]:Character","","tokenName="+tokenName+";value="+dis),"") =  »
It does't appear to do this when rolling for damage.
This has to do with a setting in your preferences.
At Preferences at tab "interactions" at the right under the heading "Chat" if you enable "Use ToolTips for Inline Rolls"
the rolls are shown correctly.

In the video explanation you can see the settings of the creator and can copy them as needed.
Might be a good idea to list necessary settings to make before sing this framework. (or a macro if it can do that)

clithgow
Kobold
Posts: 2
Joined: Sat Apr 11, 2020 5:47 pm

Re: Rod's D&D 5e Framework

Post by clithgow »

Cadroni wrote:
Mon Apr 13, 2020 10:25 am
This has to do with a setting in your preferences.
At Preferences at tab "interactions" at the right under the heading "Chat" if you enable "Use ToolTips for Inline Rolls"
the rolls are shown correctly.

In the video explanation you can see the settings of the creator and can copy them as needed.
Might be a good idea to list necessary settings to make before sing this framework. (or a macro if it can do that)
Ah, very good! Thanks for that!

User avatar
rtakehara
Cave Troll
Posts: 37
Joined: Mon Nov 11, 2019 5:11 pm
Contact:

Re: Rod's D&D 5e Framework

Post by rtakehara »

clithgow wrote:
Sun Apr 12, 2020 12:35 pm
Really looking forward to diving into this 2.0 and using it for an Adventure in Middle Earth Campaign. Few questions up on first use:

1 - Trying to add a Skill through the settings menu. When I click skills I get the Input Values box that has the full string of ....Stealth=Dexterity;Survival=Wisdom....etc in it. I want to add ;Traditions=Intelligence to the end of this list. After doing so I get another pop-up Input Value box asking for Value For attributeList. Not sure what should be going in there. Any help?

2. It look like when using the character sheet or stat block to make rolls by clicking the modifier, atk bonus it throws a bit of an error in the gm view.
« if(matches(text,"Initiative.*")==1,macroLink("[Set initiative]","Set [email protected]:Character","","tokenName="+tokenName+";value="+formulaNormal),"") =  » « if(matches(text,"Initiative.*")==1,macroLink("[Adv]","Set [email protected]:Character","","tokenName="+tokenName+";value="+adv),"") =  » « if(matches(text,"Initiative.*")==1,macroLink("[Dis]","Set [email protected]:Character","","tokenName="+tokenName+";value="+dis),"") =  »
It does't appear to do this when rolling for damage.

Thanks for all your efforts!
Oh, little mistake, just fixed it, but if you want you can fix it really quick, in the Lib:Campaign, edit the Settings macro and in the second IF statement

Code: Select all

[r,if(macro.args=="Skills"),code:{

	[h:attributeList=getLibProperty("Skills","Lib:Character")]
Replace it with:

Code: Select all

[r,if(macro.args=="Skills"),code:{

	[h:skillList=getLibProperty("Skills","Lib:Character")]
2nd problem is what Cadroni said, btw yeah I should warn that, I just didn't notice that could be a problem, thanks!

axisential
Kobold
Posts: 1
Joined: Thu Apr 16, 2020 2:02 am

Re: Rod's D&D 5e Framework

Post by axisential »

Rod, this an amazing piece of work - I was close to giving up Maptool until I found this. Thank You!

A couple of questions:
1. What do I do with the downloaded compendium.zip file? Apologies if it's common knowledge but I couldn't seem to figure it out!
2. When I try to open any of the links to www resources I get an error stating that the browser could not be started. Any ideas on how to correct this?

Cheers.

OokOok
Kobold
Posts: 15
Joined: Wed Nov 13, 2019 12:27 am

Re: Rod's D&D 5e Framework

Post by OokOok »

Thanks for all the hard work on this. I've been using your older framework for my campaign. Is there a simple way to update my existing .cmpgn to your 2.0 version that doesn't involve starting off with a complete blank/empty .cmpgn? I had hoped I could simply delete the older Lib:Campaign token and replace with the new Lib:Campaign token (and then repeat for the others), but it doesn't appear to be as simple as this.

NOTE: it is VERY possible that my existing campaign might actually be some kind of mash-up of a bunch of stuff. It came into existence when I still didn't really fully understand MT and was doing things that may not have been "smart". (And my question here probably gives away the fact that I'm STILL not REALLY expert on it yet!) If your old framework did NOT have a "00.DM Screen" map and/or that map didn't also include things like Pin, Lib:Spellbook, Lib:Stream, Lib:Module, Lib:Rules, and/or Lib:Adventure tokens then let me know that I've got a completely unsupported upgrade path. :D

EDIT: Hmmm...with some deeper digging I believe that my .cmpgn file is actually based upon Paul Strait's framework, not yours...so I'm guessing there's no simple rip and replace approach to moving my stuff to your framework w/o exporting everything from my existing campaign and into yours. Oh well! :shrug:

User avatar
rtakehara
Cave Troll
Posts: 37
Joined: Mon Nov 11, 2019 5:11 pm
Contact:

Re: Rod's D&D 5e Framework

Post by rtakehara »

OokOok wrote:
Fri Apr 17, 2020 6:16 pm
EDIT: Hmmm...with some deeper digging I believe that my .cmpgn file is actually based upon Paul Strait's framework, not yours...so I'm guessing there's no simple rip and replace approach to moving my stuff to your framework w/o exporting everything from my existing campaign and into yours. Oh well! :shrug:
My old one used the same paper texture as the new one, so if the one you use has it, it was mine, if not, probably wasn't, but whichever is the case, the new one is not compatible, sorry =(

I made some choices in the old one that I didn't like and couldn't fix, so I rewrote everything, If I ever change the framework drastically I will make sure to make it compatible

Post Reply

Return to “D&D 5e Frameworks”