diff --git a/SQL/paradise_schema.sql b/SQL/paradise_schema.sql
index c6045cd835e..22369d5470d 100644
--- a/SQL/paradise_schema.sql
+++ b/SQL/paradise_schema.sql
@@ -78,6 +78,7 @@ CREATE TABLE `characters` (
`rlimb_data` mediumtext NOT NULL,
`nanotrasen_relation` varchar(45) NOT NULL,
`speciesprefs` int(1) NOT NULL,
+ `socks` mediumtext NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=18747 DEFAULT CHARSET=utf8;
/*!40101 SET character_set_client = @saved_cs_client */;
diff --git a/code/__HELPERS/global_lists.dm b/code/__HELPERS/global_lists.dm
index c69742b94c8..a81a99c540b 100644
--- a/code/__HELPERS/global_lists.dm
+++ b/code/__HELPERS/global_lists.dm
@@ -12,6 +12,10 @@
init_sprite_accessory_subtypes(/datum/sprite_accessory/underwear, underwear_list, underwear_m, underwear_f)
//undershirt
init_sprite_accessory_subtypes(/datum/sprite_accessory/undershirt, undershirt_list, undershirt_m, undershirt_f)
+ //socks
+ init_sprite_accessory_subtypes(/datum/sprite_accessory/socks, socks_list, socks_m, socks_f)
+
+
var/list/paths
//Surgery Steps - Initialize all /datum/surgery_step into a list
diff --git a/code/__HELPERS/mobs.dm b/code/__HELPERS/mobs.dm
index 619716363f9..fe27e399c84 100644
--- a/code/__HELPERS/mobs.dm
+++ b/code/__HELPERS/mobs.dm
@@ -10,6 +10,12 @@
if(FEMALE) return pick(undershirt_f)
else return pick(undershirt_list)
+/proc/random_socks(gender)
+ switch(gender)
+ if(MALE) return pick(socks_m)
+ if(FEMALE) return pick(socks_f)
+ else return pick(socks_list)
+
proc/random_hair_style(var/gender, species = "Human")
var/h_style = "Bald"
diff --git a/code/_globalvars/lists/flavor_misc.dm b/code/_globalvars/lists/flavor_misc.dm
index 882331d21de..516ae5630f9 100644
--- a/code/_globalvars/lists/flavor_misc.dm
+++ b/code/_globalvars/lists/flavor_misc.dm
@@ -15,6 +15,10 @@ var/global/list/underwear_f = list() //stores only underwear name
var/global/list/undershirt_list = list() //stores /datum/sprite_accessory/undershirt indexed by name
var/global/list/undershirt_m = list() //stores only undershirt name
var/global/list/undershirt_f = list() //stores only undershirt name
+ //Socks
+var/global/list/socks_list = list() //stores /datum/sprite_accessory/socks indexed by name
+var/global/list/socks_m = list() //stores only socks name
+var/global/list/socks_f = list() //stores only socks name
//Backpacks
var/global/list/backbaglist = list("Nothing", "Backpack", "Satchel", "Satchel Alt")
diff --git a/code/game/machinery/vending.dm b/code/game/machinery/vending.dm
index 4cfdc0a6c29..1b3f89af28a 100644
--- a/code/game/machinery/vending.dm
+++ b/code/game/machinery/vending.dm
@@ -729,7 +729,7 @@
/obj/machinery/vending/assist
products = list( /obj/item/device/assembly/prox_sensor = 5,/obj/item/device/assembly/igniter = 3,/obj/item/device/assembly/signaler = 4,
/obj/item/weapon/wirecutters = 1, /obj/item/weapon/cartridge/signal = 4)
- contraband = list(/obj/item/device/flashlight = 5,/obj/item/device/assembly/timer = 2)
+ contraband = list(/obj/item/device/flashlight = 5,/obj/item/device/assembly/timer = 2, /obj/item/device/assembly/voice = 2, /obj/item/device/assembly/health = 2)
product_ads = "Only the finest!;Have some tools.;The most robust equipment.;The finest gear in space!"
/obj/machinery/vending/boozeomat/New()
@@ -887,6 +887,7 @@
products = list(/obj/item/clothing/under/rank/scientist = 6,/obj/item/clothing/suit/bio_suit = 6,/obj/item/clothing/head/bio_hood = 6,
/obj/item/device/transfer_valve = 6,/obj/item/device/assembly/timer = 6,/obj/item/device/assembly/signaler = 6,
/obj/item/device/assembly/prox_sensor = 6,/obj/item/device/assembly/igniter = 6)
+ contraband = list(/obj/item/device/assembly/health = 3)
/obj/machinery/vending/wallmed1
name = "NanoMed"
diff --git a/code/game/objects/items/weapons/implants/implant.dm b/code/game/objects/items/weapons/implants/implant.dm
index c964dd1e0b4..820a3311cff 100644
--- a/code/game/objects/items/weapons/implants/implant.dm
+++ b/code/game/objects/items/weapons/implants/implant.dm
@@ -4,6 +4,7 @@
name = "implant"
icon = 'icons/obj/device.dmi'
icon_state = "implant"
+ origin_tech = "materials=2;biotech=3;programming=2"
var/implanted = null
var/mob/living/imp_in = null
var/obj/item/organ/external/part = null
@@ -52,6 +53,7 @@
/obj/item/weapon/implant/tracking
name = "tracking"
desc = "Track with this."
+ origin_tech = "materials=2;magnets=2;programming=2;biotech=2"
var/id = 1.0
@@ -92,6 +94,7 @@ Implant Specifics:
"}
/obj/item/weapon/implant/dexplosive
name = "explosive"
desc = "And boom goes the weasel."
+ origin_tech = "materials=2;combat=3;biotech=4;syndicate=4"
icon_state = "implant_evil"
get_data()
@@ -127,6 +130,7 @@ Implant Specifics:
"}
/obj/item/weapon/implant/explosive
name = "explosive implant"
desc = "A military grade micro bio-explosive. Highly dangerous."
+ origin_tech = "materials=2;combat=3;biotech=4;syndicate=4"
var/elevel = "Localized Limb"
var/phrase = "supercalifragilisticexpialidocious"
icon_state = "implant_evil"
@@ -252,6 +256,7 @@ Implant Specifics:
"}
/obj/item/weapon/implant/chem
name = "chem"
desc = "Injects things."
+ origin_tech = "materials=3;biotech=4"
allow_reagents = 1
get_data()
@@ -316,6 +321,7 @@ the implant may become unstable and either pre-maturely inject the subject or si
/obj/item/weapon/implant/loyalty
name = "loyalty"
desc = "Makes you loyal or such."
+ origin_tech = "materials=2;biotech=4;programming=4"
get_data()
var/dat = {"
@@ -406,6 +412,7 @@ the implant may become unstable and either pre-maturely inject the subject or si
/obj/item/weapon/implant/adrenalin
name = "adrenalin"
desc = "Removes all stuns and knockdowns."
+ origin_tech = "materials=2;biotech=4;combat=3;syndicate=4"
var/uses = 3
get_data()
@@ -436,7 +443,7 @@ the implant may become unstable and either pre-maturely inject the subject or si
source.reagents.add_reagent("synaptizine", 10)
source.reagents.add_reagent("omnizine", 10)
- source.reagents.add_reagent("methamphetamine", 10)
+ source.reagents.add_reagent("stimulative_agent", 10)
return
@@ -523,6 +530,7 @@ the implant may become unstable and either pre-maturely inject the subject or si
name = "compressed matter implant"
desc = "Based on compressed matter technology, can store a single item."
icon_state = "implant_evil"
+ origin_tech = "materials=2;magnets=4;bluespace=4;syndicate=4"
var/activation_emote = "sigh"
var/obj/item/scanned = null
@@ -574,7 +582,7 @@ the implant may become unstable and either pre-maturely inject the subject or si
/obj/item/weapon/implant/emp
name = "emp implant"
desc = "Triggers an EMP."
-
+ origin_tech = "materials=2;biotech=3;magnets=4;syndicate=4"
var/activation_emote = "chuckle"
var/uses = 2
diff --git a/code/game/objects/items/weapons/implants/implantcase.dm b/code/game/objects/items/weapons/implants/implantcase.dm
index f4f9f3d2400..f32764ae410 100644
--- a/code/game/objects/items/weapons/implants/implantcase.dm
+++ b/code/game/objects/items/weapons/implants/implantcase.dm
@@ -8,7 +8,14 @@
throw_speed = 1
throw_range = 5
w_class = 1.0
+ origin_tech = "materials=1;biotech=2"
+ materials = list(MAT_GLASS=500)
var/obj/item/weapon/implant/imp = null
+
+ New()
+ ..()
+ update()
+
proc
update()
@@ -16,8 +23,10 @@
update()
if (src.imp)
src.icon_state = text("implantcase-[]", src.imp._color)
+ src.origin_tech = src.imp.origin_tech
else
src.icon_state = "implantcase-0"
+ src.origin_tech = initial(src.origin_tech)
return
@@ -148,4 +157,15 @@
New()
src.imp = new /obj/item/weapon/implant/freedom( src )
..()
+ return
+
+/obj/item/weapon/implantcase/adrenaline
+ name = "Glass Case- 'Adrenaline'"
+ desc = "A glass case containing an adrenaline implant."
+ icon = 'icons/obj/items.dmi'
+ icon_state = "implantcase-b"
+
+ New()
+ src.imp = new /obj/item/weapon/implant/adrenalin( src )
+ ..()
return
\ No newline at end of file
diff --git a/code/game/objects/items/weapons/implants/implanter.dm b/code/game/objects/items/weapons/implants/implanter.dm
index 423ab379253..f0cad339826 100644
--- a/code/game/objects/items/weapons/implants/implanter.dm
+++ b/code/game/objects/items/weapons/implants/implanter.dm
@@ -6,16 +6,23 @@
throw_speed = 1
throw_range = 5
w_class = 2.0
+ origin_tech = "materials=1;biotech=3;programming=2"
var/obj/item/weapon/implant/imp = null
+/obj/item/weapon/implanter/New()
+ ..()
+ update()
+
/obj/item/weapon/implanter/proc/update()
/obj/item/weapon/implanter/update()
if (src.imp)
src.icon_state = "implanter1"
+ src.origin_tech = src.imp.origin_tech
else
src.icon_state = "implanter0"
+ src.origin_tech = initial(src.origin_tech)
return
diff --git a/code/game/objects/items/weapons/implants/implantfreedom.dm b/code/game/objects/items/weapons/implants/implantfreedom.dm
index 9b225ac70fc..68497e500b7 100644
--- a/code/game/objects/items/weapons/implants/implantfreedom.dm
+++ b/code/game/objects/items/weapons/implants/implantfreedom.dm
@@ -5,12 +5,12 @@
desc = "Use this to escape from those evil Red Shirts."
_color = "r"
var/activation_emote = "chuckle"
- var/uses = 1.0
+ origin_tech = "materials=2;magnets=3;biotech=3;syndicate=4"
+ var/uses = 4
New()
src.activation_emote = pick("blink", "blink_r", "eyebrow", "chuckle", "twitch_s", "frown", "nod", "blush", "giggle", "grin", "groan", "shrug", "smile", "pale", "sniff", "whimper", "wink")
- src.uses = rand(1, 5)
..()
return
diff --git a/code/game/objects/items/weapons/implants/implantuplink.dm b/code/game/objects/items/weapons/implants/implantuplink.dm
index 05b50b49b03..6e7fac76a6c 100644
--- a/code/game/objects/items/weapons/implants/implantuplink.dm
+++ b/code/game/objects/items/weapons/implants/implantuplink.dm
@@ -1,6 +1,7 @@
/obj/item/weapon/implant/uplink
name = "uplink"
desc = "Summon things."
+ origin_tech = "materials=2;magnets=4;programming=4;biotech=4;syndicate=8;bluespace=5"
var/activation_emote = "chuckle"
/obj/item/weapon/implant/uplink/New()
diff --git a/code/game/objects/structures/dresser.dm b/code/game/objects/structures/dresser.dm
index 10898e80a47..f1eca747755 100644
--- a/code/game/objects/structures/dresser.dm
+++ b/code/game/objects/structures/dresser.dm
@@ -12,7 +12,7 @@
if(ishuman(user))
var/mob/living/carbon/human/H = user
- var/choice = input(user, "Underwear or Undershirt?", "Changing") as null|anything in list("Underwear","Undershirt")
+ var/choice = input(user, "Underwear, Undershirt, or Socks?", "Changing") as null|anything in list("Underwear","Undershirt","Socks")
if(!Adjacent(user))
return
@@ -27,5 +27,11 @@
if(new_undershirt)
H.undershirt = new_undershirt
+ if("Socks")
+ var/new_socks = input(user, "Select your socks", "Changing") as null|anything in socks_list
+ if(new_socks)
+ H.socks= new_socks
+
+
add_fingerprint(H)
H.update_body()
\ No newline at end of file
diff --git a/code/modules/assembly/health.dm b/code/modules/assembly/health.dm
new file mode 100644
index 00000000000..f1a3f402336
--- /dev/null
+++ b/code/modules/assembly/health.dm
@@ -0,0 +1,104 @@
+/obj/item/device/assembly/health
+ name = "health sensor"
+ desc = "Used for scanning and monitoring health."
+ icon_state = "health"
+ materials = list(MAT_METAL=800, MAT_GLASS=200)
+ origin_tech = "magnets=1;biotech=1"
+ secured = 0
+
+ var/scanning = 0
+ var/health_scan
+ var/alarm_health = 0
+
+
+
+/obj/item/device/assembly/health/activate()
+ if(!..()) return 0//Cooldown check
+ toggle_scan()
+ return 0
+
+/obj/item/device/assembly/health/toggle_secure()
+ secured = !secured
+ if(secured && scanning)
+ processing_objects.Add(src)
+ else
+ scanning = 0
+ processing_objects.Remove(src)
+ update_icon()
+ return secured
+
+/obj/item/device/assembly/health/attackby(obj/item/weapon/W as obj, mob/user as mob)
+ if(istype(W, /obj/item/device/multitool))
+ if(alarm_health == 0)
+ alarm_health = -90
+ user.show_message("You toggle [src] to \"detect death\" mode.")
+ else
+ alarm_health = 0
+ user.show_message("You toggle [src] to \"detect critical state\" mode.")
+ return
+ else
+ return ..()
+
+/obj/item/device/assembly/health/process()
+ if(!scanning || !secured)
+ return
+
+ var/atom/A = src
+ if(connected && connected.holder)
+ A = connected.holder
+
+ for(A, A && !ismob(A), A=A.loc);
+ // like get_turf(), but for mobs.
+ var/mob/living/M = A
+
+ if(M)
+ health_scan = M.health
+ if(health_scan <= alarm_health)
+ pulse()
+ audible_message("\icon[src] *beep* *beep*", "*beep* *beep*")
+ toggle_scan()
+ return
+ return
+
+/obj/item/device/assembly/health/proc/toggle_scan()
+ if(!secured) return 0
+ scanning = !scanning
+ if(scanning)
+ processing_objects.Add(src)
+ else
+ processing_objects.Remove(src)
+ return
+
+/obj/item/device/assembly/health/interact(mob/user as mob)//TODO: Change this to the wires thingy
+ if(!secured)
+ user.show_message("The [name] is unsecured!")
+ return 0
+ var/dat = text("Health Sensor [scanning?"On":"Off"]")
+ if(scanning && health_scan)
+ dat += "
Health: [health_scan]"
+ user << browse(dat, "window=hscan")
+ onclose(user, "hscan")
+ return
+
+
+/obj/item/device/assembly/health/Topic(href, href_list)
+ ..()
+ if(!ismob(usr))
+ return
+
+ var/mob/user = usr
+
+ if(!usr.canmove || usr.stat || usr.restrained() || !in_range(loc, usr))
+ usr << browse(null, "window=hscan")
+ onclose(usr, "hscan")
+ return
+
+ if(href_list["scanning"])
+ toggle_scan()
+
+ if(href_list["close"])
+ usr << browse(null, "window=hscan")
+ return
+
+ attack_self(user)
+ return
\ No newline at end of file
diff --git a/code/modules/client/preferences.dm b/code/modules/client/preferences.dm
index 338d57dd616..f49dd1d1bb4 100644
--- a/code/modules/client/preferences.dm
+++ b/code/modules/client/preferences.dm
@@ -108,6 +108,7 @@ datum/preferences
var/b_type = "A+" //blood type (not-chooseable)
var/underwear = "Nude" //underwear type
var/undershirt = "Nude" //undershirt type
+ var/socks = "Nude" //socks type
var/backbag = 2 //backpack type
var/h_style = "Bald" //Hair type
var/r_hair = 0 //Hair color
@@ -331,6 +332,7 @@ datum/preferences
dat += "
"
dat += "Underwear:
[underwear]
"
dat += "Undershirt:
[undershirt]
"
+ dat += "Socks:
[socks]
"
dat += "Backpack Type:
[backbaglist[backbag]]
"
dat += "Nanotrasen Relation:
[nanotrasen_relation]
"
dat += "Preview
  | "
@@ -1010,6 +1012,9 @@ datum/preferences
if("undershirt")
undershirt = random_undershirt(gender)
ShowChoices(user)
+ if("socks")
+ socks = random_socks(gender)
+ ShowChoices(user)
if("eyes")
r_eyes = rand(0,255)
g_eyes = rand(0,255)
@@ -1210,6 +1215,22 @@ datum/preferences
undershirt = new_undershirt
ShowChoices(user)
+ if("socks")
+ var/list/valid_sockstyles = list()
+ for(var/sockstyle in socks_list)
+ var/datum/sprite_accessory/S = socks_list[sockstyle]
+ if(gender == MALE && S.gender == FEMALE)
+ continue
+ if(gender == FEMALE && S.gender == MALE)
+ continue
+ if( !(species in S.species_allowed))
+ continue
+ valid_sockstyles[sockstyle] = socks_list[sockstyle]
+ var/new_socks = input(user, "Choose your character's socks:", "Character Preference") as null|anything in valid_sockstyles
+ ShowChoices(user)
+ if(new_socks)
+ socks = new_socks
+
if("eyes")
var/new_eyes = input(user, "Choose your character's eye colour:", "Character Preference") as color|null
if(new_eyes)
@@ -1548,6 +1569,7 @@ datum/preferences
character.underwear = underwear
character.undershirt = undershirt
+ character.socks = socks
if(backbag > 4 || backbag < 1)
backbag = 1 //Same as above
diff --git a/code/modules/client/preferences_mysql.dm b/code/modules/client/preferences_mysql.dm
index 96e51448c6d..8470ece80a9 100644
--- a/code/modules/client/preferences_mysql.dm
+++ b/code/modules/client/preferences_mysql.dm
@@ -149,6 +149,9 @@
nanotrasen_relation = query.item[52]
speciesprefs = text2num(query.item[53])
+ //socks
+ socks = query.item[54]
+
//Sanitize
metadata = sanitize_text(metadata, initial(metadata))
real_name = reject_bad_name(real_name)
@@ -196,6 +199,9 @@
disabilities = sanitize_integer(disabilities, 0, 65535, initial(disabilities))
be_special = sanitize_integer(be_special, 0, 65535, initial(be_special))
+ socks = sanitize_text(socks, initial(socks))
+
+
// if(isnull(disabilities)) disabilities = 0
if(!player_alt_titles) player_alt_titles = new()
if(!organ_data) src.organ_data = list()
@@ -267,7 +273,8 @@
organ_data='[organlist]',
rlimb_data='[rlimblist]',
nanotrasen_relation='[nanotrasen_relation]',
- speciesprefs='[speciesprefs]'
+ speciesprefs='[speciesprefs]',
+ socks='[socks]'
WHERE ckey='[C.ckey]'
AND slot='[default_slot]'"}
)
@@ -295,7 +302,7 @@
job_karma_high, job_karma_med, job_karma_low,
flavor_text, med_record, sec_record, gen_record,
player_alt_titles, be_special,
- disabilities, organ_data, rlimb_data, nanotrasen_relation, speciesprefs)
+ disabilities, organ_data, rlimb_data, nanotrasen_relation, speciesprefs, socks)
VALUES
('[C.ckey]', '[default_slot]', '[sql_sanitize_text(metadata)]', '[sql_sanitize_text(real_name)]', '[be_random_name]','[gender]',
'[age]', '[sql_sanitize_text(species)]', '[sql_sanitize_text(language)]',
@@ -312,7 +319,7 @@
'[job_karma_high]', '[job_karma_med]', '[job_karma_low]',
'[sql_sanitize_text(flavor_text)]', '[sql_sanitize_text(med_record)]', '[sql_sanitize_text(sec_record)]', '[sql_sanitize_text(gen_record)]',
'[playertitlelist]', '[be_special]',
- '[disabilities]', '[organlist]', '[rlimblist]', '[nanotrasen_relation]', '[speciesprefs]')
+ '[disabilities]', '[organlist]', '[rlimblist]', '[nanotrasen_relation]', '[speciesprefs]','[socks]')
"}
)
diff --git a/code/modules/client/preferences_savefile.dm b/code/modules/client/preferences_savefile.dm
index 8e1c0e12964..f1dd7b307f3 100644
--- a/code/modules/client/preferences_savefile.dm
+++ b/code/modules/client/preferences_savefile.dm
@@ -141,6 +141,7 @@
S["eyes_blue"] >> b_eyes
S["underwear"] >> underwear
S["undershirt"] >> undershirt
+ S["socks"] >> socks
S["backbag"] >> backbag
S["b_type"] >> b_type
S["accent"] >> accent
@@ -203,6 +204,7 @@
b_eyes = sanitize_integer(b_eyes, 0, 255, initial(b_eyes))
underwear = sanitize_integer(underwear, 1, underwear_m.len, initial(underwear))
undershirt = sanitize_integer(undershirt, 1, undershirt_t.len, initial(undershirt))
+ socks = sanitize_integer(socks,1 socks_t.len, initial(socks))
backbag = sanitize_integer(backbag, 1, backbaglist.len, initial(backbag))
b_type = sanitize_text(b_type, initial(b_type))
accent = sanitize_text(accent, initial(accent))
diff --git a/code/modules/mob/living/carbon/human/human.dm b/code/modules/mob/living/carbon/human/human.dm
index a63f487aec7..b5e637fa546 100644
--- a/code/modules/mob/living/carbon/human/human.dm
+++ b/code/modules/mob/living/carbon/human/human.dm
@@ -244,6 +244,8 @@
stat(null, eta_status)
if (client.statpanel == "Status")
+ if(locate(/obj/item/device/assembly/health) in src)
+ stat(null, "Health: [health]")
if (internal)
if (!internal.air_contents)
qdel(internal)
@@ -431,7 +433,7 @@
var/armor_block = run_armor_check(affecting, "melee")
apply_damage(damage, BRUTE, affecting, armor_block)
-/mob/living/carbon/human/proc/is_loyalty_implanted()
+/mob/living/carbon/human/proc/is_loyalty_implanted()
for(var/L in contents)
if(istype(L, /obj/item/weapon/implant/loyalty))
for(var/obj/item/organ/external/O in organs)
@@ -694,7 +696,7 @@
// if looting pockets with gloves, do it quietly
if(href_list["pockets"])
- if(isanimal(usr))
+ if(isanimal(usr))
return //animals cannot strip people
if(frozen)
@@ -726,19 +728,19 @@
// Update strip window
if(usr.machine == src && in_range(src, usr))
show_inv(usr)
-
+
else if(!pickpocket)
// Display a warning if the user mocks up
src << "You feel your [pocket_side] pocket being fumbled with!"
// if looting id with gloves, do it quietly - this allows pickpocket gloves to take/place id stealthily - Bone White
if(href_list["item"])
- if(isanimal(usr))
+ if(isanimal(usr))
return //animals cannot strip people
-
+
if(frozen)
usr << "\red Do not attempt to strip frozen people."
- return
+ return
var/itemTarget = href_list["item"]
if(itemTarget == "id")
if(pickpocket)
@@ -1158,7 +1160,7 @@
if(!fail_msg)
fail_msg = "There is no exposed flesh or thin material [target_zone == "head" ? "on their head" : "on their body"] to inject into."
user << "[fail_msg]"
-
+
/mob/living/carbon/human/proc/check_has_mouth()
// Todo, check stomach organ when implemented.
var/obj/item/organ/external/head/H = get_organ("head")
@@ -1170,7 +1172,7 @@
if(stat==DEAD)return
if(!check_has_mouth())
- return
+ return
if(!lastpuke)
lastpuke = 1
@@ -1517,16 +1519,16 @@
W.add_fingerprint(src)
-// Allows IPC's to change their monitor display
+// Allows IPC's to change their monitor display
/mob/living/carbon/human/proc/change_monitor()
- set category = "IC"
+ set category = "IC"
set name = "Change Monitor Display"
set desc = "Change the display on your monitor."
-
+
if(stat || paralysis || stunned || weakened)
src << "You cannot change your monitor display in your current state."
- return
-
+ return
+
var/list/hair = list()
for(var/i in hair_styles_list)
var/datum/sprite_accessory/hair/tmp_hair = hair_styles_list[i]
@@ -1540,7 +1542,7 @@
h_style = new_style
update_hair()
-
+
//Putting a couple of procs here that I don't know where else to dump.
//Mostly going to be used for Vox and Vox Armalis, but other human mobs might like them (for adminbuse).
/mob/living/carbon/human/proc/leap()
diff --git a/code/modules/mob/living/carbon/human/human_defines.dm b/code/modules/mob/living/carbon/human/human_defines.dm
index bc10d54b1c8..7d7d400c9c3 100644
--- a/code/modules/mob/living/carbon/human/human_defines.dm
+++ b/code/modules/mob/living/carbon/human/human_defines.dm
@@ -30,7 +30,8 @@
var/b_type = "A+" //Player's bloodtype
var/underwear = "Nude" //Which underwear the player wants
- var/undershirt = "Nude" //Which undershirt the player wants.
+ var/undershirt = "Nude" //Which undershirt the player wants
+ var/socks = "Nude" //Which socks the player wants
var/backbag = 2 //Which backpack type the player has chosen. Nothing, Satchel or Backpack.
//Equipment slots
diff --git a/code/modules/mob/living/carbon/human/life.dm b/code/modules/mob/living/carbon/human/life.dm
index 82f09f0f489..875a3a85260 100644
--- a/code/modules/mob/living/carbon/human/life.dm
+++ b/code/modules/mob/living/carbon/human/life.dm
@@ -64,6 +64,7 @@ var/global/list/brutefireloss_overlays = list("1" = image("icon" = 'icons/mob/sc
life_tick++
var/datum/gas_mixture/environment = loc.return_air()
+ in_stasis = 0
if(istype(loc, /obj/structure/closet/body_bag/cryobag))
var/obj/structure/closet/body_bag/cryobag/loc_as_cryobag = loc
if(!loc_as_cryobag.opened)
diff --git a/code/modules/mob/living/carbon/human/update_icons.dm b/code/modules/mob/living/carbon/human/update_icons.dm
index 2e7a5e2be23..f7493c272d8 100644
--- a/code/modules/mob/living/carbon/human/update_icons.dm
+++ b/code/modules/mob/living/carbon/human/update_icons.dm
@@ -327,6 +327,13 @@ var/global/list/damage_icon_parts = list()
if(U2)
stand_icon.Blend(new /icon(U2.icon, "us_[U2.icon_state]_s"), ICON_OVERLAY)
+
+ if(socks)
+ var/datum/sprite_accessory/socks/U3 = socks_list[socks]
+ if(U3)
+ stand_icon.Blend(new /icon(U3.icon, "sk_[U3.icon_state]_s"), ICON_OVERLAY)
+
+
if(update_icons)
update_icons()
diff --git a/code/modules/mob/living/simple_animal/friendly/spiderbot.dm b/code/modules/mob/living/simple_animal/friendly/spiderbot.dm
index a09f843b118..80e715dc7d3 100644
--- a/code/modules/mob/living/simple_animal/friendly/spiderbot.dm
+++ b/code/modules/mob/living/simple_animal/friendly/spiderbot.dm
@@ -212,8 +212,9 @@
if(camera)
camera.status = 0
- held_item.loc = src.loc
- held_item = null
+ if(held_item)
+ held_item.forceMove(src.loc)
+ held_item = null
robogibs(src.loc, viruses)
qdel(src)
diff --git a/code/modules/mob/new_player/preferences_setup.dm b/code/modules/mob/new_player/preferences_setup.dm
index b60ebe12c5d..77f48b976d5 100644
--- a/code/modules/mob/new_player/preferences_setup.dm
+++ b/code/modules/mob/new_player/preferences_setup.dm
@@ -7,6 +7,7 @@ datum/preferences
gender = pick(MALE, FEMALE)
underwear = random_underwear(gender)
undershirt = random_undershirt(gender)
+ socks = random_socks(gender)
if(species == "Human")
s_tone = random_skin_tone()
h_style = random_hair_style(gender, species)
@@ -264,6 +265,12 @@ datum/preferences
if(U2)
undershirt_s = new/icon(U2.icon, "[U2.icon_state]_s", ICON_OVERLAY)
+ var/icon/socks_s = null
+ if(socks)
+ var/datum/sprite_accessory/socks/U3 = socks_list[socks]
+ if(U3)
+ socks_s = new/icon(U3.icon, "[U3.icon_state]_s", ICON_OVERLAY)
+
var/icon/clothes_s = null
var/uniform_dmi='icons/mob/uniform.dmi'
if(disabilities&DISABILITY_FLAG_FAT)
@@ -792,6 +799,8 @@ datum/preferences
preview_icon.Blend(underwear_s, ICON_OVERLAY)
if(undershirt_s)
preview_icon.Blend(undershirt_s, ICON_OVERLAY)
+ if(socks_s)
+ preview_icon.Blend(socks_s, ICON_OVERLAY)
if(clothes_s)
preview_icon.Blend(clothes_s, ICON_OVERLAY)
preview_icon_front = new(preview_icon, dir = SOUTH)
@@ -800,4 +809,5 @@ datum/preferences
del(eyes_s)
del(underwear_s)
del(undershirt_s)
+ del(socks_s)
del(clothes_s)
diff --git a/code/modules/mob/new_player/sprite_accessories.dm b/code/modules/mob/new_player/sprite_accessories.dm
index 45fe53c3d82..5cc722bb7fd 100644
--- a/code/modules/mob/new_player/sprite_accessories.dm
+++ b/code/modules/mob/new_player/sprite_accessories.dm
@@ -1260,4 +1260,193 @@
name = "Fire Tank-Top"
icon_state = "tank_fire"
gender = NEUTER
-//end tanktops
\ No newline at end of file
+//end tanktops
+
+///////////////////////
+// Socks Definitions //
+///////////////////////
+/datum/sprite_accessory/socks
+ icon = 'icons/mob/underwear.dmi'
+
+/datum/sprite_accessory/socks/nude
+ name = "Nude"
+ icon_state = null
+ gender = NEUTER
+ species_allowed = list("Human","Unathi","Diona","Grey","Machine","Tajaran","Vulpakanin","Slime People","Skellington")
+
+
+/datum/sprite_accessory/socks/white_norm
+ name = "Normal White"
+ icon_state = "white_norm"
+ gender = NEUTER
+ species_allowed = list("Human","Unathi","Diona","Grey","Machine","Tajaran","Vulpakanin","Slime People","Skellington")
+
+
+/datum/sprite_accessory/socks/black_norm
+ name = "Normal Black"
+ icon_state = "black_norm"
+ gender = NEUTER
+ species_allowed = list("Human","Unathi","Diona","Grey","Machine","Tajaran","Vulpakanin","Slime People","Skellington")
+
+
+/datum/sprite_accessory/socks/white_short
+ name = "Short White"
+ icon_state = "white_short"
+ gender = NEUTER
+ species_allowed = list("Human","Unathi","Diona","Grey","Machine","Tajaran","Vulpakanin","Slime People","Skellington")
+
+
+/datum/sprite_accessory/socks/black_short
+ name = "Short Black"
+ icon_state = "black_short"
+ gender = NEUTER
+ species_allowed = list("Human","Unathi","Diona","Grey","Machine","Tajaran","Vulpakanin","Slime People","Skellington")
+
+
+/datum/sprite_accessory/socks/white_knee
+ name = "Knee-high White"
+ icon_state = "white_knee"
+ gender = NEUTER
+ species_allowed = list("Human","Unathi","Diona","Grey","Machine","Tajaran","Vulpakanin","Slime People","Skellington")
+
+
+/datum/sprite_accessory/socks/black_knee
+ name = "Knee-high Black"
+ icon_state = "black_knee"
+ gender = NEUTER
+ species_allowed = list("Human","Unathi","Diona","Grey","Machine","Tajaran","Vulpakanin","Slime People","Skellington")
+
+
+/datum/sprite_accessory/socks/thin_knee
+ name = "Knee-high Thin"
+ icon_state = "thin_knee"
+ gender = FEMALE
+ species_allowed = list("Human","Unathi","Diona","Grey","Machine","Tajaran","Vulpakanin","Slime People","Skellington")
+
+
+/datum/sprite_accessory/socks/striped_knee
+ name = "Knee-high Striped"
+ icon_state = "striped_knee"
+ gender = NEUTER
+ species_allowed = list("Human","Unathi","Diona","Grey","Machine","Tajaran","Vulpakanin","Slime People","Skellington")
+
+
+/datum/sprite_accessory/socks/rainbow_knee
+ name = "Knee-high Rainbow"
+ icon_state = "rainbow_knee"
+ gender = NEUTER
+ species_allowed = list("Human","Unathi","Diona","Grey","Machine","Tajaran","Vulpakanin","Slime People","Skellington")
+
+
+/datum/sprite_accessory/socks/white_thigh
+ name = "Thigh-high White"
+ icon_state = "white_thigh"
+ gender = NEUTER
+ species_allowed = list("Human","Unathi","Diona","Grey","Machine","Tajaran","Vulpakanin","Slime People","Skellington")
+
+/datum/sprite_accessory/socks/black_thigh
+ name = "Thigh-high Black"
+ icon_state = "black_thigh"
+ gender = NEUTER
+ species_allowed = list("Human","Unathi","Diona","Grey","Machine","Tajaran","Vulpakanin","Slime People","Skellington")
+
+
+/datum/sprite_accessory/socks/thin_thigh
+ name = "Thigh-high Thin"
+ icon_state = "thin_thigh"
+ gender = FEMALE
+ species_allowed = list("Human","Unathi","Diona","Grey","Machine","Tajaran","Vulpakanin","Slime People","Skellington")
+
+
+/datum/sprite_accessory/socks/striped_thigh
+ name = "Thigh-high Striped"
+ icon_state = "striped_thigh"
+ gender = NEUTER
+ species_allowed = list("Human","Unathi","Diona","Grey","Machine","Tajaran","Vulpakanin","Slime People","Skellington")
+
+
+/datum/sprite_accessory/socks/rainbow_thigh
+ name = "Thigh-high Rainbow"
+ icon_state = "rainbow_thigh"
+ gender = NEUTER
+ species_allowed = list("Human","Unathi","Diona","Grey","Machine","Tajaran","Vulpakanin","Slime People","Skellington")
+
+
+/datum/sprite_accessory/socks/pantyhose
+ name = "Pantyhose"
+ icon_state = "pantyhose"
+ gender = FEMALE
+ species_allowed = list("Human","Unathi","Diona","Grey","Machine","Tajaran","Vulpakanin","Slime People","Skellington")
+
+
+/datum/sprite_accessory/socks/black_fishnet
+ name = "Black Fishnet"
+ icon_state = "black_fishnet"
+ gender = NEUTER
+ species_allowed = list("Human","Unathi","Diona","Grey","Machine","Tajaran","Vulpakanin","Slime People","Skellington")
+
+/datum/sprite_accessory/socks/vox_white
+ name = "Vox White"
+ icon_state = "vox_white"
+ gender = NEUTER
+ species_allowed = list("Vox")
+
+/datum/sprite_accessory/socks/vox_black
+ name = "Vox Black"
+ icon_state = "vox_black"
+ gender = NEUTER
+ species_allowed = list("Vox")
+
+/datum/sprite_accessory/socks/vox_thin
+ name = "Vox Black Thin"
+ icon_state = "vox_blackthin"
+ gender = NEUTER
+ species_allowed = list("Vox")
+
+/datum/sprite_accessory/socks/vox_rainbow
+ name = "Vox Rainbow"
+ icon_state = "vox_rainbow"
+ gender = NEUTER
+ species_allowed = list("Vox")
+
+/datum/sprite_accessory/socks/vox_stripped
+ name = "Vox Stripped"
+ icon_state = "vox_white"
+ gender = NEUTER
+ species_allowed = list("Vox")
+
+/datum/sprite_accessory/socks/vox_white_thigh
+ name = "Vox Thigh-high White"
+ icon_state = "vox_whiteTH"
+ gender = NEUTER
+ species_allowed = list("Vox")
+
+/datum/sprite_accessory/socks/vox_black_thigh
+ name = "Vox Thigh-high Black"
+ icon_state = "vox_blackTH"
+ gender = NEUTER
+ species_allowed = list("Vox")
+
+/datum/sprite_accessory/socks/vox_thin_thigh
+ name = "Vox Thigh-high Thin"
+ icon_state = "vox_blackthinTH"
+ gender = NEUTER
+ species_allowed = list("Vox")
+
+/datum/sprite_accessory/socks/vox_rainbow_thigh
+ name = "Vox Thigh-high Rainbow"
+ icon_state = "vox_rainbowTH"
+ gender = NEUTER
+ species_allowed = list("Vox")
+
+/datum/sprite_accessory/socks/vox_stripped_thigh
+ name = "Vox Thigh-high Stripped"
+ icon_state = "vox_strippedTH"
+ gender = NEUTER
+ species_allowed = list("Vox")
+
+/datum/sprite_accessory/socks/vox_fishnet
+ name = "Vox Fishnets"
+ icon_state = "vox_fishnet"
+ gender = NEUTER
+ species_allowed = list("Vox")
\ No newline at end of file
diff --git a/code/modules/reagents/newchem/medicine.dm b/code/modules/reagents/newchem/medicine.dm
index ea2675034e7..a54072e9bbb 100644
--- a/code/modules/reagents/newchem/medicine.dm
+++ b/code/modules/reagents/newchem/medicine.dm
@@ -825,6 +825,35 @@ datum/reagent/stimulants/reagent_deleted(var/mob/living/M as mob)
..()
return
+/datum/reagent/medicine/stimulative_agent
+ name = "Stimulative Agent"
+ id = "stimulative_agent"
+ description = "An illegal compound that dramatically enhances the body's performance and healing capabilities."
+ color = "#C8A5DC"
+ metabolization_rate = 0.5 * REAGENTS_METABOLISM
+ overdose_threshold = 60
+
+/datum/reagent/medicine/stimulative_agent/on_mob_life(mob/living/M)
+ M.status_flags |= GOTTAGOFAST
+ if(M.health < 50 && M.health > 0)
+ M.adjustOxyLoss(-1*REM)
+ M.adjustToxLoss(-1*REM)
+ M.adjustBruteLoss(-1*REM)
+ M.adjustFireLoss(-1*REM)
+ M.AdjustParalysis(-3)
+ M.AdjustStunned(-3)
+ M.AdjustWeakened(-3)
+ M.adjustStaminaLoss(-5*REM)
+ ..()
+
+/datum/reagent/medicine/stimulative_agent/overdose_process(mob/living/M)
+ if(prob(33))
+ M.adjustStaminaLoss(2.5*REM)
+ M.adjustToxLoss(1*REM)
+ M.losebreath++
+ ..()
+ return
+
datum/reagent/insulin
name = "Insulin"
id = "insulin"
diff --git a/code/modules/reagents/newchem/newchem_procs.dm b/code/modules/reagents/newchem/newchem_procs.dm
index 5c87c0f0044..b2d6edc0995 100644
--- a/code/modules/reagents/newchem/newchem_procs.dm
+++ b/code/modules/reagents/newchem/newchem_procs.dm
@@ -96,7 +96,7 @@ datum/reagents/proc/check_ignoreslow(var/mob/M)
datum/reagents/proc/check_gofast(var/mob/M)
if(istype(M, /mob))
- if(M.reagents.has_reagent("unholywater")||M.reagents.has_reagent("nuka_cola"))
+ if(M.reagents.has_reagent("unholywater")||M.reagents.has_reagent("nuka_cola")||M.reagents.has_reagent("stimulative_agent"))
return 1
else
M.status_flags &= ~GOTTAGOFAST
diff --git a/code/modules/reagents/oldchem/reagents/reagents_water.dm b/code/modules/reagents/oldchem/reagents/reagents_water.dm
index a94ab397cd8..12dfe89bb28 100644
--- a/code/modules/reagents/oldchem/reagents/reagents_water.dm
+++ b/code/modules/reagents/oldchem/reagents/reagents_water.dm
@@ -110,6 +110,8 @@
color = "#61C2C2"
/datum/reagent/space_cleaner/reaction_obj(var/obj/O, var/volume)
+ if(O)
+ O.color = initial(O.color)
if(istype(O,/obj/effect/decal/cleanable))
qdel(O)
else
@@ -118,6 +120,8 @@
/datum/reagent/space_cleaner/reaction_turf(var/turf/T, var/volume)
if(volume >= 1)
+ if(T)
+ T.color = initial(T.color)
T.overlays.Cut()
T.clean_blood()
for(var/obj/effect/decal/cleanable/C in src)
@@ -125,10 +129,9 @@
for(var/mob/living/carbon/slime/M in T)
M.adjustToxLoss(rand(5,10))
-
-/datum/reagent/space_cleaner/reaction_turf(var/turf/simulated/S, var/volume)
- if(volume >= 1)
- S.dirt = 0
+ if(istype(T,/turf/simulated))
+ var/turf/simulated/S = T
+ S.dirt = 0
/datum/reagent/space_cleaner/reaction_mob(var/mob/M, var/method=TOUCH, var/volume)
if(iscarbon(M))
diff --git a/code/modules/research/designs/autolathe_designs.dm b/code/modules/research/designs/autolathe_designs.dm
index 247bfdf25d8..90cebcf4648 100644
--- a/code/modules/research/designs/autolathe_designs.dm
+++ b/code/modules/research/designs/autolathe_designs.dm
@@ -162,6 +162,14 @@
build_path = /obj/item/device/assembly/infra
category = list("initial", "Miscellaneous")
+/datum/design/health_sensor
+ name = "Health sensor"
+ id = "health_sensor"
+ build_type = AUTOLATHE
+ materials = list(MAT_METAL = 800, MAT_GLASS = 200)
+ build_path = /obj/item/device/assembly/health
+ category = list("initial", "Medical")
+
/datum/design/kitchen_knife
name = "Kitchen knife"
id = "kitchen_knife"
@@ -546,3 +554,19 @@
materials = list(MAT_METAL = 4000)
build_path = /obj/item/ammo_casing/shotgun
category = list("hacked", "Security")
+
+/datum/design/desttagger
+ name = "Destination tagger"
+ id = "desttagger"
+ build_type = AUTOLATHE
+ materials = list(MAT_METAL = 250, MAT_GLASS = 125)
+ build_path = /obj/item/device/destTagger
+ category = list("initial", "Electronics")
+
+/datum/design/handlabeler
+ name = "Hand labeler"
+ id = "handlabel"
+ build_type = AUTOLATHE
+ materials = list(MAT_METAL = 150, MAT_GLASS = 125)
+ build_path = /obj/item/weapon/hand_labeler
+ category = list("initial", "Electronics")
\ No newline at end of file
diff --git a/code/modules/research/designs/medical_designs.dm b/code/modules/research/designs/medical_designs.dm
index cf945134663..1cfd36c2bd6 100644
--- a/code/modules/research/designs/medical_designs.dm
+++ b/code/modules/research/designs/medical_designs.dm
@@ -204,4 +204,48 @@
build_type = PROTOLATHE
materials = list (MAT_METAL = 12500, MAT_GLASS = 7500, MAT_SILVER = 1500, MAT_GOLD = 1500, MAT_DIAMOND = 750)
build_path = /obj/item/weapon/scalpel/manager
+ category = list("Medical")
+
+/////////////////////////////////////////
+////////////Regular Implants/////////////
+/////////////////////////////////////////
+
+/datum/design/implanter
+ name = "Implanter"
+ desc = "A sterile automatic implant injector."
+ id = "implanter"
+ req_tech = list("materials" = 1, "programming" = 2, "biotech" = 3)
+ build_type = PROTOLATHE
+ materials = list(MAT_METAL = 600, MAT_GLASS = 200)
+ build_path = /obj/item/weapon/implanter
+ category = list("Medical")
+
+/datum/design/implantcase
+ name = "Implant Case"
+ desc = "A glass case containing an implant."
+ id = "implantcase"
+ req_tech = list("materials" = 1, "biotech" = 2)
+ build_type = PROTOLATHE
+ materials = list(MAT_GLASS = 500)
+ build_path = /obj/item/weapon/implantcase
+ category = list("Medical")
+
+/datum/design/implant_freedom
+ name = "Freedom Implant Case"
+ desc = "A glass case containing an implant."
+ id = "implant_freedom"
+ req_tech = list("materials" = 2, "biotech" = 3, "magnets" = 3, "syndicate" = 5)
+ build_type = PROTOLATHE
+ materials = list(MAT_METAL = 50, MAT_GLASS = 500, MAT_GOLD = 250)
+ build_path = /obj/item/weapon/implantcase/freedom
+ category = list("Medical")
+
+/datum/design/implant_adrenalin
+ name = "Adrenalin Implant Case"
+ desc = "A glass case containing an implant."
+ id = "implant_adrenalin"
+ req_tech = list("materials" = 2, "biotech" = 5, "combat" = 3, "syndicate" = 6)
+ build_type = PROTOLATHE
+ materials = list(MAT_METAL = 50, MAT_GLASS = 500, MAT_GOLD = 500, MAT_URANIUM = 100, MAT_DIAMOND = 200)
+ build_path = /obj/item/weapon/implantcase/adrenaline
category = list("Medical")
\ No newline at end of file
diff --git a/icons/mob/underwear.dmi b/icons/mob/underwear.dmi
index 5c303cbf642..6c36fd0651b 100644
Binary files a/icons/mob/underwear.dmi and b/icons/mob/underwear.dmi differ
diff --git a/icons/obj/assemblies/new_assemblies.dmi b/icons/obj/assemblies/new_assemblies.dmi
index 0f9dc460825..b50ef0e13e3 100644
Binary files a/icons/obj/assemblies/new_assemblies.dmi and b/icons/obj/assemblies/new_assemblies.dmi differ
diff --git a/icons/obj/device.dmi b/icons/obj/device.dmi
index 64e1b4941be..6ee1fbd0fd3 100644
Binary files a/icons/obj/device.dmi and b/icons/obj/device.dmi differ
diff --git a/paradise.dme b/paradise.dme
index 6b0e84f845d..12deff3c44e 100644
--- a/paradise.dme
+++ b/paradise.dme
@@ -959,6 +959,7 @@
#include "code\modules\alarm\power_alarm.dm"
#include "code\modules\assembly\assembly.dm"
#include "code\modules\assembly\bomb.dm"
+#include "code\modules\assembly\health.dm"
#include "code\modules\assembly\helpers.dm"
#include "code\modules\assembly\holder.dm"
#include "code\modules\assembly\igniter.dm"