// -----
        public static void Main(string[] args)
        {
            Console.WriteLine("\n" + DashLineText(StockDashedLine));
            string versionText = Assembly.GetExecutingAssembly().GetName().Version.ToString();
            var    titleText   = $"{MyAppName} - version {versionText}";

            Console.WriteLine(DashLineText(titleText));

            bool JustNPCList     = false;
            int  MaxNumberToMake = 1;

            Console.WriteLine($"\n How many per batch? [1 - 9, Default:{MaxNumberToMake}]");
            string batch_size = Console.ReadLine();

            if (!String.IsNullOrEmpty(batch_size))
            {
                MaxNumberToMake = int.Parse(batch_size);
            }
            Console.WriteLine($"\n Just build an NPC List? [true / false, Default:{JustNPCList}]");
            string npc_only = Console.ReadLine();

            if (!String.IsNullOrEmpty(npc_only))
            {
                JustNPCList = Boolean.Parse(npc_only);
            }

            var do_again   = true;
            int AbsoLooply = 0;

            while (do_again)
            {
                PrepConsole();
                Console.WriteLine(DashLineText(titleText));

                WordWrap      ww      = new WordWrap();
                DiceBagEngine diceBag = new DiceBagEngine();
                for (int loop = 1; loop <= MaxNumberToMake; loop++)
                {
                    AbsoLooply++;
                    if (JustNPCList)
                    {
                        NPCMaker RandomNPC = new NPCMaker("Story Character", "Random");
                        RandomNPC.RandomDetails();
                        RandomNPC.TaskDesc = RandomNPC.getRandomTaskDesc();
                        Console.WriteLine("\n " + ww.doWordWrap(String.Format("[#{0,2:d2}] ", AbsoLooply) + RandomNPC.toString(), MaxTextWidthCols));
                    }
                    else
                    {
                        CreateOneRandomPBHouse(diceBag, ww, AbsoLooply);
                    }
                } // end-for

                // prompt user about doing more or quiting
                Console.WriteLine("\n" + DashLineText(StockDashedLine));
                var wait_on_valid_input = true;
                while (wait_on_valid_input)
                {
                    Console.WriteLine($"Press [ESC] to exit, or [SPACE] to generate {MaxNumberToMake} more.");
                    var user_keypress = Console.ReadKey();
                    if (user_keypress.Key == ConsoleKey.Escape)
                    {
                        do_again            = false;
                        wait_on_valid_input = false;
                    }

                    if (user_keypress.Key == ConsoleKey.Spacebar)
                    {
                        do_again            = true;
                        wait_on_valid_input = false;
                    }
                } // while (wait_on_valid_input)
            }     // end while do_again
        }         // end method main
        } // end method DashLineText

        // -----
        private static void CreateOneRandomPBHouse(DiceBagEngine diceBag, WordWrap ww, int AbsoLooply)
        {
            // ---- create an example P3BHouse
            PBHouse pbh = new PBHouse();

            var name         = pbh.Name();
            var quality_list = pbh.EstablishmentQuality(); // quality, rooms_cost, meals_cost
            var mood         = pbh.Mood();
            var lights       = pbh.Lighting();
            var smells       = pbh.Smells();
            var size         = pbh.Size();
            var posted_sign  = diceBag.SearchStringForRolls(pbh.PostedSign());
            var drinks       = diceBag.SearchStringForRolls(pbh.SpecialtyDrink(quality_list.Item1));
            var foods        = diceBag.SearchStringForRolls(pbh.SpecialtyFood(quality_list.Item1));
            var history      = diceBag.SearchStringForRolls(pbh.EstablishmentHistory());
            var naughty      = diceBag.SearchStringForRolls(pbh.RedLightServices());

            // --- summary blurb output
            string FormatedAbsoLooply = String.Format("{0,2:d2}", AbsoLooply);

            Console.WriteLine(DashLineText($"--[{FormatedAbsoLooply}]--"));
            Console.WriteLine("\n" + DashLineText("Player Blurb"));

            var desc_line1 = $"  The local Pub and Bed House for travellers is the {name}." +
                             $" The {quality_list.Item1}-quality establishment would be considered {size}." +
                             $" Rooms are {quality_list.Item2} per day, and meals are {quality_list.Item3} per day.";

            var desc_line2 = $"\n  As you enter, you smell {smells}. It seems to be a {mood} place, {lights}." +
                             $" A sign {posted_sign}.";

            var desc_line3 = "\n  The menu has the usual standard fare posted. " +
                             $"The House Specialty Drink is {drinks}, while the House Specialty Meal is {foods}.";

            Console.WriteLine(ww.doWordWrap(desc_line1, MaxTextWidthCols));
            Console.WriteLine(ww.doWordWrap(desc_line2, MaxTextWidthCols));
            Console.WriteLine(ww.doWordWrap(desc_line3, MaxTextWidthCols));

            // --- new feature;  staff and patron NPCs
            NPCMaker NPC_Owner = new NPCMaker("Staff", "Owner");

            NPC_Owner.RandomDetails();

            int patronHeadCount = diceBag.RollDice("2d4-6");

            Console.WriteLine("\n " + DashLineText("Notable Staff & Patrons"));
            Console.WriteLine(ww.doWordWrap(NPC_Owner.toString(), MaxTextWidthCols));

            if (size.Contains("modest") || size.Contains("large") || size.Contains("massive"))
            {
                patronHeadCount++;
                NPCMaker NPC_Cook = new NPCMaker("Staff", "Cook");
                NPC_Cook.RandomDetails();
                Console.WriteLine("\n " + ww.doWordWrap(NPC_Cook.toString(), MaxTextWidthCols));
            }

            // "modest", "large", "massive"
            if (size.Contains("large") || size.Contains("massive"))
            {
                patronHeadCount++;
                NPCMaker NPC_HeadServer = new NPCMaker("Staff", "Head Server");
                NPC_HeadServer.RandomDetails();
                Console.WriteLine("\n " + ww.doWordWrap(NPC_HeadServer.toString(), MaxTextWidthCols));
            }

            if (size.Contains("massive"))
            {
                patronHeadCount++;
                NPCMaker NPC_Bouncer = new NPCMaker("Staff", "Bouncer");
                NPC_Bouncer.RandomDetails();
                Console.WriteLine("\n " + ww.doWordWrap(NPC_Bouncer.toString(), MaxTextWidthCols));
            }

            for (int patronLoop = 0; patronLoop < patronHeadCount; patronLoop++)
            {
                NPCMaker NPC_Patron = new NPCMaker("Patron", "Random");
                NPC_Patron.RandomDetails();
                NPC_Patron.TaskDesc = NPC_Patron.getRandomTaskDesc();
                Console.WriteLine("\n " + ww.doWordWrap(NPC_Patron.toString(), MaxTextWidthCols));
            }

            Console.WriteLine("\n" + DashLineText("DM Notes"));
            Console.WriteLine(ww.doWordWrap($"Establishment History: {history}", MaxTextWidthCols));
            Console.WriteLine(ww.doWordWrap($"Red Light Services: {naughty}", MaxTextWidthCols));
        } // end CreateOneRandomPBHouse