HERO System dice
Moderators: dorpond, Azhrei, giliath
HERO System dice
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?
I'll just go ahead and post it here for now:
I can get the origin code for this as well if that would be better.
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();
}
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
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
~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:
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;
}
~Giliath
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.
Trevor, thanks for the PM I may take you up on your offer depending on what I hear back.
- keithcurtis
- Giant
- Posts: 129
- Joined: Fri Mar 02, 2007 3:18 am
- Contact: