Merge branch 'master' of github.com:Baystation12/Baystation12 into TGUpdates
Conflicts: icons/mob/items_lefthand.dmi icons/mob/items_righthand.dmi
@@ -120,7 +120,7 @@ extern "C" DLL_EXPORT const char* recv_message(int n, char *v[])
|
||||
if(sender.sin_addr.s_addr != addr.sin_addr.s_addr) {
|
||||
continue; // not our connection, ignore and try again
|
||||
} else {
|
||||
return_buffer[rc] = '0'; // 0-terminate the string
|
||||
return_buffer[rc] = 0; // 0-terminate the string
|
||||
return return_buffer;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -209,10 +209,10 @@
|
||||
external_pressure_bound = between(0, text2num(signal.data["set_external_pressure"]), ONE_ATMOSPHERE*50)
|
||||
|
||||
if("adjust_internal_pressure" in signal.data)
|
||||
internal_pressure_bound = between(0, text2num(signal.data["adjust_internal_pressure"]), ONE_ATMOSPHERE*50)
|
||||
internal_pressure_bound = between(0, internal_pressure_bound + text2num(signal.data["adjust_internal_pressure"]), ONE_ATMOSPHERE*50)
|
||||
|
||||
if("adjust_external_pressure" in signal.data)
|
||||
external_pressure_bound = between(0, text2num(signal.data["adjust_external_pressure"]), ONE_ATMOSPHERE*50)
|
||||
external_pressure_bound = between(0, external_pressure_bound + text2num(signal.data["adjust_external_pressure"]), ONE_ATMOSPHERE*50)
|
||||
|
||||
if("init" in signal.data)
|
||||
name = signal.data["init"]
|
||||
|
||||
@@ -134,6 +134,7 @@
|
||||
P.name = template.name
|
||||
P.desc = template.desc
|
||||
P.icon = template.icon
|
||||
P.img = template:img
|
||||
|
||||
sleep(30)
|
||||
job_num_copies -= 1
|
||||
|
||||
@@ -4,7 +4,7 @@
|
||||
|
||||
school = "transmutation"
|
||||
charge_max = 600
|
||||
clothes_req = 0
|
||||
clothes_req = 1
|
||||
invocation = "GIN'YU CAPAN"
|
||||
invocation_type = "whisper"
|
||||
range = 1
|
||||
|
||||
@@ -9,5 +9,6 @@
|
||||
canmove = 0
|
||||
blinded = 0
|
||||
anchored = 1 // don't get pushed around
|
||||
universal_speak = 1 //Ghosts are multi-lingual!
|
||||
var/mob/corpse = null // observer mode
|
||||
var/datum/hud/living/carbon/hud = null // hud
|
||||
@@ -368,7 +368,7 @@
|
||||
/obj/item/weapon/storage/syringes
|
||||
name = "syringes"
|
||||
desc = "A box full of syringes."
|
||||
desc = "A biohazard alert warning is printed on the box"
|
||||
desc = "A biohazard alert warning is printed on the box."
|
||||
icon_state = "syringe"
|
||||
foldable = /obj/item/stack/sheet/cardboard //BubbleWrap
|
||||
|
||||
@@ -442,7 +442,7 @@
|
||||
|
||||
/obj/item/weapon/storage/injectbox
|
||||
name = "DNA-Injectors"
|
||||
desc = "This box contains injectors it seems."
|
||||
desc = "This box contains injectors."
|
||||
icon_state = "box"
|
||||
item_state = "syringe_kit"
|
||||
foldable = /obj/item/stack/sheet/cardboard //BubbleWrap
|
||||
|
||||
@@ -558,8 +558,8 @@
|
||||
name = "medical pack"
|
||||
singular_name = "medical pack"
|
||||
icon = 'items.dmi'
|
||||
amount = 10 //To compensate for wounds
|
||||
max_amount = 10
|
||||
amount = 5 //To compensate for wounds
|
||||
max_amount = 5
|
||||
w_class = 1
|
||||
throw_speed = 4
|
||||
throw_range = 20
|
||||
@@ -571,7 +571,7 @@
|
||||
singular_name = "roll of gauze"
|
||||
desc = "A roll of gauze for sealing up wounds."
|
||||
icon_state = "brutepack"
|
||||
heal_brute = 1
|
||||
heal_brute = 7
|
||||
origin_tech = "biotech=1"
|
||||
|
||||
/obj/item/stack/medical/bruise_pack/tajaran
|
||||
@@ -580,7 +580,7 @@
|
||||
desc = "A soft leaf that is rubbed on bruises."
|
||||
icon = 'harvest.dmi'
|
||||
icon_state = "cabbage"
|
||||
heal_brute = 1
|
||||
heal_brute = 7
|
||||
|
||||
/obj/item/stack/medical/ointment
|
||||
name = "ointment"
|
||||
@@ -588,7 +588,7 @@
|
||||
gender = PLURAL
|
||||
singular_name = "ointment"
|
||||
icon_state = "ointment"
|
||||
heal_burn = 1
|
||||
heal_burn = 7
|
||||
origin_tech = "biotech=1"
|
||||
|
||||
/obj/item/stack/medical/ointment/tajaran
|
||||
@@ -597,27 +597,23 @@
|
||||
desc = "A cold leaf that is rubbed on burns."
|
||||
icon = 'harvest.dmi'
|
||||
icon_state = "ambrosiavulgaris"
|
||||
heal_burn = 1
|
||||
heal_burn = 7
|
||||
|
||||
/obj/item/stack/medical/advanced/bruise_pack
|
||||
name = "advanced trauma kit"
|
||||
singular_name = "advanced trauma kit"
|
||||
desc = "An advanced trauma kit for severe injuries."
|
||||
icon_state = "traumakit"
|
||||
heal_brute = 1
|
||||
heal_brute = 12
|
||||
origin_tech = "biotech=1"
|
||||
amount = 10
|
||||
max_amount = 10
|
||||
|
||||
/obj/item/stack/medical/advanced/ointment
|
||||
name = "advanced burn kit"
|
||||
singular_name = "advanced burn kit"
|
||||
desc = "An advanced treatment kit for severe burns."
|
||||
icon_state = "burnkit"
|
||||
heal_burn = 1
|
||||
heal_burn = 12
|
||||
origin_tech = "biotech=1"
|
||||
amount = 10
|
||||
max_amount = 10
|
||||
|
||||
/obj/item/stack/medical/splint
|
||||
name = "medical splint"
|
||||
|
||||
@@ -164,7 +164,7 @@
|
||||
if ("7")
|
||||
//feedback_add_details("wizard_spell_learned","MT") //please do not change the abbreviation to keep data processing consistent. Add a unique id to any new spells
|
||||
usr.spell_list += new /obj/effect/proc_holder/spell/targeted/mind_transfer(usr)
|
||||
src.temp = "This spell allows the user to switch bodies with a target. Careful to not lose your memory in the process."
|
||||
src.temp = "This spell allows the user to switch bodies with a target, and requires full wizard garb. Careful to not lose your memory in the process."
|
||||
if ("8")
|
||||
//feedback_add_details("wizard_spell_learned","FW") //please do not change the abbreviation to keep data processing consistent. Add a unique id to any new spells
|
||||
usr.spell_list += new /obj/effect/proc_holder/spell/aoe_turf/conjure/forcewall(usr)
|
||||
|
||||
@@ -65,7 +65,7 @@
|
||||
flag = BOTANIST
|
||||
department_flag = CIVILIAN
|
||||
faction = "Station"
|
||||
total_positions = 2
|
||||
total_positions = 3
|
||||
spawn_positions = 2
|
||||
supervisors = "the head of personnel"
|
||||
selection_color = "#dddddd"
|
||||
|
||||
@@ -76,7 +76,7 @@
|
||||
flag = ATMOSTECH
|
||||
department_flag = ENGSEC
|
||||
faction = "Station"
|
||||
total_positions = 2
|
||||
total_positions = 3
|
||||
spawn_positions = 2
|
||||
supervisors = "the chief engineer"
|
||||
selection_color = "#fff5cc"
|
||||
@@ -106,7 +106,7 @@
|
||||
flag = ROBOTICIST
|
||||
department_flag = ENGSEC
|
||||
faction = "Station"
|
||||
total_positions = 1
|
||||
total_positions = 2
|
||||
spawn_positions = 1
|
||||
supervisors = "the chief engineer and research director"
|
||||
selection_color = "#fff5cc"
|
||||
|
||||
@@ -76,8 +76,8 @@
|
||||
flag = CHEMIST
|
||||
department_flag = MEDSCI
|
||||
faction = "Station"
|
||||
total_positions = 1
|
||||
spawn_positions = 1
|
||||
total_positions = 2
|
||||
spawn_positions = 2
|
||||
supervisors = "the chief medical officer"
|
||||
selection_color = "#ffeef0"
|
||||
|
||||
@@ -101,8 +101,8 @@
|
||||
flag = GENETICIST
|
||||
department_flag = MEDSCI
|
||||
faction = "Station"
|
||||
total_positions = 1
|
||||
spawn_positions = 1
|
||||
total_positions = 2
|
||||
spawn_positions = 2
|
||||
supervisors = "the chief medical officer and research director"
|
||||
selection_color = "#ffeef0"
|
||||
|
||||
|
||||
@@ -209,6 +209,9 @@
|
||||
/obj/machinery/body_scanconsole/attack_hand(user as mob)
|
||||
if(..())
|
||||
return
|
||||
if(!ishuman(connected.occupant))
|
||||
user << "\red This device can only scan compatible lifeforms."
|
||||
return
|
||||
var/dat
|
||||
if (src.delete && src.temphtml) //Window in buffer but its just simple message, so nothing
|
||||
src.delete = src.delete
|
||||
@@ -216,7 +219,7 @@
|
||||
dat = text("[]<BR><BR><A href='?src=\ref[];clear=1'>Main Menu</A>", src.temphtml, src)
|
||||
else
|
||||
if (src.connected) //Is something connected?
|
||||
var/mob/living/carbon/occupant = src.connected.occupant
|
||||
var/mob/living/carbon/human/occupant = src.connected.occupant
|
||||
dat = "<font color='blue'><B>Occupant Statistics:</B></FONT><BR>" //Blah obvious
|
||||
if (istype(occupant)) //is there REALLY someone in there?
|
||||
var/t1
|
||||
@@ -231,34 +234,68 @@
|
||||
dat += "<font color='red'>This device can only scan human occupants.</FONT>"
|
||||
else
|
||||
dat += text("[]\tHealth %: [] ([])</FONT><BR>", (occupant.health > 50 ? "<font color='blue'>" : "<font color='red'>"), occupant.health, t1)
|
||||
dat += text("<font color='green'>Radiation Level: []%</FONT><BR><BR>", occupant.radiation)
|
||||
dat += "<table border='1'>"
|
||||
|
||||
dat += text("[]\t-Brute Damage %: []</FONT><BR>", (occupant.getBruteLoss() < 60 ? "<font color='blue'>" : "<font color='red'>"), occupant.getBruteLoss())
|
||||
dat += text("[]\t-Respiratory Damage %: []</FONT><BR>", (occupant.getOxyLoss() < 60 ? "<font color='blue'>" : "<font color='red'>"), occupant.getOxyLoss())
|
||||
dat += text("[]\t-Toxin Content %: []</FONT><BR>", (occupant.getToxLoss() < 60 ? "<font color='blue'>" : "<font color='red'>"), occupant.getToxLoss())
|
||||
dat += text("[]\t-Burn Severity %: []</FONT><BR><BR>", (occupant.getFireLoss() < 60 ? "<font color='blue'>" : "<font color='red'>"), occupant.getFireLoss())
|
||||
|
||||
dat += text("[]\tRadiation Level %: []</FONT><BR>", (occupant.radiation < 10 ?"<font color='blue'>" : "<font color='red'>"), occupant.radiation)
|
||||
dat += text("[]\tGenetic Tissue Damage %: []</FONT><BR>", (occupant.getCloneLoss() < 1 ?"<font color='blue'>" : "<font color='red'>"), occupant.getCloneLoss())
|
||||
dat += text("[]\tApprox. Brain Damage %: []</FONT><BR>", (occupant.getBrainLoss() < 1 ?"<font color='blue'>" : "<font color='red'>"), occupant.getBrainLoss())
|
||||
dat += text("Paralysis Summary %: [] ([] seconds left!)<BR>", occupant.paralysis, round(occupant.paralysis / 4))
|
||||
dat += text("Body Temperature: [occupant.bodytemperature-T0C]°C ([occupant.bodytemperature*1.8-459.67]°F)<BR><HR>")
|
||||
|
||||
if(occupant.vessel)
|
||||
var/blood_volume = round(occupant.vessel.get_reagent_amount("blood"))
|
||||
var/blood_percent = blood_volume / 560
|
||||
blood_percent *= 100
|
||||
dat += text("[]\tBlood Level %: [] ([blood_volume] units)</FONT><BR>", (blood_volume > 448 ?"<font color='blue'>" : "<font color='red'>"), blood_volume)
|
||||
if(occupant.reagents)
|
||||
dat += text("Inaprovaline units: [] units<BR>", occupant.reagents.get_reagent_amount("inaprovaline"))
|
||||
dat += text("Soporific (Sleep Toxin): [] units<BR>", occupant.reagents.get_reagent_amount("stoxin"))
|
||||
dat += text("[]\tDermaline: [] units</FONT><BR>", (occupant.reagents.get_reagent_amount("dermaline") < 30 ? "<font color='black'>" : "<font color='red'>"), occupant.reagents.get_reagent_amount("dermaline"))
|
||||
dat += text("[]\tBicaridine: [] units<BR>", (occupant.reagents.get_reagent_amount("bicaridine") < 30 ? "<font color='black'>" : "<font color='red'>"), occupant.reagents.get_reagent_amount("bicaridine"))
|
||||
dat += text("[]\tDexalin: [] units<BR>", (occupant.reagents.get_reagent_amount("dexalin") < 30 ? "<font color='black'>" : "<font color='red'>"), occupant.reagents.get_reagent_amount("dexalin"))
|
||||
|
||||
for(var/datum/disease/D in occupant.viruses)
|
||||
if(!D.hidden[SCANNER])
|
||||
dat += text("<font color='red'><B>Warning: [D.form] Detected</B>\nName: [D.name].\nType: [D.spread].\nStage: [D.stage]/[D.max_stages].\nPossible Cure: [D.cure]</FONT><BR>")
|
||||
|
||||
if (occupant.virus2 || occupant.reagents.reagent_list.len > 0)
|
||||
dat += text("<font color='red'>Warning: Foreign substances detected in bloodstream.</FONT>")
|
||||
|
||||
dat += "<HR><table border='1'>"
|
||||
dat += "<tr>"
|
||||
dat += "<th>Organ</th>"
|
||||
dat += "<th>Burn Damage</th>"
|
||||
dat += "<th>Brute Damage</th>"
|
||||
dat += "<th>Other Wounds</th>"
|
||||
dat += "</tr>"
|
||||
for(var/name in occupant:organs)
|
||||
var/datum/organ/external/e = occupant:organs[name]
|
||||
|
||||
for(var/name in occupant.organs)
|
||||
var/datum/organ/external/e = occupant.organs[name]
|
||||
dat += "<tr>"
|
||||
var/AN = ""
|
||||
var/open = ""
|
||||
var/infected = ""
|
||||
var/imp = ""
|
||||
var/bled = ""
|
||||
var/splint = ""
|
||||
if(e.status & SPLINTED)
|
||||
splint = "Splinted:"
|
||||
if(e.status & BLEEDING)
|
||||
bled = "Bleeding:"
|
||||
if(e.status & BROKEN)
|
||||
AN = "[e.broken_description]:"
|
||||
if(e.open)
|
||||
open = "OPEN:"
|
||||
open = "Open:"
|
||||
if(e.implant && e.implant.len)
|
||||
imp = "IMPLANT:"
|
||||
imp = "Implanted:"
|
||||
if(!AN && !open && !infected & !imp)
|
||||
AN = "None"
|
||||
if(!e.status & DESTROYED)
|
||||
dat += "<td>[e.display_name]</td><td>[e.burn_dam]</td><td>[e.brute_dam]</td><td>[bled][AN][open][infected][imp]</td>"
|
||||
if(!(e.status & DESTROYED))
|
||||
dat += "<td>[e.display_name]</td><td>[e.burn_dam]</td><td>[e.brute_dam]</td><td>[bled][AN][splint][open][infected][imp]</td>"
|
||||
else
|
||||
dat += "<td>[e.display_name]</td><td>-</td><td>-</td><td>Not Found</td>"
|
||||
dat += "</tr>"
|
||||
@@ -268,5 +305,5 @@
|
||||
else
|
||||
dat = "<font color='red'> Error: No Body Scanner connected.</font>"
|
||||
dat += text("<BR><BR><A href='?src=\ref[];mach_close=scanconsole'>Close</A>", user)
|
||||
user << browse(dat, "window=scanconsole;size=500x500")
|
||||
user << browse(dat, "window=scanconsole;size=430x600")
|
||||
return
|
||||
@@ -185,6 +185,8 @@
|
||||
new/obj/item/nutrient/rh(src.loc)
|
||||
new/obj/item/nutrient/rh(src.loc)
|
||||
new/obj/item/nutrient/rh(src.loc)
|
||||
if("wallet")
|
||||
new/obj/item/weapon/storage/wallet(src.loc)
|
||||
if("gloves")
|
||||
new/obj/item/clothing/gloves/botanic_leather(src.loc)
|
||||
if("tbelt")
|
||||
|
||||
@@ -128,7 +128,10 @@
|
||||
spawn(30)
|
||||
src.eject_wait = 0
|
||||
|
||||
src.occupant = new /mob/living/carbon/human(src)
|
||||
if(istajaran(occupant))
|
||||
src.occupant = new /mob/living/carbon/human/tajaran(src)
|
||||
else
|
||||
src.occupant = new /mob/living/carbon/human(src)
|
||||
|
||||
occupant:UI = UI // set interface preference
|
||||
|
||||
|
||||
@@ -474,7 +474,7 @@
|
||||
temp = "Updating local R&D database..."
|
||||
src.updateUsrDialog()
|
||||
sleep(30) //only sleep if called by user
|
||||
for(var/obj/machinery/computer/rdconsole/RDC in get_area(src))
|
||||
for(var/obj/machinery/computer/rdconsole/RDC in oview(7)) //get_area(src)) is broken due to ULTRALIIIIIGHT
|
||||
if(!RDC.sync)
|
||||
continue
|
||||
for(var/datum/tech/T in RDC.files.known_tech)
|
||||
|
||||
@@ -6,7 +6,7 @@
|
||||
name = "mecha part"
|
||||
icon = 'mech_construct.dmi'
|
||||
icon_state = "blank"
|
||||
w_class = 20
|
||||
w_class = 5 //I'm pretty sure that's silly.
|
||||
flags = FPRINT | TABLEPASS | CONDUCT
|
||||
origin_tech = "programming=2;materials=2"
|
||||
var/construction_time = 100
|
||||
|
||||
@@ -153,7 +153,7 @@ obj/effect/decal/poster/New(var/serial)
|
||||
desc += " Here to protect and serve... your donuts! A generously proportioned man, he teaches you the value of hiding your snacks."
|
||||
if(20)
|
||||
name += " - Tajaran Today, Special #222"
|
||||
desc += " A controversial front page pinup from NTFashion, banned on numerous stations for it's unreasonably cute depictions."
|
||||
desc += " A controversial front page pinup from NTFashion, banned on numerous stations for its unreasonably cute depictions."
|
||||
if(21)
|
||||
name += " - Respect a Soghun"
|
||||
desc += " This poster depicts a well dressed looking Soghun receiving a prestigious award. It appears to espouse greater co-operation and harmony between the two races."
|
||||
|
||||
@@ -192,7 +192,7 @@
|
||||
return 0
|
||||
var/mob/M = loc
|
||||
|
||||
if(!M.canmove)
|
||||
if(!M.canmove && (!M.buckled && M.handcuffed))
|
||||
return 0
|
||||
|
||||
if((src in M.contents) || ( istype(loc, /turf) && in_range(src, M) ) )
|
||||
|
||||
@@ -114,14 +114,14 @@ MASS SPECTROMETER
|
||||
else if (M.getBrainLoss() >= 10)
|
||||
user.show_message(text("\red Significant brain damage detected. Subject may have had a concussion."), 1)
|
||||
if (M.virus2 || M.reagents.reagent_list.len > 0)
|
||||
user.show_message(text("\red Unknown substance detected in blood."), 1)
|
||||
user.show_message(text("\red Foreign substances detected in bloodstream."), 1)
|
||||
if(ishuman(M))
|
||||
var/mob/living/carbon/human/H = M
|
||||
for(var/name in H.organs)
|
||||
var/datum/organ/external/e = H.organs[name]
|
||||
var/limb = e.getDisplayName()
|
||||
if(e.status & BROKEN)
|
||||
if(((e.name == "l_arm") || (e.name == "r_arm") || (e.name == "l_leg") || (e.name == "r_leg")) && (!e.status & SPLINTED))
|
||||
if(((e.name == "l_arm") || (e.name == "r_arm") || (e.name == "l_leg") || (e.name == "r_leg")) && (!(e.status & SPLINTED)))
|
||||
user << "\red Unsecured fracture in subject [limb]. Splinting recommended for transport."
|
||||
for(var/name in H.organs)
|
||||
var/datum/organ/external/e = H.organs[name]
|
||||
|
||||
@@ -23,6 +23,9 @@
|
||||
if (recording)
|
||||
var/ending = copytext(msg, length(msg))
|
||||
src.timestamp+= src.timerecorded
|
||||
if (issilicon(M))
|
||||
src.storedinfo += "\[[time2text(src.timerecorded*10,"hh:mm:ss")]\] [M.name] states, \"[msg]\""
|
||||
return
|
||||
if (M.stuttering)
|
||||
src.storedinfo += "\[[time2text(src.timerecorded*10,"hh:mm:ss")]\] [M.name] stammers, \"[msg]\""
|
||||
return
|
||||
|
||||
@@ -139,7 +139,7 @@
|
||||
|
||||
var/direction = get_dir(src,target)
|
||||
|
||||
if(usr.buckled && isobj(usr.buckled) && !usr.buckled.anchored )
|
||||
if(usr.buckled && istype(usr.buckled, /obj/structure/stool/bed/chair/office) && !usr.buckled.anchored ) //Making only office chairs fire-extinguishable. Because NO FUN ALLOWED
|
||||
spawn(0)
|
||||
var/obj/B = usr.buckled
|
||||
var/movementdirection = turn(direction,180)
|
||||
|
||||
@@ -103,7 +103,8 @@
|
||||
|
||||
var/n_name = input(usr, "What would you like to label the photo?", "Photo Labelling", src.name) as text
|
||||
n_name = copytext(n_name, 1, 32)
|
||||
if ((loc == usr && usr.stat == 0))
|
||||
//loc.loc check is for making possible renaming photos in clipboards
|
||||
if (( (src.loc == usr || (src.loc.loc && src.loc.loc == usr)) && usr.stat == 0))
|
||||
name = "photo[(n_name ? text("- '[n_name]'") : null)]"
|
||||
add_fingerprint(usr)
|
||||
return
|
||||
@@ -203,7 +204,10 @@
|
||||
y_c--
|
||||
x_c = x_c - 3
|
||||
|
||||
var/obj/item/weapon/photo/P = new/obj/item/weapon/photo( get_turf(src) )
|
||||
var/obj/item/weapon/photo/P = new/obj/item/weapon/photo()
|
||||
P.loc = usr.loc
|
||||
if(!user.get_inactive_hand())
|
||||
usr.put_in_inactive_hand(P)
|
||||
var/icon/small_img = icon(temp)
|
||||
var/icon/ic = icon('items.dmi',"photo")
|
||||
small_img.Scale(8,8)
|
||||
|
||||
@@ -7,10 +7,10 @@ MEDICAL
|
||||
|
||||
|
||||
/obj/item/stack/medical/attack(mob/living/carbon/M as mob, mob/user as mob)
|
||||
var/heal_cap = 0
|
||||
var/heal_cap = 50
|
||||
|
||||
if(istype(src, /obj/item/stack/medical/advanced))
|
||||
heal_cap = -50
|
||||
heal_cap = 0
|
||||
|
||||
if (M.stat == 2)
|
||||
var/t_him = "it"
|
||||
@@ -51,7 +51,7 @@ MEDICAL
|
||||
if(!((affecting.name == "l_arm") || (affecting.name == "r_arm") || (affecting.name == "l_leg") || (affecting.name == "r_leg")))
|
||||
user << "\red You can't apply a splint there!"
|
||||
return
|
||||
if(!affecting.status & BROKEN)
|
||||
if(!(affecting.status & BROKEN))
|
||||
user << "\red [M]'s [limb] isn't broken!"
|
||||
return
|
||||
if(affecting.status & SPLINTED)
|
||||
@@ -87,25 +87,26 @@ MEDICAL
|
||||
user << "\red \The [M] is wounded badly, this item cannot help [t_him]!"
|
||||
return
|
||||
|
||||
if (user)
|
||||
if (M != user)
|
||||
user.visible_message("\red \The [H]'s [affecting.display_name] has been bandaged with \a [src] by \the [user].",\
|
||||
"\red You bandage \the [H]'s [affecting.display_name] with \the [src].",\
|
||||
"You hear gauze being ripped.")
|
||||
else
|
||||
var/t_his = "its"
|
||||
if (user.gender == MALE)
|
||||
t_his = "his"
|
||||
else if (user.gender == FEMALE)
|
||||
t_his = "her"
|
||||
user.visible_message("\red \The [user] bandages [t_his] [affecting.display_name] with \a [src].",\
|
||||
"\red You bandage your [affecting.display_name] with \the [src].",\
|
||||
"You hear gauze being ripped.")
|
||||
use(1)
|
||||
|
||||
if (affecting.heal_damage(src.heal_brute, src.heal_burn))
|
||||
H.UpdateDamageIcon()
|
||||
if (user)
|
||||
if (M != user)
|
||||
user.visible_message("\red \The [H]'s [affecting.display_name] has been bandaged with \a [src] by \the [user].",\
|
||||
"\red You bandage \the [H]'s [affecting.display_name] with \the [src].",\
|
||||
"You hear gauze being ripped.")
|
||||
else
|
||||
var/t_his = "its"
|
||||
if (user.gender == MALE)
|
||||
t_his = "his"
|
||||
else if (user.gender == FEMALE)
|
||||
t_his = "her"
|
||||
user.visible_message("\red \The [user] bandages [t_his] [affecting.display_name] with \a [src].",\
|
||||
"\red You bandage your [affecting.display_name] with \the [src].",\
|
||||
"You hear gauze being ripped.")
|
||||
use(1)
|
||||
else
|
||||
user << "Nothing to patch up!"
|
||||
H.UpdateDamage()
|
||||
|
||||
M.updatehealth()
|
||||
else
|
||||
|
||||
@@ -101,7 +101,8 @@ NOTEBOOK
|
||||
return
|
||||
var/n_name = input(usr, "What would you like to label the paper?", "Paper Labelling", null) as text
|
||||
n_name = copytext(n_name, 1, 32)
|
||||
if ((src.loc == usr && usr.stat == 0))
|
||||
//loc.loc check is for making possible renaming papers in clipboards
|
||||
if ((src.loc == usr || (src.loc.loc && src.loc.loc == usr) && usr.stat == 0))
|
||||
src.name = n_name && n_name != "" ? n_name : "Untitled paper"
|
||||
src.add_fingerprint(usr)
|
||||
return
|
||||
@@ -633,8 +634,24 @@ NOTEBOOK
|
||||
var/dat = "<B>Clipboard</B><BR>"
|
||||
if (src.pen)
|
||||
dat += text("<A href='?src=\ref[];pen=1'>Remove Pen</A><BR><HR>", src)
|
||||
for(var/obj/item/weapon/paper/P in src)
|
||||
dat += text("<A href='?src=\ref[];read=\ref[]'>[]</A> <A href='?src=\ref[];write=\ref[]'>Write</A> <A href='?src=\ref[];remove=\ref[]'>Remove</A><BR>", src, P, P.name, src, P, src, P)
|
||||
dat += "<table>"
|
||||
for(var/obj/item/weapon/W in src)
|
||||
dat += "<tr>"
|
||||
if (istype(W, /obj/item/weapon/paper))
|
||||
var/obj/item/weapon/paper/P = W
|
||||
dat += text("<td><A href='?src=\ref[];read=\ref[]'>[]</A></td><td> \
|
||||
<A href='?src=\ref[];write=\ref[]'>Write</A></td><td> \
|
||||
<A href='?src=\ref[];rname=\ref[]'>Rename</A></td><td> \
|
||||
<A href='?src=\ref[];remove=\ref[]'>Remove</A><BR></td>", \
|
||||
src, P, P.name, src, P, src, P, src, P)
|
||||
if (istype(W, /obj/item/weapon/photo))
|
||||
var/obj/item/weapon/photo/P = W
|
||||
dat += text("<td><A href='?src=\ref[];read=\ref[]'>[]</A></td><td> \
|
||||
<A href='?src=\ref[];rname=\ref[]'>Rename</A></td><td> \
|
||||
<A href='?src=\ref[];remove=\ref[]'>Remove</A><BR></td>" \
|
||||
, src, P, P.name, src, P, src, P)
|
||||
dat += "</tr>"
|
||||
dat += "</table>"
|
||||
user << browse(dat, "window=clipboard")
|
||||
onclose(user, "clipboard")
|
||||
return
|
||||
@@ -679,6 +696,16 @@ NOTEBOOK
|
||||
usr.update_clothing()
|
||||
P.add_fingerprint(usr)
|
||||
src.add_fingerprint(usr)
|
||||
if (href_list["rname"])
|
||||
var/obj/item/I = locate(href_list["rname"])
|
||||
if ((I && I.loc == src))
|
||||
if (istype(I, /obj/item/weapon/paper))
|
||||
var/obj/item/weapon/paper/P = I
|
||||
P.rename()
|
||||
if (istype(I, /obj/item/weapon/photo))
|
||||
var/obj/item/weapon/photo/P = I
|
||||
P.rename()
|
||||
src.add_fingerprint(usr)
|
||||
if (href_list["write"])
|
||||
var/obj/item/P = locate(href_list["write"])
|
||||
if ((P && P.loc == src))
|
||||
@@ -692,13 +719,25 @@ NOTEBOOK
|
||||
P.attackby(src.pen, usr)
|
||||
src.add_fingerprint(usr)
|
||||
if (href_list["read"])
|
||||
var/obj/item/weapon/paper/P = locate(href_list["read"])
|
||||
if ((P && P.loc == src))
|
||||
if (!( istype(usr, /mob/living/carbon/human) ))
|
||||
usr << browse(text("<HTML><HEAD><TITLE>[]</TITLE></HEAD><BODY><TT>[]</TT></BODY></HTML>", P.name, stars(P.info)), text("window=[]", P.name))
|
||||
onclose(usr, "[P.name]")
|
||||
else
|
||||
usr << browse(text("<HTML><HEAD><TITLE>[]</TITLE></HEAD><BODY><TT>[]</TT></BODY></HTML>", P.name, P.info), text("window=[]", P.name))
|
||||
var/obj/item/I = locate(href_list["read"])
|
||||
if ((I && I.loc == src))
|
||||
if (istype(I, /obj/item/weapon/paper))
|
||||
var/obj/item/weapon/paper/P = I
|
||||
if (!( istype(usr, /mob/living/carbon/human) ))
|
||||
usr << browse(text("<HTML><HEAD><TITLE>[]</TITLE></HEAD><BODY><TT>[]</TT></BODY></HTML>", P.name, stars(P.info)), text("window=[]", P.name))
|
||||
onclose(usr, "[P.name]")
|
||||
else
|
||||
var/t = dd_replacetext(P.info, "\n", "<BR>")
|
||||
usr << browse(text("<HTML><HEAD><TITLE>[]</TITLE></HEAD><BODY><TT>[]</TT></BODY></HTML>", P.name, t), text("window=[]", P.name))
|
||||
onclose(usr, "[P.name]")
|
||||
if (istype(I, /obj/item/weapon/photo))
|
||||
var/obj/item/weapon/photo/P = I
|
||||
usr << browse_rsc(P.img, "tmp_photo.png")
|
||||
usr << browse("<html><head><title>Photo</title></head>" \
|
||||
+ "<body style='overflow:hidden'>" \
|
||||
+ "<div> <img src='tmp_photo.png' width = '180'" \
|
||||
+ "[P.scribble ? "<div> Writings on the back:<br><i>[P.scribble]</i>" : ]"\
|
||||
+ "</body></html>", "window=book;size=200x[P.scribble ? 400 : 200]")
|
||||
onclose(usr, "[P.name]")
|
||||
if (ismob(src.loc))
|
||||
var/mob/M = src.loc
|
||||
@@ -733,7 +772,7 @@ NOTEBOOK
|
||||
|
||||
/obj/item/weapon/clipboard/attackby(obj/item/weapon/P as obj, mob/user as mob)
|
||||
..()
|
||||
if (istype(P, /obj/item/weapon/paper))
|
||||
if (istype(P, /obj/item/weapon/paper) || istype(P, /obj/item/weapon/photo))
|
||||
if (src.contents.len < 15)
|
||||
user.drop_item()
|
||||
P.loc = src
|
||||
|
||||
@@ -1242,7 +1242,7 @@ CIRCULAR SAW
|
||||
if(istype(M, /mob/living/carbon/human))
|
||||
var/datum/organ/external/affecting = M:get_organ("head")
|
||||
affecting.take_damage(7)
|
||||
affecting.status |= OPEN
|
||||
affecting.open = 1
|
||||
else
|
||||
M.take_organ_damage(7)
|
||||
|
||||
@@ -1454,7 +1454,8 @@ CIRCULAR SAW
|
||||
user << "\red You mess up!"
|
||||
S.take_damage(15)
|
||||
|
||||
S.status |= OPEN|BLEEDING
|
||||
S.status |= BLEEDING
|
||||
S.open = 1
|
||||
if(S.display_name == "chest")
|
||||
H:embryo_op_stage = 1.0
|
||||
if(S.display_name == "groin")
|
||||
|
||||
@@ -1,12 +1,5 @@
|
||||
/obj/item/weapon/storage/briefcase/New()
|
||||
..()
|
||||
new /obj/item/weapon/paper(src)
|
||||
new /obj/item/weapon/paper(src)
|
||||
new /obj/item/weapon/paper(src)
|
||||
new /obj/item/weapon/paper(src)
|
||||
new /obj/item/weapon/paper(src)
|
||||
new /obj/item/weapon/paper(src)
|
||||
new /obj/item/weapon/pen(src)
|
||||
|
||||
/obj/item/weapon/storage/briefcase/attack(mob/M as mob, mob/living/user as mob)
|
||||
//..()
|
||||
|
||||
@@ -96,7 +96,7 @@ client/proc/display_admin_reports()
|
||||
output += "<b>Offense:</b>[N.body]<br>"
|
||||
output += "<small>Occured at [time2text(N.date,"MM/DD hh:mm:ss")]</small><br>"
|
||||
output += "<small>authored by <i>[N.author]</i></small><br>"
|
||||
output += " <a href='?src=\ref[report_topic_handler];client=\ref[src];action=done;ID=[N.ID]'>Flag as Handled</a>"
|
||||
output += " <a href='?src=\ref[report_topic_handler];client=\ref[src];action=remove;ID=[N.ID]'>Flag as Handled</a>"
|
||||
if(src.key == N.author)
|
||||
output += " <a href='?src=\ref[report_topic_handler];client=\ref[src];action=edit;ID=[N.ID]'>Edit</a>"
|
||||
output += "<br>"
|
||||
|
||||
@@ -305,6 +305,7 @@ This method wont take into account storage items developed in the future and doe
|
||||
return src.attack_hand(user)
|
||||
|
||||
/obj/machinery/computer/ordercomp/attack_hand(var/mob/user as mob)
|
||||
// TODO: Link this up with the supply depot if possible
|
||||
if(..())
|
||||
return
|
||||
user.machine = src
|
||||
@@ -433,6 +434,7 @@ This method wont take into account storage items developed in the future and doe
|
||||
return
|
||||
|
||||
/obj/machinery/computer/supplycomp/attack_hand(var/mob/user as mob)
|
||||
// TODO: Link this up with the supply depot if possible
|
||||
if(!src.allowed(user))
|
||||
user << "\red Access Denied."
|
||||
return
|
||||
@@ -688,3 +690,270 @@ This method wont take into account storage items developed in the future and doe
|
||||
|
||||
from.move_contents_to(dest)
|
||||
supply_shuttle_at_station = !supply_shuttle_at_station
|
||||
|
||||
/*
|
||||
* Supply depot control console
|
||||
*/
|
||||
/obj/machinery/supply_depot_console
|
||||
name = "Supply Depot Console"
|
||||
icon = 'terminals.dmi'
|
||||
icon_state = "production_console"
|
||||
density = 0
|
||||
anchored = 1
|
||||
var/id = ""
|
||||
var/temphtml = null // Store the menu HTML in here
|
||||
var/obj/machinery/supply_depot/machine = null
|
||||
var/machinedir = SOUTHWEST
|
||||
|
||||
/obj/machinery/supply_depot_console/New()
|
||||
..()
|
||||
spawn(7)
|
||||
src.machine = locate(/obj/machinery/supply_depot, get_step(src, machinedir))
|
||||
if (machine)
|
||||
machine.CONSOLE = src
|
||||
else
|
||||
del(src)
|
||||
|
||||
/obj/machinery/supply_depot_console/attack_hand(user as mob)
|
||||
var/dat
|
||||
if (src.temphtml)
|
||||
dat = src.temphtml
|
||||
else
|
||||
dat += "<h3>Raw Materials Storage</h3><table width='100%'>"
|
||||
dat += "<table><tr><td><b>Material</b></td><td><b>Stored</b></td><td><b>Amount to release</b></td></tr>"
|
||||
|
||||
var/canrelease = 0
|
||||
if (machine.total_material > 0)
|
||||
// Loop through the items in our inventory
|
||||
for (var/material in machine.inventory)
|
||||
var/temp = machine.inventory[material]
|
||||
if (temp["amt"] > 0)
|
||||
|
||||
// Can we press the "release" button?
|
||||
if (temp["rel"] > 0)
|
||||
canrelease = 1
|
||||
|
||||
// The things I do to make it look good...
|
||||
dat += "<tr><td>[temp["name"]]</td><td>[temp["amt"]]</td><td><a href='?src=\ref[src];set_release=[material]'>[temp["rel"]]</a> - <a href='?src=\ref[src];release_one=[material]'>Release</a></td></tr>"
|
||||
else
|
||||
dat += "<tr><td colspan='3'>No materials loaded.</tr></td>"
|
||||
|
||||
dat += text("</table><br>Space remaining: [((machine.MAX_MATERIAL - machine.total_material) < machine.MAX_MATERIAL/10) ? "<font color='red'><b>" : ""][machine.MAX_MATERIAL - machine.total_material][(machine.MAX_MATERIAL - machine.total_material < machine.MAX_MATERIAL/10) ? "</b></font>" : ""]<br>") // Warn the user when we're at 90% capacity
|
||||
dat += text("Print manifest: <a href='?src=\ref[src];toggle_print=1>'>[machine.print_manifest ? "Yes" : "No"]</a><br><br>")
|
||||
|
||||
dat += text("<a href='?src=\ref[src];load=1'>Load material</a><br>")
|
||||
if (canrelease)
|
||||
dat += text("<a href='?src=\ref[src];release_all=1'>Release material</a><br>")
|
||||
|
||||
user << browse("[dat]", "window=console_stacking_machine")
|
||||
|
||||
/obj/machinery/supply_depot_console/Topic(href, href_list)
|
||||
if (..())
|
||||
return
|
||||
usr.machine = src
|
||||
src.add_fingerprint(usr)
|
||||
|
||||
if (href_list["set_release"])
|
||||
var/material = text2path(href_list["set_release"])
|
||||
if (machine.inventory[material]["amt"] > 0)
|
||||
var/release = input("Amount of [lowertext(machine.inventory[material]["name"])] to release (max 500):", "Amount to release", machine.inventory[material]["rel"]) as num
|
||||
|
||||
// For sanity's sake, we don't drop more than 10 stacks at a time.
|
||||
if (release > 500)
|
||||
release = 500
|
||||
else if (release < 0)
|
||||
release = 0
|
||||
|
||||
machine.inventory[material]["rel"] = release
|
||||
|
||||
// Turn manifests on/off
|
||||
else if (href_list["toggle_print"])
|
||||
machine.print_manifest = !machine.print_manifest
|
||||
|
||||
// Load materials from the output area
|
||||
else if (href_list["load"])
|
||||
machine.load_materials(machine.output.loc)
|
||||
|
||||
// Release a single material
|
||||
else if (href_list["release_one"])
|
||||
var/material = text2path(href_list["release_one"])
|
||||
|
||||
// Can we release it?
|
||||
if (!machine.total_material) return
|
||||
if (machine.inventory[material]["amt"] <= 0 || machine.inventory[material]["rel"] <= 0) return
|
||||
|
||||
if (machine.spawn_stacks(material, machine.inventory[material]["rel"]))
|
||||
src.temphtml = "Material released.<br><br>"
|
||||
src.temphtml += "<a href='?src=\ref[src];main_menu=1'>OK</a>"
|
||||
|
||||
else if (href_list["release_all"])
|
||||
// Do it.
|
||||
machine.release_materials()
|
||||
src.temphtml = "Material released[(machine.print_manifest) ? " and shipping manifest printed" : ""].<br><br>"
|
||||
src.temphtml += "<a href='?src=\ref[src];main_menu=1'>OK</a>"
|
||||
|
||||
else if (href_list["main_menu"])
|
||||
src.temphtml = null
|
||||
|
||||
src.updateUsrDialog()
|
||||
return
|
||||
|
||||
/*
|
||||
* Supply depot machine
|
||||
*/
|
||||
/obj/machinery/supply_depot
|
||||
name = "supply depot"
|
||||
icon_state = "depot_open"
|
||||
density = 1
|
||||
anchored = 1
|
||||
var/id = ""
|
||||
var/machine = null
|
||||
var/obj/machinery/mineral/input = null
|
||||
var/obj/machinery/mineral/output = null
|
||||
var/obj/machinery/supply_depot_console/CONSOLE
|
||||
|
||||
// TODO: This will eventually incorporate researchable material bins to expand the depot's capacity.
|
||||
// Until then, let's just give it a reasonably large starting capacity.
|
||||
// This will probably go down to 2,500 as soon as it can be upgraded to 5k, 7.5k or 10k.
|
||||
// Or infinite, if research feels like giving cargo a bag of holding, the miserly fucks.
|
||||
|
||||
var/MAX_MATERIAL = 5000 // The upper limit of -all- materials in the machine (default 100 stacks of 50)
|
||||
var/total_material = 0 // The total amount it's holding
|
||||
var/print_manifest = 1 // Print a manifest when releasing material?
|
||||
|
||||
// DEEEEEEERP
|
||||
var/inventory = list(
|
||||
/obj/item/stack/sheet/metal = list("name" = "Iron", "amt" = 0, "rel" = 50),
|
||||
/obj/item/stack/sheet/plasteel = list("name" = "Plasteel", "amt" = 0, "rel" = 50),
|
||||
/obj/item/stack/sheet/glass = list("name" = "Glass", "amt" = 0, "rel" = 50),
|
||||
/obj/item/stack/sheet/rglass = list("name" = "Reinforced glass", "amt" = 0, "rel" = 50),
|
||||
/obj/item/stack/sheet/plasma = list("name" = "Solid plasma", "amt" = 0, "rel" = 50),
|
||||
/obj/item/stack/sheet/gold = list("name" = "Gold", "amt" = 0, "rel" = 50),
|
||||
/obj/item/stack/sheet/silver = list("name" = "Silver", "amt" = 0, "rel" = 50),
|
||||
/obj/item/stack/sheet/uranium = list("name" = "Uranium", "amt" = 0, "rel" = 50),
|
||||
/obj/item/stack/sheet/diamond = list("name" = "Diamond", "amt" = 0, "rel" = 50),
|
||||
/obj/item/stack/sheet/clown = list("name" = "Bananium", "amt" = 0, "rel" = 50),
|
||||
/obj/item/stack/sheet/adamantine= list("name" = "Adamantine", "amt" = 0, "rel" = 50),
|
||||
/obj/item/stack/sheet/mythril = list("name" = "Mythril", "amt" = 0, "rel" = 50)
|
||||
)
|
||||
|
||||
/obj/machinery/supply_depot/New()
|
||||
..()
|
||||
|
||||
spawn(5)
|
||||
// Find input
|
||||
for (var/dir in cardinal)
|
||||
src.input = locate(/obj/machinery/mineral/input, get_step(src, dir))
|
||||
if (src.input) break
|
||||
// Find output
|
||||
for (var/dir in cardinal)
|
||||
src.output = locate(/obj/machinery/mineral/output, get_step(src, dir))
|
||||
if (src.output) break
|
||||
return
|
||||
return
|
||||
|
||||
// Suck up all processable matter from a given location
|
||||
/obj/machinery/supply_depot/proc/load_materials(loc_in, loc_out)
|
||||
// If we can get out of doing anything, we do.
|
||||
if (total_material >= MAX_MATERIAL || !loc_in)
|
||||
return
|
||||
|
||||
var/obj/item/stack/sheet/O
|
||||
while (locate(/obj/item/stack/sheet, loc_in))
|
||||
O = locate(/obj/item/stack/sheet, loc_in)
|
||||
|
||||
// Do we want it?
|
||||
if (inventory[O.type])
|
||||
// Will the entire stack fit?
|
||||
if (total_material + O.amount <= MAX_MATERIAL)
|
||||
inventory[O.type]["amt"] += O.amount
|
||||
total_material += O.amount
|
||||
|
||||
update_icon()
|
||||
del(O)
|
||||
else
|
||||
// Nope, max us out and update the item
|
||||
var/taken = MAX_MATERIAL - total_material
|
||||
inventory[O.type]["amt"] += taken
|
||||
total_material = MAX_MATERIAL
|
||||
O.amount = O.amount - taken
|
||||
|
||||
update_icon()
|
||||
return
|
||||
else
|
||||
// We don't. Move it along.
|
||||
O.loc = loc_out
|
||||
|
||||
// Release a given batch of materials
|
||||
/obj/machinery/supply_depot/proc/release_materials()
|
||||
// Can we actually release anything in the first place?
|
||||
if (!src.total_material) return
|
||||
var/can_release = 0
|
||||
for (var/material in inventory)
|
||||
if (inventory[material]["amt"] > 0 && inventory[material]["rel"] > 0)
|
||||
can_release = 1
|
||||
if (!can_release) return
|
||||
|
||||
// Get us a cargo manifest if applicable...
|
||||
if (ordernum)
|
||||
ordernum++
|
||||
else
|
||||
ordernum = rand(500,5000)
|
||||
|
||||
var/obj/item/weapon/paper/manifest/slip
|
||||
if (print_manifest)
|
||||
slip = new /obj/item/weapon/paper/manifest(output.loc)
|
||||
slip.info = ""
|
||||
slip.info +="<h3>[command_name()] Internal Shipping Manifest</h3><hr><br>"
|
||||
slip.info +="Order #: [ordernum]<br>"
|
||||
slip.info +="CONTENTS:<br><ul>"
|
||||
|
||||
// Now actually spawn the items we're releasing and add them to the manifest
|
||||
for (var/material in inventory)
|
||||
var/temp = inventory[material]
|
||||
if (temp["amt"] <= 0 || temp["rel"] <= 0)
|
||||
continue
|
||||
|
||||
// If we're trying to draw more than we have, correct it.
|
||||
if (temp["rel"] > temp["amt"])
|
||||
temp["rel"] = temp["amt"]
|
||||
|
||||
// WHY THE FUCK DO I DO THESE THINGS
|
||||
var/obj/item/stack/sheet/M = spawn_stacks(material, temp["rel"])
|
||||
|
||||
if (M && print_manifest)
|
||||
slip.info += "<li>[temp["rel"]] units [M.name]</li>"
|
||||
|
||||
// Close up the cargo manifest
|
||||
if (print_manifest)
|
||||
slip.info += "</ul><br>CHECK CONTENTS AND STAMP BELOW THE LINE TO CONFIRM RECEIPT OF GOODS<hr>"
|
||||
slip.loc = output.loc
|
||||
|
||||
update_icon()
|
||||
|
||||
/obj/machinery/supply_depot/proc/spawn_stacks(material, amount)
|
||||
if (!material || amount < 1)
|
||||
return 0
|
||||
|
||||
// Decrement our material counts
|
||||
inventory[material]["amt"] -= amount
|
||||
total_material -= amount
|
||||
|
||||
var/obj/item/stack/sheet/G
|
||||
// Spawn our stacks
|
||||
while (amount > 0)
|
||||
G = new material(output.loc)
|
||||
G.amount = (amount >= 50) ? 50 : amount
|
||||
amount -= G.amount
|
||||
|
||||
return G
|
||||
|
||||
/obj/machinery/supply_depot/process()
|
||||
if (src.input && src.output)
|
||||
load_materials(input.loc, output.loc)
|
||||
|
||||
/obj/machinery/supply_depot/update_icon()
|
||||
if (src.total_material >= src.MAX_MATERIAL)
|
||||
src.icon_state = "depot_closed"
|
||||
else
|
||||
icon_state = "depot_open"
|
||||
@@ -9,7 +9,7 @@
|
||||
s["enter"] = enter_allowed
|
||||
s["vote"] = config.allow_vote_mode
|
||||
s["ai"] = config.allow_ai
|
||||
s["host"] = host ? host : null
|
||||
s["host"] = config.hostedby
|
||||
s["players"] = list()
|
||||
s["admins"] = 0
|
||||
var/n = 0
|
||||
|
||||
@@ -26,6 +26,10 @@
|
||||
user << "You are wearing that."
|
||||
return
|
||||
|
||||
if(O in user) //TEMPORARY FIX. It seems trying to put items that are in your hand in the bags breaks them horribly. - Erthilo
|
||||
user << "You'll need to put the evidence down to properly bag it."
|
||||
return
|
||||
|
||||
if(contents.len)
|
||||
user << "The [src] already has something inside it."
|
||||
return ..()
|
||||
|
||||
@@ -1448,7 +1448,7 @@ var/global/BSACooldown = 0
|
||||
special_role_description = "Role: <i>Mind datum missing</i> Antagonist: <i>Mind datum missing</i>; Has been rev: <i>Mind datum missing</i>;"
|
||||
|
||||
//Health
|
||||
health_description = "Oxy: [M.oxyloss] - Tox: [M.toxloss] - Fire: [M.fireloss] - Brute: [M.bruteloss] - Clone: [M.cloneloss] - Brain: [M.brainloss]"
|
||||
health_description = "Oxy: [M.getOxyLoss()] - Tox: [M.getToxLoss()] - Fire: [M:getFireLoss()] - Brute: [M:getBruteLoss()] - Clone: [M.getCloneLoss()] - Brain: [M.getBrainLoss()]"
|
||||
|
||||
src.owner << "<b>Info about [M.name]:</b> "
|
||||
src.owner << "Mob type = [M.type]; Damage = [health_description]"
|
||||
|
||||
@@ -878,8 +878,9 @@
|
||||
verbs -= /client/proc/hide_most_verbs
|
||||
verbs += /client/proc/show_verbs
|
||||
|
||||
verbs += /client/proc/deadchat //toggles deadchat
|
||||
verbs += /obj/admins/proc/toggleooc //toggle ooc
|
||||
if(holder.level > 0)
|
||||
verbs += /client/proc/deadchat //toggles deadchat
|
||||
verbs += /obj/admins/proc/toggleooc //toggle ooc
|
||||
verbs += /client/proc/cmd_admin_say//asay
|
||||
verbs += /client/proc/cmd_mod_say//asay
|
||||
// feedback_add_details("admin_verb","TAVVH") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
|
||||
|
||||
@@ -158,6 +158,7 @@
|
||||
new /obj/item/weapon/reagent_containers/pill/fluff/listermed( src )
|
||||
new /obj/item/weapon/reagent_containers/pill/fluff/listermed( src )
|
||||
new /obj/item/weapon/reagent_containers/pill/fluff/listermed( src )
|
||||
|
||||
/obj/item/weapon/reagent_containers/pill/fluff/listermed
|
||||
name = "anti-depressant pill"
|
||||
desc = "Used to deal with depression."
|
||||
@@ -167,6 +168,18 @@
|
||||
reagents.add_reagent("stoxin", 5)
|
||||
reagents.add_reagent("sugar", 10)
|
||||
reagents.add_reagent("ethanol", 5)
|
||||
|
||||
/obj/item/clothing/mask/fluff/electriccig //CubeJackal: Barry Sharke
|
||||
name = "Electronic cigarette"
|
||||
desc = "An electronic cigarette. Most of the relief of a real cigarette with none of the side effects. Often used by smokers who are trying to quit the habit."
|
||||
icon = 'custom_items.dmi'
|
||||
icon_state = "cigon"
|
||||
throw_speed = 0.5
|
||||
item_state = "ciglit"
|
||||
w_class = 1
|
||||
body_parts_covered = null
|
||||
flags = FPRINT|TABLEPASS
|
||||
|
||||
//////////////////////////////////
|
||||
//////////// Clothing ////////////
|
||||
//////////////////////////////////
|
||||
@@ -261,6 +274,12 @@
|
||||
item_state = "leatherjack"
|
||||
color = "leatherjack"
|
||||
|
||||
/obj/item/clothing/suit/storage/labcoat/fluff/burnt //Jamini: Edwin Atweeke
|
||||
name = "burnt labcoat"
|
||||
desc = "This lab coat has clearly seen better, less burnt, days."
|
||||
icon = 'custom_items.dmi'
|
||||
icon_state = "labcoat_burnt_open"
|
||||
|
||||
//////////// Uniforms ////////////
|
||||
|
||||
/obj/item/clothing/under/fluff/jumpsuitdown //searif: Yuki Matsuda
|
||||
|
||||
@@ -34,8 +34,6 @@
|
||||
var/t_is = "is"
|
||||
|
||||
var/msg = "<span class='info'>*---------*\nThis is "
|
||||
if(src.icon)
|
||||
msg += "\icon[src.icon] " //fucking BYOND: this should stop dreamseeker crashing if we -somehow- examine somebody before their icon is generated
|
||||
|
||||
switch(get_visible_gender())
|
||||
if(MALE)
|
||||
@@ -292,7 +290,7 @@
|
||||
if(21 to INFINITY)
|
||||
wound_flavor_text["[temp.display_name]"] += pick(" a lot of burns"," severe melting")
|
||||
wound_flavor_text["[temp.display_name]"] += "!</span>\n"
|
||||
else if(temp.wound_descs)
|
||||
else if(temp.wound_descs.len)
|
||||
var/list/wound_descriptors = list()
|
||||
for(var/time in temp.wound_descs)
|
||||
for(var/wound in temp.wound_descs[time])
|
||||
|
||||
@@ -947,7 +947,7 @@
|
||||
emote("scream")
|
||||
else if(E.name == "l_leg" || E.name == "l_foot" \
|
||||
|| E.name == "r_leg" || E.name == "r_foot" && !lying)
|
||||
if(!E.status & SPLINTED)
|
||||
if(!(E.status & SPLINTED))
|
||||
leg_tally-- // let it fail even if just foot&leg
|
||||
// can't stand
|
||||
if(leg_tally == 0 && !paralysis && !(lying || resting))
|
||||
@@ -1048,11 +1048,11 @@
|
||||
stat = 1
|
||||
|
||||
if (sleeping > 0)
|
||||
if(stat == 0)
|
||||
// BUG: this doesn't seem to happen ever.. probably when you hit sleep willingly,
|
||||
// it automatically adjusts your stat without calling this proc
|
||||
if(stat == 0 && !resting)
|
||||
// BUG: this doesn't seem to happen ever.. probably when you hit sleep willingly,
|
||||
// it automatically adjusts your stat without calling this proc
|
||||
|
||||
// show them a message so they know what's going on
|
||||
// show them a message so they know what's going on
|
||||
src << "\blue You feel very drowsy.. Your eyelids become heavy..."
|
||||
|
||||
handle_dreams()
|
||||
|
||||
@@ -450,7 +450,7 @@
|
||||
emote("scream")
|
||||
else if(E.name == "l_leg" || E.name == "l_foot" \
|
||||
|| E.name == "r_leg" || E.name == "r_foot" && !lying)
|
||||
if(!E.status & SPLINTED)
|
||||
if(!(E.status & SPLINTED))
|
||||
leg_tally-- // let it fail even if just foot&leg
|
||||
|
||||
// can't stand
|
||||
|
||||
@@ -70,6 +70,12 @@
|
||||
M.show_message(rendered_a, 2)
|
||||
else//If they do not.
|
||||
M.show_message(rendered_b, 2)
|
||||
|
||||
for (var/obj/item/device/taperecorder/O in range(T, 7)) //Puree hack for tap recorder
|
||||
spawn (0)
|
||||
if(O && !istype(O.loc, /obj/item/weapon/storage))
|
||||
O.hear_talk(src, message_a)
|
||||
|
||||
/*Radios "filter out" this conversation channel so we don't need to account for them.
|
||||
This is another way of saying that we won't bother dealing with them.*/
|
||||
else
|
||||
|
||||
@@ -687,7 +687,7 @@
|
||||
if(H.health - H.halloss <= config.health_threshold_crit)
|
||||
for(var/name in H.organs)
|
||||
var/datum/organ/external/e = H.organs[name]
|
||||
if((H.lying) && ((e.status & BROKEN && !e.status & SPLINTED) || e.status & BLEEDING) && (H.getBruteLoss() + H.getFireLoss() >= 100))
|
||||
if((H.lying) && ((e.status & BROKEN && !(e.status & SPLINTED)) || e.status & BLEEDING) && (H.getBruteLoss() + H.getFireLoss() >= 100))
|
||||
return 1
|
||||
break
|
||||
return 0
|
||||
|
||||
@@ -753,17 +753,23 @@ datum/preferences
|
||||
if("input")
|
||||
var/list/new_species = list("Human")
|
||||
var/prev_species = species
|
||||
var/whitelisted = 0
|
||||
if(config.usealienwhitelist) //If we're using the whitelist, make sure to check it!
|
||||
if(is_alien_whitelisted(user, "Soghun")) //Check for Soghun and admins
|
||||
new_species += "Soghun"
|
||||
whitelisted = 1
|
||||
if(is_alien_whitelisted(user, "Tajaran")) //Check for Tajaran and admins
|
||||
new_species += "Tajaran"
|
||||
whitelisted = 1
|
||||
if(is_alien_whitelisted(user, "Skrell")) //Check for Skrell and admins
|
||||
new_species += "Skrell"
|
||||
whitelisted = 1
|
||||
else //Not using the whitelist? Aliens for everyone!
|
||||
new_species += "Tajaran"
|
||||
new_species += "Soghun"
|
||||
new_species += "Skrell"
|
||||
if(!whitelisted)
|
||||
alert(user, "You cannot change your species as you need to be whitelisted. If you wish to be whitelisted contact an admin in-game, on the forums, or on IRC.")
|
||||
species = input("Please select a species", "Character Generation", null) in new_species
|
||||
if(prev_species != species)
|
||||
h_style = "Bald" //Try not to carry face/head hair over.
|
||||
|
||||
@@ -55,6 +55,10 @@
|
||||
if(!text)
|
||||
return "says, \"...\""; //not the best solution, but it will stop a large number of runtimes. The cause is somewhere in the Tcomms code
|
||||
var/ending = copytext(text, length(text))
|
||||
if (is_speaking_soghun)
|
||||
return "hisses, \"[text]\"";
|
||||
if (is_speaking_skrell)
|
||||
return "warbles, \"[text]\"";
|
||||
if (src.disease_symptoms & DISEASE_HOARSE)
|
||||
return "rasps, \"[text]\"";
|
||||
if (src.stuttering)
|
||||
@@ -67,10 +71,6 @@
|
||||
return "asks, \"[text]\"";
|
||||
if (ending == "!")
|
||||
return "exclaims, \"[text]\"";
|
||||
if (is_speaking_soghun)
|
||||
return "hisses, \"[text]\"";
|
||||
if (is_speaking_skrell)
|
||||
return "warbles, \"[text]\"";
|
||||
|
||||
return "says, \"[text]\"";
|
||||
|
||||
|
||||
@@ -238,11 +238,56 @@
|
||||
return "[emote], \"[text]\""
|
||||
return "says, \"[text]\"";
|
||||
|
||||
/mob/living/simple_animal/emote(var/act)
|
||||
if(act)
|
||||
if(act == "scream") act = "makes a loud and pained whimper" //ugly hack to stop animals screaming when crushed :P
|
||||
for (var/mob/O in viewers(src, null))
|
||||
O.show_message("<B>[src]</B> [act].")
|
||||
/mob/living/simple_animal/emote(var/act,var/m_type=1,var/message = null)
|
||||
switch(act)
|
||||
|
||||
if ("scream")
|
||||
message = "<B>[src]</B> screams!"
|
||||
m_type = 2
|
||||
|
||||
if ("custom")
|
||||
var/input = copytext(sanitize(input("Choose an emote to display.") as text|null),1,MAX_MESSAGE_LEN)
|
||||
if (!input)
|
||||
return
|
||||
var/input2 = input("Is this a visible or hearable emote?") in list("Visible","Hearable")
|
||||
if (input2 == "Visible")
|
||||
m_type = 1
|
||||
else if (input2 == "Hearable")
|
||||
m_type = 2
|
||||
else
|
||||
alert("Unable to use this emote, must be either hearable or visible.")
|
||||
return
|
||||
message = "<B>[src]</B> [input]"
|
||||
|
||||
if ("me")
|
||||
if(silent)
|
||||
return
|
||||
if (src.client && (client.muted || client.muted_complete))
|
||||
src << "You are muted."
|
||||
return
|
||||
if (stat)
|
||||
return
|
||||
if(!(message))
|
||||
return
|
||||
else
|
||||
if(cmptext(copytext(message, 1, 3), "v "))
|
||||
message = "<B>[src]</B> [copytext(message, 3)]"
|
||||
m_type = 1
|
||||
else if(cmptext(copytext(message, 1, 3), "h "))
|
||||
message = "<B>[src]</B> [copytext(message, 3)]"
|
||||
m_type = 2
|
||||
else
|
||||
message = "<B>[src]</B> [message]"
|
||||
else
|
||||
src << text("Invalid Emote: []", act)
|
||||
if ((message && src.stat == 0))
|
||||
if (m_type & 1)
|
||||
for(var/mob/O in viewers(src, null))
|
||||
O.show_message(message, m_type)
|
||||
else
|
||||
for(var/mob/O in hearers(src, null))
|
||||
O.show_message(message, m_type)
|
||||
return
|
||||
|
||||
|
||||
/mob/living/simple_animal/attack_animal(mob/living/simple_animal/M as mob)
|
||||
|
||||
@@ -127,7 +127,7 @@
|
||||
var/oldlum = luminosity
|
||||
|
||||
//luminosity = on * brightness
|
||||
ul_SetLuminosity(on * brightness, on * brightness, fitting != "bulb" ? on * brightness : max(on * (brightness - 2), 0) ) // *DAL*
|
||||
ul_SetLuminosity(on * brightness, on * brightness, fitting != "bulb" ? on * brightness : max(on * (brightness - 1), 0) ) // *DAL*
|
||||
|
||||
// if the state changed, inc the switching counter
|
||||
if(oldlum != luminosity)
|
||||
|
||||
@@ -219,6 +219,10 @@
|
||||
O.loc = P
|
||||
amount -= 1
|
||||
P.w_class = O.w_class
|
||||
if(O.w_class > 5.0)
|
||||
P.w_class = 5.0
|
||||
if(O.w_class < 1.0)
|
||||
P.w_class = 1.0
|
||||
P.icon_state = "deliverycrate[P.w_class]"
|
||||
var/t
|
||||
switch(P.w_class)
|
||||
@@ -232,9 +236,13 @@
|
||||
t = "bulky"
|
||||
if(5.0)
|
||||
t = "huge"
|
||||
if(P.w_class < 1.0)
|
||||
t = "tiny"
|
||||
if(P.w_class > 5.0)
|
||||
t = "huge"
|
||||
P.name = "[t] package"
|
||||
user.visible_message("\The [user] wraps \a [target] with \a [src], producing \a [P].",\
|
||||
"\blue You wrap \the [target], leaving [amount] units of paper on your [src].",\
|
||||
"\blue You wrap \the [target], leaving [amount] units of paper on \the [src].",\
|
||||
"You hear someone taping paper around a small object.")
|
||||
else if (istype(target, /obj/structure/closet/crate))
|
||||
var/obj/structure/closet/crate/O = target
|
||||
|
||||
@@ -5,9 +5,10 @@ cacophony - Retired Admin
|
||||
cajoes - Game Admin
|
||||
cib - Game Master
|
||||
compactninja - Game Master
|
||||
duntadaman - Game Admin
|
||||
dysthymia - Retired Admin
|
||||
doughnuts - Game Admin
|
||||
erthilo - Game Admin
|
||||
erthilo - Game Master
|
||||
hawkv3 - Game Master
|
||||
headswe - Game Master
|
||||
iaryni - Game Master
|
||||
@@ -19,7 +20,8 @@ misterfox - Game Admin
|
||||
mloc - Game Master
|
||||
ridley4 - Game Admin
|
||||
skymarshal - Game Master
|
||||
spaceman96 - Game Admin
|
||||
spaceman96 - Admin Observer
|
||||
strumpetplaya - Retired Admin
|
||||
tastyfish - Game Master
|
||||
uristqwerty - Game Master
|
||||
wrongnumber - Game Admin
|
||||
|
||||
@@ -1,14 +1,22 @@
|
||||
botanistpower - Tajaran
|
||||
bowlsoldier - Tajaran
|
||||
bluefishie - Skrell
|
||||
deciusreln - Skrell
|
||||
densane - Skrell
|
||||
dopeghoti - Tajaran
|
||||
duntadaman - Skrell
|
||||
fenrisian - Tajaran
|
||||
firefishie - Skrell
|
||||
forsamori - Tajaran
|
||||
forsamori - Soghun
|
||||
galenus - Soghun
|
||||
masterofstuff - Skrell
|
||||
mangled - Skrell
|
||||
searif - Soghun
|
||||
searif - Tajaran
|
||||
searif - Skrell
|
||||
spaceman96 - Tajaran
|
||||
spaceman96 - Soghun
|
||||
spaceman96 - Skrell
|
||||
sparklysheep - Skrell
|
||||
watermelonstorm - Tajaran
|
||||
@@ -38,4 +38,6 @@ themij: Taryn Kifer: /obj/item/clothing/head/helmet/greenbandana/fluff/taryn_kif
|
||||
tzefa: Wes Solari: /obj/item/fluff/wes_solari_1
|
||||
vinceluk: Seth Sealis: /obj/item/clothing/suit/storage/det_suit/fluff/graycoat
|
||||
whitellama: Ethan Way: /obj/item/fluff/ethan_way_1
|
||||
whitewolf41: Jeremy Wolf: /obj/item/clothing/under/rank/security/fluff/jeremy_wolf_1
|
||||
whitewolf41: Jeremy Wolf: /obj/item/clothing/under/rank/security/fluff/jeremy_wolf_1
|
||||
jamini: Edwin Atweeke: /obj/item/clothing/suit/storage/labcoat/fluff/burnt
|
||||
cubejackal: Barry Sharke: /obj/item/clothing/mask/fluff/electriccig
|
||||
@@ -5,4 +5,8 @@ dakonic
|
||||
themij
|
||||
sparklysheep
|
||||
botanistpower
|
||||
asanadas
|
||||
asanadas
|
||||
deusdactyl
|
||||
densane
|
||||
bowlsoldier
|
||||
fenrisian
|
||||
@@ -57,6 +57,40 @@ Stuff which is in development and not yet visible to players or just code relate
|
||||
should be listed in the changelog upon commit though. Thanks. -->
|
||||
|
||||
<!-- To take advantage of the pretty new format (well it was new when I wrote this anyway), open the "add-to-changelog.html" file in any browser and add the stuff and then generate the html code and paste it here -->
|
||||
<div class="commit sansserif">
|
||||
<h2 class="date">29 June 2012</h2>
|
||||
<h3 class="author">Erthilo updated:</h3>
|
||||
<ul class="changes bgimages16">
|
||||
<li class="tweak">Raises job limits for Botanists, Atmospheric Technicnians, Roboticists, Chemists, and Geneticists.</li>
|
||||
</ul>
|
||||
</div>
|
||||
<div class="commit sansserif">
|
||||
<h2 class="date">28 June 2012</h2>
|
||||
<h3 class="author">Chinsky updated:</h3>
|
||||
<ul class="changes bgimages16">
|
||||
<li class="rscadd">'Rename' function for clipboards</li>
|
||||
<li class="rscadd">Can add photos to clipboards</li>
|
||||
<li class="bugfix">Fixed troubles with formatting when reading from clipboard (linebreaks not being properly placed)</li>
|
||||
<li class="bugfix">Fixed photocopiers not copying photos properly</li>
|
||||
</ul>
|
||||
</div>
|
||||
<div class="commit sansserif">
|
||||
<h2 class="date">27 June 2012</h2>
|
||||
<h3 class="author">Erthilo updated:</h3>
|
||||
<ul class="changes bgimages16">
|
||||
<li class="rscadd">Simple animals (like constructs) can properly emote using the Me verb now.</li>
|
||||
<li class="rscadd">Body scanners now show a much more detailed readout on patients.</li>
|
||||
<li class="tweak">Wizard 'Mind Transfer' spell now requires full wizard garb to work.</li>
|
||||
<li class="tweak">Chairs without wheel will no longer move with fire extinguishers. BECAUSE I HATE FUN.</li>
|
||||
<li class="tweak">Gauze/kits/ointment now heal wounds instantly again. Gauze and ointment don't work below 50 health, advanced kits don't work below 0. This may be tweaked as necessary in future.</li>
|
||||
<li class="rscdel">Stepping in pools of blood no longer leaves footprints due to lag issues.</li>
|
||||
<li class="bugfix">Fixed batons hitting on all non-help intents. It'll now only do it on harm intent.</li>
|
||||
<li class="bugfix">Fixed tape recorders not recording holopad speech.</li>
|
||||
<li class="bugfix">Fixed random " on his head" messages in examine.</li>
|
||||
<li class="bugfix">Fixed surgery, all surgical procedures should work again.</li>
|
||||
<li class="bugfix">Fixes medical items. Gauze/kits/ointment can now be applied correctly again.</li>
|
||||
</ul>
|
||||
</div>
|
||||
<div class="commit sansserif">
|
||||
<h2 class="date">26 June 2012</h2>
|
||||
<h3 class="author">TG updated:</h3>
|
||||
@@ -79,6 +113,14 @@ should be listed in the changelog upon commit though. Thanks. -->
|
||||
<li class="tweak">Blood is now actually lost from the person being dragged.</li>
|
||||
<li class="bugfix">Fixed CPR being performed at weird health levels.</li>
|
||||
</ul>
|
||||
<h3 class="author">Watermelon Storm updated:</h3>
|
||||
<ul class="changes bgimages16">
|
||||
<li class="rscadd">Added a medbay (with rolling beds) and a holding cell to the destination of the escape shuttle.</li>
|
||||
</ul>
|
||||
<h3 class="author">Drieden updated:</h3>
|
||||
<ul class="changes bgimages16">
|
||||
<li class="rscadd">The cargo bay now has a supply depot to store, sort, and dispense raw materials, and print shipping manifests.</li>
|
||||
</ul>
|
||||
</div>
|
||||
|
||||
<div class="commit sansserif">
|
||||
|
||||
|
Before Width: | Height: | Size: 131 KiB After Width: | Height: | Size: 131 KiB |
|
Before Width: | Height: | Size: 135 KiB After Width: | Height: | Size: 135 KiB |
|
Before Width: | Height: | Size: 264 KiB After Width: | Height: | Size: 266 KiB |
|
Before Width: | Height: | Size: 37 KiB After Width: | Height: | Size: 38 KiB |
|
Before Width: | Height: | Size: 25 KiB After Width: | Height: | Size: 28 KiB |
|
Before Width: | Height: | Size: 91 KiB After Width: | Height: | Size: 91 KiB |