public override void Recompile(TrackingSpaceRoot ram) { var memoryPointer = HardwareRequirements.MemoryPointer.Value; var allocatedMemory = HardwareRequirements.AllocatedMemory; var tilesAvailable = ram.TileAvailable; var dimensions = ram.GetTileAmountTotal(); var reversed = HardwareRequirements.Reversed; //check where there is first 2m wall, place there //check all walls var upperWall = true; var rightWall = true; var lowerWall = true; var leftWall = true; for (var x = memoryPointer.x; x < memoryPointer.x + allocatedMemory.x; x++) { for (var z = memoryPointer.y; z < memoryPointer.y + allocatedMemory.y; z++) { if (x == memoryPointer.x) { leftWall = leftWall && (x == 0 || !tilesAvailable[x - 1, z]); } if (z == memoryPointer.y) { lowerWall = lowerWall && (z == 0 || !tilesAvailable[x, z - 1]); } if (z == memoryPointer.y + allocatedMemory.y - 1) { upperWall = upperWall && (z + 1 == dimensions.y || !tilesAvailable[x, z + 1]); } if (x == memoryPointer.x + allocatedMemory.x - 1) { rightWall = rightWall && (x + 1 == dimensions.x || !tilesAvailable[x + 1, z]); } } } //set position and rotation var position2 = ram.GetSpaceFromPosition(memoryPointer); var position3 = new Vector3(position2.x, 0f, position2.y); transform.position = position3; switch (PlacementOfDoors) { case DoorPlacement.StraightBig: if (upperWall && !reversed) { transform.position = position3 + (allocatedMemory.y - 1) * Vector3.forward; transform.localRotation = Quaternion.Euler(0f, 0f, 0f); } else if (rightWall && reversed) { transform.position = position3 + Vector3.forward + (allocatedMemory.x - 1) * Vector3.right; transform.localRotation = Quaternion.Euler(0f, 90f, 0f); } else if (lowerWall && !reversed) { transform.position = position3 + Vector3.right; transform.localRotation = Quaternion.Euler(0f, 180f, 0f); } else { if (!(leftWall && reversed)) { Debug.LogError(gameObject.name + "/" + transform.parent.gameObject.name + " no fitting wall"); } transform.position = position3; transform.localRotation = Quaternion.Euler(0f, -90f, 0f); } break; case DoorPlacement.CornerSmall: if (upperWall && rightWall) { transform.localRotation = Quaternion.Euler(0f, 0f, 0f); } else if (rightWall && lowerWall) { transform.localRotation = Quaternion.Euler(0f, 90f, 0f); } else if (lowerWall && leftWall) { transform.localRotation = Quaternion.Euler(0f, 180f, 0f); } else { if (!leftWall || !upperWall) { Debug.LogError(gameObject.name + "/" + transform.parent.gameObject.name + " no wall"); } transform.localRotation = Quaternion.Euler(0f, -90f, 0f); } break; case DoorPlacement.StraightSmall: if (leftWall || rightWall) { transform.localRotation = Quaternion.Euler(0f, 0f, 0f); } else { if (!upperWall && !lowerWall) { Debug.LogError(gameObject.name + "/" + transform.parent.gameObject.name + " no wall"); } transform.localRotation = Quaternion.Euler(0f, -90f, 0f); } break; } for (var i = 0; i < Transitions.Count; i++) { Colorize(Transitions[i], i == 0 ? Always1 : Always2); } SetVars(); }
public override void Recompile(TrackingSpaceRoot ram) { var memoryPointer = HardwareRequirements.MemoryPointer.Value; var allocatedMemory = HardwareRequirements.AllocatedMemory; _readyToFire = new Dictionary <PetrinetTransition, bool>(); var tilesAvailable = ram.TileAvailable; var dimensions = ram.GetTileAmountTotal(); //debug floor object var pos = Vector2.zero; for (var i = 0; i < allocatedMemory.x; i++) { for (var j = 0; j < allocatedMemory.y; j++) { pos += ram.GetSpaceFromPosition(memoryPointer.x + i, memoryPointer.y + j); } } pos /= allocatedMemory.x * allocatedMemory.y; //pos += ram.GetSpaceFromPosition(memoryPointer); if (FloorObject != null) { var go = CompileLibraryObject(FloorObject, pos, 0f, "floor_" + gameObject.name); go.transform.localScale = new Vector3(allocatedMemory.x, 1f, allocatedMemory.y); } //check where there is first 2m wall, place there //check all walls var upperWall = allocatedMemory.x > 1; var rightWall = allocatedMemory.y > 1; var lowerWall = allocatedMemory.x > 1; var leftWall = allocatedMemory.y > 1; for (var x = memoryPointer.x; x < memoryPointer.x + allocatedMemory.x; x++) { for (var z = memoryPointer.y; z < memoryPointer.y + allocatedMemory.y; z++) { if (x == memoryPointer.x) { leftWall = leftWall && (x == 0 || !tilesAvailable[x - 1, z]); } if (z == memoryPointer.y) { lowerWall = lowerWall && (z == 0 || !tilesAvailable[x, z - 1]); } if (z == memoryPointer.y + allocatedMemory.y - 1) { upperWall = upperWall && (z + 1 == dimensions.y || !tilesAvailable[x, z + 1]); } if (x == memoryPointer.x + allocatedMemory.x - 1) { rightWall = rightWall && (x + 1 == dimensions.x || !tilesAvailable[x + 1, z]); } } } //set position and rotation var position2 = ram.GetSpaceFromPosition(memoryPointer); var position3 = new Vector3(position2.x, 0f, position2.y); if (upperWall) { transform.position = position3 + (allocatedMemory.y - 1) * Vector3.forward; transform.localRotation = Quaternion.Euler(0f, 0f, 0f); } else if (rightWall) { transform.position = position3 + Vector3.forward + (allocatedMemory.x - 1) * Vector3.right; transform.localRotation = Quaternion.Euler(0f, 90f, 0f); } else if (lowerWall) { transform.position = position3 + Vector3.right; transform.localRotation = Quaternion.Euler(0f, 180f, 0f); } else { if (!leftWall) { Debug.LogError(gameObject.name + "/" + transform.parent.gameObject.name + " no wall"); } transform.position = position3; transform.localRotation = Quaternion.Euler(0f, -90f, 0f); } //init vars _colliderToTransition = new Dictionary <Collider, PetrinetTransition> { { Collider1To2Trigger, Transitions[0] }, { Collider2To1Trigger, Transitions[1] } }; _transitionToViz = new Dictionary <PetrinetTransition, GameObject> { { Transitions[0], Viz1 }, { Transitions[1], Viz2 } }; _playerTransform = GameObject.Find(PlayerObject).transform; _compiled = true; }