Example #1
0
        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;
        }