Page 1 of 2
HERO System dice
Posted: Wed Jul 04, 2007 3:03 am
by RPMiller
If I were to provide the java script for HERO dice, where would I put it and would it be possible to get it integrated at least into the DiceTool, but ultimately into MapTool so that it could be used in chat?
Posted: Wed Jul 04, 2007 3:11 am
by RPMiller
I'll just go ahead and post it here for now:
Code: Select all
public static String roll(String rollString) {
String orig = rollString;
StringBuffer ret = new StringBuffer();
SimpleDateFormat formatter = new SimpleDateFormat(
"EEEEE, MMMMM d, yyyy hh:mm:ss.SSS aaa");
rollString = rollString.toUpperCase().trim();
if (rollString.startsWith("LOCATION")) {
int add = 0;
int dice = 3;
if (!rollString.equals("LOCATION")) {
String check = rollString.substring(8);
check = check.trim();
if (check.startsWith(",")) {
check = check.substring(1).trim();
if (check.equals("HEAD")) {
add = 3;
dice = 1;
} else if (check.equals("HIGH")) {
add = 1;
dice = 2;
} else if (check.equals("BODY")) {
add = 4;
dice = 2;
} else if (check.equals("LOW")) {
add = 7;
dice = 2;
} else if (check.equals("LEG")) {
add = 12;
dice = 1;
} else {
return orig;
}
} else if (check.startsWith("+")) {
check = check.substring(1).trim();
try {
add = Integer.parseInt(check);
} catch (Exception exp) {
return orig;
}
} else if (check.startsWith("-")) {
try {
add = Integer.parseInt(check);
} catch (Exception exp) {
return orig;
}
} else {
return orig;
}
}
int total = add;
for (int i = 0; i < dice; i++) {
int die = (int) Math.ceil(Math.random() * 6);
total += die;
}
if (total <= 5) {
ret.append(orig + ": " + total + " = Head");
} else if (total <= 6) {
ret.append(orig + ": " + total + " = Hands");
} else if (total <= 8) {
ret.append(orig + ": " + total + " = Arms");
} else if (total <= 9) {
ret.append(orig + ": " + total + " = Shoulders");
} else if (total <= 11) {
ret.append(orig + ": " + total + " = Chest");
} else if (total <= 12) {
ret.append(orig + ": " + total + " = Stomach");
} else if (total <= 13) {
ret.append(orig + ": " + total + " = Vitals");
} else if (total <= 14) {
ret.append(orig + ": " + total + " = Thighs");
} else if (total <= 16) {
ret.append(orig + ": " + total + " = Legs");
} else {
ret.append(orig + ": " + total + " = Feet");
}
} else if (rollString.equals("ROLL")) {
int total = 0;
for (int i = 0; i < 3; i++) {
int die = (int) Math.ceil(Math.random() * 6);
total += die;
}
ret.append("roll: " + total);
} else if (rollString.startsWith("HIT, OCV")) {
String ocvString = rollString.substring(8, rollString.length());
int ocv = 0;
if (ocvString.length() < 1) {
return orig;
}
try {
ocv = Integer.parseInt(ocvString.trim());
} catch (Exception exp) {
return orig;
}
int total = 0;
for (int i = 0; i < 3; i++) {
int die = (int) Math.ceil(Math.random() * 6);
total += die;
}
int dcvHit = 11 + ocv - total;
if (dcvHit < 0 || total == 18) {
ret.append(orig + ": (" + total + ", automatically misses)");
}
ret.append(orig + ": (" + total + ", hits DCV " + dcvHit
+ " or lower)");
} else if (rollString.startsWith("HIT, ECV")) {
String ocvString = rollString.substring(8, rollString.length());
int ocv = 0;
if (ocvString.length() < 1) {
return orig;
}
try {
ocv = Integer.parseInt(ocvString.trim());
} catch (Exception exp) {
return orig;
}
int total = 0;
for (int i = 0; i < 3; i++) {
int die = (int) Math.ceil(Math.random() * 6);
total += die;
}
int dcvHit = 11 + ocv - total;
if (dcvHit < 0 || total == 18) {
ret.append(orig + ": (" + total + ", automatically misses)");
}
ret.append(orig + ": (" + total + ", hits ECV " + dcvHit
+ " or lower)");
} else if (rollString.lastIndexOf("-") == rollString.length() - 1) {
int total = 0;
for (int i = 0; i < 3; i++) {
int die = (int) Math.ceil(Math.random() * 6);
total += die;
}
if (rollString.lastIndexOf(",") <= 0) {
return orig;
}
String lim = rollString.substring(rollString.lastIndexOf(",") + 1,
rollString.lastIndexOf("-"));
int limit = 0;
try {
limit = Integer.parseInt(lim.trim());
} catch (Exception exp) {
return orig;
}
String passfail = "succeeded";
int madeBy = 0;
if (total <= limit) {
madeBy = limit - total;
} else {
passfail = "failed";
madeBy = total - limit;
}
ret.append(orig + ": (" + total + ", " + passfail + " by " + madeBy
+ ")");
} else {
// time to parse it out...
if (rollString.indexOf("D") <0> rollString.indexOf("D")) {
return orig;
}
String x = rollString.substring(0, rollString.indexOf("D"));
double dice = 0d;
try {
dice = Double.parseDouble(x);
} catch (Exception exp) {
return orig;
}
if (dice <0> 1000) {
return orig;
}
rollString = rollString.substring(rollString.indexOf("D") + 1,
rollString.length());
StringBuffer y = new StringBuffer();
int counter = 0;
while (rollString.length() > counter
&& Character.isDigit(rollString.charAt(counter))) {
y.append(rollString.charAt(counter));
counter++;
}
if (y.length() == 0) {
return orig;
}
int sides = 0;
try {
sides = Integer.parseInt(y.toString());
} catch (Exception exp) {
return orig;
}
if (sides <0> 1000) {
return orig;
}
rollString = rollString.substring(counter, rollString.length());
int bonus = 0;
if (rollString.length() > 1
&& rollString.substring(0, 2).equals("+1")) {
bonus = 1;
rollString = rollString.substring(2, rollString.length());
} else if (rollString.length() > 1
&& rollString.substring(0, 2).equals("-1")) {
bonus = -1;
rollString = rollString.substring(2, rollString.length());
}
boolean killing = false;
boolean explosion = false;
boolean knockback = false;
int stunMult = -1;
int fadeRate = 2;
int kbDice = 0;
if (rollString.length() > 0 && rollString.charAt(0) == 'K') {
killing = true;
rollString = rollString.substring(1, rollString.length());
if (rollString.length() > 0 && rollString.charAt(0) == '+') {
counter = 0;
rollString = rollString.substring(1, rollString.length());
StringBuffer z = new StringBuffer();
while (rollString.length() > counter
&& Character.isDigit(rollString.charAt(counter))) {
z.append(rollString.charAt(counter));
counter++;
}
if (z.length() == 0) {
return orig;
}
try {
stunMult = Integer.parseInt(z.toString()) - 1;
} catch (Exception exp) {
return orig;
}
rollString = rollString.substring(counter, rollString
.length());
} else if (rollString.length() > 0
&& rollString.charAt(0) == '-') {
counter = 0;
rollString = rollString.substring(1, rollString.length());
StringBuffer z = new StringBuffer();
while (rollString.length() > counter
&& Character.isDigit(rollString.charAt(counter))) {
z.append(rollString.charAt(counter));
counter++;
}
if (z.length() == 0) {
return orig;
}
try {
stunMult = (-1 * Integer.parseInt(z.toString())) - 1;
} catch (Exception exp) {
return orig;
}
rollString = rollString.substring(counter, rollString
.length());
}
}
if (rollString.length() > 2
&& rollString.substring(0, 2).equals("EX")) {
explosion = true;
rollString = rollString.substring(2, rollString.length());
if (rollString.length() == 0) {
return orig;
}
try {
fadeRate = Integer.parseInt(rollString);
} catch (Exception exp) {
return orig;
}
if (fadeRate <0> 0) {
return orig;
}
if ((killing || explosion || knockback) && sides != 6) {
return orig;
}
// pant....it's parsed....now for the rolling and results.
int total = 0;
List<Integer> rolls = new ArrayList<Integer>();
int partialDie = 0;
int body = 0;
int stun = 0;
for (int i = 0; i <Math> 1)
body += 1;
if (die > 5)
body += 1;
}
if (Math.floor(dice) < dice - .000001) {
double partial = dice - Math.floor(dice);
BigDecimal bd = new BigDecimal(partial
* Math.ceil(Math.random() * sides));
if (bd.intValue() <1> 1)
body += 1;
if (bd.intValue() > 5)
body += 1;
}
total += bonus;
stun = total;
if (killing) {
body = total;
int mult = (int) Math.ceil(Math.random() * sides) + (stunMult);
if (mult <1> 1 || (rolls.size() > 0 && partialDie > 0)) {
counter = 0;
rollsShown = true;
for (int roll : rolls) {
if (counter > 0)
ret.append(", ");
ret.append(roll);
counter++;
}
if (partialDie > 0) {
if (rolls.size() > 0) {
ret.append(" + ");
}
ret.append(partialDie);
}
ret.append(" ");
}
if (explosion) {
if (partialDie != 0)
rolls.add(partialDie);
Collections.sort(rolls);
for (int i = 0; i < rolls.size(); i++) {
if (rollsShown) {
ret.append("<br>");
ret.append(" ");
}
ret.append((fadeRate * i) + "\": ");
int tot = bonus;
int st = 0;
int bd = 0;
for (int j = 0; j <rolls> 1)
bd += 1;
if (rolls.get(j) > 5)
bd += 1;
}
st = tot;
if (killing) {
bd = tot;
st = bd * stunMult;
ret.append(bd + " BODY, " + st + " STUN");
} else {
ret.append(st + " STUN, " + bd + " BODY");
}
}
} else if (killing) {
if (rollsShown)
ret.append("(");
ret.append(body + " BODY, " + stun + " STUN");
if (rollsShown)
ret.append(")");
} else {
if (rollsShown)
ret.append("(");
if (sides == 6)
ret.append(stun + " STUN, " + body + " BODY");
else if (rollsShown)
ret.append(stun + " TOTAL");
else
ret.append(stun + "");
if (rollsShown)
ret.append(")");
}
}
ret.append(" <span>" + formatter.format(new Date())
+ "</span>");
return ret.toString();
}
I can get the origin code for this as well if that would be better.
Posted: Thu Jul 05, 2007 10:29 am
by giliath
DiceTool can be extended with javascript. There is a functions.js file in the root when you download the zip version that can be replaced. There are a couple of examples in the current file.
Here are a couple of forums that talk about it.
http://forums.rptools.net/viewtopic.php ... javascript
http://forums.rptools.net/viewtopic.php ... javascript
For MapTool, we will be adding the javascript support sometime around version 2.0 (which we will start on as soon as we finish 1.3).
Thanks
Posted: Thu Jul 05, 2007 12:35 pm
by RPMiller
Thanks! I'll check those out and see if I can figure out how to get the above script into DiceTool.
Posted: Sun Jul 08, 2007 4:31 am
by RPMiller
Ok, I've looked and looked and unzipped the download, and looked and I can not find this functions.js file that you speak of.
Can you point me to the link to the zip that contains the functions.js file?
Posted: Mon Jul 09, 2007 11:45 pm
by RPMiller
I finally found functions.js. Now I will try to figure out how to modify the jscript to work with DT.
EDIT: Ok, nevermind. None of the functions.js links have an associated file. Every time I try to download it I get nothing. I appears to be a 0 byte file.
Posted: Tue Jul 10, 2007 12:31 am
by trevor
I'll bug giliath about responding
Posted: Tue Jul 10, 2007 11:06 am
by giliath
Ok, I played with this last night.
Download the zip file download from here:
http://rptools.net/dist/zip/dicetool-1.0.b34.zip.
Drop a functions.js into the root (beside the .jar file). Here is an example:
http://rptools.svn.sourceforge.net/view ... nctions.js.
Something like this:
Code: Select all
function registerFunctions() {
var map = new java.util.HashMap();
map.put("fnord", fnord);
return map;
}
function fnord(a) {
row.setLabel("Fnord");
return a;
}
Posted: Tue Jul 10, 2007 12:46 pm
by RPMiller
I've done the above, and now I need to figure out how to actually implement the dice roller code. So far I haven't found any documentation on how to actually call a function from DiceTool, add a button that will do it, or load it into DiceTool. Once I get over that hurdle I'll be much closer.
Posted: Tue Jul 10, 2007 2:11 pm
by trevor
I believe that just loading DiceTool will load the functions, then in the roll area, just call the function.
Posted: Tue Jul 10, 2007 2:19 pm
by RPMiller
Hmm... Aha! You have to add a tab first and then you can call the function. Very good. Now then to figure out if I can use the code above... I suspect I won't be able to as it is jscript, but it is worth a shot while I wait.
Trevor, thanks for the PM I may take you up on your offer depending on what I hear back.
Posted: Fri Sep 07, 2007 11:13 pm
by RPMiller
Just checking in to see if there has been any progress on getting the Hero dice working.
Posted: Tue Sep 18, 2007 1:02 am
by keithcurtis
I'll second a request for Hero Dice.
Posted: Tue Sep 18, 2007 2:00 am
by RPMiller
Hehe, Keith! When did you sneak in here?
Posted: Tue Sep 18, 2007 9:32 am
by GoOrange
They don't call him The Ubiquitous Keith for nothing!
OK, I just made that up, but it's funny how the same people pop up on multiple different forums like Hero, Fear the Boot, RPtools...