diff --git a/baystation12.dme b/baystation12.dme index acba0a7b7f9..2624afaac9e 100644 --- a/baystation12.dme +++ b/baystation12.dme @@ -79,6 +79,7 @@ #include "code\controllers\_DynamicAreaLighting_TG.dm" #include "code\controllers\configuration.dm" #include "code\controllers\failsafe.dm" +#include "code\controllers\garbage.dm" #include "code\controllers\lighting_controller.dm" #include "code\controllers\master_controller.dm" #include "code\controllers\shuttle_controller.dm" @@ -579,7 +580,6 @@ #include "code\game\objects\items\weapons\power_cells.dm" #include "code\game\objects\items\weapons\RCD.dm" #include "code\game\objects\items\weapons\RCS.dm" -#include "code\game\objects\items\weapons\RPD.dm" #include "code\game\objects\items\weapons\RSF.dm" #include "code\game\objects\items\weapons\scrolls.dm" #include "code\game\objects\items\weapons\shields.dm" @@ -1102,7 +1102,6 @@ #include "code\modules\mob\living\simple_animal\friendly\farm_animals.dm" #include "code\modules\mob\living\simple_animal\friendly\lizard.dm" #include "code\modules\mob\living\simple_animal\friendly\mouse.dm" -#include "code\modules\mob\living\simple_animal\friendly\mushroom.dm" #include "code\modules\mob\living\simple_animal\friendly\slime.dm" #include "code\modules\mob\living\simple_animal\friendly\spiderbot.dm" #include "code\modules\mob\living\simple_animal\friendly\tomato.dm" @@ -1117,6 +1116,7 @@ #include "code\modules\mob\living\simple_animal\hostile\hostile.dm" #include "code\modules\mob\living\simple_animal\hostile\mimic.dm" #include "code\modules\mob\living\simple_animal\hostile\mining_mobs.dm" +#include "code\modules\mob\living\simple_animal\hostile\mushroom.dm" #include "code\modules\mob\living\simple_animal\hostile\pirate.dm" #include "code\modules\mob\living\simple_animal\hostile\russian.dm" #include "code\modules\mob\living\simple_animal\hostile\syndicate.dm" @@ -1382,6 +1382,7 @@ #include "code\WorkInProgress\fireworks.dm" #include "code\WorkInProgress\periodic_news.dm" #include "code\WorkInProgress\Apples\artifacts.dm" +#include "code\WorkInProgress\Cael_Aislinn\sculpture.dm" #include "code\WorkInProgress\Cael_Aislinn\Jungle\falsewall.dm" #include "code\WorkInProgress\Cael_Aislinn\Jungle\jungle.dm" #include "code\WorkInProgress\Cael_Aislinn\Jungle\jungle_animals.dm" diff --git a/code/ATMOSPHERICS/components/portables_connector.dm b/code/ATMOSPHERICS/components/portables_connector.dm index f4aa409c45d..4b54a943773 100644 --- a/code/ATMOSPHERICS/components/portables_connector.dm +++ b/code/ATMOSPHERICS/components/portables_connector.dm @@ -154,4 +154,4 @@ "\blue You have unfastened \the [src].", \ "You hear ratchet.") new /obj/item/pipe(loc, make_from=src) - del(src) + qdel(src) diff --git a/code/ATMOSPHERICS/components/unary/vent_pump.dm b/code/ATMOSPHERICS/components/unary/vent_pump.dm index 330e39481bf..2573366b222 100644 --- a/code/ATMOSPHERICS/components/unary/vent_pump.dm +++ b/code/ATMOSPHERICS/components/unary/vent_pump.dm @@ -90,6 +90,9 @@ if(welded) return 0 + // New GC does this sometimes + if(!loc) return + var/datum/gas_mixture/environment = loc.return_air() var/environment_pressure = environment.return_pressure() diff --git a/code/ATMOSPHERICS/components/unary/vent_scrubber.dm b/code/ATMOSPHERICS/components/unary/vent_scrubber.dm index ea32b9432ff..917d165a125 100644 --- a/code/ATMOSPHERICS/components/unary/vent_scrubber.dm +++ b/code/ATMOSPHERICS/components/unary/vent_scrubber.dm @@ -107,6 +107,8 @@ //broadcast_status() if(!on) return 0 + // New GC does this sometimes + if(!loc) return var/datum/gas_mixture/environment = loc.return_air() diff --git a/code/ATMOSPHERICS/datum_pipe_network.dm b/code/ATMOSPHERICS/datum_pipe_network.dm index bff2d0ee5ee..5e731cd8d62 100644 --- a/code/ATMOSPHERICS/datum_pipe_network.dm +++ b/code/ATMOSPHERICS/datum_pipe_network.dm @@ -30,7 +30,7 @@ datum/pipe_network //Notes: Assuming that members will add themselves to appropriate roster in network_expand() if(!start_normal) - del(src) + qdel(src) start_normal.network_expand(src, reference) @@ -39,7 +39,7 @@ datum/pipe_network if((normal_members.len>0)||(line_members.len>0)) pipe_networks += src else - del(src) + qdel(src) proc/merge(datum/pipe_network/giver) if(giver==src) return 0 diff --git a/code/ATMOSPHERICS/he_pipes.dm b/code/ATMOSPHERICS/he_pipes.dm index 259b70b633f..a14fb1e1289 100644 --- a/code/ATMOSPHERICS/he_pipes.dm +++ b/code/ATMOSPHERICS/he_pipes.dm @@ -94,7 +94,7 @@ var/have_node2 = node2?1:0 icon_state = "exposed[have_node1][have_node2]" if(!node1&&!node2) - del(src) + qdel(src) /obj/machinery/atmospherics/pipe/simple/heat_exchanging/junction/initialize() for(var/obj/machinery/atmospherics/target in get_step(src,initialize_directions)) diff --git a/code/ATMOSPHERICS/pipes.dm b/code/ATMOSPHERICS/pipes.dm index d2ca131f4cb..e6736b466f5 100644 --- a/code/ATMOSPHERICS/pipes.dm +++ b/code/ATMOSPHERICS/pipes.dm @@ -164,7 +164,7 @@ obj/machinery/atmospherics/pipe var/datum/effect/effect/system/harmless_smoke_spread/smoke = new smoke.set_up(1,0, src.loc, 0) smoke.start() - del(src) + qdel(src) proc/normalize_dir() if(dir==3) @@ -202,7 +202,7 @@ obj/machinery/atmospherics/pipe else if(!node1&&!node2) - del(src) //TODO: silent deleting looks weird + qdel(src) //TODO: silent deleting looks weird var/have_node1 = node1?1:0 var/have_node2 = node2?1:0 icon_state = "exposed[have_node1][have_node2][invisibility ? "-f" : "" ]" @@ -540,7 +540,6 @@ obj/machinery/atmospherics/pipe dir = SOUTH initialize_directions = SOUTH - var/build_killswitch = 1 var/obj/machinery/atmospherics/node1 @@ -740,7 +739,7 @@ obj/machinery/atmospherics/pipe icon_state = "manifold_[connected]_[unconnected]" if(!connected) - del(src) + qdel(src) return @@ -998,7 +997,7 @@ obj/machinery/atmospherics/pipe overlays += new/image(con,dir=8) if(!node1 && !node2 && !node3 && !node4) - del(src) + qdel(src) return initialize() @@ -1228,4 +1227,4 @@ obj/machinery/atmospherics/pipe/attackby(var/obj/item/weapon/W as obj, var/mob/u if (meter.target == src) new /obj/item/pipe_meter(T) del(meter) - del(src) + qdel(src) diff --git a/code/WorkInProgress/Cael_Aislinn/sculpture.dm b/code/WorkInProgress/Cael_Aislinn/sculpture.dm index 2ecc98a4aec..0a1b14d1ae0 100644 --- a/code/WorkInProgress/Cael_Aislinn/sculpture.dm +++ b/code/WorkInProgress/Cael_Aislinn/sculpture.dm @@ -22,10 +22,8 @@ /mob/living/simple_animal/sculpture/proc/GrabMob(var/mob/living/target) if(target && target != src && ishuman(target)) - G = new /obj/item/weapon/grab(target) - G.assailant = src - G.layer = 20 - G.affecting = target + G = new /obj/item/weapon/grab(src, target) + G.loc=src target.grabbed_by += G G.synch() target.LAssailant = src @@ -34,13 +32,12 @@ visible_message("\red [src] has grabbed [target]!") target << "\red You feel something suddenly grab you around the neck from behind! Everything goes black..." - G.state = 3 - G.killing = 1 + G.state = GRAB_KILL desc = "It's some kind of human sized, doll-like sculpture, with weird discolourations on some parts of it. It appears to be quite solid. [G ? "\red The sculpture is holding [G.affecting] in a vice-like grip." : ""]" target.attack_log += text("\[[time_stamp()]\] Has been grabbed by SCP-173, and is being strangled!") log_admin("[target] ([target.ckey]) has been grabbed and is being strangled by SCP-173.") - message_admins("Alert: [target.real_name] has been grabbed and is being strangled by SCP-173. Set var/allow_escape = 1 to allow this player to escape temporarily, or var/hibernate = 1 to disable it entirely.") + message_admins("Alert: [target.real_name] has been grabbed and is being strangled by SCP-173.") //Set var/allow_escape = 1 to allow this player to escape temporarily, or var/hibernate = 1 to disable it entirely. /mob/living/simple_animal/sculpture/proc/Escape() var/list/turfs = new/list() @@ -49,7 +46,7 @@ continue else if(istype(thisturf, /turf/simulated/wall)) continue - else if(istype(thisturf, /turf/simulated/mineral)) + else if(istype(thisturf, /turf/unsimulated/mineral)) continue else if(istype(thisturf, /turf/simulated/shuttle/wall)) continue @@ -73,12 +70,11 @@ desc = "It's some kind of human sized, doll-like sculpture, with weird discolourations on some parts of it. It appears to be quite solid." //if we are sent into forced hibernation mode, allow our victim to escape - if(hibernate && G && G.killing == 1) + if(hibernate && G && G.state == GRAB_KILL) if(G) G.affecting << "\red You suddenly feel the grip around your neck being loosened!" - visible_message("\red [src] suddenly loosens it's grip!") - G.killing = 0 - G.state = 1 + visible_message("\red [src] suddenly loosens it's grip due to hibernate!") + G.state = GRAB_AGGRESSIVE return // @@ -87,8 +83,7 @@ if(G) G.affecting << "\red You suddenly feel the grip around your neck being loosened!" visible_message("\red [src] suddenly loosens it's grip!") - G.killing = 0 - G.state = 1 + G.state = GRAB_AGGRESSIVE if(!observed) Escape() observed = 1 @@ -97,6 +92,10 @@ if(istype(get_turf(src), /turf/space) || hibernate) return + // Grabbing + if(G) + G.process() + for(var/mob/living/M in view(7, src)) if(M.stat || M == src) continue @@ -136,7 +135,7 @@ //see if we're able to do stuff if(!observed || in_darkness) if(G) - if(prob(random_escape_chance)) + if(prob(1)) //chance to allow the stranglee to escape allow_escape = 1 if(G.affecting.stat == 2) @@ -212,7 +211,7 @@ continue else if(istype(thisturf, /turf/simulated/wall)) continue - else if(istype(thisturf, /turf/simulated/mineral)) + else if(istype(thisturf, /turf/unsimulated/mineral)) continue else if(istype(thisturf, /turf/simulated/shuttle/wall)) continue @@ -237,13 +236,13 @@ src.dir = get_dir(src, target_mob) next_turf = get_step(src, get_dir(next_turf,target_turf)) num_turfs-- - else if(G) - //we can't move while observed, so we can't effectively strangle any more - //our grip is still rock solid, but the victim has a chance to escape - G.affecting << "\red You suddenly feel the grip around your neck being loosened!" - visible_message("\red [src] suddenly loosens it's grip!") - G.state = 1 - G.killing = 0 + +// else if(G) +// //we can't move while observed, so we can't effectively strangle any more //since victim is observer this means no strangling +// //our grip is still rock solid, but the victim has a chance to escape +// G.affecting << "\red You suddenly feel the grip around your neck being loosened!" +// visible_message("\red [src] suddenly loosens it's grip due to being observed!") +// G.state = GRAB_AGGRESSIVE /mob/living/simple_animal/sculpture/attackby(var/obj/item/O as obj, var/mob/user as mob) ..() diff --git a/code/WorkInProgress/ZomgPonies/karma.dm b/code/WorkInProgress/ZomgPonies/karma.dm index 0212fc5067e..562139e92be 100644 --- a/code/WorkInProgress/ZomgPonies/karma.dm +++ b/code/WorkInProgress/ZomgPonies/karma.dm @@ -147,10 +147,12 @@ You've gained [totalkarma] total karma in your time here.
"} Unlock Nanotrasen Representative -- 15KP
Unlock Customs Officer -- 30KP
Unlock BlueShield -- 30KP
- Unlock Kidan -- 30KP
- Unlock Grey -- 30KP
- Unlock Vox -- 45KP
- Unlock Slime People -- 45KP
+
+ Unlock Machine People -- 15KP
+ Unlock Kidan -- 30KP
+ Unlock Grey -- 30KP
+ Unlock Vox -- 45KP
+ Unlock Slime People -- 45KP
PLEASE NOTE THAT PEOPLE WHO TRY TO GAME THE KARMA SYSTEM WILL END UP ON THE WALL OF SHAME. THIS INCLUDES BUT IS NOT LIMITED TO TRADES, OOC KARMA BEGGING, CODE EXPLOITS, ETC. "} diff --git a/code/__HELPERS/global_lists.dm b/code/__HELPERS/global_lists.dm index e1ec0585d68..0805f639c4d 100644 --- a/code/__HELPERS/global_lists.dm +++ b/code/__HELPERS/global_lists.dm @@ -39,8 +39,8 @@ var/global/list/facial_hair_styles_male_list = list() var/global/list/facial_hair_styles_female_list = list() var/global/list/skin_styles_female_list = list() //unused //Underwear -var/global/list/underwear_m = list("White", "Grey", "Green", "Blue", "Black", "Mankini", "Love-Hearts", "Black2", "Grey2", "Stripey", "Kinky", "None") //Curse whoever made male/female underwear diffrent colours -var/global/list/underwear_f = list("Red", "White", "Yellow", "Blue", "Black", "Thong", "Babydoll", "Baby-Blue", "Green", "Pink", "Kinky", "None") +var/global/list/underwear_m = list("White", "Grey", "Green", "Blue", "Black", "Mankini", "None") //Curse whoever made male/female underwear diffrent colours +var/global/list/underwear_f = list("Red", "White", "Yellow", "Blue", "Black", "Thong", "None") //Backpacks var/global/list/backbaglist = list("Nothing", "Backpack", "Satchel", "Satchel Alt") @@ -125,4 +125,4 @@ var/global/list/backbaglist = list("Nothing", "Backpack", "Satchel", "Satchel Al for(var/path in typesof(prototype)) if(path == prototype) continue L += new path() - return L \ No newline at end of file + return L diff --git a/code/__HELPERS/unsorted.dm b/code/__HELPERS/unsorted.dm index 90446e59589..e1a70bb3a14 100644 --- a/code/__HELPERS/unsorted.dm +++ b/code/__HELPERS/unsorted.dm @@ -1572,3 +1572,40 @@ proc/check_target_facings(mob/living/initator, mob/living/target) return 2 if(initator.dir + 2 == target.dir || initator.dir - 2 == target.dir || initator.dir + 6 == target.dir || initator.dir - 6 == target.dir) //Initating mob is looking at the target, while the target mob is looking in a direction perpendicular to the 1st return 3 + + +/proc/texttospeechstrip(var/t_in) + var/t_out = "" + for(var/i=1, i<=length(t_in), i++) + var/ascii_char = text2ascii(t_in,i) + switch(ascii_char) + // A .. Z + if(65 to 90) //Uppercase Letters + if(lentext(t_out) <= 150) + t_out += ascii2text(ascii_char) + // a .. z + if(97 to 122) //Lowercase Letters + if(lentext(t_out) <= 150) + t_out += ascii2text(ascii_char) + // 0 .. 9 + if(48 to 57) //Numbers + if(lentext(t_out) <= 150) + t_out += ascii2text(ascii_char) + // ` , - . ! ? : ' + if(39,44,45,46,33,63,58,96,60,62) //Common name punctuation + if(lentext(t_out) <= 150) + t_out += ascii2text(ascii_char) + //Space + if(32) + if(lentext(t_out) <= 150) + t_out += ascii2text(ascii_char) + return t_out +/var/lastspeak = "" + + +/mob/proc/texttospeech(var/text, var/speed, var/pitch, var/accent, var/voice, var/echo) + text = texttospeechstrip(text) + lastspeak = text + ext_python("voice.py", "\"[accent]\" \"[voice]\" \"[pitch]\" \"[echo]\" \"[speed]\" \"[text]\" \"[src.ckey]\"") + + diff --git a/code/_onclick/hud/hud.dm b/code/_onclick/hud/hud.dm index 9dd3fe9d2ea..687f3b6cac2 100644 --- a/code/_onclick/hud/hud.dm +++ b/code/_onclick/hud/hud.dm @@ -197,14 +197,15 @@ datum/hud/New(mob/owner) vampire_hud() //Triggered when F12 is pressed (Unless someone changed something in the DMF) -/mob/verb/button_pressed_F12() +/mob/verb/button_pressed_F12(var/full = 0 as null) set name = "F12" set hidden = 1 if(hud_used) if(ishuman(src)) - if(!src.client) return - + if(!client) return + if(client.view != world.view) + return if(hud_used.hud_shown) hud_used.hud_shown = 0 if(src.hud_used.adding) @@ -218,10 +219,15 @@ datum/hud/New(mob/owner) //Due to some poor coding some things need special treatment: //These ones are a part of 'adding', 'other' or 'hotkeybuttons' but we want them to stay - src.client.screen += src.hud_used.l_hand_hud_object //we want the hands to be visible - src.client.screen += src.hud_used.r_hand_hud_object //we want the hands to be visible - src.client.screen += src.hud_used.action_intent //we want the intent swticher visible - src.hud_used.action_intent.screen_loc = ui_acti_alt //move this to the alternative position, where zone_select usually is. + if(!full) + src.client.screen += src.hud_used.l_hand_hud_object //we want the hands to be visible + src.client.screen += src.hud_used.r_hand_hud_object //we want the hands to be visible + src.client.screen += src.hud_used.action_intent //we want the intent swticher visible + src.hud_used.action_intent.screen_loc = ui_acti_alt //move this to the alternative position, where zone_select usually is. + else + src.client.screen -= src.healths + src.client.screen -= src.internals + src.client.screen -= src.gun_setting_icon //These ones are not a part of 'adding', 'other' or 'hotkeybuttons' but we want them gone. src.client.screen -= src.zone_sel //zone_sel is a mob variable for some reason. @@ -234,7 +240,12 @@ datum/hud/New(mob/owner) src.client.screen += src.hud_used.other if(src.hud_used.hotkeybuttons && !src.hud_used.hotkey_ui_hidden) src.client.screen += src.hud_used.hotkeybuttons - + if(src.healths) + src.client.screen |= src.healths + if(src.internals) + src.client.screen |= src.internals + if(src.gun_setting_icon) + src.client.screen |= src.gun_setting_icon src.hud_used.action_intent.screen_loc = ui_acti //Restore intent selection to the original position src.client.screen += src.zone_sel //This one is a special snowflake diff --git a/code/controllers/configuration.dm b/code/controllers/configuration.dm index 0e83de642da..e8b63a86ae3 100644 --- a/code/controllers/configuration.dm +++ b/code/controllers/configuration.dm @@ -23,9 +23,6 @@ var/allow_admin_ooccolor = 0 // Allows admins with relevant permissions to have their own ooc colour var/allow_vote_restart = 0 // allow votes to restart var/allow_vote_mode = 0 // allow votes to change mode - var/allow_admin_jump = 1 // allows admin jumping - var/allow_admin_spawning = 1 // allows admin item spawning - var/allow_admin_rev = 1 // allows admin revives var/vote_delay = 6000 // minimum time between voting sessions (deciseconds, 10 minute default) var/vote_period = 600 // length of voting period (deciseconds, default 1 minute) var/vote_autotransfer_initial = 72000 // Length of time before the first autotransfer vote is called @@ -258,16 +255,7 @@ if ("allow_vote_mode") config.allow_vote_mode = 1 - if ("allow_admin_jump") - config.allow_admin_jump = 1 - - if("allow_admin_rev") - config.allow_admin_rev = 1 - - if ("allow_admin_spawning") - config.allow_admin_spawning = 1 - - if ("no_dead_vote") + if("no_dead_vote") config.vote_no_dead = 1 if ("default_no_vote") @@ -455,7 +443,7 @@ if(world.system_type == UNIX) config.python_path = "/usr/bin/env python2" else //probably windows, if not this should work anyway - config.python_path = "python" + config.python_path = "pythonw" if("assistant_limit") config.assistantlimit = 1 diff --git a/code/controllers/garbage.dm b/code/controllers/garbage.dm new file mode 100644 index 00000000000..1a16906a212 --- /dev/null +++ b/code/controllers/garbage.dm @@ -0,0 +1,79 @@ + +#define GC_COLLECTIONS_PER_TICK 100 +var/global/datum/controller/garbage_collector/garbage +var/global/list/uncollectable_vars=list( + "alpha", + "bestF", + "bounds", + "bound_height", + "bound_width", + "ckey", + "color", + "contents", + "gender", + "key", + //"loc", + "locs", + "luminosity", + "parent", + "parent_type", + "step_size", + "glide_size", + "step_x", + "step_y", + "step_z", + "tag", + "type", + "vars", + "verbs", + "x", + "y", + "z", +) +/datum/controller/garbage_collector + var/list/queue=list() + var/waiting=0 + var/turf/trashbin=null + + New() + trashbin=locate(0,0,CENTCOMM_Z) + + proc/AddTrash(var/atom/movable/A) + if(!A) + return + A.loc=trashbin + queue.Add(A) + waiting++ + + proc/Pop() + var/atom/movable/A = queue[1] + if(!A) return + if(!istype(A,/atom/movable)) + testing("GC given a [A.type].") + del(A) + return + for(var/vname in A.vars) + if(vname in uncollectable_vars) + continue + //testing("Unsetting [vname] in [A.type]!") + A.vars[vname]=null + A.loc=null + queue.Remove(A) + + proc/process() + for(var/i=0;i[L.name] suddenly bursts into flames!") + //playsound(L.loc, 'mag_fireballlaunch.ogg', 50, 0) + + return + +//////////////////////////////////////////////////////////////////////// + +// WAS: /datum/bioEffect/melt +/datum/dna/gene/basic/grant_verb/melt + name = "Self Biomass Manipulation" + desc = "The subject becomes able to transform the matter of their cells into a liquid state." + activation_messages = list("You feel strange and jiggly.") + deactivation_messages = list("You feel more solid.") + + verbtype=/proc/bioproc_melt + + New() + ..() + block = MELTBLOCK + +/proc/bioproc_melt() + set name = "Dissolve" + set desc = "Transform yourself into a liquified state." + set category = "Mutant Abilities" + + if (istype(usr,/mob/living/carbon/human/)) + var/mob/living/carbon/human/H = usr + + H.visible_message("\red [H.name]'s flesh melts right off! Holy shit!") + //if (H.gender == "female") + // playsound(H.loc, 'female_fallscream.ogg', 50, 0) + //else + // playsound(H.loc, 'male_fallscream.ogg', 50, 0) + //playsound(H.loc, 'bubbles.ogg', 50, 0) + //playsound(H.loc, 'loudcrunch2.ogg', 50, 0) + var/mob/living/carbon/human/skellington/nH = new /mob/living/carbon/human/skellington(H.loc) + nH.real_name = H.real_name + nH.name = "[H.name]'s skeleton" + //H.decomp_stage = 4 + nH.brain_op_stage = 4 + H.gib(1) + else + usr.visible_message("\red [usr.name] melts into a pile of bloody viscera!") + usr.gib(1) + + return diff --git a/code/game/dna/genes/goon_powers.dm b/code/game/dna/genes/goon_powers.dm index 4ec5853d7de..50de8fb85de 100644 --- a/code/game/dna/genes/goon_powers.dm +++ b/code/game/dna/genes/goon_powers.dm @@ -30,10 +30,15 @@ /datum/dna/gene/basic/stealth can_activate(var/mob/M, var/flags) // Can only activate one of these at a time. - if(is_type_in_list(/datum/dna/gene/basic/stealth,M.mutations)) + if(is_type_in_list(/datum/dna/gene/basic/stealth,M.active_genes)) + testing("Cannot activate [type]: /datum/dna/gene/basic/stealth in M.active_genes.") return 0 return ..(M,flags) + deactivate(var/mob/M) + ..(M) + M.alpha=255 + // WAS: /datum/bioEffect/darkcloak /datum/dna/gene/basic/stealth/darkcloak name = "Cloak of Darkness" @@ -49,9 +54,9 @@ if(!istype(T)) return if(T.lighting_lumcount <= 2) - M.alpha = round((255 * 0.15)) + M.alpha = 0 else - M.alpha = round((255 * 0.80)) + M.alpha = round(255 * 0.80) //WAS: /datum/bioEffect/chameleon /datum/dna/gene/basic/stealth/chameleon @@ -64,8 +69,406 @@ block=CHAMELEONBLOCK OnMobLife(var/mob/M) - if((world.timeofday - M.last_move_intent) >= 30 && !M.stat && M.canmove && !M.restrained()) - M.alpha = round((255 * 0.15)) + if((world.time - M.last_movement) >= 30 && !M.stat && M.canmove && !M.restrained()) + M.alpha = round(255 * 0.10) else - M.alpha = round((255 * 0.80)) - return \ No newline at end of file + M.alpha = round(255 * 0.80) + +///////////////////////////////////////////////////////////////////////////////////////// + +/datum/dna/gene/basic/grant_spell + var/obj/effect/proc_holder/spell/spelltype + + activate(var/mob/M, var/connected, var/flags) + ..() + M.spell_list += new spelltype(M) + return 1 + + deactivate(var/mob/M, var/connected, var/flags) + ..() + for(var/obj/effect/proc_holder/spell/S in M.spell_list) + if(istype(S,spelltype)) + M.spell_list.Remove(S) + return 1 + +/datum/dna/gene/basic/grant_verb + var/verbtype + + activate(var/mob/M, var/connected, var/flags) + ..() + M.verbs += verbtype + return 1 + + deactivate(var/mob/M, var/connected, var/flags) + ..() + M.verbs -= verbtype + +// WAS: /datum/bioEffect/cryokinesis +/datum/dna/gene/basic/grant_spell/cryo + name = "Cryokinesis" + desc = "Allows the subject to lower the body temperature of others." + activation_messages = list("You notice a strange cold tingle in your fingertips.") + deactivation_messages = list("Your fingers feel warmer.") + + spelltype = /obj/effect/proc_holder/spell/targeted/cryokinesis + + New() + ..() + block = CRYOBLOCK + +/obj/effect/proc_holder/spell/targeted/cryokinesis + name = "Cryokinesis" + desc = "Drops the bodytemperature of another person." + panel = "Mutant Powers" + + charge_type = "recharge" + charge_max = 600 + + clothes_req = 0 + stat_allowed = 0 + invocation_type = "none" + range = 7 + selection_type = "range" + var/list/compatible_mobs = list(/mob/living/carbon/human, /mob/living/carbon/monkey) + +/obj/effect/proc_holder/spell/targeted/cryokinesis/cast(list/targets) + if(!targets.len) + usr << "No target found in range." + return + + var/mob/living/carbon/C = targets[1] + + if(!iscarbon(C)) + usr << "\red This will only work on normal organic beings." + return + + C.bodytemperature = -1500 + C.ExtinguishMob() + + C.visible_message("\red A cloud of fine ice crystals engulfs [C]!") + + //playsound(usr.loc, 'bamf.ogg', 50, 0) + + new/obj/effects/self_deleting(C.loc, icon('icons/effects/genetics.dmi', "cryokinesis")) + + return + +/obj/effects/self_deleting + density = 0 + opacity = 0 + anchored = 1 + icon = null + desc = "" + //layer = 15 + + New(var/atom/location, var/icon/I, var/duration = 20, var/oname = "something") + src.name = oname + loc=location + src.icon = I + spawn(duration) + qdel(src) + +/////////////////////////////////////////////////////////////////////////////////////////// + +// WAS: /datum/bioEffect/mattereater +/datum/dna/gene/basic/grant_spell/mattereater + name = "Matter Eater" + desc = "Allows the subject to eat just about anything without harm." + activation_messages = list("You feel hungry.") + deactivation_messages = list("You don't feel quite so hungry anymore.") + + spelltype=/obj/effect/proc_holder/spell/targeted/eat + + New() + ..() + block = EATBLOCK + +/obj/effect/proc_holder/spell/targeted/eat + name = "Eat" + desc = "Eat just about anything!" + panel = "Mutant Powers" + + charge_type = "recharge" + charge_max = 300 + + clothes_req = 0 + stat_allowed = 0 + invocation_type = "none" + range = 1 + selection_type = "range" + +/obj/effect/proc_holder/spell/targeted/eat/choose_targets(mob/user = usr) + var/list/targets = list() + var/list/possible_targets = list() + + for(var/obj/item/O in view_or_range(range, user, selection_type)) + possible_targets += O + + targets += input("Choose the target for the spell.", "Targeting") as mob in possible_targets + + if(!targets.len) //doesn't waste the spell + revert_cast(user) + return + + perform(targets) + +/obj/effect/proc_holder/spell/targeted/eat/cast(list/targets) + if(!targets.len) + usr << "No target found in range." + return + + var/obj/item/the_item = targets[1] + + usr.visible_message("\red [usr] eats [the_item].") + playsound(usr.loc, 'sound/items/eatfood.ogg', 50, 0) + + del(the_item) + + if(ishuman(usr)) + var/mob/living/carbon/human/H=usr + for(var/name in H.organs_by_name) + var/datum/organ/external/affecting = null + if(!H.organs[name]) + continue + affecting = H.organs[name] + if(!istype(affecting, /datum/organ/external)) + continue + affecting.heal_damage(4, 0) + usr:UpdateDamageIcon() + usr:updatehealth() + + return + +//////////////////////////////////////////////////////////////////////// + +//WAS: /datum/bioEffect/jumpy +/datum/dna/gene/basic/grant_spell/jumpy + name = "Jumpy" + desc = "Allows the subject to leap great distances." + //cooldown = 30 + activation_messages = list("Your leg muscles feel taut and strong.") + deactivation_messages = list("Your leg muscles shrink back to normal.") + + spelltype =/obj/effect/proc_holder/spell/targeted/leap + + New() + ..() + block = JUMPBLOCK + +/obj/effect/proc_holder/spell/targeted/leap + name = "Jump" + desc = "Leap great distances!" + panel = "Mutant Powers" + range = -1 + include_user = 1 + + charge_type = "recharge" + charge_max = 30 + + clothes_req = 0 + stat_allowed = 0 + invocation_type = "none" + +/obj/effect/proc_holder/spell/targeted/leap/cast(list/targets) + if (istype(usr.loc,/mob/)) + usr << "\red You can't jump right now!" + return + + if (istype(usr.loc,/turf/)) + usr.visible_message("\red [usr.name] takes a huge leap!") + playsound(usr.loc, 'sound/weapons/thudswoosh.ogg', 50, 1) + var/prevLayer = usr.layer + usr.layer = 15 + + for(var/i=0, i<10, i++) + step(usr, usr.dir) + if(i < 5) usr.pixel_y += 8 + else usr.pixel_y -= 8 + sleep(1) + + if (M_FAT in usr.mutations && prob(66)) + usr.visible_message("\red [usr.name] crashes due to their heavy weight!") + //playsound(usr.loc, 'zhit.wav', 50, 1) + usr.weakened += 10 + usr.stunned += 5 + + usr.layer = prevLayer + + if (istype(usr.loc,/obj/)) + var/obj/container = usr.loc + usr << "\red You leap and slam your head against the inside of [container]! Ouch!" + usr.paralysis += 3 + usr.weakened += 5 + container.visible_message("\red [usr.loc] emits a loud thump and rattles a bit.") + playsound(usr.loc, 'sound/effects/bang.ogg', 50, 1) + var/wiggle = 6 + while(wiggle > 0) + wiggle-- + container.pixel_x = rand(-3,3) + container.pixel_y = rand(-3,3) + sleep(1) + container.pixel_x = 0 + container.pixel_y = 0 + + + return + +//////////////////////////////////////////////////////////////////////// + +// WAS: /datum/bioEffect/polymorphism + +/datum/dna/gene/basic/grant_spell/polymorph + name = "Polymorphism" + desc = "Enables the subject to reconfigure their appearance to mimic that of others." + + spelltype =/obj/effect/proc_holder/spell/targeted/polymorph + //cooldown = 1800 + activation_messages = list("You don't feel entirely like yourself somehow.") + deactivation_messages = list("You feel secure in your identity.") + + New() + ..() + block = POLYMORPHBLOCK + +/obj/effect/proc_holder/spell/targeted/polymorph + name = "Polymorph" + desc = "Mimic the appearance of others!" + panel = "Mutant Powers" + charge_max = 1800 + + clothes_req = 0 + stat_allowed = 0 + invocation_type = "none" + range = 1 + selection_type = "range" + +/obj/effect/proc_holder/spell/targeted/polymorph/cast(list/targets) + var/mob/living/M=targets[1] + if(!ishuman(M)) + usr << "\red You can only change your appearance to that of another human." + return + + if(!ishuman(usr)) return + + + //playsound(usr.loc, 'blobattack.ogg', 50, 1) + + usr.visible_message("\red [usr]'s body shifts and contorts.") + + spawn(10) + if(M && usr) + //playsound(usr.loc, 'gib.ogg', 50, 1) + usr.UpdateAppearance(M.dna.UI) + usr:real_name = M:real_name + usr:name = M:name +//////////////////////////////////////////////////////////////////////// + +// WAS: /datum/bioEffect/empath +/datum/dna/gene/basic/grant_verb/empath + name = "Empathic Thought" + desc = "The subject becomes able to read the minds of others for certain information." + + verbtype = /proc/bioproc_empath + activation_messages = list("You suddenly notice more about others than you did before.") + deactivation_messages = list("You no longer feel able to sense intentions.") + + New() + ..() + block = EMPATHBLOCK + +/proc/bioproc_empath(var/mob/living/carbon/M in range(7,usr)) + set name = "Read Mind" + set desc = "Read the minds of others for information." + set category = "Mutant Abilities" + + if(!iscarbon(M)) + usr << "\red You may only use this on other organic beings." + return + + if(usr.stat) + return + + if (M_PSY_RESIST in M.mutations) + usr << "\red You can't see into [M.name]'s mind at all!" + return + + if (M.stat == 2) + usr << "\red [M.name] is dead and cannot have their mind read." + return + if (M.health < 0) + usr << "\red [M.name] is dying, and their thoughts are too scrambled to read." + return + + usr << "\blue Mind Reading of [M.name]:" + var/pain_condition = M.health + // lower health means more pain + var/list/randomthoughts = list("what to have for lunch","the future","the past","money", + "their hair","what to do next","their job","space","amusing things","sad things", + "annoying things","happy things","something incoherent","something they did wrong") + var/thoughts = "thinking about [pick(randomthoughts)]" + if (M.fire_stacks) + pain_condition -= 50 + thoughts = "preoccupied with the fire" + if (M.radiation) + pain_condition -= 25 + + switch(pain_condition) + if (81 to INFINITY) + usr << "\blue Condition: [M.name] feels good." + if (61 to 80) + usr << "\blue Condition: [M.name] is suffering mild pain." + if (41 to 60) + usr << "\blue Condition: [M.name] is suffering significant pain." + if (21 to 40) + usr << "\blue Condition: [M.name] is suffering severe pain." + else + usr << "\blue Condition: [M.name] is suffering excruciating pain." + thoughts = "haunted by their own mortality" + + switch(M.a_intent) + if ("help") + usr << "\blue Mood: You sense benevolent thoughts from [M.name]." + if ("disarm") + usr << "\blue Mood: You sense cautious thoughts from [M.name]." + if ("grab") + usr << "\blue Mood: You sense hostile thoughts from [M.name]." + if ("harm") + usr << "\blue Mood: You sense cruel thoughts from [M.name]." + for(var/mob/living/L in view(7,M)) + if (L == M) + continue + thoughts = "thinking about punching [L.name]" + break + else + usr << "\blue Mood: You sense strange thoughts from [M.name]." + + if (istype(M,/mob/living/carbon/human)) + var/numbers[0] + var/mob/living/carbon/human/H = M + if(H.mind && H.mind.initial_account) + numbers += H.mind.initial_account.account_number + numbers += H.mind.initial_account.remote_access_pin + if(numbers.len>0) + usr << "\blue Numbers: You sense the number[numbers.len>1?"s":""] [english_list(numbers)] [numbers.len>1?"are":"is"] important to [M.name]." + usr << "\blue Thoughts: [M.name] is currently [thoughts]." + + if (/datum/dna/gene/basic/grant_verb/empath in M.active_genes) + M << "\red You sense [usr.name] reading your mind." + else if (prob(5) || M.mind.assigned_role=="Chaplain") + M << "\red You sense someone intruding upon your thoughts..." + return + +//////////////////////////////////////////////////////////////////////// + +// WAS: /datum/bioEffect/superfart +/datum/dna/gene/basic/superfart + name = "High-Pressure Intestines" + desc = "Vastly increases the gas capacity of the subject's digestive tract." + activation_messages = list("You feel bloated and gassy.") + deactivation_messages = list("You no longer feel gassy. What a relief!") + + mutation = M_SUPER_FART + + New() + ..() + block = SUPERFARTBLOCK \ No newline at end of file diff --git a/code/game/dna/genes/powers.dm b/code/game/dna/genes/powers.dm index e92917f2f7e..9f7bdcc4569 100644 --- a/code/game/dna/genes/powers.dm +++ b/code/game/dna/genes/powers.dm @@ -71,6 +71,8 @@ block=COLDBLOCK can_activate(var/mob/M,var/flags) + if(flags & MUTCHK_FORCED) + return !(/datum/dna/gene/basic/cold_resist in M.active_genes) // Probability check var/_prob = 15 if(M_RESIST_COLD in M.mutations) @@ -90,6 +92,8 @@ block=FIREBLOCK can_activate(var/mob/M,var/flags) + if(flags & MUTCHK_FORCED) + return !(/datum/dna/gene/basic/heat_resist in M.active_genes) // Probability check var/_prob=30 if(M_RESIST_HEAT in M.mutations) diff --git a/code/game/gamemodes/blob/blobs/factory.dm b/code/game/gamemodes/blob/blobs/factory.dm index 1ab1b4a347b..0322a33cee8 100644 --- a/code/game/gamemodes/blob/blobs/factory.dm +++ b/code/game/gamemodes/blob/blobs/factory.dm @@ -40,6 +40,7 @@ attacktext = "hits" attack_sound = 'sound/weapons/genhit1.ogg' var/obj/effect/blob/factory/factory = null + var/is_zombie = 0 faction = "blob" min_oxy = 0 max_oxy = 0 @@ -70,10 +71,57 @@ factory.spores += src ..() - Die() - del(src) +/mob/living/simple_animal/hostile/blobspore/Life() - Del() - if(factory) - factory.spores -= src - ..() + if(!is_zombie) + for(var/mob/living/carbon/human/H in ListTargets(0)) //Only for people in the same tile + if(H.stat == DEAD) + Zombify(H) + break + ..() + +/mob/living/simple_animal/hostile/blobspore/proc/Zombify(var/mob/living/carbon/human/H) + if(H.wear_suit) + var/obj/item/clothing/suit/armor/A = H.wear_suit + if(A.armor && A.armor["melee"]) + maxHealth += A.armor["melee"] //That zombie's got armor, I want armor! + maxHealth += 40 + health = maxHealth + name = "blob zombie" + desc = "A shambling corpse animated by the blob." + melee_damage_lower = 10 + melee_damage_upper = 15 + icon = H.icon + icon_state = "husk_s" + H.h_style = null + H.update_hair() + overlays = H.overlays + overlays += image('icons/mob/blob.dmi', icon_state = "blob_head") + H.loc = src + is_zombie = 1 + loc.visible_message(" The corpse of [H.name] suddenly rises!") + +/mob/living/simple_animal/hostile/blobspore/Die() + // On death, create a small smoke of harmful gas (s-Acid) + var/datum/effect/effect/system/chem_smoke_spread/S = new + var/turf/location = get_turf(src) + + // Create the reagents to put into the air, s-acid is yellow and stings a little + create_reagents(25) + reagents.add_reagent("spore", 25) + + // Attach the smoke spreader and setup/start it. + S.attach(location) + S.set_up(reagents, 1, 1, location, 15, 1) // only 1-2 smoke cloud + S.start() + + del(src) + + +/mob/living/simple_animal/hostile/blobspore/Del() + if(factory) + factory.spores -= src + if(contents) + for(var/mob/M in contents) + M.loc = src.loc + ..() diff --git a/code/game/gamemodes/events/biomass.dm b/code/game/gamemodes/events/biomass.dm index d1508221f7c..4835d9a61b6 100644 --- a/code/game/gamemodes/events/biomass.dm +++ b/code/game/gamemodes/events/biomass.dm @@ -142,21 +142,23 @@ /obj/effect/biomass/ex_act(severity) switch(severity) if(1.0) - del(src) + qdel(src) return if(2.0) if (prob(90)) - del(src) + qdel(src) return if(3.0) if (prob(50)) - del(src) + qdel(src) return return /obj/effect/biomass/temperature_expose(null, temp, volume) //hotspots kill biomass del src +/datum/event/biomass/start() + biomass_infestation() /proc/biomass_infestation() @@ -173,3 +175,6 @@ var/turf/simulated/floor/T = pick(turfs) new/obj/effect/biomass_controller(T) //spawn a controller at turf message_admins("\blue Event: Biomass spawned at [T.loc.loc] ([T.x],[T.y],[T.z])") + + + diff --git a/code/game/gamemodes/events/dust.dm b/code/game/gamemodes/events/dust.dm index 378c6b24685..ff424a51134 100644 --- a/code/game/gamemodes/events/dust.dm +++ b/code/game/gamemodes/events/dust.dm @@ -118,5 +118,5 @@ The "dust" will damage the hull of the station causin minor hull breaches. ex_act(severity) - del(src) + qdel(src) return diff --git a/code/game/gamemodes/events/ninja_abilities.dm b/code/game/gamemodes/events/ninja_abilities.dm index feeab4f7c39..691f2d84114 100644 --- a/code/game/gamemodes/events/ninja_abilities.dm +++ b/code/game/gamemodes/events/ninja_abilities.dm @@ -68,12 +68,12 @@ Not sure why this would be useful (it's not) but whatever. Ninjas need their smo //=======//9-8 TILE TELEPORT//=======// //Click to to teleport 9-10 tiles in direction facing. /obj/item/clothing/suit/space/space_ninja/proc/ninjajaunt() - set name = "Phase Jaunt (250E)" + set name = "Phase Jaunt (500E)" set desc = "Utilizes the internal VOID-shift device to rapidly transit in direction facing." set category = "Ninja Ability" set popup_menu = 0 - var/C = 200 + var/C = 500 if(!ninjacost(C,1)) var/mob/living/carbon/human/U = affecting var/turf/destination = get_teleport_loc(U.loc,U,9,1,3,1,0,1) @@ -108,12 +108,12 @@ Not sure why this would be useful (it's not) but whatever. Ninjas need their smo //=======//RIGHT CLICK TELEPORT//=======// //Right click to teleport somewhere, almost exactly like admin jump to turf. /obj/item/clothing/suit/space/space_ninja/proc/ninjashift(turf/T in oview()) - set name = "Phase Shift (500E)" + set name = "Phase Shift (750E)" set desc = "Utilizes the internal VOID-shift device to rapidly transit to a destination in view." set category = null//So it does not show up on the panel but can still be right-clicked. set src = usr.contents//Fixes verbs not attaching properly for objects. Praise the DM reference guide! - var/C = 400 + var/C = 750 if(!ninjacost(C,1)) var/mob/living/carbon/human/U = affecting var/turf/mobloc = get_turf(U.loc)//To make sure that certain things work properly below. @@ -230,46 +230,46 @@ This could be a lot better but I'm too tired atm.*/ /*Allows the ninja to capture people, I guess. Must right click on a mob to activate.*/ /obj/item/clothing/suit/space/space_ninja/proc/ninjanet(mob/living/carbon/M in oview())//Only living carbon mobs. - set name = "Energy Net (5,000E)" + set name = "Energy Net (2,500E)" set desc = "Captures a fallen opponent in a net of energy. Will teleport them to a holding facility after 30 seconds." set category = null set src = usr.contents - var/C = 5000 + var/C = 2500 if(!ninjacost(C,1)&&iscarbon(M)) // Nets now cost 8,000 var/mob/living/carbon/human/U = affecting - //if(M.client)//Monkeys without a client can still step_to() and bypass the net. Also, netting inactive people is lame. + if(M.client)//Monkeys without a client can still step_to() and bypass the net. Also, netting inactive people is lame. //if(M)//DEBUG - if(!locate(/obj/effect/energy_net) in M.loc)//Check if they are already being affected by an energy net. - for(var/turf/T in getline(U.loc, M.loc)) - if(T.density)//Don't want them shooting nets through walls. It's kind of cheesy. - U << "You may not use an energy net through solid obstacles!" - return - spawn(0) - U.Beam(M,"n_beam",,15) - M.anchored = 1//Anchors them so they can't move. - var/obj/effect/stop/S - S = new /obj/effect/stop - S.victim = M - S.loc = M.loc + if(!locate(/obj/effect/energy_net) in M.loc)//Check if they are already being affected by an energy net. + for(var/turf/T in getline(U.loc, M.loc)) + if(T.density)//Don't want them shooting nets through walls. It's kind of cheesy. + U << "You may not use an energy net through solid obstacles!" + return + spawn(0) + U.Beam(M,"n_beam",,15) + M.anchored = 1//Anchors them so they can't move. + var/obj/effect/stop/S + S = new /obj/effect/stop + S.victim = M + S.loc = M.loc - var/obj/effect/energy_net/E = new /obj/effect/energy_net(M.loc) - E.layer = M.layer+1//To have it appear one layer above the mob. - for(var/mob/O in viewers(U, 3)) - O.show_message(text("\red [] caught [] with an energy net!", U, M), 1) - E.affecting = M - E.master = U - spawn(0)//Parallel processing. - E.process(M) - cell.charge-=(C) + var/obj/effect/energy_net/E = new /obj/effect/energy_net(M.loc) + E.layer = M.layer+1//To have it appear one layer above the mob. + for(var/mob/O in viewers(U, 3)) + O.show_message(text("\red [] caught [] with an energy net!", U, M), 1) + E.affecting = M + E.master = U + spawn(0)//Parallel processing. + E.process(M) + cell.charge-=(C) + else + U << "They are already trapped inside an energy net." else - U << "They are already trapped inside an energy net." - //else - //U << "They will bring no honor to your Clan!" + U << "They will bring no honor to your Clan!" return //=======//ADRENALINE BOOST//=======// -/*Wakes the user so they are able to do their thing. Also injects a decent dose of radium. +/*Wakes the user so they are able to do their thing. Also injects a decent dose of uranium. Movement impairing would indicate drugs and the like.*/ /obj/item/clothing/suit/space/space_ninja/proc/ninjaboost() set name = "Adrenaline Boost" @@ -280,7 +280,7 @@ Movement impairing would indicate drugs and the like.*/ if(!ninjacost(,3))//Have to make sure stat is not counted for this ability. var/mob/living/carbon/human/U = affecting //Wouldn't need to track adrenaline boosters if there was a miracle injection to get rid of paralysis and the like instantly. - //For now, adrenaline boosters ARE the miracle injection. Well, radium, really. + //For now, adrenaline boosters ARE the miracle injection. Well, uranium, really. U.SetParalysis(0) U.SetStunned(0) U.SetWeakened(0) @@ -297,7 +297,7 @@ Movement impairing would indicate drugs and the like.*/ U.say(pick("A CORNERED FOX IS MORE DANGEROUS THAN A JACKAL!","HURT ME MOOORRREEE!","IMPRESSIVE!")) spawn(70) reagents.reaction(U, 2) - reagents.trans_id_to(U, "radium", a_transfer) + reagents.trans_id_to(U, "uranium", a_transfer) U << "\red You are beginning to feel the after-effect of the injection." a_boost-- s_coold = 3 diff --git a/code/game/gamemodes/events/ninja_equipment.dm b/code/game/gamemodes/events/ninja_equipment.dm index 563dd6fd5a3..cfadb1f688e 100644 --- a/code/game/gamemodes/events/ninja_equipment.dm +++ b/code/game/gamemodes/events/ninja_equipment.dm @@ -23,7 +23,6 @@ ________________________________________________________________________________ verbs += /obj/item/clothing/suit/space/space_ninja/proc/init//suit initialize verb verbs += /obj/item/clothing/suit/space/space_ninja/proc/ai_instruction//for AIs verbs += /obj/item/clothing/suit/space/space_ninja/proc/ai_holo - verbs += /obj/item/clothing/suit/space/space_ninja/proc/ai_overrideninja // Experemental //verbs += /obj/item/clothing/suit/space/space_ninja/proc/display_verb_procs//DEBUG. Doesn't work. spark_system = new()//spark initialize spark_system.set_up(5, 0, src) @@ -33,11 +32,11 @@ ________________________________________________________________________________ stored_research += new T(src) var/reagent_amount//reagent initialize for(var/reagent_id in reagent_list) - reagent_amount += reagent_id == "radium" ? r_maxamount+(a_boost*a_transfer) : r_maxamount//AI can inject radium directly. + reagent_amount += reagent_id == "uranium" ? r_maxamount+(a_boost*a_transfer) : r_maxamount//AI can inject uranium directly. reagents = new(reagent_amount) reagents.my_atom = src for(var/reagent_id in reagent_list) - reagent_id == "radium" ? reagents.add_reagent(reagent_id, r_maxamount+(a_boost*a_transfer)) : reagents.add_reagent(reagent_id, r_maxamount)//It will take into account radium used for adrenaline boosting. + reagent_id == "uranium" ? reagents.add_reagent(reagent_id, r_maxamount+(a_boost*a_transfer)) : reagents.add_reagent(reagent_id, r_maxamount)//It will take into account uranium used for adrenaline boosting. cell = new/obj/item/weapon/cell/high//The suit should *always* have a battery because so many things rely on it. cell.charge = 9000//Starting charge should not be higher than maximum charge. It leads to problems with recharging. @@ -187,6 +186,7 @@ ________________________________________________________________________________ unlock_suit() break lock_suit(U,1)//Check for icons. + U.hud_used.human_hud('icons/mob/screen1_NinjaHUD.dmi',"#ffffff",255) U.regenerate_icons() U << "\blue Linking neural-net interface...\nPattern \green GREEN\blue, continuing operation." if(4) @@ -239,6 +239,8 @@ ________________________________________________________________________________ cancel_stealth()//Shutdowns stealth. if(4) U << "\blue Disconnecting neural-net interface...\greenSuccess\blue." + U.hud_used.instantiate() + U.regenerate_icons() if(5) U << "\blue Disengaging neural-net interface...\greenSuccess\blue." if(6) @@ -318,9 +320,9 @@ ________________________________________________________________________________ dat += "Warning: Virus Detected. Name: [D.name].Type: [D.spread]. Stage: [D.stage]/[D.max_stages]. Possible Cure: [D.cure].
" dat += "" if(1) dat += "

Atmospheric Scan:

"//Headers don't need breaks. They are automatically placed. @@ -407,12 +409,12 @@ ________________________________________________________________________________ Abilities: