Better melee combat (#542)

* - add: NextMobAttack, EquipCooldown.

* - fix: Some combat fixes.

* - add: Telebaton.

* - add: Stun baton rework.

* - tweak: Reduce melee range.

* - add: Rework melee block system.

* - add: ExaminedEvent.
This commit is contained in:
Aviu00
2024-08-02 11:50:26 +00:00
committed by GitHub
parent 6ca036189e
commit 27268d4e28
83 changed files with 772 additions and 222 deletions

Binary file not shown.

View File

@@ -0,0 +1,5 @@
ent-Telebaton = телескопическая дубинка
.desc = Компактное, но надежное оружие личной обороны. В сложенном состоянии может быть скрыто.
comp-telebaton-examined-on = Дубинка в боевом положении.
comp-telebaton-examined-off = Дубинка сложена.

View File

@@ -17,3 +17,8 @@ carry-start = { $carrier } пытается взять вас на руки!
alerts-knockdown-name = Лежу
alerts-knockdown-desc = Не могу встать.
melee-block-event-blocked = заблокировал!
alerts-blocked-name = Атака заблокирована
alerts-blocked-desc = Невозможно блокировать некоторое время.
melee-block-component-delay = Может блокировать атаку ближнего боя каждые {$delay} секунд.

View File

@@ -20,6 +20,7 @@
- alertType: Corporeal
- alertType: Stun
- alertType: Knockdown
- alertType: RecentlyBlocked
- category: Breathing # Vox gang not calling this oxygen
- category: Pressure
- alertType: Bleed
@@ -494,6 +495,13 @@
name: alerts-knockdown-name
description: alerts-knockdown-desc
# WD-EDIT
- type: alert
id: RecentlyBlocked
icons: [ /Textures/Objects/Weapons/Melee/shields.rsi/buckler-icon.png ]
name: alerts-blocked-name
description: alerts-blocked-desc
# WD-EDIT
- type: alert
id: Bleeding

View File

@@ -66,6 +66,7 @@
contents:
- id: BoxSurvival
- id: Flash
- id: Telebaton
#- name: StationCharter
#- name: TelescopicBaton
- type: entity
@@ -77,6 +78,7 @@
contents:
- id: BoxSurvivalEngineering
- id: Flash
- id: Telebaton
#- id: TelescopicBaton
- type: entity
@@ -88,6 +90,7 @@
contents:
- id: BoxSurvival
- id: Flash
- id: Telebaton
#- id: TelescopicBaton
- type: entity
@@ -99,6 +102,7 @@
contents:
- id: BoxSurvival
- id: Flash
- id: Telebaton
#- id: TelescopicBaton
- type: entity
@@ -110,6 +114,7 @@
contents:
- id: BoxSurvival
- id: Flash
- id: Telebaton
#- id: TelescopicBaton
- type: entity
@@ -121,6 +126,7 @@
contents:
- id: BoxSurvivalMedical
- id: Flash
- id: Telebaton
#- id: TelescopicBaton
- type: entity
@@ -132,6 +138,7 @@
contents:
- id: BoxSurvival
- id: Flash
- id: Telebaton
#- id: TelescopicBaton
- type: entity

View File

@@ -75,6 +75,7 @@
contents:
- id: BoxSurvival
- id: Flash
- id: Telebaton
#- name: StationCharter
#- name: TelescopicBaton
- type: entity
@@ -86,6 +87,7 @@
contents:
- id: BoxSurvivalEngineering
- id: Flash
- id: Telebaton
#- id: TelescopicBaton
- type: entity
@@ -97,6 +99,7 @@
contents:
- id: BoxSurvival
- id: Flash
- id: Telebaton
#- id: TelescopicBaton
- type: entity
@@ -108,6 +111,7 @@
contents:
- id: BoxSurvival
- id: Flash
- id: Telebaton
#- id: TelescopicBaton
- type: entity
@@ -119,6 +123,7 @@
contents:
- id: BoxSurvivalMedical
- id: Flash
- id: Telebaton
#- id: TelescopicBaton
- type: entity
@@ -130,6 +135,7 @@
contents:
- id: BoxSurvival
- id: Flash
- id: Telebaton
#- id: TelescopicBaton
- type: entity

View File

@@ -103,6 +103,7 @@
contents:
- id: BoxSurvival
- id: Flash
- id: Telebaton
#- name: StationCharter
#- name: TelescopicBaton
- type: entity
@@ -114,6 +115,7 @@
contents:
- id: BoxSurvivalEngineering
- id: Flash
- id: Telebaton
#- id: TelescopicBaton
- type: entity
@@ -125,6 +127,7 @@
contents:
- id: BoxSurvival
- id: Flash
- id: Telebaton
#- id: TelescopicBaton
- type: entity
@@ -136,6 +139,7 @@
contents:
- id: BoxSurvival
- id: Flash
- id: Telebaton
#- id: TelescopicBaton
- type: entity
@@ -147,6 +151,7 @@
contents:
- id: BoxSurvivalMedical
- id: Flash
- id: Telebaton
#- id: TelescopicBaton
- type: entity
@@ -158,6 +163,7 @@
contents:
- id: BoxSurvival
- id: Flash
- id: Telebaton
#- id: TelescopicBaton
- type: entity
@@ -180,6 +186,7 @@
contents:
- id: BoxSurvivalSecurity
- id: Flash
- id: Telebaton
- type: entity
noSpawn: true

View File

@@ -23,6 +23,7 @@
- type: Item
size: Small
- type: MeleeWeapon
canBeBlocked: false
soundNoDamage:
path: "/Audio/Effects/Fluids/splat.ogg"
damage:

View File

@@ -16,6 +16,7 @@
- type: Sprite
state: icon
- type: MeleeWeapon
canBeBlocked: false
soundNoDamage:
path: "/Audio/Effects/Fluids/splat.ogg"
damage:

View File

@@ -48,6 +48,7 @@
- type: Spillable
solution: drink
- type: MeleeWeapon
canBeBlocked: false
soundNoDamage:
path: "/Audio/Effects/Fluids/splat.ogg"
damage:

View File

@@ -62,6 +62,7 @@
- type: Spillable
solution: drink
- type: MeleeWeapon
canBeBlocked: false
soundNoDamage:
path: "/Audio/Effects/Fluids/splat.ogg"
damage:

View File

@@ -20,6 +20,7 @@
maxTransferAmount: 5
- type: Drink
- type: MeleeWeapon
canBeBlocked: false
soundNoDamage:
path: "/Audio/Effects/Fluids/splat.ogg"
damage:

View File

@@ -62,6 +62,7 @@
acts: [ "Destruction" ]
# packet contents can be splashed when open
- type: MeleeWeapon
canBeBlocked: false
soundNoDamage:
path: "/Audio/Effects/Fluids/splat.ogg"
damage:

View File

@@ -31,6 +31,7 @@
solution: food
# soup weapon!
- type: MeleeWeapon
canBeBlocked: false
soundNoDamage:
path: "/Audio/Effects/Fluids/splat.ogg"
damage:

View File

@@ -29,6 +29,7 @@
- type: UseDelay
delay: 1.0
- type: MeleeWeapon
canBeBlocked: false
wideAnimationRotation: 180
soundHit:
collection: ToySqueak
@@ -992,6 +993,7 @@
sprite: Objects/Fun/toys.rsi
state: foamblade
- type: MeleeWeapon
canBeBlocked: false
attackRate: 1.5
angle: 0
animation: WeaponArcThrust
@@ -1325,6 +1327,7 @@
sprite: Objects/Weapons/Melee/cutlass.rsi
state: foam_icon
- type: MeleeWeapon
canBeBlocked: false
attackRate: 1.5
range: 2.0
angle: 0
@@ -1383,6 +1386,7 @@
- type: DisarmMalus
malus: 0
- type: MeleeWeapon
canBeBlocked: false
soundHit:
collection: RubberHammer
params:
@@ -1424,6 +1428,7 @@
params:
variation: 0.125
- type: MeleeWeapon
canBeBlocked: false
soundHit:
collection: Parp
params:

View File

@@ -17,6 +17,7 @@
tags:
- Handcuffs
- type: MeleeWeapon
canBeBlocked: false
wideAnimationRotation: 90
resetOnHandSelected: false
animation: WeaponArcDisarm

View File

@@ -30,6 +30,7 @@
Slash: 1
Piercing: 1
Heat: 1
- type: MeleeBlock
- type: Damageable
damageContainer: Shield
- type: Destructible
@@ -412,6 +413,7 @@
description: Exotic energy shield, when folded, can even fit in your pocket.
components:
- type: ItemToggle
predictable: false # WD EDIT
soundActivate:
path: /Audio/Weapons/ebladeon.ogg
soundDeactivate:
@@ -420,10 +422,9 @@
path: /Audio/Machines/button.ogg
params:
variation: 0.250
# Causes sound issues in combination with Rechargeable
#- type: ItemToggleActiveSound
# activeSound:
# path: /Audio/Weapons/ebladehum.ogg
- type: ItemToggleActiveSound
activeSound:
path: /Audio/Weapons/ebladehum.ogg
- type: ItemToggleSize
activatedSize: Huge
- type: ItemToggleDisarmMalus
@@ -480,6 +481,7 @@
flatReductions:
Heat: 1
Piercing: 1
- type: MeleeBlock
- type: Appearance
- type: Damageable
damageContainer: Shield

View File

@@ -250,6 +250,7 @@
- type: Spillable
solution: absorbed
- type: MeleeWeapon
canBeBlocked: false
soundNoDamage:
path: "/Audio/Effects/Fluids/splat.ogg"
damage:

View File

@@ -78,6 +78,7 @@
- type: Label
originalName: jug
- type: MeleeWeapon
canBeBlocked: false
soundNoDamage:
path: "/Audio/Effects/Fluids/splat.ogg"
damage:

View File

@@ -51,6 +51,7 @@
- type: Spillable
solution: drink
- type: MeleeWeapon
canBeBlocked: false
soundNoDamage:
path: "/Audio/Effects/Fluids/splat.ogg"
damage:

View File

@@ -57,6 +57,7 @@
shape:
- 0,0,0,0
- type: MeleeWeapon
canBeBlocked: false
soundNoDamage:
path: "/Audio/Effects/Fluids/splat.ogg"
damage:

View File

@@ -16,6 +16,7 @@
- type: Item
sprite: Objects/Specific/Chemistry/beaker.rsi
- type: MeleeWeapon
canBeBlocked: false
soundNoDamage:
path: "/Audio/Effects/Fluids/splat.ogg"
damage:
@@ -108,6 +109,7 @@
- type: Item
sprite: Objects/Specific/Chemistry/beaker.rsi
- type: MeleeWeapon
canBeBlocked: false
soundNoDamage:
path: "/Audio/Effects/Fluids/splat.ogg"
damage:

View File

@@ -36,6 +36,7 @@
- key: enum.TransferAmountUiKey.Key
type: TransferAmountBoundUserInterface
- type: MeleeWeapon
canBeBlocked: false
soundNoDamage:
path: "/Audio/Effects/Fluids/splat.ogg"
damage:

View File

@@ -74,6 +74,7 @@
Quantity: 8
maxVol: 8 #uses less fuel than a welder, so this isnt as bad as it looks
- type: MeleeWeapon
canBeBlocked: false
wideAnimationRotation: 180
damage:
types:
@@ -201,6 +202,7 @@
- state: zippo-inhand-right-flame
shader: unshaded
- type: MeleeWeapon
canBeBlocked: false
wideAnimationRotation: 180
damage:
types:

View File

@@ -27,6 +27,8 @@
critChance: 50
critMultiplier: 2
isBloodDagger: true
- type: MeleeBlock
delay: 12.1
- type: entity
name: предательский нож
@@ -61,3 +63,5 @@
- type: Backstab
- type: Blink
blinkRate: 0.33
- type: MeleeBlock
delay: 12.1

View File

@@ -84,6 +84,12 @@
- Energy
- type: IgnitionSource
temperature: 700
- type: MeleeBlock
delay: 6.1
blockSound:
path: /Audio/Weapons/eblade1.ogg
params:
variation: 0.250
- type: entity
name: energy sword
@@ -199,6 +205,8 @@
- id: EnergyDagger
sound:
path: /Audio/Effects/unwrap.ogg
- type: MeleeBlock
delay: 12.1
- type: entity
name: energy cutlass
@@ -267,6 +275,8 @@
deconstructionTarget: null
graph: EnergyDoubleSwordGraph
node: desword
- type: MeleeBlock
delay: 3.1
- type: entity
parent: EnergySwordBase

View File

@@ -42,7 +42,7 @@
animation: WeaponArcThrust
soundHit:
path: /Audio/Weapons/bladeslice.ogg
range: 2 # Spears are long
range: 1.8 # Spears are long
- type: DamageOtherOnHit
damage:
types:

View File

@@ -1,14 +1,11 @@
- type: entity
name: stun prod
parent: BaseItem
id: Stunprod
id: StunprodBase
description: A stun prod for illegal incapacitation.
abstract: true
noSpawn: true
components:
- type: Sprite
sprite: Objects/Weapons/Melee/stunprod.rsi
layers:
- state: stunprod_nocell
map: [ "enum.ToggleVisuals.Layer" ]
- type: ItemToggle
soundActivate:
collection: sparks
@@ -27,41 +24,36 @@
types:
Blunt: 0
- type: Stunprod
- type: DelayedKnockdownOnHit
delay: 4
- type: MeleeWeapon
attackRate: 0.4
canHeavyAttack: false
equipCooldown: 1
wideAnimationRotation: -135
damage:
types:
Blunt: 9
Blunt: 12
angle: 0
animation: WeaponArcThrust
- type: StaminaDamageOnHit
damage: 40
damage: 60
sound: /Audio/Weapons/egloves.ogg
- type: StaminaDamageOnCollide
damage: 40
damage: 30
sound: /Audio/Weapons/egloves.ogg
- type: UseDelay
- type: Item
heldPrefix: off
size: Normal
- type: Clothing
sprite: Objects/Weapons/Melee/stunprod.rsi
quickEquip: false
slots:
- back
shape:
- 0,0,2,0
storedRotation: 44
- type: DisarmMalus
malus: 0.225
- type: Appearance
- type: GenericVisualizer
visuals:
enum.ToggleVisuals.Toggled:
enum.ToggleVisuals.Layer:
nocell: {state: stunprod_nocell}
True: {state: stunprod_on}
False: {state: stunprod_off}
- type: StaticPrice
price: 100
price: 40
- type: PowerCellSlot
cellSlotId: cell_slot
- type: ItemSlots
@@ -71,6 +63,32 @@
- type: ContainerContainer
containers:
cell_slot: !type:ContainerSlot {}
- type: entity
name: stun prod
parent: StunprodBase
id: Stunprod
description: A stun prod for illegal incapacitation.
components:
- type: Sprite
sprite: Objects/Weapons/Melee/stunprod.rsi
layers:
- state: stunprod_nocell
map: [ "enum.ToggleVisuals.Layer" ]
- type: Item
sprite: Objects/Weapons/Melee/stunprod.rsi
- type: Clothing
sprite: Objects/Weapons/Melee/stunprod.rsi
quickEquip: false
slots:
- back
- type: GenericVisualizer
visuals:
enum.ToggleVisuals.Toggled:
enum.ToggleVisuals.Layer:
nocell: {state: stunprod_nocell}
True: {state: stunprod_on}
False: {state: stunprod_off}
- type: Construction
deconstructionTarget: cuffs
graph: StunprodGraph

View File

@@ -31,6 +31,8 @@
tags:
- CaptainSabre
- type: DisarmMalus
- type: MeleeBlock
delay: 6.1
- type: entity
name: katana
@@ -94,6 +96,8 @@
- Belt
- SuitStorage
- type: Reflect
- type: MeleeBlock
delay: 6.1
- type: entity
name: machete

View File

@@ -10,7 +10,7 @@
- state: stunbaton_off
map: [ "enum.ToggleVisuals.Layer" ]
- type: Stunbaton
energyPerUse: 50
energyPerUse: 100
- type: ItemToggle
predictable: false
soundActivate:
@@ -30,19 +30,20 @@
types:
Blunt: 0
- type: MeleeWeapon
attackRate: 1.25
attackRate: 0.4
canHeavyAttack: false
equipCooldown: 1
wideAnimationRotation: -135
damage:
types:
Blunt: 7
Blunt: 12
bluntStaminaDamageFactor: 2.0
angle: 60
- type: StaminaDamageOnHit
damage: 40
damage: 60
sound: /Audio/Weapons/egloves.ogg
- type: StaminaDamageOnCollide
damage: 40
damage: 30
sound: /Audio/Weapons/egloves.ogg
- type: ExaminableBattery
- type: Battery
@@ -87,7 +88,8 @@
- type: GuideHelp
guides:
- Security
- type: StunLock # Wd EDIT
- type: StunLock # WD EDIT
- type: DelayedKnockdownOnHit # WD EDIT
- type: entity
name: truncheon
@@ -142,6 +144,7 @@
maxCharges: 7
charges: 7
- type: MeleeWeapon
canBeBlocked: false
canHeavyAttack: false
wideAnimationRotation: 180
damage:

View File

@@ -9,6 +9,7 @@
- type: Item
size: Ginormous
- type: MeleeWeapon
canBeBlocked: false
canHeavyAttack: false
canMiss: false
attackRate: 2

View File

@@ -35,14 +35,17 @@
animation: WeaponArcThrust
soundHit:
path: /Audio/Weapons/bladeslice.ogg
range: 2
range: 1.8
- type: DamageOtherOnHit
damage:
types:
Piercing: 40
- type: Item
sprite: White/Cult/Entities/blood_spear.rsi
size: Ginormous
storedRotation: 44
size: Huge
shape:
- 0,0,5,0
- type: Clothing
slots:
- back

View File

@@ -265,7 +265,7 @@
- type: MeleeWeapon
soundHit:
path: /Audio/White/Items/hit/chainhit.ogg
range: 2.5
range: 2.2
damage:
types:
Blunt: 18
@@ -309,6 +309,7 @@
- type: UseDelay
- type: DisarmMalus
- type: MeleeBlock
delay: 6.1
- type: HolyWeapon
- type: entity
@@ -348,7 +349,6 @@
animation: WeaponArcThrust
soundHit:
path: /Audio/Weapons/bladeslice.ogg
range: 2
- type: DamageOtherOnHit
damage:
types:

View File

@@ -9,16 +9,6 @@
- type: Sprite
sprite: White/Objects/Weapons/experimental_stunbaton.rsi
- type: Stunbaton
- type: MeleeWeapon
damage:
types:
Blunt: 10
bluntStaminaDamageFactor: 2.0
angle: 70
- type: StaminaDamageOnHit
damage: 45
- type: StaminaDamageOnCollide
damage: 45
- type: Battery
maxCharge: 2000
startingCharge: 2000

View File

@@ -1,5 +1,5 @@
- type: entity
parent: BaseItem
parent: StunprodBase
id: Snatcherprod
name: хваталка
description: Искрится жаждой воровства и коварства.
@@ -9,48 +9,8 @@
layers:
- state: snatcherprod_nocell
map: [ "enum.ToggleVisuals.Layer" ]
- type: ItemToggle
soundActivate:
collection: sparks
params:
variation: 0.250
soundDeactivate:
collection: sparks
params:
variation: 0.250
soundFailToActivate:
path: /Audio/Machines/button.ogg
params:
variation: 0.250
- type: ItemToggleMeleeWeapon
activatedDamage:
types:
Blunt: 0
- type: MeleeWeapon
canHeavyAttack: false
wideAnimationRotation: -135
damage:
types:
Blunt: 9
angle: 0
animation: WeaponArcThrust
- type: StaminaDamageOnHit
damage: 40
sound: /Audio/Weapons/egloves.ogg
- type: StaminaDamageOnCollide
damage: 40
sound: /Audio/Weapons/egloves.ogg
- type: UseDelay
- type: Item
heldPrefix: off
size: Normal
- type: Clothing
quickEquip: false
slots:
- back
- type: DisarmMalus
malus: 0.225
- type: Appearance
sprite: White/Objects/Weapons/snatcherprod.rsi
- type: GenericVisualizer
visuals:
enum.ToggleVisuals.Toggled:
@@ -58,19 +18,7 @@
nocell: {state: snatcherprod_nocell}
True: {state: snatcherprod_on}
False: {state: snatcherprod_off}
- type: StaticPrice
price: 100
- type: PowerCellSlot
cellSlotId: cell_slot
- type: ItemSlots
slots:
cell_slot:
name: power-cell-slot-component-slot-name-default
- type: ContainerContainer
containers:
cell_slot: !type:ContainerSlot {}
- type: Snatcherprod
- type: Stunprod
- type: Construction
deconstructionTarget: cuffs
graph: StunprodGraph
@@ -86,7 +34,10 @@
sprite: White/Objects/Weapons/prod.rsi
state: prod_unfinished
- type: Item
size: Normal
size: Small
shape:
- 0,0,1,0
storedRotation: 44
- type: Construction
deconstructionTarget: cuffs
graph: StunprodGraph

View File

@@ -0,0 +1,61 @@
- type: entity
id: Telebaton
name: telescopic baton
parent: BaseItem
description: A compact yet robust personal defense weapon. Can be concealed when folded.
components:
- type: ItemToggle
soundActivate:
path: /Audio/Weapons/telescopicon.ogg
params:
volume: -5
soundDeactivate:
path: /Audio/Weapons/telescopicoff.ogg
params:
volume: -5
- type: ItemToggleSize
activatedSize: Large
activatedShape:
- 0, 0, 3, 0
- type: DisarmMalus
malus: 0.225
- type: Sprite
sprite: White/Objects/Weapons/telebaton.rsi
layers:
- state: telebaton_off
map: [ "enum.ToggleVisuals.Layer" ]
- type: ItemToggleMeleeWeapon
activatedDamage:
types:
Blunt: 12
deactivatedSecret: true
- type: MeleeWeapon
canHeavyAttack: false
equipCooldown: 1
attackRate: 0.25
wideAnimationRotation: -135
damage:
types:
Blunt: 0
bluntStaminaDamageFactor: 0.0 # so blunt doesn't deal stamina damage at all
- type: StaminaDamageOnHit
damage: 55
sound: /Audio/White/Weapons/woodhit.ogg
- type: UseDelay
- type: Item
heldPrefix: off
sprite: White/Objects/Weapons/telebaton.rsi
size: Small
storedRotation: 44
shape:
- 0, 0, 1, 0
- type: Appearance
- type: GenericVisualizer
visuals:
enum.ToggleVisuals.Toggled:
enum.ToggleVisuals.Layer:
True: {state: telebaton_on}
False: {state: telebaton_off}
- type: StaticPrice
price: 150
- type: Telebaton

View File

@@ -395,6 +395,7 @@
- type: UseDelay
delay: 2
- type: MeleeWeapon
canBeBlocked: false
soundHit:
path: /Audio/White/Fluff/Omntns/gavel.ogg
damage:
@@ -726,6 +727,7 @@
Quantity: 1
maxVol: 1
- type: MeleeWeapon
canBeBlocked: false
damage:
types:
Blunt: 0 #this feels hacky, but is needed for burn damage while active (i think)

View File

@@ -20,5 +20,6 @@
sound:
path: /Textures/White/Fluff/Forg/ryan.ogg
- type: MeleeWeapon
canBeBlocked: false
soundHit:
path: /Audio/Items/Toys/weh.ogg

View File

@@ -24,6 +24,8 @@
storedRotation: 44
shape:
- 0, 0, 3, 0
- type: MeleeBlock
delay: 6.1
- type: entity
name: клинок заклинаний
@@ -55,6 +57,8 @@
inHandsOnly: true
closeOnHandDeselect: true
- type: SpellBlade
- type: MeleeBlock
delay: 6.1
- type: entity
name: мьёльнир

View File

@@ -289,7 +289,7 @@
description: spellbook-hfrequency-desc
productEntity: HighFrequencyBlade
cost:
SpellPoint: 1
SpellPoint: 2
categories:
- MagicItems
conditions:
@@ -302,7 +302,7 @@
description: spellbook-spellblade-desc
productEntity: SpellBlade
cost:
SpellPoint: 1
SpellPoint: 2
categories:
- MagicItems
conditions:

View File

@@ -82,5 +82,10 @@
id: Incorporeal
alwaysAllowed: true
- type: statusEffect
id: RecentlyBlocked
alwaysAllowed: true
alert: RecentlyBlocked
- type: statusEffect
id: BloodLoss

View File

@@ -0,0 +1,25 @@
{
"version": 1,
"license": "CC-BY-SA-3.0",
"copyright": "Taken from tgstation at commit https://github.com/tgstation/tgstation/commit/4397d63a55dac7d0536eb9bcc0a0f68634858c50",
"size": {
"x": 32,
"y": 32
},
"states": [
{
"name": "telebaton_off"
},
{
"name": "telebaton_on"
},
{
"name": "on-inhand-left",
"directions": 4
},
{
"name": "on-inhand-right",
"directions": 4
}
]
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 356 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 366 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 202 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 252 B