public static async Task TutorialTip(TutorialTopic topic)
        {
            if (Global.Option(OptionType.NEVER_DISPLAY_TIPS) || displayed[topic])
            {
                return;
            }
            Color box_edge_color   = Color.Blue;
            Color box_corner_color = Color.Yellow;
            Color first_line_color = Color.Yellow;
            Color text_color       = Color.Gray;

            string[] text        = TutorialText(topic);
            int      stringwidth = 27;        // length of "[Press any key to continue]"

            foreach (string s in text)
            {
                if (s.Length > stringwidth)
                {
                    stringwidth = s.Length;
                }
            }
            stringwidth += 4;             //2 blanks on each side
            int boxwidth  = stringwidth + 2;
            int boxheight = text.Length + 5;

            //for(bool done=false;!done;){
            colorstring[] box = new colorstring[boxheight];             //maybe i should make this a list to match the others
            box[0] = new colorstring("+", box_corner_color, "".PadRight(stringwidth, '-'), box_edge_color, "+", box_corner_color);
            box[text.Length + 1] = new colorstring("|", box_edge_color, "".PadRight(stringwidth), Color.Gray, "|", box_edge_color);
            box[text.Length + 2] = new colorstring("|", box_edge_color) + ("[Press any key to continue]".PadOuter(stringwidth).GetColorString(text_color)) + new colorstring("|", box_edge_color); //PadOuter originally here
            box[text.Length + 3] = new colorstring("|", box_edge_color) + ("[=] Stop showing tips".PadOuter(stringwidth).GetColorString(text_color)) + new colorstring("|", box_edge_color);       //PadOuter originally here
            box[text.Length + 4] = new colorstring("+", box_corner_color, "".PadRight(stringwidth, '-'), box_edge_color, "+", box_corner_color);
            int pos = 1;

            foreach (string s in text)
            {
                box[pos] = new colorstring("|", box_edge_color) + (s.PadOuter(stringwidth).GetColorString(text_color)) + new colorstring("|", box_edge_color); //PadOuter originally here
                if (pos == 1)
                {
                    box[pos] = new colorstring();
                    box[pos].strings.Add(new cstr("|", box_edge_color));
                    box[pos].strings.Add(new cstr(s.PadOuter(stringwidth), first_line_color)); //PadOuter originally here
                    box[pos].strings.Add(new cstr("|", box_edge_color));
                }
                ++pos;
            }
            int y = (Global.SCREEN_H - boxheight) / 2;
            int x = (Global.SCREEN_W - boxwidth) / 2;

            colorchar[,] memory = Screen.GetCurrentRect(y, x, boxheight, boxwidth);
            List <List <colorstring> > frames = new List <List <colorstring> >();

            frames.Add(BoxAnimationFrame(boxheight - 2, FrameWidth(boxheight, boxwidth)));
            for (int i = boxheight - 4; i > 0; i -= 2)
            {
                frames.Add(BoxAnimationFrame(i, FrameWidth(frames.Last().Count, frames.Last()[0].Length())));
            }
            for (int i = frames.Count - 1; i >= 0; --i)     //since the frames are in reverse order
            {
                int y_offset = i + 1;
                int x_offset = (boxwidth - frames[i][0].Length()) / 2;
                Screen.WriteList(y + y_offset, x + x_offset, frames[i]);
                await Task.Delay(20);
            }
            foreach (colorstring s in box)
            {
                Screen.WriteString(y, x, s);
                ++y;
            }
            Actor.player.DisplayStats(false);
            if (topic != TutorialTopic.Feats)             //hacky exception - don't get rid of the line that's already there.
            {
                Actor.B.DisplayNow();
            }
            Game.Console.CursorVisible = false;
            await Task.Delay(500);

            Global.FlushInput();

            /*	switch(Game.Console.ReadKey(true).KeyChar){
             *      case 'q':
             *              box_edge_color = NextColor(box_edge_color);
             *              break;
             *      case 'w':
             *              box_corner_color = NextColor(box_corner_color);
             *              break;
             *      case 'e':
             *              first_line_color = NextColor(first_line_color);
             *              break;
             *      case 'r':
             *              text_color = NextColor(text_color);
             *              break;
             *      default:
             *              done=true;
             *              break;
             *      }
             * }*/
            if ((await Game.Console.ReadKey(true)).KeyChar == '=')
            {
                Global.Options[OptionType.NEVER_DISPLAY_TIPS] = true;
            }
            Screen.WriteArray((Global.SCREEN_H - boxheight) / 2, x, memory);
            if (topic != TutorialTopic.Feats)             //another exception
            {
                Actor.player.DisplayStats(true);
            }
            displayed[topic]           = true;
            Game.Console.CursorVisible = true;
        }