| summaryrefslogtreecommitdiff |
diff options
| author | Nathanael Sensfelder <SpamShield0@MultiAgentSystems.org> | 2020-08-30 08:52:55 +0200 |
|---|---|---|
| committer | Nathanael Sensfelder <SpamShield0@MultiAgentSystems.org> | 2020-08-30 08:52:55 +0200 |
| commit | d68040d87385c360719e35941ad4f0112d9d0c03 (patch) | |
| tree | 92300e4c84a1476fe7b7bc546e323bd2264273c6 | |
| parent | 19d1cd96cc2d862869dbb852d663996a1b64bd9d (diff) | |
Fixes random number in choice generation.
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; |


