diff --git a/code/game/atoms_movable.dm b/code/game/atoms_movable.dm
index 104fa066b69..7154b9f47d4 100644
--- a/code/game/atoms_movable.dm
+++ b/code/game/atoms_movable.dm
@@ -16,7 +16,8 @@
var/moved_recently = 0
var/mob/pulledby = null
var/item_state = null // Used to specify the item state for the on-mob overlays.
- var/icon_scale = 1 // Used to scale icons up or down in update_transform().
+ var/icon_scale_x = 1 // Used to scale icons up or down horizonally in update_transform().
+ var/icon_scale_y = 1 // Used to scale icons up or down vertically in update_transform().
var/icon_rotation = 0 // Used to rotate icons in update_transform()
var/old_x = 0
var/old_y = 0
@@ -476,13 +477,18 @@
/atom/movable/proc/update_transform()
var/matrix/M = matrix()
- M.Scale(icon_scale)
+ M.Scale(icon_scale_x, icon_scale_y)
M.Turn(icon_rotation)
src.transform = M
// Use this to set the object's scale.
-/atom/movable/proc/adjust_scale(new_scale)
- icon_scale = new_scale
+/atom/movable/proc/adjust_scale(new_scale_x, new_scale_y)
+ if(isnull(new_scale_y))
+ new_scale_y = new_scale_x
+ if(new_scale_x != 0)
+ icon_scale_x = new_scale_x
+ if(new_scale_y != 0)
+ icon_scale_y = new_scale_y
update_transform()
/atom/movable/proc/adjust_rotation(new_rotation)
diff --git a/code/game/objects/structures/flora/trees.dm b/code/game/objects/structures/flora/trees.dm
index 9136db406f9..03657ce45d4 100644
--- a/code/game/objects/structures/flora/trees.dm
+++ b/code/game/objects/structures/flora/trees.dm
@@ -14,11 +14,27 @@
var/product_amount = 10 // How much of a stack you get, if the above is defined.
var/is_stump = FALSE // If true, suspends damage tracking and most other effects.
var/indestructable = FALSE // If true, the tree cannot die.
+ var/randomize_size = FALSE // If true, the tree will choose a random scale in the X and Y directions to stretch.
/obj/structure/flora/tree/Initialize()
icon_state = choose_icon_state()
+
+ if(randomize_size)
+ icon_scale_x = rand(90, 125) / 100
+ icon_scale_y = rand(90, 125) / 100
+
+ if(prob(50))
+ icon_scale_x *= -1
+ update_transform()
+
return ..()
+/obj/structure/flora/tree/update_transform()
+ var/matrix/M = matrix()
+ M.Scale(icon_scale_x, icon_scale_y)
+ M.Translate(0, 16*(icon_scale_y-1))
+ animate(src, transform = M, time = 10)
+
// Override this for special icons.
/obj/structure/flora/tree/proc/choose_icon_state()
return icon_state
@@ -57,8 +73,11 @@
/obj/structure/flora/tree/proc/hit_animation()
var/init_px = pixel_x
var/shake_dir = pick(-1, 1)
- animate(src, transform=turn(matrix(), shake_animation_degrees * shake_dir), pixel_x=init_px + 2*shake_dir, time=1)
- animate(transform=null, pixel_x=init_px, time=6, easing=ELASTIC_EASING)
+ var/matrix/M = matrix()
+ M.Scale(icon_scale_x, icon_scale_y)
+ M.Translate(0, 16*(icon_scale_y-1))
+ animate(src, transform=turn(M, shake_animation_degrees * shake_dir), pixel_x=init_px + 2*shake_dir, time=1)
+ animate(transform=M, pixel_x=init_px, time=6, easing=ELASTIC_EASING)
// Used when the tree gets hurt.
/obj/structure/flora/tree/proc/adjust_health(var/amount, var/damage_wood = FALSE)
@@ -247,13 +266,19 @@
base_state = "tree_sif"
product = /obj/item/stack/material/log/sif
catalogue_data = list(/datum/category_item/catalogue/flora/sif_tree)
+ randomize_size = TRUE
+ var/light_shift = 0
+
+/obj/structure/flora/tree/sif/choose_icon_state()
+ light_shift = rand(0, 5)
+ return "[base_state][light_shift]"
/obj/structure/flora/tree/sif/Initialize()
+ . = ..()
update_icon()
- return ..()
/obj/structure/flora/tree/sif/update_icon()
- set_light(5, 1, "#33ccff")
- var/image/glow = image(icon = 'icons/obj/flora/deadtrees.dmi', icon_state = "[base_state]_glow")
+ set_light(5 - light_shift, 1, "#33ccff") // 5 variants, missing bulbs. 5th has no bulbs, so no glow.
+ var/image/glow = image(icon = icon, icon_state = "[base_state][light_shift]_glow")
glow.plane = PLANE_LIGHTING_ABOVE
overlays = list(glow)
diff --git a/code/game/objects/structures/loot_piles.dm b/code/game/objects/structures/loot_piles.dm
index c9731a0568c..c94003e9fb8 100644
--- a/code/game/objects/structures/loot_piles.dm
+++ b/code/game/objects/structures/loot_piles.dm
@@ -781,7 +781,8 @@ Loot piles can be depleted, if loot_depleted is turned on. Note that players wh
// Todo: Better loot.
/obj/structure/loot_pile/mecha/gygax/dark/adv
icon_state = "darkgygax_adv-broken"
- icon_scale = 1.5
+ icon_scale_x = 1.5
+ icon_scale_y = 1.5
pixel_y = 8
/obj/structure/loot_pile/mecha/gygax/medgax
diff --git a/code/modules/mob/_modifiers/modifiers.dm b/code/modules/mob/_modifiers/modifiers.dm
index 6e738094a12..665ae806170 100644
--- a/code/modules/mob/_modifiers/modifiers.dm
+++ b/code/modules/mob/_modifiers/modifiers.dm
@@ -42,7 +42,8 @@
var/accuracy // Positive numbers makes hitting things with guns easier, negatives make it harder.
var/accuracy_dispersion // Positive numbers make gun firing cover a wider tile range, and therefore more inaccurate. Negatives help negate dispersion penalties.
var/metabolism_percent // Adjusts the mob's metabolic rate, which affects reagent processing. Won't affect mobs without reagent processing.
- var/icon_scale_percent // Makes the holder's icon get scaled up or down.
+ var/icon_scale_x_percent // Makes the holder's icon get scaled wider or thinner.
+ var/icon_scale_y_percent // Makes the holder's icon get scaled taller or shorter.
var/attack_speed_percent // Makes the holder's 'attack speed' (click delay) shorter or longer.
var/pain_immunity // Makes the holder not care about pain while this is on. Only really useful to human mobs.
var/pulse_modifier // Modifier for pulse, will be rounded on application, then added to the normal 'pulse' multiplier which ranges between 0 and 5 normally. Only applied if they're living.
@@ -73,7 +74,7 @@
holder.modifiers.Remove(src)
if(mob_overlay_state) // We do this after removing ourselves from the list so that the overlay won't remain.
holder.update_modifier_visuals()
- if(icon_scale_percent) // Correct the scaling.
+ if(icon_scale_x_percent || icon_scale_y_percent) // Correct the scaling.
holder.update_transform()
if(client_color)
holder.update_client_color()
@@ -140,7 +141,7 @@
mod.on_applied()
if(mod.mob_overlay_state)
update_modifier_visuals()
- if(mod.icon_scale_percent)
+ if(mod.icon_scale_x_percent || mod.icon_scale_y_percent)
update_transform()
if(mod.client_color)
update_client_color()
@@ -232,8 +233,11 @@
effects += "Your metabolism is [metabolism_percent > 1.0 ? "faster" : "slower"], \
causing reagents in your body to process, and hunger to occur [multipler_to_percentage(metabolism_percent, TRUE)] [metabolism_percent > 1.0 ? "faster" : "slower"]."
- if(!isnull(icon_scale_percent))
- effects += "Your appearance is [multipler_to_percentage(icon_scale_percent, TRUE)] [icon_scale_percent > 1 ? "larger" : "smaller"]."
+ if(!isnull(icon_scale_x_percent))
+ effects += "Your appearance is [multipler_to_percentage(icon_scale_x_percent, TRUE)] [icon_scale_x_percent > 1 ? "wider" : "thinner"]."
+
+ if(!isnull(icon_scale_y_percent))
+ effects += "Your appearance is [multipler_to_percentage(icon_scale_y_percent, TRUE)] [icon_scale_y_percent > 1 ? "taller" : "shorter"]."
if(!isnull(attack_speed_percent))
effects += "The delay between attacking is [multipler_to_percentage(attack_speed_percent, TRUE)] [disable_duration_percent > 1.0 ? "longer" : "shorter"]."
diff --git a/code/modules/mob/_modifiers/modifiers_misc.dm b/code/modules/mob/_modifiers/modifiers_misc.dm
index 7d1ab792fff..e81cf0aaa86 100644
--- a/code/modules/mob/_modifiers/modifiers_misc.dm
+++ b/code/modules/mob/_modifiers/modifiers_misc.dm
@@ -56,7 +56,8 @@ the artifact triggers the rage.
outgoing_melee_damage_percent = 1.5 // 50% more damage from melee.
max_health_percent = 1.5 // More health as a buffer, however the holder might fall into crit after this expires if they're mortally wounded.
disable_duration_percent = 0.25 // Disables only last 25% as long.
- icon_scale_percent = 1.2 // Look scarier.
+ icon_scale_x_percent = 1.2 // Look scarier.
+ icon_scale_y_percent = 1.2
pain_immunity = TRUE // Avoid falling over from shock (at least until it expires).
// The less good stuff.
diff --git a/code/modules/mob/_modifiers/traits.dm b/code/modules/mob/_modifiers/traits.dm
index d0b0abfd895..200f8eabfbc 100644
--- a/code/modules/mob/_modifiers/traits.dm
+++ b/code/modules/mob/_modifiers/traits.dm
@@ -64,25 +64,29 @@
name = "Larger"
desc = "Your body is larger than average."
- icon_scale_percent = 1.1
+ icon_scale_x_percent = 1.1
+ icon_scale_y_percent = 1.1
/datum/modifier/trait/large
name = "Large"
desc = "Your body is a bit larger than average."
- icon_scale_percent = 1.05
+ icon_scale_x_percent = 1.05
+ icon_scale_y_percent = 1.05
/datum/modifier/trait/small
name = "Small"
desc = "Your body is a bit smaller than average."
- icon_scale_percent = 0.95
+ icon_scale_x_percent = 0.95
+ icon_scale_y_percent = 0.95
/datum/modifier/trait/smaller
name = "Smaller"
desc = "Your body is smaller than average."
- icon_scale_percent = 0.9
+ icon_scale_x_percent = 0.9
+ icon_scale_y_percent = 0.9
/datum/modifier/trait/colorblind_protanopia
name = "Protanopia"
diff --git a/code/modules/mob/_modifiers/unholy.dm b/code/modules/mob/_modifiers/unholy.dm
index 0eadabc83a9..0b6f69a21b9 100644
--- a/code/modules/mob/_modifiers/unholy.dm
+++ b/code/modules/mob/_modifiers/unholy.dm
@@ -14,7 +14,8 @@
disable_duration_percent = 0.25 // Disables only last 25% as long.
incoming_damage_percent = 0.5 // 50% incoming damage.
- icon_scale_percent = 1.2 // Become a bigger target.
+ icon_scale_x_percent = 1.2 // Become a bigger target.
+ icon_scale_y_percent = 1.2
pain_immunity = TRUE
slowdown = 2
diff --git a/code/modules/mob/living/carbon/human/human.dm b/code/modules/mob/living/carbon/human/human.dm
index 90c8f40ec05..eb4931db899 100644
--- a/code/modules/mob/living/carbon/human/human.dm
+++ b/code/modules/mob/living/carbon/human/human.dm
@@ -1139,8 +1139,13 @@
if(species.default_language)
add_language(species.default_language)
+<<<<<<< HEAD
//if(species.icon_scale != 1) //VOREStation Removal
// update_transform() //VOREStation Removal
+=======
+ if(species.icon_scale_x != 1 || species.icon_scale_y != 1)
+ update_transform()
+>>>>>>> ef7568a... Merge pull request #6154 from Mechoid/Sif_Tree_Expansion
if(example) //VOREStation Edit begin
if(!(example == src))
diff --git a/code/modules/mob/living/carbon/human/species/species.dm b/code/modules/mob/living/carbon/human/species/species.dm
index 95f909950c2..c2bb8cafe4f 100644
--- a/code/modules/mob/living/carbon/human/species/species.dm
+++ b/code/modules/mob/living/carbon/human/species/species.dm
@@ -32,7 +32,8 @@
var/tail_animation // If set, the icon to obtain tail animation states from.
var/tail_hair
- var/icon_scale = 1 // Makes the icon larger/smaller.
+ var/icon_scale_x = 1 // Makes the icon wider/thinner.
+ var/icon_scale_y = 1 // Makes the icon taller/shorter.
var/race_key = 0 // Used for mob icon cache string.
var/icon/icon_template // Used for mob icon generation for non-32x32 species.
diff --git a/code/modules/mob/living/carbon/human/update_icons.dm b/code/modules/mob/living/carbon/human/update_icons.dm
index 6b8861d8ab2..74839506d76 100644
--- a/code/modules/mob/living/carbon/human/update_icons.dm
+++ b/code/modules/mob/living/carbon/human/update_icons.dm
@@ -124,16 +124,25 @@ var/global/list/damage_icon_parts = list() //see UpdateDamageIcon()
/mob/living/carbon/human/update_transform()
/* VOREStation Edit START - TODO - Consider switching to icon_scale
// First, get the correct size.
- var/desired_scale = icon_scale
+ var/desired_scale_x = icon_scale_x
+ var/desired_scale_y = icon_scale_y
- desired_scale *= species.icon_scale
+ desired_scale_x *= species.icon_scale_x
+ desired_scale_y *= species.icon_scale_y
for(var/datum/modifier/M in modifiers)
+<<<<<<< HEAD
if(!isnull(M.icon_scale_percent))
desired_scale *= M.icon_scale_percent
*/
var/desired_scale = size_multiplier
//VOREStation Edit End
+=======
+ if(!isnull(M.icon_scale_x_percent))
+ desired_scale_x *= M.icon_scale_x_percent
+ if(!isnull(M.icon_scale_y_percent))
+ desired_scale_y *= M.icon_scale_y_percent
+>>>>>>> ef7568a... Merge pull request #6154 from Mechoid/Sif_Tree_Expansion
// Regular stuff again.
var/matrix/M = matrix()
@@ -145,12 +154,12 @@ var/global/list/damage_icon_parts = list() //see UpdateDamageIcon()
if(lying && !species.prone_icon) //Only rotate them if we're not drawing a specific icon for being prone.
M.Turn(90)
- M.Scale(desired_scale)
+ M.Scale(desired_scale_x, desired_scale_y)
M.Translate(1,-6)
layer = MOB_LAYER -0.01 // Fix for a byond bug where turf entry order no longer matters
else
- M.Scale(desired_scale)
- M.Translate(0, 16*(desired_scale-1))
+ M.Scale(desired_scale_x, desired_scale_y)
+ M.Translate(0, 16*(desired_scale_y-1))
layer = MOB_LAYER // Fix for a byond bug where turf entry order no longer matters
animate(src, transform = M, time = anim_time)
diff --git a/code/modules/mob/living/living.dm b/code/modules/mob/living/living.dm
index 4020f13d140..a6308ac2738 100644
--- a/code/modules/mob/living/living.dm
+++ b/code/modules/mob/living/living.dm
@@ -1174,18 +1174,31 @@ default behaviour is:
/mob/living/update_transform()
// First, get the correct size.
+<<<<<<< HEAD
var/desired_scale = size_multiplier //VOREStation edit
+=======
+ var/desired_scale_x = icon_scale_x
+ var/desired_scale_y = icon_scale_y
+>>>>>>> ef7568a... Merge pull request #6154 from Mechoid/Sif_Tree_Expansion
for(var/datum/modifier/M in modifiers)
- if(!isnull(M.icon_scale_percent))
- desired_scale *= M.icon_scale_percent
+ if(!isnull(M.icon_scale_x_percent))
+ desired_scale_x *= M.icon_scale_x_percent
+ if(!isnull(M.icon_scale_y_percent))
+ desired_scale_y *= M.icon_scale_y_percent
// Now for the regular stuff.
var/matrix/M = matrix()
+<<<<<<< HEAD
M.Scale(desired_scale)
M.Translate(0, 16*(desired_scale-1))
src.transform = M
//animate(src, transform = M, time = 10) //VOREStation edit
+=======
+ M.Scale(desired_scale_x, desired_scale_y)
+ M.Translate(0, 16*(desired_scale_y-1))
+ animate(src, transform = M, time = 10)
+>>>>>>> ef7568a... Merge pull request #6154 from Mechoid/Sif_Tree_Expansion
// This handles setting the client's color variable, which makes everything look a specific color.
// This proc is here so it can be called without needing to check if the client exists, or if the client relogs.
diff --git a/code/modules/mob/living/simple_animal/slime/subtypes.dm b/code/modules/mob/living/simple_animal/slime/subtypes.dm
new file mode 100644
index 00000000000..18b43dc33c9
--- /dev/null
+++ b/code/modules/mob/living/simple_animal/slime/subtypes.dm
@@ -0,0 +1,748 @@
+// Tier 1
+
+/mob/living/simple_animal/slime/purple
+ desc = "This slime is rather toxic to handle, as it is poisonous."
+ color = "#CC23FF"
+ slime_color = "purple"
+ coretype = /obj/item/slime_extract/purple
+ reagent_injected = "toxin"
+
+ description_info = "This slime spreads a toxin when it attacks. A biosuit or other thick armor can protect from the toxic attack."
+
+ slime_mutation = list(
+ /mob/living/simple_animal/slime/dark_purple,
+ /mob/living/simple_animal/slime/dark_blue,
+ /mob/living/simple_animal/slime/green,
+ /mob/living/simple_animal/slime
+ )
+
+
+/mob/living/simple_animal/slime/orange
+ desc = "This slime is known to be flammable and can ignite enemies."
+ color = "#FFA723"
+ slime_color = "orange"
+ coretype = /obj/item/slime_extract/orange
+
+ description_info = "Attacks from this slime can ignite you. A firesuit can protect from the burning attacks of this slime."
+
+ slime_mutation = list(
+ /mob/living/simple_animal/slime/dark_purple,
+ /mob/living/simple_animal/slime/yellow,
+ /mob/living/simple_animal/slime/red,
+ /mob/living/simple_animal/slime
+ )
+
+/mob/living/simple_animal/slime/orange/post_attack(mob/living/L, intent)
+ if(intent != I_HELP)
+ L.adjust_fire_stacks(1)
+ if(prob(25))
+ L.IgniteMob()
+ ..()
+
+/mob/living/simple_animal/slime/blue
+ desc = "This slime produces 'cryotoxin' and uses it against their foes. Very deadly to other slimes."
+ color = "#19FFFF"
+ slime_color = "blue"
+ coretype = /obj/item/slime_extract/blue
+ reagent_injected = "cryotoxin"
+
+ description_info = "Attacks from this slime can chill you. A biosuit or other thick armor can protect from the chilling attack."
+
+ slime_mutation = list(
+ /mob/living/simple_animal/slime/dark_blue,
+ /mob/living/simple_animal/slime/silver,
+ /mob/living/simple_animal/slime/pink,
+ /mob/living/simple_animal/slime
+ )
+
+
+/mob/living/simple_animal/slime/metal
+ desc = "This slime is a lot more resilient than the others, due to having a metamorphic metallic and sloped surface."
+ color = "#5F5F5F"
+ slime_color = "metal"
+ shiny = 1
+ coretype = /obj/item/slime_extract/metal
+
+ description_info = "This slime is a lot more durable and tough to damage than the others."
+
+ resistance = 10 // Sloped armor is strong.
+ maxHealth = 250
+ maxHealth_adult = 350
+
+ slime_mutation = list(
+ /mob/living/simple_animal/slime/silver,
+ /mob/living/simple_animal/slime/yellow,
+ /mob/living/simple_animal/slime/gold,
+ /mob/living/simple_animal/slime
+ )
+
+// Tier 2
+
+/mob/living/simple_animal/slime/yellow
+ desc = "This slime is very conductive, and is known to use electricity as a means of defense moreso than usual for slimes."
+ color = "#FFF423"
+ slime_color = "yellow"
+ coretype = /obj/item/slime_extract/yellow
+
+ ranged = 1
+ shoot_range = 3
+ firing_lines = 1
+ projectiletype = /obj/item/projectile/beam/lightning/slime
+ projectilesound = 'sound/weapons/gauss_shoot.ogg' // Closest thing to a 'thunderstrike' sound we have.
+ glows = TRUE
+
+ description_info = "This slime will fire lightning attacks at enemies if they are at range, and generate electricity \
+ for their stun attack faster than usual. Insulative or reflective armor can protect from the lightning."
+
+ slime_mutation = list(
+ /mob/living/simple_animal/slime/bluespace,
+ /mob/living/simple_animal/slime/bluespace,
+ /mob/living/simple_animal/slime/metal,
+ /mob/living/simple_animal/slime/orange
+ )
+
+/mob/living/simple_animal/slime/yellow/handle_regular_status_updates()
+ if(stat == CONSCIOUS)
+ if(prob(25))
+ power_charge = between(0, power_charge + 1, 10)
+ ..()
+
+/obj/item/projectile/beam/lightning/slime
+ power = 15
+
+/mob/living/simple_animal/slime/yellow/ClosestDistance() // Needed or else they won't eat monkeys outside of melee range.
+ if(target_mob && ishuman(target_mob))
+ var/mob/living/carbon/human/H = target_mob
+ if(istype(H.species, /datum/species/monkey))
+ return 1
+ return ..()
+
+
+/mob/living/simple_animal/slime/dark_purple
+ desc = "This slime produces ever-coveted phoron. Risky to handle but very much worth it."
+ color = "#660088"
+ slime_color = "dark purple"
+ coretype = /obj/item/slime_extract/dark_purple
+ reagent_injected = "phoron"
+
+ description_info = "This slime applies phoron to enemies it attacks. A biosuit or other thick armor can protect from the toxic attack. \
+ If hit with a burning attack, it will erupt in flames."
+
+ slime_mutation = list(
+ /mob/living/simple_animal/slime/purple,
+ /mob/living/simple_animal/slime/orange,
+ /mob/living/simple_animal/slime/ruby,
+ /mob/living/simple_animal/slime/ruby
+ )
+
+/mob/living/simple_animal/slime/dark_purple/proc/ignite()
+ visible_message("\The [src] erupts in an inferno!")
+ for(var/turf/simulated/target_turf in view(2, src))
+ target_turf.assume_gas("phoron", 30, 1500+T0C)
+ spawn(0)
+ target_turf.hotspot_expose(1500+T0C, 400)
+ qdel(src)
+
+/mob/living/simple_animal/slime/dark_purple/ex_act(severity)
+ log_and_message_admins("[src] ignited due to a chain reaction with an explosion.")
+ ignite()
+
+/mob/living/simple_animal/slime/dark_purple/fire_act(datum/gas_mixture/air, temperature, volume)
+ log_and_message_admins("[src] ignited due to exposure to fire.")
+ ignite()
+
+/mob/living/simple_animal/slime/dark_purple/bullet_act(var/obj/item/projectile/P, var/def_zone)
+ if(P.damage_type && P.damage_type == BURN && P.damage) // Most bullets won't trigger the explosion, as a mercy towards Security.
+ log_and_message_admins("[src] ignited due to bring hit by a burning projectile[P.firer ? " by [key_name(P.firer)]" : ""].")
+ ignite()
+ else
+ ..()
+
+/mob/living/simple_animal/slime/dark_purple/attackby(var/obj/item/weapon/W, var/mob/user)
+ if(istype(W) && W.force && W.damtype == BURN)
+ log_and_message_admins("[src] ignited due to being hit with a burning weapon ([W]) by [key_name(user)].")
+ ignite()
+ else
+ ..()
+
+
+
+
+/mob/living/simple_animal/slime/dark_blue
+ desc = "This slime makes other entities near it feel much colder, and is more resilient to the cold. It tends to kill other slimes rather quickly."
+ color = "#2398FF"
+ glows = TRUE
+ slime_color = "dark blue"
+ coretype = /obj/item/slime_extract/dark_blue
+
+ description_info = "This slime is immune to the cold, however water will still kill it. A winter coat or other cold-resistant clothing can protect from the chilling aura."
+
+ slime_mutation = list(
+ /mob/living/simple_animal/slime/purple,
+ /mob/living/simple_animal/slime/blue,
+ /mob/living/simple_animal/slime/cerulean,
+ /mob/living/simple_animal/slime/cerulean
+ )
+
+ minbodytemp = 0
+ cold_damage_per_tick = 0
+
+/mob/living/simple_animal/slime/dark_blue/Life()
+ if(stat != DEAD)
+ cold_aura()
+ ..()
+
+/mob/living/simple_animal/slime/dark_blue/proc/cold_aura()
+ for(var/mob/living/L in view(2, src))
+ var/protection = L.get_cold_protection()
+
+ if(protection < 1)
+ var/cold_factor = abs(protection - 1)
+ var/delta = -20
+ delta *= cold_factor
+ L.bodytemperature = max(50, L.bodytemperature + delta)
+ var/turf/T = get_turf(src)
+ var/datum/gas_mixture/env = T.return_air()
+ if(env)
+ env.add_thermal_energy(-10 * 1000)
+
+/mob/living/simple_animal/slime/dark_blue/get_cold_protection()
+ return 1 // This slime is immune to cold.
+
+// Surface variant
+/mob/living/simple_animal/slime/dark_blue/feral
+ name = "feral slime"
+ desc = "The result of slimes escaping containment from some xenobiology lab. The slime makes other entities near it feel much colder, \
+ and it is more resilient to the cold. These qualities have made this color of slime able to thrive on a harsh, cold world and is able to rival \
+ the ferocity of other apex predators in this region of Sif. As such, it is a very invasive species."
+ description_info = "This slime makes other entities near it feel much colder, and is more resilient to the cold. It also has learned advanced combat tactics from \
+ having to endure the harsh world outside its lab. Note that processing this large slime will give six cores."
+ icon_scale_x = 2
+ icon_scale_y = 2
+ optimal_combat = TRUE // Gotta be sharp to survive out there.
+ rabid = TRUE
+ rainbow_core_candidate = FALSE
+ cores = 6
+ maxHealth = 150
+ maxHealth_adult = 250
+ type_on_death = /mob/living/simple_animal/slime/dark_blue // Otherwise infinite slimes might occur.
+ pixel_y = -10 // Since the base sprite isn't centered properly, the pixel auto-adjustment needs some help.
+
+/mob/living/simple_animal/slime/dark_blue/feral/New()
+ ..()
+ make_adult()
+
+/mob/living/simple_animal/slime/silver
+ desc = "This slime is shiny, and can deflect lasers or other energy weapons directed at it."
+ color = "#AAAAAA"
+ slime_color = "silver"
+ coretype = /obj/item/slime_extract/silver
+ shiny = TRUE
+
+ description_info = "Tasers, including the slime version, are ineffective against this slime. The slimebation still works."
+
+ slime_mutation = list(
+ /mob/living/simple_animal/slime/metal,
+ /mob/living/simple_animal/slime/blue,
+ /mob/living/simple_animal/slime/amber,
+ /mob/living/simple_animal/slime/amber
+ )
+
+/mob/living/simple_animal/slime/silver/bullet_act(var/obj/item/projectile/P, var/def_zone)
+ if(istype(P,/obj/item/projectile/beam) || istype(P, /obj/item/projectile/energy))
+ visible_message("\The [src] reflects \the [P]!")
+
+ // Find a turf near or on the original location to bounce to
+ var/new_x = P.starting.x + pick(0, 0, 0, -1, 1, -2, 2)
+ var/new_y = P.starting.y + pick(0, 0, 0, -1, 1, -2, 2)
+ var/turf/curloc = get_turf(src)
+
+ // redirect the projectile
+ P.redirect(new_x, new_y, curloc, src)
+ return PROJECTILE_CONTINUE // complete projectile permutation
+ else
+ ..()
+
+
+// Tier 3
+
+/mob/living/simple_animal/slime/bluespace
+ desc = "Trapping this slime in a cell is generally futile, as it can teleport at will."
+ color = null
+ slime_color = "bluespace"
+ icon_state_override = "bluespace"
+ coretype = /obj/item/slime_extract/bluespace
+
+ description_info = "This slime will teleport to attack something if it is within a range of seven tiles. The teleport has a cooldown of five seconds."
+
+ slime_mutation = list(
+ /mob/living/simple_animal/slime/bluespace,
+ /mob/living/simple_animal/slime/bluespace,
+ /mob/living/simple_animal/slime/yellow,
+ /mob/living/simple_animal/slime/yellow
+ )
+
+ spattack_prob = 100
+ spattack_min_range = 3
+ spattack_max_range = 7
+ var/last_tele = null // Uses world.time
+ var/tele_cooldown = 5 SECONDS
+
+/mob/living/simple_animal/slime/bluespace/ClosestDistance() // Needed or the SA AI won't ever try to teleport.
+ if(world.time > last_tele + tele_cooldown)
+ return spattack_max_range - 1
+ return ..()
+
+/mob/living/simple_animal/slime/bluespace/SpecialAtkTarget()
+ // Teleport attack.
+ if(!target_mob)
+ to_chat(src, "There's nothing to teleport to.")
+ return FALSE
+
+ if(world.time < last_tele + tele_cooldown)
+ to_chat(src, "You can't teleport right now, wait a few seconds.")
+ return FALSE
+
+ var/list/nearby_things = range(1, target_mob)
+ var/list/valid_turfs = list()
+
+ // All this work to just go to a non-dense tile.
+ for(var/turf/potential_turf in nearby_things)
+ var/valid_turf = TRUE
+ if(potential_turf.density)
+ continue
+ for(var/atom/movable/AM in potential_turf)
+ if(AM.density)
+ valid_turf = FALSE
+ if(valid_turf)
+ valid_turfs.Add(potential_turf)
+
+
+
+ var/turf/T = get_turf(src)
+ var/turf/target_turf = pick(valid_turfs)
+
+ if(!target_turf)
+ to_chat(src, "There wasn't an unoccupied spot to teleport to.")
+ return FALSE
+
+ var/datum/effect/effect/system/spark_spread/s1 = new /datum/effect/effect/system/spark_spread
+ s1.set_up(5, 1, T)
+ var/datum/effect/effect/system/spark_spread/s2 = new /datum/effect/effect/system/spark_spread
+ s2.set_up(5, 1, target_turf)
+
+
+ T.visible_message("\The [src] vanishes!")
+ s1.start()
+
+ forceMove(target_turf)
+ playsound(target_turf, 'sound/effects/phasein.ogg', 50, 1)
+ to_chat(src, "You teleport to \the [target_turf].")
+
+ target_turf.visible_message("\The [src] appears!")
+ s2.start()
+
+ last_tele = world.time
+
+ if(Adjacent(target_mob))
+ PunchTarget()
+ return TRUE
+
+/mob/living/simple_animal/slime/ruby
+ desc = "This slime has great physical strength."
+ color = "#FF3333"
+ slime_color = "ruby"
+ shiny = TRUE
+ glows = TRUE
+ coretype = /obj/item/slime_extract/ruby
+
+ description_info = "This slime is unnaturally stronger, allowing it to hit much harder, take less damage, and be stunned for less time. \
+ Their glomp attacks also send the victim flying."
+
+ slime_mutation = list(
+ /mob/living/simple_animal/slime/dark_purple,
+ /mob/living/simple_animal/slime/dark_purple,
+ /mob/living/simple_animal/slime/ruby,
+ /mob/living/simple_animal/slime/ruby
+ )
+
+/mob/living/simple_animal/slime/ruby/New()
+ ..()
+ add_modifier(/datum/modifier/slime_strength, null, src) // Slime is always swole.
+
+/mob/living/simple_animal/slime/ruby/DoPunch(var/mob/living/L)
+ ..() // Do regular attacks.
+
+ if(istype(L))
+ if(a_intent == I_HURT)
+ visible_message("\The [src] sends \the [L] flying with the impact!")
+ playsound(src, "punch", 50, 1)
+ L.Weaken(1)
+ var/throwdir = get_dir(src, L)
+ L.throw_at(get_edge_target_turf(L, throwdir), 3, 1, src)
+
+
+/mob/living/simple_animal/slime/amber
+ desc = "This slime seems to be an expert in the culinary arts, as they create their own food to share with others. \
+ They would probably be very important to other slimes, if the other colors didn't try to kill them."
+ color = "#FFBB00"
+ slime_color = "amber"
+ shiny = TRUE
+ glows = TRUE
+ coretype = /obj/item/slime_extract/amber
+
+ description_info = "This slime feeds nearby entities passively while it is alive. This can cause uncontrollable \
+ slime growth and reproduction if not kept in check. The amber slime cannot feed itself, but can be fed by other amber slimes."
+
+ slime_mutation = list(
+ /mob/living/simple_animal/slime/silver,
+ /mob/living/simple_animal/slime/silver,
+ /mob/living/simple_animal/slime/amber,
+ /mob/living/simple_animal/slime/amber
+ )
+
+/mob/living/simple_animal/slime/amber/Life()
+ if(stat != DEAD)
+ feed_aura()
+ ..()
+
+/mob/living/simple_animal/slime/amber/proc/feed_aura()
+ for(var/mob/living/L in view(2, src))
+ if(L == src) // Don't feed themselves, or it is impossible to stop infinite slimes without killing all of the ambers.
+ continue
+ if(isslime(L))
+ var/mob/living/simple_animal/slime/S = L
+ S.adjust_nutrition(rand(15, 25))
+ if(ishuman(L))
+ var/mob/living/carbon/human/H = L
+ if(H.isSynthetic())
+ continue
+ H.nutrition = between(0, H.nutrition + rand(15, 25), 600)
+
+
+
+/mob/living/simple_animal/slime/cerulean
+ desc = "This slime is generally superior in a wide range of attributes, compared to the common slime. The jack of all trades, but master of none."
+ color = "#4F7EAA"
+ slime_color = "cerulean"
+ coretype = /obj/item/slime_extract/cerulean
+
+ // Less than the specialized slimes, but higher than the rest.
+ maxHealth = 200
+ maxHealth_adult = 250
+
+ melee_damage_lower = 10
+ melee_damage_upper = 30
+
+ move_to_delay = 3
+
+
+
+ slime_mutation = list(
+ /mob/living/simple_animal/slime/dark_blue,
+ /mob/living/simple_animal/slime/dark_blue,
+ /mob/living/simple_animal/slime/cerulean,
+ /mob/living/simple_animal/slime/cerulean
+ )
+
+// Tier 4
+
+/mob/living/simple_animal/slime/red
+ desc = "This slime is full of energy, and very aggressive. 'The red ones go faster.' seems to apply here."
+ color = "#FF3333"
+ slime_color = "red"
+ coretype = /obj/item/slime_extract/red
+ move_to_delay = 3 // The red ones go faster.
+
+ description_info = "This slime is faster than the others. Attempting to discipline this slime will always cause it to go berserk."
+
+ slime_mutation = list(
+ /mob/living/simple_animal/slime/red,
+ /mob/living/simple_animal/slime/oil,
+ /mob/living/simple_animal/slime/oil,
+ /mob/living/simple_animal/slime/orange
+ )
+
+
+/mob/living/simple_animal/slime/red/adjust_discipline(amount)
+ if(amount > 0)
+ if(!rabid)
+ enrage() // How dare you try to control the red slime.
+ say("Grrr...!")
+
+/mob/living/simple_animal/slime/red/enrage()
+ ..()
+ add_modifier(/datum/modifier/berserk, 30 SECONDS)
+
+
+/mob/living/simple_animal/slime/green
+ desc = "This slime is radioactive."
+ color = "#14FF20"
+ slime_color = "green"
+ coretype = /obj/item/slime_extract/green
+ glows = TRUE
+ reagent_injected = "radium"
+ var/rads = 25
+
+ description_info = "This slime will irradiate anything nearby passively, and will inject radium on attack. \
+ A radsuit or other thick and radiation-hardened armor can protect from this. It will only radiate while alive."
+
+ slime_mutation = list(
+ /mob/living/simple_animal/slime/purple,
+ /mob/living/simple_animal/slime/green,
+ /mob/living/simple_animal/slime/emerald,
+ /mob/living/simple_animal/slime/emerald
+ )
+
+/mob/living/simple_animal/slime/green/Life()
+ if(stat != DEAD)
+ irradiate()
+ ..()
+
+/mob/living/simple_animal/slime/green/proc/irradiate()
+ radiation_repository.radiate(src, rads)
+
+
+/mob/living/simple_animal/slime/pink
+ desc = "This slime has regenerative properties."
+ color = "#FF0080"
+ slime_color = "pink"
+ coretype = /obj/item/slime_extract/pink
+ glows = TRUE
+
+ description_info = "This slime will passively heal nearby entities within two tiles, including itself. It will only do this while alive."
+
+ slime_mutation = list(
+ /mob/living/simple_animal/slime/blue,
+ /mob/living/simple_animal/slime/light_pink,
+ /mob/living/simple_animal/slime/light_pink,
+ /mob/living/simple_animal/slime/pink
+ )
+
+/mob/living/simple_animal/slime/pink/Life()
+ if(stat != DEAD)
+ heal_aura()
+ ..()
+
+/mob/living/simple_animal/slime/pink/proc/heal_aura()
+ for(var/mob/living/L in view(src, 2))
+ if(L.stat == DEAD || L == target_mob)
+ continue
+ L.add_modifier(/datum/modifier/slime_heal, 5 SECONDS, src)
+
+/datum/modifier/slime_heal
+ name = "slime mending"
+ desc = "You feel somewhat gooy."
+ mob_overlay_state = "pink_sparkles"
+
+ on_created_text = "Twinkling spores of goo surround you. It makes you feel healthier."
+ on_expired_text = "The spores of goo have faded, although you feel much healthier than before."
+ stacks = MODIFIER_STACK_EXTEND
+
+/datum/modifier/slime_heal/tick()
+ if(holder.stat == DEAD) // Required or else simple animals become immortal.
+ expire()
+
+ if(ishuman(holder)) // Robolimbs need this code sadly.
+ var/mob/living/carbon/human/H = holder
+ for(var/obj/item/organ/external/E in H.organs)
+ var/obj/item/organ/external/O = E
+ O.heal_damage(2, 2, 0, 1)
+ else
+ holder.adjustBruteLoss(-2)
+ holder.adjustFireLoss(-2)
+
+ holder.adjustToxLoss(-2)
+ holder.adjustOxyLoss(-2)
+ holder.adjustCloneLoss(-1)
+
+
+
+/mob/living/simple_animal/slime/gold
+ desc = "This slime absorbs energy, and cannot be stunned by normal means."
+ color = "#EEAA00"
+ shiny = TRUE
+ slime_color = "gold"
+ coretype = /obj/item/slime_extract/gold
+ description_info = "This slime is immune to the slimebaton and taser, and will actually charge the slime, however it will still discipline the slime."
+
+ slime_mutation = list(
+ /mob/living/simple_animal/slime/metal,
+ /mob/living/simple_animal/slime/gold,
+ /mob/living/simple_animal/slime/sapphire,
+ /mob/living/simple_animal/slime/sapphire
+ )
+
+/mob/living/simple_animal/slime/gold/Weaken(amount)
+ power_charge = between(0, power_charge + amount, 10)
+ return
+
+/mob/living/simple_animal/slime/gold/Stun(amount)
+ power_charge = between(0, power_charge + amount, 10)
+ return
+
+/mob/living/simple_animal/slime/gold/get_description_interaction() // So it doesn't say to use a baton on them.
+ return list()
+
+
+// Tier 5
+
+/mob/living/simple_animal/slime/oil
+ desc = "This slime is explosive and volatile. Smoking near it is probably a bad idea."
+ color = "#333333"
+ slime_color = "oil"
+ shiny = TRUE
+ coretype = /obj/item/slime_extract/oil
+
+ description_info = "If this slime suffers damage from a fire or heat based source, or if it is caught inside \
+ an explosion, it will explode. Rabid oil slimes will charge at enemies, then suicide-bomb themselves. \
+ Bomb suits can protect from the explosion."
+
+ slime_mutation = list(
+ /mob/living/simple_animal/slime/oil,
+ /mob/living/simple_animal/slime/oil,
+ /mob/living/simple_animal/slime/red,
+ /mob/living/simple_animal/slime/red
+ )
+
+/mob/living/simple_animal/slime/oil/proc/explode()
+ if(stat != DEAD)
+ // explosion(src.loc, 1, 2, 4)
+ explosion(src.loc, 0, 2, 4) // A bit weaker since the suicide charger tended to gib the poor sod being targeted.
+ if(src) // Delete ourselves if the explosion didn't do it.
+ qdel(src)
+
+/mob/living/simple_animal/slime/oil/post_attack(var/mob/living/L, var/intent = I_HURT)
+ if(!rabid)
+ return ..()
+ if(intent == I_HURT || intent == I_GRAB)
+ say(pick("Sacrifice...!", "Sssss...", "Boom...!"))
+ sleep(2 SECOND)
+ log_and_message_admins("[src] has suicide-bombed themselves while trying to kill \the [L].")
+ explode()
+
+/mob/living/simple_animal/slime/oil/ex_act(severity)
+ log_and_message_admins("[src] exploded due to a chain reaction with another explosion.")
+ explode()
+
+/mob/living/simple_animal/slime/oil/fire_act(datum/gas_mixture/air, temperature, volume)
+ log_and_message_admins("[src] exploded due to exposure to fire.")
+ explode()
+
+/mob/living/simple_animal/slime/oil/bullet_act(var/obj/item/projectile/P, var/def_zone)
+ if(P.damage_type && P.damage_type == BURN && P.damage) // Most bullets won't trigger the explosion, as a mercy towards Security.
+ log_and_message_admins("[src] exploded due to bring hit by a burning projectile[P.firer ? " by [key_name(P.firer)]" : ""].")
+ explode()
+ else
+ ..()
+
+/mob/living/simple_animal/slime/oil/attackby(var/obj/item/weapon/W, var/mob/user)
+ if(istype(W) && W.force && W.damtype == BURN)
+ log_and_message_admins("[src] exploded due to being hit with a burning weapon ([W]) by [key_name(user)].")
+ explode()
+ else
+ ..()
+
+
+/mob/living/simple_animal/slime/sapphire
+ desc = "This slime seems a bit brighter than the rest, both figuratively and literally."
+ color = "#2398FF"
+ slime_color = "sapphire"
+ shiny = TRUE
+ glows = TRUE
+ coretype = /obj/item/slime_extract/sapphire
+
+ optimal_combat = TRUE // Lift combat AI restrictions to look smarter.
+ run_at_them = FALSE // Use fancy A* pathing.
+ astar_adjacent_proc = /turf/proc/TurfsWithAccess // Normal slimes don't care about cardinals (because BYOND) so smart slimes shouldn't as well.
+ move_to_delay = 3 // A* chasing is slightly slower in terms of movement speed than regular pathing so reducing this hopefully makes up for that.
+
+ description_info = "This slime uses more robust tactics when fighting and won't hold back, so it is dangerous to be alone \
+ with one if hostile, and especially dangerous if they outnumber you."
+
+ slime_mutation = list(
+ /mob/living/simple_animal/slime/sapphire,
+ /mob/living/simple_animal/slime/sapphire,
+ /mob/living/simple_animal/slime/gold,
+ /mob/living/simple_animal/slime/gold
+ )
+
+/mob/living/simple_animal/slime/emerald
+ desc = "This slime is faster than usual, even more so than the red slimes."
+ color = "#22FF22"
+ shiny = TRUE
+ glows = TRUE
+ slime_color = "emerald"
+ coretype = /obj/item/slime_extract/emerald
+
+ description_info = "This slime will make everything around it, and itself, faster for a few seconds, if close by."
+ move_to_delay = 2
+
+ slime_mutation = list(
+ /mob/living/simple_animal/slime/green,
+ /mob/living/simple_animal/slime/green,
+ /mob/living/simple_animal/slime/emerald,
+ /mob/living/simple_animal/slime/emerald
+ )
+
+/mob/living/simple_animal/slime/emerald/Life()
+ if(stat != DEAD)
+ zoom_aura()
+ ..()
+
+/mob/living/simple_animal/slime/emerald/proc/zoom_aura()
+ for(var/mob/living/L in view(src, 2))
+ if(L.stat == DEAD || L == target_mob)
+ continue
+ L.add_modifier(/datum/modifier/technomancer/haste, 5 SECONDS, src)
+
+/mob/living/simple_animal/slime/light_pink
+ desc = "This slime seems a lot more peaceful than the others."
+ color = "#FF8888"
+ slime_color = "light pink"
+ coretype = /obj/item/slime_extract/light_pink
+
+ description_info = "This slime is effectively always disciplined initially."
+ obedience = 5
+ discipline = 5
+
+ slime_mutation = list(
+ /mob/living/simple_animal/slime/pink,
+ /mob/living/simple_animal/slime/pink,
+ /mob/living/simple_animal/slime/light_pink,
+ /mob/living/simple_animal/slime/light_pink
+ )
+
+// Special
+/mob/living/simple_animal/slime/rainbow
+ desc = "This slime changes colors constantly."
+ color = null // Only slime subtype that uses a different icon_state.
+ slime_color = "rainbow"
+ coretype = /obj/item/slime_extract/rainbow
+ icon_state_override = "rainbow"
+ unity = TRUE
+
+ description_info = "This slime is considered to be the same color as all other slime colors at the same time for the purposes of \
+ other slimes being friendly to them, and therefore will never be harmed by another slime. \
+ Attacking this slime will provoke the wrath of all slimes within range."
+
+ slime_mutation = list(
+ /mob/living/simple_animal/slime/rainbow,
+ /mob/living/simple_animal/slime/rainbow,
+ /mob/living/simple_animal/slime/rainbow,
+ /mob/living/simple_animal/slime/rainbow
+ )
+
+/mob/living/simple_animal/slime/rainbow/New()
+ unify()
+ ..()
+
+// The RD's pet slime.
+/mob/living/simple_animal/slime/rainbow/kendrick
+ name = "Kendrick"
+ desc = "The Research Director's pet slime. It shifts colors constantly."
+ rainbow_core_candidate = FALSE
+
+/mob/living/simple_animal/slime/rainbow/kendrick/New()
+ pacify()
+ ..()
\ No newline at end of file
diff --git a/code/modules/mob/living/simple_mob/subtypes/animal/pets/bird.dm b/code/modules/mob/living/simple_mob/subtypes/animal/pets/bird.dm
index 5e77a57a3cc..4042dd30b4a 100644
--- a/code/modules/mob/living/simple_mob/subtypes/animal/pets/bird.dm
+++ b/code/modules/mob/living/simple_mob/subtypes/animal/pets/bird.dm
@@ -57,7 +57,8 @@
icon_state = "commonblackbird"
icon_dead = "commonblackbird-dead"
tt_desc = "E Turdus merula"
- icon_scale = 0.5
+ icon_scale_x = 0.5
+ icon_scale_y = 0.5
/mob/living/simple_mob/animal/passive/bird/azure_tit
name = "azure tit"
@@ -65,7 +66,8 @@
icon_state = "azuretit"
icon_dead = "azuretit-dead"
tt_desc = "E Cyanistes cyanus"
- icon_scale = 0.5
+ icon_scale_x = 0.5
+ icon_scale_y = 0.5
/mob/living/simple_mob/animal/passive/bird/european_robin
name = "european robin"
@@ -73,7 +75,8 @@
icon_state = "europeanrobin"
icon_dead = "europeanrobin-dead"
tt_desc = "E Erithacus rubecula"
- icon_scale = 0.5
+ icon_scale_x = 0.5
+ icon_scale_y = 0.5
/mob/living/simple_mob/animal/passive/bird/goldcrest
name = "goldcrest"
@@ -82,7 +85,8 @@
icon_state = "goldcrest"
icon_dead = "goldcrest-dead"
tt_desc = "E Regulus regulus"
- icon_scale = 0.5
+ icon_scale_x = 0.5
+ icon_scale_y = 0.5
/mob/living/simple_mob/animal/passive/bird/ringneck_dove
name = "ringneck dove"
@@ -90,4 +94,5 @@
icon_state = "ringneckdove"
icon_dead = "ringneckdove-dead"
tt_desc = "E Streptopelia risoria" // This is actually disputed IRL but since we can't tell the future it'll stay the same for 500+ years.
- icon_scale = 0.5
+ icon_scale_x = 0.5
+ icon_scale_y = 0.5
diff --git a/code/modules/mob/living/simple_mob/subtypes/animal/sif/hooligan_crab.dm b/code/modules/mob/living/simple_mob/subtypes/animal/sif/hooligan_crab.dm
index ca8288e421e..32eccb00af6 100644
--- a/code/modules/mob/living/simple_mob/subtypes/animal/sif/hooligan_crab.dm
+++ b/code/modules/mob/living/simple_mob/subtypes/animal/sif/hooligan_crab.dm
@@ -32,7 +32,8 @@
icon_state = "sif_crab"
icon_living = "sif_crab"
icon_dead = "sif_crab_dead"
- icon_scale = 1.5
+ icon_scale_x = 1.5
+ icon_scale_y = 1.5
faction = "crabs"
diff --git a/code/modules/mob/living/simple_mob/subtypes/animal/sif/shantak.dm b/code/modules/mob/living/simple_mob/subtypes/animal/sif/shantak.dm
index 881615138e0..bb6a25604a9 100644
--- a/code/modules/mob/living/simple_mob/subtypes/animal/sif/shantak.dm
+++ b/code/modules/mob/living/simple_mob/subtypes/animal/sif/shantak.dm
@@ -67,7 +67,8 @@
name = "big shantak"
desc = "A piglike creature with a bright iridiscent mane that sparkles as though lit by an inner light. \
This one seems bigger than the others, and has a commanding presence."
- icon_scale = 1.5
+ icon_scale_x = 1.5
+ icon_scale_y = 1.5
maxHealth = 125
player_msg = "You have the ability to command other shantaks to follow you."
diff --git a/code/modules/mob/living/simple_mob/subtypes/mechanical/hivebot/ranged_damage.dm b/code/modules/mob/living/simple_mob/subtypes/mechanical/hivebot/ranged_damage.dm
index 5e4d877751a..bf2e3eb18a4 100644
--- a/code/modules/mob/living/simple_mob/subtypes/mechanical/hivebot/ranged_damage.dm
+++ b/code/modules/mob/living/simple_mob/subtypes/mechanical/hivebot/ranged_damage.dm
@@ -105,7 +105,8 @@
name = "siege engine hivebot"
desc = "A large robot capable of delivering long range bombardment."
projectiletype = /obj/item/projectile/arc/test
- icon_scale = 2
+ icon_scale_x = 2
+ icon_scale_y = 2
icon_state = "red"
icon_living = "red"
diff --git a/code/modules/mob/living/simple_mob/subtypes/mechanical/hivebot/tank.dm b/code/modules/mob/living/simple_mob/subtypes/mechanical/hivebot/tank.dm
index 007f190c047..7f4e10f05dd 100644
--- a/code/modules/mob/living/simple_mob/subtypes/mechanical/hivebot/tank.dm
+++ b/code/modules/mob/living/simple_mob/subtypes/mechanical/hivebot/tank.dm
@@ -39,7 +39,8 @@
desc = "A large robot."
maxHealth = 10 LASERS_TO_KILL // 300 health
health = 10 LASERS_TO_KILL
- icon_scale = 2
+ icon_scale_x = 2
+ icon_scale_y = 2
player_msg = "You have a very large amount of health."
@@ -49,7 +50,8 @@
desc = "A robot clad in heavy armor."
maxHealth = 5 LASERS_TO_KILL // 150 health.
health = 5 LASERS_TO_KILL
- icon_scale = 1.5
+ icon_scale_x = 1.5
+ icon_scale_y = 1.5
player_msg = "You are heavily armored."
// Note that armor effectively makes lasers do about 9 damage instead of 30,
// so it has an effective health of ~16.6 LASERS_TO_KILL if regular lasers are used.
diff --git a/code/modules/mob/living/simple_mob/subtypes/mechanical/mecha/adv_dark_gygax.dm b/code/modules/mob/living/simple_mob/subtypes/mechanical/mecha/adv_dark_gygax.dm
index 2f9420bf64b..39708365dfd 100644
--- a/code/modules/mob/living/simple_mob/subtypes/mechanical/mecha/adv_dark_gygax.dm
+++ b/code/modules/mob/living/simple_mob/subtypes/mechanical/mecha/adv_dark_gygax.dm
@@ -77,7 +77,8 @@
catalogue_data = list(/datum/category_item/catalogue/technology/adv_dark_gygax)
icon_state = "darkgygax_adv"
wreckage = /obj/structure/loot_pile/mecha/gygax/dark/adv
- icon_scale = 1.5
+ icon_scale_x = 1.5
+ icon_scale_y = 1.5
movement_shake_radius = 14
maxHealth = 450
diff --git a/code/modules/mob/living/simple_mob/subtypes/occult/constructs/juggernaut.dm b/code/modules/mob/living/simple_mob/subtypes/occult/constructs/juggernaut.dm
index 31dfa4d34a7..8a56f08ddd4 100644
--- a/code/modules/mob/living/simple_mob/subtypes/occult/constructs/juggernaut.dm
+++ b/code/modules/mob/living/simple_mob/subtypes/occult/constructs/juggernaut.dm
@@ -106,7 +106,8 @@
friendly = list("pokes") //Anything nice the Behemoth would do would still Kill the Human. Leave it at poke.
attack_sound = 'sound/weapons/heavysmash.ogg'
resistance = 10
- icon_scale = 2
+ icon_scale_x = 2
+ icon_scale_y = 2
var/energy = 0
var/max_energy = 1000
armor = list(
diff --git a/code/modules/mob/living/simple_mob/subtypes/slime/feral/feral.dm b/code/modules/mob/living/simple_mob/subtypes/slime/feral/feral.dm
index 91aa0b0a798..1470aed9481 100644
--- a/code/modules/mob/living/simple_mob/subtypes/slime/feral/feral.dm
+++ b/code/modules/mob/living/simple_mob/subtypes/slime/feral/feral.dm
@@ -1,3 +1,4 @@
+<<<<<<< HEAD
// These slimes lack certain xenobio features but get more combat-oriented goodies. Generally these are more oriented towards Explorers than Xenobiologists.
/mob/living/simple_mob/slime/feral
@@ -92,3 +93,101 @@
if(L.has_AI()) // Other AIs should react to hostile auras.
L.ai_holder.react_to_attack(src)
+=======
+// These slimes lack certain xenobio features but get more combat-oriented goodies. Generally these are more oriented towards Explorers than Xenobiologists.
+
+/mob/living/simple_mob/slime/feral
+ name = "feral slime"
+ desc = "The result of slimes escaping containment from some xenobiology lab. \
+ Having the means to successfully escape their lab, as well as having to survive on a harsh, cold world has made these \
+ creatures rival the ferocity of other apex predators in this region of Sif. It is considered to be a very invasive species."
+ description_info = "Note that processing this large slime will give six cores."
+
+ cores = 6 // Xenobio will love getting their hands on these.
+
+ icon_state = "slime adult"
+ icon_living = "slime adult"
+ icon_dead = "slime adult dead"
+ glow_range = 5
+ glow_intensity = 4
+ icon_scale_x = 2 // Twice as big as the xenobio variant.
+ icon_scale_y = 2
+ pixel_y = -10 // Since the base sprite isn't centered properly, the pixel auto-adjustment needs some help.
+ default_pixel_y = -10 // To prevent resetting above var.
+
+ maxHealth = 300
+ movement_cooldown = 10
+ melee_attack_delay = 0.5 SECONDS
+
+ ai_holder_type = /datum/ai_holder/simple_mob/ranged/pointblank
+
+
+// Slimebatoning/xenotasing it just makes it mad at you (which can be good if you're heavily armored and your friends aren't).
+/mob/living/simple_mob/slime/feral/slimebatoned(mob/living/user, amount)
+ taunt(user, TRUE)
+
+
+// ***********
+// *Dark Blue*
+// ***********
+
+// Dark Blue feral slimes can fire a strong icicle projectile every few seconds. The icicle hits hard and has some armor penetration.
+// They also have a similar aura as their xenobio counterparts, which inflicts cold damage. It also chills non-resistant mobs.
+
+/mob/living/simple_mob/slime/feral/dark_blue
+ name = "dark blue feral slime"
+ color = "#2398FF"
+ glow_toggle = TRUE
+ slime_color = "dark blue"
+ coretype = /obj/item/slime_extract/dark_blue
+ cold_resist = 1 // Complete immunity.
+ minbodytemp = 0
+ cold_damage_per_tick = 0
+
+ projectiletype = /obj/item/projectile/icicle
+ base_attack_cooldown = 2 SECONDS
+ ranged_attack_delay = 1 SECOND
+
+ player_msg = "You can fire an icicle projectile every two seconds. It hits hard, and armor has a hard time resisting it.
\
+ You are also immune to the cold, and you cause enemies around you to suffer periodic harm from the cold, if unprotected.
\
+ Unprotected enemies are also Chilled, making them slower and less evasive, and disabling effects last longer."
+
+/obj/item/projectile/icicle
+ name = "icicle"
+ icon_state = "ice_2"
+ damage = 40
+ damage_type = BRUTE
+ check_armour = "melee"
+ armor_penetration = 30
+ speed = 2
+ icon_scale_x = 2 // It hits like a truck.
+ icon_scale_y = 2
+ sharp = TRUE
+
+/obj/item/projectile/icicle/on_impact(atom/A)
+ playsound(get_turf(A), "shatter", 70, 1)
+ return ..()
+
+/obj/item/projectile/icicle/get_structure_damage()
+ return damage / 2 // They're really deadly against mobs, but less effective against solid things.
+
+/mob/living/simple_mob/slime/feral/dark_blue/handle_special()
+ if(stat != DEAD)
+ cold_aura()
+ ..()
+
+/mob/living/simple_mob/slime/feral/dark_blue/proc/cold_aura()
+ for(var/mob/living/L in view(3, src))
+ if(L == src)
+ continue
+ chill(L)
+
+/mob/living/simple_mob/slime/feral/dark_blue/proc/chill(mob/living/L)
+ L.inflict_cold_damage(10)
+ if(L.get_cold_protection() < 1)
+ L.add_modifier(/datum/modifier/chilled, 5 SECONDS, src)
+
+ if(L.has_AI()) // Other AIs should react to hostile auras.
+ L.ai_holder.react_to_attack(src)
+
+>>>>>>> ef7568a... Merge pull request #6154 from Mechoid/Sif_Tree_Expansion
diff --git a/code/modules/projectiles/projectile/arc.dm b/code/modules/projectiles/projectile/arc.dm
index 97069db1fb3..0c4c9f4caa9 100644
--- a/code/modules/projectiles/projectile/arc.dm
+++ b/code/modules/projectiles/projectile/arc.dm
@@ -162,7 +162,8 @@
/obj/item/projectile/arc/radioactive
name = "radiation blast"
icon_state = "green_pellet"
- icon_scale = 2
+ icon_scale_x = 2
+ icon_scale_y = 2
var/rad_power = 50
/obj/item/projectile/arc/radioactive/on_impact(turf/T)
diff --git a/icons/obj/flora/deadtrees.dmi b/icons/obj/flora/deadtrees.dmi
index 7a0b164619c..2a3655b0d2a 100644
Binary files a/icons/obj/flora/deadtrees.dmi and b/icons/obj/flora/deadtrees.dmi differ