コード例 #1
0
        private static void StartGameDungeon()
        {
            // 1D446841
            MessageBus gameBus = new MessageBus();
            string     seed    = SingletonRandom.DefaultRNG.Next().ToString("X");

            Console.WriteLine($"Generating dungeon with seed: {seed}");

            Dungeon dungeon = new Dungeon(gameBus, new Rectangle(0, 0, 60, 40), Source.From <GenerationContext, IBiome>(Biomes.TestBiome), seed);


            JoystickConfig joystickConfig = new JoystickConfig
            {
                DownCode  = Terminal.TK_S,
                LeftCode  = Terminal.TK_A,
                RightCode = Terminal.TK_D,
                UpCode    = Terminal.TK_W,
                MapUp     = Terminal.TK_UP,
                MapDown   = Terminal.TK_DOWN,
                MapRight  = Terminal.TK_RIGHT,
                MapLeft   = Terminal.TK_LEFT,
                Inventory = Terminal.TK_I,
                Equip     = Terminal.TK_E
            };

            Floor initialFloor = dungeon.Floors[0];

            // Creating Player
            GameObject player = new UpdatingGameObject(new Coord(20, 20), Layers.Main, null, initialFloor.Timeline);

            Being playerBeing = new Being(new SelectedAttributes(new AttributeSet(6, 7, 7, 8, 8)), Alignment.PlayerAlignment, new EquipmentSlotSet(), 10, "You");

            playerBeing.Equipment.Equip(new MeleeWeapon(new Damage(10)), EquipmentSlot.RightHandEquip);

            UserControlAgent control = new UserControlAgent(joystickConfig);

            gameBus.RegisterSubscriber <MouseMoveEvent>(control);
            gameBus.RegisterSubscriber <KeyEvent>(control);

            Actor playerActor = new Actor(playerBeing, control, gameBus);

            player.AddComponent(playerActor);
            player.AddComponent(new GlyphComponent(new Glyph(Characters.AT, Color.Aqua)));
            player.AddComponent(new LightSourceComponent(initialFloor.MapInfo.LightMap, new Light(Color.Aqua, Coord.NONE, 4, 5)));
            player.AddComponent(new FOVExplorerComponent());
            player.AddComponent(new NameComponent(new Title("the", "Hero")));

            EffectTargetComponent playerEffectTarget = new EffectTargetComponent();

            playerEffectTarget.EffectTarget.AddEffectReceiver(playerActor);
            player.AddComponent(playerEffectTarget);

            playerEffectTarget.EffectTarget.ApplyEffect(new StaminaEffect(1, EffectKind.Repeating, new EventTimerTiming(25, 25)));

            Logger logger = new Logger();

            gameBus.RegisterSubscriber(logger);

            MapViewPane mapViewPane = new MapViewPane(gameBus, joystickConfig, new InventoryDisplayPane(playerBeing.Equipment, playerBeing.Inventory, joystickConfig, gameBus), useFOV: true);

            EventHandler <ItemEventArgs <IGameObject> >      mapChangeDirty = (sender, eventArgs) => mapViewPane.SetDirty();
            EventHandler <ItemMovedEventArgs <IGameObject> > MapMoveDirty   = (sender, eventArgs) => mapViewPane.SetDirty();

            dungeon.OnFloorChange += (previousFloor, newFloor) =>
            {
                mapViewPane.Map      = newFloor.MapInfo.Map;
                mapViewPane.LightMap = newFloor.MapInfo.LightMap;

                if (previousFloor != null)
                {
                    previousFloor.MapInfo.Map.ObjectRemoved -= mapChangeDirty;
                    previousFloor.MapInfo.Map.ObjectMoved   -= MapMoveDirty;
                    previousFloor.MapInfo.Map.ObjectAdded   -= mapChangeDirty;
                }

                newFloor.MapInfo.Map.ObjectRemoved += mapChangeDirty;
                newFloor.MapInfo.Map.ObjectMoved   += MapMoveDirty;
                newFloor.MapInfo.Map.ObjectAdded   += mapChangeDirty;

                mapViewPane.SetDirty();
            };



            TextPane descriptionPane = new TextPane("TEST TEXT");

            Describer describer = new Describer(descriptionPane);

            describer.Map          = initialFloor.MapInfo.Map;
            dungeon.OnFloorChange += (previousFloor, newFloor) => describer.Map = newFloor.MapInfo.Map;

            gameBus.RegisterSubscriber(describer);

            LogPane logPane = new LogPane(logger);

            StackPane mapAndConsole = new StackPane(StackPane.StackDirection.Vertical);

            mapAndConsole.AddChild(descriptionPane, 1);
            mapAndConsole.AddChild(mapViewPane, 5);
            mapAndConsole.AddChild(logPane, 1);

            StackPane statusBars = new StackPane(StackPane.StackDirection.Vertical);

            statusBars.AddChild(new FillBarPane(playerBeing.Health, "Health", Color.Red, Color.DarkRed), 1);
            statusBars.AddChild(new FillBarPane(playerBeing.Mana, "Mana", Color.Aqua, Color.DarkBlue), 1);
            statusBars.AddChild(new FillBarPane(playerBeing.Stamina, "Stamina", Color.Yellow, Color.DarkGoldenrod), 1);

            StackPane root = new StackPane(StackPane.StackDirection.Horizontal);

            root.AddChild(mapAndConsole, 4);
            root.AddChild(statusBars, 1);

            Window rootWindow = new Window(root, new Rectangle(0, 0, 160, 50), 0);

            BearTermRenderer renderer = new BearTermRenderer(rootWindow, "window.title='Spell Sword'; window.size=160x50; window.resizeable=true; input.filter=[keyboard+, mouse+, arrows+]");

            gameBus.RegisterSubscriber <ParticleEvent>(renderer);
            gameBus.RegisterSubscriber <WindowEvent>(renderer);

            //WindowRouter windowRouter = new WindowRouter();
            //windowRouter.Handle(WindowEvent.Open(root, new Rectangle(0, 0, 160, 50)));
            //mainBus.RegisterSubscriber(windowRouter);

            GameControlConsumer gameControlConsumer = new GameControlConsumer(joystickConfig, gameBus, mapViewPane);

            BearTermInputRouter inputRouter = new BearTermInputRouter(gameControlConsumer);

            gameBus.RegisterSubscriber(inputRouter);
            inputRouter.Handle(WindowEvent.Open(root, new Rectangle(0, 0, 160, 50)));



            for (int i = 1; i < 5; i++)
            {
                //GameObject goblin = TestUtil.CreateGoblin((5 + i, 5 + i % 2 + 1), playerActor, initialFloor.Timeline, initialFloor.GoalMapStore, initialFloor.MessageBus);
                //initialFloor.MapInfo.Map.AddEntity(goblin);
            }

            initialFloor.MapInfo.Map.AddEntity(player);

            dungeon.Handle(new FloorTransitionEvent(player, 0, 1));
            dungeon.Handle(new FloorTransitionEvent(player, 1, 0));

            Terminal.Refresh();

            int lastFrame = Environment.TickCount;

            while (true)
            {
                inputRouter.HandleInput();
                //control.VisualizeAim(playerActor);

                if (!control.WaitingForInput)
                {
                    dungeon.Tick();
                }

                if (Environment.TickCount - lastFrame > 20)
                {
                    renderer.Refresh();
                    lastFrame = Environment.TickCount;
                }
            }
        }
コード例 #2
0
        private static void MapGenerator()
        {
            Timeline   timeline = new Timeline();
            MessageBus mainBus  = new MessageBus();

            IMapGenerator         generator       = new MapGenerator(timeline, mainBus);
            IEnumerator <MapInfo> generationSteps = generator.GenerationSteps(60, 40, SingletonRandom.DefaultRNG.Next() + "").GetEnumerator();

            generationSteps.MoveNext();


            MapInfo mapInfo = generationSteps.Current;
            Map     map     = mapInfo.Map;
            Spawner spawner = new Spawner(map);

            JoystickConfig joystickConfig = new JoystickConfig
            {
                DownCode  = Terminal.TK_S,
                LeftCode  = Terminal.TK_A,
                RightCode = Terminal.TK_D,
                UpCode    = Terminal.TK_W,
                MapUp     = Terminal.TK_UP,
                MapDown   = Terminal.TK_DOWN,
                MapRight  = Terminal.TK_RIGHT,
                MapLeft   = Terminal.TK_LEFT,
                Inventory = Terminal.TK_I,
                Equip     = Terminal.TK_E
            };

            MapViewPane viewPane = new MapViewPane(mainBus, joystickConfig, null, false);

            viewPane.Map      = map;
            viewPane.LightMap = mapInfo.LightMap;

            map.ObjectRemoved += (sender, eventArgs) => viewPane.SetDirty();
            map.ObjectMoved   += (sender, eventArgs) => viewPane.SetDirty();
            map.ObjectAdded   += (sender, eventArgs) => viewPane.SetDirty();

            TextPane descriptionPane = new TextPane("");

            Describer describer = new Describer(descriptionPane);

            describer.Map = map;
            mainBus.RegisterSubscriber(describer);

            StackPane mapAndConsole = new StackPane(StackPane.StackDirection.Vertical);

            mapAndConsole.AddChild(descriptionPane, 1);
            mapAndConsole.AddChild(viewPane, 1);

            Window rootWindow = new Window(mapAndConsole, new Rectangle(0, 0, 120, 41), 0);

            BearTermRenderer renderer = new BearTermRenderer(rootWindow, "window.title='Spell Sword'; window.size=120x41; window.resizeable=true; input.filter=[keyboard+, mouse+, arrows+]");

            mainBus.RegisterSubscriber <ParticleEvent>(renderer);
            mainBus.RegisterSubscriber <WindowEvent>(renderer);

            GameControlConsumer gameControlConsumer = new GameControlConsumer(joystickConfig, mainBus, viewPane);

            BearTermInputRouter inputRouter = new BearTermInputRouter(gameControlConsumer);

            mainBus.RegisterSubscriber(inputRouter);
            inputRouter.Handle(WindowEvent.Open(mapAndConsole, new Rectangle(0, 0, 120, 41)));

            Terminal.Refresh();


            int lastFrame = Environment.TickCount;

            Stopwatch timer = new Stopwatch();

            timer.Start();

            int frames = 0;

            while (generationSteps.MoveNext())
            {
                inputRouter.HandleInput();

                renderer.Refresh();

                // Artificially slow generation process
                while (Environment.TickCount - lastFrame < 50)
                {
                }

                lastFrame = Environment.TickCount;
                frames   += 1;
            }

            double duration = timer.Elapsed.TotalSeconds;
            double fps      = frames / duration;

            Console.WriteLine($"Generation and rendering took: {duration} seconds");
            Console.WriteLine($"Rendering took place at: {fps} fps");

            while (true)
            {
                inputRouter.HandleInput();
                renderer.Refresh();
            }

            //Console.ReadKey();
        }
コード例 #3
0
        private static void StartGame()
        {
            //Dungeon dungeon = new Dungeon();
            // dungeon.Enter();

            MessageBus mainBus = new MessageBus();

            Timeline timeline = new Timeline();
            MapInfo  mapInfo  = new MapGenerator(timeline, mainBus).Generate(120, 40, "helloseed");
            Map      map      = mapInfo.Map;
            LightMap lightMap = mapInfo.LightMap;


            Spawner spawner = new Spawner(map);

            mainBus.RegisterSubscriber(spawner);

            JoystickConfig joystickConfig = new JoystickConfig
            {
                DownCode  = Terminal.TK_S,
                LeftCode  = Terminal.TK_A,
                RightCode = Terminal.TK_D,
                UpCode    = Terminal.TK_W,
                MapUp     = Terminal.TK_UP,
                MapDown   = Terminal.TK_DOWN,
                MapRight  = Terminal.TK_RIGHT,
                MapLeft   = Terminal.TK_LEFT,
                Inventory = Terminal.TK_I,
                Equip     = Terminal.TK_E
            };

            //lightMap.AddLight(new Light(Color.AntiqueWhite, new Coord(1, 1), 15, 5));
            lightMap.AddLight(new Light(Color.Wheat, new Coord(8, 8), 20, 10000));

            // Creating Player
            GameObject player = new UpdatingGameObject(new Coord(20, 20), Layers.Main, null, timeline);

            Being playerBeing = new Being(new SelectedAttributes(new AttributeSet(10, 10, 10, 10, 10)), Alignment.PlayerAlignment, new EquipmentSlotSet(), 5, "You");

            playerBeing.Equipment.Equip(new MeleeWeapon(new Damage(10)), EquipmentSlot.RightHandEquip);

            UserControlAgent control = new UserControlAgent(joystickConfig);

            mainBus.RegisterSubscriber <MouseMoveEvent>(control);
            mainBus.RegisterSubscriber <KeyEvent>(control);

            Actor playerActor = new Actor(playerBeing, control, mainBus);

            player.AddComponent(playerActor);
            player.AddComponent(new GlyphComponent(new Glyph(Characters.AT, Color.Aqua)));
            player.AddComponent(new LightSourceComponent(lightMap, new Light(Color.Aqua, Coord.NONE, 4, 8)));
            player.AddComponent(new FOVExplorerComponent());
            player.AddComponent(new NameComponent(new Title("the", "Hero")));

            EffectTargetComponent playerEffectTarget = new EffectTargetComponent();

            playerEffectTarget.EffectTarget.AddEffectReceiver(playerActor);
            player.AddComponent(playerEffectTarget);

            playerEffectTarget.EffectTarget.ApplyEffect(new StaminaEffect(1, EffectKind.Repeating, new EventTimerTiming(25, 25)));

            Logger logger = new Logger();

            mainBus.RegisterSubscriber(logger);

            MapViewPane viewPane = new MapViewPane(mainBus, joystickConfig, new InventoryDisplayPane(playerBeing.Equipment, playerBeing.Inventory, joystickConfig, mainBus));

            viewPane.Map      = map;
            viewPane.LightMap = lightMap;

            map.ObjectRemoved += (sender, eventArgs) => viewPane.SetDirty();
            map.ObjectMoved   += (sender, eventArgs) => viewPane.SetDirty();
            map.ObjectAdded   += (sender, eventArgs) => viewPane.SetDirty();


            TextPane descriptionPane = new TextPane("TEST TEXT");

            Describer describer = new Describer(descriptionPane);

            describer.Map = map;

            mainBus.RegisterSubscriber(describer);

            LogPane logPane = new LogPane(logger);

            StackPane mapAndConsole = new StackPane(StackPane.StackDirection.Vertical);

            mapAndConsole.AddChild(descriptionPane, 1);
            mapAndConsole.AddChild(viewPane, 5);
            mapAndConsole.AddChild(logPane, 1);

            StackPane statusBars = new StackPane(StackPane.StackDirection.Vertical);

            statusBars.AddChild(new FillBarPane(playerBeing.Health, "Health", Color.Red, Color.DarkRed), 1);
            statusBars.AddChild(new FillBarPane(playerBeing.Mana, "Mana", Color.Aqua, Color.DarkBlue), 1);
            statusBars.AddChild(new FillBarPane(playerBeing.Stamina, "Stamina", Color.Yellow, Color.DarkGoldenrod), 1);

            StackPane root = new StackPane(StackPane.StackDirection.Horizontal);

            root.AddChild(mapAndConsole, 4);
            root.AddChild(statusBars, 1);

            Window rootWindow = new Window(root, new Rectangle(0, 0, 160, 50), 0);

            BearTermRenderer renderer = new BearTermRenderer(rootWindow, "window.title='Spell Sword'; window.size=160x50; window.resizeable=true; input.filter=[keyboard+, mouse+, arrows+]");

            mainBus.RegisterSubscriber <ParticleEvent>(renderer);
            mainBus.RegisterSubscriber <WindowEvent>(renderer);

            //WindowRouter windowRouter = new WindowRouter();
            //windowRouter.Handle(WindowEvent.Open(root, new Rectangle(0, 0, 160, 50)));
            //mainBus.RegisterSubscriber(windowRouter);

            GameControlConsumer gameControlConsumer = new GameControlConsumer(joystickConfig, mainBus, viewPane);

            BearTermInputRouter inputRouter = new BearTermInputRouter(gameControlConsumer);

            mainBus.RegisterSubscriber(inputRouter);
            inputRouter.Handle(WindowEvent.Open(root, new Rectangle(0, 0, 160, 50)));


            GoalMapStore goalMapStore = new GoalMapStore(map);

            for (int i = 1; i < 5; i++)
            {
                //GameObject goblin = TestUtil.CreateGoblin((5 + i, 5 + i % 2 + 1), playerActor, timeline, goalMapStore, mainBus);
                //map.AddEntity(goblin);
            }

            map.AddEntity(player);

            Terminal.Refresh();


            int lastFrame = Environment.TickCount;

            while (true)
            {
                inputRouter.HandleInput();
                //control.VisualizeAim(playerActor);

                if (!control.WaitingForInput)
                {
                    timeline.Advance(1);
                    goalMapStore.UpdateMaps();
                }

                if (Environment.TickCount - lastFrame > 20)
                {
                    renderer.Refresh();
                    lastFrame = Environment.TickCount;
                }
            }
        }