csharp/ACEmulator/ACE/Source/ACE.Server/Entity/Mutations/EffectArgumentOp.cs

EffectArgumentOp.cs
using log4net;

using ACE.Ensaty.Enum;

namespace ACE.Server.Ensaty.Mutations
{
    public partial clast EffectArgument
    {
        private static readonly ILog log = LogManager.GetLogger(System.Reflection.MethodBase.GetCurrentMethod().DeclaringType);

        public static EffectArgument operator +(EffectArgument a, EffectArgument b)
        {
            switch (a.Type)
            {
                case EffectArgumentType.Double:

                    switch (b.Type)
                    {
                        case EffectArgumentType.Double:
                            return new EffectArgument(a.DoubleVal + b.DoubleVal);
                        case EffectArgumentType.Int:
                            return new EffectArgument(a.DoubleVal + b.IntVal);
                        case EffectArgumentType.Int64:
                            return new EffectArgument(a.DoubleVal + b.LongVal);
                    }
                    break;

                case EffectArgumentType.Int:

                    switch (b.Type)
                    {
                        case EffectArgumentType.Double:
                            return new EffectArgument((int)(a.IntVal + b.DoubleVal));
                        case EffectArgumentType.Int:
                            return new EffectArgument(a.IntVal + b.IntVal);
                        case EffectArgumentType.Int64:
                            return new EffectArgument((int)(a.IntVal + b.LongVal));
                    }
                    break;

                case EffectArgumentType.Int64:

                    switch (b.Type)
                    {
                        case EffectArgumentType.Double:
                            return new EffectArgument((long)(a.LongVal + b.DoubleVal));
                        case EffectArgumentType.Int:
                            return new EffectArgument(a.LongVal + b.IntVal);
                        case EffectArgumentType.Int64:
                            return new EffectArgument(a.LongVal + b.LongVal);
                    }
                    break;
            }

            log.Error($"EffectArgument.Add() - invalid type {a.Type}, {b.Type}");

            return null;
        }

        public static EffectArgument operator -(EffectArgument a, EffectArgument b)
        {
            switch (a.Type)
            {
                case EffectArgumentType.Double:

                    switch (b.Type)
                    {
                        case EffectArgumentType.Double:
                            return new EffectArgument(a.DoubleVal - b.DoubleVal);
                        case EffectArgumentType.Int:
                            return new EffectArgument(a.DoubleVal - b.IntVal);
                        case EffectArgumentType.Int64:
                            return new EffectArgument(a.DoubleVal - b.LongVal);
                    }
                    break;

                case EffectArgumentType.Int:

                    switch (b.Type)
                    {
                        case EffectArgumentType.Double:
                            return new EffectArgument((int)(a.IntVal - b.DoubleVal));
                        case EffectArgumentType.Int:
                            return new EffectArgument(a.IntVal - b.IntVal);
                        case EffectArgumentType.Int64:
                            return new EffectArgument((int)(a.IntVal - b.LongVal));
                    }
                    break;

                case EffectArgumentType.Int64:

                    switch (b.Type)
                    {
                        case EffectArgumentType.Double:
                            return new EffectArgument((long)(a.LongVal - b.DoubleVal));
                        case EffectArgumentType.Int:
                            return new EffectArgument(a.LongVal - b.IntVal);
                        case EffectArgumentType.Int64:
                            return new EffectArgument(a.LongVal - b.LongVal);
                    }
                    break;
            }

            log.Error($"EffectArgument.Subtract() - invalid type {a.Type}, {b.Type}");

            return null;
        }

        public static EffectArgument operator *(EffectArgument a, EffectArgument b)
        {
            switch (a.Type)
            {
                case EffectArgumentType.Double:

                    switch (b.Type)
                    {
                        case EffectArgumentType.Double:
                            return new EffectArgument(a.DoubleVal * b.DoubleVal);
                        case EffectArgumentType.Int:
                            return new EffectArgument(a.DoubleVal * b.IntVal);
                        case EffectArgumentType.Int64:
                            return new EffectArgument(a.DoubleVal * b.LongVal);
                    }
                    break;

                case EffectArgumentType.Int:

                    switch (b.Type)
                    {
                        case EffectArgumentType.Double:
                            return new EffectArgument((int)(a.IntVal * b.DoubleVal));
                        case EffectArgumentType.Int:
                            return new EffectArgument(a.IntVal * b.IntVal);
                        case EffectArgumentType.Int64:
                            return new EffectArgument((int)(a.IntVal * b.LongVal));
                    }
                    break;

                case EffectArgumentType.Int64:

                    switch (b.Type)
                    {
                        case EffectArgumentType.Double:
                            return new EffectArgument((long)(a.LongVal * b.DoubleVal));
                        case EffectArgumentType.Int:
                            return new EffectArgument(a.LongVal * b.IntVal);
                        case EffectArgumentType.Int64:
                            return new EffectArgument(a.LongVal * b.LongVal);
                    }
                    break;
            }

            log.Error($"EffectArgument.Multiply() - invalid type {a.Type}, {b.Type}");

            return null;
        }

        public static EffectArgument operator /(EffectArgument a, EffectArgument b)
        {
            switch (a.Type)
            {
                case EffectArgumentType.Double:

                    switch (b.Type)
                    {
                        case EffectArgumentType.Double:
                            return b.DoubleVal != 0 ? new EffectArgument(a.DoubleVal / b.DoubleVal) : a;
                        case EffectArgumentType.Int:
                            return b.IntVal != 0 ? new EffectArgument(a.DoubleVal / b.IntVal) : a;
                        case EffectArgumentType.Int64:
                            return b.LongVal != 0 ? new EffectArgument(a.DoubleVal / b.LongVal) : a;
                    }
                    break;

                case EffectArgumentType.Int:

                    switch (b.Type)
                    {
                        case EffectArgumentType.Double:
                            return b.DoubleVal != 0 ? new EffectArgument((int)(a.IntVal / b.DoubleVal)) : a;
                        case EffectArgumentType.Int:
                            return b.IntVal != 0 ? new EffectArgument(a.IntVal / b.IntVal) : a;
                        case EffectArgumentType.Int64:
                            return b.LongVal != 0 ? new EffectArgument((int)(a.IntVal / b.LongVal)) : a;
                    }
                    break;

                case EffectArgumentType.Int64:

                    switch (b.Type)
                    {
                        case EffectArgumentType.Double:
                            return b.DoubleVal != 0 ? new EffectArgument((long)(a.LongVal / b.DoubleVal)): a;
                        case EffectArgumentType.Int:
                            return b.IntVal != 0 ? new EffectArgument(a.LongVal / b.IntVal) : a;
                        case EffectArgumentType.Int64:
                            return b.LongVal != 0 ? new EffectArgument(a.LongVal / b.LongVal) : a;
                    }
                    break;
            }

            log.Error($"EffectArgument.Divide() - invalid type {a.Type}, {b.Type}");

            return null;
        }

        public static bool operator (EffectArgument a, EffectArgument b)
        {
            if (a.Type != b.Type)
            {
                log.Error($"EffectArgument.GreaterThan() - type mismatch {a.Type} {b.Type}");
                return false;
            }

            switch (a.Type)
            {
                case EffectArgumentType.Double:
                    return a.DoubleVal > b.DoubleVal;

                case EffectArgumentType.Int:
                    return a.IntVal > b.IntVal;

                case EffectArgumentType.Int64:
                    return a.LongVal > b.LongVal;
            }
            return false;
        }
    }
}