Roll20 uses cookies to improve your experience on our site. Cookies enable you to enjoy certain features, social sharing functionality, and tailor message and display ads to your interests on our site and others. They also help us understand how our site is being used. By continuing to use our site, you consent to our use of cookies. Update your cookie preferences .
×
Create a free account

Suggested Scripts for 4e

I have a group of 5 players who meet weekly to play D&D 4e. One of the players plays remotely while the rest play locally. All the local players play under a single account and roll physical dice for their powers. We use the turn tracker and I currently am using the power cards script for the monsters only (because of our setup the players prefer to just call out their power and roll themselves). The remote player has his own account and I, as GM, use another account. We hook the computer up to the TV and pass a mouse around to the players as its their turn. Now, my question is, what scripts would you recommend for this sort of game setup? I've looked the scripts over and there are so many that it gets confusing to try to pick the ones that would work for us. I would love to hear your suggestions.
1403287578

Edited 1403287839
I use several scripts for my D&D4E game: These two scripts require you to have Wizards of the Coast's D&D Insider, which if you do not already have as a D&D4E DM, it's definitely worth the subscription ( D&D Insider ) D&D Insider Character Importer (HoneyBadger has not updated this script to work with the D&D4E Character Sheet, but he says he is working on it. If you are planning on using the D&D4E Character Sheet on Roll20, don't use this script yet.) D&D Insider Monster Importer (This one is a great script, it makes your encounter set up much easier, and much faster.) The rest of these scripts don't require D&D Insider Automatic Status Markers Automatic Temp HP Management Initiative Script Custom Power Cards
Hi Jarret, Thank you so much for the suggestions. I tried the importers and wasn't impressed. I end up with a lot of clutter on the players screen and very little benefit since they roll their own attacks et al. Short answer is, no body used the powers so there wasn't much use for it and manual entry of the monsters isn't a big deal for me as it doesn't take that long. Still, once it's updated to work with the character sheets and the character sheets are updated to support monster stat cards I might try it again. I already was using the Automatic Status Markers, Initiative, and Custom Power Cards scripts and I just installed the Automatic Temp HP Management script per your suggestion but I'm having some difficulty with it. Specifically, I don't know how to make it work. I keep running into the issue that people post the scripts but I can't find instructions anywhere on how to use them. Everyone else seems to know but I'm left scratching my head and wondering what I missed. Do you have any suggestions on how to know how to use these scripts? The other ones I had someone help me and I created macros for them but I don't really know how to use this latest one at all. Thanks
1403367757

Edited 1403368052
The only thing you need to change for the Temp HP one is in the beginning of the script. Which bar do you have set as your HP bar? Change that in the configuration options. Then, you need to choose a bar for temporary HP, and change that in the configuration options. From there, whenever your players get temporary HP just put it in the temporary HP bar. Then, when they take damage, it should automatically subtract the temporary HP first. In my campaign, Bar 1 is Temporary HP, Bar 2 is Surges, and Bar 3 is normal HP. My configuration options look like this: var THPBAR = 1; var HPBAR = 3; Here is an example of what the script will do. Solragar is a Dragonborn Barbarian, he has 9 surges per day, and 52 HP. His bars look like this: Bar 1 (Temporary HP) = 0 Bar 2 (Surges) = 9 Bar 3 (HP) = 52 The artificer uses a power which grants him 12 temporary HP. His bars look like this now: Bar 1 (Temporary HP) = 12 Bar 2 (Surges) = 9 Bar 3 (HP) = 52 Solragar now takes 16 damage from the boss. In the circle on his token for HP, the one on the left (HP), Solragar types "-16". The script automatically subtracts 12 from Bar 1(Temporary HP), and then the remaining from Bar 3, which is 4. His bars now look like: Bar 1 (Temporary HP) = 0 Bar 2 (Surges) = 9 Bar 3 (HP) = 48 -------------------------------------------------------------------------------- I hope this helped, if you have any other questions let me know. If you add me on skype @ jwbthemusicfreak I can help you out more, after my campaign today.
Thanks for the info. I made the adjustments and I think everything is kosher, but I'm not sure how to propperly take off the hit points. I tried to subtract an amount from the hitpoints and it just took it off the HP and left the temporary ones untouched. Any gueses as to what I'm doing wrong?
Hmm, the only thing that I could think of is that you don't have the bars set up correctly, perhaps you are using the wrong bar for your temp HP, other than the one you have referenced in the script?
Yeah, the script just stopped working and I had to restart it. It's fine now thanks.
Alright, glad it's working.
1403682544
Alex L.
Pro
Sheet Author
Here is a combined more advanced version of the status script + THP script that prevents over heals and heals from 0. var THPBAR = 3; var HPBAR = 1; var setBar = function (obj, bar, value) { var link = obj.get('_bar' + bar + '_link'); if (link !== '') { var attr = findObjs({_type : 'attribute', _id : link}); var attr = attr[0]; attr.set({'current' : value}); } obj.set('bar' + bar + '_value', value); }; var addStatusMarker = function(name, token) { var a = token.get("statusmarkers").split(","); if(a) { var index = a.indexOf(name); if (index == -1) { a.push(name); token.set("statusmarkers", a.join()); } } } var removeStatusMarker = function(name, token) { var a = token.get("statusmarkers").split(","); if(a) { var index = a.indexOf(name); if (index > -1) { a.splice(index, 1); token.set("statusmarkers", a.join()); } } } on('change:token', function (obj, prev) { if (obj.get("isdrawing") == true) { return; } var HPVALUE = 'bar' + HPBAR + '_value'; var HPMAX = 'bar' + HPBAR + '_max'; var THPVALUE = 'bar' + THPBAR + '_value'; var hp = {'new' : parseInt(obj.get(HPVALUE)), 'old' : parseInt(prev[HPVALUE])}; var maxhp = parseInt(obj.get(HPMAX)); var thp = parseInt(obj.get(THPVALUE)); var target = {}; var bloodiedHp = Math.floor(maxhp * 0.5), deadHp = -bloodiedHp; if (hp.new !== NaN && hp.new !== hp.old) { // HP changed and we have THP to spend. hp.change = hp.new - hp.old; target[THPVALUE] = 0; target[HPVALUE] = hp.new; if (hp.change < 0) { // HP decreased if(thp > 0) { hp.abschange = Math.abs(hp.change); target[THPVALUE] = (thp > hp.abschange) ? thp - hp.abschange : 0; target[HPVALUE] = (thp > hp.abschange) ? hp.old : hp.old - (hp.abschange - thp); } var currentHp = target[HPVALUE]; if(currentHp <= deadHp) { currentHp = deadHp; addStatusMarker("broken-skull", obj); } else { removeStatusMarker("broken-skull", obj); } if(currentHp <= 0) { addStatusMarker("dead", obj); } else { removeStatusMarker("dead", obj); } if(currentHp <= bloodiedHp) { addStatusMarker("half-heart", obj); } else { removeStatusMarker("half-heart", obj); } if(currentHp >= maxhp) { currentHp = maxhp; } target[HPVALUE] = currentHp; } else if(hp.change > 0) { var currentHp = target[HPVALUE]; if(currentHp <= deadHp) { currentHp = deadHp; addStatusMarker("broken-skull", obj); } else { removeStatusMarker("broken-skull", obj); } if(currentHp <= 0) { addStatusMarker("dead", obj); } else { removeStatusMarker("dead", obj); } if(currentHp <= bloodiedHp) { addStatusMarker("half-heart", obj); } else { removeStatusMarker("half-heart", obj); } if(currentHp >= maxhp) { currentHp = maxhp; } if(hp.old < 0) { currentHp = hp.change; } target[HPVALUE] = currentHp; setTimeout(setBar.bind(this, obj, HPBAR, target[HPVALUE]), 10); } setTimeout(setBar.bind(this, obj, HPBAR, target[HPVALUE]), 10); setTimeout(setBar.bind(this, obj, THPBAR, target[THPVALUE]), 10); } });
When does the broken skull status icon activate?
1403786868
Alex L.
Pro
Sheet Author
Jarret B. said: When does the broken skull status icon activate? When the token is dead (negative bloodied).
Gotcha.
Question regarding the THP and HP status changes code that Alex posted above - is there any way to use a character's attribute "tmp-hp" instead of bar3? Some of my players use that third bar for tracking their character's own personal resources, like a psionic's power points or a barbarian tracking his kills after he starts a rage.
1405186883
The Aaron
Roll20 Production Team
API Scripter
That can definitely be done. I have a rewrite of the above I made for Jarret, I can add that to it for you.
That would be great!