public object Clone()
        {
            SequenceQueue queue = new SequenceQueue(sequence);

            foreach (SequenceQueueElement s in elements)
            {
                queue.Append((SequenceQueueElement)s.Clone());
            }
            return(queue);
        }
        public static SequenceQueue ConstructBasicShopSequence(Character src, string introText, params ShopItem[] items)
        {
            SequenceQueue queue = new SequenceQueue(Sequence.ShopTalk);

            queue.Append(new StopAIItem(src));
            queue.Append(new ClearAmbientTextItem());
            queue.Append(new CancellableSpeechItem(introText, src, new Vector2(40, -40), 400, 60));
            queue.Append(new ShopSeqItem(src, items, items));
            queue.Append(new SpeechItem(Main.rand.Next(goodbyeText), src, new Vector2(40, -40), 400, 60));
            queue.Append(new StartAIItem(src));
            return(queue);
        }
        //so originally the mod wasn't going to involve a normal terraria world at all, and the played would be dumped into a now-cut level (some of the content of which has ended up in the desert arena)
        //this is what would have happened before the player was dropped in

        static SequenceQueue ConstructIntroSequence(Player player)
        {
            Vector2       destination = 16 * new Vector2(259, 1726);
            SequenceQueue queue       = new SequenceQueue(Sequence.IntroCutscene);
            PlayerFixer   pf          = player.GetModPlayer <PlayerFixer>();

            queue.Append(new ImmobiliseItem());
            queue.Append(new PlayerHolderItem(player, new Vector2(4756 * 16, 249 * 16)));
            queue.Append(new ChangeMountItem(player, ModContent.GetInstance <StartingShip>().Type));
            queue.Append(new SpawnChangeItem(destination, player));
            queue.Append(new PauseItem(300));
            queue.Append(new SpeechItem(new SpeechBubble("Hmmm, this doesn't look anything like my starmap...so it was a left at the Crab Nebula, right at the supermassive black hole, right at the...", (int)pf.GetScreenPosition().X, (int)pf.GetScreenPosition().Y, 400, 480), pf, new Vector2(100, -100)));
            queue.Append(new SpeechItem(new SpeechBubble("Oh my mistake that should have been a left at the Crab Nebula, which means on the map I should be...", (int)pf.GetScreenPosition().X, (int)pf.GetScreenPosition().Y, 400, 300), pf, new Vector2(100, -100)));
            queue.Append(new SpeechItem(new SpeechBubble("...off the edge of it. Which makes me lost.", (int)pf.GetScreenPosition().X, (int)pf.GetScreenPosition().Y, 400, 300), pf, new Vector2(100, -100)));
            queue.Append(new PauseItem(240));
            queue.Append(new SpeechItem(new SpeechBubble("I wonder what's on the radio in these parts...", (int)pf.GetScreenPosition().X, (int)pf.GetScreenPosition().Y, 400, 300), pf, new Vector2(100, -100)));
            queue.Append(new SoundEffectItem(665, "Sounds/RadioSound"));
            queue.Append(new SpeechItem(new SpeechBubble("Gosh they've got some weird music around here.", (int)pf.GetScreenPosition().X, (int)pf.GetScreenPosition().Y, 400, 180), pf, new Vector2(100, -100)));
            queue.Append(new SpeechItem(new SpeechBubble("ERROR: ENGINE FAILURE!", (int)pf.GetScreenPosition().X, (int)pf.GetScreenPosition().Y, 400, 180), pf, new Vector2(-400, -100)));
            queue.Append(new SpaceShipCrashItem(player));
            queue.Append(new SpeechItem(new SpeechBubble("This is not at all good...", (int)pf.GetScreenPosition().X, (int)pf.GetScreenPosition().Y, 400, 180), pf, new Vector2(100, -100)));
            queue.Append(new SpaceShipCrashItem(player));
            queue.Append(new PlayerHolderItem(player, destination));
            queue.Append(new PauseItem(240));
            queue.Append(new SpaceShipCrashItem(player));
            queue.Append(new ChangeMountItem(player));
            queue.Append(new PlayerHolderItem(player));
            queue.Append(new MobiliseItem());

            return(queue);
        }
        //If origin == destination don't do the space sequence
        //Change spawn, takeoff, teleport, inflight, teleport, landing, changemount, mobilise
        public static SequenceQueue ConstructSpaceSequence(Dimensions.Dimensions origin, Dimensions.Dimensions destination, Player player, Vector2 destLoc, bool addPlatform = false)
        {
            SequenceQueue queue = new SequenceQueue(Sequence.InSpace);

            queue.Append(new ImmobiliseItem());
            queue.Append(new SpawnChangeItem(destLoc, player));
            queue.Append(new ShipTakeOffItem(player));
            if (origin != destination)
            {
                queue.Append(new ChangeDimensionItem(Dimensions.Dimensions.Travel));
                queue.Append(new TeleportItem(spaceLocation, player));
                queue.Append(new ShipTravelItem((origin, destination), player));
                queue.Append(new ChangeDimensionItem(destination));
            }
            if (addPlatform)
            {
                queue.Append(new AddPlatformItem(destLoc / 16f, destination));
            }
            queue.Append(new TeleportItem(destLoc, player));

            queue.Append(new ShipLandItem(player));
            queue.Append(new ChangeMountItem(player));
            queue.Append(new MobiliseItem());
            return(queue);
        }