mirror of
https://github.com/ParadiseSS13/Paradise.git
synced 2025-12-21 07:42:21 +00:00
Blob Rebalance
This commit is contained in:
@@ -101,12 +101,12 @@
|
|||||||
var/turf/location = get_turf(src)
|
var/turf/location = get_turf(src)
|
||||||
|
|
||||||
// Create the reagents to put into the air
|
// Create the reagents to put into the air
|
||||||
create_reagents(25)
|
create_reagents(8)
|
||||||
|
|
||||||
if(overmind && overmind.blob_reagent_datum)
|
if(overmind && overmind.blob_reagent_datum)
|
||||||
reagents.add_reagent(overmind.blob_reagent_datum.id, 25)
|
reagents.add_reagent(overmind.blob_reagent_datum.id, 8)
|
||||||
else
|
else
|
||||||
reagents.add_reagent("spores", 25)
|
reagents.add_reagent("spores", 8)
|
||||||
|
|
||||||
// Attach the smoke spreader and setup/start it.
|
// Attach the smoke spreader and setup/start it.
|
||||||
S.attach(location)
|
S.attach(location)
|
||||||
|
|||||||
@@ -276,7 +276,10 @@
|
|||||||
last_attack = world.time
|
last_attack = world.time
|
||||||
OB.expand(T, 0, blob_reagent_datum.color)
|
OB.expand(T, 0, blob_reagent_datum.color)
|
||||||
for(var/mob/living/L in T)
|
for(var/mob/living/L in T)
|
||||||
blob_reagent_datum.reaction_mob(L, TOUCH, 25)
|
if("blob" in L.faction) //no friendly fire
|
||||||
|
continue
|
||||||
|
var/mob_protection = L.get_permeability_protection()
|
||||||
|
blob_reagent_datum.reaction_mob(L, TOUCH, 25, 1, mob_protection)
|
||||||
blob_reagent_datum.send_message(L)
|
blob_reagent_datum.send_message(L)
|
||||||
OB.color = blob_reagent_datum.color
|
OB.color = blob_reagent_datum.color
|
||||||
return
|
return
|
||||||
|
|||||||
@@ -356,3 +356,6 @@ In all, this is a lot like the monkey code. /N
|
|||||||
return custom_pixel_x_offset
|
return custom_pixel_x_offset
|
||||||
else
|
else
|
||||||
return initial(pixel_x)
|
return initial(pixel_x)
|
||||||
|
|
||||||
|
/mob/living/carbon/alien/humanoid/get_permeability_protection()
|
||||||
|
return 0.8
|
||||||
@@ -1760,3 +1760,23 @@
|
|||||||
if(!silent)
|
if(!silent)
|
||||||
src << "<span class='warning'>You don't have the dexterity to use that!<span>"
|
src << "<span class='warning'>You don't have the dexterity to use that!<span>"
|
||||||
return 0
|
return 0
|
||||||
|
|
||||||
|
/mob/living/carbon/human/get_permeability_protection()
|
||||||
|
var/list/prot = list("hands"=0, "chest"=0, "groin"=0, "legs"=0, "feet"=0, "arms"=0, "head"=0)
|
||||||
|
for(var/obj/item/I in get_equipped_items())
|
||||||
|
if(I.body_parts_covered & HANDS)
|
||||||
|
prot["hands"] = max(1 - I.permeability_coefficient, prot["hands"])
|
||||||
|
if(I.body_parts_covered & UPPER_TORSO)
|
||||||
|
prot["chest"] = max(1 - I.permeability_coefficient, prot["chest"])
|
||||||
|
if(I.body_parts_covered & LOWER_TORSO)
|
||||||
|
prot["groin"] = max(1 - I.permeability_coefficient, prot["groin"])
|
||||||
|
if(I.body_parts_covered & LEGS)
|
||||||
|
prot["legs"] = max(1 - I.permeability_coefficient, prot["legs"])
|
||||||
|
if(I.body_parts_covered & FEET)
|
||||||
|
prot["feet"] = max(1 - I.permeability_coefficient, prot["feet"])
|
||||||
|
if(I.body_parts_covered & ARMS)
|
||||||
|
prot["arms"] = max(1 - I.permeability_coefficient, prot["arms"])
|
||||||
|
if(I.body_parts_covered & HEAD)
|
||||||
|
prot["head"] = max(1 - I.permeability_coefficient, prot["head"])
|
||||||
|
var/protection = (prot["head"] + prot["arms"] + prot["feet"] + prot["legs"] + prot["groin"] + prot["chest"] + prot["hands"])/7
|
||||||
|
return protection
|
||||||
@@ -937,3 +937,7 @@
|
|||||||
|
|
||||||
/mob/living/proc/spawn_dust()
|
/mob/living/proc/spawn_dust()
|
||||||
new /obj/effect/decal/cleanable/ash(loc)
|
new /obj/effect/decal/cleanable/ash(loc)
|
||||||
|
|
||||||
|
//used in datum/reagents/reaction() proc
|
||||||
|
/mob/living/proc/get_permeability_protection()
|
||||||
|
return 0
|
||||||
|
|||||||
@@ -1,188 +1,149 @@
|
|||||||
// These can only be applied by blobs. They are what blobs are made out of.
|
// These can only be applied by blobs. They are what blobs are made out of.
|
||||||
// The 4 damage
|
// The 4 damage
|
||||||
/datum/reagent/blob
|
/datum/reagent/blob
|
||||||
|
description = ""
|
||||||
var/message = "The blob strikes you" //message sent to any mob hit by the blob
|
var/message = "The blob strikes you" //message sent to any mob hit by the blob
|
||||||
var/message_living = null //extension to first mob sent to only living mobs i.e. silicons have no skin to be burnt
|
var/message_living = null //extension to first mob sent to only living mobs i.e. silicons have no skin to be burnt
|
||||||
|
|
||||||
/datum/reagent/blob/boiling_oil
|
/datum/reagent/blob/reaction_mob(mob/living/M, method=TOUCH, volume, show_message, touch_protection)
|
||||||
|
return round(volume * min(1.5 - touch_protection, 1), 0.1) //full touch protection means 50% volume, any prot below 0.5 means 100% volume.
|
||||||
|
|
||||||
|
/datum/reagent/blob/ripping_tendrils //does brute and a little stamina damage
|
||||||
|
name = "Ripping Tendrils"
|
||||||
|
id = "ripping_tendrils"
|
||||||
|
color = "#7F0000"
|
||||||
|
message_living = ", and you feel your skin ripping and tearing off"
|
||||||
|
|
||||||
|
/datum/reagent/blob/ripping_tendrils/reaction_mob(mob/living/M, method=TOUCH, volume)
|
||||||
|
if(method == TOUCH)
|
||||||
|
volume = ..()
|
||||||
|
M.apply_damage(0.6*volume, BRUTE)
|
||||||
|
M.adjustStaminaLoss(0.4*volume)
|
||||||
|
if(iscarbon(M))
|
||||||
|
M.emote("scream")
|
||||||
|
|
||||||
|
/datum/reagent/blob/boiling_oil //sets you on fire, does burn damage
|
||||||
name = "Boiling Oil"
|
name = "Boiling Oil"
|
||||||
id = "boiling_oil"
|
id = "boiling_oil"
|
||||||
description = ""
|
|
||||||
color = "#B68D00"
|
color = "#B68D00"
|
||||||
message = "The blob splashes you with burning oil"
|
message = "The blob splashes you with burning oil"
|
||||||
|
message_living = ", and you feel your skin char and melt"
|
||||||
|
|
||||||
/datum/reagent/blob/boiling_oil/reaction_mob(var/mob/living/M as mob, var/method=TOUCH, var/volume)
|
/datum/reagent/blob/boiling_oil/reaction_mob(var/mob/living/M as mob, var/method=TOUCH, var/volume)
|
||||||
if(method == TOUCH)
|
if(method == TOUCH)
|
||||||
var/ratio = volume/25
|
M.adjust_fire_stacks(round(volume/12))
|
||||||
M.apply_damage(15*ratio, BURN)
|
volume = ..()
|
||||||
M.adjust_fire_stacks(2*ratio)
|
M.apply_damage(0.6*volume, BURN)
|
||||||
M.IgniteMob()
|
M.IgniteMob()
|
||||||
if(isliving(M))
|
if(isliving(M))
|
||||||
M.emote("scream")
|
M.emote("scream")
|
||||||
|
|
||||||
/datum/reagent/blob/toxic_goop
|
/datum/reagent/blob/envenomed_filaments //toxin, hallucination, and some bonus spore toxin
|
||||||
name = "Toxic Goop"
|
name = "Envenomed Filaments"
|
||||||
id = "toxic_goop"
|
id = "envenomed_filaments"
|
||||||
description = ""
|
color = "#9ACD32"
|
||||||
color = "#008000"
|
|
||||||
message_living = ", and you feel sick and nauseated"
|
message_living = ", and you feel sick and nauseated"
|
||||||
|
|
||||||
/datum/reagent/blob/toxic_goop/reaction_mob(var/mob/living/M as mob, var/method=TOUCH, var/volume)
|
/datum/reagent/blob/envenomed_filaments/reaction_mob(mob/living/M, method=TOUCH, volume)
|
||||||
if(method == TOUCH)
|
if(method == TOUCH)
|
||||||
var/ratio = volume/25
|
volume = ..()
|
||||||
M.apply_damage(20*ratio, TOX)
|
M.apply_damage(0.6*volume, TOX)
|
||||||
|
M.hallucination += 0.6*volume
|
||||||
|
M.reagents.add_reagent("spores", 0.4*volume)
|
||||||
|
|
||||||
/datum/reagent/blob/skin_ripper
|
/datum/reagent/blob/lexorin_jelly //does tons of oxygen damage and a little brute
|
||||||
name = "Skin Ripper"
|
name = "Lexorin Jelly"
|
||||||
id = "skin_ripper"
|
id = "lexorin_jelly"
|
||||||
description = ""
|
|
||||||
color = "#FF4C4C"
|
|
||||||
message_living = ", and you feel your skin ripping and tearing off"
|
|
||||||
|
|
||||||
/datum/reagent/blob/skin_ripper/reaction_mob(var/mob/living/M as mob, var/method=TOUCH, var/volume)
|
|
||||||
if(method == TOUCH)
|
|
||||||
var/ratio = volume/25
|
|
||||||
M.apply_damage(20*ratio, BRUTE)
|
|
||||||
if(iscarbon(M))
|
|
||||||
M.emote("scream")
|
|
||||||
|
|
||||||
// Combo Reagents
|
|
||||||
|
|
||||||
/datum/reagent/blob/skin_melter
|
|
||||||
name = "Skin Melter"
|
|
||||||
id = "skin_melter"
|
|
||||||
description = ""
|
|
||||||
color = "#7F0000"
|
|
||||||
message_living = ", and you feel your skin char and melt"
|
|
||||||
|
|
||||||
/datum/reagent/blob/skin_melter/reaction_mob(var/mob/living/M as mob, var/method=TOUCH, var/volume)
|
|
||||||
if(method == TOUCH)
|
|
||||||
var/ratio = volume/25
|
|
||||||
M.apply_damage(10*ratio, BRUTE)
|
|
||||||
M.apply_damage(10*ratio, BURN)
|
|
||||||
M.adjust_fire_stacks(2*ratio)
|
|
||||||
M.IgniteMob()
|
|
||||||
if(iscarbon(M))
|
|
||||||
M.emote("scream")
|
|
||||||
|
|
||||||
/datum/reagent/blob/lung_destroying_toxin
|
|
||||||
name = "Lung Destroying Toxin"
|
|
||||||
id = "lung_destroying_toxin"
|
|
||||||
description = ""
|
|
||||||
color = "#00FFC5"
|
color = "#00FFC5"
|
||||||
message_living = ", and your lungs feel heavy and weak"
|
message_living = ", and your lungs feel heavy and weak"
|
||||||
|
|
||||||
/datum/reagent/blob/lung_destroying_toxin/reaction_mob(var/mob/living/M as mob, var/method=TOUCH, var/volume)
|
/datum/reagent/blob/lexorin_jelly/reaction_mob(mob/living/M, method=TOUCH, volume)
|
||||||
if(method == TOUCH)
|
if(method == TOUCH)
|
||||||
var/ratio = volume/25
|
volume = ..()
|
||||||
M.apply_damage(20* ratio, OXY)
|
M.apply_damage(0.4*volume, BRUTE)
|
||||||
M.losebreath += 15*ratio
|
M.apply_damage(1*volume, OXY)
|
||||||
M.apply_damage(20*ratio, TOX)
|
M.losebreath += round(0.3*volume)
|
||||||
|
|
||||||
// Special Reagents
|
|
||||||
|
|
||||||
/datum/reagent/blob/radioactive_liquid
|
/datum/reagent/blob/kinetic //does semi-random brute damage
|
||||||
name = "Radioactive Liquid"
|
name = "Kinetic Gelatin"
|
||||||
id = "radioactive_liquid"
|
id = "kinetic"
|
||||||
description = ""
|
color = "#FFA500"
|
||||||
color = "#00EE00"
|
message = "The blob pummels you"
|
||||||
message_living = ", and your skin feels papery and everything hurts"
|
|
||||||
|
|
||||||
/datum/reagent/blob/radioactive_liquid/reaction_mob(var/mob/living/M as mob, var/method=TOUCH, var/volume)
|
/datum/reagent/blob/kinetic/reaction_mob(mob/living/M, method=TOUCH, volume)
|
||||||
if(method == TOUCH)
|
if(method == TOUCH)
|
||||||
var/ratio = volume/25
|
volume = ..()
|
||||||
M.apply_damage(10*ratio, BRUTE)
|
var/damage = rand(5, 35)/25
|
||||||
if(istype(M, /mob/living/carbon/human))
|
M.apply_damage(damage*volume, BRUTE)
|
||||||
M.apply_effect(40*ratio,IRRADIATE,0)
|
|
||||||
if(prob(33*ratio))
|
/datum/reagent/blob/cryogenic_liquid //does low burn damage and stamina damage and cools targets down
|
||||||
randmuti(M)
|
name = "Cryogenic Liquid"
|
||||||
if(prob(98))
|
id = "cryogenic_liquid"
|
||||||
randmutb(M)
|
color = "#8BA6E9"
|
||||||
domutcheck(M, null)
|
message = "The blob splashes you with an icy liquid"
|
||||||
M.UpdateAppearance()
|
message_living = ", and you feel cold and tired"
|
||||||
|
|
||||||
|
/datum/reagent/blob/cryogenic_liquid/reaction_mob(mob/living/M, method=TOUCH, volume)
|
||||||
|
if(method == TOUCH)
|
||||||
|
volume = ..()
|
||||||
|
M.apply_damage(0.4*volume, BURN)
|
||||||
|
M.adjustStaminaLoss(0.4*volume)
|
||||||
|
M.reagents.add_reagent("frostoil", 0.4*volume)
|
||||||
|
|
||||||
/datum/reagent/blob/dark_matter
|
/datum/reagent/blob/dark_matter
|
||||||
name = "Dark Matter"
|
name = "Dark Matter"
|
||||||
id = "dark_matter"
|
id = "dark_matter"
|
||||||
description = ""
|
|
||||||
color = "#61407E"
|
color = "#61407E"
|
||||||
message = "You feel a thrum as the blob strikes you, and everything flies at you"
|
message = "You feel a thrum as the blob strikes you, and everything flies at you"
|
||||||
|
|
||||||
/datum/reagent/blob/dark_matter/reaction_mob(var/mob/living/M as mob, var/method=TOUCH, var/volume)
|
/datum/reagent/blob/dark_matter/reaction_mob(var/mob/living/M as mob, var/method=TOUCH, var/volume)
|
||||||
if(method == TOUCH)
|
if(method == TOUCH)
|
||||||
var/ratio = volume/25
|
reagent_vortex(M, 0, volume)
|
||||||
M.apply_damage(15*ratio, BRUTE)
|
volume = ..()
|
||||||
reagent_vortex(M, 0)
|
M.apply_damage(0.6*volume, BRUTE)
|
||||||
|
|
||||||
|
|
||||||
/datum/reagent/blob/b_sorium
|
/datum/reagent/blob/b_sorium
|
||||||
name = "Sorium"
|
name = "Sorium"
|
||||||
id = "b_sorium"
|
id = "b_sorium"
|
||||||
description = ""
|
|
||||||
color = "#808000"
|
color = "#808000"
|
||||||
message = "The blob slams into you, and sends you flying"
|
message = "The blob slams into you, and sends you flying"
|
||||||
|
|
||||||
/datum/reagent/blob/b_sorium/reaction_mob(var/mob/living/M as mob, var/method=TOUCH, var/volume)
|
/datum/reagent/blob/b_sorium/reaction_mob(var/mob/living/M as mob, var/method=TOUCH, var/volume)
|
||||||
if(method == TOUCH)
|
if(method == TOUCH)
|
||||||
var/ratio = volume/25
|
reagent_vortex(M, 1, volume)
|
||||||
M.apply_damage(15*ratio, BRUTE)
|
volume = ..()
|
||||||
reagent_vortex(M, 1)
|
M.apply_damage(0.6*volume, BRUTE)
|
||||||
|
|
||||||
|
/datum/reagent/blob/proc/reagent_vortex(mob/living/M, setting_type, volume)
|
||||||
/datum/reagent/blob/explosive // I'm gonna burn in hell for this one
|
|
||||||
name = "Explosive Gelatin"
|
|
||||||
id = "explosive"
|
|
||||||
description = ""
|
|
||||||
color = "#FFA500"
|
|
||||||
message = "The blob strikes you, and its tendrils explode"
|
|
||||||
|
|
||||||
/datum/reagent/blob/explosive/reaction_mob(var/mob/living/M as mob, var/method=TOUCH, var/volume)
|
|
||||||
if(method == TOUCH)
|
|
||||||
var/ratio = volume/25
|
|
||||||
if(prob(75*ratio))
|
|
||||||
explosion(M.loc, 0, 0, 1, 0, 0)
|
|
||||||
|
|
||||||
/datum/reagent/blob/omnizine
|
|
||||||
name = "Omnizine"
|
|
||||||
id = "b_omnizine"
|
|
||||||
description = ""
|
|
||||||
color = "#C8A5DC"
|
|
||||||
message = "The blob squirts something at you"
|
|
||||||
message_living = ", and you feel great"
|
|
||||||
|
|
||||||
/datum/reagent/blob/omnizine/reaction_mob(var/mob/living/M as mob, var/method=TOUCH, var/volume)
|
|
||||||
if(method == TOUCH)
|
|
||||||
var/ratio = volume/25
|
|
||||||
M.reagents.add_reagent("omnizine", 11*ratio)
|
|
||||||
|
|
||||||
/datum/reagent/blob/spacedrugs
|
|
||||||
name = "Space drugs"
|
|
||||||
id = "b_space_drugs"
|
|
||||||
description = ""
|
|
||||||
color = "#60A584"
|
|
||||||
message = "The blob squirts something at you"
|
|
||||||
message_living = ", and you feel funny"
|
|
||||||
|
|
||||||
/datum/reagent/blob/spacedrugs/reaction_mob(var/mob/living/M as mob, var/method=TOUCH, var/volume)
|
|
||||||
if(method == TOUCH)
|
|
||||||
var/ratio = volume/25
|
|
||||||
M.hallucination += 20*ratio
|
|
||||||
M.reagents.add_reagent("space_drugs", 15*ratio)
|
|
||||||
M.apply_damage(10*ratio, TOX)
|
|
||||||
|
|
||||||
|
|
||||||
/datum/reagent/blob/proc/reagent_vortex(var/mob/living/M as mob, var/setting_type)
|
|
||||||
var/turf/pull = get_turf(M)
|
var/turf/pull = get_turf(M)
|
||||||
for(var/atom/movable/X in range(4,pull))
|
var/range_power = Clamp(round(volume/5, 1), 1, 5)
|
||||||
if(istype(X, /atom/movable))
|
for(var/atom/movable/X in range(range_power,pull))
|
||||||
if((X) && !X.anchored)
|
if(istype(X, /obj/effect))
|
||||||
|
continue
|
||||||
|
if(!X.anchored)
|
||||||
|
var/distance = get_dist(X, pull)
|
||||||
|
var/moving_power = max(range_power - distance, 1)
|
||||||
|
spawn(0)
|
||||||
|
if(moving_power > 2) //if the vortex is powerful and we're close, we get thrown
|
||||||
if(setting_type)
|
if(setting_type)
|
||||||
step_away(X,pull)
|
var/atom/throw_target = get_edge_target_turf(X, get_dir(X, get_step_away(X, pull)))
|
||||||
step_away(X,pull)
|
var/throw_range = 5 - distance
|
||||||
step_away(X,pull)
|
X.throw_at(throw_target, throw_range, 1)
|
||||||
step_away(X,pull)
|
|
||||||
else
|
else
|
||||||
X.throw_at(pull)
|
X.throw_at(pull, distance, 1)
|
||||||
|
else
|
||||||
|
if(setting_type)
|
||||||
|
for(var/i = 0, i < moving_power, i++)
|
||||||
|
sleep(2)
|
||||||
|
if(!step_away(X, pull))
|
||||||
|
break
|
||||||
|
else
|
||||||
|
for(var/i = 0, i < moving_power, i++)
|
||||||
|
sleep(2)
|
||||||
|
if(!step_towards(X, pull))
|
||||||
|
break
|
||||||
|
|
||||||
/datum/reagent/blob/proc/send_message(var/mob/living/M as mob)
|
/datum/reagent/blob/proc/send_message(var/mob/living/M as mob)
|
||||||
var/totalmessage = message
|
var/totalmessage = message
|
||||||
|
|||||||
@@ -405,7 +405,7 @@
|
|||||||
color = "#9ACD32"
|
color = "#9ACD32"
|
||||||
|
|
||||||
/datum/reagent/spores/on_mob_life(var/mob/living/M as mob)
|
/datum/reagent/spores/on_mob_life(var/mob/living/M as mob)
|
||||||
M.adjustToxLoss(0.5)
|
M.adjustToxLoss(1)
|
||||||
M.damageoverlaytemp = 60
|
M.damageoverlaytemp = 60
|
||||||
M.eye_blurry = max(M.eye_blurry, 3)
|
M.eye_blurry = max(M.eye_blurry, 3)
|
||||||
..()
|
..()
|
||||||
@@ -564,7 +564,7 @@
|
|||||||
id = "frostoil"
|
id = "frostoil"
|
||||||
description = "A special oil that noticably chills the body. Extraced from Icepeppers."
|
description = "A special oil that noticably chills the body. Extraced from Icepeppers."
|
||||||
reagent_state = LIQUID
|
reagent_state = LIQUID
|
||||||
color = "#B31008" // rgb: 139, 166, 233
|
color = "#8BA6E9" // rgb: 139, 166, 233
|
||||||
process_flags = ORGANIC | SYNTHETIC
|
process_flags = ORGANIC | SYNTHETIC
|
||||||
|
|
||||||
/datum/reagent/frostoil/on_mob_life(var/mob/living/M as mob)
|
/datum/reagent/frostoil/on_mob_life(var/mob/living/M as mob)
|
||||||
|
|||||||
Reference in New Issue
Block a user