mirror of
https://github.com/CHOMPStation2/CHOMPStation2.git
synced 2025-12-11 18:53:06 +00:00
Sif Trees and Icon Scaling
This commit is contained in:
@@ -16,7 +16,8 @@
|
|||||||
var/moved_recently = 0
|
var/moved_recently = 0
|
||||||
var/mob/pulledby = null
|
var/mob/pulledby = null
|
||||||
var/item_state = null // Used to specify the item state for the on-mob overlays.
|
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/icon_rotation = 0 // Used to rotate icons in update_transform()
|
||||||
var/old_x = 0
|
var/old_x = 0
|
||||||
var/old_y = 0
|
var/old_y = 0
|
||||||
@@ -476,13 +477,18 @@
|
|||||||
|
|
||||||
/atom/movable/proc/update_transform()
|
/atom/movable/proc/update_transform()
|
||||||
var/matrix/M = matrix()
|
var/matrix/M = matrix()
|
||||||
M.Scale(icon_scale)
|
M.Scale(icon_scale_x, icon_scale_y)
|
||||||
M.Turn(icon_rotation)
|
M.Turn(icon_rotation)
|
||||||
src.transform = M
|
src.transform = M
|
||||||
|
|
||||||
// Use this to set the object's scale.
|
// Use this to set the object's scale.
|
||||||
/atom/movable/proc/adjust_scale(new_scale)
|
/atom/movable/proc/adjust_scale(new_scale_x, new_scale_y)
|
||||||
icon_scale = new_scale
|
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()
|
update_transform()
|
||||||
|
|
||||||
/atom/movable/proc/adjust_rotation(new_rotation)
|
/atom/movable/proc/adjust_rotation(new_rotation)
|
||||||
|
|||||||
@@ -14,11 +14,27 @@
|
|||||||
var/product_amount = 10 // How much of a stack you get, if the above is defined.
|
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/is_stump = FALSE // If true, suspends damage tracking and most other effects.
|
||||||
var/indestructable = FALSE // If true, the tree cannot die.
|
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()
|
/obj/structure/flora/tree/Initialize()
|
||||||
icon_state = choose_icon_state()
|
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 ..()
|
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.
|
// Override this for special icons.
|
||||||
/obj/structure/flora/tree/proc/choose_icon_state()
|
/obj/structure/flora/tree/proc/choose_icon_state()
|
||||||
return icon_state
|
return icon_state
|
||||||
@@ -57,8 +73,11 @@
|
|||||||
/obj/structure/flora/tree/proc/hit_animation()
|
/obj/structure/flora/tree/proc/hit_animation()
|
||||||
var/init_px = pixel_x
|
var/init_px = pixel_x
|
||||||
var/shake_dir = pick(-1, 1)
|
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)
|
var/matrix/M = matrix()
|
||||||
animate(transform=null, pixel_x=init_px, time=6, easing=ELASTIC_EASING)
|
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.
|
// Used when the tree gets hurt.
|
||||||
/obj/structure/flora/tree/proc/adjust_health(var/amount, var/damage_wood = FALSE)
|
/obj/structure/flora/tree/proc/adjust_health(var/amount, var/damage_wood = FALSE)
|
||||||
@@ -247,13 +266,19 @@
|
|||||||
base_state = "tree_sif"
|
base_state = "tree_sif"
|
||||||
product = /obj/item/stack/material/log/sif
|
product = /obj/item/stack/material/log/sif
|
||||||
catalogue_data = list(/datum/category_item/catalogue/flora/sif_tree)
|
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()
|
/obj/structure/flora/tree/sif/Initialize()
|
||||||
|
. = ..()
|
||||||
update_icon()
|
update_icon()
|
||||||
return ..()
|
|
||||||
|
|
||||||
/obj/structure/flora/tree/sif/update_icon()
|
/obj/structure/flora/tree/sif/update_icon()
|
||||||
set_light(5, 1, "#33ccff")
|
set_light(5 - light_shift, 1, "#33ccff") // 5 variants, missing bulbs. 5th has no bulbs, so no glow.
|
||||||
var/image/glow = image(icon = 'icons/obj/flora/deadtrees.dmi', icon_state = "[base_state]_glow")
|
var/image/glow = image(icon = icon, icon_state = "[base_state][light_shift]_glow")
|
||||||
glow.plane = PLANE_LIGHTING_ABOVE
|
glow.plane = PLANE_LIGHTING_ABOVE
|
||||||
overlays = list(glow)
|
overlays = list(glow)
|
||||||
|
|||||||
@@ -781,7 +781,8 @@ Loot piles can be depleted, if loot_depleted is turned on. Note that players wh
|
|||||||
// Todo: Better loot.
|
// Todo: Better loot.
|
||||||
/obj/structure/loot_pile/mecha/gygax/dark/adv
|
/obj/structure/loot_pile/mecha/gygax/dark/adv
|
||||||
icon_state = "darkgygax_adv-broken"
|
icon_state = "darkgygax_adv-broken"
|
||||||
icon_scale = 1.5
|
icon_scale_x = 1.5
|
||||||
|
icon_scale_y = 1.5
|
||||||
pixel_y = 8
|
pixel_y = 8
|
||||||
|
|
||||||
/obj/structure/loot_pile/mecha/gygax/medgax
|
/obj/structure/loot_pile/mecha/gygax/medgax
|
||||||
|
|||||||
@@ -42,7 +42,8 @@
|
|||||||
var/accuracy // Positive numbers makes hitting things with guns easier, negatives make it harder.
|
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/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/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/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/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.
|
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)
|
holder.modifiers.Remove(src)
|
||||||
if(mob_overlay_state) // We do this after removing ourselves from the list so that the overlay won't remain.
|
if(mob_overlay_state) // We do this after removing ourselves from the list so that the overlay won't remain.
|
||||||
holder.update_modifier_visuals()
|
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()
|
holder.update_transform()
|
||||||
if(client_color)
|
if(client_color)
|
||||||
holder.update_client_color()
|
holder.update_client_color()
|
||||||
@@ -140,7 +141,7 @@
|
|||||||
mod.on_applied()
|
mod.on_applied()
|
||||||
if(mod.mob_overlay_state)
|
if(mod.mob_overlay_state)
|
||||||
update_modifier_visuals()
|
update_modifier_visuals()
|
||||||
if(mod.icon_scale_percent)
|
if(mod.icon_scale_x_percent || mod.icon_scale_y_percent)
|
||||||
update_transform()
|
update_transform()
|
||||||
if(mod.client_color)
|
if(mod.client_color)
|
||||||
update_client_color()
|
update_client_color()
|
||||||
@@ -232,8 +233,11 @@
|
|||||||
effects += "Your metabolism is [metabolism_percent > 1.0 ? "faster" : "slower"], \
|
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"]."
|
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))
|
if(!isnull(icon_scale_x_percent))
|
||||||
effects += "Your appearance is [multipler_to_percentage(icon_scale_percent, TRUE)] [icon_scale_percent > 1 ? "larger" : "smaller"]."
|
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))
|
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"]."
|
effects += "The delay between attacking is [multipler_to_percentage(attack_speed_percent, TRUE)] [disable_duration_percent > 1.0 ? "longer" : "shorter"]."
|
||||||
|
|||||||
@@ -56,7 +56,8 @@ the artifact triggers the rage.
|
|||||||
outgoing_melee_damage_percent = 1.5 // 50% more damage from melee.
|
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.
|
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.
|
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).
|
pain_immunity = TRUE // Avoid falling over from shock (at least until it expires).
|
||||||
|
|
||||||
// The less good stuff.
|
// The less good stuff.
|
||||||
|
|||||||
@@ -64,25 +64,29 @@
|
|||||||
name = "Larger"
|
name = "Larger"
|
||||||
desc = "Your body is larger than average."
|
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
|
/datum/modifier/trait/large
|
||||||
name = "Large"
|
name = "Large"
|
||||||
desc = "Your body is a bit larger than average."
|
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
|
/datum/modifier/trait/small
|
||||||
name = "Small"
|
name = "Small"
|
||||||
desc = "Your body is a bit smaller than average."
|
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
|
/datum/modifier/trait/smaller
|
||||||
name = "Smaller"
|
name = "Smaller"
|
||||||
desc = "Your body is smaller than average."
|
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
|
/datum/modifier/trait/colorblind_protanopia
|
||||||
name = "Protanopia"
|
name = "Protanopia"
|
||||||
|
|||||||
@@ -14,7 +14,8 @@
|
|||||||
|
|
||||||
disable_duration_percent = 0.25 // Disables only last 25% as long.
|
disable_duration_percent = 0.25 // Disables only last 25% as long.
|
||||||
incoming_damage_percent = 0.5 // 50% incoming damage.
|
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
|
pain_immunity = TRUE
|
||||||
|
|
||||||
slowdown = 2
|
slowdown = 2
|
||||||
|
|||||||
@@ -1139,8 +1139,13 @@
|
|||||||
if(species.default_language)
|
if(species.default_language)
|
||||||
add_language(species.default_language)
|
add_language(species.default_language)
|
||||||
|
|
||||||
|
<<<<<<< HEAD
|
||||||
//if(species.icon_scale != 1) //VOREStation Removal
|
//if(species.icon_scale != 1) //VOREStation Removal
|
||||||
// update_transform() //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) //VOREStation Edit begin
|
||||||
if(!(example == src))
|
if(!(example == src))
|
||||||
|
|||||||
@@ -32,7 +32,8 @@
|
|||||||
var/tail_animation // If set, the icon to obtain tail animation states from.
|
var/tail_animation // If set, the icon to obtain tail animation states from.
|
||||||
var/tail_hair
|
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/race_key = 0 // Used for mob icon cache string.
|
||||||
var/icon/icon_template // Used for mob icon generation for non-32x32 species.
|
var/icon/icon_template // Used for mob icon generation for non-32x32 species.
|
||||||
|
|||||||
@@ -124,16 +124,25 @@ var/global/list/damage_icon_parts = list() //see UpdateDamageIcon()
|
|||||||
/mob/living/carbon/human/update_transform()
|
/mob/living/carbon/human/update_transform()
|
||||||
/* VOREStation Edit START - TODO - Consider switching to icon_scale
|
/* VOREStation Edit START - TODO - Consider switching to icon_scale
|
||||||
// First, get the correct size.
|
// 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)
|
for(var/datum/modifier/M in modifiers)
|
||||||
|
<<<<<<< HEAD
|
||||||
if(!isnull(M.icon_scale_percent))
|
if(!isnull(M.icon_scale_percent))
|
||||||
desired_scale *= M.icon_scale_percent
|
desired_scale *= M.icon_scale_percent
|
||||||
*/
|
*/
|
||||||
var/desired_scale = size_multiplier
|
var/desired_scale = size_multiplier
|
||||||
//VOREStation Edit End
|
//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.
|
// Regular stuff again.
|
||||||
var/matrix/M = matrix()
|
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.
|
if(lying && !species.prone_icon) //Only rotate them if we're not drawing a specific icon for being prone.
|
||||||
M.Turn(90)
|
M.Turn(90)
|
||||||
M.Scale(desired_scale)
|
M.Scale(desired_scale_x, desired_scale_y)
|
||||||
M.Translate(1,-6)
|
M.Translate(1,-6)
|
||||||
layer = MOB_LAYER -0.01 // Fix for a byond bug where turf entry order no longer matters
|
layer = MOB_LAYER -0.01 // Fix for a byond bug where turf entry order no longer matters
|
||||||
else
|
else
|
||||||
M.Scale(desired_scale)
|
M.Scale(desired_scale_x, desired_scale_y)
|
||||||
M.Translate(0, 16*(desired_scale-1))
|
M.Translate(0, 16*(desired_scale_y-1))
|
||||||
layer = MOB_LAYER // Fix for a byond bug where turf entry order no longer matters
|
layer = MOB_LAYER // Fix for a byond bug where turf entry order no longer matters
|
||||||
|
|
||||||
animate(src, transform = M, time = anim_time)
|
animate(src, transform = M, time = anim_time)
|
||||||
|
|||||||
@@ -1174,18 +1174,31 @@ default behaviour is:
|
|||||||
|
|
||||||
/mob/living/update_transform()
|
/mob/living/update_transform()
|
||||||
// First, get the correct size.
|
// First, get the correct size.
|
||||||
|
<<<<<<< HEAD
|
||||||
var/desired_scale = size_multiplier //VOREStation edit
|
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)
|
for(var/datum/modifier/M in modifiers)
|
||||||
if(!isnull(M.icon_scale_percent))
|
if(!isnull(M.icon_scale_x_percent))
|
||||||
desired_scale *= M.icon_scale_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.
|
// Now for the regular stuff.
|
||||||
var/matrix/M = matrix()
|
var/matrix/M = matrix()
|
||||||
|
<<<<<<< HEAD
|
||||||
M.Scale(desired_scale)
|
M.Scale(desired_scale)
|
||||||
M.Translate(0, 16*(desired_scale-1))
|
M.Translate(0, 16*(desired_scale-1))
|
||||||
src.transform = M
|
src.transform = M
|
||||||
//animate(src, transform = M, time = 10) //VOREStation edit
|
//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 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.
|
// This proc is here so it can be called without needing to check if the client exists, or if the client relogs.
|
||||||
|
|||||||
748
code/modules/mob/living/simple_animal/slime/subtypes.dm
Normal file
748
code/modules/mob/living/simple_animal/slime/subtypes.dm
Normal file
@@ -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("<span class='danger'>\The [src] erupts in an inferno!</span>")
|
||||||
|
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("<span class='danger'>\The [src] reflects \the [P]!</span>")
|
||||||
|
|
||||||
|
// 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, "<span class='warning'>There's nothing to teleport to.</span>")
|
||||||
|
return FALSE
|
||||||
|
|
||||||
|
if(world.time < last_tele + tele_cooldown)
|
||||||
|
to_chat(src, "<span class='warning'>You can't teleport right now, wait a few seconds.</span>")
|
||||||
|
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, "<span class='warning'>There wasn't an unoccupied spot to teleport to.</span>")
|
||||||
|
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("<span class='notice'>\The [src] vanishes!</span>")
|
||||||
|
s1.start()
|
||||||
|
|
||||||
|
forceMove(target_turf)
|
||||||
|
playsound(target_turf, 'sound/effects/phasein.ogg', 50, 1)
|
||||||
|
to_chat(src, "<span class='notice'>You teleport to \the [target_turf].</span>")
|
||||||
|
|
||||||
|
target_turf.visible_message("<span class='warning'>\The [src] appears!</span>")
|
||||||
|
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("<span class='danger'>\The [src] sends \the [L] flying with the impact!</span>")
|
||||||
|
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 = "<span class='warning'>Twinkling spores of goo surround you. It makes you feel healthier.</span>"
|
||||||
|
on_expired_text = "<span class='notice'>The spores of goo have faded, although you feel much healthier than before.</span>"
|
||||||
|
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()
|
||||||
|
..()
|
||||||
@@ -57,7 +57,8 @@
|
|||||||
icon_state = "commonblackbird"
|
icon_state = "commonblackbird"
|
||||||
icon_dead = "commonblackbird-dead"
|
icon_dead = "commonblackbird-dead"
|
||||||
tt_desc = "E Turdus merula"
|
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
|
/mob/living/simple_mob/animal/passive/bird/azure_tit
|
||||||
name = "azure tit"
|
name = "azure tit"
|
||||||
@@ -65,7 +66,8 @@
|
|||||||
icon_state = "azuretit"
|
icon_state = "azuretit"
|
||||||
icon_dead = "azuretit-dead"
|
icon_dead = "azuretit-dead"
|
||||||
tt_desc = "E Cyanistes cyanus"
|
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
|
/mob/living/simple_mob/animal/passive/bird/european_robin
|
||||||
name = "european robin"
|
name = "european robin"
|
||||||
@@ -73,7 +75,8 @@
|
|||||||
icon_state = "europeanrobin"
|
icon_state = "europeanrobin"
|
||||||
icon_dead = "europeanrobin-dead"
|
icon_dead = "europeanrobin-dead"
|
||||||
tt_desc = "E Erithacus rubecula"
|
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
|
/mob/living/simple_mob/animal/passive/bird/goldcrest
|
||||||
name = "goldcrest"
|
name = "goldcrest"
|
||||||
@@ -82,7 +85,8 @@
|
|||||||
icon_state = "goldcrest"
|
icon_state = "goldcrest"
|
||||||
icon_dead = "goldcrest-dead"
|
icon_dead = "goldcrest-dead"
|
||||||
tt_desc = "E Regulus regulus"
|
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
|
/mob/living/simple_mob/animal/passive/bird/ringneck_dove
|
||||||
name = "ringneck dove"
|
name = "ringneck dove"
|
||||||
@@ -90,4 +94,5 @@
|
|||||||
icon_state = "ringneckdove"
|
icon_state = "ringneckdove"
|
||||||
icon_dead = "ringneckdove-dead"
|
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.
|
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
|
||||||
|
|||||||
@@ -32,7 +32,8 @@
|
|||||||
icon_state = "sif_crab"
|
icon_state = "sif_crab"
|
||||||
icon_living = "sif_crab"
|
icon_living = "sif_crab"
|
||||||
icon_dead = "sif_crab_dead"
|
icon_dead = "sif_crab_dead"
|
||||||
icon_scale = 1.5
|
icon_scale_x = 1.5
|
||||||
|
icon_scale_y = 1.5
|
||||||
|
|
||||||
faction = "crabs"
|
faction = "crabs"
|
||||||
|
|
||||||
|
|||||||
@@ -67,7 +67,8 @@
|
|||||||
name = "big shantak"
|
name = "big shantak"
|
||||||
desc = "A piglike creature with a bright iridiscent mane that sparkles as though lit by an inner light. \
|
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."
|
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
|
maxHealth = 125
|
||||||
player_msg = "You have the ability to <b>command other shantaks to follow you</b>."
|
player_msg = "You have the ability to <b>command other shantaks to follow you</b>."
|
||||||
|
|
||||||
|
|||||||
@@ -105,7 +105,8 @@
|
|||||||
name = "siege engine hivebot"
|
name = "siege engine hivebot"
|
||||||
desc = "A large robot capable of delivering long range bombardment."
|
desc = "A large robot capable of delivering long range bombardment."
|
||||||
projectiletype = /obj/item/projectile/arc/test
|
projectiletype = /obj/item/projectile/arc/test
|
||||||
icon_scale = 2
|
icon_scale_x = 2
|
||||||
|
icon_scale_y = 2
|
||||||
icon_state = "red"
|
icon_state = "red"
|
||||||
icon_living = "red"
|
icon_living = "red"
|
||||||
|
|
||||||
|
|||||||
@@ -39,7 +39,8 @@
|
|||||||
desc = "A large robot."
|
desc = "A large robot."
|
||||||
maxHealth = 10 LASERS_TO_KILL // 300 health
|
maxHealth = 10 LASERS_TO_KILL // 300 health
|
||||||
health = 10 LASERS_TO_KILL
|
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."
|
player_msg = "You have a very large amount of health."
|
||||||
|
|
||||||
|
|
||||||
@@ -49,7 +50,8 @@
|
|||||||
desc = "A robot clad in heavy armor."
|
desc = "A robot clad in heavy armor."
|
||||||
maxHealth = 5 LASERS_TO_KILL // 150 health.
|
maxHealth = 5 LASERS_TO_KILL // 150 health.
|
||||||
health = 5 LASERS_TO_KILL
|
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."
|
player_msg = "You are heavily armored."
|
||||||
// Note that armor effectively makes lasers do about 9 damage instead of 30,
|
// 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.
|
// so it has an effective health of ~16.6 LASERS_TO_KILL if regular lasers are used.
|
||||||
|
|||||||
@@ -77,7 +77,8 @@
|
|||||||
catalogue_data = list(/datum/category_item/catalogue/technology/adv_dark_gygax)
|
catalogue_data = list(/datum/category_item/catalogue/technology/adv_dark_gygax)
|
||||||
icon_state = "darkgygax_adv"
|
icon_state = "darkgygax_adv"
|
||||||
wreckage = /obj/structure/loot_pile/mecha/gygax/dark/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
|
movement_shake_radius = 14
|
||||||
|
|
||||||
maxHealth = 450
|
maxHealth = 450
|
||||||
|
|||||||
@@ -106,7 +106,8 @@
|
|||||||
friendly = list("pokes") //Anything nice the Behemoth would do would still Kill the Human. Leave it at poke.
|
friendly = list("pokes") //Anything nice the Behemoth would do would still Kill the Human. Leave it at poke.
|
||||||
attack_sound = 'sound/weapons/heavysmash.ogg'
|
attack_sound = 'sound/weapons/heavysmash.ogg'
|
||||||
resistance = 10
|
resistance = 10
|
||||||
icon_scale = 2
|
icon_scale_x = 2
|
||||||
|
icon_scale_y = 2
|
||||||
var/energy = 0
|
var/energy = 0
|
||||||
var/max_energy = 1000
|
var/max_energy = 1000
|
||||||
armor = list(
|
armor = list(
|
||||||
|
|||||||
@@ -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.
|
// 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
|
/mob/living/simple_mob/slime/feral
|
||||||
@@ -92,3 +93,101 @@
|
|||||||
if(L.has_AI()) // Other AIs should react to hostile auras.
|
if(L.has_AI()) // Other AIs should react to hostile auras.
|
||||||
L.ai_holder.react_to_attack(src)
|
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.<br>\
|
||||||
|
You are also immune to the cold, and you cause enemies around you to suffer periodic harm from the cold, if unprotected.<br>\
|
||||||
|
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
|
||||||
|
|||||||
@@ -162,7 +162,8 @@
|
|||||||
/obj/item/projectile/arc/radioactive
|
/obj/item/projectile/arc/radioactive
|
||||||
name = "radiation blast"
|
name = "radiation blast"
|
||||||
icon_state = "green_pellet"
|
icon_state = "green_pellet"
|
||||||
icon_scale = 2
|
icon_scale_x = 2
|
||||||
|
icon_scale_y = 2
|
||||||
var/rad_power = 50
|
var/rad_power = 50
|
||||||
|
|
||||||
/obj/item/projectile/arc/radioactive/on_impact(turf/T)
|
/obj/item/projectile/arc/radioactive/on_impact(turf/T)
|
||||||
|
|||||||
Binary file not shown.
|
Before Width: | Height: | Size: 29 KiB After Width: | Height: | Size: 33 KiB |
Reference in New Issue
Block a user