protected override void OnCreate()
    {
        var goods = new Dictionary <string, Good>();

        GoodNames  = new List <string>();
        LogicNames = new List <string>();

        foreach (var goodPath in Directory.EnumerateFiles(
                     Path.Combine(Application.streamingAssetsPath, "Goods"), "*.json"))
        {
            var jsonGood = JsonGood.CreateFromJson(goodPath);
            goods.Add(jsonGood.name, new Good(goods.Count, jsonGood));
            GoodNames.Add(jsonGood.name);
        }

        // Adding simply money. Will always be the last value.
        goods.Add("Money", new Good(goods.Count, 1));

        var adjustedGoodsCount = goods.Count - 1;

        var goodArray         = goods.Values.ToList();
        var logicGoodsCounter = new int[adjustedGoodsCount];

        GoodsMostLogic = new Entity[adjustedGoodsCount];

        var logic = new Dictionary <string, Entity>();
        var startingInventories = new Dictionary <string, NativeArray <InvContent> >();

        var cofAndLg = new NativeArray <CostOfLivingAndLimitGood>(goods.Count, Allocator.Temp,
                                                                  NativeArrayOptions.UninitializedMemory);

        using (var possibleDeltas = new NativeList <PossibleDelta>(Allocator.Temp))
            using (var deltas = new NativeList <DeltaValue>(Allocator.Temp))
            {
                foreach (var logicPath in Directory.EnumerateFiles(
                             Path.Combine(Application.streamingAssetsPath, "Factories"), "*.json"))
                {
                    var jsonLogic    = JsonLogic.CreateFromJson(logicPath);
                    var currentLogic = EntityManager.CreateEntity(typeof(Logic));
                    EntityManager.SetComponentData(currentLogic, new Logic(logic.Count));

                    // Resetting array
                    for (var goodIndex = 0; goodIndex < cofAndLg.Length; goodIndex++)
                    {
                        cofAndLg[goodIndex] = new CostOfLivingAndLimitGood(0);
                    }
                    // First pass for costs of living
                    foreach (var livingCost in jsonLogic.costOfLiving)
                    {
                        cofAndLg[goods[livingCost.name].Index] = new CostOfLivingAndLimitGood(livingCost.quantity);
                    }
                    // Second pass for limit goods
                    foreach (var goodsLimit in jsonLogic.limitGoods)
                    {
                        var index       = goods[goodsLimit.name].Index;
                        var placeholder = cofAndLg[index];
                        placeholder.LimitGoods = goodsLimit.quantity;
                        cofAndLg[index]        = placeholder;
                    }

                    EntityManager.AddBuffer <CostOfLivingAndLimitGood>(currentLogic).AddRange(cofAndLg);

                    var idealQuantity = new NativeArray <IdealQuantity>(adjustedGoodsCount, Allocator.Temp);
                    foreach (var value in jsonLogic.idealQuantity)
                    {
                        idealQuantity[goods[value.name].Index] = value.quantity;
                    }
                    EntityManager.AddBuffer <IdealQuantity>(currentLogic).AddRange(idealQuantity);
                    idealQuantity.Dispose();

                    var currentInventory = new NativeArray <InvContent>(adjustedGoodsCount, Allocator.Temp);

                    // Assigning starting good inventory
                    foreach (var value in jsonLogic.startQuantity)
                    {
                        var targetGood = goods[value.name];
                        currentInventory[targetGood.Index] = new InvContent(value.quantity, targetGood.InitialCost);
                    }

                    // Assigning rest of goods prices
                    for (var index = 0; index < currentInventory.Length; index++)
                    {
                        var targetInv = currentInventory[index];
                        if (targetInv.RecordedPrice > 0.1)
                        {
                            continue;
                        }
                        targetInv.RecordedPrice = goodArray[index].InitialCost;
                        currentInventory[index] = targetInv;
                    }

                    startingInventories.Add(jsonLogic.name, currentInventory);
                    // Starting values
                    EntityManager.AddBuffer <InvContent>(currentLogic).AddRange(currentInventory);

                    possibleDeltas.Clear();
                    deltas.Clear();
                    foreach (var possibilities in jsonLogic.possibleDeltas)
                    {
                        var consumeStart = deltas.Length;
                        foreach (var value in possibilities.consumes)
                        {
                            deltas.Add(new DeltaValue(goods[value.name].Index, value.quantity, value.possibility));
                        }

                        var produceStart = deltas.Length;
                        foreach (var value in possibilities.produces)
                        {
                            var goodsIndex = goods[value.name].Index;
                            deltas.Add(new DeltaValue(goodsIndex, value.quantity, value.possibility));

                            if (logicGoodsCounter[goods[value.name].Index] > math.abs(value.quantity))
                            {
                                continue;
                            }

                            logicGoodsCounter[goodsIndex] = value.quantity;
                            GoodsMostLogic[goodsIndex]    = currentLogic;
                        }

                        possibleDeltas.Add(new int3(consumeStart, produceStart, deltas.Length));
                    }

                    EntityManager.AddBuffer <PossibleDelta>(currentLogic).AddRange(possibleDeltas);
                    EntityManager.AddBuffer <DeltaValue>(currentLogic).AddRange(deltas);

                    logic.Add(jsonLogic.name, currentLogic);
                    LogicNames.Add(jsonLogic.name);
                }
            }

        // Subtract 1 for money being the last good.
        History.AssignLogs(adjustedGoodsCount, logic.Count);

        // DEBUG

        // GOAL: 605 PER!
        const int current = 1000;

        for (var counter = 0; counter < current; counter++)
        {
            CreateAgent("Farm", 20);
        }

        for (var counter = 0; counter < current; counter++)
        {
            CreateAgent("Mine", 50);
        }

        for (var counter = 0; counter < current; counter++)
        {
            CreateAgent("Ore_Refinery", 50);
        }

        for (var counter = 0; counter < current; counter++)
        {
            CreateAgent("Sawmill", 50);
        }

        for (var counter = 0; counter < current; counter++)
        {
            CreateAgent("Smithy", 100);
        }

        for (var counter = 0; counter < current; counter++)
        {
            CreateAgent("Peasant", 50);
        }

        foreach (var startingInventory in startingInventories)
        {
            startingInventory.Value.Dispose();
        }
        cofAndLg.Dispose();

        void CreateAgent(string factoryType, int wealth)
        {
            var currentAgent = EntityManager.CreateEntity(typeof(Agent), typeof(Wallet));

            EntityManager.SetComponentData(currentAgent, new Agent(logic[factoryType]));
            EntityManager.SetComponentData(currentAgent, new Wallet(wealth));
            EntityManager.AddBuffer <InvContent>(currentAgent).AddRange(startingInventories[factoryType]);
        }
    }
Beispiel #2
0
 public Good(int index, JsonGood jsonGood)
 {
     Index       = index;
     InitialCost = jsonGood.initialCost;
 }