Exemplo n.º 1
0
 void SetMode(ISetInventoryModeEvent e)
 {
     _mode = e.Mode;
     // TODO: Verify that the party member is currently in the party
     _activeCharacter = e.Member;
     Rebuild();
 }
Exemplo n.º 2
0
        public InventoryOffensiveLabel(PartyCharacterId activeCharacter)
        {
            On <InventoryChangedEvent>(e => _version++);
            On <BlurEvent>(e => Raise(new HoverTextEvent(null)));
            On <HoverEvent>(Hover);

            _activeCharacter = activeCharacter;
            var source = new DynamicText(() =>
            {
                var player = Resolve <IParty>()[_activeCharacter];
                var damage = player?.Apparent.DisplayDamage ?? 0;
                return(new[] { new TextBlock($"{damage}") });
            }, x => _version);

            AttachChild(
                new ButtonFrame(
                    new FixedSize(27, 8,
                                  new HorizontalStack(
                                      new FixedSize(8, 8,
                                                    new UiSpriteElement <CoreSpriteId>(CoreSpriteId.UiOffensiveValue)),
                                      new Spacing(1, 0),
                                      new UiText(new LiteralText(":")),
                                      new UiText(source)
                                      )
                                  ))
            {
                State   = ButtonState.Pressed,
                Padding = 0
            }
                );
        }
Exemplo n.º 3
0
        public InventoryCharacterPane(PartyCharacterId activeCharacter, Func <InventoryPage> getPage)
        {
            _getPage = getPage;
            var page = _getPage();

            _summaryButton = new Button(SummaryButtonId, "I")
            {
                DoubleFrame = true, IsPressed = page == InventoryPage.Summary
            };
            _statsButton = new Button(StatsButtonId, "II")
            {
                DoubleFrame = true, IsPressed = page == InventoryPage.Stats
            };
            _miscButton = new Button(MiscButtonId, "III")
            {
                DoubleFrame = true, IsPressed = page == InventoryPage.Misc
            };
            var buttonStack = new HorizontalStack(
                new Padding(84, 0),
                new FixedSize(16, 15, _summaryButton),
                new FixedSize(16, 15, _statsButton),
                new FixedSize(16, 15, _miscButton));

            var stack = new VerticalStack(
                new InventoryActivePageSelector(activeCharacter, getPage),
                new Padding(0, 4),
                buttonStack
                );

            Children.Add(stack);
        }
Exemplo n.º 4
0
        public InventoryDefensiveLabel(PartyCharacterId activeCharacter) : base(Handlers)
        {
            _activeCharacter = activeCharacter;

            var source = new DynamicText(() =>
            {
                var player     = Resolve <IParty>()[_activeCharacter];
                var protection = player?.Apparent.Combat.Protection ?? 0;
                return(new[] { new TextBlock($": {protection}") });
            }, x => _version);

            Children.Add(
                new ButtonFrame(
                    new HorizontalStack(
                        new FixedSize(8, 8,
                                      new UiSprite <CoreSpriteId>(CoreSpriteId.UiDefensiveValue)
            {
                Highlighted = true
            }),
                        new Text(source)
                        )
                    )
            {
                State   = ButtonState.Pressed,
                Padding = 0
            }
                );
        }
Exemplo n.º 5
0
 public Player(PartyCharacterId id, CharacterSheet sheet) : base(Handlers)
 {
     Id                = id;
     _base             = sheet;
     _inventoryManager = new PlayerInventoryManager(id, _base);
     Children.Add(_inventoryManager);
 }
Exemplo n.º 6
0
        // 70 * 128, 4 * 6

        // Tiles are 16x20 => 64x120
        // 1 pix grid between and around, double thick on right and bottom
        // 1 + 16 + 1 + 16 + 1 + 16 + 1 + 16 + 2
        // = 4*1 + 4*16 + 2 = 70
        // Height = 6 * (1+20) + 2 = 128

        // Button Frame @ (0,0): (70,128) border 1
        // Item0: (0,0):(16,20) border 1
        // Item1: (16,0):(16,20) border 1
        // Item5: (0,20):(16,20) border 1
        // ItemIJ: (16i, 20j):(16,20) border 1

        public InventoryBackpackSlot(PartyCharacterId activeCharacter, int slotNumber)
            : base(activeCharacter, BackpackHandlers)
        {
            _slotNumber = slotNumber;
            _sprite     = new UiItemSprite(ItemSpriteId.Nothing);

            var amountSource = new DynamicText(() =>
            {
                GetSlot(out var slotInfo, out _);
                return(slotInfo == null || slotInfo.Amount < 2
                    ? new TextBlock[0]
                    : new[] { new TextBlock(slotInfo.Amount.ToString())
                              {
                                  Alignment = TextAlignment.Right
                              } });
            }, x => _version);

            var text = new Text(amountSource);

            Frame = new ButtonFrame(new FixedPositionStack()
                                    .Add(_sprite, 0, 0, 16, 16)
                                    .Add(text, 0, 20 - 9, 16, 9)
                                    )
            {
                Padding = -1,
                Theme   = new InventorySlotTheme(),
                State   = ButtonState.Pressed
            };

            Children.Add(Frame);
        }
Exemplo n.º 7
0
        public InventoryCharacterPane(PartyCharacterId activeCharacter, Func <InventoryPage> getPage, Action <InventoryPage> setPage)
        {
            _getPage = getPage;
            var page = _getPage();

            _summaryButton = new Button("I")
            {
                DoubleFrame = true,
                IsPressed   = page == InventoryPage.Summary
            }.OnClick(() => setPage(InventoryPage.Summary));

            _statsButton = new Button("II")
            {
                DoubleFrame = true,
                IsPressed   = page == InventoryPage.Stats
            }.OnClick(() => setPage(InventoryPage.Stats));

            _miscButton = new Button("III")
            {
                DoubleFrame = true,
                IsPressed   = page == InventoryPage.Misc
            }.OnClick(() => setPage(InventoryPage.Misc));

            var buttonStack =
                new FixedPosition(
                    new Rectangle(84, 174, 50, 15),
                    new HorizontalStack(
                        new FixedSize(16, 15, _summaryButton),
                        new FixedSize(16, 15, _statsButton),
                        new FixedSize(16, 15, _miscButton)
                        ));

            AttachChild(buttonStack);
            AttachChild(new InventoryActivePageSelector(activeCharacter, getPage));
        }
Exemplo n.º 8
0
        public InventoryScreen(
            ISetInventoryModeEvent modeEvent,
            PartyCharacterId activeCharacter,
            Func <InventoryPage> getPage,
            Action <InventoryPage> setPage) : base(DialogPositioning.TopLeft)
        {
            var leftPane =
                modeEvent.Mode switch
            {
                InventoryMode.Character => (IUiElement) new InventoryCharacterPane(activeCharacter, getPage, setPage),
                InventoryMode.Merchant => new InventoryMerchantPane((MerchantId)modeEvent.Submode),
                InventoryMode.Chest => new InventoryChestPane((ChestId)modeEvent.Submode),
                InventoryMode.LockedChest => new InventoryLockPane((ILockedInventoryEvent)modeEvent),
                InventoryMode.LockedDoor => new InventoryLockPane((ILockedInventoryEvent)modeEvent),
                _ => throw new InvalidOperationException($"Unexpected inventory mode {modeEvent.Mode}")
            };

            var middlePane = new InventoryMidPane(activeCharacter);
            var rightPane  = new InventoryRightPane(
                activeCharacter,
                modeEvent.Mode == InventoryMode.Merchant);

            // var frameDivider = new FrameDivider(135, 0, 4, 192);

            AttachChild(new UiFixedPositionElement <SlabId>(SlabId.SLAB, UiConstants.UiExtents));
            AttachChild(new FixedPosition(new Rectangle(0, 0, 135, UiConstants.ActiveAreaExtents.Height), leftPane));
            AttachChild(new FixedPosition(new Rectangle(142, 0, 134, UiConstants.ActiveAreaExtents.Height), middlePane));
            AttachChild(new FixedPosition(new Rectangle(280, 0, 71, UiConstants.ActiveAreaExtents.Height), rightPane));
        }
    }
Exemplo n.º 9
0
 void OpenInventory(PartyCharacterId memberId)
 {
     if (ActiveSceneId != SceneId.Inventory)
     {
         Raise(new PushSceneEvent(SceneId.Inventory));
     }
     Raise(new SetInventoryModeEvent(memberId));
 }
Exemplo n.º 10
0
        public Conversation(PartyCharacterId partyMemberId, ICharacterSheet npc)
        {
            On <EndDialogueEvent>(_ => Close());
            On <UnloadMapEvent>(_ => Close());
            On <DataChangeEvent>(OnDataChange);

            _partyMemberId = partyMemberId;
            _npc           = npc ?? throw new ArgumentNullException(nameof(npc));
        }
Exemplo n.º 11
0
 public InventoryActivePageSelector(PartyCharacterId activeCharacter, Func <InventoryPage> getPage)
 {
     _getPage = getPage;
     _summary = new InventorySummaryPage(activeCharacter);
     _stats   = new InventoryStatsPage(activeCharacter);
     _misc    = new InventoryMiscPage(activeCharacter);
     Children.Add(_summary);
     Children.Add(_stats);
     Children.Add(_misc);
 }
Exemplo n.º 12
0
 // Inner area 16x16 w/ 1-pixel button frame
 public InventoryBodyPart(PartyCharacterId activeCharacter, ItemSlotId itemSlotId)
     : base(activeCharacter, SlotHandlers)
 {
     SlotId  = itemSlotId;
     _sprite = new UiItemSprite(ItemSpriteId.Nothing);
     Frame   = new ButtonFrame(new FixedSize(16, 16, _sprite))
     {
         Padding = -1
     };
     Children.Add(Frame);
 }
Exemplo n.º 13
0
        public InventoryMidPane(PartyCharacterId activeCharacter, InventoryConfig.PlayerInventory config)
        {
            var background = new FixedPositionStack();

            background.Add(new UiSprite <FullBodyPictureId>((FullBodyPictureId)activeCharacter), 1, -3);
            Children.Add(background);

            var bodyStack = new FixedPositionStack();

            foreach (var bodyPart in config)
            {
                var itemSlotId = bodyPart.Key;
                var position   = bodyPart.Value;
                bodyStack.Add(new InventoryBodyPart(activeCharacter, itemSlotId), (int)position.X, (int)position.Y);
            }

            var frame = new ButtonFrame(bodyStack)
            {
                Theme = new FrameTheme()
            };
            var labelStack = new HorizontalStack(
                new InventoryOffensiveLabel(activeCharacter),
                new InventoryWeightLabel(activeCharacter),
                new InventoryDefensiveLabel(activeCharacter)
                );

            var mainStack = new VerticalStack(
                new Header(new DynamicText(() =>
            {
                var member   = Resolve <IParty>()[activeCharacter];
                var settings = Resolve <ISettings>();
                if (member == null)
                {
                    return(new TextBlock[0]);
                }

                var name = member.Apparent.GetName(settings.Gameplay.Language);
                return(new[] { new TextBlock(name)
                               {
                                   Alignment = TextAlignment.Center
                               } });
            })),
                new HorizontalStack(
                    new Padding(3, 0),
                    frame,
                    new Padding(3, 0)),
                labelStack
                );

            Children.Add(mainStack);
        }
Exemplo n.º 14
0
        public Player(PartyCharacterId id, CharacterSheet sheet)
        {
            On <InventoryChangedEvent>(InventoryChanged);
            On <EngineUpdateEvent>(EngineUpdate);
            On <SetPlayerStatusUiPositionEvent>(e => { if (id == e.Id)
                                                       {
                                                           StatusBarUiPosition = new Vector2(e.CentreX, e.CentreY);
                                                       }
                                                });

            Id       = id;
            _base    = sheet ?? throw new ArgumentNullException(nameof(sheet));
            Apparent = new InterpolatedCharacterSheet(() => _lastEffective, () => Effective, () => _lerp);
        }
Exemplo n.º 15
0
        public InventoryMiscPage(PartyCharacterId activeCharacter)
        {
            StringId S(SystemTextId id) => new StringId(AssetType.SystemText, 0, (int)id);

            var stack = new VerticalStack(
                new Header(S(SystemTextId.Inv3_Conditions)),
                new Padding(0, 64),
                new Header(S(SystemTextId.Inv3_Languages)),
                new Padding(0, 23),
                new Header(S(SystemTextId.Inv3_TemporarySpells)),
                new Padding(0, 45),
                new Button(CombatPositionButtonId, S(SystemTextId.Inv3_CombatPositions))
                );

            Children.Add(stack);
        }
Exemplo n.º 16
0
        public InventoryWeightLabel(PartyCharacterId activeCharacter) : base(Handlers)
        {
            _activeCharacter = activeCharacter;

            _hoverSource = new DynamicText(() =>
            {
                var assets   = Resolve <IAssetManager>();
                var settings = Resolve <ISettings>();
                var player   = Resolve <IParty>()[_activeCharacter];
                if (player == null)
                {
                    return(new TextBlock[0]);
                }

                // Carried Weight : %ld of %ld g
                var template = assets.LoadString(SystemTextId.Inv_CarriedWeightNdOfNdG, settings.Gameplay.Language);
                var(text, _) = new TextFormatter(assets, settings.Gameplay.Language).Format(template, player.Apparent.TotalWeight, player.Apparent.MaxWeight);
                return(text);
            }, x => _version);

            var source = new DynamicText(() =>
            {
                var assets   = Resolve <IAssetManager>();
                var settings = Resolve <ISettings>();
                var player   = Resolve <IParty>()[_activeCharacter];
                if (player == null)
                {
                    return(new TextBlock[0]);
                }

                int weight   = player.Apparent.TotalWeight / 1000;
                var template = assets.LoadString(SystemTextId.Inv_WeightNKg, settings.Gameplay.Language); // Weight : %d Kg
                return(new
                       TextFormatter(assets, settings.Gameplay.Language)
                       .NoWrap()
                       .Centre()
                       .Format(template, weight)
                       .Item1);
            }, x => _version);

            Children.Add(new ButtonFrame(new Text(source))
            {
                State   = ButtonState.Pressed,
                Padding = 0
            });
        }
Exemplo n.º 17
0
        void SetDisplayedPartyMember(PartyCharacterId?member)
        {
            if (Resolve <ISceneManager>().ActiveSceneId != SceneId.Inventory)
            {
                Raise(new PushSceneEvent(SceneId.Inventory));
            }

            var party = Resolve <IParty>();

            member ??= party.Leader;
            if (party.WalkOrder.All(x => x.Id != member.Value))
            {
                member = party.Leader;
            }

            _activeCharacter = member.Value;

            Raise(new SetContextEvent(ContextType.Inventory, AssetType.PartyMember, (int)member.Value));
            Rebuild();
        }
Exemplo n.º 18
0
        public InventorySummaryPage(PartyCharacterId activeMember)
        {
            _activeMember = activeMember;
            var background = new FixedPosition(
                new Rectangle(0, 26, 135, 144),
                new UiSprite <SmallPortraitId>((SmallPortraitId)(int)activeMember));

            var summarySource       = new DynamicText(BuildSummary);
            var pointsSource        = new DynamicText(BuildPoints);
            var pointsHeadingSource = new DynamicText(BuildPointsHeadings);

            var frameTheme = new FrameTheme();
            var stack      =
                new HorizontalStack(
                    new Padding(4, 0),
                    new VerticalStack(
                        new Padding(0, 4),
                        new ButtonFrame(new FixedSize(125, 41, new Text(summarySource)))
            {
                Theme = frameTheme, State = ButtonState.Pressed
            },
                        new Padding(0, 80),
                        new ButtonFrame(
                            new FixedSize(125, 41,
                                          new HorizontalStack(
                                              new Text(pointsHeadingSource),
                                              new Padding(5, 0),
                                              new FixedSize(41, 41,
                                                            new Text(pointsSource)
                                                            ))))
            {
                Theme = frameTheme, State = ButtonState.Pressed
            }
                        ),
                    new Padding(4, 0)
                    );

            Children.Add(background);
            Children.Add(stack);
        }
Exemplo n.º 19
0
        public InventorySummaryPage(PartyCharacterId activeMember)
        {
            _activeMember = activeMember;

            var summarySource       = new DynamicText(BuildSummary);
            var pointsSource        = new DynamicText(BuildPoints);
            var pointsHeadingSource = new DynamicText(BuildPointsHeadings);

            var stack =
                new HorizontalStack(
                    new Spacing(4, 0),
                    new VerticalStack(
                        new Spacing(0, 4),
                        new GroupingFrame(new FixedSize(125, 41, new UiText(summarySource))),
                        new Spacing(0, 80),
                        new GroupingFrame(
                            new FixedSize(125, 41,
                                          new HorizontalStack(
                                              new UiText(pointsHeadingSource),
                                              new Spacing(5, 0),
                                              new FixedSize(41, 41,
                                                            new UiText(pointsSource)
                                                            ))))
                        ),
                    new Spacing(4, 0)
                    );

            AttachChild(new LayerStack(
                            new FixedPosition(
                                new Rectangle(0, 25, 135, 145),
                                new UiSpriteElement <SmallPortraitId>((SmallPortraitId)(int)activeMember)
            {
                Flags = SpriteFlags.GradientPixels
            }),
                            stack));
        }
 public InventoryActivePageSelector(PartyCharacterId activeCharacter, Func <InventoryPage> getPage)
 {
     _activeCharacter = activeCharacter;
     _getPage         = getPage;
 }
Exemplo n.º 21
0
 public SetInventoryMerchantModeEvent(MerchantId merchantId, PartyCharacterId member)
 {
     MerchantId = merchantId;
     Member     = member;
 }
Exemplo n.º 22
0
 public IPlayer this[PartyCharacterId id] => _statusBarOrder.FirstOrDefault(x => x.Id == id);
Exemplo n.º 23
0
 protected InventorySlot(PartyCharacterId activeCharacter, IDictionary <Type, Handler> handlers)
     : base(handlers)
 {
     ActiveCharacter = activeCharacter;
 }
Exemplo n.º 24
0
 public InventoryGiveItemEvent(PartyCharacterId memberId)
 {
     MemberId = memberId;
 }
Exemplo n.º 25
0
 public SetPartyLeaderEvent(PartyCharacterId id)
 {
     PartyMemberId = id;
 }
Exemplo n.º 26
0
 public ISetInventoryModeEvent CloneForMember(PartyCharacterId member) => new MerchantEvent(MerchantId, member);
Exemplo n.º 27
0
        public InventoryRightPane(PartyCharacterId activeCharacter, string exitButtonId, bool showTotalPartyGold)
            : base(Handlers)
        {
            var header = new Header(new StringId(AssetType.SystemText, 0, (int)SystemTextId.Inv_Backpack));

            var slotSpans = new IUiElement[InventoryHeight];

            for (int j = 0; j < InventoryHeight; j++)
            {
                var slotsInRow = new IUiElement[InventoryWidth];
                for (int i = 0; i < InventoryWidth; i++)
                {
                    int index = j * InventoryWidth + i;
                    slotsInRow[i] = new InventoryBackpackSlot(activeCharacter, index);
                }
                slotSpans[j] = new HorizontalStack(slotsInRow);
            }

            var slotStack = new VerticalStack(slotSpans);
            //var slotFrame = new ButtonFrame(slotStack) { State = ButtonState.Pressed, Theme = new FrameTheme() };

            HorizontalStack moneyAndFoodStack;

            if (showTotalPartyGold)
            {
                var money = new Button(GoldSummaryButtonId,
                                       new VerticalStack(
                                           new Padding(64, 0),
                                           new UiSpriteElement <CoreSpriteId>(CoreSpriteId.UiGold)
                {
                    Highlighted = true
                },
                                           new Text("Total party gold $10.0")
                                           )
                {
                    Greedy = false
                }
                                       )
                {
                    IsPressed = true
                };
                moneyAndFoodStack = new HorizontalStack(money);
            }
            else
            {
                var goldSource = new DynamicText(() =>
                {
                    var player = Resolve <IParty>()[activeCharacter];
                    var gold   = player?.Apparent.Inventory.Gold ?? 0;
                    return(new[] { new TextBlock($"{gold / 10}.{gold % 10}") });
                }, x => _version);

                var goldButton = new Button(GoldButtonId,
                                            new VerticalStack(
                                                new Padding(31, 0),
                                                new UiSpriteElement <CoreSpriteId>(CoreSpriteId.UiGold),
                                                new Text(goldSource)
                                                )
                {
                    Greedy = false
                });

                var foodSource = new DynamicText(() =>
                {
                    var player = Resolve <IParty>()[activeCharacter];
                    var food   = player?.Apparent.Inventory.Rations ?? 0;
                    return(new[] { new TextBlock(food.ToString()) });
                }, x => _version);

                var foodButton = new Button(FoodButtonId,
                                            new VerticalStack(
                                                new Padding(31, 0),
                                                new UiSpriteElement <CoreSpriteId>(CoreSpriteId.UiFood),
                                                new Text(foodSource)
                                                )
                {
                    Greedy = false
                });
                moneyAndFoodStack = new HorizontalStack(goldButton, foodButton);
            }

            var stack = new VerticalStack(
                header,
                slotStack, // slotFrame,
                new Padding(0, 2),
                moneyAndFoodStack,
                new Padding(0, 9),
                new InventoryExitButton(exitButtonId)
                )
            {
                Greedy = false
            };

            Children.Add(stack);
        }
Exemplo n.º 28
0
 public PlayerInventoryManager(PartyCharacterId id, CharacterSheet sheet) : base(Handlers)
 {
     _id      = id;
     _base    = sheet;
     Apparent = new InterpolatedCharacterSheet(() => _lastEffective, () => _effective, () => _lerp);
 }
Exemplo n.º 29
0
 public SetActiveMemberEvent(PartyCharacterId memberId)
 {
     MemberId = memberId;
 }
Exemplo n.º 30
0
 public static SmallPortraitId ToPortraitId(this PartyCharacterId partyCharacterId) =>
 partyCharacterId switch
 {