diff --git a/code/ATMOSPHERICS/components/unary/vent_pump.dm b/code/ATMOSPHERICS/components/unary/vent_pump.dm index 1f7414e17f..0d72808545 100644 --- a/code/ATMOSPHERICS/components/unary/vent_pump.dm +++ b/code/ATMOSPHERICS/components/unary/vent_pump.dm @@ -47,6 +47,8 @@ var/radio_filter_out var/radio_filter_in + var/datum/looping_sound/air_pump/soundloop + /obj/machinery/atmospherics/unary/vent_pump/on use_power = 1 icon_state = "map_vent_out" @@ -68,6 +70,10 @@ pressure_checks = 2 pressure_checks_default = 2 +/obj/machinery/atmospherics/unary/vent_pump/Initialize() + . = ..() + soundloop = new(list(src), FALSE) + /obj/machinery/atmospherics/unary/vent_pump/New() ..() air_contents.volume = ATMOS_DEFAULT_VOLUME_PUMP @@ -84,6 +90,7 @@ if(initial_loc) initial_loc.air_vent_info -= id_tag initial_loc.air_vent_names -= id_tag + QDEL_NULL(soundloop) return ..() /obj/machinery/atmospherics/unary/vent_pump/high_volume @@ -164,11 +171,15 @@ /obj/machinery/atmospherics/unary/vent_pump/proc/can_pump() if(stat & (NOPOWER|BROKEN)) + soundloop.stop() return 0 if(!use_power) + soundloop.stop() return 0 if(welded) + soundloop.stop() return 0 + soundloop.start() return 1 /obj/machinery/atmospherics/unary/vent_pump/process() diff --git a/code/ZAS/Airflow.dm b/code/ZAS/Airflow.dm index 394fe72478..59837bbe5f 100644 --- a/code/ZAS/Airflow.dm +++ b/code/ZAS/Airflow.dm @@ -9,13 +9,13 @@ mob/proc/airflow_stun() if(last_airflow_stun > world.time - vsc.airflow_stun_cooldown) return 0 if(!(status_flags & CANSTUN) && !(status_flags & CANWEAKEN)) - src << "You stay upright as the air rushes past you." + to_chat(src, "You stay upright as the air rushes past you.") return 0 if(buckled) - src << "Air suddenly rushes past you!" + to_chat(src, "Air suddenly rushes past you!") return 0 if(!lying) - src << "The sudden rush of air knocks you over!" + to_chat(src, "The sudden rush of air knocks you over!") Weaken(5) last_airflow_stun = world.time diff --git a/code/ZAS/Diagnostic.dm b/code/ZAS/Diagnostic.dm index 29ab678ef1..41fcdcad85 100644 --- a/code/ZAS/Diagnostic.dm +++ b/code/ZAS/Diagnostic.dm @@ -10,10 +10,10 @@ client/proc/ZoneTick() var/result = air_master.Tick() if(result) - src << "Successfully Processed." + to_chat(src, "Successfully Processed.") else - src << "Failed to process! ([air_master.tick_progress])" + to_chat(src, "Failed to process! ([air_master.tick_progress])") */ client/proc/Zone_Info(turf/T as null|turf) diff --git a/code/ZAS/Phoron.dm b/code/ZAS/Phoron.dm index c3cfb19514..57a7d21036 100644 --- a/code/ZAS/Phoron.dm +++ b/code/ZAS/Phoron.dm @@ -140,7 +140,7 @@ obj/var/contaminated = 0 /mob/living/carbon/human/proc/burn_eyes() var/obj/item/organ/internal/eyes/E = internal_organs_by_name[O_EYES] if(E) - if(prob(20)) + if(prob(20)) to_chat(src, "Your eyes burn!") E.damage += 2.5 eye_blurry = min(eye_blurry+1.5,50) diff --git a/code/_onclick/click.dm b/code/_onclick/click.dm index 6cde264566..299ccf6ec2 100644 --- a/code/_onclick/click.dm +++ b/code/_onclick/click.dm @@ -183,7 +183,7 @@ /mob/living/UnarmedAttack(var/atom/A, var/proximity_flag) if(!ticker) - src << "You cannot attack people before the game has started." + to_chat(src, "You cannot attack people before the game has started.") return 0 if(stat) @@ -316,7 +316,7 @@ nutrition = max(nutrition - rand(1,5),0) handle_regular_hud_updates() else - src << "You're out of energy! You need food!" + to_chat(src, "You're out of energy! You need food!") // Simple helper to face what you clicked on, in case it should be needed in more than one place /mob/proc/face_atom(var/atom/A) diff --git a/code/_onclick/cyborg.dm b/code/_onclick/cyborg.dm index 1dcc2bc955..8d107e8f64 100644 --- a/code/_onclick/cyborg.dm +++ b/code/_onclick/cyborg.dm @@ -45,7 +45,7 @@ if(is_component_functioning("camera")) aiCamera.captureimage(A, usr) else - src << "Your camera isn't functional." + to_chat(src, "Your camera isn't functional.") return /* diff --git a/code/_onclick/hud/ability_screen_objects.dm b/code/_onclick/hud/ability_screen_objects.dm index d29ef9dd96..fc06f8e0cc 100644 --- a/code/_onclick/hud/ability_screen_objects.dm +++ b/code/_onclick/hud/ability_screen_objects.dm @@ -282,7 +282,7 @@ if(!mob) return // Paranoid. if(isnull(slot) || !isnum(slot)) - src << ".activate_ability requires a number as input, corrisponding to the slot you wish to use." + to_chat(src, ".activate_ability requires a number as input, corrisponding to the slot you wish to use.") return // Bad input. if(!mob.ability_master) return // No abilities. diff --git a/code/_onclick/observer.dm b/code/_onclick/observer.dm index f34a68a742..d5197cb30f 100644 --- a/code/_onclick/observer.dm +++ b/code/_onclick/observer.dm @@ -6,9 +6,9 @@ if(!client) return client.inquisitive_ghost = !client.inquisitive_ghost if(client.inquisitive_ghost) - src << "You will now examine everything you click on." + to_chat(src, "You will now examine everything you click on.") else - src << "You will no longer examine things you click on." + to_chat(src, "You will no longer examine things you click on.") /mob/observer/dead/DblClickOn(var/atom/A, var/params) if(client.buildmode) diff --git a/code/_onclick/rig.dm b/code/_onclick/rig.dm index 5f2561c25c..ed7a1c7e2f 100644 --- a/code/_onclick/rig.dm +++ b/code/_onclick/rig.dm @@ -18,15 +18,15 @@ switch(hardsuit_click_mode) if(MIDDLE_CLICK) - src << "Hardsuit activation mode set to middle-click." + to_chat(src, "Hardsuit activation mode set to middle-click.") if(ALT_CLICK) - src << "Hardsuit activation mode set to alt-click." + to_chat(src, "Hardsuit activation mode set to alt-click.") if(CTRL_CLICK) - src << "Hardsuit activation mode set to control-click." + to_chat(src, "Hardsuit activation mode set to control-click.") else // should never get here, but just in case: soft_assert(0, "Bad hardsuit click mode: [hardsuit_click_mode] - expected 0 to [MAX_HARDSUIT_CLICK_MODE]") - src << "Somehow you bugged the system. Setting your hardsuit mode to middle-click." + to_chat(src, "Somehow you bugged the system. Setting your hardsuit mode to middle-click.") hardsuit_click_mode = MIDDLE_CLICK /mob/living/MiddleClickOn(atom/A) diff --git a/code/datums/looping_sounds/machinery_sounds.dm b/code/datums/looping_sounds/machinery_sounds.dm index 8b927b3a54..4795f63687 100644 --- a/code/datums/looping_sounds/machinery_sounds.dm +++ b/code/datums/looping_sounds/machinery_sounds.dm @@ -43,4 +43,15 @@ mid_sounds = list('sound/machines/microwave/microwave-mid1.ogg'=10, 'sound/machines/microwave/microwave-mid2.ogg'=1) mid_length = 10 end_sound = 'sound/machines/microwave/microwave-end.ogg' - volume = 90 \ No newline at end of file + volume = 90 + +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +/datum/looping_sound/air_pump + start_sound = 'sound/machines/air_pump/airpumpstart.ogg' + start_length = 10 + mid_sounds = list('sound/machines/air_pump/airpumpidle.ogg' = 1) + mid_length = 10 + end_sound = 'sound/machines/air_pump/airpumpshutdown.ogg' + volume = 20 + pref_check = /datum/client_preference/air_pump_noise \ No newline at end of file diff --git a/code/datums/uplink/visible_weapons.dm b/code/datums/uplink/visible_weapons.dm index e8a69d2aaf..e4c27752f0 100644 --- a/code/datums/uplink/visible_weapons.dm +++ b/code/datums/uplink/visible_weapons.dm @@ -15,37 +15,17 @@ path = /obj/item/weapon/material/knife/tacknife/combatknife /datum/uplink_item/item/visible_weapons/energy_sword - name = "Energy Sword, Random" + name = "Energy Sword, Colorable" item_cost = 40 path = /obj/item/weapon/melee/energy/sword -/datum/uplink_item/item/visible_weapons/energy_sword_blue - name = "Energy Sword, Blue" - item_cost = 40 - path = /obj/item/weapon/melee/energy/sword/blue - -/datum/uplink_item/item/visible_weapons/energy_sword_green - name = "Energy Sword, Green" - item_cost = 40 - path = /obj/item/weapon/melee/energy/sword/green - -/datum/uplink_item/item/visible_weapons/energy_sword_red - name = "Energy Sword, Red" - item_cost = 40 - path = /obj/item/weapon/melee/energy/sword/red - -/datum/uplink_item/item/visible_weapons/energy_sword_purple - name = "Energy Sword, Purple" - item_cost = 40 - path = /obj/item/weapon/melee/energy/sword/purple - /datum/uplink_item/item/visible_weapons/energy_sword_pirate - name = "Energy Cutlass" + name = "Energy Cutlass, Colorable" item_cost = 40 path = /obj/item/weapon/melee/energy/sword/pirate /datum/uplink_item/item/visible_weapons/energy_spear - name = "Energy Spear" + name = "Energy Spear, Colorable" item_cost = 50 path = /obj/item/weapon/melee/energy/spear @@ -192,4 +172,4 @@ /datum/uplink_item/item/visible_weapons/xray name = "Xray Gun" item_cost = 85 - path = /obj/item/weapon/gun/energy/xray \ No newline at end of file + path = /obj/item/weapon/gun/energy/xray diff --git a/code/game/antagonist/antagonist_factions.dm b/code/game/antagonist/antagonist_factions.dm index 83c9957be2..a072196c1b 100644 --- a/code/game/antagonist/antagonist_factions.dm +++ b/code/game/antagonist/antagonist_factions.dm @@ -14,33 +14,33 @@ return if(faction.is_antagonist(player)) - src << "\The [player.current] already serves the [faction.faction_descriptor]." + to_chat(src, "\The [player.current] already serves the [faction.faction_descriptor].") return if(player_is_antag(player)) - src << "\The [player.current]'s loyalties seem to be elsewhere..." + to_chat(src, "\The [player.current]'s loyalties seem to be elsewhere...") return if(!faction.can_become_antag(player)) - src << "\The [player.current] cannot be \a [faction.faction_role_text]!" + to_chat(src, "\The [player.current] cannot be \a [faction.faction_role_text]!") return if(world.time < player.rev_cooldown) - src << "You must wait five seconds between attempts." + to_chat(src, "You must wait five seconds between attempts.") return - src << "You are attempting to convert \the [player.current]..." + to_chat(src, "You are attempting to convert \the [player.current]...") log_admin("[src]([src.ckey]) attempted to convert [player.current].") message_admins("[src]([src.ckey]) attempted to convert [player.current].") player.rev_cooldown = world.time+100 var/choice = alert(player.current,"Asked by [src]: Do you want to join the [faction.faction_descriptor]?","Join the [faction.faction_descriptor]?","No!","Yes!") if(choice == "Yes!" && faction.add_antagonist_mind(player, 0, faction.faction_role_text, faction.faction_welcome)) - src << "\The [player.current] joins the [faction.faction_descriptor]!" + to_chat(src, "\The [player.current] joins the [faction.faction_descriptor]!") return if(choice == "No!") player << "You reject this traitorous cause!" - src << "\The [player.current] does not support the [faction.faction_descriptor]!" + to_chat(src, "\The [player.current] does not support the [faction.faction_descriptor]!") /mob/living/proc/convert_to_loyalist(mob/M as mob in oview(src)) set name = "Convert Recidivist" diff --git a/code/game/antagonist/antagonist_objectives.dm b/code/game/antagonist/antagonist_objectives.dm index 5dc6c5f327..fba6467983 100644 --- a/code/game/antagonist/antagonist_objectives.dm +++ b/code/game/antagonist/antagonist_objectives.dm @@ -38,8 +38,8 @@ if(!mind) return if(!is_special_character(mind)) - src << "While you may perhaps have goals, this verb's meant to only be visible \ - to antagonists. Please make a bug report!" + to_chat(src, "While you may perhaps have goals, this verb's meant to only be visible \ + to antagonists. Please make a bug report!") return var/new_ambitions = input(src, "Write a short sentence of what your character hopes to accomplish \ today as an antagonist. Remember that this is purely optional. It will be shown at the end of the \ @@ -49,7 +49,7 @@ new_ambitions = sanitize(new_ambitions) mind.ambitions = new_ambitions if(new_ambitions) - src << "You've set your goal to be '[new_ambitions]'." + to_chat(src, "You've set your goal to be '[new_ambitions]'.") else - src << "You leave your ambitions behind." + to_chat(src, "You leave your ambitions behind.") log_and_message_admins("has set their ambitions to now be: [new_ambitions].") diff --git a/code/game/antagonist/outsider/wizard.dm b/code/game/antagonist/outsider/wizard.dm index feaf8857ba..6f2a7fe2e3 100644 --- a/code/game/antagonist/outsider/wizard.dm +++ b/code/game/antagonist/outsider/wizard.dm @@ -115,18 +115,18 @@ obj/item/clothing /*Checks if the wizard is wearing the proper attire. Made a proc so this is not repeated 14 (or more) times.*/ /mob/proc/wearing_wiz_garb() - src << "Silly creature, you're not a human. Only humans can cast this spell." + to_chat(src, "Silly creature, you're not a human. Only humans can cast this spell.") return 0 // Humans can wear clothes. /mob/living/carbon/human/wearing_wiz_garb() if(!is_wiz_garb(src.wear_suit)) - src << "I don't feel strong enough without my robe." + to_chat(src, "I don't feel strong enough without my robe.") return 0 if(!is_wiz_garb(src.shoes)) - src << "I don't feel strong enough without my sandals." + to_chat(src, "I don't feel strong enough without my sandals.") return 0 if(!is_wiz_garb(src.head)) - src << "I don't feel strong enough without my hat." + to_chat(src, "I don't feel strong enough without my hat.") return 0 return 1 diff --git a/code/game/gamemodes/changeling/generic_equip_procs.dm b/code/game/gamemodes/changeling/generic_equip_procs.dm index ef1ab650a1..f2d7b45831 100644 --- a/code/game/gamemodes/changeling/generic_equip_procs.dm +++ b/code/game/gamemodes/changeling/generic_equip_procs.dm @@ -32,7 +32,7 @@ return 1 if(M.head || M.wear_suit) //Make sure our slots aren't full - src << "We require nothing to be on our head, and we cannot wear any external suits, or shoes." + to_chat(src, "We require nothing to be on our head, and we cannot wear any external suits, or shoes.") return 0 var/obj/item/clothing/suit/A = new armor_type(src) @@ -242,7 +242,7 @@ var/mob/living/carbon/human/M = src if(M.hands_are_full()) //Make sure our hands aren't full. - src << "Our hands are full. Drop something first." + to_chat(src, "Our hands are full. Drop something first.") return 0 var/obj/item/weapon/W = new weapon_type(src) diff --git a/code/game/gamemodes/changeling/powers/absorb.dm b/code/game/gamemodes/changeling/powers/absorb.dm index 45b230b00c..02285a0c7e 100644 --- a/code/game/gamemodes/changeling/powers/absorb.dm +++ b/code/game/gamemodes/changeling/powers/absorb.dm @@ -16,41 +16,41 @@ var/obj/item/weapon/grab/G = src.get_active_hand() if(!istype(G)) - src << "We must be grabbing a creature in our active hand to absorb them." + to_chat(src, "We must be grabbing a creature in our active hand to absorb them.") return var/mob/living/carbon/human/T = G.affecting if(!istype(T) || T.isSynthetic()) - src << "\The [T] is not compatible with our biology." + to_chat(src, "\The [T] is not compatible with our biology.") return if(T.species.flags & NO_SCAN) - src << "We do not know how to parse this creature's DNA!" + to_chat(src, "We do not know how to parse this creature's DNA!") return if(HUSK in T.mutations) //Lings can always absorb other lings, unless someone beat them to it first. if(!T.mind.changeling || T.mind.changeling && T.mind.changeling.geneticpoints < 0) - src << "This creature's DNA is ruined beyond useability!" + to_chat(src, "This creature's DNA is ruined beyond useability!") return if(G.state != GRAB_KILL) - src << "We must have a tighter grip to absorb this creature." + to_chat(src, "We must have a tighter grip to absorb this creature.") return if(changeling.isabsorbing) - src << "We are already absorbing!" + to_chat(src, "We are already absorbing!") return changeling.isabsorbing = 1 for(var/stage = 1, stage<=3, stage++) switch(stage) if(1) - src << "This creature is compatible. We must hold still..." + to_chat(src, "This creature is compatible. We must hold still...") if(2) - src << "We extend a proboscis." + to_chat(src, "We extend a proboscis.") src.visible_message("[src] extends a proboscis!") if(3) - src << "We stab [T] with the proboscis." + to_chat(src, "We stab [T] with the proboscis.") src.visible_message("[src] stabs [T] with the proboscis!") T << "You feel a sharp stabbing pain!" add_attack_logs(src,T,"Absorbed (changeling)") @@ -60,11 +60,11 @@ feedback_add_details("changeling_powers","A[stage]") if(!do_mob(src, T, 150) || G.state != GRAB_KILL) - src << "Our absorption of [T] has been interrupted!" + to_chat(src, "Our absorption of [T] has been interrupted!") changeling.isabsorbing = 0 return - src << "We have absorbed [T]!" + to_chat(src, "We have absorbed [T]!") src.visible_message("[src] sucks the fluids from [T]!") T << "You have been absorbed by the changeling!" if(src.nutrition < 400) @@ -76,7 +76,7 @@ if(changeling.readapts > changeling.max_readapts) changeling.readapts = changeling.max_readapts - src << "We can now re-adapt, reverting our evolution so that we may start anew, if needed." + to_chat(src, "We can now re-adapt, reverting our evolution so that we may start anew, if needed.") var/datum/absorbed_dna/newDNA = new(T.real_name, T.dna, T.species.name, T.languages, T.identifying_gender, T.flavor_texts, T.modifiers) absorbDNA(newDNA) @@ -98,7 +98,7 @@ changeling.geneticpoints += 4 changeling.max_geneticpoints += 4 - src << "We absorbed another changeling, and we grow stronger. Our genomes increase." + to_chat(src, "We absorbed another changeling, and we grow stronger. Our genomes increase.") T.mind.changeling.chem_charges = 0 T.mind.changeling.geneticpoints = -1 diff --git a/code/game/gamemodes/changeling/powers/armblade.dm b/code/game/gamemodes/changeling/powers/armblade.dm index 947f06cee4..c05ad96e81 100644 --- a/code/game/gamemodes/changeling/powers/armblade.dm +++ b/code/game/gamemodes/changeling/powers/armblade.dm @@ -14,7 +14,7 @@ if(src.mind.changeling.recursive_enhancement) if(changeling_generic_weapon(/obj/item/weapon/melee/changeling/arm_blade/greater)) - src << "We prepare an extra sharp blade." + to_chat(src, "We prepare an extra sharp blade.") return 1 else @@ -39,7 +39,7 @@ if(src.mind.changeling.recursive_enhancement) if(changeling_generic_weapon(/obj/item/weapon/melee/changeling/claw/greater, 1, 15)) - src << "We prepare an extra sharp claw." + to_chat(src, "We prepare an extra sharp claw.") return 1 else diff --git a/code/game/gamemodes/changeling/powers/bioelectrogenesis.dm b/code/game/gamemodes/changeling/powers/bioelectrogenesis.dm index 3f3c1bd7ad..192f8b3874 100644 --- a/code/game/gamemodes/changeling/powers/bioelectrogenesis.dm +++ b/code/game/gamemodes/changeling/powers/bioelectrogenesis.dm @@ -25,7 +25,7 @@ if(held_item == null) if(src.mind.changeling.recursive_enhancement) if(changeling_generic_weapon(/obj/item/weapon/electric_hand/efficent,0)) - src << "We will shock others more efficently." + to_chat(src, "We will shock others more efficently.") return 1 else if(changeling_generic_weapon(/obj/item/weapon/electric_hand,0)) //Chemical cost is handled in the equip proc. @@ -54,7 +54,7 @@ "Our hand channels raw electricity into [G.affecting].", "You hear sparks!") else - src << "Our gloves block us from shocking \the [G.affecting]." + to_chat(src, "Our gloves block us from shocking \the [G.affecting].") src.mind.changeling.chem_charges -= 10 return 1 @@ -92,7 +92,7 @@ sleep(1 SECOND) success = 1 if(success == 0) //If we couldn't do anything with the ability, don't deduct the chemicals. - src << "We are unable to affect \the [held_item]." + to_chat(src, "We are unable to affect \the [held_item].") else src.mind.changeling.chem_charges -= 10 return success @@ -143,7 +143,7 @@ var/mob/living/carbon/C = target if(user.mind.changeling.chem_charges < shock_cost) - src << "We require more chemicals to electrocute [C]!" + to_chat(src, "We require more chemicals to electrocute [C]!") return 0 C.electrocute_act(electrocute_amount * siemens,src,1.0,BP_TORSO) @@ -156,7 +156,7 @@ "Our hand channels raw electricity into [C]", "You hear sparks!") else - src << "Our gloves block us from shocking \the [C]." + to_chat(src, "Our gloves block us from shocking \the [C].") //qdel(src) //Since we're no longer a one hit stun, we need to stick around. user.mind.changeling.chem_charges -= shock_cost return 1 @@ -165,7 +165,7 @@ var/mob/living/silicon/S = target if(user.mind.changeling.chem_charges < 10) - src << "We require more chemicals to electrocute [S]!" + to_chat(src, "We require more chemicals to electrocute [S]!") return 0 S.electrocute_act(60,src,0.75) //If only they had surge protectors. @@ -205,7 +205,7 @@ success = 1 break if(success == 0) - src << "We are unable to affect \the [target]." + to_chat(src, "We are unable to affect \the [target].") else qdel(src) return 1 \ No newline at end of file diff --git a/code/game/gamemodes/changeling/powers/blind_sting.dm b/code/game/gamemodes/changeling/powers/blind_sting.dm index 347881df9b..e2fede649e 100644 --- a/code/game/gamemodes/changeling/powers/blind_sting.dm +++ b/code/game/gamemodes/changeling/powers/blind_sting.dm @@ -21,7 +21,7 @@ var/duration = 300 if(src.mind.changeling.recursive_enhancement) duration = duration + 150 - src << "They will be deprived of sight for longer." + to_chat(src, "They will be deprived of sight for longer.") spawn(duration) T.disabilities &= ~NEARSIGHTED T.Blind(10) diff --git a/code/game/gamemodes/changeling/powers/cryo_sting.dm b/code/game/gamemodes/changeling/powers/cryo_sting.dm index bc68428d89..e1a2b10cff 100644 --- a/code/game/gamemodes/changeling/powers/cryo_sting.dm +++ b/code/game/gamemodes/changeling/powers/cryo_sting.dm @@ -20,12 +20,12 @@ var/inject_amount = 10 if(src.mind.changeling.recursive_enhancement) inject_amount = inject_amount * 1.5 - src << "We inject extra chemicals." + to_chat(src, "We inject extra chemicals.") if(T.reagents) T.reagents.add_reagent("cryotoxin", inject_amount) feedback_add_details("changeling_powers","CS") src.verbs -= /mob/proc/changeling_cryo_sting spawn(3 MINUTES) - src << "Our cryogenic string is ready to be used once more." + to_chat(src, "Our cryogenic string is ready to be used once more.") src.verbs |= /mob/proc/changeling_cryo_sting return 1 \ No newline at end of file diff --git a/code/game/gamemodes/changeling/powers/deaf_sting.dm b/code/game/gamemodes/changeling/powers/deaf_sting.dm index a94ad1744a..92e7a80a30 100644 --- a/code/game/gamemodes/changeling/powers/deaf_sting.dm +++ b/code/game/gamemodes/changeling/powers/deaf_sting.dm @@ -19,7 +19,7 @@ var/duration = 300 if(src.mind.changeling.recursive_enhancement) duration = duration + 100 - src << "They will be unable to hear for a little longer." + to_chat(src, "They will be unable to hear for a little longer.") T << "Your ears pop and begin ringing loudly!" T.sdisabilities |= DEAF spawn(duration) T.sdisabilities &= ~DEAF diff --git a/code/game/gamemodes/changeling/powers/delayed_toxin_sting.dm b/code/game/gamemodes/changeling/powers/delayed_toxin_sting.dm index 7853a9603e..f50460a826 100644 --- a/code/game/gamemodes/changeling/powers/delayed_toxin_sting.dm +++ b/code/game/gamemodes/changeling/powers/delayed_toxin_sting.dm @@ -32,7 +32,7 @@ var/type_to_give = /datum/modifier/delayed_toxin_sting if(src.mind.changeling.recursive_enhancement) type_to_give = /datum/modifier/delayed_toxin_sting/strong - src << "Our toxin will be extra potent, when it strikes." + to_chat(src, "Our toxin will be extra potent, when it strikes.") T.add_modifier(type_to_give, 2 MINUTES) diff --git a/code/game/gamemodes/changeling/powers/enfeebling_string.dm b/code/game/gamemodes/changeling/powers/enfeebling_string.dm index 16303f7c58..81930a7ebc 100644 --- a/code/game/gamemodes/changeling/powers/enfeebling_string.dm +++ b/code/game/gamemodes/changeling/powers/enfeebling_string.dm @@ -40,7 +40,7 @@ var/type_to_give = /datum/modifier/enfeeble if(src.mind.changeling.recursive_enhancement) type_to_give = /datum/modifier/enfeeble/strong - src << "We make them extremely weak." + to_chat(src, "We make them extremely weak.") H.add_modifier(type_to_give, 2 MINUTES) feedback_add_details("changeling_powers","ES") return 1 \ No newline at end of file diff --git a/code/game/gamemodes/changeling/powers/extract_dna_sting.dm b/code/game/gamemodes/changeling/powers/extract_dna_sting.dm index 0c5d91d83b..35ce94daf0 100644 --- a/code/game/gamemodes/changeling/powers/extract_dna_sting.dm +++ b/code/game/gamemodes/changeling/powers/extract_dna_sting.dm @@ -24,15 +24,15 @@ return if(!istype(T) || T.isSynthetic()) - src << "\The [T] is not compatible with our biology." + to_chat(src, "\The [T] is not compatible with our biology.") return 0 if(T.species.flags & NO_SCAN) - src << "We do not know how to parse this creature's DNA!" + to_chat(src, "We do not know how to parse this creature's DNA!") return 0 if(HUSK in T.mutations) - src << "This creature's DNA is ruined beyond useability!" + to_chat(src, "This creature's DNA is ruined beyond useability!") return 0 add_attack_logs(src,T,"DNA extraction sting (changeling)") diff --git a/code/game/gamemodes/changeling/powers/fake_death.dm b/code/game/gamemodes/changeling/powers/fake_death.dm index cae98164a0..3581a8d06a 100644 --- a/code/game/gamemodes/changeling/powers/fake_death.dm +++ b/code/game/gamemodes/changeling/powers/fake_death.dm @@ -19,7 +19,7 @@ var/mob/living/carbon/C = src if(changeling.max_geneticpoints < 0) //Absorbed by another ling - src << "We have no genomes, not even our own, and cannot regenerate." + to_chat(src, "We have no genomes, not even our own, and cannot regenerate.") return 0 if(!C.stat && alert("Are we sure we wish to regenerate? We will appear to be dead while doing so.","Revival","Yes","No") == "No") @@ -44,7 +44,7 @@ spawn(rand(2 MINUTES, 4 MINUTES)) //The ling will now be able to choose when to revive src.verbs += /mob/proc/changeling_revive - src << "We are ready to rise. Use the Revive verb when you are ready." + to_chat(src, "We are ready to rise. Use the Revive verb when you are ready.") feedback_add_details("changeling_powers","FD") return 1 \ No newline at end of file diff --git a/code/game/gamemodes/changeling/powers/fleshmend.dm b/code/game/gamemodes/changeling/powers/fleshmend.dm index f7760e9ce6..ed60400517 100644 --- a/code/game/gamemodes/changeling/powers/fleshmend.dm +++ b/code/game/gamemodes/changeling/powers/fleshmend.dm @@ -22,10 +22,10 @@ var/heal_amount = 2 if(src.mind.changeling.recursive_enhancement) heal_amount = heal_amount * 2 - src << "We will heal much faster." + to_chat(src, "We will heal much faster.") spawn(0) - src << "We begin to heal ourselves." + to_chat(src, "We begin to heal ourselves.") for(var/i = 0, i<50,i++) if(C) C.adjustBruteLoss(-heal_amount) @@ -35,7 +35,7 @@ src.verbs -= /mob/proc/changeling_fleshmend spawn(50 SECONDS) - src << "Our regeneration has slowed to normal levels." + to_chat(src, "Our regeneration has slowed to normal levels.") src.verbs += /mob/proc/changeling_fleshmend feedback_add_details("changeling_powers","FM") return 1 \ No newline at end of file diff --git a/code/game/gamemodes/changeling/powers/hivemind.dm b/code/game/gamemodes/changeling/powers/hivemind.dm index c8e5f11604..105de8f4f5 100644 --- a/code/game/gamemodes/changeling/powers/hivemind.dm +++ b/code/game/gamemodes/changeling/powers/hivemind.dm @@ -34,7 +34,7 @@ var/list/datum/dna/hivemind_bank = list() names += DNA.name if(names.len <= 0) - src << "The airwaves already have all of our DNA." + to_chat(src, "The airwaves already have all of our DNA.") return var/S = input("Select a DNA to channel: ", "Channel DNA", null) as null|anything in names @@ -46,7 +46,7 @@ var/list/datum/dna/hivemind_bank = list() changeling.chem_charges -= 10 hivemind_bank += chosen_dna - src << "We channel the DNA of [S] to the air." + to_chat(src, "We channel the DNA of [S] to the air.") feedback_add_details("changeling_powers","HU") return 1 @@ -64,7 +64,7 @@ var/list/datum/dna/hivemind_bank = list() names[DNA.name] = DNA if(names.len <= 0) - src << "There's no new DNA to absorb from the air." + to_chat(src, "There's no new DNA to absorb from the air.") return var/S = input("Select a DNA absorb from the air: ", "Absorb DNA", null) as null|anything in names @@ -75,6 +75,6 @@ var/list/datum/dna/hivemind_bank = list() changeling.chem_charges -= 20 absorbDNA(chosen_dna) - src << "We absorb the DNA of [S] from the air." + to_chat(src, "We absorb the DNA of [S] from the air.") feedback_add_details("changeling_powers","HD") return 1 \ No newline at end of file diff --git a/code/game/gamemodes/changeling/powers/lesser_form.dm b/code/game/gamemodes/changeling/powers/lesser_form.dm index f2742490f6..6a5cf80730 100644 --- a/code/game/gamemodes/changeling/powers/lesser_form.dm +++ b/code/game/gamemodes/changeling/powers/lesser_form.dm @@ -13,13 +13,13 @@ if(!changeling) return if(src.has_brain_worms()) - src << "We cannot perform this ability at the present time!" + to_chat(src, "We cannot perform this ability at the present time!") return var/mob/living/carbon/human/H = src if(!istype(H) || !H.species.primitive_form) - src << "We cannot perform this ability in this form!" + to_chat(src, "We cannot perform this ability in this form!") return changeling.chem_charges-- diff --git a/code/game/gamemodes/changeling/powers/mimic_voice.dm b/code/game/gamemodes/changeling/powers/mimic_voice.dm index ae95317683..6b84c577ff 100644 --- a/code/game/gamemodes/changeling/powers/mimic_voice.dm +++ b/code/game/gamemodes/changeling/powers/mimic_voice.dm @@ -19,7 +19,7 @@ if(changeling.mimicing) changeling.mimicing = "" - src << "We return our vocal glands to their original location." + to_chat(src, "We return our vocal glands to their original location.") return var/mimic_voice = sanitize(input(usr, "Enter a name to mimic.", "Mimic Voice", null), MAX_NAME_LEN) @@ -28,8 +28,8 @@ changeling.mimicing = mimic_voice - src << "We shape our glands to take the voice of [mimic_voice], this will stop us from regenerating chemicals while active." - src << "Use this power again to return to our original voice and reproduce chemicals again." + to_chat(src, "We shape our glands to take the voice of [mimic_voice], this will stop us from regenerating chemicals while active.") + to_chat(src, "Use this power again to return to our original voice and reproduce chemicals again.") feedback_add_details("changeling_powers","MV") diff --git a/code/game/gamemodes/changeling/powers/panacea.dm b/code/game/gamemodes/changeling/powers/panacea.dm index 660434d185..30679b6ef5 100644 --- a/code/game/gamemodes/changeling/powers/panacea.dm +++ b/code/game/gamemodes/changeling/powers/panacea.dm @@ -18,7 +18,7 @@ return 0 src.mind.changeling.chem_charges -= 20 - src << "We cleanse impurities from our form." + to_chat(src, "We cleanse impurities from our form.") var/mob/living/carbon/human/C = src @@ -32,7 +32,7 @@ var/heal_amount = 5 if(src.mind.changeling.recursive_enhancement) heal_amount = heal_amount * 2 - src << "We will heal much faster." + to_chat(src, "We will heal much faster.") for(var/i = 0, i<10,i++) if(C) diff --git a/code/game/gamemodes/changeling/powers/rapid_regen.dm b/code/game/gamemodes/changeling/powers/rapid_regen.dm index 2eb628b8f6..6d1e9ee300 100644 --- a/code/game/gamemodes/changeling/powers/rapid_regen.dm +++ b/code/game/gamemodes/changeling/powers/rapid_regen.dm @@ -24,7 +24,7 @@ var/healing_amount = 40 if(src.mind.changeling.recursive_enhancement) healing_amount = C.maxHealth - src << "We completely heal ourselves." + to_chat(src, "We completely heal ourselves.") spawn(0) C.adjustBruteLoss(-healing_amount) C.adjustFireLoss(-healing_amount) diff --git a/code/game/gamemodes/changeling/powers/recursive_enhancement.dm b/code/game/gamemodes/changeling/powers/recursive_enhancement.dm index 9362333c57..77bab9bd99 100644 --- a/code/game/gamemodes/changeling/powers/recursive_enhancement.dm +++ b/code/game/gamemodes/changeling/powers/recursive_enhancement.dm @@ -15,10 +15,10 @@ if(!changeling) return 0 if(src.mind.changeling.recursive_enhancement) - src << "We will no longer empower our abilities." + to_chat(src, "We will no longer empower our abilities.") src.mind.changeling.recursive_enhancement = 0 return 0 - src << "We empower ourselves. Our abilities will now be extra potent." + to_chat(src, "We empower ourselves. Our abilities will now be extra potent.") src.mind.changeling.recursive_enhancement = 1 feedback_add_details("changeling_powers","RE") return 1 \ No newline at end of file diff --git a/code/game/gamemodes/changeling/powers/revive.dm b/code/game/gamemodes/changeling/powers/revive.dm index 7fe4ab232b..0648fa8ab6 100644 --- a/code/game/gamemodes/changeling/powers/revive.dm +++ b/code/game/gamemodes/changeling/powers/revive.dm @@ -9,7 +9,7 @@ return 0 if(changeling.max_geneticpoints < 0) //Absorbed by another ling - src << "You have no genomes, not even your own, and cannot revive." + to_chat(src, "You have no genomes, not even your own, and cannot revive.") return 0 if(src.stat == DEAD) diff --git a/code/game/gamemodes/changeling/powers/self_respiration.dm b/code/game/gamemodes/changeling/powers/self_respiration.dm index 6d6228eba8..5108361669 100644 --- a/code/game/gamemodes/changeling/powers/self_respiration.dm +++ b/code/game/gamemodes/changeling/powers/self_respiration.dm @@ -19,13 +19,13 @@ if(istype(src,/mob/living/carbon)) var/mob/living/carbon/C = src if(C.suiciding) - src << "You're committing suicide, this isn't going to work." + to_chat(src, "You're committing suicide, this isn't going to work.") return 0 if(C.does_not_breathe == 0) C.does_not_breathe = 1 - src << "We stop breathing, as we no longer need to." + to_chat(src, "We stop breathing, as we no longer need to.") return 1 else C.does_not_breathe = 0 - src << "We resume breathing, as we now need to again." + to_chat(src, "We resume breathing, as we now need to again.") return 0 \ No newline at end of file diff --git a/code/game/gamemodes/changeling/powers/shriek.dm b/code/game/gamemodes/changeling/powers/shriek.dm index 4989c27f87..a2b9013c5a 100644 --- a/code/game/gamemodes/changeling/powers/shriek.dm +++ b/code/game/gamemodes/changeling/powers/shriek.dm @@ -95,13 +95,13 @@ if(!changeling) return 0 if(is_muzzled()) - src << "Mmmf mrrfff!" + to_chat(src, "Mmmf mrrfff!") return 0 if(ishuman(src)) var/mob/living/carbon/human/H = src if(H.silent) - src << "You can't speak!" + to_chat(src, "You can't speak!") return 0 if(world.time < (changeling.last_shriek + 10 SECONDS) ) @@ -125,7 +125,7 @@ range_med = range_med * 2 range_light = range_light * 2 range_long = range_long * 2 - src << "We are extra loud." + to_chat(src, "We are extra loud.") src.mind.changeling.recursive_enhancement = 0 visible_message("[src] appears to shout.") diff --git a/code/game/gamemodes/changeling/powers/silence_sting.dm b/code/game/gamemodes/changeling/powers/silence_sting.dm index 334b0c139f..16d24c878f 100644 --- a/code/game/gamemodes/changeling/powers/silence_sting.dm +++ b/code/game/gamemodes/changeling/powers/silence_sting.dm @@ -19,7 +19,7 @@ var/duration = 30 if(src.mind.changeling.recursive_enhancement) duration = duration + 10 - src << "They will be unable to cry out in fear for a little longer." + to_chat(src, "They will be unable to cry out in fear for a little longer.") T.silent += duration feedback_add_details("changeling_powers","SS") return 1 \ No newline at end of file diff --git a/code/game/gamemodes/changeling/powers/transform_sting.dm b/code/game/gamemodes/changeling/powers/transform_sting.dm index 678e195e22..1f6bc7b93d 100644 --- a/code/game/gamemodes/changeling/powers/transform_sting.dm +++ b/code/game/gamemodes/changeling/powers/transform_sting.dm @@ -34,7 +34,7 @@ if(!T) return 0 if((HUSK in T.mutations) || (!ishuman(T) && !issmall(T))) - src << "Our sting appears ineffective against its DNA." + to_chat(src, "Our sting appears ineffective against its DNA.") return 0 add_attack_logs(src,T,"Transformation sting (changeling)") T.visible_message("[T] transforms!") diff --git a/code/game/gamemodes/technomancer/instability.dm b/code/game/gamemodes/technomancer/instability.dm index 7904b5cb6c..6dc3f2d52b 100644 --- a/code/game/gamemodes/technomancer/instability.dm +++ b/code/game/gamemodes/technomancer/instability.dm @@ -122,13 +122,13 @@ electrocute_act(instability * 0.3, "unstable energies", 0.75) if(1) adjustFireLoss(instability * 0.15) //7.5 burn @ 50 instability - src << "Your chassis alerts you to overheating from an unknown external force!" + to_chat(src, "Your chassis alerts you to overheating from an unknown external force!") if(2) adjustBruteLoss(instability * 0.15) //7.5 brute @ 50 instability - src << "Your chassis makes the sound of metal groaning!" + to_chat(src, "Your chassis makes the sound of metal groaning!") if(3) safe_blink(src, range = 6) - src << "You're teleported against your will!" + to_chat(src, "You're teleported against your will!") if(4) emp_act(3) @@ -141,10 +141,10 @@ emp_act(2) if(2) adjustFireLoss(instability * 0.3) //30 burn @ 100 instability - src << "Your chassis alerts you to extreme overheating from an unknown external force!" + to_chat(src, "Your chassis alerts you to extreme overheating from an unknown external force!") if(3) adjustBruteLoss(instability * 0.3) //30 brute @ 100 instability - src << "Your chassis makes the sound of metal groaning and tearing!" + to_chat(src, "Your chassis makes the sound of metal groaning and tearing!") if(101 to 200) //Lethal rng = rand(0,4) @@ -155,10 +155,10 @@ emp_act(1) if(2) adjustFireLoss(instability * 0.4) //40 burn @ 100 instability - src << "Your chassis alerts you to extreme overheating from an unknown external force!" + to_chat(src, "Your chassis alerts you to extreme overheating from an unknown external force!") if(3) adjustBruteLoss(instability * 0.4) //40 brute @ 100 instability - src << "Your chassis makes the sound of metal groaning and tearing!" + to_chat(src, "Your chassis makes the sound of metal groaning and tearing!") /mob/living/carbon/human/instability_effects() if(instability) @@ -190,23 +190,23 @@ if(2) if(can_feel_pain()) apply_effect(instability * 0.3, AGONY) - src << "You feel a sharp pain!" + to_chat(src, "You feel a sharp pain!") if(3) apply_effect(instability * 0.3, EYE_BLUR) - src << "Your eyes start to get cloudy!" + to_chat(src, "Your eyes start to get cloudy!") if(4) electrocute_act(instability * 0.3, "unstable energies") if(5) adjustFireLoss(instability * 0.15) //7.5 burn @ 50 instability - src << "You feel your skin burn!" + to_chat(src, "You feel your skin burn!") if(6) adjustBruteLoss(instability * 0.15) //7.5 brute @ 50 instability - src << "You feel a sharp pain as an unseen force harms your body!" + to_chat(src, "You feel a sharp pain as an unseen force harms your body!") if(7) adjustToxLoss(instability * 0.15) //7.5 tox @ 50 instability if(8) safe_blink(src, range = 6) - src << "You're teleported against your will!" + to_chat(src, "You're teleported against your will!") if(50 to 100) //Severe rng = rand(0,8) @@ -218,18 +218,18 @@ if(2) if(can_feel_pain()) apply_effect(instability * 0.7, AGONY) - src << "You feel an extremly angonizing pain from all over your body!" + to_chat(src, "You feel an extremly angonizing pain from all over your body!") if(3) apply_effect(instability * 0.5, EYE_BLUR) - src << "Your eyes start to get cloudy!" + to_chat(src, "Your eyes start to get cloudy!") if(4) electrocute_act(instability * 0.5, "extremely unstable energies") if(5) fire_act() - src << "You spontaneously combust!" + to_chat(src, "You spontaneously combust!") if(6) adjustCloneLoss(instability * 0.05) //5 cloneloss @ 100 instability - src << "You feel your body slowly degenerate." + to_chat(src, "You feel your body slowly degenerate.") if(7) adjustToxLoss(instability * 0.25) //25 tox @ 100 instability @@ -245,18 +245,18 @@ if(2) if(can_feel_pain()) apply_effect(instability, AGONY) - src << "You feel an extremly angonizing pain from all over your body!" + to_chat(src, "You feel an extremly angonizing pain from all over your body!") if(3) apply_effect(instability, EYE_BLUR) - src << "Your eyes start to get cloudy!" + to_chat(src, "Your eyes start to get cloudy!") if(4) electrocute_act(instability, "extremely unstable energies") if(5) fire_act() - src << "You spontaneously combust!" + to_chat(src, "You spontaneously combust!") if(6) adjustCloneLoss(instability * 0.10) //5 cloneloss @ 100 instability - src << "You feel your body slowly degenerate." + to_chat(src, "You feel your body slowly degenerate.") if(7) adjustToxLoss(instability * 0.40) //40 tox @ 100 instability diff --git a/code/game/gamemodes/technomancer/spell_objs.dm b/code/game/gamemodes/technomancer/spell_objs.dm index 681d29da50..adfeda58ab 100644 --- a/code/game/gamemodes/technomancer/spell_objs.dm +++ b/code/game/gamemodes/technomancer/spell_objs.dm @@ -292,7 +292,7 @@ if(l_spell.aspect == ASPECT_CHROMATIC) //Check the other hand too. l_spell.on_combine_cast(S, src) else //Welp - src << "You require a free hand to use this function." + to_chat(src, "You require a free hand to use this function.") return 0 if(S.run_checks()) diff --git a/code/game/jobs/job_controller.dm b/code/game/jobs/job_controller.dm index d5322d5f0e..b5d42ba2f6 100644 --- a/code/game/jobs/job_controller.dm +++ b/code/game/jobs/job_controller.dm @@ -389,9 +389,6 @@ var/global/datum/controller/occupations/job_master H << "Your current species, job or whitelist status does not permit you to spawn with [thing]!" continue - if(G.exploitable) - H.amend_exploitable(G.path) - if(G.slot == "implant") var/obj/item/weapon/implant/I = G.spawn_item(H) I.invisibility = 100 diff --git a/code/game/machinery/suit_storage_unit.dm b/code/game/machinery/suit_storage_unit.dm index 7939514beb..a8c9492e23 100644 --- a/code/game/machinery/suit_storage_unit.dm +++ b/code/game/machinery/suit_storage_unit.dm @@ -931,7 +931,7 @@ /obj/machinery/suit_cycler/proc/finished_job() var/turf/T = get_turf(src) - T.audible_message("\icon[src]The [src] beeps several times.") + T.visible_message("\icon[src]The [src] beeps several times.") icon_state = initial(icon_state) active = 0 playsound(src, 'sound/machines/boobeebeep.ogg', 50) diff --git a/code/game/magic/archived_book.dm b/code/game/magic/archived_book.dm index 2fc9412fcd..b2af5f3f73 100644 --- a/code/game/magic/archived_book.dm +++ b/code/game/magic/archived_book.dm @@ -37,7 +37,7 @@ datum/book_manager/proc/freeid() set desc = "Permamently deletes a book from the database." set category = "Admin" if(!src.holder) - src << "Only administrators may use this command." + to_chat(src, "Only administrators may use this command.") return var/isbn = input("ISBN number?", "Delete Book") as num | null diff --git a/code/game/mecha/combat/gorilla.dm b/code/game/mecha/combat/gorilla.dm index f94c8bc78e..a33cd963e2 100644 --- a/code/game/mecha/combat/gorilla.dm +++ b/code/game/mecha/combat/gorilla.dm @@ -87,7 +87,7 @@ max_universal_equip = 5 max_special_equip = 2 -/obj/mecha/combat/gorilla/New() +/obj/mecha/combat/gorilla/Initialize() ..() var/obj/item/mecha_parts/mecha_equipment/ME = new /obj/item/mecha_parts/mecha_equipment/tesla_energy_relay(src) // This thing basically cannot function without an external power supply. ME.attach(src) diff --git a/code/game/mecha/combat/gygax.dm b/code/game/mecha/combat/gygax.dm index 19564acba9..d70c8f9e85 100644 --- a/code/game/mecha/combat/gygax.dm +++ b/code/game/mecha/combat/gygax.dm @@ -45,7 +45,7 @@ max_universal_equip = 1 max_special_equip = 2 -/obj/mecha/combat/gygax/dark/New() +/obj/mecha/combat/gygax/dark/Initialize() ..() var/obj/item/mecha_parts/mecha_equipment/ME = new /obj/item/mecha_parts/mecha_equipment/weapon/ballistic/scattershot ME.attach(src) diff --git a/code/game/mecha/combat/marauder.dm b/code/game/mecha/combat/marauder.dm index b8aed16cef..9521147089 100644 --- a/code/game/mecha/combat/marauder.dm +++ b/code/game/mecha/combat/marauder.dm @@ -55,7 +55,7 @@ wreckage = /obj/effect/decal/mecha_wreckage/mauler mech_faction = MECH_FACTION_SYNDI -/obj/mecha/combat/marauder/New() +/obj/mecha/combat/marauder/Initialize() ..() var/obj/item/mecha_parts/mecha_equipment/ME = new /obj/item/mecha_parts/mecha_equipment/weapon/energy/pulse ME.attach(src) @@ -69,7 +69,7 @@ src.smoke_system.attach(src) return -/obj/mecha/combat/marauder/seraph/New() +/obj/mecha/combat/marauder/seraph/Initialize() ..()//Let it equip whatever is needed. var/obj/item/mecha_parts/mecha_equipment/ME if(equipment.len)//Now to remove it and equip anew. diff --git a/code/game/mecha/combat/phazon.dm b/code/game/mecha/combat/phazon.dm index 3ada4824f7..8f72de5f51 100644 --- a/code/game/mecha/combat/phazon.dm +++ b/code/game/mecha/combat/phazon.dm @@ -27,7 +27,7 @@ max_universal_equip = 3 max_special_equip = 4 -/obj/mecha/combat/phazon/equipped/New() +/obj/mecha/combat/phazon/equipped/Initialize() ..() var/obj/item/mecha_parts/mecha_equipment/ME = new /obj/item/mecha_parts/mecha_equipment/tool/rcd ME.attach(src) diff --git a/code/game/mecha/medical/odysseus.dm b/code/game/mecha/medical/odysseus.dm index b3b9faa37d..1f90a45d61 100644 --- a/code/game/mecha/medical/odysseus.dm +++ b/code/game/mecha/medical/odysseus.dm @@ -123,7 +123,7 @@ C.images += holder */ -/obj/mecha/medical/odysseus/loaded/New() +/obj/mecha/medical/odysseus/loaded/Initialize() ..() var/obj/item/mecha_parts/mecha_equipment/ME = new /obj/item/mecha_parts/mecha_equipment/tool/sleeper ME.attach(src) diff --git a/code/game/mecha/space/hoverpod.dm b/code/game/mecha/space/hoverpod.dm index 85fc59d564..31558458d9 100644 --- a/code/game/mecha/space/hoverpod.dm +++ b/code/game/mecha/space/hoverpod.dm @@ -105,7 +105,7 @@ max_universal_equip = 1 max_special_equip = 1 -/obj/mecha/working/hoverpod/combatpod/New() +/obj/mecha/working/hoverpod/combatpod/Initialize() ..() var/obj/item/mecha_parts/mecha_equipment/ME = new /obj/item/mecha_parts/mecha_equipment/weapon/energy/laser ME.attach(src) @@ -116,7 +116,7 @@ /obj/mecha/working/hoverpod/shuttlepod desc = "Who knew a tiny ball could fit three people?" -/obj/mecha/working/hoverpod/shuttlepod/New() +/obj/mecha/working/hoverpod/shuttlepod/Initialize() ..() var/obj/item/mecha_parts/mecha_equipment/ME = new /obj/item/mecha_parts/mecha_equipment/tool/passenger ME.attach(src) diff --git a/code/game/mecha/working/ripley.dm b/code/game/mecha/working/ripley.dm index c4813bb0dd..5dd88eb7e7 100644 --- a/code/game/mecha/working/ripley.dm +++ b/code/game/mecha/working/ripley.dm @@ -54,7 +54,7 @@ max_universal_equip = 1 max_special_equip = 1 -/obj/mecha/working/ripley/deathripley/New() +/obj/mecha/working/ripley/deathripley/Initialize() ..() var/obj/item/mecha_parts/mecha_equipment/ME = new /obj/item/mecha_parts/mecha_equipment/tool/safety_clamp ME.attach(src) @@ -64,7 +64,7 @@ desc = "An old, dusty mining ripley." name = "APLU \"Miner\"" -/obj/mecha/working/ripley/mining/New() +/obj/mecha/working/ripley/mining/Initialize() ..() //Attach drill if(prob(25)) //Possible diamond drill... Feeling lucky? diff --git a/code/game/objects/effects/alien/aliens.dm b/code/game/objects/effects/alien/aliens.dm index 0de8d332b7..552e8672f8 100644 --- a/code/game/objects/effects/alien/aliens.dm +++ b/code/game/objects/effects/alien/aliens.dm @@ -152,6 +152,12 @@ * Weeds */ #define NODERANGE 3 +#define WEED_NORTH_EDGING "north" +#define WEED_SOUTH_EDGING "south" +#define WEED_EAST_EDGING "east" +#define WEED_WEST_EDGING "west" +#define WEED_NODE_GLOW "glow" +#define WEED_NODE_BASE "nodebase" /obj/effect/alien/weeds name = "weeds" @@ -164,6 +170,18 @@ layer = ABOVE_TURF_LAYER var/health = 15 var/obj/effect/alien/weeds/node/linked_node = null + var/static/list/weedImageCache + +/obj/effect/alien/weeds/Destroy() + var/turf/T = get_turf(src) + // To not mess up the overlay updates. + loc = null + + for (var/obj/effect/alien/weeds/W in range(1,T)) + W.updateWeedOverlays() + + linked_node = null + ..() /obj/effect/alien/weeds/node icon_state = "weednode" @@ -173,9 +191,22 @@ light_range = NODERANGE var/node_range = NODERANGE + var/set_color = null + /obj/effect/alien/weeds/node/New() ..(src.loc, src) +/obj/effect/alien/weeds/node/Initialize() + ..() + START_PROCESSING(SSobj, src) + + spawn(1 SECOND) + if(color) + set_color = color + +/obj/effect/alien/weeds/node/Destroy() + STOP_PROCESSING(SSobj, src) + ..() /obj/effect/alien/weeds/New(pos, node) ..() @@ -184,12 +215,45 @@ return linked_node = node if(icon_state == "weeds")icon_state = pick("weeds", "weeds1", "weeds2") - spawn(rand(150, 200)) - if(src) - Life() + + fullUpdateWeedOverlays() + +/obj/effect/alien/weeds/proc/updateWeedOverlays() + + overlays.Cut() + + if(!weedImageCache || !weedImageCache.len) + weedImageCache = list() +// weedImageCache.len = 4 + weedImageCache[WEED_NORTH_EDGING] = image('icons/mob/alien.dmi', "weeds_side_n", layer=2.11, pixel_y = -32) + weedImageCache[WEED_SOUTH_EDGING] = image('icons/mob/alien.dmi', "weeds_side_s", layer=2.11, pixel_y = 32) + weedImageCache[WEED_EAST_EDGING] = image('icons/mob/alien.dmi', "weeds_side_e", layer=2.11, pixel_x = -32) + weedImageCache[WEED_WEST_EDGING] = image('icons/mob/alien.dmi', "weeds_side_w", layer=2.11, pixel_x = 32) + + var/turf/N = get_step(src, NORTH) + var/turf/S = get_step(src, SOUTH) + var/turf/E = get_step(src, EAST) + var/turf/W = get_step(src, WEST) + if(!locate(/obj/effect/alien) in N.contents) + if(istype(N, /turf/simulated/floor)) + overlays += weedImageCache[WEED_SOUTH_EDGING] + if(!locate(/obj/effect/alien) in S.contents) + if(istype(S, /turf/simulated/floor)) + overlays += weedImageCache[WEED_NORTH_EDGING] + if(!locate(/obj/effect/alien) in E.contents) + if(istype(E, /turf/simulated/floor)) + overlays += weedImageCache[WEED_WEST_EDGING] + if(!locate(/obj/effect/alien) in W.contents) + if(istype(W, /turf/simulated/floor)) + overlays += weedImageCache[WEED_EAST_EDGING] + +/obj/effect/alien/weeds/proc/fullUpdateWeedOverlays() + for (var/obj/effect/alien/weeds/W in range(1,src)) + W.updateWeedOverlays() + return -/obj/effect/alien/weeds/proc/Life() +/obj/effect/alien/weeds/process() set background = 1 var/turf/U = get_turf(src) /* @@ -211,6 +275,9 @@ Alien plants should do something if theres a lot of poison if(!linked_node || (get_dist(linked_node, src) > linked_node.node_range) ) return + if(linked_node != src) + color = linked_node.set_color + direction_loop: for(var/dirn in cardinal) var/turf/T = get_step(src, dirn) @@ -222,10 +289,33 @@ Alien plants should do something if theres a lot of poison // continue for(var/obj/O in T) - if(O.density) + if(!O.CanZASPass(U)) continue direction_loop - new /obj/effect/alien/weeds(T, linked_node) + var/obj/effect/E = new /obj/effect/alien/weeds(T, linked_node) + + E.color = color + + if(istype(src, /obj/effect/alien/weeds/node)) + var/obj/effect/alien/weeds/node/N = src + var/list/nearby_weeds = list() + for(var/obj/effect/alien/weeds/W in range(N.node_range,src)) + nearby_weeds |= W + + for(var/obj/effect/alien/weeds/W in nearby_weeds) + if(!W) + continue + + if(!W.linked_node) + linked_node = src + + W.color = W.linked_node.set_color + + if(W == src) + continue + + if(prob(max(10, 40 - (5 * nearby_weeds.len)))) + W.process() /obj/effect/alien/weeds/ex_act(severity) @@ -282,7 +372,12 @@ Alien plants should do something if theres a lot of poison healthcheck() #undef NODERANGE - +#undef WEED_NORTH_EDGING +#undef WEED_SOUTH_EDGING +#undef WEED_EAST_EDGING +#undef WEED_WEST_EDGING +#undef WEED_NODE_GLOW +#undef WEED_NODE_BASE /* * Acid diff --git a/code/game/objects/effects/decals/Cleanable/humans.dm b/code/game/objects/effects/decals/Cleanable/humans.dm index 8b8bba5a9d..7a773c733e 100644 --- a/code/game/objects/effects/decals/Cleanable/humans.dm +++ b/code/game/objects/effects/decals/Cleanable/humans.dm @@ -199,10 +199,10 @@ var/global/list/image/splatter_cache=list() overlays += giblets /obj/effect/decal/cleanable/blood/gibs/up - random_icon_states = list("gib1", "gib2", "gib3", "gib4", "gib5", "gib6","gibup1","gibup1","gibup1") + random_icon_states = list("gib1", "gib2", "gib3", "gib5", "gib6","gibup1","gibup1","gibup1") /obj/effect/decal/cleanable/blood/gibs/down - random_icon_states = list("gib1", "gib2", "gib3", "gib4", "gib5", "gib6","gibdown1","gibdown1","gibdown1") + random_icon_states = list("gib1", "gib2", "gib3", "gib5", "gib6","gibdown1","gibdown1","gibdown1") /obj/effect/decal/cleanable/blood/gibs/body random_icon_states = list("gibhead", "gibtorso") diff --git a/code/game/objects/items/devices/radio/headset_vr.dm b/code/game/objects/items/devices/radio/headset_vr.dm index 71a37ac0d7..a82e694d0e 100644 --- a/code/game/objects/items/devices/radio/headset_vr.dm +++ b/code/game/objects/items/devices/radio/headset_vr.dm @@ -19,4 +19,28 @@ /obj/item/device/radio/headset sprite_sheets = list(SPECIES_TESHARI = 'icons/mob/species/seromi/ears.dmi', - SPECIES_WEREBEAST = 'icons/mob/species/werebeast/ears.dmi') \ No newline at end of file + SPECIES_WEREBEAST = 'icons/mob/species/werebeast/ears.dmi') + +/obj/item/device/radio/headset/mob_headset //Adminbus headset for simplemob shenanigans. + name = "nonhuman radio implant" + desc = "An updated, modular intercom that requires no hands to operate. Takes encryption keys" + +/obj/item/device/radio/headset/mob_headset/receive_range(freq, level) + if(ismob(src.loc)) + return ..(freq, level) + return -1 + +/obj/item/device/radio/headset/mob_headset/afterattack(var/atom/movable/target, mob/living/user, proximity) + if(!proximity) + return + if(istype(target,/mob/living/simple_mob)) + var/mob/living/simple_mob/M = target + if(!M.mob_radio) + forceMove(M) + M.mob_radio = src + return + if(M.mob_radio) + M.mob_radio.forceMove(M.loc) + M.mob_radio = null + return + ..() \ No newline at end of file diff --git a/code/game/objects/items/weapons/implants/implant.dm b/code/game/objects/items/weapons/implants/implant.dm index c00d396e4d..ff4146b8a0 100644 --- a/code/game/objects/items/weapons/implants/implant.dm +++ b/code/game/objects/items/weapons/implants/implant.dm @@ -66,8 +66,7 @@ /obj/item/weapon/implant/proc/implant_loadout(var/mob/living/carbon/human/H) if(H) - var/obj/item/organ/external/affected = H.organs_by_name[initialize_loc] - if(handle_implant(H, affected)) + if(handle_implant(H, initialize_loc)) invisibility = initial(invisibility) post_implant(H) diff --git a/code/game/objects/items/weapons/implants/implantdud.dm b/code/game/objects/items/weapons/implants/implantdud.dm index 896ea2358a..110051e58d 100644 --- a/code/game/objects/items/weapons/implants/implantdud.dm +++ b/code/game/objects/items/weapons/implants/implantdud.dm @@ -19,12 +19,3 @@ icon = 'icons/obj/device.dmi' icon_state = "implant" roundstart = FALSE - -/obj/item/weapon/implant/dud/Initialize() - ..() - if(roundstart) - invisibility = 100 - ..() - spawn(3) - if(!ishuman(loc) && !QDELETED(src)) - qdel(src) diff --git a/code/game/objects/items/weapons/implants/neuralbasic.dm b/code/game/objects/items/weapons/implants/neuralbasic.dm index 0c5fe2b3da..18d472154b 100644 --- a/code/game/objects/items/weapons/implants/neuralbasic.dm +++ b/code/game/objects/items/weapons/implants/neuralbasic.dm @@ -105,10 +105,3 @@ Implant Specifics:
"} my_brain.take_damage(15) my_brain = null return - -/obj/item/weapon/implant/neural/roundstart/Initialize() - invisibility = 100 - ..() - spawn(3) - if(!ishuman(loc) && !QDELETED(src)) - qdel(src) diff --git a/code/game/objects/items/weapons/material/material_weapons.dm b/code/game/objects/items/weapons/material/material_weapons.dm index a911d1e137..3f2b1978d3 100644 --- a/code/game/objects/items/weapons/material/material_weapons.dm +++ b/code/game/objects/items/weapons/material/material_weapons.dm @@ -86,10 +86,13 @@ health-- check_health() -/obj/item/weapon/material/attackby(obj/item/weapon/W, mob/user as mob) +/obj/item/weapon/material/attackby(obj/item/weapon/W, mob/user) if(istype(W, /obj/item/weapon/whetstone)) var/obj/item/weapon/whetstone/whet = W repair(whet.repair_amount, whet.repair_time, user) + if(istype(W, /obj/item/weapon/material/sharpeningkit)) + var/obj/item/weapon/material/sharpeningkit/SK = W + repair(SK.repair_amount, SK.repair_time, user) ..() /obj/item/weapon/material/proc/check_health(var/consumed) @@ -134,7 +137,19 @@ to_chat(user, "You can't repair \the [src].") return - +/obj/item/weapon/material/proc/sharpen(var/material, var/sharpen_time, var/kit, mob/living/M) + if(!fragile) + if(health < initial(health)) + to_chat(M, "You should repair [src] first. Try using [kit] on it.") + return FALSE + M.visible_message("[M] begins to replace parts of [src] with [kit].", "You begin to replace parts of [src] with [kit].") + if(do_after(usr, sharpen_time)) + M.visible_message("[M] has finished replacing parts of [src].", "You finish replacing parts of [src].") + src.set_material(material) + return TRUE + else + to_chat(M, "You can't sharpen and re-edge [src].") + return FALSE /* Commenting this out pending rebalancing of radiation based on small objects. @@ -162,4 +177,4 @@ Commenting this out pending rebalancing of radiation based on small objects. TemperatureAct(150) else return ..() -*/ \ No newline at end of file +*/ diff --git a/code/game/objects/items/weapons/material/whetstone.dm b/code/game/objects/items/weapons/material/whetstone.dm index e312680d1b..628f450e3d 100644 --- a/code/game/objects/items/weapons/material/whetstone.dm +++ b/code/game/objects/items/weapons/material/whetstone.dm @@ -8,4 +8,69 @@ force = 3 w_class = ITEMSIZE_SMALL var/repair_amount = 5 - var/repair_time = 40 \ No newline at end of file + var/repair_time = 40 + +/obj/item/weapon/whetstone/attackby(obj/item/I, mob/user) + if(istype(I, /obj/item/stack/material)) + var/obj/item/stack/material/M = I + if(M.amount >= 5) + to_chat(user, "You begin to refine the [src] with [M]...") + if(do_after(user, 70)) + M.use(5) + var/obj/item/SK + SK = new /obj/item/weapon/material/sharpeningkit(get_turf(user), M.material.name) + to_chat(user, "You sharpen and refine the [src] into \a [SK].") + qdel(src) + if(SK) + user.put_in_hands(SK) + else + to_chat(user, "You need 5 [src] to refine it into a sharpening kit.") + +/obj/item/weapon/material/sharpeningkit + name = "sharpening kit" + desc = "A refined, fine grit whetstone, useful for sharpening dull edges, polishing out dents, and, with extra material, replacing an edge." + icon = 'icons/obj/kitchen.dmi' + icon_state = "sharpener" + hitsound = 'sound/weapons/genhit3.ogg' + force_divisor = 0.7 + thrown_force_divisor = 1 + var/repair_amount = 5 + var/repair_time = 40 + var/sharpen_time = 100 + var/uses = 0 + +/obj/item/weapon/material/sharpeningkit/examine(mob/user, distance) + . = ..() + to_chat(user, "There [uses == 1 ? "is" : "are"] [uses] [material] [uses == 1 ? src.material.sheet_singular_name : src.material.sheet_plural_name] left for use.") +/obj/item/weapon/material/sharpeningkit/Initialize() + . = ..() + setrepair() + +/obj/item/weapon/material/sharpeningkit/proc/setrepair() + repair_amount = material.hardness * 0.1 + repair_time = material.weight * 0.5 + sharpen_time = material.weight * 3 + +/obj/item/weapon/material/sharpeningkit/attackby(obj/item/weapon/W, mob/user) + if(istype(W, /obj/item/stack/material)) + var/obj/item/stack/material/S = W + if(S.material == material) + S.use(1) + uses += 1 + to_chat(user, "You add a [S.material.name] [S.material.sheet_singular_name] to [src].") + return + + if(istype(W, /obj/item/weapon/material)) + if(istype(W, /obj/item/weapon/material/sharpeningkit)) + to_chat(user, "Really? Sharpening a [W] with [src]? You goofball.") + return + var/obj/item/weapon/material/M = W + if(uses >= M.w_class*2) + if(M.sharpen(src.material.name, sharpen_time, src, user)) + uses -= M.w_class*2 + return + else + to_chat(user, "Not enough material to sharpen [M]. You need [M.w_class*2] [M.material.sheet_plural_name].") + return + else + to_chat(user, "You can't sharpen [W] with [src]!") diff --git a/code/game/objects/items/weapons/melee/energy.dm b/code/game/objects/items/weapons/melee/energy.dm index d935d4eaa2..2c4fd9949b 100644 --- a/code/game/objects/items/weapons/melee/energy.dm +++ b/code/game/objects/items/weapons/melee/energy.dm @@ -11,17 +11,26 @@ var/lrange = 2 var/lpower = 2 var/lcolor = "#0099FF" - + var/colorable = FALSE + var/rainbow = FALSE // If it uses energy. var/use_cell = FALSE var/hitcost = 120 var/obj/item/weapon/cell/bcell = null var/cell_type = /obj/item/weapon/cell/device + item_icons = list( + slot_l_hand_str = 'icons/mob/items/lefthand_melee.dmi', + slot_r_hand_str = 'icons/mob/items/righthand_melee.dmi', + ) /obj/item/weapon/melee/energy/proc/activate(mob/living/user) if(active) return active = 1 + if(rainbow) + item_state = "[icon_state]_blade_rainbow" + else + item_state = "[icon_state]_blade" embed_chance = active_embed_chance force = active_force throwforce = active_throwforce @@ -29,12 +38,14 @@ edge = 1 w_class = active_w_class playsound(user, 'sound/weapons/saberon.ogg', 50, 1) + update_icon() set_light(lrange, lpower, lcolor) /obj/item/weapon/melee/energy/proc/deactivate(mob/living/user) if(!active) return playsound(user, 'sound/weapons/saberoff.ogg', 50, 1) + item_state = "[icon_state]" active = 0 embed_chance = initial(embed_chance) force = initial(force) @@ -42,6 +53,7 @@ sharp = initial(sharp) edge = initial(edge) w_class = initial(w_class) + update_icon() set_light(0,0) /obj/item/weapon/melee/energy/proc/use_charge(var/cost) @@ -102,6 +114,13 @@ return ..() /obj/item/weapon/melee/energy/attackby(obj/item/weapon/W, mob/user) + if(istype(W, /obj/item/device/multitool) && colorable && !active) + if(!rainbow) + rainbow = TRUE + else + rainbow = FALSE + to_chat(user, "You manipulate the color controller in [src].") + update_icon() if(use_cell) if(istype(W, cell_type)) if(!bcell) @@ -125,13 +144,52 @@ /obj/item/weapon/melee/energy/get_cell() return bcell +/obj/item/weapon/melee/energy/update_icon() + . = ..() + var/mutable_appearance/blade_overlay = mutable_appearance(icon, "[icon_state]_blade") + if(colorable) + blade_overlay.color = lcolor + if(rainbow || !colorable) + blade_overlay = mutable_appearance(icon, "[icon_state]_blade_rainbow") + blade_overlay.color = "FFFFFF" + cut_overlays() //So that it doesn't keep stacking overlays non-stop on top of each other + if(active) + add_overlay(blade_overlay) + if(istype(usr,/mob/living/carbon/human)) + var/mob/living/carbon/human/H = usr + H.update_inv_l_hand() + H.update_inv_r_hand() + + + + +/obj/item/weapon/melee/energy/AltClick(mob/living/user) + if(!colorable) //checks if is not colorable + return + if(!in_range(src, user)) //Basic checks to prevent abuse + return + if(user.incapacitated() || !istype(user)) + to_chat(user, "You can't do that right now!") + return + + if(alert("Are you sure you want to recolor your blade?", "Confirm Recolor", "Yes", "No") == "Yes") + var/energy_color_input = input(usr,"","Choose Energy Color",lcolor) as color|null + if(energy_color_input) + lcolor = sanitize_hexcolor(energy_color_input) + update_icon() + +/obj/item/weapon/melee/energy/examine(mob/user) + ..() + to_chat(user, "Alt-click to recolor it.") + /* * Energy Axe */ /obj/item/weapon/melee/energy/axe name = "energy axe" desc = "An energised battle axe." - icon_state = "axe0" + icon_state = "eaxe" + item_state = "eaxe" //active_force = 150 //holy... active_force = 60 active_throwforce = 35 @@ -152,13 +210,11 @@ /obj/item/weapon/melee/energy/axe/activate(mob/living/user) ..() damtype = SEARING - icon_state = "axe1" to_chat(user, "\The [src] is now energised.") /obj/item/weapon/melee/energy/axe/deactivate(mob/living/user) ..() damtype = BRUTE - icon_state = initial(icon_state) to_chat(user, "\The [src] is de-energised. It's just a regular axe now.") /obj/item/weapon/melee/energy/axe/suicide_act(mob/user) @@ -187,7 +243,8 @@ color name = "energy sword" desc = "May the force be within you." - icon_state = "sword0" + icon_state = "esword" + item_state = "esword" active_force = 30 active_throwforce = 20 active_w_class = ITEMSIZE_LARGE @@ -200,9 +257,8 @@ origin_tech = list(TECH_MAGNET = 3, TECH_ILLEGAL = 4) sharp = 1 edge = 1 - var/blade_color - var/random_color = TRUE - var/active_state = "sword" + colorable = TRUE + projectile_parry_chance = 65 @@ -211,30 +267,6 @@ if(!istype(loc,/mob)) deactivate(user) -/obj/item/weapon/melee/energy/sword/New() - if(random_color) - blade_color = pick("red","blue","green","purple","white") - lcolor = blade_color - -/obj/item/weapon/melee/energy/sword/green/New() - blade_color = "green" - lcolor = "#008000" - -/obj/item/weapon/melee/energy/sword/red/New() - blade_color = "red" - lcolor = "#FF0000" - -/obj/item/weapon/melee/energy/sword/blue/New() - blade_color = "blue" - lcolor = "#0000FF" - -/obj/item/weapon/melee/energy/sword/purple/New() - blade_color = "purple" - lcolor = "#800080" - -/obj/item/weapon/melee/energy/sword/white/New() - blade_color = "white" - lcolor = "#FFFFFF" /obj/item/weapon/melee/energy/sword/activate(mob/living/user) if(!active) @@ -242,14 +274,13 @@ ..() attack_verb = list("attacked", "slashed", "stabbed", "sliced", "torn", "ripped", "diced", "cut") - icon_state = "[active_state][blade_color]" + /obj/item/weapon/melee/energy/sword/deactivate(mob/living/user) if(active) to_chat(user, "\The [src] deactivates!") ..() attack_verb = list() - icon_state = initial(icon_state) /obj/item/weapon/melee/energy/sword/handle_shield(mob/user, var/damage, atom/damage_source = null, mob/attacker = null, var/def_zone = null, var/attack_text = "the attack") if(active && default_parry_check(user, attacker, damage_source) && prob(60)) @@ -284,11 +315,10 @@ /obj/item/weapon/melee/energy/sword/pirate name = "energy cutlass" desc = "Arrrr matey." - icon_state = "cutlass0" + icon_state = "cutlass" + item_state = "cutlass" + colorable = TRUE -/obj/item/weapon/melee/energy/sword/pirate/activate(mob/living/user) - ..() - icon_state = "cutlass1" /* *Ionic Rapier @@ -300,8 +330,8 @@ description_info = "This is a dangerous melee weapon that will deliver a moderately powerful electromagnetic pulse to whatever it strikes. \ Striking a lesser robotic entity will compel it to attack you, as well. It also does extra burn damage to robotic entities, but it does \ very little damage to purely organic targets." - icon_state = "ionic_rapier0" - random_color = FALSE + icon_state = "ionrapier" + item_state = "ionrapier" active_force = 5 active_throwforce = 3 active_embed_chance = 0 @@ -312,7 +342,6 @@ lrange = 2 lpower = 2 lcolor = "#0000FF" - active_state = "ionic_rapier" projectile_parry_chance = 30 // It's not specifically designed for cutting and slashing, but it can still, maybe, save your life. /obj/item/weapon/melee/energy/sword/ionic_rapier/afterattack(var/atom/movable/AM, var/mob/living/user, var/proximity) @@ -350,6 +379,7 @@ active_force = 25 armor_penetration = 25 projectile_parry_chance = 40 + colorable = TRUE hitcost = 75 @@ -357,15 +387,14 @@ ..() bcell = new/obj/item/weapon/cell/device/weapon(src) -/* - *Energy Blade - */ +//Energy Blade (ninja uses this) //Can't be activated or deactivated, so no reason to be a subtype of energy /obj/item/weapon/melee/energy/blade name = "energy blade" desc = "A concentrated beam of energy in the shape of a blade. Very stylish... and lethal." icon_state = "blade" + item_state = "blade" force = 40 //Normal attacks deal very high damage - about the same as wielded fire axe armor_penetration = 100 sharp = 1 @@ -448,49 +477,27 @@ return 1 -/* - *Energy Spear - */ +//Energy Spear /obj/item/weapon/melee/energy/spear - name = "energy spear" - desc = "Concentrated energy forming a sharp tip at the end of a long rod." - icon_state = "espear0" - armor_penetration = 75 - sharp = 1 - edge = 1 - force = 5 - throwforce = 10 - throw_speed = 7 - throw_range = 11 - reach = 2 - w_class = ITEMSIZE_LARGE - active_force = 25 - active_throwforce = 30 - active_w_class = ITEMSIZE_HUGE - var/random_color = TRUE - var/tip_color = "" - var/active_state = "espear" + name = "energy spear" + desc = "Concentrated energy forming a sharp tip at the end of a long rod." + icon_state = "espear" + armor_penetration = 75 + sharp = 1 + edge = 1 + force = 5 + throwforce = 10 + throw_speed = 7 + throw_range = 11 + reach = 2 + w_class = ITEMSIZE_LARGE + active_force = 25 + active_throwforce = 30 + active_w_class = ITEMSIZE_HUGE + colorable = TRUE -/obj/item/weapon/melee/energy/spear/New() - if(random_color) - tip_color = pick("red","blue","green","purple") - lcolor = tip_color -/obj/item/weapon/melee/energy/spear/green/New() - tip_color = "green" - lcolor = "#008000" - -/obj/item/weapon/melee/energy/spear/red/New() - tip_color = "red" - lcolor = "#FF0000" - -/obj/item/weapon/melee/energy/spear/blue/New() - tip_color = "blue" - lcolor = "#0000FF" - -/obj/item/weapon/melee/energy/spear/purple/New() - tip_color = "purple" lcolor = "#800080" /obj/item/weapon/melee/energy/spear/activate(mob/living/user) @@ -498,7 +505,6 @@ to_chat(user, "\The [src] is now energised.") ..() attack_verb = list("jabbed", "stabbed", "impaled") - icon_state = "[active_state]-[tip_color]" /obj/item/weapon/melee/energy/spear/deactivate(mob/living/user) @@ -506,7 +512,6 @@ to_chat(user, "\The [src] deactivates!") ..() attack_verb = list("whacked", "beat", "slapped", "thonked") - icon_state = "espear0" /obj/item/weapon/melee/energy/spear/handle_shield(mob/user, var/damage, atom/damage_source = null, mob/attacker = null, var/def_zone = null, var/attack_text = "the attack") if(active && default_parry_check(user, attacker, damage_source) && prob(50)) @@ -516,4 +521,4 @@ spark_system.start() playsound(user.loc, 'sound/weapons/blade1.ogg', 50, 1) return 1 - return 0 \ No newline at end of file + return 0 diff --git a/code/game/objects/items/weapons/shields.dm b/code/game/objects/items/weapons/shields.dm index 5ea586f43d..6d3310cdc4 100644 --- a/code/game/objects/items/weapons/shields.dm +++ b/code/game/objects/items/weapons/shields.dm @@ -115,7 +115,8 @@ name = "energy combat shield" desc = "A shield capable of stopping most projectile and melee attacks. It can be retracted, expanded, and stored anywhere." icon = 'icons/obj/weapons.dmi' - icon_state = "eshield0" // eshield1 for expanded + icon_state = "eshield" + item_state = "eshield" slot_flags = SLOT_EARS flags = NOCONDUCT force = 3.0 @@ -123,9 +124,16 @@ throw_speed = 1 throw_range = 4 w_class = ITEMSIZE_SMALL + var/lrange = 1.5 + var/lpower = 1.5 + var/lcolor = "#006AFF" origin_tech = list(TECH_MATERIAL = 4, TECH_MAGNET = 3, TECH_ILLEGAL = 4) attack_verb = list("shoved", "bashed") var/active = 0 + item_icons = list( + slot_l_hand_str = 'icons/mob/items/lefthand_melee.dmi', + slot_r_hand_str = 'icons/mob/items/righthand_melee.dmi', + ) /obj/item/weapon/shield/energy/handle_shield(mob/user) if(!active) @@ -175,11 +183,33 @@ return /obj/item/weapon/shield/energy/update_icon() - icon_state = "eshield[active]" + var/mutable_appearance/blade_overlay = mutable_appearance(icon, "[icon_state]_blade") + if(lcolor) + blade_overlay.color = lcolor + cut_overlays() //So that it doesn't keep stacking overlays non-stop on top of each other if(active) - set_light(1.5, 1.5, "#006AFF") + add_overlay(blade_overlay) + item_state = "[icon_state]_blade" + set_light(lrange, lpower, lcolor) else set_light(0) + item_state = "[icon_state]" + +/obj/item/weapon/shield/energy/AltClick(mob/living/user) + if(!in_range(src, user)) //Basic checks to prevent abuse + return + if(user.incapacitated() || !istype(user)) + to_chat(user, "You can't do that right now!") + return + if(alert("Are you sure you want to recolor your shield?", "Confirm Recolor", "Yes", "No") == "Yes") + var/energy_color_input = input(usr,"","Choose Energy Color",lcolor) as color|null + if(energy_color_input) + lcolor = sanitize_hexcolor(energy_color_input, desired_format=6, include_crunch=1) + update_icon() + +/obj/item/weapon/shield/energy/examine(mob/user) + ..() + to_chat(user, "Alt-click to recolor it.") /obj/item/weapon/shield/riot/tele name = "telescopic shield" @@ -226,4 +256,4 @@ H.update_inv_r_hand() add_fingerprint(user) - return \ No newline at end of file + return diff --git a/code/game/objects/structures/girders.dm b/code/game/objects/structures/girders.dm index 2648723385..aab0ecf7f0 100644 --- a/code/game/objects/structures/girders.dm +++ b/code/game/objects/structures/girders.dm @@ -62,7 +62,7 @@ /obj/structure/girder/update_icon() if(anchored) - icon_state = "girder" + icon_state = initial(icon_state) else icon_state = "displaced" @@ -320,6 +320,7 @@ name = "column" icon= 'icons/obj/cult.dmi' icon_state= "cultgirder" + max_health = 250 health = 250 cover = 70 girder_material = "cult" @@ -354,6 +355,13 @@ new /obj/effect/decal/remains/human(get_turf(src)) dismantle() +/obj/structure/girder/resin + name = "soft girder" + icon_state = "girder_resin" + max_health = 225 + health = 225 + cover = 60 + girder_material = "resin" /obj/structure/girder/rcd_values(mob/living/user, obj/item/weapon/rcd/the_rcd, passed_mode) var/turf/simulated/T = get_turf(src) diff --git a/code/game/turfs/simulated/wall_attacks.dm b/code/game/turfs/simulated/wall_attacks.dm index 8599def4a5..676ad392f0 100644 --- a/code/game/turfs/simulated/wall_attacks.dm +++ b/code/game/turfs/simulated/wall_attacks.dm @@ -93,8 +93,9 @@ if(..()) return 1 if(!can_open) - to_chat(user, "You push the wall, but nothing happens.") - playsound(src, 'sound/weapons/Genhit.ogg', 25, 1) + if(!material.wall_touch_special(src, user)) + to_chat(user, "You push the wall, but nothing happens.") + playsound(src, 'sound/weapons/Genhit.ogg', 25, 1) else toggle_open(user) return 0 diff --git a/code/game/turfs/simulated/wall_types.dm b/code/game/turfs/simulated/wall_types.dm index 37bf0d7541..bff82d6e0e 100644 --- a/code/game/turfs/simulated/wall_types.dm +++ b/code/game/turfs/simulated/wall_types.dm @@ -59,6 +59,9 @@ /turf/simulated/wall/snowbrick/New(var/newloc) ..(newloc,"packed snow") +/turf/simulated/wall/resin/New(var/newloc) + ..(newloc,"resin",null,"resin") + // Kind of wondering if this is going to bite me in the butt. /turf/simulated/wall/skipjack/New(var/newloc) ..(newloc,"alienalloy") diff --git a/code/modules/admin/admin_investigate.dm b/code/modules/admin/admin_investigate.dm index 1c90383f40..12a84346b3 100644 --- a/code/modules/admin/admin_investigate.dm +++ b/code/modules/admin/admin_investigate.dm @@ -34,7 +34,7 @@ if("singulo", "telesci") //general one-round-only stuff var/F = investigate_subject2file(subject) if(!F) - src << "Error: admin_investigate: [INVESTIGATE_DIR][subject] is an invalid path or cannot be accessed." + to_chat(src, "Error: admin_investigate: [INVESTIGATE_DIR][subject] is an invalid path or cannot be accessed.") return src << browse(F,"window=investigate[subject];size=800x300") @@ -43,8 +43,8 @@ if(href_logfile) src << browse(href_logfile,"window=investigate[subject];size=800x300") else - src << "Error: admin_investigate: No href logfile found." + to_chat(src, "Error: admin_investigate: No href logfile found.") return else - src << "Error: admin_investigate: Href Logging is not on." + to_chat(src, "Error: admin_investigate: Href Logging is not on.") return diff --git a/code/modules/admin/admin_memo.dm b/code/modules/admin/admin_memo.dm index 4bcaf10d9c..24ecba7c01 100644 --- a/code/modules/admin/admin_memo.dm +++ b/code/modules/admin/admin_memo.dm @@ -22,7 +22,7 @@ return if("") F.dir.Remove(ckey) - src << "Memo removed" + to_chat(src, "Memo removed") return if( findtext(memo,"Admin Memo by [F[ckey]]" + to_chat(src, "
Admin Memo by [F[ckey]]
") //delete your own or somebody else's memo /client/proc/admin_memo_delete() @@ -48,7 +48,7 @@ ckey = src.ckey if(ckey) F.dir.Remove(ckey) - src << "Removed Memo created by [ckey]." + to_chat(src, "Removed Memo created by [ckey].") #undef MEMOFILE #undef ENABLE_MEMOS \ No newline at end of file diff --git a/code/modules/admin/ckey_vr.dm b/code/modules/admin/ckey_vr.dm index 90463eafcc..a46a4cdc07 100644 --- a/code/modules/admin/ckey_vr.dm +++ b/code/modules/admin/ckey_vr.dm @@ -4,7 +4,7 @@ set name = "Set CKey" set desc = "Mob to teleport" if(!src.holder) - src << "Only administrators may use this command." + to_chat(src, "Only administrators may use this command.") return var/list/keys = list() diff --git a/code/modules/admin/topic.dm b/code/modules/admin/topic.dm index ca971c9b65..8a3022f989 100644 --- a/code/modules/admin/topic.dm +++ b/code/modules/admin/topic.dm @@ -1896,7 +1896,7 @@ else if(href_list["cryoplayer"]) if(!check_rights(R_ADMIN)) return - var/mob/M = locate(href_list["cryoplayer"]) + var/mob/living/carbon/M = locate(href_list["cryoplayer"]) //VOREStation edit from just an all mob check to mob/living/carbon if(!istype(M)) to_chat(usr,"Mob doesn't exist!") return diff --git a/code/modules/admin/verbs/custom_event.dm b/code/modules/admin/verbs/custom_event.dm index 35931f8e54..987eb89c29 100644 --- a/code/modules/admin/verbs/custom_event.dm +++ b/code/modules/admin/verbs/custom_event.dm @@ -4,7 +4,7 @@ set name = "Change Custom Event" if(!holder) - src << "Only administrators may use this command." + to_chat(src, "Only administrators may use this command.") return var/input = sanitize(input(usr, "Enter the description of the custom event. Be descriptive. To cancel the event, make this blank or hit cancel.", "Custom Event", custom_event_msg) as message|null, MAX_PAPER_MESSAGE_LEN, extra = 0) @@ -30,11 +30,11 @@ set name = "Custom Event Info" if(!custom_event_msg || custom_event_msg == "") - src << "There currently is no known custom event taking place." - src << "Keep in mind: it is possible that an admin has not properly set this." + to_chat(src, "There currently is no known custom event taking place.") + to_chat(src, "Keep in mind: it is possible that an admin has not properly set this.") return - src << "

Custom Event

" - src << "

A custom event is taking place. OOC Info:

" - src << "[custom_event_msg]" - src << "
" + to_chat(src, "

Custom Event

") + to_chat(src, "

A custom event is taking place. OOC Info:

") + to_chat(src, "[custom_event_msg]") + to_chat(src, "
") diff --git a/code/modules/admin/verbs/getlogs.dm b/code/modules/admin/verbs/getlogs.dm index 9e9ad67027..7215c8dd32 100644 --- a/code/modules/admin/verbs/getlogs.dm +++ b/code/modules/admin/verbs/getlogs.dm @@ -24,12 +24,12 @@ set category = null if(!src.holder) - src << "Only Admins may use this command." + to_chat(src, "Only Admins may use this command.") return var/client/target = input(src,"Choose somebody to grant access to the server's runtime logs (permissions expire at the end of each round):","Grant Permissions",null) as null|anything in GLOB.clients if(!istype(target,/client)) - src << "Error: giveruntimelog(): Client not found." + to_chat(src, "Error: giveruntimelog(): Client not found.") return target.verbs |= /client/proc/getruntimelog @@ -53,7 +53,7 @@ message_admins("[key_name_admin(src)] accessed file: [path]") src << run( file(path) ) - src << "Attempting to send file, this may take a fair few minutes if the file is very large." + to_chat(src, "Attempting to send file, this may take a fair few minutes if the file is very large.") return @@ -73,7 +73,7 @@ message_admins("[key_name_admin(src)] accessed file: [path]") src << run( file(path) ) - src << "Attempting to send file, this may take a fair few minutes if the file is very large." + to_chat(src, "Attempting to send file, this may take a fair few minutes if the file is very large.") return @@ -89,7 +89,7 @@ if( fexists(path) ) src << run( file(path) ) else - src << "Error: view_txt_log(): File not found/Invalid path([path])." + to_chat(src, "Error: view_txt_log(): File not found/Invalid path([path]).") return feedback_add_details("admin_verb","VTL") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! return @@ -107,7 +107,7 @@ if( fexists(path) ) src << run( file(path) ) else - src << "Error: view_atk_log(): File not found/Invalid path([path])." + to_chat(src, "Error: view_atk_log(): File not found/Invalid path([path]).") return usr << run( file(path) ) feedback_add_details("admin_verb","SSAL") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! diff --git a/code/modules/admin/view_variables/topic.dm b/code/modules/admin/view_variables/topic.dm index ce2c684c09..8d547b76e1 100644 --- a/code/modules/admin/view_variables/topic.dm +++ b/code/modules/admin/view_variables/topic.dm @@ -359,13 +359,14 @@ var/list/possibleverbs = list() possibleverbs += "Cancel" // One for the top... possibleverbs += typesof(/mob/proc,/mob/verb,/mob/living/proc,/mob/living/verb) - switch(H.type) - if(/mob/living/carbon/human) - possibleverbs += typesof(/mob/living/carbon/proc,/mob/living/carbon/verb,/mob/living/carbon/human/verb,/mob/living/carbon/human/proc) - if(/mob/living/silicon/robot) - possibleverbs += typesof(/mob/living/silicon/proc,/mob/living/silicon/robot/proc,/mob/living/silicon/robot/verb) - if(/mob/living/silicon/ai) - possibleverbs += typesof(/mob/living/silicon/proc,/mob/living/silicon/ai/proc,/mob/living/silicon/ai/verb) + if(istype(H,/mob/living/carbon/human)) + possibleverbs += typesof(/mob/living/carbon/proc,/mob/living/carbon/verb,/mob/living/carbon/human/verb,/mob/living/carbon/human/proc) + if(istype(H,/mob/living/silicon/robot)) + possibleverbs += typesof(/mob/living/silicon/proc,/mob/living/silicon/robot/proc,/mob/living/silicon/robot/verb) + if(istype(H,/mob/living/silicon/ai)) + possibleverbs += typesof(/mob/living/silicon/proc,/mob/living/silicon/ai/proc,/mob/living/silicon/ai/verb) + if(istype(H,/mob/living/simple_mob)) + possibleverbs += typesof(/mob/living/simple_mob/proc,/mob/living/simple_mob/verb) //VOREStation edit, Apparently polaris simplemobs have no verbs at all. possibleverbs -= H.verbs possibleverbs += "Cancel" // ...And one for the bottom diff --git a/code/modules/ai/ai_holder_disabled.dm b/code/modules/ai/ai_holder_disabled.dm index 8b296b2d10..dc3717fe18 100644 --- a/code/modules/ai/ai_holder_disabled.dm +++ b/code/modules/ai/ai_holder_disabled.dm @@ -5,6 +5,9 @@ // If our holder is able to do anything. /datum/ai_holder/proc/can_act() + if(!holder) // Holder missing. + SSai.processing -= src + return FALSE if(holder.stat) // Dead or unconscious. ai_log("can_act() : Stat was non-zero ([holder.stat]).", AI_LOG_TRACE) return FALSE @@ -95,4 +98,4 @@ holder.IMove(get_step(holder,moving_to)) wander_delay = base_wander_delay ai_log("handle_wander_movement() : Exited.", AI_LOG_DEBUG) -*/ \ No newline at end of file +*/ diff --git a/code/modules/ai/ai_holder_movement.dm b/code/modules/ai/ai_holder_movement.dm index 55a1098b90..58b8c9d5ee 100644 --- a/code/modules/ai/ai_holder_movement.dm +++ b/code/modules/ai/ai_holder_movement.dm @@ -142,7 +142,7 @@ if(isturf(holder.loc) && can_act()) wander_delay-- if(wander_delay <= 0) - if(!wander_when_pulled && holder.pulledby) + if(!wander_when_pulled && (holder.pulledby || holder.grabbed_by.len)) ai_log("handle_wander_movement() : Being pulled and cannot wander. Exiting.", AI_LOG_DEBUG) return diff --git a/code/modules/client/client procs.dm b/code/modules/client/client procs.dm index e13573e305..7321e96a23 100644 --- a/code/modules/client/client procs.dm +++ b/code/modules/client/client procs.dm @@ -77,13 +77,13 @@ //This stops files larger than UPLOAD_LIMIT being sent from client to server via input(), client.Import() etc. /client/AllowUpload(filename, filelength) if(filelength > UPLOAD_LIMIT) - src << "Error: AllowUpload(): File Upload too large. Upload Limit: [UPLOAD_LIMIT/1024]KiB." + to_chat(src, "Error: AllowUpload(): File Upload too large. Upload Limit: [UPLOAD_LIMIT/1024]KiB.") return 0 /* //Don't need this at the moment. But it's here if it's needed later. //Helps prevent multiple files being uploaded at once. Or right after eachother. var/time_to_wait = fileaccess_timer - world.time if(time_to_wait > 0) - src << "Error: AllowUpload(): Spam prevention. Please wait [round(time_to_wait/10)] seconds." + to_chat(src, "Error: AllowUpload(): Spam prevention. Please wait [round(time_to_wait/10)] seconds.") return 0 fileaccess_timer = world.time + FTPDELAY */ return 1 @@ -105,7 +105,7 @@ del(src) return - src << "If the title screen is black, resources are still downloading. Please be patient until the title screen appears." + to_chat(src, "If the title screen is black, resources are still downloading. Please be patient until the title screen appears.") GLOB.clients += src @@ -131,10 +131,10 @@ prefs.sanitize_preferences() if(custom_event_msg && custom_event_msg != "") - src << "

Custom Event

" - src << "

A custom event is taking place. OOC Info:

" - src << "[custom_event_msg]" - src << "
" + to_chat(src, "

Custom Event

") + to_chat(src, "

A custom event is taking place. OOC Info:

") + to_chat(src, "[custom_event_msg]") + to_chat(src, "
") if(holder) @@ -160,7 +160,7 @@ screen += void if(prefs.lastchangelog != changelog_hash) //bolds the changelog button on the interface so we know there are updates. - src << "You have unread updates in the changelog." + to_chat(src, "You have unread updates in the changelog.") winset(src, "rpane.changelog", "background-color=#eaeaea;font-style=bold") if(config.aggressive_changelog) src.changes() diff --git a/code/modules/client/preference_setup/global/setting_datums.dm b/code/modules/client/preference_setup/global/setting_datums.dm index 063150f69d..ac1a203e4b 100644 --- a/code/modules/client/preference_setup/global/setting_datums.dm +++ b/code/modules/client/preference_setup/global/setting_datums.dm @@ -135,6 +135,12 @@ var/list/_client_preferences_by_type enabled_description = "Show" disabled_description = "Hide" +/datum/client_preference/air_pump_noise + description ="Air Pump Ambient Noise" + key = "SOUND_AIRPUMP" + enabled_description = "Audible" + disabled_description = "Silent" + /datum/client_preference/mob_tooltips description ="Mob tooltips" key = "MOB_TOOLTIPS" diff --git a/code/modules/client/preference_setup/loadout/loadout.dm b/code/modules/client/preference_setup/loadout/loadout.dm index a5e6024653..c2e1dc52a1 100644 --- a/code/modules/client/preference_setup/loadout/loadout.dm +++ b/code/modules/client/preference_setup/loadout/loadout.dm @@ -271,4 +271,7 @@ var/list/gear_datums = list() var/item = new gd.path(gd.location) for(var/datum/gear_tweak/gt in gear_tweaks) gt.tweak_item(item, metadata["[gt]"]) + var/mob/M = location + if(istype(M) && exploitable) //Update exploitable info records for the mob without creating a duplicate object at their feet. + M.amend_exploitable(item) return item diff --git a/code/modules/client/preference_setup/loadout/loadout_utility.dm b/code/modules/client/preference_setup/loadout/loadout_utility.dm index 44e0bc10ff..40fe71a087 100644 --- a/code/modules/client/preference_setup/loadout/loadout_utility.dm +++ b/code/modules/client/preference_setup/loadout/loadout_utility.dm @@ -127,7 +127,7 @@ /datum/gear/utility/implant/neural display_name = "implant, neural assistance web" description = "A complex web implanted into the subject, medically in order to compensate for neurological disease." - path = /obj/item/weapon/implant/neural/roundstart + path = /obj/item/weapon/implant/neural cost = 6 /datum/gear/utility/implant/dud1 diff --git a/code/modules/client/preferences_toggle_procs.dm b/code/modules/client/preferences_toggle_procs.dm index 73086e81f4..d016029b23 100644 --- a/code/modules/client/preferences_toggle_procs.dm +++ b/code/modules/client/preferences_toggle_procs.dm @@ -224,6 +224,21 @@ feedback_add_details("admin_verb","TBeSpecial") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! +/client/verb/toggle_air_pump_hum() + set name = "Toggle Air Pump Noise" + set category = "Preferences" + set desc = "Toggles Air Pumps humming" + + var/pref_path = /datum/client_preference/air_pump_noise + + toggle_preference(pref_path) + + to_chat(src, "You will [ (is_preference_enabled(pref_path)) ? "now" : "no longer"] hear air pumps hum, start, and stop.") + + SScharacter_setup.queue_preferences_save(prefs) + + feedback_add_details("admin_verb","TAirPumpNoise") + /client/verb/toggle_safe_firing() set name = "Toggle Gun Firing Intent Requirement" set category = "Preferences" diff --git a/code/modules/flufftext/Dreaming.dm b/code/modules/flufftext/Dreaming.dm index 964ea8dbed..911931eda3 100644 --- a/code/modules/flufftext/Dreaming.dm +++ b/code/modules/flufftext/Dreaming.dm @@ -23,7 +23,7 @@ mob/living/carbon/proc/dream() spawn(0) for(var/i = rand(1,4),i > 0, i--) - src << "... [pick(dreams)] ..." + to_chat(src, "... [pick(dreams)] ...") sleep(rand(40,70)) if(paralysis <= 0) dreaming = 0 diff --git a/code/modules/flufftext/Hallucination.dm b/code/modules/flufftext/Hallucination.dm index f70873f226..cdd497c016 100644 --- a/code/modules/flufftext/Hallucination.dm +++ b/code/modules/flufftext/Hallucination.dm @@ -28,13 +28,13 @@ mob/living/carbon/proc/handle_hallucinations() switch(halpick) if(0 to 15) //Screwy HUD - //src << "Screwy HUD" + //to_chat(src, "Screwy HUD") hal_screwyhud = pick(1,2,3,3,4,4) spawn(rand(100,250)) hal_screwyhud = 0 if(16 to 25) //Strange items - //src << "Traitor Items" + //to_chat(src, "Traitor Items") if(!halitem) halitem = new var/list/slots_free = list(ui_lhand,ui_rhand) @@ -82,7 +82,7 @@ mob/living/carbon/proc/handle_hallucinations() halitem = null if(26 to 40) //Flashes of danger - //src << "Danger Flash" + //to_chat(src, "Danger Flash") if(!halimage) var/list/possible_points = list() for(var/turf/simulated/floor/F in view(src,world.view)) @@ -92,13 +92,13 @@ mob/living/carbon/proc/handle_hallucinations() switch(rand(1,3)) if(1) - //src << "Space" + //to_chat(src, "Space") halimage = image('icons/turf/space.dmi',target,"[rand(1,25)]",TURF_LAYER) if(2) - //src << "Fire" + //to_chat(src, "Fire") halimage = image('icons/effects/fire.dmi',target,"1",TURF_LAYER) if(3) - //src << "C4" + //to_chat(src, "C4") halimage = image('icons/obj/assemblies.dmi',target,"plastic-explosive2",OBJ_LAYER+0.01) @@ -110,7 +110,7 @@ mob/living/carbon/proc/handle_hallucinations() if(41 to 65) //Strange audio - //src << "Strange Audio" + //to_chat(src, "Strange Audio") switch(rand(1,12)) if(1) src << 'sound/machines/airlock.ogg' if(2) @@ -144,7 +144,7 @@ mob/living/carbon/proc/handle_hallucinations() src << pick(creepyasssounds) if(66 to 70) //Flashes of danger - //src << "Danger Flash" + //to_chat(src, "Danger Flash") if(!halbody) var/list/possible_points = list() for(var/turf/simulated/floor/F in view(src,world.view)) diff --git a/code/modules/food/recipe_dump.dm b/code/modules/food/recipe_dump.dm index a458a568cf..781ef7fc2f 100644 --- a/code/modules/food/recipe_dump.dm +++ b/code/modules/food/recipe_dump.dm @@ -214,4 +214,4 @@ html += "" src << browse(html, "window=recipes;file=recipes_drinks.html;display=0") - src << "In your byond cache, recipe-xxx.png files and recipes_drinks.html and recipes_food.html now exist. Place recipe-xxx.png files in a subfolder named 'imgrecipes' wherever you put them. The file will take a food.css or drinks.css file if in the same path." + to_chat(src, "In your byond cache, recipe-xxx.png files and recipes_drinks.html and recipes_food.html now exist. Place recipe-xxx.png files in a subfolder named 'imgrecipes' wherever you put them. The file will take a food.css or drinks.css file if in the same path.") diff --git a/code/modules/hydroponics/grown.dm b/code/modules/hydroponics/grown.dm index 81018de61c..303deb06e1 100644 --- a/code/modules/hydroponics/grown.dm +++ b/code/modules/hydroponics/grown.dm @@ -49,6 +49,9 @@ potency = seed.get_trait(TRAIT_POTENCY) +/obj/item/weapon/reagent_containers/food/snacks/grown/Initialize() + ..() + for(var/rid in seed.chems) var/list/reagent_data = seed.chems[rid] if(reagent_data && reagent_data.len) diff --git a/code/modules/materials/material_recipes.dm b/code/modules/materials/material_recipes.dm index 48cbf116c4..d141f1c7af 100644 --- a/code/modules/materials/material_recipes.dm +++ b/code/modules/materials/material_recipes.dm @@ -225,3 +225,14 @@ recipes += new/datum/stack_recipe("baggy pants", /obj/item/clothing/under/pants/baggy/white, 8, time = 10 SECONDS, pass_stack_color = TRUE) recipes += new/datum/stack_recipe("belt pouch", /obj/item/weapon/storage/belt/fannypack/white, 25, time = 1 MINUTE, pass_stack_color = TRUE) recipes += new/datum/stack_recipe("crude bandage", /obj/item/stack/medical/crude_pack, 1, time = 2 SECONDS, pass_stack_color = TRUE) + +/material/resin/generate_recipes() + recipes = list() + recipes += new/datum/stack_recipe("[display_name] door", /obj/structure/simple_door/resin, 10, one_per_turf = 1, on_floor = 1, supplied_material = "[name]", pass_stack_color = TRUE) + recipes += new/datum/stack_recipe("[display_name] barricade", /obj/effect/alien/resin/wall, 5, time = 5 SECONDS, one_per_turf = 1, on_floor = 1, pass_stack_color = TRUE) + recipes += new/datum/stack_recipe("[display_name] nest", /obj/structure/bed/nest, 2, one_per_turf = 1, on_floor = 1, supplied_material = "[name]", pass_stack_color = TRUE) + recipes += new/datum/stack_recipe("[display_name] wall girders", /obj/structure/girder/resin, 2, time = 5 SECONDS, one_per_turf = 1, on_floor = 1, supplied_material = "[name]", pass_stack_color = TRUE) + recipes += new/datum/stack_recipe("crude [display_name] bandage", /obj/item/stack/medical/crude_pack, 1, time = 2 SECONDS, pass_stack_color = TRUE) + recipes += new/datum/stack_recipe("[display_name] net", /obj/item/weapon/material/fishing_net, 10, time = 5 SECONDS, supplied_material = "[name]", pass_stack_color = TRUE) + recipes += new/datum/stack_recipe("[display_name] membrane", /obj/effect/alien/resin/membrane, 1, time = 2 SECONDS, pass_stack_color = TRUE) + recipes += new/datum/stack_recipe("[display_name] node", /obj/effect/alien/weeds/node, 1, time = 4 SECONDS) diff --git a/code/modules/materials/material_sheets.dm b/code/modules/materials/material_sheets.dm index 31a3447bf2..f6708481b5 100644 --- a/code/modules/materials/material_sheets.dm +++ b/code/modules/materials/material_sheets.dm @@ -371,6 +371,15 @@ pass_color = TRUE strict_color_stacking = TRUE +/obj/item/stack/material/resin + name = "resin" + icon_state = "sheet-resin" + default_type = "resin" + no_variants = TRUE + apply_colour = TRUE + pass_color = TRUE + strict_color_stacking = TRUE + /obj/item/stack/material/cardboard name = "cardboard" icon_state = "sheet-card" diff --git a/code/modules/materials/materials.dm b/code/modules/materials/materials.dm index 307b52bb90..724f4771f6 100644 --- a/code/modules/materials/materials.dm +++ b/code/modules/materials/materials.dm @@ -16,6 +16,7 @@ stone metal solid + resin ONLY WALLS cult hull @@ -240,6 +241,10 @@ var/list/name_to_material /material/proc/combustion_effect(var/turf/T, var/temperature) return +// Used by walls to do on-touch things, after checking for crumbling and open-ability. +/material/proc/wall_touch_special(var/turf/simulated/wall/W, var/mob/living/L) + return + // Datum definitions follow. /material/uranium name = "uranium" @@ -824,12 +829,18 @@ var/list/name_to_material /material/resin name = "resin" icon_colour = "#35343a" + icon_base = "resin" dooropen_noise = 'sound/effects/attackblob.ogg' door_icon_base = "resin" + icon_reinf = "reinf_mesh" melting_point = T0C+300 sheet_singular_name = "blob" sheet_plural_name = "blobs" conductive = 0 + explosion_resistance = 60 + radiation_resistance = 10 + stack_origin_tech = list(TECH_MATERIAL = 8, TECH_PHORON = 4, TECH_BLUESPACE = 4, TECH_BIO = 7) + stack_type = /obj/item/stack/material/resin /material/resin/can_open_material_door(var/mob/living/user) var/mob/living/carbon/M = user @@ -837,6 +848,17 @@ var/list/name_to_material return 1 return 0 +/material/resin/wall_touch_special(var/turf/simulated/wall/W, var/mob/living/L) + var/mob/living/carbon/M = L + if(istype(M) && locate(/obj/item/organ/internal/xenos/hivenode) in M.internal_organs) + to_chat(M, "\The [W] shudders under your touch, starting to become porous.") + playsound(W, 'sound/effects/attackblob.ogg', 50, 1) + if(do_after(L, 5 SECONDS)) + spawn(2) + playsound(W, 'sound/effects/attackblob.ogg', 100, 1) + W.dismantle_wall() + return 1 + return 0 /material/wood name = MAT_WOOD diff --git a/code/modules/mob/hear_say.dm b/code/modules/mob/hear_say.dm index 693b2129e1..f316797dc2 100644 --- a/code/modules/mob/hear_say.dm +++ b/code/modules/mob/hear_say.dm @@ -60,9 +60,9 @@ if(is_deaf()) if(!language || !(language.flags & INNATE)) // INNATE is the flag for audible-emote-language, so we don't want to show an "x talks but you cannot hear them" message if it's set if(speaker == src) - src << "You cannot hear yourself speak!" + to_chat(src, "You cannot hear yourself speak!") else - src << "[speaker_name][alt_name] talks but you cannot hear." + to_chat(src, "[speaker_name][alt_name] talks but you cannot hear.") else var/message_to_send = null if(language) @@ -251,7 +251,7 @@ if((sdisabilities & DEAF) || ear_deaf) if(prob(20)) - src << "You feel your headset vibrate but can hear nothing from it!" + to_chat(src, "You feel your headset vibrate but can hear nothing from it!") else on_hear_radio(part_a, speaker_name, track, part_b, formatted) diff --git a/code/modules/mob/holder.dm b/code/modules/mob/holder.dm index 25a6ed122a..00fe76086a 100644 --- a/code/modules/mob/holder.dm +++ b/code/modules/mob/holder.dm @@ -156,11 +156,11 @@ var/list/holder_mob_icon_cache = list() if(self_grab) grabber << "\The [src] clambers onto you!" - src << "You climb up onto \the [grabber]!" + to_chat(src, "You climb up onto \the [grabber]!") grabber.equip_to_slot_if_possible(H, slot_back, 0, 1) else grabber << "You scoop up \the [src]!" - src << "\The [grabber] scoops you up!" + to_chat(src, "\The [grabber] scoops you up!") H.sync(src) return H diff --git a/code/modules/mob/living/carbon/alien/diona/diona_powers.dm b/code/modules/mob/living/carbon/alien/diona/diona_powers.dm index aea0054418..8384a7dbb8 100644 --- a/code/modules/mob/living/carbon/alien/diona/diona_powers.dm +++ b/code/modules/mob/living/carbon/alien/diona/diona_powers.dm @@ -25,15 +25,15 @@ var/mob/living/M = input(src,"Who do you wish to merge with?") in null|choices if(!M) - src << "There is nothing nearby to merge with." + to_chat(src, "There is nothing nearby to merge with.") else if(!do_merge(M)) - src << "You fail to merge with \the [M]..." + to_chat(src, "You fail to merge with \the [M]...") /mob/living/carbon/alien/diona/proc/do_merge(var/mob/living/carbon/human/H) if(!istype(H) || !src || !(src.Adjacent(H))) return 0 H << "You feel your being twine with that of \the [src] as it merges with your biomass." - src << "You feel your being twine with that of \the [H] as you merge with its biomass." + to_chat(src, "You feel your being twine with that of \the [H] as you merge with its biomass.") loc = H verbs += /mob/living/carbon/alien/diona/proc/split verbs -= /mob/living/carbon/alien/diona/proc/merge @@ -53,7 +53,7 @@ return src.loc << "You feel a pang of loss as [src] splits away from your biomass." - src << "You wiggle out of the depths of [src.loc]'s biomass and plop to the ground." + to_chat(src, "You wiggle out of the depths of [src.loc]'s biomass and plop to the ground.") var/mob/living/M = src.loc diff --git a/code/modules/mob/living/carbon/alien/diona/progression.dm b/code/modules/mob/living/carbon/alien/diona/progression.dm index b6c5b9b4fd..e259b18f27 100644 --- a/code/modules/mob/living/carbon/alien/diona/progression.dm +++ b/code/modules/mob/living/carbon/alien/diona/progression.dm @@ -5,7 +5,7 @@ return null if(amount_grown < max_grown) - src << "You are not yet ready for your growth..." + to_chat(src, "You are not yet ready for your growth...") return null src.split() diff --git a/code/modules/mob/living/carbon/alien/emote.dm b/code/modules/mob/living/carbon/alien/emote.dm index 175338e5ff..8d81aec4cf 100644 --- a/code/modules/mob/living/carbon/alien/emote.dm +++ b/code/modules/mob/living/carbon/alien/emote.dm @@ -16,7 +16,7 @@ return if (src.client) if (client.prefs.muted & MUTE_IC) - src << "You cannot send IC messages (muted)." + to_chat(src, "You cannot send IC messages (muted).") return if (stat) return @@ -115,7 +115,7 @@ playsound(src.loc, 'sound/misc/nymphchirp.ogg', 50, 0) m_type = 2 if("help") - src << "burp, chirp, choke, collapse, dance, drool, gasp, shiver, gnarl, jump, moan, nod, roll, scratch,\nscretch, shake, sign-#, sulk, sway, tail, twitch, whimper" + to_chat(src, "burp, chirp, choke, collapse, dance, drool, gasp, shiver, gnarl, jump, moan, nod, roll, scratch,\nscretch, shake, sign-#, sulk, sway, tail, twitch, whimper") else src << text("Invalid Emote: []", act) if ((message && src.stat == 0)) diff --git a/code/modules/mob/living/carbon/alien/larva/progression.dm b/code/modules/mob/living/carbon/alien/larva/progression.dm index 166ae53676..4e9c15552f 100644 --- a/code/modules/mob/living/carbon/alien/larva/progression.dm +++ b/code/modules/mob/living/carbon/alien/larva/progression.dm @@ -1,10 +1,10 @@ /mob/living/carbon/alien/larva/confirm_evolution() - src << "You are growing into a beautiful alien! It is time to choose a caste." - src << "There are three to choose from:" - src << "Hunters are strong and agile, able to hunt away from the hive and rapidly move through ventilation shafts. Hunters generate plasma slowly and have low reserves." - src << "Sentinels are tasked with protecting the hive and are deadly up close and at a range. They are not as physically imposing nor fast as the hunters." - src << "Drones are the working class, offering the largest plasma storage and generation. They are the only caste which may evolve again, turning into the dreaded alien queen." + to_chat(src, "You are growing into a beautiful alien! It is time to choose a caste.") + to_chat(src, "There are three to choose from:") + to_chat(src, "Hunters are strong and agile, able to hunt away from the hive and rapidly move through ventilation shafts. Hunters generate plasma slowly and have low reserves.") + to_chat(src, "Sentinels are tasked with protecting the hive and are deadly up close and at a range. They are not as physically imposing nor fast as the hunters.") + to_chat(src, "Drones are the working class, offering the largest plasma storage and generation. They are the only caste which may evolve again, turning into the dreaded alien queen.") var/alien_caste = alert(src, "Please choose which alien caste you shall belong to.",,"Hunter","Sentinel","Drone") return alien_caste ? "Xenomorph [alien_caste]" : null diff --git a/code/modules/mob/living/carbon/alien/progression.dm b/code/modules/mob/living/carbon/alien/progression.dm index 832535d062..1c4c37b083 100644 --- a/code/modules/mob/living/carbon/alien/progression.dm +++ b/code/modules/mob/living/carbon/alien/progression.dm @@ -12,11 +12,11 @@ return if(handcuffed || legcuffed) - src << "You cannot evolve when you are cuffed." + to_chat(src, "You cannot evolve when you are cuffed.") return if(amount_grown < max_grown) - src << "You are not fully grown." + to_chat(src, "You are not fully grown.") return // confirm_evolution() handles choices and other specific requirements. diff --git a/code/modules/mob/living/carbon/alien/say.dm b/code/modules/mob/living/carbon/alien/say.dm index 1f787be9dd..8621339927 100644 --- a/code/modules/mob/living/carbon/alien/say.dm +++ b/code/modules/mob/living/carbon/alien/say.dm @@ -4,7 +4,7 @@ if(client) if(client.prefs.muted & MUTE_IC) - src << "You cannot speak in IC (Muted)." + to_chat(src, "You cannot speak in IC (Muted).") return message = sanitize(message) diff --git a/code/modules/mob/living/carbon/carbon_powers.dm b/code/modules/mob/living/carbon/carbon_powers.dm index 337f0b0ff1..163555a0c7 100644 --- a/code/modules/mob/living/carbon/carbon_powers.dm +++ b/code/modules/mob/living/carbon/carbon_powers.dm @@ -8,7 +8,7 @@ var/mob/living/simple_mob/animal/borer/B = has_brain_worms() if(B && B.host_brain) - src << "You withdraw your probosci, releasing control of [B.host_brain]" + to_chat(src, "You withdraw your probosci, releasing control of [B.host_brain]") B.detatch() @@ -17,7 +17,7 @@ verbs -= /mob/living/carbon/proc/spawn_larvae else - src << "ERROR NO BORER OR BRAINMOB DETECTED IN THIS MOB, THIS IS A BUG !" + to_chat(src, "ERROR NO BORER OR BRAINMOB DETECTED IN THIS MOB, THIS IS A BUG !") //Brain slug proc for tormenting the host. /mob/living/carbon/proc/punish_host() @@ -31,10 +31,10 @@ return if(B.host_brain.ckey) - src << "You send a punishing spike of psychic agony lancing into your host's brain." + to_chat(src, "You send a punishing spike of psychic agony lancing into your host's brain.") if (!can_feel_pain()) B.host_brain << "You feel a strange sensation as a foreign influence prods your mind." - src << "It doesn't seem to be as effective as you hoped." + to_chat(src, "It doesn't seem to be as effective as you hoped.") else B.host_brain << "Horrific, burning agony lances through you, ripping a soundless scream from your trapped mind!" @@ -49,7 +49,7 @@ return if(B.chemicals >= 100) - src << "Your host twitches and quivers as you rapidly excrete a larva from your sluglike body." + to_chat(src, "Your host twitches and quivers as you rapidly excrete a larva from your sluglike body.") visible_message("\The [src] heaves violently, expelling a rush of vomit and a wriggling, sluglike creature!") B.chemicals -= 100 B.has_reproduced = 1 @@ -58,5 +58,5 @@ new /mob/living/simple_mob/animal/borer(get_turf(src)) else - src << "You do not have enough chemicals stored to reproduce." + to_chat(src, "You do not have enough chemicals stored to reproduce.") return \ No newline at end of file diff --git a/code/modules/mob/living/carbon/give.dm b/code/modules/mob/living/carbon/give.dm index 5d4f17840a..8825f043b7 100644 --- a/code/modules/mob/living/carbon/give.dm +++ b/code/modules/mob/living/carbon/give.dm @@ -12,7 +12,7 @@ if(!I) I = src.get_inactive_hand() if(!I) - src << "You don't have anything in your hands to give to \the [target]." + to_chat(src, "You don't have anything in your hands to give to \the [target].") return if(alert(target,"[src] wants to give you \a [I]. Will you accept it?","Item Offer","Yes","No") == "No") //VOREStation Edit - make yes on the left to be consistent with other dialogs @@ -23,18 +23,18 @@ if(!I) return if(!Adjacent(target)) - src << "You need to stay in reaching distance while giving an object." + to_chat(src, "You need to stay in reaching distance while giving an object.") target << "\The [src] moved too far away." return if(I.loc != src || !src.item_is_in_hands(I)) - src << "You need to keep the item in your hands." + to_chat(src, "You need to keep the item in your hands.") target << "\The [src] seems to have given up on passing \the [I] to you." return if(target.hands_are_full()) target << "Your hands are full." - src << "Their hands are full." + to_chat(src, "Their hands are full.") return if(src.unEquip(I)) diff --git a/code/modules/mob/living/carbon/human/emote_vr.dm b/code/modules/mob/living/carbon/human/emote_vr.dm index a637dff787..7e5abe13da 100644 --- a/code/modules/mob/living/carbon/human/emote_vr.dm +++ b/code/modules/mob/living/carbon/human/emote_vr.dm @@ -40,7 +40,7 @@ //Check if they are physically capable if(src.sleeping || src.resting || src.buckled || src.weakened || src.restrained() || involved_parts.len < 2) - src << "You can't *flip in your current state!" + to_chat(src, "You can't *flip in your current state!") return 1 else src.SpinAnimation(7,1) @@ -74,7 +74,7 @@ /mob/living/carbon/human/proc/toggle_tail_vr(var/setting,var/message = 0) if(!tail_style || !tail_style.ani_state) if(message) - src << "You don't have a tail that supports this." + to_chat(src, "You don't have a tail that supports this.") return 0 var/new_wagging = isnull(setting) ? !wagging : setting @@ -86,7 +86,7 @@ /mob/living/carbon/human/proc/toggle_wing_vr(var/setting,var/message = 0) if(!wing_style || !wing_style.ani_state) if(message) - src << "You don't have a tail that supports this." + to_chat(src, "You don't have a tail that supports this.") return 0 var/new_flapping = isnull(setting) ? !flapping : setting diff --git a/code/modules/mob/living/carbon/human/human.dm b/code/modules/mob/living/carbon/human/human.dm index dc918a328c..f04431da4b 100644 --- a/code/modules/mob/living/carbon/human/human.dm +++ b/code/modules/mob/living/carbon/human/human.dm @@ -1283,6 +1283,9 @@ else if (affecting.robotic >= ORGAN_LIFELIKE) . = 0 fail_msg = "Your needle refuses to penetrate more than a short distance..." + else if (affecting.thick_skin && prob(70 - round(affecting.brute_dam + affecting.burn_dam / 2))) // Allows transplanted limbs with thick skin to maintain their resistance. + . = 0 + fail_msg = "Your needle fails to penetrate \the [affecting]'s thick hide..." else switch(target_zone) if(BP_HEAD) @@ -1507,7 +1510,7 @@ if(!UWC) return var/datum/category_item/underwear/UWI = all_underwear[UWC.name] if(!UWI || UWI.name == "None") - to_chat(src, "You do not have [UWC.gender==PLURAL ? "[UWC.display_name]" : "\a [UWC.display_name]"].") + to_chat(src, "You do not have [UWC.gender==PLURAL ? "[UWC.display_name]" : "a [UWC.display_name]"].") return hide_underwear[UWC.name] = !hide_underwear[UWC.name] update_underwear(1) diff --git a/code/modules/mob/living/carbon/human/human_helpers.dm b/code/modules/mob/living/carbon/human/human_helpers.dm index ec10dc90f8..8c4eba8a33 100644 --- a/code/modules/mob/living/carbon/human/human_helpers.dm +++ b/code/modules/mob/living/carbon/human/human_helpers.dm @@ -8,9 +8,9 @@ return 1 if(feedback) if(status[1] == HUMAN_EATING_NO_MOUTH) - src << "Where do you intend to put \the [food]? You don't have a mouth!" + to_chat(src, "Where do you intend to put \the [food]? You don't have a mouth!") else if(status[1] == HUMAN_EATING_BLOCKED_MOUTH) - src << "\The [status[2]] is in the way!" + to_chat(src, "\The [status[2]] is in the way!") return 0 /mob/living/carbon/human/can_force_feed(var/feeder, var/food, var/feedback = 1) diff --git a/code/modules/mob/living/carbon/human/human_powers.dm b/code/modules/mob/living/carbon/human/human_powers.dm index a3c5e65470..9309100cf6 100644 --- a/code/modules/mob/living/carbon/human/human_powers.dm +++ b/code/modules/mob/living/carbon/human/human_powers.dm @@ -42,7 +42,7 @@ return if(stat || paralysis || stunned || weakened || lying || restrained() || buckled) - src << "You cannot tackle someone in your current state." + to_chat(src, "You cannot tackle someone in your current state.") return var/list/choices = list() @@ -61,7 +61,7 @@ return if(stat || paralysis || stunned || weakened || lying || restrained() || buckled) - src << "You cannot tackle in your current state." + to_chat(src, "You cannot tackle in your current state.") return last_special = world.time + 50 @@ -103,7 +103,7 @@ var/mob/M = targets[target] if(istype(M, /mob/observer/dead) || M.stat == DEAD) - src << "Not even a [src.species.name] can speak to the dead." + to_chat(src, "Not even a [src.species.name] can speak to the dead.") return log_say("(COMMUNE to [key_name(M)]) [text]",src) @@ -138,7 +138,7 @@ if(msg) log_say("(PWHISPER to [key_name(M)]) [msg]", src) M << "You hear a strange, alien voice in your head... [msg]" - src << "You said: \"[msg]\" to [M]" + to_chat(src, "You said: \"[msg]\" to [M]") return /mob/living/carbon/human/proc/diona_split_nymph() @@ -189,7 +189,7 @@ if(stat == DEAD) return - src << "Performing self-diagnostic, please wait..." + to_chat(src, "Performing self-diagnostic, please wait...") sleep(50) var/output = "Self-Diagnostic Results:\n" @@ -226,17 +226,17 @@ set category = "Abilities" if(incapacitated()) - src << "You need to recover before you can use this ability." + to_chat(src, "You need to recover before you can use this ability.") return if(world.time < next_sonar_ping) - src << "You need another moment to focus." + to_chat(src, "You need another moment to focus.") return if(is_deaf() || is_below_sound_pressure(get_turf(src))) - src << "You are for all intents and purposes currently deaf!" + to_chat(src, "You are for all intents and purposes currently deaf!") return next_sonar_ping += 10 SECONDS var/heard_something = FALSE - src << "You take a moment to listen in to your environment..." + to_chat(src, "You take a moment to listen in to your environment...") for(var/mob/living/L in range(client.view, src)) var/turf/T = get_turf(L) if(!T || L == src || L.stat == DEAD || is_below_sound_pressure(T)) @@ -263,7 +263,7 @@ feedback += "" src << jointext(feedback,null) if(!heard_something) - src << "You hear no movement but your own." + to_chat(src, "You hear no movement but your own.") /mob/living/carbon/human/proc/regenerate() set name = "Regenerate" diff --git a/code/modules/mob/living/carbon/human/life.dm b/code/modules/mob/living/carbon/human/life.dm index 0648ce7fdb..2ff9409007 100644 --- a/code/modules/mob/living/carbon/human/life.dm +++ b/code/modules/mob/living/carbon/human/life.dm @@ -1528,22 +1528,22 @@ stuttering = max(stuttering, 5) if(shock_stage == 40) - to_chat(src, "[pick("The pain is excruciating", "Please, just end the pain", "Your whole body is going numb")]!") + to_chat(src, "[pick("The pain is excruciating", "Please, just end the pain", "Your whole body is going numb")]!") if (shock_stage >= 60) if(shock_stage == 60) emote("me",1,"'s body becomes limp.") if (prob(2)) - to_chat(src, "[pick("The pain is excruciating", "Please, just end the pain", "Your whole body is going numb")]!") + to_chat(src, "[pick("The pain is excruciating", "Please, just end the pain", "Your whole body is going numb")]!") Weaken(20) if(shock_stage >= 80) if (prob(5)) - to_chat(src, "[pick("The pain is excruciating", "Please, just end the pain", "Your whole body is going numb")]!") + to_chat(src, "[pick("The pain is excruciating", "Please, just end the pain", "Your whole body is going numb")]!") Weaken(20) if(shock_stage >= 120) if (prob(2)) - to_chat(src, "[pick("You black out", "You feel like you could die any moment now", "You're about to lose consciousness")]!") + to_chat(src, "[pick("You black out", "You feel like you could die any moment now", "You are about to lose consciousness")]!") Paralyse(5) if(shock_stage == 150) diff --git a/code/modules/mob/living/carbon/human/species/station/station_special_abilities_vr.dm b/code/modules/mob/living/carbon/human/species/station/station_special_abilities_vr.dm index 0d0328bd51..f66a4061d8 100644 --- a/code/modules/mob/living/carbon/human/species/station/station_special_abilities_vr.dm +++ b/code/modules/mob/living/carbon/human/species/station/station_special_abilities_vr.dm @@ -167,13 +167,13 @@ switch(halpick) if(0 to 15) //15% chance //Screwy HUD - //src << "Screwy HUD" + //to_chat(src, "Screwy HUD") hal_screwyhud = pick(1,2,3,3,4,4) spawn(rand(100,250)) hal_screwyhud = 0 if(16 to 25) //10% chance //Strange items - //src << "Traitor Items" + //to_chat(src, "Traitor Items") if(!halitem) halitem = new var/list/slots_free = list(ui_lhand,ui_rhand) @@ -221,7 +221,7 @@ halitem = null if(26 to 35) //10% chance //Flashes of danger - //src << "Danger Flash" + //to_chat(src, "Danger Flash") if(!halimage) var/list/possible_points = list() for(var/turf/simulated/floor/F in view(src,world.view)) @@ -231,13 +231,13 @@ switch(rand(1,3)) if(1) - //src << "Space" + //to_chat(src, "Space") halimage = image('icons/turf/space.dmi',target,"[rand(1,25)]",TURF_LAYER) if(2) - //src << "Fire" + //to_chat(src, "Fire") halimage = image('icons/effects/fire.dmi',target,"1",TURF_LAYER) if(3) - //src << "C4" + //to_chat(src, "C4") halimage = image('icons/obj/assemblies.dmi',target,"plastic-explosive2",OBJ_LAYER+0.01) @@ -248,7 +248,7 @@ if(36 to 55) //20% chance //Strange audio - //src << "Strange Audio" + //to_chat(src, "Strange Audio") switch(rand(1,12)) if(1) src << 'sound/machines/airlock.ogg' if(2) @@ -282,7 +282,7 @@ src << pick(creepyasssounds) if(56 to 60) //5% chance //Flashes of danger - //src << "Danger Flash" + //to_chat(src, "Danger Flash") if(!halbody) var/list/possible_points = list() for(var/turf/simulated/floor/F in view(src,world.view)) @@ -358,7 +358,7 @@ return if(stat || paralysis || stunned || weakened || lying || restrained() || buckled) - src << "You cannot bite anyone in your current state!" + to_chat(src, "You cannot bite anyone in your current state!") return var/list/choices = list() @@ -376,10 +376,10 @@ if(last_special > world.time) return if(stat || paralysis || stunned || weakened || lying || restrained() || buckled) - src << "You cannot bite in your current state." + to_chat(src, "You cannot bite in your current state.") return if(B.vessel.total_volume <= 0 || B.isSynthetic()) //Do they have any blood in the first place, and are they synthetic? - src << "There appears to be no blood in this prey..." + to_chat(src, "There appears to be no blood in this prey...") return last_special = world.time + 600 diff --git a/code/modules/mob/living/carbon/human/species/xenomorphs/alien_powers.dm b/code/modules/mob/living/carbon/human/species/xenomorphs/alien_powers.dm index cc7cd7ef85..20255bbae9 100644 --- a/code/modules/mob/living/carbon/human/species/xenomorphs/alien_powers.dm +++ b/code/modules/mob/living/carbon/human/species/xenomorphs/alien_powers.dm @@ -22,20 +22,20 @@ var/obj/item/organ/internal/xenos/plasmavessel/P = internal_organs_by_name[O_PLASMA] if(!istype(P)) - src << "Your plasma vessel has been removed!" + to_chat(src, "Your plasma vessel has been removed!") return if(needs_organ) var/obj/item/organ/internal/I = internal_organs_by_name[needs_organ] if(!I) - src << "Your [needs_organ] has been removed!" + to_chat(src, "Your [needs_organ] has been removed!") return else if((I.status & ORGAN_CUT_AWAY) || I.is_broken()) - src << "Your [needs_organ] is too damaged to function!" + to_chat(src, "Your [needs_organ] is too damaged to function!") return if(P.stored_plasma < cost) - src << "You don't have enough phoron stored to do that." + to_chat(src, "You don't have enough phoron stored to do that.") return 0 if(needs_foundation) @@ -46,7 +46,7 @@ if(!(istype(T,/turf/space))) has_foundation = 1 if(!has_foundation) - src << "You need a solid foundation to do that on." + to_chat(src, "You need a solid foundation to do that on.") return 0 P.stored_plasma -= cost @@ -59,12 +59,12 @@ set category = "Abilities" if (get_dist(src,M) <= 1) - src << "You need to be closer." + to_chat(src, "You need to be closer.") return var/obj/item/organ/internal/xenos/plasmavessel/I = M.internal_organs_by_name[O_PLASMA] if(!istype(I)) - src << "Their plasma vessel is missing." + to_chat(src, "Their plasma vessel is missing.") return var/amount = input("Amount:", "Transfer Plasma to [M]") as num @@ -73,7 +73,7 @@ if(check_alien_ability(amount,0,O_PLASMA)) M.gain_plasma(amount) M << "[src] has transfered [amount] plasma to you." - src << "You have transferred [amount] plasma to [M]." + to_chat(src, "You have transferred [amount] plasma to [M].") return // Queen verbs. @@ -84,12 +84,12 @@ set category = "Abilities" if(!config.aliens_allowed) - src << "You begin to lay an egg, but hesitate. You suspect it isn't allowed." + to_chat(src, "You begin to lay an egg, but hesitate. You suspect it isn't allowed.") verbs -= /mob/living/carbon/human/proc/lay_egg return if(locate(/obj/effect/alien/egg) in get_turf(src)) - src << "There's already an egg here." + to_chat(src, "There's already an egg here.") return if(check_alien_ability(75,1,O_EGG)) @@ -105,7 +105,7 @@ set category = "Abilities" if(alien_queen_exists()) - src << "We already have an active queen." + to_chat(src, "We already have an active queen.") return if(check_alien_ability(500)) @@ -121,7 +121,9 @@ if(check_alien_ability(50,1,O_RESIN)) visible_message("[src] has planted some alien weeds!") - new /obj/effect/alien/weeds/node(loc) + var/obj/O = new /obj/effect/alien/weeds/node(loc) + if(O) + O.color = "#321D37" return /mob/living/carbon/human/proc/Spit(var/atom/A) @@ -154,7 +156,7 @@ set category = "Abilities" if(!O in oview(1)) - src << "[O] is too far away." + to_chat(src, "[O] is too far away.") return // OBJ CHECK @@ -175,7 +177,7 @@ cannot_melt = 1 if(cannot_melt) - src << "You cannot dissolve this object." + to_chat(src, "You cannot dissolve this object.") return if(check_alien_ability(200,0,O_ACID)) @@ -231,7 +233,7 @@ set desc = "Secrete tough malleable resin." set category = "Abilities" - var/choice = input("Choose what you wish to shape.","Resin building") as null|anything in list("resin door","resin wall","resin membrane","resin nest") //would do it through typesof but then the player choice would have the type path and we don't want the internal workings to be exposed ICly - Urist + var/choice = input("Choose what you wish to shape.","Resin building") as null|anything in list("resin door","resin wall","resin membrane","resin nest","resin blob") //would do it through typesof but then the player choice would have the type path and we don't want the internal workings to be exposed ICly - Urist if(!choice) return @@ -239,15 +241,24 @@ return visible_message("[src] vomits up a thick purple substance and begins to shape it!", "You shape a [choice].") + + var/obj/O + switch(choice) if("resin door") - new /obj/structure/simple_door/resin(loc) + O = new /obj/structure/simple_door/resin(loc) if("resin wall") - new /obj/effect/alien/resin/wall(loc) + O = new /obj/effect/alien/resin/wall(loc) if("resin membrane") - new /obj/effect/alien/resin/membrane(loc) + O = new /obj/effect/alien/resin/membrane(loc) if("resin nest") - new /obj/structure/bed/nest(loc) + O = new /obj/structure/bed/nest(loc) + if("resin blob") + O = new /obj/item/stack/material/resin(loc) + + if(O) + O.color = "#321D37" + return /mob/living/carbon/human/proc/leap() @@ -259,7 +270,7 @@ return if(stat || paralysis || stunned || weakened || lying || restrained() || buckled) - src << "You cannot leap in your current state." + to_chat(src, "You cannot leap in your current state.") return var/list/choices = list() @@ -278,7 +289,7 @@ return if(stat || paralysis || stunned || weakened || lying || restrained() || buckled) - src << "You cannot leap in your current state." + to_chat(src, "You cannot leap in your current state.") return last_special = world.time + 75 @@ -293,7 +304,7 @@ if(status_flags & LEAPING) status_flags &= ~LEAPING if(!src.Adjacent(T)) - src << "You miss!" + to_chat(src, "You miss!") return T.Weaken(3) @@ -301,7 +312,7 @@ var/use_hand = "left" if(l_hand) if(r_hand) - src << "You need to have one hand free to grab someone." + to_chat(src, "You need to have one hand free to grab someone.") return else use_hand = "right" @@ -327,16 +338,16 @@ return if(stat || paralysis || stunned || weakened || lying) - src << "You cannot do that in your current state." + to_chat(src, "You cannot do that in your current state.") return var/obj/item/weapon/grab/G = locate() in src if(!G || !istype(G)) - src << "You are not grabbing anyone." + to_chat(src, "You are not grabbing anyone.") return if(G.state < GRAB_AGGRESSIVE) - src << "You must have an aggressive grab to gut your prey!" + to_chat(src, "You must have an aggressive grab to gut your prey!") return last_special = world.time + 50 diff --git a/code/modules/mob/living/carbon/human/species/xenomorphs/alien_species.dm b/code/modules/mob/living/carbon/human/species/xenomorphs/alien_species.dm index e8b9a070ea..9e2a949402 100644 --- a/code/modules/mob/living/carbon/human/species/xenomorphs/alien_species.dm +++ b/code/modules/mob/living/carbon/human/species/xenomorphs/alien_species.dm @@ -66,17 +66,17 @@ var/weeds_plasma_rate = 5 // Plasma regen on weeds. has_limbs = list( - BP_TORSO = list("path" = /obj/item/organ/external/chest), - BP_GROIN = list("path" = /obj/item/organ/external/groin), - BP_HEAD = list("path" = /obj/item/organ/external/head/no_eyes), - BP_L_ARM = list("path" = /obj/item/organ/external/arm), - BP_R_ARM = list("path" = /obj/item/organ/external/arm/right), - BP_L_LEG = list("path" = /obj/item/organ/external/leg), - BP_R_LEG = list("path" = /obj/item/organ/external/leg/right), - BP_L_HAND = list("path" = /obj/item/organ/external/hand), - BP_R_HAND = list("path" = /obj/item/organ/external/hand/right), - BP_L_FOOT = list("path" = /obj/item/organ/external/foot), - BP_R_FOOT = list("path" = /obj/item/organ/external/foot/right) + BP_TORSO = list("path" = /obj/item/organ/external/chest/unseverable/xeno), + BP_GROIN = list("path" = /obj/item/organ/external/groin/unseverable/xeno), + BP_HEAD = list("path" = /obj/item/organ/external/head/unseverable/xeno), + BP_L_ARM = list("path" = /obj/item/organ/external/arm/unseverable/xeno), + BP_R_ARM = list("path" = /obj/item/organ/external/arm/right/unseverable/xeno), + BP_L_LEG = list("path" = /obj/item/organ/external/leg/unseverable/xeno), + BP_R_LEG = list("path" = /obj/item/organ/external/leg/right/unseverable/xeno), + BP_L_HAND = list("path" = /obj/item/organ/external/hand/unseverable/xeno), + BP_R_HAND = list("path" = /obj/item/organ/external/hand/right/unseverable/xeno), + BP_L_FOOT = list("path" = /obj/item/organ/external/foot/unseverable/xeno), + BP_R_FOOT = list("path" = /obj/item/organ/external/foot/right/unseverable/xeno) ) /datum/species/xenos/get_bodytype() @@ -136,7 +136,7 @@ H.adjustOxyLoss(-heal_rate) H.adjustToxLoss(-heal_rate) if (prob(5)) - H << "You feel a soothing sensation come over you..." + H << "You feel a soothing sensation come over you..." return 1 //next internal organs @@ -144,7 +144,7 @@ if(I.damage > 0) I.damage = max(I.damage - heal_rate, 0) if (prob(5)) - H << "You feel a soothing sensation within your [I.parent_organ]..." + H << "You feel a soothing sensation within your [I.parent_organ]..." return 1 //next mend broken bones, approx 10 ticks each @@ -152,7 +152,7 @@ if (E.status & ORGAN_BROKEN) if (prob(mend_prob)) if (E.mend_fracture()) - H << "You feel something mend itself inside your [E.name]." + H << "You feel something mend itself inside your [E.name]." return 1 return 0 diff --git a/code/modules/mob/living/carbon/human/update_icons.dm b/code/modules/mob/living/carbon/human/update_icons.dm index 7ae3718027..b6f9aa35ec 100644 --- a/code/modules/mob/living/carbon/human/update_icons.dm +++ b/code/modules/mob/living/carbon/human/update_icons.dm @@ -585,7 +585,7 @@ var/global/list/damage_icon_parts = list() //see UpdateDamageIcon() var/icon/c_mask = null if(tail_style && tail_style.clip_mask_icon && tail_style.clip_mask_state) var/obj/item/clothing/suit/S = wear_suit - if(!(wear_suit && ((wear_suit.flags_inv & HIDETAIL) || (istype(S) && S.taurized)))) //Clip the lower half of the suit off using the tail's clip mask. + if(!(wear_suit && ((wear_suit.flags_inv & HIDETAIL) || (istype(S) && S.taurized)))) //Clip the lower half of the uniform off using the tail's clip mask. c_mask = new /icon(tail_style.clip_mask_icon, tail_style.clip_mask_state) overlays_standing[UNIFORM_LAYER] = w_uniform.make_worn_icon(body_type = species.get_bodytype(src), slot_name = slot_w_uniform_str, default_icon = INV_W_UNIFORM_DEF_ICON, default_layer = UNIFORM_LAYER, clip_mask = c_mask) //VOREStation Edit end. @@ -768,7 +768,10 @@ var/global/list/damage_icon_parts = list() //see UpdateDamageIcon() //VOREStation Edit start. var/icon/c_mask = null - if((tail_style && tail_style.clip_mask_icon && tail_style.clip_mask_state) && !(wear_suit.flags_inv & HIDETAIL) && !(S && S.taurized)) //Clip the lower half of the suit off using the tail's clip mask. + var/tail_is_rendered = (overlays_standing[TAIL_LAYER] || overlays_standing[TAIL_LAYER_ALT]) + var/valid_clip_mask = (tail_style && tail_style.clip_mask_icon && tail_style.clip_mask_state) + + if(tail_is_rendered && valid_clip_mask && !(S && S.taurized)) //Clip the lower half of the suit off using the tail's clip mask for taurs since taur bodies aren't hidden. c_mask = new /icon(tail_style.clip_mask_icon, tail_style.clip_mask_state) overlays_standing[SUIT_LAYER] = wear_suit.make_worn_icon(body_type = species.get_bodytype(src), slot_name = slot_wear_suit_str, default_icon = iconFile, default_layer = SUIT_LAYER, clip_mask = c_mask) //VOREStation Edit end. diff --git a/code/modules/mob/living/carbon/lick_wounds.dm b/code/modules/mob/living/carbon/lick_wounds.dm index 4c992e772c..c712448f8a 100644 --- a/code/modules/mob/living/carbon/lick_wounds.dm +++ b/code/modules/mob/living/carbon/lick_wounds.dm @@ -9,7 +9,7 @@ if ( ! (istype(src, /mob/living/carbon/human) || \ istype(src, /mob/living/silicon)) ) - src << "If you even have a tongue, it doesn't work that way." + to_chat(src, "If you even have a tongue, it doesn't work that way.") return if (istype(M, /mob/living/carbon/human)) diff --git a/code/modules/mob/living/silicon/laws.dm b/code/modules/mob/living/silicon/laws.dm index 3af4818679..39e11e4802 100644 --- a/code/modules/mob/living/silicon/laws.dm +++ b/code/modules/mob/living/silicon/laws.dm @@ -17,7 +17,7 @@ /mob/living/silicon/robot/set_zeroth_law(var/law, var/law_borg) ..() if(tracking_entities) - src << "Internal camera is currently being accessed." + to_chat(src, "Internal camera is currently being accessed.") /mob/living/silicon/proc/add_ion_law(var/law) laws_sanity_check() @@ -70,7 +70,7 @@ /mob/living/silicon/proc/dostatelaws(var/method, var/prefix, var/datum/ai_laws/laws) if(stating_laws[prefix]) - src << "[method]: Already stating laws using this communication method." + to_chat(src, "[method]: Already stating laws using this communication method.") return stating_laws[prefix] = 1 @@ -83,7 +83,7 @@ break if(!can_state) - src << "[method]: Unable to state laws. Communication method unavailable." + to_chat(src, "[method]: Unable to state laws. Communication method unavailable.") stating_laws[prefix] = 0 /mob/living/silicon/proc/statelaw(var/law) diff --git a/code/modules/mob/living/silicon/pai/software_modules.dm b/code/modules/mob/living/silicon/pai/software_modules.dm index dad52893cf..b5305de2ee 100644 --- a/code/modules/mob/living/silicon/pai/software_modules.dm +++ b/code/modules/mob/living/silicon/pai/software_modules.dm @@ -56,7 +56,7 @@ while(!istype(M, /mob/living)) if(!M || !M.loc || count > 6) //For a runtime where M ends up in nullspace (similar to bluespace but less colourful) - src << "You are not being carried by anyone!" + to_chat(src, "You are not being carried by anyone!") return 0 M = M.loc count++ diff --git a/code/modules/mob/living/silicon/robot/dogborg/dog_modules_vr.dm b/code/modules/mob/living/silicon/robot/dogborg/dog_modules_vr.dm index 75b256b22e..92116b4f76 100644 --- a/code/modules/mob/living/silicon/robot/dogborg/dog_modules_vr.dm +++ b/code/modules/mob/living/silicon/robot/dogborg/dog_modules_vr.dm @@ -411,12 +411,12 @@ last_special = world.time + 10 status_flags |= LEAPING - pixel_y = 10 + pixel_y = pixel_y + 10 src.visible_message("\The [src] leaps at [T]!") src.throw_at(get_step(get_turf(T),get_turf(src)), 4, 1, src) playsound(src.loc, 'sound/mecha/mechstep2.ogg', 50, 1) - pixel_y = 0 + pixel_y = default_pixel_y cell.charge -= 750 sleep(5) diff --git a/code/modules/mob/living/silicon/robot/dogborg/dog_sleeper_vr.dm b/code/modules/mob/living/silicon/robot/dogborg/dog_sleeper_vr.dm index 8502fcfca4..07f130fda1 100644 --- a/code/modules/mob/living/silicon/robot/dogborg/dog_sleeper_vr.dm +++ b/code/modules/mob/living/silicon/robot/dogborg/dog_sleeper_vr.dm @@ -36,6 +36,7 @@ var/datum/matter_synth/water = null var/digest_brute = 2 var/digest_burn = 3 + var/recycles = FALSE /obj/item/device/dogborg/sleeper/New() ..() @@ -402,6 +403,8 @@ //For if the dogborg's existing patient uh, doesn't make it. /obj/item/device/dogborg/sleeper/proc/update_patient() hound = src.loc + if(!istype(hound,/mob/living/silicon/robot)) + return if(UI_open == TRUE) sleeperUI(hound) @@ -593,7 +596,7 @@ drain(-50 * digested) if(volume) water.add_charge(volume) - if(!analyzer && !delivery && compactor && T.matter) + if(recycles && T.matter) for(var/material in T.matter) var/total_material = T.matter[material] if(istype(T,/obj/item/stack)) @@ -619,6 +622,8 @@ return /obj/item/device/dogborg/sleeper/process() + if(!istype(src.loc,/mob/living/silicon/robot)) + return if(cleaning) //We're cleaning, return early after calling this as we don't care about the patient. clean_cycle() @@ -652,6 +657,7 @@ icon_state = "compactor" injection_chems = null //So they don't have all the same chems as the medihound! compactor = TRUE + recycles = TRUE max_item_count = 25 /obj/item/device/dogborg/sleeper/compactor/analyzer //sci-borg gut. @@ -668,6 +674,7 @@ icon_state = "decompiler" max_item_count = 10 decompiler = TRUE + recycles = TRUE /obj/item/device/dogborg/sleeper/compactor/delivery //Unfinished and unimplemented, still testing. name = "Cargo Belly" diff --git a/code/modules/mob/living/silicon/robot/drone/drone.dm b/code/modules/mob/living/silicon/robot/drone/drone.dm index 9609fd6c0a..91717bb1e5 100644 --- a/code/modules/mob/living/silicon/robot/drone/drone.dm +++ b/code/modules/mob/living/silicon/robot/drone/drone.dm @@ -329,15 +329,15 @@ var/list/mob_hat_cache = list() player.mob.mind.transfer_to(src) lawupdate = 0 - src << "Systems rebooted. Loading base pattern maintenance protocol... loaded." + to_chat(src, "Systems rebooted. Loading base pattern maintenance protocol... loaded.") full_law_reset() welcome_drone() /mob/living/silicon/robot/drone/proc/welcome_drone() - src << "You are a maintenance drone, a tiny-brained robotic repair machine." - src << "You have no individual will, no personality, and no drives or urges other than your laws." - src << "Remember, you are lawed against interference with the crew. Also remember, you DO NOT take orders from the AI." - src << "Use say ;Hello to talk to other drones and say Hello to speak silently to your nearby fellows." + to_chat(src, "You are a maintenance drone, a tiny-brained robotic repair machine.") + to_chat(src, "You have no individual will, no personality, and no drives or urges other than your laws.") + to_chat(src, "Remember, you are lawed against interference with the crew. Also remember, you DO NOT take orders from the AI.") + to_chat(src, "Use say ;Hello to talk to other drones and say Hello to speak silently to your nearby fellows.") /mob/living/silicon/robot/drone/add_robot_verbs() src.verbs |= silicon_subsystems @@ -346,10 +346,10 @@ var/list/mob_hat_cache = list() src.verbs -= silicon_subsystems /mob/living/silicon/robot/drone/construction/welcome_drone() - src << "You are a construction drone, an autonomous engineering and fabrication system.." - src << "You are assigned to a Sol Central construction project. The name is irrelevant. Your task is to complete construction and subsystem integration as soon as possible." - src << "Use :d to talk to other drones and say to speak silently to your nearby fellows." - src << "You do not follow orders from anyone; not the AI, not humans, and not other synthetics.." + to_chat(src, "You are a construction drone, an autonomous engineering and fabrication system..") + to_chat(src, "You are assigned to a Sol Central construction project. The name is irrelevant. Your task is to complete construction and subsystem integration as soon as possible.") + to_chat(src, "Use :d to talk to other drones and say to speak silently to your nearby fellows.") + to_chat(src, "You do not follow orders from anyone; not the AI, not humans, and not other synthetics..") /mob/living/silicon/robot/drone/construction/init() ..() diff --git a/code/modules/mob/living/silicon/robot/drone/drone_abilities.dm b/code/modules/mob/living/silicon/robot/drone/drone_abilities.dm index 2595d451c1..6d28b6ce61 100644 --- a/code/modules/mob/living/silicon/robot/drone/drone_abilities.dm +++ b/code/modules/mob/living/silicon/robot/drone/drone_abilities.dm @@ -10,13 +10,13 @@ mail_destination = "" return - src << "You configure your internal beacon, tagging yourself for delivery to '[new_tag]'." + to_chat(src, "You configure your internal beacon, tagging yourself for delivery to '[new_tag]'.") mail_destination = new_tag //Auto flush if we use this verb inside a disposal chute. var/obj/machinery/disposal/D = src.loc if(istype(D)) - src << "\The [D] acknowledges your signal." + to_chat(src, "\The [D] acknowledges your signal.") D.flush_count = D.flush_every_ticks return diff --git a/code/modules/mob/living/silicon/robot/drone/drone_manufacturer.dm b/code/modules/mob/living/silicon/robot/drone/drone_manufacturer.dm index fdb9c09eb5..6ce0895947 100644 --- a/code/modules/mob/living/silicon/robot/drone/drone_manufacturer.dm +++ b/code/modules/mob/living/silicon/robot/drone/drone_manufacturer.dm @@ -99,11 +99,11 @@ set desc = "If there is a powered, enabled fabricator in the game world with a prepared chassis, join as a maintenance drone." if(ticker.current_state < GAME_STATE_PLAYING) - src << "The game hasn't started yet!" + to_chat(src, "The game hasn't started yet!") return if(!(config.allow_drone_spawn)) - src << "That verb is not currently permitted." + to_chat(src, "That verb is not currently permitted.") return if (!src.stat) @@ -143,7 +143,7 @@ all_fabricators[DF.fabricator_tag] = DF if(!all_fabricators.len) - src << "There are no available drone spawn points, sorry." + to_chat(src, "There are no available drone spawn points, sorry.") return var/choice = input(src,"Which fabricator do you wish to use?") as null|anything in all_fabricators diff --git a/code/modules/mob/living/silicon/robot/drone/drone_say.dm b/code/modules/mob/living/silicon/robot/drone/drone_say.dm index 5cdcd3dbd8..26a78351ef 100644 --- a/code/modules/mob/living/silicon/robot/drone/drone_say.dm +++ b/code/modules/mob/living/silicon/robot/drone/drone_say.dm @@ -2,7 +2,7 @@ if(local_transmit) if (src.client) if(client.prefs.muted & MUTE_IC) - src << "You cannot send IC messages (muted)." + to_chat(src, "You cannot send IC messages (muted).") return 0 message = sanitize(message) diff --git a/code/modules/mob/living/silicon/robot/life.dm b/code/modules/mob/living/silicon/robot/life.dm index 82edaba7d3..ffcb1b8326 100644 --- a/code/modules/mob/living/silicon/robot/life.dm +++ b/code/modules/mob/living/silicon/robot/life.dm @@ -104,9 +104,8 @@ AdjustConfused(-1) - else //Dead. + else //Dead or just unconscious. src.blinded = 1 - src.stat = 2 if (src.stuttering) src.stuttering-- diff --git a/code/modules/mob/living/simple_animal/animals/spiderbot.dm b/code/modules/mob/living/simple_animal/animals/spiderbot.dm index 7e1cac8c80..9fdc73f3c7 100644 --- a/code/modules/mob/living/simple_animal/animals/spiderbot.dm +++ b/code/modules/mob/living/simple_animal/animals/spiderbot.dm @@ -150,8 +150,10 @@ return 0 else user << "You short out the security protocols and overload [src]'s cell, priming it to explode in a short time." - spawn(100) src << "Your cell seems to be outputting a lot of power..." - spawn(200) src << "Internal heat sensors are spiking! Something is badly wrong with your cell!" + spawn(100) +\ to_chat(src, "Your cell seems to be outputting a lot of power...") + spawn(200) + to_chat(src, "Internal heat sensors are spiking! Something is badly wrong with your cell!") spawn(300) src.explode() /mob/living/simple_mob/spiderbot/proc/transfer_personality(var/obj/item/device/mmi/M as obj) @@ -263,7 +265,7 @@ return -1 if(held_item) - src << "You are already holding \the [held_item]" + to_chat(src, "You are already holding \the [held_item]") return 1 var/list/items = list() @@ -282,10 +284,10 @@ "You grab \the [held_item].", \ "You hear a skittering noise and a clink.") return held_item - src << "\The [selection] is too far away." + to_chat(src, "\The [selection] is too far away.") return 0 - src << "There is nothing of interest to take." + to_chat(src, "There is nothing of interest to take.") return 0 /mob/living/simple_mob/spiderbot/examine(mob/user) diff --git a/code/modules/mob/living/simple_animal/borer/borer.dm b/code/modules/mob/living/simple_animal/borer/borer.dm new file mode 100644 index 0000000000..8b28544b9e --- /dev/null +++ b/code/modules/mob/living/simple_animal/borer/borer.dm @@ -0,0 +1,213 @@ +/mob/living/simple_mob/animal/borer + name = "cortical borer" + real_name = "cortical borer" + desc = "A small, quivering sluglike creature." + speak_emote = list("chirrups") + emote_hear = list("chirrups") + intelligence_level = SA_HUMANOID // Player controlled. + response_help = "pokes" + response_disarm = "prods" + response_harm = "stomps on" + icon_state = "brainslug" + item_state = "brainslug" + icon_living = "brainslug" + icon_dead = "brainslug_dead" + speed = 5 + a_intent = I_HURT + stop_automated_movement = 1 + status_flags = CANPUSH + attacktext = list("nipped") + friendly = "prods" + wander = 0 + pass_flags = PASSTABLE + universal_understand = 1 + holder_type = /obj/item/weapon/holder/borer + + var/used_dominate + var/chemicals = 10 // Chemicals used for reproduction and spitting neurotoxin. + var/mob/living/carbon/human/host // Human host for the brain worm. + var/truename // Name used for brainworm-speak. + var/mob/living/captive_brain/host_brain // Used for swapping control of the body back and forth. + var/controlling // Used in human death check. + var/docile = 0 // Sugar can stop borers from acting. + var/has_reproduced + var/roundstart + + can_be_antagged = TRUE + +/mob/living/simple_mob/animal/borer/roundstart + roundstart = 1 + +/mob/living/simple_mob/animal/borer/Login() + ..() + if(mind) + borers.add_antagonist(mind) + +/mob/living/simple_mob/animal/borer/New() + ..() + + add_language("Cortical Link") + verbs += /mob/living/proc/ventcrawl + verbs += /mob/living/proc/hide + + truename = "[pick("Primary","Secondary","Tertiary","Quaternary")] [rand(1000,9999)]" + if(!roundstart) request_player() + +/mob/living/simple_mob/animal/borer/Life() + + ..() + + if(host) + + if(!stat && !host.stat) + + if(host.reagents.has_reagent("sugar")) + if(!docile) + if(controlling) + host << "You feel the soporific flow of sugar in your host's blood, lulling you into docility." + else + to_chat(src, "You feel the soporific flow of sugar in your host's blood, lulling you into docility.") + docile = 1 + else + if(docile) + if(controlling) + host << "You shake off your lethargy as the sugar leaves your host's blood." + else + to_chat(src, "You shake off your lethargy as the sugar leaves your host's blood.") + docile = 0 + + if(chemicals < 250) + chemicals++ + if(controlling) + + if(docile) + host << "You are feeling far too docile to continue controlling your host..." + host.release_control() + return + + if(prob(5)) + host.adjustBrainLoss(0.1) + + if(prob(host.brainloss/20)) + host.say("*[pick(list("blink","blink_r","choke","aflap","drool","twitch","twitch_v","gasp"))]") + +/mob/living/simple_mob/animal/borer/Stat() + ..() + statpanel("Status") + + if(emergency_shuttle) + var/eta_status = emergency_shuttle.get_status_panel_eta() + if(eta_status) + stat(null, eta_status) + + if (client.statpanel == "Status") + stat("Chemicals", chemicals) + +/mob/living/simple_mob/animal/borer/proc/detatch() + + if(!host || !controlling) return + + if(istype(host,/mob/living/carbon/human)) + var/mob/living/carbon/human/H = host + var/obj/item/organ/external/head = H.get_organ(BP_HEAD) + head.implants -= src + + controlling = 0 + + host.remove_language("Cortical Link") + host.verbs -= /mob/living/carbon/proc/release_control + host.verbs -= /mob/living/carbon/proc/punish_host + host.verbs -= /mob/living/carbon/proc/spawn_larvae + + if(host_brain) + + // these are here so bans and multikey warnings are not triggered on the wrong people when ckey is changed. + // computer_id and IP are not updated magically on their own in offline mobs -walter0o + + // host -> self + var/h2s_id = host.computer_id + var/h2s_ip= host.lastKnownIP + host.computer_id = null + host.lastKnownIP = null + + src.ckey = host.ckey + + if(!src.computer_id) + src.computer_id = h2s_id + + if(!host_brain.lastKnownIP) + src.lastKnownIP = h2s_ip + + // brain -> host + var/b2h_id = host_brain.computer_id + var/b2h_ip= host_brain.lastKnownIP + host_brain.computer_id = null + host_brain.lastKnownIP = null + + host.ckey = host_brain.ckey + + if(!host.computer_id) + host.computer_id = b2h_id + + if(!host.lastKnownIP) + host.lastKnownIP = b2h_ip + + qdel(host_brain) + +/mob/living/simple_mob/animal/borer/proc/leave_host() + + if(!host) return + + if(host.mind) + borers.remove_antagonist(host.mind) + + src.forceMove(get_turf(host)) + + reset_view(null) + machine = null + + host.reset_view(null) + host.machine = null + host = null + return + +//Procs for grabbing players. +/mob/living/simple_mob/animal/borer/proc/request_player() + for(var/mob/observer/dead/O in player_list) + if(jobban_isbanned(O, "Borer")) + continue + if(O.client) + if(O.client.prefs.be_special & BE_ALIEN) + question(O.client) + +/mob/living/simple_mob/animal/borer/proc/question(var/client/C) + spawn(0) + if(!C) return + var/response = alert(C, "A cortical borer needs a player. Are you interested?", "Cortical borer request", "Yes", "No", "Never for this round") + if(!C || ckey) + return + if(response == "Yes") + transfer_personality(C) + else if (response == "Never for this round") + C.prefs.be_special ^= BE_ALIEN + +/mob/living/simple_mob/animal/borer/proc/transfer_personality(var/client/candidate) + + if(!candidate || !candidate.mob || !candidate.mob.mind) + return + + src.mind = candidate.mob.mind + candidate.mob.mind.current = src + src.ckey = candidate.ckey + + if(src.mind) + src.mind.assigned_role = "Cortical Borer" + src.mind.special_role = "Cortical Borer" + + to_chat(src, "You are a cortical borer! You are a brain slug that worms its way \ + into the head of its victim. Use stealth, persuasion and your powers of mind control to keep you, \ + your host and your eventual spawn safe and warm.") + to_chat(src, "You can speak to your victim with say, to other borers with say :x, and use your Abilities tab to access powers.") + +/mob/living/simple_mob/animal/borer/cannot_use_vents() + return \ No newline at end of file diff --git a/code/modules/mob/living/simple_animal/borer/borer_captive.dm b/code/modules/mob/living/simple_animal/borer/borer_captive.dm new file mode 100644 index 0000000000..c7088bc715 --- /dev/null +++ b/code/modules/mob/living/simple_animal/borer/borer_captive.dm @@ -0,0 +1,57 @@ +/mob/living/captive_brain + name = "host brain" + real_name = "host brain" + universal_understand = 1 + +/mob/living/captive_brain/say(var/message) + + if (src.client) + if(client.prefs.muted & MUTE_IC) + to_chat(src, "You cannot speak in IC (muted).") + return + + if(istype(src.loc,/mob/living/simple_mob/animal/borer)) + + message = sanitize(message) + if (!message) + return + log_say(message,src) + if (stat == 2) + return say_dead(message) + + var/mob/living/simple_mob/animal/borer/B = src.loc + to_chat(src, "You whisper silently, \"[message]\"") + B.host << "The captive mind of [src] whispers, \"[message]\"" + + for (var/mob/M in player_list) + if (istype(M, /mob/new_player)) + continue + else if(M.stat == DEAD && M.is_preference_enabled(/datum/client_preference/ghost_ears)) + M << "The captive mind of [src] whispers, \"[message]\"" + +/mob/living/captive_brain/emote(var/message) + return + +/mob/living/captive_brain/process_resist() + //Resisting control by an alien mind. + if(istype(src.loc,/mob/living/simple_mob/animal/borer)) + var/mob/living/simple_mob/animal/borer/B = src.loc + var/mob/living/captive_brain/H = src + + H << "You begin doggedly resisting the parasite's control (this will take approximately sixty seconds)." + B.host << "You feel the captive mind of [src] begin to resist your control." + + spawn(rand(200,250)+B.host.brainloss) + if(!B || !B.controlling) return + + B.host.adjustBrainLoss(rand(0.1,0.5)) + H << "With an immense exertion of will, you regain control of your body!" + B.host << "You feel control of the host brain ripped from your grasp, and retract your probosci before the wild neural impulses can damage you." + B.detatch() + verbs -= /mob/living/carbon/proc/release_control + verbs -= /mob/living/carbon/proc/punish_host + verbs -= /mob/living/carbon/proc/spawn_larvae + + return + + ..() diff --git a/code/modules/mob/living/simple_animal/borer/borer_powers.dm b/code/modules/mob/living/simple_animal/borer/borer_powers.dm new file mode 100644 index 0000000000..d5575f78e7 --- /dev/null +++ b/code/modules/mob/living/simple_animal/borer/borer_powers.dm @@ -0,0 +1,337 @@ +/mob/living/simple_mob/animal/borer/verb/release_host() + set category = "Abilities" + set name = "Release Host" + set desc = "Slither out of your host." + + if(!host) + to_chat(src, "You are not inside a host body.") + return + + if(stat) + to_chat(src, "You cannot leave your host in your current state.") + + if(docile) + to_chat(src, "You are feeling far too docile to do that.") + return + + if(!host || !src) return + + to_chat(src, "You begin disconnecting from [host]'s synapses and prodding at their internal ear canal.") + + if(!host.stat) + host << "An odd, uncomfortable pressure begins to build inside your skull, behind your ear..." + + spawn(100) + + if(!host || !src) return + + if(src.stat) + to_chat(src, "You cannot release your host in your current state.") + return + + to_chat(src, "You wiggle out of [host]'s ear and plop to the ground.") + if(host.mind) + if(!host.stat) + host << "Something slimy wiggles out of your ear and plops to the ground!" + host << "As though waking from a dream, you shake off the insidious mind control of the brain worm. Your thoughts are your own again." + + detatch() + leave_host() + +/mob/living/simple_mob/animal/borer/verb/infest() + set category = "Abilities" + set name = "Infest" + set desc = "Infest a suitable humanoid host." + + if(host) + to_chat(src, "You are already within a host.") + return + + if(stat) + to_chat(src, "You cannot infest a target in your current state.") + return + + var/list/choices = list() + for(var/mob/living/carbon/C in view(1,src)) + if(src.Adjacent(C)) + choices += C + + if(!choices.len) + to_chat(src, "There are no viable hosts within range...") + return + + var/mob/living/carbon/M = input(src,"Who do you wish to infest?") in null|choices + + if(!M || !src) return + + if(!(src.Adjacent(M))) return + + if(M.has_brain_worms()) + to_chat(src, "You cannot infest someone who is already infested!") + return + + if(istype(M,/mob/living/carbon/human)) + var/mob/living/carbon/human/H = M + + var/obj/item/organ/external/E = H.organs_by_name[BP_HEAD] + if(!E || E.is_stump()) + to_chat(src, "\The [H] does not have a head!") + + if(!H.should_have_organ("brain")) + to_chat(src, "\The [H] does not seem to have an ear canal to breach.") + return + + if(H.check_head_coverage()) + to_chat(src, "You cannot get through that host's protective gear.") + return + + M << "Something slimy begins probing at the opening of your ear canal..." + to_chat(src, "You slither up [M] and begin probing at their ear canal...") + + if(!do_after(src,30)) + to_chat(src, "As [M] moves away, you are dislodged and fall to the ground.") + return + + if(!M || !src) return + + if(src.stat) + to_chat(src, "You cannot infest a target in your current state.") + return + + if(M in view(1, src)) + to_chat(src, "You wiggle into [M]'s ear.") + if(!M.stat) + M << "Something disgusting and slimy wiggles into your ear!" + + src.host = M + src.forceMove(M) + + //Update their traitor status. + if(host.mind) + borers.add_antagonist_mind(host.mind, 1, borers.faction_role_text, borers.faction_welcome) + + if(istype(M,/mob/living/carbon/human)) + var/mob/living/carbon/human/H = M + var/obj/item/organ/I = H.internal_organs_by_name["brain"] + if(!I) // No brain organ, so the borer moves in and replaces it permanently. + replace_brain() + else + // If they're in normally, implant removal can get them out. + var/obj/item/organ/external/head = H.get_organ(BP_HEAD) + head.implants += src + + return + else + to_chat(src, "They are no longer in range!") + return + +/* +/mob/living/simple_mob/animal/borer/verb/devour_brain() + set category = "Abilities" + set name = "Devour Brain" + set desc = "Take permanent control of a dead host." + + if(!host) + to_chat(src, "You are not inside a host body.") + return + + if(host.stat != 2) + to_chat(src, "Your host is still alive.") + return + + if(stat) + to_chat(src, "You cannot do that in your current state.") + + if(docile) + to_chat(src, "You are feeling far too docile to do that.") + return + + + to_chat(src, "It only takes a few moments to render the dead host brain down into a nutrient-rich slurry...") + replace_brain() +*/ + +// BRAIN WORM ZOMBIES AAAAH. +/mob/living/simple_mob/animal/borer/proc/replace_brain() + + var/mob/living/carbon/human/H = host + + if(!istype(host)) + to_chat(src, "This host does not have a suitable brain.") + return + + to_chat(src, "You settle into the empty brainpan and begin to expand, fusing inextricably with the dead flesh of [H].") + + H.add_language("Cortical Link") + + if(host.stat == 2) + H.verbs |= /mob/living/carbon/human/proc/jumpstart + + H.verbs |= /mob/living/carbon/human/proc/psychic_whisper + H.verbs |= /mob/living/carbon/human/proc/tackle + H.verbs |= /mob/living/carbon/proc/spawn_larvae + + if(H.client) + H.ghostize(0) + + if(src.mind) + src.mind.special_role = "Borer Husk" + src.mind.transfer_to(host) + + H.ChangeToHusk() + + var/obj/item/organ/internal/borer/B = new(H) + H.internal_organs_by_name["brain"] = B + H.internal_organs |= B + + var/obj/item/organ/external/affecting = H.get_organ(BP_HEAD) + affecting.implants -= src + + var/s2h_id = src.computer_id + var/s2h_ip= src.lastKnownIP + src.computer_id = null + src.lastKnownIP = null + + if(!H.computer_id) + H.computer_id = s2h_id + + if(!H.lastKnownIP) + H.lastKnownIP = s2h_ip + +/mob/living/simple_mob/animal/borer/verb/secrete_chemicals() + set category = "Abilities" + set name = "Secrete Chemicals" + set desc = "Push some chemicals into your host's bloodstream." + + if(!host) + to_chat(src, "You are not inside a host body.") + return + + if(stat) + to_chat(src, "You cannot secrete chemicals in your current state.") + + if(docile) + to_chat(src, "You are feeling far too docile to do that.") + return + + if(chemicals < 50) + to_chat(src, "You don't have enough chemicals!") + + var/chem = input("Select a chemical to secrete.", "Chemicals") as null|anything in list("alkysine","bicaridine","hyperzine","tramadol") + + if(!chem || chemicals < 50 || !host || controlling || !src || stat) //Sanity check. + return + + to_chat(src, "You squirt a measure of [chem] from your reservoirs into [host]'s bloodstream.") + host.reagents.add_reagent(chem, 10) + chemicals -= 50 + +/mob/living/simple_mob/animal/borer/verb/dominate_victim() + set category = "Abilities" + set name = "Paralyze Victim" + set desc = "Freeze the limbs of a potential host with supernatural fear." + + if(world.time - used_dominate < 150) + to_chat(src, "You cannot use that ability again so soon.") + return + + if(host) + to_chat(src, "You cannot do that from within a host body.") + return + + if(src.stat) + to_chat(src, "You cannot do that in your current state.") + return + + var/list/choices = list() + for(var/mob/living/carbon/C in view(3,src)) + if(C.stat != 2) + choices += C + + if(world.time - used_dominate < 150) + to_chat(src, "You cannot use that ability again so soon.") + return + + var/mob/living/carbon/M = input(src,"Who do you wish to dominate?") in null|choices + + if(!M || !src) return + + if(M.has_brain_worms()) + to_chat(src, "You cannot infest someone who is already infested!") + return + + to_chat(src, "You focus your psychic lance on [M] and freeze their limbs with a wave of terrible dread.") + M << "You feel a creeping, horrible sense of dread come over you, freezing your limbs and setting your heart racing." + M.Weaken(10) + + used_dominate = world.time + +/mob/living/simple_mob/animal/borer/verb/bond_brain() + set category = "Abilities" + set name = "Assume Control" + set desc = "Fully connect to the brain of your host." + + if(!host) + to_chat(src, "You are not inside a host body.") + return + + if(src.stat) + to_chat(src, "You cannot do that in your current state.") + return + + if(docile) + to_chat(src, "You are feeling far too docile to do that.") + return + + to_chat(src, "You begin delicately adjusting your connection to the host brain...") + + spawn(100+(host.brainloss*5)) + + if(!host || !src || controlling) + return + else + + to_chat(src, "You plunge your probosci deep into the cortex of the host brain, interfacing directly with their nervous system.") + host << "You feel a strange shifting sensation behind your eyes as an alien consciousness displaces yours." + host.add_language("Cortical Link") + + // host -> brain + var/h2b_id = host.computer_id + var/h2b_ip= host.lastKnownIP + host.computer_id = null + host.lastKnownIP = null + + qdel(host_brain) + host_brain = new(src) + + host_brain.ckey = host.ckey + + host_brain.name = host.name + + if(!host_brain.computer_id) + host_brain.computer_id = h2b_id + + if(!host_brain.lastKnownIP) + host_brain.lastKnownIP = h2b_ip + + // self -> host + var/s2h_id = src.computer_id + var/s2h_ip= src.lastKnownIP + src.computer_id = null + src.lastKnownIP = null + + host.ckey = src.ckey + + if(!host.computer_id) + host.computer_id = s2h_id + + if(!host.lastKnownIP) + host.lastKnownIP = s2h_ip + + controlling = 1 + + host.verbs += /mob/living/carbon/proc/release_control + host.verbs += /mob/living/carbon/proc/punish_host + host.verbs += /mob/living/carbon/proc/spawn_larvae + + return diff --git a/code/modules/mob/living/simple_animal/borer/say.dm b/code/modules/mob/living/simple_animal/borer/say.dm new file mode 100644 index 0000000000..41229d9bd2 --- /dev/null +++ b/code/modules/mob/living/simple_animal/borer/say.dm @@ -0,0 +1,40 @@ +/mob/living/simple_mob/animal/borer/say(var/message) + + message = sanitize(message) + message = capitalize(message) + + if(!message) + return + + if (stat == 2) + return say_dead(message) + + if (stat) + return + + if (src.client) + if(client.prefs.muted & MUTE_IC) + to_chat(src, "You cannot speak in IC (muted).") + return + + if (copytext(message, 1, 2) == "*") + return emote(copytext(message, 2)) + + var/datum/language/L = parse_language(message) + if(L && L.flags & HIVEMIND) + L.broadcast(src,trim(copytext(message,3)),src.truename) + return + + if(!host) + //TODO: have this pick a random mob within 3 tiles to speak for the borer. + to_chat(src, "You have no host to speak to.") + return //No host, no audible speech. + + to_chat(src, "You drop words into [host]'s mind: \"[message]\"") + host << "Your own thoughts speak: \"[message]\"" + + for (var/mob/M in player_list) + if (istype(M, /mob/new_player)) + continue + else if(M.stat == DEAD && M.is_preference_enabled(/datum/client_preference/ghost_ears)) + M << "[src.truename] whispers to [host], \"[message]\"" \ No newline at end of file diff --git a/code/modules/mob/living/simple_mob/simple_mob_vr.dm b/code/modules/mob/living/simple_mob/simple_mob_vr.dm index d596b7a502..127bad2295 100644 --- a/code/modules/mob/living/simple_mob/simple_mob_vr.dm +++ b/code/modules/mob/living/simple_mob/simple_mob_vr.dm @@ -45,6 +45,9 @@ var/mount_offset_x = 5 // Horizontal riding offset. var/mount_offset_y = 8 // Vertical riding offset + var/obj/item/device/radio/headset/mob_headset/mob_radio //Adminbus headset for simplemob shenanigans. + does_spin = FALSE + // Release belly contents before being gc'd! /mob/living/simple_mob/Destroy() release_vore_contents() @@ -346,3 +349,81 @@ return if(buckle_mob(M)) visible_message("[M] starts riding [name]!") + +/mob/living/simple_mob/handle_message_mode(message_mode, message, verb, speaking, used_radios, alt_name) + if(mob_radio) + switch(message_mode) + if("intercom") + for(var/obj/item/device/radio/intercom/I in view(1, null)) + I.talk_into(src, message, verb, speaking) + used_radios += I + if("headset") + if(mob_radio && istype(mob_radio,/obj/item/device/radio/headset/mob_headset)) + mob_radio.talk_into(src,message,null,verb,speaking) + used_radios += mob_radio + else + if(message_mode) + if(mob_radio && istype(mob_radio,/obj/item/device/radio/headset/mob_headset)) + mob_radio.talk_into(src,message, message_mode, verb, speaking) + used_radios += mob_radio + else + ..() + +/mob/living/simple_mob/proc/leap() + set name = "Pounce Target" + set category = "Abilities" + set desc = "Select a target to pounce at." + + if(last_special > world.time) + to_chat(src, "Your legs need some more rest.") + return + + if(incapacitated(INCAPACITATION_DISABLED)) + to_chat(src, "You cannot leap in your current state.") + return + + var/list/choices = list() + for(var/mob/living/M in view(3,src)) + choices += M + choices -= src + + var/mob/living/T = input(src,"Who do you wish to leap at?") as null|anything in choices + + if(!T || !src || src.stat) return + + if(get_dist(get_turf(T), get_turf(src)) > 3) return + + if(last_special > world.time) + return + + if(usr.incapacitated(INCAPACITATION_DISABLED)) + to_chat(src, "You cannot leap in your current state.") + return + + last_special = world.time + 10 + status_flags |= LEAPING + pixel_y = pixel_y + 10 + + src.visible_message("\The [src] leaps at [T]!") + src.throw_at(get_step(get_turf(T),get_turf(src)), 4, 1, src) + playsound(src.loc, 'sound/effects/bodyfall1.ogg', 50, 1) + pixel_y = default_pixel_y + + sleep(5) + + if(status_flags & LEAPING) status_flags &= ~LEAPING + + if(!src.Adjacent(T)) + to_chat(src, "You miss!") + return + + if(ishuman(T)) + var/mob/living/carbon/human/H = T + if(H.species.lightweight == 1) + H.Weaken(3) + return + var/armor_block = run_armor_check(T, "melee") + var/armor_soak = get_armor_soak(T, "melee") + T.apply_damage(20, HALLOSS,, armor_block, armor_soak) + if(prob(33)) + T.apply_effect(3, WEAKEN, armor_block) \ No newline at end of file diff --git a/code/modules/mob/living/simple_mob/subtypes/humanoid/mercs/mercs.dm b/code/modules/mob/living/simple_mob/subtypes/humanoid/mercs/mercs.dm index bddfc140d4..237612acae 100644 --- a/code/modules/mob/living/simple_mob/subtypes/humanoid/mercs/mercs.dm +++ b/code/modules/mob/living/simple_mob/subtypes/humanoid/mercs/mercs.dm @@ -108,7 +108,7 @@ attack_edge = 1 attacktext = list("slashed") - loot_list = list(/obj/item/weapon/melee/energy/sword/red = 100, /obj/item/weapon/shield/energy = 100) + loot_list = list(/obj/item/weapon/melee/energy/sword = 100, /obj/item/weapon/shield/energy = 100) // They have a shield, so they try to block /mob/living/simple_mob/humanoid/merc/melee/sword/attackby(var/obj/item/O as obj, var/mob/user as mob) diff --git a/code/modules/mob/living/voice/voice.dm b/code/modules/mob/living/voice/voice.dm index 5b5d3005a1..8d7337df07 100644 --- a/code/modules/mob/living/voice/voice.dm +++ b/code/modules/mob/living/voice/voice.dm @@ -69,7 +69,7 @@ if(comm) comm.close_connection(user = src, target = src, reason = "[src] hung up") else - src << "You appear to not be inside a communicator. This is a bug and you should report it." + to_chat(src, "You appear to not be inside a communicator. This is a bug and you should report it.") // Verb: change_name() // Parameters: None @@ -90,7 +90,7 @@ log_game(msg) src.name = new_name else - src << "Invalid name. Rejected." + to_chat(src, "Invalid name. Rejected.") // Proc: Life() // Parameters: None diff --git a/code/modules/mob/mob.dm b/code/modules/mob/mob.dm index 5ecd18433c..5ce336ba4f 100644 --- a/code/modules/mob/mob.dm +++ b/code/modules/mob/mob.dm @@ -1110,10 +1110,10 @@ mob/proc/yank_out_object() //Exploitable Info Update /mob/proc/amend_exploitable(var/obj/item/I) - var/obj/item/exploit_item = new I(src.loc) - exploit_addons |= exploit_item - var/exploitmsg = html_decode("\n" + "Has " + exploit_item.name + ".") - exploit_record += exploitmsg + if(istype(I)) + exploit_addons |= I + var/exploitmsg = html_decode("\n" + "Has " + I.name + ".") + exploit_record += exploitmsg /client/proc/check_has_body_select() return mob && mob.hud_used && istype(mob.zone_sel, /obj/screen/zone_sel) diff --git a/code/modules/mob/new_player/login.dm b/code/modules/mob/new_player/login.dm index aef78c28ec..19c79b0658 100644 --- a/code/modules/mob/new_player/login.dm +++ b/code/modules/mob/new_player/login.dm @@ -27,7 +27,7 @@ var/obj/effect/lobby_image = new /obj/effect/lobby_image /mob/new_player/Login() update_Login_details() //handles setting lastKnownIP and computer_id for use by the ban systems as well as checking for multikeying if(join_motd) - src << "
[join_motd]
" + to_chat(src, "
[join_motd]
") if(!mind) mind = new /datum/mind(key) diff --git a/code/modules/mob/say_vr.dm b/code/modules/mob/say_vr.dm index bd5b516f9d..3fe73e3475 100644 --- a/code/modules/mob/say_vr.dm +++ b/code/modules/mob/say_vr.dm @@ -23,7 +23,7 @@ /mob/proc/custom_emote_vr(var/m_type=1,var/message = null) //This would normally go in emote.dm if(stat || !use_me && usr == src) - src << "You are unable to emote." + to_chat(src, "You are unable to emote.") return var/muzzled = is_muzzled() diff --git a/code/modules/mob/update_icons.dm b/code/modules/mob/update_icons.dm index 6004ca3e4c..7b9bb15baa 100644 --- a/code/modules/mob/update_icons.dm +++ b/code/modules/mob/update_icons.dm @@ -90,3 +90,4 @@ /mob/proc/update_targeted() return + diff --git a/code/modules/organs/organ.dm b/code/modules/organs/organ.dm index 215ef65ced..b9aecbe250 100644 --- a/code/modules/organs/organ.dm +++ b/code/modules/organs/organ.dm @@ -14,6 +14,7 @@ var/list/organ_cache = list() var/vital // Lose a vital limb, die immediately. var/damage = 0 // Current damage to the organ var/robotic = 0 + var/stapled_nerves = FALSE // Reference data. var/mob/living/carbon/human/owner // Current mob owning the organ. @@ -431,6 +432,8 @@ var/list/organ_cache = list() return 0 if(robotic && robotic < ORGAN_LIFELIKE) //Super fancy humanlike robotics probably have sensors, or something? return 0 + if(stapled_nerves) + return 0 return 1 /obj/item/organ/proc/handle_organ_mod_special(var/removed = FALSE) // Called when created, transplanted, and removed. diff --git a/code/modules/organs/organ_external.dm b/code/modules/organs/organ_external.dm index c8b02f02b8..433dfae84e 100644 --- a/code/modules/organs/organ_external.dm +++ b/code/modules/organs/organ_external.dm @@ -25,6 +25,7 @@ var/burn_dam = 0 // Actual current burn damage. var/last_dam = -1 // used in healing/processing calculations. var/spread_dam = 0 + var/thick_skin = 0 // If a needle has a chance to fail to penetrate. // Appearance vars. var/nonsolid // Snowflake warning, reee. Used for slime limbs. diff --git a/code/modules/organs/robolimbs.dm b/code/modules/organs/robolimbs.dm index 8f0ef8174c..a2643f04d0 100644 --- a/code/modules/organs/robolimbs.dm +++ b/code/modules/organs/robolimbs.dm @@ -123,6 +123,12 @@ var/const/standard_monitor_styles = "blank=ipc_blank;\ icon = 'icons/mob/human_races/cyberlimbs/cybersolutions/cybersolutions_alt1.dmi' unavailable_to_build = 1 +/datum/robolimb/einstein + company = "Einstein Engines" + desc = "This limb is lightweight with a sleek design." + icon = 'icons/mob/human_races/cyberlimbs/einstein/einstein_main.dmi' + unavailable_to_build = 1 + /datum/robolimb/grayson company = "Grayson" desc = "This limb has a sturdy and heavy build to it." diff --git a/code/modules/organs/subtypes/indestructible.dm b/code/modules/organs/subtypes/indestructible.dm index 2f2e13400f..169b7f2c38 100644 --- a/code/modules/organs/subtypes/indestructible.dm +++ b/code/modules/organs/subtypes/indestructible.dm @@ -63,3 +63,9 @@ cannot_amputate = 1 cannot_break = 1 dislocated = -1 + +/obj/item/organ/external/head/no_eyes/indestructible + cannot_gib = 1 + cannot_amputate = 1 + cannot_break = 1 + dislocated = -1 diff --git a/code/modules/organs/subtypes/xenos.dm b/code/modules/organs/subtypes/xenos.dm index dd860ab235..1c4cfa6907 100644 --- a/code/modules/organs/subtypes/xenos.dm +++ b/code/modules/organs/subtypes/xenos.dm @@ -137,3 +137,79 @@ if(ishuman(owner)) H = owner color = H.species.blood_color + + +// XENOMORPH EXTERNAL ORGANS + +/obj/item/organ/external/chest/unseverable/xeno + cannot_gib = 1 + cannot_amputate = 1 + thick_skin = TRUE + +/obj/item/organ/external/groin/unseverable/xeno + cannot_gib = 1 + cannot_amputate = 1 + encased = TRUE + thick_skin = TRUE + +/obj/item/organ/external/arm/unseverable/xeno + cannot_gib = 1 + cannot_amputate = 1 + stapled_nerves = TRUE + encased = TRUE + thick_skin = TRUE + +/obj/item/organ/external/arm/right/unseverable/xeno + cannot_gib = 1 + cannot_amputate = 1 + stapled_nerves = TRUE + encased = TRUE + thick_skin = TRUE + +/obj/item/organ/external/leg/unseverable/xeno + cannot_gib = 1 + cannot_amputate = 1 + stapled_nerves = TRUE + encased = TRUE + thick_skin = TRUE + +/obj/item/organ/external/leg/right/unseverable/xeno + cannot_gib = 1 + cannot_amputate = 1 + stapled_nerves = TRUE + encased = TRUE + thick_skin = TRUE + +/obj/item/organ/external/foot/unseverable/xeno + cannot_gib = 1 + cannot_amputate = 1 + stapled_nerves = TRUE + encased = TRUE + thick_skin = TRUE + +/obj/item/organ/external/foot/right/unseverable/xeno + cannot_gib = 1 + cannot_amputate = 1 + stapled_nerves = TRUE + encased = TRUE + thick_skin = TRUE + +/obj/item/organ/external/hand/unseverable/xeno + cannot_gib = 1 + cannot_amputate = 1 + stapled_nerves = TRUE + encased = TRUE + thick_skin = TRUE + +/obj/item/organ/external/hand/right/unseverable/xeno + cannot_gib = 1 + cannot_amputate = 1 + stapled_nerves = TRUE + encased = TRUE + thick_skin = TRUE + +/obj/item/organ/external/head/unseverable/xeno + cannot_gib = 1 + cannot_amputate = 1 + thick_skin = TRUE + eye_icon = "blank_eyes" diff --git a/code/modules/projectiles/targeting/targeting_mob.dm b/code/modules/projectiles/targeting/targeting_mob.dm index 765b59b478..1f2921354b 100644 --- a/code/modules/projectiles/targeting/targeting_mob.dm +++ b/code/modules/projectiles/targeting/targeting_mob.dm @@ -12,7 +12,7 @@ M.aiming = new(src) M.aiming.toggle_active() else - src << "This verb may only be used by living mobs, sorry." + to_chat(src, "This verb may only be used by living mobs, sorry.") return /mob/living/proc/stop_aiming(var/obj/item/thing, var/no_message = 0) diff --git a/code/modules/reagents/reagent_containers/syringes.dm b/code/modules/reagents/reagent_containers/syringes.dm index 092070e0a4..c68cc402cf 100644 --- a/code/modules/reagents/reagent_containers/syringes.dm +++ b/code/modules/reagents/reagent_containers/syringes.dm @@ -183,8 +183,8 @@ if(H.wear_suit) if(istype(H.wear_suit, /obj/item/clothing/suit/space)) injtime = injtime * 2 - else if(!H.can_inject(user, 1)) - return + if(!H.can_inject(user, 1)) + return else if(isliving(target)) diff --git a/code/modules/resleeving/infomorph.dm b/code/modules/resleeving/infomorph.dm index 6166bb6456..099f3c0a95 100644 --- a/code/modules/resleeving/infomorph.dm +++ b/code/modules/resleeving/infomorph.dm @@ -154,7 +154,7 @@ var/list/infomorph_emotions = list( // 20% chance to kill src.silence_time = world.timeofday + 120 * 10 // Silence for 2 minutes - src << "Communication circuit overload. Shutting down and reloading communication circuits - speech and messaging functionality will be unavailable until the reboot is complete." + to_chat(src, "Communication circuit overload. Shutting down and reloading communication circuits - speech and messaging functionality will be unavailable until the reboot is complete.") if(prob(20)) var/turf/T = get_turf_or_move(src.loc) for (var/mob/M in viewers(T)) @@ -337,7 +337,7 @@ var/list/infomorph_emotions = list( resting = !resting icon_state = resting ? "[chassis]_rest" : "[chassis]" - src << "You are now [resting ? "resting" : "getting up"]" + to_chat(src, "You are now [resting ? "resting" : "getting up"]") canmove = !resting @@ -384,11 +384,11 @@ var/list/infomorph_emotions = list( if(idaccessible == 0) idaccessible = 1 - src << "You allow access modifications." + to_chat(src, "You allow access modifications.") else idaccessible = 0 - src << "You block access modfications." + to_chat(src, "You block access modfications.") /mob/living/silicon/infomorph/verb/wipe_software() set name = "Suspend Self" @@ -423,7 +423,7 @@ var/list/infomorph_emotions = list( /mob/living/silicon/infomorph/say(var/msg) if(silence_time) - src << "Communication circuits remain uninitialized." + to_chat(src, "Communication circuits remain uninitialized.") else ..(msg) @@ -594,7 +594,7 @@ var/global/list/default_infomorph_software = list() if(silence_time) if(world.timeofday >= silence_time) silence_time = null - src << "Communication circuit reinitialized. Speech and messaging functionality restored." + to_chat(src, "Communication circuit reinitialized. Speech and messaging functionality restored.") handle_statuses() diff --git a/code/modules/resleeving/machines.dm b/code/modules/resleeving/machines.dm index 501a8c8670..57bc50683a 100644 --- a/code/modules/resleeving/machines.dm +++ b/code/modules/resleeving/machines.dm @@ -85,7 +85,7 @@ H.add_modifier(modifier_type) //Apply damage - H.adjustCloneLoss((H.getMaxHealth() - config.health_threshold_dead)*0.75) + H.adjustCloneLoss((H.getMaxHealth() - config.health_threshold_dead)*-0.75) H.Paralyse(4) H.updatehealth() diff --git a/code/modules/tension/tension.dm b/code/modules/tension/tension.dm index 841d691037..aa95662849 100644 --- a/code/modules/tension/tension.dm +++ b/code/modules/tension/tension.dm @@ -24,7 +24,7 @@ will_point_blank = ai_holder.pointblank var/potential_damage = 0 - if(!projectiletype || ( get_dist(src, threatened >= 1) && !will_point_blank ) ) // Melee damage. + if(!projectiletype || ( ( get_dist(src, threatened) >= 1) && !will_point_blank ) ) // Melee damage. potential_damage = (melee_damage_lower + melee_damage_upper) / 2 // Treat potential_damage as estimated DPS. If the enemy attacks twice as fast as usual, it will double the number. diff --git a/code/modules/vore/appearance/spider_taur_powers_vr.dm b/code/modules/vore/appearance/spider_taur_powers_vr.dm index 0fccc108ac..5675c6378a 100644 --- a/code/modules/vore/appearance/spider_taur_powers_vr.dm +++ b/code/modules/vore/appearance/spider_taur_powers_vr.dm @@ -29,7 +29,7 @@ mob/proc/weaveWeb() spawn(30) //3 seconds to form new /obj/effect/spider/stickyweb(src.loc) else - src << "You do not have enough nutrition to create webbing!" + to_chat(src, "You do not have enough nutrition to create webbing!") */ mob/proc/weaveWebBindings() @@ -42,4 +42,4 @@ mob/proc/weaveWebBindings() var/obj/item/clothing/suit/web_bindings/bindings = new() //This sprite is amazing, I must say. src.put_in_hands(bindings) else - src << "You do not have enough nutrition to create webbing!" //CK~ + to_chat(src, "You do not have enough nutrition to create webbing!") //CK~ diff --git a/code/modules/vore/eating/belly_obj_vr.dm b/code/modules/vore/eating/belly_obj_vr.dm index faf2d43d66..0afa43f649 100644 --- a/code/modules/vore/eating/belly_obj_vr.dm +++ b/code/modules/vore/eating/belly_obj_vr.dm @@ -225,7 +225,7 @@ //Clean up our own business items_preserved.Cut() - if(isanimal(owner)) + if(!ishuman(owner)) owner.update_icons() //Print notifications/sound if necessary @@ -273,7 +273,7 @@ Pred.bloodstr.trans_to(Prey, Pred.reagents.total_volume / absorbed_count) //Clean up our own business - if(isanimal(owner)) + if(!ishuman(owner)) owner.update_icons() //Print notifications/sound if necessary diff --git a/code/modules/vore/eating/bellymodes_vr.dm b/code/modules/vore/eating/bellymodes_vr.dm index e879eeddd5..39f480fda5 100644 --- a/code/modules/vore/eating/bellymodes_vr.dm +++ b/code/modules/vore/eating/bellymodes_vr.dm @@ -184,7 +184,8 @@ if((mode_flags & DM_FLAG_LEAVEREMAINS) && M.digest_leave_remains) handle_remains_leaving(M) digestion_death(M) - owner.update_icons() + if(!ishuman(owner)) + owner.update_icons() if(compensation > 0) if(isrobot(owner)) var/mob/living/silicon/robot/R = owner diff --git a/code/modules/vore/eating/digest_act_vr.dm b/code/modules/vore/eating/digest_act_vr.dm index 2467f5aaa2..e9cf239e66 100644 --- a/code/modules/vore/eating/digest_act_vr.dm +++ b/code/modules/vore/eating/digest_act_vr.dm @@ -108,9 +108,9 @@ if((. = ..())) if(isbelly(item_storage)) var/obj/belly/B = item_storage - . += 5 * (B.digest_brute + B.digest_burn) + . += 2 * (B.digest_brute + B.digest_burn) else - . += 70 //Organs give a little more + . += 30 //Organs give a little more /obj/item/weapon/storage/digest_act(var/atom/movable/item_storage = null) for(var/obj/item/I in contents) diff --git a/code/modules/vore/eating/living_vr.dm b/code/modules/vore/eating/living_vr.dm index 9d8e712b2d..fd361677cc 100644 --- a/code/modules/vore/eating/living_vr.dm +++ b/code/modules/vore/eating/living_vr.dm @@ -28,6 +28,7 @@ var/can_be_drop_prey = FALSE var/can_be_drop_pred = TRUE // Mobs are pred by default. var/next_preyloop // For Fancy sound internal loop + var/adminbus_trash = FALSE // For abusing trash eater for event shenanigans. // // Hook for generic creation of stuff on new creatures @@ -366,9 +367,8 @@ SA.prey_excludes[src] = world.time log_and_message_admins("[key_name(src)] used the OOC escape button to get out of [key_name(B.owner)] ([B.owner ? "JMP" : "null"])") - if(isanimal(B.owner)) - var/mob/living/simple_mob/SA = B.owner - SA.update_icons() + if(!ishuman(B.owner)) + B.owner.update_icons() //You're in a dogborg! else if(istype(loc, /obj/item/device/dogborg/sleeper)) @@ -589,7 +589,7 @@ to_chat(src, "You are not allowed to eat this.") return - if(is_type_in_list(I,edible_trash)) + if(is_type_in_list(I,edible_trash) | adminbus_trash) if(I.hidden_uplink) to_chat(src, "You really should not be eating this.") message_admins("[key_name(src)] has attempted to ingest an uplink item. ([src ? "JMP" : "null"])") diff --git a/code/modules/vore/eating/silicon_vr.dm b/code/modules/vore/eating/silicon_vr.dm index ef8b089777..65400c7707 100644 --- a/code/modules/vore/eating/silicon_vr.dm +++ b/code/modules/vore/eating/silicon_vr.dm @@ -78,7 +78,7 @@ return hologram.visible_message("[hologram] starts engulfing [prey] in hardlight holograms!") - src << "You begin engulfing [prey] in hardlight holograms." //Can't be part of the above, because the above is from the hologram. + to_chat(src, "You begin engulfing [prey] in hardlight holograms.") //Can't be part of the above, because the above is from the hologram. if(do_after(user=eyeobj,delay=50,target=prey,needhand=0) && holo && hologram && !hologram.bellied) //Didn't move and still projecting and effect exists and no other bellied people hologram.get_prey(prey) diff --git a/icons/mob/alien.dmi b/icons/mob/alien.dmi index 63f2d47b24..f00110275d 100644 Binary files a/icons/mob/alien.dmi and b/icons/mob/alien.dmi differ diff --git a/icons/mob/human_races/cyberlimbs/einstein/einstein_main.dmi b/icons/mob/human_races/cyberlimbs/einstein/einstein_main.dmi new file mode 100644 index 0000000000..f7521505dd Binary files /dev/null and b/icons/mob/human_races/cyberlimbs/einstein/einstein_main.dmi differ diff --git a/icons/mob/items/lefthand_melee.dmi b/icons/mob/items/lefthand_melee.dmi index dbef5acf99..92199228ca 100644 Binary files a/icons/mob/items/lefthand_melee.dmi and b/icons/mob/items/lefthand_melee.dmi differ diff --git a/icons/mob/items/righthand_melee.dmi b/icons/mob/items/righthand_melee.dmi index 5cfed3c119..e2f1b7ee47 100644 Binary files a/icons/mob/items/righthand_melee.dmi and b/icons/mob/items/righthand_melee.dmi differ diff --git a/icons/obj/kitchen.dmi b/icons/obj/kitchen.dmi index 92ac55f966..6c5a251283 100644 Binary files a/icons/obj/kitchen.dmi and b/icons/obj/kitchen.dmi differ diff --git a/icons/obj/stacks.dmi b/icons/obj/stacks.dmi index 2d51ed3634..5fd362c7cb 100644 Binary files a/icons/obj/stacks.dmi and b/icons/obj/stacks.dmi differ diff --git a/icons/obj/structures.dmi b/icons/obj/structures.dmi index 908c2981dd..89a5e9071d 100644 Binary files a/icons/obj/structures.dmi and b/icons/obj/structures.dmi differ diff --git a/icons/obj/weapons.dmi b/icons/obj/weapons.dmi index da2754d04b..213b884a33 100644 Binary files a/icons/obj/weapons.dmi and b/icons/obj/weapons.dmi differ diff --git a/icons/turf/wall_masks.dmi b/icons/turf/wall_masks.dmi index bda615cd5c..916d230ffd 100644 Binary files a/icons/turf/wall_masks.dmi and b/icons/turf/wall_masks.dmi differ diff --git a/interface/interface.dm b/interface/interface.dm index 6ecfde4e7c..29a3695d33 100644 --- a/interface/interface.dm +++ b/interface/interface.dm @@ -9,11 +9,11 @@ var/output = replacetext(config.wikisearchurl, "%s", url_encode(query)) src << link(output) else - src << " The wiki search URL is not set in the server configuration." + to_chat(src, " The wiki search URL is not set in the server configuration.") else src << link(config.wikiurl) else - src << "The wiki URL is not set in the server configuration." + to_chat(src, "The wiki URL is not set in the server configuration.") return /client/verb/forum() @@ -25,7 +25,7 @@ return src << link(config.forumurl) else - src << "The forum URL is not set in the server configuration." + to_chat(src, "The forum URL is not set in the server configuration.") return /client/verb/rules() @@ -38,7 +38,7 @@ return src << link(config.rulesurl) else - src << "The rules URL is not set in the server configuration." + to_chat(src, "The rules URL is not set in the server configuration.") return /client/verb/map() @@ -51,7 +51,7 @@ return src << link(config.mapurl) else - src << "The map URL is not set in the server configuration." + to_chat(src, "The map URL is not set in the server configuration.") return /client/verb/github() @@ -64,7 +64,7 @@ return src << link(config.githuburl) else - src << "The GitHub URL is not set in the server configuration." + to_chat(src, "The GitHub URL is not set in the server configuration.") return /client/verb/hotkeys_help() diff --git a/maps/southern_cross/southern_cross-6.dmm b/maps/southern_cross/southern_cross-6.dmm index 1045e5703b..26deeda170 100644 --- a/maps/southern_cross/southern_cross-6.dmm +++ b/maps/southern_cross/southern_cross-6.dmm @@ -220,7 +220,7 @@ "el" = (/obj/structure/table/rack,/obj/item/weapon/gun/projectile/automatic/z8,/obj/item/weapon/gun/projectile/automatic/z8,/turf/unsimulated/floor{icon_state = "dark"},/area/centcom/specops) "em" = (/obj/structure/table/rack,/obj/item/weapon/rig/ert/assetprotection,/obj/item/weapon/rig/ert/assetprotection,/obj/item/weapon/rig/ert/assetprotection,/obj/item/weapon/rig/ert/assetprotection,/obj/item/weapon/rig/ert/assetprotection,/obj/item/weapon/rig/ert/assetprotection,/turf/unsimulated/floor{icon_state = "dark"},/area/centcom/specops) "en" = (/obj/structure/table/rack,/obj/item/weapon/gun/energy/sniperrifle,/turf/unsimulated/floor{icon_state = "dark"},/area/centcom/specops) -"eo" = (/obj/structure/table/rack,/obj/item/weapon/melee/energy/sword/blue,/obj/item/weapon/melee/energy/sword/blue,/obj/item/weapon/melee/energy/sword/blue,/obj/item/weapon/melee/energy/sword/blue,/turf/unsimulated/floor{icon_state = "dark"},/area/centcom/specops) +"eo" = (/obj/structure/table/rack,/obj/item/weapon/melee/energy/sword,/turf/unsimulated/floor{icon_state = "dark"},/area/centcom/specops) "ep" = (/obj/structure/table/rack,/obj/item/weapon/gun/projectile/automatic/l6_saw,/obj/item/ammo_magazine/m545saw,/obj/item/ammo_magazine/m545saw,/obj/item/ammo_magazine/m545saw,/obj/item/ammo_magazine/m545saw,/turf/unsimulated/floor{icon_state = "dark"},/area/centcom/specops) "eq" = (/obj/structure/table/rack,/obj/item/weapon/shield/energy,/obj/item/weapon/shield/energy,/obj/item/weapon/shield/energy,/obj/item/weapon/shield/energy,/turf/unsimulated/floor{icon_state = "dark"},/area/centcom/specops) "er" = (/obj/structure/table/rack,/obj/item/weapon/gun/energy/laser,/obj/item/weapon/gun/energy/laser,/turf/unsimulated/floor{icon_state = "dark"},/area/centcom/specops) @@ -508,7 +508,7 @@ "jN" = (/obj/machinery/door/airlock/external{frequency = 1380; icon_state = "door_locked"; id_tag = "escape_pod_1_recovery_hatch"; locked = 1; name = "Recovery Shuttle Dock 1"; req_access = list(13)},/turf/simulated/shuttle/floor/black,/area/centcom/evac) "jO" = (/obj/machinery/door/airlock/external{frequency = 1380; icon_state = "door_locked"; id_tag = "escape_pod_2_recovery_hatch"; locked = 1; name = "Recovery Shuttle Dock 2"; req_access = list(13)},/turf/simulated/shuttle/floor/black,/area/centcom/evac) "jP" = (/obj/machinery/door/airlock/command{name = "Thunderdome Administration"; req_access = list(102)},/turf/unsimulated/floor{icon_state = "vault"; dir = 5},/area/tdome) -"jQ" = (/obj/structure/table/rack,/obj/item/clothing/under/color/red,/obj/item/clothing/shoes/brown,/obj/item/clothing/suit/armor/tdome/red,/obj/item/clothing/head/helmet/thunderdome,/obj/item/weapon/melee/baton/loaded,/obj/item/weapon/melee/energy/sword/red,/turf/unsimulated/floor{icon_state = "vault"; dir = 5},/area/tdome) +"jQ" = (/obj/structure/table/rack,/obj/item/clothing/under/color/red,/obj/item/clothing/shoes/brown,/obj/item/clothing/suit/armor/tdome/red,/obj/item/clothing/head/helmet/thunderdome,/obj/item/weapon/melee/baton/loaded,/turf/unsimulated/floor{icon_state = "vault"; dir = 5},/area/tdome) "jR" = (/obj/structure/closet/chefcloset,/obj/item/glass_jar,/obj/item/device/retail_scanner/civilian,/obj/item/weapon/soap/nanotrasen,/obj/item/device/destTagger{pixel_x = 4; pixel_y = 3},/obj/item/weapon/packageWrap,/obj/item/weapon/packageWrap,/obj/item/weapon/packageWrap,/obj/effect/floor_decal/corner/white/diagonal,/turf/unsimulated/floor{icon_state = "steel"},/area/centcom/bar) "jS" = (/obj/effect/floor_decal/corner/white/diagonal,/turf/unsimulated/floor{icon_state = "steel"},/area/centcom/bar) "jT" = (/turf/unsimulated/floor{icon_state = "freezerfloor"; dir = 2},/area/centcom/bar) @@ -924,7 +924,7 @@ "rN" = (/obj/machinery/computer/shuttle_control{name = "Beruang control console"; req_access = list(160); shuttle_tag = "Trade"},/turf/unsimulated/floor{icon_state = "steel"},/area/shuttle/trade) "rO" = (/obj/structure/closet/crate,/turf/unsimulated/floor{icon_state = "vault"; dir = 1},/area/shuttle/trade) "rP" = (/turf/unsimulated/floor{icon_state = "dark"},/area/shuttle/trade) -"rQ" = (/obj/structure/table/rack,/obj/item/clothing/under/color/green,/obj/item/clothing/shoes/brown,/obj/item/clothing/suit/armor/tdome/green,/obj/item/clothing/head/helmet/thunderdome,/obj/item/weapon/melee/baton/loaded,/obj/item/weapon/melee/energy/sword/green,/turf/unsimulated/floor{icon_state = "vault"; dir = 5},/area/tdome) +"rQ" = (/obj/structure/table/rack,/obj/item/clothing/under/color/green,/obj/item/clothing/shoes/brown,/obj/item/clothing/suit/armor/tdome/green,/obj/item/clothing/head/helmet/thunderdome,/obj/item/weapon/melee/baton/loaded,/turf/unsimulated/floor{icon_state = "vault"; dir = 5},/area/tdome) "rR" = (/obj/machinery/door/airlock/centcom{name = "Bridge Access"; opacity = 1; req_access = list(101)},/turf/unsimulated/floor{icon_state = "steel"},/area/centcom/main_hall) "rS" = (/obj/machinery/door/airlock/glass_centcom{name = "Bridge Access"; req_access = list(101)},/turf/unsimulated/floor{icon_state = "steel"},/area/centcom/main_hall) "rT" = (/obj/machinery/door/airlock{name = "Unit 2"},/turf/unsimulated/floor{icon_state = "freezerfloor"; dir = 2},/area/centcom/bar) @@ -2262,7 +2262,7 @@ "Rz" = (/obj/effect/floor_decal/corner/green/full,/obj/structure/window/reinforced/holowindow/disappearing{dir = 8},/turf/simulated/floor/holofloor/tiled,/area/holodeck/source_thunderdomecourt) "RA" = (/obj/effect/floor_decal/corner/red/full{dir = 4},/obj/structure/window/reinforced/holowindow/disappearing{dir = 4},/turf/simulated/floor/holofloor/tiled,/area/holodeck/source_thunderdomecourt) "RB" = (/obj/effect/floor_decal/corner/green{dir = 10},/turf/simulated/floor/holofloor/tiled,/area/holodeck/source_thunderdomecourt) - + (1,1,1) = {" aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa @@ -2520,4 +2520,3 @@ aaaaRfababababababababababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa "} - diff --git a/maps/tether/submaps/tether_misc.dmm b/maps/tether/submaps/tether_misc.dmm index 0c6b76a601..d5fef965ee 100644 --- a/maps/tether/submaps/tether_misc.dmm +++ b/maps/tether/submaps/tether_misc.dmm @@ -6926,12 +6926,12 @@ /obj/item/weapon/shield/energy, /obj/item/weapon/shield/energy, /obj/item/weapon/shield/energy, -/obj/item/weapon/melee/energy/sword/red, -/obj/item/weapon/melee/energy/sword/red, -/obj/item/weapon/melee/energy/sword/red, -/obj/item/weapon/melee/energy/sword/red, -/obj/item/weapon/melee/energy/sword/red, -/obj/item/weapon/melee/energy/sword/red, +/obj/item/weapon/melee/energy/sword, +/obj/item/weapon/melee/energy/sword, +/obj/item/weapon/melee/energy/sword, +/obj/item/weapon/melee/energy/sword, +/obj/item/weapon/melee/energy/sword, +/obj/item/weapon/melee/energy/sword, /obj/machinery/recharger/wallcharger{ pixel_x = 5; pixel_y = 32 diff --git a/maps/tether/tether-10-colony.dmm b/maps/tether/tether-10-colony.dmm index 494b0f48c3..8b29e3ea3f 100644 --- a/maps/tether/tether-10-colony.dmm +++ b/maps/tether/tether-10-colony.dmm @@ -264,11 +264,11 @@ /obj/item/weapon/shield/energy, /obj/item/weapon/shield/energy, /obj/effect/floor_decal/industrial/outline/yellow, -/obj/item/weapon/melee/energy/sword/blue, -/obj/item/weapon/melee/energy/sword/blue, -/obj/item/weapon/melee/energy/sword/blue, -/obj/item/weapon/melee/energy/sword/blue, -/obj/item/weapon/melee/energy/sword/blue, +/obj/item/weapon/melee/energy/sword, +/obj/item/weapon/melee/energy/sword, +/obj/item/weapon/melee/energy/sword, +/obj/item/weapon/melee/energy/sword, +/obj/item/weapon/melee/energy/sword, /obj/effect/floor_decal/industrial/outline/yellow, /obj/structure/window/reinforced{ dir = 1 @@ -3375,7 +3375,7 @@ /obj/item/clothing/suit/armor/tdome/red, /obj/item/clothing/head/helmet/thunderdome, /obj/item/weapon/melee/baton/loaded, -/obj/item/weapon/melee/energy/sword/red, +/obj/item/weapon/melee/energy/sword, /turf/unsimulated/floor{ icon_state = "vault"; dir = 5 @@ -3426,7 +3426,7 @@ /obj/item/clothing/suit/armor/tdome/green, /obj/item/clothing/head/helmet/thunderdome, /obj/item/weapon/melee/baton/loaded, -/obj/item/weapon/melee/energy/sword/green, +/obj/item/weapon/melee/energy/sword, /turf/unsimulated/floor{ icon_state = "vault"; dir = 5 @@ -4325,11 +4325,11 @@ /obj/item/weapon/shield/energy, /obj/item/weapon/shield/energy, /obj/effect/floor_decal/industrial/outline/yellow, -/obj/item/weapon/melee/energy/sword/blue, -/obj/item/weapon/melee/energy/sword/blue, -/obj/item/weapon/melee/energy/sword/blue, -/obj/item/weapon/melee/energy/sword/blue, -/obj/item/weapon/melee/energy/sword/blue, +/obj/item/weapon/melee/energy/sword, +/obj/item/weapon/melee/energy/sword, +/obj/item/weapon/melee/energy/sword, +/obj/item/weapon/melee/energy/sword, +/obj/item/weapon/melee/energy/sword, /turf/unsimulated/floor{ icon_state = "vault"; dir = 5 diff --git a/sound/machines/air_pump/airpumpidle.ogg b/sound/machines/air_pump/airpumpidle.ogg new file mode 100644 index 0000000000..25635cc31c Binary files /dev/null and b/sound/machines/air_pump/airpumpidle.ogg differ diff --git a/sound/machines/air_pump/airpumpshutdown.ogg b/sound/machines/air_pump/airpumpshutdown.ogg new file mode 100644 index 0000000000..19969041be Binary files /dev/null and b/sound/machines/air_pump/airpumpshutdown.ogg differ diff --git a/sound/machines/air_pump/airpumpstart.ogg b/sound/machines/air_pump/airpumpstart.ogg new file mode 100644 index 0000000000..312cf94895 Binary files /dev/null and b/sound/machines/air_pump/airpumpstart.ogg differ