41 lines
1.1 KiB
PHP
41 lines
1.1 KiB
PHP
<?php
|
||
|
||
class CharacterGenerator {
|
||
public static function roll(): array
|
||
{
|
||
$attributes = array_map(fn($stat) => self::rollStat(), range(1, 6));
|
||
|
||
if (!self::meetsRequirements($attributes)) {
|
||
return self::roll();
|
||
}
|
||
|
||
return $attributes;
|
||
}
|
||
|
||
private static function rollStat(): int
|
||
{
|
||
$rolls = d(6, 4);
|
||
return array_sum($rolls) - min($rolls);
|
||
}
|
||
|
||
private static function meetsRequirements(array $attributes): bool
|
||
{
|
||
$twoOrMoreOverFifteen = array_reduce($attributes, fn($n, $stat) => $n + ($stat > 15)) >= 2;
|
||
$sumOfAttributesMeetsMinimum = array_sum($attributes) >= 75;
|
||
|
||
return $sumOfAttributesMeetsMinimum && $twoOrMoreOverFifteen;
|
||
}
|
||
}
|
||
|
||
function d(int $d, int $numberToRoll): array
|
||
{
|
||
return array_map(fn($roll) => rand(1, $d), range(1, $numberToRoll));
|
||
}
|
||
|
||
$characterAttributes = CharacterGenerator::roll();
|
||
$attributesString = implode(', ', $characterAttributes);
|
||
$attributesTotal = array_sum($characterAttributes);
|
||
|
||
print "Attribute Total: $attributesTotal\n";
|
||
print "Attributes: $attributesString";
|