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); } }
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++; }
//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); }
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); }
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); }
//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); }
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); }
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--; } } }
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); }
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); } }
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]); } }
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; } }
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++; }
// 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)); } }
// 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]); } } } } }
// 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(); }
// 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); }