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