示例#1
0
 public void ImmediateSave(int tick = -100)
 {
     if (tick == -100)
     {
         tick = Timekeeper.getInstance().getTick();
     }
     memComponent.hashtable[tick] = memComponent.memory;
 }
示例#2
0
    // Update is called once per frame
    void FixedUpdate()
    {
        int tick = Timekeeper.getInstance().getTick();

        // If it's before or after the active period, byebye
        if ((tick < memComponent.firstActiveTick) ||
            (tick > memComponent.lastActiveTick))
        {
            transform.position = new Vector3(-100, -100, -10);
            return;
        }


        // Else we have to update the position and opacity etc.
        switch (memComponent.state)
        {
        case Memory.MemoryEvent.reposition:

            if (memComponent.position == memComponent.destPosition)
            {
                // Staying still;
                transform.position =
                    MapGenerator.PositionFor(memComponent.position, -1);
            }
            else // Need to tween movement
            {
                transform.position =
                    MapGenerator.PositionFor(memComponent.position,
                                             memComponent.destPosition,
                                             memComponent.progress);
            }


            // Update sprite for rotation
            int rotation = memComponent.position.third;

            if (animator != null)
            {
                animator.SetInteger("Direction", memComponent.position.third);
                animator.transform.rotation = Quaternion.identity;
            }
            transform.rotation = directions[rotation];
            break;

        case Memory.MemoryEvent.appearing:
            spriteRenderer.color = new Color(1, 1, 1, memComponent.progress);
            break;

        case Memory.MemoryEvent.disappearing:
            spriteRenderer.color = new Color(1, 1, 1, 1.0f - memComponent.progress);
            break;

        case Memory.MemoryEvent.inactive:
            spriteRenderer.color = Color.clear;
            break;
        }
    }
示例#3
0
    void OnTriggerEnter2D(Collider2D other)
    {
        // Check the provided Collider2D parameter other to see if it is tagged
        // "PickUp", if it is...

        if (other.gameObject.CompareTag("Player"))
        {
            timekeeper = Timekeeper.getInstance();
            startTime  = timekeeper.getTime();
            hasEntered = true;
        }
    }
    void generatePath()
    {
        Timekeeper timekeeper    = Timekeeper.getInstance();
        Tuple3I    position      = memComponent.position;
        int        startTick     = timekeeper.getTick();
        int        moveTick      = timekeeper.GetTickIn(fadeTime);
        float      tickIncrement = 1.0f / (moveTick - startTick);
        float      progress      = 0;
        Memory     memory;

        // Add first reposition memory
        memory = new Memory(Memory.MemoryEvent.reposition,
                            position);
        memComponent.hashtable[moveTick] = memory;

        // Create appearing animation
        for (int tick = startTick + 1; tick <= moveTick; tick++)
        {
            memory = new Memory(Memory.MemoryEvent.appearing,
                                progress += tickIncrement);
            memComponent.hashtable[tick]  = memory;
        }

        int speedTicks = timekeeper.GetTickIn(speed) - timekeeper.getTick();

        moveTick++;

        // Add subsequent reposition memories
        while (MapGenerator.GetPathValueFor(position) != 1)
        {
            moveTick += speedTicks;
            if ((moveTick - startTick) / speedTicks > 1000) // more than 1000 steps
            {
                Debug.Log("Path taking too long!");
                return;
            }
            position = NextPathFor(position);
            memory   = new Memory(Memory.MemoryEvent.reposition,
                                  position);
            memComponent.hashtable[moveTick] = memory;
        }

        // Add animation for climbing the ladder
        position.third = 1;
        Tuple3I newPosition = position + new Tuple3I(1, 0, 0);

        for (int i = 0; i < 16; i++)
        {
            memory = new Memory(Memory.MemoryEvent.reposition, position, newPosition, i * 1.0f / 16);
            memComponent.hashtable[moveTick + i] = memory;
        }
    }
    // Update is called once per frame
    void Update()
    {
        if (spriteRenderer == null)
        {
            return;
        }

        if (MapGenerator.GetPathValueFor(memComponent.position) <= 5 && MapGenerator.GetPathValueFor(memComponent.position) != 1)
        {
            alertObj.SetActive(true);
        }
        else
        {
            alertObj.SetActive(false);
        }

        if (observed.first == observed.second)
        {
            spriteRenderer.color = new Color(1, 1, 1, 1.0f);
            int tick = Timekeeper.getInstance().getTick();

            if ((tick <= memComponent.firstActiveTick) ||
                (tick >= memComponent.lastActiveTick))
            {
                return;
            }
            memComponent.lastActiveTick = tick;

            memComponent.SetInactive();
            GetComponent <MemorySystem>().ImmediateSave();

            memComponent.enabled = false;
            GetComponent <MovementSystem>().enabled = false;
            this.enabled = false;

            GetComponent <AudioSource>().Play();
            GetComponent <AnimatorChildComponent>().animator.runtimeAnimatorController =
                disappearAnimation;
            spriteRenderer.sprite = disappearSprite;

            chargeComponent.Increment();
        }
        else
        {
            spriteRenderer.color = new Color(1,
                                             1,
                                             1, 1.0f -
                                             (float)observed.first / observed.second);
        }
    }
示例#6
0
    public void Spawn(int[] enemies)
    {
        Timekeeper timekeeper = Timekeeper.getInstance();

        foreach (GameObject enemy in currentEnemies)
        {
            Destroy(enemy, 1.0f);
        }
        currentEnemies.Clear();

        int spritesLength = enemyAnimators.Length;
        int spriteIndex   = Random.Range(0, spritesLength);

        // Spawn for each entangled group
        for (int i = 0; i < enemies.Length; i++)
        {
            GameObject[] twins    = new GameObject[enemies[i]];
            TupleI       observed = new TupleI(0, enemies[i]);

            for (int j = 0; j < enemies[i]; j++)
            {
                GameObject newEnemy = Instantiate(enemyPrefab,
                                                  Vector3.zero,
                                                  Quaternion.identity);

                twins[j]      = newEnemy;
                newEnemy.name = "Enemy-" + wave + "-" + i + "-" + j;

                currentEnemies.Add(newEnemy);

                newEnemy.GetComponent <MemoryComponent>().position =
                    randomValidPosition();
                newEnemy.GetComponent <MemoryComponent>().firstActiveTick =
                    timekeeper.getTick();

                newEnemy.GetComponent <AnimatorChildComponent>().animator.
                runtimeAnimatorController = enemyAnimators[spriteIndex];

                EnemyObservingSystem observer =
                    newEnemy.GetComponent <EnemyObservingSystem>();
                observer.twins           = twins;
                observer.observed        = observed;
                observer.spawnSystem     = this;
                observer.chargeComponent = GetComponent <ChargeComponent>();
            }

            spriteIndex = (spriteIndex + 1) % spritesLength;
        }
    }
示例#7
0
    // Update is called once per frame
    void Update()
    {
        int tick = Timekeeper.getInstance().getTick();

        if ((tick < memComponent.firstActiveTick) ||
            (tick > memComponent.lastActiveTick))
        {
            return;
        }

        if (memComponent.hashtable.ContainsKey(tick))
        {
            memComponent.memory = (Memory)memComponent.hashtable[tick];
        }
        else if (memComponent.memory != null)
        {
            memComponent.hashtable[tick] = memComponent.memory;
        }
    }
示例#8
0
    public bool IsActive()
    {
        int time = Timekeeper.getInstance().getTick();

        return(time > firstActiveTick && time < lastActiveTick);
    }
示例#9
0
 void Start()
 {
     spawnSystem = GetComponent <EnemySpawnSystem>();
     timekeeper  = Timekeeper.getInstance();
 }
    // FixedUpdate is called at a fixed interval and is independent of frame rate.
    // Put physics code here.
    void FixedUpdate()
    {
        if (timekeeper == null)
        {
            timekeeper = Timekeeper.getInstance();
        }

        if (!underControl)
        {
            return;
        }


        bool travel = Input.GetKeyUp("space");

        switch (state)
        {
        case State.walking:

            if (travel && (chargeComponent.chargesLeft >= 1))
            {
                lastPressTime = timekeeper.getTime();
                willStartTraveling();
            }

            // only accept input after a cooldown
            if ((timekeeper.getTime() - lastPressTime) < cooldown)
            {
                // walking.progress
                memComponent.advance(Time.deltaTime / cooldown);
                return;
            }
            memComponent.position = memComponent.destPosition;
            memComponent.progress = 0;

            // Store the current horizontal input in the float moveHorizontal.
            float horizontalAxis = Input.GetAxis("Horizontal");

            // Store the current vertical input in the float moveVertical.
            float verticalAxis = Input.GetAxis("Vertical");

            if (horizontalAxis != 0)
            {
                int moveHorizontal = (horizontalAxis > 0) ? 1 : -1;
                memComponent.turnTowards(1 - moveHorizontal);

                if ((horizontalAxis >= 1.0f) || (horizontalAxis <= -1.0f))
                {
                    lastPressTime = timekeeper.getTime();

                    // direction = 1 if right (moveHorizontal  =1)
                    // direction = 3 if left (moveHorizontal = -1)
                    memComponent.deltaPosition(0, moveHorizontal, 1 - moveHorizontal);
                }
            }
            else if (verticalAxis != 0)
            {
                int moveVertical = (verticalAxis > 0) ? 1 : -1;
                memComponent.turnTowards(2 - moveVertical);

                if ((verticalAxis >= 1.0f) || (verticalAxis <= -1.0f))
                {
                    // direction = 2 if up (moveVertical  =1)
                    // direction = 4 if down (moveVertical = -1)
                    lastPressTime = timekeeper.getTime();
                    memComponent.deltaPosition(moveVertical, 0, 2 - moveVertical);
                }
            }
            break;

        // Handle transitions
        case State.transitioning:
            memComponent.progress += Time.deltaTime / transitionTime;

            if (memComponent.progress < 1)
            {
                return;
            }

            // Finished transition
            if (memComponent.state == Memory.MemoryEvent.appearing)
            {
                startWalking();
                return;
            }
            else if (memComponent.state == Memory.MemoryEvent.disappearing)
            {
                startTraveling();
                return;
            }
            else
            {
                Debug.Log("Invalid state in PlayerControllerSystem");
            }
            break;
        }
    }
示例#11
0
 void Start()
 {
     controllerSystem = GetComponent <PlayerControllerSystem>();
     timekeeper       = Timekeeper.getInstance();
     waveController   = GetComponent <WaveControllerSystem>();
 }