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{MFpX&#Jx|$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{MFpX&#Jx|$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{MFpX&#Jx|$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{MFpX&#Jx|$HnFv?6I?g>2VFDCsy7<}Dr zx>^Elz#7w%SCYQQ(iILPU1}0000