void Awake()
    {
        Instance    = this;
        playerThing = GetComponent <PlayerThing>();

        centerMessageStyle                  = new GUIStyle();
        centerMessageStyle.font             = GuiFont;
        centerMessageStyle.normal.textColor = new Color(1, .75f, .5f, 1f);
        centerMessageStyle.fontSize         = 20;
        centerMessageStyle.alignment        = TextAnchor.MiddleCenter;

        whiteGuiStyle                  = new GUIStyle();
        whiteGuiStyle.font             = GuiFont;
        whiteGuiStyle.normal.textColor = new Color(1, 1, 1, .5f);
        whiteGuiStyle.fontSize         = 10;
        whiteGuiStyle.alignment        = TextAnchor.MiddleLeft;

        ammoGuiStyle                  = new GUIStyle();
        ammoGuiStyle.font             = GuiFont;
        ammoGuiStyle.normal.textColor = new Color(1, .5f, 0, .5f);
        ammoGuiStyle.fontSize         = 10;
        ammoGuiStyle.alignment        = TextAnchor.MiddleRight;

        healthGuiStyle                  = new GUIStyle();
        healthGuiStyle.font             = GuiFont;
        healthGuiStyle.normal.textColor = new Color(1, 0, 0, .5f);
        healthGuiStyle.fontSize         = 10;
        healthGuiStyle.alignment        = TextAnchor.MiddleLeft;
    }
Esempio n. 2
0
    void Awake()
    {
        controller  = GetComponent <CharacterController>();
        audioSource = GetComponent <AudioSource>();
        playerThing = GetComponent <PlayerThing>();

        Instance = this;
    }
Esempio n. 3
0
 private void Awake()
 {
     if (instance == null)
     {
         instance = this;
         DontDestroyOnLoad(this);
     }
     else if (instance != this)
     {
         Destroy(this);
     }
 }
    bool CanMeleeRay(float distance)
    {
        PlayerThing player   = GameManager.Instance.Player[0];
        Vector3     from     = owner.transform.position + Vector3.up * AttackHeight;
        Vector3     toPlayer = (player.transform.position - from).normalized;
        Ray         ray      = new Ray(from, toPlayer);

        RaycastHit hit;

        if (Physics.Raycast(ray, out hit, distance, ~((1 << 9) | (1 << 10) | (1 << 11) | (1 << 12) | (1 << 14)), QueryTriggerInteraction.Ignore))
        {
            return(false);
        }

        return(true);
    }
    bool SeePlayerRay(out Ray ray, int attempts = 1)
    {
        PlayerThing player = GameManager.Instance.Player[0];

        if (player == null)
        {
            ray = new Ray();
            return(false);
        }

        Vector3 eyePos   = owner.transform.position + Vector3.up * EyeHeight;
        Vector3 toPlayer = ((player.transform.position + Random.onUnitSphere * player.RayCastSphereRadius) - eyePos).normalized;

        ray = new Ray(eyePos, toPlayer);

        if (Vector3.Dot(owner.transform.forward, toPlayer) < ViewFrustumMin)
        {
            return(false);
        }

        while (attempts > 0)
        {
            RaycastHit hit;
            if (Physics.Raycast(ray, out hit, SeeDistance, ~((1 << 9) | (1 << 11) | (1 << 14)), QueryTriggerInteraction.Ignore))
            {
                if (hit.collider.GetComponent <PlayerThing>() != null)
                {
                    return(true);
                }
            }

            toPlayer = ((player.transform.position + Random.onUnitSphere * player.RayCastSphereRadius) - eyePos).normalized;
            ray      = new Ray(eyePos, toPlayer);
            attempts--;
        }

        return(false);
    }
    void OnTriggerEnter(Collider other)
    {
        PlayerThing player = other.GetComponent <PlayerThing>();

        if (player == null)
        {
            return;
        }

        bool destroy = false;

        switch (itemType)
        {
        default:
            break;

        case ItemType.Bullets:
            if (PlayerInfo.Instance.Ammo[0] == PlayerInfo.Instance.MaxAmmo[0])
            {
                break;
            }
            PlayerInfo.Instance.Ammo[0] += amount;
            if (PlayerInfo.Instance.Ammo[0] > PlayerInfo.Instance.MaxAmmo[0])
            {
                PlayerInfo.Instance.Ammo[0] = PlayerInfo.Instance.MaxAmmo[0];
            }
            destroy = true;
            break;

        case ItemType.Shells:
            if (PlayerInfo.Instance.Ammo[1] == PlayerInfo.Instance.MaxAmmo[1])
            {
                break;
            }
            PlayerInfo.Instance.Ammo[1] += amount;
            if (PlayerInfo.Instance.Ammo[1] > PlayerInfo.Instance.MaxAmmo[1])
            {
                PlayerInfo.Instance.Ammo[1] = PlayerInfo.Instance.MaxAmmo[1];
            }
            destroy = true;
            break;

        case ItemType.Rockets:
            if (PlayerInfo.Instance.Ammo[2] == PlayerInfo.Instance.MaxAmmo[2])
            {
                break;
            }
            PlayerInfo.Instance.Ammo[2] += amount;
            if (PlayerInfo.Instance.Ammo[2] > PlayerInfo.Instance.MaxAmmo[2])
            {
                PlayerInfo.Instance.Ammo[2] = PlayerInfo.Instance.MaxAmmo[2];
            }
            destroy = true;
            break;

        case ItemType.Health:
            if (bonus)
            {
                if (player.hitpoints == PlayerInfo.Instance.MaxBonusHealth)
                {
                    break;
                }

                player.hitpoints += amount;
                if (player.hitpoints > PlayerInfo.Instance.MaxBonusHealth)
                {
                    player.hitpoints = PlayerInfo.Instance.MaxBonusHealth;
                }
            }
            else
            {
                if (player.hitpoints >= PlayerInfo.Instance.MaxHealth)
                {
                    break;
                }

                player.hitpoints += amount;
                if (player.hitpoints > PlayerInfo.Instance.MaxHealth)
                {
                    player.hitpoints = PlayerInfo.Instance.MaxHealth;
                }
            }
            destroy = true;
            break;

        case ItemType.Armor:
            if (bonus)
            {
                if (player.armor == PlayerInfo.Instance.MaxBonusArmor)
                {
                    break;
                }

                player.armor += amount;
                if (player.armor > PlayerInfo.Instance.MaxBonusArmor)
                {
                    player.armor = PlayerInfo.Instance.MaxBonusArmor;
                }
            }
            else
            {
                if (player.armor >= PlayerInfo.Instance.MaxArmor)
                {
                    break;
                }

                player.armor += amount;
                if (player.armor > PlayerInfo.Instance.MaxArmor)
                {
                    player.armor = PlayerInfo.Instance.MaxArmor;
                }
            }

            destroy = true;
            break;

        case ItemType.Keycard:
            if (PlayerInfo.Instance.Keycards[givesKeycard])
            {
                break;
            }

            PlayerInfo.Instance.Keycards[givesKeycard] = true;

            //to allow making of skullkeys eventually
            if (givesKeycard == 0)
            {
                PlayerInfo.Instance.bluekeyTexture = TextureLoader.Instance.GetSpriteTexture("BKEYA0");
            }
            if (givesKeycard == 1)
            {
                PlayerInfo.Instance.yellowkeyTexture = TextureLoader.Instance.GetSpriteTexture("YKEYA0");
            }
            if (givesKeycard == 2)
            {
                PlayerInfo.Instance.redkeyTexture = TextureLoader.Instance.GetSpriteTexture("RKEYA0");
            }

            destroy = true;
            break;

        case ItemType.Backpack:
            PlayerInfo.Instance.MaxAmmo[0] = 400;
            PlayerInfo.Instance.MaxAmmo[1] = 100;
            PlayerInfo.Instance.MaxAmmo[2] = 100;

            PlayerInfo.Instance.Ammo[0] += 10;
            if (PlayerInfo.Instance.Ammo[0] > PlayerInfo.Instance.MaxAmmo[0])
            {
                PlayerInfo.Instance.Ammo[0] = PlayerInfo.Instance.MaxAmmo[0];
            }
            PlayerInfo.Instance.Ammo[1] += 4;
            if (PlayerInfo.Instance.Ammo[1] > PlayerInfo.Instance.MaxAmmo[1])
            {
                PlayerInfo.Instance.Ammo[1] = PlayerInfo.Instance.MaxAmmo[1];
            }
            PlayerInfo.Instance.Ammo[2] += 1;
            if (PlayerInfo.Instance.Ammo[2] > PlayerInfo.Instance.MaxAmmo[2])
            {
                PlayerInfo.Instance.Ammo[2] = PlayerInfo.Instance.MaxAmmo[2];
            }

            destroy = true;
            break;
        }

        if (givesWeapon != -1)
        {
            if (givesWeapon >= 0 && givesWeapon < PlayerInfo.Instance.Weapon.Length)
            {
                if (!PlayerInfo.Instance.Weapon[givesWeapon])
                {
                    PlayerInfo.Instance.Weapon[givesWeapon] = true;
                    PlayerControls.Instance.TrySwapWeapon(givesWeapon);
                }
            }

            destroy = true;
        }

        if (destroy)
        {
            PlayerInfo.Instance.pickupFlashTime = 1f;

            if (!string.IsNullOrEmpty(PickupSound))
            {
                GameManager.Create3DSound(transform.position, PickupSound, 1f);
            }

            Destroy(gameObject);
        }
    }
    public override void Tick()
    {
        if (!alert)
        {
            if (decisionTime > 0f)
            {
                decisionTime -= Time.deltaTime;
                return;
            }
            decisionTime = Random.Range(.4f, .6f);

            int distance = AxMath.WeightedDistance(owner.cell, GameManager.Instance.Player[0].cell);
            if (distance > SeeDistance)
            {
                return;
            }

            if (Random.value <= NearSoundChanceSleeping)
            {
                if (mc.NearSounds.Length > 0)
                {
                    if (!mc.audioSource.isPlaying)
                    {
                        mc.audioSource.clip = mc.NearSounds[Random.Range(0, mc.NearSounds.Length)];
                        mc.audioSource.Play();
                    }
                }
            }

            if (SeePlayerRay())
            {
                alert        = true;
                decisionTime = 0f;
            }

            if (!alert)
            {
                return;
            }
        }

        if (painFrame)
        {
            mc.moveVector = Vector3.zero;
            painFrame     = false;
            attackTime    = 0f;
            decisionTime  = 0f;
            return;
        }

        if (attackTime > 0f)
        {
            attackTime -= Time.deltaTime;

            Vector3 aimAt = (GameManager.Instance.Player[0].transform.position - mc.transform.position).normalized;
            //mc.transform.rotation = Quaternion.LookRotation(Vector3.Lerp(mc.transform.forward, new Vector3(aimAt.x, 0, aimAt.z), Time.deltaTime * mc.turnSpeed), Vector3.up);
            //instantenous rotation towards target
            mc.transform.rotation = Quaternion.LookRotation(new Vector3(aimAt.x, 0, aimAt.z), Vector3.up);

            if (attackTime < AttackHappenTime && !attacked)
            {
                attacked = true;

                if (mc.AttackSounds.Length > 0)
                {
                    GameManager.Create3DSound(mc.transform.position, mc.AttackSounds[Random.Range(0, mc.AttackSounds.Length)], 10f);
                }

                PlayerThing player = GameManager.Instance.Player[0];
                if (player != null)
                {
                    //swap layers for a while to avoid hitting self
                    int originalLayer = owner.gameObject.layer;
                    owner.gameObject.layer = 9;

                    for (int i = 0; i < shotCount; i++)
                    {
                        Vector3 eyePos   = owner.transform.position + Vector3.up * EyeHeight;
                        Vector3 toPlayer = ((player.transform.position + Random.onUnitSphere * player.RayCastSphereRadius) - eyePos).normalized;
                        toPlayer += Random.insideUnitSphere * attackSpread;
                        toPlayer.Normalize();
                        Ray ray = new Ray(eyePos, toPlayer);

                        /*GameObject visualLine = new GameObject();
                         * LineRenderer lr = visualLine.AddComponent<LineRenderer>();
                         * lr.positionCount = 2;
                         * lr.SetPosition(0, ray.origin);
                         * lr.SetPosition(1, ray.origin + ray.direction * 200);
                         * lr.widthMultiplier = .02f;
                         * visualLine.AddComponent<DestroyAfterTime>();*/

                        RaycastHit hit;
                        if (Physics.Raycast(ray, out hit, 200, ~((1 << 9) | (1 << 14)), QueryTriggerInteraction.Ignore))
                        {
                            Damageable target = hit.collider.gameObject.GetComponent <Damageable>();
                            if (target != null)
                            {
                                target.Damage(Random.Range(DamageMin, DamageMax + 1), DamageType.Generic, owner.gameObject);

                                if (target.Bleed)
                                {
                                    GameObject blood = GameObject.Instantiate(GameManager.Instance.BloodDrop);
                                    blood.transform.position = hit.point - ray.direction * .2f;
                                }
                                else
                                {
                                    GameObject puff = GameObject.Instantiate(GameManager.Instance.BulletPuff);
                                    puff.transform.position = hit.point - ray.direction * .2f;
                                }
                            }
                            else
                            {
                                GameObject puff = GameObject.Instantiate(GameManager.Instance.BulletPuff);
                                puff.transform.position = hit.point - ray.direction * .2f;
                            }
                        }
                    }

                    owner.gameObject.layer = originalLayer;
                }
            }

            return;
        }

        if (wantDirection != Vector3.zero)
        {
            mc.transform.rotation = Quaternion.LookRotation(Vector3.Lerp(mc.transform.forward, wantDirection, Time.deltaTime * mc.turnSpeed), Vector3.up);
        }

        if (decisionTime > 0f)
        {
            decisionTime -= Time.deltaTime;
            return;
        }

        if (Random.value <= PokeChance)
        {
            Ray        ray = new Ray(owner.transform.position + Vector3.up, owner.transform.forward);
            RaycastHit hit;
            if (Physics.Raycast(ray, out hit, 2, ~((1 << 9) | (1 << 11)), QueryTriggerInteraction.Ignore))
            {
                Pokeable lc = hit.collider.gameObject.GetComponent <Pokeable>();
                if (lc != null)
                {
                    if (lc.AllowMonsters())
                    {
                        lc.Poke(owner.gameObject);
                    }
                }
            }
        }

        if (Random.value <= NearSoundChanceAwake)
        {
            if (mc.NearSounds.Length > 0)
            {
                if (!mc.audioSource.isPlaying)
                {
                    mc.audioSource.clip = mc.NearSounds[Random.Range(0, mc.NearSounds.Length)];
                    mc.audioSource.Play();
                }
            }
        }

        decisionTime  = Random.Range(.4f, .6f);
        wantDirection = Vector3.zero;

        bool aggro = false;

        if (Random.value < AggroChance)
        {
            Ray toPlayer;
            if (SeePlayerRay(out toPlayer))
            {
                wantDirection = new Vector3(toPlayer.direction.x, 0, toPlayer.direction.z);
                wantMove      = false;
                aggro         = true;
                attacked      = false;
                attackTime    = 1f;
                decisionTime  = 0f;
                mc.InitAttackAnimation();
            }
        }

        if (!aggro)
        {
            float moveRoll = Random.value;
            if (moveRoll < randomMoveChance)
            {
                MoveToRandomNearbyCell();
            }
            else if (moveRoll < closestMoveChance)
            {
                if (!MoveToRandomClosestBreath())
                {
                    MoveToRandomNearbyCell();
                }
            }
            else
            {
                if (!MoveTowardsBreath())
                {
                    if (!MoveToRandomClosestBreath())
                    {
                        MoveToRandomNearbyCell();
                    }
                }
            }
        }

        if (Random.value < IdleChance)
        {
            wantMove = false;
        }

        if (wantMove)
        {
            mc.moveVector.x = 1;
        }
        else
        {
            mc.moveVector.x = 0;
        }
    }
Esempio n. 8
0
    public static void ApplyLinedefBehavior()
    {
        Transform holder = new GameObject("DynamicMeshes").transform;

        holder.transform.SetParent(GameManager.Instance.transform);

        int index = -1;

        foreach (Linedef l in linedefs)
        {
            index++;

            if (l.lineType == 0)
            {
                continue;
            }

            switch (l.lineType)
            {
            default:
                Debug.Log("Linedef " + index + " has unknown type (" + l.lineType + ")");
                break;

            //common door
            case 1:
            case 26:     //keycard doors
            case 27:
            case 28:
            {
                if (l.TopFrontObject == null)
                {
                    break;
                }

                if (l.Back == null)
                {
                    break;
                }

                l.Back.Sector.ceilingObject.transform.SetParent(holder);

                Door1Controller lc = l.TopFrontObject.AddComponent <Door1Controller>();

                if (l.lineType == 26)
                {
                    lc.requiresKeycard = 0;
                }
                if (l.lineType == 27)
                {
                    lc.requiresKeycard = 1;
                }
                if (l.lineType == 28)
                {
                    lc.requiresKeycard = 2;
                }

                SlowRepeatableDoorController sc = l.Back.Sector.ceilingObject.GetComponent <SlowRepeatableDoorController>();
                if (sc == null)
                {
                    sc = l.Back.Sector.ceilingObject.AddComponent <SlowRepeatableDoorController>();
                }

                sc.Init(l.Back.Sector);
                lc.sectorController = sc;

                l.Back.Sector.Dynamic = true;
            }
            break;

            //single use door, walk trigger
            case 2:
            {
                if (!Sector.TaggedSectors.ContainsKey(l.lineTag))
                {
                    break;
                }

                List <SlowOneshotDoorController> linked = new List <SlowOneshotDoorController>();
                foreach (Sector sector in Sector.TaggedSectors[l.lineTag])
                {
                    sector.ceilingObject.transform.SetParent(holder);

                    SlowOneshotDoorController sc = sector.ceilingObject.GetComponent <SlowOneshotDoorController>();
                    if (sc == null)
                    {
                        sc = sector.ceilingObject.gameObject.AddComponent <SlowOneshotDoorController>();
                        sc.Init(sector);
                    }
                    linked.Add(sc);

                    sector.Dynamic = true;
                }

                BoxCollider mc = Mesher.CreateLineTriggerCollider(
                    l,
                    Mathf.Min(l.Front.Sector.minimumFloorHeight, l.Back.Sector.minimumFloorHeight),
                    Mathf.Max(l.Front.Sector.maximumCeilingHeight, l.Back.Sector.maximumCeilingHeight),
                    "Tag_" + l.lineTag + "_trigger",
                    holder
                    );

                if (mc == null)
                {
                    Debug.LogError("Linedef " + index + " could not create trigger. Type(" + l.lineType + ")");
                    break;
                }

                mc.isTrigger = true;

                LineTrigger lt = mc.gameObject.AddComponent <LineTrigger>();
                lt.TriggerAction = (c) =>
                {
                    PlayerThing player = c.GetComponent <PlayerThing>();

                    if (player == null)
                    {
                        return;
                    }

                    foreach (SlowOneshotDoorController lc in linked)
                    {
                        if (lc.CurrentState == SlowOneshotDoorController.State.Closed)
                        {
                            lc.CurrentState = SlowOneshotDoorController.State.Opening;
                        }
                    }
                };
            }
            break;

            //stairbuilder, walktrigger
            case 8:
            {
                if (!Sector.TaggedSectors.ContainsKey(l.lineTag))
                {
                    break;
                }

                List <StairbuilderSlow> linked = new List <StairbuilderSlow>();
                foreach (Sector sector in Sector.TaggedSectors[l.lineTag])
                {
                    sector.floorObject.transform.SetParent(holder);

                    List <Sector> stairSectors = new List <Sector>();
                    Sector        targetSector = sector;

                    int  count  = 0;
                    bool failed = false;
                    while (!failed)
                    {
                        count++;
                        stairSectors.Add(targetSector);
                        targetSector.Dynamic = true;
                        targetSector.floorObject.transform.SetParent(holder);

                        failed = true;
                        foreach (Sidedef s in targetSector.Sidedefs)
                        {
                            if (s.Line.Back == null)
                            {
                                continue;
                            }

                            if (s.Line.Back.Sector == targetSector)
                            {
                                continue;
                            }

                            if (s.Line.Back.Sector.floorTexture != targetSector.floorTexture)
                            {
                                continue;
                            }

                            if (stairSectors.Contains(s.Line.Back.Sector))
                            {
                                continue;
                            }

                            targetSector = s.Line.Back.Sector;
                            failed       = false;
                        }
                    }

                    StairbuilderSlow sc = sector.floorObject.GetComponent <StairbuilderSlow>();
                    if (sc == null)
                    {
                        sc = sector.floorObject.gameObject.AddComponent <StairbuilderSlow>();
                        sc.Init(stairSectors);
                    }
                    linked.Add(sc);
                }

                BoxCollider mc = Mesher.CreateLineTriggerCollider(
                    l,
                    Mathf.Min(l.Front.Sector.minimumFloorHeight, l.Back.Sector.minimumFloorHeight),
                    Mathf.Max(l.Front.Sector.maximumCeilingHeight, l.Back.Sector.maximumCeilingHeight),
                    "Tag_" + l.lineTag + "_trigger",
                    holder
                    );

                if (mc == null)
                {
                    Debug.LogError("Linedef " + index + " could not create trigger. Type(" + l.lineType + ")");
                    break;
                }

                mc.isTrigger = true;

                LineTrigger lt = mc.gameObject.AddComponent <LineTrigger>();
                lt.TriggerAction = (c) =>
                {
                    PlayerThing player = c.GetComponent <PlayerThing>();

                    if (player == null)
                    {
                        return;
                    }

                    foreach (StairbuilderSlow lc in linked)
                    {
                        if (lc.CurrentState == StairbuilderSlow.State.Waiting)
                        {
                            lc.CurrentState = StairbuilderSlow.State.Active;
                        }
                    }
                };
            }
            break;

            //donut, switch
            case 9:
            {
                if (!Sector.TaggedSectors.ContainsKey(l.lineTag))
                {
                    break;
                }

                List <Sector> sectors = Sector.TaggedSectors[l.lineTag];
                if (sectors.Count == 0)
                {
                    break;
                }

                sectors[0].floorObject.transform.SetParent(holder);

                Sector ringSector = null;
                foreach (Sidedef s in sectors[0].Sidedefs)
                {
                    if (s.Line.Back == null)
                    {
                        continue;
                    }

                    if (s.Line.Front.Sector == sectors[0])
                    {
                        ringSector = s.Line.Back.Sector;
                        ringSector.floorObject.transform.SetParent(holder);
                        break;
                    }

                    if (s.Line.Back.Sector == sectors[0])
                    {
                        ringSector = s.Line.Front.Sector;
                        ringSector.floorObject.transform.SetParent(holder);
                        break;
                    }
                }

                if (ringSector == null)
                {
                    Debug.LogError("MapLoader: Donut9Controller: No ring sector found!");
                }

                Donut9SectorController sc = sectors[0].floorObject.gameObject.AddComponent <Donut9SectorController>();

                Donut9LinedefController script = null;
                if (l.BotFrontObject != null)
                {
                    script = l.BotFrontObject.AddComponent <Donut9LinedefController>();
                }
                else if (l.MidFrontObject != null)
                {
                    script = l.MidFrontObject.AddComponent <Donut9LinedefController>();
                }

                if (script != null)
                {
                    script.sectorController = sc;
                    sc.Init(sectors[0], ringSector);
                }

                sectors[0].Dynamic = true;
                ringSector.Dynamic = true;
            }
            break;

            //level end switch
            case 11:
            {
                if (l.BotFrontObject != null)
                {
                    End11LinedefController lc = l.BotFrontObject.AddComponent <End11LinedefController>();
                    lc.CurrentTexture = l.Front.tLow;
                    l.BotFrontObject.transform.SetParent(holder);
                }
                else if (l.MidFrontObject != null)
                {
                    End11LinedefController lc = l.MidFrontObject.AddComponent <End11LinedefController>();
                    lc.CurrentTexture = l.Front.tMid;
                    l.MidFrontObject.transform.SetParent(holder);
                }
            }
            break;

            //raise floor to next, one use
            case 20:
            {
                List <Floor20SectorController> linked = new List <Floor20SectorController>();
                foreach (Sector sector in Sector.TaggedSectors[l.lineTag])
                {
                    sector.floorObject.transform.SetParent(holder);

                    Floor20SectorController sc = sector.floorObject.GetComponent <Floor20SectorController>();
                    if (sc == null)
                    {
                        sc = sector.floorObject.gameObject.AddComponent <Floor20SectorController>();
                        sc.Init(sector);
                    }

                    linked.Add(sc);

                    sector.Dynamic = true;
                }

                if (l.BotFrontObject != null)
                {
                    if (index == 1020)
                    {
                        l.BotFrontObject.transform.SetParent(GameManager.Instance.TemporaryObjectsHolder);
                    }

                    Floor20LinedefController lc = l.BotFrontObject.AddComponent <Floor20LinedefController>();
                    lc.sectorControllers = linked;
                    lc.CurrentTexture    = l.Front.tLow;
                    l.BotFrontObject.transform.SetParent(holder);
                }
                else if (l.MidFrontObject != null)
                {
                    Floor20LinedefController lc = l.MidFrontObject.AddComponent <Floor20LinedefController>();
                    lc.sectorControllers = linked;
                    lc.CurrentTexture    = l.Front.tMid;
                    l.MidFrontObject.transform.SetParent(holder);
                }
            }
            break;

            //single use door, pokeable
            case 31:
            {
                if (l.TopFrontObject == null)
                {
                    break;
                }

                if (l.Back == null)
                {
                    break;
                }

                l.Back.Sector.ceilingObject.transform.SetParent(holder);

                Door31Controller          lc = l.TopFrontObject.AddComponent <Door31Controller>();
                SlowOneshotDoorController sc = l.Back.Sector.ceilingObject.GetComponent <SlowOneshotDoorController>();
                if (sc == null)
                {
                    sc = l.Back.Sector.ceilingObject.AddComponent <SlowOneshotDoorController>();
                }

                sc.Init(l.Back.Sector);
                lc.sectorController = sc;

                l.Back.Sector.Dynamic = true;
            }
            break;

            //make sectors dark, walktrigger
            case 35:
            {
                if (!Sector.TaggedSectors.ContainsKey(l.lineTag))
                {
                    break;
                }

                BoxCollider mc = Mesher.CreateLineTriggerCollider(
                    l,
                    Mathf.Min(l.Front.Sector.minimumFloorHeight, l.Back.Sector.minimumFloorHeight),
                    Mathf.Max(l.Front.Sector.maximumCeilingHeight, l.Back.Sector.maximumCeilingHeight),
                    "Tag_" + l.lineTag + "_trigger",
                    holder
                    );

                if (mc == null)
                {
                    Debug.LogError("Linedef " + index + " could not create trigger. Type(" + l.lineType + ")");
                    break;
                }

                mc.isTrigger = true;

                LineTrigger lt = mc.gameObject.AddComponent <LineTrigger>();
                lt.TriggerAction = (c) =>
                {
                    if (c.GetComponent <PlayerThing>() == null)
                    {
                        return;
                    }

                    foreach (Sector sector in Sector.TaggedSectors[l.lineTag])
                    {
                        sector.brightness = (float)35 / 255f;
                        sector.floorObject.ChangeBrightness(sector.brightness);
                    }
                };
            }
            break;

            //single use floor lower, walktrigger
            case 36:
            {
                if (!Sector.TaggedSectors.ContainsKey(l.lineTag))
                {
                    break;
                }

                List <Floor36Controller> linked = new List <Floor36Controller>();
                foreach (Sector sector in Sector.TaggedSectors[l.lineTag])
                {
                    sector.floorObject.transform.SetParent(holder);

                    Floor36Controller sc = sector.floorObject.GetComponent <Floor36Controller>();
                    if (sc == null)
                    {
                        sc = sector.floorObject.gameObject.AddComponent <Floor36Controller>();
                        sc.Init(sector);
                    }
                    linked.Add(sc);

                    sector.Dynamic = true;
                }

                BoxCollider mc = Mesher.CreateLineTriggerCollider(
                    l,
                    Mathf.Min(l.Front.Sector.minimumFloorHeight, l.Back.Sector.minimumFloorHeight),
                    Mathf.Max(l.Front.Sector.maximumCeilingHeight, l.Back.Sector.maximumCeilingHeight),
                    "Tag_" + l.lineTag + "_trigger",
                    holder
                    );

                if (mc == null)
                {
                    Debug.LogError("Linedef " + index + " could not create trigger. Type(" + l.lineType + ")");
                    break;
                }

                mc.isTrigger = true;

                LineTrigger lt = mc.gameObject.AddComponent <LineTrigger>();
                lt.TriggerAction = (c) =>
                {
                    PlayerThing player = c.GetComponent <PlayerThing>();

                    if (player == null)
                    {
                        return;
                    }

                    foreach (Floor36Controller lc in linked)
                    {
                        if (lc.CurrentState == Floor36Controller.State.AtTop)
                        {
                            lc.CurrentState = Floor36Controller.State.Lowering;
                        }
                    }
                };
            }
            break;

            //single use door, shootable
            case 46:
            {
                if (l.TopFrontObject == null)
                {
                    break;
                }

                if (l.Back == null)
                {
                    break;
                }

                l.Back.Sector.ceilingObject.transform.SetParent(GameManager.Instance.transform);

                Door46Controller          lc = l.TopFrontObject.AddComponent <Door46Controller>();
                SlowOneshotDoorController sc = l.Back.Sector.ceilingObject.GetComponent <SlowOneshotDoorController>();
                if (sc == null)
                {
                    sc = l.Back.Sector.ceilingObject.AddComponent <SlowOneshotDoorController>();
                }

                sc.Init(l.Back.Sector);
                lc.sectorController = sc;

                l.Back.Sector.Dynamic = true;
            }
            break;

            //scroll animation, left
            case 48:
            {
                foreach (GameObject g in l.gameObjects)
                {
                    if (g != null)
                    {
                        g.AddComponent <ScrollLeftAnimation>();
                    }
                }
            }
            break;

            //secret level end switch
            case 51:
            {
                if (l.BotFrontObject != null)
                {
                    End51LinedefController lc = l.BotFrontObject.AddComponent <End51LinedefController>();
                    lc.CurrentTexture = l.Front.tLow;
                    l.BotFrontObject.transform.SetParent(holder);
                }
                else if (l.MidFrontObject != null)
                {
                    End51LinedefController lc = l.MidFrontObject.AddComponent <End51LinedefController>();
                    lc.CurrentTexture = l.Front.tMid;
                    l.MidFrontObject.transform.SetParent(holder);
                }
            }
            break;

            //common lift, pokeable
            case 62:
            {
                if (!Sector.TaggedSectors.ContainsKey(l.lineTag))
                {
                    break;
                }

                if (l.BotFrontObject == null)
                {
                    break;
                }

                List <Slow3sLiftController> linked = new List <Slow3sLiftController>();
                foreach (Sector sector in Sector.TaggedSectors[l.lineTag])
                {
                    sector.floorObject.transform.SetParent(holder);

                    Slow3sLiftController script = sector.floorObject.GetComponent <Slow3sLiftController>();
                    if (script == null)
                    {
                        script = sector.floorObject.gameObject.AddComponent <Slow3sLiftController>();
                        script.Init(sector);
                    }

                    linked.Add(script);

                    sector.Dynamic = true;
                }

                Lift62Controller lc = l.BotFrontObject.AddComponent <Lift62Controller>();
                lc.liftControllers = linked;
            }
            break;

            //repeatable door, switch
            case 63:
            {
                if (!Sector.TaggedSectors.ContainsKey(l.lineTag))
                {
                    break;
                }

                List <SlowRepeatableDoorController> linked = new List <SlowRepeatableDoorController>();
                foreach (Sector sector in Sector.TaggedSectors[l.lineTag])
                {
                    sector.ceilingObject.transform.SetParent(holder);

                    SlowRepeatableDoorController sc = sector.ceilingObject.GetComponent <SlowRepeatableDoorController>();
                    if (sc == null)
                    {
                        sc = sector.ceilingObject.AddComponent <SlowRepeatableDoorController>();
                        sc.Init(sector);
                    }

                    linked.Add(sc);

                    sector.Dynamic = true;
                }

                if (l.BotFrontObject != null)
                {
                    Door63Controller lc = l.BotFrontObject.AddComponent <Door63Controller>();
                    lc.sectorControllers = linked;
                    lc.CurrentTexture    = l.Front.tLow;
                    l.BotFrontObject.transform.SetParent(holder);
                }
                else if (l.MidFrontObject != null)
                {
                    Door63Controller lc = l.MidFrontObject.AddComponent <Door63Controller>();
                    lc.sectorControllers = linked;
                    lc.CurrentTexture    = l.Front.tMid;
                    l.MidFrontObject.transform.SetParent(holder);
                }
            }
            break;

            //common lift, walktrigger
            case 88:
            {
                if (!Sector.TaggedSectors.ContainsKey(l.lineTag))
                {
                    break;
                }

                List <Slow3sLiftController> linked = new List <Slow3sLiftController>();
                foreach (Sector sector in Sector.TaggedSectors[l.lineTag])
                {
                    sector.floorObject.transform.SetParent(holder);

                    Slow3sLiftController sc = sector.floorObject.GetComponent <Slow3sLiftController>();
                    if (sc == null)
                    {
                        sc = sector.floorObject.gameObject.AddComponent <Slow3sLiftController>();
                        sc.Init(sector);
                    }

                    linked.Add(sc);

                    sector.Dynamic = true;
                }

                BoxCollider mc = Mesher.CreateLineTriggerCollider(
                    l,
                    Mathf.Min(l.Front.Sector.minimumFloorHeight, l.Back.Sector.minimumFloorHeight),
                    Mathf.Max(l.Front.Sector.maximumCeilingHeight, l.Back.Sector.maximumCeilingHeight),
                    "Tag_" + l.lineTag + "_trigger",
                    holder
                    );

                if (mc == null)
                {
                    Debug.LogError("Linedef " + index + " could not create trigger. Type(" + l.lineType + ")");
                    break;
                }

                mc.isTrigger = true;

                LineTrigger lt = mc.gameObject.AddComponent <LineTrigger>();
                lt.TriggerAction = (c) =>
                {
                    foreach (Slow3sLiftController lc in linked)
                    {
                        if (lc.CurrentState == Slow3sLiftController.State.AtTop)
                        {
                            lc.CurrentState = Slow3sLiftController.State.Lowering;
                        }
                    }
                };
            }
            break;

            //repeatable door, walktrigger
            case 90:
            {
                if (!Sector.TaggedSectors.ContainsKey(l.lineTag))
                {
                    break;
                }

                List <SlowRepeatableDoorController> linked = new List <SlowRepeatableDoorController>();
                foreach (Sector sector in Sector.TaggedSectors[l.lineTag])
                {
                    sector.ceilingObject.transform.SetParent(holder);

                    SlowRepeatableDoorController sc = sector.ceilingObject.GetComponent <SlowRepeatableDoorController>();
                    if (sc == null)
                    {
                        sc = sector.ceilingObject.gameObject.AddComponent <SlowRepeatableDoorController>();
                        sc.Init(sector);
                    }
                    linked.Add(sc);

                    sector.Dynamic = true;
                }

                BoxCollider mc = Mesher.CreateLineTriggerCollider(
                    l,
                    Mathf.Min(l.Front.Sector.minimumFloorHeight, l.Back.Sector.minimumFloorHeight),
                    Mathf.Max(l.Front.Sector.maximumCeilingHeight, l.Back.Sector.maximumCeilingHeight),
                    "Tag_" + l.lineTag + "_trigger",
                    holder
                    );

                if (mc == null)
                {
                    Debug.LogError("Linedef " + index + " could not create trigger. Type(" + l.lineType + ")");
                    break;
                }

                mc.isTrigger = true;

                LineTrigger lt = mc.gameObject.AddComponent <LineTrigger>();
                lt.TriggerAction = (c) =>
                {
                    PlayerThing player = c.GetComponent <PlayerThing>();

                    if (player == null)
                    {
                        return;
                    }

                    foreach (SlowRepeatableDoorController lc in linked)
                    {
                        if (lc.CurrentState == SlowRepeatableDoorController.State.Closed)
                        {
                            lc.CurrentState = SlowRepeatableDoorController.State.Opening;
                        }
                    }
                };
            }
            break;

            //single use door, switch
            case 103:
            {
                if (!Sector.TaggedSectors.ContainsKey(l.lineTag))
                {
                    break;
                }

                List <SlowOneshotDoorController> linked = new List <SlowOneshotDoorController>();
                foreach (Sector sector in Sector.TaggedSectors[l.lineTag])
                {
                    sector.ceilingObject.transform.SetParent(holder);

                    SlowOneshotDoorController sc = sector.ceilingObject.GetComponent <SlowOneshotDoorController>();
                    if (sc == null)
                    {
                        sc = sector.ceilingObject.AddComponent <SlowOneshotDoorController>();
                        sc.Init(sector);
                    }

                    linked.Add(sc);

                    sector.Dynamic = true;
                }

                if (l.BotFrontObject != null)
                {
                    Door103Controller lc = l.BotFrontObject.AddComponent <Door103Controller>();
                    lc.sectorControllers = linked;
                    lc.CurrentTexture    = l.Front.tLow;
                    l.BotFrontObject.transform.SetParent(holder);
                }
                else if (l.MidFrontObject != null)
                {
                    Door103Controller lc = l.MidFrontObject.AddComponent <Door103Controller>();
                    lc.sectorControllers = linked;
                    lc.CurrentTexture    = l.Front.tMid;
                    l.MidFrontObject.transform.SetParent(holder);
                }
            }
            break;
            }
        }
    }