Merge branch 'master' of github.com:Baystation12/Baystation12 into dev-freeze

Conflicts:
	code/game/objects/items/weapons/implants/implant.dm
	code/modules/reagents/Chemistry-Machinery.dm
This commit is contained in:
Mloc
2013-11-24 23:37:09 +00:00
45 changed files with 336 additions and 198 deletions

6
.gitignore vendored
View File

@@ -4,9 +4,3 @@
*.rsc *.rsc
*.dmb *.dmb
*.lk *.lk
#ignore any files in config/, except those in subdirectories.
/config/*
!/config/*/*
/baystation12.int

View File

@@ -75,6 +75,7 @@
#include "code\ATMOSPHERICS\components\unary\vent_pump.dm" #include "code\ATMOSPHERICS\components\unary\vent_pump.dm"
#include "code\ATMOSPHERICS\components\unary\vent_scrubber.dm" #include "code\ATMOSPHERICS\components\unary\vent_scrubber.dm"
#include "code\controllers\_DynamicAreaLighting_TG.dm" #include "code\controllers\_DynamicAreaLighting_TG.dm"
#include "code\controllers\autotransfer.dm"
#include "code\controllers\configuration.dm" #include "code\controllers\configuration.dm"
#include "code\controllers\failsafe.dm" #include "code\controllers\failsafe.dm"
#include "code\controllers\lighting_controller.dm" #include "code\controllers\lighting_controller.dm"

View File

@@ -23,7 +23,8 @@
/datum/medical_effect/proc/cure(mob/living/carbon/human/H) /datum/medical_effect/proc/cure(mob/living/carbon/human/H)
for(var/R in cures) for(var/R in cures)
if(H.reagents.has_reagent(R)) if(H.reagents.has_reagent(R))
H <<"\red [cure_message]" if (cure_message)
H <<"\blue [cure_message]"
return 1 return 1
return 0 return 0
@@ -39,16 +40,21 @@
M.start = life_tick M.start = life_tick
return return
var/list/L = typesof(/datum/medical_effect)-/datum/medical_effect
for(var/T in L) var/T = side_effects[name]
var/datum/medical_effect/M = new T if (!T)
if(M.name == name) return
M.strength = strength
M.start = life_tick var/datum/medical_effect/M = new T
side_effects += M if(M.name == name)
M.strength = strength
M.start = life_tick
side_effects += M
/mob/living/carbon/human/proc/handle_medical_side_effects() /mob/living/carbon/human/proc/handle_medical_side_effects()
//Going to handle those things only every few ticks.
if(life_tick % 15 != 0)
return 0
var/list/L = typesof(/datum/medical_effect)-/datum/medical_effect var/list/L = typesof(/datum/medical_effect)-/datum/medical_effect
for(var/T in L) for(var/T in L)
@@ -60,18 +66,14 @@
for (var/datum/medical_effect/M in side_effects) for (var/datum/medical_effect/M in side_effects)
if (!M) continue if (!M) continue
var/strength_percent = sin((life_tick - M.start) / 2) var/strength_percent = sin((life_tick - M.start) / 2)
// log_debug ("[src], tick [life_tick] : Processing [M], Current phase: [strength_percent]")
// Only do anything if the effect is currently strong enough // Only do anything if the effect is currently strong enough
if(strength_percent >= 0.4) if(strength_percent >= 0.4)
log_debug ("[src], tick [life_tick] : Active phase ; strength [M.strength]")
if (M.cure(src) || M.strength > 50) if (M.cure(src) || M.strength > 50)
// log_debug ("[src], tick [life_tick] : [M] cured or reached end of lifecycle")
side_effects -= M side_effects -= M
del(M) M = null
else else
if(life_tick % 45 == 0) if(life_tick % 45 == 0)
// log_debug ("[src], tick [life_tick] : Activating [M] ")
M.on_life(src, strength_percent*M.strength) M.on_life(src, strength_percent*M.strength)
// Effect slowly growing stronger // Effect slowly growing stronger
M.strength+=0.08 M.strength+=0.08
@@ -92,7 +94,6 @@
H.custom_pain("You feel a throbbing pain in your head!",1) H.custom_pain("You feel a throbbing pain in your head!",1)
if(31 to INFINITY) if(31 to INFINITY)
H.custom_pain("You feel an excrutiating pain in your head!",1) H.custom_pain("You feel an excrutiating pain in your head!",1)
H.adjustBrainLoss(1)
// BAD STOMACH // BAD STOMACH
// =========== // ===========
@@ -110,7 +111,6 @@
H.custom_pain("Your stomach hurts.",0) H.custom_pain("Your stomach hurts.",0)
if(31 to INFINITY) if(31 to INFINITY)
H.custom_pain("You feel sick.",1) H.custom_pain("You feel sick.",1)
H.adjustToxLoss(1)
// CRAMPS // CRAMPS
// ====== // ======
@@ -129,7 +129,6 @@
if(31 to INFINITY) if(31 to INFINITY)
H.emote("me",1,"flinches as all the muscles in their body cramp up.") H.emote("me",1,"flinches as all the muscles in their body cramp up.")
H.custom_pain("There's pain all over your body.",1) H.custom_pain("There's pain all over your body.",1)
H.adjustToxLoss(1)
// ITCH // ITCH
// ==== // ====
@@ -148,4 +147,3 @@
if(31 to INFINITY) if(31 to INFINITY)
H.emote("me",1,"shivers slightly.") H.emote("me",1,"shivers slightly.")
H.custom_pain("This itch makes it really hard to concentrate.",1) H.custom_pain("This itch makes it really hard to concentrate.",1)
H.adjustToxLoss(1)

View File

@@ -15,6 +15,7 @@ var/global/list/chemical_reactions_list //list of all /datum/chemical_reactio
var/global/list/chemical_reagents_list //list of all /datum/reagent datums indexed by reagent id. Used by chemistry stuff var/global/list/chemical_reagents_list //list of all /datum/reagent datums indexed by reagent id. Used by chemistry stuff
var/global/list/landmarks_list = list() //list of all landmarks created var/global/list/landmarks_list = list() //list of all landmarks created
var/global/list/surgery_steps = list() //list of all surgery steps |BS12 var/global/list/surgery_steps = list() //list of all surgery steps |BS12
var/global/list/side_effects = list() //list of all medical sideeffects types by thier names |BS12
var/global/list/mechas_list = list() //list of all mechs. Used by hostile mobs target tracking. var/global/list/mechas_list = list() //list of all mechs. Used by hostile mobs target tracking.
//Languages/species/whitelist. //Languages/species/whitelist.
@@ -75,6 +76,13 @@ var/global/list/backbaglist = list("Nothing", "Backpack", "Satchel", "Satchel Al
surgery_steps += S surgery_steps += S
sort_surgeries() sort_surgeries()
//Medical side effects. List all effects by their names
paths = typesof(/datum/medical_effect)-/datum/medical_effect
for(var/T in paths)
var/datum/medical_effect/M = new T
side_effects[M.name] = T
//Languages and species. //Languages and species.
paths = typesof(/datum/language)-/datum/language paths = typesof(/datum/language)-/datum/language
for(var/T in paths) for(var/T in paths)

View File

@@ -0,0 +1,17 @@
var/datum/controller/transfer_controller/transfer_controller
datum/controller/transfer_controller
var/timerbuffer = 0 //buffer for time check
var/currenttick = 0
datum/controller/transfer_controller/New()
timerbuffer = config.vote_autotransfer_initial
processing_objects += src
datum/controller/transfer_controller/Del()
processing_objects -= src
datum/controller/transfer_controller/proc/process()
currenttick = currenttick + 1
if (world.time >= timerbuffer - 600)
vote.autotransfer()
timerbuffer = timerbuffer + config.vote_autotransfer_interval

View File

@@ -67,6 +67,8 @@ datum/controller/game_controller/proc/setup()
setupfactions() setupfactions()
setup_economy() setup_economy()
transfer_controller = new
for(var/i=0, i<max_secret_rooms, i++) for(var/i=0, i<max_secret_rooms, i++)
make_mining_asteroid_secret() make_mining_asteroid_secret()
@@ -119,6 +121,7 @@ datum/controller/game_controller/proc/process()
controller_iteration++ controller_iteration++
vote.process() vote.process()
transfer_controller.process()
process_newscaster() process_newscaster()
//AIR //AIR
@@ -196,7 +199,7 @@ datum/controller/game_controller/proc/process()
timer = world.timeofday timer = world.timeofday
process_nano() process_nano()
nano_cost = (world.timeofday - timer) / 10 nano_cost = (world.timeofday - timer) / 10
sleep(breather_ticks) sleep(breather_ticks)
//EVENTS //EVENTS

View File

@@ -28,7 +28,7 @@
return return
/client/proc/debug_controller(controller in list("Master","Failsafe","Ticker","Lighting","Air","Jobs","Sun","Radio","Supply Shuttle","Emergency Shuttle","Configuration","pAI", "Cameras")) /client/proc/debug_controller(controller in list("Master","Failsafe","Ticker","Lighting","Air","Jobs","Sun","Radio","Supply Shuttle","Emergency Shuttle","Configuration","pAI", "Cameras", "Transfer Controller"))
set category = "Debug" set category = "Debug"
set name = "Debug Controller" set name = "Debug Controller"
set desc = "Debug the various periodic loop controllers for the game (be careful!)" set desc = "Debug the various periodic loop controllers for the game (be careful!)"
@@ -74,5 +74,8 @@
if("Cameras") if("Cameras")
debug_variables(cameranet) debug_variables(cameranet)
feedback_add_details("admin_verb","DCameras") feedback_add_details("admin_verb","DCameras")
if("Transfer Controller")
debug_variables(transfer_controller)
feedback_add_details("admin_verb","DAutovoter")
message_admins("Admin [key_name_admin(usr)] is debugging the [controller] controller.") message_admins("Admin [key_name_admin(usr)] is debugging the [controller] controller.")
return return

View File

@@ -48,8 +48,11 @@ datum/controller/vote
proc/autotransfer() proc/autotransfer()
initiate_vote("crew_transfer","the server") initiate_vote("crew_transfer","the server")
log_debug("The server has called an Autotransfer") log_debug("The server has called a crew transfer vote")
/* proc/autogamemode() //This is here for whoever can figure out how to make this work
initiate_vote("gamemode","the server")
log_debug("The server has called a gamemode vote")*/
proc/reset() proc/reset()
initiator = null initiator = null

View File

@@ -112,6 +112,7 @@ datum/mind
out += "Factions and special roles:<br>" out += "Factions and special roles:<br>"
var/list/sections = list( var/list/sections = list(
"implant",
"revolution", "revolution",
"cult", "cult",
"wizard", "wizard",
@@ -122,19 +123,23 @@ datum/mind
"malfunction", "malfunction",
) )
var/text = "" var/text = ""
var/mob/living/carbon/human/H = current
if (istype(current, /mob/living/carbon/human) || istype(current, /mob/living/carbon/monkey)) if (istype(current, /mob/living/carbon/human) || istype(current, /mob/living/carbon/monkey))
/** Impanted**/
if(H.is_loyalty_implanted(H))
text = "Loyalty Implant:<a href='?src=\ref[src];implant=remove'>Remove</a>|<b>Implanted</b></br>"
else
text = "Loyalty Implant:<b>No Implant</b>|<a href='?src=\ref[src];implant=add'>Implant him!</a></br>"
sections["implant"] = text
/** REVOLUTION ***/ /** REVOLUTION ***/
text = "revolution" text = "revolution"
if (ticker.mode.config_tag=="revolution") if (ticker.mode.config_tag=="revolution")
text = uppertext(text) text += uppertext(text)
text = "<i><b>[text]</b></i>: " text = "<i><b>[text]</b></i>: "
if (assigned_role in command_positions) if (H.is_loyalty_implanted(H))
text += "<b>HEAD</b>|employee|headrev|rev" text += "<b>LOYAL EMPLOYEE</b>|headrev|rev"
// else if (assigned_role in list("Security Officer", "Detective", "Warden"))
// text += "head|<b>OFFICER</b>|employee|headre|rev"
else if (src in ticker.mode.head_revolutionaries) else if (src in ticker.mode.head_revolutionaries)
text = "head|<a href='?src=\ref[src];revolution=clear'>employee</a>|<b>HEADREV</b>|<a href='?src=\ref[src];revolution=rev'>rev</a>" text = "<a href='?src=\ref[src];revolution=clear'>employee</a>|<b>HEADREV</b>|<a href='?src=\ref[src];revolution=rev'>rev</a>"
text += "<br>Flash: <a href='?src=\ref[src];revolution=flash'>give</a>" text += "<br>Flash: <a href='?src=\ref[src];revolution=flash'>give</a>"
var/list/L = current.get_contents() var/list/L = current.get_contents()
@@ -151,9 +156,9 @@ datum/mind
if (objectives.len==0) if (objectives.len==0)
text += "<br>Objectives are empty! <a href='?src=\ref[src];revolution=autoobjectives'>Set to kill all heads</a>." text += "<br>Objectives are empty! <a href='?src=\ref[src];revolution=autoobjectives'>Set to kill all heads</a>."
else if (src in ticker.mode.revolutionaries) else if (src in ticker.mode.revolutionaries)
text += "head|<a href='?src=\ref[src];revolution=clear'>employee</a>|<a href='?src=\ref[src];revolution=headrev'>headrev</a>|<b>REV</b>" text += "<a href='?src=\ref[src];revolution=clear'>employee</a>|<a href='?src=\ref[src];revolution=headrev'>headrev</a>|<b>REV</b>"
else else
text += "head|<b>EMPLOYEE</b>|<a href='?src=\ref[src];revolution=headrev'>headrev</a>|<a href='?src=\ref[src];revolution=rev'>rev</a>" text += "<b>EMPLOYEE</b>|<a href='?src=\ref[src];revolution=headrev'>headrev</a>|<a href='?src=\ref[src];revolution=rev'>rev</a>"
sections["revolution"] = text sections["revolution"] = text
/** CULT ***/ /** CULT ***/
@@ -161,19 +166,17 @@ datum/mind
if (ticker.mode.config_tag=="cult") if (ticker.mode.config_tag=="cult")
text = uppertext(text) text = uppertext(text)
text = "<i><b>[text]</b></i>: " text = "<i><b>[text]</b></i>: "
if (assigned_role in command_positions) if (H.is_loyalty_implanted(H))
text += "<b>HEAD</b>|employee|cultist" text += "<B>LOYAL EMPLOYEE</B>|cultist"
// else if (assigned_role in list("Security Officer", "Detective", "Warden"))
// text += "head|<b>OFFICER</b>|employee|cultist"
else if (src in ticker.mode.cult) else if (src in ticker.mode.cult)
text += "head|<a href='?src=\ref[src];cult=clear'>employee</a>|<b>CULTIST</b>" text += "<a href='?src=\ref[src];cult=clear'>employee</a>|<b>CULTIST</b>"
text += "<br>Give <a href='?src=\ref[src];cult=tome'>tome</a>|<a href='?src=\ref[src];cult=amulet'>amulet</a>." text += "<br>Give <a href='?src=\ref[src];cult=tome'>tome</a>|<a href='?src=\ref[src];cult=amulet'>amulet</a>."
/* /*
if (objectives.len==0) if (objectives.len==0)
text += "<br>Objectives are empty! Set to sacrifice and <a href='?src=\ref[src];cult=escape'>escape</a> or <a href='?src=\ref[src];cult=summon'>summon</a>." text += "<br>Objectives are empty! Set to sacrifice and <a href='?src=\ref[src];cult=escape'>escape</a> or <a href='?src=\ref[src];cult=summon'>summon</a>."
*/ */
else else
text += "head|<b>EMPLOYEE</b>|<a href='?src=\ref[src];cult=cultist'>cultist</a>" text += "<b>EMPLOYEE</b>|<a href='?src=\ref[src];cult=cultist'>cultist</a>"
sections["cult"] = text sections["cult"] = text
/** WIZARD ***/ /** WIZARD ***/
@@ -232,12 +235,16 @@ datum/mind
if (ticker.mode.config_tag=="traitor" || ticker.mode.config_tag=="traitorchan") if (ticker.mode.config_tag=="traitor" || ticker.mode.config_tag=="traitorchan")
text = uppertext(text) text = uppertext(text)
text = "<i><b>[text]</b></i>: " text = "<i><b>[text]</b></i>: "
if (src in ticker.mode.traitors) if(istype(current, /mob/living/carbon/human))
text += "<b>TRAITOR</b>|<a href='?src=\ref[src];traitor=clear'>loyal</a>" if (H.is_loyalty_implanted(H))
if (objectives.len==0) text +="traitor|<b>LOYAL EMPLOYEE</b>"
text += "<br>Objectives are empty! <a href='?src=\ref[src];traitor=autoobjectives'>Randomize</a>!"
else else
text += "<a href='?src=\ref[src];traitor=traitor'>traitor</a>|<b>LOYAL</b>" if (src in ticker.mode.traitors)
text += "<b>TRAITOR</b>|<a href='?src=\ref[src];traitor=clear'>Employee</a>"
if (objectives.len==0)
text += "<br>Objectives are empty! <a href='?src=\ref[src];traitor=autoobjectives'>Randomize</a>!"
else
text += "<a href='?src=\ref[src];traitor=traitor'>traitor</a>|<b>Employee</b>"
sections["traitor"] = text sections["traitor"] = text
/** MONKEY ***/ /** MONKEY ***/
@@ -485,6 +492,48 @@ datum/mind
if(!istype(objective)) return if(!istype(objective)) return
objective.completed = !objective.completed objective.completed = !objective.completed
else if(href_list["implant"])
var/mob/living/carbon/human/H = current
switch(href_list["implant"])
if("remove")
for(var/obj/item/weapon/implant/loyalty/I in H.contents)
for(var/datum/organ/external/organs in H.organs)
if(I in organs.implants)
I.Del()
break
H << "\blue <Font size =3><B>Your loyalty implant has been deactivated.</B></FONT>"
if("add")
var/obj/item/weapon/implant/loyalty/L = new/obj/item/weapon/implant/loyalty(H)
L.imp_in = H
L.implanted = 1
var/datum/organ/external/affected = H.organs_by_name["head"]
affected.implants += L
L.part = affected
H << "\red <Font size =3><B>You somehow have become the recepient of a loyalty transplant, and it just activated!</B></FONT>"
if(src in ticker.mode.revolutionaries)
special_role = null
ticker.mode.revolutionaries -= src
src << "\red <Font size = 3><B>The nanobots in the loyalty implant remove all thoughts about being a revolutionary. Get back to work!</B></Font>"
if(src in ticker.mode.head_revolutionaries)
special_role = null
ticker.mode.head_revolutionaries -=src
src << "\red <Font size = 3><B>The nanobots in the loyalty implant remove all thoughts about being a revolutionary. Get back to work!</B></Font>"
if(src in ticker.mode.cult)
ticker.mode.cult -= src
ticker.mode.update_cult_icons_removed(src)
special_role = null
var/datum/game_mode/cult/cult = ticker.mode
if (istype(cult))
cult.memoize_cult_objectives(src)
current << "\red <FONT size = 3><B>The nanobots in the loyalty implant remove all thoughts about being in a cult. Have a productive day!</B></FONT>"
memory = ""
if(src in ticker.mode.traitors)
ticker.mode.traitors -= src
special_role = null
current << "\red <FONT size = 3><B>The nanobots in the loyalty implant remove all thoughts about being a traitor to Nanotrasen. Have a nice day!</B></FONT>"
log_admin("[key_name_admin(usr)] has de-traitor'ed [current].")
else if (href_list["revolution"]) else if (href_list["revolution"])
switch(href_list["revolution"]) switch(href_list["revolution"])
if("clear") if("clear")
@@ -750,8 +799,8 @@ datum/mind
special_role = "traitor" special_role = "traitor"
current << "<B>\red You are a traitor!</B>" current << "<B>\red You are a traitor!</B>"
log_admin("[key_name_admin(usr)] has traitor'ed [current].") log_admin("[key_name_admin(usr)] has traitor'ed [current].")
if(isAI(current)) if(istype(current, /mob/living/silicon))
var/mob/living/silicon/ai/A = current var/mob/living/silicon/A = current
call(/datum/game_mode/proc/add_law_zero)(A) call(/datum/game_mode/proc/add_law_zero)(A)
A.show_laws() A.show_laws()

View File

@@ -7,6 +7,9 @@
for(var/obj/machinery/power/smes/S in world) for(var/obj/machinery/power/smes/S in world)
if(istype(get_area(S), /area/turret_protected) || S.z != 1) if(istype(get_area(S), /area/turret_protected) || S.z != 1)
continue continue
S.last_charge = S.charge
S.last_output = S.output
S.last_online = S.online
S.charge = 0 S.charge = 0
S.output = 0 S.output = 0
S.online = 0 S.online = 0
@@ -60,9 +63,9 @@
for(var/obj/machinery/power/smes/S in world) for(var/obj/machinery/power/smes/S in world)
if(S.z != 1) if(S.z != 1)
continue continue
S.charge = S.capacity S.charge = S.last_charge
S.output = 200000 S.output = S.last_output
S.online = 1 S.online = S.last_online
S.updateicon() S.updateicon()
S.power_change() S.power_change()
for(var/area/A in world) for(var/area/A in world)

View File

@@ -36,8 +36,6 @@ var/global/datum/controller/gameticker/ticker
var/triai = 0//Global holder for Triumvirate var/triai = 0//Global holder for Triumvirate
var/initialtpass = 0 //holder for inital autotransfer vote timer
/datum/controller/gameticker/proc/pregame() /datum/controller/gameticker/proc/pregame()
login_music = pick(\ login_music = pick(\
/*'sound/music/halloween/skeletons.ogg',\ /*'sound/music/halloween/skeletons.ogg',\
@@ -63,17 +61,6 @@ var/global/datum/controller/gameticker/ticker
current_state = GAME_STATE_SETTING_UP current_state = GAME_STATE_SETTING_UP
while (!setup()) while (!setup())
/datum/controller/gameticker/proc/votetimer()
var/timerbuffer = 0
if (initialtpass == 0)
timerbuffer = config.vote_autotransfer_initial
else
timerbuffer = config.vote_autotransfer_interval
spawn(timerbuffer)
vote.autotransfer()
initialtpass = 1
votetimer()
/datum/controller/gameticker/proc/setup() /datum/controller/gameticker/proc/setup()
//Create and announce mode //Create and announce mode
@@ -166,7 +153,6 @@ var/global/datum/controller/gameticker/ticker
spawn(3000) spawn(3000)
statistic_cycle() // Polls population totals regularly and stores them in an SQL DB -- TLE statistic_cycle() // Polls population totals regularly and stores them in an SQL DB -- TLE
votetimer()
return 1 return 1
/datum/controller/gameticker /datum/controller/gameticker

View File

@@ -119,6 +119,11 @@ var/bomb_set
/obj/machinery/nuclearbomb/attack_hand(mob/user as mob) /obj/machinery/nuclearbomb/attack_hand(mob/user as mob)
if (src.extended) if (src.extended)
if (!ishuman(user))
usr << "\red You don't have the dexterity to do this!"
return 1
user.set_machine(src) user.set_machine(src)
var/dat = text("<TT><B>Nuclear Fission Explosive</B><BR>\nAuth. Disk: <A href='?src=\ref[];auth=1'>[]</A><HR>", src, (src.auth ? "++++++++++" : "----------")) var/dat = text("<TT><B>Nuclear Fission Explosive</B><BR>\nAuth. Disk: <A href='?src=\ref[];auth=1'>[]</A><HR>", src, (src.auth ? "++++++++++" : "----------"))
if (src.auth) if (src.auth)
@@ -155,6 +160,12 @@ var/bomb_set
set name = "Make Deployable" set name = "Make Deployable"
set src in oview(1) set src in oview(1)
if (!usr.canmove || usr.stat || usr.restrained())
return
if (!ishuman(usr))
usr << "\red You don't have the dexterity to do this!"
return 1
if (src.deployable) if (src.deployable)
usr << "\red You close several panels to make [src] undeployable." usr << "\red You close several panels to make [src] undeployable."
src.deployable = 0 src.deployable = 0

View File

@@ -85,8 +85,8 @@
spawn_positions = 2 spawn_positions = 2
supervisors = "the chief engineer" supervisors = "the chief engineer"
selection_color = "#fff5cc" selection_color = "#fff5cc"
access = list(access_eva, access_engine, access_engine_equip, access_tech_storage, access_maint_tunnels, access_external_airlocks, access_construction, access_atmospherics) access = list(access_eva, access_engine, access_engine_equip, access_tech_storage, access_maint_tunnels, access_external_airlocks, access_construction, access_atmospherics, access_external_airlocks)
minimal_access = list(access_atmospherics, access_maint_tunnels, access_emergency_storage, access_construction) minimal_access = list(access_atmospherics, access_maint_tunnels, access_emergency_storage, access_construction, access_external_airlocks)
equip(var/mob/living/carbon/human/H) equip(var/mob/living/carbon/human/H)
@@ -104,4 +104,4 @@
H.equip_to_slot_or_del(new /obj/item/weapon/storage/box/engineer(H), slot_r_hand) H.equip_to_slot_or_del(new /obj/item/weapon/storage/box/engineer(H), slot_r_hand)
else else
H.equip_to_slot_or_del(new /obj/item/weapon/storage/box/engineer(H.back), slot_in_backpack) H.equip_to_slot_or_del(new /obj/item/weapon/storage/box/engineer(H.back), slot_in_backpack)
return 1 return 1

View File

@@ -116,7 +116,7 @@
//Clonepod //Clonepod
//Start growing a human clone in the pod! //Start growing a human clone in the pod!
/obj/machinery/clonepod/proc/growclone(var/ckey, var/clonename, var/ui, var/se, var/mindref, var/datum/species/mrace) /obj/machinery/clonepod/proc/growclone(var/ckey, var/clonename, var/ui, var/se, var/mindref, var/datum/species/mrace, var/languages)
if(mess || attempting) if(mess || attempting)
return 0 return 0
var/datum/mind/clonemind = locate(mindref) var/datum/mind/clonemind = locate(mindref)
@@ -195,7 +195,8 @@
H.h_style = pick("Bedhead", "Bedhead 2", "Bedhead 3") H.h_style = pick("Bedhead", "Bedhead 2", "Bedhead 3")
H.species = mrace H.species = mrace
H.add_language(mrace.language) for(var/datum/language/L in languages)
H.add_language(L.name)
H.update_mutantrace() H.update_mutantrace()
H.suiciding = 0 H.suiciding = 0
src.attempting = 0 src.attempting = 0
@@ -437,4 +438,4 @@
/* EMP grenade/spell effect /* EMP grenade/spell effect
if(istype(A, /obj/machinery/clonepod)) if(istype(A, /obj/machinery/clonepod))
A:malfunction() A:malfunction()
*/ */

View File

@@ -313,7 +313,7 @@
else if(!config.revival_cloning) else if(!config.revival_cloning)
temp = "Error: Unable to initiate cloning cycle." temp = "Error: Unable to initiate cloning cycle."
else if(pod1.growclone(C.fields["ckey"], C.fields["name"], C.fields["UI"], C.fields["SE"], C.fields["mind"], C.fields["mrace"])) else if(pod1.growclone(C.fields["ckey"], C.fields["name"], C.fields["UI"], C.fields["SE"], C.fields["mind"], C.fields["mrace"], C.fields["languages"]))
temp = "Initiating cloning cycle..." temp = "Initiating cloning cycle..."
records.Remove(C) records.Remove(C)
del(C) del(C)
@@ -323,7 +323,7 @@
var/mob/selected = find_dead_player("[C.fields["ckey"]]") var/mob/selected = find_dead_player("[C.fields["ckey"]]")
selected << 'sound/machines/chime.ogg' //probably not the best sound but I think it's reasonable selected << 'sound/machines/chime.ogg' //probably not the best sound but I think it's reasonable
var/answer = alert(selected,"Do you want to return to life?","Cloning","Yes","No") var/answer = alert(selected,"Do you want to return to life?","Cloning","Yes","No")
if(answer != "No" && pod1.growclone(C.fields["ckey"], C.fields["name"], C.fields["UI"], C.fields["SE"], C.fields["mind"], C.fields["mrace"], C.fields["interface"])) if(answer != "No" && pod1.growclone(C.fields["ckey"], C.fields["name"], C.fields["UI"], C.fields["SE"], C.fields["mind"], C.fields["mrace"], C.fields["languages"], C.fields["interface"]))
temp = "Initiating cloning cycle..." temp = "Initiating cloning cycle..."
records.Remove(C) records.Remove(C)
del(C) del(C)
@@ -370,6 +370,7 @@
R.fields["id"] = copytext(md5(subject.real_name), 2, 6) R.fields["id"] = copytext(md5(subject.real_name), 2, 6)
R.fields["UI"] = subject.dna.uni_identity R.fields["UI"] = subject.dna.uni_identity
R.fields["SE"] = subject.dna.struc_enzymes R.fields["SE"] = subject.dna.struc_enzymes
R.fields["languages"] = subject.languages
//Add an implant if needed //Add an implant if needed
var/obj/item/weapon/implant/health/imp = locate(/obj/item/weapon/implant/health, subject) var/obj/item/weapon/implant/health/imp = locate(/obj/item/weapon/implant/health, subject)

View File

@@ -439,8 +439,18 @@
var/atom/movable/locked var/atom/movable/locked
var/mode = 1 //1 - gravsling 2 - gravpush var/mode = 1 //1 - gravsling 2 - gravpush
var/last_fired = 0 //Concept stolen from guns.
var/fire_delay = 10 //Used to prevent spam-brute against humans.
action(atom/movable/target) action(atom/movable/target)
if(world.time >= last_fired + fire_delay)
last_fired = world.time
else
if (world.time % 3)
occupant_message("<span class='warning'>[src] is not ready to fire again!")
return 0
switch(mode) switch(mode)
if(1) if(1)
if(!action_checks(target) && !locked) return if(!action_checks(target) && !locked) return

View File

@@ -115,6 +115,7 @@
cell = C cell = C
return return
cell = new(src) cell = new(src)
cell.name = "high-capacity power cell"
cell.charge = 15000 cell.charge = 15000
cell.maxcharge = 15000 cell.maxcharge = 15000

View File

@@ -715,8 +715,12 @@ var/global/list/obj/item/device/pda/PDAs = list()
U.show_message("\red Energy feeds back into your [src]!", 1) U.show_message("\red Energy feeds back into your [src]!", 1)
U << browse(null, "window=pda") U << browse(null, "window=pda")
explode() explode()
log_admin("[key_name(U)] just attempted to blow up [P] with the Detomatix cartridge but failed, blowing themselves up")
message_admins("[key_name_admin(U)] just attempted to blow up [P] with the Detomatix cartridge but failed, blowing themselves up", 1)
else else
U.show_message("\blue Success!", 1) U.show_message("\blue Success!", 1)
log_admin("[key_name(U)] just attempted to blow up [P] with the Detomatix cartridge and succeded")
message_admins("[key_name_admin(U)] just attempted to blow up [P] with the Detomatix cartridge and succeded", 1)
P.explode() P.explode()
else else
U << "PDA not found." U << "PDA not found."
@@ -1193,4 +1197,4 @@ var/global/list/obj/item/device/pda/PDAs = list()
// Pass along the pulse to atoms in contents, largely added so pAIs are vulnerable to EMP // Pass along the pulse to atoms in contents, largely added so pAIs are vulnerable to EMP
/obj/item/device/pda/emp_act(severity) /obj/item/device/pda/emp_act(severity)
for(var/atom/A in src) for(var/atom/A in src)
A.emp_act(severity) A.emp_act(severity)

View File

@@ -127,7 +127,7 @@
icon_state = "id" icon_state = "id"
item_state = "card-id" item_state = "card-id"
var/access = list() var/access = list()
var/registered_name = null // The name registered_name on the card var/registered_name = "Unknown" // The name registered_name on the card
slot_flags = SLOT_ID slot_flags = SLOT_ID
var/blood_type = "\[UNSET\]" var/blood_type = "\[UNSET\]"
@@ -280,4 +280,4 @@
assignment = "General" assignment = "General"
New() New()
access = get_all_centcom_access() access = get_all_centcom_access()
..() ..()

View File

@@ -158,11 +158,14 @@ Implant Specifics:<BR>"}
activate() activate()
if (malfunction == MALFUNCTION_PERMANENT) if (malfunction == MALFUNCTION_PERMANENT)
return return
var/need_gib = null
if(istype(imp_in, /mob/)) if(istype(imp_in, /mob/))
var/mob/T = imp_in var/mob/T = imp_in
message_admins("Explosive implant triggered in [T] ([T.key]). (<A HREF='?_src_=holder;adminplayerobservecoodjump=1;X=[T.x];Y=[T.y];Z=[T.z]'>JMP</a>) ") message_admins("Explosive implant triggered in [T] ([T.key]). (<A HREF='?_src_=holder;adminplayerobservecoodjump=1;X=[T.x];Y=[T.y];Z=[T.z]'>JMP</a>) ")
log_game("Explosive implant triggered in [T] ([T.key]).") log_game("Explosive implant triggered in [T] ([T.key]).")
need_gib = 1
if(ishuman(imp_in)) if(ishuman(imp_in))
if (elevel == "Localized Limb") if (elevel == "Localized Limb")
if(part) //For some reason, small_boom() didn't work. So have this bit of working copypaste. if(part) //For some reason, small_boom() didn't work. So have this bit of working copypaste.
@@ -186,8 +189,12 @@ Implant Specifics:<BR>"}
explosion(get_turf(T), 0, 1, 3, 6) explosion(get_turf(T), 0, 1, 3, 6)
T.gib() T.gib()
else else
explosion(get_turf(imp_in), 0, 1, 3, 6) explosion(get_turf(imp_in), 0, 1, 3, 6)
if(need_gib)
imp_in.gib()
var/turf/t = get_turf(imp_in) var/turf/t = get_turf(imp_in)
if(t) if(t)

View File

@@ -55,6 +55,8 @@
handle_rotation() handle_rotation()
return return
else else
if(istype(usr,/mob/living/simple_animal/mouse))
return
if(!usr || !isturf(usr.loc)) if(!usr || !isturf(usr.loc))
return return
if(usr.stat || usr.restrained()) if(usr.stat || usr.restrained())

View File

@@ -510,6 +510,12 @@
if(counter >= 5) //So things dont get squiiiiished! if(counter >= 5) //So things dont get squiiiiished!
jobs += "</tr><tr align='center'>" jobs += "</tr><tr align='center'>"
counter = 0 counter = 0
if(jobban_isbanned(M, "Internal Affairs Agent"))
jobs += "<td width='20%'><a href='?src=\ref[src];jobban3=Internal Affairs Agent;jobban4=\ref[M]'><font color=red>Internal Affairs Agent</font></a></td>"
else
jobs += "<td width='20%'><a href='?src=\ref[src];jobban3=Internal Affairs Agent;jobban4=\ref[M]'>Internal Affairs Agent</a></td>"
jobs += "</tr></table>" jobs += "</tr></table>"
//Non-Human (Green) //Non-Human (Green)
@@ -583,6 +589,13 @@
else else
jobs += "<td width='20%'><a href='?src=\ref[src];jobban3=wizard;jobban4=\ref[M]'>[replacetext("Wizard", " ", "&nbsp")]</a></td>" jobs += "<td width='20%'><a href='?src=\ref[src];jobban3=wizard;jobban4=\ref[M]'>[replacetext("Wizard", " ", "&nbsp")]</a></td>"
//ERT
if(jobban_isbanned(M, "Emergency Response Team") || isbanned_dept)
jobs += "<td width='20%'><a href='?src=\ref[src];jobban3=Emergency Response Team;jobban4=\ref[M]'><font color=red>Emergency Response Team</font></a></td>"
else
jobs += "<td width='20%'><a href='?src=\ref[src];jobban3=Emergency Response Team;jobban4=\ref[M]'>Emergency Response Team</a></td>"
/* //Malfunctioning AI //Removed Malf-bans because they're a pain to impliment /* //Malfunctioning AI //Removed Malf-bans because they're a pain to impliment
if(jobban_isbanned(M, "malf AI") || isbanned_dept) if(jobban_isbanned(M, "malf AI") || isbanned_dept)
jobs += "<td width='20%'><a href='?src=\ref[src];jobban3=malf AI;jobban4=\ref[M]'><font color=red>[replacetext("Malf AI", " ", "&nbsp")]</font></a></td>" jobs += "<td width='20%'><a href='?src=\ref[src];jobban3=malf AI;jobban4=\ref[M]'><font color=red>[replacetext("Malf AI", " ", "&nbsp")]</font></a></td>"
@@ -2594,4 +2607,4 @@
show_player_info(ckey) show_player_info(ckey)
if("list") if("list")
PlayerNotesPage(text2num(href_list["index"])) PlayerNotesPage(text2num(href_list["index"]))
return return

View File

@@ -22,7 +22,7 @@
if(H.species.name in species_restricted) if(H.species.name in species_restricted)
wearable = 1 wearable = 1
if(!wearable) if(!wearable && (slot != 15 && slot != 16)) //Pockets.
M << "\red Your species cannot wear [src]." M << "\red Your species cannot wear [src]."
return 0 return 0

View File

@@ -128,7 +128,7 @@
desc = "Covers the eyes, preventing sight." desc = "Covers the eyes, preventing sight."
icon_state = "blindfold" icon_state = "blindfold"
item_state = "blindfold" item_state = "blindfold"
vision_flags = BLIND //vision_flags = BLIND // This flag is only supposed to be used if it causes permanent blindness, not temporary because of glasses
/obj/item/clothing/glasses/sunglasses/prescription /obj/item/clothing/glasses/sunglasses/prescription
name = "prescription sunglasses" name = "prescription sunglasses"
@@ -193,4 +193,4 @@
name = "Optical Thermal Implants" name = "Optical Thermal Implants"
desc = "A set of implantable lenses designed to augment your vision" desc = "A set of implantable lenses designed to augment your vision"
icon_state = "thermalimplants" icon_state = "thermalimplants"
item_state = "syringe_kit" item_state = "syringe_kit"

View File

@@ -32,7 +32,7 @@
else else
user << "<span class='notice'>[src] already have a cell.</span>" user << "<span class='notice'>[src] already have a cell.</span>"
else if(istype(W, /obj/item/weapon/wirecutters)) else if(istype(W, /obj/item/weapon/wirecutters) || istype(W, /obj/item/weapon/scalpel))
wired = null wired = null
@@ -43,7 +43,7 @@
cell = null cell = null
if(clipped == 0) if(clipped == 0)
playsound(src.loc, 'sound/items/Wirecutter.ogg', 100, 1) playsound(src.loc, 'sound/items/Wirecutter.ogg', 100, 1)
user.visible_message("\red [user] snips the fingertips off [src].","\red You snip the fingertips off [src].") user.visible_message("\red [user] cut the fingertips off [src].","\red You cut the fingertips off [src].")
clipped = 1 clipped = 1
if("exclude" in species_restricted) if("exclude" in species_restricted)
name = "mangled [name]" name = "mangled [name]"
@@ -78,4 +78,4 @@
if(wired) if(wired)
overlays += "gloves_wire" overlays += "gloves_wire"
if(cell) if(cell)
overlays += "gloves_cell" overlays += "gloves_cell"

View File

@@ -97,8 +97,6 @@ log transactions
user << "\red Artificial unit recognized. Artificial units do not currently receive monetary compensation, as per NanoTrasen regulation #1005." user << "\red Artificial unit recognized. Artificial units do not currently receive monetary compensation, as per NanoTrasen regulation #1005."
return return
if(get_dist(src,user) <= 1) if(get_dist(src,user) <= 1)
//check to see if the user has low security enabled
scan_user(user)
//js replicated from obj/machinery/computer/card //js replicated from obj/machinery/computer/card
var/dat = "<h1>NanoTrasen Automatic Teller Machine</h1>" var/dat = "<h1>NanoTrasen Automatic Teller Machine</h1>"
@@ -223,7 +221,11 @@ log transactions
var/new_sec_level = max( min(text2num(href_list["new_security_level"]), 2), 0) var/new_sec_level = max( min(text2num(href_list["new_security_level"]), 2), 0)
authenticated_account.security_level = new_sec_level authenticated_account.security_level = new_sec_level
if("attempt_auth") if("attempt_auth")
if(!ticks_left_locked_down)
// check if they have low security enabled
scan_user(usr)
if(!ticks_left_locked_down && held_card)
var/tried_account_num = text2num(href_list["account_num"]) var/tried_account_num = text2num(href_list["account_num"])
if(!tried_account_num) if(!tried_account_num)
tried_account_num = held_card.associated_account_number tried_account_num = held_card.associated_account_number
@@ -363,3 +365,5 @@ log transactions
T.date = current_date_string T.date = current_date_string
T.time = worldtime2text() T.time = worldtime2text()
authenticated_account.transaction_log.Add(T) authenticated_account.transaction_log.Add(T)
view_screen = NO_SCREEN

View File

@@ -44,39 +44,39 @@ var/list/event_last_fired = list()
//see: //see:
// Code/WorkInProgress/Cael_Aislinn/Economy/Economy_Events.dm // Code/WorkInProgress/Cael_Aislinn/Economy/Economy_Events.dm
// Code/WorkInProgress/Cael_Aislinn/Economy/Economy_Events_Mundane.dm // Code/WorkInProgress/Cael_Aislinn/Economy/Economy_Events_Mundane.dm
possibleEvents[/datum/event/economic_event] = 200 possibleEvents[/datum/event/economic_event] = 300
possibleEvents[/datum/event/trivial_news] = 300 possibleEvents[/datum/event/trivial_news] = 400
possibleEvents[/datum/event/mundane_news] = 200 possibleEvents[/datum/event/mundane_news] = 300
possibleEvents[/datum/event/pda_spam] = max(min(25, player_list.len) * 4, 200) possibleEvents[/datum/event/pda_spam] = max(min(25, player_list.len) * 4, 200)
possibleEvents[/datum/event/money_lotto] = max(min(5, player_list.len), 50) possibleEvents[/datum/event/money_lotto] = max(min(5, player_list.len), 50)
if(account_hack_attempted) if(account_hack_attempted)
possibleEvents[/datum/event/money_hacker] = max(min(25, player_list.len) * 4, 200) possibleEvents[/datum/event/money_hacker] = max(min(25, player_list.len) * 4, 200)
possibleEvents[/datum/event/carp_migration] = 50 + 50 * active_with_role["Engineer"] possibleEvents[/datum/event/carp_migration] = 20 + 10 * active_with_role["Engineer"]
possibleEvents[/datum/event/brand_intelligence] = 50 + 25 * active_with_role["Janitor"] possibleEvents[/datum/event/brand_intelligence] = 20 + 25 * active_with_role["Janitor"]
possibleEvents[/datum/event/rogue_drone] = 25 + 25 * active_with_role["Engineer"] + 25 * active_with_role["Security"] possibleEvents[/datum/event/rogue_drone] = 5 + 25 * active_with_role["Engineer"] + 25 * active_with_role["Security"]
possibleEvents[/datum/event/infestation] = 50 + 25 * active_with_role["Janitor"] possibleEvents[/datum/event/infestation] = 100 + 100 * active_with_role["Janitor"]
possibleEvents[/datum/event/communications_blackout] = 50 + 25 * active_with_role["AI"] + active_with_role["Scientist"] * 25 possibleEvents[/datum/event/communications_blackout] = 50 + 25 * active_with_role["AI"] + active_with_role["Scientist"] * 25
possibleEvents[/datum/event/ionstorm] = active_with_role["AI"] * 25 + active_with_role["Cyborg"] * 25 + active_with_role["Engineer"] * 10 + active_with_role["Scientist"] * 5 possibleEvents[/datum/event/ionstorm] = active_with_role["AI"] * 25 + active_with_role["Cyborg"] * 25 + active_with_role["Engineer"] * 10 + active_with_role["Scientist"] * 5
possibleEvents[/datum/event/grid_check] = 25 + 20 * active_with_role["Engineer"] possibleEvents[/datum/event/grid_check] = 25 + 10 * active_with_role["Engineer"]
possibleEvents[/datum/event/electrical_storm] = 10 * active_with_role["Janitor"] + 5 * active_with_role["Engineer"] possibleEvents[/datum/event/electrical_storm] = 15 * active_with_role["Janitor"] + 5 * active_with_role["Engineer"]
possibleEvents[/datum/event/wallrot] = 30 * active_with_role["Engineer"] + 50 * active_with_role["Botanist"] possibleEvents[/datum/event/wallrot] = 30 * active_with_role["Engineer"] + 50 * active_with_role["Botanist"]
if(!spacevines_spawned) if(!spacevines_spawned)
possibleEvents[/datum/event/spacevine] = 5 + 5 * active_with_role["Engineer"] possibleEvents[/datum/event/spacevine] = 10 + 5 * active_with_role["Engineer"]
if(minutes_passed >= 30) // Give engineers time to set up engine if(minutes_passed >= 30) // Give engineers time to set up engine
possibleEvents[/datum/event/meteor_wave] = 10 * active_with_role["Engineer"] possibleEvents[/datum/event/meteor_wave] = 10 * active_with_role["Engineer"]
possibleEvents[/datum/event/meteor_shower] = 40 * active_with_role["Engineer"] possibleEvents[/datum/event/meteor_shower] = 20 * active_with_role["Engineer"]
possibleEvents[/datum/event/blob] = 20 * active_with_role["Engineer"] possibleEvents[/datum/event/blob] = 20 * active_with_role["Engineer"]
possibleEvents[/datum/event/viral_infection] = 25 + active_with_role["Medical"] * 100 possibleEvents[/datum/event/viral_infection] = 25 + active_with_role["Medical"] * 15
if(active_with_role["Medical"] > 0) if(active_with_role["Medical"] > 0)
possibleEvents[/datum/event/radiation_storm] = active_with_role["Medical"] * 50 possibleEvents[/datum/event/radiation_storm] = active_with_role["Medical"] * 10
possibleEvents[/datum/event/spontaneous_appendicitis] = active_with_role["Medical"] * 150 possibleEvents[/datum/event/spontaneous_appendicitis] = active_with_role["Medical"] * 10
possibleEvents[/datum/event/viral_infection] = active_with_role["Medical"] * 10 possibleEvents[/datum/event/viral_infection] = active_with_role["Medical"] * 20
possibleEvents[/datum/event/organ_failure] = active_with_role["Medical"] * 50 possibleEvents[/datum/event/organ_failure] = active_with_role["Medical"] * 50
possibleEvents[/datum/event/prison_break] = active_with_role["Security"] * 50 possibleEvents[/datum/event/prison_break] = active_with_role["Security"] * 50

View File

@@ -2,8 +2,8 @@ var/list/allEvents = typesof(/datum/event) - /datum/event
var/list/potentialRandomEvents = typesof(/datum/event) - /datum/event var/list/potentialRandomEvents = typesof(/datum/event) - /datum/event
//var/list/potentialRandomEvents = typesof(/datum/event) - /datum/event - /datum/event/spider_infestation - /datum/event/alien_infestation //var/list/potentialRandomEvents = typesof(/datum/event) - /datum/event - /datum/event/spider_infestation - /datum/event/alien_infestation
var/eventTimeLower = 9000 //15 minutes var/eventTimeLower = 12000 //20 minutes
var/eventTimeUpper = 15000 //25 minutes var/eventTimeUpper = 24000 //40 minutes
var/scheduledEvent = null var/scheduledEvent = null

View File

@@ -63,6 +63,23 @@
real_name = name real_name = name
..() ..()
/mob/dead/attackby(obj/item/W, mob/user)
if(istype(W,/obj/item/weapon/tome))
var/mob/dead/M = src
if(src.invisibility != 0)
M.invisibility = 0
user.visible_message( \
"\red [user] drags ghost, [M], to our plan of reality!", \
"\red You drag [M] to our plan of reality!" \
)
else
user.visible_message ( \
"\red [user] just tried to smash his book into that ghost! It's not very effective", \
"\red You get the feeling that the ghost can't become any more visible." \
)
/mob/dead/CanPass(atom/movable/mover, turf/target, height=0, air_group=0) /mob/dead/CanPass(atom/movable/mover, turf/target, height=0, air_group=0)
return 1 return 1
/* /*

View File

@@ -296,6 +296,14 @@
if(armor >= 2) return if(armor >= 2) return
/mob/living/carbon/human/proc/is_loyalty_implanted(mob/living/carbon/human/M)
for(var/L in M.contents)
if(istype(L, /obj/item/weapon/implant/loyalty))
for(var/datum/organ/external/O in M.organs)
if(L in O.implants)
return 1
return 0
/mob/living/carbon/human/attack_slime(mob/living/carbon/slime/M as mob) /mob/living/carbon/human/attack_slime(mob/living/carbon/slime/M as mob)
if(M.Victim) return // can't attack while eating! if(M.Victim) return // can't attack while eating!
@@ -1257,4 +1265,4 @@ mob/living/carbon/human/yank_out_object()
if(species) if(species)
return 1 return 1
else else
return 0 return 0

View File

@@ -262,7 +262,7 @@
grabbed_by += G grabbed_by += G
G.synch() G.synch()
G.affecting = src
LAssailant = M LAssailant = M
for(var/mob/O in viewers(src, null)) for(var/mob/O in viewers(src, null))
@@ -298,6 +298,7 @@
grabbed_by += G grabbed_by += G
G.synch() G.synch()
G.affecting = src
LAssailant = M LAssailant = M
playsound(loc, 'sound/weapons/thudswoosh.ogg', 50, 1, -1) playsound(loc, 'sound/weapons/thudswoosh.ogg', 50, 1, -1)

View File

@@ -91,7 +91,7 @@
I.take_damage(rand(3,5)) I.take_damage(rand(3,5))
//Special effects for limbs. //Special effects for limbs.
if(E.name in list("l_hand","l_arm","r_hand","r_arm")) if(E.name in list("l_hand","l_arm","r_hand","r_arm") && (broken||malfunction))
var/obj/item/c_hand //Getting what's in this hand var/obj/item/c_hand //Getting what's in this hand
if(E.name == "l_hand" || E.name == "l_arm") if(E.name == "l_hand" || E.name == "l_arm")
c_hand = l_hand c_hand = l_hand
@@ -99,8 +99,7 @@
c_hand = r_hand c_hand = r_hand
if (c_hand) if (c_hand)
if (broken||malfunction) u_equip(c_hand)
u_equip(c_hand)
if(broken) if(broken)
emote("me", 1, "screams in pain and drops what they were holding in their [E.display_name?"[E.display_name]":"[E]"]!") emote("me", 1, "screams in pain and drops what they were holding in their [E.display_name?"[E.display_name]":"[E]"]!")
@@ -124,35 +123,11 @@
paralysis = 10 paralysis = 10
//Check arms and legs for existence //Check arms and legs for existence
var/canstand_l = 1 //Can stand on left leg can_stand = 2 //can stand on both legs
var/canstand_r = 1 //Can stand on right leg var/datum/organ/external/E = organs_by_name["l_foot"]
var/hasleg_l = 1 //Have left leg if(E.status & ORGAN_DESTROYED)
var/hasleg_r = 1 //Have right leg can_stand--
var/hasarm_l = 1 //Have left arm
var/hasarm_r = 1 //Have right arm
var/datum/organ/external/E
E = get_organ("l_leg")
if(E.status & ORGAN_DESTROYED && !(E.status & ORGAN_SPLINTED))
canstand_l = 0
hasleg_l = 0
E = get_organ("r_leg")
if(E.status & ORGAN_DESTROYED && !(E.status & ORGAN_SPLINTED))
canstand_r = 0
hasleg_r = 0
E = get_organ("l_foot")
if(E.status & ORGAN_DESTROYED && !(E.status & ORGAN_SPLINTED))
canstand_l = 0
E = get_organ("r_foot")
if(E.status & ORGAN_DESTROYED && !(E.status & ORGAN_SPLINTED))
canstand_r = 0
E = get_organ("l_arm")
if(E.status & ORGAN_DESTROYED && !(E.status & ORGAN_SPLINTED))
hasarm_l = 0
E = get_organ("r_arm")
if(E.status & ORGAN_DESTROYED && !(E.status & ORGAN_SPLINTED))
hasarm_r = 0
// Can stand if have at least one full leg (with leg and foot parts present) E = organs_by_name["r_foot"]
// Has limbs to move around if at least one arm or leg is at least partially there if(E.status & ORGAN_DESTROYED)
can_stand = canstand_l||canstand_r can_stand--
has_limbs = hasleg_l||hasleg_r||hasarm_l||hasarm_r

View File

@@ -203,7 +203,6 @@ This function completely restores a damaged organ to perfect condition.
implants -= implanted_object implants -= implanted_object
owner.updatehealth() owner.updatehealth()
update_icon()
/datum/organ/external/proc/createwound(var/type = CUT, var/damage) /datum/organ/external/proc/createwound(var/type = CUT, var/damage)
@@ -290,7 +289,6 @@ This function completely restores a damaged organ to perfect condition.
perma_injury = 0 perma_injury = 0
update_germs() update_germs()
update_icon()
return return
//Updating germ levels. Handles organ germ levels and necrosis. //Updating germ levels. Handles organ germ levels and necrosis.
@@ -383,6 +381,8 @@ This function completely restores a damaged organ to perfect condition.
// sync the organ's damage with its wounds // sync the organ's damage with its wounds
src.update_damages() src.update_damages()
if (update_icon())
owner.UpdateDamageIcon(1)
//Updates brute_damn and burn_damn from wound damages. Updates BLEEDING status. //Updates brute_damn and burn_damn from wound damages. Updates BLEEDING status.
/datum/organ/external/proc/update_damages() /datum/organ/external/proc/update_damages()
@@ -415,10 +415,6 @@ This function completely restores a damaged organ to perfect condition.
var/n_is = damage_state_text() var/n_is = damage_state_text()
if (n_is != damage_state) if (n_is != damage_state)
damage_state = n_is damage_state = n_is
if(status & ORGAN_DESTROYED)
owner.update_body(1)
else
owner.UpdateDamageIcon(1)
return 1 return 1
return 0 return 0
@@ -550,7 +546,7 @@ This function completely restores a damaged organ to perfect condition.
var/lol = pick(cardinal) var/lol = pick(cardinal)
step(organ,lol) step(organ,lol)
owner.regenerate_icons() owner.update_body(1)
/**************************************************** /****************************************************

View File

@@ -23,7 +23,10 @@
var/online = 1 var/online = 1
var/n_tag = null var/n_tag = null
var/obj/machinery/power/terminal/terminal = null var/obj/machinery/power/terminal/terminal = null
//Holders for powerout event.
var/last_output = 0
var/last_charge = 0
var/last_online = 0
/obj/machinery/power/smes/New() /obj/machinery/power/smes/New()
..() ..()

View File

@@ -290,6 +290,7 @@
var/bottlesprite = "1" //yes, strings var/bottlesprite = "1" //yes, strings
var/pillsprite = "1" var/pillsprite = "1"
var/client/has_sprites = list() var/client/has_sprites = list()
var/max_pill_count = 20
/obj/machinery/chem_master/New() /obj/machinery/chem_master/New()
var/datum/reagents/R = new/datum/reagents(100) var/datum/reagents/R = new/datum/reagents(100)
@@ -433,12 +434,26 @@
reagents.clear_reagents() reagents.clear_reagents()
icon_state = "mixer0" icon_state = "mixer0"
else if (href_list["createpill"] || href_list["createpill_multiple"]) else if (href_list["createpill"] || href_list["createpill_multiple"])
var/name = reject_bad_text(input(usr,"Name:","Name your pill!",reagents.get_master_reagent_name()))
var/count = 1 var/count = 1
if (href_list["createpill_multiple"]) count = isgoodnumber(input("Select the number of pills to make.", 10, pillamount) as num)
if (count > 20) count = 20 //Pevent people from creating huge stacks of pills easily. Maybe move the number to defines? if(reagents.total_volume/count < 1) //Sanity checking.
return
if (href_list["createpill_multiple"])
count = Clamp(isgoodnumber(input("Select the number of pills to make.", 10, pillamount) as num),1,max_pill_count)
if(reagents.total_volume/count < 1) //Sanity checking.
return
var/amount_per_pill = reagents.total_volume/count var/amount_per_pill = reagents.total_volume/count
if (amount_per_pill > 50) amount_per_pill = 50 if (amount_per_pill > 50) amount_per_pill = 50
var/name = reject_bad_text(input(usr,"Name:","Name your pill!","[reagents.get_master_reagent_name()] ([amount_per_pill] units)"))
if(reagents.total_volume/count < 1) //Sanity checking.
return
while (count--) while (count--)
var/obj/item/weapon/reagent_containers/pill/P = new/obj/item/weapon/reagent_containers/pill(src.loc) var/obj/item/weapon/reagent_containers/pill/P = new/obj/item/weapon/reagent_containers/pill(src.loc)
if(!name) name = reagents.get_master_reagent_name() if(!name) name = reagents.get_master_reagent_name()
@@ -451,6 +466,7 @@
if(loaded_pill_bottle.contents.len < loaded_pill_bottle.storage_slots) if(loaded_pill_bottle.contents.len < loaded_pill_bottle.storage_slots)
P.loc = loaded_pill_bottle P.loc = loaded_pill_bottle
src.updateUsrDialog() src.updateUsrDialog()
else if (href_list["createbottle"]) else if (href_list["createbottle"])
if(!condi) if(!condi)
var/name = reject_bad_text(input(usr,"Name:","Name your bottle!",reagents.get_master_reagent_name())) var/name = reject_bad_text(input(usr,"Name:","Name your bottle!",reagents.get_master_reagent_name()))

View File

@@ -31,8 +31,8 @@
return ..() && target.op_stage.appendix == 0 return ..() && target.op_stage.appendix == 0
begin_step(mob/user, mob/living/carbon/human/target, target_zone, obj/item/tool) begin_step(mob/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
user.visible_message("[user] starts to separating [target]'s appendix from the abdominal wall with \the [tool].", \ user.visible_message("[user] starts to separate [target]'s appendix from the abdominal wall with \the [tool].", \
"You start to separating [target]'s appendix from the abdominal wall with \the [tool]." ) "You start to separate [target]'s appendix from the abdominal wall with \the [tool]." )
target.custom_pain("The pain in your abdomen is living hell!",1) target.custom_pain("The pain in your abdomen is living hell!",1)
..() ..()

View File

@@ -88,8 +88,8 @@
return affected.name == "head" && affected.open == 2 && affected.stage == 1 return affected.name == "head" && affected.open == 2 && affected.stage == 1
begin_step(mob/user, mob/living/carbon/human/target, target_zone, obj/item/tool) begin_step(mob/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
user.visible_message("[user] is beginning piece together [target]'s skull with \the [tool]." , \ user.visible_message("[user] is beginning to piece together [target]'s skull with \the [tool]." , \
"You are beginning piece together [target]'s skull with \the [tool].") "You are beginning to piece together [target]'s skull with \the [tool].")
..() ..()
end_step(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool) end_step(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool)

View File

@@ -27,8 +27,8 @@
..() ..()
end_step(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool) end_step(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
user.visible_message("\blue [user] has cut through [target]'s skull open with \the [tool].", \ user.visible_message("\blue [user] has cut [target]'s skull open with \the [tool].", \
"\blue You have cut through [target]'s skull open with \the [tool].") "\blue You have cut [target]'s skull open with \the [tool].")
target.brain_op_stage = 2 target.brain_op_stage = 2
fail_step(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool) fail_step(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
@@ -122,13 +122,13 @@
return ..() && target.brain_op_stage == 2 return ..() && target.brain_op_stage == 2
begin_step(mob/user, mob/living/carbon/human/target, target_zone, obj/item/tool) begin_step(mob/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
user.visible_message("[user] starts taking out bone chips out of [target]'s brain with \the [tool].", \ user.visible_message("[user] starts taking bone chips out of [target]'s brain with \the [tool].", \
"You start taking out bone chips out of [target]'s brain with \the [tool].") "You start taking bone chips out of [target]'s brain with \the [tool].")
..() ..()
end_step(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool) end_step(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
user.visible_message("\blue [user] takes out all bone chips out of [target]'s brain with \the [tool].", \ user.visible_message("\blue [user] takes out all the bone chips in [target]'s brain with \the [tool].", \
"\blue You take out all bone chips out of [target]'s brain with \the [tool].") "\blue You take out all the bone chips in [target]'s brain with \the [tool].")
target.brain_op_stage = 3 target.brain_op_stage = 3
@@ -189,12 +189,12 @@
return ..() && target.brain_op_stage == 0 return ..() && target.brain_op_stage == 0
begin_step(mob/user, mob/living/carbon/slime/target, target_zone, obj/item/tool) begin_step(mob/user, mob/living/carbon/slime/target, target_zone, obj/item/tool)
user.visible_message("[user] starts cutting [target]'s flesh with \the [tool].", \ user.visible_message("[user] starts cutting through [target]'s flesh with \the [tool].", \
"You start cutting [target]'s flesh with \the [tool].") "You start cutting through [target]'s flesh with \the [tool].")
end_step(mob/living/user, mob/living/carbon/slime/target, target_zone, obj/item/tool) end_step(mob/living/user, mob/living/carbon/slime/target, target_zone, obj/item/tool)
user.visible_message("\blue [user] cuts [target]'s flesh with \the [tool].", \ user.visible_message("\blue [user] cuts through [target]'s flesh with \the [tool].", \
"\blue You cut [target]'s flesh with \the [tool], exposing the cores") "\blue You cut through [target]'s flesh with \the [tool], exposing the cores.")
target.brain_op_stage = 1 target.brain_op_stage = 1
fail_step(mob/living/user, mob/living/carbon/slime/target, target_zone, obj/item/tool) fail_step(mob/living/user, mob/living/carbon/slime/target, target_zone, obj/item/tool)
@@ -219,8 +219,8 @@
"You start cutting [target]'s silky innards apart with \the [tool].") "You start cutting [target]'s silky innards apart with \the [tool].")
end_step(mob/living/user, mob/living/carbon/slime/target, target_zone, obj/item/tool) end_step(mob/living/user, mob/living/carbon/slime/target, target_zone, obj/item/tool)
user.visible_message("\blue [user] cuts [target]'s innards apart with \the [tool], exposing the cores", \ user.visible_message("\blue [user] cuts [target]'s innards apart with \the [tool], exposing the cores.", \
"\blue You cut [target]'s innards apart with \the [tool], exposing the cores") "\blue You cut [target]'s innards apart with \the [tool], exposing the cores.")
target.brain_op_stage = 2 target.brain_op_stage = 2
fail_step(mob/living/user, mob/living/carbon/slime/target, target_zone, obj/item/tool) fail_step(mob/living/user, mob/living/carbon/slime/target, target_zone, obj/item/tool)
@@ -256,5 +256,5 @@
fail_step(mob/living/user, mob/living/carbon/slime/target, target_zone, obj/item/tool) fail_step(mob/living/user, mob/living/carbon/slime/target, target_zone, obj/item/tool)
user.visible_message("\red [user]'s hand slips, failing to cut core out!", \ user.visible_message("\red [user]'s hand slips, causing \him to miss the core!", \
"\red Your hand slips, failing to cut core out!") "\red Your hand slips, causing you to miss the core!")

View File

@@ -85,13 +85,13 @@
return ..() && target.op_stage.face == 2 return ..() && target.op_stage.face == 2
begin_step(mob/user, mob/living/carbon/human/target, target_zone, obj/item/tool) begin_step(mob/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
user.visible_message("[user] starts pulling skin on [target]'s face back in place with \the [tool].", \ user.visible_message("[user] starts pulling the skin on [target]'s face back in place with \the [tool].", \
"You start pulling skin on [target]'s face back in place with \the [tool].") "You start pulling the skin on [target]'s face back in place with \the [tool].")
..() ..()
end_step(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool) end_step(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
user.visible_message("\blue [user] pulls skin on [target]'s face back in place with \the [tool].", \ user.visible_message("\blue [user] pulls the skin on [target]'s face back in place with \the [tool].", \
"\blue You pull skin on [target]'s face back in place with \the [tool].") "\blue You pull the skin on [target]'s face back in place with \the [tool].")
target.op_stage.face = 3 target.op_stage.face = 3
fail_step(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool) fail_step(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool)

View File

@@ -52,8 +52,8 @@
fail_step(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool) fail_step(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
var/datum/organ/external/affected = target.get_organ(target_zone) var/datum/organ/external/affected = target.get_organ(target_zone)
user.visible_message("\red [user]'s hand slips, slicing open [target]'s [affected.display_name] in a wrong spot with \the [tool]!", \ user.visible_message("\red [user]'s hand slips, slicing open [target]'s [affected.display_name] in the wrong place with \the [tool]!", \
"\red Your hand slips, slicing open [target]'s [affected.display_name] in a wrong spot with \the [tool]!") "\red Your hand slips, slicing open [target]'s [affected.display_name] in the wrong place with \the [tool]!")
affected.createwound(CUT, 10) affected.createwound(CUT, 10)
/datum/surgery_step/generic/clamp_bleeders /datum/surgery_step/generic/clamp_bleeders
@@ -133,14 +133,14 @@
fail_step(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool) fail_step(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
var/datum/organ/external/affected = target.get_organ(target_zone) var/datum/organ/external/affected = target.get_organ(target_zone)
var/msg = "\red [user]'s hand slips, tearing the edges of incision on [target]'s [affected.display_name] with \the [tool]!" var/msg = "\red [user]'s hand slips, tearing the edges of the incision on [target]'s [affected.display_name] with \the [tool]!"
var/self_msg = "\red Your hand slips, tearing the edges of incision on [target]'s [affected.display_name] with \the [tool]!" var/self_msg = "\red Your hand slips, tearing the edges of the incision on [target]'s [affected.display_name] with \the [tool]!"
if (target_zone == "chest") if (target_zone == "chest")
msg = "\red [user]'s hand slips, damaging several organs [target]'s torso with \the [tool]!" msg = "\red [user]'s hand slips, damaging several organs in [target]'s torso with \the [tool]!"
self_msg = "\red Your hand slips, damaging several organs [target]'s torso with \the [tool]!" self_msg = "\red Your hand slips, damaging several organs in [target]'s torso with \the [tool]!"
if (target_zone == "groin") if (target_zone == "groin")
msg = "\red [user]'s hand slips, damaging several organs [target]'s lower abdomen with \the [tool]" msg = "\red [user]'s hand slips, damaging several organs in [target]'s lower abdomen with \the [tool]"
self_msg = "\red Your hand slips, damaging several organs [target]'s lower abdomen with \the [tool]!" self_msg = "\red Your hand slips, damaging several organs in [target]'s lower abdomen with \the [tool]!"
user.visible_message(msg, self_msg) user.visible_message(msg, self_msg)
target.apply_damage(12, BRUTE, affected) target.apply_damage(12, BRUTE, affected)

View File

@@ -123,7 +123,7 @@
user.visible_message("\blue [user] puts \the [tool] inside [target]'s [get_cavity(affected)] cavity.", \ user.visible_message("\blue [user] puts \the [tool] inside [target]'s [get_cavity(affected)] cavity.", \
"\blue You put \the [tool] inside [target]'s [get_cavity(affected)] cavity." ) "\blue You put \the [tool] inside [target]'s [get_cavity(affected)] cavity." )
if (tool.w_class > get_max_wclass(affected)/2 && prob(50)) if (tool.w_class > get_max_wclass(affected)/2 && prob(50))
user << "\red You tear some vessels trying to fit such big object in this cavity." user << "\red You tear some blood vessels trying to fit such a big object in this cavity."
var/datum/wound/internal_bleeding/I = new (15) var/datum/wound/internal_bleeding/I = new (15)
affected.wounds += I affected.wounds += I
affected.owner.custom_pain("You feel something rip in your [affected.display_name]!", 1) affected.owner.custom_pain("You feel something rip in your [affected.display_name]!", 1)

View File

@@ -31,8 +31,8 @@
..() ..()
end_step(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool) end_step(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
user.visible_message("\blue [user] has cut through [target]'s ribcage open with \the [tool].", \ user.visible_message("\blue [user] has cut [target]'s ribcage open with \the [tool].", \
"\blue You have cut through [target]'s ribcage open with \the [tool].") "\blue You have cut [target]'s ribcage open with \the [tool].")
target.op_stage.ribcage = 1 target.op_stage.ribcage = 1
fail_step(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool) fail_step(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
@@ -111,14 +111,14 @@
target.op_stage.ribcage = 1 target.op_stage.ribcage = 1
fail_step(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool) fail_step(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
var/msg = "\red [user]'s hand slips, bending [target]'s ribcage in a wrong shape!" var/msg = "\red [user]'s hand slips, bending [target]'s ribs the wrong way!"
var/self_msg = "\red Your hand slips, bending [target]'s ribcage in a wrong shape!" var/self_msg = "\red Your hand slips, bending [target]'s ribs the wrong way!"
user.visible_message(msg, self_msg) user.visible_message(msg, self_msg)
var/datum/organ/external/chest/affected = target.get_organ("chest") var/datum/organ/external/chest/affected = target.get_organ("chest")
affected.createwound(BRUISE, 20) affected.createwound(BRUISE, 20)
affected.fracture() affected.fracture()
if (prob(40)) if (prob(40))
user.visible_message("\red Rib pierces the lung!") user.visible_message("\red A rib pierces the lung!")
target.rupture_lung() target.rupture_lung()
/datum/surgery_step/ribcage/mend_ribcage /datum/surgery_step/ribcage/mend_ribcage

View File

@@ -46,7 +46,7 @@
if (affected.parent) if (affected.parent)
affected = affected.parent affected = affected.parent
user.visible_message("\red [user]'s hand slips, cutting [target]'s [affected.display_name] open!", \ user.visible_message("\red [user]'s hand slips, cutting [target]'s [affected.display_name] open!", \
"\red Your hand slips, cutting [target]'s [affected.display_name] open!") "\red Your hand slips, cutting [target]'s [affected.display_name] open!")
affected.createwound(CUT, 10) affected.createwound(CUT, 10)
@@ -65,8 +65,8 @@
begin_step(mob/user, mob/living/carbon/human/target, target_zone, obj/item/tool) begin_step(mob/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
var/datum/organ/external/affected = target.get_organ(target_zone) var/datum/organ/external/affected = target.get_organ(target_zone)
user.visible_message("[user] is beginning reposition flesh and nerve endings where where [target]'s [affected.display_name] used to be with [tool].", \ user.visible_message("[user] is beginning to reposition flesh and nerve endings where where [target]'s [affected.display_name] used to be with [tool].", \
"You start repositioning flesh and nerve endings where where [target]'s [affected.display_name] used to be with [tool].") "You start repositioning flesh and nerve endings where [target]'s [affected.display_name] used to be with [tool].")
..() ..()
end_step(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool) end_step(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
@@ -101,8 +101,8 @@
begin_step(mob/user, mob/living/carbon/human/target, target_zone, obj/item/tool) begin_step(mob/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
var/datum/organ/external/affected = target.get_organ(target_zone) var/datum/organ/external/affected = target.get_organ(target_zone)
user.visible_message("[user] starts adjusting area around [target]'s [affected.display_name] with \the [tool].", \ user.visible_message("[user] starts adjusting the area around [target]'s [affected.display_name] with \the [tool].", \
"You start adjusting area around [target]'s [affected.display_name] with \the [tool]..") "You start adjusting the area around [target]'s [affected.display_name] with \the [tool].")
..() ..()
end_step(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool) end_step(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
@@ -140,14 +140,14 @@
begin_step(mob/user, mob/living/carbon/human/target, target_zone, obj/item/tool) begin_step(mob/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
var/datum/organ/external/affected = target.get_organ(target_zone) var/datum/organ/external/affected = target.get_organ(target_zone)
user.visible_message("[user] starts attaching [tool] where [target]'s [affected.display_name] used to be.", \ user.visible_message("[user] starts attaching \the [tool] where [target]'s [affected.display_name] used to be.", \
"You start attaching [tool] where [target]'s [affected.display_name] used to be.") "You start attaching \the [tool] where [target]'s [affected.display_name] used to be.")
end_step(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool) end_step(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
var/obj/item/robot_parts/L = tool var/obj/item/robot_parts/L = tool
var/datum/organ/external/affected = target.get_organ(target_zone) var/datum/organ/external/affected = target.get_organ(target_zone)
user.visible_message("\blue [user] has attached [tool] where [target]'s [affected.display_name] used to be.", \ user.visible_message("\blue [user] has attached \the [tool] where [target]'s [affected.display_name] used to be.", \
"\blue You have attached [tool] where [target]'s [affected.display_name] used to be.") "\blue You have attached \the [tool] where [target]'s [affected.display_name] used to be.")
affected.robotize() affected.robotize()
if(L.sabotaged) if(L.sabotaged)
affected.sabotaged = 1 affected.sabotaged = 1

3
config/.gitignore vendored Normal file
View File

@@ -0,0 +1,3 @@
#ignore everything here, except subdirectories.
*
!*/

Binary file not shown.

Before

Width:  |  Height:  |  Size: 4.3 KiB

After

Width:  |  Height:  |  Size: 4.3 KiB