Example #1
0
        public void TestGetRandomItemTypeCode(string expectedRawcode, ItemClass itemClass, int level)
        {
            var actualTypeCode = RandomItemProvider.GetRandomItemTypeCode(itemClass, level);

            Assert.AreEqual(expectedRawcode, actualTypeCode.ToRawcode());

            Assert.IsTrue(RandomItemProvider.IsRandomItem(actualTypeCode, out var actualItemClass, out var actualLevel));
            Assert.AreEqual(itemClass, actualItemClass);
            Assert.AreEqual(level, actualLevel);
        }
Example #2
0
        public static JassFunctionDeclarationSyntax CreateAllItems(MapUnits mapUnits)
        {
            const string LocalItemIdVariableName = "itemID";

            var statements = new List <IStatementSyntax>();

            statements.Add(SyntaxFactory.LocalVariableDeclarationStatement(JassTypeSyntax.Integer, LocalItemIdVariableName));

            foreach (var item in mapUnits.Units.Where(item => item.IsItem() && !item.IsPlayerStartLocation()))
            {
                if (item.IsRandomItem())
                {
                    var randomData = item.RandomData;
                    switch (randomData)
                    {
                    case RandomUnitAny randomUnitAny:
                        statements.Add(SyntaxFactory.SetStatement(
                                           LocalItemIdVariableName,
                                           SyntaxFactory.InvocationExpression(
                                               nameof(ChooseRandomItemEx),
                                               SyntaxFactory.InvocationExpression(nameof(ConvertItemType), SyntaxFactory.LiteralExpression((int)randomUnitAny.Class)),
                                               SyntaxFactory.LiteralExpression(randomUnitAny.Level))));

                        break;

                    case RandomUnitGlobalTable randomUnitGlobalTable:
                        break;

                    case RandomUnitCustomTable randomUnitCustomTable:
                        statements.Add(SyntaxFactory.CallStatement(nameof(War3Api.Blizzard.RandomDistReset)));

                        var summedChance = 0;
                        foreach (var randomItem in randomUnitCustomTable.RandomUnits)
                        {
                            IExpressionSyntax id = RandomItemProvider.IsRandomItem(randomItem.UnitId, out var itemClass, out var level)
                                    ? SyntaxFactory.InvocationExpression(
                                nameof(ChooseRandomItemEx),
                                SyntaxFactory.InvocationExpression(nameof(ConvertItemType), SyntaxFactory.LiteralExpression((int)itemClass)),
                                SyntaxFactory.LiteralExpression(level))
                                    : SyntaxFactory.FourCCLiteralExpression(randomItem.UnitId);

                            statements.Add(SyntaxFactory.CallStatement(
                                               nameof(War3Api.Blizzard.RandomDistAddItem),
                                               id,
                                               SyntaxFactory.LiteralExpression(randomItem.Chance)));

                            summedChance += randomItem.Chance;
                        }

                        if (summedChance < 100)
                        {
                            statements.Add(SyntaxFactory.CallStatement(
                                               nameof(War3Api.Blizzard.RandomDistAddItem),
                                               SyntaxFactory.LiteralExpression(-1),
                                               SyntaxFactory.LiteralExpression(100 - summedChance)));
                        }

                        statements.Add(SyntaxFactory.SetStatement(
                                           LocalItemIdVariableName,
                                           SyntaxFactory.InvocationExpression(nameof(War3Api.Blizzard.RandomDistChoose))));

                        break;

                    default:
                        break;
                    }

                    statements.Add(SyntaxFactory.IfStatement(
                                       SyntaxFactory.BinaryNotEqualsExpression(SyntaxFactory.VariableReferenceExpression(LocalItemIdVariableName), SyntaxFactory.LiteralExpression(-1)),
                                       SyntaxFactory.CallStatement(
                                           nameof(CreateItem),
                                           SyntaxFactory.VariableReferenceExpression(LocalItemIdVariableName),
                                           SyntaxFactory.LiteralExpression(item.Position.X),
                                           SyntaxFactory.LiteralExpression(item.Position.Y))));
                }
                else
                {
                    var args = new List <IExpressionSyntax>()
                    {
                        SyntaxFactory.FourCCLiteralExpression(item.TypeId),
                        SyntaxFactory.LiteralExpression(item.Position.X),
                        SyntaxFactory.LiteralExpression(item.Position.Y),
                    };

                    var hasSkin = item.SkinId != 0 && item.SkinId != item.TypeId;
                    if (hasSkin)
                    {
                        args.Add(SyntaxFactory.FourCCLiteralExpression(item.SkinId));
                    }

                    statements.Add(SyntaxFactory.CallStatement(hasSkin ? nameof(BlzCreateItemWithSkin) : nameof(CreateItem), args.ToArray()));
                }
            }

            return(SyntaxFactory.FunctionDeclaration(SyntaxFactory.FunctionDeclarator(nameof(CreateAllItems)), statements));
        }
        private static IEnumerable <TStatementSyntax> GetCreateAllItemsHelperFunctionStatements(TBuilder builder)
        {
            foreach (var item in builder.Data.MapUnits.Where(mapUnit => mapUnit.IsItem))
            {
                if (item.TypeId == "sloc")
                {
                    continue;
                }

                if (item.IsRandomItem)
                {
                    var randomData = item.RandomData;
                    switch (randomData.Mode)
                    {
                    case 0:
                        yield return(builder.GenerateAssignmentStatement(
                                         LocalItemIdVariableName,
                                         builder.GenerateInvocationExpression(
                                             nameof(War3Api.Common.ChooseRandomItemEx),
                                             builder.GenerateInvocationExpression(
                                                 nameof(War3Api.Common.ConvertItemType),
                                                 builder.GenerateIntegerLiteralExpression(randomData.ItemClass)),
                                             builder.GenerateIntegerLiteralExpression(randomData.ItemLevel))));

                        break;

                    case 2:
                        yield return(builder.GenerateInvocationStatement(nameof(War3Api.Blizzard.RandomDistReset)));

                        var summedChance = 0;
                        foreach (var randomItemOption in randomData)
                        {
                            summedChance += randomItemOption.chance;

                            var itemTypeExpression = RandomItemProvider.IsRandomItem(randomItemOption.id, out var level, out var @class)
                                        ? builder.GenerateInvocationExpression(
                                nameof(War3Api.Common.ChooseRandomItemEx),
                                builder.GenerateInvocationExpression(
                                    nameof(War3Api.Common.ConvertItemType),
                                    builder.GenerateIntegerLiteralExpression(@class)),
                                builder.GenerateIntegerLiteralExpression(level))
                                        : builder.GenerateFourCCExpression(new string(randomItemOption.id));

                            yield return(builder.GenerateInvocationStatement(
                                             nameof(War3Api.Blizzard.RandomDistAddItem),
                                             itemTypeExpression,
                                             builder.GenerateIntegerLiteralExpression(randomItemOption.chance)));
                        }

                        if (summedChance < 100)
                        {
                            yield return(builder.GenerateInvocationStatement(
                                             nameof(War3Api.Blizzard.RandomDistAddItem),
                                             builder.GenerateIntegerLiteralExpression(-1),
                                             builder.GenerateIntegerLiteralExpression(100 - summedChance)));
                        }

                        yield return(builder.GenerateAssignmentStatement(
                                         LocalItemIdVariableName,
                                         builder.GenerateInvocationExpression(nameof(War3Api.Blizzard.RandomDistChoose))));

                        break;

                    default:
                        break;
                    }

                    yield return(builder.GenerateIfStatement(
                                     builder.GenerateBinaryExpression(
                                         BinaryOperator.NotEquals,
                                         builder.GenerateVariableExpression(LocalItemIdVariableName),
                                         builder.GenerateIntegerLiteralExpression(-1)),
                                     builder.GenerateInvocationStatement(
                                         nameof(War3Api.Common.CreateItem),
                                         builder.GenerateVariableExpression(LocalItemIdVariableName),
                                         builder.GenerateFloatLiteralExpression(item.PositionX, 1),
                                         builder.GenerateFloatLiteralExpression(item.PositionY, 1))));
                }
                else
                {
                    var args = new List <TExpressionSyntax>()
                    {
                        builder.GenerateFourCCExpression(item.TypeId),
                        builder.GenerateFloatLiteralExpression(item.PositionX),
                        builder.GenerateFloatLiteralExpression(item.PositionY),
                    };

                    var hasSkin = (item.Skin?.Length ?? 0) == 4 && item.Skin != item.TypeId;
                    if (hasSkin)
                    {
                        args.Add(builder.GenerateFourCCExpression(item.Skin));
                    }

                    yield return(builder.GenerateInvocationStatement(
                                     hasSkin
                            ? nameof(War3Api.Common.BlzCreateItemWithSkin)
                            : nameof(War3Api.Common.CreateItem),
                                     args.ToArray()));
                }
            }
        }
Example #4
0
        protected virtual JassFunctionDeclarationSyntax CreateAllItems(Map map)
        {
            if (map is null)
            {
                throw new ArgumentNullException(nameof(map));
            }

            var mapUnits = map.Units;

            if (mapUnits is null)
            {
                throw new ArgumentException($"Function '{nameof(CreateAllItems)}' cannot be generated without {nameof(MapUnits)}.", nameof(map));
            }

            var statements = new List <IStatementSyntax>();

            statements.Add(SyntaxFactory.LocalVariableDeclarationStatement(JassTypeSyntax.Integer, VariableName.ItemId));

            foreach (var item in mapUnits.Units.Where(item => CreateAllItemsConditionSingleItem(map, item)))
            {
                if (item.IsRandomItem())
                {
                    var randomData = item.RandomData;
                    switch (randomData)
                    {
                    case RandomUnitAny randomUnitAny:
                        statements.Add(SyntaxFactory.SetStatement(
                                           VariableName.ItemId,
                                           SyntaxFactory.InvocationExpression(
                                               NativeName.ChooseRandomItemEx,
                                               SyntaxFactory.InvocationExpression(NativeName.ConvertItemType, SyntaxFactory.LiteralExpression((int)randomUnitAny.Class)),
                                               SyntaxFactory.LiteralExpression(randomUnitAny.Level))));

                        break;

                    case RandomUnitGlobalTable randomUnitGlobalTable:
                        break;

                    case RandomUnitCustomTable randomUnitCustomTable:
                        statements.Add(SyntaxFactory.CallStatement(FunctionName.RandomDistReset));

                        var summedChance = 0;
                        foreach (var randomItem in randomUnitCustomTable.RandomUnits)
                        {
                            IExpressionSyntax id = RandomItemProvider.IsRandomItem(randomItem.UnitId, out var itemClass, out var level)
                                    ? SyntaxFactory.InvocationExpression(
                                NativeName.ChooseRandomItemEx,
                                SyntaxFactory.InvocationExpression(NativeName.ConvertItemType, SyntaxFactory.LiteralExpression((int)itemClass)),
                                SyntaxFactory.LiteralExpression(level))
                                    : SyntaxFactory.FourCCLiteralExpression(randomItem.UnitId);

                            statements.Add(SyntaxFactory.CallStatement(
                                               FunctionName.RandomDistAddItem,
                                               id,
                                               SyntaxFactory.LiteralExpression(randomItem.Chance)));

                            summedChance += randomItem.Chance;
                        }

                        if (summedChance < 100)
                        {
                            statements.Add(SyntaxFactory.CallStatement(
                                               FunctionName.RandomDistAddItem,
                                               SyntaxFactory.LiteralExpression(-1),
                                               SyntaxFactory.LiteralExpression(100 - summedChance)));
                        }

                        statements.Add(SyntaxFactory.SetStatement(
                                           VariableName.ItemId,
                                           SyntaxFactory.InvocationExpression(FunctionName.RandomDistChoose)));

                        break;

                    default:
                        break;
                    }

                    statements.Add(SyntaxFactory.IfStatement(
                                       SyntaxFactory.BinaryNotEqualsExpression(SyntaxFactory.VariableReferenceExpression(VariableName.ItemId), SyntaxFactory.LiteralExpression(-1)),
                                       SyntaxFactory.CallStatement(
                                           NativeName.CreateItem,
                                           SyntaxFactory.VariableReferenceExpression(VariableName.ItemId),
                                           SyntaxFactory.LiteralExpression(item.Position.X),
                                           SyntaxFactory.LiteralExpression(item.Position.Y))));
                }
                else
                {
                    var args = new List <IExpressionSyntax>()
                    {
                        SyntaxFactory.FourCCLiteralExpression(item.TypeId),
                        SyntaxFactory.LiteralExpression(item.Position.X),
                        SyntaxFactory.LiteralExpression(item.Position.Y),
                    };

                    var hasSkin = item.SkinId != 0 && item.SkinId != item.TypeId;
                    if (hasSkin)
                    {
                        args.Add(SyntaxFactory.FourCCLiteralExpression(item.SkinId));
                    }

                    statements.Add(SyntaxFactory.CallStatement(hasSkin ? NativeName.BlzCreateItemWithSkin : NativeName.CreateItem, args.ToArray()));
                }
            }

            return(SyntaxFactory.FunctionDeclaration(SyntaxFactory.FunctionDeclarator(nameof(CreateAllItems)), statements));
        }
Example #5
0
        protected virtual IEnumerable <IStatementSyntax> GetItemTableDropItemsStatements(Map map, IEnumerable <RandomItemSet> itemSets, bool chooseItemClass)
        {
            if (map is null)
            {
                throw new ArgumentNullException(nameof(map));
            }

            if (itemSets is null)
            {
                throw new ArgumentNullException(nameof(itemSets));
            }

            var statements = new List <IStatementSyntax>();

            statements.Add(SyntaxFactory.LocalVariableDeclarationStatement(SyntaxFactory.ParseTypeName(TypeName.Widget), VariableName.TrigWidget, JassNullLiteralExpressionSyntax.Value));
            statements.Add(SyntaxFactory.LocalVariableDeclarationStatement(SyntaxFactory.ParseTypeName(TypeName.Unit), VariableName.TrigUnit, JassNullLiteralExpressionSyntax.Value));
            statements.Add(SyntaxFactory.LocalVariableDeclarationStatement(JassTypeSyntax.Integer, VariableName.ItemId, SyntaxFactory.LiteralExpression(0)));
            statements.Add(SyntaxFactory.LocalVariableDeclarationStatement(JassTypeSyntax.Boolean, VariableName.CanDrop, SyntaxFactory.LiteralExpression(true)));
            statements.Add(JassEmptyStatementSyntax.Value);

            statements.Add(SyntaxFactory.SetStatement(
                               VariableName.TrigWidget,
                               SyntaxFactory.VariableReferenceExpression(VariableName.BJLastDyingWidget)));

            statements.Add(SyntaxFactory.IfStatement(
                               new JassParenthesizedExpressionSyntax(SyntaxFactory.BinaryEqualsExpression(SyntaxFactory.VariableReferenceExpression(VariableName.TrigWidget), JassNullLiteralExpressionSyntax.Value)),
                               SyntaxFactory.SetStatement(VariableName.TrigUnit, SyntaxFactory.InvocationExpression(NativeName.GetTriggerUnit))));

            statements.Add(JassEmptyStatementSyntax.Value);

            var canDropConditionExpression = SyntaxFactory.UnaryNotExpression(SyntaxFactory.InvocationExpression(NativeName.IsUnitHidden, SyntaxFactory.VariableReferenceExpression(VariableName.TrigUnit)));

            var ifBody = new List <IStatementSyntax>()
            {
                SyntaxFactory.SetStatement(VariableName.CanDrop, canDropConditionExpression),
            };

            ifBody.Add(SyntaxFactory.IfStatement(
                           new JassParenthesizedExpressionSyntax(SyntaxFactory.BinaryAndExpression(
                                                                     SyntaxFactory.VariableReferenceExpression(VariableName.CanDrop),
                                                                     SyntaxFactory.BinaryNotEqualsExpression(SyntaxFactory.InvocationExpression(NativeName.GetChangingUnit), JassNullLiteralExpressionSyntax.Value))),
                           SyntaxFactory.SetStatement(
                               VariableName.CanDrop,
                               new JassParenthesizedExpressionSyntax(SyntaxFactory.BinaryEqualsExpression(
                                                                         SyntaxFactory.InvocationExpression(NativeName.GetChangingUnitPrevOwner),
                                                                         SyntaxFactory.InvocationExpression(NativeName.Player, SyntaxFactory.VariableReferenceExpression(GlobalVariableName.PlayerNeutralHostile)))))));

            statements.Add(SyntaxFactory.IfStatement(
                               new JassParenthesizedExpressionSyntax(SyntaxFactory.BinaryNotEqualsExpression(SyntaxFactory.VariableReferenceExpression(VariableName.TrigUnit), JassNullLiteralExpressionSyntax.Value)),
                               ifBody.ToArray()));
            statements.Add(JassEmptyStatementSyntax.Value);

            var i = 0;
            var randomDistStatements = new List <IStatementSyntax>();

            foreach (var itemSet in itemSets)
            {
                randomDistStatements.Add(new JassCommentStatementSyntax($" Item set {i}"));
                randomDistStatements.Add(SyntaxFactory.CallStatement(FunctionName.RandomDistReset));

                var summedChance = 0;
                foreach (var item in itemSet.Items)
                {
                    if (RandomItemProvider.IsRandomItem(item.ItemId, out var itemClass, out var level))
                    {
                        if (chooseItemClass)
                        {
                            randomDistStatements.Add(SyntaxFactory.CallStatement(
                                                         FunctionName.RandomDistAddItem,
                                                         SyntaxFactory.InvocationExpression(
                                                             NativeName.ChooseRandomItemEx,
                                                             SyntaxFactory.VariableReferenceExpression(itemClass.GetVariableName()),
                                                             SyntaxFactory.LiteralExpression(level)),
                                                         SyntaxFactory.LiteralExpression(item.Chance)));
                        }
                        else
                        {
                            randomDistStatements.Add(SyntaxFactory.CallStatement(
                                                         FunctionName.RandomDistAddItem,
                                                         SyntaxFactory.InvocationExpression(NativeName.ChooseRandomItem, SyntaxFactory.LiteralExpression(level)),
                                                         SyntaxFactory.LiteralExpression(item.Chance)));
                        }
                    }