Exemplo n.º 1
0
        private void FindRooms()
        {
            var mapExportNameToRoom = new Dictionary <string, Room>(StringComparer.InvariantCultureIgnoreCase);

            // prevent use of reserved words
            foreach (var reservedWord in ReservedWords)
            {
                mapExportNameToRoom.Add(reservedWord, null);
            }

            foreach (var element in Project.Current.Elements)
            {
                if (element is Room)
                {
                    var room = (Room)element;

                    // assign each room a unique export name.
                    var exportName = GetExportName(room, null);
                    var index      = 2;
                    while (mapExportNameToRoom.ContainsKey(exportName))
                    {
                        exportName = GetExportName(room, index++);
                    }

                    mapExportNameToRoom[exportName] = room;
                    var location = new Location(room, exportName);
                    LocationsInExportOrder.Add(location);
                    m_mapRoomToLocation[room] = location;
                }
            }
        }
Exemplo n.º 2
0
        protected override void ExportHeader(TextWriter writer, string title, string author, string description, string history)
        {
            var list         = Project.Current.Elements.OfType <Room>().Where(p => p.IsStartRoom).ToList();
            var startingRoom = list.Count == 0 ? LocationsInExportOrder.First() : LocationsInExportOrder.Find(p => p.Room.ID == list.First().ID);

            writer.WriteLine($"{DOUBLE_QUOTE}{title} main file{DOUBLE_QUOTE}");
            writer.WriteLine();
            writer.WriteLine("<VERSION ZIP>");
            writer.WriteLine("<CONSTANT RELEASEID 1>");
            writer.WriteLine();
            writer.WriteLine($"{DOUBLE_QUOTE}Main Loop{DOUBLE_QUOTE}");
            writer.WriteLine();
            writer.WriteLine($"<CONSTANT GAME-BANNER {DOUBLE_QUOTE}{title}|An interactive fiction by {author}{DOUBLE_QUOTE}>");
            writer.WriteLine();
            writer.WriteLine($"<ROUTINE GO ()");
            writer.WriteLine($"    <CRLF> <CRLF>");
            writer.WriteLine($"    <TELL {toZILString(description)} CR CR>");
            writer.WriteLine($"    <V-VERSION> <CRLF>");
            writer.WriteLine($"    <SETG HERE ,{startingRoom.ExportName}>");
            writer.WriteLine($"    <MOVE ,PLAYER ,HERE>");
            writer.WriteLine($"    <V-LOOK>");
            writer.WriteLine($"    <REPEAT ()");
            writer.WriteLine($"        <COND (<PARSER>");
            writer.WriteLine($"               <PERFORM ,PRSA ,PRSO ,PRSI>");
            writer.WriteLine($"               <COND (<NOT <GAME-VERB?>>");
            writer.WriteLine($"                      <APPLY <GETP ,HERE ,P?ACTION> ,M-END>");
            writer.WriteLine($"                      <CLOCKER>)>)>");
            writer.WriteLine($"        <SETG HERE <LOC ,WINNER>>>>");
            writer.WriteLine();
            writer.WriteLine($"<INSERT-FILE {DOUBLE_QUOTE}parser{DOUBLE_QUOTE}>");
            writer.WriteLine();

            if (!string.IsNullOrWhiteSpace(history))
            {
                exportHistory(writer, history);
            }

            writer.WriteLine($"{DOUBLE_QUOTE}Objects{DOUBLE_QUOTE}");
        }
        protected override void ExportContent(TextWriter writer)
        {
            StringBuilder headerSB      = new StringBuilder();
            StringBuilder locationsSB   = new StringBuilder();
            StringBuilder connectionsSB = new StringBuilder();

            locationsSB.Append("\nlocations {\n");
            connectionsSB.Append("\nconnections {\n");
            connectionsSB.Append("   from, direction, to = [\n");

            StringBuilder footerSB  = new StringBuilder();
            string        startRoom = null;
            bool          isFirst   = true;

            int maxLen = -1;

            foreach (var location in LocationsInExportOrder.Where(location => location.ExportName.Length > maxLen))
            {
                maxLen = escapeAdventuronId(location.ExportName).Length;
            }

            foreach (var location in LocationsInExportOrder)
            {
                if (isFirst || location.Room.IsStartRoom)
                {
                    startRoom = location.ExportName;
                }

                //String subtitle = string.IsNullOrEmpty(location.Room.SubTitle) ? null : location.Room.SubTitle;

                string roomDescription  = string.IsNullOrEmpty(location.Room.PrimaryDescription) ? "" : escapeAdventuronText(location.Room.PrimaryDescription);
                string locationRoomName = string.IsNullOrEmpty(location.Room.Name) ? "" : location.Room.Name;

                if (locationRoomName.Length > MaximumHeaderLength)
                {
                    // Limit to 'MaximumHeaderLength' characters before escaping !
                    locationRoomName = locationRoomName.Substring(0, MaximumHeaderLength);
                }

                string headerDescNormalized = escapeAdventuronText(locationRoomName);
                string headerDescription    = (" header = \"" + headerDescNormalized + "\"");
                locationsSB.Append("   " + padRight(escapeAdventuronId(location.ExportName), maxLen) + " : location \"" + roomDescription + "\"" + headerDescription + ";\n");
                foreach (var direction in Directions.AllDirections)
                {
                    var exit = location.GetBestExit(direction);
                    if (exit != null)
                    {
                        connectionsSB.Append("      " + escapeAdventuronId(location.ExportName) + ", " + toAdventuronDirectionName(direction) + ", " + escapeAdventuronId(exit.Target.ExportName) + ",\n");
                    }
                }
                isFirst = false;
            }
            writer.WriteLine();
            headerSB.Append("start_at = " + startRoom);
            connectionsSB.Append("   ]\n");
            connectionsSB.Append("}\n");
            locationsSB.Append("}\n");
            writer.WriteLine(headerSB.ToString());
            writer.WriteLine(locationsSB.ToString());
            writer.WriteLine(connectionsSB.ToString());
            writer.WriteLine(footerSB.ToString());
        }