Dice tweaks (#13514)

This commit is contained in:
Leon Friedrich
2023-01-21 12:51:26 +13:00
committed by GitHub
parent a0b6e052a1
commit 2904a368f7
92 changed files with 274 additions and 181 deletions

View File

@@ -0,0 +1,21 @@
using Content.Shared.Dice;
using Robust.Client.GameObjects;
namespace Content.Client.Dice;
public sealed class DiceSystem : SharedDiceSystem
{
protected override void UpdateVisuals(EntityUid uid, DiceComponent? die = null)
{
if (!Resolve(uid, ref die) || !TryComp(uid, out SpriteComponent? sprite))
return;
// TODO maybe just move each diue to its own RSI?
var state = sprite.LayerGetState(0).Name;
if (state == null)
return;
var prefix = state.Substring(0, state.IndexOf('_'));
sprite.LayerSetState(0, $"{prefix}_{die.CurrentValue}");
}
}

View File

@@ -1,20 +0,0 @@
using Robust.Shared.Audio;
namespace Content.Server.Dice
{
[RegisterComponent, Access(typeof(DiceSystem))]
public sealed class DiceComponent : Component
{
[DataField("sound")]
public SoundSpecifier Sound { get; } = new SoundCollectionSpecifier("Dice");
[DataField("step")]
public int Step { get; } = 1;
[DataField("sides")]
public int Sides { get; } = 20;
[ViewVariables]
public int CurrentSide { get; set; } = 20;
}
}

View File

@@ -1,81 +1,26 @@
using Content.Server.Popups;
using Content.Shared.Audio;
using Content.Shared.Examine;
using Content.Shared.Interaction.Events;
using Content.Shared.Throwing;
using Content.Shared.Dice;
using Content.Shared.Popups;
using JetBrains.Annotations;
using Robust.Server.GameObjects;
using Robust.Shared.Audio;
using Robust.Shared.Player;
using Robust.Shared.Random;
namespace Content.Server.Dice
namespace Content.Server.Dice;
[UsedImplicitly]
public sealed class DiceSystem : SharedDiceSystem
{
[UsedImplicitly]
public sealed class DiceSystem : EntitySystem
[Dependency] private readonly IRobustRandom _random = default!;
[Dependency] private readonly SharedAudioSystem _audio = default!;
[Dependency] private readonly SharedPopupSystem _popup = default!;
public override void Roll(EntityUid uid, DiceComponent? die = null)
{
[Dependency] private readonly IRobustRandom _random = default!;
if (!Resolve(uid, ref die))
return;
public override void Initialize()
{
base.Initialize();
var roll = _random.Next(1, die.Sides);
SetCurrentSide(uid, roll, die);
SubscribeLocalEvent<DiceComponent, ComponentInit>(OnComponentInit);
SubscribeLocalEvent<DiceComponent, UseInHandEvent>(OnUseInHand);
SubscribeLocalEvent<DiceComponent, LandEvent>(OnLand);
SubscribeLocalEvent<DiceComponent, ExaminedEvent>(OnExamined);
}
private void OnComponentInit(EntityUid uid, DiceComponent component, ComponentInit args)
{
if (component.CurrentSide > component.Sides)
component.CurrentSide = component.Sides;
}
private void OnUseInHand(EntityUid uid, DiceComponent component, UseInHandEvent args)
{
if (args.Handled) return;
args.Handled = true;
Roll(uid, component);
}
private void OnLand(EntityUid uid, DiceComponent component, ref LandEvent args)
{
Roll(uid, component);
}
private void OnExamined(EntityUid uid, DiceComponent dice, ExaminedEvent args)
{
//No details check, since the sprite updates to show the side.
args.PushMarkup(Loc.GetString("dice-component-on-examine-message-part-1", ("sidesAmount", dice.Sides)));
args.PushMarkup(Loc.GetString("dice-component-on-examine-message-part-2", ("currentSide", dice.CurrentSide)));
}
public void SetCurrentSide(EntityUid uid, int side, DiceComponent? die = null, SpriteComponent? sprite = null)
{
if (!Resolve(uid, ref die, ref sprite))
return;
side = Math.Min(Math.Max(side, 1), die.Sides);
side += side % die.Step;
die.CurrentSide = side;
// TODO DICE: Use a visualizer instead.
sprite.LayerSetState(0, $"d{die.Sides}{die.CurrentSide}");
}
public void Roll(EntityUid uid, DiceComponent? die = null)
{
if (!Resolve(uid, ref die))
return;
var roll = _random.Next(1, die.Sides/die.Step+1) * die.Step;
SetCurrentSide(uid, roll, die);
die.Owner.PopupMessageEveryone(Loc.GetString("dice-component-on-roll-land", ("die", die.Owner), ("currentSide", die.CurrentSide)));
SoundSystem.Play(die.Sound.GetSound(), Filter.Pvs(die.Owner), die.Owner, AudioHelpers.WithVariation(0.05f));
}
_popup.PopupEntity(Loc.GetString("dice-component-on-roll-land", ("die", uid), ("currentSide", die.CurrentValue)), uid);
_audio.PlayPvs(die.Sound, uid);
}
}

View File

@@ -0,0 +1,44 @@
using Robust.Shared.Audio;
using Robust.Shared.GameStates;
using Robust.Shared.Serialization;
namespace Content.Shared.Dice;
[RegisterComponent, NetworkedComponent, Access(typeof(SharedDiceSystem))]
public sealed class DiceComponent : Component
{
[DataField("sound")]
public SoundSpecifier Sound { get; } = new SoundCollectionSpecifier("Dice");
/// <summary>
/// Multiplier for the value of a die. Applied after the <see cref="Offset"/>.
/// </summary>
[DataField("multiplier")]
public int Multiplier { get; } = 1;
/// <summary>
/// Quantity that is subtracted from the value of a die. Can be used to make dice that start at "0". Applied
/// before the <see cref="Multiplier"/>
/// </summary>
[DataField("offset")]
public int Offset { get; } = 0;
[DataField("sides")]
public int Sides { get; } = 20;
/// <summary>
/// The currently displayed value.
/// </summary>
[DataField("currentValue")]
public int CurrentValue { get; set; } = 20;
[Serializable, NetSerializable]
public sealed class DiceState : ComponentState
{
public int CurrentSide { get; set; } = 20;
public DiceState(int side)
{
CurrentSide = side;
}
}
}

View File

@@ -0,0 +1,93 @@
using Content.Shared.Examine;
using Content.Shared.Interaction.Events;
using Content.Shared.Throwing;
using Robust.Shared.GameStates;
namespace Content.Shared.Dice;
public abstract class SharedDiceSystem : EntitySystem
{
public override void Initialize()
{
base.Initialize();
SubscribeLocalEvent<DiceComponent, UseInHandEvent>(OnUseInHand);
SubscribeLocalEvent<DiceComponent, LandEvent>(OnLand);
SubscribeLocalEvent<DiceComponent, ExaminedEvent>(OnExamined);
SubscribeLocalEvent<DiceComponent, ComponentGetState>(OnGetState);
SubscribeLocalEvent<DiceComponent, ComponentHandleState>(OnHandleState);
}
private void OnHandleState(EntityUid uid, DiceComponent component, ref ComponentHandleState args)
{
if (args.Current is DiceComponent.DiceState state)
component.CurrentValue = state.CurrentSide;
UpdateVisuals(uid, component);
}
private void OnGetState(EntityUid uid, DiceComponent component, ref ComponentGetState args)
{
args.State = new DiceComponent.DiceState(component.CurrentValue);
}
private void OnUseInHand(EntityUid uid, DiceComponent component, UseInHandEvent args)
{
if (args.Handled) return;
args.Handled = true;
Roll(uid, component);
}
private void OnLand(EntityUid uid, DiceComponent component, ref LandEvent args)
{
Roll(uid, component);
}
private void OnExamined(EntityUid uid, DiceComponent dice, ExaminedEvent args)
{
//No details check, since the sprite updates to show the side.
args.PushMarkup(Loc.GetString("dice-component-on-examine-message-part-1", ("sidesAmount", dice.Sides)));
args.PushMarkup(Loc.GetString("dice-component-on-examine-message-part-2", ("currentSide", dice.CurrentValue)));
}
public void SetCurrentSide(EntityUid uid, int side, DiceComponent? die = null)
{
if (!Resolve(uid, ref die))
return;
if (side < 1 || side > die.Sides)
{
Logger.Error($"Attempted to set die {ToPrettyString(uid)} to an invalid side ({side}).");
return;
}
die.CurrentValue = (side - die.Offset) * die.Multiplier;
Dirty(die);
UpdateVisuals(uid, die);
}
public void SetCurrentValue(EntityUid uid, int value, DiceComponent? die = null)
{
if (!Resolve(uid, ref die))
return;
if (value % die.Multiplier != 0 || value/ die.Multiplier + die.Offset < 1)
{
Logger.Error($"Attempted to set die {ToPrettyString(uid)} to an invalid value ({value}).");
return;
}
SetCurrentSide(uid, value / die.Multiplier + die.Offset, die);
}
protected virtual void UpdateVisuals(EntityUid uid, DiceComponent? die = null)
{
// See client system.
}
public virtual void Roll(EntityUid uid, DiceComponent? die = null)
{
// See the server system, client cannot predict rolling.
}
}

View File

@@ -5973,7 +5973,7 @@ entities:
parent: 8364
type: Transform
- uid: 898
type: d100Dice
type: PercentileDie
components:
- pos: 57.5,20.5
parent: 8364
@@ -97138,7 +97138,7 @@ entities:
parent: 8364
type: Transform
- uid: 10853
type: d100Dice
type: PercentileDie
components:
- pos: 56.5,3.5000002
parent: 8364
@@ -97304,7 +97304,7 @@ entities:
parent: 8364
type: Transform
- uid: 10873
type: d100Dice
type: PercentileDie
components:
- pos: 55.5,0.5
parent: 8364

View File

@@ -33065,7 +33065,7 @@ entities:
parent: 0
type: Transform
- uid: 3765
type: d100Dice
type: PercentileDie
components:
- pos: -18.522638,2.6762333
parent: 0

View File

@@ -156547,7 +156547,7 @@ entities:
parent: 30
type: Transform
- uid: 19473
type: d100Dice
type: PercentileDie
components:
- rot: 1.5707963267948966 rad
pos: -57.4998,-65.351234

View File

@@ -52,7 +52,7 @@
id: FunBoardGames
icon:
sprite: Objects/Fun/dice.rsi
state: d66
state: d6_6
product: CrateFunBoardGames
cost: 1500
category: Fun

View File

@@ -7,6 +7,7 @@
- type: ItemCooldown
- type: UseDelay
- type: Sprite
netsync: false
sprite: Objects/Fun/dice.rsi
noRot: true # If their sprites rotate, the number becomes even more illegible than usual.
- type: Tag
@@ -17,15 +18,17 @@
- type: entity
parent: BaseDice
id: d100Dice
name: d100
id: PercentileDie
name: Percentile Die
description: A die with ten sides. Works better for d100 rolls than a golf ball.
components:
- type: Dice
sides: 100
step: 10
sides: 10
multiplier: 10
offset: 1 # first side is a 0
currentValue: 1
- type: Sprite
state: d100100
state: percentile_0
- type: entity
parent: BaseDice
@@ -35,8 +38,9 @@
components:
- type: Dice
sides: 20
currentValue: 20
- type: Sprite
state: d2020
state: d20_20
- type: entity
parent: BaseDice
@@ -46,8 +50,9 @@
components:
- type: Dice
sides: 12
currentValue: 12
- type: Sprite
state: d1212
state: d12_12
- type: entity
parent: BaseDice
@@ -57,8 +62,9 @@
components:
- type: Dice
sides: 10
currentValue: 10
- type: Sprite
state: d1010
state: d10_10
- type: entity
parent: BaseDice
@@ -68,8 +74,9 @@
components:
- type: Dice
sides: 8
currentValue: 8
- type: Sprite
state: d88
state: d8_8
- type: entity
parent: BaseDice
@@ -79,8 +86,9 @@
components:
- type: Dice
sides: 6
currentValue: 6
- type: Sprite
state: d66
state: d6_6
- type: entity
parent: BaseDice
@@ -90,8 +98,9 @@
components:
- type: Dice
sides: 4
currentValue: 4
- type: Sprite
state: d44
state: d4_4
- type: CollisionWake
enabled: false
- type: Fixtures
@@ -122,3 +131,4 @@
damage:
types:
Piercing: 5
# I love this

View File

@@ -12,7 +12,7 @@
- id: d10Dice
- id: d12Dice
- id: d20Dice
- id: d100Dice
- id: PercentileDie
- type: Sprite
netsync: false
sprite: Objects/Fun/dice.rsi

Binary file not shown.

Before

Width:  |  Height:  |  Size: 361 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 359 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 369 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 372 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 372 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 372 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 370 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 361 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 369 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 372 B

View File

Before

Width:  |  Height:  |  Size: 353 B

After

Width:  |  Height:  |  Size: 353 B

View File

Before

Width:  |  Height:  |  Size: 369 B

After

Width:  |  Height:  |  Size: 369 B

View File

Before

Width:  |  Height:  |  Size: 358 B

After

Width:  |  Height:  |  Size: 358 B

View File

Before

Width:  |  Height:  |  Size: 360 B

After

Width:  |  Height:  |  Size: 360 B

View File

Before

Width:  |  Height:  |  Size: 347 B

After

Width:  |  Height:  |  Size: 347 B

View File

Before

Width:  |  Height:  |  Size: 355 B

After

Width:  |  Height:  |  Size: 355 B

View File

Before

Width:  |  Height:  |  Size: 356 B

After

Width:  |  Height:  |  Size: 356 B

View File

Before

Width:  |  Height:  |  Size: 354 B

After

Width:  |  Height:  |  Size: 354 B

View File

Before

Width:  |  Height:  |  Size: 354 B

After

Width:  |  Height:  |  Size: 354 B

View File

Before

Width:  |  Height:  |  Size: 353 B

After

Width:  |  Height:  |  Size: 353 B

View File

Before

Width:  |  Height:  |  Size: 392 B

After

Width:  |  Height:  |  Size: 392 B

View File

Before

Width:  |  Height:  |  Size: 399 B

After

Width:  |  Height:  |  Size: 399 B

View File

Before

Width:  |  Height:  |  Size: 382 B

After

Width:  |  Height:  |  Size: 382 B

View File

Before

Width:  |  Height:  |  Size: 407 B

After

Width:  |  Height:  |  Size: 407 B

View File

Before

Width:  |  Height:  |  Size: 401 B

After

Width:  |  Height:  |  Size: 401 B

View File

Before

Width:  |  Height:  |  Size: 400 B

After

Width:  |  Height:  |  Size: 400 B

View File

Before

Width:  |  Height:  |  Size: 386 B

After

Width:  |  Height:  |  Size: 386 B

View File

Before

Width:  |  Height:  |  Size: 399 B

After

Width:  |  Height:  |  Size: 399 B

View File

Before

Width:  |  Height:  |  Size: 395 B

After

Width:  |  Height:  |  Size: 395 B

View File

Before

Width:  |  Height:  |  Size: 387 B

After

Width:  |  Height:  |  Size: 387 B

View File

Before

Width:  |  Height:  |  Size: 396 B

After

Width:  |  Height:  |  Size: 396 B

View File

Before

Width:  |  Height:  |  Size: 400 B

After

Width:  |  Height:  |  Size: 400 B

View File

Before

Width:  |  Height:  |  Size: 448 B

After

Width:  |  Height:  |  Size: 448 B

View File

Before

Width:  |  Height:  |  Size: 442 B

After

Width:  |  Height:  |  Size: 442 B

View File

Before

Width:  |  Height:  |  Size: 447 B

After

Width:  |  Height:  |  Size: 447 B

View File

Before

Width:  |  Height:  |  Size: 462 B

After

Width:  |  Height:  |  Size: 462 B

View File

Before

Width:  |  Height:  |  Size: 469 B

After

Width:  |  Height:  |  Size: 469 B

View File

Before

Width:  |  Height:  |  Size: 440 B

After

Width:  |  Height:  |  Size: 440 B

View File

Before

Width:  |  Height:  |  Size: 458 B

After

Width:  |  Height:  |  Size: 458 B

View File

Before

Width:  |  Height:  |  Size: 454 B

After

Width:  |  Height:  |  Size: 454 B

View File

Before

Width:  |  Height:  |  Size: 459 B

After

Width:  |  Height:  |  Size: 459 B

View File

Before

Width:  |  Height:  |  Size: 445 B

After

Width:  |  Height:  |  Size: 445 B

View File

Before

Width:  |  Height:  |  Size: 450 B

After

Width:  |  Height:  |  Size: 450 B

View File

Before

Width:  |  Height:  |  Size: 455 B

After

Width:  |  Height:  |  Size: 455 B

View File

Before

Width:  |  Height:  |  Size: 441 B

After

Width:  |  Height:  |  Size: 441 B

View File

Before

Width:  |  Height:  |  Size: 456 B

After

Width:  |  Height:  |  Size: 456 B

View File

Before

Width:  |  Height:  |  Size: 453 B

After

Width:  |  Height:  |  Size: 453 B

View File

Before

Width:  |  Height:  |  Size: 463 B

After

Width:  |  Height:  |  Size: 463 B

View File

Before

Width:  |  Height:  |  Size: 459 B

After

Width:  |  Height:  |  Size: 459 B

View File

Before

Width:  |  Height:  |  Size: 442 B

After

Width:  |  Height:  |  Size: 442 B

View File

Before

Width:  |  Height:  |  Size: 456 B

After

Width:  |  Height:  |  Size: 456 B

View File

Before

Width:  |  Height:  |  Size: 459 B

After

Width:  |  Height:  |  Size: 459 B

View File

Before

Width:  |  Height:  |  Size: 242 B

After

Width:  |  Height:  |  Size: 242 B

View File

Before

Width:  |  Height:  |  Size: 254 B

After

Width:  |  Height:  |  Size: 254 B

View File

Before

Width:  |  Height:  |  Size: 246 B

After

Width:  |  Height:  |  Size: 246 B

View File

Before

Width:  |  Height:  |  Size: 247 B

After

Width:  |  Height:  |  Size: 247 B

View File

Before

Width:  |  Height:  |  Size: 345 B

After

Width:  |  Height:  |  Size: 345 B

View File

Before

Width:  |  Height:  |  Size: 337 B

After

Width:  |  Height:  |  Size: 337 B

View File

Before

Width:  |  Height:  |  Size: 332 B

After

Width:  |  Height:  |  Size: 332 B

View File

Before

Width:  |  Height:  |  Size: 347 B

After

Width:  |  Height:  |  Size: 347 B

View File

Before

Width:  |  Height:  |  Size: 341 B

After

Width:  |  Height:  |  Size: 341 B

View File

Before

Width:  |  Height:  |  Size: 317 B

After

Width:  |  Height:  |  Size: 317 B

View File

Before

Width:  |  Height:  |  Size: 340 B

After

Width:  |  Height:  |  Size: 340 B

View File

Before

Width:  |  Height:  |  Size: 364 B

After

Width:  |  Height:  |  Size: 364 B

View File

Before

Width:  |  Height:  |  Size: 364 B

After

Width:  |  Height:  |  Size: 364 B

View File

Before

Width:  |  Height:  |  Size: 340 B

After

Width:  |  Height:  |  Size: 340 B

View File

Before

Width:  |  Height:  |  Size: 367 B

After

Width:  |  Height:  |  Size: 367 B

View File

Before

Width:  |  Height:  |  Size: 376 B

After

Width:  |  Height:  |  Size: 376 B

View File

Before

Width:  |  Height:  |  Size: 355 B

After

Width:  |  Height:  |  Size: 355 B

View File

Before

Width:  |  Height:  |  Size: 368 B

After

Width:  |  Height:  |  Size: 368 B

View File

@@ -1,221 +1,221 @@
{
"version": 1,
"license": "CC-BY-SA-3.0",
"copyright": "Taken from vgstation at https://github.com/vgstation-coders/vgstation13/commit/1cdfb0230cc96d0ba751fa002d04f8aa2f25ad7d",
"copyright": "Taken from vgstation at https://github.com/vgstation-coders/vgstation13/commit/1cdfb0230cc96d0ba751fa002d04f8aa2f25ad7d. Edited by ElectroSR.",
"size": {
"x": 32,
"y": 32
},
"states": [
{
"name": "d10010"
"name": "percentile_10"
},
{
"name": "d100100"
"name": "percentile_0"
},
{
"name": "d10020"
"name": "percentile_20"
},
{
"name": "d10030"
"name": "percentile_30"
},
{
"name": "d10040"
"name": "percentile_40"
},
{
"name": "d10050"
"name": "percentile_50"
},
{
"name": "d10060"
"name": "percentile_60"
},
{
"name": "d10070"
"name": "percentile_70"
},
{
"name": "d10080"
"name": "percentile_80"
},
{
"name": "d10090"
"name": "percentile_90"
},
{
"name": "d101"
"name": "d10_1"
},
{
"name": "d1010"
"name": "d10_10"
},
{
"name": "d102"
"name": "d10_2"
},
{
"name": "d103"
"name": "d10_3"
},
{
"name": "d104"
"name": "d10_4"
},
{
"name": "d105"
"name": "d10_5"
},
{
"name": "d106"
"name": "d10_6"
},
{
"name": "d107"
"name": "d10_7"
},
{
"name": "d108"
"name": "d10_8"
},
{
"name": "d109"
"name": "d10_9"
},
{
"name": "d121"
"name": "d12_1"
},
{
"name": "d1210"
"name": "d12_10"
},
{
"name": "d1211"
"name": "d12_11"
},
{
"name": "d1212"
"name": "d12_12"
},
{
"name": "d122"
"name": "d12_2"
},
{
"name": "d123"
"name": "d12_3"
},
{
"name": "d124"
"name": "d12_4"
},
{
"name": "d125"
"name": "d12_5"
},
{
"name": "d126"
"name": "d12_6"
},
{
"name": "d127"
"name": "d12_7"
},
{
"name": "d128"
"name": "d12_8"
},
{
"name": "d129"
"name": "d12_9"
},
{
"name": "d201"
"name": "d20_1"
},
{
"name": "d2010"
"name": "d20_10"
},
{
"name": "d2011"
"name": "d20_11"
},
{
"name": "d2012"
"name": "d20_12"
},
{
"name": "d2013"
"name": "d20_13"
},
{
"name": "d2014"
"name": "d20_14"
},
{
"name": "d2015"
"name": "d20_15"
},
{
"name": "d2016"
"name": "d20_16"
},
{
"name": "d2017"
"name": "d20_17"
},
{
"name": "d2018"
"name": "d20_18"
},
{
"name": "d2019"
"name": "d20_19"
},
{
"name": "d202"
"name": "d20_2"
},
{
"name": "d2020"
"name": "d20_20"
},
{
"name": "d203"
"name": "d20_3"
},
{
"name": "d204"
"name": "d20_4"
},
{
"name": "d205"
"name": "d20_5"
},
{
"name": "d206"
"name": "d20_6"
},
{
"name": "d207"
"name": "d20_7"
},
{
"name": "d208"
"name": "d20_8"
},
{
"name": "d209"
"name": "d20_9"
},
{
"name": "d41"
"name": "d4_1"
},
{
"name": "d42"
"name": "d4_2"
},
{
"name": "d43"
"name": "d4_3"
},
{
"name": "d44"
"name": "d4_4"
},
{
"name": "d61"
"name": "d6_1"
},
{
"name": "d62"
"name": "d6_2"
},
{
"name": "d63"
"name": "d6_3"
},
{
"name": "d64"
"name": "d6_4"
},
{
"name": "d65"
"name": "d6_5"
},
{
"name": "d66"
"name": "d6_6"
},
{
"name": "d81"
"name": "d8_1"
},
{
"name": "d82"
"name": "d8_2"
},
{
"name": "d83"
"name": "d8_3"
},
{
"name": "d84"
"name": "d8_4"
},
{
"name": "d85"
"name": "d8_5"
},
{
"name": "d86"
"name": "d8_6"
},
{
"name": "d87"
"name": "d8_7"
},
{
"name": "d88"
"name": "d8_8"
},
{
"name": "dicebag"

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.1 KiB