示例#1
0
        public override DmlObject CallDynamic(int argCount, Stack<DmlObject> stack, DmlObject bullet, DmlSystem system)
        {
            var time = (DmlObject)(stack.Pop());
            var period = (DmlObject)(stack.Pop());
            var start = (DmlObject)(stack.Pop());
            var max = (DmlObject)(stack.Pop());
            var min = (DmlObject)(stack.Pop());

            if (min.Type != DmlType.Number)
                throw DmlSyntaxError.BadArgumentType(Name, 1, DmlType.Number, min.Type);

            if (max.Type != DmlType.Number)
                throw DmlSyntaxError.BadArgumentType(Name, 2, DmlType.Number, max.Type);

            if (start.Type != DmlType.Number)
                throw DmlSyntaxError.BadArgumentType(Name, 3, DmlType.Number, start.Type);

            if (period.Type != DmlType.Number)
                throw DmlSyntaxError.BadArgumentType(Name, 4, DmlType.Number, period.Type);

            if (time.Type != DmlType.Number)
                throw DmlSyntaxError.BadArgumentType(Name, 5, DmlType.Number, time.Type);

            return new DmlObject(DmlType.Number, _squareWave(
                (double)(min.Value),
                (double)(max.Value),
                (double)(start.Value),
                (double)(period.Value),
                (double)(time.Value)
                ));
        }
示例#2
0
 public override DmlObject CallDynamic(int argCount, Stack<DmlObject> stack, DmlObject bullet, DmlSystem system)
 {
     var list = new List<DmlObject>();
     for (int i = 0; i < argCount; i++)
         list.Add(stack.Pop());
     list.Reverse(); // We have to reverse it since we pop the objects from the stack in reverse order.
     return new DmlObject(DmlType.List, list);
 }
示例#3
0
 public override DmlObject CallDynamic(int argCount, Stack<DmlObject> stack, DmlObject bullet, DmlSystem system)
 {
     DmlObject top = stack.Pop();
     if (top.Type != DmlType.Vector)
         throw DmlSyntaxError.BadArgumentType(Name, 1, DmlType.Vector, top.Type);
     Vector2 vec = (Vector2)(top.Value);
     return new DmlObject(DmlType.Number, Math.Atan2(vec.Y, vec.X));
 }
示例#4
0
 public void SetVar(string name, DmlObject obj)
 {
     if (name[0] == '"')
         name = name.Substring(1);
     if (name[name.Length - 1] == '"')
         name = name.Substring(0, name.Length - 1);
     BoundVars[name] = obj;
 }
示例#5
0
 public override DmlObject CallDynamic(int argCount, Stack<DmlObject> stack, DmlObject bullet, DmlSystem system)
 {
     DmlObject timeObj = stack.Pop();
     if (timeObj.Type != DmlType.Number)
         throw DmlSyntaxError.BadArgumentType(Name, 1, DmlType.Number, timeObj.Type);
     double time = (double)(timeObj.Value);
     double ltime = ((DmlBullet)bullet.Value).LocalTime;
     return new DmlObject(DmlType.Bool, ltime >= time);
 }
示例#6
0
 public override DmlObject CallTypeSafe(int argCount, Stack<DmlObject> stack, DmlObject bullet, DmlSystem system)
 {
     var time = (double)(stack.Pop().Value);
     var period = (double)(stack.Pop().Value);
     var start = (double)(stack.Pop().Value);
     var max = (double)(stack.Pop().Value);
     var min = (double)(stack.Pop().Value);
     return new DmlObject(DmlType.Number, _squareWave(min, max, start, period, time));
 }
示例#7
0
        public DmlObject Instantiate(Vector2 Position, DmlSystem system)
        {
            DmlBullet bullet = new DmlBullet(Position, this);
            DmlObject bulletObject = new DmlObject(DmlType.Bullet, bullet);
            bullet.SetObject(bulletObject);

            // Execute the initialziation code.
            Init.Execute(bulletObject, system);

            return bulletObject;
        }
示例#8
0
        public void Execute(DmlObject bullet, DmlSystem system)
        {
            // The command stack.
            Stack<DmlObject> stack = new Stack<DmlObject>();

            // The variables local to this code block.
            Dictionary<string, DmlObject> locals = new Dictionary<string, DmlObject>();

            while (currentPosition < Instructions.Length)
                Instructions[currentPosition++].Perform(this, stack, locals, bullet, system);
            currentPosition = 0;
        }
示例#9
0
        public void Execute(DmlObject bullet, DmlSystem system)
        {
            // The command stack.
            Stack<DmlObject> stack = new Stack<DmlObject>();

            // The variables local to this code block.
            Dictionary<string, DmlObject> locals = new Dictionary<string, DmlObject>();

            while (currentPosition < Instructions.Length)
                Instructions[currentPosition++].Perform(this, stack, locals, bullet, system);
            currentPosition = 0;
        }
示例#10
0
 public void SetVar(string name, DmlObject obj)
 {
     if (name[0] == '"')
     {
         name = name.Substring(1);
     }
     if (name[name.Length - 1] == '"')
     {
         name = name.Substring(0, name.Length - 1);
     }
     BoundVars[name] = obj;
 }
示例#11
0
            public override DmlObject CallDynamic(int argCount, Stack <DmlObject> stack, DmlObject bullet, DmlSystem system)
            {
                var       option = new DmlObject(DmlType.Option, null);
                DmlObject nextArg;

                for (int i = 0; i < argCount; i++)
                {
                    nextArg = stack.Pop();
                    option.BoundVars[Parameters[i]] = nextArg;
                }
                return(option);
            }
示例#12
0
		public DmlObject Evaluate(DmlObject bullet, DmlSystem system)
		{
			// The command stack.
			Stack<DmlObject> stack = new Stack<DmlObject>();

			// The variables local to this code block.
			Dictionary<string, DmlObject> locals = new Dictionary<string, DmlObject>();

            while (currentPosition < Instructions.Length)
                Instructions[currentPosition++].Perform(this, stack, locals, bullet, system);
            currentPosition = 0;
            return stack.Count == 0 ? null : stack.Pop();
		}
示例#13
0
        public DmlObject Evaluate(DmlObject bullet, DmlSystem system)
        {
            // The command stack.
            Stack<DmlObject> stack = new Stack<DmlObject>();

            // The variables local to this code block.
            Dictionary<string, DmlObject> locals = new Dictionary<string, DmlObject>();

            while (currentPosition < Instructions.Length)
                Instructions[currentPosition++].Perform(this, stack, locals, bullet, system);
            currentPosition = 0;
            return stack.Count == 0 ? null : stack.Pop();
        }
示例#14
0
        public override DmlObject CallDynamic(int argCount, Stack<DmlObject> stack, DmlObject bullet, DmlSystem system)
        {
            DmlObject second = stack.Pop();
            DmlObject first = stack.Pop();

            switch (first.Type)
            {
                case DmlType.Number:
                    switch (second.Type)
                    {
                        case DmlType.Number:
                            return new DmlObject(DmlType.Number, Math.Atan2((double)first.Value, (double)second.Value));
                        default:
                            throw DmlSyntaxError.BadArgumentType(Name, 2, DmlType.Number, second.Type);
                    }
                default:
                    throw DmlSyntaxError.BadArgumentType(Name, 1, DmlType.Number, first.Type);
            }
        }
示例#15
0
 public override DmlObject CallDynamic(int argCount, Stack<DmlObject> stack, DmlObject bullet, DmlSystem system)
 {
     DmlObject top = stack.Pop();
     if (top.Type != DmlType.Vector)
         throw DmlSyntaxError.BadArgumentType(Name, 1, DmlType.Vector, top.Type);
     Vector2 vec = (Vector2)(top.Value);
     return new DmlObject(DmlType.Number, (double)Vector2.DistanceSquared(vec, Vector2.Zero));
 }
示例#16
0
 public override DmlObject CallTypeSafe(int argCount, Stack<DmlObject> stack, DmlObject bullet, DmlSystem system)
 {
     double amt = (double)(stack.Pop().Value);
     Vector2 end = (Vector2)(stack.Pop().Value);
     Vector2 start = (Vector2)(stack.Pop().Value);
     return new DmlObject(DmlType.Vector, Vector2.Lerp(start, end, (float)amt));
 }
示例#17
0
        public override DmlObject CallDynamic(int argCount, Stack<DmlObject> stack, DmlObject bullet, DmlSystem system)
        {
            DmlObject amtObj = stack.Pop();
            DmlObject endObj = stack.Pop();
            DmlObject startObj = stack.Pop();

            if (startObj.Type != DmlType.Vector)
                throw DmlSyntaxError.BadArgumentType(Name, 1, DmlType.Vector, startObj.Type);

            if (endObj.Type != DmlType.Vector)
                throw DmlSyntaxError.BadArgumentType(Name, 2, DmlType.Vector, endObj.Type);

            if (amtObj.Type != DmlType.Number)
                throw DmlSyntaxError.BadArgumentType(Name, 2, DmlType.Number, amtObj.Type);

            double amt = (double)(amtObj.Value);
            Vector2 end = (Vector2)(endObj.Value);
            Vector2 start = (Vector2)(startObj.Value);
            return new DmlObject(DmlType.Vector, Vector2.Lerp(start, end, (float)amt));
        }
示例#18
0
 public override DmlObject CallTypeSafe(int argCount, Stack<DmlObject> stack, DmlObject bullet, DmlSystem system)
 {
     Vector2 top = (Vector2)(stack.Pop().Value);
     return new DmlObject(DmlType.Number, 180/Math.PI*Math.Atan2(top.Y, top.X));
 }
示例#19
0
 public override DmlObject CallTypeSafe(int argCount, Stack<DmlObject> stack, DmlObject bullet, DmlSystem system)
 {
     double end = (double)(stack.Pop().Value);
     double start = (double)(stack.Pop().Value);
     double ltime = ((DmlBullet)bullet.Value).LocalTime;
     return new DmlObject(DmlType.Bool, start <= ltime && ltime < end);
 }
示例#20
0
 public override DmlObject CallTypeSafe(int argCount, Stack<DmlObject> stack, DmlObject bullet, DmlSystem system)
 {
     double y = (double)(stack.Pop().Value);
     double x = (double)(stack.Pop().Value);
     return new DmlObject(DmlType.Vector, new Vector2((float)x, (float)y));
 }
示例#21
0
 public override DmlObject CallTypeSafe(int argCount, Stack<DmlObject> stack, DmlObject bullet, DmlSystem system)
 {
     Vector2 top = (Vector2)(stack.Pop().Value);
     top.Normalize();
     return new DmlObject(DmlType.Vector, top);
 }
示例#22
0
        public override DmlObject CallDynamic(int argCount, Stack<DmlObject> stack, DmlObject bullet, DmlSystem system)
        {
            DmlObject second = stack.Pop();
            DmlObject first = stack.Pop();

            if (first.Type != DmlType.Vector)
                throw DmlSyntaxError.BadArgumentType(Name, 1, DmlType.Vector, first.Type);

            if (second.Type != DmlType.Number)
                throw DmlSyntaxError.BadArgumentType(Name, 1, DmlType.Number, second.Type);

            double angle = Math.PI/180*(double)(second.Value);
            Vector2 vec = (Vector2)(first.Value);
            float x = vec.X;
            float y = vec.Y;
            float cos = (float)Math.Cos(angle);
            float sin = (float)Math.Sin(angle);
            var newVec = new Vector2(x * cos - y * sin, x * sin + y * cos);
            newVec.Normalize(); // This avoids rounding errors that cause the bullets to eventually speed up.
            return new DmlObject(DmlType.Vector, newVec);
        }
示例#23
0
 public override DmlObject CallTypeSafe(int argCount, Stack<DmlObject> stack, DmlObject bullet, DmlSystem system)
 {
     double angle = Math.PI/180*(double)(stack.Pop().Value);
     return new DmlObject(DmlType.Vector, new Vector2((float)Math.Cos(angle), (float)Math.Sin(angle)));
 }
示例#24
0
 public override DmlObject CallDynamic(int argCount, Stack<DmlObject> stack, DmlObject bullet, DmlSystem system)
 {
     DmlObject timeObj = stack.Pop();
     if (timeObj.Type != DmlType.Number)
         throw DmlSyntaxError.BadArgumentType(Name, 1, DmlType.Number, timeObj.Type);
     double time = (double)(timeObj.Value);
     double ltime = system.GlobalTime;
     return new DmlObject(DmlType.Bool, time <= ltime && ltime < time + Globals.deltaTime);
 }
示例#25
0
 /// <summary>
 /// Call this function. Unlike CallDynamic, this assumes the types on the stack are safe (i.e.
 /// they satisfy CompatibleWithArgTypes.
 ///
 /// By default this just defers to CallDynamic, but this can be override in child classes. The
 /// point is that CallTypeSafe is supposed to be faster than CallDynamic because it doesn't have
 /// to check the types of the items on the stack, it can instead directly cast the DmlObjects
 /// to their C# types.
 /// </summary>
 /// <param name="argCount"></param>
 /// <param name="stack"></param>
 /// <param name="bullet"></param>
 /// <param name="system"></param>
 /// <returns></returns>
 public virtual DmlObject CallTypeSafe(int argCount, Stack <DmlObject> stack, DmlObject bullet, DmlSystem system)
 {
     return(CallDynamic(argCount, stack, bullet, system));
 }
示例#26
0
        public override DmlObject CallDynamic(int argCount, Stack<DmlObject> stack, DmlObject bullet, DmlSystem system)
        {
            DmlObject top;
            string msg = "";
            for (int i = 0; i < argCount; i++)
            {
                top = stack.Pop();
                msg += top.Value.ToString();
                if (i != argCount - 1)
                    msg += " ";

            }
            Console.WriteLine(msg);
            return null;
        }
示例#27
0
 public override DmlObject CallTypeSafe(int argCount, Stack<DmlObject> stack, DmlObject bullet, DmlSystem system)
 {
     Vector2 top = (Vector2)(stack.Pop().Value);
     return new DmlObject(DmlType.Number, (double)Vector2.DistanceSquared(top, Vector2.Zero));
 }
示例#28
0
        public override DmlObject CallTypeSafe(int argCount, Stack<DmlObject> stack, DmlObject bullet, DmlSystem system)
        {
            double start, end, interval, ltime;
            switch (argCount)
            {
                case 1:
                    interval = (double)(stack.Pop().Value);
                    ltime = system.GlobalTime;

                    return new DmlObject(DmlType.Bool, (ltime % (2 * interval)) < interval);
                case 3:
                    end = (double)(stack.Pop().Value);
                    start = (double)(stack.Pop().Value);
                    interval = (double)(stack.Pop().Value);

                    ltime = system.GlobalTime;
                    double t2 = ltime - start;
                    return new DmlObject(DmlType.Bool,
                        (t2 >= 0 && ltime <= end) && (t2 % (2 * interval)) < interval);
                default:
                    return null; // Should never get here.
            }
        }
示例#29
0
 /// <summary>
 /// Call this function. CallDynamic does not assume the types of the objects on the stack are
 /// safe for use by the function. CallTypeSafe does.
 /// </summary>
 /// <param name="argCount"></param>
 /// <param name="stack"></param>
 /// <param name="bullet"></param>
 /// <param name="system"></param>
 /// <returns></returns>
 public abstract DmlObject CallDynamic(int argCount, Stack <DmlObject> stack, DmlObject bullet, DmlSystem system);
示例#30
0
        public override DmlObject CallDynamic(int argCount, Stack<DmlObject> stack, DmlObject bullet, DmlSystem system)
        {
            DmlObject endObj = stack.Pop();
            DmlObject startObj = stack.Pop();

            if (startObj.Type != DmlType.Number)
                throw DmlSyntaxError.BadArgumentType(Name, 1, DmlType.Number, startObj.Type);

            if (endObj.Type != DmlType.Number)
                throw DmlSyntaxError.BadArgumentType(Name, 2, DmlType.Number, endObj.Type);

            double end = (double)(endObj.Value);
            double start = (double)(startObj.Value);
            double ltime = ((DmlBullet)bullet.Value).LocalTime;
            return new DmlObject(DmlType.Bool, start <= ltime && ltime < end);
        }
示例#31
0
 public override DmlObject CallDynamic(int argCount, Stack<DmlObject> stack, DmlObject bullet, DmlSystem system)
 {
     DmlObject top = stack.Pop();
     if (top.Type != DmlType.Number)
         throw DmlSyntaxError.BadArgumentType(Name, 1, DmlType.Number, top.Type);
     double angle = Math.PI/180*(double)(top.Value);
     return new DmlObject(DmlType.Vector, new Vector2((float)Math.Cos(angle), (float)Math.Sin(angle)));
 }
示例#32
0
        public override DmlObject CallDynamic(int argCount, Stack<DmlObject> stack, DmlObject bullet, DmlSystem system)
        {
            DmlObject second = stack.Pop();
            DmlObject first = stack.Pop();

            if (first.Type != DmlType.Number)
                throw DmlSyntaxError.BadArgumentType(Name, 1, DmlType.Number, first.Type);

            if (second.Type != DmlType.Number)
                throw DmlSyntaxError.BadArgumentType(Name, 2, DmlType.Number, second.Type);

            double y = (double)(second.Value);
            double x = (double)(first.Value);

            return new DmlObject(DmlType.Vector, new Vector2((float)x, (float)y));
        }
示例#33
0
 public override DmlObject CallTypeSafe(int argCount, Stack<DmlObject> stack, DmlObject bullet, DmlSystem system)
 {
     Vector2 top = (Vector2)(stack.Pop().Value);
     return new DmlObject(DmlType.Vector, new Vector2(top.Y, -top.X));
 }
示例#34
0
 public override DmlObject CallTypeSafe(int argCount, Stack<DmlObject> stack, DmlObject bullet, DmlSystem system)
 {
     double time = (double)(stack.Pop().Value);
     double ltime = system.GlobalTime;
     return new DmlObject(DmlType.Bool, ltime < time);
 }
示例#35
0
 public override DmlObject CallTypeSafe(int argCount, Stack<DmlObject> stack, DmlObject bullet, DmlSystem system)
 {
     double angle = Math.PI/180*(double)(stack.Pop().Value);
     Vector2 vec = (Vector2)(stack.Pop().Value);
     float x = vec.X;
     float y = vec.Y;
     float cos = (float)Math.Cos(angle);
     float sin = (float)Math.Sin(angle);
     var newVec = new Vector2(x * cos - y * sin, x * sin + y * cos);
     newVec.Normalize(); // This avoids rounding errors that cause the bullets to eventually speed up.
     return new DmlObject(DmlType.Vector, newVec);
 }
示例#36
0
        public override DmlObject CallDynamic(int argCount, Stack<DmlObject> stack, DmlObject bullet, DmlSystem system)
        {
            DmlObject intervalObj;
            double start, end, interval, ltime;
            switch (argCount)
            {
                case 1:
                    intervalObj = stack.Pop();

                    if (intervalObj.Type != DmlType.Number)
                        throw DmlSyntaxError.BadArgumentType(Name, 1, DmlType.Number, intervalObj.Type);

                    interval = (double)(stack.Pop().Value);
                    ltime = system.GlobalTime;
                    return new DmlObject(DmlType.Bool, (ltime % (2 * interval)) < interval);
                case 3:
                    DmlObject endObj = stack.Pop();
                    DmlObject startObj = stack.Pop();
                    intervalObj = stack.Pop();

                    if (intervalObj.Type != DmlType.Number)
                        throw DmlSyntaxError.BadArgumentType(Name, 1, DmlType.Number, intervalObj.Type);

                    if (startObj.Type != DmlType.Number)
                        throw DmlSyntaxError.BadArgumentType(Name, 2, DmlType.Number, startObj.Type);

                    if (endObj.Type != DmlType.Number)
                        throw DmlSyntaxError.BadArgumentType(Name, 3, DmlType.Number, endObj.Type);

                    end = (double)(stack.Pop().Value);
                    start = (double)(stack.Pop().Value);
                    interval = (double)(stack.Pop().Value);
                    ltime = system.GlobalTime;
                    double t2 = ltime - start;
                    return new DmlObject(DmlType.Bool,
                        (t2 >= 0 && ltime <= end) && (t2 % (2 * interval)) < interval);
                default:
                    return null; // Should never get here.
            }
        }