Пример #1
0
        static void BuildBuilding1()
        {
            // first floor
            {
                Building1F1.Name = "行政楼[1#]一楼";
                Building1F1.Alias.Clear();
                Building1F1.IsLit = false;

                Area NLobby = new Area();
                Area SLobby = new Area();
                //Area Library = new Area();
                //Area Study = new Area();
                Building1F1.Areas.Clear();
                Building1F1.Areas.AddRange(new[]
                                           { NLobby, SLobby, /*Library, Study, CStairs*/ });
                Building1F1.Objects.Clear();

                AObject doorNLobby = AObject.SimpleDoor(
                    dest:           Campus,
                    name:           "北侧大门",
                    alias:          new[] { "外面", "大门", "门" },
                    desc:           "一扇开阔的玻璃门外,教学楼间的广场被暗紫色的天空微弱地照亮。",
                    flopside:       () => Campus.FindObjectInternal("行政楼的正门"));
                doorNLobby.OnEntering = (s, v) =>
                {
                    Campus.ChangeArea("教学楼间的小广场");
                    return(HandleResult.Continue);
                };
                Building1F1.Objects.Add(doorNLobby);
                SetupArea(ref NLobby, "大厅北侧",
                          desc: "你站在一个空旷、昏暗的大厅中,北侧开阔的玻璃门外教学楼间的广场被暗紫色的天空微弱地照亮。两边通往大厅南侧的过道之间,是往上延伸的宽敞大理石楼梯。",
                          ldesc: "空旷的大厅,在手电筒的光束下甚至显得更加空旷,你站在中间。北侧开阔的玻璃门外教学楼间的广场被暗紫色的天空微弱地照亮。两边通往大厅南侧的过道之间,是往上延伸的宽敞大理石台阶。",
                          usable: new[] { doorNLobby },
                          notClear: new AObject[0],
                          godir: new Dictionary <Direction, Area>
                {
                    { Direction.S, SLobby }
                },
                          defDoor: doorNLobby);
                NLobby.RoomTo.Add(Direction.Up, Building1F2);
                NLobby.OnGoDirection = (self, v, d) =>
                {
                    Building1F2.ChangeArea("中央楼梯");
                    return(HandleResult.Continue);
                };

                AObject doorSLobby = AObject.SimpleDoor(
                    dest:           Campus,
                    name:           "南侧大门",
                    alias:          new[] { "外面", "大门", "门" },
                    desc:           "一扇开阔的玻璃门外,道路后面是寝室楼和树木的阴暗影子。",
                    flopside:       () => Campus.FindObjectInternal("行政楼的南门"));
                doorSLobby.OnEntering = (s, v) =>
                {
                    Campus.ChangeArea("道路");
                    return(HandleResult.Continue);
                };
                Building1F1.Objects.Add(doorSLobby);
                SetupArea(ref SLobby, "大厅南侧",
                          desc: "你站在一个昏暗的大厅中,南侧开阔的玻璃门外,道路后面是寝室楼和树木的阴暗影子。两边通往大厅北侧的过道之间是一面有浮雕的墙。",
                          ldesc: "大厅在手电筒的光束下显得既狭小又空旷;你站在中间。南侧开阔的玻璃门外,道路后面是寝室楼和树木的阴暗影子。两边通往大厅北侧的过道之间是一面有浮雕的墙。",
                          usable: new[] { doorSLobby },
                          notClear: new AObject[0],
                          godir: new Dictionary <Direction, Area>
                {
                    { Direction.N, NLobby }
                },
                          defDoor: doorSLobby);
            }

            // second floor
            {
                Building1F2.Name = "行政楼[1#]二楼";
                Building1F2.Alias.Clear();
                Building1F2.IsLit = false;

                Area CStairs = new Area();
                //Area SLobby = new Area();

                Building1F2.Areas.Clear();
                Building1F2.Areas.AddRange(new[]
                                           { CStairs });
                Building1F2.Objects.Clear();

                SetupArea(ref CStairs, "中央楼梯",
                          desc: "你站在宽阔的大理石楼梯平台上;楼梯向上通往三楼,向下通往一楼。向南北方向绕过楼梯,是两边的过道;东西两面(西边是一块自习区域,东边堆着些活动用品)的空间被各层过道包围着向上通达楼顶。",
                          usable: new AObject[] { },
                          notClear: new AObject[0],
                          godir: new Dictionary <Direction, Area>
                {
                });
                CStairs.RoomTo.Add(Direction.Down, Building1F1);
                CStairs.RoomTo.Add(Direction.Up, Building1F3);
                CStairs.OnGoDirection = (self, v, d) =>
                {
                    Building1F1.ChangeArea("大厅北侧");
                    Building1F3.ChangeArea("中央楼梯");
                    return(HandleResult.Continue);
                };
            }

            // third floor
            {
                Building1F3.Name = "行政楼[1#]三楼";
                Building1F3.Alias.Clear();
                Building1F3.IsLit = false;

                Area CStairs = new Area();
                Building1F3.Areas.Clear();
                Building1F3.Areas.AddRange(new[]
                                           { CStairs });
                Building1F3.Objects.Clear();

                SetupArea(ref CStairs, "中央楼梯",
                          desc: "你站在宽阔的大理石楼梯平台上;楼梯向上通往四楼,向下通往二楼。向南北方向绕过楼梯,是两边的过道。",
                          usable: new AObject[] { },
                          notClear: new AObject[0],
                          godir: new Dictionary <Direction, Area>
                {
                });
                CStairs.RoomTo.Add(Direction.Down, Building1F2);
                CStairs.RoomTo.Add(Direction.Up, Building1F4);
                CStairs.OnGoDirection = (self, v, d) =>
                {
                    Building1F2.ChangeArea("中央楼梯");
                    Building1F4.ChangeArea("中央楼梯");
                    return(HandleResult.Continue);
                };
            }

            // fourth floor
            {
                Building1F4.Name = "行政楼[1#]四楼";
                Building1F4.Alias.Clear();
                Building1F4.IsLit = false;

                Area CStairs = new Area();
                Building1F4.Areas.Clear();
                Building1F4.Areas.AddRange(new[]
                                           { CStairs });
                Building1F4.Objects.Clear();

                SetupArea(ref CStairs, "中央楼梯",
                          desc: "你站在宽阔的大理石楼梯平台上;楼梯向上通往五楼,向下通往三楼。向南北方向绕过楼梯,是两边的过道。",
                          usable: new AObject[] { },
                          notClear: new AObject[0],
                          godir: new Dictionary <Direction, Area>
                {
                });
                CStairs.RoomTo.Add(Direction.Down, Building1F3);
                CStairs.RoomTo.Add(Direction.Up, Building1F5);
                CStairs.OnGoDirection = (self, v, d) =>
                {
                    Building1F3.ChangeArea("中央楼梯");
                    Building1F5.ChangeArea("中央楼梯");
                    return(HandleResult.Continue);
                };
            }

            // fifth floor
            {
                Building1F5.Name = "行政楼[1#]五楼";
                Building1F5.Alias.Clear();
                Building1F5.IsLit = false;

                Area CStairs = new Area();
                Building1F5.Areas.Clear();
                Building1F5.Areas.AddRange(new[]
                                           { CStairs });
                Building1F5.Objects.Clear();

                SetupArea(ref CStairs, "中央楼梯",
                          desc: "你站在宽阔的大理石楼梯平台上;楼梯向下通往四楼。向南北方向绕过楼梯,是两边的过道。",
                          usable: new AObject[] { },
                          notClear: new AObject[0],
                          godir: new Dictionary <Direction, Area>
                {
                });
                CStairs.RoomTo.Add(Direction.Down, Building1F4);
                CStairs.OnGoDirection = (self, v, d) =>
                {
                    Building1F4.ChangeArea("中央楼梯");
                    return(HandleResult.Continue);
                };
            }

            // sixth floor: to be added (only approachable from the side stairs)
        }
Пример #2
0
        static void BuildPlayground()
        {
            Playground.Name = "操场";
            Playground.Alias.Clear();
            Playground.IsLit = true;

            Area Entrance    = new Area();
            Area NEntrance   = new Area();
            Area FdInstr     = new Area();
            Area Court       = new Area();
            Area NCourt      = new Area();
            Area SCourt      = new Area();
            Area TrackN      = new Area();
            Area TrackE      = new Area();
            Area TrackS      = new Area();
            Area TrackW      = new Area();
            Area TrackNE     = new Area();
            Area TrackNW     = new Area();
            Area TrackSE     = new Area();
            Area TrackSW     = new Area();
            Area NTrackEnd   = new Area();
            Area STrackEnd   = new Area();
            Area FdNTrack    = new Area();
            Area HighPlt     = new Area();
            Area NSpectPlt   = new Area();
            Area SSpectPlt   = new Area();
            Area SpectEndPlt = new Area();
            Area UdHighPlt   = new Area();
            Area UdNSpectPlt = new Area();
            Area UdSSpectPlt = new Area();
            Area NPassage    = new Area();
            Area SPassage    = new Area();

            Playground.Areas.AddRange(new[] { Entrance, NEntrance, FdInstr, Court, NCourt, SCourt, TrackN, TrackE, TrackS, TrackW, TrackNE, TrackNW, TrackSE, TrackSW, NTrackEnd, STrackEnd, FdNTrack, HighPlt, NSpectPlt, SSpectPlt, SpectEndPlt, UdHighPlt, UdNSpectPlt, UdSSpectPlt, NPassage, SPassage });

            SetupArea(ref Entrance, "入口处的空地",
                      desc: "你站在操场入口处,环绕场地的栅栏在你东边打开:外面是一条南边走向的大路。往北边,场地通往沙坑和更远处;西边和南边则是一小片围起来的草地。",
                      usable: new AObject[] { },
                      notClear: new AObject[0],
                      godir: new Dictionary <Direction, Area>
            {
                { Direction.N, NEntrance }
            });
            Entrance.RoomTo.Add(Direction.E, Campus);
            Entrance.OnGoDirection = (s, v, d) =>
            {
                Campus.ChangeArea("操场入口边");
                return(HandleResult.Continue);
            };

            // sandpool
            SetupArea(ref NEntrance, "沙坑边的空地",
                      desc: "你站在沙坑边,场地向北延伸到单杠器材附近,向南则是操场入口。往西,你可以进入到环绕足球场的跑道上。",
                      usable: new AObject[] { },
                      notClear: new AObject[0],
                      godir: new Dictionary <Direction, Area>
            {
                { Direction.S, Entrance },
                { Direction.W, TrackE },
                { Direction.N, FdInstr }
            });

            SetupArea(ref FdInstr, "单杠附近",
                      desc: "你站在单杠和其他器械之间;北边,透过操场的围栏,你只看见一片黑暗;场地向南边延伸,你也可以向西闯过一片草地走向跑道北边的一片空地。",
                      usable: new AObject[] { },
                      notClear: new AObject[0],
                      godir: new Dictionary <Direction, Area>
            {
                { Direction.S, NEntrance },
                { Direction.W, FdNTrack }
            });

            SetupArea(ref Court, "足球场上",
                      desc: "你站在足球场的草坪上。草长得很茂盛;梦中半暗的天空光照下,它们在脚踝高度投下一片随风颤动的阴影。你可以往南北走向两片铺着塑胶的空地,也可以往东西走向两侧的跑道。",
                      usable: new AObject[] { },
                      notClear: new AObject[0],
                      godir: new Dictionary <Direction, Area>
            {
                { Direction.N, NCourt },
                { Direction.S, SCourt },
                { Direction.W, TrackW },
                { Direction.E, TrackE }
            });

            SetupArea(ref NCourt, "空地",
                      desc: "你站在足球场北边的一小片铺着塑胶的空地上。南边通往足球场,北边是跑道。",
                      usable: new AObject[] { },
                      notClear: new AObject[0],
                      godir: new Dictionary <Direction, Area>
            {
                { Direction.S, Court },
                { Direction.N, TrackN }
            });

            SetupArea(ref SCourt, "空地",
                      desc: "你站在足球场南边的一小片铺着塑胶的空地上。北边通往足球场,南边是跑道。",
                      usable: new AObject[] { },
                      notClear: new AObject[0],
                      godir: new Dictionary <Direction, Area>
            {
                { Direction.N, Court },
                { Direction.S, TrackS }
            });

            SetupArea(ref TrackN, "跑道",
                      desc: "你在环绕足球场的塑胶跑道上;弯道向东、西延伸。你也可以横穿跑道,向南或向北走进空地。",
                      usable: new AObject[] { },
                      notClear: new AObject[0],
                      godir: new Dictionary <Direction, Area>
            {
                { Direction.N, FdNTrack },
                { Direction.S, NCourt },
                { Direction.W, TrackNW },
                { Direction.E, TrackNE }
            });

            SetupArea(ref TrackE, "跑道",
                      desc: "你在环绕足球场的塑胶跑道上;直道向南、北延伸。你也可以横穿跑道,向西走进足球场或向东走到沙坑附近。",
                      usable: new AObject[] { },
                      notClear: new AObject[0],
                      godir: new Dictionary <Direction, Area>
            {
                { Direction.N, TrackNE },
                { Direction.S, TrackSE },
                { Direction.W, Court },
                { Direction.E, NEntrance }
            });

            SetupArea(ref TrackS, "跑道",
                      desc: "你在环绕足球场的塑胶跑道上;弯道向东、西延伸。你也可以横穿跑道,向南或向北走进空地。",
                      usable: new AObject[] { },
                      notClear: new AObject[0],
                      godir: new Dictionary <Direction, Area>
            {
                { Direction.N, SCourt },
                { Direction.W, TrackSW },
                { Direction.E, TrackSE }
            });

            SetupArea(ref TrackW, "跑道",
                      desc: "你在环绕足球场的塑胶跑道上;直道向南、北延伸。主席台在你西侧的上方;你也可以横穿跑道,向东走进足球场。",
                      usable: new AObject[] { },
                      notClear: new AObject[0],
                      godir: new Dictionary <Direction, Area>
            {
                { Direction.N, TrackNW },
                { Direction.S, TrackSW },
                { Direction.W, UdHighPlt },
                { Direction.E, Court }
            });

            SetupArea(ref TrackNE, "跑道",
                      desc: "你在环绕足球场的塑胶跑道上;这里弯道的拐角向南边和西边延伸。",
                      usable: new AObject[] { },
                      notClear: new AObject[0],
                      godir: new Dictionary <Direction, Area>
            {
                { Direction.S, TrackE },
                { Direction.W, TrackN }
            });

            SetupArea(ref TrackNW, "跑道",
                      desc: "你在环绕足球场的塑胶跑道上;这里弯道的拐角向北边和西边延伸。你的北面是直跑道延伸出去的末端一截,一百米跑的起点;阶梯状的观众席在你的西侧。",
                      usable: new AObject[] { },
                      notClear: new AObject[0],
                      godir: new Dictionary <Direction, Area>
            {
                { Direction.N, NTrackEnd },
                { Direction.S, TrackW },
                { Direction.W, UdNSpectPlt },
                { Direction.E, TrackN }
            });

            SetupArea(ref TrackSE, "跑道",
                      desc: "你在环绕足球场的塑胶跑道上;这里弯道的拐角向北边和东边延伸。",
                      usable: new AObject[] { },
                      notClear: new AObject[0],
                      godir: new Dictionary <Direction, Area>
            {
                { Direction.N, TrackE },
                { Direction.W, TrackS }
            });

            SetupArea(ref TrackSW, "跑道",
                      desc: "你在环绕足球场的塑胶跑道上;这里弯道的拐角向北边和东边延伸。你南北面是直跑道延伸出去的末端一截;阶梯状的观众席在你的西侧。",
                      usable: new AObject[] { },
                      notClear: new AObject[0],
                      godir: new Dictionary <Direction, Area>
            {
                { Direction.N, TrackW },
                { Direction.S, NTrackEnd },
                { Direction.W, UdSSpectPlt },
                { Direction.E, TrackS }
            });

            SetupArea(ref NTrackEnd, "跑道末端",
                      desc: "你站在直跑道延伸出去的末端一截,一百米跑的起点附近;南边,跑道汇入围绕足球场的弯道。你也可以向东走向一块空地。",
                      usable: new AObject[] { },
                      notClear: new AObject[0],
                      godir: new Dictionary <Direction, Area>
            {
                { Direction.S, TrackNW },
                { Direction.E, FdNTrack }
            });

            SetupArea(ref STrackEnd, "跑道末端",
                      desc: "你站在直跑道延伸出去的末端一截;北边,跑道汇入围绕足球场的弯道。你也可以向西上坡走向观众席南端的一个平台。",
                      usable: new AObject[] { },
                      notClear: new AObject[0],
                      godir: new Dictionary <Direction, Area>
            {
                { Direction.W, SpectEndPlt },
                { Direction.N, TrackSW }
            });

            SetupArea(ref FdNTrack, "空地",
                      desc: "你站在跑道北边的一块空地上;再北侧,操场的栅栏外面只有一片黑暗。你可以向南回到跑道,向西进入一百米跑起点那边直跑道延伸出去的一截,或向东穿过一片草地走向单杠附近。",
                      usable: new AObject[] { },
                      notClear: new AObject[0],
                      godir: new Dictionary <Direction, Area>
            {
                { Direction.S, TrackN },
                { Direction.W, NTrackEnd },
                { Direction.E, FdInstr }
            });

            SetupArea(ref HighPlt, "主席台",
                      desc: "你站在主席台的穹顶下,在这个位置你能俯视整个操场;可惜,夜雾阻止了你看得太远。你可以向北或向南回到两边的阶梯观众席上。",
                      usable: new AObject[] { },
                      notClear: new AObject[0],
                      godir: new Dictionary <Direction, Area>
            {
                { Direction.N, NSpectPlt },
                { Direction.S, SSpectPlt }
            });
            // should there be a bunch of lights (that can be operated in some obscure place) up there?

            SetupArea(ref NSpectPlt, "观众席(北)",
                      desc: "你站在北边的观众席上;这里的阶梯地面空空荡荡,没有任何垃圾或落叶。南边一条道路向上通往主席台;你也可以从东边的台阶下去。",
                      usable: new AObject[] { },
                      notClear: new AObject[0],
                      godir: new Dictionary <Direction, Area>
            {
                { Direction.S, HighPlt },
                { Direction.E, UdNSpectPlt }
            });

            SetupArea(ref SSpectPlt, "观众席(南)",
                      desc: "你站在南边的观众席上;这里的阶梯地面空空荡荡,没有任何垃圾或落叶。北边一条道路向上通往主席台,南边是观众席末端通向学校西门附近的一个平台;你也可以从东边的台阶下去。",
                      usable: new AObject[] { },
                      notClear: new AObject[0],
                      godir: new Dictionary <Direction, Area>
            {
                { Direction.N, HighPlt },
                { Direction.E, UdSSpectPlt },
                { Direction.S, SpectEndPlt }
            });

            SetupArea(ref SpectEndPlt, "观众席末端平台",
                      desc: "你站在观众席南边末端的一个弧形平台上;南边,操场的侧面出入口通向学校西门边的大路。你可以向北进入观众席,或者向东通过阶梯式的地面下去到跑道上。",
                      usable: new AObject[] { },
                      notClear: new AObject[0],
                      godir: new Dictionary <Direction, Area>
            {
                { Direction.N, SSpectPlt },
                { Direction.E, STrackEnd }
            });
            SpectEndPlt.RoomTo.Add(Direction.S, Campus);
            SpectEndPlt.OnGoDirection = (s, v, d) =>
            {
                Campus.ChangeArea("通向学校西门的道路");
                return(HandleResult.Continue);
            };

            SetupArea(ref UdHighPlt, "主席台前",
                      desc: "你站在主席台下(准确来说,东边)的一块小空地上。这里没有直接通向主席台的路。你可以向南或向北走到观众席边。",
                      usable: new AObject[] { },
                      notClear: new AObject[0],
                      godir: new Dictionary <Direction, Area>
            {
                { Direction.N, UdNSpectPlt },
                { Direction.S, UdSSpectPlt }
            });

            SetupArea(ref UdNSpectPlt, "观众席前",
                      desc: "你站在北侧观众席东边的一块小空地上;阶梯观众席的金属栏杆在你的西侧开口。你可以向南走到主席台前,向东走上跑道,或向西南走穿过主席台底下两条通道中北边的那一条。",
                      usable: new AObject[] { },
                      notClear: new AObject[0],
                      godir: new Dictionary <Direction, Area>
            {
                { Direction.W, NSpectPlt },
                { Direction.S, UdHighPlt },
                { Direction.E, TrackNW },
                { Direction.SW, NPassage }
            });

            SetupArea(ref UdSSpectPlt, "观众席前",
                      desc: "你站在南侧观众席东边的一块小空地上;阶梯观众席的金属栏杆在你的西侧开口。你可以向北走到主席台前,向东走上跑道,或向西北走穿过主席台底下两条通道中南边的那一条。",
                      usable: new AObject[] { },
                      notClear: new AObject[0],
                      godir: new Dictionary <Direction, Area>
            {
                { Direction.W, SSpectPlt },
                { Direction.N, UdHighPlt },
                { Direction.E, TrackSW },
                { Direction.NW, SPassage }
            });

            SetupArea(ref NPassage, "主席台下的小路",
                      desc: "你在一条通道里,通道穿过主席台下向西通往操场后院、向东北通往观众席前。",
                      usable: new AObject[] { },
                      notClear: new AObject[0],
                      godir: new Dictionary <Direction, Area>
            {
                { Direction.NE, UdNSpectPlt }
            });
            // to back of playground

            SetupArea(ref SPassage, "主席台下的小路",
                      desc: "你在一条通道里,通道穿过主席台下向西通往操场后院、向东南通往观众席前。",
                      usable: new AObject[] { },
                      notClear: new AObject[0],
                      godir: new Dictionary <Direction, Area>
            {
                { Direction.SE, UdSSpectPlt }
            });
            // to back of playground
        }
Пример #3
0
        public static void Day2Setting()
        {
            // Whoooooosh....

            // A. reset

            BuildDormitory12();
            BuildRestroom();
            BuildBalcony();
            BuildDormsHallway();
            BuildLobbyNo8();

            Dormitory12.Objects.Find((x) => x.Name == "床铺").Description = (_s, _v) => "在暗中看不清楚。";

            // B. modify

            // B.1. dorm12

            // remove the light of darkness
            Dormitory12.LightDescription =
                "这是你熟悉的寝室,闭上眼都能想象出它的样子。你能看见衣柜,桌子,床铺(四张:你睡在靠窗的下铺)以及通向走廊和洗手间过道的两扇门。";
            Dormitory12.Description =
                "你只能在黑暗中看见大概的轮廓:衣柜,桌子,床铺(四张:你睡在靠窗的下铺),以及通向走廊和洗手间过道的两扇门。";

            // add the light of sky
            Dormitory12.GetDescription = (self, v) =>
            {
                if (self.IsLit)
                {
                    return(Dormitory12.LightDescription +
                           "\n\n窗帘拉开,外面的天空里滚动着紫红色的浓云。");
                }
                else if (self.IsPlayerLit)
                {
                    return(Dormitory12.LightDescription +
                           "\n\n窗帘后什么地方透出一种红晕,但几乎被手电筒的强光掩盖了。");
                }
                else
                {
                    return(Dormitory12.Description +
                           "\n\n有一种可爱的红晕穿透窗帘照进来。");
                }
            };

            Dormitory12.ReplaceObjectInternal("窗帘",
                                              new AObject(Dormitory12.FindObjectInternal("窗帘"))
            {
                Description = (_s, _v) =>
                              "从它后面什么地方照进来一种红色的光。",
                LightDescription = (_s, _v) =>
                                   "从它后面什么地方照进来一种红色的光,但几乎被你手电筒的强光掩盖了。",
                OnOpening = (self, v) =>
                {
                    self.OpenState   = true;
                    self.Description = self.LightDescription = (_s, _v) => "窗帘被你拉开,缩在一边。";
                    v.currentRoom.FindObjectInternal("窗户").Description          =
                        v.currentRoom.FindObjectInternal("窗户").LightDescription = (_s, _v) =>
                                                                                  "窗外是对面的9#楼(高中男生寝室)和周围的人行道路。天空是紫红色的。";

                    if (!v.foundNoVoid2)
                    {
                        Print($"你拉开窗帘的一瞬间,紫红色的光涌入房间。它来自对面寝室楼后的天空。楼下的路灯沦为了暗暗的白点。地面也散发出紫色,与天空一起变幻着。在你眼中,有一秒钟时间,天空成了翻滚的海洋,而地面则是风中倒置的迷雾和森林。但是寂静……这片寂静使你惊异。现在甚至听不见外面风声,只有背景中若有若无的耳鸣。{(v.foundDarkness1 ? "你原先期望看到什么?黑暗?……紫色的黑暗?有点可笑。" : "")}\n\n");
                        v.foundNoVoid2 = true;
                    }
                    else
                    {
                        Print("你拉开窗帘时,紫红色的光涌入房间。\n\n");
                    }
                    v.currentRoom.IsLit = true;

                    return(HandleResult.FullManaged);
                },
                OnClosing = (self, v) =>
                {
                    self.OpenState        = false;
                    self.Description      = (_s, _v) => "从它后面什么地方照进来一种红晕。";
                    self.LightDescription = (_s, _v) =>
                                            "从它后面什么地方照进来一种红晕,但几乎被你手电筒的强光掩盖了。";
                    v.currentRoom.FindObjectInternal("窗户").Description = (_s, _v) =>
                                                                         "窗户被窗帘遮挡着,只从外面透进来一种红晕。";
                    v.currentRoom.FindObjectInternal("窗户").LightDescription = (_s, _v) =>
                                                                              "窗帘没有拉开,你看不见外面的样子。";

                    Print("你拉上窗帘。室内恢复了原来的阴暗。\n\n");

                    return(HandleResult.FullManaged);
                }
            });

            Dormitory12.ReplaceObjectInternal("窗户",
                                              new AObject(Dormitory12.FindObjectInternal("窗户"))
            {
                Description = (_s, _v) =>
                              "窗户被窗帘遮挡着,只从外面透进来一种红晕。",
                LightDescription = (_s, _v) =>
                                   "窗帘没有拉开,你看不见外面的样子。"
            });

            Dormitory12.BeforeCommand = (self, v, p) =>
            {
                // convenience magic
                if (p == "xyzzy")
                {
                    v.withClothes      = true;
                    v.currentRoom      = Campus;
                    Campus.CurrentArea = Campus.Areas.Find((x) => x.Name == "食堂和寝室楼之间");
                    Print("Flooooooooooosh!!\n\n");
                    return(HandleResult.FullManaged);
                }
                // TODO: move these to separate verbs
                if (p == "起床" || p == "起来")
                {
                    if (self.CurrentArea.Name == "床上")
                    {
                        Print(
                            "你推开被子,坐起来,摸索着穿上最近的一双拖鞋。\n\n");
                        self.CurrentArea = null;
                    }
                    else
                    {
                        Print("你并不在床上。\n\n");
                    }

                    return(HandleResult.FullManaged);
                }
                else if ((p == "睡" || p == "睡觉"))
                {
                    Print("现在你不想睡觉。\n\n");
                    return(HandleResult.FullManaged);
                }
                else
                {
                    return(HandleResult.Continue);
                }
            };

            // B.2. Restroom: Good. No changes...

            // B.3. Balcony

            // sky
            Balcony.GetDescription = (self, v) =>
                                     $"阳台的瓷砖地面反射着{(self.IsPlayerLit ? "手电筒和" : "")}天空的色彩。天空在地面上投下你模模糊糊的影子,瓷砖的边缘泛起微光。虽然还没到能看书的地步,但你能注意到光照的亮度很不寻常。眼前漂浮在夜晚朦胧空气中的树和楼房奇怪地漂亮。你能听见风声了。";
            Balcony.PostDescription = (self, v) =>
            {
                if (!v.foundNoVoid2)
                {
                    v.foundNoVoid2 = true;
                    return($"房间里的红光就来自那天空,使楼下的路灯沦为了暗暗的白点。地面也散发出紫色,与天空一起变幻着。在你眼中,有一秒钟时间,天空成了翻滚的海洋,而地面则是风中倒置的迷雾和森林。但是寂静——这片寂静使你惊异,现在甚至听不见外面风声,只有背景中若有若无的耳鸣。{(v.foundDarkness1 ? "你原先期望看到什么?黑暗?……紫色的黑暗?有点可笑。" : "")}\n\n");
                }
                else
                {
                    return("");
                }
            };

            Balcony.IsLit = true;

            Balcony.Objects.Remove(Balcony.FindObjectInternal("黑暗"));

            Balcony.Objects.Add(new AObject("楼房",
                                            new[] { "楼房", "树", "树木", "房子", "寝室楼", "9#楼", "地面", "天空" })
            {
                IsReachable = false
            });

            // B.4. DormsHallway: No changes.

            // B.5. Lobby8

            LobbyNo8.LightDescription =
                "灯光下是一个空荡的小门厅,墙上有一些花哨夸张的图案。楼梯向上通往二楼,另一侧是宿管老师值班的房间,没开灯,窗内黑洞洞的。一扇玻璃大门通向外面。";

            // real door
            LobbyNo8.FindObjectInternal("外面").RoomTo     = Campus;
            LobbyNo8.FindObjectInternal("外面").OnEntering = (self, v) =>
            {
                Campus.ChangeArea("食堂和寝室楼之间");
                return(HandleResult.Continue);
            };
            LobbyNo8.FindObjectInternal("外面").LinkedSide = () =>
                                                           Campus.FindObjectInternal("去8#寝室楼大厅的门");
        }