This commit is contained in:
Putnam
2020-03-11 02:17:16 -07:00
282 changed files with 2084 additions and 1636 deletions

View File

@@ -63,7 +63,7 @@
addtimer(CALLBACK(src, .proc/emagNotify), 150)
return TRUE
/obj/machinery/vr_sleeper/update_icon()
/obj/machinery/vr_sleeper/update_icon_state()
icon_state = "[initial(icon_state)][state_open ? "-open" : ""]"
/obj/machinery/vr_sleeper/open_machine()

View File

@@ -40,6 +40,9 @@
H.dna.features["insect_wings"] = pick(GLOB.insect_wings_list)
H.dna.features["deco_wings"] = pick(GLOB.deco_wings_list)
H.dna.features["insect_fluff"] = pick(GLOB.insect_fluffs_list)
H.dna.features["flavor_text"] = "" //Oh no.
SEND_SIGNAL(H, COMSIG_HUMAN_ON_RANDOMIZE)
H.update_body()
H.update_hair()

View File

@@ -419,8 +419,9 @@
<br>
Congratulations! You are now trained for invasive xenobiology research!"}
/obj/item/paper/guides/antag/abductor/update_icon()
return
/obj/item/paper/guides/antag/abductor/ComponentInitialize()
. = ..()
AddElement(/datum/element/update_icon_blocker)
/obj/item/paper/guides/antag/abductor/AltClick()
return //otherwise it would fold into a paperplane.
@@ -442,6 +443,10 @@
w_class = WEIGHT_CLASS_NORMAL
actions_types = list(/datum/action/item_action/toggle_mode)
/obj/item/abductor/baton/ComponentInitialize()
. = ..()
AddElement(/datum/element/update_icon_updates_onmob)
/obj/item/abductor/baton/proc/toggle(mob/living/user=usr)
mode = (mode+1)%BATON_MODES
var/txt
@@ -458,7 +463,7 @@
to_chat(usr, "<span class='notice'>You switch the baton to [txt] mode.</span>")
update_icon()
/obj/item/abductor/baton/update_icon()
/obj/item/abductor/baton/update_icon_state()
switch(mode)
if(BATON_STUN)
icon_state = "wonderprodStun"

View File

@@ -223,7 +223,7 @@
return
/obj/machinery/abductor/experiment/update_icon()
/obj/machinery/abductor/experiment/update_icon_state()
if(state_open)
icon_state = "experiment-open"
else

View File

@@ -20,7 +20,7 @@
/mob/living/simple_animal/hostile/blob/update_icons()
if(overmind)
add_atom_colour(overmind.blob_reagent_datum.color, FIXED_COLOUR_PRIORITY)
add_atom_colour(overmind.blobstrain.color, FIXED_COLOUR_PRIORITY)
else
remove_atom_colour(FIXED_COLOUR_PRIORITY)
@@ -34,7 +34,7 @@
for(var/i in 1 to 2)
var/obj/effect/temp_visual/heal/H = new /obj/effect/temp_visual/heal(get_turf(src)) //hello yes you are being healed
if(overmind)
H.color = overmind.blob_reagent_datum.complementary_color
H.color = overmind.blobstrain.complementary_color
else
H.color = "#000000"
adjustHealth(-maxHealth*0.0125)
@@ -142,8 +142,10 @@
// Create the reagents to put into the air
create_reagents(10)
if(overmind && overmind.blob_reagent_datum)
reagents.add_reagent(overmind.blob_reagent_datum.type, 10)
if(overmind && overmind.blobstrain)
overmind.blobstrain.on_sporedeath(src)
else
reagents.add_reagent(/datum/reagent/toxin/spore, 10)
@@ -167,14 +169,14 @@
/mob/living/simple_animal/hostile/blob/blobspore/update_icons()
if(overmind)
add_atom_colour(overmind.blob_reagent_datum.complementary_color, FIXED_COLOUR_PRIORITY)
add_atom_colour(overmind.blobstrain.complementary_color, FIXED_COLOUR_PRIORITY)
else
remove_atom_colour(FIXED_COLOUR_PRIORITY)
if(is_zombie)
copy_overlays(oldguy, TRUE)
var/mutable_appearance/blob_head_overlay = mutable_appearance('icons/mob/blob.dmi', "blob_head")
if(overmind)
blob_head_overlay.color = overmind.blob_reagent_datum.complementary_color
blob_head_overlay.color = overmind.blobstrain.complementary_color
color = initial(color)//looks better.
add_overlay(blob_head_overlay)
@@ -243,14 +245,14 @@
adjustHealth(-maxHealth*0.1)
var/obj/effect/temp_visual/heal/H = new /obj/effect/temp_visual/heal(get_turf(src)) //hello yes you are being healed
if(overmind)
H.color = overmind.blob_reagent_datum.complementary_color
H.color = overmind.blobstrain.complementary_color
else
H.color = "#000000"
if(locate(/obj/structure/blob/node) in blobs_in_area)
adjustHealth(-maxHealth*0.05)
var/obj/effect/temp_visual/heal/H = new /obj/effect/temp_visual/heal(get_turf(src))
if(overmind)
H.color = overmind.blob_reagent_datum.complementary_color
H.color = overmind.blobstrain.complementary_color
else
H.color = "#000000"
if(damagesources)
@@ -259,7 +261,7 @@
var/image/I = new('icons/mob/blob.dmi', src, "nautdamage", MOB_LAYER+0.01)
I.appearance_flags = RESET_COLOR
if(overmind)
I.color = overmind.blob_reagent_datum.complementary_color
I.color = overmind.blobstrain.complementary_color
flick_overlay_view(I, src, 8)
/mob/living/simple_animal/hostile/blob/blobbernaut/adjustHealth(amount, updating_health = TRUE, forced = FALSE)
@@ -274,16 +276,14 @@
/mob/living/simple_animal/hostile/blob/blobbernaut/AttackingTarget()
. = ..()
if(. && isliving(target) && overmind)
var/mob/living/L = target
var/mob_protection = L.get_permeability_protection()
overmind.blob_reagent_datum.reaction_mob(L, VAPOR, 20, 0, mob_protection, overmind)//this will do between 10 and 20 damage(reduced by mob protection), depending on chemical, plus 4 from base brute damage.
overmind.blobstrain.blobbernaut_attack(target)
/mob/living/simple_animal/hostile/blob/blobbernaut/update_icons()
..()
if(overmind) //if we have an overmind, we're doing chemical reactions instead of pure damage
melee_damage_lower = 4
melee_damage_upper = 4
attacktext = overmind.blob_reagent_datum.blobbernaut_message
attacktext = overmind.blobstrain.blobbernaut_message
else
melee_damage_lower = initial(melee_damage_lower)
melee_damage_upper = initial(melee_damage_upper)

View File

@@ -8,12 +8,8 @@
explosion_block = 6
point_return = -1
health_regen = 0 //we regen in Life() instead of when pulsed
var/core_regen = 2
var/resource_delay = 0
var/point_rate = 2
/obj/structure/blob/core/Initialize(mapload, client/new_overmind = null, new_rate = 2, placed = 0)
/obj/structure/blob/core/Initialize(mapload, client/new_overmind = null, placed = 0)
GLOB.blob_cores += src
START_PROCESSING(SSobj, src)
GLOB.poi_list |= src
@@ -22,7 +18,6 @@
return INITIALIZE_HINT_QDEL
if(overmind)
update_icon()
point_rate = new_rate
addtimer(CALLBACK(src, .proc/generate_announcement), 1800)
. = ..()
@@ -37,7 +32,7 @@
color = null
var/mutable_appearance/blob_overlay = mutable_appearance('icons/mob/blob.dmi', "blob")
if(overmind)
blob_overlay.color = overmind.blob_reagent_datum.color
blob_overlay.color = overmind.blobstrain.color
add_overlay(blob_overlay)
add_overlay(mutable_appearance('icons/mob/blob.dmi', "blob_core_overlay"))
@@ -60,17 +55,13 @@
if(overmind) //we should have an overmind, but...
overmind.update_health_hud()
/obj/structure/blob/core/Life()
/obj/structure/blob/core/process()
if(QDELETED(src))
return
if(!overmind)
qdel(src)
else
if(resource_delay <= world.time)
resource_delay = world.time + 10 // 1 second
overmind.add_points(point_rate)
obj_integrity = min(max_integrity, obj_integrity+core_regen)
if(overmind)
overmind.blobstrain.core_process()
overmind.update_health_hud()
Pulse_Area(overmind, 12, 4, 3)
for(var/obj/structure/blob/normal/B in range(1, src))

View File

@@ -22,7 +22,7 @@
color = null
var/mutable_appearance/blob_overlay = mutable_appearance('icons/mob/blob.dmi', "blob")
if(overmind)
blob_overlay.color = overmind.blob_reagent_datum.color
blob_overlay.color = overmind.blobstrain.color
add_overlay(blob_overlay)
add_overlay(mutable_appearance('icons/mob/blob.dmi', "blob_node_overlay"))
@@ -31,6 +31,6 @@
STOP_PROCESSING(SSobj, src)
return ..()
/obj/structure/blob/node/Life()
/obj/structure/blob/node/process()
if(overmind)
Pulse_Area(overmind, 10, 3, 2)

View File

@@ -0,0 +1,74 @@
GLOBAL_LIST_INIT(valid_blobstrains, subtypesof(/datum/blobstrain) - list(/datum/blobstrain/reagent, /datum/blobstrain/multiplex))
/datum/blobstrain
var/name
var/description
var/color = "#000000"
var/complementary_color = "#000000" //a color that's complementary to the normal blob color
var/shortdesc = null //just damage and on_mob effects, doesn't include special, blob-tile only effects
var/effectdesc = null //any long, blob-tile specific effects
var/analyzerdescdamage = "Unknown. Report this bug to a coder, or just adminhelp."
var/analyzerdesceffect = "N/A"
var/blobbernaut_message = "slams" //blobbernaut attack verb
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/core_regen = 2
var/resource_delay = 0
var/point_rate = 2
var/mob/camera/blob/overmind
/datum/blobstrain/New(mob/camera/blob/new_overmind)
if (!istype(new_overmind))
stack_trace("blobstrain created without overmind")
overmind = new_overmind
/datum/blobstrain/proc/on_gain()
overmind.color = complementary_color
for(var/BL in GLOB.blobs)
var/obj/structure/blob/B = BL
B.update_icon()
for(var/BLO in overmind.blob_mobs)
var/mob/living/simple_animal/hostile/blob/BM = BLO
BM.update_icons() //If it's getting a new strain, tell it what it does!
to_chat(BM, "Your overmind's blob strain is now: <b><font color=\"[color]\">[name]</b></font>!")
to_chat(BM, "The <b><font color=\"[color]\">[name]</b></font> strain [shortdesc ? "[shortdesc]" : "[description]"]")
/datum/blobstrain/proc/on_lose()
/datum/blobstrain/proc/on_sporedeath(mob/living/spore)
/datum/blobstrain/proc/send_message(mob/living/M)
var/totalmessage = message
if(message_living && !issilicon(M))
totalmessage += message_living
totalmessage += "!"
to_chat(M, "<span class='userdanger'>[totalmessage]</span>")
/datum/blobstrain/proc/core_process()
if(resource_delay <= world.time)
resource_delay = world.time + 10 // 1 second
overmind.add_points(point_rate)
overmind.blob_core.obj_integrity = min(overmind.blob_core.max_integrity, overmind.blob_core.obj_integrity+core_regen)
/datum/blobstrain/proc/attack_living(var/mob/living/L) // When the blob attacks people
send_message(L)
/datum/blobstrain/proc/blobbernaut_attack(mob/living/L) // When this blob's blobbernaut attacks people
/datum/blobstrain/proc/damage_reaction(obj/structure/blob/B, damage, damage_type, damage_flag, coefficient = 1) //when the blob takes damage, do this
return coefficient*damage
/datum/blobstrain/proc/death_reaction(obj/structure/blob/B, damage_flag, coefficient = 1) //when a blob dies, do this
return
/datum/blobstrain/proc/expand_reaction(obj/structure/blob/B, obj/structure/blob/newB, turf/T, mob/camera/blob/O, coefficient = 1) //when the blob expands, do this
return
/datum/blobstrain/proc/tesla_reaction(obj/structure/blob/B, power, coefficient = 1) //when the blob is hit by a tesla bolt, do this
return 1 //return 0 to ignore damage
/datum/blobstrain/proc/extinguish_reaction(obj/structure/blob/B, coefficient = 1) //when the blob is hit with water, do this
return
/datum/blobstrain/proc/emp_reaction(obj/structure/blob/B, severity, coefficient = 1) //when the blob is hit with an emp, do this
return

View File

@@ -0,0 +1,33 @@
/datum/blobstrain/reagent // Blobs that mess with reagents, all "legacy" ones
var/datum/reagent/reagent
/datum/blobstrain/reagent/New(mob/camera/blob/new_overmind)
. = ..()
reagent = new reagent()
/datum/blobstrain/reagent/attack_living(var/mob/living/L)
var/mob_protection = L.get_permeability_protection()
reagent.reaction_mob(L, VAPOR, 25, 1, mob_protection, overmind)
send_message(L)
/datum/blobstrain/reagent/blobbernaut_attack(mob/living/L)
var/mob_protection = L.get_permeability_protection()
reagent.reaction_mob(L, VAPOR, 20, 0, mob_protection, overmind)//this will do between 10 and 20 damage(reduced by mob protection), depending on chemical, plus 4 from base brute damage.
/datum/blobstrain/reagent/on_sporedeath(mob/living/spore)
spore.reagents.add_reagent(reagent.type, 10)
// These can only be applied by blobs. They are what (reagent) blobs are made out of.
/datum/reagent/blob
name = "Unknown"
description = "shouldn't exist and you should adminhelp immediately."
color = "#FFFFFF"
taste_description = "bad code and slime"
can_synth = FALSE
/datum/reagent/blob/reaction_mob(mob/living/M, method=TOUCH, reac_volume, show_message, touch_protection, mob/camera/blob/O)
if(M.stat == DEAD || istype(M, /mob/living/simple_animal/hostile/blob))
return 0 //the dead, and blob mobs, don't cause reactions
return round(reac_volume * min(1.5 - touch_protection, 1), 0.1) //full touch protection means 50% volume, any prot below 0.5 means 100% volume.

View File

@@ -0,0 +1,41 @@
//sets you on fire, does burn damage, explodes into flame when burnt, weak to water
/datum/blobstrain/reagent/blazing_oil
name = "Blazing Oil"
description = "will do medium burn damage and set targets on fire."
effectdesc = "will also release bursts of flame when burnt, but takes damage from water."
analyzerdescdamage = "Does medium burn damage and sets targets on fire."
analyzerdesceffect = "Releases fire when burnt, but takes damage from water and other extinguishing liquids."
color = "#B68D00"
complementary_color = "#BE5532"
blobbernaut_message = "splashes"
message = "The blob splashes you with burning oil"
message_living = ", and you feel your skin char and melt"
reagent = /datum/reagent/blob/blazing_oil
/datum/blobstrain/reagent/blazing_oil/extinguish_reaction(obj/structure/blob/B)
B.take_damage(1.5, BURN, "energy")
/datum/blobstrain/reagent/blazing_oil/damage_reaction(obj/structure/blob/B, damage, damage_type, damage_flag)
if(damage_type == BURN && damage_flag != "energy")
for(var/turf/open/T in range(1, B))
var/obj/structure/blob/C = locate() in T
if(!(C && C.overmind && C.overmind.blobstrain.type == B.overmind.blobstrain.type) && prob(80))
new /obj/effect/hotspot(T)
if(damage_flag == "fire")
return 0
return ..()
/datum/reagent/blob/blazing_oil
name = "Blazing Oil"
taste_description = "burning oil"
color = "#B68D00"
/datum/reagent/blob/blazing_oil/reaction_mob(mob/living/M, method=TOUCH, reac_volume, show_message, touch_protection, mob/camera/blob/O)
reac_volume = ..()
M.adjust_fire_stacks(round(reac_volume/10))
M.IgniteMob()
if(M)
M.apply_damage(0.8*reac_volume, BURN)
if(iscarbon(M))
M.emote("scream")

View File

@@ -0,0 +1,32 @@
//does brute, burn, and toxin damage, and cools targets down
/datum/blobstrain/reagent/cryogenic_poison
name = "Cryogenic Poison"
description = "will inject targets with a freezing poison that does high damage over time."
analyzerdescdamage = "Injects targets with a freezing poison that will gradually solidify the target's internal organs."
color = "#8BA6E9"
complementary_color = "#7D6EB4"
blobbernaut_message = "injects"
message = "The blob stabs you"
message_living = ", and you feel like your insides are solidifying"
reagent = /datum/reagent/blob/cryogenic_poison
/datum/reagent/blob/cryogenic_poison
name = "Cryogenic Poison"
description = "will inject targets with a freezing poison that does high damage over time."
color = "#8BA6E9"
taste_description = "brain freeze"
/datum/reagent/blob/cryogenic_poison/reaction_mob(mob/living/M, method=TOUCH, reac_volume, show_message, touch_protection, mob/camera/blob/O)
reac_volume = ..()
if(M.reagents)
M.reagents.add_reagent("frostoil", 0.3*reac_volume)
M.reagents.add_reagent("ice", 0.3*reac_volume)
M.reagents.add_reagent("cryogenic_poison", 0.3*reac_volume)
M.apply_damage(0.2*reac_volume, BRUTE)
/datum/reagent/blob/cryogenic_poison/on_mob_life(mob/living/carbon/M)
M.adjustBruteLoss(0.3*REAGENTS_EFFECT_MULTIPLIER, 0)
M.adjustFireLoss(0.3*REAGENTS_EFFECT_MULTIPLIER, 0)
M.adjustToxLoss(0.3*REAGENTS_EFFECT_MULTIPLIER, 0)
. = 1
..()

View File

@@ -0,0 +1,33 @@
//does burn damage and EMPs, slightly fragile
/datum/blobstrain/reagent/electromagnetic_web
name = "Electromagnetic Web"
color = "#83ECEC"
complementary_color = "#EC8383"
reagent = /datum/reagent/blob/electromagnetic_web
/datum/blobstrain/reagent/electromagnetic_web/damage_reaction(obj/structure/blob/B, damage, damage_type, damage_flag)
if(damage_type == BRUTE) //take full brute
switch(B.brute_resist)
if(0.5)
return damage * 2
if(0.25)
return damage * 4
if(0.1)
return damage * 10
return damage * 1.25 //a laser will do 25 damage, which will kill any normal blob
/datum/blobstrain/reagent/electromagnetic_web/death_reaction(obj/structure/blob/B, damage_flag)
if(damage_flag == "melee" || damage_flag == "bullet" || damage_flag == "laser")
empulse(B.loc, 1, 3) //less than screen range, so you can stand out of range to avoid it
/datum/reagent/blob/electromagnetic_web
name = "Electromagnetic Web"
taste_description = "pop rocks"
color = "#83ECEC"
/datum/reagent/blob/electromagnetic_web/reaction_mob(mob/living/M, method=TOUCH, reac_volume, show_message, touch_protection, mob/camera/blob/O)
reac_volume = ..()
if(prob(reac_volume*2))
M.emp_act(EMP_LIGHT)
if(M)
M.apply_damage(reac_volume, BURN)

View File

@@ -0,0 +1,34 @@
//does tons of oxygen damage and a little stamina, immune to tesla bolts, weak to EMP
/datum/blobstrain/reagent/energized_jelly
name = "Energized Jelly"
description = "will cause low stamina and high oxygen damage, and cause targets to be unable to breathe."
effectdesc = "will also conduct electricity, but takes damage from EMPs."
analyzerdescdamage = "Does low stamina damage, high oxygen damage, and prevents targets from breathing."
analyzerdesceffect = "Is immune to electricity and will easily conduct it, but is weak to EMPs."
color = "#EFD65A"
complementary_color = "#00E5B1"
reagent = /datum/reagent/blob/energized_jelly
/datum/blobstrain/reagent/energized_jelly/damage_reaction(obj/structure/blob/B, damage, damage_type, damage_flag)
if((damage_flag == "melee" || damage_flag == "bullet" || damage_flag == "laser") && B.obj_integrity - damage <= 0 && prob(10))
do_sparks(rand(2, 4), FALSE, B)
return ..()
/datum/blobstrain/reagent/energized_jelly/tesla_reaction(obj/structure/blob/B, power)
return 0
/datum/blobstrain/reagent/energized_jelly/emp_reaction(obj/structure/blob/B, severity)
var/damage = rand(30, 50) - severity * rand(10, 15)
B.take_damage(damage, BURN, "energy")
/datum/reagent/blob/energized_jelly
name = "Energized Jelly"
taste_description = "gelatin"
color = "#EFD65A"
/datum/reagent/blob/energized_jelly/reaction_mob(mob/living/M, method=TOUCH, reac_volume, show_message, touch_protection, mob/camera/blob/O)
reac_volume = ..()
M.losebreath += round(0.2*reac_volume)
M.adjustStaminaLoss(0.4*reac_volume)
if(M)
M.apply_damage(0.6*reac_volume, OXY)

View File

@@ -0,0 +1,40 @@
//does aoe brute damage when hitting targets, is immune to explosions
/datum/blobstrain/reagent/explosive_lattice
name = "Explosive Lattice"
description = "will do brute damage in an area around targets."
effectdesc = "will also resist explosions, but takes increased damage from fire and other energy sources."
analyzerdescdamage = "Does medium brute damage and causes damage to everyone near its targets."
analyzerdesceffect = "Is highly resistant to explosions, but takes increased damage from fire and other energy sources."
color = "#8B2500"
complementary_color = "#00668B"
blobbernaut_message = "blasts"
message = "The blob blasts you"
reagent = /datum/reagent/blob/explosive_lattice
/datum/blobstrain/reagent/explosive_lattice/damage_reaction(obj/structure/blob/B, damage, damage_type, damage_flag)
if(damage_flag == "bomb")
return 0
else if(damage_flag != "melee" && damage_flag != "bullet" && damage_flag != "laser")
return damage * 1.5
return ..()
/datum/reagent/blob/explosive_lattice
name = "Explosive Lattice"
taste_description = "the bomb"
color = "#8B2500"
/datum/reagent/blob/explosive_lattice/reaction_mob(mob/living/M, method=TOUCH, reac_volume, show_message, touch_protection, mob/camera/blob/O)
var/initial_volume = reac_volume
reac_volume = ..()
if(reac_volume >= 10) //if it's not a spore cloud, bad time incoming
var/obj/effect/temp_visual/explosion/fast/E = new /obj/effect/temp_visual/explosion/fast(get_turf(M))
E.alpha = 150
for(var/mob/living/L in orange(get_turf(M), 1))
if(ROLE_BLOB in L.faction) //no friendly fire
continue
var/aoe_volume = ..(L, TOUCH, initial_volume, 0, L.get_permeability_protection(), O)
L.apply_damage(0.4*aoe_volume, BRUTE)
if(M)
M.apply_damage(0.6*reac_volume, BRUTE)
else
M.apply_damage(0.6*reac_volume, BRUTE)

View File

@@ -0,0 +1,40 @@
/datum/blobstrain/multiplex
var/list/blobstrains
var/typeshare
/datum/blobstrain/multiplex/New(mob/camera/blob/new_overmind, list/blobstrains)
. = ..()
for (var/bt in blobstrains)
if (ispath(bt, /datum/blobstrain))
src.blobstrains += new bt(overmind)
else if (istype(bt, /datum/blobstrain))
var/datum/blobstrain/bts = bt
bts.overmind = overmind
src.blobstrains += bt
typeshare = (0.8 * length(src.blobstrains)) - (length(src.blobstrains)-1) // 1 is 80%, 2 are 60% etc
/datum/blobstrain/multiplex/damage_reaction(obj/structure/blob/B, damage, damage_type, damage_flag, coefficient = 1) //when the blob takes damage, do this
for (var/datum/blobstrain/bt in blobstrains)
. += bt.damage_reaction(B, damage, damage_type, damage_flag, coefficient*typeshare)
/datum/blobstrain/multiplex/death_reaction(obj/structure/blob/B, damage_flag, coefficient = 1) //when a blob dies, do this
for (var/datum/blobstrain/bt in blobstrains)
. += bt.death_reaction(B, damage_flag, coefficient*typeshare)
/datum/blobstrain/multiplex/expand_reaction(obj/structure/blob/B, obj/structure/blob/newB, turf/T, mob/camera/blob/O, coefficient = 1) //when the blob expands, do this
for (var/datum/blobstrain/bt in blobstrains)
. += bt.expand_reaction(B, newB, T, O, coefficient*typeshare)
/datum/blobstrain/multiplex/tesla_reaction(obj/structure/blob/B, power, coefficient = 1) //when the blob is hit by a tesla bolt, do this
for (var/datum/blobstrain/bt in blobstrains)
. += bt.tesla_reaction(B, power, coefficient*typeshare)
if (prob(. / length(blobstrains) * 100))
return 1
/datum/blobstrain/multiplex/extinguish_reaction(obj/structure/blob/B, coefficient = 1) //when the blob is hit with water, do this
for (var/datum/blobstrain/bt in blobstrains)
. += bt.extinguish_reaction(B, coefficient*typeshare)
/datum/blobstrain/multiplex/emp_reaction(obj/structure/blob/B, severity, coefficient = 1) //when the blob is hit with an emp, do this
for (var/datum/blobstrain/bt in blobstrains)
. += bt.emp_reaction(B, severity, coefficient*typeshare)

View File

@@ -0,0 +1,38 @@
//does massive brute and burn damage, but can only expand manually
/datum/blobstrain/reagent/networked_fibers
name = "Networked Fibers"
description = "will do high brute and burn damage and will generate resources quicker, but can only expand manually."
shortdesc = "will do high brute and burn damage."
effectdesc = "will move your core when manually expanding near it."
analyzerdescdamage = "Does high brute and burn damage."
analyzerdesceffect = "Is highly mobile and generates resources rapidly."
color = "#CDC0B0"
complementary_color = "#FFF68F"
reagent = /datum/reagent/blob/networked_fibers
/datum/blobstrain/reagent/networked_fibers/expand_reaction(obj/structure/blob/B, obj/structure/blob/newB, turf/T, mob/camera/blob/O)
if(!O && newB.overmind)
if(!istype(B, /obj/structure/blob/node))
newB.overmind.add_points(1)
qdel(newB)
else
var/area/A = get_area(T)
if(!isspaceturf(T) && !istype(A, /area/shuttle))
for(var/obj/structure/blob/core/C in range(1, newB))
if(C.overmind == O)
newB.forceMove(get_turf(C))
C.forceMove(T)
C.setDir(get_dir(newB, C))
O.add_points(1)
//does massive brute and burn damage, but can only expand manually
/datum/reagent/blob/networked_fibers
name = "Networked Fibers"
taste_description = "efficiency"
color = "#CDC0B0"
/datum/reagent/blob/networked_fibers/reaction_mob(mob/living/M, method=TOUCH, reac_volume, show_message, touch_protection, mob/camera/blob/O)
reac_volume = ..()
M.apply_damage(0.6*reac_volume, BRUTE)
if(M)
M.apply_damage(0.6*reac_volume, BURN)

View File

@@ -0,0 +1,51 @@
//does low brute damage, oxygen damage, and stamina damage and wets tiles when damaged
/datum/blobstrain/reagent/pressurized_slime
name = "Pressurized Slime"
description = "will do low brute, oxygen, and stamina damage, and wet tiles under targets."
effectdesc = "will also wet tiles near blobs that are attacked or killed."
analyzerdescdamage = "Does low brute damage, low oxygen damage, drains stamina, and wets tiles under targets, extinguishing them."
analyzerdesceffect = "When attacked or killed, lubricates nearby tiles, extinguishing anything on them."
color = "#AAAABB"
complementary_color = "#BBBBAA"
blobbernaut_message = "emits slime at"
message = "The blob splashes into you"
message_living = ", and you gasp for breath"
reagent = /datum/reagent/blob/pressurized_slime
/datum/blobstrain/reagent/pressurized_slime/damage_reaction(obj/structure/blob/B, damage, damage_type, damage_flag)
if((damage_flag == "melee" || damage_flag == "bullet" || damage_flag == "laser") || damage_type != BURN)
extinguisharea(B, damage)
return ..()
/datum/blobstrain/reagent/pressurized_slime/death_reaction(obj/structure/blob/B, damage_flag)
if(damage_flag == "melee" || damage_flag == "bullet" || damage_flag == "laser")
B.visible_message("<span class='boldwarning'>The blob ruptures, spraying the area with liquid!</span>")
extinguisharea(B, 50)
/datum/blobstrain/reagent/pressurized_slime/proc/extinguisharea(obj/structure/blob/B, probchance)
for(var/turf/open/T in range(1, B))
if(prob(probchance))
T.MakeSlippery(TURF_WET_LUBE, min_wet_time = 10 SECONDS, wet_time_to_add = 5 SECONDS)
for(var/obj/O in T)
O.extinguish()
for(var/mob/living/L in T)
L.adjust_fire_stacks(-2.5)
L.ExtinguishMob()
/datum/reagent/blob/pressurized_slime
name = "Pressurized Slime"
taste_description = "a sponge"
color = "#AAAABB"
/datum/reagent/blob/pressurized_slime/reaction_mob(mob/living/M, method=TOUCH, reac_volume, show_message, touch_protection, mob/camera/blob/O)
reac_volume = ..()
var/turf/open/T = get_turf(M)
if(istype(T) && prob(reac_volume))
T.MakeSlippery(TURF_WET_LUBE, min_wet_time = 10 SECONDS, wet_time_to_add = 5 SECONDS)
M.adjust_fire_stacks(-(reac_volume / 10))
M.ExtinguishMob()
M.apply_damage(0.4*reac_volume, BRUTE)
if(M)
M.apply_damage(0.4*reac_volume, OXY)
if(M)
M.adjustStaminaLoss(0.2*reac_volume)

View File

@@ -0,0 +1,30 @@
//does brute damage through armor and bio resistance
/datum/blobstrain/reagent/reactive_spines
name = "Reactive Spines"
description = "will do medium brute damage through armor and bio resistance."
effectdesc = "will also react when attacked with brute damage, attacking all near the attacked blob."
analyzerdescdamage = "Does medium brute damage, ignoring armor and bio resistance."
analyzerdesceffect = "When attacked with brute damage, will lash out, attacking everything near it."
color = "#9ACD32"
complementary_color = "#FFA500"
blobbernaut_message = "stabs"
message = "The blob stabs you"
reagent = /datum/reagent/blob/reactive_spines
/datum/blobstrain/reagent/reactive_spines/damage_reaction(obj/structure/blob/B, damage, damage_type, damage_flag)
if(damage && damage_type == BRUTE && B.obj_integrity - damage > 0) //is there any damage, is it brute, and will we be alive
if(damage_flag == "melee")
B.visible_message("<span class='boldwarning'>The blob retaliates, lashing out!</span>")
for(var/atom/A in range(1, B))
A.blob_act(B)
return ..()
/datum/reagent/blob/reactive_spines
name = "Reactive Spines"
taste_description = "rock"
color = "#9ACD32"
/datum/reagent/blob/reactive_spines/reaction_mob(mob/living/M, method=TOUCH, reac_volume, show_message, touch_protection, mob/camera/blob/O)
if(M.stat == DEAD || istype(M, /mob/living/simple_animal/hostile/blob))
return 0 //the dead, and blob mobs, don't cause reactions
M.adjustBruteLoss(0.8*reac_volume)

View File

@@ -0,0 +1,33 @@
//does toxin damage, hallucination, targets think they're not hurt at all
/datum/blobstrain/reagent/regenerative_materia
name = "Regenerative Materia"
description = "will do toxin damage and cause targets to believe they are fully healed."
analyzerdescdamage = "Does toxin damage and injects a toxin that causes the target to believe they are fully healed."
color = "#C8A5DC"
complementary_color = "#CD7794"
message_living = ", and you feel <i>alive</i>"
reagent = /datum/reagent/blob/regenerative_materia
/datum/reagent/blob/regenerative_materia
name = "Regenerative Materia"
taste_description = "heaven"
color = "#C8A5DC"
/datum/reagent/blob/regenerative_materia/reaction_mob(mob/living/M, method=TOUCH, reac_volume, show_message, touch_protection, mob/camera/blob/O)
reac_volume = ..()
M.adjust_drugginess(reac_volume)
if(M.reagents)
M.reagents.add_reagent("regenerative_materia", 0.2*reac_volume)
M.reagents.add_reagent("spore", 0.2*reac_volume)
M.apply_damage(0.7*reac_volume, TOX)
/datum/reagent/blob/regenerative_materia/on_mob_life(mob/living/carbon/C)
C.adjustToxLoss(1*REAGENTS_EFFECT_MULTIPLIER)
C.hal_screwyhud = SCREWYHUD_HEALTHY //fully healed, honest
..()
/datum/reagent/blob/regenerative_materia/on_mob_delete(mob/living/M)
if(iscarbon(M))
var/mob/living/carbon/N = M
N.hal_screwyhud = 0
..()

View File

@@ -0,0 +1,34 @@
/datum/blobstrain/reagent/replicating_foam
description = "will do medium brute damage and occasionally expand again when expanding."
shortdesc = "will do medium brute damage."
effectdesc = "will also expand when attacked with burn damage, but takes more brute damage."
color = "#7B5A57"
complementary_color = "#57787B"
analyzerdescdamage = "Does medium brute damage."
analyzerdesceffect = "Expands when attacked with burn damage, will occasionally expand again when expanding, and is fragile to brute damage."
reagent = /datum/reagent/blob/replicating_foam
/datum/blobstrain/reagent/replicating_foam/damage_reaction(obj/structure/blob/B, damage, damage_type, damage_flag)
if(damage_type == BRUTE)
damage = damage * 2
else if(damage_type == BURN && damage > 0 && B.obj_integrity - damage > 0 && prob(60))
var/obj/structure/blob/newB = B.expand(null, null, 0)
if(newB)
newB.obj_integrity = B.obj_integrity - damage
newB.update_icon()
return ..()
/datum/blobstrain/reagent/replicating_foam/expand_reaction(obj/structure/blob/B, obj/structure/blob/newB, turf/T, mob/camera/blob/O)
if(prob(30))
newB.expand(null, null, 0) //do it again!
/datum/reagent/blob/replicating_foam
name = "Replicating Foam"
taste_description = "duplication"
color = "#7B5A57"
/datum/reagent/blob/replicating_foam/reaction_mob(mob/living/M, method=TOUCH, reac_volume, show_message, touch_protection, mob/camera/blob/O)
reac_volume = ..()
M.apply_damage(0.7*reac_volume, BRUTE)

View File

@@ -0,0 +1,35 @@
//does brute damage, shifts away when damaged
/datum/blobstrain/reagent/shifting_fragments
description = "will do medium brute damage."
effectdesc = "will also cause blob parts to shift away when attacked."
analyzerdescdamage = "Does medium brute damage."
analyzerdesceffect = "When attacked, may shift away from the attacker."
color = "#C8963C"
complementary_color = "#3C6EC8"
reagent = /datum/reagent/blob/shifting_fragments
/datum/blobstrain/reagent/shifting_fragments/expand_reaction(obj/structure/blob/B, obj/structure/blob/newB, turf/T, mob/camera/blob/O)
if(istype(B, /obj/structure/blob/normal) || (istype(B, /obj/structure/blob/shield) && prob(25)))
newB.forceMove(get_turf(B))
B.forceMove(T)
/datum/blobstrain/reagent/shifting_fragments/damage_reaction(obj/structure/blob/B, damage, damage_type, damage_flag)
if((damage_flag == "melee" || damage_flag == "bullet" || damage_flag == "laser") && damage > 0 && B.obj_integrity - damage > 0 && prob(60-damage))
var/list/blobstopick = list()
for(var/obj/structure/blob/OB in orange(1, B))
if((istype(OB, /obj/structure/blob/normal) || (istype(OB, /obj/structure/blob/shield) && prob(25))) && OB.overmind && OB.overmind.blobstrain.type == B.overmind.blobstrain.type)
blobstopick += OB //as long as the blob picked is valid; ie, a normal or shield blob that has the same chemical as we do, we can swap with it
if(blobstopick.len)
var/obj/structure/blob/targeted = pick(blobstopick) //randomize the blob chosen, because otherwise it'd tend to the lower left
var/turf/T = get_turf(targeted)
targeted.forceMove(get_turf(B))
B.forceMove(T) //swap the blobs
return ..()
/datum/reagent/blob/shifting_fragments
name = "Shifting Fragments"
color = "#C8963C"
/datum/reagent/blob/shifting_fragments/reaction_mob(mob/living/M, method=TOUCH, reac_volume, show_message, touch_protection, mob/camera/blob/O)
reac_volume = ..()
M.apply_damage(0.7*reac_volume, BRUTE)

View File

@@ -0,0 +1,38 @@
//does brute damage, bonus damage for each nearby blob, and spreads damage out
/datum/blobstrain/reagent/synchronous_mesh
name = "Synchronous Mesh"
description = "will do massively increased brute damage for each blob near the target."
effectdesc = "will also spread damage between each blob near the attacked blob."
analyzerdescdamage = "Does brute damage, increasing for each blob near the target."
analyzerdesceffect = "When attacked, spreads damage between all blobs near the attacked blob."
color = "#65ADA2"
complementary_color = "#AD6570"
blobbernaut_message = "synchronously strikes"
message = "The blobs strike you"
/datum/blobstrain/reagent/synchronous_mesh/damage_reaction(obj/structure/blob/B, damage, damage_type, damage_flag)
if(damage_flag == "melee" || damage_flag == "bullet" || damage_flag == "laser") //the cause isn't fire or bombs, so split the damage
var/damagesplit = 1 //maximum split is 9, reducing the damage each blob takes to 11% but doing that damage to 9 blobs
for(var/obj/structure/blob/C in orange(1, B))
if(!istype(C, /obj/structure/blob/core) && !istype(C, /obj/structure/blob/node) && C.overmind && C.overmind.blobstrain.type == B.overmind.blobstrain.type) //if it doesn't have the same chemical or is a core or node, don't split damage to it
damagesplit += 1
for(var/obj/structure/blob/C in orange(1, B))
if(!istype(C, /obj/structure/blob/core) && !istype(C, /obj/structure/blob/node) && C.overmind && C.overmind.blobstrain.type == B.overmind.blobstrain.type) //only hurt blobs that have the same overmind chemical and aren't cores or nodes
C.take_damage(damage/damagesplit, CLONE, 0, 0)
return damage / damagesplit
else
return damage * 1.25
/datum/reagent/blob/synchronous_mesh
name = "Synchronous Mesh"
taste_description = "toxic mold"
color = "#65ADA2"
/datum/reagent/blob/synchronous_mesh/reaction_mob(mob/living/M, method=TOUCH, reac_volume, show_message, touch_protection, mob/camera/blob/O)
reac_volume = ..()
M.apply_damage(0.2*reac_volume, BRUTE)
if(M && reac_volume)
for(var/obj/structure/blob/B in range(1, M)) //if the target is completely surrounded, this is 2.4*reac_volume bonus damage, total of 2.6*reac_volume
if(M)
B.blob_attack_animation(M) //show them they're getting a bad time
M.apply_damage(0.3*reac_volume, BRUTE)

View File

@@ -0,0 +1,46 @@
//kills sleeping targets and turns them into blob zombies, produces fragile spores when killed or on expanding
/datum/blobstrain/reagent/zombifying_pods
name = "Zombifying Pods"
description = "will do very low toxin damage and harvest sleeping targets for additional resources and a blob zombie."
effectdesc = "will also produce fragile spores when killed and on expanding."
shortdesc = "will do very low toxin damage and harvest sleeping targets for additional resources(for your overmind) and a blob zombie."
analyzerdescdamage = "Does very low toxin damage and kills unconscious humans, turning them into blob zombies."
analyzerdesceffect = "Produces spores when expanding and when killed."
color = "#E88D5D"
complementary_color = "#823ABB"
message_living = ", and you feel tired"
reagent = /datum/reagent/blob/zombifying_pods
/datum/blobstrain/reagent/zombifying_pods/damage_reaction(obj/structure/blob/B, damage, damage_type, damage_flag)
if((damage_flag == "melee" || damage_flag == "bullet" || damage_flag == "laser") && damage <= 20 && B.obj_integrity - damage <= 0 && prob(30)) //if the cause isn't fire or a bomb, the damage is less than 21, we're going to die from that damage, 20% chance of a shitty spore.
B.visible_message("<span class='warning'><b>A spore floats free of the blob!</b></span>")
var/mob/living/simple_animal/hostile/blob/blobspore/weak/BS = new/mob/living/simple_animal/hostile/blob/blobspore/weak(B.loc)
BS.overmind = B.overmind
BS.update_icons()
B.overmind.blob_mobs.Add(BS)
return ..()
/datum/blobstrain/reagent/zombifying_pods/expand_reaction(obj/structure/blob/B, obj/structure/blob/newB, turf/T, mob/camera/blob/O)
if(prob(10))
var/mob/living/simple_animal/hostile/blob/blobspore/weak/BS = new/mob/living/simple_animal/hostile/blob/blobspore/weak(T)
BS.overmind = B.overmind
BS.update_icons()
newB.overmind.blob_mobs.Add(BS)
/datum/reagent/blob/zombifying_pods
name = "Zombifying Pods"
color = "#E88D5D"
/datum/reagent/blob/zombifying_pods/reaction_mob(mob/living/M, method=TOUCH, reac_volume, show_message, touch_protection, mob/camera/blob/O)
reac_volume = ..()
M.apply_damage(0.6*reac_volume, TOX)
if(O && ishuman(M) && M.stat == UNCONSCIOUS)
M.death() //sleeping in a fight? bad plan.
var/points = rand(5, 10)
var/mob/living/simple_animal/hostile/blob/blobspore/BS = new/mob/living/simple_animal/hostile/blob/blobspore/weak(get_turf(M))
BS.overmind = O
BS.update_icons()
O.blob_mobs.Add(BS)
BS.Zombify(M)
O.add_points(points)
to_chat(O, "<span class='notice'>Gained [points] resources from the zombification of [M].</span>")

View File

@@ -20,25 +20,25 @@ GLOBAL_LIST_EMPTY(blob_nodes)
pass_flags = PASSBLOB
faction = list(ROLE_BLOB)
lighting_alpha = LIGHTING_PLANE_ALPHA_MOSTLY_INVISIBLE
call_life = TRUE
hud_type = /datum/hud/blob_overmind
var/obj/structure/blob/core/blob_core = null // The blob overmind's core
var/blob_points = 0
var/max_blob_points = 250
var/last_attack = 0
var/datum/reagent/blob/blob_reagent_datum = new/datum/reagent/blob()
var/datum/blobstrain/blobstrain
var/list/blob_mobs = list()
var/list/resource_blobs = list()
var/free_chem_rerolls = 1 //one free chemical reroll
var/free_strain_rerolls = 1 //one free strain reroll
var/last_reroll_time = 0 //time since we last rerolled, used to give free rerolls
var/nodes_required = 1 //if the blob needs nodes to place resource and factory blobs
var/placed = 0
var/base_point_rate = 2 //for blob core placement
var/manualplace_min_time = 600 //in deciseconds //a minute, to get bearings
var/autoplace_max_time = 3600 //six minutes, as long as should be needed
var/list/blobs_legit = list()
var/max_count = 0 //The biggest it got before death
var/blobwincount = 400
var/victory_in_progress = FALSE
var/rerolling = FALSE
/mob/camera/blob/Initialize(mapload, starting_points = 60)
validate_location()
@@ -50,13 +50,14 @@ GLOBAL_LIST_EMPTY(blob_nodes)
name = new_name
real_name = new_name
last_attack = world.time
var/datum/reagent/blob/BC = pick((subtypesof(/datum/reagent/blob)))
blob_reagent_datum = new BC
color = blob_reagent_datum.complementary_color
var/datum/blobstrain/BS = pick(GLOB.valid_blobstrains)
set_strain(BS)
color = blobstrain.complementary_color
if(blob_core)
blob_core.update_icon()
SSshuttle.registerHostileEnvironment(src)
.= ..()
. = ..()
START_PROCESSING(SSobj, src)
/mob/camera/blob/proc/validate_location()
var/turf/T = get_turf(src)
@@ -70,13 +71,28 @@ GLOBAL_LIST_EMPTY(blob_nodes)
CRASH("No blobspawnpoints and blob spawned in nullspace.")
forceMove(T)
/mob/camera/blob/proc/set_strain(datum/blobstrain/new_strain)
if (ispath(new_strain))
var/hadstrain = FALSE
if (istype(blobstrain))
blobstrain.on_lose()
qdel(blobstrain)
hadstrain = TRUE
blobstrain = new new_strain(src)
blobstrain.on_gain()
if (hadstrain)
to_chat(src, "Your strain is now: <b><font color=\"[blobstrain.color]\">[blobstrain.name]</b></font>!")
to_chat(src, "The <b><font color=\"[blobstrain.color]\">[blobstrain.name]</b></font> strain [blobstrain.description]")
if(blobstrain.effectdesc)
to_chat(src, "The <b><font color=\"[blobstrain.color]\">[blobstrain.name]</b></font> strain [blobstrain.effectdesc]")
/mob/camera/blob/proc/is_valid_turf(turf/T)
var/area/A = get_area(T)
if((A && !A.blob_allowed) || !T || !is_station_level(T.z) || isspaceturf(T))
return FALSE
return TRUE
/mob/camera/blob/Life()
/mob/camera/blob/process()
if(!blob_core)
if(!placed)
if(manualplace_min_time && world.time >= manualplace_min_time)
@@ -84,7 +100,7 @@ GLOBAL_LIST_EMPTY(blob_nodes)
to_chat(src, "<span class='big'><font color=\"#EE4000\">You will automatically place your blob core in [DisplayTimeText(autoplace_max_time - world.time)].</font></span>")
manualplace_min_time = 0
if(autoplace_max_time && world.time >= autoplace_max_time)
place_blob_core(base_point_rate, 1)
place_blob_core(1)
else
qdel(src)
else if(!victory_in_progress && (blobs_legit.len >= blobwincount))
@@ -94,11 +110,12 @@ GLOBAL_LIST_EMPTY(blob_nodes)
max_blob_points = INFINITY
blob_points = INFINITY
addtimer(CALLBACK(src, .proc/victory), 450)
else if(!free_strain_rerolls && (last_reroll_time + BLOB_REROLL_TIME<world.time))
to_chat(src, "<b><span class='big'><font color=\"#EE4000\">You have gained another free strain re-roll.</font></span></b>")
free_strain_rerolls = 1
if(!victory_in_progress && max_count < blobs_legit.len)
max_count = blobs_legit.len
..()
/mob/camera/blob/proc/victory()
sound_to_playing_players('sound/machines/alarm.ogg')
@@ -129,7 +146,7 @@ GLOBAL_LIST_EMPTY(blob_nodes)
continue
if(!A.blob_allowed)
continue
A.color = blob_reagent_datum.color
A.color = blobstrain.color
A.name = "blob"
A.icon = 'icons/mob/blob.dmi'
A.icon_state = "blob_shield"
@@ -162,6 +179,7 @@ GLOBAL_LIST_EMPTY(blob_nodes)
blobs_legit = null
SSshuttle.clearHostileEnvironment(src)
STOP_PROCESSING(SSobj, src)
return ..()
@@ -173,9 +191,9 @@ GLOBAL_LIST_EMPTY(blob_nodes)
add_points(0)
/mob/camera/blob/examine(mob/user)
. = ..()
if(blob_reagent_datum)
. += "Its chemical is <font color=\"[blob_reagent_datum.color]\">[blob_reagent_datum.name]</font>."
..()
if(blobstrain)
to_chat(user, "Its strain is <font color=\"[blobstrain.color]\">[blobstrain.name]</font>.")
/mob/camera/blob/update_health_hud()
if(blob_core)
@@ -214,7 +232,7 @@ GLOBAL_LIST_EMPTY(blob_nodes)
src.log_talk(message, LOG_SAY)
var/message_a = say_quote(message)
var/rendered = "<span class='big'><font color=\"#EE4000\"><b>\[Blob Telepathy\] [name](<font color=\"[blob_reagent_datum.color]\">[blob_reagent_datum.name]</font>)</b> [message_a]</font></span>"
var/rendered = "<span class='big'><font color=\"#EE4000\"><b>\[Blob Telepathy\] [name](<font color=\"[blobstrain.color]\">[blobstrain.name]</font>)</b> [message_a]</font></span>"
for(var/mob/M in GLOB.mob_list)
if(isovermind(M) || istype(M, /mob/living/simple_animal/hostile/blob))
@@ -233,8 +251,8 @@ GLOBAL_LIST_EMPTY(blob_nodes)
stat(null, "Core Health: [blob_core.obj_integrity]")
stat(null, "Power Stored: [blob_points]/[max_blob_points]")
stat(null, "Blobs to Win: [blobs_legit.len]/[blobwincount]")
if(free_chem_rerolls)
stat(null, "You have [free_chem_rerolls] Free Chemical Reroll\s Remaining")
if(free_strain_rerolls)
stat(null, "You have [free_strain_rerolls] Free Strain Reroll\s Remaining")
if(!placed)
if(manualplace_min_time)
stat(null, "Time Before Manual Placement: [max(round((manualplace_min_time - world.time)*0.1, 0.1), 0)]")

View File

@@ -7,7 +7,7 @@
// Power verbs
/mob/camera/blob/proc/place_blob_core(point_rate, placement_override , pop_override = FALSE)
/mob/camera/blob/proc/place_blob_core(placement_override, pop_override = FALSE)
if(placed && placement_override != -1)
return 1
if(!placement_override)
@@ -47,7 +47,7 @@
if(placed && blob_core)
blob_core.forceMove(loc)
else
var/obj/structure/blob/core/core = new(get_turf(src), src, point_rate, 1)
var/obj/structure/blob/core/core = new(get_turf(src), src, 1)
core.overmind = src
blobs_legit += src
blob_core = core
@@ -71,13 +71,13 @@
var/list/nodes = list()
for(var/i in 1 to GLOB.blob_nodes.len)
var/obj/structure/blob/node/B = GLOB.blob_nodes[i]
nodes["Blob Node #[i] ([B.overmind ? "[B.overmind.blob_reagent_datum.name]":"No Chemical"])"] = B
nodes["Blob Node #[i] ([B.overmind ? "[B.overmind.blobstrain.name]":"No Strain"])"] = B
var/node_name = input(src, "Choose a node to jump to.", "Node Jump") in nodes
var/obj/structure/blob/node/chosen_node = nodes[node_name]
if(chosen_node)
forceMove(chosen_node.loc)
/mob/camera/blob/proc/createSpecial(price, blobType, nearEquals, needsNode, turf/T)
/mob/camera/blob/proc/createSpecial(price, blobstrain, nearEquals, needsNode, turf/T)
if(!T)
T = get_turf(src)
var/obj/structure/blob/B = (locate(/obj/structure/blob) in T)
@@ -93,12 +93,12 @@
return //handholdotron 2000
if(nearEquals)
for(var/obj/structure/blob/L in orange(nearEquals, T))
if(L.type == blobType)
if(L.type == blobstrain)
to_chat(src, "<span class='warning'>There is a similar blob nearby, move more than [nearEquals] tiles away from it!</span>")
return
if(!can_buy(price))
return
var/obj/structure/blob/N = B.change_to(blobType, src)
var/obj/structure/blob/N = B.change_to(blobstrain, src)
return N
/mob/camera/blob/verb/toggle_node_req()
@@ -123,6 +123,7 @@
if(!can_buy(15))
return
if(S.obj_integrity < S.max_integrity * 0.5)
add_points(BLOB_REFLECTOR_COST)
to_chat(src, "<span class='warning'>This shield blob is too damaged to be modified properly!</span>")
return
to_chat(src, "<span class='warning'>You secrete a reflective ooze over the shield blob, allowing it to reflect projectiles at the cost of reduced intregrity.</span>")
@@ -166,7 +167,9 @@
if(!can_buy(40))
return
var/list/mob/candidates = pollGhostCandidates("Do you want to play as a [blob_reagent_datum.name] blobbernaut?", ROLE_BLOB, null, ROLE_BLOB, 50) //players must answer rapidly
B.naut = TRUE //temporary placeholder to prevent creation of more than one per factory.
to_chat(src, "<span class='notice'>You attempt to produce a blobbernaut.</span>")
var/list/mob/dead/observer/candidates = pollGhostCandidates("Do you want to play as a [blobstrain.name] blobbernaut?", ROLE_BLOB, null, ROLE_BLOB, 50) //players must answer rapidly
if(LAZYLEN(candidates)) //if we got at least one candidate, they're a blobbernaut now.
B.max_integrity = initial(B.max_integrity) * 0.25 //factories that produced a blobbernaut have much lower health
B.obj_integrity = min(B.obj_integrity, B.max_integrity)
@@ -188,8 +191,8 @@
to_chat(blobber, "<b>You are a blobbernaut!</b>")
to_chat(blobber, "You are powerful, hard to kill, and slowly regenerate near nodes and cores, <span class='cultlarge'>but will slowly die if not near the blob</span> or if the factory that made you is killed.")
to_chat(blobber, "You can communicate with other blobbernauts and overminds via <b>:b</b>")
to_chat(blobber, "Your overmind's blob reagent is: <b><font color=\"[blob_reagent_datum.color]\">[blob_reagent_datum.name]</b></font>!")
to_chat(blobber, "The <b><font color=\"[blob_reagent_datum.color]\">[blob_reagent_datum.name]</b></font> reagent [blob_reagent_datum.shortdesc ? "[blob_reagent_datum.shortdesc]" : "[blob_reagent_datum.description]"]")
to_chat(blobber, "Your overmind's blob reagent is: <b><font color=\"[blobstrain.color]\">[blobstrain.name]</b></font>!")
to_chat(blobber, "The <b><font color=\"[blobstrain.color]\">[blobstrain.name]</b></font> reagent [blobstrain.shortdesc ? "[blobstrain.shortdesc]" : "[blobstrain.description]"]")
else
to_chat(src, "<span class='warning'>You could not conjure a sentience for your blobbernaut. Your points have been refunded. Try again later.</span>")
add_points(40)
@@ -265,9 +268,7 @@
continue
if(L.stat != DEAD)
attacksuccess = TRUE
var/mob_protection = L.get_permeability_protection()
blob_reagent_datum.reaction_mob(L, VAPOR, 25, 1, mob_protection, src)
blob_reagent_datum.send_message(L)
blobstrain.attack_living(L)
var/obj/structure/blob/B = locate() in T
if(B)
if(attacksuccess) //if we successfully attacked a turf with a blob on it, don't refund shit
@@ -331,41 +332,38 @@
if(BM.stat == CONSCIOUS)
BM.say(speak_text)
/mob/camera/blob/verb/chemical_reroll()
/mob/camera/blob/verb/strain_reroll()
set category = "Blob"
set name = "Reactive Chemical Adaptation (40)"
set desc = "Replaces your chemical with a random, different one."
if(free_chem_rerolls || can_buy(40))
set_chemical()
if(free_chem_rerolls)
free_chem_rerolls--
set name = "Reactive Strain Adaptation (40)"
set desc = "Replaces your strain with a random, different one."
if(!rerolling && (free_strain_rerolls || can_buy(40)))
rerolling = TRUE
reroll_strain()
rerolling = FALSE
if(free_strain_rerolls)
free_strain_rerolls--
last_reroll_time = world.time
/mob/camera/blob/proc/set_chemical()
var/datum/reagent/blob/BC = pick((subtypesof(/datum/reagent/blob) - blob_reagent_datum.type))
blob_reagent_datum = new BC
color = blob_reagent_datum.complementary_color
for(var/BL in GLOB.blobs)
var/obj/structure/blob/B = BL
B.update_icon()
for(var/BLO in blob_mobs)
var/mob/living/simple_animal/hostile/blob/BM = BLO
BM.update_icons() //If it's getting a new chemical, tell it what it does!
to_chat(BM, "Your overmind's blob reagent is now: <b><font color=\"[blob_reagent_datum.color]\">[blob_reagent_datum.name]</b></font>!")
to_chat(BM, "The <b><font color=\"[blob_reagent_datum.color]\">[blob_reagent_datum.name]</b></font> reagent [blob_reagent_datum.shortdesc ? "[blob_reagent_datum.shortdesc]" : "[blob_reagent_datum.description]"]")
to_chat(src, "Your reagent is now: <b><font color=\"[blob_reagent_datum.color]\">[blob_reagent_datum.name]</b></font>!")
to_chat(src, "The <b><font color=\"[blob_reagent_datum.color]\">[blob_reagent_datum.name]</b></font> reagent [blob_reagent_datum.description]")
if(blob_reagent_datum.effectdesc)
to_chat(src, "The <b><font color=\"[blob_reagent_datum.color]\">[blob_reagent_datum.name]</b></font> reagent [blob_reagent_datum.effectdesc]")
/mob/camera/blob/proc/reroll_strain()
var/list/choices = list()
while (length(choices) < 4)
var/datum/blobstrain/bs = pick((GLOB.valid_blobstrains))
choices[initial(bs.name)] = bs
var/choice = input(usr, "Please choose a new strain","Strain") as anything in choices
if (choice && choices[choice] && !QDELETED(src))
var/datum/blobstrain/bs = choices[choice]
set_strain(bs)
/mob/camera/blob/verb/blob_help()
set category = "Blob"
set name = "*Blob Help*"
set desc = "Help on how to blob."
to_chat(src, "<b>As the overmind, you can control the blob!</b>")
to_chat(src, "Your blob reagent is: <b><font color=\"[blob_reagent_datum.color]\">[blob_reagent_datum.name]</b></font>!")
to_chat(src, "The <b><font color=\"[blob_reagent_datum.color]\">[blob_reagent_datum.name]</b></font> reagent [blob_reagent_datum.description]")
if(blob_reagent_datum.effectdesc)
to_chat(src, "The <b><font color=\"[blob_reagent_datum.color]\">[blob_reagent_datum.name]</b></font> reagent [blob_reagent_datum.effectdesc]")
to_chat(src, "Your blob reagent is: <b><font color=\"[blobstrain.color]\">[blobstrain.name]</b></font>!")
to_chat(src, "The <b><font color=\"[blobstrain.color]\">[blobstrain.name]</b></font> reagent [blobstrain.description]")
if(blobstrain.effectdesc)
to_chat(src, "The <b><font color=\"[blobstrain.color]\">[blobstrain.name]</b></font> reagent [blobstrain.effectdesc]")
to_chat(src, "<b>You can expand, which will attack people, damage objects, or place a Normal Blob if the tile is clear.</b>")
to_chat(src, "<i>Normal Blobs</i> will expand your reach and can be upgraded into special blobs that perform certain functions.")
to_chat(src, "<b>You can upgrade normal blobs into the following types of blob:</b>")

View File

@@ -83,16 +83,10 @@
/obj/structure/blob/update_icon() //Updates color based on overmind color if we have an overmind.
if(overmind)
add_atom_colour(overmind.blob_reagent_datum.color, FIXED_COLOUR_PRIORITY)
add_atom_colour(overmind.blobstrain.color, FIXED_COLOUR_PRIORITY)
else
remove_atom_colour(FIXED_COLOUR_PRIORITY)
/obj/structure/blob/process()
Life()
/obj/structure/blob/proc/Life()
return
/obj/structure/blob/proc/Pulse_Area(mob/camera/blob/pulsing_overmind, claim_range = 10, pulse_range = 3, expand_range = 2)
if(QDELETED(pulsing_overmind))
pulsing_overmind = overmind
@@ -148,10 +142,10 @@
O.setDir(dir)
if(controller)
var/mob/camera/blob/BO = controller
O.color = BO.blob_reagent_datum.color
O.color = BO.blobstrain.color
O.alpha = 200
else if(overmind)
O.color = overmind.blob_reagent_datum.color
O.color = overmind.blobstrain.color
if(A)
O.do_attack_animation(A) //visually attack the whatever
return O //just in case you want to do something to the animation.
@@ -192,7 +186,7 @@
B.forceMove(T)
B.update_icon()
if(B.overmind && expand_reaction)
B.overmind.blob_reagent_datum.expand_reaction(src, B, T, controller)
B.overmind.blobstrain.expand_reaction(src, B, T, controller)
return B
else
blob_attack_animation(T, controller)
@@ -209,14 +203,14 @@
return
if(severity > 0)
if(overmind)
overmind.blob_reagent_datum.emp_reaction(src, severity)
overmind.blobstrain.emp_reaction(src, severity)
if(prob(100 - severity * 30))
new /obj/effect/temp_visual/emp(get_turf(src))
/obj/structure/blob/tesla_act(power)
..()
if(overmind)
if(overmind.blob_reagent_datum.tesla_reaction(src, power))
if(overmind.blobstrain.tesla_reaction(src, power))
take_damage(power/400, BURN, "energy")
else
take_damage(power/400, BURN, "energy")
@@ -224,7 +218,7 @@
/obj/structure/blob/extinguish()
..()
if(overmind)
overmind.blob_reagent_datum.extinguish_reaction(src)
overmind.blobstrain.extinguish_reaction(src)
/obj/structure/blob/hulk_damage()
return 15
@@ -243,13 +237,13 @@
else
return ..()
/obj/structure/blob/proc/chemeffectreport()
/obj/structure/blob/proc/chemeffectreport(mob/user)
RETURN_TYPE(/list)
. = list()
if(overmind)
. += "<b>Material: <font color=\"[overmind.blob_reagent_datum.color]\">[overmind.blob_reagent_datum.name]</font><span class='notice'>.</span></b>"
. += "<b>Material Effects:</b> <span class='notice'>[overmind.blob_reagent_datum.analyzerdescdamage]</span>"
. += "<b>Material Properties:</b> <span class='notice'>[overmind.blob_reagent_datum.analyzerdesceffect]</span><br>"
to_chat(user, "<b>Material: <font color=\"[overmind.blobstrain.color]\">[overmind.blobstrain.name]</font><span class='notice'>.</span></b>")
to_chat(user, "<b>Material Effects:</b> <span class='notice'>[overmind.blobstrain.analyzerdescdamage]</span>")
to_chat(user, "<b>Material Properties:</b> <span class='notice'>[overmind.blobstrain.analyzerdesceffect]</span><br>")
else
. += "<b>No Material Detected!</b><br>"
@@ -288,7 +282,7 @@
armor_protection = armor.getRating(damage_flag)
damage_amount = round(damage_amount * (100 - armor_protection)*0.01, 0.1)
if(overmind && damage_flag)
damage_amount = overmind.blob_reagent_datum.damage_reaction(src, damage_amount, damage_type, damage_flag)
damage_amount = overmind.blobstrain.damage_reaction(src, damage_amount, damage_type, damage_flag)
return damage_amount
/obj/structure/blob/take_damage(damage_amount, damage_type = BRUTE, damage_flag = 0, sound_effect = 1, attack_dir)
@@ -298,7 +292,7 @@
/obj/structure/blob/obj_destruction(damage_flag)
if(overmind)
overmind.blob_reagent_datum.death_reaction(src, damage_flag)
overmind.blobstrain.death_reaction(src, damage_flag)
..()
/obj/structure/blob/proc/change_to(type, controller)
@@ -332,8 +326,8 @@
/obj/structure/blob/proc/get_chem_name()
if(overmind)
return overmind.blob_reagent_datum.name
return "an unknown variant"
return overmind.blobstrain.name
return "some kind of organic tissue"
/obj/structure/blob/normal
name = "normal blob"

View File

@@ -258,7 +258,7 @@
/obj/structure/bloodsucker/vassalrack/proc/torture_victim(mob/living/user, mob/living/target)
var/datum/antagonist/bloodsucker/bloodsuckerdatum = user.mind.has_antag_datum(ANTAG_DATUM_BLOODSUCKER)
// Check Bloodmob/living/M, force = FALSE, check_loc = TRUE
var/convert_cost = 200 + 200 * bloodsuckerdatum.vassals
var/convert_cost = 200 + 200 * bloodsuckerdatum.vassals
if(user.blood_volume < convert_cost + 5)
to_chat(user, "<span class='notice'>You don't have enough blood to initiate the Dark Communion with [target].</span>")
return
@@ -449,7 +449,7 @@
/obj/structure/bloodsucker/candelabrum/Destroy()
STOP_PROCESSING(SSobj, src)
/obj/structure/bloodsucker/candelabrum/update_icon()
/obj/structure/bloodsucker/candelabrum/update_icon_state()
icon_state = "candelabrum[lit ? "_lit" : ""]"
/obj/structure/bloodsucker/candelabrum/examine(mob/user)

View File

@@ -126,15 +126,12 @@
to_chat(user, "<span class='notice'>[target] is fixed in place by your hypnotic gaze.</span>")
target.next_move = world.time + power_time // <--- Use direct change instead. We want an unmodified delay to their next move // target.changeNext_move(power_time) // check click.dm
target.notransform = TRUE // <--- Fuck it. We tried using next_move, but they could STILL resist. We're just doing a hard freeze.
UnregisterSignal(target, COMSIG_MOVABLE_MOVED)
spawn(power_time)
if(istype(target) && success)
target.notransform = FALSE
// They Woke Up! (Notice if within view)
if(istype(user) && target.stat == CONSCIOUS && (target in view(10, get_turf(user))) )
to_chat(user, "<span class='warning'>[target] has snapped out of their trance.</span>")
spawn(power_time)
if(istype(target) && success)
target.notransform = FALSE
// They Woke Up! (Notice if within view)
if(istype(user) && target.stat == CONSCIOUS && (target in view(10, get_turf(user))) )
to_chat(user, "<span class='warning'>[target] has snapped out of their trance.</span>")
/datum/action/bloodsucker/targeted/mesmerize/ContinueActive(mob/living/user, mob/living/target)
return ..() && CheckCanUse() && CheckCanTarget(target)

View File

@@ -251,6 +251,7 @@
return TRUE
/obj/effect/clockwork/sigil/transmission/update_icon()
. = ..()
var/power_charge = get_clockwork_power()
if(GLOB.ratvar_awakens)
alpha = 255

View File

@@ -37,7 +37,7 @@
/mob/living/simple_animal/hostile/clockwork/ratvar_act()
fully_heal(TRUE)
/mob/living/simple_animal/hostile/clockwork/electrocute_act(shock_damage, obj/source, siemens_coeff = 1, safety = 0, tesla_shock = 0, illusion = 0, stun = TRUE)
/mob/living/simple_animal/hostile/clockwork/electrocute_act(shock_damage, source, siemens_coeff = 1, flags = NONE)
return 0 //ouch, my metal-unlikely-to-be-damaged-by-electricity-body
/mob/living/simple_animal/hostile/clockwork/examine(mob/user)

View File

@@ -264,7 +264,7 @@
/obj/item/restraints/legcuffs/bola/cult/pickup(mob/living/user)
if(!iscultist(user))
to_chat(user, "<span class='warning'>The bola seems to take on a life of its own!</span>")
throw_impact(user)
ensnare(user)
/obj/item/restraints/legcuffs/bola/cult/throw_impact(atom/hit_atom, datum/thrownthing/throwingdatum)
if(iscultist(hit_atom))
@@ -372,7 +372,7 @@
max = 40
prefix = "darkened"
/obj/item/sharpener/cult/update_icon()
/obj/item/sharpener/cult/update_icon_state()
var/old_state = icon_state
icon_state = "cult_sharpener[used ? "_used" : ""]"
if(old_state != icon_state)
@@ -688,7 +688,7 @@
qdel(spear_act)
..()
/obj/item/twohanded/cult_spear/update_icon()
/obj/item/twohanded/cult_spear/update_icon_state()
icon_state = "bloodspear[wielded]"
/obj/item/twohanded/cult_spear/throw_impact(atom/hit_atom, datum/thrownthing/throwingdatum)

View File

@@ -31,6 +31,7 @@
var/interior = ""
var/proper_bomb = TRUE //Please
var/obj/effect/countdown/nuclearbomb/countdown
var/nuclear_cooldown //used to stop global spam.
/obj/machinery/nuclearbomb/Initialize()
. = ..()
@@ -416,12 +417,16 @@
return
timing = !timing
if(timing)
if(nuclear_cooldown > world.time)
to_chat(usr, "<span class='danger'>[src]'s timer protocols are currently on cooldown, please stand by.</span>")
return
previous_level = get_security_level()
detonation_timer = world.time + (timer_set * 10)
for(var/obj/item/pinpointer/nuke/syndicate/S in GLOB.pinpointer_list)
S.switch_mode_to(TRACK_INFILTRATOR)
countdown.start()
set_security_level("delta")
nuclear_cooldown = world.time + 15 SECONDS
if(GLOB.war_declared)
var/area/A = get_area(src)

View File

@@ -49,7 +49,7 @@
else
to_chat(user, "<span class='warning'>[user] fails to implant [M].</span>")
/obj/item/overthrow_converter/update_icon()
/obj/item/overthrow_converter/update_icon_state()
if(uses)
icon_state = "implanter1"
else

View File

@@ -213,7 +213,7 @@
continue
L.Beam(M,icon_state="purple_lightning",time=5)
if(!M.anti_magic_check(FALSE, TRUE))
M.electrocute_act(shock_damage, L, safety=TRUE)
M.electrocute_act(shock_damage, L, flags = SHOCK_NOGLOVES)
do_sparks(4, FALSE, M)
playsound(M, 'sound/machines/defib_zap.ogg', 50, 1, -1)

View File

@@ -76,8 +76,9 @@
icon_state = "demon_heart-on"
decay_factor = 0
/obj/item/organ/heart/demon/update_icon()
return //always beating visually
/obj/item/organ/heart/demon/ComponentInitialize()
. = ..()
AddElement(/datum/element/update_icon_blocker)
/obj/item/organ/heart/demon/attack(mob/M, mob/living/carbon/user, obj/target)
if(M != user)

View File

@@ -492,8 +492,8 @@
playsound(src,'sound/effects/sparks4.ogg',50,1)
do_teleport(target, F, 0, channel = TELEPORT_CHANNEL_BLUESPACE)
/mob/living/simple_animal/hostile/swarmer/electrocute_act(shock_damage, obj/source, siemens_coeff = 1, safety = FALSE, tesla_shock = FALSE, illusion = FALSE, stun = TRUE)
if(!tesla_shock)
/mob/living/simple_animal/hostile/swarmer/electrocute_act(shock_damage, source, siemens_coeff = 1, flags = NONE)
if(!(flags & SHOCK_TESLA))
return FALSE
return ..()
@@ -584,7 +584,7 @@
var/mob/living/L = AM
if(!istype(L, /mob/living/simple_animal/hostile/swarmer))
playsound(loc,'sound/effects/snap.ogg',50, 1, -1)
L.electrocute_act(0, src, 1, 1, 1)
L.electrocute_act(0, src, 1, flags = SHOCK_NOGLOVES|SHOCK_ILLUSION)
if(iscyborg(L))
L.DefaultCombatKnockdown(100)
qdel(src)

View File

@@ -19,15 +19,17 @@
/obj/item/onetankbomb/examine(mob/user)
bombtank.examine(user)
/obj/item/onetankbomb/update_icon()
cut_overlays()
/obj/item/onetankbomb/update_icon_state()
if(bombtank)
icon = bombtank.icon
icon_state = bombtank.icon_state
/obj/item/onetankbomb/update_overlays()
. = ..()
if(bombassembly)
add_overlay(bombassembly.icon_state)
copy_overlays(bombassembly)
add_overlay("bomb_assembly")
. += bombassembly.icon_state
. += bombassembly.overlays
. += "bomb_assembly"
/obj/item/onetankbomb/wrench_act(mob/living/user, obj/item/I)
to_chat(user, "<span class='notice'>You disassemble [src]!</span>")

View File

@@ -624,10 +624,7 @@
"set_internal_pressure" = 0
))
/obj/machinery/airalarm/update_icon()
set_light(0)
cut_overlays()
SSvis_overlays.remove_vis_overlay(src, managed_vis_overlays)
/obj/machinery/airalarm/update_icon_state()
if(stat & NOPOWER)
icon_state = "alarm0"
return
@@ -636,35 +633,39 @@
icon_state = "alarmx"
return
if(panel_open)
switch(buildstage)
if(2)
icon_state = "alarmx"
if(1)
icon_state = "alarm_b2"
if(0)
icon_state = "alarm_b1"
if(!panel_open)
icon_state = "alarm1"
return
icon_state = "alarm1"
switch(buildstage)
if(2)
icon_state = "alarmx"
if(1)
icon_state = "alarm_b2"
if(0)
icon_state = "alarm_b1"
/obj/machinery/airalarm/update_overlays()
. = ..()
SSvis_overlays.remove_vis_overlay(src, managed_vis_overlays)
var/overlay_state = AALARM_OVERLAY_OFF
var/area/A = get_base_area(src)
switch(max(danger_level, A.atmosalm))
if(0)
add_overlay(AALARM_OVERLAY_GREEN)
overlay_state = AALARM_OVERLAY_GREEN
light_color = LIGHT_COLOR_GREEN
set_light(brightness_on)
if(1)
add_overlay(AALARM_OVERLAY_WARN)
overlay_state = AALARM_OVERLAY_WARN
light_color = LIGHT_COLOR_LAVA
set_light(brightness_on)
if(2)
add_overlay(AALARM_OVERLAY_DANGER)
overlay_state = AALARM_OVERLAY_DANGER
light_color = LIGHT_COLOR_RED
set_light(brightness_on)
if(overlay_state != AALARM_OVERLAY_OFF)
. += overlay_state
set_light(brightness_on)
else
set_light(0)
SSvis_overlays.add_vis_overlay(src, icon, overlay_state, ABOVE_LIGHTING_LAYER, ABOVE_LIGHTING_PLANE, dir)
update_light()

View File

@@ -34,7 +34,6 @@
var/restricted = FALSE
req_access = list()
var/update = 0
var/static/list/label2types = list(
"n2" = /obj/machinery/portable_atmospherics/canister/nitrogen,
"o2" = /obj/machinery/portable_atmospherics/canister/oxygen,
@@ -213,61 +212,26 @@
air_contents.gases[/datum/gas/oxygen] = (O2STANDARD * maximum_pressure * filled) * air_contents.volume / (R_IDEAL_GAS_EQUATION * air_contents.temperature)
air_contents.gases[/datum/gas/nitrogen] = (N2STANDARD * maximum_pressure * filled) * air_contents.volume / (R_IDEAL_GAS_EQUATION * air_contents.temperature)
#define HOLDING (1<<0)
#define CONNECTED (1<<1)
#define EMPTY (1<<2)
#define LOW (1<<3)
#define MEDIUM (1<<4)
#define FULL (1<<5)
#define DANGER (1<<6)
/obj/machinery/portable_atmospherics/canister/update_icon()
/obj/machinery/portable_atmospherics/canister/update_icon_state()
if(stat & BROKEN)
cut_overlays()
icon_state = "[icon_state]-1"
return
var/last_update = update
update = 0
/obj/machinery/portable_atmospherics/canister/update_overlays()
. = ..()
if(holding)
update |= HOLDING
. += "can-open"
if(connected_port)
update |= CONNECTED
. += "can-connector"
var/pressure = air_contents.return_pressure()
if(pressure < 10)
update |= EMPTY
else if(pressure < 5 * ONE_ATMOSPHERE)
update |= LOW
else if(pressure < 10 * ONE_ATMOSPHERE)
update |= MEDIUM
else if(pressure < 40 * ONE_ATMOSPHERE)
update |= FULL
else
update |= DANGER
if(update == last_update)
return
cut_overlays()
if(update & HOLDING)
add_overlay("can-open")
if(update & CONNECTED)
add_overlay("can-connector")
if(update & LOW)
add_overlay("can-o0")
else if(update & MEDIUM)
add_overlay("can-o1")
else if(update & FULL)
add_overlay("can-o2")
else if(update & DANGER)
add_overlay("can-o3")
#undef HOLDING
#undef CONNECTED
#undef EMPTY
#undef LOW
#undef MEDIUM
#undef FULL
#undef DANGER
if(pressure >= 40 * ONE_ATMOSPHERE)
. += "can-o3"
else if(pressure >= 10 * ONE_ATMOSPHERE)
. += "can-o2"
else if(pressure >= 5 * ONE_ATMOSPHERE)
. += "can-o1"
else if(pressure >= 10)
. += "can-o0"
/obj/machinery/portable_atmospherics/canister/temperature_expose(datum/gas_mixture/air, exposed_temperature, exposed_volume)
if(exposed_temperature > temperature_resistance)

View File

@@ -29,14 +29,16 @@
QDEL_NULL(pump)
return ..()
/obj/machinery/portable_atmospherics/pump/update_icon()
/obj/machinery/portable_atmospherics/pump/update_icon_state()
icon_state = "psiphon:[on]"
cut_overlays()
/obj/machinery/portable_atmospherics/pump/update_overlays()
. = ..()
if(holding)
add_overlay("siphon-open")
. += "siphon-open"
if(connected_port)
add_overlay("siphon-connector")
. += "siphon-connector"
/obj/machinery/portable_atmospherics/pump/process_atmos()
..()

View File

@@ -5,6 +5,7 @@
var/on = FALSE
var/volume_rate = 1000
var/use_overlays = TRUE
volume = 1000
var/list/scrubbing = list(/datum/gas/plasma, /datum/gas/carbon_dioxide, /datum/gas/nitrous_oxide, /datum/gas/bz, /datum/gas/nitryl, /datum/gas/tritium, /datum/gas/hypernoblium, /datum/gas/water_vapor)
@@ -15,14 +16,17 @@
air_update_turf()
return ..()
/obj/machinery/portable_atmospherics/scrubber/update_icon()
/obj/machinery/portable_atmospherics/scrubber/update_icon_state()
icon_state = "pscrubber:[on]"
cut_overlays()
/obj/machinery/portable_atmospherics/scrubber/update_overlays()
. = ..()
if(!use_overlays)
return
if(holding)
add_overlay("scrubber-open")
. += "scrubber-open"
if(connected_port)
add_overlay("scrubber-connector")
. += "scrubber-connector"
/obj/machinery/portable_atmospherics/scrubber/process_atmos()
..()
@@ -117,11 +121,12 @@
volume = 50000
var/movable = FALSE
use_overlays = FALSE
/obj/machinery/portable_atmospherics/scrubber/huge/movable
movable = TRUE
/obj/machinery/portable_atmospherics/scrubber/huge/update_icon()
/obj/machinery/portable_atmospherics/scrubber/huge/update_icon_state()
icon_state = "scrubber:[on]"
/obj/machinery/portable_atmospherics/scrubber/huge/process_atmos()

View File

@@ -53,11 +53,8 @@ GLOBAL_DATUM(the_gateway, /obj/machinery/gateway/centerstation)
ready = TRUE
return ready
/obj/machinery/gateway/update_icon()
if(active)
icon_state = "on"
return
icon_state = "off"
/obj/machinery/gateway/update_icon_state()
icon_state = active ? "on" : "off"
/obj/machinery/gateway/attack_hand(mob/user)
. = ..()
@@ -100,11 +97,8 @@ GLOBAL_DATUM(the_gateway, /obj/machinery/gateway/centerstation)
var/obj/machinery/gateway/centeraway/awaygate = null
can_link = TRUE
/obj/machinery/gateway/centerstation/update_icon()
if(active)
icon_state = "oncenter"
return
icon_state = "offcenter"
/obj/machinery/gateway/centerstation/update_icon_state()
icon_state = active ? "oncenter" : "offcenter"
/obj/machinery/gateway/centerstation/process()
if((stat & (NOPOWER)) && use_power)
@@ -185,11 +179,8 @@ GLOBAL_DATUM(the_gateway, /obj/machinery/gateway/centerstation)
stationgate = locate(/obj/machinery/gateway/centerstation)
/obj/machinery/gateway/centeraway/update_icon()
if(active)
icon_state = "oncenter"
return
icon_state = "offcenter"
/obj/machinery/gateway/centeraway/update_icon_state()
icon_state = active ? "oncenter" : "offcenter"
/obj/machinery/gateway/centeraway/toggleon(mob/user)
if(!detect())

View File

@@ -337,8 +337,9 @@
icon_state = "1"
color = rgb(0,0,255)
/obj/structure/ladder/unbreakable/rune/update_icon()
return
/obj/structure/ladder/unbreakable/rune/ComponentInitialize()
. = ..()
AddElement(/datum/element/update_icon_blocker)
/obj/structure/ladder/unbreakable/rune/show_fluff_message(up,mob/user)
user.visible_message("[user] activates \the [src].","<span class='notice'>You activate \the [src].</span>")

View File

@@ -35,5 +35,6 @@
environs."
//we don't want the silly text overlay!
/obj/item/paper/pamphlet/update_icon()
return
/obj/item/paper/pamphlet/ComponentInitialize()
. = ..()
AddElement(/datum/element/update_icon_blocker)

View File

@@ -27,7 +27,7 @@
update_icon()
return 1
/obj/screen/buildmode/mode/update_icon()
/obj/screen/buildmode/mode/update_icon_state()
icon_state = bd.mode.get_button_iconstate()
/obj/screen/buildmode/help
@@ -44,9 +44,8 @@
screen_loc = "NORTH,WEST+2"
name = "Change Dir"
/obj/screen/buildmode/bdir/update_icon()
/obj/screen/buildmode/bdir/update_icon_state()
dir = bd.build_dir
return
/obj/screen/buildmode/bdir/Click()
bd.toggle_dirswitch()

View File

@@ -193,8 +193,8 @@
/obj/item/reagent_containers/food/snacks/meat/slab/bear,
/obj/item/reagent_containers/food/snacks/meat/slab/xeno,
/obj/item/reagent_containers/food/snacks/meat/slab/spider,
/obj/item/reagent_containers/food/snacks/spidereggs,
/obj/item/reagent_containers/food/snacks/meat/rawcrab,
/obj/item/reagent_containers/food/snacks/meat/rawbacon,
/obj/item/reagent_containers/food/snacks/spiderleg,
/obj/item/reagent_containers/food/snacks/carpmeat,
/obj/item/reagent_containers/food/snacks/meat/slab/human)

View File

@@ -78,15 +78,14 @@
. = ..()
setStyle(style, TRUE) //Upon initialization, give the supplypod an iconstate, name, and description based on the "style" variable. This system is important for the centcom_podlauncher to function correctly
/obj/structure/closet/supplypod/update_icon()
cut_overlays()
/obj/structure/closet/supplypod/closet_update_overlays(list/new_overlays)
. = new_overlays
if (style == STYLE_SEETHROUGH || style == STYLE_INVISIBLE) //If we're invisible, we dont bother adding any overlays
return
if (opened)
. += "[icon_state]_open"
else
if (opened)
add_overlay("[icon_state]_open")
else
add_overlay("[icon_state]_door")
. += "[icon_state]_door"
/obj/structure/closet/supplypod/proc/setStyle(chosenStyle, var/duringInit = FALSE) //Used to give the sprite an icon state, name, and description
if (!duringInit && style == chosenStyle) //Check if the input style is already the same as the pod's style. This happens in centcom_podlauncher, and as such we set the style to STYLE_CENTCOM.

View File

@@ -31,14 +31,14 @@
ready = FALSE
update_icon()
/obj/item/supplypod_beacon/update_icon()
cut_overlays()
/obj/item/supplypod_beacon/update_overlays()
. = ..()
if (launched)
add_overlay("sp_green")
. += "sp_green"
else if (ready)
add_overlay("sp_yellow")
. += "sp_yellow"
else if (linked)
add_overlay("sp_orange")
. += "sp_orange"
/obj/item/supplypod_beacon/proc/endLaunch()
launched = FALSE

View File

@@ -2429,6 +2429,8 @@ GLOBAL_LIST_EMPTY(preferences_datums)
else
character.Digitigrade_Leg_Swap(TRUE)
SEND_SIGNAL(character, COMSIG_HUMAN_PREFS_COPIED_TO, src, icon_updates, roundstart_checks)
//let's be sure the character updates
if(icon_updates)
character.update_body()

View File

@@ -441,17 +441,14 @@ BLIND // can't see anything
return TRUE
/obj/item/clothing/update_icon() // Polychrome stuff
..()
/obj/item/clothing/update_overlays() // Polychrome stuff
. = ..()
if(hasprimary) //Checks if the overlay is enabled
var/mutable_appearance/primary_overlay = mutable_appearance(icon, "[item_color]-primary") //Automagically picks overlays
primary_overlay.color = primary_color //Colors the greyscaled overlay
add_overlay(primary_overlay) //Applies the coloured overlay onto the item sprite. but NOT the mob sprite.
var/mutable_appearance/primary_overlay = mutable_appearance(icon, "[item_color]-primary", color = primary_color) //Automagically picks overlays
. += primary_overlay //Applies the coloured overlay onto the item sprite. but NOT the mob sprite.
if(hassecondary)
var/mutable_appearance/secondary_overlay = mutable_appearance(icon, "[item_color]-secondary")
secondary_overlay.color = secondary_color
add_overlay(secondary_overlay)
var/mutable_appearance/secondary_overlay = mutable_appearance(icon, "[item_color]-secondary", color = secondary_color)
. += secondary_overlay
if(hastertiary)
var/mutable_appearance/tertiary_overlay = mutable_appearance(icon, "[item_color]-tertiary")
tertiary_overlay.color = tertiary_color
add_overlay(tertiary_overlay)
var/mutable_appearance/tertiary_overlay = mutable_appearance(icon, "[item_color]-tertiary", color = tertiary_color)
. += tertiary_overlay

View File

@@ -35,16 +35,15 @@
. = ..()
update_icon()
/obj/item/clothing/ears/headphones/update_icon()
/obj/item/clothing/ears/headphones/ComponentInitialize()
. = ..()
AddElement(/datum/element/update_icon_updates_onmob)
/obj/item/clothing/ears/headphones/update_icon_state()
icon_state = "[initial(icon_state)]_[headphones_on? "on" : "off"]"
item_state = "[initial(item_state)]_[headphones_on? "on" : "off"]"
/obj/item/clothing/ears/headphones/proc/toggle(owner)
headphones_on = !headphones_on
update_icon()
var/mob/living/carbon/human/H = owner
if(istype(H))
H.update_inv_ears()
H.update_inv_neck()
H.update_inv_head()
to_chat(owner, "<span class='notice'>You turn the music [headphones_on? "on. Untz Untz Untz!" : "off."]</span>")

View File

@@ -31,6 +31,10 @@
START_PROCESSING(SSobj, src)
update_icon()
/obj/item/clothing/glasses/meson/engine/ComponentInitialize()
. = ..()
AddElement(/datum/element/update_icon_updates_onmob)
/obj/item/clothing/glasses/meson/engine/Destroy()
STOP_PROCESSING(SSobj, src)
return ..()
@@ -120,18 +124,8 @@
pic = new('icons/turf/overlays.dmi', place, "redOverlay", AREA_LAYER)
flick_overlay(pic, list(user.client), 8)
/obj/item/clothing/glasses/meson/engine/update_icon()
/obj/item/clothing/glasses/meson/engine/update_icon_state()
icon_state = "trayson-[mode]"
update_mob()
/obj/item/clothing/glasses/meson/engine/proc/update_mob()
item_state = icon_state
if(isliving(loc))
var/mob/living/user = loc
if(user.get_item_by_slot(SLOT_GLASSES) == src)
user.update_inv_glasses()
else
user.update_inv_hands()
/obj/item/clothing/glasses/meson/engine/tray //atmos techs have lived far too long without tray goggles while those damned engineers get their dual-purpose gogles all to themselves
name = "optical t-ray scanner"

View File

@@ -16,6 +16,11 @@
dog_fashion = /datum/dog_fashion/head
/obj/item/clothing/head/hardhat/ComponentInitialize()
. = ..()
AddElement(/datum/element/update_icon_updates_onmob)
/obj/item/clothing/head/hardhat/attack_self(mob/living/user)
toggle_helmet_light(user)
@@ -27,15 +32,9 @@
turn_off(user)
update_icon()
/obj/item/clothing/head/hardhat/update_icon()
/obj/item/clothing/head/hardhat/update_icon_state()
icon_state = "hardhat[on]_[item_color]"
item_state = "hardhat[on]_[item_color]"
if(ishuman(loc))
var/mob/living/carbon/human/H = loc
H.update_inv_head()
for(var/X in actions)
var/datum/action/A = X
A.UpdateButtonIcon(force = TRUE)
/obj/item/clothing/head/hardhat/proc/turn_on(mob/user)
set_light(brightness_on, power_on)
@@ -132,11 +131,10 @@
if(!up)
. += mutable_appearance('icons/mob/head.dmi', "weldvisor")
/obj/item/clothing/head/hardhat/weldhat/update_icon()
cut_overlays()
/obj/item/clothing/head/hardhat/weldhat/update_overlays()
. = ..()
if(!up)
add_overlay("weldvisor")
..()
. += "weldvisor"
/obj/item/clothing/head/hardhat/weldhat/orange
icon_state = "hardhat0_orange"

View File

@@ -258,7 +258,11 @@
//LightToggle
/obj/item/clothing/head/helmet/update_icon()
/obj/item/clothing/head/helment/ComponentInitialize()
. = ..()
AddElement(/datum/element/update_icon_updates_onmob)
/obj/item/clothing/head/helmet/update_icon_state()
var/state = "[initial(icon_state)]"
if(F)
if(F.on)
@@ -268,10 +272,6 @@
icon_state = state
if(ishuman(loc))
var/mob/living/carbon/human/H = loc
H.update_inv_head()
/obj/item/clothing/head/helmet/ui_action_click(mob/user, action)
if(istype(action, /datum/action/item_action/toggle_helmet_flashlight))
toggle_helmlight()

View File

@@ -197,16 +197,19 @@
. = ..()
update_icon()
/obj/item/clothing/head/wig/update_icon()
cut_overlays()
/obj/item/clothing/head/wig/update_icon_state()
var/datum/sprite_accessory/S = GLOB.hair_styles_list[hair_style]
if(!S)
icon = 'icons/obj/clothing/hats.dmi'
icon_state = "pwig"
else
var/mutable_appearance/M = mutable_appearance(S.icon,S.icon_state)
/obj/item/clothing/head/wig/update_overlays()
. = ..()
var/datum/sprite_accessory/S = GLOB.hair_styles_list[hair_style]
if(S)
var/mutable_appearance/M = mutable_appearance(S.icon, S.icon_state, color = hair_color)
M.appearance_flags |= RESET_COLOR
M.color = hair_color
add_overlay(M)
. += M
/obj/item/clothing/head/wig/worn_overlays(isinhands = FALSE, icon_file, style_flags = NONE)
. = list()

View File

@@ -10,11 +10,15 @@
/obj/item/clothing/shoes/clown_shoes/banana_shoes/Initialize()
. = ..()
AddComponent(/datum/component/material_container, list(/datum/material/bananium), 200000, TRUE, /obj/item/stack)
AddComponent(/datum/component/squeak, list('sound/items/bikehorn.ogg'=1), 75)
if(always_noslip)
clothing_flags |= NOSLIP
/obj/item/clothing/shoes/clown_shoes/banana_shoes/ComponentInitialize()
. = ..()
AddElement(/datum/element/update_icon_updates_onmob)
AddComponent(/datum/component/material_container, list(/datum/material/bananium), 200000, TRUE, /obj/item/stack)
AddComponent(/datum/component/squeak, list('sound/items/bikehorn.ogg'=1), 75)
/obj/item/clothing/shoes/clown_shoes/banana_shoes/step_action()
. = ..()
var/datum/component/material_container/bananium = GetComponent(/datum/component/material_container)
@@ -55,12 +59,5 @@
else
to_chat(user, "<span class='warning'>You need bananium to turn the prototype shoes on!</span>")
/obj/item/clothing/shoes/clown_shoes/banana_shoes/update_icon()
if(on)
icon_state = "clown_prototype_on"
else
icon_state = "clown_prototype_off"
usr.update_inv_shoes()
for(var/X in actions)
var/datum/action/A = X
A.UpdateButtonIcon()
/obj/item/clothing/shoes/clown_shoes/banana_shoes/update_icon_state()
icon_state = "clown_prototype_[on? "on" : "off"]"

View File

@@ -220,7 +220,7 @@
teleport_now.Remove(user)
if(user.wear_suit == src)
if(hard_landing)
user.electrocute_act(35, src, safety = 1)
user.electrocute_act(35, src, flags = SHOCK_NOGLOVES)
user.DefaultCombatKnockdown(200)
if(!silent)
to_chat(user, "\nroot@ChronosuitMK4# chronowalk4 --stop\n")

View File

@@ -275,7 +275,7 @@
visor_flags_inv = HIDEMASK|HIDEEYES|HIDEFACE|HIDEFACIALHAIR
visor_flags = STOPSPRESSUREDAMAGE
/obj/item/clothing/head/helmet/space/hardsuit/syndi/update_icon()
/obj/item/clothing/head/helmet/space/hardsuit/syndi/update_icon_state()
icon_state = "hardsuit[on]-[item_color]"
/obj/item/clothing/head/helmet/space/hardsuit/syndi/Initialize()
@@ -336,7 +336,7 @@
linkedsuit.update_icon()
user.update_inv_wear_suit()
user.update_inv_w_uniform()
user.update_equipment_speed_mods()
/obj/item/clothing/suit/space/hardsuit/syndi
name = "blood-red hardsuit"
@@ -362,9 +362,6 @@
armor = list("melee" = 60, "bullet" = 60, "laser" = 50, "energy" = 25, "bomb" = 55, "bio" = 100, "rad" = 70, "fire" = 100, "acid" = 100)
heat_protection = HEAD
max_heat_protection_temperature = FIRE_IMMUNITY_MAX_TEMP_PROTECT
visor_flags_inv = 0
visor_flags = 0
on = FALSE
resistance_flags = FIRE_PROOF | ACID_PROOF
/obj/item/clothing/head/helmet/space/hardsuit/syndi/elite/debug
@@ -946,15 +943,9 @@
var/datum/action/A = X
A.UpdateButtonIcon()
/obj/item/clothing/head/helmet/space/hardsuit/lavaknight/update_icon()
var/mutable_appearance/helm_overlay = mutable_appearance(icon, "knight_cydonia_overlay")
if(energy_color)
helm_overlay.color = energy_color
cut_overlays() //So that it doesn't keep stacking overlays non-stop on top of each other
add_overlay(helm_overlay)
/obj/item/clothing/head/helmet/space/hardsuit/lavaknight/update_overlays()
. = ..()
. += mutable_appearance(icon, "knight_cydonia_overlay", color = energy_color)
/obj/item/clothing/head/helmet/space/hardsuit/lavaknight/worn_overlays(isinhands = FALSE, icon_file, style_flags = NONE)
. = ..()
@@ -983,15 +974,9 @@
set_light(1)
update_icon()
/obj/item/clothing/suit/space/hardsuit/lavaknight/update_icon()
var/mutable_appearance/suit_overlay = mutable_appearance(icon, "knight_cydonia_overlay")
if(energy_color)
suit_overlay.color = energy_color
cut_overlays() //So that it doesn't keep stacking overlays non-stop on top of each other
add_overlay(suit_overlay)
/obj/item/clothing/suit/space/hardsuit/lavaknight/update_overlays()
. = ..()
. += mutable_appearance(icon, "knight_cydonia_overlay", color = energy_color)
/obj/item/clothing/suit/space/hardsuit/lavaknight/worn_overlays(isinhands = FALSE, icon_file, style_flags = NONE)
. = ..()

View File

@@ -79,7 +79,6 @@
/obj/item/clothing/head/helmet/space/syndicate/contract
name = "contractor helmet"
desc = "A specialised black and gold helmet that's more compact than its standard Syndicate counterpart. Can be ultra-compressed into even the tightest of spaces."
slowdown = 0.55
w_class = WEIGHT_CLASS_SMALL
icon_state = "syndicate-contract-helm"
item_state = "syndicate-contract-helm"
@@ -91,6 +90,7 @@
w_class = WEIGHT_CLASS_SMALL
icon_state = "syndicate-contract"
item_state = "syndicate-contract"
mutantrace_variation = STYLE_DIGITIGRADE|STYLE_SNEK_TAURIC|STYLE_PAW_TAURIC
//Black-green syndicate space suit
/obj/item/clothing/head/helmet/space/syndicate/black/green

View File

@@ -157,7 +157,7 @@
active = FALSE
STOP_PROCESSING(SSobj,src)
/obj/machinery/shuttle_scrambler/update_icon()
/obj/machinery/shuttle_scrambler/update_icon_state()
if(active)
icon_state = "dominator-blue"
else

View File

@@ -318,14 +318,17 @@
..()
update_icon()
/obj/item/reagent_containers/glass/bowl/update_icon()
cut_overlays()
/obj/item/reagent_containers/glass/bowl/update_icon_state()
if(!reagents || !reagents.total_volume)
icon_state = "bowl"
/obj/item/reagent_containers/glass/bowl/update_overlays()
. = ..()
if(reagents && reagents.total_volume)
var/mutable_appearance/filling = mutable_appearance('icons/obj/food/soupsalad.dmi', "fullbowl")
filling.color = mix_color_from_reagents(reagents.reagent_list)
add_overlay(filling)
else
icon_state = "bowl"
. += filling
#undef INGREDIENTS_FILL
#undef INGREDIENTS_SCATTER

View File

@@ -323,6 +323,14 @@
tastes = list("bun" = 4, "bacon" = 2)
foodtype = GRAIN | MEAT
/obj/item/reagent_containers/food/snacks/burger/empoweredburger
name = "empowered burger"
desc = "It's shockingly good, if you live off of electricity that is."
icon_state = "empoweredburger"
list_reagents = list(/datum/reagent/consumable/nutriment = 8, /datum/reagent/consumable/liquidelectricity = 5)
tastes = list("bun" = 2, "pure electricity" = 4)
foodtype = GRAIN | TOXIC
/obj/item/reagent_containers/food/snacks/burger/soylent
name = "soylent burger"
desc = "A eco-friendly burger made using upcycled low value biomass."
@@ -331,6 +339,14 @@
tastes = list("bun" = 2, "assistant" = 4)
foodtype = GRAIN | MEAT | DAIRY
/obj/item/reagent_containers/food/snacks/burger/crab
name = "crab burger"
desc = "A delicious patty of the crabby kind, slapped in between a bun."
icon_state = "crabburger"
bonus_reagents = list(/datum/reagent/consumable/nutriment = 2, /datum/reagent/consumable/nutriment/vitamin = 3)
tastes = list("bun" = 2, "crab meat" = 4)
foodtype = GRAIN | MEAT
/obj/item/reagent_containers/food/snacks/burger/rib
name = "mcrib"
desc = "An elusive rib shaped burger with limited availablity across the galaxy. Not as good as you remember it."

View File

@@ -579,6 +579,16 @@
icon_state = "peachcanmaint"
tastes = list("peaches" = 1, "tin" = 7)
/obj/item/reagent_containers/food/snacks/crab_rangoon
name = "Crab Rangoon"
desc = "Has many names, like crab puffs, cheese wontons, crab dumplings? Whatever you call them, they're a fabulous blast of cream cheesy crab."
icon_state = "crabrangoon"
list_reagents = list(/datum/reagent/consumable/nutriment = 10, /datum/reagent/consumable/nutriment/vitamin = 5)
filling_color = "#f2efdc"
w_class = WEIGHT_CLASS_SMALL
tastes = list("cream cheese" = 4, "crab" = 3, "crispiness" = 2)
foodtype = MEAT | DAIRY | GRAIN
/obj/item/reagent_containers/food/snacks/chocolatestrawberry
name = "Chocolate dipped strawberries"
desc = "A strawberry dipped in a bit of chocolate."

View File

@@ -228,6 +228,22 @@
tastes = list("beet" = 1)
foodtype = VEGETABLES
/obj/item/reagent_containers/food/snacks/soup/onion
name = "french onion soup"
desc = "Good enough to make a grown mime cry."
icon_state = "onionsoup"
bonus_reagents = list(/datum/reagent/consumable/nutriment = 1, /datum/reagent/consumable/nutriment/vitamin = 5)
tastes = list("caramelized onions" = 1)
foodtype = VEGETABLES
/obj/item/reagent_containers/food/snacks/soup/bisque
name = "bisque"
desc = "A classic entree from Space-France."
icon_state = "bisque"
bonus_reagents = list(/datum/reagent/consumable/nutriment = 4, /datum/reagent/consumable/nutriment/vitamin = 6)
tastes = list("creamy texture" = 1, "crab" = 4)
foodtype = MEAT
/obj/item/reagent_containers/food/snacks/soup/electron
name = "electron soup"
desc = "A gastronomic curiosity of ethereal origin. It is famed for the minature weather system formed over a properly prepared soup."

View File

@@ -21,12 +21,12 @@
add_overlay("grjam")
/obj/machinery/gibber/RefreshParts()
var/gib_time = 40
gibtime = 40
meat_produced = 0
for(var/obj/item/stock_parts/matter_bin/B in component_parts)
meat_produced += B.rating
for(var/obj/item/stock_parts/manipulator/M in component_parts)
gib_time -= 5 * M.rating
gibtime = gib_time
gibtime -= 5 * M.rating
if(M.rating >= 2)
ignore_clothing = TRUE
@@ -38,18 +38,18 @@
if(M.rating >= 2)
. += "<span class='notice'>Gibber has been upgraded to process inorganic materials.</span>"
/obj/machinery/gibber/update_icon()
cut_overlays()
/obj/machinery/gibber/update_overlays()
. = ..()
if (dirty)
add_overlay("grbloody")
. += "grbloody"
if(stat & (NOPOWER|BROKEN))
return
if (!occupant)
add_overlay("grjam")
. += "grjam"
else if (operating)
add_overlay("gruse")
. += "gruse"
else
add_overlay("gridle")
. += "gridle"
/obj/machinery/gibber/attack_paw(mob/user)
return attack_hand(user)

View File

@@ -15,7 +15,7 @@
. = ..()
grill_loop = new(list(src), FALSE)
/obj/machinery/grill/update_icon()
/obj/machinery/grill/update_icon_state()
if(grilled_item)
icon_state = "grill"
else if(grill_fuel)

View File

@@ -85,7 +85,7 @@
. += "<span class='notice'>- Capacity: <b>[max_n_of_items]</b> items.<span>"
. += "<span class='notice'>- Cook time reduced by <b>[(efficiency - 1) * 25]%</b>.<span>"
/obj/machinery/microwave/update_icon()
/obj/machinery/microwave/update_icon_state()
if(broken)
icon_state = "mwb"
else if(dirty_anim_playing)

View File

@@ -42,7 +42,7 @@
..()
update_icon()
/obj/machinery/smartfridge/update_icon()
/obj/machinery/smartfridge/update_icon_state()
if(!stat)
if(visible_contents)
switch(contents.len)
@@ -289,13 +289,12 @@
..()
update_icon()
/obj/machinery/smartfridge/drying_rack/update_icon()
..()
cut_overlays()
/obj/machinery/smartfridge/drying_rack/update_overlays()
. = ..()
if(drying)
add_overlay("drying_rack_drying")
. += "drying_rack_drying"
if(contents.len)
add_overlay("drying_rack_filled")
. += "drying_rack_filled"
/obj/machinery/smartfridge/drying_rack/process()
..()

View File

@@ -1,6 +1,7 @@
/datum/crafting_recipe/food
var/real_parts
category = CAT_FOOD
time = 5
/datum/crafting_recipe/food/New()
real_parts = parts.Copy()

View File

@@ -150,6 +150,24 @@
result = /obj/item/reagent_containers/food/snacks/burger/chicken
subcategory = CAT_BURGER
/datum/crafting_recipe/food/crabburger
name = "Crab Burger"
reqs = list(
/obj/item/reagent_containers/food/snacks/meat/crab = 2,
/obj/item/reagent_containers/food/snacks/bun = 1
)
result = /obj/item/reagent_containers/food/snacks/burger/crab
subcategory = CAT_BURGER
/datum/crafting_recipe/food/empoweredburger
name = "Empowered Burger"
reqs = list(
/obj/item/stack/sheet/mineral/plasma = 2,
/obj/item/reagent_containers/food/snacks/bun = 1
)
result = /obj/item/reagent_containers/food/snacks/burger/empoweredburger
subcategory = CAT_BURGER
/datum/crafting_recipe/food/fishburger
name = "Fish burger"
reqs = list(

View File

@@ -171,3 +171,16 @@
)
result = /obj/item/reagent_containers/food/snacks/salad/ricepudding
subcategory = CAT_MISCFOOD
/datum/crafting_recipe/food/butterbear //ITS ALIVEEEEEE!
name = "Living bear/butter hybrid"
reqs = list(
/obj/item/organ/brain = 1,
/obj/item/organ/heart = 1,
/obj/item/reagent_containers/food/snacks/butter = 10,
/obj/item/reagent_containers/food/snacks/meat/slab = 5,
/datum/reagent/blood = 50,
/datum/reagent/teslium = 1 //To shock the whole thing into life
)
result = /mob/living/simple_animal/hostile/bear/butter
subcategory = CAT_MISCFOOD

View File

@@ -97,6 +97,17 @@
result = /obj/item/reagent_containers/food/snacks/tuna
subcategory = CAT_SEAFOOD
/datum/crafting_recipe/food/crab_rangoon
name = "Crab Rangoon"
reqs = list(
/obj/item/reagent_containers/food/snacks/doughslice = 1,
/datum/reagent/consumable/cream = 5,
/obj/item/reagent_containers/food/snacks/cheesewedge = 1,
/obj/item/reagent_containers/food/snacks/meat/crab = 1
)
result = /obj/item/reagent_containers/food/snacks/crab_rangoon
subcategory = CAT_SEAFOOD
/datum/crafting_recipe/food/cubancarp
name = "Cuban carp"
reqs = list(

View File

@@ -24,6 +24,16 @@
result = /obj/item/reagent_containers/food/snacks/soup/beet
subcategory = CAT_SOUP
/datum/crafting_recipe/food/bisque
name = "Bisque"
reqs = list(
/datum/reagent/water = 10,
/obj/item/reagent_containers/food/snacks/meat/crab = 1,
/obj/item/reagent_containers/food/snacks/salad/boiledrice = 1
)
result = /obj/item/reagent_containers/food/snacks/soup/bisque
subcategory = CAT_SOUP
/datum/crafting_recipe/food/bloodsoup
name = "Blood soup"
reqs = list(
@@ -67,6 +77,17 @@
result = /obj/item/reagent_containers/food/snacks/soup/tomato/eyeball
subcategory = CAT_SOUP
/datum/crafting_recipe/food/onionsoup
name = "French onion soup"
reqs = list(
/datum/reagent/water = 10,
/obj/item/reagent_containers/glass/bowl = 1,
/obj/item/reagent_containers/food/snacks/grown/onion = 1,
/obj/item/reagent_containers/food/snacks/cheesewedge = 1,
)
result = /obj/item/reagent_containers/food/snacks/soup/onion
subcategory = CAT_SOUP
/datum/crafting_recipe/food/hotchili
name = "Hot chili"
reqs = list(

View File

@@ -93,7 +93,7 @@
qdel(SC)
update_icon()
/obj/item/toy/cards/deck/cas/update_icon()
/obj/item/toy/cards/deck/cas/update_icon_state()
if(cards.len < 26)
icon_state = "deck_[deckstyle]_low"
@@ -136,7 +136,7 @@
Flip()
return TRUE
/obj/item/toy/cards/singlecard/cas/update_icon()
/obj/item/toy/cards/singlecard/cas/update_icon_state()
if(flipped)
icon_state = "[card_face]_flipped"
else

View File

@@ -196,7 +196,7 @@
if(numbuttons == numready)
begin_event()
/obj/machinery/readybutton/update_icon()
/obj/machinery/readybutton/update_icon_state()
if(ready)
icon_state = "auth_on"
else

View File

@@ -20,13 +20,13 @@
update_icon()
/obj/item/reagent_containers/honeycomb/update_icon()
cut_overlays()
/obj/item/reagent_containers/honeycomb/update_overlays()
. = ..()
var/mutable_appearance/honey_overlay = mutable_appearance(icon, "honey")
if(honey_color)
honey_overlay.icon_state = "greyscale_honey"
honey_overlay.color = honey_color
add_overlay(honey_overlay)
. += honey_overlay
/obj/item/reagent_containers/honeycomb/proc/set_reagent(reagent)

View File

@@ -61,7 +61,7 @@
/obj/machinery/biogenerator/on_reagent_change(changetype) //When the reagents change, change the icon as well.
update_icon()
/obj/machinery/biogenerator/update_icon()
/obj/machinery/biogenerator/update_icon_state()
if(panel_open)
icon_state = "biogen-empty-o"
else if(!src.beaker)

View File

@@ -64,7 +64,7 @@
to_chat(user, "<span class='notice'>You close [src], letting you draw from its tap.</span>")
update_icon()
/obj/structure/fermenting_barrel/update_icon()
/obj/structure/fermenting_barrel/update_icon_state()
if(open)
icon_state = "barrel_open"
else

View File

@@ -53,17 +53,18 @@
min_wchance = 0
min_wrate = 0
/obj/machinery/plantgenes/update_icon()
..()
cut_overlays()
/obj/machinery/plantgenes/update_icon_state()
if((stat & (BROKEN|NOPOWER)))
icon_state = "dnamod-off"
else
icon_state = "dnamod"
/obj/machinery/plantgenes/update_overlays()
. = ..()
if(seed)
add_overlay("dnamod-dna")
. += "dnamod-dna"
if(panel_open)
add_overlay("dnamod-open")
. += "dnamod-open"
/obj/machinery/plantgenes/attackby(obj/item/I, mob/user, params)
if(default_deconstruction_screwdriver(user, "dnamod", "dnamod", I))

View File

@@ -250,14 +250,14 @@
/datum/plant_gene/trait/cell_charge/on_slip(obj/item/reagent_containers/food/snacks/grown/G, mob/living/carbon/C)
var/power = G.seed.potency*rate
if(prob(power))
C.electrocute_act(round(power), G, 1, 1)
C.electrocute_act(round(power), G, 1, SHOCK_NOGLOVES)
/datum/plant_gene/trait/cell_charge/on_squash(obj/item/reagent_containers/food/snacks/grown/G, atom/target)
if(iscarbon(target))
var/mob/living/carbon/C = target
var/power = G.seed.potency*rate
if(prob(power))
C.electrocute_act(round(power), G, 1, 1)
C.electrocute_act(round(power), G, 1, SHOCK_NOGLOVES)
/datum/plant_gene/trait/cell_charge/on_consume(obj/item/reagent_containers/food/snacks/grown/G, mob/living/carbon/target)
if(!G.reagents.total_volume)

View File

@@ -305,17 +305,17 @@
/obj/item/electronic_assembly/proc/can_move()
return FALSE
/obj/item/electronic_assembly/update_icon()
/obj/item/electronic_assembly/update_icon_state()
if(opened)
icon_state = initial(icon_state) + "-open"
else
icon_state = initial(icon_state)
cut_overlays()
/obj/item/electronic_assembly/update_overlays()
. = ..()
if(detail_color == COLOR_ASSEMBLY_BLACK) //Black colored overlay looks almost but not exactly like the base sprite, so just cut the overlay and avoid it looking kinda off.
return
var/mutable_appearance/detail_overlay = mutable_appearance('icons/obj/assemblies/electronic_setups.dmi', "[icon_state]-color")
detail_overlay.color = detail_color
add_overlay(detail_overlay)
. += mutable_appearance('icons/obj/assemblies/electronic_setups.dmi', "[icon_state]-color", color = detail_color)
/obj/item/electronic_assembly/proc/return_total_complexity()
. = 0

View File

@@ -34,18 +34,17 @@
.=..()
update_icon()
/obj/item/integrated_electronics/detailer/update_icon()
cut_overlays()
var/mutable_appearance/detail_overlay = mutable_appearance('icons/obj/assemblies/electronic_tools.dmi', "detailer-color")
detail_overlay.color = detail_color
add_overlay(detail_overlay)
/obj/item/integrated_electronics/detailer/update_overlays()
. = ..()
. += mutable_appearance('icons/obj/assemblies/electronic_tools.dmi', "detailer-color", color = detail_color)
/obj/item/integrated_electronics/detailer/attack_self(mob/user)
var/color_choice = input(user, "Select color.", "Assembly Detailer") as null|anything in color_list
if(!color_list[color_choice])
return
if(!in_range(src, user))
return
return
if(color_choice == "custom")
detail_color = input(user,"","Choose Color",detail_color) as color|null
else

View File

@@ -15,7 +15,7 @@
var/datum/integrated_io/selected_io = null
var/mode = WIRE
/obj/item/integrated_electronics/wirer/update_icon()
/obj/item/integrated_electronics/wirer/update_icon_state()
icon_state = "wirer-[mode]"
/obj/item/integrated_electronics/wirer/proc/wire(var/datum/integrated_io/io, mob/user)
@@ -27,7 +27,7 @@
selected_io = io
to_chat(user, "<span class='notice'>You attach a data wire to \the [selected_io.holder]'s [selected_io.name] data channel.</span>")
mode = WIRING
update_icon()
update_icon()
if(WIRING)
if(io == selected_io)
to_chat(user, "<span class='warning'>Wiring \the [selected_io.holder]'s [selected_io.name] into itself is rather pointless.</span>")

View File

@@ -61,16 +61,28 @@
if(client.keys_held["Ctrl"])
switch(SSinput.movement_keys[_key])
if(NORTH)
northface()
if(client.keys_held["Shift"])
northshift()
else
northface()
return
if(SOUTH)
southface()
if(client.keys_held["Shift"])
southshift()
else
southface()
return
if(WEST)
westface()
if(client.keys_held["Shift"])
westshift()
else
westface()
return
if(EAST)
eastface()
if(client.keys_held["Shift"])
eastshift()
else
eastface()
return
return ..()

View File

@@ -147,11 +147,8 @@
qdel(src)
/obj/structure/bookcase/update_icon()
if(contents.len < 5)
icon_state = "book-[contents.len]"
else
icon_state = "book-5"
/obj/structure/bookcase/update_icon_state()
icon_state = "book-[min(length(contents), 5)]"
/obj/structure/bookcase/manuals/medical

View File

@@ -110,12 +110,12 @@
AddComponent(/datum/component/spraycan_paintable)
update_icon()
/obj/item/clothing/head/helmet/space/hostile_environment/update_icon()
..()
cut_overlays()
/obj/item/clothing/head/helmet/space/hostile_environment/update_overlays()
. = ..()
var/mutable_appearance/glass_overlay = mutable_appearance(icon, "hostile_env_glass")
glass_overlay.appearance_flags = RESET_COLOR
add_overlay(glass_overlay)
. += glass_overlay
/obj/item/clothing/head/helmet/space/hostile_environment/worn_overlays(isinhands, icon_file, style_flags = NONE)
. = ..()

View File

@@ -155,19 +155,16 @@
else
set_light(0)
/obj/item/twohanded/kinetic_crusher/update_icon()
..()
cut_overlays()
if(!charged)
add_overlay("[icon_state]_uncharged")
if(light_on)
add_overlay("[icon_state]_lit")
spawn(1)
for(var/X in actions)
var/datum/action/A = X
A.UpdateButtonIcon()
/obj/item/twohanded/kinetic_crusher/update_icon_state()
item_state = "crusher[wielded]"
/obj/item/twohanded/kinetic_crusher/update_overlays()
. = ..()
if(!charged)
. += "[icon_state]_uncharged"
if(light_on)
. += "[icon_state]_lit"
//destablizing force
/obj/item/projectile/destabilizer
name = "destabilizing force"

View File

@@ -40,7 +40,7 @@ GLOBAL_LIST_INIT(marker_beacon_colors, list(
. += "<span class='notice'>Use in-hand to place a [singular_name].</span>"
. += "<span class='notice'>Alt-click to select a color. Current color is [picked_color].</span>"
/obj/item/stack/marker_beacon/update_icon()
/obj/item/stack/marker_beacon/update_icon_state()
icon_state = "[initial(icon_state)][lowertext(picked_color)]"
/obj/item/stack/marker_beacon/attack_self(mob/user)

View File

@@ -129,14 +129,13 @@
. = ..()
update_icon()
/obj/item/organ/regenerative_core/update_icon()
/obj/item/organ/regenerative_core/update_icon_state()
icon_state = inert ? "legion_soul_inert" : "legion_soul"
cut_overlays()
/obj/item/organ/regenerative_core/update_overlays()
. = ..()
if(!inert && !preserved)
add_overlay("legion_soul_crackle")
for(var/X in actions)
var/datum/action/A = X
A.UpdateButtonIcon()
. += "legion_soul_crackle"
/obj/item/organ/regenerative_core/legion/go_inert()
..()

View File

@@ -139,11 +139,10 @@
icon = 'icons/obj/lavaland/survival_pod.dmi'
icon_state = "sleeper"
/obj/machinery/sleeper/survival_pod/update_icon()
if(state_open)
cut_overlays()
else
add_overlay("sleeper_cover")
/obj/machinery/sleeper/survival_pod/update_overlays()
. = ..()
if(!state_open)
. += "sleeper_cover"
//Computer
/obj/item/gps/computer
@@ -190,8 +189,9 @@
flags_1 = NODECONSTRUCT_1
var/empty = FALSE
/obj/machinery/smartfridge/survival_pod/update_icon()
return
/obj/machinery/stasis/survival_pod/ComponentInitialize()
. = ..()
AddElement(/datum/element/update_icon_blocker)
/obj/machinery/smartfridge/survival_pod/Initialize(mapload)
. = ..()

View File

@@ -201,15 +201,15 @@
icon = 'icons/obj/lavaland/ash_flora.dmi'
icon_state = "mushroom_bowl"
/obj/item/reagent_containers/glass/bowl/mushroom_bowl/update_icon()
cut_overlays()
if(reagents && reagents.total_volume)
var/mutable_appearance/filling = mutable_appearance('icons/obj/lavaland/ash_flora.dmi', "fullbowl")
filling.color = mix_color_from_reagents(reagents.reagent_list)
add_overlay(filling)
else
/obj/item/reagent_containers/glass/bowl/mushroom_bowl/update_icon_state()
if(!reagents || !reagents.total_volume)
icon_state = "mushroom_bowl"
/obj/item/reagent_containers/glass/bowl/mushroom_bowl/update_overlays()
. = ..()
if(reagents && reagents.total_volume)
. += mutable_appearance('icons/obj/lavaland/ash_flora.dmi', "fullbowl", color = mix_color_from_reagents(reagents.reagent_list))
/obj/item/reagent_containers/glass/bowl/mushroom_bowl/attackby(obj/item/I,mob/user, params)
if(istype(I, /obj/item/reagent_containers/food/snacks))
var/obj/item/reagent_containers/food/snacks/S = I

View File

@@ -561,7 +561,7 @@
desc = "A flask with an almost-holy aura emitting from it. The label on the bottle says: 'erqo'hyy tvi'rf lbh jv'atf'."
list_reagents = list(/datum/reagent/flightpotion = 5)
/obj/item/reagent_containers/glass/bottle/potion/update_icon()
/obj/item/reagent_containers/glass/bottle/potion/update_icon_state()
if(reagents.total_volume)
icon_state = "potionflask"
else
@@ -1072,6 +1072,10 @@
var/teleporting = FALSE //if we ARE teleporting
var/friendly_fire_check = FALSE //if the blasts we make will consider our faction against the faction of hit targets
/obj/item/hierophant_club/ComponentInitialize()
. = ..()
AddElement(/datum/element/update_icon_updates_onmob)
/obj/item/hierophant_club/examine(mob/user)
. = ..()
. += "<span class='hierophant_warning'>The[beacon ? " beacon is not currently":"re is a beacon"] attached.</span>"
@@ -1134,13 +1138,8 @@
chaser_speed = max(chaser_speed + health_percent, 0.5) //one tenth of a second faster for each missing 10% of health
blast_range -= round(health_percent * 10) //one additional range for each missing 10% of health
/obj/item/hierophant_club/update_icon()
icon_state = "hierophant_club[timer <= world.time ? "_ready":""][(beacon && !QDELETED(beacon)) ? "":"_beacon"]"
item_state = icon_state
if(ismob(loc))
var/mob/M = loc
M.update_inv_hands()
M.update_inv_back()
/obj/item/hierophant_club/update_icon_state()
icon_state = item_state = "hierophant_club[timer <= world.time ? "_ready":""][(beacon && !QDELETED(beacon)) ? "":"_beacon"]"
/obj/item/hierophant_club/proc/prepare_icon_update()
update_icon()

View File

@@ -341,9 +341,8 @@
..()
update_icon()
/obj/machinery/mineral/ore_redemption/update_icon()
/obj/machinery/mineral/ore_redemption/update_icon_state()
if(powered())
icon_state = initial(icon_state)
else
icon_state = "[initial(icon_state)]-off"
return

View File

@@ -87,7 +87,7 @@
..()
update_icon()
/obj/machinery/mineral/equipment_vendor/update_icon()
/obj/machinery/mineral/equipment_vendor/update_icon_state()
if(powered())
icon_state = initial(icon_state)
else

View File

@@ -20,25 +20,24 @@
mats_per_stack = MINERAL_MATERIAL_AMOUNT
var/list/stack_overlays
/obj/item/stack/ore/update_icon()
/obj/item/stack/ore/update_overlays()
. = ..()
var/difference = min(ORESTACK_OVERLAYS_MAX, amount) - (LAZYLEN(stack_overlays)+1)
if(difference == 0)
return
else if(difference < 0 && LAZYLEN(stack_overlays)) //amount < stack_overlays, remove excess.
cut_overlays()
if (LAZYLEN(stack_overlays)-difference <= 0)
stack_overlays = null;
stack_overlays = null
else
stack_overlays.len += difference
else if(difference > 0) //amount > stack_overlays, add some.
cut_overlays()
for(var/i in 1 to difference)
var/mutable_appearance/newore = mutable_appearance(icon, icon_state)
newore.pixel_x = rand(-8,8)
newore.pixel_y = rand(-8,8)
LAZYADD(stack_overlays, newore)
if (stack_overlays)
add_overlay(stack_overlays)
. += stack_overlays
/obj/item/stack/ore/welder_act(mob/living/user, obj/item/I)
if(!refined_type)

View File

@@ -41,9 +41,8 @@
..()
update_icon()
/obj/machinery/point_bank/update_icon()
/obj/machinery/point_bank/update_icon_state()
if(powered())
icon_state = initial(icon_state)
else
icon_state = "[initial(icon_state)]-off"
return

View File

@@ -11,17 +11,6 @@
invisibility = INVISIBILITY_ABSTRACT // No one can see us
sight = SEE_SELF
move_on_shuttle = FALSE
var/call_life = FALSE //TRUE if Life() should be called on this camera every tick of the mobs subystem, as if it were a living mob
/mob/camera/Initialize()
. = ..()
if(call_life)
GLOB.living_cameras += src
/mob/camera/Destroy()
. = ..()
if(call_life)
GLOB.living_cameras -= src
/mob/camera/experience_pressure_difference()
return

View File

@@ -14,6 +14,7 @@ GLOBAL_VAR_INIT(observer_default_invisibility, INVISIBILITY_OBSERVER)
move_resist = INFINITY
see_invisible = SEE_INVISIBLE_OBSERVER
see_in_dark = 100
lighting_alpha = LIGHTING_PLANE_ALPHA_MOSTLY_INVISIBLE
invisibility = INVISIBILITY_OBSERVER
hud_type = /datum/hud/ghost
movement_type = GROUND | FLYING
@@ -132,6 +133,8 @@ GLOBAL_VAR_INIT(observer_default_invisibility, INVISIBILITY_OBSERVER)
. = ..()
AddElement(/datum/element/ghost_role_eligibility)
grant_all_languages()
show_data_huds()
data_huds_on = 1
/mob/dead/observer/get_photo_description(obj/item/camera/camera)
if(!invisibility || camera.see_ghosts)
@@ -289,7 +292,7 @@ This is the proc mobs get to turn into a ghost. Forked from ghostize due to comp
var/roundstart_quit_limit = CONFIG_GET(number/roundstart_suicide_time_limit) MINUTES
if(world.time < roundstart_quit_limit)
penalty += roundstart_quit_limit - world.time
var/maximumRoundEnd = SSautotransfer.starttime + SSautotransfer.voteinterval * SSautotransfer.maxvotes
var/maximumRoundEnd = SSautotransfer.starttime + SSautotransfer.voteinterval * SSautotransfer.maxvotes
if(penalty - SSshuttle.realtimeofstart > maximumRoundEnd + SSshuttle.emergencyCallTime + SSshuttle.emergencyDockTime + SSshuttle.emergencyEscapeTime)
penalty = CANT_REENTER_ROUND

View File

@@ -14,20 +14,20 @@
var/force_replace_ai_name = FALSE
var/overrides_aicore_laws = FALSE // Whether the laws on the MMI, if any, override possible pre-existing laws loaded on the AI core.
/obj/item/mmi/update_icon()
/obj/item/mmi/update_icon_state()
if(!brain)
icon_state = "mmi_off"
return
if(istype(brain, /obj/item/organ/brain/alien))
else if(istype(brain, /obj/item/organ/brain/alien))
icon_state = "mmi_brain_alien"
braintype = "Xenoborg" //HISS....Beep.
else
icon_state = "mmi_brain"
braintype = "Cyborg"
/obj/item/mmi/update_overlays()
. = ..()
if(brainmob && brainmob.stat != DEAD)
add_overlay("mmi_alive")
. += "mmi_alive"
else
add_overlay("mmi_dead")
. += "mmi_dead"
/obj/item/mmi/Initialize()
. = ..()
@@ -68,6 +68,10 @@
name = "Man-Machine Interface: [brainmob.real_name]"
update_icon()
if(istype(brain, /obj/item/organ/brain/alien))
braintype = "Xenoborg" //HISS....Beep.
else
braintype = "Cyborg"
SSblackbox.record_feedback("amount", "mmis_filled", 1)
@@ -85,7 +89,7 @@
to_chat(user, "<span class='notice'>You unlock and upend the MMI, spilling the brain onto the floor.</span>")
eject_brain(user)
update_icon()
name = "Man-Machine Interface"
name = initial(name)
/obj/item/mmi/proc/eject_brain(mob/user)
brainmob.container = null //Reset brainmob mmi var.
@@ -129,7 +133,10 @@
name = "Man-Machine Interface: [brainmob.real_name]"
update_icon()
return
if(istype(brain, /obj/item/organ/brain/alien))
braintype = "Xenoborg" //HISS....Beep.
else
braintype = "Cyborg"
/obj/item/mmi/proc/replacement_ai_name()
return brainmob.name

View File

@@ -184,11 +184,10 @@ GLOBAL_VAR(posibrain_notify_cooldown)
return
/obj/item/mmi/posibrain/update_icon()
/obj/item/mmi/posibrain/update_icon_state()
if(searching)
icon_state = "[initial(icon_state)]-searching"
return
if(brainmob && brainmob.key)
else if(brainmob && brainmob.key)
icon_state = "[initial(icon_state)]-occupied"
else
icon_state = initial(icon_state)

Some files were not shown because too many files have changed in this diff Show More