70 lines
2.1 KiB
Text
70 lines
2.1 KiB
Text
% This program needs to be merged with PCLU's "misc" library
|
|
% to use the random number generator.
|
|
%
|
|
% pclu -merge $CLUHOME/lib/misc.lib -compile rpg_gen.clu
|
|
|
|
% Seed the random number generator with the current time
|
|
init_rng = proc ()
|
|
d: date := now()
|
|
seed: int := ((d.hour*60) + d.minute)*60 + d.second
|
|
random$seed(seed)
|
|
end init_rng
|
|
|
|
character = cluster is generate
|
|
rep = null
|
|
|
|
% Roll a die
|
|
roll_die = proc () returns (int)
|
|
return (1 + random$next(6))
|
|
end roll_die
|
|
|
|
% Roll four dice and get the sum of the highest three rolls
|
|
roll_four_times = proc () returns (int)
|
|
lowest: int := 7 % higher than any dice roll
|
|
sum: int := 0
|
|
for i: int in int$from_to(1,4) do
|
|
roll: int := roll_die()
|
|
sum := sum + roll
|
|
if roll < lowest then lowest := roll end
|
|
end
|
|
return (sum - lowest)
|
|
end roll_four_times
|
|
|
|
% Try to generate a character by rolling six values
|
|
try_generate = proc () returns (sequence[int])
|
|
rolls: sequence[int] := sequence[int]$[]
|
|
for i: int in int$from_to(1,6) do
|
|
rolls := sequence[int]$addh(rolls, roll_four_times())
|
|
end
|
|
return (rolls)
|
|
end try_generate
|
|
|
|
% See if a character is valid
|
|
valid = proc (c: sequence[int]) returns (bool)
|
|
total: int := 0
|
|
at_least_15: int := 0
|
|
for i: int in sequence[int]$elements(c) do
|
|
total := total + i
|
|
if i >= 15 then at_least_15 := at_least_15 + 1 end
|
|
end
|
|
return (total >= 75 & at_least_15 >= 2)
|
|
end valid
|
|
|
|
% Generate a character
|
|
generate = proc () returns (sequence[int])
|
|
while true do
|
|
c: sequence[int] := try_generate()
|
|
if valid(c) then return(c) end
|
|
end
|
|
end generate
|
|
end character
|
|
|
|
% Generate a character and display the six values
|
|
start_up = proc ()
|
|
po: stream := stream$primary_output()
|
|
init_rng()
|
|
hero: sequence[int] := character$generate()
|
|
for stat: int in sequence[int]$elements(hero) do
|
|
stream$putright(po, int$unparse(stat), 4)
|
|
end
|
|
end start_up
|