summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorNathanael Sensfelder <SpamShield0@MultiAgentSystems.org>2020-08-30 08:52:55 +0200
committerNathanael Sensfelder <SpamShield0@MultiAgentSystems.org>2020-08-30 08:52:55 +0200
commitd68040d87385c360719e35941ad4f0112d9d0c03 (patch)
tree92300e4c84a1476fe7b7bc546e323bd2264273c6
parent19d1cd96cc2d862869dbb852d663996a1b64bd9d (diff)
Fixes random number in choice generation.
-rw-r--r--data/tests/player_choices.fate13
-rw-r--r--src/core/src/tonkadur/wyrd/v1/compiler/fate/v1/ComputationCompiler.java111
-rw-r--r--src/core/src/tonkadur/wyrd/v1/compiler/fate/v1/InstructionCompiler.java41
-rw-r--r--src/core/src/tonkadur/wyrd/v1/compiler/fate/v1/SequenceCompiler.java13
-rw-r--r--src/core/src/tonkadur/wyrd/v1/compiler/util/registers/RegisterManager.java19
5 files changed, 193 insertions, 4 deletions
diff --git a/data/tests/player_choices.fate b/data/tests/player_choices.fate
index 2148863..16c4250 100644
--- a/data/tests/player_choices.fate
+++ b/data/tests/player_choices.fate
@@ -95,4 +95,17 @@
(assert (= (var i) 653) FAILED: Player Choice E, i: (var i))
+(player_choice
+ (foreach test_set e
+ (if (= (rand 0 1) 1)
+ (
+ ( Choice (var e) )
+ (
+ Chosen var e: (var e)
+ )
+ )
+ )
+ )
+)
+
(end)
diff --git a/src/core/src/tonkadur/wyrd/v1/compiler/fate/v1/ComputationCompiler.java b/src/core/src/tonkadur/wyrd/v1/compiler/fate/v1/ComputationCompiler.java
index 94e013d..f30d433 100644
--- a/src/core/src/tonkadur/wyrd/v1/compiler/fate/v1/ComputationCompiler.java
+++ b/src/core/src/tonkadur/wyrd/v1/compiler/fate/v1/ComputationCompiler.java
@@ -22,6 +22,7 @@ import tonkadur.wyrd.v1.lang.instruction.SetPC;
import tonkadur.wyrd.v1.compiler.util.BinarySearch;
import tonkadur.wyrd.v1.compiler.util.IfElse;
import tonkadur.wyrd.v1.compiler.util.If;
+import tonkadur.wyrd.v1.compiler.util.RemoveAt;
import tonkadur.wyrd.v1.compiler.util.IterativeSearch;
import tonkadur.wyrd.v1.compiler.util.CountOccurrences;
@@ -949,8 +950,114 @@ implements tonkadur.fate.v1.lang.meta.ComputationVisitor
)
)
{
- result_as_computation =
- Operation.rand(operands.get(0), operands.get(1));
+ final List<Instruction> push_rand, pop_rand;
+ final Register result, zero_holder;
+
+ push_rand = new ArrayList<Instruction>();
+ pop_rand = new ArrayList<Instruction>();
+
+ result = reserve(Type.INT);
+ zero_holder = reserve(Type.INT);
+
+ result_as_computation = result.get_value();
+ result_as_address = result.get_address();
+
+ push_rand.add
+ (
+ new SetValue
+ (
+ result_as_address,
+ Operation.rand(operands.get(0), operands.get(1))
+ )
+ );
+
+ push_rand.add
+ (
+ new SetValue
+ (
+ new RelativeAddress
+ (
+ compiler.registers().get_rand_value_holder().get_address(),
+ new Cast
+ (
+ new Size
+ (
+ compiler.registers().get_rand_value_holder
+ (
+ ).get_address()
+ ),
+ Type.STRING
+ ),
+ Type.INT
+ ),
+ result_as_computation
+ )
+ );
+
+ pop_rand.add
+ (
+ new SetValue
+ (
+ result_as_address,
+ new ValueOf
+ (
+ new RelativeAddress
+ (
+ compiler.registers().get_rand_value_holder().get_address(),
+ new Cast(Constant.ZERO, Type.STRING),
+ Type.INT
+ )
+ )
+ )
+ );
+
+ pop_rand.add(new SetValue(zero_holder.get_address(), Constant.ZERO));
+
+ pop_rand.add
+ (
+ RemoveAt.generate
+ (
+ compiler.registers(),
+ compiler.assembler(),
+ zero_holder.get_address(),
+ new Size
+ (
+ compiler.registers().get_rand_value_holder().get_address()
+ ),
+ compiler.registers().get_rand_value_holder().get_address()
+ )
+ );
+
+ init_instructions.add
+ (
+ IfElse.generate
+ (
+ compiler.registers(),
+ compiler.assembler(),
+ Operation.equals
+ (
+ compiler.registers().get_rand_mode_holder().get_value(),
+ Constant.ZERO
+ ),
+ new SetValue
+ (
+ result_as_address,
+ Operation.rand(operands.get(0), operands.get(1))
+ ),
+ IfElse.generate
+ (
+ compiler.registers(),
+ compiler.assembler(),
+ Operation.equals
+ (
+ compiler.registers().get_rand_mode_holder().get_value(),
+ Constant.ONE
+ ),
+ compiler.assembler().merge(push_rand),
+ compiler.assembler().merge(pop_rand)
+ )
+ )
+ );
}
else if
(
diff --git a/src/core/src/tonkadur/wyrd/v1/compiler/fate/v1/InstructionCompiler.java b/src/core/src/tonkadur/wyrd/v1/compiler/fate/v1/InstructionCompiler.java
index 42df895..4672f21 100644
--- a/src/core/src/tonkadur/wyrd/v1/compiler/fate/v1/InstructionCompiler.java
+++ b/src/core/src/tonkadur/wyrd/v1/compiler/fate/v1/InstructionCompiler.java
@@ -1379,6 +1379,29 @@ implements tonkadur.fate.v1.lang.meta.InstructionVisitor
)
);
+ result.add
+ (
+ new SetValue
+ (
+ compiler.registers().get_rand_mode_holder().get_address(),
+ new Constant(Type.INT, "0")
+ )
+ );
+
+ result.add
+ (
+ Clear.generate
+ (
+ compiler.registers(),
+ compiler.assembler(),
+ new Size
+ (
+ compiler.registers().get_rand_value_holder().get_address()
+ ),
+ compiler.registers().get_rand_value_holder().get_address()
+ )
+ );
+
compiler.registers().push_hierarchical_instruction_level();
for
(
@@ -1424,6 +1447,15 @@ implements tonkadur.fate.v1.lang.meta.InstructionVisitor
result.add
(
+ new SetValue
+ (
+ compiler.registers().get_rand_mode_holder().get_address(),
+ new Constant(Type.INT, "1")
+ )
+ );
+
+ result.add
+ (
compiler.assembler().mark_after
(
new SetValue
@@ -1468,6 +1500,15 @@ implements tonkadur.fate.v1.lang.meta.InstructionVisitor
result.add
(
+ new SetValue
+ (
+ compiler.registers().get_rand_mode_holder().get_address(),
+ new Constant(Type.INT, "-1")
+ )
+ );
+
+ result.add
+ (
compiler.assembler().mark_after
(
new SetPC
diff --git a/src/core/src/tonkadur/wyrd/v1/compiler/fate/v1/SequenceCompiler.java b/src/core/src/tonkadur/wyrd/v1/compiler/fate/v1/SequenceCompiler.java
index fb3119d..cf23045 100644
--- a/src/core/src/tonkadur/wyrd/v1/compiler/fate/v1/SequenceCompiler.java
+++ b/src/core/src/tonkadur/wyrd/v1/compiler/fate/v1/SequenceCompiler.java
@@ -8,6 +8,9 @@ import tonkadur.wyrd.v1.lang.meta.Instruction;
import tonkadur.wyrd.v1.lang.World;
import tonkadur.wyrd.v1.lang.Register;
+import tonkadur.wyrd.v1.lang.instruction.SetValue;
+
+import tonkadur.wyrd.v1.lang.computation.Constant;
public class SequenceCompiler
{
/* Utility Class */
@@ -122,6 +125,16 @@ public class SequenceCompiler
ic = new InstructionCompiler(compiler);
+ compiler.assembler().handle_adding_instruction
+ (
+ new SetValue
+ (
+ compiler.registers().get_rand_mode_holder().get_address(),
+ Constant.ZERO
+ ),
+ compiler.world()
+ );
+
for
(
final tonkadur.fate.v1.lang.meta.Instruction fate_instruction:
diff --git a/src/core/src/tonkadur/wyrd/v1/compiler/util/registers/RegisterManager.java b/src/core/src/tonkadur/wyrd/v1/compiler/util/registers/RegisterManager.java
index 8af7754..653fcbe 100644
--- a/src/core/src/tonkadur/wyrd/v1/compiler/util/registers/RegisterManager.java
+++ b/src/core/src/tonkadur/wyrd/v1/compiler/util/registers/RegisterManager.java
@@ -37,17 +37,22 @@ public class RegisterManager
protected final Map<String, StackableRegisterContext> context_by_name;
protected final Deque<RegisterContext> context;
protected final RegisterContext base_context, parameter_context;
- protected final Register next_pc, pc_stack, choice_number;
+ protected final Register next_pc, pc_stack;
+ protected final Register choice_number, rand_mode, rand_value;
protected int created_contexts;
public RegisterManager ()
{
base_context = new RegisterContext("base context");
parameter_context = new RegisterContext("parameter context", ".param.");
+
next_pc = base_context.reserve(Type.INT);
- choice_number = base_context.reserve(Type.INT);
pc_stack = base_context.reserve(new MapType(Type.INT));
+ choice_number = base_context.reserve(Type.INT);
+ rand_mode = base_context.reserve(Type.INT);
+ rand_value = base_context.reserve(new MapType(Type.INT));
+
context_by_name = new HashMap<String, StackableRegisterContext>();
context = new ArrayDeque<RegisterContext>();
created_contexts = 0;
@@ -75,6 +80,16 @@ public class RegisterManager
return choice_number;
}
+ public Register get_rand_mode_holder ()
+ {
+ return rand_mode;
+ }
+
+ public Register get_rand_value_holder ()
+ {
+ return rand_value;
+ }
+
public void create_stackable_context (final String context_name)
{
final StackableRegisterContext result;