From 635c0ce99c639a4368bbad62fdf2c0352a67c068 Mon Sep 17 00:00:00 2001
From: Ed <96445749+TheShuEd@users.noreply.github.com>
Date: Sun, 14 Apr 2024 18:31:23 +0300
Subject: [PATCH] Fire spreading (#92)
* fire update
* add flammable to more ent, add floors
* add cool fire sprites, noSpawn tiles
* fix floor collider
* floor resprite
* Update floors.yml
* fixes
* Update tables.yml
---
.../Temperature/CPFireSpreadComponent.cs | 39 ++++++
.../_CP14/Temperature/CPFireSpreadSystem.cs | 60 +++++++++
.../_CP14/DayCycle/DayCycleComponent.cs | 2 +-
.../_CP14/DayCycle/DayCycleSystem.cs | 22 ++--
.../Entities/Objects/Misc/tiles.yml | 66 ++++++++++
.../Entities/Structures/Floors/floors.yml | 115 ++++++++++++++++++
.../Entities/Structures/Furniture/chairs.yml | 26 ++--
.../Entities/Structures/Furniture/tables.yml | 32 +++--
.../Structures/Storage/Crates/chests.yml | 18 ++-
.../_CP14/Entities/Structures/Walls/walls.yml | 37 +++++-
Resources/Prototypes/_CP14/Entities/base.yml | 38 ++++++
.../Textures/_CP14/Effects/fire.rsi/full.png | Bin 0 -> 5606 bytes
.../Textures/_CP14/Effects/fire.rsi/meta.json | 32 +++++
.../Textures/_CP14/Effects/fire.rsi/small.png | Bin 0 -> 2083 bytes
.../Structures/Floors/wood.rsi/wood_1.png | Bin 1137 -> 1210 bytes
.../Structures/Floors/wood.rsi/wood_2.png | Bin 1129 -> 1289 bytes
.../Structures/Floors/wood.rsi/wood_3.png | Bin 1154 -> 1174 bytes
.../Structures/Floors/wood.rsi/wood_4.png | Bin 1127 -> 1162 bytes
.../Floors/wood_big.rsi/wood_big_1.png | Bin 945 -> 935 bytes
.../Floors/wood_big.rsi/wood_big_2.png | Bin 945 -> 935 bytes
.../Floors/wood_big.rsi/wood_big_3.png | Bin 945 -> 935 bytes
.../Floors/wood_big.rsi/wood_big_4.png | Bin 945 -> 935 bytes
22 files changed, 451 insertions(+), 36 deletions(-)
create mode 100644 Content.Server/_CP14/Temperature/CPFireSpreadComponent.cs
create mode 100644 Content.Server/_CP14/Temperature/CPFireSpreadSystem.cs
create mode 100644 Resources/Prototypes/_CP14/Entities/Structures/Floors/floors.yml
create mode 100644 Resources/Prototypes/_CP14/Entities/base.yml
create mode 100644 Resources/Textures/_CP14/Effects/fire.rsi/full.png
create mode 100644 Resources/Textures/_CP14/Effects/fire.rsi/meta.json
create mode 100644 Resources/Textures/_CP14/Effects/fire.rsi/small.png
diff --git a/Content.Server/_CP14/Temperature/CPFireSpreadComponent.cs b/Content.Server/_CP14/Temperature/CPFireSpreadComponent.cs
new file mode 100644
index 0000000000..c3c193dd17
--- /dev/null
+++ b/Content.Server/_CP14/Temperature/CPFireSpreadComponent.cs
@@ -0,0 +1,39 @@
+namespace Content.Server._CP14.Temperature;
+
+///
+/// A component that allows fire to spread to nearby objects. The basic mechanics of a spreading fire
+///
+
+[RegisterComponent, Access(typeof(CPFireSpreadSystem))]
+public sealed partial class CPFireSpreadComponent : Component
+{
+ ///
+ /// radius of ignition of neighboring objects
+ ///
+ [DataField]
+ public float Radius = 1f;
+
+ ///
+ /// chance of spreading to neighboring properties
+ ///
+ [DataField]
+ public float Prob = 0.5f;
+
+ ///
+ /// how often objects will try to set the neighbors on fire. In Seconds
+ ///
+ [DataField]
+ public float SpreadCooldownMin = 3f;
+
+ ///
+ /// how often objects will try to set the neighbors on fire. In Seconds
+ ///
+ [DataField]
+ public float SpreadCooldownMax = 7f;
+
+ ///
+ /// the time of the next fire spread
+ ///
+ [DataField]
+ public TimeSpan NextSpreadTime { get; set; } = TimeSpan.Zero;
+}
diff --git a/Content.Server/_CP14/Temperature/CPFireSpreadSystem.cs b/Content.Server/_CP14/Temperature/CPFireSpreadSystem.cs
new file mode 100644
index 0000000000..9ab1027612
--- /dev/null
+++ b/Content.Server/_CP14/Temperature/CPFireSpreadSystem.cs
@@ -0,0 +1,60 @@
+using Content.Server.Atmos.Components;
+using Content.Server.Atmos.EntitySystems;
+using Content.Server.CrystallPunk.Temperature;
+using Robust.Shared.Random;
+using Robust.Shared.Timing;
+
+namespace Content.Server._CP14.Temperature;
+
+public sealed partial class CPFireSpreadSystem : EntitySystem
+{
+
+ [Dependency] private readonly FlammableSystem _flammable = default!;
+ [Dependency] private readonly IGameTiming _gameTiming = default!;
+ [Dependency] private readonly EntityLookupSystem _lookup = default!;
+ [Dependency] private readonly SharedTransformSystem _transform = default!;
+ [Dependency] private readonly IRobustRandom _random = default!;
+
+
+ public override void Initialize()
+ {
+ SubscribeLocalEvent (OnCompInit);
+ }
+
+ private void OnCompInit(Entity ent, ref OnFireChangedEvent args)
+ {
+ if (!args.OnFire)
+ return;
+
+ var cooldown = _random.NextFloat(ent.Comp.SpreadCooldownMin, ent.Comp.SpreadCooldownMax);
+ ent.Comp.NextSpreadTime = _gameTiming.CurTime + TimeSpan.FromSeconds(cooldown);
+ }
+
+ public override void Update(float frameTime)
+ {
+ base.Update(frameTime);
+
+ var query = EntityQueryEnumerator();
+ while (query.MoveNext(out var uid, out var spread, out var flammable))
+ {
+ if (!flammable.OnFire)
+ continue;
+
+ if (spread.NextSpreadTime < _gameTiming.CurTime) // Spread
+ {
+ var targets = _lookup.GetEntitiesInRange(_transform.GetMapCoordinates(uid), spread.Radius);
+
+ foreach (var target in targets)
+ {
+ if (!_random.Prob(spread.Prob))
+ continue;
+
+ _flammable.Ignite(target, uid);
+
+ var cooldown = _random.NextFloat(spread.SpreadCooldownMin, spread.SpreadCooldownMax);
+ spread.NextSpreadTime = _gameTiming.CurTime + TimeSpan.FromSeconds(cooldown);
+ }
+ }
+ }
+ }
+}
diff --git a/Content.Shared/_CP14/DayCycle/DayCycleComponent.cs b/Content.Shared/_CP14/DayCycle/DayCycleComponent.cs
index c48b9af9bf..8203f24bee 100644
--- a/Content.Shared/_CP14/DayCycle/DayCycleComponent.cs
+++ b/Content.Shared/_CP14/DayCycle/DayCycleComponent.cs
@@ -1,7 +1,7 @@
using Robust.Shared.Serialization;
-namespace Content.Shared.CrystallPunk.DayCycle;
+namespace Content.Shared._CP14.DayCycle;
///
/// Stores all the necessary data for the day and night cycle system to work
diff --git a/Content.Shared/_CP14/DayCycle/DayCycleSystem.cs b/Content.Shared/_CP14/DayCycle/DayCycleSystem.cs
index 31d8002dd3..f1ca774d8a 100644
--- a/Content.Shared/_CP14/DayCycle/DayCycleSystem.cs
+++ b/Content.Shared/_CP14/DayCycle/DayCycleSystem.cs
@@ -1,7 +1,7 @@
using Robust.Shared.Map.Components;
using Robust.Shared.Timing;
-namespace Content.Shared.CrystallPunk.DayCycle;
+namespace Content.Shared._CP14.DayCycle;
public sealed partial class DayCycleSystem : EntitySystem
{
@@ -26,7 +26,8 @@ public sealed partial class DayCycleSystem : EntitySystem
private void OnMapInitDayCycle(Entity dayCycle, ref MapInitEvent args)
{
- if (dayCycle.Comp.TimeEntries == null || dayCycle.Comp.TimeEntries.Count == 0) return;
+ if (dayCycle.Comp.TimeEntries.Count == 0)
+ return;
var currentEntry = dayCycle.Comp.TimeEntries[0];
@@ -41,7 +42,8 @@ public sealed partial class DayCycleSystem : EntitySystem
var dayCycleQuery = EntityQueryEnumerator();
while (dayCycleQuery.MoveNext(out var uid, out var dayCycle, out var mapLight))
{
- if (dayCycle.TimeEntries.Count <= 1) continue;
+ if (dayCycle.TimeEntries.Count <= 1)
+ continue;
var curEntry = dayCycle.CurrentTimeEntry;
var nextEntry = (curEntry + 1 >= dayCycle.TimeEntries.Count) ? 0 : (curEntry + 1);
@@ -62,7 +64,7 @@ public sealed partial class DayCycleSystem : EntitySystem
{
dayCycle.CurrentTimeEntry = nextEntry;
dayCycle.EntryStartTime = dayCycle.EntryEndTime;
- dayCycle.EntryEndTime = dayCycle.EntryEndTime + dayCycle.TimeEntries[nextEntry].Duration;
+ dayCycle.EntryEndTime += dayCycle.TimeEntries[nextEntry].Duration;
if (dayCycle.IsNight && !dayCycle.TimeEntries[curEntry].IsNight) // Day started
{
@@ -82,14 +84,12 @@ public sealed partial class DayCycleSystem : EntitySystem
public static float GetLerpValue(float start, float end, float current)
{
- if (start == end)
+ if (Math.Abs(start - end) < 0.05f)
return 0f;
- else
- {
- float distanceFromStart = current - start;
- float totalDistance = end - start;
- return MathHelper.Clamp01(distanceFromStart / totalDistance);
- }
+ var distanceFromStart = current - start;
+ var totalDistance = end - start;
+
+ return MathHelper.Clamp01(distanceFromStart / totalDistance);
}
}
diff --git a/Resources/Prototypes/Entities/Objects/Misc/tiles.yml b/Resources/Prototypes/Entities/Objects/Misc/tiles.yml
index 3b2e4cd8f1..59fc95d61c 100644
--- a/Resources/Prototypes/Entities/Objects/Misc/tiles.yml
+++ b/Resources/Prototypes/Entities/Objects/Misc/tiles.yml
@@ -45,6 +45,7 @@
name: steel tile
parent: FloorTileItemBase
id: FloorTileItemSteel
+ noSpawn: true
components:
- type: Sprite
state: steel
@@ -64,6 +65,7 @@
name: steel dark checker tile
parent: FloorTileItemSteel
id: FloorTileItemSteelCheckerDark
+ noSpawn: true
components:
- type: Sprite
state: checker-dark
@@ -76,6 +78,7 @@
name: steel light checker tile
parent: FloorTileItemSteel
id: FloorTileItemSteelCheckerLight
+ noSpawn: true
components:
- type: Sprite
state: checker-light
@@ -88,6 +91,7 @@
name: steel tile
parent: FloorTileItemBase
id: FloorTileItemMetalDiamond
+ noSpawn: true
components:
- type: Sprite
state: metaldiamond
@@ -107,6 +111,7 @@
name: wood floor
parent: FloorTileItemBase
id: FloorTileItemWood
+ noSpawn: true
components:
- type: Sprite
state: wood
@@ -126,6 +131,7 @@
name: white tile
parent: FloorTileItemBase
id: FloorTileItemWhite
+ noSpawn: true
components:
- type: Sprite
state: white
@@ -145,6 +151,7 @@
name: dark tile
parent: FloorTileItemBase
id: FloorTileItemDark
+ noSpawn: true
components:
- type: Sprite
state: dark
@@ -164,6 +171,7 @@
name: techmaint floor
parent: FloorTileItemBase
id: FloorTileItemTechmaint
+ noSpawn: true
components:
- type: Sprite
state: techfloor
@@ -180,6 +188,7 @@
name: reinforced tile
parent: FloorTileItemBase
id: FloorTileItemReinforced
+ noSpawn: true
components:
- type: Sprite
state: reinforced
@@ -198,6 +207,7 @@
name: mono tile
parent: FloorTileItemBase
id: FloorTileItemMono
+ noSpawn: true
components:
- type: Sprite
state: monofloor
@@ -214,6 +224,7 @@
name: linoleum floor
parent: FloorTileItemBase
id: FloorTileItemLino
+ noSpawn: true
components:
- type: Sprite
state: lino
@@ -230,6 +241,7 @@
name: filled brass plate
parent: FloorTileItemBase
id: FloorTileItemBrassFilled
+ noSpawn: true
components:
- type: Sprite
state: brass-filled
@@ -249,6 +261,7 @@
name: smooth brass plate
parent: FloorTileItemBase
id: FloorTileItemBrassReebe
+ noSpawn: true
components:
- type: Sprite
state: reebe
@@ -268,6 +281,7 @@
name: dirty tile
parent: FloorTileItemBase
id: FloorTileItemDirty
+ noSpawn: true
components:
- type: Sprite
state: dirty
@@ -284,6 +298,7 @@
name: elevator shaft tile
parent: FloorTileItemBase
id: FloorTileItemElevatorShaft
+ noSpawn: true
components:
- type: Sprite
state: dark
@@ -300,6 +315,7 @@
name: rock vault tile
parent: FloorTileItemBase
id: FloorTileItemRockVault
+ noSpawn: true
components:
- type: Sprite
state: rockvault
@@ -316,6 +332,7 @@
name: blue tile
parent: FloorTileItemBase
id: FloorTileItemBlue
+ noSpawn: true
components:
- type: Sprite
state: blue
@@ -332,6 +349,7 @@
name: lime tile
parent: FloorTileItemBase
id: FloorTileItemLime
+ noSpawn: true
components:
- type: Sprite
state: lime
@@ -348,6 +366,7 @@
name: mining tile
parent: FloorTileItemBase
id: FloorTileItemMining
+ noSpawn: true
components:
- type: Sprite
state: mining
@@ -364,6 +383,7 @@
name: dark mining tile
parent: FloorTileItemBase
id: FloorTileItemMiningDark
+ noSpawn: true
components:
- type: Sprite
state: miningdark
@@ -380,6 +400,7 @@
name: light mining tile
parent: FloorTileItemBase
id: FloorTileItemMiningLight
+ noSpawn: true
components:
- type: Sprite
state: mininglight
@@ -397,6 +418,7 @@
name: freezer tile
parent: FloorTileItemBase
id: FloorTileItemFreezer
+ noSpawn: true
components:
- type: Sprite
state: showroom
@@ -413,6 +435,7 @@
name: showroom tile
parent: FloorTileItemBase
id: FloorTileItemShowroom
+ noSpawn: true
components:
- type: Sprite
state: showroom
@@ -429,6 +452,7 @@
name: hydro tile
parent: FloorTileItemBase
id: FloorTileItemHydro
+ noSpawn: true
components:
- type: Sprite
state: hydro
@@ -445,6 +469,7 @@
name: bar tile
parent: FloorTileItemBase
id: FloorTileItemBar
+ noSpawn: true
components:
- type: Sprite
state: bar
@@ -461,6 +486,7 @@
name: clown tile
parent: FloorTileItemBase
id: FloorTileItemClown
+ noSpawn: true
components:
- type: Sprite
state: clown
@@ -477,6 +503,7 @@
name: mime tile
parent: FloorTileItemBase
id: FloorTileItemMime
+ noSpawn: true
components:
- type: Sprite
state: mime
@@ -493,6 +520,7 @@
name: kitchen tile
parent: FloorTileItemBase
id: FloorTileItemKitchen
+ noSpawn: true
components:
- type: Sprite
state: kitchen
@@ -509,6 +537,7 @@
name: laundry tile
parent: FloorTileItemBase
id: FloorTileItemLaundry
+ noSpawn: true
components:
- type: Sprite
state: laundry
@@ -525,6 +554,7 @@
- type: entity
parent: FloorTileItemBase
id: FloorTileItemConcrete
+ noSpawn: true
name: concrete tile
components:
- type: Sprite
@@ -542,6 +572,7 @@
parent: FloorTileItemBase
id: FloorTileItemGrayConcrete
name: gray concrete tile
+ noSpawn: true
components:
- type: Sprite
state: grayconcrete
@@ -558,6 +589,7 @@
parent: FloorTileItemBase
id: FloorTileItemOldConcrete
name: old concrete tile
+ noSpawn: true
components:
- type: Sprite
state: oldconcrete
@@ -575,6 +607,7 @@
name: blue arcade floor
parent: FloorTileItemBase
id: FloorTileItemArcadeBlue
+ noSpawn: true
components:
- type: Sprite
state: arcadeblue
@@ -591,6 +624,7 @@
name: blue arcade floor
parent: FloorTileItemBase
id: FloorTileItemArcadeBlue2
+ noSpawn: true
components:
- type: Sprite
state: arcadeblue2
@@ -607,6 +641,7 @@
name: red arcade floor
parent: FloorTileItemBase
id: FloorTileItemArcadeRed
+ noSpawn: true
components:
- type: Sprite
state: arcadered
@@ -623,6 +658,7 @@
name: eighties floor
parent: FloorTileItemBase
id: FloorTileItemEighties
+ noSpawn: true
components:
- type: Sprite
state: eighties
@@ -639,6 +675,7 @@
name: clown carpet floor
parent: FloorTileItemBase
id: FloorTileItemCarpetClown
+ noSpawn: true
components:
- type: Sprite
state: carpetclown
@@ -655,6 +692,7 @@
name: office carpet floor
parent: FloorTileItemBase
id: FloorTileItemCarpetOffice
+ noSpawn: true
components:
- type: Sprite
state: carpetoffice
@@ -671,6 +709,7 @@
name: boxing ring floor
parent: FloorTileItemBase
id: FloorTileItemBoxing
+ noSpawn: true
components:
- type: Sprite
state: boxing
@@ -687,6 +726,7 @@
name: gym floor
parent: FloorTileItemBase
id: FloorTileItemGym
+ noSpawn: true
components:
- type: Sprite
state: gym
@@ -704,6 +744,7 @@
name: white shuttle floor
parent: FloorTileItemBase
id: FloorTileItemShuttleWhite
+ noSpawn: true
components:
- type: Sprite
state: shuttlewhite
@@ -720,6 +761,7 @@
name: blue shuttle floor
parent: FloorTileItemBase
id: FloorTileItemShuttleBlue
+ noSpawn: true
components:
- type: Sprite
state: shuttleblue
@@ -736,6 +778,7 @@
name: orange shuttle floor
parent: FloorTileItemBase
id: FloorTileItemShuttleOrange
+ noSpawn: true
components:
- type: Sprite
state: shuttleorange
@@ -752,6 +795,7 @@
name: purple shuttle floor
parent: FloorTileItemBase
id: FloorTileItemShuttlePurple
+ noSpawn: true
components:
- type: Sprite
state: shuttlepurple
@@ -768,6 +812,7 @@
name: red shuttle floor
parent: FloorTileItemBase
id: FloorTileItemShuttleRed
+ noSpawn: true
components:
- type: Sprite
state: shuttlered
@@ -784,6 +829,7 @@
name: grey shuttle floor
parent: FloorTileItemBase
id: FloorTileItemShuttleGrey
+ noSpawn: true
components:
- type: Sprite
state: shuttlegrey
@@ -800,6 +846,7 @@
name: black shuttle floor
parent: FloorTileItemBase
id: FloorTileItemShuttleBlack
+ noSpawn: true
components:
- type: Sprite
state: shuttleblack
@@ -817,6 +864,7 @@
name: gold floor
parent: FloorTileItemBase
id: FloorTileItemGold
+ noSpawn: true
components:
- type: Sprite
state: gold
@@ -833,6 +881,7 @@
name: silver tile
parent: FloorTileItemBase
id: FloorTileItemSilver
+ noSpawn: true
components:
- type: Sprite
state: silver
@@ -850,6 +899,7 @@
name: green circuit floor
parent: FloorTileItemBase
id: FloorTileItemGCircuit
+ noSpawn: true
components:
- type: Sprite
state: gcircuit
@@ -866,6 +916,7 @@
name: blue circuit floor
parent: FloorTileItemBase
id: FloorTileItemBCircuit
+ noSpawn: true
components:
- type: Sprite
state: bcircuit
@@ -883,6 +934,7 @@
- type: entity
parent: FloorTileItemGCircuit
id: FloorTileItemGCircuit4
+ noSpawn: true
suffix: 4
components:
- type: Stack
@@ -891,6 +943,7 @@
- type: entity
parent: FloorTileItemBCircuit
id: FloorTileItemBCircuit4
+ noSpawn: true
suffix: 4
components:
- type: Stack
@@ -901,6 +954,7 @@
name: grass tile
parent: FloorTileItemBase
id: FloorTileItemGrass
+ noSpawn: true
components:
- type: Sprite
state: grass
@@ -917,6 +971,7 @@
name: jungle grass tile
parent: FloorTileItemBase
id: FloorTileItemGrassJungle
+ noSpawn: true
components:
- type: Sprite
state: grassjungle
@@ -933,6 +988,7 @@
name: snow tile
parent: FloorTileItemBase
id: FloorTileItemSnow
+ noSpawn: true
components:
- type: Sprite
state: snow
@@ -949,6 +1005,7 @@
name: wood pattern floor
parent: FloorTileItemBase
id: FloorTileItemWoodPattern
+ noSpawn: true
components:
- type: Sprite
state: woodpatternfloor
@@ -965,6 +1022,7 @@
id: FloorTileItemFlesh
parent: FloorTileItemBase
name: flesh floor
+ noSpawn: true
components:
- type: Sprite
state: meat
@@ -984,6 +1042,7 @@
name: steel maint floor
parent: FloorTileItemBase
id: FloorTileItemSteelMaint
+ noSpawn: true
components:
- type: Sprite
state: steelmaintfloor
@@ -1000,6 +1059,7 @@
name: grating maint floor
parent: FloorTileItemBase
id: FloorTileItemGratingMaint
+ noSpawn: true
components:
- type: Sprite
state: gratingmaintfloor
@@ -1016,6 +1076,7 @@
name: web tile
parent: FloorTileItemBase
id: FloorTileItemWeb
+ noSpawn: true
components:
- type: Sprite
sprite: Objects/Tiles/web.rsi
@@ -1036,6 +1097,7 @@
parent: FloorTileItemBase
name: astro-grass
description: Fake grass that covers up wires and even comes with realistic NanoTrimmings!
+ noSpawn: true
components:
- type: Sprite
state: astrograss
@@ -1053,6 +1115,7 @@
parent: FloorTileItemBase
name: mowed astro-grass
description: Fake grass that covers up wires and even comes with realistic NanoTrimmings!
+ noSpawn: true
components:
- type: Sprite
state: grass
@@ -1070,6 +1133,7 @@
parent: FloorTileItemBase
name: jungle astro-grass
description: Fake grass that covers up wires and even comes with realistic NanoTrimmings!
+ noSpawn: true
components:
- type: Sprite
state: grassjungle
@@ -1087,6 +1151,7 @@
parent: FloorTileItemBase
name: astro-ice
description: Fake ice that's as slippery as the real thing, while being easily removable!
+ noSpawn: true
components:
- type: Sprite
state: astroice
@@ -1104,6 +1169,7 @@
parent: FloorTileItemBase
name: astro-snow
description: Fake snow that's as fluffy as the real thing, while being easily removable!
+ noSpawn: true
components:
- type: Sprite
state: snow
diff --git a/Resources/Prototypes/_CP14/Entities/Structures/Floors/floors.yml b/Resources/Prototypes/_CP14/Entities/Structures/Floors/floors.yml
new file mode 100644
index 0000000000..91f3264354
--- /dev/null
+++ b/Resources/Prototypes/_CP14/Entities/Structures/Floors/floors.yml
@@ -0,0 +1,115 @@
+- type: entity
+ id: CPFloorBase
+ abstract: true
+ parent: BaseStructure
+ components:
+ - type: PlacementReplacement
+ key: CPfloor
+ - type: Sprite
+ drawdepth: FloorTiles
+ - type: Physics
+ - type: Transform
+ anchored: true
+ noRot: true
+ - type: BlockWeather
+ - type: Damageable
+ damageContainer: Inorganic
+ - type: Tag
+ tags:
+ - HideContextMenu
+ - type: Destructible
+ thresholds:
+ - trigger:
+ !type:DamageTrigger
+ damage: 10
+ behaviors:
+ - !type:DoActsBehavior
+ acts: [ "Destruction" ]
+ - type: Fixtures
+ fixtures:
+ fix1:
+ shape:
+ !type:PhysShapeAabb
+ bounds: "-0.45,-0.45,0.45,0.45"
+ density: 60
+ mask:
+ - MachineMask
+ layer:
+ - MidImpassable
+ - LowImpassable
+ hard: false
+
+- type: entity
+ id: CPFloorWood
+ parent:
+ - CPFloorBase
+ - CPBaseWooden
+ name: wooden floor
+ description: simple, flammable boards.
+ components:
+ - type: Sprite
+ sprite: _CP14/Structures/Floors/wood.rsi
+ layers:
+ - state: wood_1
+ map: ["random"]
+ - type: RandomSprite
+ available:
+ - random:
+ wood_1: ""
+ wood_2: ""
+ wood_3: ""
+ wood_4: ""
+ - type: FootstepModifier
+ footstepSoundCollection:
+ collection: FootstepFloor
+ params:
+ volume: 8
+ - type: Damageable
+ damageContainer: Inorganic
+ damageModifierSet: Wood
+ - type: Destructible
+ thresholds:
+ - trigger:
+ !type:DamageTypeTrigger
+ damageType: Heat
+ damage: 10
+ behaviors:
+ - !type:DoActsBehavior
+ acts: ["Destruction"]
+ - !type:PlaySoundBehavior
+ sound:
+ collection: WoodDestroy
+ - trigger:
+ !type:DamageTrigger
+ damage: 15
+ behaviors:
+ - !type:DoActsBehavior
+ acts: ["Destruction"]
+ - !type:PlaySoundBehavior
+ sound:
+ collection: WoodDestroy
+ - !type:SpawnEntitiesBehavior
+ spawn:
+ MaterialWoodPlank:
+ min: 0
+ max: 1
+ - type: FireVisuals
+ sprite: _CP14/Effects/fire.rsi
+ normalState: full
+
+- type: entity
+ parent: CPFloorWood
+ id: CPFloorWoodBig
+ components:
+ - type: Sprite
+ sprite: _CP14/Structures/Floors/wood_big.rsi
+ layers:
+ - state: wood_big_1
+ map: ["random"]
+ - type: RandomSprite
+ available:
+ - random:
+ wood_big_1: ""
+ wood_big_2: ""
+ wood_big_3: ""
+ wood_big_4: ""
\ No newline at end of file
diff --git a/Resources/Prototypes/_CP14/Entities/Structures/Furniture/chairs.yml b/Resources/Prototypes/_CP14/Entities/Structures/Furniture/chairs.yml
index adf52b7a04..79e6a4931d 100644
--- a/Resources/Prototypes/_CP14/Entities/Structures/Furniture/chairs.yml
+++ b/Resources/Prototypes/_CP14/Entities/Structures/Furniture/chairs.yml
@@ -2,21 +2,34 @@
name: wooden chair
description: Made of the most common planks. Simple and effective!
id: CPChairWooden
- parent: UnanchoredChairBase
+ parent:
+ - UnanchoredChairBase
+ - CPBaseWooden
components:
+ - type: Damageable
+ damageContainer: Inorganic
+ damageModifierSet: Wood
- type: Sprite
sprite: _CP14/Structures/Furniture/chairs.rsi
state: wooden
- type: Construction
graph: CPSeat
node: CPChairWooden
- - type: Damageable
- damageModifierSet: Wood
- type: Destructible
thresholds:
+ - trigger:
+ !type:DamageTypeTrigger
+ damageType: Heat
+ damage: 20
+ behaviors:
+ - !type:DoActsBehavior
+ acts: ["Destruction"]
+ - !type:PlaySoundBehavior
+ sound:
+ collection: WoodDestroy
- trigger:
!type:DamageTrigger
- damage: 25
+ damage: 30
behaviors:
- !type:DoActsBehavior
acts: ["Destruction"]
@@ -27,7 +40,4 @@
spawn:
MaterialWoodPlank:
min: 1
- max: 1
- - type: Tag
- tags:
- - Wooden
\ No newline at end of file
+ max: 1
\ No newline at end of file
diff --git a/Resources/Prototypes/_CP14/Entities/Structures/Furniture/tables.yml b/Resources/Prototypes/_CP14/Entities/Structures/Furniture/tables.yml
index 5c95275f56..1c0b0e8ea8 100644
--- a/Resources/Prototypes/_CP14/Entities/Structures/Furniture/tables.yml
+++ b/Resources/Prototypes/_CP14/Entities/Structures/Furniture/tables.yml
@@ -1,33 +1,41 @@
- type: entity
- parent: TableBase
+ parent:
+ - TableBase
+ - CPBaseWooden
id: CPTableWooden
name: wooden table
description: A simple table made of boards.
components:
- type: Sprite
sprite: _CP14/Structures/Furniture/Tables/wood.rsi
+ state: full
- type: Icon
sprite: _CP14/Structures/Furniture/Tables/wood.rsi
+ state: full
- type: Construction
graph: CPTable
node: CPTableWooden
- type: Damageable
+ damageContainer: Inorganic
damageModifierSet: Wood
- type: Destructible
thresholds:
- trigger:
- !type:DamageTrigger
- damage: 100
- behaviors: #excess damage (nuke?). avoid computational cost of spawning entities.
+ !type:DamageTypeTrigger
+ damageType: Heat
+ damage: 40
+ behaviors:
- !type:DoActsBehavior
- acts: [ "Destruction" ]
+ acts: ["Destruction"]
- !type:PlaySoundBehavior
sound:
- collection: GlassBreak
+ collection: WoodDestroy
- trigger:
!type:DamageTrigger
- damage: 15
+ damage: 60
behaviors:
+ - !type:DoActsBehavior
+ acts: ["Destruction"]
- !type:PlaySoundBehavior
sound:
collection: WoodDestroy
@@ -36,14 +44,12 @@
MaterialWoodPlank:
min: 1
max: 1
- - !type:DoActsBehavior
- acts: [ "Destruction" ]
- - type: Tag
- tags:
- - Wooden
- type: FootstepModifier
footstepSoundCollection:
collection: FootstepWood
- type: IconSmooth
key: state
- base: state
\ No newline at end of file
+ base: state
+ - type: FireVisuals
+ sprite: _CP14/Effects/fire.rsi
+ normalState: full
\ No newline at end of file
diff --git a/Resources/Prototypes/_CP14/Entities/Structures/Storage/Crates/chests.yml b/Resources/Prototypes/_CP14/Entities/Structures/Storage/Crates/chests.yml
index 36b2fcc13d..f26c6995c9 100644
--- a/Resources/Prototypes/_CP14/Entities/Structures/Storage/Crates/chests.yml
+++ b/Resources/Prototypes/_CP14/Entities/Structures/Storage/Crates/chests.yml
@@ -1,11 +1,14 @@
- type: entity
- parent: CPChestGeneric
+ parent:
+ - CPChestGeneric
+ - CPBaseWooden
id: CPWoodenChest
name: wooden chest
description: Good wooden chest.
components:
- type: Icon
sprite: _CP14/Structures/Storage/Crates/woodenchest.rsi
+ state: icon
- type: Sprite
sprite: _CP14/Structures/Storage/Crates/woodenchest.rsi
layers:
@@ -14,9 +17,20 @@
- state: closed
map: ["enum.StorageVisualLayers.Door"]
- type: Damageable
- damageModifierSet: Web
+ damageContainer: Inorganic
+ damageModifierSet: Wood
- type: Destructible
thresholds:
+ - trigger:
+ !type:DamageTypeTrigger
+ damageType: Heat
+ damage: 100
+ behaviors:
+ - !type:DoActsBehavior
+ acts: ["Destruction"]
+ - !type:PlaySoundBehavior
+ sound:
+ collection: WoodDestroy
- trigger:
!type:DamageTrigger
damage: 150
diff --git a/Resources/Prototypes/_CP14/Entities/Structures/Walls/walls.yml b/Resources/Prototypes/_CP14/Entities/Structures/Walls/walls.yml
index b1b113bb6c..aaf0678f9a 100644
--- a/Resources/Prototypes/_CP14/Entities/Structures/Walls/walls.yml
+++ b/Resources/Prototypes/_CP14/Entities/Structures/Walls/walls.yml
@@ -42,16 +42,51 @@
- type: entity
id: CPWoodFullWall
name: wooden wall
- parent: CPBaseWall
+ parent:
+ - CPBaseWall
+ - CPBaseWooden
description: Board to board, and together they form protection and comfort.
components:
- type: Sprite
sprite: _CP14/Structures/Walls/wood_full.rsi
- type: Icon
sprite: _CP14/Structures/Walls/wood_full.rsi
+ state: full
- type: IconSmooth
key: CPwallswood
base: wood
+ - type: Damageable
+ damageContainer: Inorganic
+ damageModifierSet: Wood
+ - type: Destructible
+ thresholds:
+ - trigger:
+ !type:DamageTypeTrigger
+ damageType: Heat
+ damage: 150
+ behaviors:
+ - !type:DoActsBehavior
+ acts: ["Destruction"]
+ - !type:PlaySoundBehavior
+ sound:
+ collection: WoodDestroy
+ - trigger:
+ !type:DamageTrigger
+ damage: 200
+ behaviors:
+ - !type:DoActsBehavior
+ acts: ["Destruction"]
+ - !type:PlaySoundBehavior
+ sound:
+ collection: WoodDestroy
+ - !type:SpawnEntitiesBehavior
+ spawn:
+ MaterialWoodPlank:
+ min: 2
+ max: 3
+ - type: FireVisuals
+ sprite: _CP14/Effects/fire.rsi
+ normalState: full
- type: entity
id: CPCaveStoneWall
diff --git a/Resources/Prototypes/_CP14/Entities/base.yml b/Resources/Prototypes/_CP14/Entities/base.yml
new file mode 100644
index 0000000000..f80ee3118a
--- /dev/null
+++ b/Resources/Prototypes/_CP14/Entities/base.yml
@@ -0,0 +1,38 @@
+- type: entity
+ id: CPBaseWooden
+ abstract: true
+ components:
+ - type: Damageable
+ damageContainer: Inorganic
+ damageModifierSet: Wood
+ - type: Tag
+ tags:
+ - Wooden
+ - type: CPFlammableAmbientSound
+ - type: AmbientSound
+ enabled: false
+ volume: -5
+ range: 5
+ sound:
+ path: /Audio/Ambience/Objects/fireplace.ogg #TODO replace
+ - type: Appearance
+ - type: Reactive
+ groups:
+ Flammable: [ Touch ]
+ Extinguish: [ Touch ]
+ - type: Flammable
+ fireSpread: true
+ canResistFire: false
+ alwaysCombustible: true
+ canExtinguish: true
+ firestacksOnIgnite: 0.5
+ firestackFade: 0.3
+ firestackFadeOnIgnite: 0.3
+ firestackFadeFade: -0.2
+ damage:
+ types:
+ Heat: 0.5
+ - type: FireVisuals
+ sprite: _CP14/Effects/fire.rsi
+ normalState: small
+ - type: CPFireSpread
\ No newline at end of file
diff --git a/Resources/Textures/_CP14/Effects/fire.rsi/full.png b/Resources/Textures/_CP14/Effects/fire.rsi/full.png
new file mode 100644
index 0000000000000000000000000000000000000000..db214c44ded71576f819343f7e26f4e73940fcd9
GIT binary patch
literal 5606
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
literal 0
HcmV?d00001
diff --git a/Resources/Textures/_CP14/Structures/Floors/wood.rsi/wood_1.png b/Resources/Textures/_CP14/Structures/Floors/wood.rsi/wood_1.png
index f28adb738de4c5e6b71b52b6281e8ca76e10cf77..bc641e68c0e0f1be8da4f47c2f010302bb74e41e 100644
GIT binary patch
delta 808
zcmV+@1K0fV2)YTdpaFja1W80eR9J<@mrZZmFbswtOH7nDD~ba9IJ6jg3wGN7|2I8!
zz=j@*VaN~%lD&gXnU?K-WLQTah`vZ!ddZhm_2vC_yLO(pl4FxtJI}F60LZ6{^E~;u
zuesU=0Afmr_r#P&{Zj1M!=FR5$!+O0#9T9+=CXN=|x&%Rp(T`3p-Xl^0k`0UZ+%&Nthu|GM-@?usG@k8A~dDr-?FH-S+6|(Kpk;R@^H{3BsWw&|`Q_Nh`
z`GApIm%vqsbiVWMe29eq>H`3xaj&w(1tllI7=P{m`1PCXt8KT=_{@?xZIrRB{T#E$
zV{YfKH@JRZ1w<;8Rqq-<@{2hRf!+sT%mpG9wX>uL+IfR>ZGxPH{Zeh{hK;86+FX7(75k;yP?V?V>b0`^
z1=xn+BVUTW!ZlYL{_~o!js??{ap
mS*jrU2jZCL1eL#iNB#kf;`S$hY6d?50000b-r7zW=L8SFvhW
z6_AAF^hd}Qg2A>+<_C*h_F8ZsO>j0i@+8QH7YOZ4vd
zEaLWI$(J|%qR`EZVZV!KO@1zllge@Vd>eh^1UzdP`#tP>wz_{(#(r<(#-?Iz_4P?-
zS~(~N01^d7F(OQ+As4=fwWOYkAbVhOJq;NR9I}H6w|I&xCo)ezk26n|$<3T$zl$@1
zAh2T+btV*;>|nx`g`PE=p2kXW-fMhv%|6!G-JVPw9s}uG_AtVWv*2>*0qyi|@f7F2
zeHxz@h1R|q0b_rJvhk}p!C8YSsHDfY4@=%%ruryWrgw7&r(HU(>U%v;912bhS7*Ka
zC*mj}@OzD{I`fEJnoEeCe?b^T673jK#*
zI~$H?hGz}Kem7?$T*f>1iSk5L3w_t6Y=q0W!p7k+kT*4|B!E!#f7jEH!A08di-5DT
z`wgsXW!-<$6tVRAd;;<$rz1}p7)!z>r#
zB;m*1g28Erj|S~@QBYN!5yt)zoh&k9w&ud?
zGZ2hCtgZUeW^7y2S%tDQ%BE8aOxAiAg$WT!r1L?ee{%Ruj
Qw*UYD07*qoM6N<$f(BA_*#H0l
diff --git a/Resources/Textures/_CP14/Structures/Floors/wood.rsi/wood_2.png b/Resources/Textures/_CP14/Structures/Floors/wood.rsi/wood_2.png
index 5e27c3be6fe9995adfae9660dfa06345d23d59d1..03bdae67c7c96228a0db37d2144045543164931b 100644
GIT binary patch
delta 887
zcmV--1Bm?T2#E@?paFjaQ%OWYR9JEX_jj`Bw0c?%2m}2`b$g}LP$2ty=
z^L6NcIR{Y%0C?GKalf1c0DK4_Ym;jq0(^)8;<%D$$U3}zeByuZdL|2a--D=v_r1gc
z2xP6y8vuCfY_j`jL*l@{-F`2N^9K0$T00O`XpDuk22Y*EuJzH^_lcjx9p-7_EY|1&
z80@1N@8vliYs{Z(hU7q*-{~8!Z7)X(4E%=0K?f|_&`F)pn*~@O
z)VLnWfgG#69+YgXW|Xu-o74iCIMEwuZl`@gn&szeh+fa|qWnA88%*g7*iO}uLxxVka0Nq2nK|^-!VdHXo!zr+KaBR*CwzIW>
zuS+(i=hObBUV*Oa>agQ8y+b#JE^%af4r=e6Ut
zcJgoBtZCv)PpR{4r+T|KR7W*{wLi(7#J@uIc>5qZ@KyXir6qa35ZC2XdVPx1xi5f3
zQ}n!+X^vs0=yk3K`z~Dk4ajkFU7-9suB6v&%zr+@OTGd5`WmS&{0G7Ah~@PhaZmsN
N002ovPDHLkV1kEZxk~^5
delta 726
zcmV;{0xA883h4;2paFjZvq?ljR9J=0m)lm_Koo|*Ju?CE7y*T@p4+$R`@afw6{~i&
zf|}FrMKU2F1cP4azF?7re=^Dc%|9FY@qMhkV!8L1z4BnTh!_nWMg$|^jO;bobM)@-
zGUocNy&I)T6%rr`iv%vOIBWf~3|KWrPUtA2CR
zUMp{k0f0VFJ-R;T5+hZVK%K=8%I}2uuh>KAGbl1B3
zhqUzV%k+3XSmA%05imxm8lR*YuJAJ{v>z^VZJa8Ln-#<3K0UWRH>xZ+6r30?PY2~K
z(l}!h4q92O4&a$N2=ZS`n(g#_6U5hNU@{J#mHGR6-KKY|`=nE5Z?5l5m7l*?oio2p
zZ`#B@uYI*;{!8_*&%kC5_L7PvfhXH+Oku86D>{B?+d>$Otv`;bOss~;6
z_O`~vlzCu*xKm#MZy^WT7}!?(c&kcn2W`_f`hm@ACe
z#=y1;tYLK0FS&>w)1CW-pNQ&O+jlt^(PP@+;_Wa{HZ`hbfUxfWW{Zg7dEW1ffU~mu
z4HRSfZfSph6)_$Lh(O>BqU&dFGN6zGahmeyF5>ef-{)0fe!b-Uu!nO7E8TiSp9^W0
z@$2TE;c<_iv+D_z_x02YSim^TG#r#og=G1-`+vaNm;yF%OhSh%xY9)V4-uJq`iZS_ivR!s07*qo
IM6N<$f?~>S#sB~S
diff --git a/Resources/Textures/_CP14/Structures/Floors/wood.rsi/wood_3.png b/Resources/Textures/_CP14/Structures/Floors/wood.rsi/wood_3.png
index e9769c93913e2d999c2e692fce5fbf3adcf732d1..d4e03995691dfd779e29e7b06096880d3c26367f 100644
GIT binary patch
delta 770
zcmV+d1O5Dh36=@4p#gv3Nklf2n`_+~ay>W8P%l@Ea4sIPbA<9iBUaB?Er|uw?LJ82i@6L_L8_
zzHc1>B(=;HUKchlq-$f{;Q;4-n7gqIO9pH7N#b_V1B*J2Ti;=2WlU&&2TKO6@35t`
zc4ItXDljvg>+y4G#|;cmR1Q-;-94n${~->Yg5;{<G>JTcnC`d&)q=Sp+?toV>#}wv0)*NDRYGl
zJX}Vmc+z1Z=lWQ`flqR`iynZ1UDjxQ7dHmrG91vsqFW8Y$F7~#bFO7wFSt+nNG?mG
zF%hhRc|DhSplj!RMCzjtXx9GjT;hsTdd{`1b0y|{r1gJQ^pNW5?x7c5UZN*(ju(LB
z(KdD1b*WzfslH2|Fx4+4-w00fSR*z>XzF^@exYCF`p!2p*Dr)KydJb^$>9CZ0RSS_
z0jJSWiv1$fx8wr&x?fmE^>}k%^nuzC&f&(P^D$3*y{^?c5`2HXI>KlQ-@Lac6Olck
zhos&DAaH*G2pH*@!Z$27O1IQQh_BB&U*pi#Gr`;sAgz>!*6|mPQ8q!y)Rl4jDFD;?CHBO1^M;4wUW#I_5m#-1orJ-O)UEl;D>8
zf_yJ|!nyB(c|8Ddu4#axFP!2D=e!5%d?4`VFFsTOZH;$ImjD0&07*qoM6N<$g2Ul~
A)c^nh
delta 750
zcmV;LTSop^73kpWl%}C#wZ(8!t-!tPGLw|dpwg#?NIn#;aL~sJ?WN@*k
zdSJI1*f~a%K}njxeDQzd~yuYWisrH8qyk
z_e?KFs1pQ%Ba7H)!hq!wCUiG3@$OL5V9ei+d+*%h$M(9O$i&NI0OEd5aKe+k;N3I<
zhUMzRuTXD`o7;ai9~b9Mv8{Gaz_~`hO(;?C5CfCy_s#8^-``caMKD(1?wOpANVTo|
zzMm)tD%HUIH{+VGP?XHGaVKwefh~`bn^#FSTSD2Z`#y-z&%k_^oTM?Fu5({*>IJ=j
z*bMUQ{rz2<@#Ww9L7v~2yU514zT^mIj6TmFl7H;Hcz%Bdy83~q>id)$wGVV@^yYQK
zNPV*vJN!7ha44e}oV98^#)!gcXL?^_;%YDOKryHLe)RG2
z_ADh)hu<~p_;veCMVkCS=iO{5k3`}f(~D8fN4^fdXT<(O%$od>R&34|FitDMPY)$faddO7|CwzXonw7kxlO%g;PQHNM_&xZ^c1fU3k|9>N!2$CsQ)(-E8qdAo<%mU8wx3_ecdK|SG{Vm
zG%z#N35)C%X|#+$r!PD|1M^ve_ibH3>rxZB*9QWqu97gOMyd9s7R}@FDQJ-^X_#j#KC9
zGyRo;mHtGm<=zA^4f`P=(r{0}S26++Y4H9q$y}^OqyZ%ARc@B<7=S;-V8vSGao12z
z@uH1$yFPHcY-zL({4a?dC^1X%0#0HMOmNS+Gha_k4R>b^4@M$h<$f+PpTqrMrGu>b*aF5Dr{g*VFmOT|ePUigSNj?aGR&wgBcmb=`*$afK;Y
z%E0x5`unwTk*LlZwu42www+`?SJ%Z_z70M)fhkv%Cw&-3zy3hy#-Q)XOZ;Z>5je2!
zWEP`q@SU?QYl%69(KYyBc>0HXfVdqR01P?2?aJTh;VE<4w2nB|ze2@JKKaNP-=>*BGUib=6b&vlLTl0B^n
zls%zJ=VYw=Ng<2HOwR(5CZ6pZ4uGj*26fCK4@_=-s3?y*+ANWb11Y98{8QbvcSIG@
zeXUZf*Dx;QkpolgQz>oZ$C4gWdrz|+-YydfE~$Y&-?Q&a+tjA)8)dT?v2x2}jR%Ul
oec*O^`Mxi0bp?T}COB*O3+|yK3gW=9hX4Qo07*qoM6N<$f-KT~Pyhe`
delta 723
zcmV;^0xbQC3Fio~p#gufNkl2lgY5QM+kLoznRGGL2T?&K}<{;y(E!Lgl+
z4H#XUA3_%(BV0+D`9YzTdNfk^_Kf8Fx3S|D!@Rrl%7g1!#As+xA}9f)ahL)rv{bL$9lKiDQ2f^tLW+OV$;?S#*Jw
zqtXCC=D^`lB1~ry7lB1MHi+HvRZ9(nmWSsUh9*);-_}r9H5Ki(?GtLElPNi7Zf=zM;6$h!z`cD
zlC#f~ewAd+nG%0cN~pi%B+W2dAr72WYqt+8-e2Z9;?yy_TQKbVc&6P?3=WJauHN*@
zTcmMD81!1TRwk(FvCz(m%~vGNI{C@#Yakrk|IYJsShH9roje=1_jl$TKYlGb`F7CQ*w@#;-Kcy*ah`M(2Oqt;LVitnh%d2DXbf%3jd5
zukRX6ROta4h$MI5IF+Tu`toolkT3%@lFY(|?l&d)roQRup17k}69RHVXx40r3p
zuqUimj0S$GjcAoV+b8OUI9K6)lj|c|r44-?kp`S21B7bsyPic1FY-BG1dNt_(-@Gy
zfMQab-b8&d%CIUU93qyQ9FlG!X!AsE9@fWh-boZY|(m~n|-ls
zPZt^L3~da|<=S+OH*u5^lQm8@FLwF20FEfhxPMEGwmcy?^YCrmo@FCPuB9YNxSz*-
zsP&93AK0w6(!JmtO&Ihry8CxvnNvVpLl_v$T3;@4`~^&wdj6bzs-*w`002ovPDHLk
FV1n@snZz0QG|h
z0Q7^04*@Lza&9*8A>51;ee{Vo{j}yo$m~iwl8hoKIj54*gq(lN>`H`)JEov~_lrQI
z7eO;S2FwW&2eEdq=_JxzL|<|a7`?jtIaNwlG$NX0ary2oz!`uYfwg;X8>RUdeIQD0
zEvI$-NDpbd0jKeT&8oTe0RU(V7p)|7FJV4v?N9fPoXe|#16!9WUf@(DU@aEa7;9PJ
z7nX|^%ZIS+gqnY`1z-^rWAP)X0Txp|1u7BLHsM299)Sg{>1#5ek)mVoGo!T0)aXy6
z(n_>AlN@^wdVk#(jexxFH>(CO+h+iEy`wZk(4jkL4%+*jO4|(}=jPhCe4{S<0oT4k
z+z_a{y&5rV7|C8-s}X5IwKa{n_KK>Fs03`?ZV8w_`%!;KH7Q)I39a`YvV3IAGGGPJ
zbRttrjOz$`4WJ;=le(J0WOE`d?k?11U>G5n9_Nm<~3a$0XNVF)0&~Q
zmh{5Dv2(5B(i{~(rS4X{cwE?WP9(zyN*u=FqBfonc0+S_0O$E^PV7#Ql=
Uie5ql000UA07*qoM6N<$f-D{T^8f$<
delta 540
zcmV+%0^|Ls2eAjRp#gvUNkl2ryXNZ
zJ^OVaf%eVYt${Tmr$MaQGhL3fmYlDfl|pA9{#jNS5hglrb_q&=e*o(xux77qgETj<
z1J|78_#9tTLw<%McKZ|V?;5ypmIc6%Q3sfapCACd@?pm>?7O~e(^H^nLd1fyF-Dx-qO=f|fUSSsoded_e$cs^6t2h8(t8P6
z-LfSaumUh$o@}buW26qml8)OxdB2>m18{MFpXJx|$HnFv?6I?g>2VFDCsy7<}Dr
zx>^Elz#7w%SCYQQ(iILPU1}0000@snZz0QG|h
z0Q7^04*@Lza&9*8A>51;ee{Vo{j}yo$m~iwl8hoKIj54*gq(lN>`H`)JEov~_lrQI
z7eO;S2FwW&2eEdq=_JxzL|<|a7`?jtIaNwlG$NX0ary2oz!`uYfwg;X8>RUdeIQD0
zEvI$-NDpbd0jKeT&8oTe0RU(V7p)|7FJV4v?N9fPoXe|#16!9WUf@(DU@aEa7;9PJ
z7nX|^%ZIS+gqnY`1z-^rWAP)X0Txp|1u7BLHsM299)Sg{>1#5ek)mVoGo!T0)aXy6
z(n_>AlN@^wdVk#(jexxFH>(CO+h+iEy`wZk(4jkL4%+*jO4|(}=jPhCe4{S<0oT4k
z+z_a{y&5rV7|C8-s}X5IwKa{n_KK>Fs03`?ZV8w_`%!;KH7Q)I39a`YvV3IAGGGPJ
zbRttrjOz$`4WJ;=le(J0WOE`d?k?11U>G5n9_Nm<~3a$0XNVF)0&~Q
zmh{5Dv2(5B(i{~(rS4X{cwE?WP9(zyN*u=FqBfonc0+S_0O$E^PV7#Ql=
Uie5ql000UA07*qoM6N<$f-D{T^8f$<
delta 540
zcmV+%0^|Ls2eAjRp#gvUNkl2ryXNZ
zJ^OVaf%eVYt${Tmr$MaQGhL3fmYlDfl|pA9{#jNS5hglrb_q&=e*o(xux77qgETj<
z1J|78_#9tTLw<%McKZ|V?;5ypmIc6%Q3sfapCACd@?pm>?7O~e(^H^nLd1fyF-Dx-qO=f|fUSSsoded_e$cs^6t2h8(t8P6
z-LfSaumUh$o@}buW26qml8)OxdB2>m18{MFpXJx|$HnFv?6I?g>2VFDCsy7<}Dr
zx>^Elz#7w%SCYQQ(iILPU1}0000@snZz0QG|h
z0Q7^04*@Lza&9*8A>51;ee{Vo{j}yo$m~iwl8hoKIj54*gq(lN>`H`)JEov~_lrQI
z7eO;S2FwW&2eEdq=_JxzL|<|a7`?jtIaNwlG$NX0ary2oz!`uYfwg;X8>RUdeIQD0
zEvI$-NDpbd0jKeT&8oTe0RU(V7p)|7FJV4v?N9fPoXe|#16!9WUf@(DU@aEa7;9PJ
z7nX|^%ZIS+gqnY`1z-^rWAP)X0Txp|1u7BLHsM299)Sg{>1#5ek)mVoGo!T0)aXy6
z(n_>AlN@^wdVk#(jexxFH>(CO+h+iEy`wZk(4jkL4%+*jO4|(}=jPhCe4{S<0oT4k
z+z_a{y&5rV7|C8-s}X5IwKa{n_KK>Fs03`?ZV8w_`%!;KH7Q)I39a`YvV3IAGGGPJ
zbRttrjOz$`4WJ;=le(J0WOE`d?k?11U>G5n9_Nm<~3a$0XNVF)0&~Q
zmh{5Dv2(5B(i{~(rS4X{cwE?WP9(zyN*u=FqBfonc0+S_0O$E^PV7#Ql=
Uie5ql000UA07*qoM6N<$f-D{T^8f$<
delta 540
zcmV+%0^|Ls2eAjRp#gvUNkl2ryXNZ
zJ^OVaf%eVYt${Tmr$MaQGhL3fmYlDfl|pA9{#jNS5hglrb_q&=e*o(xux77qgETj<
z1J|78_#9tTLw<%McKZ|V?;5ypmIc6%Q3sfapCACd@?pm>?7O~e(^H^nLd1fyF-Dx-qO=f|fUSSsoded_e$cs^6t2h8(t8P6
z-LfSaumUh$o@}buW26qml8)OxdB2>m18{MFpXJx|$HnFv?6I?g>2VFDCsy7<}Dr
zx>^Elz#7w%SCYQQ(iILPU1}0000@snZz0QG|h
z0Q7^04*@Lza&9*8A>51;ee{Vo{j}yo$m~iwl8hoKIj54*gq(lN>`H`)JEov~_lrQI
z7eO;S2FwW&2eEdq=_JxzL|<|a7`?jtIaNwlG$NX0ary2oz!`uYfwg;X8>RUdeIQD0
zEvI$-NDpbd0jKeT&8oTe0RU(V7p)|7FJV4v?N9fPoXe|#16!9WUf@(DU@aEa7;9PJ
z7nX|^%ZIS+gqnY`1z-^rWAP)X0Txp|1u7BLHsM299)Sg{>1#5ek)mVoGo!T0)aXy6
z(n_>AlN@^wdVk#(jexxFH>(CO+h+iEy`wZk(4jkL4%+*jO4|(}=jPhCe4{S<0oT4k
z+z_a{y&5rV7|C8-s}X5IwKa{n_KK>Fs03`?ZV8w_`%!;KH7Q)I39a`YvV3IAGGGPJ
zbRttrjOz$`4WJ;=le(J0WOE`d?k?11U>G5n9_Nm<~3a$0XNVF)0&~Q
zmh{5Dv2(5B(i{~(rS4X{cwE?WP9(zyN*u=FqBfonc0+S_0O$E^PV7#Ql=
Uie5ql000UA07*qoM6N<$f-D{T^8f$<
delta 540
zcmV+%0^|Ls2eAjRp#gvUNkl2ryXNZ
zJ^OVaf%eVYt${Tmr$MaQGhL3fmYlDfl|pA9{#jNS5hglrb_q&=e*o(xux77qgETj<
z1J|78_#9tTLw<%McKZ|V?;5ypmIc6%Q3sfapCACd@?pm>?7O~e(^H^nLd1fyF-Dx-qO=f|fUSSsoded_e$cs^6t2h8(t8P6
z-LfSaumUh$o@}buW26qml8)OxdB2>m18{MFpXJx|$HnFv?6I?g>2VFDCsy7<}Dr
zx>^Elz#7w%SCYQQ(iILPU1}0000