Merge branch 'master' of https://github.com/ParadiseSS13/Paradise into OrganRefactor

This commit is contained in:
Aurorablade
2016-02-24 06:27:16 -05:00
122 changed files with 1406 additions and 680 deletions
+26 -1
View File
@@ -160,7 +160,8 @@ var/list/admin_verbs_possess = list(
)
var/list/admin_verbs_permissions = list(
/client/proc/edit_admin_permissions,
/client/proc/create_poll
/client/proc/create_poll,
/client/proc/big_brother
)
var/list/admin_verbs_rejuv = list(
/client/proc/respawn_character,
@@ -428,6 +429,7 @@ var/list/admin_verbs_proccall = list (
return
if(holder)
holder.big_brother = 0
if(holder.fakekey)
holder.fakekey = null
else
@@ -441,6 +443,29 @@ var/list/admin_verbs_proccall = list (
message_admins("[key_name_admin(usr)] has turned stealth mode [holder.fakekey ? "ON" : "OFF"]", 1)
feedback_add_details("admin_verb","SM") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
/client/proc/big_brother()
set category = "Admin"
set name = "Big Brother Mode"
if(!check_rights(R_PERMISSIONS))
return
if(holder)
if(holder.fakekey)
holder.fakekey = null
holder.big_brother = 0
else
var/new_key = ckeyEx(input("Enter your desired display name. Unlike normal stealth mode, this will not appear in Who at all, except for other heads.", "Fake Key", key) as text|null)
if(!new_key)
return
if(length(new_key) >= 26)
new_key = copytext(new_key, 1, 26)
holder.fakekey = new_key
holder.big_brother = 1
createStealthKey()
log_admin("[key_name(usr)] has turned BB mode [holder.fakekey ? "ON" : "OFF"]")
feedback_add_details("admin_verb","BBSM")
#define MAX_WARNS 3
#define AUTOBANTIME 10
+1
View File
@@ -5,6 +5,7 @@ var/list/admin_datums = list()
var/client/owner = null
var/rights = 0
var/fakekey = null
var/big_brother = 0
var/datum/marked_datum
+3 -3
View File
@@ -8,9 +8,9 @@ var/global/sent_strike_team = 0
usr << "<font color='red'>The game hasn't started yet!</font>"
return
if(sent_strike_team == 1)
usr << "<font color='red'>CentCom is already sending a team.</font>"
usr << "<font color='red'>CentComm is already sending a team.</font>"
return
if(alert("Do you want to send in the CentCom death squad? Once enabled, this is irreversible.",,"Yes","No")!="Yes")
if(alert("Do you want to send in the CentComm death squad? Once enabled, this is irreversible.",,"Yes","No")!="Yes")
return
alert("This 'mode' will go on until everyone is dead or the station is destroyed. You may also admin-call the evac shuttle when appropriate. Spawned commandos have internals cameras which are viewable through a monitor inside the Spec. Ops. Office. Assigning the team's detailed task is recommended from there. While you will be able to manually pick the candidates from active ghosts, their assignment in the squad will be random.")
@@ -92,7 +92,7 @@ var/global/sent_strike_team = 0
new /obj/effect/spawner/newbomb/timer/syndicate(L.loc)
qdel(L)
message_admins("\blue [key_name_admin(usr)] has spawned a CentCom strike squad.", 1)
message_admins("\blue [key_name_admin(usr)] has spawned a CentComm strike squad.", 1)
log_admin("[key_name(usr)] used Spawn Death Squad.")
return 1
+12 -6
View File
@@ -236,20 +236,26 @@ obj/machinery/gateway/centerstation/process()
if(!ready) return
if(!active) return
if(istype(M, /mob/living/carbon))
for(var/obj/item/weapon/implant/exile/E in M)//Checking that there is an exile implant in the contents
if(E.imp_in == M)//Checking that it's actually implanted vs just in their pocket
M << "\black The station gate has detected your exile implant and is blocking your entry."
return
if (exilecheck(M)) return
if(istype(M, /obj))
for(var/mob/living/carbon/F in M)
if (exilecheck(F)) return
M.forceMove(get_step(stationgate.loc, SOUTH))
M.dir = SOUTH
/obj/machinery/gateway/centeraway/proc/exilecheck(var/mob/living/carbon/M)
for(var/obj/item/weapon/implant/exile/E in M)//Checking that there is an exile implant in the contents
if(E.imp_in == M)//Checking that it's actually implanted vs just in their pocket
M << "<span class='notice'>The station gate has detected your exile implant and is blocking your entry.</span>"
return 1
return 0
/obj/machinery/gateway/centeraway/attackby(obj/item/device/W as obj, mob/user as mob, params)
if(istype(W,/obj/item/device/multitool))
if(calibrated)
user << "\black The gate is already calibrated, there is no work for you to do here."
user << "<span class='notice'>The gate is already calibrated, there is no work for you to do here.</span>"
return
else
user << "<span class='boldnotice'>Recalibration successful!</span>: \black This gate's systems have been fine tuned. Travel to this gate will now be on target."
user << "<span class='boldnotice'>Recalibration successful!</span><span class='notice'>: This gate's systems have been fine tuned. Travel to this gate will now be on target.</span>"
calibrated = 1
return
+5 -1
View File
@@ -41,8 +41,12 @@ proc/createRandomZlevel()
var/file = file(map)
if(isfile(file))
maploader.load_map(file)
var/turfs = block(locate(1, 1, world.maxz), locate(world.maxx, world.maxy, world.maxz))
if(air_master)
air_master.setup_allturfs(block(locate(1, 1, world.maxz), locate(world.maxx, world.maxy, world.maxz)))
air_master.setup_allturfs(turfs)
for(var/turf/T in turfs)
if(T.dynamic_lighting)
T.lighting_build_overlays()
log_to_dd("Away mission loaded: [map]")
for(var/obj/effect/landmark/L in landmarks_list)
+1 -1
View File
@@ -201,7 +201,7 @@
prefs.save_preferences(src)
usr << "You will [(prefs.sound & SOUND_STREAMING) ? "now" : "no longer"] hear streamed media."
if(!media) return
if(prefs.toggles & SOUND_STREAMING)
if(prefs.sound & SOUND_STREAMING)
media.update_music()
else
media.stop_music()
+44 -1
View File
@@ -255,6 +255,7 @@ BLIND // can't see anything
set src in usr
set_sensors(usr)
..()
//Head
/obj/item/clothing/head
name = "head"
@@ -409,9 +410,51 @@ BLIND // can't see anything
name = "suit"
var/fire_resist = T0C+100
allowed = list(/obj/item/weapon/tank/emergency_oxygen)
armor = list(melee = 0, bullet = 0, laser = 0,energy = 0, bomb = 0, bio = 0, rad = 0)
armor = list(melee = 0, bullet = 0, laser = 0, energy = 0, bomb = 0, bio = 0, rad = 0)
slot_flags = SLOT_OCLOTHING
var/blood_overlay_type = "suit"
var/suit_adjusted = 0
var/ignore_suitadjust = 1
var/adjust_flavour = null
//Proc that opens and closes jackets.
/obj/item/clothing/suit/proc/adjustsuit(var/mob/user)
if(!ignore_suitadjust)
if(!user.canmove || user.stat || user.restrained())
return
if(suit_adjusted)
var/flavour = "close"
icon_state = initial(icon_state)
item_state = initial(item_state)
if(adjust_flavour)
flavour = "[copytext(adjust_flavour, 3, lentext(adjust_flavour) + 1)] up" //Trims off the 'un' at the beginning of the word. unzip -> zip, unbutton->button.
user << "You [flavour] \the [src]."
suit_adjusted = 0 //Suit is no longer adjusted.
else
var/flavour = "close"
icon_state += "_open"
item_state += "_open"
if(adjust_flavour)
flavour = "[adjust_flavour]"
user << "You [flavour] \the [src]."
suit_adjusted = 1 //Suit's adjusted.
usr.update_inv_wear_suit()
else
usr << "<span class='notice'>You attempt to button up the velcro on \the [src], before promptly realising how retarded you are.</span>"
/obj/item/clothing/suit/verb/openjacket(var/mob/user)
set name = "Open/Close Jacket"
set category = "Object"
set src in usr
if(!istype(usr, /mob/living)) return
if(usr.stat) return
adjustsuit(user)
/obj/item/clothing/suit/ui_action_click() //This is what happens when you click the HUD action button to adjust your suit.
if(!ignore_suitadjust)
adjustsuit(usr)
else ..() //This is required in order to ensure that the UI buttons for hardsuits (i.e. syndicate and the chronosuit) and the RD's RA vest still work.
//Spacesuit
//Note: Everything in modules/clothing/spacesuits should have the entire suit grouped together.
@@ -207,3 +207,18 @@
tools = list(/obj/item/weapon/wirecutters)
time = 40
/obj/item/clothing/shoes/sandal/white
name = "White Sandals"
desc = "Medical sandals that nerds wear."
icon_state = "medsandal"
item_color = "medsandal"
species_restricted = null
/obj/item/clothing/shoes/sandal/fancy
name = "Fancy Sandals"
desc = "FANCY!!."
icon_state = "fancysandal"
item_color = "fancysandal"
species_restricted = null
+3 -17
View File
@@ -70,23 +70,9 @@
icon_state = "hostrench"
item_state = "hostrench"
flags_inv = 0
verb/toggle()
set name = "Toggle Trenchcoat Buttons"
set category = "Object"
if(!usr.canmove || usr.stat || usr.restrained())
return 0
if(icon_state == "hostrench")
icon_state = "hostrench_button"
item_state = "hostrench_button"
usr<< "You button the [src]."
else
icon_state = "hostrench"
item_state = "hostrench"
usr<< "You unbutton the [src]."
usr.update_inv_wear_suit()
ignore_suitadjust = 0
action_button_name = "Open/Close Trenchcoat"
adjust_flavour = "unbutton"
/obj/item/clothing/suit/armor/hos/jensen
name = "armored trenchcoat"
+28 -70
View File
@@ -97,7 +97,7 @@
//Chef
/obj/item/clothing/suit/chef
name = "Chef's apron"
name = "chef's apron"
desc = "An apron used by a high class chef."
icon_state = "chef"
item_state = "chef"
@@ -112,7 +112,7 @@
//Chef
/obj/item/clothing/suit/chef/classic
name = "A classic chef's apron."
name = "classic chef's apron"
desc = "A basic, dull, white chef's apron."
icon_state = "apronchef"
item_state = "apronchef"
@@ -190,23 +190,29 @@
//Lawyer
/obj/item/clothing/suit/storage/lawyer/blackjacket
name = "Black Suit Jacket"
name = "black suit jacket"
desc = "A snappy dress jacket."
icon_state = "suitjacket_black_open"
item_state = "suitjacket_black_open"
icon_state = "suitjacket_black"
item_state = "suitjacket_black"
blood_overlay_type = "coat"
body_parts_covered = UPPER_TORSO|ARMS
ignore_suitadjust = 0
action_button_name = "Button/Unbutton Jacket"
adjust_flavour = "unbutton"
/obj/item/clothing/suit/storage/lawyer/bluejacket
name = "Blue Suit Jacket"
name = "blue suit jacket"
desc = "A snappy dress jacket."
icon_state = "suitjacket_blue_open"
item_state = "suitjacket_blue_open"
icon_state = "suitjacket_blue"
item_state = "suitjacket_blue"
blood_overlay_type = "coat"
body_parts_covered = UPPER_TORSO|ARMS
ignore_suitadjust = 0
action_button_name = "Button/Unbutton Jacket"
adjust_flavour = "unbutton"
/obj/item/clothing/suit/storage/lawyer/purpjacket
name = "Purple Suit Jacket"
name = "purple suit jacket"
desc = "A snappy dress jacket."
icon_state = "suitjacket_purp"
item_state = "suitjacket_purp"
@@ -215,87 +221,39 @@
//Internal Affairs
/obj/item/clothing/suit/storage/internalaffairs
name = "Internal Affairs Jacket"
name = "\improper Internal Affairs jacket"
desc = "A smooth black jacket."
icon_state = "ia_jacket_open"
icon_state = "ia_jacket"
item_state = "ia_jacket"
blood_overlay_type = "coat"
body_parts_covered = UPPER_TORSO|ARMS
verb/toggle()
set name = "Toggle Coat Buttons"
set category = "Object"
set src in usr
if(!usr.canmove || usr.stat || usr.restrained())
return 0
switch(icon_state)
if("ia_jacket_open")
src.icon_state = "ia_jacket"
usr << "You button up the jacket."
if("ia_jacket")
src.icon_state = "ia_jacket_open"
usr << "You unbutton the jacket."
else
usr << "You attempt to button-up the velcro on your [src], before promptly realising how retarded you are."
return
usr.update_inv_wear_suit() //so our overlays update
ignore_suitadjust = 0
action_button_name = "Button/Unbutton Jacket"
adjust_flavour = "unbutton"
/obj/item/clothing/suit/storage/ntrep
name = "NanoTrasen Representative Jacket"
name = "\improper NanoTrasen Representative jacket"
desc = "A fancy black jacket, standard issue to NanoTrasen Represenatives."
icon_state = "ntrep"
item_state = "ia_jacket"
blood_overlay_type = "coat"
body_parts_covered = UPPER_TORSO|ARMS
verb/toggle()
set name = "Toggle Coat Buttons"
set category = "Object"
set src in usr
if(!usr.canmove || usr.stat || usr.restrained())
return 0
switch(icon_state)
if("ntrep_open")
src.icon_state = "ntrep"
usr << "You button up the jacket."
if("ntrep")
src.icon_state = "ntrep_open"
usr << "You unbutton the jacket."
else
usr << "You attempt to button-up the velcro on your [src], before promptly realising how retarded you are."
return
usr.update_inv_wear_suit() //so our overlays update
ignore_suitadjust = 0
action_button_name = "Button/Unbutton Jacket"
adjust_flavour = "unbutton"
//Medical
/obj/item/clothing/suit/storage/fr_jacket
name = "first responder jacket"
desc = "A high-visibility jacket worn by medical first responders."
icon_state = "fr_jacket_open"
icon_state = "fr_jacket"
item_state = "fr_jacket"
blood_overlay_type = "armor"
allowed = list(/obj/item/stack/medical, /obj/item/weapon/reagent_containers/dropper, /obj/item/weapon/reagent_containers/hypospray, /obj/item/weapon/reagent_containers/syringe, \
/obj/item/device/healthanalyzer, /obj/item/device/antibody_scanner, /obj/item/device/flashlight, /obj/item/device/radio, /obj/item/weapon/tank/emergency_oxygen,/obj/item/device/rad_laser)
verb/toggle()
set name = "Toggle Jacket Buttons"
set category = "Object"
set src in usr
if(!usr.canmove || usr.stat || usr.restrained())
return 0
switch(icon_state)
if("fr_jacket_open")
src.icon_state = "fr_jacket"
usr << "You button up the jacket."
if("fr_jacket")
src.icon_state = "fr_jacket_open"
usr << "You unbutton the jacket."
usr.update_inv_wear_suit() //so our overlays update
ignore_suitadjust = 0
action_button_name = "Button/Unbutton Jacket"
adjust_flavour = "unbutton"
//Mime
/obj/item/clothing/suit/suspenders
+10 -69
View File
@@ -3,76 +3,17 @@
desc = "A suit that protects against minor chemical spills."
icon_state = "labcoat_open"
item_state = "labcoat"
ignore_suitadjust = 0
blood_overlay_type = "coat"
body_parts_covered = UPPER_TORSO|LOWER_TORSO|ARMS
allowed = list(/obj/item/device/analyzer,/obj/item/device/antibody_scanner,/obj/item/stack/medical,/obj/item/weapon/dnainjector,/obj/item/weapon/reagent_containers/dropper,/obj/item/weapon/reagent_containers/syringe,/obj/item/weapon/reagent_containers/hypospray,/obj/item/device/healthanalyzer,/obj/item/device/flashlight/pen,/obj/item/weapon/reagent_containers/glass/bottle,/obj/item/weapon/reagent_containers/glass/beaker,/obj/item/weapon/reagent_containers/pill,/obj/item/weapon/storage/pill_bottle,/obj/item/weapon/paper,/obj/item/device/rad_laser)
armor = list(melee = 0, bullet = 0, laser = 0,energy = 0, bomb = 0, bio = 50, rad = 0)
armor = list(melee = 0, bullet = 0, laser = 0, energy = 0, bomb = 0, bio = 50, rad = 0)
species_fit = list("Vox")
sprite_sheets = list(
"Vox" = 'icons/mob/species/vox/suit.dmi'
)
verb/toggle()
set name = "Toggle Labcoat Buttons"
set category = "Object"
set src in usr
if(!usr.canmove || usr.stat || usr.restrained())
return 0
switch(icon_state)
if("labcoat_open")
src.icon_state = "labcoat"
usr << "You button up the labcoat."
if("labcoat")
src.icon_state = "labcoat_open"
usr << "You unbutton the labcoat."
if("labcoat_cmo_open")
src.icon_state = "labcoat_cmo"
usr << "You button up the labcoat."
if("labcoat_cmo")
src.icon_state = "labcoat_cmo_open"
usr << "You unbutton the labcoat."
if("labcoat_gen_open")
src.icon_state = "labcoat_gen"
usr << "You button up the labcoat."
if("labcoat_gen")
src.icon_state = "labcoat_gen_open"
usr << "You unbutton the labcoat."
if("labcoat_chem_open")
src.icon_state = "labcoat_chem"
usr << "You button up the labcoat."
if("labcoat_chem")
src.icon_state = "labcoat_chem_open"
usr << "You unbutton the labcoat."
if("labcoat_vir_open")
src.icon_state = "labcoat_vir"
usr << "You button up the labcoat."
if("labcoat_vir")
src.icon_state = "labcoat_vir_open"
usr << "You unbutton the labcoat."
if("labcoat_tox_open")
src.icon_state = "labcoat_tox"
usr << "You button up the labcoat."
if("labcoat_tox")
src.icon_state = "labcoat_tox_open"
usr << "You unbutton the labcoat."
if("labgreen_open")
src.icon_state = "labgreen"
usr << "You button up the labcoat."
if("labgreen")
src.icon_state = "labgreen_open"
usr << "You unbutton the labcoat."
if("labcoat_mort_open")
src.icon_state = "labcoat_mort"
usr << "You button up the labcoat."
if("labcoat_mort")
src.icon_state = "labcoat_mort_open"
usr << "You unbutton the labcoat."
else
usr << "You attempt to button-up the velcro on your [src], before promptly realising how retarded you are."
return
usr.update_inv_wear_suit() //so our overlays update
action_button_name = "Button/Unbutton Labcoat"
adjust_flavour = "unbutton"
/obj/item/clothing/suit/storage/labcoat/cmo
name = "chief medical officer's labcoat"
@@ -85,7 +26,7 @@
)
/obj/item/clothing/suit/storage/labcoat/mad
name = "The Mad Scientist's labcoat"
name = "mad scientist's labcoat"
desc = "It makes you look capable of konking someone on the noggin and shooting them into space."
icon_state = "labcoat_green_open"
item_state = "labcoat_green"
@@ -95,7 +36,7 @@
)
/obj/item/clothing/suit/storage/labcoat/genetics
name = "Geneticist Labcoat"
name = "geneticist labcoat"
desc = "A suit that protects against minor chemical spills. Has a blue stripe on the shoulder."
icon_state = "labcoat_gen_open"
species_fit = list("Vox")
@@ -104,7 +45,7 @@
)
/obj/item/clothing/suit/storage/labcoat/chemist
name = "Chemist Labcoat"
name = "chemist labcoat"
desc = "A suit that protects against minor chemical spills. Has an orange stripe on the shoulder."
icon_state = "labcoat_chem_open"
species_fit = list("Vox")
@@ -113,7 +54,7 @@
)
/obj/item/clothing/suit/storage/labcoat/virologist
name = "Virologist Labcoat"
name = "virologist labcoat"
desc = "A suit that protects against minor chemical spills. Offers slightly more protection against biohazards than the standard model. Has a green stripe on the shoulder."
icon_state = "labcoat_vir_open"
species_fit = list("Vox")
@@ -122,7 +63,7 @@
)
/obj/item/clothing/suit/storage/labcoat/science
name = "Scientist Labcoat"
name = "scientist labcoat"
desc = "A suit that protects against minor chemical spills. Has a purple stripe on the shoulder."
icon_state = "labcoat_tox_open"
species_fit = list("Vox")
@@ -131,7 +72,7 @@
)
/obj/item/clothing/suit/storage/labcoat/mortician
name = "Coroner Labcoat"
name = "coroner labcoat"
desc = "A suit that protects against minor chemical spills. Has a black stripe on the shoulder."
icon_state = "labcoat_mort_open"
species_fit = list("Vox")
+36 -36
View File
@@ -10,7 +10,7 @@
*/
/obj/item/clothing/suit/bluetag
name = "blue laser tag armour"
desc = "Blue Pride, Station Wide"
desc = "Blue Pride, Station Wide."
icon_state = "bluetag"
item_state = "bluetag"
blood_overlay_type = "armor"
@@ -19,7 +19,7 @@
/obj/item/clothing/suit/redtag
name = "red laser tag armour"
desc = "Pew pew pew"
desc = "Pew pew pew."
icon_state = "redtag"
item_state = "redtag"
blood_overlay_type = "armor"
@@ -62,7 +62,7 @@
/obj/item/clothing/suit/greatcoat
name = "great coat"
desc = "A Nazi great coat"
desc = "A Nazi great coat."
icon_state = "nazi"
item_state = "nazi"
@@ -120,8 +120,8 @@
/obj/item/clothing/suit/hastur
name = "Hastur's Robes"
desc = "Robes not meant to be worn by man"
name = "Hastur's robes"
desc = "Robes not meant to be worn by man."
icon_state = "hastur"
item_state = "hastur"
body_parts_covered = UPPER_TORSO|LOWER_TORSO|LEGS|ARMS
@@ -129,8 +129,8 @@
/obj/item/clothing/suit/imperium_monk
name = "Imperium monk"
desc = "Have YOU killed a xenos today?"
name = "imperium monk"
desc = "Have YOU killed a xeno today?"
icon_state = "imperium_monk"
item_state = "imperium_monk"
body_parts_covered = UPPER_TORSO|LOWER_TORSO|LEGS|ARMS
@@ -138,7 +138,7 @@
allowed = list(/obj/item/weapon/storage/bible, /obj/item/weapon/nullrod, /obj/item/weapon/reagent_containers/food/drinks/bottle/holywater, /obj/item/weapon/storage/fancy/candle_box, /obj/item/candle, /obj/item/weapon/tank/emergency_oxygen)
/obj/item/clothing/suit/chickensuit
name = "Chicken Suit"
name = "chicken suit"
desc = "A suit made long ago by the ancient empire KFC."
icon_state = "chickensuit"
item_state = "chickensuit"
@@ -146,7 +146,7 @@
flags_inv = HIDESHOES|HIDEJUMPSUIT
/obj/item/clothing/suit/corgisuit
name = "Corgi Suit"
name = "corgi suit"
desc = "A suit made long ago by the ancient empire KFC."
icon_state = "corgisuit"
item_state = "chickensuit"
@@ -155,7 +155,7 @@
flags = NODROP
/obj/item/clothing/suit/corgisuit/en
name = "E-N Suit"
name = "\improper E-N suit"
icon_state = "ensuit"
/obj/item/clothing/suit/corgisuit/en/New()
@@ -174,7 +174,7 @@
step_towards(M,src)
/obj/item/clothing/suit/monkeysuit
name = "Monkey Suit"
name = "monkey suit"
desc = "A suit that looks like a primate"
icon_state = "monkeysuit"
item_state = "monkeysuit"
@@ -183,7 +183,7 @@
/obj/item/clothing/suit/holidaypriest
name = "Holiday Priest"
name = "holiday priest"
desc = "This is a nice holiday my son."
icon_state = "holidaypriest"
item_state = "holidaypriest"
@@ -244,28 +244,6 @@
icon_state = "ianshirt"
item_state = "ianshirt"
//Blue suit jacket toggle
/obj/item/clothing/suit/suit/verb/toggle()
set name = "Toggle Jacket Buttons"
set category = "Object"
set src in usr
if(!usr.canmove || usr.stat || usr.restrained())
return 0
if(src.icon_state == "suitjacket_blue_open")
src.icon_state = "suitjacket_blue"
src.item_state = "suitjacket_blue"
usr << "You button up the suit jacket."
else if(src.icon_state == "suitjacket_blue")
src.icon_state = "suitjacket_blue_open"
src.item_state = "suitjacket_blue_open"
usr << "You unbutton the suit jacket."
else
usr << "You button-up some imaginary buttons on your [src]."
return
usr.update_inv_wear_suit()
//pyjamas
//originally intended to be pinstripes >.>
@@ -406,8 +384,8 @@
item_color = "swim_red"
/obj/item/clothing/suit/storage/mercy_hoodie
name = "Mercy Robe"
desc = " A soft white robe made of a synthetic fiber that provides improved protection against biohazards. Possessing multiple overlapping layers, yet light enough to allow complete freedom of movement, it denotes its wearer as a master physician."
name = "mercy robe"
desc = "A soft white robe made of a synthetic fiber that provides improved protection against biohazards. Possessing multiple overlapping layers, yet light enough to allow complete freedom of movement, it denotes its wearer as a master physician."
icon_state = "mercy_hoodie"
item_state = "mercy_hoodie"
w_class = 4//bulky item
@@ -434,14 +412,36 @@
desc = "Aviators not included."
icon_state = "bomber"
item_state = "bomber"
ignore_suitadjust = 0
allowed = list(/obj/item/device/flashlight,/obj/item/weapon/tank/emergency_oxygen,/obj/item/toy,/obj/item/weapon/storage/fancy/cigarettes,/obj/item/weapon/lighter)
body_parts_covered = UPPER_TORSO|LOWER_TORSO|ARMS
cold_protection = UPPER_TORSO|LOWER_TORSO|ARMS
action_button_name = "Zip/Unzip Jacket"
adjust_flavour = "unzip"
/obj/item/clothing/suit/jacket/pilot
name = "security bomber jacket"
desc = "A stylish and worn-in armoured black bomber jacket emblazoned with the NT Security crest on the left breast. Looks rugged."
icon_state = "bombersec"
item_state = "bombersec"
ignore_suitadjust = 0
//Inherited from Security armour.
allowed = list(/obj/item/weapon/gun/energy,/obj/item/weapon/reagent_containers/spray/pepper,/obj/item/weapon/gun/projectile,/obj/item/ammo_box,/obj/item/ammo_casing,/obj/item/weapon/melee/baton,/obj/item/weapon/restraints/handcuffs,/obj/item/device/flashlight/seclite,/obj/item/weapon/melee/classic_baton/telescopic,/obj/item/weapon/kitchen/knife/combat)
heat_protection = UPPER_TORSO|LOWER_TORSO
min_cold_protection_temperature = ARMOR_MIN_TEMP_PROTECT
max_heat_protection_temperature = ARMOR_MAX_TEMP_PROTECT
strip_delay = 60
put_on_delay = 40
flags = ONESIZEFITSALL
armor = list(melee = 50, bullet = 15, laser = 50, energy = 10, bomb = 25, bio = 0, rad = 0)
//End of inheritance from Security armour.
/obj/item/clothing/suit/jacket/leather
name = "leather jacket"
desc = "Pompadour not included."
icon_state = "leatherjacket"
ignore_suitadjust = 1
adjust_flavour = null
/obj/item/clothing/suit/officercoat
name = "Clown Officer's Coat"
+4 -4
View File
@@ -68,15 +68,15 @@
item_color = "vice"
/obj/item/clothing/under/rank/centcom_officer
desc = "It's a jumpsuit worn by CentCom Officers."
name = "\improper CentCom officer's jumpsuit"
desc = "It's a jumpsuit worn by CentComm Officers."
name = "\improper CentComm officer's jumpsuit"
icon_state = "officer"
item_state = "g_suit"
item_color = "officer"
/obj/item/clothing/under/rank/centcom_commander
desc = "It's a jumpsuit worn by CentCom's highest-tier Commanders."
name = "\improper CentCom officer's jumpsuit"
desc = "It's a jumpsuit worn by CentComm's highest-tier Commanders."
name = "\improper CentComm officer's jumpsuit"
icon_state = "centcom"
item_state = "dg_suit"
item_color = "centcom"
+10 -12
View File
@@ -58,7 +58,8 @@ if(vlc.attachEvent) {
var/client/C = args["client"]
C.media = new /datum/media_manager(args["mob"])
C.media.open()
C.media.update_music()
spawn(20)
C.media.update_music()
// Update when moving between areas.
proc/OnMobAreaChange(var/list/args)
@@ -90,7 +91,6 @@ if(vlc.attachEvent) {
/datum/media_manager
var/url = ""
var/start_time = 0
var/volume = 25
var/client/owner
var/mob/mob
@@ -109,10 +109,10 @@ if(vlc.attachEvent) {
// Tell the player to play something via JS.
proc/send_update()
if(!(owner.prefs.toggles & SOUND_STREAMING) && url != "")
if(!(owner.prefs.sound & SOUND_STREAMING) && url != "")
return // Nope.
MP_DEBUG("\green Sending update to WMP ([url])...")
owner << output(list2params(list(url, (world.time - start_time) / 10, volume)), "[window]:SetMusic")
owner << output(list2params(list(url, (world.time - start_time) / 10, get_volume())), "[window]:SetMusic")
proc/stop_music()
url=""
@@ -123,7 +123,6 @@ if(vlc.attachEvent) {
proc/update_music()
var/targetURL = ""
var/targetStartTime = 0
//var/targetVolume = volume
if (!owner)
//testing("owner is null")
@@ -145,23 +144,22 @@ if(vlc.attachEvent) {
if (url != targetURL || abs(targetStartTime - start_time) > 1)
url = targetURL
start_time = targetStartTime
//volume = targetVolume
send_update()
proc/update_volume(var/value)
volume = value
send_update()
proc/get_volume()
return (owner && owner.prefs) ? owner.prefs.volume : 25
/client/verb/change_volume()
set name = "Set Volume"
set category = "Preferences"
set desc = "Set jukebox volume"
if(!media || !istype(media))
usr << "You have no media datum to change, if you're not in the lobby tell an admin."
return
var/value = input("Choose your Jukebox volume.", "Jukebox volume", media.volume)
var/value = input("Choose your Jukebox volume.", "Jukebox volume", media.get_volume())
value = round(max(0, min(100, value)))
media.update_volume(value)
if(prefs)
prefs.volume = value
prefs.save_preferences(src)
media.send_update()
+1 -1
View File
@@ -721,7 +721,7 @@
speak_emote = list("states")
wanted_objects = list(/obj/item/weapon/ore/diamond, /obj/item/weapon/ore/gold, /obj/item/weapon/ore/silver,
/obj/item/weapon/ore/plasma, /obj/item/weapon/ore/uranium, /obj/item/weapon/ore/iron,
/obj/item/weapon/ore/bananium)
/obj/item/weapon/ore/bananium, /obj/item/weapon/ore/glass)
/mob/living/simple_animal/hostile/mining_drone/attackby(obj/item/I as obj, mob/user as mob, params)
if(istype(I, /obj/item/weapon/weldingtool))
+5 -5
View File
@@ -28,10 +28,10 @@
ambientsounds = list('sound/ambience/ambimine.ogg')
/area/mine/lobby
name = "Mining station"
name = "Mining Station"
/area/mine/storage
name = "Mining station Storage"
name = "Mining Station Storage"
/area/mine/production
name = "Mining Station Starboard Wing"
@@ -52,13 +52,13 @@
name = "Mining Station Communications"
/area/mine/cafeteria
name = "Mining station Cafeteria"
name = "Mining Station Cafeteria"
/area/mine/hydroponics
name = "Mining station Hydroponics"
name = "Mining Station Hydroponics"
/area/mine/sleeper
name = "Mining station Emergency Sleeper"
name = "Mining Station Emergency Sleeper"
/area/mine/north_outpost
name = "North Mining Outpost"
+7 -2
View File
@@ -468,7 +468,6 @@ var/global/list/rockTurfEdgeCache
return
user << "<span class='notice'>You start digging...</span>"
playsound(src, 'sound/effects/shovel_dig.ogg', 50, 1) //FUCK YO RUSTLE I GOT'S THE DIGS SOUND HERE
sleep(20)
if ((user.loc == T && user.get_active_hand() == W))
@@ -487,7 +486,6 @@ var/global/list/rockTurfEdgeCache
return
user << "<span class='notice'>You start digging...</span>"
playsound(src, 'sound/effects/shovel_dig.ogg', 50, 1) //FUCK YO RUSTLE I GOT'S THE DIGS SOUND HERE
sleep(P.digspeed)
if ((user.loc == T && user.get_active_hand() == W))
@@ -502,6 +500,12 @@ var/global/list/rockTurfEdgeCache
O.attackby(W,user)
return
/turf/simulated/floor/plating/airless/asteroid/gets_drilled()
if(!dug)
gets_dug()
else
..()
/turf/simulated/floor/plating/airless/asteroid/proc/gets_dug()
if(dug)
return
@@ -511,6 +515,7 @@ var/global/list/rockTurfEdgeCache
new/obj/item/weapon/ore/glass(src)
new/obj/item/weapon/ore/glass(src)
dug = 1
playsound(src, 'sound/effects/shovel_dig.ogg', 50, 1) //FUCK YO RUSTLE I GOT'S THE DIGS SOUND HERE
icon_plating = "asteroid_dug"
icon_state = "asteroid_dug"
return
@@ -9,7 +9,6 @@
var/next_attack = 0
var/pounce_cooldown = 0
var/pounce_cooldown_time = 30
update_icon = 1
var/leap_on_click = 0
var/custom_pixel_x_offset = 0 //for admin fuckery.
var/custom_pixel_y_offset = 0
@@ -928,27 +928,29 @@ var/global/list/damage_icon_parts = list()
back.screen_loc = ui_back //TODO
//determine the icon to use
var/icon/overlay_icon
var/icon/standing
if(back.icon_override)
overlay_icon = back.icon_override
standing = image("icon" = back.icon_override, "icon_state" = "[back.icon_state]")
else if(istype(back, /obj/item/weapon/rig))
//If this is a rig and a mob_icon is set, it will take species into account in the rig update_icon() proc.
var/obj/item/weapon/rig/rig = back
overlay_icon = rig.mob_icon
standing = rig.mob_icon
else if(back.sprite_sheets && back.sprite_sheets[species.name])
overlay_icon = back.sprite_sheets[species.name]
standing = image("icon" = back.sprite_sheets[species.name], "icon_state" = "[back.icon_state]")
else
overlay_icon = icon('icons/mob/back.dmi', "[back.icon_state]")
standing = image("icon" = 'icons/mob/back.dmi', "icon_state" = "[back.icon_state]")
/*
//determine state to use
var/overlay_state
if(back.item_state)
overlay_state = back.item_state
else
overlay_state = back.icon_state
*/
//create the image
overlays_standing[BACK_LAYER] = image(icon = overlay_icon, icon_state = overlay_state)
overlays_standing[BACK_LAYER] = standing
else
overlays_standing[BACK_LAYER] = null
@@ -12,7 +12,6 @@
health = 150
gender = NEUTER
update_icon = 0
nutrition = 700
see_in_dark = 8
@@ -17,7 +17,7 @@
assign_id(H)
/datum/superheroes/proc/equip(var/mob/living/carbon/human/H)
H.fully_replace_character_name(H.real_name, name)
H.rename_character(H.real_name, name)
for(var/obj/item/W in H)
if(istype(W,/obj/item/organ)) continue
H.unEquip(W)
@@ -218,7 +218,7 @@
for(var/obj/item/W in target)
if(istype(W,/obj/item/organ)) continue
target.unEquip(W)
target.fully_replace_character_name(target.real_name, "Generic Henchman ([rand(1, 1000)])")
target.rename_character(target.real_name, "Generic Henchman ([rand(1, 1000)])")
target.equip_to_slot_or_del(new /obj/item/clothing/under/color/grey/greytide(target), slot_w_uniform)
target.equip_to_slot_or_del(new /obj/item/clothing/shoes/black/greytide(target), slot_shoes)
target.equip_to_slot_or_del(new /obj/item/weapon/storage/toolbox/mechanical/greytide(target), slot_l_hand)
+21 -11
View File
@@ -114,7 +114,7 @@ var/list/ai_verbs_default = list(
pickedName = null
aiPDA = new/obj/item/device/pda/ai(src)
SetName(pickedName)
rename_character(null, pickedName)
anchored = 1
canmove = 0
density = 1
@@ -204,19 +204,21 @@ var/list/ai_verbs_default = list(
job = "AI"
/mob/living/silicon/ai/SetName(pickedName as text)
..()
/mob/living/silicon/ai/rename_character(oldname, newname)
if(!..(oldname, newname))
return 0
announcement.announcer = name
if(oldname != real_name)
announcement.announcer = name
if(eyeobj)
eyeobj.name = "[pickedName] (AI Eye)"
if(eyeobj)
eyeobj.name = "[newname] (AI Eye)"
// Set ai pda name
if(aiPDA)
aiPDA.ownjob = "AI"
aiPDA.owner = pickedName
aiPDA.name = pickedName + " (" + aiPDA.ownjob + ")"
// Set ai pda name
if(aiPDA)
aiPDA.set_name_and_job(newname, "AI")
return 1
/mob/living/silicon/ai/Destroy()
ai_list -= src
@@ -998,3 +1000,11 @@ var/list/ai_verbs_default = list(
var/obj/item/weapon/rig/rig = src.get_rig()
if(rig)
rig.force_rest(src)
/mob/living/silicon/ai/switch_to_camera(var/obj/machinery/camera/C)
if(!C.can_use() || !is_in_chassis())
return 0
eyeobj.setLoc(get_turf(C))
client.eye = eyeobj
return 1
@@ -139,9 +139,9 @@
if(!src.eyeobj)
src << "ERROR: Eyeobj not found. Creating new eye..."
src.eyeobj = new(src.loc)
src.eyeobj = new(loc)
src.eyeobj.ai = src
src.SetName(src.name)
src.rename_character(null, real_name)
if(client && client.eye)
client.eye = src
@@ -82,18 +82,14 @@
playsound(src.loc, 'sound/machines/twobeep.ogg', 50, 0)
//Redefining some robot procs...
/mob/living/silicon/robot/drone/SetName(pickedName as text)
// Would prefer to call the grandparent proc but this isn't possible, so..
real_name = pickedName
name = real_name
/mob/living/silicon/robot/drone/rename_character(oldname, newname)
// force it to not actually change most things
return ..(newname, newname)
//Redefining some robot procs...
/mob/living/silicon/robot/drone/updatename()
real_name = "maintenance drone ([rand(100,999)])"
name = real_name
/mob/living/silicon/robot/drone/get_default_name()
return "maintenance drone ([rand(100,999)])"
/mob/living/silicon/robot/drone/update_icons()
overlays.Cut()
if(stat == 0)
overlays += "eyes-[icon_state]"
+106 -109
View File
@@ -101,7 +101,7 @@ var/list/robot_verbs_default = list(
robot_modules_background.icon_state = "block"
robot_modules_background.layer = 19 //Objects that appear on screen are on layer 20, UI should be just below it.
ident = rand(1, 999)
updatename("Default")
rename_character(null, get_default_name())
update_icons()
update_headlamp()
@@ -159,9 +159,61 @@ var/list/robot_verbs_default = list(
playsound(loc, 'sound/voice/liveagain.ogg', 75, 1)
/mob/living/silicon/robot/SetName(pickedName as text)
custom_name = pickedName
updatename()
/mob/living/silicon/robot/rename_character(oldname, newname)
if(!..(oldname, newname))
return 0
if(oldname != real_name)
notify_ai(3, oldname, newname)
custom_name = (newname != get_default_name()) ? newname : null
setup_PDA()
//We also need to update name of internal camera.
if (camera)
camera.c_tag = newname
//Check for custom sprite
if(!custom_sprite)
var/file = file2text("config/custom_sprites.txt")
var/lines = text2list(file, "\n")
for(var/line in lines)
// split & clean up
var/list/Entry = text2list(line, ";")
for(var/i = 1 to Entry.len)
Entry[i] = trim(Entry[i])
if(Entry.len < 2)
continue;
if(Entry[1] == src.ckey && Entry[2] == src.real_name) //They're in the list? Custom sprite time, var and icon change required
custom_sprite = 1
icon = 'icons/mob/custom-synthetic.dmi'
return 1
/mob/living/silicon/robot/proc/get_default_name(var/prefix as text)
if(prefix)
modtype = prefix
if(mmi)
if(istype(mmi, /obj/item/device/mmi/posibrain))
braintype = "Android"
else
braintype = "Cyborg"
else
braintype = "Robot"
if(custom_name)
return custom_name
else
return "[modtype] [braintype]-[num2text(ident)]"
/mob/living/silicon/robot/verb/Namepick()
set category = "Robot Commands"
if(custom_name)
return 0
rename_self(braintype, 1)
/mob/living/silicon/robot/proc/sync()
if(lawupdate && connected_ai)
@@ -172,7 +224,7 @@ var/list/robot_verbs_default = list(
/mob/living/silicon/robot/proc/setup_PDA()
if (!rbPDA)
rbPDA = new/obj/item/device/pda/ai(src)
rbPDA.set_name_and_job(custom_name,braintype)
rbPDA.set_name_and_job(real_name, braintype)
if(scrambledcodes)
var/datum/data/pda/app/messenger/M = rbPDA.find_program(/datum/data/pda/app/messenger)
if(M)
@@ -300,13 +352,12 @@ var/list/robot_verbs_default = list(
icon_state = "droidcombat"
if("Peacekeeper")
module= new /obj/item/weapon/robot_module/peacekeeper(src)
module = new /obj/item/weapon/robot_module/peacekeeper(src)
icon_state = "droidpeace"
module.channels = list()
icon_state = "droidpeace"
if("Hunter")
updatename(module)
module = new /obj/item/weapon/robot_module/alien/hunter(src)
hands.icon_state = "standard"
icon = "icons/mob/alien.dmi"
@@ -326,7 +377,7 @@ var/list/robot_verbs_default = list(
hands.icon_state = lowertext(modtype)
feedback_inc("cyborg_[lowertext(modtype)]",1)
updatename()
rename_character(real_name, get_default_name())
if(modtype == "Medical" || modtype == "Security" || modtype == "Combat" || modtype == "Peacekeeper")
status_flags &= ~CANPUSH
@@ -335,64 +386,6 @@ var/list/robot_verbs_default = list(
radio.config(module.channels)
notify_ai(2)
/mob/living/silicon/robot/proc/updatename(var/prefix as text)
if(prefix)
modtype = prefix
if(mmi)
if(istype(mmi, /obj/item/device/mmi/posibrain))
braintype = "Android"
else
braintype = "Cyborg"
else
braintype = "Robot"
var/changed_name = ""
if(custom_name)
changed_name = custom_name
else
changed_name = "[modtype] [braintype]-[num2text(ident)]"
real_name = changed_name
name = real_name
// if we've changed our name, we also need to update the display name for our PDA
setup_PDA()
//We also need to update name of internal camera.
if (camera)
camera.c_tag = changed_name
if(!custom_sprite) //Check for custom sprite
var/file = file2text("config/custom_sprites.txt")
var/lines = text2list(file, "\n")
for(var/line in lines)
// split & clean up
var/list/Entry = text2list(line, ";")
for(var/i = 1 to Entry.len)
Entry[i] = trim(Entry[i])
if(Entry.len < 2)
continue;
if(Entry[1] == src.ckey && Entry[2] == src.real_name) //They're in the list? Custom sprite time, var and icon change required
custom_sprite = 1
icon = 'icons/mob/custom-synthetic.dmi'
/mob/living/silicon/robot/verb/Namepick()
set category = "Robot Commands"
if(custom_name)
return 0
spawn(0)
var/newname
newname = sanitize(copytext(input(src,"You are a robot. Enter a name, or leave blank for the default name.", "Name change","") as text,1,MAX_NAME_LEN))
if (newname != "")
notify_ai(3, name, newname)
custom_name = newname
updatename()
update_icons()
//for borg hotkeys, here module refers to borg inv slot, not core module
/mob/living/silicon/robot/verb/cmd_toggle_module(module as num)
set name = "Toggle Module"
@@ -1303,7 +1296,37 @@ var/list/robot_verbs_default = list(
else
src << "Your icon has been set. You now require a module reset to change it."
/mob/living/silicon/robot/proc/notify_ai(var/notifytype, var/oldname, var/newname)
if(!connected_ai)
return
switch(notifytype)
if(1) //New Cyborg
connected_ai << "<br><br><span class='notice'>NOTICE - New cyborg connection detected: <a href='byond://?src=\ref[connected_ai];track2=\ref[connected_ai];track=\ref[src]'>[name]</a></span><br>"
if(2) //New Module
connected_ai << "<br><br><span class='notice'>NOTICE - Cyborg module change detected: [name] has loaded the [designation] module.</span><br>"
if(3) //New Name
connected_ai << "<br><br><span class='notice'>NOTICE - Cyborg reclassification detected: [oldname] is now designated as [newname].</span><br>"
/mob/living/silicon/robot/proc/disconnect_from_ai()
if(connected_ai)
sync() // One last sync attempt
connected_ai.connected_robots -= src
connected_ai = null
/mob/living/silicon/robot/proc/connect_to_ai(var/mob/living/silicon/ai/AI)
if(AI && AI != connected_ai)
disconnect_from_ai()
connected_ai = AI
connected_ai.connected_robots |= src
notify_ai(1)
sync()
/mob/living/silicon/robot/adjustOxyLoss(var/amount)
if (suiciding)
..()
/mob/living/silicon/robot/deathsquad
base_icon = "nano_bloodhound"
icon_state = "nano_bloodhound"
lawupdate = 0
scrambledcodes = 1
@@ -1350,10 +1373,10 @@ var/list/robot_verbs_default = list(
return
/mob/living/silicon/robot/syndicate
base_icon = "syndie_bloodhound"
icon_state = "syndie_bloodhound"
lawupdate = 0
scrambledcodes = 1
modtype = "Synd"
faction = list("syndicate")
designation = "Syndicate Assault"
modtype = "Syndicate"
@@ -1384,7 +1407,9 @@ var/list/robot_verbs_default = list(
playsound(loc, 'sound/mecha/nominalsyndi.ogg', 75, 0)
/mob/living/silicon/robot/syndicate/medical
base_icon = "syndi-medi"
icon_state = "syndi-medi"
modtype = "Syndicate Medical"
designation = "Syndicate Medical"
playstyle_string = "<span class='userdanger'>You are a Syndicate medical cyborg!</span><br>\
<b>You are armed with powerful medical tools to aid you in your mission: help the operatives secure the nuclear authentication disk. \
@@ -1397,68 +1422,40 @@ var/list/robot_verbs_default = list(
..()
module = new /obj/item/weapon/robot_module/syndicate_medical(src)
/mob/living/silicon/robot/proc/notify_ai(var/notifytype, var/oldname, var/newname)
if(!connected_ai)
return
switch(notifytype)
if(1) //New Cyborg
connected_ai << "<br><br><span class='notice'>NOTICE - New cyborg connection detected: <a href='byond://?src=\ref[connected_ai];track2=\ref[connected_ai];track=\ref[src]'>[name]</a></span><br>"
if(2) //New Module
connected_ai << "<br><br><span class='notice'>NOTICE - Cyborg module change detected: [name] has loaded the [designation] module.</span><br>"
if(3) //New Name
connected_ai << "<br><br><span class='notice'>NOTICE - Cyborg reclassification detected: [oldname] is now designated as [newname].</span><br>"
/mob/living/silicon/robot/proc/disconnect_from_ai()
if(connected_ai)
sync() // One last sync attempt
connected_ai.connected_robots -= src
connected_ai = null
/mob/living/silicon/robot/proc/connect_to_ai(var/mob/living/silicon/ai/AI)
if(AI && AI != connected_ai)
disconnect_from_ai()
connected_ai = AI
connected_ai.connected_robots |= src
notify_ai(1)
sync()
/mob/living/silicon/robot/combat/New()
..()
module = new /obj/item/weapon/robot_module/combat(src)
module.channels = list("Security" = 1)
/mob/living/silicon/robot/combat
base_icon = "droidcombat"
icon_state = "droidcombat"
modtype = "Combat"
designation = "Combat"
/mob/living/silicon/robot/combat/init()
..()
module = new /obj/item/weapon/robot_module/combat(src)
module.channels = list("Security" = 1)
//languages
module.add_languages(src)
//subsystems
module.add_subsystems(src)
updatename()
status_flags &= ~CANPUSH
radio.config(module.channels)
notify_ai(2)
/mob/living/silicon/robot/peacekeeper/New()
..()
module = new /obj/item/weapon/robot_module/peacekeeper(src)
/mob/living/silicon/robot/peacekeeper
base_icon = "droidpeace"
icon_state = "droidpeace"
modtype = "Peacekeeper"
designation = "Peacekeeper"
/mob/living/silicon/robot/peacekeeper/init()
..()
module = new /obj/item/weapon/robot_module/peacekeeper(src)
//languages
module.add_languages(src)
//subsystems
module.add_subsystems(src)
updatename()
status_flags &= ~CANPUSH
notify_ai(2)
/mob/living/silicon/robot/adjustOxyLoss(var/amount)
if (suiciding)
..()
notify_ai(2)
+7 -2
View File
@@ -50,9 +50,14 @@
AH.unregister(src)
return ..()
/mob/living/silicon/proc/SetName(pickedName as text)
real_name = pickedName
/mob/living/silicon/rename_character(oldname, newname)
// we actually don't want it changing minds and stuff
if(!newname)
return 0
real_name = newname
name = real_name
return 1
/mob/living/silicon/proc/show_laws()
return
@@ -414,25 +414,26 @@
else if(meat_type && (stat == DEAD)) //if the animal has a meat, and if it is dead.
if(istype(O, /obj/item/weapon/kitchen/knife))
harvest()
else if(istype(O) && istype(user) && !O.attack(src, user))
else
user.changeNext_move(CLICK_CD_MELEE)
user.do_attack_animation(src)
var/damage = 0
if(O.force)
if(O.force >= force_threshold)
damage = O.force
if (O.damtype == STAMINA)
damage = 0
visible_message("<span class='danger'>[user] has [O.attack_verb.len ? "[pick(O.attack_verb)]": "attacked"] [src] with [O]!</span>",\
"<span class='userdanger'>[user] has [O.attack_verb.len ? "[pick(O.attack_verb)]": "attacked"] you with [O]!</span>")
if(istype(O) && istype(user) && !O.attack(src, user))
var/damage = 0
if(O.force)
if(O.force >= force_threshold)
damage = O.force
if (O.damtype == STAMINA)
damage = 0
visible_message("<span class='danger'>[user] has [O.attack_verb.len ? "[pick(O.attack_verb)]": "attacked"] [src] with [O]!</span>",\
"<span class='userdanger'>[user] has [O.attack_verb.len ? "[pick(O.attack_verb)]": "attacked"] you with [O]!</span>")
else
visible_message("<span class='danger'>[O] bounces harmlessly off of [src].</span>",\
"<span class='userdanger'>[O] bounces harmlessly off of [src].</span>")
playsound(loc, O.hitsound, 50, 1, -1)
else
visible_message("<span class='danger'>[O] bounces harmlessly off of [src].</span>",\
"<span class='userdanger'>[O] bounces harmlessly off of [src].</span>")
playsound(loc, O.hitsound, 50, 1, -1)
else
user.visible_message("<span class='warning'>[user] gently taps [src] with [O].</span>",\
"<span class='warning'>This weapon is ineffective, it does no damage.</span>")
adjustBruteLoss(damage)
user.visible_message("<span class='warning'>[user] gently taps [src] with [O].</span>",\
"<span class='warning'>This weapon is ineffective, it does no damage.</span>")
adjustBruteLoss(damage)
/mob/living/simple_animal/movement_delay()
-2
View File
@@ -199,8 +199,6 @@
mouse_drag_pointer = MOUSE_ACTIVE_POINTER
var/update_icon = 1 //Set to 1 to trigger update_icons() at the next life() call
var/status_flags = CANSTUN|CANWEAKEN|CANPARALYSE|CANPUSH //bitflags defining which status effects can be inflicted (replaces canweaken, canstun, etc)
var/area/lastarea = null
+75 -4
View File
@@ -557,10 +557,81 @@ var/list/intents = list(I_HELP,I_DISARM,I_GRAB,I_HARM)
check_eye(src)
return 1
/mob/living/silicon/ai/switch_to_camera(var/obj/machinery/camera/C)
if(!C.can_use() || !is_in_chassis())
/mob/proc/rename_character(oldname, newname)
if(!newname)
return 0
real_name = newname
name = newname
if(mind)
mind.name = newname
if(dna)
dna.real_name = real_name
eyeobj.setLoc(get_turf(C))
client.eye = eyeobj
if(oldname)
//update the datacore records! This is goig to be a bit costly.
for(var/list/L in list(data_core.general,data_core.medical,data_core.security,data_core.locked))
for(var/datum/data/record/R in L)
if(R.fields["name"] == oldname)
R.fields["name"] = newname
break
//update our pda and id if we have them on our person
var/list/searching = GetAllContents(searchDepth = 3)
var/search_id = 1
var/search_pda = 1
for(var/A in searching)
if( search_id && istype(A,/obj/item/weapon/card/id) )
var/obj/item/weapon/card/id/ID = A
if(ID.registered_name == oldname)
ID.registered_name = newname
ID.name = "[newname]'s ID Card ([ID.assignment])"
if(!search_pda) break
search_id = 0
else if( search_pda && istype(A,/obj/item/device/pda) )
var/obj/item/device/pda/PDA = A
if(PDA.owner == oldname)
PDA.owner = newname
PDA.name = "PDA-[newname] ([PDA.ownjob])"
if(!search_id) break
search_pda = 0
//Fixes renames not being reflected in objective text
var/list/O = subtypesof(/datum/objective)
var/length
var/pos
for(var/datum/objective/objective in O)
if(objective.target != mind) continue
length = lentext(oldname)
pos = findtextEx(objective.explanation_text, oldname)
objective.explanation_text = copytext(objective.explanation_text, 1, pos)+newname+copytext(objective.explanation_text, pos+length)
return 1
/mob/proc/rename_self(var/role, var/allow_numbers=0)
spawn(0)
var/oldname = real_name
var/time_passed = world.time
var/newname
for(var/i=1,i<=3,i++) //we get 3 attempts to pick a suitable name.
newname = input(src,"You are a [role]. Would you like to change your name to something else?", "Name change",oldname) as text
if((world.time-time_passed)>300)
return //took too long
newname = reject_bad_name(newname,allow_numbers) //returns null if the name doesn't meet some basic requirements. Tidies up a few other things like bad-characters.
for(var/mob/living/M in player_list)
if(M == src)
continue
if(!newname || M.real_name == newname)
newname = null
break
if(newname)
break //That's a suitable name!
src << "Sorry, that [role]-name wasn't appropriate, please try another. It's possibly too long/short, has bad characters or is already taken."
if(!newname) //we'll stick with the oldname then
return
rename_character(oldname, newname)
+1 -1
View File
@@ -64,7 +64,7 @@
O.add_ai_verbs()
O.rename_self("ai",1)
O.rename_self("AI",1)
spawn
qdel(src)
return O
+315
View File
@@ -0,0 +1,315 @@
/obj/item/weapon/picture_frame
name = "picture frame"
desc = "Its patented design allows it to be folded larger or smaller to accommodate standard paper, photo, and poster, and canvas sizes."
icon = 'icons/obj/bureaucracy.dmi'
var/icon_base
var/obj/displayed
var/list/wide_posters = list(
"poster22_legit", "poster23", "poster23_legit", "poster24", "poster24_legit",
"poster25", "poster27_legit", "poster28", "poster29")
/obj/item/weapon/picture_frame/New(loc, obj/item/weapon/D)
..()
if(D)
insert(D)
update_icon()
/obj/item/weapon/picture_frame/Destroy()
if(displayed)
displayed = null
for(var/A in contents)
qdel(A)
return ..()
/obj/item/weapon/picture_frame/update_icon()
overlays.Cut()
if(displayed)
overlays |= getFlatIcon(displayed)
if(istype(displayed, /obj/item/weapon/photo))
icon_state = "[icon_base]-photo"
else if(istype(displayed, /obj/structure/sign/poster))
icon_state = "[icon_base]-[(displayed.icon_state in wide_posters) ? "wposter" : "poster"]"
else if(istype(displayed, /obj/item/weapon/canvas))
icon_state = "[icon_base]-canvas-[displayed.icon_state]"
else
icon_state = "[icon_base]-paper"
overlays |= icon_state
/obj/item/weapon/picture_frame/proc/insert(obj/D)
if(istype(D, /obj/item/weapon/contraband/poster))
var/obj/item/weapon/contraband/poster/P = D
displayed = P.resulting_poster
P.resulting_poster = null
else
displayed = D
name = displayed.name
displayed.pixel_x = 0
displayed.pixel_y = 0
displayed.forceMove(src)
if(istype(D, /obj/item/weapon/contraband/poster))
qdel(D)
/obj/item/weapon/picture_frame/attackby(obj/item/I, mob/user)
if(istype(I, /obj/item/weapon/screwdriver))
if(displayed)
playsound(src, 'sound/items/Screwdriver.ogg', 100, 1)
user.visible_message("<span class=warning>[user] unfastens \the [displayed] out of \the [src].</span>", "<span class=warning>You unfasten \the [displayed] out of \the [src].</span>")
if(istype(displayed, /obj/structure/sign/poster))
var/obj/structure/sign/poster/P = displayed
P.roll_and_drop(user.loc)
else
displayed.forceMove(user.loc)
displayed = null
name = initial(name)
update_icon()
else
user << "<span class=notice>There is nothing to remove from \the [src].</span>"
else if(istype(I, /obj/item/weapon/crowbar))
playsound(src, 'sound/items/Crowbar.ogg', 100, 1)
user.visible_message("<span class=warning>[user] breaks down \the [src].</span>", "<span class=warning>You break down \the [src].</span>")
for(var/A in contents)
if(istype(A, /obj/structure/sign/poster))
var/obj/structure/sign/poster/P = A
P.roll_and_drop(user.loc)
else
var/obj/O = A
O.forceMove(user.loc)
displayed = null
qdel(src)
else if(istype(I, /obj/item/weapon/paper) || istype(I, /obj/item/weapon/photo) || istype(I, /obj/item/weapon/contraband/poster) || istype(I, /obj/item/weapon/canvas))
if(!displayed)
user.unEquip(I)
insert(I)
update_icon()
else
user << "<span class=notice>\The [src] already contains \a [displayed].</span>"
else
return ..()
/obj/item/weapon/picture_frame/afterattack(atom/target, mob/user, proximity_flag)
if(proximity_flag && istype(target, /turf/simulated/wall))
place(target, user)
else
..()
/obj/item/weapon/picture_frame/proc/place(turf/T, mob/user)
var/stuff_on_wall = 0
for(var/obj/O in user.loc.contents) //Let's see if it already has a poster on it or too much stuff
if(istype(O, /obj/structure/sign))
user << "<span class='notice'>\The [T] is far too cluttered to place \a [src]!</span>"
return
stuff_on_wall++
if(stuff_on_wall >= 4)
user << "<span class='notice'>\The [T] is far too cluttered to place \a [src]!</span>"
return
user << "<span class='notice'>You start place \the [src] on \the [T].</span>"
var/px = 0
var/py = 0
var/newdir = getRelativeDirection(user, T)
switch(newdir)
if(NORTH)
py = 32
if(EAST)
px = 32
if(SOUTH)
py = -32
if(WEST)
px = -32
else
user << "<span class='notice'>You cannot reach \the [T] from here!</span>"
return
user.unEquip(src)
var/obj/structure/sign/picture_frame/PF = new(user.loc, src)
PF.dir = newdir
PF.pixel_x = px
PF.pixel_y = py
playsound(PF.loc, 'sound/items/Deconstruct.ogg', 100, 1)
/obj/item/weapon/picture_frame/examine(mob/user, var/distance = -1, var/infix = "", var/suffix = "")
..()
if(displayed)
displayed.examine(user, distance, infix, suffix)
/obj/item/weapon/picture_frame/attack_self(mob/user)
if(displayed)
if(istype(displayed, /obj/item))
var/obj/item/I = displayed
I.attack_self(user)
else
..()
/obj/item/weapon/picture_frame/glass
icon_base = "glass"
icon_state = "glass-poster"
materials = list(MAT_METAL = 25, MAT_GLASS = 75)
/obj/item/weapon/picture_frame/wooden
icon_base = "wood"
icon_state = "wood-poster"
/obj/item/weapon/picture_frame/wooden/New()
..()
new /obj/item/stack/sheet/wood(src, 1)
/obj/structure/sign/picture_frame
icon = 'icons/obj/bureaucracy.dmi'
icon_state = "glass-poster"
var/obj/item/weapon/picture_frame/frame
var/obj/item/weapon/explosive
var/tilted = 0
var/tilt_transform = null
/obj/structure/sign/picture_frame/New(loc, F)
..()
frame = F
frame.pixel_x = 0
frame.pixel_y = 0
frame.forceMove(src)
name = frame.name
update_icon()
if(!tilt_transform)
tilt_transform = turn(matrix(), -10)
if(tilted)
transform = tilt_transform
verbs |= /obj/structure/sign/picture_frame/proc/untilt
else
verbs |= /obj/structure/sign/picture_frame/proc/tilt
/obj/structure/sign/picture_frame/Destroy()
if(frame)
qdel(frame)
frame = null
return ..()
/obj/structure/sign/picture_frame/update_icon()
overlays.Cut()
if(frame)
icon = null
icon_state = null
overlays |= getFlatIcon(frame)
else
icon = initial(icon)
icon_state = initial(icon_state)
/obj/structure/sign/picture_frame/attackby(obj/item/I, mob/user)
if(istype(I, /obj/item/weapon/screwdriver))
playsound(src, 'sound/items/Screwdriver.ogg', 100, 1)
user.visible_message("<span class=warning>[user] begins to unfasten \the [src] from the wall.</span>", "<span class=warning>You begin to unfasten \the [src] from the wall.</span>")
if(do_after(user, 100, target = src))
playsound(src, 'sound/items/Deconstruct.ogg', 100, 1)
user.visible_message("<span class=warning>[user] unfastens \the [src] from the wall.</span>", "<span class=warning>You unfasten \the [src] from the wall.</span>")
frame.forceMove(user.loc)
frame = null
if(explosive)
explosive.forceMove(user.loc)
explosive = null
qdel(src)
if(istype(I, /obj/item/weapon/grenade) || istype(I, /obj/item/weapon/c4))
if(explosive)
user << "<span class='warning'>There is already a device attached behind \the [src], remove it first.</span>"
return 1
if(!tilted)
user << "<span class='warning'>\The [src] needs to be already tilted before being rigged with \the [I].</span>"
return 1
user.visible_message("<span class=warning>[user] is fiddling around behind \the [src].</span>", "<span class=warning>You begin to secure \the [I] behind \the [src].</span>")
if(do_after(user, 150, target = src))
if(explosive || !tilted)
return
playsound(src, 'sound/weapons/handcuffs.ogg', 50, 1)
user.unEquip(I)
explosive = I
I.forceMove(src)
user.visible_message("<span class='notice'>[user] fiddles with the back of \the [src].</span>", "<span class='notice'>You secure \the [I] behind \the [src].</span>")
message_admins("[key_name_admin(user)] attached [I] to a picture frame.")
log_game("[key_name_admin(user)] attached [I] to a picture frame.")
return 1
else
return ..()
/obj/structure/sign/picture_frame/examine(mob/user, var/distance = -1, var/infix = "", var/suffix = "")
if(frame)
frame.examine(user, distance, infix, suffix)
else
..()
/obj/structure/sign/picture_frame/attack_hand(mob/user)
if(frame)
frame.attack_self(user)
else
..()
/obj/structure/sign/picture_frame/ex_act(severity)
explode()
..(severity)
/obj/structure/sign/picture_frame/proc/explode()
if(istype(explosive, /obj/item/weapon/grenade))
var/obj/item/weapon/grenade/G = explosive
explosive = null
G.prime()
else if(istype(explosive, /obj/item/weapon/c4))
var/obj/item/weapon/c4/C = explosive
explosive = null
C.target = get_step(get_turf(src), dir)
C.explode(get_turf(loc))
/obj/structure/sign/picture_frame/proc/toggle_tilt(mob/user)
if(!isliving(usr) || usr.stat)
return
tilted = !tilted
if(tilted)
animate(src, transform = tilt_transform, time = 10, easing = BOUNCE_EASING)
verbs -= /obj/structure/sign/picture_frame/proc/tilt
verbs |= /obj/structure/sign/picture_frame/proc/untilt
else
animate(src, transform = matrix(), time = 10, easing = CUBIC_EASING | EASE_IN)
verbs -= /obj/structure/sign/picture_frame/proc/untilt
verbs |= /obj/structure/sign/picture_frame/proc/tilt
explode()
/obj/structure/sign/picture_frame/proc/tilt()
set name = "Tilt Picture"
set category = "Object"
set src in oview(1)
toggle_tilt(usr)
/obj/structure/sign/picture_frame/proc/untilt()
set name = "Straighten Picture"
set category = "Object"
set src in oview(1)
toggle_tilt(usr)
/obj/structure/sign/picture_frame/hear_talk(mob/living/M as mob, msg)
..()
for(var/obj/O in contents)
O.hear_talk(M, msg)
/obj/structure/sign/picture_frame/hear_message(mob/living/M as mob, msg)
..()
for(var/obj/O in contents)
O.hear_message(M, msg)
+2 -1
View File
@@ -435,7 +435,8 @@ var/global/list/obj/item/device/pda/PDAs = list()
qdel(A)
programs.Cut()
if(cartridge)
cartridge.forceMove(T)
qdel(cartridge)
cartridge = null
return ..()
// Pass along the pulse to atoms in contents, largely added so pAIs are vulnerable to EMP
@@ -98,6 +98,15 @@ obj/item/weapon/gun/energy/laser/retro
projectile_type = "/obj/item/projectile/beam/xray"
charge_cost = 500
/obj/item/weapon/gun/energy/immolator
name = "Immolator laser gun"
desc = "A modified laser gun, shooting highly concetrated beams with higher intensity that ignites the target, for the cost of draining more power per shot"
icon_state = "immolator"
item_state = "laser"
fire_sound = 'sound/weapons/laser3.ogg'
projectile_type = "/obj/item/projectile/beam/immolator"
origin_tech = "combat=4;materials=4;magnets=3;plasmatech=2"
charge_cost = 1250
////////Laser Tag////////////////////
@@ -38,6 +38,17 @@
weaken = 5
stutter = 5
/obj/item/projectile/beam/immolator
name = "immolation beam"
/obj/item/projectile/beam/immolator/on_hit(var/atom/target, var/blocked = 0)
. = ..()
if(istype(target, /mob/living/carbon))
var/mob/living/carbon/M = target
M.adjust_fire_stacks(1)
M.IgniteMob()
/obj/item/projectile/beam/xray
name = "xray beam"
icon_state = "xray"
@@ -94,8 +94,7 @@
M.bodytemperature = temperature
if(temperature > 500)//emagged
M.adjust_fire_stacks(0.5)
M.on_fire = 1
M.update_icon = 1
M.IgniteMob()
playsound(M.loc, 'sound/effects/bamf.ogg', 50, 0)
return 1
@@ -148,6 +148,7 @@
on_reaction(var/datum/reagents/holder)
var/list/borks = subtypesof(/obj/item/weapon/reagent_containers/food/snacks)
borks = adminReagentCheck(borks)
// BORK BORK BORK
playsound(get_turf(holder.my_atom), 'sound/effects/phasein.ogg', 100, 1)
@@ -175,6 +176,7 @@
on_reaction(var/datum/reagents/holder)
var/list/borks = subtypesof(/obj/item/weapon/reagent_containers/food/drinks)
borks = adminReagentCheck(borks)
// BORK BORK BORK
playsound(get_turf(holder.my_atom), 'sound/effects/phasein.ogg', 100, 1)
@@ -16,7 +16,7 @@
//Processing flags, defines the type of mobs the reagent will affect
//By default, all reagents will ONLY affect organics, not synthetics. Re-define in the reagent's definition if the reagent is meant to affect synths
var/process_flags = ORGANIC
var/admin_only = 0
/datum/reagent/proc/reaction_mob(var/mob/M, var/method=TOUCH, var/volume) //Some reagents transfer on touch, others don't; dependent on if they penetrate the skin or not.
if(!istype(M, /mob/living)) return 0
@@ -5,6 +5,7 @@
reagent_state = LIQUID
color = "#C8A5DC" // rgb: 200, 165, 220
process_flags = ORGANIC | SYNTHETIC //Adminbuse knows no bounds!
admin_only=1
/datum/reagent/adminordrazine/on_mob_life(var/mob/living/carbon/M as mob)
if(!M) M = holder.my_atom ///This can even heal dead people.
@@ -51,4 +52,27 @@
/datum/reagent/adminordrazine/nanites
name = "Nanites"
id = "nanites"
description = "Nanomachines that aid in rapid cellular regeneration."
description = "Nanomachines that aid in rapid cellular regeneration."
// For random item spawning. Takes a list of paths, and returns the same list without anything that contains admin only reagents
/proc/adminReagentCheck(var/list/incoming)
var/list/outgoing[0]
for(var/tocheck in incoming)
if(ispath(tocheck))
var/check = new tocheck
if (istype(check, /atom))
var/atom/reagentCheck = check
var/datum/reagents/reagents = reagentCheck.reagents
var/admin = 0
for(var/reag in reagents.reagent_list)
var/datum/reagent/reagent = reag
if(reagent.admin_only)
admin = 1
break
if(!(admin))
outgoing += tocheck
else
outgoing += tocheck
return outgoing
+8 -1
View File
@@ -69,4 +69,11 @@
for (var/datum/reagent/R in snack.reagents.reagent_list) //no reagents will be left behind
data += "[R.id]([R.volume] units); " //Using IDs because SOME chemicals(I'm looking at you, chlorhydrate-beer) have the same names as other chemicals.
return data
else return "No reagents"
else return "No reagents"
/obj/item/weapon/reagent_containers/wash(mob/user, atom/source)
if(is_open_container())
reagents.add_reagent("water", min(volume - reagents.total_volume, amount_per_transfer_from_this))
user << "<span class='notice'>You fill [src] from [source].</span>"
return
..()
@@ -1674,6 +1674,13 @@
if(volume >= 5)
return Expand()
/obj/item/weapon/reagent_containers/food/snacks/monkeycube/wash(mob/user, atom/source)
if(wrapped)
..()
return
if(do_after(user, 40, target = source))
return 1
/obj/item/weapon/reagent_containers/food/snacks/monkeycube/proc/Expand()
if(isnull(gcDestroyed))
visible_message("<span class='notice'>[src] expands!</span>")
@@ -273,6 +273,14 @@
materials = list(MAT_METAL = 100)
build_path = /obj/item/weapon/canvas/twentythreeXtwentythree
category = list("initial", "Miscellaneous")
/datum/design/glass_picture_frame
name = "Glass Picture Frame"
id = "glass_picture_frame"
build_type = AUTOLATHE
materials = list(MAT_METAL = 25, MAT_GLASS = 75)
build_path = /obj/item/weapon/picture_frame/glass
category = list("initial", "Miscellaneous")
/datum/design/camera_assembly
name = "Camera Assembly"
@@ -270,4 +270,15 @@
materials = list(MAT_GOLD = 5000,MAT_URANIUM = 10000, MAT_METAL = 4000)
build_path = /obj/item/weapon/gun/energy/xray
locked = 1
category = list("Weapons")
/datum/design/immolator
name = "Immolator Laser Gun"
desc = "Has fewer shots than a regular laser gun, but ignites the target on hit"
id = "immolator"
req_tech = list("combat" = 4, "materials" = 5, "powerstorage" = 5, "magnets" = 4)
build_type = PROTOLATHE
materials = list(MAT_METAL = 4000, MAT_GLASS = 1000, MAT_SILVER = 3000, MAT_PLASMA = 2000)
build_path = /obj/item/weapon/gun/energy/immolator
locked = 1
category = list("Weapons")
+1 -1
View File
@@ -111,7 +111,7 @@ var/global/list/obj/machinery/message_server/message_servers = list()
Console.set_light(2)
/obj/machinery/message_server/attack_hand(user as mob)
// user << "\blue There seem to be some parts missing from this server. They should arrive on the station in a few days, give or take a few CentCom delays."
// user << "\blue There seem to be some parts missing from this server. They should arrive on the station in a few days, give or take a few CentComm delays."
user << "You toggle PDA message passing from [active ? "On" : "Off"] to [active ? "Off" : "On"]"
active = !active
update_icon()