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; } } }
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()); }