Exemplo n.º 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)
        }
Exemplo n.º 2
0
        static void BuildCampus()
        {
            Campus.Name = "学校";
            Campus.Alias.Clear();
            Campus.IsLit  = true;
            Campus.IsWarm = false;

            // No global descriptors. they are placed in the areas
            Campus.GetDescription = (self, v) => "Should not see this\n\n";

            // Buildings

            AObject Building1 = new AObject(
                "1#楼", new[] { "行政楼", "1#", "大楼", "楼房" },
                desc:           "1#楼:高大、方形的学校行政楼。六层楼里是大大小小的办公室、校长室(你见过,那里有两层房间,永远不知道其中在发生什么)、机房、电子阅览室、图书馆、“谈国家大事的地方”。东西很多。两边的二、三层都有天桥,通向初中和高中楼。");

            AObject Building2 = new AObject(
                "2#楼", new string[] {
                "高中楼", "高中教学楼", "教学楼", "2#", "大楼", "楼房"
            },
                desc:           "2#楼:高中教学楼。与初中教学楼分布在行政楼前广场的两边,互相各成背对着的C字形。你没怎么去过,除了到那里一楼教室上美术课的时候。");

            AObject ReportHall = new AObject(
                "报告厅", new string[] {
                "大厅", "楼房"
            },
                desc:           "报告厅与高中教学楼[2#]相连,是凸出于教学楼东南侧的一个宽扁的方块。里面的座椅只够一个年级坐下:更大规模的活动通常在体育馆[6#]或者行政楼[1#]六楼举行。");

            AObject Building3 = new AObject(
                "3#楼", new string[] {
                "初中楼", "初中教学楼", "教学楼", "3#", "大楼", "楼房"
            },
                desc:           "3#楼:初中教学楼,你白天的寄居之地。与初中教学楼分布在行政楼前广场的两边,互相各成背对着的C字形。");

            AObject Building4 = new AObject(
                "4#楼", new string[] {
                "外事公寓楼", "外事公寓", "外事楼", "4#", "大楼", "楼房"
            },
                desc:           "4#楼:外事公寓楼。");

            AObject Building5 = new AObject(
                "5#楼", new[] { "5#", "大楼", "楼房" },
                desc:           "5#楼:没什么用的一幢楼。游戏里永远锁着。放在这里只是出于方便。");

            AObject Building6 = new AObject(
                "6#楼", new[] { "体育馆", "6#", "大楼", "楼房" },
                desc:           "6#楼:体育馆,高高的两层楼相当于其他地方的四层,夏天在这里爬上爬下的确令人泄气。不过它众多楼梯中也隐藏着各种各样的房间。");

            AObject Building7 = new AObject(
                "7#楼", new[] { "食堂", "餐厅", "7#", "大楼", "楼房" },
                desc:           "7#楼:食堂。半夜里世界上最没用的地方;二楼和三楼几盏应急灯微弱的红光从大窗户里透出来,此外一片黑暗。一楼附带超市,但此刻同样没用:你进不去。");

            AObject Building8 = new AObject(
                "8#楼", new[] { "初中男生寝室楼", "初中寝室楼", "男生寝室楼", "寝室楼", "8#", "大楼", "楼房" },
                desc:           "8#楼:你最熟悉的寝室楼。灯全部关了,外墙上失去了生活的气息,但那些交替凹凸排列着的窗户和阳台还是令你感到规整而舒适。");

            AObject Building9 = new AObject(
                "9#楼", new[] { "高中男生寝室楼", "高中寝室楼",
                               "男生寝室楼", "寝室楼", "9#", "大楼", "楼房" },
                desc:           "");

            AObject Building10 = new AObject(
                "10#楼", new[] { "高中女生寝室楼", "高中寝室楼",
                                "女生寝室楼", "寝室楼", "10#", "大楼", "楼房" },
                desc:           "");

            AObject Building11 = new AObject(
                "11#楼", new[] { "初中女生寝室楼", "初中寝室楼",
                                "女生寝室楼", "寝室楼", "11#", "大楼", "楼房" },
                desc:           "");

            AObject Playground = new AObject(
                "操场", new[] { "足球场" },
                desc:           "");

            AObject Garage = new AObject(
                "车库", new string[0],
                desc:           "");

            AObject BasketballCourt = new AObject(
                "篮球场", new[] { "球场" },
                desc:           "");

            // other items

            AObject GymPond = new AObject(
                "体育馆边的池塘", new[] { "池塘", "水池", "水" },
                desc:           "池塘在体育馆东门外延伸成L形。略微浑浊的水面被风吹成网状褶皱,建筑的阴影在其中破碎。几只模糊的鱼在水中移动。");
            AObject SquarePond = new AObject(
                "教学楼边的池塘", new[] { "池塘", "水池", "水" },
                desc:           "教学楼边的长方形池塘里,略微浑浊的水面被风吹成网状褶皱,天空的颜色在其中破碎。几只模糊的鱼在水中移动。");
            AObject Fish = new AObject(
                "鱼", new string[0],
                desc:           "几只鱼模糊地在水中移动。在不明朗的光线中你分辨出它们的样子:红色,黑色,白色,它们的胡须,它们大而呆滞的眼睛。");

            Fish.OnBeingSmelled = GymPond.OnBeingSmelled = (s, v) =>
            {
                Interactive.Print("闻起来像水。\n\n");
                return(HandleResult.FullManaged);
            };
            Fish.OnTaking = Fish.OnBeingTouched = (s, v) =>
            {
                if (v.triedGetFish)
                {
                    Interactive.Print("你已经徒劳地试过捉鱼了,并且不想再试一遍。\n\n");
                    return(HandleResult.Refused);
                }
                Interactive.Print("你走到池塘边,蹲下来把手伸进意外冰冷的水里。你的双手有些麻木,而鱼的反应速度比你更快;事实上,你烦躁地发觉自己完全无法从视觉上预测它们在水里的位置。");
                if (Utility.Chance(0.6))
                {
                    Interactive.Print("毫无希望地,你缩回手站起来。\n\n");
                    v.triedGetFish = true;
                }
                else
                {
                    Interactive.Print("你把手伸得更远,试着跟上几条向远处游走的鱼,然后你突然失去了平衡。在你能够做出反应之前,你已经随着一声巨响被彻骨寒冷的水包围着渗入。你挣扎着想浮起来(你记得池塘看上去很浅),但水看上去充满了整个世界。你无法呼吸……你的视野在暗下来。\n\n");
                    v.triedGetFish = true;
                    v.dreamStop    = true;
                    v.stopReason   = "water";
                }
                return(HandleResult.FullManaged);
            };
            SquarePond.SubObjects.Add(Fish);
            GymPond.SubObjects.Add(Fish);

            AObject Flower = new AObject(
                "花坛", new[] { "花" },
                desc:           "如迷宫般围绕台阶的花坛有你的一半高;从其中升起的花枝在雾中看起来非常微小,像显微镜下花瓣的纤毛。当然,运动是假象。");

            Campus.Objects.Clear();
            Campus.Objects.AddRange(new AObject[]
            {
                Building1, Building2, Building3, Building4, Building5, Building6, Building7, Building8, Building9, Building10, Building11, Playground, Garage, BasketballCourt,
                GymPond, SquarePond, Flower
            });

            // A = between; Hi = high; Lo = low; Fr = front of; Bk = back of;
            // NESW = n, e, s, w of; t = and; Tri = trivium; Sq = square; Rd = road;

            Area A7t8       = new Area();
            Area HiSq       = new Area();
            Area FrHiSq     = new Area();
            Area BkHiSq     = new Area();
            Area S1Rd       = new Area();
            Area TriWS1Rd   = new Area();
            Area A1t5       = new Area();
            Area A1t4       = new Area();
            Area A3t5       = new Area();
            Area LoSq       = new Area();
            Area A2t4       = new Area();
            Area FrRepHl    = new Area();
            Area A7t4       = new Area();
            Area Fr7        = new Area();
            Area TriEGate   = new Area();
            Area EA7t8      = new Area();
            Area ERepHl     = new Area();
            Area EGym       = new Area();
            Area FrGym      = new Area();
            Area EPlg       = new Area();
            Area A5tPlg     = new Area();
            Area NA5tPlg    = new Area();
            Area TriWGate   = new Area();
            Area RdWGate    = new Area();
            Area TriFrWGate = new Area();
            Area W6         = new Area();
            Area BkGym      = new Area();
            Area SE6Brg     = new Area();

            Campus.Areas.Clear();
            Campus.Areas.AddRange(new Area[] {
                A7t8, HiSq, FrHiSq, BkHiSq, S1Rd, TriWS1Rd, A1t5, A1t4, A3t5, LoSq, A2t4, FrRepHl, A7t4, Fr7, TriEGate, EA7t8, ERepHl, EGym, FrGym, EPlg, A5tPlg, NA5tPlg, TriWGate, RdWGate, TriFrWGate, W6, BkGym, SE6Brg, DarknessArea
            });

            AObject doorA7t8 = AObject.SimpleDoor(
                dest:           LobbyNo8,
                name:           "去8#寝室楼大厅的门",
                alias:          new[] { "里面", "室内", "大门", "门", "门内", "寝室楼", "大厅" },
                desc:           "通向室内的门。寝室楼大厅的灯光在里面苍白地亮着。",
                open:           true,
                flopside:       () => LobbyNo8.FindObjectInternal("外面"));

            Campus.Objects.Add(doorA7t8);
            SetupArea(ref A7t8, "食堂和寝室楼之间",
                      desc: "你站在食堂[7#]与你的寝室楼[8#]之间的空地上。东侧的远处围栏前停着几辆车。西侧通往一个小广场,几棵灰暗的大树后面显示出体育馆高大的影子。",
                      usable: new[] { Building7, Building8, doorA7t8 },
                      notClear: new[] { Building6 },
                      godir: new Dictionary <Direction, Area>
            {
                { Direction.W, HiSq },
                { Direction.E, EA7t8 }
            });

            SetupArea(ref HiSq, "寝室楼前的小广场",
                      desc: "你站在小广场的树下,浓荫掩蔽了光线,南边周围是一大片花坛。这里还属于“高地”,所以去北侧的行政楼[1#]就要走下台阶。西侧就是体育馆[6#],入口前有一个小池塘;在东边你能望见食堂[7#]和8#寝室楼。女生寝室楼[10#, 11#]在南边,还要上一段台阶才能走到。",
                      usable: new[] { Building6, Building8, Flower },
                      notClear: new[] { Building1, Building7, GymPond },
                      godir: new Dictionary <Direction, Area>
            {
                { Direction.E, A7t8 },
                { Direction.W, EGym },
                { Direction.N, FrHiSq },
                { Direction.S, BkHiSq }
            });

            SetupArea(ref BkHiSq, "台阶",
                      desc: "你站在花坛之间的台阶上,被雾中漂浮的不明确微细枝条所包围。北边立着小广场中间巨大的树。花坛的小路之外,四幢寝室楼在南面和东面形成半包围的结构。",
                      usable: new[] { Building1, Building7, Flower },
                      notClear: new[] { Building6, Building8, Building10, GymPond },
                      godir: new Dictionary <Direction, Area>
            {
                { Direction.N, HiSq }
            });

            SetupArea(ref FrHiSq, "台阶",
                      desc: "你站在连接学校南北两部分的台阶上,向北面对行政楼[1#],向南面对小广场。广场中央那棵巨大的树在这里看上去像一枚在雾霭中漂浮的榛子。",
                      usable: new[] { Building1, Building7 },
                      notClear: new[] { Building6 },
                      godir: new Dictionary <Direction, Area>
            {
                { Direction.S, HiSq },
                { Direction.N, S1Rd }
            });

            AObject doorS1Rd = AObject.SimpleDoor(
                dest:           Building1F1,
                name:           "行政楼的南门",
                alias:          new[] { "里面", "室内", "大门", "门", "门内", "行政楼" },
                desc:           "通向行政楼室内的门。",
                open:           false,
                flopside:       () => Building1F1.FindObjectInternal("南侧大门"));

            doorS1Rd.OnEntering = (s, v) =>
            {
                Building1F1.ChangeArea("大厅南侧");
                return(HandleResult.Continue);
            };
            Campus.Objects.Add(doorS1Rd);
            SetupArea(ref S1Rd, "道路",
                      desc: "你站在一条东西走向的大路上。这条路很长;顺着西边望去能看见操场,东边的另一头能看见食堂[7#]。北边侧对着行政楼[1#]入口,南边有台阶通向高地,那里有寝室和体育馆。你也可以向东北拐到行政楼[1#]和外事公寓[4#]之间。在你的头顶上方,树荫遮住了一半天空,紫红色的微光从树叶缝隙里漏下来。西端体育馆那边的墙上爬着稀疏的藤蔓。",
                      usable: new[] { Building1, Building7, doorS1Rd },
                      notClear: new[] { Building6 },
                      godir: new Dictionary <Direction, Area>
            {
                { Direction.S, FrHiSq },
                { Direction.W, TriWS1Rd },
                { Direction.E, Fr7 },
                { Direction.NE, A1t4 }
            });

            SetupArea(ref TriWS1Rd, "三岔路口",
                      desc: "你站在一条东西走向的大路上,西边延伸直到操场,东边的另一头延伸直到食堂[7#]。这个路口的北侧在行政楼[1#]和国际部[5#]之间分出一条过道。",
                      usable: new[] { Building1, Building5 },
                      notClear: new[] { Building6 },
                      godir: new Dictionary <Direction, Area>
            {
                { Direction.E, S1Rd },
                { Direction.W, EPlg },
                { Direction.N, A1t5 }
            });

            AObject doorA1t5_1 = AObject.SimpleDoor(
                dest:           null,
                name:           "行政楼西面的小门",
                alias:          new[] { "里面", "室内", "大门", "门", "门内", "行政楼" },
                desc:           "行政楼侧面通往楼梯间的门。",
                open:           false,
                locked: true);
            AObject doorA1t5_2 = AObject.SimpleDoor(
                dest:           null,
                name:           "国际部东门",
                alias:          new[] { "里面", "室内", "大门", "门", "门内", "国际部" },
                desc:           "通往国际部室内的大门。",
                open:           false,
                locked: true);

            Campus.Objects.Add(doorA1t5_1);
            Campus.Objects.Add(doorA1t5_2);
            SetupArea(ref A1t5, "行政楼侧面",
                      desc: "你站在行政楼[1#]和国际部[5#]之间的道路上。北边是初中教学楼[3#]下的空地,南边通向一条东西走向的大路。5#楼的大门在你西侧;东边有一个1#楼的侧门。",
                      usable: new[] { Building1, Building5, doorA1t5_1, doorA1t5_2 },
                      notClear: new[] { Building3 },
                      godir: new Dictionary <Direction, Area>
            {
                { Direction.S, TriWS1Rd },
                { Direction.N, A3t5 }
            });

            AObject doorA1t4_1 = AObject.SimpleDoor(
                dest:           null,
                name:           "行政楼东面的小门",
                alias:          new[] { "里面", "室内", "大门", "门", "门内", "行政楼" },
                desc:           "行政楼侧面通往楼梯间的门。",
                open:           false,
                locked: true);
            AObject doorA1t4_2 = AObject.SimpleDoor(
                dest:           null,
                name:           "外事公寓西门",
                alias:          new[] { "里面", "室内", "大门", "门", "门内", "外事公寓", "公寓" },
                desc:           "通往外事公寓室内的大门。",
                open:           false,
                locked: true);

            Campus.Objects.Add(doorA1t4_1);
            Campus.Objects.Add(doorA1t4_2);
            SetupArea(ref A1t4, "行政楼侧面",
                      desc: "你站在行政楼[1#]和外事公寓[4#]之间的道路上。北边是高中教学楼[2#]和报告厅附近的空地,西南通向一条东西走向的大路,东南通向食堂一带。4#楼的大门在你东侧;西边有一个1#楼的侧门。",
                      usable: new[] { Building1, Building4, doorA1t4_1, doorA1t4_2 },
                      notClear: new[] { Building2 },
                      godir: new Dictionary <Direction, Area>
            {
                { Direction.SW, S1Rd },
                { Direction.SE, Fr7 },
                { Direction.N, A2t4 }
            });

            AObject doorA3t5 = AObject.SimpleDoor(
                dest:           null,
                name:           "初中教学楼边门",
                alias:          new[] { "里面", "室内", "大门", "门", "门内", "初中教学楼", "教学楼" },
                desc:           "边门经过一段走廊通向高中教学楼。",
                open:           false,
                locked: true);

            Campus.Objects.Add(doorA3t5);
            SetupArea(ref A3t5, "教学楼侧面",
                      desc: "你站在初中教学楼[3#]和国际部[5#]之间宽阔的道路上;这里更像一块供人来往活动的空地。西边通向一条操场边南北走向的大路。在东边,教学楼三、四楼的天桥从你的上方经过进入行政楼[1#];你可以向东从天桥下走向教学楼间的广场。南边有一条路通往行政楼[1#]和国际部[5#]之间。",
                      usable: new[] { Building3, Building5, doorA3t5 },
                      notClear: new[] { Building1 },
                      godir: new Dictionary <Direction, Area>
            {
                { Direction.S, A1t5 },
                { Direction.E, LoSq }
            });

            AObject doorLoSq_1 = AObject.SimpleDoor(
                dest:           null,
                name:           "初中教学楼正门",
                alias:          new[] { "里面", "室内", "大门", "门", "门内", "初中教学楼", "教学楼" },
                desc:           "楼边池塘上一座小桥后面,初中教学楼的正门。",
                open:           false,
                locked: true);
            AObject doorLoSq_2 = AObject.SimpleDoor(
                dest:           null,
                name:           "高中教学楼正门",
                alias:          new[] { "里面", "室内", "大门", "门", "门内", "高中教学楼", "教学楼" },
                desc:           "楼边池塘上一座小桥后面,高中教学楼的正门。",
                open:           false,
                locked: true);
            AObject doorLoSq_3 = AObject.SimpleDoor(
                dest:           Building1F1,
                name:           "行政楼的正门",
                alias:          new[] { "里面", "室内", "大门", "门", "门内", "行政楼" },
                desc:           "通向行政楼室内的门。",
                open:           false,
                flopside:       () => Building1F1.FindObjectInternal("北侧大门"));

            doorLoSq_3.OnEntering = (s, v) =>
            {
                Building1F1.ChangeArea("大厅北侧");
                return(HandleResult.Continue);
            };
            Campus.Objects.Add(doorLoSq_1);
            Campus.Objects.Add(doorLoSq_2);
            Campus.Objects.Add(doorLoSq_3);
            SetupArea(ref LoSq, "教学楼间的小广场",
                      desc: "你在教学楼间平坦的广场上,无树的夜晚天空广阔地显现在你的头顶,投下奇异的光照。旗杆是这里唯一高的事物;你注意到上面没有旗帜。行政楼的正门在广场的南面;向西、向东分别可以从三、四楼的天桥下走向初中、高中教学楼的侧门;当然,广场前部侧面的教学楼正门也可进入。",
                      usable: new[] { Building1, Building2, Building3, doorLoSq_1, doorLoSq_2,
                                      doorLoSq_3, SquarePond },
                      notClear: new AObject[0],
                      godir: new Dictionary <Direction, Area>
            {
                { Direction.W, A3t5 },
                { Direction.E, A2t4 }
            });

            AObject doorA2t4 = AObject.SimpleDoor(
                dest:           null,
                name:           "高中教学楼边门",
                alias:          new[] { "里面", "室内", "大门", "门", "门内", "高中教学楼", "教学楼" },
                desc:           "边门经过一段走廊通向高中教学楼。",
                open:           false,
                locked: true);

            Campus.Objects.Add(doorA2t4);
            SetupArea(ref A2t4, "教学楼侧面",
                      desc: "你站在高中教学楼[2#]和外事公寓[4#]之间宽阔的道路上;这里更像一块供人来往活动的空地。东侧不远处你能看见高中楼一楼附带的报告厅及其入口的方块形状(入口在外面);再往东就到了围墙附近。在西边,教学楼三、四楼的天桥从你的上方经过进入行政楼[1#];你可以向西从天桥下走向教学楼间的广场。南边有一条路通往行政楼[1#]和外事公寓[4#]之间。",
                      usable: new[] { Building2, Building5, ReportHall, doorA2t4 },
                      notClear: new[] { Building1 },
                      godir: new Dictionary <Direction, Area>
            {
                { Direction.S, A1t4 },
                { Direction.E, FrRepHl },
                { Direction.W, LoSq }
            });

            AObject doorFrRepHl = AObject.SimpleDoor(
                dest:           null,
                name:           "报告厅大门",
                alias:          new[] { "里面", "室内", "大门", "门", "门内", "报告厅", "大厅" },
                desc:           "报告厅的大门大多数时候都是锁着的;透过玻璃你只能隐约可见几排昏暗的座椅。",
                open:           false,
                locked: true);

            Campus.Objects.Add(doorFrRepHl);
            SetupArea(ref FrRepHl, "报告厅入口",
                      desc: "你站在高中楼一楼报告厅的入口附近,高中教学楼[2#]外的空地中。外事公寓[4#]在你的南边显现出侧面;东边通往围墙边的道路。你也可以向西朝教学楼入口那边行走。",
                      usable: new[] { Building2, Building5, ReportHall, doorFrRepHl },
                      notClear: new[] { Building4 },
                      godir: new Dictionary <Direction, Area>
            {
                { Direction.W, A2t4 },
                { Direction.E, ERepHl }
            });

            AObject doorFr7 = AObject.SimpleDoor(
                dest:           null,
                name:           "食堂大门",
                alias:          new[] { "里面", "室内", "大门", "门", "门内", "食堂" },
                desc:           "一段台阶后面的食堂正门,透过玻璃只能看见比天色更为黑暗的一团方块。",
                open:           false,
                locked: true);

            Campus.Objects.Add(doorFr7);
            SetupArea(ref Fr7, "食堂前的大路",
                      desc: "你站在一条东西走向的大路上。你的南边是食堂[7#]的台阶和大门,在夜里看上去是比天色更为黑暗的一团方块;北边,外事公寓[4#]以其侧面阻挡了你的视线。西边,道路直通向操场方向;你也可以向东到达一个三岔路口,或者向西北拐到4#楼的另一面。",
                      usable: new[] { Building4, Building7, doorFr7 },
                      notClear: new[] { Building1 },
                      godir: new Dictionary <Direction, Area>
            {
                { Direction.W, S1Rd },
                { Direction.E, TriEGate },
                { Direction.NW, A1t4 }
            });

            SetupArea(ref TriEGate, "东门边的三岔路口",
                      desc: "你站在一条东西走向的大路的尽头,东边本应是学校的侧门,但此刻——虽然有路灯和天空的亮光照耀——那里只是一片令人不寒而栗的黑暗。南北两面各有围墙边的道路环绕学校;你也可以从西面走到食堂[7#]和外事公寓[4#]之间。",
                      usable: new[] { Building7 },
                      notClear: new[] { Building4 },
                      godir: new Dictionary <Direction, Area>
            {
                { Direction.W, Fr7 },
                { Direction.E, DarknessArea },
                { Direction.N, ERepHl },
                { Direction.S, EA7t8 }
            });

            SetupArea(ref EA7t8, "围墙边的道路",
                      desc: "你站在一条南北走向的道路上,东边紧靠学校的围墙。西边,食堂[7#]和8#寝室楼之间有大路直通向寝室楼前的小广场。围墙外只有一片超现实、不透明的黑暗。",
                      usable: new AObject[0],
                      notClear: new[] { Building7, Building8 },
                      godir: new Dictionary <Direction, Area>
            {
                { Direction.N, TriEGate },
                { Direction.W, A7t8 }
            });

            SetupArea(ref ERepHl, "围墙边的道路",
                      desc: "你站在一条南北走向的道路上,东边紧靠学校的围墙。西边,高中教学楼[2#]报告厅和食堂之间分岔出一块空地直通向行政楼[1#]一带。东边的围墙外只有一片超现实、不透明的黑暗。",
                      usable: new AObject[0],
                      notClear: new[] { Building4, ReportHall, Building2 },
                      godir: new Dictionary <Direction, Area>
            {
                { Direction.S, TriEGate },
                { Direction.W, FrRepHl }
            });
            // TODO: a few cars

            AObject doorEGym = AObject.SimpleDoor(
                dest:           null,
                name:           "体育馆的侧门",
                alias:          new[] { "里面", "室内", "大门", "门", "门内", "体育馆" },
                desc:           "体育馆的侧门,透过玻璃能看见苍白昏暗的楼梯间。",
                open:           false,
                locked: true);

            Campus.Objects.Add(doorEGym);
            SetupArea(ref EGym, "体育馆边",
                      desc: "你站在体育馆边上。小广场在你东侧,西边则是体育馆[6#]的侧门;门前有一个长方形池塘。你也可以往西北绕过侧门来到正门前的平地上,或是向南绕过花坛边缘,那边远处是一排寝室楼。",
                      usable: new[] { Building6, GymPond, doorEGym },
                      notClear: new[] { Building7, Building8, Building9, Building10, Flower },
                      godir: new Dictionary <Direction, Area>
            {
                { Direction.E, HiSq },
                { Direction.NW, FrGym },
                { Direction.S, SE6Brg }
            });

            AObject doorFrGym = AObject.SimpleDoor(
                dest:           null,
                name:           "体育馆的大门",
                alias:          new[] { "里面", "室内", "大门", "门", "门内", "体育馆" },
                desc:           "一段台阶后是体育馆的大门;里面的宽阔空间没有开灯,透过玻璃看不清楚。",
                open:           false,
                locked: true);

            Campus.Objects.Add(doorFrGym);
            SetupArea(ref FrGym, "体育馆前的平台",
                      desc: "你站在体育馆[6#]前的平台上。这是石板铺成的一大块平地,北边的栏杆之外,你能看见行政楼[1#]和5#楼,它们处于低地,那边无法直接走上来。平地的西边有台阶下去通向大路,路的另一边就是操场和篮球场。你也可以向东南走到体育馆[6#]东边的侧门处,小广场附近。",
                      usable: new[] { Building6, doorFrGym },
                      notClear: new[] { Building1, Building5 },
                      godir: new Dictionary <Direction, Area>
            {
                { Direction.SE, EGym },
                { Direction.W, TriWGate }
            });

            SetupArea(ref EPlg, "操场入口边",
                      desc: "你站在一条南北走向的大路上,另一边的道路直通向食堂[7#],南边大路直通向篮球场。环绕操场的围栏在西边入口处打开。",
                      usable: new[] { Playground, Building5 },
                      notClear: new[] { BasketballCourt, Building6 },
                      godir: new Dictionary <Direction, Area>
            {
                { Direction.E, TriWS1Rd },
                { Direction.N, A5tPlg },
                { Direction.S, TriWGate }
            });
            EPlg.RoomTo.Add(Direction.W, GameMap.Playground);
            EPlg.OnGoDirection = (s, v, d) =>
            {
                GameMap.Playground.ChangeArea("入口处的空地");
                return(HandleResult.Continue);
            };

            AObject doorA5tPlg = AObject.SimpleDoor(
                dest:           null,
                name:           "国际部的西门",
                alias:          new[] { "里面", "室内", "大门", "门", "门内", "国际部" },
                desc:           "通往国际部室内的门。",
                open:           false,
                locked: true);

            Campus.Objects.Add(doorA5tPlg);
            SetupArea(ref A5tPlg, "操场边的道路",
                      desc: "你站在一条南北走向的道路上,西边围栏之外就是操场,东边面对国际部[5#]大楼的后门。",
                      usable: new[] { Playground, Building5, doorA5tPlg },
                      notClear: new AObject[0],
                      godir: new Dictionary <Direction, Area>
            {
                { Direction.S, EPlg },
                { Direction.N, NA5tPlg }
            });

            SetupArea(ref NA5tPlg, "操场边的道路",
                      desc: "你站在一条南北走向的道路上,西边围栏之外就是操场,东边在初中教学楼[3#]和国际部[5#]之间分岔出一条大路。",
                      usable: new[] { Playground, Building5 },
                      notClear: new AObject[0],
                      godir: new Dictionary <Direction, Area>
            {
                { Direction.S, A5tPlg },
                { Direction.E, A3t5 }
            });

            SetupArea(ref TriWGate, "岔路口",
                      desc: "你站在一条南北走向的大路上,西边在足球场和篮球场之间分出另一条路通向学校西门,东边有一条坡道通往体育馆前的空地。",
                      usable: new[] { Building6, Playground, BasketballCourt },
                      notClear: new AObject[0],
                      godir: new Dictionary <Direction, Area>
            {
                { Direction.E, FrGym },
                { Direction.W, RdWGate },
                { Direction.N, EPlg },
                { Direction.S, W6 }
            });

            SetupArea(ref RdWGate, "通向学校西门的道路",
                      desc: "你站在足球场和篮球场之间的路上,西边通往你通常在那里搭校车回家的西门,但此刻——虽然有路灯和天空的亮光照耀——那里只是一片令人不寒而栗的黑暗。你也可以从东面退回学校。",
                      usable: new AObject[0],
                      notClear: new[] { Playground, BasketballCourt },
                      godir: new Dictionary <Direction, Area>
            {
                { Direction.W, TriFrWGate },
                { Direction.E, TriWGate }
            });
            RdWGate.RoomTo.Add(Direction.N, GameMap.Playground);
            RdWGate.OnGoDirection = (s, v, d) =>
            {
                GameMap.Playground.ChangeArea("观众席末端平台");
                return(HandleResult.Continue);
            };

            SetupArea(ref TriFrWGate, "西门前的三岔路口",
                      desc: "你站在足球场和篮球场之间道路上的尽头,西边(那里原本是学校西门)紧邻着一片令人不寒而栗的黑暗。道路向东面延伸退回学校,另有一条小路在北面分岔到操场后面。",
                      usable: new AObject[0],
                      notClear: new[] { Playground, BasketballCourt },
                      godir: new Dictionary <Direction, Area>
            {
                { Direction.W, DarknessArea },
                { Direction.E, RdWGate }
            });

            AObject doorW6 = AObject.SimpleDoor(
                dest:           null,
                name:           "体育馆侧面楼梯",
                alias:          new[] { "入口", "东", "楼梯", "体育馆" },
                desc:           "体育馆侧面延伸到路边的楼梯,向上通往体育馆二楼。",
                open:           false,                 // TODO: should be true
                locked: true);

            doorW6.Information = (s, v) => "";
            doorW6.IsOpenable  = false;
            Campus.Objects.Add(doorW6);
            SetupArea(ref W6, "篮球场边的道路",
                      desc: "你站在一条南北走向的道路上,西边围栏之外就是室外篮球场,东边面对体育馆[6#]侧面延伸到路边的楼梯。楼梯向上通往体育馆二楼;一楼没有侧门,只有几扇带防护栏的窗户。你也可以向东南拐到体育馆后面。",
                      usable: new[] { BasketballCourt, Building6, doorW6 },
                      notClear: new[] { Playground },
                      godir: new Dictionary <Direction, Area>
            {
                { Direction.N, TriWGate },
                { Direction.SE, BkGym }
            });

            AObject doorBkGym = AObject.SimpleDoor(
                dest:           null,
                name:           "体育馆的后门",
                alias:          new[] { "里面", "室内", "大门", "门", "门内", "体育馆" },
                desc:           "体育馆的后门,透过玻璃能看见苍白昏暗的楼梯间。",
                open:           false,
                locked: true);

            Campus.Objects.Add(doorBkGym);
            SetupArea(ref BkGym, "体育馆后的空地",
                      desc: "你站在体育馆[6#]南边;这是种有树木的一块平地,东边是一座向北通向体育馆侧面池塘上的木板桥的入口,西北通向篮球场边的道路。你也可以向南,横穿过花坛走向空地靠近初中女生寝室楼[11#]附近的一边。",
                      usable: new[] { Building6, Flower, Building11, GymPond, doorBkGym },
                      notClear: new[] { BasketballCourt, Building10 },
                      godir: new Dictionary <Direction, Area>
            {
                { Direction.NW, W6 },
                { Direction.E, SE6Brg }
            });

            SetupArea(ref SE6Brg, "木板桥上",
                      desc: "你站在一座体育馆边池塘的木板桥上,北边通往体育馆侧面附近的地面,南边通向初中女生寝室楼[11#]附近。你也可以往西去向体育馆南边的空地。",
                      usable: new[] { Building6, Flower, GymPond, Building11 },
                      notClear: new[] { Building9, Building10 },
                      godir: new Dictionary <Direction, Area>
            {
                { Direction.N, EGym },
                { Direction.W, BkGym }
            });
        }