mirror of
https://github.com/ParadiseSS13/Paradise.git
synced 2026-07-12 23:53:47 +01:00
Merge branch 'master' of https://github.com/ParadiseSS13/Paradise into OrganRefactor
This commit is contained in:
@@ -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
|
||||
|
||||
|
||||
@@ -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
|
||||
|
||||
|
||||
@@ -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
|
||||
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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()
|
||||
|
||||
@@ -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
|
||||
|
||||
|
||||
@@ -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"
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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")
|
||||
|
||||
@@ -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"
|
||||
|
||||
@@ -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"
|
||||
|
||||
@@ -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()
|
||||
@@ -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))
|
||||
|
||||
@@ -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"
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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]"
|
||||
|
||||
@@ -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)
|
||||
@@ -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()
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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)
|
||||
@@ -64,7 +64,7 @@
|
||||
|
||||
O.add_ai_verbs()
|
||||
|
||||
O.rename_self("ai",1)
|
||||
O.rename_self("AI",1)
|
||||
spawn
|
||||
qdel(src)
|
||||
return O
|
||||
|
||||
@@ -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)
|
||||
@@ -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
|
||||
@@ -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")
|
||||
@@ -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()
|
||||
|
||||
Reference in New Issue
Block a user