diff --git a/Content.Server/NPC/Queries/Considerations/TargetLowTempCon.cs b/Content.Server/NPC/Queries/Considerations/TargetLowTempCon.cs new file mode 100644 index 0000000000..7e8553c63c --- /dev/null +++ b/Content.Server/NPC/Queries/Considerations/TargetLowTempCon.cs @@ -0,0 +1,14 @@ +namespace Content.Server.NPC.Queries.Considerations; + +/// +/// Returns if the target is below a certain temperature. +/// +public sealed partial class TargetLowTempCon : UtilityConsideration +{ + /// + /// The minimum temperature they must be. + /// + [DataField] + public float MinTemp; +} + diff --git a/Content.Server/NPC/Systems/NPCUtilitySystem.cs b/Content.Server/NPC/Systems/NPCUtilitySystem.cs index 7b485eeb96..c5b463d0d3 100644 --- a/Content.Server/NPC/Systems/NPCUtilitySystem.cs +++ b/Content.Server/NPC/Systems/NPCUtilitySystem.cs @@ -7,6 +7,7 @@ using Content.Server.NPC.Queries.Queries; using Content.Server.Nutrition.Components; using Content.Server.Nutrition.EntitySystems; using Content.Server.Storage.Components; +using Content.Server.Temperature.Components; using Content.Shared.Chemistry.EntitySystems; using Content.Shared.Damage; using Content.Shared.Examine; @@ -14,7 +15,6 @@ using Content.Shared.Fluids.Components; using Content.Shared.Hands.Components; using Content.Shared.Inventory; using Content.Shared.Mobs; -using Content.Shared.Mobs.Components; using Content.Shared.Mobs.Systems; using Content.Shared.NPC.Systems; using Content.Shared.Nutrition.Components; @@ -376,6 +376,13 @@ public sealed class NPCUtilitySystem : EntitySystem return 0f; } + case TargetLowTempCon con: + { + if (!TryComp(targetUid, out var temperature)) + return 0f; + + return temperature.CurrentTemperature <= con.MinTemp ? 1f : 0f; + } default: throw new NotImplementedException(); } diff --git a/Resources/Prototypes/Entities/Markers/Spawners/Random/Salvage/spawners.yml b/Resources/Prototypes/Entities/Markers/Spawners/Random/Salvage/spawners.yml index f1d632c186..1de12a1511 100644 --- a/Resources/Prototypes/Entities/Markers/Spawners/Random/Salvage/spawners.yml +++ b/Resources/Prototypes/Entities/Markers/Spawners/Random/Salvage/spawners.yml @@ -542,7 +542,8 @@ table: !type:GroupSelector children: - id: MobGoliath - weight: 65 + weight: 45 - id: MobHivelord weight: 35 - + - id: MobBasilisk + weight: 20 diff --git a/Resources/Prototypes/Entities/Mobs/NPCs/asteroid.yml b/Resources/Prototypes/Entities/Mobs/NPCs/asteroid.yml index 8db0294981..c4c131a7ab 100644 --- a/Resources/Prototypes/Entities/Mobs/NPCs/asteroid.yml +++ b/Resources/Prototypes/Entities/Mobs/NPCs/asteroid.yml @@ -81,6 +81,8 @@ 6 AggroVisionRadius: !type:Single 10 + NavSmash: !type:Bool + true - type: NPCUseActionOnTarget actionId: ActionGoliathTentacle - type: Tag @@ -241,6 +243,8 @@ 4 AggroVisionRadius: !type:Single 9 + NavSmash: !type:Bool + true - type: Butcherable spawned: - id: FoodHivelordRemains @@ -293,6 +297,8 @@ 15 AggroVisionRadius: !type:Single 15 + NavSmash: !type:Bool + true - type: TimedDespawn lifetime: 100 @@ -345,3 +351,77 @@ - type: Tag tags: - HivelordRemains + + +- type: entity + id: MobBasilisk + parent: [ BaseMobAsteroid, MobBloodstream ] + name: basilisk + description: A territorial beast, covered in a thick shell that absorbs energy. Its stare causes victims to freeze from the inside. + components: + - type: Sprite + sprite: Mobs/Aliens/Asteroid/basilisk.rsi + layers: + - map: ["enum.DamageStateVisualLayers.Base"] + state: basilisk + - type: DamageStateVisuals + states: + Alive: + Base: basilisk + Dead: + Base: basilisk_dead + - type: MovementSpeedModifier + baseWalkSpeed : 3 + baseSprintSpeed : 3.5 + - type: MobThresholds + thresholds: + 0: Alive + 80: Dead + - type: MeleeWeapon + angle: 0 + animation: WeaponArcBite + soundHit: + path: /Audio/Effects/bite.ogg + damage: + types: + Slash: 7 + Piercing: 5 + - type: Gun + fireRate: 0.75 + selectedMode: SemiAuto + showExamineText: false + availableModes: [ SemiAuto ] + soundGunshot: /Audio/Weapons/Guns/Gunshots/syringe_gun.ogg + - type: RechargeBasicEntityAmmo + showExamineText: false + rechargeCooldown: 0 + rechargeSound: null + - type: BasicEntityAmmoProvider + proto: BasiliskRay + capacity: 1 + count: 1 + - type: Bloodstream + bloodMaxVolume: 200 + chemicalMaxVolume: 0 + - type: NpcFactionMember + factions: + - SimpleHostile + - type: HTN + rootTask: + task: BasiliskCompound + blackboard: + VisionRadius: !type:Single + 7 + AggroVisionRadius: !type:Single + 12 + NavSmash: !type:Bool + true + - type: Reflect + reflectProb: 1 + reflects: + - Energy + - type: Butcherable + spawned: + - id: DiamondOre1 + amount: 1 + maxAmount: 3 diff --git a/Resources/Prototypes/Entities/Objects/Weapons/Guns/Projectiles/projectiles.yml b/Resources/Prototypes/Entities/Objects/Weapons/Guns/Projectiles/projectiles.yml index 63d9e62349..60b19626b0 100644 --- a/Resources/Prototypes/Entities/Objects/Weapons/Guns/Projectiles/projectiles.yml +++ b/Resources/Prototypes/Entities/Objects/Weapons/Guns/Projectiles/projectiles.yml @@ -437,6 +437,45 @@ - type: ChangeTemperatureOnCollide heat: 100000 #This may be a bit underpowered, but in testing, 130000 was RIDICULOUS and killed in seconds. +- type: entity + parent: BaseBullet + id: BasiliskRay + name: basilisk ray + categories: [ HideSpawnMenu ] + components: + - type: FlyBySound + sound: + collection: EnergyMiss + params: + volume: 5 + - type: Sprite + sprite: Objects/Weapons/Guns/Projectiles/projectiles_tg.rsi + layers: + - state: ice + shader: unshaded + - type: Ammo + muzzleFlash: null + - type: Physics + - type: Fixtures + fixtures: + projectile: + shape: + !type:PhysShapeAabb + bounds: "-0.2,-0.2,0.2,0.2" + hard: false + mask: + - Opaque + fly-by: *flybyfixture + - type: Projectile + impactEffect: BulletImpactEffectDisabler + damage: + types: + Cold: 5 + - type: TimedDespawn + lifetime: 3 + - type: ChangeTemperatureOnCollide + heat: -50000 + - type: entity id: BulletKinetic name: kinetic bolt diff --git a/Resources/Prototypes/NPCs/basilisk.yml b/Resources/Prototypes/NPCs/basilisk.yml new file mode 100644 index 0000000000..601d048b79 --- /dev/null +++ b/Resources/Prototypes/NPCs/basilisk.yml @@ -0,0 +1,22 @@ +- type: htnCompound + id: BasiliskCompound + branches: + - tasks: + - !type:HTNCompoundTask + task: BasiliskMeleeCombatCompound + - tasks: + - !type:HTNCompoundTask + task: InnateRangedCombatCompound + - tasks: + - !type:HTNCompoundTask + task: IdleCompound + +- type: htnCompound + id: BasiliskMeleeCombatCompound + branches: + - tasks: + - !type:HTNPrimitiveTask + operator: !type:UtilityOperator + proto: NearbyColdMeleeTargets + - !type:HTNCompoundTask + task: BeforeMeleeAttackTargetCompound diff --git a/Resources/Prototypes/NPCs/utility_queries.yml b/Resources/Prototypes/NPCs/utility_queries.yml index 69ae4a337d..23ad7a59a1 100644 --- a/Resources/Prototypes/NPCs/utility_queries.yml +++ b/Resources/Prototypes/NPCs/utility_queries.yml @@ -99,6 +99,27 @@ - !type:TargetInLOSOrCurrentCon curve: !type:BoolCurve +- type: utilityQuery + id: NearbyColdMeleeTargets + query: + - !type:NearbyHostilesQuery + considerations: + - !type:TargetLowTempCon + curve: !type:BoolCurve + minTemp: 250 + - !type:TargetIsAliveCon + curve: !type:BoolCurve + - !type:TargetDistanceCon + curve: !type:PresetCurve + preset: TargetDistance + - !type:TargetHealthCon + curve: !type:PresetCurve + preset: TargetHealth + - !type:TargetAccessibleCon + curve: !type:BoolCurve + - !type:TargetInLOSOrCurrentCon + curve: !type:BoolCurve + - type: utilityQuery id: OrderedTargets query: @@ -191,7 +212,7 @@ - !type:TargetIsCritCon curve: !type:InverseBoolCurve - !type:TargetIsStunnedCon - curve: !type:InverseBoolCurve + curve: !type:InverseBoolCurve - !type:TurretTargetingCon curve: !type:BoolCurve - !type:TargetDistanceCon diff --git a/Resources/Textures/Mobs/Aliens/Asteroid/basilisk.rsi/basilisk.png b/Resources/Textures/Mobs/Aliens/Asteroid/basilisk.rsi/basilisk.png new file mode 100644 index 0000000000..5177522f4b Binary files /dev/null and b/Resources/Textures/Mobs/Aliens/Asteroid/basilisk.rsi/basilisk.png differ diff --git a/Resources/Textures/Mobs/Aliens/Asteroid/basilisk.rsi/basilisk_alert.png b/Resources/Textures/Mobs/Aliens/Asteroid/basilisk.rsi/basilisk_alert.png new file mode 100644 index 0000000000..3bd4e6e1a7 Binary files /dev/null and b/Resources/Textures/Mobs/Aliens/Asteroid/basilisk.rsi/basilisk_alert.png differ diff --git a/Resources/Textures/Mobs/Aliens/Asteroid/basilisk.rsi/basilisk_dead.png b/Resources/Textures/Mobs/Aliens/Asteroid/basilisk.rsi/basilisk_dead.png new file mode 100644 index 0000000000..fcd6472c37 Binary files /dev/null and b/Resources/Textures/Mobs/Aliens/Asteroid/basilisk.rsi/basilisk_dead.png differ diff --git a/Resources/Textures/Mobs/Aliens/Asteroid/basilisk.rsi/meta.json b/Resources/Textures/Mobs/Aliens/Asteroid/basilisk.rsi/meta.json new file mode 100644 index 0000000000..73710c98cb --- /dev/null +++ b/Resources/Textures/Mobs/Aliens/Asteroid/basilisk.rsi/meta.json @@ -0,0 +1,48 @@ +{ + "version": 1, + "license": "CC-BY-SA-3.0", + "copyright": "Taken from vgstation13 at https://github.com/vgstation-coders/vgstation13/blob/9bd459b27c73575fd5e3bf2efea13b816d0ac7c8/icons/mob/animal.dmi", + "size": { + "x": 32, + "y": 32 + }, + "states": [ + { + "name": "basilisk", + "directions": 4 + }, + { + "name": "basilisk_alert", + "directions": 4, + "delays": [ + [ + 0.1, + 0.1, + 0.1, + 0.1 + ], + [ + 0.1, + 0.1, + 0.1, + 0.1 + ], + [ + 0.1, + 0.1, + 0.1, + 0.1 + ], + [ + 0.1, + 0.1, + 0.1, + 0.1 + ] + ] + }, + { + "name": "basilisk_dead" + } + ] +} diff --git a/Resources/Textures/Objects/Weapons/Guns/Projectiles/projectiles_tg.rsi/ice.png b/Resources/Textures/Objects/Weapons/Guns/Projectiles/projectiles_tg.rsi/ice.png new file mode 100644 index 0000000000..71633de682 Binary files /dev/null and b/Resources/Textures/Objects/Weapons/Guns/Projectiles/projectiles_tg.rsi/ice.png differ diff --git a/Resources/Textures/Objects/Weapons/Guns/Projectiles/projectiles_tg.rsi/meta.json b/Resources/Textures/Objects/Weapons/Guns/Projectiles/projectiles_tg.rsi/meta.json index d7b6a34f54..872a5ab721 100644 --- a/Resources/Textures/Objects/Weapons/Guns/Projectiles/projectiles_tg.rsi/meta.json +++ b/Resources/Textures/Objects/Weapons/Guns/Projectiles/projectiles_tg.rsi/meta.json @@ -55,6 +55,9 @@ }, { "name": "heavylaser_flash" + }, + { + "name": "ice" } ] -} \ No newline at end of file +}