コード例 #1
0
        private void StartNewGame(object sender, EventArgs e)
        {
            this.ExitWindow();
            World.CurrentLevel = World.MapFactory.Construct("TestMotel");

            World.Player = World.EntityManager.Create(World.EntityFactory.Get("player")).Add(new GameObject(0, 0, World.CurrentLevel));

            new EquipItemAction(World.Player, World.EntityManager.Create(World.EntityFactory.Get("boots")).Add(new GameObject(0, 0, World.CurrentLevel)), "Feet", true).OnProcess();
            new EquipItemAction(World.Player, World.EntityManager.Create(World.EntityFactory.Get("jeans")).Add(new GameObject(0, 0, World.CurrentLevel)), "Legs", true).OnProcess();
            new EquipItemAction(World.Player, World.EntityManager.Create(World.EntityFactory.Get("shirt")).Add(new GameObject(0, 0, World.CurrentLevel)), "Torso", true).OnProcess();

            var npc = World.EntityManager.Create(World.EntityFactory.Get("person")).Add(new GameObject(4, 2, World.CurrentLevel));

            World.EntityManager.Create(World.EntityFactory.Get("smallknife")).Add(new GameObject(0, 0, World.CurrentLevel));
            World.EntityManager.Create(World.EntityFactory.Get("footballpads")).Add(new GameObject(0, 0, World.CurrentLevel));
            World.EntityManager.Create(World.EntityFactory.Get("axe")).Add(new GameObject(0, 0, World.CurrentLevel));
            World.EntityManager.Create(World.EntityFactory.Get("glock17")).Add(new GameObject(0, 0, World.CurrentLevel));
            World.EntityManager.Create(World.EntityFactory.Get("lockpick")).Add(new GameObject(0, 0, World.CurrentLevel));
            var ammo = World.EntityManager.Create(World.EntityFactory.Get("9x9mm")).Add(new GameObject(0, 0, World.CurrentLevel));

            ammo.Get <Item>().Amount = 30;
            var armor = World.EntityManager.Create(World.EntityFactory.Get("footballpads")).Add(new GameObject(1, 1, World.CurrentLevel));

            new EquipItemAction(npc, armor, "Torso", true).OnProcess();
            World.Initialize();

            ParentApplication.Push(new GameplayWindow(new SkrWindowTemplate
            {
                World = World
            }));
        }
コード例 #2
0
ファイル: GameplayWindow.cs プロジェクト: qmhoang/SKR
        private void DropItem(Entity user, Entity itemEntity)
        {
            var item = itemEntity.Get <Item>();

            if (item.StackType == StackType.Hard)
            {
                if (item.Amount == 1)
                {
                    user.Get <ControllerComponent>().Enqueue(new DropItemAction(user, itemEntity));
                }
                else
                {
                    ParentApplication.Push(
                        new CountPrompt("How many items to drop to the ground?",
                                        amount => user.Get <ControllerComponent>().Enqueue(new DropItemAction(user, itemEntity, amount)),
                                        item.Amount,
                                        0,
                                        item.Amount,
                                        PromptTemplate));
                }
            }
            else
            {
                user.Get <ControllerComponent>().Enqueue(new DropItemAction(user, itemEntity));
            }
        }
コード例 #3
0
ファイル: InventoryWindow.cs プロジェクト: qmhoang/SKR
 protected override void OnSelectItem(string slot)
 {
     if (_equipment.IsSlotEquipped(slot))
     {
         _player.Get <ControllerComponent>().Enqueue(new UnequipItemAction(_player, slot));
     }
     else
     {
         var items = _inventory.Items.Where(i => i.Has <Equipable>() && i.Get <Equipable>().SlotsOccupied.ContainsKey(slot)).ToList();
         if (items.Count > 0)
         {
             ParentApplication.Push(new ItemWindow(new ItemWindowTemplate
             {
                 Size             = Size,
                 IsPopup          = IsPopup,
                 HasFrame         = true,
                 Items            = items,
                 World            = World,
                 SelectSingleItem = true,
                 ItemSelected     = item => Equip(item, slot),
             }));
         }
         else
         {
             World.Log.Aborted("No items in inventory that go there.");
         }
     }
 }
コード例 #4
0
ファイル: GameplayWindow.cs プロジェクト: qmhoang/SKR
 private void Directions(string message, Action <Point> action)
 {
     ParentApplication.Push(
         new DirectionalPrompt(message,
                               _player.Get <GameObject>().Location,
                               action,
                               PromptTemplate));
 }
コード例 #5
0
ファイル: GameplayWindow.cs プロジェクト: qmhoang/SKR
 private void Targets(string message, Action <Point> action)
 {
     ParentApplication.Push(
         new TargetPrompt(message,
                          _player.Get <GameObject>().Location,
                          action,
                          MapPanel,
                          PromptTemplate));
 }
コード例 #6
0
ファイル: GameplayWindow.cs プロジェクト: qmhoang/SKR
 private void Options <T>(string message, string fail, IEnumerable <T> entities, Func <T, string> descriptionFunc, Action <T> action)
 {
     ParentApplication.Push(
         new OptionsPrompt <T>(message,
                               fail,
                               entities,
                               descriptionFunc,
                               action,
                               PromptTemplate));
 }
コード例 #7
0
 public override int GetHashCode()
 {
     unchecked {
         var hashCode = (Mode != null ? Mode.GetHashCode() : 0);
         hashCode = (hashCode * 397) ^ (Schema != null ? Schema.GetHashCode() : 0);
         hashCode = (hashCode * 397) ^ (ParentApplication != null ? ParentApplication.GetHashCode() : 0);
         hashCode = (hashCode * 397) ^ (ParentSchema != null ? ParentSchema.GetHashCode() : 0);
         hashCode = (hashCode * 397) ^ (AttributeName != null ? AttributeName.GetHashCode() : 0);
         hashCode = (hashCode * 397) ^ (ParentMode != null ? ParentMode.GetHashCode() : 0);
         hashCode = (hashCode * 397) ^ (MetadataId != null ? MetadataId.GetHashCode() : 0);
         return(hashCode);
     }
 }
コード例 #8
0
ファイル: GameplayWindow.cs プロジェクト: qmhoang/SKR
 private void Boolean(string message, bool defaultBool, Action <bool> action)
 {
     ParentApplication.Push(new BooleanPrompt(message, defaultBool, action, PromptTemplate));
 }
コード例 #9
0
ファイル: GameplayWindow.cs プロジェクト: qmhoang/SKR
 private void Number(string message, int min, int max, int initial, Action <int> action)
 {
     ParentApplication.Push(new CountPrompt(message, action, max, min, initial, PromptTemplate));
 }
コード例 #10
0
ファイル: GameplayWindow.cs プロジェクト: qmhoang/SKR
        private void GameplayWindow_KeyPressed(object sender, KeyboardEventArgs keyboardEvent)
        {
            var playerLocation = _player.Get <GameObject>();

            switch (keyboardEvent.KeyboardData.KeyCode)
            {
            case TCODKeyCode.Up:
            case TCODKeyCode.KeypadEight:                     // Up and 8 should have the same functionality
                Move(Direction.North);
                break;

            case TCODKeyCode.Down:
            case TCODKeyCode.KeypadTwo:
                Move(Direction.South);
                break;

            case TCODKeyCode.Left:
            case TCODKeyCode.KeypadFour:
                Move(Direction.West);
                break;

            case TCODKeyCode.KeypadFive:
                Enqueue(new WaitAction(_player));
                break;

            case TCODKeyCode.Right:
            case TCODKeyCode.KeypadSix:
                Move(Direction.East);
                break;

            case TCODKeyCode.KeypadSeven:
                Move(Direction.Northwest);
                break;

            case TCODKeyCode.KeypadNine:
                Move(Direction.Northeast);
                break;

            case TCODKeyCode.KeypadOne:
                Move(Direction.Southwest);
                break;

            case TCODKeyCode.KeypadThree:
                Move(Direction.Southeast);
                break;

            default:
            {
                if (keyboardEvent.KeyboardData.ControlKeys == ControlKeys.LeftControl || keyboardEvent.KeyboardData.ControlKeys == ControlKeys.RightControl)
                {
                    switch (keyboardEvent.KeyboardData.Character)
                    {
                    case 'r':
                    {
                        Enqueue(new ChangePostureAction(_player, Posture.Run));
                    }
                    break;

                    case 's':
                    {
                        Enqueue(new ChangePostureAction(_player, Posture.Stand));
                    }
                    break;

                    case 'c':
                    {
                        Enqueue(new ChangePostureAction(_player, Posture.Crouch));
                    }
                    break;

                    case 'p':
                    {
                        Enqueue(new ChangePostureAction(_player, Posture.Prone));
                    }
                    break;

                    case 'z':
                    {
                        Targets("Set AI of Entity", p =>
                                {
                                    var entitiesAtLocation = playerLocation.Level.GetEntitiesAt <ControllerComponent>(p).ToList();
                                    var npc     = entitiesAtLocation.First();
                                    var options = new List <Controller>
                                    {
                                        new DoNothing(),
                                        new NPC()
                                    };
                                    Options("What AI?",
                                            "No AI options.",
                                            options,
                                            o => o.GetType().Name,
                                            actor =>
                                    {
                                        var ap = npc.Get <ControllerComponent>().AP;
                                        npc.Remove <ControllerComponent>();
                                        npc.Add(new ControllerComponent(actor, ap));
                                    });
                                });
                    }
                    break;
                    }
                }
                else
                {
                    switch (keyboardEvent.KeyboardData.Character)
                    {
                    case 'A': {
                        Options("With that weapon?",
                                "No possible way of attacking.",
                                FilterEquippedItems <MeleeComponent>(_player).ToList(),
                                Identifier.GetNameOrId,
                                weapon => Directions("Attack where?",
                                                     p => Options("Attack where?",
                                                                  "Nothing at location to attack.",
                                                                  _player.Get <GameObject>().Level.GetEntitiesAt <BodyComponent, Creature>(p).ToList(),
                                                                  Identifier.GetNameOrId,
                                                                  defender => Options("Attack at what?",
                                                                                      String.Format("{0} has no possible part to attack.  How did we get here?", Identifier.GetNameOrId(defender)),
                                                                                      defender.Get <BodyComponent>().BodyPartsList,
                                                                                      bp => bp.Name,
                                                                                      bp => Enqueue(new MeleeAttackAction(_player,
                                                                                                                          defender,
                                                                                                                          weapon,
                                                                                                                          bp,
                                                                                                                          true))))));
                    }
                    break;

                    case 'f': {
                        Options("With what weapon?",
                                "No possible way of shooting target.",
                                FilterEquippedItems <RangeComponent>(_player).ToList(),
                                Identifier.GetNameOrId,
                                weapon => TargetsAt("Shoot where?",
                                                    World.TagManager.IsRegistered("target") ? World.TagManager.GetEntity("target").Get <GameObject>().Location : playerLocation.Location,
                                                    p => Options("Shoot at what?",
                                                                 "Nothing there to shoot.",
                                                                 _player.Get <GameObject>().Level.GetEntitiesAt <BodyComponent>(p),
                                                                 Identifier.GetNameOrId,
                                                                 delegate(Entity defender)
                                {
                                    World.TagManager.Register("target", defender);
                                    Enqueue(new RangeAttackAction(_player, defender, weapon, defender.Get <BodyComponent>().GetRandomPart()));
                                })));
                    }
                    break;

                    case 'F': {
                        Options("With what weapon?",
                                "No possible way of shooting target.",
                                FilterEquippedItems <RangeComponent>(_player).ToList(),
                                Identifier.GetNameOrId,
                                weapon => TargetsAt("Shoot where?",
                                                    World.TagManager.IsRegistered("target") ? World.TagManager.GetEntity("target").Get <GameObject>().Location : playerLocation.Location,
                                                    p => Options("Shoot at what?",
                                                                 "Nothing there to shoot.",
                                                                 _player.Get <GameObject>().Level.GetEntitiesAt <BodyComponent>(p),
                                                                 Identifier.GetNameOrId,
                                                                 defender => Options("What part?",
                                                                                     String.Format("{0} has no possible part to attack.  How did we get here?", Identifier.GetNameOrId(defender)),
                                                                                     defender.Get <BodyComponent>().BodyPartsList,
                                                                                     bp => bp.Name,
                                                                                     bp =>
                                {
                                    World.TagManager.Register("target", defender);
                                    Enqueue(new RangeAttackAction(_player, defender, weapon, bp, true));
                                }))));
                    }
                    break;

                    case 'r': {
                        Options("Reload what weapon?",
                                "No weapons to reload.",
                                FilterEquippedItems <RangeComponent>(_player).ToList(),
                                Identifier.GetNameOrId, weapon => Options("What ammo?",
                                                                          "No possible ammo for selected weapon.",
                                                                          _player.Get <ItemContainerComponent>().Items.Where(e => e.Has <AmmoComponent>() &&
                                                                                                                             e.Get <AmmoComponent>().Caliber == weapon.Get <RangeComponent>().AmmoCaliber).ToList(),
                                                                          Identifier.GetNameOrId,
                                                                          ammo => Enqueue(new ReloadAction(_player, weapon, ammo))));
                    }
                    break;

                    case 'u':
                        Directions("What direction?", p => Options("What object do you want to use?",
                                                                   "Nothing there to use.",
                                                                   playerLocation.Level.GetEntitiesAt <UseBroadcaster, VisibleComponent>(p).Where(e => e.Get <VisibleComponent>().VisibilityIndex > 0),
                                                                   Identifier.GetNameOrId,
                                                                   useable => Options(String.Format("Do what with {0}?", Identifier.GetNameOrId(useable)),
                                                                                      String.Format("No possible action on {0}", Identifier.GetNameOrId(useable)),
                                                                                      useable.Get <UseBroadcaster>().Actions.ToList(),
                                                                                      use => use.Description,
                                                                                      use => use.Use(_player, useable))));
                        break;

                    case 'd': {
                        var inventory = _player.Get <ItemContainerComponent>();
                        if (inventory.Count > 0)
                        {
                            ParentApplication.Push(new ItemWindow(new ItemWindowTemplate
                                    {
                                        Size             = MapPanel.Size,
                                        IsPopup          = true,
                                        HasFrame         = true,
                                        World            = World,
                                        Items            = inventory.Items,
                                        SelectSingleItem = false,
                                        ItemSelected     = i => DropItem(_player, i),
                                    }));
                        }
                        else
                        {
                            World.Log.Aborted("You are carrying no items to drop.");
                        }
                    }
                    break;

                    case 'g': {
                        var inventory = _player.Get <ItemContainerComponent>();

                        // get all items that have a location (eg present on the map) that are at the location where are player is
                        var items = playerLocation.Level.GetEntitiesAt <Item, VisibleComponent>(playerLocation.Location).Where(e => e.Get <VisibleComponent>().VisibilityIndex > 0 &&
                                                                                                                               !inventory.Items.Contains(e));

                        if (items.Count() > 0)
                        {
                            ParentApplication.Push(new ItemWindow(new ItemWindowTemplate
                                    {
                                        Size             = MapPanel.Size,
                                        IsPopup          = true,
                                        HasFrame         = true,
                                        World            = World,
                                        Items            = items,
                                        SelectSingleItem = false,
                                        ItemSelected     = i => PickUpItem(_player, i),
                                    }));
                        }
                        else
                        {
                            World.Log.Aborted("No items here to pick up.");
                        }
                    }
                    break;

                    case 'G': {
                        var inventory = _player.Get <ItemContainerComponent>();

                        // get all items that have a location (eg present on the map) that are at the location where are player is
                        var items = playerLocation.Level.GetEntitiesAt <Item, VisibleComponent>(playerLocation.Location).Where(e => e.Get <VisibleComponent>().VisibilityIndex > 0 &&
                                                                                                                               !inventory.Items.Contains(e));

                        if (items.Count() > 0)
                        {
                            Enqueue(new GetAllItemsAction(_player, items));
                        }
                        else
                        {
                            World.Log.Aborted("No items here to pick up.");
                        }
                    }
                    break;

                    case 'j': {
                        Directions("Jump what direction?", p => Enqueue(new JumpOverAction(_player, p - playerLocation.Location)));
                    }
                    break;

                    case 'i': {
                        var inventory = _player.Get <ItemContainerComponent>();
                        ParentApplication.Push(new ItemWindow(new ItemWindowTemplate
                                {
                                    Size             = MapPanel.Size,
                                    IsPopup          = true,
                                    HasFrame         = true,
                                    World            = World,
                                    Items            = inventory.Items,
                                    SelectSingleItem = false,
                                    ItemSelected     = i => World.Log.Normal(String.Format("This is a {0}, it weights {1}.", i.Get <Identifier>().Name, i.Get <Item>().Weight)),
                                }));
                    }
                    break;

                    case 'w':
                        ParentApplication.Push(new InventoryWindow(new InventoryWindowTemplate
                            {
                                Size     = MapPanel.Size,
                                IsPopup  = true,
                                HasFrame = true,
                                World    = World,
                                Items    = _player.Get <EquipmentComponent>().Slots.ToList(),
                            }));
                        break;

                    case 'p': {
                        Options("With what?",
                                "No lockpicks available.",
                                _player.Get <ItemContainerComponent>().Items.Where(i => i.Has <Lockpick>()),
                                Identifier.GetNameOrId,
                                lockpick => Directions("What direction?", p => Options("Select what to lockpick.",
                                                                                       "Nothing there to lockpick.",
                                                                                       _player.Get <GameObject>().Level.GetEntitiesAt <LockedFeature>(p),
                                                                                       Identifier.GetNameOrId,
                                                                                       feature => Enqueue(new LockpickAction(_player, lockpick, feature)))));
                    }
                    break;

                    case 'l':

                        ParentApplication.Push(
                            new LookWindow(
                                playerLocation.Location,
                                delegate(Point p)
                            {
                                StringBuilder sb       = new StringBuilder();
                                var entitiesAtLocation = playerLocation.Level.GetEntitiesAt(p);
                                sb.AppendLine(playerLocation.Level.GetTerrain(p).Definition);
                                foreach (var entity in entitiesAtLocation)
                                {
                                    sb.AppendFormat("Entity: {0} ", entity.Has <ReferenceId>() ? entity.Get <ReferenceId>().RefId : entity.Id.ToString());
                                    sb.AppendFormat("Name: {0} ", Identifier.GetNameOrId(entity));
                                    if (entity.Has <Scenery>())
                                    {
                                        sb.AppendFormat(entity.Get <Scenery>().ToString());
                                    }

                                    sb.AppendLine();
                                }

                                return(sb.ToString());
                            },
                                MapPanel,
                                PromptTemplate));
                        break;

                    case 'z':
                    {
                        _player.Get <ControllerComponent>().Cancel();
                    } break;

                    case '`': {
                        ParentApplication.Push(new DebugMenuWindow(new SkrWindowTemplate()
                                {
                                    World = World
                                }));
                    }
                    break;
                    }
                }
                break;
            }
            }
        }