mirror of
https://github.com/RPG-Research/bcirpg.git
synced 2024-04-16 14:23:01 +00:00
159 lines
4.7 KiB
GDScript
159 lines
4.7 KiB
GDScript
#This is the diemanager script that controls the rolling of the die/dice as well as calculates
|
|
#the end result
|
|
|
|
extends Control
|
|
|
|
export var desiredDice = [20, 8]
|
|
|
|
var validDieTypes = [4, 6, 8, 10, 12, 20]
|
|
|
|
|
|
#boolean for if a percentageroll is taking place
|
|
#we need a boolean for this because the way a percentage roll is calculated
|
|
#with two D10s is different than if one were using other dice
|
|
var isPercentageRoll = false
|
|
|
|
#diceUsed holds the dice objects that are rolled
|
|
var diceUsed = []
|
|
|
|
#diceInPlay holds the die objects as well.
|
|
#This and diceUsed are essentially the same arrays (holding the dice objects), but I had to use
|
|
#two arrays due to the parameters in returnDiePercentage
|
|
var diceInPlay = []
|
|
|
|
#rolledValues holds the integer value rolled from each die
|
|
var rolledValues = []
|
|
|
|
#User can select the percentage needed for a successful roll
|
|
export var neededPercentageToPass = .2
|
|
|
|
#boolean based on whether the overall roll passed or not
|
|
var passedRoll
|
|
|
|
#float holding the degree of success (rolledVal - neededPercentageToPass)
|
|
var degreeOfSuccess
|
|
|
|
|
|
#Load the diceInPlay array
|
|
func _ready():
|
|
for elem in desiredDice:
|
|
if elem in validDieTypes:
|
|
diceInPlay.append(Die.new(elem))
|
|
|
|
#conditional to check if two D10s are being used
|
|
#if so, we know that a percentage roll is taking place
|
|
if len(desiredDice) == 2 && desiredDice[0] == 10 && desiredDice[1] == 10:
|
|
isPercentageRoll = true
|
|
|
|
|
|
|
|
#This is the function that returns the percentage of a rolled die (rolled val / total sides)
|
|
#The UML showed that this function only had one parameter, "inputedDie," so I assumed that
|
|
#was the rolled integer value. However, in order to find the percetage we need the total sides as well
|
|
#As a result, I would get the total sides by ensuring that the inputedDie corresponds to the die at index 0
|
|
#of the diceInPlay array.
|
|
func returnDiePercentage(inputedDie):
|
|
|
|
var totalSides = diceInPlay[0].numFaces
|
|
|
|
#ensuring we don't lose the die objects in memory by storing them in another array
|
|
diceUsed.append(diceInPlay[0])
|
|
diceInPlay.remove(0)
|
|
|
|
#Checks if a percentageroll is being done
|
|
if isPercentageRoll:
|
|
|
|
#This conditional is used to detemrine if the rolled value is
|
|
#for the tens or ones digit
|
|
if (len(diceUsed) == 1):
|
|
return float(inputedDie % 10) / 10.0
|
|
else:
|
|
return float(inputedDie % 10) / 100.0
|
|
|
|
var result = float(inputedDie) / float(totalSides)
|
|
return result
|
|
|
|
|
|
#Function to show all of the results on screen
|
|
func showOnUI(passResult, percentRolled) -> void:
|
|
if passResult:
|
|
$Outcome.text = "Successful Roll!"
|
|
else:
|
|
$Outcome.text = "Failed Roll!"
|
|
|
|
var diceResultText = "Rolled Values:\n"
|
|
|
|
#Prints the integer calues of each die rolled in the form: "D(num faces): (value rolled)"
|
|
for i in range(diceUsed.size()):
|
|
diceResultText += ("D" + str(diceUsed[i].numFaces) + ": " + str(rolledValues[i]) + "\n")
|
|
|
|
|
|
#NOTE: degree of success is always calculated regardlesss of success/failure. Let me know if this should be changed
|
|
degreeOfSuccess = percentRolled - neededPercentageToPass
|
|
|
|
#changing labels on screen
|
|
$RolledValues.text = diceResultText
|
|
$PercentNeeded.text = "Percent Needed to Pass: " + str(neededPercentageToPass * 100) + "%"
|
|
$PercentRolled.text = "Percent Rolled: " + str(percentRolled * 100) + "%"
|
|
$DegreeOfSuccess.text = "Degree of Success: " + str(degreeOfSuccess * 100) + "%"
|
|
|
|
#revealing labels to user
|
|
$Outcome.show()
|
|
$RolledValues.show()
|
|
$PercentNeeded.show()
|
|
$PercentRolled.show()
|
|
$DegreeOfSuccess.show()
|
|
|
|
|
|
#function for when "roll" button is clicked
|
|
func _on_Die_button_down():
|
|
#denominator will equal the total number of dice rolled
|
|
var denominator = 0
|
|
|
|
#sum of floats of all rolled die percentages
|
|
var sumOfPercentages = 0
|
|
|
|
#stores the rolled integer value of die in loop
|
|
var rolledVal
|
|
|
|
#remember that the size of diceInPlay decrements by 1 each time returnDiePercentage is called
|
|
while diceInPlay.size() > 0:
|
|
rolledVal = diceInPlay[0].rollDie()
|
|
|
|
#add rolled integer vaslue to array
|
|
rolledValues.append(rolledVal)
|
|
|
|
#add percentage to sum
|
|
sumOfPercentages += returnDiePercentage(rolledVal)
|
|
|
|
#increment denominator
|
|
denominator += 1
|
|
|
|
var result
|
|
if isPercentageRoll:
|
|
#Percentage roll result remains the sum of the rolls
|
|
result = sumOfPercentages
|
|
else:
|
|
#result is average of sum of percentages otherwise
|
|
result = sumOfPercentages / denominator
|
|
|
|
passedRoll = (result >= neededPercentageToPass)
|
|
|
|
showOnUI(passedRoll, result)
|
|
return result
|
|
|
|
|
|
#Reset stored values and text
|
|
func _on_Reset_pressed():
|
|
$Outcome.hide()
|
|
$PercentNeeded.hide()
|
|
$PercentRolled.hide()
|
|
$DegreeOfSuccess.hide()
|
|
$RolledValues.hide()
|
|
|
|
#Fill diceInPlay again and empty diceUsed
|
|
for die in diceUsed:
|
|
diceInPlay.append(die)
|
|
diceUsed = []
|
|
rolledValues = []
|