Merge remote-tracking branch 'upstream/dev' into power-net

This commit is contained in:
mwerezak
2014-08-03 01:50:51 -04:00
148 changed files with 2848 additions and 1375 deletions
+3
View File
@@ -481,6 +481,9 @@
if(ticker.mode.traitors.len)
dat += check_role_table("Traitors", ticker.mode.traitors, src)
if(ticker.mode.borers.len)
dat += check_role_table("Cortical Borers", ticker.mode.borers, src)
var/datum/game_mode/mutiny/mutiny = get_mutiny_mode()
if(mutiny)
dat += mutiny.check_antagonists_ui(src)
+1 -1
View File
@@ -533,7 +533,7 @@ client/proc/one_click_antag()
if(ticker.mode && ( istype( ticker.mode,/datum/game_mode/heist ) ) )
var/datum/game_mode/heist/M = ticker.mode
M.cortical_stacks += I
cortical_stacks += I
M.raiders[new_vox.mind] = I
ticker.mode.traitors += new_vox.mind
+1 -4
View File
@@ -20,10 +20,7 @@
H.mind.objectives += hijack_objective
H << "<B>You are the traitor.</B>"
var/obj_count = 1
for(var/datum/objective/OBJ in H.mind.objectives)
H << "<B>Objective #[obj_count]</B>: [OBJ.explanation_text]"
obj_count++
show_objectives(H.mind)
for (var/obj/item/I in H)
if (istype(I, /obj/item/weapon/implant))
+127 -37
View File
@@ -107,7 +107,8 @@ datum/preferences
var/list/organ_data = list()
var/list/player_alt_titles = new() // the default name of a job like "Medical Doctor"
var/flavor_text = ""
var/list/flavor_texts = list()
var/med_record = ""
var/sec_record = ""
var/gen_record = ""
@@ -386,14 +387,7 @@ datum/preferences
dat += "\t<a href=\"byond://?src=\ref[user];preference=skills\"><b>Set Skills</b> (<i>[GetSkillClass(used_skillpoints)][used_skillpoints > 0 ? " [used_skillpoints]" : "0"])</i></a><br>"
dat += "<a href='byond://?src=\ref[user];preference=flavor_text;task=input'><b>Set Flavor Text</b></a><br>"
if(lentext(flavor_text) <= 40)
if(!lentext(flavor_text))
dat += "\[...\]"
else
dat += "[flavor_text]"
else
dat += "[copytext(flavor_text, 1, 37)]...<br>"
dat += "<a href='byond://?src=\ref[user];preference=flavor_text;task=open'><b>Set Flavor Text</b></a><br>"
dat += "<br>"
dat += "<br><b>Hair</b><br>"
@@ -558,24 +552,15 @@ datum/preferences
HTML += "<a href=\"byond://?src=\ref[user];preference=records;task=med_record\">Medical Records</a><br>"
if(lentext(med_record) <= 40)
HTML += "[med_record]"
else
HTML += "[copytext(med_record, 1, 37)]..."
HTML += TextPreview(med_record,40)
HTML += "<br><br><a href=\"byond://?src=\ref[user];preference=records;task=gen_record\">Employment Records</a><br>"
if(lentext(gen_record) <= 40)
HTML += "[gen_record]"
else
HTML += "[copytext(gen_record, 1, 37)]..."
HTML += TextPreview(gen_record,40)
HTML += "<br><br><a href=\"byond://?src=\ref[user];preference=records;task=sec_record\">Security Records</a><br>"
if(lentext(sec_record) <= 40)
HTML += "[sec_record]<br>"
else
HTML += "[copytext(sec_record, 1, 37)]...<br>"
HTML += TextPreview(sec_record,40)
HTML += "<br>"
HTML += "<a href=\"byond://?src=\ref[user];preference=records;records=-1\">\[Done\]</a>"
@@ -603,7 +588,44 @@ datum/preferences
user << browse(HTML, "window=antagoptions")
return
proc/SetFlavorText(mob/user)
var/HTML = "<body>"
HTML += "<tt><center>"
HTML += "<b>Set Flavour Text</b> <hr />"
HTML += "<br></center>"
HTML += "<a href='byond://?src=\ref[user];preference=flavor_text;task=general'>General:</a> "
HTML += TextPreview(flavor_texts["general"])
HTML += "<br>"
HTML += "<a href='byond://?src=\ref[user];preference=flavor_text;task=head'>Head:</a> "
HTML += TextPreview(flavor_texts["head"])
HTML += "<br>"
HTML += "<a href='byond://?src=\ref[user];preference=flavor_text;task=face'>Face:</a> "
HTML += TextPreview(flavor_texts["face"])
HTML += "<br>"
HTML += "<a href='byond://?src=\ref[user];preference=flavor_text;task=eyes'>Eyes:</a> "
HTML += TextPreview(flavor_texts["eyes"])
HTML += "<br>"
HTML += "<a href='byond://?src=\ref[user];preference=flavor_text;task=torso'>Body:</a> "
HTML += TextPreview(flavor_texts["torso"])
HTML += "<br>"
HTML += "<a href='byond://?src=\ref[user];preference=flavor_text;task=arms'>Arms:</a> "
HTML += TextPreview(flavor_texts["arms"])
HTML += "<br>"
HTML += "<a href='byond://?src=\ref[user];preference=flavor_text;task=hands'>Hands:</a> "
HTML += TextPreview(flavor_texts["hands"])
HTML += "<br>"
HTML += "<a href='byond://?src=\ref[user];preference=flavor_text;task=legs'>Legs:</a> "
HTML += TextPreview(flavor_texts["legs"])
HTML += "<br>"
HTML += "<a href='byond://?src=\ref[user];preference=flavor_text;task=feet'>Feet:</a> "
HTML += TextPreview(flavor_texts["feet"])
HTML += "<br>"
HTML += "<hr />"
HTML +="<a href='?src=\ref[user];preference=flavor_text;task=done'>\[Done\]</a>"
HTML += "<tt>"
user << browse(null, "window=preferences")
user << browse(HTML, "window=flavor_text;size=430x300")
return
proc/GetPlayerAltTitle(datum/job/job)
return player_alt_titles.Find(job.title) > 0 \
@@ -805,6 +827,72 @@ datum/preferences
SetSkills(user)
return 1
else if (href_list["preference"] == "loadout")
if(href_list["task"] == "input")
var/list/valid_gear_choices = list()
for(var/gear_name in gear_datums)
var/datum/gear/G = gear_datums[gear_name]
if(G.whitelisted && !is_alien_whitelisted(user, G.whitelisted))
continue
valid_gear_choices += gear_name
var/choice = input(user, "Select gear to add: ") as null|anything in valid_gear_choices
if(choice && gear_datums[choice])
var/total_cost = 0
if(isnull(gear) || !islist(gear)) gear = list()
if(gear && gear.len)
for(var/gear_name in gear)
if(gear_datums[gear_name])
var/datum/gear/G = gear_datums[gear_name]
total_cost += G.cost
var/datum/gear/C = gear_datums[choice]
total_cost += C.cost
if(C && total_cost <= MAX_GEAR_COST)
gear += choice
user << "\blue Added [choice] for [C.cost] points ([MAX_GEAR_COST - total_cost] points remaining)."
else
user << "\red That item will exceed the maximum loadout cost of [MAX_GEAR_COST] points."
else if(href_list["task"] == "remove")
var/to_remove = href_list["gear"]
if(!to_remove) return
for(var/gear_name in gear)
if(gear_name == to_remove)
gear -= gear_name
break
else if(href_list["preference"] == "flavor_text")
switch(href_list["task"])
if("open")
SetFlavorText(user)
return
if("done")
user << browse(null, "window=flavor_text")
ShowChoices(user)
return
if("general")
var/msg = input(usr,"Give a general description of your character. This will be shown regardless of clothing, and may include OOC notes and preferences.","Flavor Text",html_decode(flavor_texts[href_list["task"]])) as message
if(msg != null)
msg = copytext(msg, 1, MAX_MESSAGE_LEN)
msg = html_encode(msg)
flavor_texts[href_list["task"]] = msg
else
var/msg = input(usr,"Set the flavor text for your [href_list["task"]].","Flavor Text",html_decode(flavor_texts[href_list["task"]])) as message
if(msg != null)
msg = copytext(msg, 1, MAX_MESSAGE_LEN)
msg = html_encode(msg)
flavor_texts[href_list["task"]] = msg
SetFlavorText(user)
return
else if(href_list["preference"] == "records")
if(text2num(href_list["record"]) >= 1)
SetRecords(user)
@@ -943,11 +1031,13 @@ datum/preferences
if("input")
switch(href_list["preference"])
if("name")
var/new_name = reject_bad_name( input(user, "Choose your character's name:", "Character Preference") as text|null )
if(new_name)
real_name = new_name
else
user << "<font color='red'>Invalid name. Your name should be at least 2 and at most [MAX_NAME_LEN] characters long. It may only contain the characters A-Z, a-z, -, ' and .</font>"
var/raw_name = input(user, "Choose your character's name:", "Character Preference") as text|null
if (!isnull(raw_name)) // Check to ensure that the user entered text (rather than cancel.)
var/new_name = reject_bad_name(raw_name)
if(new_name)
real_name = new_name
else
user << "<font color='red'>Invalid name. Your name should be at least 2 and at most [MAX_NAME_LEN] characters long. It may only contain the characters A-Z, a-z, -, ' and .</font>"
if("age")
var/new_age = input(user, "Choose your character's age:\n([AGE_MIN]-[AGE_MAX])", "Character Preference") as num|null
@@ -1152,15 +1242,6 @@ datum/preferences
if(new_relation)
nanotrasen_relation = new_relation
if("flavor_text")
var/msg = input(usr,"Set the flavor text in your 'examine' verb. This can also be used for OOC notes and preferences!","Flavor Text",html_decode(flavor_text)) as message
if(msg != null)
msg = copytext(msg, 1, MAX_MESSAGE_LEN)
msg = html_encode(msg)
flavor_text = msg
if("disabilities")
if(text2num(href_list["disabilities"]) >= -1)
if(text2num(href_list["disabilities"]) >= 0)
@@ -1356,7 +1437,16 @@ datum/preferences
if(character.dna)
character.dna.real_name = character.real_name
character.flavor_text = flavor_text
character.flavor_texts["general"] = flavor_texts["general"]
character.flavor_texts["head"] = flavor_texts["head"]
character.flavor_texts["face"] = flavor_texts["face"]
character.flavor_texts["eyes"] = flavor_texts["eyes"]
character.flavor_texts["torso"] = flavor_texts["torso"]
character.flavor_texts["arms"] = flavor_texts["arms"]
character.flavor_texts["hands"] = flavor_texts["hands"]
character.flavor_texts["legs"] = flavor_texts["legs"]
character.flavor_texts["feet"] = flavor_texts["feet"]
character.med_record = med_record
character.sec_record = sec_record
character.gen_record = gen_record
+22 -2
View File
@@ -143,8 +143,18 @@
S["job_engsec_med"] >> job_engsec_med
S["job_engsec_low"] >> job_engsec_low
//Flavour Text
S["flavor_texts_general"] >> flavor_texts["general"]
S["flavor_texts_head"] >> flavor_texts["head"]
S["flavor_texts_face"] >> flavor_texts["face"]
S["flavor_texts_eyes"] >> flavor_texts["eyes"]
S["flavor_texts_torso"] >> flavor_texts["torso"]
S["flavor_texts_arms"] >> flavor_texts["arms"]
S["flavor_texts_hands"] >> flavor_texts["hands"]
S["flavor_texts_legs"] >> flavor_texts["legs"]
S["flavor_texts_feet"] >> flavor_texts["feet"]
//Miscellaneous
S["flavor_text"] >> flavor_text
S["med_record"] >> med_record
S["sec_record"] >> sec_record
S["gen_record"] >> gen_record
@@ -264,8 +274,18 @@
S["job_engsec_med"] << job_engsec_med
S["job_engsec_low"] << job_engsec_low
//Flavour Text
S["flavor_texts_general"] << flavor_texts["general"]
S["flavor_texts_head"] << flavor_texts["head"]
S["flavor_texts_face"] << flavor_texts["face"]
S["flavor_texts_eyes"] << flavor_texts["eyes"]
S["flavor_texts_torso"] << flavor_texts["torso"]
S["flavor_texts_arms"] << flavor_texts["arms"]
S["flavor_texts_hands"] << flavor_texts["hands"]
S["flavor_texts_legs"] << flavor_texts["legs"]
S["flavor_texts_feet"] << flavor_texts["feet"]
//Miscellaneous
S["flavor_text"] << flavor_text
S["med_record"] << med_record
S["sec_record"] << sec_record
S["gen_record"] << gen_record
+3
View File
@@ -188,6 +188,7 @@ BLIND // can't see anything
icon = 'icons/obj/clothing/masks.dmi'
body_parts_covered = HEAD
slot_flags = SLOT_MASK
body_parts_covered = FACE|EYES
sprite_sheets = list("Vox" = 'icons/mob/species/vox/masks.dmi')
/obj/item/clothing/mask/proc/filter_air(datum/gas_mixture/air)
@@ -213,6 +214,7 @@ BLIND // can't see anything
name = "suit"
var/fire_resist = T0C+100
flags = FPRINT | TABLEPASS
body_parts_covered = UPPER_TORSO|LOWER_TORSO|ARMS|LEGS
allowed = list(/obj/item/weapon/tank/emergency_oxygen)
armor = list(melee = 0, bullet = 0, laser = 0,energy = 0, bomb = 0, bio = 0, rad = 0)
slot_flags = SLOT_OCLOTHING
@@ -232,6 +234,7 @@ BLIND // can't see anything
permeability_coefficient = 0.01
armor = list(melee = 0, bullet = 0, laser = 0,energy = 0, bomb = 0, bio = 100, rad = 50)
flags_inv = HIDEMASK|HIDEEARS|HIDEEYES|HIDEFACE
body_parts_covered = HEAD|FACE|EYES
cold_protection = HEAD
min_cold_protection_temperature = SPACE_HELMET_MIN_COLD_PROTECTION_TEMPERATURE
siemens_coefficient = 0.9
+10
View File
@@ -9,6 +9,7 @@
//var/darkness_view = 0//Base human is 2
//var/invisa_view = 0
var/prescription = 0
body_parts_covered = EYES
/obj/item/clothing/glasses/meson
name = "Optical Meson Scanner"
@@ -42,12 +43,14 @@
desc = "Yarr."
icon_state = "eyepatch"
item_state = "eyepatch"
body_parts_covered = 0
/obj/item/clothing/glasses/monocle
name = "monocle"
desc = "Such a dapper eyepiece!"
icon_state = "monocle"
item_state = "headset" // lol
body_parts_covered = 0
/obj/item/clothing/glasses/material
name = "Optical Material Scanner"
@@ -63,6 +66,7 @@
icon_state = "glasses"
item_state = "glasses"
prescription = 1
body_parts_covered = 0
/obj/item/clothing/glasses/regular/hipster
name = "Prescription Glasses"
@@ -75,12 +79,14 @@
name = "3D glasses"
icon_state = "3d"
item_state = "3d"
body_parts_covered = 0
/obj/item/clothing/glasses/gglasses
name = "Green Glasses"
desc = "Forest green glasses, like the kind you'd wear when hatching a nasty scheme."
icon_state = "gglasses"
item_state = "gglasses"
body_parts_covered = 0
/obj/item/clothing/glasses/sunglasses
desc = "Strangely ancient technology used to help provide rudimentary eye cover. Enhanced shielding blocks many flashes."
@@ -111,12 +117,14 @@
src.up = !src.up
src.flags |= GLASSESCOVERSEYES
flags_inv |= HIDEEYES
body_parts_covered |= EYES
icon_state = initial(icon_state)
usr << "You flip \the [src] down to protect your eyes."
else
src.up = !src.up
src.flags &= ~HEADCOVERSEYES
flags_inv &= ~HIDEEYES
body_parts_covered &= ~EYES
icon_state = "[initial(icon_state)]up"
usr << "You push \the [src] up out of your face."
@@ -193,12 +201,14 @@
desc = "A monocle thermal."
icon_state = "thermoncle"
flags = null //doesn't protect eyes because it's a monocle, duh
body_parts_covered = 0
/obj/item/clothing/glasses/thermal/eyepatch
name = "Optical Thermal Eyepatch"
desc = "An eyepatch with built-in thermal optics"
icon_state = "eyepatch"
item_state = "eyepatch"
body_parts_covered = 0
/obj/item/clothing/glasses/thermal/jensen
name = "Optical Thermal Implants"
+3 -2
View File
@@ -14,7 +14,7 @@
name = "Health Scanner HUD"
desc = "A heads-up display that scans the humans in view and provides accurate data about their health status."
icon_state = "healthhud"
body_parts_covered = 0
/obj/item/clothing/glasses/hud/health/process_hud(var/mob/M)
@@ -32,7 +32,8 @@
name = "Security HUD"
desc = "A heads-up display that scans the humans in view and provides accurate data about their ID status and security records."
icon_state = "securityhud"
var/global/list/jobs[0]
body_parts_covered = 0
var/global/list/jobs[0]
/obj/item/clothing/glasses/hud/security/jensenshades
name = "Augmented shades"
+14 -1
View File
@@ -15,50 +15,58 @@
name = "collectable slime cap!"
desc = "It just latches right in place!"
icon_state = "slime"
body_parts_covered = 0
/obj/item/clothing/head/collectable/xenom
name = "collectable xenomorph helmet!"
desc = "Hiss hiss hiss!"
icon_state = "xenom"
body_parts_covered = HEAD|FACE|EYES
/obj/item/clothing/head/collectable/chef
name = "collectable chef's hat"
desc = "A rare Chef's Hat meant for hat collectors!"
icon_state = "chef"
icon_state = "hats"
item_state = "chefhat"
/obj/item/clothing/head/collectable/paper
name = "collectable paper hat"
desc = "What looks like an ordinary paper hat, is actually a rare and valuable collector's edition paper hat. Keep away from water, fire and Librarians."
icon_state = "paper"
body_parts_covered = 0
/obj/item/clothing/head/collectable/tophat
name = "collectable top hat"
desc = "A top hat worn by only the most prestigious hat collectors."
icon_state = "tophat"
item_state = "that"
body_parts_covered = 0
/obj/item/clothing/head/collectable/captain
name = "collectable captain's hat"
desc = "A Collectable Hat that'll make you look just like a real comdom!"
icon_state = "captain"
item_state = "caphat"
body_parts_covered = 0
/obj/item/clothing/head/collectable/police
name = "collectable police officer's hat"
desc = "A Collectable Police Officer's Hat. This hat emphasizes that you are THE LAW."
icon_state = "policehelm"
body_parts_covered = 0
/obj/item/clothing/head/collectable/beret
name = "collectable beret"
desc = "A Collectable red Beret. It smells faintly of Garlic."
icon_state = "beret"
body_parts_covered = 0
/obj/item/clothing/head/collectable/welding
name = "collectable welding helmet"
desc = "A Collectable Welding Helmet. Now with 80% less lead! Not for actual welding. Any welding done while wearing this Helmet is done so at the owner's own risk!"
icon_state = "welding"
item_state = "welding"
body_parts_covered = HEAD|FACE|EYES
/obj/item/clothing/head/collectable/slime
name = "collectable slime hat"
@@ -77,18 +85,21 @@
desc = "You'd make a great Dread Syndie Roberts!"
icon_state = "pirate"
item_state = "pirate"
body_parts_covered = 0
/obj/item/clothing/head/collectable/kitty
name = "collectable kitty ears"
desc = "The fur feels.....a bit too realistic."
icon_state = "kitty"
item_state = "kitty"
body_parts_covered = 0
/obj/item/clothing/head/collectable/rabbitears
name = "collectable rabbit ears"
desc = "Not as lucky as the feet!"
icon_state = "bunny"
item_state = "bunny"
body_parts_covered = 0
/obj/item/clothing/head/collectable/wizard
name = "collectable wizard's hat"
@@ -100,11 +111,13 @@
desc = "WARNING! Offers no real protection, or luminosity, but it is damn fancy!"
icon_state = "hardhat0_yellow"
item_state = "hardhat0_yellow"
body_parts_covered = 0
/obj/item/clothing/head/collectable/HoS
name = "collectable HoS hat"
desc = "Now you can beat prisoners, set silly sentences and arrest for no reason too!"
icon_state = "hoscap"
body_parts_covered = 0
/obj/item/clothing/head/collectable/thunderdome
name = "collectable Thunderdome helmet"
+2
View File
@@ -18,6 +18,7 @@
desc = "It's a special helmet issued to the Warden of a securiy force. Protects the head from impacts."
icon_state = "policehelm"
flags_inv = 0
body_parts_covered = 0
/obj/item/clothing/head/helmet/riot
name = "riot helmet"
@@ -67,6 +68,7 @@
icon_state = "swathelm"
item_state = "helmet"
flags = FPRINT|TABLEPASS|HEADCOVERSEYES
armor = list(melee = 62, bullet = 50, laser = 50,energy = 35, bomb = 10, bio = 2, rad = 0)
flags_inv = HIDEEARS
siemens_coefficient = 0.7
+4
View File
@@ -25,9 +25,11 @@
icon_state = "capcap"
flags = FPRINT|TABLEPASS
flags_inv = 0
body_parts_covered = 0
cold_protection = HEAD
min_cold_protection_temperature = SPACE_HELMET_MIN_COLD_PROTECTION_TEMPERATURE
siemens_coefficient = 0.9
body_parts_covered = 0
//Chaplain
/obj/item/clothing/head/chaplain_hood
@@ -36,6 +38,7 @@
icon_state = "chaplain_hood"
flags = FPRINT|TABLEPASS|HEADCOVERSEYES|BLOCKHAIR
siemens_coefficient = 0.9
body_parts_covered = HEAD|EYES
//Chaplain
/obj/item/clothing/head/nun_hood
@@ -52,6 +55,7 @@
icon_state = "beret"
flags = FPRINT | TABLEPASS
siemens_coefficient = 0.9
body_parts_covered = 0
//Security
/obj/item/clothing/head/beret/sec
+19 -9
View File
@@ -7,6 +7,7 @@
flags = FPRINT|TABLEPASS
item_state = "centhat"
siemens_coefficient = 0.9
body_parts_covered = 0
/obj/item/clothing/head/hairflower
name = "hair flower pin"
@@ -14,6 +15,7 @@
desc = "Smells nice."
item_state = "hairflower"
flags = FPRINT|TABLEPASS
body_parts_covered = 0
/obj/item/clothing/head/powdered_wig
name = "powdered wig"
@@ -28,18 +30,21 @@
item_state = "that"
flags = FPRINT|TABLEPASS
siemens_coefficient = 0.9
body_parts_covered = 0
/obj/item/clothing/head/redcoat
name = "redcoat's hat"
icon_state = "redcoat"
desc = "<i>'I guess it's a redhead.'</i>"
flags = FPRINT | TABLEPASS
body_parts_covered = 0
/obj/item/clothing/head/mailman
name = "mailman's hat"
icon_state = "mailman"
desc = "<i>'Right-on-time'</i> mail service head wear."
flags = FPRINT | TABLEPASS
body_parts_covered = 0
/obj/item/clothing/head/plaguedoctorhat
name = "plague doctor's hat"
@@ -48,12 +53,14 @@
flags = FPRINT | TABLEPASS
permeability_coefficient = 0.01
siemens_coefficient = 0.9
body_parts_covered = 0
/obj/item/clothing/head/hasturhood
name = "hastur's hood"
desc = "It's unspeakably stylish"
icon_state = "hasturhood"
flags = FPRINT|TABLEPASS|HEADCOVERSEYES|BLOCKHAIR
body_parts_covered = HEAD|FACE|EYES
/obj/item/clothing/head/nursehat
name = "nurse's hat"
@@ -61,6 +68,7 @@
icon_state = "nursehat"
flags = FPRINT|TABLEPASS
siemens_coefficient = 0.9
body_parts_covered = 0
/obj/item/clothing/head/syndicatefake
name = "red space-helmet replica"
@@ -70,6 +78,7 @@
flags = FPRINT | TABLEPASS | BLOCKHAIR
flags_inv = HIDEMASK|HIDEEARS|HIDEEYES|HIDEFACE
siemens_coefficient = 2.0
body_parts_covered = HEAD|FACE|EYES
/obj/item/clothing/head/cueball
name = "cueball helmet"
@@ -78,15 +87,7 @@
flags = FPRINT|TABLEPASS|HEADCOVERSEYES|HEADCOVERSMOUTH|BLOCKHAIR
item_state="cueball"
flags_inv = 0
/obj/item/clothing/head/that
name = "sturdy top-hat"
desc = "It's an amish looking armored top hat."
icon_state = "tophat"
item_state = "that"
flags = FPRINT|TABLEPASS
flags_inv = 0
body_parts_covered = HEAD|FACE|EYES
/obj/item/clothing/head/greenbandana
name = "green bandana"
@@ -95,6 +96,7 @@
item_state = "greenbandana"
flags = FPRINT|TABLEPASS
flags_inv = 0
body_parts_covered = 0
/obj/item/clothing/head/cardborg
name = "cardborg helmet"
@@ -103,6 +105,7 @@
item_state = "cardborg_h"
flags = FPRINT | TABLEPASS | HEADCOVERSEYES | HEADCOVERSMOUTH
flags_inv = HIDEMASK|HIDEEARS|HIDEEYES|HIDEFACE
body_parts_covered = HEAD|FACE|EYES
/obj/item/clothing/head/justice
name = "justice hat"
@@ -132,6 +135,7 @@
desc = "Wearing these makes you looks useless, and only good for your sex appeal."
icon_state = "bunny"
flags = FPRINT | TABLEPASS
body_parts_covered = 0
/obj/item/clothing/head/flatcap
name = "flat cap"
@@ -145,12 +149,14 @@
desc = "Yarr."
icon_state = "pirate"
item_state = "pirate"
body_parts_covered = 0
/obj/item/clothing/head/hgpiratecap
name = "pirate hat"
desc = "Yarr."
icon_state = "hgpiratecap"
item_state = "hgpiratecap"
body_parts_covered = 0
/obj/item/clothing/head/bandana
name = "pirate bandana"
@@ -164,6 +170,7 @@
icon_state = "bowler"
item_state = "bowler"
flags = FPRINT | TABLEPASS
body_parts_covered = 0
//stylish bs12 hats
@@ -173,6 +180,7 @@
item_state = "bowler_hat"
desc = "For the gentleman of distinction."
flags = FPRINT|TABLEPASS
body_parts_covered = 0
/obj/item/clothing/head/beaverhat
name = "beaver hat"
@@ -226,6 +234,7 @@
item_state = "chickensuit"
flags = FPRINT | TABLEPASS | BLOCKHAIR
siemens_coefficient = 2.0
body_parts_covered = HEAD|FACE|EYES
/obj/item/clothing/head/bearpelt
name = "bear pelt hat"
@@ -243,3 +252,4 @@
flags = FPRINT | TABLEPASS | BLOCKHAIR
flags_inv = HIDEMASK|HIDEEARS|HIDEEYES|HIDEFACE
siemens_coefficient = 2.0
body_parts_covered = HEAD|FACE|EYES
@@ -21,6 +21,7 @@
var/up = 0
armor = list(melee = 10, bullet = 0, laser = 0,energy = 0, bomb = 0, bio = 0, rad = 0)
flags_inv = (HIDEMASK|HIDEEARS|HIDEEYES|HIDEFACE)
body_parts_covered = HEAD|FACE|EYES
icon_action_button = "action_welding"
siemens_coefficient = 0.9
w_class = 3
@@ -62,6 +63,7 @@
var/status = 0
var/fire_resist = T0C+1300 //this is the max temp it can stand before you start to cook. although it might not burn away, you take damage
var/processing = 0 //I dont think this is used anywhere.
body_parts_covered = EYES
/obj/item/clothing/head/cakehat/process()
if(!onfire)
@@ -123,6 +125,7 @@
item_color = "pumpkin"
flags = FPRINT | TABLEPASS | HEADCOVERSEYES | HEADCOVERSMOUTH | BLOCKHAIR
flags_inv = HIDEMASK|HIDEEARS|HIDEEYES|HIDEFACE
body_parts_covered = HEAD|EYES
var/brightness_on = 2 //luminosity when on
var/on = 0
w_class = 3
@@ -158,6 +161,7 @@
desc = "A pair of kitty ears. Meow!"
icon_state = "kitty"
flags = FPRINT | TABLEPASS
body_parts_covered = 0
var/icon/mob
var/icon/mob2
siemens_coefficient = 1.5
+1
View File
@@ -7,6 +7,7 @@
item_color = "cargo"
var/flipped = 0
siemens_coefficient = 0.9
body_parts_covered = 0
dropped()
src.icon_state = "[item_color]soft"
+2
View File
@@ -5,6 +5,7 @@
item_state = "balaclava"
flags = FPRINT|TABLEPASS|BLOCKHAIR
flags_inv = HIDEFACE
body_parts_covered = FACE
w_class = 2
/obj/item/clothing/mask/balaclava/tactical
@@ -23,6 +24,7 @@
item_state = "luchag"
flags = FPRINT|TABLEPASS|BLOCKHAIR
flags_inv = HIDEFACE
body_parts_covered = HEAD|FACE
w_class = 2
siemens_coefficient = 3.0
+1
View File
@@ -4,6 +4,7 @@
icon_state = "breath"
item_state = "breath"
flags = FPRINT | TABLEPASS | MASKCOVERSMOUTH | MASKINTERNALS
body_parts_covered = 0
w_class = 2
gas_transfer_coefficient = 0.10
permeability_coefficient = 0.50
+4
View File
@@ -4,6 +4,7 @@
icon_state = "gas_alt"
flags = FPRINT | TABLEPASS | MASKCOVERSMOUTH | MASKCOVERSEYES | BLOCK_GAS_SMOKE_EFFECT | MASKINTERNALS
flags_inv = HIDEEARS|HIDEEYES|HIDEFACE
body_parts_covered = FACE|EYES
w_class = 3.0
item_state = "gas_alt"
gas_transfer_coefficient = 0.01
@@ -32,12 +33,14 @@
icon_state = "plaguedoctor"
item_state = "gas_mask"
armor = list(melee = 0, bullet = 0, laser = 2,energy = 2, bomb = 0, bio = 75, rad = 0)
body_parts_covered = HEAD|FACE
/obj/item/clothing/mask/gas/swat
name = "\improper SWAT mask"
desc = "A close-fitting tactical mask that can be connected to an air supply."
icon_state = "swat"
siemens_coefficient = 0.7
body_parts_covered = FACE|EYES
/obj/item/clothing/mask/gas/syndicate
name = "syndicate mask"
@@ -84,6 +87,7 @@
desc = "A mask used when acting as a monkey."
icon_state = "monkeymask"
item_state = "monkeymask"
body_parts_covered = HEAD|FACE|EYES
/obj/item/clothing/mask/gas/sexymime
name = "sexy mime mask"
+7 -1
View File
@@ -4,6 +4,7 @@
icon_state = "muzzle"
item_state = "muzzle"
flags = FPRINT|TABLEPASS|MASKCOVERSMOUTH
body_parts_covered = 0
w_class = 2
gas_transfer_coefficient = 0.90
@@ -23,6 +24,7 @@
item_state = "sterile"
w_class = 2
flags = FPRINT|TABLEPASS|MASKCOVERSMOUTH
body_parts_covered = 0
gas_transfer_coefficient = 0.90
permeability_coefficient = 0.01
armor = list(melee = 0, bullet = 0, laser = 0,energy = 0, bomb = 0, bio = 25, rad = 0)
@@ -33,6 +35,7 @@
icon_state = "fake-moustache"
flags = FPRINT|TABLEPASS
flags_inv = HIDEFACE
body_parts_covered = 0
/obj/item/clothing/mask/snorkel
name = "Snorkel"
@@ -40,6 +43,7 @@
icon_state = "snorkel"
flags = FPRINT|TABLEPASS
flags_inv = HIDEFACE
body_parts_covered = 0
//scarves (fit in in mask slot)
@@ -89,6 +93,7 @@
flags_inv = HIDEFACE
w_class = 2
siemens_coefficient = 0.9
body_parts_covered = HEAD|FACE|EYES
/obj/item/clothing/mask/horsehead
name = "horse head mask"
@@ -97,6 +102,7 @@
item_state = "horsehead"
flags = FPRINT|TABLEPASS|BLOCKHAIR
flags_inv = HIDEFACE
body_parts_covered = HEAD|FACE|EYES
w_class = 2
var/voicechange = 0
siemens_coefficient = 0.9
siemens_coefficient = 0.9
@@ -56,11 +56,13 @@
name = "sandals"
icon_state = "wizard"
species_restricted = null
body_parts_covered = 0
/obj/item/clothing/shoes/sandal/marisa
desc = "A pair of magic, black shoes."
name = "magic shoes"
icon_state = "black"
body_parts_covered = FEET
/obj/item/clothing/shoes/galoshes
desc = "Rubber boots"
@@ -120,6 +120,7 @@
icon_state = "vox-carapace"
item_state = "vox-carapace"
desc = "A glowing visor, perhaps stolen from a depressed Cylon."
body_parts_covered = UPPER_TORSO|LOWER_TORSO|LEGS|ARMS
/obj/item/clothing/suit/space/vox/carapace
name = "alien carapace armour"
@@ -161,6 +162,7 @@
icon_state = "vox-casual-1"
item_color = "vox-casual-1"
item_state = "vox-casual-1"
body_parts_covered = LEGS
/obj/item/clothing/under/vox/vox_robes
name = "alien robes"
@@ -22,7 +22,7 @@
allowed = list(/obj/item/weapon/tank/emergency_oxygen, /obj/item/device/flashlight,/obj/item/weapon/gun/energy, /obj/item/weapon/gun/projectile, /obj/item/ammo_magazine, /obj/item/ammo_casing, /obj/item/weapon/melee/baton,/obj/item/weapon/handcuffs)
slowdown = 1.5
armor = list(melee = 65, bullet = 50, laser = 50, energy = 25, bomb = 50, bio = 100, rad = 50)
flags_inv = HIDEGLOVES|HIDESHOES|HIDEJUMPSUIT|HIDETAIL
flags_inv = HIDEGLOVES|HIDESHOES|HIDEJUMPSUIT|HIDETAIL
cold_protection = UPPER_TORSO | LOWER_TORSO | LEGS | FEET | ARMS | HANDS
min_cold_protection_temperature = SPACE_SUIT_MIN_COLD_PROTECTION_TEMPERATURE
siemens_coefficient = 0.7
@@ -50,6 +50,7 @@
desc = "Ho ho ho. Merrry X-mas!"
icon_state = "santahat"
flags = FPRINT | TABLEPASS | HEADCOVERSEYES | BLOCKHAIR | STOPSPRESSUREDMAGE
body_parts_covered = HEAD
/obj/item/clothing/suit/space/santa
name = "Santa's suit"
@@ -69,6 +70,7 @@
item_state = "pirate"
armor = list(melee = 60, bullet = 50, laser = 30,energy = 15, bomb = 30, bio = 30, rad = 30)
flags = FPRINT | TABLEPASS | HEADCOVERSEYES | BLOCKHAIR | STOPSPRESSUREDMAGE
body_parts_covered = 0
siemens_coefficient = 0.9
/obj/item/clothing/suit/space/pirate
@@ -81,5 +83,6 @@
slowdown = 0
armor = list(melee = 60, bullet = 50, laser = 30,energy = 15, bomb = 30, bio = 30, rad = 30)
siemens_coefficient = 0.9
body_parts_covered = UPPER_TORSO|ARMS
@@ -7,6 +7,7 @@
armor = list(melee = 60, bullet = 50, laser = 30,energy = 15, bomb = 30, bio = 30, rad = 25)
siemens_coefficient = 0.2
species_restricted = null
body_parts_covered = HEAD|FACE
/obj/item/clothing/suit/space/space_ninja
name = "ninja suit"
@@ -18,6 +19,7 @@
armor = list(melee = 60, bullet = 50, laser = 30,energy = 15, bomb = 30, bio = 30, rad = 30)
siemens_coefficient = 0.2
species_restricted = null //Workaround for spawning alien ninja without internals.
body_parts_covered = UPPER_TORSO|LOWER_TORSO|LEGS|ARMS
//Important parts of the suit.
var/mob/living/carbon/affecting = null//The wearer.
+4 -3
View File
@@ -5,7 +5,7 @@
desc = "A traditional Unathi garment."
icon_state = "robe-unathi"
item_state = "robe-unathi"
body_parts_covered = UPPER_TORSO|LOWER_TORSO|LEGS|ARMS
body_parts_covered = UPPER_TORSO|LOWER_TORSO|LEGS
/obj/item/clothing/suit/unathi/mantle
name = "hide mantle"
@@ -21,9 +21,10 @@
desc = "A traditional Zhan-Khazan garment."
icon_state = "zhan_furs"
item_state = "zhan_furs"
body_parts_covered = UPPER_TORSO|LOWER_TORSO|LEGS|ARMS
body_parts_covered = UPPER_TORSO|LOWER_TORSO|LEGS|FEET|ARMS
/obj/item/clothing/head/tajaran/scarf
name = "headscarf"
desc = "A scarf of coarse fabric. Seems to have ear-holes."
icon_state = "zhan_scarf"
icon_state = "zhan_scarf"
body_parts_covered = HEAD|FACE
+4 -2
View File
@@ -31,6 +31,7 @@
desc = "An armoured jacket with silver rank pips and livery."
icon_state = "warden_jacket"
item_state = "armor"
body_parts_covered = UPPER_TORSO|LOWER_TORSO|ARMS
/obj/item/clothing/suit/armor/riot
@@ -38,7 +39,7 @@
desc = "A suit of armor with heavy padding to protect against melee attacks. Looks like it might impair movement."
icon_state = "riot"
item_state = "swat_suit"
body_parts_covered = UPPER_TORSO|LOWER_TORSO|LEGS|FEET|ARMS|HANDS
body_parts_covered = UPPER_TORSO|LOWER_TORSO|LEGS|ARMS
slowdown = 1
armor = list(melee = 80, bullet = 10, laser = 10, energy = 10, bomb = 0, bio = 0, rad = 0)
flags_inv = HIDEJUMPSUIT
@@ -71,7 +72,7 @@
gas_transfer_coefficient = 0.01
permeability_coefficient = 0.01
flags = FPRINT | TABLEPASS
body_parts_covered = UPPER_TORSO|LOWER_TORSO|LEGS|FEET|ARMS|HANDS
body_parts_covered = UPPER_TORSO|LOWER_TORSO|LEGS|FEET|ARMS
allowed = list(/obj/item/weapon/gun,/obj/item/ammo_magazine,/obj/item/ammo_casing,/obj/item/weapon/melee/baton,/obj/item/weapon/handcuffs,/obj/item/weapon/tank/emergency_oxygen)
slowdown = 1
armor = list(melee = 80, bullet = 60, laser = 50,energy = 25, bomb = 50, bio = 0, rad = 0)
@@ -88,6 +89,7 @@
item_state = "det_suit"
blood_overlay_type = "coat"
flags_inv = 0
body_parts_covered = UPPER_TORSO|ARMS
/obj/item/clothing/suit/armor/det_suit
+8 -4
View File
@@ -7,6 +7,7 @@
flags = FPRINT|TABLEPASS|HEADCOVERSEYES|HEADCOVERSMOUTH|BLOCKHAIR
armor = list(melee = 0, bullet = 0, laser = 0,energy = 0, bomb = 0, bio = 100, rad = 20)
flags_inv = HIDEMASK|HIDEEARS|HIDEEYES
body_parts_covered = HEAD|FACE|EYES
siemens_coefficient = 0.9
/obj/item/clothing/suit/bio_suit
@@ -29,10 +30,11 @@
//Standard biosuit, orange stripe
/obj/item/clothing/head/bio_hood/general
icon_state = "bio_general"
body_parts_covered = HEAD|FACE|EYES
/obj/item/clothing/suit/bio_suit/general
icon_state = "bio_general"
body_parts_covered = UPPER_TORSO|LOWER_TORSO|LEGS|ARMS
//Virology biosuit, green stripe
/obj/item/clothing/head/bio_hood/virology
@@ -40,7 +42,7 @@
/obj/item/clothing/suit/bio_suit/virology
icon_state = "bio_virology"
body_parts_covered = UPPER_TORSO|LOWER_TORSO|LEGS|ARMS
//Security biosuit, grey with red stripe across the chest
/obj/item/clothing/head/bio_hood/security
@@ -48,7 +50,7 @@
/obj/item/clothing/suit/bio_suit/security
icon_state = "bio_security"
body_parts_covered = UPPER_TORSO|LOWER_TORSO|LEGS|ARMS
//Janitor's biosuit, grey with purple arms
/obj/item/clothing/head/bio_hood/janitor
@@ -56,6 +58,7 @@
/obj/item/clothing/suit/bio_suit/janitor
icon_state = "bio_janitor"
body_parts_covered = UPPER_TORSO|LOWER_TORSO|LEGS|ARMS
//Scientist's biosuit, white with a pink-ish hue
@@ -64,11 +67,12 @@
/obj/item/clothing/suit/bio_suit/scientist
icon_state = "bio_scientist"
body_parts_covered = UPPER_TORSO|LOWER_TORSO|LEGS|ARMS
//CMO's biosuit, blue stripe
/obj/item/clothing/suit/bio_suit/cmo
icon_state = "bio_cmo"
body_parts_covered = UPPER_TORSO|LOWER_TORSO|LEGS|ARMS
/obj/item/clothing/head/bio_hood/cmo
icon_state = "bio_cmo"
+12 -9
View File
@@ -9,8 +9,8 @@
icon_state = "apron"
item_state = "apron"
blood_overlay_type = "armor"
body_parts_covered = UPPER_TORSO|LOWER_TORSO
allowed = list (/obj/item/weapon/reagent_containers/spray/plantbgone,/obj/item/device/analyzer/plant_analyzer,/obj/item/seeds,/obj/item/nutrient,/obj/item/weapon/minihoe)
body_parts_covered = 0
allowed = list (/obj/item/weapon/reagent_containers/spray/plantbgone,/obj/item/device/analyzer/plant_analyzer,/obj/item/seeds,/obj/item/weapon/reagent_containers/glass/fertilizer,/obj/item/weapon/minihoe)
sprite_sheets = list("Vox" = 'icons/mob/species/vox/suit.dmi')
//Captain
/obj/item/clothing/suit/captunic
@@ -18,7 +18,7 @@
desc = "Worn by a Captain to show their class."
icon_state = "captunic"
item_state = "bio_suit"
body_parts_covered = UPPER_TORSO|LOWER_TORSO|LEGS|ARMS
body_parts_covered = UPPER_TORSO|ARMS
flags_inv = HIDEJUMPSUIT
sprite_sheets = list("Vox" = 'icons/mob/species/vox/suit.dmi')
@@ -36,7 +36,7 @@
desc = "This suit says to you 'hush'!"
icon_state = "chaplain_hoodie"
item_state = "chaplain_hoodie"
body_parts_covered = UPPER_TORSO|LOWER_TORSO|LEGS|ARMS
body_parts_covered = UPPER_TORSO|ARMS
sprite_sheets = list("Vox" = 'icons/mob/species/vox/suit.dmi')
//Chaplain
@@ -45,7 +45,7 @@
desc = "Maximum piety in this star system."
icon_state = "nun"
item_state = "nun"
body_parts_covered = UPPER_TORSO|LOWER_TORSO|LEGS|ARMS|HANDS
body_parts_covered = UPPER_TORSO|LOWER_TORSO|LEGS|ARMS
flags_inv = HIDESHOES|HIDEJUMPSUIT
sprite_sheets = list("Vox" = 'icons/mob/species/vox/suit.dmi')
@@ -68,7 +68,7 @@
icon_state = "apronchef"
item_state = "apronchef"
blood_overlay_type = "armor"
body_parts_covered = UPPER_TORSO|LOWER_TORSO
body_parts_covered = 0
//Detective
/obj/item/clothing/suit/storage/det_suit
@@ -77,7 +77,7 @@
icon_state = "detective"
item_state = "det_suit"
blood_overlay_type = "coat"
body_parts_covered = UPPER_TORSO|LOWER_TORSO|LEGS|ARMS
body_parts_covered = UPPER_TORSO|ARMS
allowed = list(/obj/item/weapon/tank/emergency_oxygen, /obj/item/device/flashlight,/obj/item/weapon/gun/energy,/obj/item/weapon/gun/projectile,/obj/item/ammo_magazine,/obj/item/ammo_casing,/obj/item/weapon/melee/baton,/obj/item/weapon/handcuffs,/obj/item/weapon/storage/fancy/cigarettes,/obj/item/weapon/lighter,/obj/item/device/detective_scanner,/obj/item/device/taperecorder)
armor = list(melee = 50, bullet = 10, laser = 25, energy = 10, bomb = 0, bio = 0, rad = 0)
sprite_sheets = list("Vox" = 'icons/mob/species/vox/suit.dmi')
@@ -90,7 +90,7 @@
name = "jacket"
desc = "A forensics technician jacket."
item_state = "det_suit"
body_parts_covered = UPPER_TORSO|LOWER_TORSO|ARMS
body_parts_covered = UPPER_TORSO|ARMS
allowed = list(/obj/item/weapon/tank/emergency_oxygen, /obj/item/device/flashlight,/obj/item/weapon/gun/energy,/obj/item/weapon/gun/projectile,/obj/item/ammo_magazine,/obj/item/ammo_casing,/obj/item/weapon/melee/baton,/obj/item/weapon/handcuffs,/obj/item/device/detective_scanner,/obj/item/device/taperecorder)
armor = list(melee = 10, bullet = 10, laser = 15, energy = 10, bomb = 0, bio = 0, rad = 0)
@@ -114,6 +114,7 @@
allowed = list (/obj/item/device/analyzer, /obj/item/device/flashlight, /obj/item/device/multitool, /obj/item/device/pipe_painter, /obj/item/device/radio, /obj/item/device/t_scanner, \
/obj/item/weapon/crowbar, /obj/item/weapon/screwdriver, /obj/item/weapon/weldingtool, /obj/item/weapon/wirecutters, /obj/item/weapon/wrench, /obj/item/weapon/tank/emergency_oxygen, \
/obj/item/clothing/mask/gas, /obj/item/taperoll/engineering)
body_parts_covered = UPPER_TORSO
sprite_sheets = list("Vox" = 'icons/mob/species/vox/suit.dmi')
@@ -172,6 +173,7 @@
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/flashlight, /obj/item/device/radio, /obj/item/weapon/tank/emergency_oxygen)
body_parts_covered = UPPER_TORSO|ARMS
verb/toggle()
set name = "Toggle Jacket Buttons"
@@ -196,4 +198,5 @@
desc = "They suspend the illusion of the mime's play."
icon = 'icons/obj/clothing/belts.dmi'
icon_state = "suspenders"
blood_overlay_type = "armor" //it's the less thing that I can put here
blood_overlay_type = "armor" //it's the less thing that I can put here
body_parts_covered = 0
+2 -2
View File
@@ -4,7 +4,7 @@
icon_state = "labcoat_open"
item_state = "labcoat"
blood_overlay_type = "coat"
body_parts_covered = UPPER_TORSO|LOWER_TORSO|ARMS
body_parts_covered = UPPER_TORSO|ARMS
allowed = list(/obj/item/device/analyzer,/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)
armor = list(melee = 0, bullet = 0, laser = 0,energy = 0, bomb = 0, bio = 50, rad = 0)
sprite_sheets = list("Vox" = 'icons/mob/species/vox/suit.dmi')
@@ -91,7 +91,7 @@
src.icon_state = "labgreen_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."
usr << "You attempt to button-up the velcro on your [src], before promptly realising how silly you are."
return
usr.update_inv_wear_suit() //so our overlays update
+14 -7
View File
@@ -14,7 +14,7 @@
icon_state = "bluetag"
item_state = "bluetag"
blood_overlay_type = "armor"
body_parts_covered = UPPER_TORSO|LOWER_TORSO
body_parts_covered = UPPER_TORSO
allowed = list (/obj/item/weapon/gun/energy/laser/bluetag)
siemens_coefficient = 3.0
@@ -24,7 +24,7 @@
icon_state = "redtag"
item_state = "redtag"
blood_overlay_type = "armor"
body_parts_covered = UPPER_TORSO|LOWER_TORSO
body_parts_covered = UPPER_TORSO
allowed = list (/obj/item/weapon/gun/energy/laser/redtag)
siemens_coefficient = 3.0
@@ -37,6 +37,7 @@
icon_state = "pirate"
item_state = "pirate"
flags = FPRINT | TABLEPASS
body_parts_covered = UPPER_TORSO|ARMS
/obj/item/clothing/suit/hgpirate
@@ -46,6 +47,7 @@
item_state = "hgpirate"
flags = FPRINT | TABLEPASS
flags_inv = HIDEJUMPSUIT
body_parts_covered = UPPER_TORSO|LOWER_TORSO|ARMS|LEGS
/obj/item/clothing/suit/cyborg_suit
@@ -81,6 +83,7 @@
item_state = "justice"
flags = FPRINT | TABLEPASS
flags_inv = HIDEGLOVES|HIDESHOES|HIDEJUMPSUIT
body_parts_covered = UPPER_TORSO|LOWER_TORSO|ARMS|HANDS|LEGS|FEET
/obj/item/clothing/suit/judgerobe
@@ -120,14 +123,14 @@
flags = FPRINT | TABLEPASS
allowed = list(/obj/item/device/flashlight,/obj/item/weapon/tank/emergency_oxygen,/obj/item/toy)
flags_inv = HIDEGLOVES|HIDESHOES|HIDEJUMPSUIT
body_parts_covered = UPPER_TORSO|LOWER_TORSO|ARMS|HANDS|LEGS|FEET
/obj/item/clothing/suit/hastur
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
body_parts_covered = UPPER_TORSO|LOWER_TORSO|LEGS|FEET|ARMS
flags_inv = HIDEGLOVES|HIDESHOES|HIDEJUMPSUIT
@@ -136,7 +139,7 @@
desc = "Have YOU killed a xenos today?"
icon_state = "imperium_monk"
item_state = "imperium_monk"
body_parts_covered = UPPER_TORSO|LOWER_TORSO|LEGS|ARMS
body_parts_covered = HEAD|UPPER_TORSO|LOWER_TORSO|LEGS|FEET|ARMS
flags_inv = HIDESHOES|HIDEJUMPSUIT
@@ -186,7 +189,7 @@
desc = "A suit that completely restrains the wearer."
icon_state = "straight_jacket"
item_state = "straight_jacket"
body_parts_covered = UPPER_TORSO|LOWER_TORSO|LEGS|ARMS|HANDS
body_parts_covered = UPPER_TORSO|LOWER_TORSO|LEGS|FEET|ARMS|HANDS
flags_inv = HIDEGLOVES|HIDESHOES|HIDEJUMPSUIT|HIDETAIL
/obj/item/clothing/suit/ianshirt
@@ -194,6 +197,7 @@
desc = "A worn out, curiously comfortable t-shirt with a picture of Ian. You wouldn't go so far as to say it feels like being hugged when you wear it but it's pretty close. Good for sleeping in."
icon_state = "ianshirt"
item_state = "ianshirt"
body_parts_covered = UPPER_TORSO|ARMS
//Blue suit jacket toggle
/obj/item/clothing/suit/suit/verb/toggle()
@@ -258,6 +262,8 @@
flags = FPRINT | TABLEPASS
//stripper
/obj/item/clothing/under/stripper
body_parts_covered = 0
/obj/item/clothing/under/stripper/stripper_pink
name = "pink swimsuit"
@@ -299,12 +305,13 @@
desc = "A suit made out of chitinous alien hide."
icon_state = "xenos"
item_state = "xenos_helm"
body_parts_covered = UPPER_TORSO|LOWER_TORSO|LEGS|ARMS|HANDS
body_parts_covered = UPPER_TORSO|LOWER_TORSO|LEGS|FEET|ARMS|HANDS
flags_inv = HIDEGLOVES|HIDESHOES|HIDEJUMPSUIT
siemens_coefficient = 2.0
//swimsuit
/obj/item/clothing/under/swimsuit/
siemens_coefficient = 1
body_parts_covered = 0
/obj/item/clothing/under/swimsuit/black
name = "black swimsuit"
+5 -3
View File
@@ -50,6 +50,7 @@
flags = FPRINT|TABLEPASS|HEADCOVERSEYES|HEADCOVERSMOUTH|BLOCKHAIR
armor = list(melee = 0, bullet = 0, laser = 0,energy = 0, bomb = 100, bio = 0, rad = 0)
flags_inv = HIDEMASK|HIDEEARS|HIDEEYES
body_parts_covered = HEAD|FACE|EYES
siemens_coefficient = 0
@@ -62,7 +63,6 @@
gas_transfer_coefficient = 0.01
permeability_coefficient = 0.01
flags = FPRINT | TABLEPASS
body_parts_covered = UPPER_TORSO|LOWER_TORSO|LEGS|FEET|ARMS|HANDS
slowdown = 2
armor = list(melee = 0, bullet = 0, laser = 0,energy = 0, bomb = 100, bio = 0, rad = 0)
flags_inv = HIDEJUMPSUIT|HIDETAIL
@@ -74,12 +74,13 @@
/obj/item/clothing/head/bomb_hood/security
icon_state = "bombsuitsec"
item_state = "bombsuitsec"
body_parts_covered = HEAD
/obj/item/clothing/suit/bomb_suit/security
icon_state = "bombsuitsec"
item_state = "bombsuitsec"
allowed = list(/obj/item/weapon/gun/energy,/obj/item/weapon/melee/baton,/obj/item/weapon/handcuffs)
body_parts_covered = UPPER_TORSO|LOWER_TORSO|LEGS|FEET|ARMS|HANDS
/*
* Radiation protection
@@ -89,6 +90,7 @@
icon_state = "rad"
desc = "A hood with radiation protective properties. Label: Made with lead, do not eat insulation"
flags = FPRINT|TABLEPASS|HEADCOVERSEYES|HEADCOVERSMOUTH|BLOCKHAIR
body_parts_covered = HEAD|FACE|EYES
armor = list(melee = 0, bullet = 0, laser = 0,energy = 0, bomb = 0, bio = 60, rad = 100)
@@ -100,7 +102,7 @@
w_class = 4//bulky item
gas_transfer_coefficient = 0.90
permeability_coefficient = 0.50
body_parts_covered = UPPER_TORSO|LOWER_TORSO|LEGS|FEET|ARMS|HANDS
body_parts_covered = UPPER_TORSO|LOWER_TORSO|LEGS|ARMS
allowed = list(/obj/item/device/flashlight,/obj/item/weapon/tank/emergency_oxygen,/obj/item/clothing/head/radiation,/obj/item/clothing/mask/gas)
slowdown = 1.5
armor = list(melee = 0, bullet = 0, laser = 0,energy = 0, bomb = 0, bio = 60, rad = 100)
+6 -2
View File
@@ -4,6 +4,7 @@
icon_state = "wizard"
//Not given any special protective value since the magic robes are full-body protection --NEO
siemens_coefficient = 0.8
body_parts_covered = 0
/obj/item/clothing/head/wizard/red
name = "red wizard hat"
@@ -15,6 +16,7 @@
name = "wizard hat"
desc = "It has WIZZARD written across it in sequins. Comes with a cool beard."
icon_state = "wizard-fake"
body_parts_covered = HEAD|FACE
/obj/item/clothing/head/wizard/marisa
name = "Witch Hat"
@@ -28,6 +30,7 @@
icon_state = "magus"
item_state = "magus"
siemens_coefficient = 0.8
body_parts_covered = HEAD|FACE|EYES
/obj/item/clothing/head/wizard/amp
name = "psychic amplifier"
@@ -48,7 +51,6 @@
item_state = "wizrobe"
gas_transfer_coefficient = 0.01 // IT'S MAGICAL OKAY JEEZ +1 TO NOT DIE
permeability_coefficient = 0.01
body_parts_covered = FULL_BODY //It's magic, I ain't gotta explain shit. --NEO
armor = list(melee = 30, bullet = 20, laser = 20,energy = 20, bomb = 20, bio = 20, rad = 20)
allowed = list(/obj/item/weapon/teleportation_scroll)
flags_inv = HIDEJUMPSUIT
@@ -72,12 +74,14 @@
desc = "A set of armoured robes that seem to radiate a dark power"
icon_state = "magusblue"
item_state = "magusblue"
body_parts_covered = UPPER_TORSO|LOWER_TORSO|ARMS|HANDS|LEGS|FEET
/obj/item/clothing/suit/wizrobe/magusred
name = "Magus Robe"
desc = "A set of armoured robes that seem to radiate a dark power"
icon_state = "magusred"
item_state = "magusred"
body_parts_covered = UPPER_TORSO|LOWER_TORSO|ARMS|HANDS|LEGS|FEET
/obj/item/clothing/suit/wizrobe/psypurple
name = "purple robes"
@@ -90,13 +94,13 @@
desc = "A heavy threaded twead gray jacket. For a different sort of Gentleman."
icon_state = "gentlecoat"
item_state = "gentlecoat"
body_parts_covered = UPPER_TORSO|LOWER_TORSO|ARMS
/obj/item/clothing/suit/wizrobe/fake
name = "wizard robe"
desc = "A rather dull, blue robe meant to mimick real wizard robes."
icon_state = "wizard-fake"
item_state = "wizrobe"
body_parts_covered = UPPER_TORSO|LOWER_TORSO|ARMS|LEGS
armor = list(melee = 0, bullet = 0, laser = 0,energy = 0, bomb = 0, bio = 0, rad = 0)
siemens_coefficient = 1.0
+5
View File
@@ -48,6 +48,7 @@
icon_state = A.icon_state
item_state = A.item_state
item_color = A.item_color
body_parts_covered = A.body_parts_covered
if(usr)
usr.update_inv_w_uniform() //so our overlays update.
@@ -62,6 +63,7 @@
item_color = "grey"
desc = "It looks like a plain hat, but upon closer inspection, there's an advanced holographic array installed inside. It seems to have a small dial inside."
origin_tech = "syndicate=3"
body_parts_covered = 0
var/list/clothing_choices = list()
New()
@@ -101,6 +103,7 @@
item_state = A.item_state
item_color = A.item_color
flags_inv = A.flags_inv
body_parts_covered = A.body_parts_covered
if(usr)
usr.update_inv_head() //so our overlays update.
@@ -154,6 +157,7 @@
item_state = A.item_state
item_color = A.item_color
flags_inv = A.flags_inv
body_parts_covered = A.body_parts_covered
if(usr)
usr.update_inv_wear_suit() //so our overlays update.
@@ -356,6 +360,7 @@
icon_state = A.icon_state
item_state = A.item_state
flags_inv = A.flags_inv
body_parts_covered = A.body_parts_covered
if(usr)
usr.update_inv_wear_mask() //so our overlays update.
@@ -33,6 +33,7 @@
item_state = "lb_suit"
item_color = "cargo"
flags = FPRINT | TABLEPASS
body_parts_covered = UPPER_TORSO|LOWER_TORSO|ARMS
/obj/item/clothing/under/rank/chaplain
+17 -1
View File
@@ -26,7 +26,7 @@
item_color = "dress_rd"
armor = list(melee = 0, bullet = 0, laser = 0,energy = 0, bomb = 0, bio = 10, rad = 0)
flags = FPRINT | TABLEPASS
body_parts_covered = UPPER_TORSO|LOWER_TORSO|ARMS
/obj/item/clothing/under/rank/scientist
desc = "It's made of a special fiber that provides minor protection against biohazards. It has markings that denote the wearer as a scientist."
@@ -87,6 +87,7 @@
item_color = "nursesuit"
permeability_coefficient = 0.50
armor = list(melee = 0, bullet = 0, laser = 0,energy = 0, bomb = 0, bio = 10, rad = 0)
body_parts_covered = UPPER_TORSO|LOWER_TORSO
/obj/item/clothing/under/rank/nurse
desc = "A dress commonly worn by the nursing staff in the medical department."
@@ -96,6 +97,7 @@
item_color = "nurse"
permeability_coefficient = 0.50
armor = list(melee = 0, bullet = 0, laser = 0,energy = 0, bomb = 0, bio = 10, rad = 0)
body_parts_covered = UPPER_TORSO|LOWER_TORSO
/obj/item/clothing/under/rank/orderly
desc = "A white suit to be worn by orderly people who love orderly things."
@@ -137,7 +139,21 @@
item_color = "scrubspurple"
flags = FPRINT | TABLEPASS
/obj/item/clothing/under/rank/psych
desc = "A basic white jumpsuit. It has turqouise markings that denote the wearer as a psychiatrist."
name = "psychiatrist's jumpsuit"
icon_state = "psych"
item_state = "w_suit"
item_color = "psych"
flags = FPRINT | TABLEPASS
/obj/item/clothing/under/rank/psych/turtleneck
desc = "A turqouise turtleneck and a pair of dark blue slacks, belonging to a psychologist."
name = "psychologist's turtleneck"
icon_state = "psychturtle"
item_state = "b_suit"
item_color = "psychturtle"
flags = FPRINT | TABLEPASS
/*
+5 -2
View File
@@ -36,6 +36,7 @@
item_color = "dispatch"
armor = list(melee = 10, bullet = 0, laser = 0,energy = 0, bomb = 0, bio = 0, rad = 0)
flags = FPRINT | TABLEPASS
body_parts_covered = UPPER_TORSO|LOWER_TORSO|LEGS
siemens_coefficient = 0.9
/obj/item/clothing/under/rank/security2
@@ -105,6 +106,7 @@
allowed = list(/obj/item/weapon/reagent_containers/food/snacks/candy_corn, /obj/item/weapon/pen)
armor = list(melee = 50, bullet = 5, laser = 25,energy = 10, bomb = 0, bio = 0, rad = 0)
siemens_coefficient = 0.9
body_parts_covered = 0
/obj/item/clothing/head/det_hat/black
icon_state = "detective2"
@@ -134,8 +136,8 @@
icon_state = "hoscap"
flags = FPRINT | TABLEPASS | HEADCOVERSEYES
armor = list(melee = 80, bullet = 60, laser = 50,energy = 10, bomb = 25, bio = 10, rad = 0)
flags_inv = 0
flags_inv = HIDEEARS
body_parts_covered = 0
siemens_coefficient = 0.8
/obj/item/clothing/suit/armor/hos
@@ -171,4 +173,5 @@
icon_state = "jensencoat"
item_state = "jensencoat"
flags_inv = 0
siemens_coefficient = 0.6
siemens_coefficient = 0.6
body_parts_covered = UPPER_TORSO|ARMS
+13 -2
View File
@@ -54,6 +54,7 @@
icon_state = "sexyclown"
item_state = "sexyclown"
item_color = "sexyclown"
body_parts_covered = UPPER_TORSO|LOWER_TORSO
/obj/item/clothing/under/rank/vice
name = "vice officer's jumpsuit"
@@ -137,6 +138,7 @@
icon_state = "psysuit"
item_state = "psysuit"
item_color = "psysuit"
body_parts_covered = UPPER_TORSO|LOWER_TORSO|LEGS|FEET|ARMS|HANDS
/obj/item/clothing/under/gentlesuit
name = "Gentlemans Suit"
@@ -200,7 +202,7 @@
icon_state = "schoolgirl"
item_state = "schoolgirl"
item_color = "schoolgirl"
body_parts_covered = UPPER_TORSO|LOWER_TORSO|ARMS
body_parts_covered = UPPER_TORSO|LOWER_TORSO
/obj/item/clothing/under/overalls
name = "laborer's overalls"
@@ -215,6 +217,7 @@
icon_state = "pirate"
item_state = "pirate"
item_color = "pirate"
body_parts_covered = UPPER_TORSO|LOWER_TORSO|LEGS
/obj/item/clothing/under/soviet
name = "soviet uniform"
@@ -252,9 +255,11 @@
icon_state = "gladiator"
item_state = "gladiator"
item_color = "gladiator"
body_parts_covered = UPPER_TORSO|LOWER_TORSO|ARMS
body_parts_covered = LOWER_TORSO
//dress
/obj/item/clothing/under/dress/
body_parts_covered = UPPER_TORSO|LOWER_TORSO
/obj/item/clothing/under/dress/dress_fire
name = "flame dress"
@@ -298,18 +303,21 @@
desc = "Feminine fashion for the style concious captain."
icon_state = "dress_cap"
item_color = "dress_cap"
body_parts_covered = UPPER_TORSO|LOWER_TORSO|ARMS
/obj/item/clothing/under/dress/dress_hop
name = "head of personnel dress uniform"
desc = "Feminine fashion for the style concious HoP."
icon_state = "dress_hop"
item_color = "dress_hop"
body_parts_covered = UPPER_TORSO|LOWER_TORSO|ARMS
/obj/item/clothing/under/dress/dress_hr
name = "human resources director uniform"
desc = "Superior class for the nosy H.R. Director."
icon_state = "huresource"
item_color = "huresource"
body_parts_covered = UPPER_TORSO|LOWER_TORSO|ARMS
/obj/item/clothing/under/dress/plaid_blue
name = "blue plaid skirt"
@@ -330,6 +338,8 @@
item_color = "plaid_purple"
//wedding stuff
/obj/item/clothing/under/wedding/
body_parts_covered = UPPER_TORSO|LOWER_TORSO|LEGS
/obj/item/clothing/under/wedding/bride_orange
name = "orange wedding dress"
@@ -365,6 +375,7 @@
icon_state = "bride_white"
item_color = "bride_white"
flags_inv = HIDESHOES
body_parts_covered = UPPER_TORSO|LOWER_TORSO
/obj/item/clothing/under/sundress
name = "sundress"
+111 -39
View File
@@ -112,10 +112,28 @@
icon = 'icons/obj/custom_items.dmi'
icon_state = "syrus_notebook"
/////////////////////// Cataguettes - Lucy's Stethoscope - Lucy Kemmerer //////
/obj/item/clothing/tie/stethoscope/fluff/lucystethos
name = "Lucy's Stethoscope"
desc = "A medical apparatus intended to ease in listening to the sounds of the human body. This one looks cleaner and sparklier than the rest. There is a small silver plaque attached to the tubing, with the words 'Lucy Kemmerer' engraved on it."
icon_state = "lucystethos"
item_state = "lucystethos"
item_color ="lucystethos"
icon = 'icons/obj/custom_items.dmi'
/obj/item/weapon/pen/fluff/multi //spaceman96: Trenna Seber
name = "multicolor pen"
desc = "It's a cool looking pen. Lots of colors!"
//////////////////////// AIsForAxolotl - Tea Flask - Margaret Stewart //////////
/obj/item/weapon/reagent_containers/food/drinks/flask/vacuumflask/fluff/margaret
name = "Tea Flask"
desc = "A plastic vacuum flask with an ugly tartan pattern. 'M.S.' has been written on the bottom with a silver marker."
icon = 'icons/obj/custom_items.dmi'
icon_state = "margaret_flask"
/obj/item/weapon/pen/fluff/fancypen //orangebottle: Lillian Levett, Lilliana Reade
name = "fancy pen"
desc = "A fancy metal pen. It uses blue ink. An inscription on one side reads,\"L.L. - L.R.\""
@@ -560,7 +578,7 @@
suit_icon = "salvage_suit"
helmet_color = "salvage"
///////// Salvage crew hardsuit - Callum Leamas - roaper ///////////////
///////// Weathered hardsuit - Callum Leamas - roaper ///////////////
/obj/item/device/kit/suit/fluff/roaper
name = "Callum's hardsuit modification kit"
desc = "A kit containing all the needed tools and parts to modify a hardsuit."
@@ -572,6 +590,18 @@
suit_icon = "rig-roaper"
helmet_color = "roaper"
///////// Hazard Hardsuit - Ronan Harper - Raptor1628 //////////////////
/obj/item/device/kit/suit/fluff/ronan_harper
name = "hazard hardsuit modification kit"
desc = "A kit containing all the needed tools and parts to modify a hardsuit."
new_name = "hazard"
new_suit_desc = "An older model of armored NT Hardsuit emblazoned in security colors. The crest of the NAS Rhodes, a copper rose, is painted onto the chestplate."
new_helmet_desc = "An older NT Hardsuit Helmet with built-in atmospheric filters. The name HARPER has been printed on the back."
helmet_icon = "rig0-hazardhardsuit"
suit_icon = "rig-hazardhardsuit"
helmet_color = "hazardhardsuit"
//////// Meat Hook - Korom Bhararaya - Matthew951 ////////////////////////
/obj/item/device/kit/weapon/fluff/hook
@@ -676,18 +706,12 @@
//////////// Hats ////////////
/obj/item/clothing/head/fluff/kaine_kalim_1
name = "Formal Medical Cap"
desc = "An unusually sterile and folded cap. It seems to bare the Nanotrasen logo."
icon = 'icons/obj/custom_items.dmi'
icon_state = "kainecap"
/obj/item/clothing/head/secsoft/fluff/swatcap //deusdactyl: James Girard
name = "\improper SWAT hat"
desc = "A black hat. The inside has the words, \"Lieutenant James Girard, LPD SWAT Team Four.\""
icon = 'icons/obj/custom_items.dmi'
icon_state = "swatcap"
body_parts_covered = 0
/obj/item/clothing/head/welding/fluff/alice_mccrea_1 //madmalicemccrea: Alice McCrea
name = "flame decal welding helmet"
@@ -707,11 +731,23 @@
icon = 'icons/obj/custom_items.dmi'
icon_state = "norah_briggs_1"
//////////////// Painted Welding Mask - Kuratas Dotaavi - supercotton ////////////////////
/obj/item/clothing/head/welding/fluff/kuratas
name = "Painted Welding Mask"
desc = "A blood-red welding mask with an intricate pattern. Smells like burnt rubber."
icon = 'icons/obj/custom_items.dmi'
icon_state = "paintedwelding"
/obj/item/clothing/head/helmet/greenbandana/fluff/taryn_kifer_1 //themij: Taryn Kifer
name = "orange bandana"
desc = "Hey, I think we're missing a hazard vest..."
icon = 'icons/obj/custom_items.dmi'
icon_state = "taryn_kifer_1"
body_parts_covered = 0
/obj/item/clothing/head/fluff
body_parts_covered = 0
/obj/item/clothing/head/fluff/edvin_telephosphor_1 //foolamancer: Edvin Telephosphor
name = "Edvin's Hat"
@@ -731,6 +767,13 @@
icon = 'icons/obj/custom_items.dmi'
icon_state = "brucehachert"
/obj/item/clothing/head/fluff/kaine_kalim_1
name = "Formal Medical Cap"
desc = "An unusually sterile and folded cap. It seems to bare the Nanotrasen logo."
icon = 'icons/obj/custom_items.dmi'
icon_state = "kainecap"
/obj/item/clothing/head/beret/fluff/marine_beret //Von2531: Jack Washington
name = "colonial marine beret"
desc = "A well-worn navy blue beret. The insignia of the Martian Colonial Marine Corps is affixed to the front."
@@ -746,6 +789,50 @@
icon_state = "adapted_h"
icon = 'icons/obj/custom_items.dmi'
//////////////////////////////////////////////////////////
///////////////////// Belts //////////////////////////////
//////////////////////////////////////////////////////////
/obj/item/weapon/storage/belt/medical/fluff/ems
name = "EMS utility belt"
desc = "A sturdy black webbing belt with attached pouches. H. ISHIMARU is scratched on the interior of the buckle."
icon = 'icons/obj/custom_items.dmi'
icon_state = "emsbelt"
item_state = "emsbelt"
/obj/item/weapon/storage/belt/utility/full/fluff/sophie
name = "Sophie's belt"
desc = "A tool-belt in Atmos colours."
icon = 'icons/obj/custom_items.dmi'
icon_state = "sophie_belt"
item_state = "sophie_belt"
/obj/item/weapon/storage/belt/medical/fluff/nashi_belt
name = "rainbow medical belt"
desc = "A somewhat-worn, modified, rainbow belt."
icon = 'icons/obj/custom_items.dmi'
icon_state = "nashi_belt"
item_state = "fluff_rbelt"
New()
..()
new /obj/item/weapon/reagent_containers/glass/bottle/fluff/nashi_bottle(src, 14, "Bicaridine")
new /obj/item/weapon/reagent_containers/glass/bottle/fluff/nashi_bottle(src, 15, "Dermaline")
new /obj/item/weapon/reagent_containers/glass/bottle/fluff/nashi_bottle(src, 16, "Dylovene")
new /obj/item/weapon/reagent_containers/glass/bottle/fluff/nashi_bottle(src, 17, "Dexalin Plus")
new /obj/item/weapon/reagent_containers/glass/bottle/fluff/nashi_bottle(src, 18, "Tricordrazine")
new /obj/item/weapon/reagent_containers/syringe/(src)
new /obj/item/device/healthanalyzer(src)
/obj/item/weapon/reagent_containers/glass/bottle/fluff/nashi_bottle
icon = 'icons/obj/chemical.dmi'
flags = FPRINT | TABLEPASS //Starting them with lids on them. Safety first!
New(loc, var/color, var/labeled)
..()
name = "[labeled] bottle"
desc = "A small bottle. Contains [labeled]"
icon_state = "bottle[color]"
//////////// Suits ////////////
/obj/item/clothing/suit/storage/labcoat/fluff/aeneas_rinil //Robotics Labcoat - Aeneas Rinil [APPR]
@@ -753,6 +840,7 @@
desc = "A labcoat with a few markings denoting it as the labcoat of roboticist."
icon = 'icons/obj/custom_items.dmi'
icon_state = "aeneasrinil"
body_parts_covered = UPPER_TORSO|LOWER_TORSO|ARMS|LEGS
/obj/item/clothing/suit/storage/labcoat/fluff/pink //spaceman96: Trenna Seber
name = "pink labcoat"
@@ -781,7 +869,7 @@
icon = 'icons/obj/clothing/suits.dmi'
icon_state = "mantle-unathi"
item_state = "mantle-unathi"
body_parts_covered = UPPER_TORSO
body_parts_covered = 0
/////////////////////////////// 50_n00b - R.A.N.G.E.'s blue dress //////////////////////////
@@ -791,6 +879,7 @@
icon = 'icons/obj/custom_items.dmi'
icon_state = "br_dress"
item_state = "br_dress"
body_parts_covered = UPPER_TORSO|LOWER_TORSO|LEGS
//////////////////////////////// Broseph Stylin - Lombardi's Jacket ///////////////////////////
@@ -800,6 +889,7 @@
icon = 'icons/obj/custom_items.dmi'
icon_state = "lombardi_jacket"
item_state = "lombardi_jacket"
body_parts_covered = UPPER_TORSO|ARMS
verb/toggle()
set name = "Toggle Jacket Buttons"
@@ -812,7 +902,7 @@
switch(icon_state)
if("lombardi_jacket")
src.icon_state = "lombardi_jacket_open"
usr << "You unbutton up the jacket."
usr << "You unbutton the jacket."
if("lombardi_jacket_open")
src.icon_state = "lombardi_jacket"
usr << "You button up the jacket."
@@ -852,6 +942,7 @@
icon_state = "lilith_uniform"
item_state = "lilith_uniform"
item_color = "lilith_uniform"
body_parts_covered = UPPER_TORSO|LOWER_TORSO|LEGS
/obj/item/clothing/under/fluff/ana_issek_1 //suethecake: Ana Issek
name = "retired uniform"
@@ -860,6 +951,7 @@
icon_state = "ana_uniform"
item_state = "ana_uniform"
item_color = "ana_uniform"
body_parts_covered = UPPER_TORSO|LOWER_TORSO|LEGS
/obj/item/clothing/under/fluff/olddressuniform //desiderium: Momiji Inubashiri
name = "retired dress uniform"
@@ -893,6 +985,7 @@
icon_state = "tian_dress"
item_state = "tian_dress"
item_color = "tian_dress"
body_parts_covered = UPPER_TORSO|LOWER_TORSO
/obj/item/clothing/under/rank/bartender/fluff/classy //searif: Ara Al-Jazari
name = "classy bartender uniform"
@@ -978,6 +1071,7 @@
icon_state = "lillian_dress"
item_state = "lillian_dress"
item_color = "lillian_dress"
body_parts_covered = UPPER_TORSO|LOWER_TORSO
////////////// Accessories /////
@@ -985,9 +1079,11 @@
/obj/item/clothing/tie/fluff/radi
name = "Blood Red Pendant"
desc = "A pendant that has been painted a metallic red, it seems to have a ruby in it."
desc = "A blue chained necklace with a ruby in the middle, it looks pretty!"
icon = 'icons/obj/custom_items.dmi'
icon_state = "radi_pendant"
item_state = "radi_pendant"
item_color = "radi_pendant"
flags = FPRINT|TABLEPASS
w_class = 2.0
slot_flags = 0
@@ -1022,6 +1118,7 @@
icon = 'icons/obj/custom_items.dmi'
item_state = "head_m"
icon_state = "head_m"
body_parts_covered = FACE|EYES
////// Small locket - Altair An-Nasaqan - Serithi
@@ -1100,6 +1197,7 @@
flags = FPRINT|TABLEPASS
w_class = 2
slot_flags = SLOT_MASK
body_parts_covered = 0
//////////// Shoes ////////////
@@ -1142,6 +1240,7 @@
icon_state = "medical_short"
item_state = "medical_short"
item_color = "medical_short"
body_parts_covered = UPPER_TORSO|LOWER_TORSO|LEGS
/obj/item/clothing/suit/storage/labcoat/fluff/red
name = "red labcoat"
@@ -1201,34 +1300,6 @@
flick("leamas-reloading",src)
..()
///// Custom Items coded by Iamgoofball are Below /////
/obj/item/weapon/storage/belt/medical/fluff/nashi_belt
name = "rainbow medical belt"
desc = "A somewhat-worn, modified, rainbow belt."
icon = 'icons/obj/custom_items.dmi'
icon_state = "nashi_belt"
item_state = "fluff_rbelt"
New()
..()
new /obj/item/weapon/reagent_containers/glass/bottle/fluff/nashi_bottle(src, 14, "Bicaridine")
new /obj/item/weapon/reagent_containers/glass/bottle/fluff/nashi_bottle(src, 15, "Dermaline")
new /obj/item/weapon/reagent_containers/glass/bottle/fluff/nashi_bottle(src, 16, "Dylovene")
new /obj/item/weapon/reagent_containers/glass/bottle/fluff/nashi_bottle(src, 17, "Dexalin Plus")
new /obj/item/weapon/reagent_containers/glass/bottle/fluff/nashi_bottle(src, 18, "Tricordrazine")
new /obj/item/weapon/reagent_containers/syringe/(src)
new /obj/item/device/healthanalyzer(src)
/obj/item/weapon/reagent_containers/glass/bottle/fluff/nashi_bottle
icon = 'icons/obj/chemical.dmi'
flags = FPRINT | TABLEPASS //Starting them with lids on them. Safety first!
New(loc, var/color, var/labeled)
..()
name = "[labeled] bottle"
desc = "A small bottle. Contains [labeled]"
icon_state = "bottle[color]"
/obj/item/weapon/reagent_containers/food/drinks/flask/fluff/yuri_kornienkovich_flask
name = "Yuri's Flask"
desc = "An old gold plated flask. Nothing noteworthy about it besides it being gold and the red star on the worn out leather around it. There is also an engraving on the cap that is rather hard to see but it looks like \"Kornienkovich\" "
@@ -1242,6 +1313,7 @@
icon_state = "mai_yang"
item_state = "mai_yang"
item_color = "mai_yang"
body_parts_covered = UPPER_TORSO|LOWER_TORSO
/obj/item/clothing/under/fluff/sakura_hokkaido_kimono
name = "Sakura Kimono"
+2 -2
View File
@@ -19,13 +19,13 @@ atom/proc/add_fibers(mob/living/carbon/human/M)
if(prob(10*item_multiplier) && !(fibertext in suit_fibers))
//world.log << "Added fibertext: [fibertext]"
suit_fibers += fibertext
if(!(M.wear_suit.body_parts_covered & 32))
if(M.wear_suit.body_parts_covered & ~FULL_BODY && (M.wear_suit.body_parts_covered & ~UPPER_TORSO || M.wear_suit.body_parts_covered & ~LOWER_TORSO || M.wear_suit.body_parts_covered & ~ARMS || M.wear_suit.body_parts_covered & ~LEGS))
if(M.w_uniform)
fibertext = "Fibers from \a [M.w_uniform]."
if(prob(12*item_multiplier) && !(fibertext in suit_fibers)) //Wearing a suit means less of the uniform exposed.
//world.log << "Added fibertext: [fibertext]"
suit_fibers += fibertext
if(!(M.wear_suit.body_parts_covered & 64))
if(M.wear_suit.body_parts_covered & ~HANDS)
if(M.gloves)
fibertext = "Material from a pair of [M.gloves.name]."
if(prob(20*item_multiplier) && !(fibertext in suit_fibers))
+4
View File
@@ -30,6 +30,10 @@ var/scheduledEvent = null
playercount_modifier = 0.9
if(36 to 100000)
playercount_modifier = 0.8
if(ticker.mode && ticker.mode.name == "calamity") //Calamity mode lowers the time required between events drastically.
playercount_modifier = playercount_modifier * 0.3
var/next_event_delay = rand(eventTimeLower, eventTimeUpper) * playercount_modifier
scheduledEvent = world.timeofday + next_event_delay
log_debug("Next event in [next_event_delay/600] minutes.")
+18 -18
View File
@@ -164,29 +164,29 @@
if("meat")
new/obj/item/weapon/reagent_containers/food/snacks/meat(src.loc)
if("ez")
new/obj/item/nutrient/ez(src.loc)
new/obj/item/weapon/reagent_containers/glass/fertilizer/ez(src.loc)
if("l4z")
new/obj/item/nutrient/l4z(src.loc)
new/obj/item/weapon/reagent_containers/glass/fertilizer/l4z(src.loc)
if("rh")
new/obj/item/nutrient/rh(src.loc)
new/obj/item/weapon/reagent_containers/glass/fertilizer/rh(src.loc)
if("ez5") //It's not an elegant method, but it's safe and easy. -Cheridan
new/obj/item/nutrient/ez(src.loc)
new/obj/item/nutrient/ez(src.loc)
new/obj/item/nutrient/ez(src.loc)
new/obj/item/nutrient/ez(src.loc)
new/obj/item/nutrient/ez(src.loc)
new/obj/item/weapon/reagent_containers/glass/fertilizer/ez(src.loc)
new/obj/item/weapon/reagent_containers/glass/fertilizer/ez(src.loc)
new/obj/item/weapon/reagent_containers/glass/fertilizer/ez(src.loc)
new/obj/item/weapon/reagent_containers/glass/fertilizer/ez(src.loc)
new/obj/item/weapon/reagent_containers/glass/fertilizer/ez(src.loc)
if("l4z5")
new/obj/item/nutrient/l4z(src.loc)
new/obj/item/nutrient/l4z(src.loc)
new/obj/item/nutrient/l4z(src.loc)
new/obj/item/nutrient/l4z(src.loc)
new/obj/item/nutrient/l4z(src.loc)
new/obj/item/weapon/reagent_containers/glass/fertilizer/l4z(src.loc)
new/obj/item/weapon/reagent_containers/glass/fertilizer/l4z(src.loc)
new/obj/item/weapon/reagent_containers/glass/fertilizer/l4z(src.loc)
new/obj/item/weapon/reagent_containers/glass/fertilizer/l4z(src.loc)
new/obj/item/weapon/reagent_containers/glass/fertilizer/l4z(src.loc)
if("rh5")
new/obj/item/nutrient/rh(src.loc)
new/obj/item/nutrient/rh(src.loc)
new/obj/item/nutrient/rh(src.loc)
new/obj/item/nutrient/rh(src.loc)
new/obj/item/nutrient/rh(src.loc)
new/obj/item/weapon/reagent_containers/glass/fertilizer/rh(src.loc)
new/obj/item/weapon/reagent_containers/glass/fertilizer/rh(src.loc)
new/obj/item/weapon/reagent_containers/glass/fertilizer/rh(src.loc)
new/obj/item/weapon/reagent_containers/glass/fertilizer/rh(src.loc)
new/obj/item/weapon/reagent_containers/glass/fertilizer/rh(src.loc)
if("wallet")
new/obj/item/weapon/storage/wallet(src.loc)
if("gloves")
+34 -23
View File
@@ -1,4 +1,8 @@
//Analyzer, pestkillers, weedkillers, nutrients, hatchets.
//Analyzer, pestkillers, weedkillers, nutrients, hatchets, cutters.
/obj/item/weapon/wirecutters/clippers
name = "plant clippers"
desc = "A tool used to take samples from plants."
/obj/item/device/analyzer/plant_analyzer
name = "plant analyzer"
@@ -67,7 +71,9 @@
if(grown_seed.harvest_repeat)
dat += "This plant can be harvested repeatedly.<br>"
if(grown_seed.immutable)
if(grown_seed.immutable == -1)
dat += "This plant is highly mutable.<br>"
else if(grown_seed.immutable > 0)
dat += "This plant does not possess genetics that are alterable.<br>"
if(grown_seed.products && grown_seed.products.len)
@@ -261,39 +267,44 @@
// Nutrient defines for hydroponics
// *************************************
/obj/item/nutrient
name = "bottle of nutrient"
/obj/item/weapon/reagent_containers/glass/fertilizer
name = "fertilizer bottle"
desc = "A small glass bottle. Can hold up to 10 units."
icon = 'icons/obj/chemical.dmi'
icon_state = "bottle16"
flags = FPRINT | TABLEPASS
flags = FPRINT | TABLEPASS | OPENCONTAINER
possible_transfer_amounts = null
w_class = 2.0
var/mutmod = 0
var/yieldmod = 0
New()
src.pixel_x = rand(-5.0, 5)
src.pixel_y = rand(-5.0, 5)
/obj/item/nutrient/ez
var/fertilizer //Reagent contained, if any.
//Like a shot glass!
amount_per_transfer_from_this = 10
volume = 10
/obj/item/weapon/reagent_containers/glass/fertilizer/New()
..()
src.pixel_x = rand(-5.0, 5)
src.pixel_y = rand(-5.0, 5)
if(fertilizer)
reagents.add_reagent(fertilizer,10)
/obj/item/weapon/reagent_containers/glass/fertilizer/ez
name = "bottle of E-Z-Nutrient"
icon = 'icons/obj/chemical.dmi'
icon_state = "bottle16"
flags = FPRINT | TABLEPASS
mutmod = 1
yieldmod = 1
fertilizer = "eznutrient"
/obj/item/nutrient/l4z
/obj/item/weapon/reagent_containers/glass/fertilizer/l4z
name = "bottle of Left 4 Zed"
icon = 'icons/obj/chemical.dmi'
icon_state = "bottle18"
flags = FPRINT | TABLEPASS
mutmod = 2
fertilizer = "left4zed"
/obj/item/nutrient/rh
/obj/item/weapon/reagent_containers/glass/fertilizer/rh
name = "bottle of Robust Harvest"
icon = 'icons/obj/chemical.dmi'
icon_state = "bottle15"
flags = FPRINT | TABLEPASS
yieldmod = 2
fertilizer = "robustharvest"
//Hatchets and things to kill kudzu
/obj/item/weapon/hatchet
+220 -203
View File
@@ -6,6 +6,8 @@
icon_state = "hydrotray3"
density = 1
anchored = 1
flags = OPENCONTAINER
var/draw_warnings = 1 //Set to 0 to stop it from drawing the alert lights.
// Plant maintenance vars.
@@ -30,93 +32,106 @@
var/lastcycle = 0 // Cycle timing/tracking var.
var/cycledelay = 150 // Delay per cycle.
var/closed_system // If set, the tray will attempt to take atmos from a pipe.
var/force_update // Set this to bypass the cycle time check.
// Seed details/line data.
var/datum/seed/seed = null // The currently planted seed
// Reagent information for attackby(), consider moving this to a controller along
// Reagent information for process(), consider moving this to a controller along
// with cycle information under 'mechanical concerns' at some point.
// For all following lists, when called in attackby() the relevant value will be increased
// by 1,val if val>0 or decreased by 1,val if val<0.
var/global/list/toxic_reagents = list(
"anti_toxin" = -2,
"toxin" = 2,
"fluorine" = 2.5,
"chlorine" = 1.5,
"sacid" = 1.5,
"pacid" = 3,
"plantbgone" = 3,
"cryoxadone" = -3,
"radium" = 2
"anti_toxin" = -2,
"toxin" = 2,
"fluorine" = 2.5,
"chlorine" = 1.5,
"sacid" = 1.5,
"pacid" = 3,
"plantbgone" = 3,
"cryoxadone" = -3,
"radium" = 2
)
var/global/list/nutrient_reagents = list(
"milk" = 0.1,
"beer" = 0.25,
"phosphorus" = 0.1,
"sugar" = 0.1,
"sodawater" = 0.1,
"ammonia" = 1,
"diethylamine" = 2,
"nutriment" = 1,
"adminordrazine" = 1
"milk" = 0.1,
"beer" = 0.25,
"phosphorus" = 0.1,
"sugar" = 0.1,
"sodawater" = 0.1,
"ammonia" = 1,
"diethylamine" = 2,
"nutriment" = 1,
"adminordrazine" = 1,
"eznutrient" = 1,
"robustharvest" = 1,
"left4zed" = 1
)
var/global/list/weedkiller_reagents = list(
"fluorine" = -4,
"chlorine" = -3,
"phosphorus" = -2,
"sugar" = 2,
"sacid" = -2,
"pacid" = -4,
"plantbgone" = -8,
"fluorine" = -4,
"chlorine" = -3,
"phosphorus" = -2,
"sugar" = 2,
"sacid" = -2,
"pacid" = -4,
"plantbgone" = -8,
"adminordrazine" = -5
)
var/global/list/pestkiller_reagents = list(
"sugar" = 2,
"diethylamine" = -2,
"sugar" = 2,
"diethylamine" = -2,
"adminordrazine" = -5
)
var/global/list/beneficial_reagents = list(
"beer" = -0.05,
"fluorine" = -2,
"chlorine" = -1,
"phosphorus" = -0.75,
"sodawater" = 0.1,
"sacid" = -1,
"pacid" = -2,
"plantbgone" = -2,
"cryoxadone" = 3,
"ammonia" = 0.5,
"diethylamine" = 1,
"nutriment" = 0.5,
"radium" = -1.5,
"adminordrazine" = 1
)
var/global/list/water_reagents = list(
"adminordrazine" = 1,
"milk" = 0.9,
"beer" = 0.7,
"flourine" = -0.5,
"chlorine" = -0.5,
"phosphorus" = -0.5,
"water" = 1,
"sodawater" = 1,
"water" = 1,
"adminordrazine" = 1,
"milk" = 0.9,
"beer" = 0.7,
"flourine" = -0.5,
"chlorine" = -0.5,
"phosphorus" = -0.5,
"water" = 1,
"sodawater" = 1,
)
// Beneficial reagents also have values for modifying yield_mod and mut_mod (in that order).
var/global/list/beneficial_reagents = list(
"beer" = list( -0.05, 0, 0 ),
"fluorine" = list( -2, 0, 0 ),
"chlorine" = list( -1, 0, 0 ),
"phosphorus" = list( -0.75, 0, 0 ),
"sodawater" = list( 0.1, 0, 0 ),
"sacid" = list( -1, 0, 0 ),
"pacid" = list( -2, 0, 0 ),
"plantbgone" = list( -2, 0, 0.2 ),
"cryoxadone" = list( 3, 0, 0 ),
"ammonia" = list( 0.5, 0, 0 ),
"diethylamine" = list( 1, 0, 0 ),
"nutriment" = list( 0.5, 1, 0 ),
"radium" = list( -1.5, 0, 0.2 ),
"adminordrazine" = list( 1, 1, 1 ),
"robustharvest" = list( 0, 0.2, 0 ),
"left4zed" = list( 0, 0, 0.2 )
)
// Mutagen list specifies minimum value for the mutation to take place, rather
// than a bound as the lists above specify.
var/global/list/mutagenic_reagents = list(
"radium" = 8,
"mutagen" = 3
"radium" = list(8,3),
"mutagen" = list(3,8)
)
/obj/machinery/portable_atmospherics/hydroponics/New()
..()
create_reagents(200)
connect()
update_icon()
if(closed_system)
flags &= ~OPENCONTAINER
/obj/machinery/portable_atmospherics/hydroponics/bullet_act(var/obj/item/projectile/Proj)
//Don't act on seeds like dionaea that shouldn't change.
if(seed && seed.immutable > 0)
return
//Override for somatoray projectiles.
if(istype(Proj ,/obj/item/projectile/energy/floramut) && prob(20))
mutate(1)
@@ -137,8 +152,13 @@
/obj/machinery/portable_atmospherics/hydroponics/process()
//Do this even if we're not ready for a plant cycle.
process_reagents()
// Update values every cycle rather than every process() tick.
if(world.time < (lastcycle + cycledelay))
if(force_update)
force_update = 0
else if(world.time < (lastcycle + cycledelay))
return
lastcycle = world.time
@@ -159,7 +179,12 @@
return
// Advance plant age.
age += 1 * HYDRO_SPEED_MULTIPLIER
if(prob(25)) age += 1 * HYDRO_SPEED_MULTIPLIER
//Highly mutable plants have a chance of mutating every tick.
if(seed.immutable == -1)
var/mut_prob = rand(1,100)
if(mut_prob <= 5) mutate(mut_prob == 1 ? 2 : 1)
// Maintain tray nutrient and water levels.
if(seed.nutrient_consumption > 0 && nutrilevel > 0 && prob(25))
@@ -189,8 +214,21 @@
if(!environment)
if(istype(T))
environment = T.return_air()
if(!environment) //We're in a crate or nullspace, bail out.
return
if(!environment) return
// Handle gas consumption.
if(seed.consume_gasses && seed.consume_gasses.len)
var/missing_gas = 0
for(var/gas in seed.consume_gasses)
if(environment && environment.gas && environment.gas[gas] && \
environment.gas[gas] >= seed.consume_gasses[gas])
environment.adjust_gas(gas,-seed.consume_gasses[gas],1)
else
missing_gas++
if(missing_gas > 0)
health -= missing_gas * HYDRO_SPEED_MULTIPLIER
// Process it.
var/pressure = environment.return_pressure()
@@ -200,6 +238,11 @@
if(abs(environment.temperature - seed.ideal_heat) > seed.heat_tolerance)
health -= healthmod
// Handle gas production.
if(seed.exude_gasses && seed.exude_gasses.len)
for(var/gas in seed.exude_gasses)
environment.adjust_gas(gas, max(1,round((seed.exude_gasses[gas]*seed.potency)/seed.exude_gasses.len)))
// Handle light requirements.
var/area/A = T.loc
if(A)
@@ -249,17 +292,73 @@
pestlevel = 0
// If enough time (in cycles, not ticks) has passed since the plant was harvested, we're ready to harvest again.
else if(age > seed.production && (age - lastproduce) > seed.production && (!harvest && !dead))
else if(seed.products && seed.products.len && age > seed.production && \
(age - lastproduce) > seed.production && (!harvest && !dead))
harvest = 1
lastproduce = age
if(prob(5)) // On each tick, there's a 5 percent chance the pest population will increase
if(prob(3)) // On each tick, there's a chance the pest population will increase
pestlevel += 1 * HYDRO_SPEED_MULTIPLIER
check_level_sanity()
update_icon()
return
//Process reagents being input into the tray.
/obj/machinery/portable_atmospherics/hydroponics/proc/process_reagents()
if(!reagents) return
if(reagents.total_volume <= 0)
return
for(var/datum/reagent/R in reagents.reagent_list)
var/reagent_total = reagents.get_reagent_amount(R.id)
if(seed && !dead)
//Handle some general level adjustments.
if(toxic_reagents[R.id])
toxins += toxic_reagents[R.id] * reagent_total
if(weedkiller_reagents[R.id])
weedlevel += weedkiller_reagents[R.id] * reagent_total
if(pestkiller_reagents[R.id])
pestlevel += pestkiller_reagents[R.id] * reagent_total
// Beneficial reagents have a few impacts along with health buffs.
if(beneficial_reagents[R.id])
health += beneficial_reagents[R.id][1] * reagent_total
yield_mod += beneficial_reagents[R.id][2] * reagent_total
mutation_mod += beneficial_reagents[R.id][3] * reagent_total
// Mutagen is distinct from the previous types and mostly has a chance of proccing a mutation.
if(mutagenic_reagents[R.id])
var/reagent_min_value = mutagenic_reagents[R.id][1]
var/reagent_value = mutagenic_reagents[R.id][2]+mutation_mod
if(reagent_total >= reagent_min_value)
if(prob(min(reagent_total*reagent_value,100)))
mutate(reagent_total > 10 ? 2 : 1)
// Handle nutrient refilling.
if(nutrient_reagents[R.id])
nutrilevel += nutrient_reagents[R.id] * reagent_total
// Handle water and water refilling.
var/water_added = 0
if(water_reagents[R.id])
var/water_input = water_reagents[R.id] * reagent_total
water_added += water_input
waterlevel += water_input
if(water_added > 0)
toxins -= round(water_added/4)
reagents.clear_reagents()
check_level_sanity()
update_icon()
//Harvests the product of a plant.
/obj/machinery/portable_atmospherics/hydroponics/proc/harvest(var/mob/user)
@@ -385,7 +484,7 @@
return
// Check if we should even bother working on the current seed datum.
if(seed.mutants.len && severity > 1 && prob(10+mutation_mod))
if(seed.mutants. && seed.mutants.len && severity > 1 && prob(10+mutation_mod))
mutate_species()
return
@@ -412,7 +511,6 @@
weedlevel = max(0,min(weedlevel,10))
toxins = max(0,min(toxins,10))
/obj/machinery/portable_atmospherics/hydroponics/proc/mutate_species()
var/previous_plant = seed.display_name
@@ -437,153 +535,41 @@
/obj/machinery/portable_atmospherics/hydroponics/attackby(var/obj/item/O as obj, var/mob/user as mob)
if (istype(O, /obj/item/weapon/reagent_containers/glass))
var/b_amount = O.reagents.get_reagent_amount("water")
if(b_amount > 0 && waterlevel < 100)
if(b_amount + waterlevel > 100)
b_amount = 100 - waterlevel
O.reagents.remove_reagent("water", b_amount)
waterlevel += b_amount
playsound(loc, 'sound/effects/slosh.ogg', 25, 1)
user << "You fill \the [src] with [round(b_amount,0.1)] units of water."
if (O.is_open_container())
return 0
// The more water you put in, the more diluted the toxins become.
toxins -= round(b_amount/4)
if(istype(O, /obj/item/weapon/wirecutters) || istype(O, /obj/item/weapon/scalpel))
else if(waterlevel >= 100)
user << "\red \The [src] is already full."
else
user << "\red \The [O] is not filled with water."
if(!seed)
user << "There is nothing to take a sample from in \the [src]."
return
seed.harvest(user,yield_mod,1)
health -= (rand(1,5)*10)
check_level_sanity()
update_icon()
// Nutrient fluid replacement. TODO: Consider rolling this into a proper reagent-processing proc.
else if ( istype(O, /obj/item/nutrient) )
var/obj/item/nutrient/nutrient = O
user.u_equip(O)
nutrilevel = 10
yield_mod = nutrient.yieldmod
mutation_mod = nutrient.mutmod
user << "You replace the nutrient solution in the [src]."
del(O)
update_icon()
force_update = 1
process()
return
// Syringe stuff
else if(istype(O, /obj/item/weapon/reagent_containers/syringe))
var/obj/item/weapon/reagent_containers/syringe/S = O
if(seed)
// Injecting into the plant.
if (S.mode == 1)
if(!S.reagents.total_volume)
user << "\red [O] is empty."
return
user << "\red You inject the [seed.display_name] with a chemical solution."
// Uuuuuugh this whole chunk is going to be awful. TODO: condense it down somehow.
// Run through the various reagents in the lists and apply their effects as needed.
for(var/datum/reagent/R in S.reagents.reagent_list)
var/reagent_value = 0
if(toxic_reagents[R.id])
reagent_value = toxic_reagents[R.id]
if(reagent_value > 0)
if(reagent_value < 1)
toxins += reagent_value
else
toxins += round(S.reagents.get_reagent_amount(R.id)*rand(1,reagent_value))
else
if(reagent_value > -1)
toxins += reagent_value
else
toxins -= abs(round(S.reagents.get_reagent_amount(R.id)*rand(1,abs(reagent_value))))
if(nutrient_reagents[R.id])
reagent_value = nutrient_reagents[R.id]
if(reagent_value > 0)
if(reagent_value < 1)
nutrilevel += reagent_value
else
nutrilevel += round(S.reagents.get_reagent_amount(R.id)*rand(1,reagent_value))
else
if(reagent_value > -1)
nutrilevel += reagent_value
else
nutrilevel -= abs(round(S.reagents.get_reagent_amount(R.id)*rand(1,abs(reagent_value))))
if(weedkiller_reagents[R.id])
reagent_value = weedkiller_reagents[R.id]
if(reagent_value > 0)
if(reagent_value < 1)
weedlevel += reagent_value
else
weedlevel += round(S.reagents.get_reagent_amount(R.id)*rand(1,reagent_value))
else
if(reagent_value > -1)
weedlevel += reagent_value
else
weedlevel -= abs(round(S.reagents.get_reagent_amount(R.id)*rand(1,abs(reagent_value))))
if(pestkiller_reagents[R.id])
reagent_value = pestkiller_reagents[R.id]
if(reagent_value > 0)
if(reagent_value < 1)
pestlevel += reagent_value
else
pestlevel += round(S.reagents.get_reagent_amount(R.id)*rand(1,reagent_value))
else
if(reagent_value > -1)
pestlevel += reagent_value
else
pestlevel -= abs(round(S.reagents.get_reagent_amount(R.id)*rand(1,abs(reagent_value))))
if(beneficial_reagents[R.id])
reagent_value = beneficial_reagents[R.id]
if(reagent_value > 0)
if(reagent_value < 1)
health += reagent_value
else
health += round(S.reagents.get_reagent_amount(R.id)*rand(1,reagent_value))
else
if(reagent_value > -1)
health += reagent_value
else
health -= abs(round(S.reagents.get_reagent_amount(R.id)*rand(1,abs(reagent_value))))
if(water_reagents[R.id])
reagent_value = water_reagents[R.id]
if(reagent_value > 0)
if(reagent_value < 1)
waterlevel += reagent_value
else
waterlevel += round(S.reagents.get_reagent_amount(R.id)*rand(1,reagent_value))
else
if(reagent_value > -1)
waterlevel += reagent_value
else
waterlevel -= abs(round(S.reagents.get_reagent_amount(R.id)*rand(1,abs(reagent_value))))
// Mutagen is distinct from the previous types and mostly has a chance of proccing a mutation.
if(mutagenic_reagents[R.id])
var/reagent_total = S.reagents.get_reagent_amount(R.id)
reagent_value = mutagenic_reagents[R.id]+mutation_mod
if(reagent_total >= reagent_value)
if(prob(min(reagent_total*reagent_value,100)))
mutate(reagent_value > 10 ? 2 : 1)
S.reagents.clear_reagents()
if (S.mode == 1)
if(seed)
return ..()
else
user << "You can't get any extract out of this plant."
user << "There's no plant in the tray to inject."
return 1
else
user << "There's nothing to inject the solution into."
check_level_sanity()
update_icon()
if(seed)
//Leaving this in in case we want to extract from plants later.
user << "You can't get any extract out of this plant."
else
user << "There's nothing in the tray to draw something from."
return 1
else if (istype(O, /obj/item/seeds))
@@ -613,7 +599,9 @@
seed = S.seed //Grab the seed datum.
dead = 0
age = 1
health = seed.endurance
//Snowflakey, maybe move this to the seed datum
health = (istype(S, /obj/item/seeds/cutting) ? round(seed.endurance/rand(2,5)) : seed.endurance)
lastcycle = world.time
del(O)
@@ -622,7 +610,7 @@
update_icon()
else
user << "\red The [src] already has seeds in it!"
user << "\red \The [src] already has seeds in it!"
else if (istype(O, /obj/item/weapon/reagent_containers/spray/plantbgone))
if(seed)
@@ -733,7 +721,31 @@
usr << "[src] is \red filled with weeds!"
if(pestlevel >= 5)
usr << "[src] is \red filled with tiny worms!"
usr << text ("")
if(!istype(src,/obj/machinery/portable_atmospherics/hydroponics/soil))
var/turf/T = loc
var/datum/gas_mixture/environment
if(closed_system && (connected_port || holding))
environment = air_contents
if(!environment)
if(istype(T))
environment = T.return_air()
if(!environment) //We're in a crate or nullspace, bail out.
return
var/area/A = T.loc
var/light_available
if(A)
if(A.lighting_use_dynamic)
light_available = max(0,min(10,T.lighting_lumcount)-5)
else
light_available = 5
usr << "The tray's sensor suite is reporting a light level of [light_available] lumens and a temperature of [environment.temperature]K."
/obj/machinery/portable_atmospherics/hydroponics/verb/close_lid()
set name = "Toggle Tray Lid"
@@ -745,6 +757,11 @@
closed_system = !closed_system
usr << "You [closed_system ? "close" : "open"] the tray's lid."
if(closed_system)
flags &= ~OPENCONTAINER
else
flags |= OPENCONTAINER
update_icon()
/obj/machinery/portable_atmospherics/hydroponics/soil
+34 -27
View File
@@ -58,9 +58,9 @@ proc/populate_seed_list()
//Tolerances.
var/requires_nutrients = 1 // The plant can starve.
var/nutrient_consumption = 0.1 // Plant eats this much per tick.
var/nutrient_consumption = 0.25 // Plant eats this much per tick.
var/requires_water = 1 // The plant can become dehydrated.
var/water_consumption = 1 // Plant drinks this much per tick.
var/water_consumption = 3 // Plant drinks this much per tick.
var/ideal_heat = 293 // Preferred temperature in Kelvin.
var/heat_tolerance = 20 // Departure from ideal that is survivable.
var/ideal_light = 8 // Preferred light level in luminosity.
@@ -83,7 +83,7 @@ proc/populate_seed_list()
var/spread = 0 // 0 limits plant to tray, 1 = creepers, 2 = vines.
var/carnivorous = 0 // 0 = none, 1 = eat pests in tray, 2 = eat living things (when a vine).
var/parasite = 0 // 0 = no, 1 = gain health from weed level.
var/immutable // If set, plant will never mutate.
var/immutable = 0 // If set, plant will never mutate. If -1, plant is highly mutable.
var/alter_temp // If set, the plant will periodically alter local temp by this amount.
// Cosmetics.
@@ -99,14 +99,15 @@ proc/populate_seed_list()
//Returns a key corresponding to an entry in the global seed list.
/datum/seed/proc/get_mutant_variant()
if(!mutants || !mutants.len || immutable) return 0
if(!mutants || !mutants.len || immutable > 0) return 0
return pick(mutants)
//Mutates the plant overall (randomly).
/datum/seed/proc/mutate(var/degree,var/turf/source_turf)
if(!degree || immutable) return
source_turf.visible_message("[display_name] quivers uneasily!")
if(!degree || immutable > 0) return
source_turf.visible_message("\blue \The [display_name] quivers!")
//This looks like shit, but it's a lot easier to read/change this way.
var/total_mutations = rand(1,1+degree)
@@ -115,7 +116,7 @@ proc/populate_seed_list()
if(0) //Plant cancer!
lifespan = max(0,lifespan-rand(1,5))
endurance = max(0,endurance-rand(10,20))
source_turf.visible_message("[display_name] withers rapidly!")
source_turf.visible_message("\red \The [display_name] withers rapidly!")
if(1)
nutrient_consumption = max(0, min(5, nutrient_consumption + rand(-(degree*0.1),(degree*0.1))))
water_consumption = max(0, min(50, water_consumption + rand(-degree,degree)))
@@ -134,7 +135,7 @@ proc/populate_seed_list()
if(prob(degree*5))
carnivorous = max(0, min(2, carnivorous + rand(-degree,degree)))
if(carnivorous)
source_turf.visible_message("[display_name] shudders hungrily.")
source_turf.visible_message("\blue \The [display_name] shudders hungrily.")
if(6)
weed_tolerance = max(0, min(10, weed_tolerance + (rand(-2,2) * degree)))
if(prob(degree*5)) parasite = !parasite
@@ -148,7 +149,7 @@ proc/populate_seed_list()
potency = max(0, min(200, potency + (rand(-20,20) * degree)))
if(prob(degree*5))
spread = max(0, min(2, spread + rand(-1,1)))
source_turf.visible_message("[display_name] spasms visibly, shifting in the tray.")
source_turf.visible_message("\blue \The [display_name] spasms visibly, shifting in the tray.")
if(9)
maturation = max(0, min(30, maturation + (rand(-1,1) * degree)))
if(prob(degree*5))
@@ -157,28 +158,28 @@ proc/populate_seed_list()
if(prob(degree*2))
biolum = !biolum
if(biolum)
source_turf.visible_message("[display_name] begins to glow!")
source_turf.visible_message("\blue \The [display_name] begins to glow!")
if(prob(degree*2))
biolum_colour = "#[pick(list("FF0000","FF7F00","FFFF00","00FF00","0000FF","4B0082","8F00FF"))]"
source_turf.visible_message("[display_name]'s glow <font=[biolum_colour]>changes colour</font>!")
source_turf.visible_message("\blue \The [display_name]'s glow <font=[biolum_colour]>changes colour</font>!")
else
source_turf.visible_message("[display_name]'s glow dims...")
source_turf.visible_message("\blue \The [display_name]'s glow dims...")
if(11)
if(prob(degree*2))
flowers = !flowers
if(flowers)
source_turf.visible_message("[display_name] sprouts a bevy of flowers!")
source_turf.visible_message("\blue \The [display_name] sprouts a bevy of flowers!")
if(prob(degree*2))
flower_colour = "#[pick(list("FF0000","FF7F00","FFFF00","00FF00","0000FF","4B0082","8F00FF"))]"
source_turf.visible_message("[display_name]'s flowers <font=[flower_colour]>changes colour</font>!")
source_turf.visible_message("\blue \The [display_name]'s flowers <font=[flower_colour]>changes colour</font>!")
else
source_turf.visible_message("[display_name]'s flowers wither and fall off.")
source_turf.visible_message("\blue \The [display_name]'s flowers wither and fall off.")
return
//Mutates a specific trait/set of traits.
/datum/seed/proc/apply_gene(var/datum/plantgene/gene)
if(!gene || !gene.values || immutable) return
if(!gene || !gene.values || immutable > 0) return
switch(gene.genetype)
@@ -208,11 +209,12 @@ proc/populate_seed_list()
else
chems[rid] = gene.values[2][rid]
//TODO.
//if(!exude_gasses) exude_gasses = list()
//exude_gasses |= gene.values[3]
//for(var/gas in exude_gasses)
// exude_gasses[gas] = max(1,round(exude_gasses[gas]/2))
var/list/new_gasses = gene.values[3]
if(istype(new_gasses))
if(!exude_gasses) exude_gasses = list()
exude_gasses |= new_gasses
for(var/gas in exude_gasses)
exude_gasses[gas] = max(1,round(exude_gasses[gas]*0.8))
alter_temp = gene.values[4]
potency = gene.values[5]
@@ -343,11 +345,10 @@ proc/populate_seed_list()
return (P ? P : 0)
//Place the plant products at the feet of the user.
/datum/seed/proc/harvest(var/mob/user,var/yield_mod)
/datum/seed/proc/harvest(var/mob/user,var/yield_mod,var/harvest_sample)
if(!user)
return
//TODO: check for failing to harvest.
var/got_product
if(!isnull(products) && products.len && yield > 0)
got_product = 1
@@ -355,7 +356,7 @@ proc/populate_seed_list()
if(!got_product)
user << "\red You fail to harvest anything useful."
else
user << "You harvest from the [display_name]."
user << "You [harvest_sample ? "take a sample" : "harvest"] from the [display_name]."
//This may be a new line. Update the global if it is.
if(name == "new line" || !(name in seed_types))
@@ -363,12 +364,18 @@ proc/populate_seed_list()
name = "[uid]"
seed_types[name] = src
if(harvest_sample)
var/obj/item/seeds/seeds = new(get_turf(user))
seeds.seed_type = name
seeds.update_seed()
return
var/total_yield
if(isnull(yield_mod) || yield_mod < 1)
yield_mod = 0
total_yield = yield
else
total_yield = max(1,rand(1,((yield_mod+yield))))
total_yield = max(1,rand(yield_mod,yield_mod+yield))
currently_querying = list()
for(var/i = 0;i<total_yield;i++)
@@ -382,7 +389,6 @@ proc/populate_seed_list()
handle_living_product(product)
// Make sure the product is inheriting the correct seed type reference.
// TODO: can this be collapsed into one type check since they share vars?
else if(istype(product,/obj/item/weapon/reagent_containers/food/snacks/grown))
var/obj/item/weapon/reagent_containers/food/snacks/grown/current_product = product
current_product.plantname = name
@@ -396,7 +402,7 @@ proc/populate_seed_list()
// be put into the global datum list until the product is harvested, though.
/datum/seed/proc/diverge(var/modified)
if(immutable) return
if(immutable > 0) return
//Set up some basic information.
var/datum/seed/new_seed = new
@@ -1163,6 +1169,7 @@ proc/populate_seed_list()
yield = -1
potency = -1
growth_stages = 4
immutable = -1
/datum/seed/whitebeets
name = "whitebeet"
+18 -6
View File
@@ -3,9 +3,16 @@
desc = "A small disk used for carrying data on plant genetics."
icon = 'icons/obj/hydroponics.dmi'
icon_state = "disk"
w_class = 1.0
var/list/genes = list()
var/genesource = "unknown"
/obj/item/weapon/disk/botany/New()
..()
pixel_x = rand(-5,5)
pixel_y = rand(-5,5)
/obj/item/weapon/disk/botany/attack_self(var/mob/user as mob)
if(genes.len)
var/choice = alert(user, "Are you sure you want to wipe the disk?", "Xenobotany Data", "No", "Yes")
@@ -24,6 +31,7 @@
..()
for(var/i = 0;i<7;i++)
new /obj/item/weapon/disk/botany(src)
/obj/machinery/botany
icon = 'icons/obj/hydroponics.dmi'
icon_state = "hydrotray3"
@@ -77,16 +85,18 @@
/obj/machinery/botany/attackby(obj/item/weapon/W as obj, mob/user as mob)
if(istype(W,/obj/item/seeds))
if(seed)
if(seed.seed.immutable)
user << "That seed is not compatible with our genetics technology."
else
user << "There is already a seed loaded."
user << "There is already a seed loaded."
var/obj/item/seeds/S =W
if(S.seed && S.seed.immutable > 0)
user << "That seed is not compatible with our genetics technology."
else
user.drop_item(W)
W.loc = src
seed = W
user << "You load [W] into [src]."
return
if(istype(W,/obj/item/weapon/screwdriver))
open = !open
user << "\blue You [open ? "open" : "close"] the maintenance panel."
@@ -181,7 +191,7 @@
if(seed.seed.name == "new line" || isnull(seed_types[seed.seed.name]))
seed.seed.uid = seed_types.len + 1
seed.seed.name = "[uid]"
seed.seed.name = "[seed.seed.uid]"
seed_types[seed.seed.name] = seed.seed
seed.update_seed()
@@ -215,6 +225,8 @@
if(seed && seed.seed)
genetics = seed.seed
degradation = 0
del(seed)
seed = null
@@ -233,7 +245,7 @@
if(!genetics.roundstart)
loaded_disk.genesource += " (variety #[genetics.uid])"
loaded_disk.name += " ([gene_tag_masks[href_list["get_gene"]]])"
loaded_disk.name += " ([gene_tag_masks[href_list["get_gene"]]], #[genetics.uid])"
loaded_disk.desc += " The label reads \'gene [gene_tag_masks[href_list["get_gene"]]], sampled from [genetics.display_name]\'."
eject_disk = 1
+8
View File
@@ -32,6 +32,14 @@
if(seed && !seed.roundstart)
usr << "It's tagged as variety #[seed.uid]."
/obj/item/seeds/cutting
name = "cuttings"
desc = "Some plant cuttings."
/obj/item/seeds/cutting/update_appearance()
..()
src.name = "packet of [seed.seed_name] cuttings"
/obj/item/seeds/replicapod
seed_type = "diona"
+2 -2
View File
@@ -295,8 +295,8 @@
var/limited_growth = 0
/obj/effect/plant_controller/creeper
collapse_limit = 50
slowdown_limit = 5
collapse_limit = 6
slowdown_limit = 3
limited_growth = 1
/obj/effect/plant_controller/New()
+7 -5
View File
@@ -54,23 +54,25 @@
//Mob specific holders.
/obj/item/weapon/holder/diona
name = "diona nymph"
desc = "It's a tiny plant critter."
icon_state = "nymph"
origin_tech = "magnets=3;biotech=5"
/obj/item/weapon/holder/drone
name = "maintenance drone"
desc = "It's a small maintenance robot."
icon_state = "drone"
origin_tech = "magnets=3;engineering=5"
/obj/item/weapon/holder/cat
name = "cat"
desc = "It's a cat. Meow."
icon_state = "cat"
origin_tech = null
origin_tech = null
/obj/item/weapon/holder/borer
name = "cortical borer"
desc = "It's a slimy brain slug. Gross."
icon_state = "borer"
origin_tech = "biotech=6"
@@ -16,6 +16,7 @@ var/const/MAX_ACTIVE_TIME = 400
item_state = "facehugger"
w_class = 1 //note: can be picked up by aliens unlike most other items of w_class below 4
flags = FPRINT | TABLEPASS | MASKCOVERSMOUTH | MASKCOVERSEYES | MASKINTERNALS
body_parts_covered = FACE|EYES
throw_range = 5
var/stat = CONSCIOUS //UNCONSCIOUS is the idle state in this case
+6 -5
View File
@@ -1,6 +1,6 @@
/mob/living/carbon/Life()
..()
// Increase germ_level regularly
if(germ_level < GERM_LEVEL_AMBIENT && prob(30)) //if you're just standing there, you shouldn't get more germs beyond an ambient level
germ_level++
@@ -14,7 +14,7 @@
src.nutrition -= HUNGER_FACTOR/10
if((FAT in src.mutations) && src.m_intent == "run" && src.bodytemperature <= 360)
src.bodytemperature += 2
// Moving around increases germ_level faster
if(germ_level < GERM_LEVEL_MOVE_CAP && prob(8))
germ_level++
@@ -206,7 +206,7 @@
if (istype(src,/mob/living/carbon/human) && src:w_uniform)
var/mob/living/carbon/human/H = src
H.w_uniform.add_fingerprint(M)
if(lying)
src.sleeping = max(0,src.sleeping-5)
if(src.sleeping == 0)
@@ -216,7 +216,7 @@
else
M.visible_message("<span class='notice'>[M] hugs [src] to make [t_him] feel better!</span>", \
"<span class='notice'>You hug [src] to make [t_him] feel better!</span>")
AdjustParalysis(-3)
AdjustStunned(-3)
AdjustWeakened(-3)
@@ -470,9 +470,10 @@
return
if(B.chemicals >= 100)
src << "\red <B>Your host twitches and quivers as you rapdly excrete several larvae from your sluglike body.</B>"
src << "\red <B>Your host twitches and quivers as you rapidly excrete a larva from your sluglike body.</B>"
visible_message("\red <B>[src] heaves violently, expelling a rush of vomit and a wriggling, sluglike creature!</B>")
B.chemicals -= 100
B.has_reproduced = 1
new /obj/effect/decal/cleanable/vomit(get_turf(src))
playsound(loc, 'sound/effects/splat.ogg', 50, 1)
+35 -1
View File
@@ -584,4 +584,38 @@
set desc = "Sets an extended description of your character's features."
set category = "IC"
flavor_text = copytext(sanitize(input(usr, "Please enter your new flavour text.", "Flavour text", null) as text), 1)
var/HTML = "<body>"
HTML += "<tt><center>"
HTML += "<b>Update Flavour Text</b> <hr />"
HTML += "<br></center>"
HTML += "<a href='byond://?src=\ref[src];flavor_change=general'>General:</a> "
HTML += TextPreview(flavor_texts["general"])
HTML += "<br>"
HTML += "<a href='byond://?src=\ref[src];flavor_change=head'>Head:</a> "
HTML += TextPreview(flavor_texts["head"])
HTML += "<br>"
HTML += "<a href='byond://?src=\ref[src];flavor_change=face'>Face:</a> "
HTML += TextPreview(flavor_texts["face"])
HTML += "<br>"
HTML += "<a href='byond://?src=\ref[src];flavor_change=eyes'>Eyes:</a> "
HTML += TextPreview(flavor_texts["eyes"])
HTML += "<br>"
HTML += "<a href='byond://?src=\ref[src];flavor_change=torso'>Body:</a> "
HTML += TextPreview(flavor_texts["torso"])
HTML += "<br>"
HTML += "<a href='byond://?src=\ref[src];flavor_change=arms'>Arms:</a> "
HTML += TextPreview(flavor_texts["arms"])
HTML += "<br>"
HTML += "<a href='byond://?src=\ref[src];flavor_change=hands'>Hands:</a> "
HTML += TextPreview(flavor_texts["hands"])
HTML += "<br>"
HTML += "<a href='byond://?src=\ref[src];flavor_change=legs'>Legs:</a> "
HTML += TextPreview(flavor_texts["legs"])
HTML += "<br>"
HTML += "<a href='byond://?src=\ref[src];flavor_change=feet'>Feet:</a> "
HTML += TextPreview(flavor_texts["feet"])
HTML += "<br>"
HTML += "<hr />"
HTML +="<a href='?src=\ref[src];flavor_change=done'>\[Done\]</a>"
HTML += "<tt>"
src << browse(HTML, "window=flavor_changes;size=430x300")
@@ -827,6 +827,27 @@
if (href_list["lookmob"])
var/mob/M = locate(href_list["lookmob"])
M.examine()
if (href_list["flavor_change"])
switch(href_list["flavor_change"])
if("done")
src << browse(null, "window=flavor_changes")
return
if("general")
var/msg = input(usr,"Update the general description of your character. This will be shown regardless of clothing, and may include OOC notes and preferences.","Flavor Text",html_decode(flavor_texts[href_list["flavor_change"]])) as message
if(msg != null)
msg = copytext(msg, 1, MAX_MESSAGE_LEN)
msg = html_encode(msg)
flavor_texts[href_list["flavor_change"]] = msg
return
else
var/msg = input(usr,"Update the flavor text for your [href_list["flavor_change"]].","Flavor Text",html_decode(flavor_texts[href_list["flavor_change"]])) as message
if(msg != null)
msg = copytext(msg, 1, MAX_MESSAGE_LEN)
msg = html_encode(msg)
flavor_texts[href_list["flavor_change"]] = msg
set_flavor()
return
..()
return
@@ -1503,3 +1524,41 @@
return
H << "\red Your nose begins to bleed..."
H.drip(1)
/mob/living/carbon/human/print_flavor_text()
var/list/equipment = list(src.head,src.wear_mask,src.glasses,src.w_uniform,src.wear_suit,src.gloves,src.shoes)
var/head_exposed = 1
var/face_exposed = 1
var/eyes_exposed = 1
var/torso_exposed = 1
var/arms_exposed = 1
var/legs_exposed = 1
var/hands_exposed = 1
var/feet_exposed = 1
for(var/obj/item/clothing/C in equipment)
if(C.body_parts_covered & HEAD)
head_exposed = 0
if(C.body_parts_covered & FACE)
face_exposed = 0
if(C.body_parts_covered & EYES)
eyes_exposed = 0
if(C.body_parts_covered & UPPER_TORSO)
torso_exposed = 0
if(C.body_parts_covered & ARMS)
arms_exposed = 0
if(C.body_parts_covered & HANDS)
hands_exposed = 0
if(C.body_parts_covered & LEGS)
legs_exposed = 0
if(C.body_parts_covered & FEET)
feet_exposed = 0
flavor_text = flavor_texts["general"]
flavor_text += "\n\n"
for (var/T in flavor_texts)
if(flavor_texts[T] != "")
if((T == "head" && head_exposed) || (T == "face" && face_exposed) || (T == "eyes" && eyes_exposed) || (T == "torso" && torso_exposed) || (T == "arms" && arms_exposed) || (T == "hands" && hands_exposed) || (T == "legs" && legs_exposed) || (T == "feet" && feet_exposed))
flavor_text += flavor_texts[T]
flavor_text += "\n\n"
return ..()
@@ -259,13 +259,21 @@ This function restores all organs.
/mob/living/carbon/human/apply_damage(var/damage = 0, var/damagetype = BRUTE, var/def_zone = null, var/blocked = 0, var/sharp = 0, var/edge = 0, var/obj/used_weapon = null)
handle_suit_punctures(damagetype, damage)
//visible_message("Hit debug. [damage] | [damagetype] | [def_zone] | [blocked] | [sharp] | [used_weapon]")
//Handle other types of damage
if((damagetype != BRUTE) && (damagetype != BURN))
if(damagetype == HALLOSS)
if ((damage > 25 && prob(20)) || (damage > 50 && prob(60)))
emote("scream")
..(damage, damagetype, def_zone, blocked)
return 1
//Handle BRUTE and BURN damage
handle_suit_punctures(damagetype, damage)
if(blocked >= 2) return 0
var/datum/organ/external/organ = null
@@ -296,19 +304,4 @@ This function restores all organs.
// Will set our damageoverlay icon to the next level, which will then be set back to the normal level the next mob.Life().
updatehealth()
hud_updateflag |= 1 << HEALTH_HUD
//Embedded object code.
if(!organ) return
if(istype(used_weapon,/obj/item))
var/obj/item/W = used_weapon
if (!W.is_robot_module())
//blunt objects should really not be embedding in things unless a huge amount of force is involved
var/embed_chance = sharp? damage/W.w_class : damage/(W.w_class*3)
var/embed_threshold = sharp? 5*W.w_class : 15*W.w_class
//Sharp objects will always embed if they do enough damage.
//Thrown objects have some momentum already and have a small chance to embed even if the damage is below the threshold
if((sharp && damage > (10*W.w_class)) || (sharp && !ismob(W.loc) && prob(damage/(10*W.w_class)*100)) || (damage > embed_threshold && prob(embed_chance)))
organ.embed(W)
return 1
@@ -10,23 +10,14 @@ emp_act
/mob/living/carbon/human/bullet_act(var/obj/item/projectile/P, var/def_zone)
// BEGIN TASER NERF
/* Commenting out new-old taser nerf.
if(C.siemens_coefficient == 0) //If so, is that clothing shock proof?
if(prob(deflectchance))
visible_message("\red <B>The [P.name] gets deflected by [src]'s [C.name]!</B>") //DEFLECT!
visible_message("\red <B> Taser hit for [P.damage] damage!</B>")
del P
*/
/* Commenting out old Taser nerf
if(wear_suit && istype(wear_suit, /obj/item/clothing/suit/armor))
if(istype(P, /obj/item/projectile/energy/electrode))
visible_message("\red <B>The [P.name] gets deflected by [src]'s [wear_suit.name]!</B>")
del P
return -1
*/
// END TASER NERF
var/datum/organ/external/organ = get_organ(check_zone(def_zone))
//Shields
if(check_shields(P.damage, "the [P.name]"))
P.on_hit(src, 2, def_zone)
return 2
//Laserproof armour
if(wear_suit && istype(wear_suit, /obj/item/clothing/suit/armor/laserproof))
if(istype(P, /obj/item/projectile/energy) || istype(P, /obj/item/projectile/beam))
var/reflectchance = 40 - round(P.damage/3)
@@ -51,56 +42,45 @@ emp_act
return -1 // complete projectile permutation
//BEGIN BOOK'S TASER NERF.
if(istype(P, /obj/item/projectile/beam/stun))
var/datum/organ/external/select_area = get_organ(def_zone) // We're checking the outside, buddy!
var/list/body_parts = list(head, wear_mask, wear_suit, w_uniform, gloves, shoes) // What all are we checking?
// var/deflectchance=90 //Is it a CRITICAL HIT with that taser?
for(var/bp in body_parts) //Make an unregulated var to pass around.
if(!bp)
continue //Does this thing we're shooting even exist?
if(bp && istype(bp ,/obj/item/clothing)) // If it exists, and it's clothed
var/obj/item/clothing/C = bp // Then call an argument C to be that clothing!
if(C.body_parts_covered & select_area.body_part) // Is that body part being targeted covered?
P.agony=P.agony*C.siemens_coefficient
apply_effect(P.agony,AGONY,0)
flash_pain()
src <<"\red You have been shot!"
del P
var/obj/item/weapon/cloaking_device/C = locate((/obj/item/weapon/cloaking_device) in src)
if(C && C.active)
C.attack_self(src)//Should shut it off
update_icons()
src << "\blue Your [C.name] was disrupted!"
Stun(2)
if(istype(equipped(),/obj/item/device/assembly/signaler))
var/obj/item/device/assembly/signaler/signaler = equipped()
if(signaler.deadman && prob(80))
src.visible_message("\red [src] triggers their deadman's switch!")
signaler.signal()
return
//END TASER NERF
if(check_shields(P.damage, "the [P.name]"))
P.on_hit(src, 2, def_zone)
return 2
var/datum/organ/external/organ = get_organ(check_zone(def_zone))
var/armor = getarmor_organ(organ, "bullet")
if((P.embed && prob(20 + max(P.damage - armor, -10))) && P.damage_type == BRUTE)
var/obj/item/weapon/shard/shrapnel/SP = new()
(SP.name) = "[P.name] shrapnel"
(SP.desc) = "[SP.desc] It looks like it was fired from [P.shot_from]."
(SP.loc) = organ
organ.embed(SP)
//Shrapnel
if (P.damage_type == BRUTE)
var/armor = getarmor_organ(organ, "bullet")
if((P.embed && prob(20 + max(P.damage - armor, -10))))
var/obj/item/weapon/shard/shrapnel/SP = new()
(SP.name) = "[P.name] shrapnel"
(SP.desc) = "[SP.desc] It looks like it was fired from [P.shot_from]."
(SP.loc) = organ
organ.embed(SP)
return (..(P , def_zone))
/mob/living/carbon/human/stun_effect_act(var/stun_amount, var/agony_amount, var/def_zone)
var/datum/organ/external/affected = get_organ(check_zone(def_zone))
var/siemens_coeff = get_siemens_coefficient_organ(affected)
stun_amount *= siemens_coeff
agony_amount *= siemens_coeff
switch (def_zone)
if("head")
agony_amount *= 1.50
if("l_hand", "r_hand")
var/c_hand
if (def_zone == "l_hand")
c_hand = l_hand
else
c_hand = r_hand
if(c_hand && (stun_amount || agony_amount > 10))
msg_admin_attack("[src.name] ([src.ckey]) was disarmed by a stun effect")
u_equip(c_hand)
if (affected.status & ORGAN_ROBOT)
emote("me", 1, "drops what they were holding, their [affected.display_name] malfunctioning!")
else
var/emote_scream = pick("screams in pain and", "lets out a sharp cry and", "cries out and")
emote("me", 1, "[(species && species.flags & NO_PAIN) ? "" : emote_scream ] drops what they were holding in their [affected.display_name]!")
..(stun_amount, agony_amount, def_zone)
/mob/living/carbon/human/getarmor(var/def_zone, var/type)
var/armorval = 0
@@ -133,6 +113,20 @@ emp_act
protection += C.armor[type]
return protection
//this proc returns the Siemens coefficient of electrical resistivity for a particular external organ.
/mob/living/carbon/human/proc/get_siemens_coefficient_organ(var/datum/organ/external/def_zone)
if (!def_zone)
return 1.0
var/siemens_coefficient = 1.0
var/list/clothing_items = list(head, wear_mask, wear_suit, w_uniform, gloves, shoes) // What all are we checking?
for(var/obj/item/clothing/C in clothing_items)
if(istype(C) && (C.body_parts_covered & def_zone.body_part)) // Is that body part being targeted covered?
siemens_coefficient *= C.siemens_coefficient
return siemens_coefficient
/mob/living/carbon/human/proc/check_head_coverage()
var/list/body_parts = list(head, wear_mask, wear_suit, w_uniform)
@@ -186,10 +180,11 @@ emp_act
..()
//Returns 1 if the attack hit, 0 if it missed.
/mob/living/carbon/human/proc/attacked_by(var/obj/item/I, var/mob/living/user, var/def_zone)
if(!I || !user) return 0
var/target_zone = def_zone? def_zone : get_zone_with_miss_chance(user.zone_sel.selecting, src)
var/target_zone = def_zone? check_zone(def_zone) : get_zone_with_miss_chance(user.zone_sel.selecting, src)
if(user == src) // Attacking yourself can't miss
target_zone = user.zone_sel.selecting
@@ -280,6 +275,20 @@ emp_act
if(bloody)
bloody_body(src)
//Melee weapon embedded object code.
if (I.damtype == BRUTE && !I.is_robot_module())
var/damage = I.force
if (armor)
damage /= armor+1
//blunt objects should really not be embedding in things unless a huge amount of force is involved
var/embed_chance = weapon_sharp? damage/I.w_class : damage/(I.w_class*3)
var/embed_threshold = weapon_sharp? 5*I.w_class : 15*I.w_class
//Sharp objects will always embed if they do enough damage.
if((weapon_sharp && damage > (10*I.w_class)) || (damage > embed_threshold && prob(embed_chance)))
affecting.embed(I)
return 1
//this proc handles being hit by a thrown atom
@@ -333,6 +342,24 @@ emp_act
if(!istype(src,/mob/living/simple_animal/mouse))
msg_admin_attack("[src.name] ([src.ckey]) was hit by a [O], thrown by [M.name] ([assailant.ckey]) (<A HREF='?_src_=holder;adminplayerobservecoodjump=1;X=[src.x];Y=[src.y];Z=[src.z]'>JMP</a>)")
//thrown weapon embedded object code.
if(dtype == BRUTE && istype(O,/obj/item))
var/obj/item/I = O
if (!I.is_robot_module())
var/sharp = is_sharp(I)
var/damage = throw_damage
if (armor)
damage /= armor+1
//blunt objects should really not be embedding in things unless a huge amount of force is involved
var/embed_chance = sharp? damage/I.w_class : damage/(I.w_class*3)
var/embed_threshold = sharp? 5*I.w_class : 15*I.w_class
//Sharp objects will always embed if they do enough damage.
//Thrown sharp objects have some momentum already and have a small chance to embed even if the damage is below the threshold
if((sharp && prob(damage/(10*I.w_class)*100)) || (damage > embed_threshold && prob(embed_chance)))
affecting.embed(I)
// Begin BS12 momentum-transfer code.
if(O.throw_source && speed >= 15)
var/obj/item/weapon/W = O
@@ -353,6 +380,7 @@ emp_act
src.anchored = 1
src.pinned += O
/mob/living/carbon/human/proc/bloody_hands(var/mob/living/source, var/amount = 2)
if (gloves)
gloves.add_blood(source)
@@ -70,3 +70,5 @@
var/mob/remoteview_target = null
var/hand_blood_color
var/list/flavor_texts = list()
@@ -671,10 +671,20 @@ It can still be worn/put on as normal.
slot_to_process = slot_back
if (target.back)
strip_item = target.back
if("handcuff")
if("handcuff")
slot_to_process = slot_handcuffed
if (target.handcuffed)
strip_item = target.handcuffed
else
//check that we are still grabbing them
var/grabbing = 0
for (var/obj/item/weapon/grab/G in target.grabbed_by)
if (G.loc == source && G.state == GRAB_AGGRESSIVE)
grabbing = 1
if (!grabbing)
slot_to_process = null
source << "\red Your grasp was broken before you could restrain [target]!"
if("legcuff")
slot_to_process = slot_legcuffed
if (target.legcuffed)
@@ -251,7 +251,7 @@ proc/get_damage_icon_part(damage_state, body_part)
icon_key = "[icon_key]0"
else if(part.status & ORGAN_ROBOT)
icon_key = "[icon_key]2"
else if(part.status & ORGAN_DEAD) //Do we even have necrosis in our current code? ~Z
else if(part.status & ORGAN_DEAD)
icon_key = "[icon_key]3"
else
icon_key = "[icon_key]1"
@@ -274,6 +274,10 @@ proc/get_damage_icon_part(damage_state, body_part)
//No icon stored, so we need to start with a basic one.
var/datum/organ/external/chest = get_organ("chest")
base_icon = chest.get_icon(g)
if(chest.status & ORGAN_DEAD)
base_icon.ColorTone(necrosis_color_mod)
base_icon.SetIntensity(0.7)
for(var/datum/organ/external/part in organs)
-9
View File
@@ -202,15 +202,6 @@
return 0
/mob/living/proc/electrocute_act(var/shock_damage, var/obj/source, var/siemens_coeff = 1.0)
return 0 //only carbon liveforms have this proc
/mob/living/emp_act(severity)
var/list/L = src.get_contents()
for(var/obj/O in L)
O.emp_act(severity)
..()
/mob/living/proc/can_inject()
return 1
+36 -2
View File
@@ -38,6 +38,9 @@
/mob/living/bullet_act(var/obj/item/projectile/P, var/def_zone)
flash_weak_pain()
//Being hit while using a cloaking device
var/obj/item/weapon/cloaking_device/C = locate((/obj/item/weapon/cloaking_device) in src)
if(C && C.active)
C.attack_self(src)//Should shut it off
@@ -45,14 +48,21 @@
src << "\blue Your [C.name] was disrupted!"
Stun(2)
flash_weak_pain()
//Being hit while using a deadman switch
if(istype(equipped(),/obj/item/device/assembly/signaler))
var/obj/item/device/assembly/signaler/signaler = equipped()
if(signaler.deadman && prob(80))
src.visible_message("\red [src] triggers their deadman's switch!")
signaler.signal()
//Stun Beams
if(istype(P, /obj/item/projectile/beam/stun) || istype(P, /obj/item/projectile/bullet/stunshot))
stun_effect_act(0, P.agony, def_zone, P)
src <<"\red You have been hit by [P]!"
del P
return
//Armor
var/absorb = run_armor_check(def_zone, P.flag)
var/proj_sharp = is_sharp(P)
var/proj_edge = has_edge(P)
@@ -65,6 +75,30 @@
P.on_hit(src, absorb, def_zone)
return absorb
//Handles the effects of "stun" weapons
/mob/living/proc/stun_effect_act(var/stun_amount, var/agony_amount, var/def_zone, var/used_weapon=null)
flash_pain()
if (stun_amount)
Stun(stun_amount)
Weaken(stun_amount)
apply_effect(STUTTER, stun_amount)
apply_effect(EYE_BLUR, stun_amount)
if (agony_amount)
apply_damage(agony_amount, HALLOSS, def_zone, 0, used_weapon)
apply_effect(STUTTER, agony_amount/10)
apply_effect(EYE_BLUR, agony_amount/10)
/mob/living/proc/electrocute_act(var/shock_damage, var/obj/source, var/siemens_coeff = 1.0)
return 0 //only carbon liveforms have this proc
/mob/living/emp_act(severity)
var/list/L = src.get_contents()
for(var/obj/O in L)
O.emp_act(severity)
..()
//this proc handles being hit by a thrown atom
/mob/living/hitby(atom/movable/AM as mob|obj,var/speed = 5)//Standardization and logging -Sieve
if(istype(AM,/obj/))
+18 -6
View File
@@ -53,6 +53,20 @@ var/list/ai_list = list()
var/datum/trackable/track = null
var/last_announcement = ""
proc/add_ai_verbs(var/mob/M)
M.verbs += /mob/living/silicon/ai/proc/ai_call_shuttle
M.verbs += /mob/living/silicon/ai/proc/ai_camera_track
M.verbs += /mob/living/silicon/ai/proc/ai_camera_list
M.verbs += /mob/living/silicon/ai/proc/ai_goto_location
M.verbs += /mob/living/silicon/ai/proc/ai_remove_location
M.verbs += /mob/living/silicon/ai/proc/ai_hologram_change
M.verbs += /mob/living/silicon/ai/proc/ai_network_change
M.verbs += /mob/living/silicon/ai/proc/ai_roster
M.verbs += /mob/living/silicon/ai/proc/ai_statuschange
M.verbs += /mob/living/silicon/ai/proc/ai_store_location
M.verbs += /mob/living/silicon/ai/proc/control_integrated_radio
M.verbs += /mob/living/silicon/ai/proc/toggle_camera_light
/mob/living/silicon/ai/New(loc, var/datum/ai_laws/L, var/obj/item/device/mmi/B, var/safety = 0)
var/list/possibleNames = ai_names
@@ -91,12 +105,10 @@ var/list/ai_list = list()
aiMulti = new(src)
aiRadio = new(src)
aiRadio.myAi = src
aiCamera = new/obj/item/device/camera/siliconcam/ai_camera(src)
if (istype(loc, /turf))
verbs.Add(/mob/living/silicon/ai/proc/ai_call_shuttle,/mob/living/silicon/ai/proc/ai_camera_track, \
/mob/living/silicon/ai/proc/ai_camera_list, /mob/living/silicon/ai/proc/ai_network_change, \
/mob/living/silicon/ai/proc/ai_statuschange, /mob/living/silicon/ai/proc/ai_hologram_change, \
/mob/living/silicon/ai/proc/toggle_camera_light, /mob/living/silicon/ai/proc/control_integrateed_radio)
add_ai_verbs(src)
//Languages
add_language("Sol Common", 0)
@@ -749,11 +761,11 @@ var/list/ai_list = list()
else
return ..()
/mob/living/silicon/ai/proc/control_integrateed_radio()
/mob/living/silicon/ai/proc/control_integrated_radio()
set name = "Radio Settings"
set desc = "Allows you to change settings of your radio."
set category = "AI Commands"
src << "Accessing Subspace Transceiver control..."
if (src.aiRadio)
src.aiRadio.interact(src)
src.aiRadio.interact(src)
@@ -61,6 +61,13 @@
flavor_text = "It's a tiny little repair drone. The casing is stamped with an NT logo and the subscript: 'NanoTrasen Recursive Repair Systems: Fixing Tomorrow's Problem, Today!'"
updateicon()
/mob/living/silicon/robot/drone/init()
laws = new /datum/ai_laws/drone()
connected_ai = null
aiCamera = new/obj/item/device/camera/siliconcam/drone_camera(src)
playsound(src.loc, 'sound/machines/twobeep.ogg', 50, 0)
//Redefining some robot procs...
/mob/living/silicon/robot/drone/updatename()
real_name = "maintenance drone ([rand(100,999)])"
@@ -18,6 +18,7 @@
else
lawsync()
photosync()
src << "<b>Laws synced with AI, be sure to note any changes.</b>"
if(mind && mind.special_role == "traitor" && mind.original == src)
src << "<b>Remember, your AI does NOT share or know about your law 0."
@@ -0,0 +1,13 @@
/mob/living/silicon/robot/proc/photosync()
var/obj/item/device/camera/siliconcam/master_cam = connected_ai ? connected_ai.aiCamera : null
if (!master_cam)
return
var/synced
synced = 0
for(var/datum/picture/z in aiCamera.aipictures)
if (!(master_cam.aipictures.Find(z)))
aiCamera.printpicture(null, z)
synced = 1
if(synced)
src << "<span class='notice'>Locally saved images synced with AI. Images were retained in local database in case of loss of connection with the AI.</span>"
+14 -17
View File
@@ -88,18 +88,7 @@
hands.icon_state = "standard"
icon_state = "secborg"
modtype = "Security"
else if(istype(src,/mob/living/silicon/robot/drone))
laws = new /datum/ai_laws/drone()
connected_ai = null
else
laws = new /datum/ai_laws/nanotrasen()
connected_ai = select_active_ai_with_fewest_borgs()
if(connected_ai)
connected_ai.connected_robots += src
lawsync()
lawupdate = 1
else
lawupdate = 0
init()
radio = new /obj/item/device/radio/borg(src)
if(!scrambledcodes && !camera)
@@ -138,11 +127,19 @@
hud_list[IMPTRACK_HUD] = image('icons/mob/hud.dmi', src, "hudblank")
hud_list[SPECIALROLE_HUD] = image('icons/mob/hud.dmi', src, "hudblank")
if(istype(src,/mob/living/silicon/robot/drone))
playsound(src.loc, 'sound/machines/twobeep.ogg', 50, 0)
/mob/living/silicon/robot/proc/init()
aiCamera = new/obj/item/device/camera/siliconcam/robot_camera(src)
laws = new /datum/ai_laws/nanotrasen()
connected_ai = select_active_ai_with_fewest_borgs()
if(connected_ai)
connected_ai.connected_robots += src
lawsync()
photosync()
lawupdate = 1
else
playsound(loc, 'sound/voice/liveagain.ogg', 75, 1)
lawupdate = 0
playsound(loc, 'sound/voice/liveagain.ogg', 75, 1)
// setup the PDA and its name
/mob/living/silicon/robot/proc/setup_PDA()
@@ -345,7 +342,7 @@
// this verb lets cyborgs see the stations manifest
/mob/living/silicon/robot/verb/cmd_station_manifest()
set category = "Robot Commands"
set name = "Show Station Manifest"
set name = "Show Crew Manifest"
show_station_manifest()
@@ -239,7 +239,7 @@
src.modules += new /obj/item/device/flash(src)
src.modules += new /obj/item/borg/sight/hud/sec(src)
src.modules += new /obj/item/weapon/handcuffs/cyborg(src)
src.modules += new /obj/item/weapon/melee/baton/loaded(src)
src.modules += new /obj/item/weapon/melee/baton/robot(src)
src.modules += new /obj/item/weapon/gun/energy/taser/cyborg(src)
src.modules += new /obj/item/taperoll/police(src)
src.emag = new /obj/item/weapon/gun/energy/laser/cyborg(src)
@@ -74,6 +74,7 @@
if(BORG_WIRE_LAWCHECK) //Forces a law update if the borg is set to receive them. Since an update would happen when the borg checks its laws anyway, not much use, but eh
if (src.lawupdate)
src.lawsync()
src.photosync()
if (BORG_WIRE_AI_CONTROL) //pulse the AI wire to make the borg reselect an AI
if(!src.emagged)
@@ -13,6 +13,8 @@
var/speak_exclamation = "declares"
var/speak_query = "queries"
var/obj/item/device/camera/siliconcam/aiCamera = null //photography
/mob/living/silicon/proc/show_laws()
return
@@ -32,6 +34,9 @@
src << "\red Warning: Electromagnetic pulse detected."
..()
/mob/living/silicon/stun_effect_act(var/stun_amount, var/agony_amount)
return //immune
/mob/living/silicon/proc/damage_mob(var/brute = 0, var/fire = 0, var/tox = 0)
return
+16 -7
View File
@@ -1,6 +1,9 @@
/datum/game_mode/var/list/borers = list()
/mob/living/captive_brain
name = "host brain"
real_name = "host brain"
universal_understand = 1
/mob/living/captive_brain/say(var/message)
@@ -45,6 +48,8 @@
friendly = "prods"
wander = 0
pass_flags = PASSTABLE
universal_understand = 1
holder_type = /obj/item/weapon/holder/borer
var/used_dominate
var/chemicals = 10 // Chemicals used for reproduction and spitting neurotoxin.
@@ -53,6 +58,11 @@
var/mob/living/captive_brain/host_brain // Used for swapping control of the body back and forth.
var/controlling // Used in human death check.
var/docile = 0 // Sugar can stop borers from acting.
var/has_reproduced
var/roundstart
/mob/living/simple_animal/borer/roundstart
roundstart = 1
/mob/living/simple_animal/borer/Life()
@@ -96,9 +106,7 @@
..()
truename = "[pick("Primary","Secondary","Tertiary","Quaternary")] [rand(1000,9999)]"
host_brain = new/mob/living/captive_brain(src)
request_player()
if(!roundstart) request_player()
/mob/living/simple_animal/borer/say(var/message)
@@ -338,7 +346,7 @@
detatch()
mob/living/simple_animal/borer/proc/detatch()
/mob/living/simple_animal/borer/proc/detatch()
if(!host) return
@@ -530,7 +538,7 @@ mob/living/simple_animal/borer/proc/detatch()
src << text("\blue You have stopped hiding.")
//Procs for grabbing players.
mob/living/simple_animal/borer/proc/request_player()
/mob/living/simple_animal/borer/proc/request_player()
for(var/mob/dead/observer/O in player_list)
if(jobban_isbanned(O, "Syndicate"))
continue
@@ -538,7 +546,7 @@ mob/living/simple_animal/borer/proc/request_player()
if(O.client.prefs.be_special & BE_ALIEN)
question(O.client)
mob/living/simple_animal/borer/proc/question(var/client/C)
/mob/living/simple_animal/borer/proc/question(var/client/C)
spawn(0)
if(!C) return
var/response = alert(C, "A cortical borer needs a player. Are you interested?", "Cortical borer request", "Yes", "No", "Never for this round")
@@ -549,7 +557,7 @@ mob/living/simple_animal/borer/proc/question(var/client/C)
else if (response == "Never for this round")
C.prefs.be_special ^= BE_ALIEN
mob/living/simple_animal/borer/proc/transfer_personality(var/client/candidate)
/mob/living/simple_animal/borer/proc/transfer_personality(var/client/candidate)
if(!candidate)
return
@@ -558,3 +566,4 @@ mob/living/simple_animal/borer/proc/transfer_personality(var/client/candidate)
src.ckey = candidate.ckey
if(src.mind)
src.mind.assigned_role = "Cortical Borer"
src.mind.special_role = "Cortical Borer"
-11
View File
@@ -129,17 +129,6 @@ proc/hasorgans(A)
zone = "head"
if("mouth")
zone = "head"
/* if("l_hand")
zone = "l_arm"
if("r_hand")
zone = "r_arm"
if("l_foot")
zone = "l_leg"
if("r_foot")
zone = "r_leg"
if("groin")
zone = "chest"
*/
return zone
// Returns zone with a certain probability.
+1 -1
View File
@@ -436,7 +436,7 @@
proc/ViewManifest()
var/dat = "<html><body>"
dat += "<h4>Crew Manifest</h4>"
dat += "<h4>Show Crew Manifest</h4>"
dat += data_core.get_manifest(OOC = 1)
src << browse(dat, "window=manifest;size=370x420;can_close=1")
+1 -11
View File
@@ -120,17 +120,7 @@
O.show_laws()
O << "<b>These laws may be changed by other players, or by you being the traitor.</b>"
O.verbs += /mob/living/silicon/ai/proc/ai_call_shuttle
O.verbs += /mob/living/silicon/ai/proc/show_laws_verb
O.verbs += /mob/living/silicon/ai/proc/ai_camera_track
O.verbs += /mob/living/silicon/ai/proc/ai_alerts
O.verbs += /mob/living/silicon/ai/proc/ai_camera_list
O.verbs += /mob/living/silicon/ai/proc/ai_statuschange
O.verbs += /mob/living/silicon/ai/proc/ai_roster
O.verbs += /mob/living/silicon/ai/proc/ai_store_location
O.verbs += /mob/living/silicon/ai/proc/ai_goto_location
O.verbs += /mob/living/silicon/ai/proc/ai_remove_location
add_ai_verbs(O)
O.job = "AI"
O.rename_self("ai",1)
+3 -3
View File
@@ -159,9 +159,9 @@
src.damage += 0.2 * process_accuracy
//Damaged one shares the fun
else
var/victim = pick(owner.internal_organs)
var/datum/organ/internal/O = owner.internal_organs[victim]
O.damage += 0.2 * process_accuracy
var/datum/organ/internal/O = pick(owner.internal_organs)
if(O)
O.damage += 0.2 * process_accuracy
//Detox can heal small amounts of damage
if (src.damage && src.damage < src.min_bruised_damage && owner.reagents.has_reagent("anti_toxin"))
+23
View File
@@ -34,6 +34,8 @@
dat += "<a href='byond://?src=\ref[src];add=1'>+</a><BR><BR>"
else if(toner)
dat += "Please insert paper to copy.<BR><BR>"
if(istype(user,/mob/living/silicon))
dat += "<a href='byond://?src=\ref[src];aipic=1'>Print photo from database</a><BR><BR>"
dat += "Current toner level: [toner]"
if(!toner)
dat +="<BR>Please insert a new toner cartridge!"
@@ -112,6 +114,27 @@
if(copies < maxcopies)
copies++
updateUsrDialog()
else if(href_list["aipic"])
if(!istype(usr,/mob/living/silicon)) return
if(toner >= 5)
var/mob/living/silicon/tempAI = usr
var/obj/item/device/camera/siliconcam/camera = tempAI.aiCamera
if(!camera)
return
var/datum/picture/selection = camera.selectpicture()
if (!selection)
return
var/obj/item/weapon/photo/p = new /obj/item/weapon/photo (src.loc)
p.construct(selection)
if (p.desc == "")
p.desc += "Copied by [tempAI.name]"
else
p.desc += " - Copied by [tempAI.name]"
toner -= 5
sleep(15)
updateUsrDialog()
attackby(obj/item/O as obj, mob/user as mob)
if(istype(O, /obj/item/weapon/paper))
+112 -75
View File
@@ -53,10 +53,10 @@
/obj/item/weapon/photo/proc/show(mob/user as mob)
user << browse_rsc(img, "tmp_photo.png")
user << browse("<html><head><title>[name]</title></head>" \
+ "<body style='overflow:hidden'>" \
+ "<div> <img src='tmp_photo.png' width = '180'" \
+ "[scribble ? "<div> Written on the back:<br><i>[scribble]</i>" : ]"\
+ "</body></html>", "window=book;size=200x[scribble ? 400 : 200]")
+ "<body style='overflow:hidden;margin:0;text-align:center'>" \
+ "<img src='tmp_photo.png' width='192' style='-ms-interpolation-mode:nearest-neighbor' />" \
+ "[scribble ? "<br>Written on the back:<br><i>[scribble]</i>" : ""]"\
+ "</body></html>", "window=book;size=192x[scribble ? 400 : 192]")
onclose(user, "[name]")
return
@@ -152,41 +152,51 @@
..()
/obj/item/device/camera/proc/get_icon(turf/the_turf as turf)
/obj/item/device/camera/proc/get_icon(list/turfs, turf/center)
//Bigger icon base to capture those icons that were shifted to the next tile
//i.e. pretty much all wall-mounted machinery
var/icon/res = icon('icons/effects/96x96.dmi', "")
var/icon/turficon = build_composite_icon(the_turf)
res.Blend(turficon, ICON_OVERLAY, 33, 33)
// Initialize the photograph to black.
res.Blend("#000", ICON_OVERLAY)
var/atoms[] = list()
for(var/atom/A in the_turf)
if(A.invisibility) continue
atoms.Add(A)
for(var/turf/the_turf in turfs)
// Add outselves to the list of stuff to draw
atoms.Add(the_turf);
// As well as anything that isn't invisible.
for(var/atom/A in the_turf)
if(A.invisibility) continue
atoms.Add(A)
//Sorting icons based on levels
var/gap = atoms.len
var/swapped = 1
while (gap > 1 || swapped)
swapped = 0
if(gap > 1)
gap = round(gap / 1.247330950103979)
if(gap < 1)
gap = 1
for(var/i = 1; gap + i <= atoms.len; i++)
var/atom/l = atoms[i] //Fucking hate
var/atom/r = atoms[gap+i] //how lists work here
if(l.layer > r.layer) //no "atoms[i].layer" for me
atoms.Swap(i, gap + i)
swapped = 1
// Sort the atoms into their layers
var/list/sorted = sort_atoms_by_layer(atoms)
for(var/i; i <= atoms.len; i++)
var/atom/A = atoms[i]
for(var/i; i <= sorted.len; i++)
var/atom/A = sorted[i]
if(A)
var/icon/img = getFlatIcon(A, A.dir)//build_composite_icon(A)
var/icon/img = getFlatIcon(A)//build_composite_icon(A)
// If what we got back is actually a picture, draw it.
if(istype(img, /icon))
res.Blend(new/icon(img, "", A.dir), ICON_OVERLAY, 33 + A.pixel_x, 33 + A.pixel_y)
// Check if we're looking at a mob that's lying down
if(istype(A, /mob/living) && A:lying)
// If they are, apply that effect to their picture.
img.BecomeLying()
// Calculate where we are relative to the center of the photo
var/xoff = (A.x - center.x) * 32
var/yoff = (A.y - center.y) * 32
if (istype(A,/atom/movable))
xoff+=A:step_x
yoff+=A:step_y
res.Blend(img, blendMode2iconMode(A.blend_mode), 33 + A.pixel_x + xoff, 33 + A.pixel_y + yoff)
// Lastly, render any contained effects on top.
for(var/turf/the_turf in turfs)
// Calculate where we are relative to the center of the photo
var/xoff = (the_turf.x - center.x) * 32
var/yoff = (the_turf.y - center.y) * 32
res.Blend(getFlatIcon(the_turf.loc), blendMode2iconMode(the_turf.blend_mode),33 + xoff,33 + yoff)
return res
@@ -209,53 +219,10 @@
mob_detail += "You can also see [A] on the photo[A:health < 75 ? " - [A] looks hurt":""].[holding ? " [holding]":"."]."
return mob_detail
/obj/item/device/camera/afterattack(atom/target as mob|obj|turf|area, mob/user as mob, flag)
if(!on || !pictures_left || ismob(target.loc)) return
captureimage(target, user, flag)
var/x_c = target.x - 1
var/y_c = target.y + 1
var/z_c = target.z
var/icon/temp = icon('icons/effects/96x96.dmi',"")
var/icon/black = icon('icons/turf/space.dmi', "black")
var/mobs = ""
for(var/i = 1; i <= 3; i++)
for(var/j = 1; j <= 3; j++)
var/turf/T = locate(x_c, y_c, z_c)
var/mob/dummy = new(T) //Go go visibility check dummy
var/viewer = user
if(user.client) //To make shooting through security cameras possible
viewer = user.client.eye
if(dummy in viewers(world.view, viewer))
temp.Blend(get_icon(T), ICON_OVERLAY, 32 * (j-1-1), 32 - 32 * (i-1))
else
temp.Blend(black, ICON_OVERLAY, 32 * (j-1), 64 - 32 * (i-1))
mobs += get_mobs(T)
dummy.loc = null
dummy = null //Alas, nameless creature //garbage collect it instead
x_c++
y_c--
x_c = x_c - 3
var/obj/item/weapon/photo/P = new/obj/item/weapon/photo()
P.loc = user.loc
if(!user.get_inactive_hand())
user.put_in_inactive_hand(P)
var/icon/small_img = icon(temp)
var/icon/tiny_img = icon(temp)
var/icon/ic = icon('icons/obj/items.dmi',"photo")
var/icon/pc = icon('icons/obj/bureaucracy.dmi', "photo")
small_img.Scale(8, 8)
tiny_img.Scale(4, 4)
ic.Blend(small_img,ICON_OVERLAY, 10, 13)
pc.Blend(tiny_img,ICON_OVERLAY, 12, 19)
P.icon = ic
P.tiny = pc
P.img = temp
P.desc = mobs
P.pixel_x = rand(-10, 10)
P.pixel_y = rand(-10, 10)
playsound(loc, pick('sound/items/polaroid1.ogg', 'sound/items/polaroid2.ogg'), 75, 1, -3)
pictures_left--
@@ -265,4 +232,74 @@
on = 0
spawn(64)
icon_state = icon_on
on = 1
on = 1
/obj/item/device/camera/proc/can_capture_turf(turf/T, mob/user)
var/mob/dummy = new(T) //Go go visibility check dummy
var/viewer = user
if(user.client) //To make shooting through security cameras possible
viewer = user.client.eye
var/can_see = (dummy in viewers(world.view, viewer)) != null
dummy.loc = null
dummy = null //Alas, nameless creature //garbage collect it instead
return can_see
/obj/item/device/camera/proc/captureimage(atom/target, mob/user, flag)
var/x_c = target.x - 1
var/y_c = target.y + 1
var/z_c = target.z
var/list/turfs = list()
var/mobs = ""
for(var/i = 1; i <= 3; i++)
for(var/j = 1; j <= 3; j++)
var/turf/T = locate(x_c, y_c, z_c)
if(can_capture_turf(T, user))
turfs.Add(T)
mobs += get_mobs(T)
x_c++
y_c--
x_c = x_c - 3
var/datum/picture/P = createpicture(target, user, turfs, mobs, flag)
printpicture(user, P)
/obj/item/device/camera/proc/createpicture(atom/target, mob/user, list/turfs, mobs, flag)
var/icon/photoimage = get_icon(turfs, target)
var/icon/small_img = icon(photoimage)
var/icon/tiny_img = icon(photoimage)
var/icon/ic = icon('icons/obj/items.dmi',"photo")
var/icon/pc = icon('icons/obj/bureaucracy.dmi', "photo")
small_img.Scale(8, 8)
tiny_img.Scale(4, 4)
ic.Blend(small_img,ICON_OVERLAY, 10, 13)
pc.Blend(tiny_img,ICON_OVERLAY, 12, 19)
var/datum/picture/P = new()
P.fields["author"] = user
P.fields["icon"] = ic
P.fields["tiny"] = pc
P.fields["img"] = photoimage
P.fields["desc"] = mobs
P.fields["pixel_x"] = rand(-10, 10)
P.fields["pixel_y"] = rand(-10, 10)
return P
/obj/item/device/camera/proc/printpicture(mob/user, var/datum/picture/P)
var/obj/item/weapon/photo/Photo = new/obj/item/weapon/photo()
Photo.loc = user.loc
if(!user.get_inactive_hand())
user.put_in_inactive_hand(Photo)
Photo.construct(P)
/obj/item/weapon/photo/proc/construct(var/datum/picture/P)
icon = P.fields["icon"]
tiny = P.fields["tiny"]
img = P.fields["img"]
desc = P.fields["desc"]
pixel_x = P.fields["pixel_x"]
pixel_y = P.fields["pixel_y"]
@@ -0,0 +1,162 @@
/**************
* AI-specific *
**************/
/datum/picture
var/name = "image"
var/list/fields = list()
/obj/item/device/camera/siliconcam
var/in_camera_mode = 0
var/photos_taken = 0
var/list/aipictures = list()
/obj/item/device/camera/siliconcam/ai_camera //camera AI can take pictures with
name = "AI photo camera"
/obj/item/device/camera/siliconcam/robot_camera //camera cyborgs can take pictures with
name = "Cyborg photo camera"
/obj/item/device/camera/siliconcam/drone_camera //currently doesn't offer the verbs, thus cannot be used
name = "Drone photo camera"
/obj/item/device/camera/siliconcam/proc/injectaialbum(var/datum/picture/P, var/sufix = "") //stores image information to a list similar to that of the datacore
photos_taken++
P.fields["name"] = "Image [photos_taken][sufix]"
aipictures += P
/obj/item/device/camera/siliconcam/proc/injectmasteralbum(var/datum/picture/P) //stores image information to a list similar to that of the datacore
var/mob/living/silicon/robot/C = src.loc
if(C.connected_ai)
var/mob/A = P.fields["author"]
C.connected_ai.aiCamera.injectaialbum(P, " (taken by [A.name])")
C.connected_ai << "<span class='unconscious'>Image recorded and saved by [name]</span>"
usr << "<span class='unconscious'>Image recorded and saved to remote database</span>" //feedback to the Cyborg player that the picture was taken
else
injectaialbum(P)
usr << "<span class='unconscious'>Image recorded</span>"
/obj/item/device/camera/siliconcam/proc/selectpicture(obj/item/device/camera/siliconcam/cam)
if(!cam)
cam = getsource()
var/list/nametemp = list()
var/find
if(cam.aipictures.len == 0)
usr << "<span class='userdanger'>No images saved</span>"
return
for(var/datum/picture/t in cam.aipictures)
nametemp += t.fields["name"]
find = input("Select image (numbered in order taken)") in nametemp
for(var/datum/picture/q in cam.aipictures)
if(q.fields["name"] == find)
return q
/obj/item/device/camera/siliconcam/proc/viewpictures()
var/datum/picture/selection = selectpicture()
if(!selection)
return
var/obj/item/weapon/photo/P = new/obj/item/weapon/photo()
P.construct(selection)
P.show(usr)
usr << P.desc
// TG uses a special garbage collector.. qdel(P)
del(P) //so 10 thousand pictures items are not left in memory should an AI take them and then view them all.
/obj/item/device/camera/siliconcam/proc/deletepicture(obj/item/device/camera/siliconcam/cam)
var/datum/picture/selection = selectpicture(cam)
if(!selection)
return
cam.aipictures -= selection
usr << "<span class='unconscious'>Image deleted</span>"
/obj/item/device/camera/siliconcam/ai_camera/can_capture_turf(turf/T, mob/user)
var/mob/living/silicon/ai = user
return ai.TurfAdjacent(T)
/obj/item/device/camera/siliconcam/proc/toggle_camera_mode()
if(in_camera_mode)
camera_mode_off()
else
camera_mode_on()
/obj/item/device/camera/siliconcam/proc/camera_mode_off()
src.in_camera_mode = 0
usr << "<B>Camera Mode deactivated</B>"
/obj/item/device/camera/siliconcam/proc/camera_mode_on()
src.in_camera_mode = 1
usr << "<B>Camera Mode activated</B>"
/obj/item/device/camera/siliconcam/ai_camera/printpicture(mob/user, datum/picture/P)
injectaialbum(P)
usr << "<span class='unconscious'>Image recorded</span>"
/obj/item/device/camera/siliconcam/robot_camera/printpicture(mob/user, datum/picture/P)
injectmasteralbum(P)
/obj/item/device/camera/siliconcam/ai_camera/verb/take_image()
set category = "AI Commands"
set name = "Take Image"
set desc = "Takes an image"
set src in usr
toggle_camera_mode()
/obj/item/device/camera/siliconcam/ai_camera/verb/view_images()
set category = "AI Commands"
set name = "View Images"
set desc = "View images"
set src in usr
viewpictures()
/obj/item/device/camera/siliconcam/ai_camera/verb/delete_images()
set category = "AI Commands"
set name = "Delete Image"
set desc = "Delete image"
set src in usr
deletepicture()
/obj/item/device/camera/siliconcam/robot_camera/verb/take_image()
set category ="Robot Commands"
set name = "Take Image"
set desc = "Takes an image"
set src in usr
toggle_camera_mode()
/obj/item/device/camera/siliconcam/robot_camera/verb/view_images()
set category ="Robot Commands"
set name = "View Images"
set desc = "View images"
set src in usr
viewpictures()
/obj/item/device/camera/siliconcam/robot_camera/verb/delete_images()
set category = "Robot Commands"
set name = "Delete Image"
set desc = "Delete a local image"
set src in usr
// Explicitly only allow deletion from the local camera
deletepicture(src)
obj/item/device/camera/siliconcam/proc/getsource()
if(istype(src.loc, /mob/living/silicon/ai))
return src
var/mob/living/silicon/robot/C = src.loc
var/obj/item/device/camera/siliconcam/Cinfo
if(C.connected_ai)
Cinfo = C.connected_ai.aiCamera
else
Cinfo = src
return Cinfo
+39 -30
View File
@@ -91,42 +91,51 @@ obj/item/weapon/gun/energy/staff
var/charge_tick = 0
var/mode = 0 //0 = mutate, 1 = yield boost
New()
..()
processing_objects.Add(src)
/obj/item/weapon/gun/energy/floragun/New()
..()
processing_objects.Add(src)
/obj/item/weapon/gun/energy/floragun/Del()
processing_objects.Remove(src)
..()
Del()
processing_objects.Remove(src)
..()
/obj/item/weapon/gun/energy/floragun/process()
charge_tick++
if(charge_tick < 4) return 0
charge_tick = 0
if(!power_supply) return 0
power_supply.give(100)
update_icon()
return 1
/obj/item/weapon/gun/energy/floragun/attack_self(mob/living/user as mob)
switch(mode)
if(0)
mode = 1
charge_cost = 100
user << "\red The [src.name] is now set to increase yield."
projectile_type = "/obj/item/projectile/energy/florayield"
modifystate = "florayield"
if(1)
mode = 0
charge_cost = 100
user << "\red The [src.name] is now set to induce mutations."
projectile_type = "/obj/item/projectile/energy/floramut"
modifystate = "floramut"
update_icon()
return
process()
charge_tick++
if(charge_tick < 4) return 0
charge_tick = 0
if(!power_supply) return 0
power_supply.give(100)
update_icon()
return 1
/obj/item/weapon/gun/energy/floragun/afterattack(obj/target, mob/user, flag)
attack_self(mob/living/user as mob)
switch(mode)
if(0)
mode = 1
charge_cost = 100
user << "\red The [src.name] is now set to increase yield."
projectile_type = "/obj/item/projectile/energy/florayield"
modifystate = "florayield"
if(1)
mode = 0
charge_cost = 100
user << "\red The [src.name] is now set to induce mutations."
projectile_type = "/obj/item/projectile/energy/floramut"
modifystate = "floramut"
update_icon()
if(flag && istype(target,/obj/machinery/portable_atmospherics/hydroponics))
var/obj/machinery/portable_atmospherics/hydroponics/tray = target
if(load_into_chamber())
user.visible_message("\red <b> \The [user] fires \the [src] into \the [tray]!</b>")
Fire(target,user)
return
..()
/obj/item/weapon/gun/energy/meteorgun
name = "meteor gun"
desc = "For the love of god, make sure you're aiming this the right way!"
@@ -224,7 +233,7 @@ obj/item/weapon/gun/energy/staff/focus
/*
This is called from
This is called from
modules/mob/mob_movement.dm if you move you will be zoomed out
modules/mob/living/carbon/human/life.dm if you die, you will be zoomed out.
*/
@@ -1734,6 +1734,27 @@ datum
..()
return
//Reagents used for plant fertilizers.
toxin/fertilizer
name = "fertilizer"
id = "fertilizer"
description = "A chemical mix good for growing plants with."
reagent_state = LIQUID
toxpwr = 0.2 //It's not THAT poisonous.
color = "#664330" // rgb: 102, 67, 48
toxin/fertilizer/eznutrient
name = "EZ Nutrient"
id = "eznutrient"
toxin/fertilizer/left4zed
name = "Left-4-Zed"
id = "left4zed"
toxin/fertilizer/robustharvest
name = "Robust Harvest"
id = "robustharvest"
toxin/plantbgone
name = "Plant-B-Gone"
id = "plantbgone"
@@ -34,7 +34,7 @@
H << "\red You have a monitor for a head, where do you think you're going to put that?"
return
M << "\blue You swallow a gulp of [src]."
M << "\blue You swallow a gulp from \the [src]."
if(reagents.total_volume)
reagents.trans_to_ingest(M, gulp_size)
@@ -71,7 +71,7 @@
center_of_mass = list("x"=16, "y"=10)
if("tomatojuice")
icon_state = "glass_red"
name = "Glass of Tomato juf"
name = "Glass of Tomato juice"
desc = "Are you sure this is tomato juice?"
center_of_mass = list("x"=16, "y"=10)
if("blood")
@@ -40,7 +40,6 @@
/obj/machinery/sleeper,
/obj/machinery/smartfridge/,
/obj/machinery/biogenerator,
/obj/machinery/portable_atmospherics/hydroponics,
/obj/machinery/constructable_frame)
New()
@@ -108,6 +107,7 @@
user << "\blue You fill [src] with [trans] units of the contents of [target]."
else if(target.is_open_container() && target.reagents) //Something like a glass. Player probably wants to transfer TO it.
if(!reagents.total_volume)
user << "\red [src] is empty."
return
+16 -6
View File
@@ -10,7 +10,7 @@
standing_mob = 1
load_item_visible = 1
load_offset_x = 0
load_offset_y = 8
load_offset_y = 7
var/car_limit = 3 //how many cars an engine can pull before performance degrades
active_engines = 1
@@ -34,7 +34,7 @@
standing_mob = 1
load_item_visible = 1
load_offset_x = 0
load_offset_y = 5
load_offset_y = 4
//-------------------------------------------
// Standard procs
@@ -43,7 +43,10 @@
..()
cell = new /obj/item/weapon/cell/high
verbs -= /atom/movable/verb/pull
verbs -= /obj/vehicle/train/cargo/engine/verb/stop_engine
key = new()
var/image/I = new(icon = 'icons/obj/vehicles.dmi', icon_state = "cargo_engine_overlay", layer = src.layer + 0.2) //over mobs
overlays += I
/obj/vehicle/train/cargo/engine/Move()
if(on && cell.charge < power_use)
@@ -68,8 +71,8 @@
if(istype(W, /obj/item/weapon/key/cargo_train))
if(!key)
user.drop_item()
W.forceMove(src)
key = W
W.loc = src
verbs += /obj/vehicle/train/cargo/engine/verb/remove_key
return
..()
@@ -95,7 +98,7 @@
var/obj/machinery/door/D = Obstacle
var/mob/living/carbon/human/H = load
if(istype(D) && istype(H))
D.Bumped(H) //a little hacky, but hey, it works, and repects access rights
D.Bumped(H) //a little hacky, but hey, it works, and respects access rights
..()
@@ -192,6 +195,8 @@
turn_on()
if (on)
usr << "You start [src]'s engine."
verbs += /obj/vehicle/train/cargo/engine/verb/stop_engine
verbs -= /obj/vehicle/train/cargo/engine/verb/start_engine
else
if(cell.charge < power_use)
usr << "[src] is out of power."
@@ -213,6 +218,8 @@
turn_off()
if (!on)
usr << "You stop [src]'s engine."
verbs -= /obj/vehicle/train/cargo/engine/verb/stop_engine
verbs += /obj/vehicle/train/cargo/engine/verb/start_engine
/obj/vehicle/train/cargo/engine/verb/remove_key()
set name = "Remove key"
@@ -241,16 +248,19 @@
/obj/vehicle/train/cargo/trolley/load(var/atom/movable/C)
if(ismob(C) && !passenger_allowed)
return 0
if(!istype(C,/obj/machinery) && !istype(C,/obj/structure/closet) && !istype(C,/obj/structure/largecrate) && !istype(C,/obj/structure/reagent_dispensers) && !istype(C,/obj/structure/ore_box) && !ismob(C))
if(!istype(C,/obj/machinery) && !istype(C,/obj/structure/closet) && !istype(C,/obj/structure/largecrate) && !istype(C,/obj/structure/reagent_dispensers) && !istype(C,/obj/structure/ore_box) && !istype(C, /mob/living/carbon/human))
return 0
..()
if(istype(load, /mob/living/carbon/human))
load.pixel_y += 4
if(load)
return 1
/obj/vehicle/train/cargo/engine/load(var/atom/movable/C)
if(!ismob(C))
if(!istype(C, /mob/living/carbon/human))
return 0
return ..()
+3 -5
View File
@@ -68,8 +68,7 @@
if(user != load)
if(user in src) //for handling players stuck in src - this shouldn't happen - but just in case it does
user.loc = T
contents -= user
user.forceMove(T)
return 1
return 0
@@ -80,7 +79,7 @@
return 1
/obj/vehicle/train/MouseDrop_T(var/atom/movable/C, mob/user as mob)
if(user.buckled || user.stat || user.restrained() || !Adjacent(user) || !user.Adjacent(C))
if(user.buckled || user.stat || user.restrained() || !Adjacent(user) || !user.Adjacent(C) || !istype(C))
return
if(istype(C,/obj/vehicle/train))
latch(C, user)
@@ -93,8 +92,7 @@
return 0
if(user != load && (user in src))
user.loc = loc //for handling players stuck in src
contents -= user
user.forceMove(loc) //for handling players stuck in src
else if(load)
unload(user) //unload if loaded
else if(!load && !user.buckled)
+10 -8
View File
@@ -50,7 +50,7 @@
anchored = init_anc
if(load)
load.loc = loc
load.forceMove(loc)// = loc
load.dir = dir
return 1
@@ -58,6 +58,8 @@
return 0
/obj/vehicle/attackby(obj/item/weapon/W as obj, mob/user as mob)
if(istype(W, /obj/item/weapon/hand_labeler))
return
if(istype(W, /obj/item/weapon/screwdriver))
if(!locked)
open = !open
@@ -194,7 +196,7 @@
new /obj/item/weapon/cable_coil/cut(Tsec)
if(cell)
cell.loc = Tsec
cell.forceMove(Tsec)
cell.update_icon()
cell = null
@@ -232,8 +234,8 @@
return
H.drop_from_inventory(C)
C.forceMove(src)
cell = C
C.loc = null //this wont be GC'd since it's referrenced above
powercheck()
usr << "<span class='notice'>You install [C] in [src].</span>"
@@ -242,7 +244,8 @@
return
usr << "<span class='notice'>You remove [cell] from [src].</span>"
cell.loc = get_turf(H)
cell.forceMove(get_turf(H))
H.put_in_hands(cell)
cell = null
powercheck()
@@ -269,7 +272,7 @@
if(istype(crate))
crate.close()
C.loc = loc
C.forceMove(loc)
C.dir = dir
C.anchored = 1
@@ -308,7 +311,7 @@
var/list/options = new()
for(var/test_dir in alldirs)
var/new_dir = get_step_to(src, get_step(src, test_dir))
if(new_dir)
if(new_dir && load.Adjacent(new_dir))
options += new_dir
if(options.len)
dest = pick(options)
@@ -318,8 +321,7 @@
if(!isturf(dest)) //if there still is nowhere to unload, cancel out since the vehicle is probably in nullspace
return 0
load.loc = dest
load.forceMove(dest)
load.dir = get_dir(loc, dest)
load.anchored = initial(load.anchored)
load.pixel_x = initial(load.pixel_x)