예제 #1
0
    void RecursiveGroupBeltItemSlotss(BeltItemSlot currentBeltItemSlot, List <BeltItemSlot> cleanBeltItemSlots, List <BeltItemSlot> processedBeltItemSlots, int index)
    {
        if (currentBeltItemSlot.isProcessed)
        {
            return;
        }

        //Debug.Log(index);
        currentBeltItemSlot.isProcessed = true;
        currentBeltItemSlot.index       = index;
        cleanBeltItemSlots.Remove(currentBeltItemSlot);
        processedBeltItemSlots.Add(currentBeltItemSlot);


        foreach (BeltItemSlot outs in currentBeltItemSlot.outsideConnections)
        {
            //Debug.DrawLine(currentBeltItemSlot.position, outs.position, Color.green, 200f);
            RecursiveGroupBeltItemSlotss(outs, cleanBeltItemSlots, processedBeltItemSlots, index + 1);
        }
        foreach (BeltItemSlot ins in currentBeltItemSlot.insideConnections)
        {
            //Debug.DrawLine(currentBeltItemSlot.position, ins.position, Color.red, 200f);
            RecursiveGroupBeltItemSlotss(ins, cleanBeltItemSlots, processedBeltItemSlots, index - 1);
        }
    }
예제 #2
0
    public void CreateItemsBasedOnTick()
    {
        if (isFirstRun)
        {
            isFirstRun = false;
            StopAllCoroutines();
        }

        if (curTick >= tickCount)
        {
            for (int i = 0; i < allBeltItemSlotsArray.Length; i++)
            {
                BeltItemSlot slot = allBeltItemSlotsArray[i];
                if (slot != null)
                {
                    if (slot.myItem == null)
                    {
                        BeltMaster.CreateItemAtBeltSlot(Instantiate(itemPrefab).GetComponent <BeltItem>(), slot);
                    }
                }
            }
            curTick = 0;
        }

        curTick++;
    }
예제 #3
0
 //tries to move the item in one of the slot to the other if the slot is empty
 static bool TryToMoveItem(BeltItemSlot from, BeltItemSlot to)
 {
     //Debug.Log("Trying to move item");
     if (from.myItem != null && to.myItem == null)
     {
         if (!from.myItem.isProcessedThisLoop)
         {
             from.myItem.isProcessedThisLoop = true;
             to.myItem        = from.myItem;
             from.myItem      = null;
             to.myItem.mySlot = to;
             return(true);
         }
         else
         {
             //Debug.Log("Item already processed");
         }
     }
     else
     {
         if (from.myItem == null)
         {
             //Debug.Log("Item not found");
         }
         if (to.myItem != null)
         {
             //Debug.Log("Target slot is full");
         }
     }
     return(false);
 }
예제 #4
0
        public void BeltItemSlotProcessorCheck()
        {
            // Arrange
            List <List <BeltItemSlot> > dummyBeltItemSlotGroup = new List <List <BeltItemSlot> >();

            dummyBeltItemSlotGroup.Add(new List <BeltItemSlot>());
            dummyBeltItemSlotGroup[0].Add(new BeltItemSlot(Vector3.zero));
            dummyBeltItemSlotGroup[0].Add(new BeltItemSlot(Vector3.zero));
            BeltItemSlot.ConnectBelts(dummyBeltItemSlotGroup[0][0], dummyBeltItemSlotGroup[0][1]);

            List <BeltItem> beltItems = new List <BeltItem>();

            beltItems.Add(new GameObject().AddComponent <BeltItem>().GetComponent <BeltItem>());
            dummyBeltItemSlotGroup[0][0].myItem = beltItems[0];
            beltItems[0].mySlot = dummyBeltItemSlotGroup[0][0];

            BeltItemSlotUpdateProcessor myBeltItemSlotUpdateProcessor = new BeltItemSlotUpdateProcessor(beltItems, dummyBeltItemSlotGroup);

            // Act
            myBeltItemSlotUpdateProcessor.UpdateBeltItemSlots();

            // Assert
            Assert.IsNull(dummyBeltItemSlotGroup[0][0].myItem);
            Assert.IsNotNull(dummyBeltItemSlotGroup[0][1].myItem);
        }
예제 #5
0
        public void BeltItemSlotProcessorCheck()
        {
            // Arrange
            List <List <BeltItemSlot> > dummyBeltItemSlotGroup = new List <List <BeltItemSlot> >();

            dummyBeltItemSlotGroup.Add(new List <BeltItemSlot>());
            dummyBeltItemSlotGroup[0].Add(new BeltItemSlot(Vector3.zero));
            dummyBeltItemSlotGroup[0].Add(new BeltItemSlot(Vector3.zero));
            BeltItemSlot.ConnectBeltItemSlots(dummyBeltItemSlotGroup[0][0], dummyBeltItemSlotGroup[0][1]);

            ObjectPoolSimple <BeltItem> dummyItemPool = new ObjectPoolSimple <BeltItem>(1, 1);

            dummyItemPool.SetUp();
            dummyBeltItemSlotGroup[0][0].myItem = dummyItemPool.Spawn();


            List <BeltPreProcessor.BeltGroup> dummyBeltGroup = new List <BeltPreProcessor.BeltGroup>();

            BeltPreProcessor.BeltGroup newGroup = new BeltPreProcessor.BeltGroup();
            newGroup.beltItemSlotGroups = dummyBeltItemSlotGroup;
            dummyBeltGroup.Add(newGroup);

            BeltItemSlotUpdateProcessor myBeltItemSlotUpdateProcessor = new BeltItemSlotUpdateProcessor(dummyItemPool, dummyBeltGroup);

            // Act
            myBeltItemSlotUpdateProcessor.UpdateBeltItemSlots();

            // Assert
            Assert.IsNull(dummyBeltItemSlotGroup[0][0].myItem);
            Assert.IsNotNull(dummyBeltItemSlotGroup[0][1].myItem);
        }
예제 #6
0
 //tries to move the item in one of the slot to the other if the slot is empty
 static bool TryToMoveItem(BeltItemSlot from, BeltItemSlot to, bool isMarkedUpdate)
 {
     //Debug.Log("Trying to move item");
     if (from.myItem != null && to.myItem == null)
     {
         // If this item is not 'processed' ie not moved this update
         if (!from.myItem.isProcessedThisLoop)
         {
             // do it either if its the marked update loop and we are marked or if it is not the marked update loop
             if (!isMarkedUpdate || from.myItem.isMarkedThisLoop)
             {
                 from.myItem.isProcessedThisLoop = true;
                 to.myItem        = from.myItem;
                 from.myItem      = null;
                 to.myItem.mySlot = to;
                 return(true);
             }
         }
     }
     else if (from.myItem != null)
     {
         from.myItem.isMarkedThisLoop = true;
         //Debug.Log("Item Marked");
     }
     return(false);
 }
예제 #7
0
    public static void DisconnectBeltItemSlots(BeltItemSlot from, BeltItemSlot to)
    {
        if (from == null || to == null)
        {
            return;
        }

        from.outsideConnections.Remove(to);
        from.insideConnections.Remove(to);
        to.outsideConnections.Remove(from);
        to.insideConnections.Remove(from);
    }
예제 #8
0
 public void DestroyItemAtSlot(BeltItemSlot slot)
 {
     if (slot != null)
     {
         if (slot.myItem != null)
         {
             entityPoolEcs.DestroyPooledObject(slot.myItem.myEntityId);
             itemPool.DestroyPooledObject(slot.myItem);
             slot.myItem = null;
             activeItemCount--;
         }
     }
 }
예제 #9
0
    public bool CreateItemAtBeltSlot(BeltItemSlot slot /*, int itemTyep*/)
    {
        if (slot != null)
        {
            if (slot.myItem == null)
            {
                slot.myItem            = itemPool.Spawn();
                slot.myItem.myEntityId = entityPoolEcs.Spawn(slot.position, slot.position);
                activeItemCount++;
                return(true);
            }
        }

        return(false);
    }
예제 #10
0
 public static bool CreateItemAtBeltSlot(BeltItem item, BeltItemSlot slot)
 {
     if (slot.myItem == null)
     {
         s.allBeltItems.Add(item);
         item.transform.position = slot.position;
         item.mySlot             = slot;
         slot.myItem             = item;
         return(true);
     }
     else
     {
         item.DestroyItem();
         return(false);
     }
 }
예제 #11
0
    public static void RemoveAllConnectionsFromBeltItemSlot(BeltItemSlot from)
    {
        if (from == null)
        {
            return;
        }

        while (from.outsideConnections.Count > 0)
        {
            DisconnectBeltItemSlots(from, from.outsideConnections[0]);
        }

        while (from.insideConnections.Count > 0)
        {
            DisconnectBeltItemSlots(from, from.insideConnections[0]);
        }
    }
예제 #12
0
    public static void ConnectBelts(BeltObject from, BeltObject to, int connectionSide)
    {
        if (from == null || to == null)
        {
            return;
        }

        switch (connectionSide)
        {
        case 0:
            for (int x = 1; x < 3; x++)
            {
                BeltItemSlot.ConnectBeltItemSlots(from.myBeltItemSlots[x, 0], to.myBeltItemSlots[x, 3]);
                BeltItemSlot.ConnectBeltItemSlots(from.myBeltItemSlots[x, 0], to.myBeltItemSlots[x, 3]);
            }
            break;

        case 1:
            for (int y = 1; y < 3; y++)
            {
                BeltItemSlot.ConnectBeltItemSlots(from.myBeltItemSlots[3, y], to.myBeltItemSlots[0, y]);
                BeltItemSlot.ConnectBeltItemSlots(from.myBeltItemSlots[3, y], to.myBeltItemSlots[0, y]);
            }
            break;

        case 2:
            for (int x = 1; x < 3; x++)
            {
                BeltItemSlot.ConnectBeltItemSlots(from.myBeltItemSlots[x, 3], to.myBeltItemSlots[x, 0]);
                BeltItemSlot.ConnectBeltItemSlots(from.myBeltItemSlots[x, 3], to.myBeltItemSlots[x, 0]);
            }
            break;

        case 3:
            for (int y = 1; y < 3; y++)
            {
                BeltItemSlot.ConnectBeltItemSlots(from.myBeltItemSlots[0, y], to.myBeltItemSlots[3, y]);
                BeltItemSlot.ConnectBeltItemSlots(from.myBeltItemSlots[0, y], to.myBeltItemSlots[3, y]);
            }
            break;
        }
    }
예제 #13
0
    public void CreateItemsBasedOnTick()
    {
        if (curTick >= tickCount)
        {
            for (int i = 0; i < allBeltItemSlotsArray.Length; i++)
            {
                BeltItemSlot slot = allBeltItemSlotsArray[i];
                if (slot != null)
                {
                    if (slot.myItem == null)
                    {
                        BeltMaster.s.CreateItemAtBeltSlot(slot);
                    }
                }
            }
            curTick = 0;
        }

        curTick++;
    }
예제 #14
0
    // Update is called once per frame
    IEnumerator CreateItems()
    {
        yield return(new WaitForSeconds(1f));

        while (true)
        {
            if (isActive)
            {
                for (int i = 0; i < allBeltItemSlotsArray.Length; i++)
                {
                    BeltItemSlot slot = allBeltItemSlotsArray[i];
                    if (slot != null)
                    {
                        if (slot.myItem == null)
                        {
                            BeltMaster.CreateItemAtBeltSlot(Instantiate(itemPrefab).GetComponent <BeltItem>(), slot);
                        }
                    }
                }
            }
            yield return(new WaitForSeconds(delay));
        }
    }
예제 #15
0
    // call this if you wanna remove previous connections as well
    public void RemoveOldItemSlots(List <List <BeltItemSlot> > existingMaster)
    {
        // go around the edges and remove connections
        for (int x = 0; x < 4; x++)
        {
            for (int y = 0; y < 4; y++)
            {
                if (!(x < 4 && x > 1 && y < 4 && y > 1))
                {
                    BeltItemSlot.RemoveAllConnectionsFromBeltItemSlot(myBeltItemSlots[x, y]);
                    BeltItemSlot.RemoveAllConnectionsFromBeltItemSlot(myBeltItemSlotsLayer2[x, y]);
                }
            }
        }

        for (int x = 0; x < 4; x++)
        {
            for (int y = 0; y < 4; y++)
            {
                if (myBeltItemSlots[x, y] != null)
                {
                    if (myBeltItemSlots[x, y].beltItemSlotGroup != -1)
                    {
                        existingMaster[myBeltItemSlots[x, y].beltItemSlotGroup].Remove(myBeltItemSlots[x, y]);
                    }
                }

                if (myBeltItemSlotsLayer2[x, y] != null)
                {
                    if (myBeltItemSlotsLayer2[x, y].beltItemSlotGroup != -1)
                    {
                        existingMaster[myBeltItemSlotsLayer2[x, y].beltItemSlotGroup].Remove(myBeltItemSlotsLayer2[x, y]);
                    }
                }
            }
        }
    }
예제 #16
0
    // belt item slot coordinates start from top left corner

    /* The Logic goes like this:
     * 1. check and connect all the middle belts if and only if there is a 'running line' through them, ie behind them is an input and front is output
     * 2. connect all the edge connections to all the middle pieces
     * 3. this leaves 3 edge cases out, later correct them
     *		the edges cases are:
     *			-corners
     *			-1 out 2 split in '>v<' and reverse of that
     *			-2 in 2 out, ins and outs are next to each other - is an overpass
     */
    public void CreateBeltItemSlots()
    {
        myBeltItemSlots       = new BeltItemSlot[4, 4];
        myBeltItemSlotsLayer2 = new BeltItemSlot[4, 4];
        allBeltItemSlots.Clear();

        // populate the center
        for (int x = 1; x < 3; x++)
        {
            for (int y = 1; y < 3; y++)
            {
                myBeltItemSlots[x, y] = new BeltItemSlot(GetBeltItemSlotPos(x, y));
                allBeltItemSlots.Add(myBeltItemSlots[x, y]);
            }
        }

        // run lines through
        runningLineCount = 0;
        for (int x = 1; x < 3; x++)
        {
            for (int y = 1; y < 3; y++)
            {
                if (beltInputs[0] && beltOutputs[2])
                {
                    runningLineCount++;
                    BeltItemSlot.ConnectBeltItemSlots(myBeltItemSlots[x, y], myBeltItemSlots[x, y + 1]);
                }
                if (beltInputs[1] && beltOutputs[3])
                {
                    runningLineCount++;
                    BeltItemSlot.ConnectBeltItemSlots(myBeltItemSlots[x, y], myBeltItemSlots[x - 1, y]);
                }
                if (beltInputs[2] && beltOutputs[0])
                {
                    runningLineCount++;
                    BeltItemSlot.ConnectBeltItemSlots(myBeltItemSlots[x, y], myBeltItemSlots[x, y - 1]);
                }
                if (beltInputs[3] && beltOutputs[1])
                {
                    runningLineCount++;
                    BeltItemSlot.ConnectBeltItemSlots(myBeltItemSlots[x, y], myBeltItemSlots[x + 1, y]);
                }
            }
        }
        runningLineCount /= 4;

        // connect edges to the center
        if (beltInputs[0] || beltOutputs[0])
        {
            for (int x = 1; x < 3; x++)
            {
                myBeltItemSlots[x, 0] = new BeltItemSlot(GetBeltItemSlotPos(x, 0));
                allBeltItemSlots.Add(myBeltItemSlots[x, 0]);
                if (beltInputs[0])                 // spawn the connection around if input or output
                {
                    BeltItemSlot.ConnectBeltItemSlots(myBeltItemSlots[x, 0], myBeltItemSlots[x, 1]);
                }
                else
                {
                    BeltItemSlot.ConnectBeltItemSlots(myBeltItemSlots[x, 1], myBeltItemSlots[x, 0]);
                }
            }
        }
        if (beltInputs[1] || beltOutputs[1])
        {
            for (int y = 1; y < 3; y++)
            {
                myBeltItemSlots[3, y] = new BeltItemSlot(GetBeltItemSlotPos(3, y));
                allBeltItemSlots.Add(myBeltItemSlots[3, y]);
                if (beltInputs[1])                 // spawn the connection around if input or output
                {
                    BeltItemSlot.ConnectBeltItemSlots(myBeltItemSlots[3, y], myBeltItemSlots[2, y]);
                }
                else
                {
                    BeltItemSlot.ConnectBeltItemSlots(myBeltItemSlots[2, y], myBeltItemSlots[3, y]);
                }
            }
        }
        if (beltInputs[2] || beltOutputs[2])
        {
            for (int x = 1; x < 3; x++)
            {
                myBeltItemSlots[x, 3] = new BeltItemSlot(GetBeltItemSlotPos(x, 3));
                allBeltItemSlots.Add(myBeltItemSlots[x, 3]);
                if (beltInputs[2])                 // spawn the connection around if input or output
                {
                    BeltItemSlot.ConnectBeltItemSlots(myBeltItemSlots[x, 3], myBeltItemSlots[x, 2]);
                }
                else
                {
                    BeltItemSlot.ConnectBeltItemSlots(myBeltItemSlots[x, 2], myBeltItemSlots[x, 3]);
                }
            }
        }
        if (beltInputs[3] || beltOutputs[3])
        {
            for (int y = 1; y < 3; y++)
            {
                myBeltItemSlots[0, y] = new BeltItemSlot(GetBeltItemSlotPos(0, y));
                allBeltItemSlots.Add(myBeltItemSlots[0, y]);
                if (beltInputs[3])                 // spawn the connection around if input or output
                {
                    BeltItemSlot.ConnectBeltItemSlots(myBeltItemSlots[0, y], myBeltItemSlots[1, y]);
                }
                else
                {
                    BeltItemSlot.ConnectBeltItemSlots(myBeltItemSlots[1, y], myBeltItemSlots[0, y]);
                }
            }
        }

        // this part is pretty much the hardcoded way of how belts interlock.
        // check the design document to see what exactly this is doing
        // it is pretty much checking if the input/outputs match some of the 'templates' and acts accordingly
        totalEdgeCount = 0;
        for (int i = 0; i < 4; i++)
        {
            totalEdgeCount += (beltInputs[i] || beltOutputs[i]) ? 1 : 0;
        }

        if (runningLineCount == 2 && totalEdgeCount == 4)
        {
            for (int x = 1; x < 3; x++)
            {
                for (int y = 1; y < 3; y++)
                {
                    BeltItemSlot.RemoveAllConnectionsFromBeltItemSlot(myBeltItemSlots[x, y]);
                }
            }

            for (int x = 0; x < 4; x++)
            {
                for (int y = 0; y < 4; y++)
                {
                    myBeltItemSlotsLayer2[x, y] = myBeltItemSlots[x, y];
                }
            }
            for (int x = 1; x < 3; x++)
            {
                for (int y = 1; y < 3; y++)
                {
                    myBeltItemSlotsLayer2[x, y] = new BeltItemSlot(GetBeltItemSlotPos(x, y));
                    allBeltItemSlots.Add(myBeltItemSlotsLayer2[x, y]);
                }
            }

            if (beltInputs[0] && beltInputs[1])
            {
                for (int y = 0; y < 3; y++)
                {
                    BeltItemSlot.ConnectBeltItemSlots(myBeltItemSlots[1, y], myBeltItemSlots[1, y + 1]);
                }
                for (int y = 0; y < 3; y++)
                {
                    BeltItemSlot.ConnectBeltItemSlots(myBeltItemSlots[2, y], myBeltItemSlots[2, y + 1]);
                }

                for (int x = 0; x < 3; x++)
                {
                    BeltItemSlot.ConnectBeltItemSlots(myBeltItemSlotsLayer2[x + 1, 1], myBeltItemSlotsLayer2[x, 1]);
                }
                for (int x = 0; x < 3; x++)
                {
                    BeltItemSlot.ConnectBeltItemSlots(myBeltItemSlotsLayer2[x + 1, 2], myBeltItemSlotsLayer2[x, 2]);
                }
            }
            else if (beltInputs[1] && beltInputs[2])
            {
                for (int x = 0; x < 3; x++)
                {
                    BeltItemSlot.ConnectBeltItemSlots(myBeltItemSlotsLayer2[x + 1, 1], myBeltItemSlotsLayer2[x, 1]);
                }
                for (int x = 0; x < 3; x++)
                {
                    BeltItemSlot.ConnectBeltItemSlots(myBeltItemSlotsLayer2[x + 1, 2], myBeltItemSlotsLayer2[x, 2]);
                }

                for (int y = 0; y < 3; y++)
                {
                    BeltItemSlot.ConnectBeltItemSlots(myBeltItemSlots[1, y + 1], myBeltItemSlots[1, y]);
                }
                for (int y = 0; y < 3; y++)
                {
                    BeltItemSlot.ConnectBeltItemSlots(myBeltItemSlots[2, y + 1], myBeltItemSlots[2, y]);
                }
            }
            else if (beltInputs[2] && beltInputs[3])
            {
                for (int y = 0; y < 3; y++)
                {
                    BeltItemSlot.ConnectBeltItemSlots(myBeltItemSlots[1, y + 1], myBeltItemSlots[1, y]);
                }
                for (int y = 0; y < 3; y++)
                {
                    BeltItemSlot.ConnectBeltItemSlots(myBeltItemSlots[2, y + 1], myBeltItemSlots[2, y]);
                }

                for (int x = 0; x < 3; x++)
                {
                    BeltItemSlot.ConnectBeltItemSlots(myBeltItemSlotsLayer2[x, 1], myBeltItemSlotsLayer2[x + 1, 1]);
                }
                for (int x = 0; x < 3; x++)
                {
                    BeltItemSlot.ConnectBeltItemSlots(myBeltItemSlotsLayer2[x, 2], myBeltItemSlotsLayer2[x + 1, 2]);
                }
            }
            else if (beltInputs[3] && beltInputs[0])
            {
                for (int x = 0; x < 3; x++)
                {
                    BeltItemSlot.ConnectBeltItemSlots(myBeltItemSlotsLayer2[x, 1], myBeltItemSlotsLayer2[x + 1, 1]);
                }
                for (int x = 0; x < 3; x++)
                {
                    BeltItemSlot.ConnectBeltItemSlots(myBeltItemSlotsLayer2[x, 2], myBeltItemSlotsLayer2[x + 1, 2]);
                }

                for (int y = 0; y < 3; y++)
                {
                    BeltItemSlot.ConnectBeltItemSlots(myBeltItemSlots[1, y], myBeltItemSlots[1, y + 1]);
                }
                for (int y = 0; y < 3; y++)
                {
                    BeltItemSlot.ConnectBeltItemSlots(myBeltItemSlots[2, y], myBeltItemSlots[2, y + 1]);
                }
            }
        }
        else if (runningLineCount == 0 && totalEdgeCount == 2)
        {
            if (beltInputs[0] && beltOutputs[1])
            {
                BeltItemSlot.ConnectBeltItemSlots(myBeltItemSlots[1, 1], myBeltItemSlots[1, 2]);
                BeltItemSlot.ConnectBeltItemSlots(myBeltItemSlots[1, 2], myBeltItemSlots[2, 2]);
            }
            else if (beltInputs[1] && beltOutputs[2])
            {
                BeltItemSlot.ConnectBeltItemSlots(myBeltItemSlots[2, 1], myBeltItemSlots[1, 1]);
                BeltItemSlot.ConnectBeltItemSlots(myBeltItemSlots[1, 1], myBeltItemSlots[1, 2]);
            }
            else if (beltInputs[2] && beltOutputs[3])
            {
                BeltItemSlot.ConnectBeltItemSlots(myBeltItemSlots[2, 2], myBeltItemSlots[2, 1]);
                BeltItemSlot.ConnectBeltItemSlots(myBeltItemSlots[2, 1], myBeltItemSlots[1, 1]);
            }
            else if (beltInputs[3] && beltOutputs[0])
            {
                BeltItemSlot.ConnectBeltItemSlots(myBeltItemSlots[1, 2], myBeltItemSlots[2, 2]);
                BeltItemSlot.ConnectBeltItemSlots(myBeltItemSlots[2, 2], myBeltItemSlots[2, 1]);
            }

            if (beltInputs[1] && beltOutputs[0])
            {
                BeltItemSlot.ConnectBeltItemSlots(myBeltItemSlots[2, 2], myBeltItemSlots[1, 2]);
                BeltItemSlot.ConnectBeltItemSlots(myBeltItemSlots[1, 2], myBeltItemSlots[1, 1]);
            }
            else if (beltInputs[2] && beltOutputs[1])
            {
                BeltItemSlot.ConnectBeltItemSlots(myBeltItemSlots[1, 2], myBeltItemSlots[1, 1]);
                BeltItemSlot.ConnectBeltItemSlots(myBeltItemSlots[1, 1], myBeltItemSlots[2, 1]);
            }
            else if (beltInputs[3] && beltOutputs[2])
            {
                BeltItemSlot.ConnectBeltItemSlots(myBeltItemSlots[1, 1], myBeltItemSlots[2, 1]);
                BeltItemSlot.ConnectBeltItemSlots(myBeltItemSlots[2, 1], myBeltItemSlots[2, 2]);
            }
            else if (beltInputs[0] && beltOutputs[3])
            {
                BeltItemSlot.ConnectBeltItemSlots(myBeltItemSlots[2, 1], myBeltItemSlots[2, 2]);
                BeltItemSlot.ConnectBeltItemSlots(myBeltItemSlots[2, 2], myBeltItemSlots[1, 2]);
            }
        }
        else if (runningLineCount == 0 && totalEdgeCount == 3)
        {
            if (beltInputs[0] && beltOutputs[1] && beltOutputs[3])
            {
                BeltItemSlot.ConnectBeltItemSlots(myBeltItemSlots[2, 1], myBeltItemSlots[2, 2]);
                BeltItemSlot.ConnectBeltItemSlots(myBeltItemSlots[2, 2], myBeltItemSlots[3, 2]);

                BeltItemSlot.ConnectBeltItemSlots(myBeltItemSlots[1, 1], myBeltItemSlots[1, 2]);
                BeltItemSlot.ConnectBeltItemSlots(myBeltItemSlots[1, 2], myBeltItemSlots[0, 2]);
            }
            else if (beltInputs[1] && beltOutputs[2] && beltOutputs[0])
            {
                BeltItemSlot.ConnectBeltItemSlots(myBeltItemSlots[2, 1], myBeltItemSlots[1, 1]);
                BeltItemSlot.ConnectBeltItemSlots(myBeltItemSlots[1, 1], myBeltItemSlots[1, 0]);

                BeltItemSlot.ConnectBeltItemSlots(myBeltItemSlots[2, 2], myBeltItemSlots[1, 2]);
                BeltItemSlot.ConnectBeltItemSlots(myBeltItemSlots[1, 2], myBeltItemSlots[1, 3]);
            }
            else if (beltInputs[2] && beltOutputs[3] && beltOutputs[1])
            {
                BeltItemSlot.ConnectBeltItemSlots(myBeltItemSlots[2, 2], myBeltItemSlots[2, 1]);
                BeltItemSlot.ConnectBeltItemSlots(myBeltItemSlots[2, 1], myBeltItemSlots[3, 1]);

                BeltItemSlot.ConnectBeltItemSlots(myBeltItemSlots[1, 2], myBeltItemSlots[1, 1]);
                BeltItemSlot.ConnectBeltItemSlots(myBeltItemSlots[1, 1], myBeltItemSlots[0, 1]);
            }
            else if (beltInputs[3] && beltOutputs[0] && beltOutputs[2])
            {
                BeltItemSlot.ConnectBeltItemSlots(myBeltItemSlots[1, 2], myBeltItemSlots[2, 2]);
                BeltItemSlot.ConnectBeltItemSlots(myBeltItemSlots[2, 2], myBeltItemSlots[2, 3]);

                BeltItemSlot.ConnectBeltItemSlots(myBeltItemSlots[1, 1], myBeltItemSlots[2, 1]);
                BeltItemSlot.ConnectBeltItemSlots(myBeltItemSlots[2, 1], myBeltItemSlots[2, 0]);
            }
        }

        allBeltItemSlotsArray = allBeltItemSlots.ToArray();
    }
예제 #17
0
    // belt item slot coordinates start from top left corner

    /* The Logic goes like this:
     * 1. check and connect all the middle belts if and only if there is a 'running line' through them, ie behind them is an input and front is output
     * 2. connect all the edge connections to all the middle pieces
     * 3. this leaves 3 edge cases out, later correct them
     *		the edges cases are:
     *			-corners
     *			-1 out 2 split in '>v<' and reverse of that
     *			-2 in 2 out in a corner style - ie put two corners by rotating one by 180
     */
    public List <BeltItemSlot> CreateBeltItemSlots()
    {
        myBeltItemSlots = new BeltItemSlot[4, 4];
        List <BeltItemSlot> allBeltItemSlots = new List <BeltItemSlot>();

        for (int x = 1; x < 3; x++)
        {
            for (int y = 1; y < 3; y++)
            {
                myBeltItemSlots[x, y] = new BeltItemSlot(GetBeltPos(x, y));
                allBeltItemSlots.Add(myBeltItemSlots[x, y]);
            }
        }

        runningLineCount = 0;
        for (int x = 1; x < 3; x++)
        {
            for (int y = 1; y < 3; y++)
            {
                if (beltInputs[0] && beltOutputs[2])
                {
                    runningLineCount++;
                    BeltItemSlot.ConnectBelts(myBeltItemSlots[x, y], myBeltItemSlots[x, y + 1]);
                }
                if (beltInputs[1] && beltOutputs[3])
                {
                    runningLineCount++;
                    BeltItemSlot.ConnectBelts(myBeltItemSlots[x, y], myBeltItemSlots[x - 1, y]);
                }
                if (beltInputs[2] && beltOutputs[0])
                {
                    runningLineCount++;
                    BeltItemSlot.ConnectBelts(myBeltItemSlots[x, y], myBeltItemSlots[x, y - 1]);
                }
                if (beltInputs[3] && beltOutputs[1])
                {
                    runningLineCount++;
                    BeltItemSlot.ConnectBelts(myBeltItemSlots[x, y], myBeltItemSlots[x + 1, y]);
                }
            }
        }
        runningLineCount /= 4;

        if (beltInputs[0] || beltOutputs[0])
        {
            for (int x = 1; x < 3; x++)
            {
                myBeltItemSlots[x, 0] = new BeltItemSlot(GetBeltPos(x, 0));
                allBeltItemSlots.Add(myBeltItemSlots[x, 0]);
                if (beltInputs[0])                 // spawn the connection around if input or output
                {
                    BeltItemSlot.ConnectBelts(myBeltItemSlots[x, 0], myBeltItemSlots[x, 1]);
                }
                else
                {
                    BeltItemSlot.ConnectBelts(myBeltItemSlots[x, 1], myBeltItemSlots[x, 0]);
                }
            }
        }
        if (beltInputs[1] || beltOutputs[1])
        {
            for (int y = 1; y < 3; y++)
            {
                myBeltItemSlots[3, y] = new BeltItemSlot(GetBeltPos(3, y));
                allBeltItemSlots.Add(myBeltItemSlots[3, y]);
                if (beltInputs[1])                 // spawn the connection around if input or output
                {
                    BeltItemSlot.ConnectBelts(myBeltItemSlots[3, y], myBeltItemSlots[2, y]);
                }
                else
                {
                    BeltItemSlot.ConnectBelts(myBeltItemSlots[2, y], myBeltItemSlots[3, y]);
                }
            }
        }
        if (beltInputs[2] || beltOutputs[2])
        {
            for (int x = 1; x < 3; x++)
            {
                myBeltItemSlots[x, 3] = new BeltItemSlot(GetBeltPos(x, 3));
                allBeltItemSlots.Add(myBeltItemSlots[x, 3]);
                if (beltInputs[2])                 // spawn the connection around if input or output
                {
                    BeltItemSlot.ConnectBelts(myBeltItemSlots[x, 3], myBeltItemSlots[x, 2]);
                }
                else
                {
                    BeltItemSlot.ConnectBelts(myBeltItemSlots[x, 2], myBeltItemSlots[x, 3]);
                }
            }
        }
        if (beltInputs[3] || beltOutputs[3])
        {
            for (int y = 1; y < 3; y++)
            {
                myBeltItemSlots[0, y] = new BeltItemSlot(GetBeltPos(0, y));
                allBeltItemSlots.Add(myBeltItemSlots[0, y]);
                if (beltInputs[3])                 // spawn the connection around if input or output
                {
                    BeltItemSlot.ConnectBelts(myBeltItemSlots[0, y], myBeltItemSlots[1, y]);
                }
                else
                {
                    BeltItemSlot.ConnectBelts(myBeltItemSlots[1, y], myBeltItemSlots[0, y]);
                }
            }
        }

        // this part is pretty much the hardcoded way of how belts interlock.
        // check the design document to see what exactly this is doing
        // it is pretty much checking if the input/outputs match some of the 'templates' and acts accordingly
        totalEdgeCount = 0;
        for (int i = 0; i < 4; i++)
        {
            totalEdgeCount += (beltInputs[i] || beltOutputs[i]) ? 1 : 0;
        }

        if (runningLineCount == 2 && totalEdgeCount == 4)
        {
            for (int x = 1; x < 3; x++)
            {
                for (int y = 1; y < 3; y++)
                {
                    BeltItemSlot.RemoveAllConnections(myBeltItemSlots[x, y]);
                }
            }

            if (beltInputs[0] && beltInputs[1])
            {
                BeltItemSlot.ConnectBelts(myBeltItemSlots[1, 0], myBeltItemSlots[1, 1]);
                BeltItemSlot.ConnectBelts(myBeltItemSlots[1, 1], myBeltItemSlots[0, 1]);

                BeltItemSlot.ConnectBelts(myBeltItemSlots[3, 2], myBeltItemSlots[2, 2]);
                BeltItemSlot.ConnectBelts(myBeltItemSlots[2, 2], myBeltItemSlots[2, 3]);
            }
            else if (beltInputs[1] && beltInputs[2])
            {
                BeltItemSlot.ConnectBelts(myBeltItemSlots[3, 1], myBeltItemSlots[2, 1]);
                BeltItemSlot.ConnectBelts(myBeltItemSlots[2, 1], myBeltItemSlots[2, 0]);

                BeltItemSlot.ConnectBelts(myBeltItemSlots[1, 3], myBeltItemSlots[1, 2]);
                BeltItemSlot.ConnectBelts(myBeltItemSlots[1, 2], myBeltItemSlots[0, 2]);
            }
            else if (beltInputs[2] && beltInputs[3])
            {
                BeltItemSlot.ConnectBelts(myBeltItemSlots[2, 3], myBeltItemSlots[2, 2]);
                BeltItemSlot.ConnectBelts(myBeltItemSlots[2, 2], myBeltItemSlots[3, 2]);

                BeltItemSlot.ConnectBelts(myBeltItemSlots[0, 1], myBeltItemSlots[1, 1]);
                BeltItemSlot.ConnectBelts(myBeltItemSlots[1, 1], myBeltItemSlots[1, 0]);
            }
            else if (beltInputs[3] && beltInputs[0])
            {
                BeltItemSlot.ConnectBelts(myBeltItemSlots[0, 2], myBeltItemSlots[1, 2]);
                BeltItemSlot.ConnectBelts(myBeltItemSlots[1, 2], myBeltItemSlots[1, 3]);

                BeltItemSlot.ConnectBelts(myBeltItemSlots[2, 0], myBeltItemSlots[2, 1]);
                BeltItemSlot.ConnectBelts(myBeltItemSlots[2, 1], myBeltItemSlots[3, 1]);
            }
        }
        else if (runningLineCount == 0 && totalEdgeCount == 2)
        {
            if (beltInputs[0] && beltOutputs[1])
            {
                BeltItemSlot.ConnectBelts(myBeltItemSlots[1, 1], myBeltItemSlots[1, 2]);
                BeltItemSlot.ConnectBelts(myBeltItemSlots[1, 2], myBeltItemSlots[2, 2]);
            }
            else if (beltInputs[1] && beltOutputs[2])
            {
                BeltItemSlot.ConnectBelts(myBeltItemSlots[2, 1], myBeltItemSlots[1, 1]);
                BeltItemSlot.ConnectBelts(myBeltItemSlots[1, 1], myBeltItemSlots[1, 2]);
            }
            else if (beltInputs[2] && beltOutputs[3])
            {
                BeltItemSlot.ConnectBelts(myBeltItemSlots[2, 2], myBeltItemSlots[2, 1]);
                BeltItemSlot.ConnectBelts(myBeltItemSlots[2, 1], myBeltItemSlots[1, 1]);
            }
            else if (beltInputs[3] && beltOutputs[0])
            {
                BeltItemSlot.ConnectBelts(myBeltItemSlots[1, 2], myBeltItemSlots[2, 2]);
                BeltItemSlot.ConnectBelts(myBeltItemSlots[2, 2], myBeltItemSlots[2, 1]);
            }

            if (beltInputs[1] && beltOutputs[0])
            {
                BeltItemSlot.ConnectBelts(myBeltItemSlots[2, 2], myBeltItemSlots[1, 2]);
                BeltItemSlot.ConnectBelts(myBeltItemSlots[1, 2], myBeltItemSlots[1, 1]);
            }
            else if (beltInputs[2] && beltOutputs[1])
            {
                BeltItemSlot.ConnectBelts(myBeltItemSlots[1, 2], myBeltItemSlots[1, 1]);
                BeltItemSlot.ConnectBelts(myBeltItemSlots[1, 1], myBeltItemSlots[2, 1]);
            }
            else if (beltInputs[3] && beltOutputs[2])
            {
                BeltItemSlot.ConnectBelts(myBeltItemSlots[1, 1], myBeltItemSlots[2, 1]);
                BeltItemSlot.ConnectBelts(myBeltItemSlots[2, 1], myBeltItemSlots[2, 2]);
            }
            else if (beltInputs[0] && beltOutputs[3])
            {
                BeltItemSlot.ConnectBelts(myBeltItemSlots[2, 1], myBeltItemSlots[2, 2]);
                BeltItemSlot.ConnectBelts(myBeltItemSlots[2, 2], myBeltItemSlots[1, 2]);
            }
        }
        else if (runningLineCount == 0 && totalEdgeCount == 3)
        {
            if (beltInputs[0] && beltOutputs[1] && beltOutputs[3])
            {
                BeltItemSlot.ConnectBelts(myBeltItemSlots[2, 1], myBeltItemSlots[2, 2]);
                BeltItemSlot.ConnectBelts(myBeltItemSlots[2, 2], myBeltItemSlots[3, 2]);

                BeltItemSlot.ConnectBelts(myBeltItemSlots[1, 1], myBeltItemSlots[1, 2]);
                BeltItemSlot.ConnectBelts(myBeltItemSlots[1, 2], myBeltItemSlots[0, 2]);
            }
            else if (beltInputs[1] && beltOutputs[2] && beltOutputs[0])
            {
                BeltItemSlot.ConnectBelts(myBeltItemSlots[2, 1], myBeltItemSlots[1, 1]);
                BeltItemSlot.ConnectBelts(myBeltItemSlots[1, 1], myBeltItemSlots[1, 0]);

                BeltItemSlot.ConnectBelts(myBeltItemSlots[2, 2], myBeltItemSlots[1, 2]);
                BeltItemSlot.ConnectBelts(myBeltItemSlots[1, 2], myBeltItemSlots[1, 3]);
            }
            else if (beltInputs[2] && beltOutputs[3] && beltOutputs[1])
            {
                BeltItemSlot.ConnectBelts(myBeltItemSlots[2, 2], myBeltItemSlots[2, 1]);
                BeltItemSlot.ConnectBelts(myBeltItemSlots[2, 1], myBeltItemSlots[3, 1]);

                BeltItemSlot.ConnectBelts(myBeltItemSlots[1, 2], myBeltItemSlots[1, 1]);
                BeltItemSlot.ConnectBelts(myBeltItemSlots[1, 1], myBeltItemSlots[0, 1]);
            }
            else if (beltInputs[3] && beltOutputs[0] && beltOutputs[2])
            {
                BeltItemSlot.ConnectBelts(myBeltItemSlots[1, 2], myBeltItemSlots[2, 2]);
                BeltItemSlot.ConnectBelts(myBeltItemSlots[2, 2], myBeltItemSlots[2, 3]);

                BeltItemSlot.ConnectBelts(myBeltItemSlots[1, 1], myBeltItemSlots[2, 1]);
                BeltItemSlot.ConnectBelts(myBeltItemSlots[2, 1], myBeltItemSlots[2, 0]);
            }
        }

        return(allBeltItemSlots);
    }