/*
  Die Rolling Example II
    April 21, 1996
      Copyright 1996 Electric Communities
        All Rights Reserved Worldwide.
  */

  import ec.e.run.EInteger;
  import java.util.Random;

  public class DemoRoller
    {
    public static void main(String args[]) // Step 1
      {
      DieRoller rollerOne = new DieRoller(); // Step 2
      DieRoller rollerTwo = new DieRoller(); // Step 3

      EInteger rollerOneHash, rollerOneX; // Step 4
      EInteger rollerTwoHash, rollerTwoX; // Step 5

      rollerOne <- doDieRoll(&rollerOneHash, &rollerOneX,
        rollerTwoHash, rollerTwoX); // Step 6

      rollerTwo <- doDieRoll(&rollerTwoHash, &rollerTwoX,
        rollerOneHash, rollerOneX); // Step 7
      } // Step 8 (main is finished)
    }

  eclass DieRoller
    {
    Random randomGenerator = new Random();

    emethod doDieRoll(EDistributor myHash, EDistributor myX,
      EInteger hisHash, EInteger hisX) // Step 09, Step 10
      {

      long X = randomGenerator.nextLong(); // Step 11

      myHash <- forward(new EInteger(OneWayHash(X))); // Step 12

      ewhen hisHash (long otherHash) // Steps 13-18
        {
        myX <- forward(new EInteger(X)); // Step 19

          ewhen hisX (long otherX) // Steps 20-24
            {
            long finalResult = Combine(X, otherX); // Step 25

            System.out.println("Roll result = " + finalResult);

            if (OneWayHash(otherX) != otherHash) {
              System.out.println("There was cheating.");
              }
            }
         }
      }

    long OneWayHash(long a) /* Placeholder function */
    {
      return (a);
    }

    long Combine(long a, long b)
    {
      return (((a ^ b) % 6) + 1);
    }
  }