Ejemplo n.º 1
0
            public long Evaluate(
                EnemyObjectExpressionInfo enemyObjectExpressionInfo,                 // nullable
                long playerXMillis,
                long playerYMillis,
                long elapsedMillisecondsPerIteration,
                IDTDeterministicRandom rng)
            {
                long randomExclusiveBound = this.operand.Evaluate(
                    enemyObjectExpressionInfo: enemyObjectExpressionInfo,
                    playerXMillis: playerXMillis,
                    playerYMillis: playerYMillis,
                    elapsedMillisecondsPerIteration: elapsedMillisecondsPerIteration,
                    rng: rng);

                if (randomExclusiveBound <= 0)
                {
                    throw new Exception();
                }

                long randomByte1 = rng.NextInt(128);
                long randomByte2 = rng.NextInt(256);
                long randomByte3 = rng.NextInt(256);
                long randomByte4 = rng.NextInt(256);
                long randomByte5 = rng.NextInt(256);
                long randomByte6 = rng.NextInt(256);
                long randomByte7 = rng.NextInt(256);
                long randomByte8 = rng.NextInt(256);
                long randomLong  =
                    (randomByte1 << 56)
                    | (randomByte2 << 48)
                    | (randomByte3 << 40)
                    | (randomByte4 << 32)
                    | (randomByte5 << 24)
                    | (randomByte6 << 16)
                    | (randomByte7 << 8)
                    | (randomByte8);

                if (randomLong < 0)
                {
                    randomLong = unchecked (-randomLong);
                }

                if (randomLong < 0)
                {
                    randomLong = 0;
                }

                if (randomExclusiveBound == 1)
                {
                    return(0);
                }

                // Note that this isn't perfectly uniform for large values of randomExclusiveBound
                // but it'll decent enough for now.
                long randomVal = randomLong % randomExclusiveBound;

                return(randomVal);
            }