diff --git a/src/components/map/dice/DiceControls.js b/src/components/map/dice/DiceControls.js
index ea110bd..b56370a 100644
--- a/src/components/map/dice/DiceControls.js
+++ b/src/components/map/dice/DiceControls.js
@@ -9,6 +9,7 @@ import D10Icon from "../../../icons/D10Icon";
import D8Icon from "../../../icons/D8Icon";
import D6Icon from "../../../icons/D6Icon";
import D4Icon from "../../../icons/D4Icon";
+import D100Icon from "../../../icons/D100Icon";
function DiceControls({ onDiceAdd }) {
return (
@@ -55,6 +56,13 @@ function DiceControls({ onDiceAdd }) {
>
+ onDiceAdd(SunsetDice, "d100")}
+ >
+
+
);
}
diff --git a/src/components/map/dice/DiceTray.js b/src/components/map/dice/DiceTray.js
index 786f70e..76eca0e 100644
--- a/src/components/map/dice/DiceTray.js
+++ b/src/components/map/dice/DiceTray.js
@@ -115,34 +115,21 @@ function DiceTray({ isOpen }) {
for (let i = 0; i < die.length; i++) {
const dice = die[i];
- const diceAsleep = dieSleepRef.current[i];
- const speed = dice.physicsImpostor.getLinearVelocity().length();
- if (speed < 0.01 && !diceAsleep) {
- let highestDot = -1;
- let highestLocator;
- for (let locator of dice.getChildTransformNodes()) {
- let dif = locator
- .getAbsolutePosition()
- .subtract(dice.getAbsolutePosition());
- let direction = dif.normalize();
- const dot = BABYLON.Vector3.Dot(direction, BABYLON.Vector3.Up());
- if (dot > highestDot) {
- highestDot = dot;
- highestLocator = locator;
- }
- }
+ const diceIsAsleep = dieSleepRef.current[i];
+ const speed = getDiceSpeed(dice);
+ if (speed < 0.01 && !diceIsAsleep) {
dieSleepRef.current[i] = true;
- const newNumber = parseInt(highestLocator.name.slice(12));
+ let newNumber = getDiceNumber(dice);
setDieNumbers((prevNumbers) => {
let newNumbers = [...prevNumbers];
newNumbers[i] = newNumber;
return newNumbers;
});
- } else if (speed > 0.5 && diceAsleep) {
+ } else if (speed > 0.5 && diceIsAsleep) {
dieSleepRef.current[i] = false;
setDieNumbers((prevNumbers) => {
let newNumbers = [...prevNumbers];
- newNumbers[i] = null;
+ newNumbers[i] = "unknown";
return newNumbers;
});
}
@@ -152,15 +139,73 @@ function DiceTray({ isOpen }) {
}
}
+ function getDiceSpeed(dice) {
+ const diceSpeed = dice.instance.physicsImpostor
+ .getLinearVelocity()
+ .length();
+ // If the dice is a d100 check the d10 as well
+ if (dice.type === "d100") {
+ const d10Speed = dice.d10Instance.physicsImpostor
+ .getLinearVelocity()
+ .length();
+ return Math.max(diceSpeed, d10Speed);
+ } else {
+ return diceSpeed;
+ }
+ }
+
+ // Find the number facing up on a dice object
+ function getDiceNumber(dice) {
+ let number = getDiceInstanceNumber(dice.instance);
+ // If the dice is a d100 add the d10
+ if (dice.type === "d100") {
+ const d10Number = getDiceInstanceNumber(dice.d10Instance);
+ // Both zero set to 100
+ if (d10Number === 0 && number === 0) {
+ number = 100;
+ } else {
+ number += d10Number;
+ }
+ } else if (dice.type === "d10" && number === 0) {
+ number = 10;
+ }
+ return number;
+ }
+
+ // Find the number facing up on a mesh instance of a dice
+ function getDiceInstanceNumber(instance) {
+ let highestDot = -1;
+ let highestLocator;
+ for (let locator of instance.getChildTransformNodes()) {
+ let dif = locator
+ .getAbsolutePosition()
+ .subtract(instance.getAbsolutePosition());
+ let direction = dif.normalize();
+ const dot = BABYLON.Vector3.Dot(direction, BABYLON.Vector3.Up());
+ if (dot > highestDot) {
+ highestDot = dot;
+ highestLocator = locator;
+ }
+ }
+ return parseInt(highestLocator.name.slice(12));
+ }
+
async function handleDiceAdd(style, type) {
const scene = sceneRef.current;
const shadowGenerator = shadowGeneratorRef.current;
if (scene && shadowGenerator) {
const instance = await style.createInstance(type, scene);
shadowGenerator.addShadowCaster(instance);
- dieRef.current.push(instance);
+ let dice = { type, instance };
+ // If we have a d100 add a d10 as well
+ if (type === "d100") {
+ const d10Instance = await style.createInstance("d10", scene);
+ shadowGenerator.addShadowCaster(d10Instance);
+ dice.d10Instance = d10Instance;
+ }
+ dieRef.current.push(dice);
dieSleepRef.current.push(false);
- setDieNumbers((prevNumbers) => [...prevNumbers, null]);
+ setDieNumbers((prevNumbers) => [...prevNumbers, "unknown"]);
}
}
@@ -177,27 +222,28 @@ function DiceTray({ isOpen }) {
bg="background"
>
-
- {dieNumbers.map((num, index) => (
-
- {num || "?"}
- {index === dieNumbers.length - 1 ? "" : "+"}
+ {!dieNumbers.includes("unknown") && (
+
+ {dieNumbers.map((num, index) => (
+
+ {num}
+ {index === dieNumbers.length - 1 ? "" : "+"}
+
+ ))}
+
+ {dieNumbers.length > 0 && `= ${dieNumbers.reduce((a, b) => a + b)}`}
- ))}
-
- {dieNumbers.length > 0 &&
- `= ${dieNumbers.reduce((a, b) => (a || 0) + (b || 0))}`}
-
-
+
+ )}
+
+
+
+ );
+}
+
+export default D100Icon;