| "
if(jobban_isbanned(user, "appearance"))
@@ -490,6 +492,8 @@ GLOBAL_LIST_EMPTY(preferences_datums)
dat += "High"
dat += " " + dat += "Ambient Occlusion: [ambientocclusion ? "Enabled" : "Disabled"] " + dat += " | "
dat += "Special Role Settings" @@ -855,20 +859,20 @@ GLOBAL_LIST_EMPTY(preferences_datums) return job_engsec_low return 0 -/datum/preferences/proc/SetTraits(mob/user) - if(!SStraits) - to_chat(user, "The trait subsystem is still initializing! Try again in a minute.") +/datum/preferences/proc/SetQuirks(mob/user) + if(!SSquirks) + to_chat(user, "The quirk subsystem is still initializing! Try again in a minute.") return var/list/dat = list() - if(!SStraits.traits.len) - dat += "The trait subsystem hasn't finished initializing, please hold..." + if(!SSquirks.quirks.len) + dat += "The quirk subsystem hasn't finished initializing, please hold..." dat += "" else - dat += " " - dat += " Left-click to add or remove traits. You need one negative trait for every positive trait. "
+ dat += "\ - Traits are applied at roundstart and cannot normally be removed. " + dat += " Left-click to add or remove quirks. You need negative quirks to have positive ones. "
dat += "\ + Quirks are applied at roundstart and cannot normally be removed. " dat += " " else - if(has_trait) - dat += "[trait_name] - [initial(T.desc)] \ - [has_trait ? "Lose" : "Take"] ([trait_cost] pts.) " + if(has_quirk) + dat += "[quirk_name] - [initial(T.desc)] \ + [has_quirk ? "Lose" : "Take"] ([quirk_cost] pts.) " else - dat += "[trait_name] - [initial(T.desc)] \ - [has_trait ? "Lose" : "Take"] ([trait_cost] pts.) " + dat += "[quirk_name] - [initial(T.desc)] \ + [has_quirk ? "Lose" : "Take"] ([quirk_cost] pts.) " dat += " Trait Preferences ", 900, 600) //no reason not to reuse the occupation window, as it's cleaner that way
+ var/datum/browser/popup = new(user, "mob_occupation", "Quirk Preferences ", 900, 600) //no reason not to reuse the occupation window, as it's cleaner that way
popup.set_window_options("can_close=0")
popup.set_content(dat.Join())
popup.open(0)
return
-/datum/preferences/proc/GetTraitBalance()
+/datum/preferences/proc/GetQuirkBalance()
var/bal = 0
- for(var/V in all_traits)
- var/datum/trait/T = SStraits.traits[V]
+ for(var/V in all_quirks)
+ var/datum/quirk/T = SSquirks.quirks[V]
bal -= initial(T.value)
return bal
@@ -977,49 +981,49 @@ GLOBAL_LIST_EMPTY(preferences_datums)
user << browse(null, "window=mob_occupation")
ShowChoices(user)
if("update")
- var/trait = href_list["trait"]
- if(!SStraits.traits[trait])
+ var/quirk = href_list["trait"]
+ if(!SSquirks.quirks[quirk])
return
- var/value = SStraits.trait_points[trait]
+ var/value = SSquirks.quirk_points[quirk]
if(value == 0)
- if(trait in neutral_traits)
- neutral_traits -= trait
- all_traits -= trait
+ if(quirk in neutral_quirks)
+ neutral_quirks -= quirk
+ all_quirks -= quirk
else
neutral_quirks += quirk
all_quirks += quirk
else
- var/balance = GetTraitBalance()
- if(trait in positive_traits)
- positive_traits -= trait
- all_traits -= trait
- else if(trait in negative_traits)
+ var/balance = GetQuirkBalance()
+ if(quirk in positive_quirks)
+ positive_quirks -= quirk
+ all_quirks -= quirk
+ else if(quirk in negative_quirks)
if(balance + value < 0)
to_chat(user, "Refunding this would cause you to go below your balance!")
return
- negative_traits -= trait
- all_traits -= trait
+ negative_quirks -= quirk
+ all_quirks -= quirk
else if(value > 0)
if(positive_quirks.len >= MAX_QUIRKS)
to_chat(user, "You can't have more than [MAX_QUIRKS] positive quirks!")
return
if(balance - value < 0)
- to_chat(user, "You don't have enough balance to gain this trait!")
+ to_chat(user, "You don't have enough balance to gain this quirk!")
return
- positive_traits += trait
- all_traits += trait
+ positive_quirks += quirk
+ all_quirks += quirk
else
negative_quirks += quirk
all_quirks += quirk
SetQuirks(user)
if("reset")
- all_traits = list()
- positive_traits = list()
- negative_traits = list()
- neutral_traits = list()
- SetTraits(user)
+ all_quirks = list()
+ positive_quirks = list()
+ negative_quirks = list()
+ neutral_quirks = list()
+ SetQuirks(user)
else
- SetTraits(user)
+ SetQuirks(user)
return TRUE
switch(href_list["task"])
@@ -1529,6 +1533,14 @@ GLOBAL_LIST_EMPTY(preferences_datums)
cit_toggles ^= DIGESTION_NOISES
//END CITADEL EDIT
+ if("ambientocclusion")
+ ambientocclusion = !ambientocclusion
+ if(parent && parent.screen && parent.screen.len)
+ var/obj/screen/plane_master/game_world/PM = locate(/obj/screen/plane_master/game_world) in parent.screen
+ PM.filters -= AMBIENT_OCCLUSION
+ if(ambientocclusion)
+ PM.filters += AMBIENT_OCCLUSION
+
if("save")
save_preferences()
save_character()
diff --git a/code/modules/client/preferences_savefile.dm b/code/modules/client/preferences_savefile.dm
index d2efc477c6..f17ddf8b7c 100644
--- a/code/modules/client/preferences_savefile.dm
+++ b/code/modules/client/preferences_savefile.dm
@@ -130,6 +130,7 @@ SAVEFILE UPDATING/VERSIONING - 'Simplified', or rather, more coder-friendly ~Car
S["uses_glasses_colour"]>> uses_glasses_colour
S["clientfps"] >> clientfps
S["parallax"] >> parallax
+ S["ambientocclusion"] >> ambientocclusion
S["menuoptions"] >> menuoptions
S["enable_tips"] >> enable_tips
S["tip_delay"] >> tip_delay
@@ -160,6 +161,7 @@ SAVEFILE UPDATING/VERSIONING - 'Simplified', or rather, more coder-friendly ~Car
toggles = sanitize_integer(toggles, 0, 65535, initial(toggles))
clientfps = sanitize_integer(clientfps, 0, 1000, 0)
parallax = sanitize_integer(parallax, PARALLAX_INSANE, PARALLAX_DISABLE, null)
+ ambientocclusion = sanitize_integer(ambientocclusion, 0, 1, initial(ambientocclusion))
ghost_form = sanitize_inlist(ghost_form, GLOB.ghost_forms, initial(ghost_form))
ghost_orbit = sanitize_inlist(ghost_orbit, GLOB.ghost_orbits, initial(ghost_orbit))
ghost_accs = sanitize_inlist(ghost_accs, GLOB.ghost_accs_options, GHOST_ACCS_DEFAULT_OPTION)
@@ -210,6 +212,7 @@ SAVEFILE UPDATING/VERSIONING - 'Simplified', or rather, more coder-friendly ~Car
WRITE_FILE(S["uses_glasses_colour"], uses_glasses_colour)
WRITE_FILE(S["clientfps"], clientfps)
WRITE_FILE(S["parallax"], parallax)
+ WRITE_FILE(S["ambientocclusion"], ambientocclusion)
WRITE_FILE(S["menuoptions"], menuoptions)
WRITE_FILE(S["enable_tips"], enable_tips)
WRITE_FILE(S["tip_delay"], tip_delay)
@@ -310,11 +313,11 @@ SAVEFILE UPDATING/VERSIONING - 'Simplified', or rather, more coder-friendly ~Car
S["job_engsec_med"] >> job_engsec_med
S["job_engsec_low"] >> job_engsec_low
- //Traits
- S["all_traits"] >> all_traits
- S["positive_traits"] >> positive_traits
- S["negative_traits"] >> negative_traits
- S["neutral_traits"] >> neutral_traits
+ //Quirks
+ S["all_quirks"] >> all_quirks
+ S["positive_quirks"] >> positive_quirks
+ S["negative_quirks"] >> negative_quirks
+ S["neutral_quirks"] >> neutral_quirks
//Citadel code
S["feature_genitals_use_skintone"] >> features["genitals_use_skintone"]
@@ -421,10 +424,10 @@ SAVEFILE UPDATING/VERSIONING - 'Simplified', or rather, more coder-friendly ~Car
job_engsec_med = sanitize_integer(job_engsec_med, 0, 65535, initial(job_engsec_med))
job_engsec_low = sanitize_integer(job_engsec_low, 0, 65535, initial(job_engsec_low))
- all_traits = SANITIZE_LIST(all_traits)
- positive_traits = SANITIZE_LIST(positive_traits)
- negative_traits = SANITIZE_LIST(negative_traits)
- neutral_traits = SANITIZE_LIST(neutral_traits)
+ all_quirks = SANITIZE_LIST(all_quirks)
+ positive_quirks = SANITIZE_LIST(positive_quirks)
+ negative_quirks = SANITIZE_LIST(negative_quirks)
+ neutral_quirks = SANITIZE_LIST(neutral_quirks)
cit_character_pref_load(S)
@@ -491,11 +494,11 @@ SAVEFILE UPDATING/VERSIONING - 'Simplified', or rather, more coder-friendly ~Car
WRITE_FILE(S["job_engsec_med"] , job_engsec_med)
WRITE_FILE(S["job_engsec_low"] , job_engsec_low)
- //Traits
- WRITE_FILE(S["all_traits"] , all_traits)
- WRITE_FILE(S["positive_traits"] , positive_traits)
- WRITE_FILE(S["negative_traits"] , negative_traits)
- WRITE_FILE(S["neutral_traits"] , neutral_traits)
+ //Quirks
+ WRITE_FILE(S["all_quirks"] , all_quirks)
+ WRITE_FILE(S["positive_quirks"] , positive_quirks)
+ WRITE_FILE(S["negative_quirks"] , negative_quirks)
+ WRITE_FILE(S["neutral_quirks"] , neutral_quirks)
cit_character_pref_save(S)
diff --git a/code/modules/clothing/spacesuits/hardsuit.dm b/code/modules/clothing/spacesuits/hardsuit.dm
index 68d7073612..f5b4a31290 100644
--- a/code/modules/clothing/spacesuits/hardsuit.dm
+++ b/code/modules/clothing/spacesuits/hardsuit.dm
@@ -126,7 +126,7 @@
if(user.transferItemToLoc(I, src))
jetpack = I
to_chat(user, "You successfully install the jetpack into [src].")
-
+ return
else if(istype(I, /obj/item/screwdriver))
if(!jetpack)
to_chat(user, "[src] has no jetpack installed.")
@@ -139,6 +139,8 @@
jetpack.forceMove(drop_location())
jetpack = null
to_chat(user, "You successfully remove the jetpack from [src].")
+ return
+ return ..()
/obj/item/clothing/suit/space/hardsuit/equipped(mob/user, slot)
@@ -237,6 +239,9 @@
brightness_on = 7
allowed = list(/obj/item/flashlight, /obj/item/tank/internals, /obj/item/resonator, /obj/item/mining_scanner, /obj/item/t_scanner/adv_mining_scanner, /obj/item/gun/energy/kinetic_accelerator)
+/obj/item/clothing/head/helmet/space/hardsuit/mining/Initialize()
+ . = ..()
+ AddComponent(/datum/component/armor_plate)
/obj/item/clothing/suit/space/hardsuit/mining
icon_state = "hardsuit-mining"
@@ -250,6 +255,10 @@
helmettype = /obj/item/clothing/head/helmet/space/hardsuit/mining
heat_protection = CHEST|GROIN|LEGS|FEET|ARMS|HANDS
+/obj/item/clothing/suit/space/hardsuit/mining/Initialize()
+ . = ..()
+ AddComponent(/datum/component/armor_plate)
+
//Syndicate hardsuit
/obj/item/clothing/head/helmet/space/hardsuit/syndi
name = "blood-red hardsuit helmet"
diff --git a/code/modules/clothing/under/jobs/security.dm b/code/modules/clothing/under/jobs/security.dm
index be8a113f22..e2be42e014 100644
--- a/code/modules/clothing/under/jobs/security.dm
+++ b/code/modules/clothing/under/jobs/security.dm
@@ -28,6 +28,14 @@
item_state = "gy_suit"
item_color = "security"
+/obj/item/clothing/under/rank/security/skirt
+ name = "security jumpskirt"
+ desc = "A \"tactical\" security jumpsuit with the legs replaced by a skirt."
+ icon_state = "secskirt"
+ item_state = "r_suit"
+ item_color = "secskirt"
+ can_adjust = FALSE //you know now that i think of it if you adjust the skirt and the sprite disappears isn't that just like flashing everyone
+
/obj/item/clothing/under/rank/warden
name = "security suit"
diff --git a/code/modules/food_and_drinks/drinks/drinks/bottle.dm b/code/modules/food_and_drinks/drinks/drinks/bottle.dm
index ee5dc7e328..664d2e0bc2 100644
--- a/code/modules/food_and_drinks/drinks/drinks/bottle.dm
+++ b/code/modules/food_and_drinks/drinks/drinks/bottle.dm
@@ -344,6 +344,15 @@
list_reagents = list("limejuice" = 100)
foodtype = FRUIT
+/obj/item/reagent_containers/food/drinks/bottle/menthol
+ name = "menthol"
+ desc = "Tastes naturally minty, and imparts a very mild numbing sensation."
+ icon_state = "mentholbox"
+ item_state = "carton"
+ lefthand_file = 'icons/mob/inhands/equipment/kitchen_lefthand.dmi'
+ righthand_file = 'icons/mob/inhands/equipment/kitchen_righthand.dmi'
+ isGlass = FALSE
+ list_reagents = list("menthol" = 100)
////////////////////////// MOLOTOV ///////////////////////
/obj/item/reagent_containers/food/drinks/bottle/molotov
diff --git a/code/modules/food_and_drinks/food/customizables.dm b/code/modules/food_and_drinks/food/customizables.dm
index 353bfc6538..3df4ca4bd0 100644
--- a/code/modules/food_and_drinks/food/customizables.dm
+++ b/code/modules/food_and_drinks/food/customizables.dm
@@ -158,7 +158,7 @@
desc = "A timeless classic."
ingredients_placement = INGREDIENTS_STACKPLUSTOP
icon = 'icons/obj/food/burgerbread.dmi'
- icon_state = "bun"
+ icon_state = "custburg"
foodtype = GRAIN
diff --git a/code/modules/food_and_drinks/kitchen_machinery/smartfridge.dm b/code/modules/food_and_drinks/kitchen_machinery/smartfridge.dm
index 2522ec9cf2..edc2305261 100644
--- a/code/modules/food_and_drinks/kitchen_machinery/smartfridge.dm
+++ b/code/modules/food_and_drinks/kitchen_machinery/smartfridge.dm
@@ -299,8 +299,7 @@
qdel(S)
return TRUE
for(var/obj/item/stack/sheet/wetleather/WL in src)
- var/obj/item/stack/sheet/leather/L = new(drop_location())
- L.amount = WL.amount
+ new /obj/item/stack/sheet/leather(drop_location(), WL.amount)
qdel(WL)
return TRUE
return FALSE
diff --git a/code/modules/food_and_drinks/recipes/drinks_recipes.dm b/code/modules/food_and_drinks/recipes/drinks_recipes.dm
index 71cfe6c75c..2a081f3a2f 100644
--- a/code/modules/food_and_drinks/recipes/drinks_recipes.dm
+++ b/code/modules/food_and_drinks/recipes/drinks_recipes.dm
@@ -623,4 +623,42 @@
id = "crevice_spike"
results = list("crevice_spike" = 6)
required_reagents = list("limejuice" = 2, "capsaicin" = 4) //2 powdered delta (sour), 4 flanergide (spicy)
- mix_message = "The mixture stings your eyes as it settles."
\ No newline at end of file
+ mix_message = "The mixture stings your eyes as it settles."
+
+/datum/chemical_reaction/sake
+ name = "sake"
+ id = "sake"
+ results = list("sake" = 10)
+ required_reagents = list("rice" = 10)
+ required_catalysts = list("enzyme" = 5)
+ mix_message = "The rice grains ferment into a clear, sweet-smelling liquid."
+
+/datum/chemical_reaction/alexander
+ name = "Alexander"
+ id = "alexander"
+ results = list("alexander" = 3)
+ required_reagents = list("cognac" = 1, "creme_de_cacao" = 1, "cream" = 1)
+
+/datum/chemical_reaction/sidecar
+ name = "Sidecar"
+ id = "sidecar"
+ results = list("sidecar" = 4)
+ required_reagents = list("cognac" = 2, "triple_sec" = 1, "lemonjuice" = 1)
+
+/datum/chemical_reaction/between_the_sheets
+ name = "Between the Sheets"
+ id = "between_the_sheets"
+ results = list("between_the_sheets" = 5)
+ required_reagents = list("rum" = 1, "sidecar" = 4)
+
+/datum/chemical_reaction/kamikaze
+ name = "Kamikaze"
+ id = "kamikaze"
+ results = list("kamikaze" = 3)
+ required_reagents = list("vodka" = 1, "triple_sec" = 1, "limejuice" = 1)
+
+/datum/chemical_reaction/mojito
+ name = "Mojito"
+ id = "mojito"
+ results = list("mojito" = 5)
+ required_reagents = list("rum" = 1, "sugar" = 1, "limejuice" = 1, "sodawater" = 1, "menthol" = 1)
diff --git a/code/modules/hydroponics/biogenerator.dm b/code/modules/hydroponics/biogenerator.dm
index 624394f878..6da117da88 100644
--- a/code/modules/hydroponics/biogenerator.dm
+++ b/code/modules/hydroponics/biogenerator.dm
@@ -262,8 +262,7 @@
if(!check_cost(D.materials, amount))
return FALSE
- var/obj/item/stack/product = new D.build_path(loc)
- product.amount = amount
+ new D.build_path(drop_location(), amount)
for(var/R in D.make_reagents)
beaker.reagents.add_reagent(R, D.make_reagents[R]*amount)
else
diff --git a/code/modules/hydroponics/gene_modder.dm b/code/modules/hydroponics/gene_modder.dm
index dd1d1777d8..f0c7bba885 100644
--- a/code/modules/hydroponics/gene_modder.dm
+++ b/code/modules/hydroponics/gene_modder.dm
@@ -85,14 +85,15 @@
interact(user)
return
else if(istype(I, /obj/item/disk/plantgene))
- if(disk)
- to_chat(user, "A data disk is already loaded into the machine!")
- else
- if(!user.transferItemToLoc(I, src))
- return
- disk = I
- to_chat(user, "You add [I] to the machine.")
- interact(user)
+ if (operation)
+ to_chat(user, "Please complete current operation.")
+ return
+ eject_disk()
+ if(!user.transferItemToLoc(I, src))
+ return
+ disk = I
+ to_chat(user, "You add [I] to the machine.")
+ interact(user)
else
..()
@@ -266,18 +267,13 @@
to_chat(usr, "You add [I] to the machine.")
update_icon()
else if(href_list["eject_disk"] && !operation)
- if (disk)
- disk.forceMove(drop_location())
- disk.verb_pickup()
- disk = null
- update_genes()
- else
- var/obj/item/I = usr.get_active_held_item()
- if(istype(I, /obj/item/disk/plantgene))
- if(!usr.transferItemToLoc(I, src))
- return
- disk = I
- to_chat(usr, "You add [I] to the machine.")
+ var/obj/item/I = usr.get_active_held_item()
+ eject_disk()
+ if(istype(I, /obj/item/disk/plantgene))
+ if(!usr.transferItemToLoc(I, src))
+ return
+ disk = I
+ to_chat(usr, "You add [I] to the machine.")
else if(href_list["op"] == "insert" && disk && disk.gene && seed)
if(!operation) // Wait for confirmation
operation = "insert"
@@ -365,6 +361,16 @@
update_genes()
update_icon()
+/obj/machinery/plantgenes/proc/eject_disk()
+ if (disk && !operation)
+ if(Adjacent(usr) && !issilicon(usr))
+ if (!usr.put_in_hands(disk))
+ disk.forceMove(drop_location())
+ else
+ disk.forceMove(drop_location())
+ disk = null
+ update_genes()
+
/obj/machinery/plantgenes/proc/update_genes()
core_genes = list()
reagent_genes = list()
diff --git a/code/modules/hydroponics/grown/grass_carpet.dm b/code/modules/hydroponics/grown/grass_carpet.dm
index 630c072edb..8e55f8a15d 100644
--- a/code/modules/hydroponics/grown/grass_carpet.dm
+++ b/code/modules/hydroponics/grown/grass_carpet.dm
@@ -36,19 +36,8 @@
continue
grassAmt += 1 + round(G.seed.potency * tile_coefficient)
qdel(G)
- var/obj/item/stack/tile/GT = new stacktype(user.loc)
- while(grassAmt > GT.max_amount)
- GT.amount = GT.max_amount
- grassAmt -= GT.max_amount
- GT = new stacktype(user.loc)
- GT.amount = grassAmt
- for(var/obj/item/stack/tile/T in user.loc)
- if((T.type == stacktype) && (T.amount < T.max_amount))
- GT.merge(T)
- if(GT.amount <= 0)
- break
+ new stacktype(user.drop_location(), grassAmt)
qdel(src)
- return
// Carpet
/obj/item/seeds/grass/carpet
diff --git a/code/modules/hydroponics/grown/replicapod.dm b/code/modules/hydroponics/grown/replicapod.dm
index 9eaa8747b9..55c0da91f2 100644
--- a/code/modules/hydroponics/grown/replicapod.dm
+++ b/code/modules/hydroponics/grown/replicapod.dm
@@ -22,7 +22,7 @@
var/blood_type = null
var/list/features = null
var/factions = null
- var/list/traits = null
+ var/list/quirks = null
var/contains_sample = 0
/obj/item/seeds/replicapod/Initialize()
@@ -42,7 +42,7 @@
blood_type = B.data["blood_type"]
features = B.data["features"]
factions = B.data["factions"]
- factions = B.data["traits"]
+ factions = B.data["quirks"]
contains_sample = TRUE
visible_message("The [src] is injected with a fresh blood sample.")
else
@@ -114,7 +114,7 @@
podman.faction |= factions
if(!features["mcolor"])
features["mcolor"] = "#59CE00"
- for(var/V in traits)
+ for(var/V in quirks)
new V(podman)
podman.hardset_dna(null,null,podman.real_name,blood_type, new /datum/species/pod,features)//Discard SE's and UI's, podman cloning is inaccurate, and always make them a podman
podman.set_cloned_appearance()
diff --git a/code/modules/mining/equipment/explorer_gear.dm b/code/modules/mining/equipment/explorer_gear.dm
index 0bfb0b5f6d..36eb9d5e1b 100644
--- a/code/modules/mining/equipment/explorer_gear.dm
+++ b/code/modules/mining/equipment/explorer_gear.dm
@@ -25,6 +25,14 @@
armor = list("melee" = 30, "bullet" = 20, "laser" = 20, "energy" = 20, "bomb" = 50, "bio" = 100, "rad" = 50, "fire" = 50, "acid" = 50)
resistance_flags = FIRE_PROOF
+/obj/item/clothing/suit/hooded/explorer/Initialize()
+ . = ..()
+ AddComponent(/datum/component/armor_plate)
+
+/obj/item/clothing/head/hooded/explorer/Initialize()
+ . = ..()
+ AddComponent(/datum/component/armor_plate)
+
/obj/item/clothing/mask/gas/explorer
name = "explorer gas mask"
desc = "A military-grade gas mask that can be connected to an air supply."
diff --git a/code/modules/mining/equipment/goliath_hide.dm b/code/modules/mining/equipment/goliath_hide.dm
index b266b92584..85feaecf73 100644
--- a/code/modules/mining/equipment/goliath_hide.dm
+++ b/code/modules/mining/equipment/goliath_hide.dm
@@ -9,38 +9,4 @@
novariants = FALSE
flags_1 = NOBLUDGEON_1
w_class = WEIGHT_CLASS_NORMAL
- layer = MOB_LAYER
- var/static/list/goliath_platable_armor_typecache = typecacheof(list(
- /obj/item/clothing/head/helmet/space/hardsuit/mining,
- /obj/item/clothing/suit/space/hardsuit/mining,
- /obj/item/clothing/head/hooded/explorer,
- /obj/item/clothing/suit/hooded/explorer))
-
-/obj/item/stack/sheet/animalhide/goliath_hide/afterattack(atom/target, mob/user, proximity_flag)
- if(!proximity_flag)
- return
- if(is_type_in_typecache(target, goliath_platable_armor_typecache))
- var/obj/item/clothing/C = target
- if(C.armor.melee < 60)
- C.armor = C.armor.setRating(melee = min(C.armor.melee + 10, 60))
- to_chat(user, "You strengthen [target], improving its resistance against melee attacks.")
- use(1)
- else
- to_chat(user, "You can't improve [C] any further!")
- else if(istype(target, /obj/mecha/working/ripley))
- var/obj/mecha/working/ripley/D = target
- if(D.hides < 3)
- D.hides++
- D.armor = D.armor.setRating(\
- melee = min(D.armor.melee + 10, 70),\
- bullet = min(D.armor.bullet + 5, 50),\
- laser = min(D.armor.laser + 5, 50))
- to_chat(user, "You strengthen [target], improving its resistance against melee attacks.")
- D.update_icon()
- if(D.hides == 3)
- D.desc = "Autonomous Power Loader Unit. It's wearing a fearsome carapace entirely composed of goliath hide plates - its pilot must be an experienced monster hunter."
- else
- D.desc = "Autonomous Power Loader Unit. Its armour is enhanced with some goliath hide plates."
- use(1)
- else
- to_chat(user, "You can't improve [D] any further!")
+ layer = MOB_LAYER
\ No newline at end of file
diff --git a/code/modules/mining/machine_redemption.dm b/code/modules/mining/machine_redemption.dm
index b7b3d91e54..d4735d1c75 100644
--- a/code/modules/mining/machine_redemption.dm
+++ b/code/modules/mining/machine_redemption.dm
@@ -303,13 +303,12 @@
desired = input("How many sheets?", "How many sheets would you like to smelt?", 1) as null|num
var/amount = round(min(desired,50,smelt_amount))
materials.use_amount(alloy.materials, amount)
- var/output = new alloy.build_path(src)
- if(istype(output, /obj/item/stack/sheet))
- var/obj/item/stack/sheet/produced_alloy = output
- produced_alloy.amount = amount
- unload_mineral(produced_alloy)
+ var/output
+ if(ispath(alloy.build_path, /obj/item/stack/sheet))
+ output = new alloy.build_path(src, amount)
else
- unload_mineral(output)
+ output = new alloy.build_path(src)
+ unload_mineral(output)
else
to_chat(usr, "Required access not found.")
return TRUE
diff --git a/code/modules/mining/machine_stacking.dm b/code/modules/mining/machine_stacking.dm
index e658f69395..f566a8f4a9 100644
--- a/code/modules/mining/machine_stacking.dm
+++ b/code/modules/mining/machine_stacking.dm
@@ -44,8 +44,7 @@
if(!(text2path(href_list["release"]) in machine.stack_list))
return //someone tried to spawn materials by spoofing hrefs
var/obj/item/stack/sheet/inp = machine.stack_list[text2path(href_list["release"])]
- var/obj/item/stack/sheet/out = new inp.type()
- out.amount = inp.amount
+ var/obj/item/stack/sheet/out = new inp.type(null, inp.amount)
inp.amount = 0
machine.unload_mineral(out)
@@ -81,14 +80,12 @@
/obj/machinery/mineral/stacking_machine/proc/process_sheet(obj/item/stack/sheet/inp)
if(!(inp.type in stack_list)) //It's the first of this sheet added
- var/obj/item/stack/sheet/s = new inp.type(src,0)
- s.amount = 0
+ var/obj/item/stack/sheet/s = new inp.type(src, 0)
stack_list[inp.type] = s
var/obj/item/stack/sheet/storage = stack_list[inp.type]
storage.amount += inp.amount //Stack the sheets
qdel(inp) //Let the old sheet garbage collect
while(storage.amount > stack_amt) //Get rid of excessive stackage
- var/obj/item/stack/sheet/out = new inp.type()
- out.amount = stack_amt
+ var/obj/item/stack/sheet/out = new inp.type(null, stack_amt)
unload_mineral(out)
storage.amount -= stack_amt
diff --git a/code/modules/mob/dead/new_player/new_player.dm b/code/modules/mob/dead/new_player/new_player.dm
index 01ac36c57a..c6cc8a70ac 100644
--- a/code/modules/mob/dead/new_player/new_player.dm
+++ b/code/modules/mob/dead/new_player/new_player.dm
@@ -400,7 +400,7 @@
SSticker.mode.make_antag_chance(humanc)
if(humanc && CONFIG_GET(flag/roundstart_traits))
- SStraits.AssignTraits(humanc, humanc.client, TRUE)
+ SSquirks.AssignQuirks(humanc, humanc.client, TRUE)
log_manifest(character.mind.key,character.mind,character,latejoin = TRUE)
diff --git a/code/modules/mob/dead/observer/observer.dm b/code/modules/mob/dead/observer/observer.dm
index 8bfe33b3ea..e11a4fc886 100644
--- a/code/modules/mob/dead/observer/observer.dm
+++ b/code/modules/mob/dead/observer/observer.dm
@@ -592,6 +592,8 @@ This is the proc mobs get to turn into a ghost. Forked from ghostize due to comp
var/list/possessible = list()
for(var/mob/living/L in GLOB.alive_mob_list)
+ if(istype(L,/mob/living/carbon/human/dummy) || !get_turf(L)) //Haha no.
+ continue
if(!(L in GLOB.player_list) && !L.mind)
possessible += L
diff --git a/code/modules/mob/living/blood.dm b/code/modules/mob/living/blood.dm
index 68c6ed5c83..05a14ef3b1 100644
--- a/code/modules/mob/living/blood.dm
+++ b/code/modules/mob/living/blood.dm
@@ -193,10 +193,10 @@
blood_data["real_name"] = real_name
blood_data["features"] = dna.features
blood_data["factions"] = faction
- blood_data["traits"] = list()
- for(var/V in roundstart_traits)
- var/datum/trait/T = V
- blood_data["traits"] += T.type
+ blood_data["quirks"] = list()
+ for(var/V in roundstart_quirks)
+ var/datum/quirk/T = V
+ blood_data["quirks"] += T.type
return blood_data
//get the id of the substance this mob use as blood.
diff --git a/code/modules/mob/living/carbon/human/dummy.dm b/code/modules/mob/living/carbon/human/dummy.dm
index 018f04ab8f..beb183e842 100644
--- a/code/modules/mob/living/carbon/human/dummy.dm
+++ b/code/modules/mob/living/carbon/human/dummy.dm
@@ -19,6 +19,7 @@ INITIALIZE_IMMEDIATE(/mob/living/carbon/human/dummy)
//Inefficient pooling/caching way.
GLOBAL_LIST_EMPTY(human_dummy_list)
+GLOBAL_LIST_EMPTY(dummy_mob_list)
/proc/generate_or_wait_for_human_dummy(slotkey)
if(!slotkey)
@@ -31,6 +32,7 @@ GLOBAL_LIST_EMPTY(human_dummy_list)
if(QDELETED(D))
D = new
GLOB.human_dummy_list[slotkey] = D
+ GLOB.dummy_mob_list += D
D.in_use = TRUE
return D
diff --git a/code/modules/mob/living/carbon/human/human_defense.dm b/code/modules/mob/living/carbon/human/human_defense.dm
index 050a4f6d09..6cbbd69b4b 100644
--- a/code/modules/mob/living/carbon/human/human_defense.dm
+++ b/code/modules/mob/living/carbon/human/human_defense.dm
@@ -733,8 +733,8 @@
if(0 to NUTRITION_LEVEL_STARVING)
to_chat(src, "You're starving!")
- if(roundstart_traits.len)
- to_chat(src, "You have these traits: [get_trait_string()].")
+ if(roundstart_quirks.len)
+ to_chat(src, "You have these quirks: [get_trait_string()].")
else
if(wear_suit)
wear_suit.add_fingerprint(M)
diff --git a/code/modules/mob/living/living.dm b/code/modules/mob/living/living.dm
index df111f1f2b..e4aee188e0 100644
--- a/code/modules/mob/living/living.dm
+++ b/code/modules/mob/living/living.dm
@@ -492,6 +492,11 @@
ExtinguishMob()
fire_stacks = 0
update_canmove()
+ GET_COMPONENT(mood, /datum/component/mood)
+ if (mood)
+ QDEL_LIST(mood.mood_events)
+ mood.sanity = SANITY_GREAT
+ mood.update_mood()
//proc called by revive(), to check if we can actually ressuscitate the mob (we don't want to revive him and have him instantly die again)
diff --git a/code/modules/mob/living/living_defines.dm b/code/modules/mob/living/living_defines.dm
index 6dfaa565fa..94b1e64f39 100644
--- a/code/modules/mob/living/living_defines.dm
+++ b/code/modules/mob/living/living_defines.dm
@@ -34,7 +34,7 @@
var/list/status_traits = list()
- var/list/roundstart_traits = list()
+ var/list/roundstart_quirks = list()
var/list/surgeries = list() //a list of surgery datums. generally empty, they're added when the player wants them.
diff --git a/code/modules/mob/living/simple_animal/bot/floorbot.dm b/code/modules/mob/living/simple_animal/bot/floorbot.dm
index f0cc8285e8..f47f936db7 100644
--- a/code/modules/mob/living/simple_animal/bot/floorbot.dm
+++ b/code/modules/mob/living/simple_animal/bot/floorbot.dm
@@ -164,12 +164,7 @@
update_controls()
/mob/living/simple_animal/bot/floorbot/proc/empty_tiles()
- var/atom/Tsec = drop_location()
-
- while(specialtiles > initial(tiletype.max_amount))
- new tiletype(Tsec,initial(tiletype.max_amount))
- specialtiles -= initial(tiletype.max_amount)
- new tiletype(Tsec,specialtiles)
+ new tiletype(drop_location(), specialtiles)
specialtiles = 0
tiletype = null
@@ -378,8 +373,7 @@
if(prob(50))
drop_part(robot_arm, Tsec)
- var/obj/item/stack/tile/plasteel/T = new (Tsec)
- T.amount = 1
+ new /obj/item/stack/tile/plasteel(Tsec, 1)
do_sparks(3, TRUE, src)
..()
diff --git a/code/modules/mob/living/simple_animal/hostile/wumborian_fugu.dm b/code/modules/mob/living/simple_animal/hostile/wumborian_fugu.dm
index 4c9c916085..4917d3b74d 100644
--- a/code/modules/mob/living/simple_animal/hostile/wumborian_fugu.dm
+++ b/code/modules/mob/living/simple_animal/hostile/wumborian_fugu.dm
@@ -9,7 +9,7 @@
icon_dead = "Fugu_dead"
icon_gib = "syndicate_gib"
mob_biotypes = list(MOB_ORGANIC, MOB_BEAST)
- mouse_opacity = MOUSE_OPACITY_OPAQUE
+ mouse_opacity = MOUSE_OPACITY_ICON
move_to_delay = 5
friendly = "floats near"
speak_emote = list("puffs")
diff --git a/code/modules/mob/living/status_procs.dm b/code/modules/mob/living/status_procs.dm
index 106381bade..0a0f27f123 100644
--- a/code/modules/mob/living/status_procs.dm
+++ b/code/modules/mob/living/status_procs.dm
@@ -146,12 +146,12 @@
else
status_traits[trait] |= list(source)
-/mob/living/proc/add_trait_datum(trait, spawn_effects) //separate proc due to the way these ones are handled
- if(has_trait(trait))
+/mob/living/proc/add_quirk(quirk, spawn_effects) //separate proc due to the way these ones are handled
+ if(has_trait(quirk))
return
- if(!SStraits || !SStraits.traits[trait])
+ if(!SSquirks || !SSquirks.quirks[quirk])
return
- var/datum/trait/T = SStraits.traits[trait]
+ var/datum/quirk/T = SSquirks.quirks[quirk]
new T (src, spawn_effects)
return TRUE
@@ -180,8 +180,8 @@
if(!LAZYLEN(status_traits[trait]))
status_traits -= trait
-/mob/living/proc/remove_trait_datum(trait)
- var/datum/trait/T = roundstart_traits[trait]
+/mob/living/proc/remove_quirk(quirk)
+ var/datum/quirk/T = roundstart_quirks[quirk]
if(T)
qdel(T)
return TRUE
@@ -201,8 +201,8 @@
else if(LAZYLEN(status_traits[trait]))
return TRUE
-/mob/living/proc/has_trait_datum(trait)
- return roundstart_traits[trait]
+/mob/living/proc/has_quirk(quirk)
+ return roundstart_quirks[quirk]
/mob/living/proc/remove_all_traits()
status_traits = list()
diff --git a/code/modules/mob/say.dm b/code/modules/mob/say.dm
index 9ad832debe..2718392b69 100644
--- a/code/modules/mob/say.dm
+++ b/code/modules/mob/say.dm
@@ -70,7 +70,7 @@
message = src.say_quote(message, get_spans())
var/rendered = "DEAD: [name][alt_name] "
-
+ log_message("DEAD: [message]", INDIVIDUAL_SAY_LOG)
deadchat_broadcast(rendered, follow_target = src, speaker_key = K)
/mob/proc/check_emote(message)
diff --git a/code/modules/power/port_gen.dm b/code/modules/power/port_gen.dm
index 7cea950ccc..7a6e313cd0 100644
--- a/code/modules/power/port_gen.dm
+++ b/code/modules/power/port_gen.dm
@@ -111,13 +111,8 @@
/obj/machinery/power/port_gen/pacman/DropFuel()
if(sheets)
- var/fail_safe = FALSE
- while(sheets > 0 && fail_safe < 100)
- fail_safe += 1
- var/obj/item/stack/sheet/S = new sheet_path(loc)
- var/amount = min(sheets, S.max_amount)
- S.amount = amount
- sheets -= amount
+ new sheet_path(drop_location(), sheets)
+ sheets = 0
/obj/machinery/power/port_gen/pacman/UseFuel()
var/needed_sheets = 1 / (time_per_sheet * consumption / power_output)
diff --git a/code/modules/power/solar.dm b/code/modules/power/solar.dm
index f4c11009d1..d7e0bc66bc 100644
--- a/code/modules/power/solar.dm
+++ b/code/modules/power/solar.dm
@@ -191,12 +191,12 @@
// Give back the glass type we were supplied with
/obj/item/solar_assembly/proc/give_glass(device_broken)
+ var/atom/Tsec = drop_location()
if(device_broken)
- new /obj/item/shard(loc)
- new /obj/item/shard(loc)
+ new /obj/item/shard(Tsec)
+ new /obj/item/shard(Tsec)
else if(glass_type)
- var/obj/item/stack/sheet/S = new glass_type(loc)
- S.amount = 2
+ new glass_type(Tsec, 2)
glass_type = null
diff --git a/code/modules/projectiles/guns/ballistic/laser_gatling.dm b/code/modules/projectiles/guns/ballistic/laser_gatling.dm
index cc719f98ee..af44f998e1 100644
--- a/code/modules/projectiles/guns/ballistic/laser_gatling.dm
+++ b/code/modules/projectiles/guns/ballistic/laser_gatling.dm
@@ -40,7 +40,6 @@
to_chat(user, "You need a free hand to hold the gun!")
return
update_icon()
- gun.forceMove(user)
user.update_inv_back()
else
to_chat(user, "You are already holding the gun!")
diff --git a/code/modules/reagents/chemistry/machinery/chem_dispenser.dm b/code/modules/reagents/chemistry/machinery/chem_dispenser.dm
index 2db6058852..20db99fca1 100644
--- a/code/modules/reagents/chemistry/machinery/chem_dispenser.dm
+++ b/code/modules/reagents/chemistry/machinery/chem_dispenser.dm
@@ -433,7 +433,8 @@ obj/machinery/chem_dispenser/proc/work_animation()
"orangejuice",
"limejuice",
"tomatojuice",
- "lemonjuice"
+ "lemonjuice",
+ "menthol"
)
emagged_reagents = list(
"thirteenloko",
@@ -465,7 +466,8 @@ obj/machinery/chem_dispenser/proc/work_animation()
"hcider",
"creme_de_menthe",
"creme_de_cacao",
- "triple_sec"
+ "triple_sec",
+ "sake"
)
emagged_reagents = list(
"ethanol",
@@ -499,3 +501,17 @@ obj/machinery/chem_dispenser/proc/work_animation()
"ammonia",
"ash",
"diethylamine")
+
+/obj/machinery/chem_dispenser/fullupgrade //fully upgraded stock parts
+
+/obj/machinery/chem_dispenser/fullupgrade/Initialize()
+ . = ..()
+ component_parts = list()
+ component_parts += new /obj/item/circuitboard/machine/chem_dispenser(null)
+ component_parts += new /obj/item/stock_parts/matter_bin/bluespace(null)
+ component_parts += new /obj/item/stock_parts/matter_bin/bluespace(null)
+ component_parts += new /obj/item/stock_parts/capacitor/quadratic(null)
+ component_parts += new /obj/item/stock_parts/manipulator/femto(null)
+ component_parts += new /obj/item/stack/sheet/glass(null)
+ component_parts += new /obj/item/stock_parts/cell/bluespace(null)
+ RefreshParts()
diff --git a/code/modules/reagents/chemistry/machinery/chem_synthesizer.dm b/code/modules/reagents/chemistry/machinery/chem_synthesizer.dm
new file mode 100644
index 0000000000..4c57eb3524
--- /dev/null
+++ b/code/modules/reagents/chemistry/machinery/chem_synthesizer.dm
@@ -0,0 +1,85 @@
+/obj/machinery/chem_dispenser/chem_synthesizer //formerly SCP-294 made by mrty, but now only for testing purposes
+ name = "\improper debug chemical synthesizer"
+ desc = "If you see this, yell at adminbus."
+ icon = 'icons/obj/chemical.dmi'
+ icon_state = "dispenser"
+ amount = 10
+ resistance_flags = INDESTRUCTIBLE | FIRE_PROOF | ACID_PROOF | LAVA_PROOF
+ working_state = null
+ nopower_state = null
+ flags_1 = NODECONSTRUCT_1
+ var/static/list/shortcuts = list(
+ "meth" = "methamphetamine",
+ "tricord" = "tricordrazine"
+ )
+ var/mutable_appearance/top_overlay
+
+/obj/machinery/chem_dispenser/chem_synthesizer/Initialize()
+ . = ..()
+ GLOB.poi_list += src
+ top_overlay = mutable_appearance(icon, "disp_beaker", layer = ABOVE_ALL_MOB_LAYER)
+ update_icon()
+
+/obj/machinery/chem_dispenser/chem_synthesizer/update_icon()
+ cut_overlays()
+ add_overlay(top_overlay)
+
+/obj/machinery/chem_dispenser/chem_synthesizer/Destroy()
+ . = ..()
+ GLOB.poi_list -= src
+ QDEL_NULL(top_overlay)
+
+/obj/machinery/chem_dispenser/chem_synthesizer/display_beaker()
+ return
+
+/obj/machinery/chem_dispenser/chem_synthesizer/ui_interact(mob/user, ui_key = "main", datum/tgui/ui = null, force_open = FALSE, \
+ datum/tgui/master_ui = null, datum/ui_state/state = GLOB.default_state)
+ ui = SStgui.try_update_ui(user, src, ui_key, ui, force_open)
+ if(!ui)
+ ui = new(user, src, ui_key, "chem_synthesizer", name, 390, 315, master_ui, state)
+ ui.open()
+
+/obj/machinery/chem_dispenser/chem_synthesizer/ui_act(action, params)
+ if(..())
+ return
+ update_icon()
+ switch(action)
+ if("ejectBeaker")
+ if(beaker)
+ beaker.forceMove(drop_location())
+ if(Adjacent(usr) && !issilicon(usr))
+ usr.put_in_hands(beaker)
+ beaker = null
+ . = TRUE
+ if("input")
+ var/input_reagent = replacetext(lowertext(input("Enter the name of any liquid", "Input") as text), " ", "") //95% of the time, the reagent id is a lowercase/no spaces version of the name
+ if(shortcuts[input_reagent])
+ input_reagent = shortcuts[input_reagent]
+ else
+ input_reagent = find_reagent(input_reagent)
+ if(!input_reagent || !GLOB.chemical_reagents_list[input_reagent])
+ say("OUT OF RANGE")
+ return
+ else
+ if(!beaker)
+ return
+ else if(!beaker.reagents && !QDELETED(beaker))
+ beaker.create_reagents(beaker.volume)
+ beaker.reagents.add_reagent(input_reagent, amount)
+ if("makecup")
+ if(beaker)
+ return
+ beaker = new /obj/item/reagent_containers/glass/beaker/bluespace(src)
+ visible_message("[src] dispenses a bluespace beaker.")
+
+/obj/machinery/chem_dispenser/chem_synthesizer/proc/find_reagent(input)
+ . = FALSE
+ if(GLOB.chemical_reagents_list[input]) //prefer IDs!
+ var/datum/reagent/R = GLOB.chemical_reagents_list[input]
+ if(R.can_synth_debug)
+ return input
+ else
+ for(var/X in GLOB.chemical_reagents_list)
+ var/datum/reagent/R = GLOB.chemical_reagents_list[X]
+ if(R.can_synth_debug && input == replacetext(lowertext(R.name), " ", ""))
+ return X
diff --git a/code/modules/reagents/chemistry/reagents.dm b/code/modules/reagents/chemistry/reagents.dm
index 7369fd6042..f61644db0c 100644
--- a/code/modules/reagents/chemistry/reagents.dm
+++ b/code/modules/reagents/chemistry/reagents.dm
@@ -20,7 +20,8 @@
var/current_cycle = 0
var/volume = 0
var/color = "#000000" // rgb: 0, 0, 0
- var/can_synth = TRUE
+ var/can_synth = TRUE // can this reagent be synthesized? (for example: odysseus syringe gun)
+ var/can_synth_debug = TRUE // can this reagent be synthesized by the debug chem synthesizer?
var/metabolization_rate = REAGENTS_METABOLISM //how fast the reagent is metabolized by the mob
var/overrides_metab = 0
var/overdose_threshold = 0
diff --git a/code/modules/reagents/chemistry/reagents/alcohol_reagents.dm b/code/modules/reagents/chemistry/reagents/alcohol_reagents.dm
index 4be808f873..5230ea26f6 100644
--- a/code/modules/reagents/chemistry/reagents/alcohol_reagents.dm
+++ b/code/modules/reagents/chemistry/reagents/alcohol_reagents.dm
@@ -1546,4 +1546,70 @@ All effects don't start immediately, but rather get worse over time; the rate is
glass_desc = "It'll either knock the drunkenness out of you or knock you out cold. Both, probably."
/datum/reagent/consumable/ethanol/crevice_spike/on_mob_add(mob/living/L) //damage only applies when drink first enters system and won't again until drink metabolizes out
- L.adjustBruteLoss(3 * min(5,volume)) //minimum 3 brute damage on ingestion to limit non-drink means of injury - a full 5 unit gulp of the drink trucks you for the full 15
\ No newline at end of file
+ L.adjustBruteLoss(3 * min(5,volume)) //minimum 3 brute damage on ingestion to limit non-drink means of injury - a full 5 unit gulp of the drink trucks you for the full 15
+
+/datum/reagent/consumable/ethanol/sake
+ name = "Sake"
+ id = "sake"
+ description = "A sweet rice wine of questionable legality and extreme potency."
+ color = "#DDDDDD"
+ boozepwr = 70
+ taste_description = "sweet rice wine"
+ glass_icon_state = "sakecup"
+ glass_name = "cup of sake"
+ glass_desc = "A traditional cup of sake."
+
+/datum/reagent/consumable/ethanol/alexander
+ name = "Alexander"
+ id = "alexander"
+ description = "A creamy, indulgent delight that is stronger than it seems."
+ color = "#F5E9D3"
+ boozepwr = 80
+ taste_description = "bitter, creamy cacao"
+ glass_icon_state = "alexander"
+ glass_name = "Alexander"
+ glass_desc = "A creamy, indulgent delight that is stronger than it seems."
+
+/datum/reagent/consumable/ethanol/sidecar
+ name = "Sidecar"
+ id = "sidecar"
+ description = "The one ride you’ll gladly give up the wheel for."
+ color = "#FFC55B"
+ boozepwr = 80
+ taste_description = "delicious freedom"
+ glass_icon_state = "sidecar"
+ glass_name = "Sidecar"
+ glass_desc = "The one ride you’ll gladly give up the wheel for."
+
+/datum/reagent/consumable/ethanol/between_the_sheets
+ name = "Between the Sheets"
+ id = "between_the_sheets"
+ description = "A provocatively named classic."
+ color = "#F4C35A"
+ boozepwr = 80
+ taste_description = "seduction"
+ glass_icon_state = "between_the_sheets"
+ glass_name = "Between the Sheets"
+ glass_desc = "A provocatively named classic."
+
+/datum/reagent/consumable/ethanol/kamikaze
+ name = "Kamikaze"
+ id = "kamikaze"
+ description = "Divinely windy."
+ color = "#EEF191"
+ boozepwr = 60
+ taste_description = "divine windiness"
+ glass_icon_state = "kamikaze"
+ glass_name = "Kamikaze"
+ glass_desc = "Divinely windy."
+
+/datum/reagent/consumable/ethanol/mojito
+ name = "Mojito"
+ id = "mojito"
+ description = "A drink that looks as refreshing as it tastes."
+ color = "#DFFAD9"
+ boozepwr = 30
+ taste_description = "refreshing mint"
+ glass_icon_state = "mojito"
+ glass_name = "Mojito"
+ glass_desc = "A drink that looks as refreshing as it tastes."
diff --git a/code/modules/reagents/chemistry/reagents/drink_reagents.dm b/code/modules/reagents/chemistry/reagents/drink_reagents.dm
index 673b6e7059..5d5fdf2183 100644
--- a/code/modules/reagents/chemistry/reagents/drink_reagents.dm
+++ b/code/modules/reagents/chemistry/reagents/drink_reagents.dm
@@ -721,3 +721,13 @@
description = "Milk for cool kids."
color = "#7D4E29"
taste_description = "chocolate milk"
+
+/datum/reagent/consumable/menthol
+ name = "Menthol"
+ id = "menthol"
+ description = "Tastes naturally minty, and imparts a very mild numbing sensation."
+ color = "#80AF9C"
+ taste_description = "mint"
+ glass_icon_state = "glass_green"
+ glass_name = "glass of menthol"
+ glass_desc = "Tastes naturally minty, and imparts a very mild numbing sensation."
diff --git a/code/modules/reagents/chemistry/reagents/drug_reagents.dm b/code/modules/reagents/chemistry/reagents/drug_reagents.dm
index 32b96d2780..dd932f6215 100644
--- a/code/modules/reagents/chemistry/reagents/drug_reagents.dm
+++ b/code/modules/reagents/chemistry/reagents/drug_reagents.dm
@@ -57,15 +57,6 @@
..()
. = 1
-/datum/reagent/drug/menthol
- name = "Menthol"
- id = "menthol"
- description = "Tastes naturally minty, and imparts a very mild numbing sensation."
- taste_description = "mint"
- reagent_state = LIQUID
- color = "#80AF9C"
- trippy = FALSE
-
/datum/reagent/drug/crank
name = "Crank"
id = "crank"
diff --git a/code/modules/reagents/chemistry/reagents/other_reagents.dm b/code/modules/reagents/chemistry/reagents/other_reagents.dm
index 6a57ff0c18..81d55830d2 100644
--- a/code/modules/reagents/chemistry/reagents/other_reagents.dm
+++ b/code/modules/reagents/chemistry/reagents/other_reagents.dm
@@ -171,8 +171,7 @@
else if(istype(O, /obj/item/stack/sheet/hairlesshide))
var/obj/item/stack/sheet/hairlesshide/HH = O
- var/obj/item/stack/sheet/wetleather/WL = new(get_turf(HH))
- WL.amount = HH.amount
+ new /obj/item/stack/sheet/wetleather(get_turf(HH), HH.amount)
qdel(HH)
/*
diff --git a/code/modules/reagents/chemistry/reagents/toxin_reagents.dm b/code/modules/reagents/chemistry/reagents/toxin_reagents.dm
index 0972f32ad7..9d5c6c5a0f 100644
--- a/code/modules/reagents/chemistry/reagents/toxin_reagents.dm
+++ b/code/modules/reagents/chemistry/reagents/toxin_reagents.dm
@@ -728,7 +728,7 @@
/datum/reagent/toxin/rotatium/on_mob_life(mob/living/M)
if(M.hud_used)
if(current_cycle >= 20 && current_cycle%20 == 0)
- var/list/screens = list(M.hud_used.plane_masters["[GAME_PLANE]"], M.hud_used.plane_masters["[LIGHTING_PLANE]"])
+ var/list/screens = list(M.hud_used.plane_masters["[FLOOR_PLANE]"], M.hud_used.plane_masters["[GAME_PLANE]"], M.hud_used.plane_masters["[LIGHTING_PLANE]"])
var/rotation = min(round(current_cycle/20), 89) // By this point the player is probably puking and quitting anyway
for(var/whole_screen in screens)
animate(whole_screen, transform = matrix(rotation, MATRIX_ROTATE), time = 5, easing = QUAD_EASING, loop = -1)
@@ -737,7 +737,7 @@
/datum/reagent/toxin/rotatium/on_mob_delete(mob/living/M)
if(M && M.hud_used)
- var/list/screens = list(M.hud_used.plane_masters["[GAME_PLANE]"], M.hud_used.plane_masters["[LIGHTING_PLANE]"])
+ var/list/screens = list(M.hud_used.plane_masters["[FLOOR_PLANE]"], M.hud_used.plane_masters["[GAME_PLANE]"], M.hud_used.plane_masters["[LIGHTING_PLANE]"])
for(var/whole_screen in screens)
animate(whole_screen, transform = matrix(), time = 5, easing = QUAD_EASING)
..()
@@ -755,7 +755,7 @@
/datum/reagent/toxin/skewium/on_mob_life(mob/living/M)
if(M.hud_used)
if(current_cycle >= 5 && current_cycle % 3 == 0)
- var/list/screens = list(M.hud_used.plane_masters["[GAME_PLANE]"], M.hud_used.plane_masters["[LIGHTING_PLANE]"])
+ var/list/screens = list(M.hud_used.plane_masters["[FLOOR_PLANE]"], M.hud_used.plane_masters["[GAME_PLANE]"], M.hud_used.plane_masters["[LIGHTING_PLANE]"])
var/matrix/skew = matrix()
var/intensity = 8
skew.set_skew(rand(-intensity,intensity), rand(-intensity,intensity))
@@ -772,7 +772,7 @@
/datum/reagent/toxin/skewium/on_mob_delete(mob/living/M)
if(M && M.hud_used)
- var/list/screens = list(M.hud_used.plane_masters["[GAME_PLANE]"], M.hud_used.plane_masters["[LIGHTING_PLANE]"])
+ var/list/screens = list(M.hud_used.plane_masters["[FLOOR_PLANE]"], M.hud_used.plane_masters["[GAME_PLANE]"], M.hud_used.plane_masters["[LIGHTING_PLANE]"])
for(var/whole_screen in screens)
animate(whole_screen, transform = matrix(), time = 5, easing = QUAD_EASING)
..()
diff --git a/code/modules/research/designs/smelting_designs.dm b/code/modules/research/designs/smelting_designs.dm
index 821e6cee38..79a9748b08 100644
--- a/code/modules/research/designs/smelting_designs.dm
+++ b/code/modules/research/designs/smelting_designs.dm
@@ -21,15 +21,23 @@
name = "Plasma + Glass alloy"
id = "plasmaglass"
build_type = SMELTER
- materials = list(MAT_PLASMA = MINERAL_MATERIAL_AMOUNT, MAT_GLASS = MINERAL_MATERIAL_AMOUNT)
+ materials = list(MAT_PLASMA = MINERAL_MATERIAL_AMOUNT * 0.5, MAT_GLASS = MINERAL_MATERIAL_AMOUNT)
build_path = /obj/item/stack/sheet/plasmaglass
category = list("initial")
+/datum/design/plasmarglass_alloy
+ name = "Plasma + Metal + Glass alloy"
+ id = "plasmareinforcedglass"
+ build_type = SMELTER
+ materials = list(MAT_PLASMA = MINERAL_MATERIAL_AMOUNT * 0.5, MAT_METAL = MINERAL_MATERIAL_AMOUNT * 0.5, MAT_GLASS = MINERAL_MATERIAL_AMOUNT)
+ build_path = /obj/item/stack/sheet/plasmarglass
+ category = list("initial")
+
/datum/design/titaniumglass_alloy
name = "Titanium + Glass alloy"
id = "titaniumglass"
build_type = SMELTER
- materials = list(MAT_TITANIUM = MINERAL_MATERIAL_AMOUNT, MAT_GLASS = MINERAL_MATERIAL_AMOUNT)
+ materials = list(MAT_TITANIUM = MINERAL_MATERIAL_AMOUNT * 0.5, MAT_GLASS = MINERAL_MATERIAL_AMOUNT)
build_path = /obj/item/stack/sheet/titaniumglass
category = list("initial")
@@ -37,7 +45,7 @@
name = "Plasma + Titanium + Glass alloy"
id = "plastitaniumglass"
build_type = SMELTER
- materials = list(MAT_PLASMA = MINERAL_MATERIAL_AMOUNT, MAT_TITANIUM = MINERAL_MATERIAL_AMOUNT, MAT_GLASS = MINERAL_MATERIAL_AMOUNT)
+ materials = list(MAT_PLASMA = MINERAL_MATERIAL_AMOUNT * 0.5, MAT_TITANIUM = MINERAL_MATERIAL_AMOUNT * 0.5, MAT_GLASS = MINERAL_MATERIAL_AMOUNT)
build_path = /obj/item/stack/sheet/plastitaniumglass
category = list("initial")
diff --git a/code/modules/research/xenobiology/crossbreeding/_status_effects.dm b/code/modules/research/xenobiology/crossbreeding/_status_effects.dm
index ddbfdb8471..1c8e9ac350 100644
--- a/code/modules/research/xenobiology/crossbreeding/_status_effects.dm
+++ b/code/modules/research/xenobiology/crossbreeding/_status_effects.dm
@@ -448,8 +448,7 @@ datum/status_effect/stabilized/blue/on_remove()
else if(istype(O, /obj/item/stack/sheet/hairlesshide))
to_chat(owner, "[linked_extract] kept your hands wet! It wets [O]!")
var/obj/item/stack/sheet/hairlesshide/HH = O
- var/obj/item/stack/sheet/wetleather/WL = new(get_turf(HH))
- WL.amount = HH.amount
+ new /obj/item/stack/sheet/wetleather(get_turf(HH), HH.amount)
qdel(HH)
..()
diff --git a/code/modules/research/xenobiology/crossbreeding/charged.dm b/code/modules/research/xenobiology/crossbreeding/charged.dm
index 68aff64ee9..18b4e81398 100644
--- a/code/modules/research/xenobiology/crossbreeding/charged.dm
+++ b/code/modules/research/xenobiology/crossbreeding/charged.dm
@@ -66,10 +66,8 @@ Charged extracts:
colour = "metal"
/obj/item/slimecross/charged/metal/do_effect(mob/user)
- var/obj/item/stack/sheet/metal/M = new(get_turf(user))
- M.amount = 25
- var/obj/item/stack/sheet/plasteel/P = new(get_turf(user))
- P.amount = 10
+ new /obj/item/stack/sheet/metal(get_turf(user), 25)
+ new /obj/item/stack/sheet/plasteel(get_turf(user), 10)
user.visible_message("[src] grows into a plethora of metals!")
..()
@@ -85,8 +83,7 @@ Charged extracts:
colour = "dark purple"
/obj/item/slimecross/charged/darkpurple/do_effect(mob/user)
- var/obj/item/stack/sheet/mineral/plasma/M = new(get_turf(user))
- M.amount = 10
+ new /obj/item/stack/sheet/mineral/plasma(get_turf(user), 10)
user.visible_message("[src] produces a large amount of plasma!")
..()
@@ -113,8 +110,7 @@ Charged extracts:
colour = "bluespace"
/obj/item/slimecross/charged/bluespace/do_effect(mob/user)
- var/obj/item/stack/sheet/bluespace_crystal/M = new(get_turf(user))
- M.amount = 10
+ new /obj/item/stack/sheet/bluespace_crystal(get_turf(user), 10)
user.visible_message("[src] produces several sheets of polycrystal!")
..()
@@ -138,8 +134,7 @@ Charged extracts:
colour = "pyrite"
/obj/item/slimecross/charged/pyrite/do_effect(mob/user)
- var/obj/item/stack/sheet/mineral/bananium/M = new(get_turf(user))
- M.amount = 10
+ new /obj/item/stack/sheet/mineral/bananium(get_turf(user), 10)
user.visible_message("[src] solidifies with a horrifying banana stench!")
..()
diff --git a/code/modules/research/xenobiology/crossbreeding/industrial.dm b/code/modules/research/xenobiology/crossbreeding/industrial.dm
index 2503219e83..95f87ede0a 100644
--- a/code/modules/research/xenobiology/crossbreeding/industrial.dm
+++ b/code/modules/research/xenobiology/crossbreeding/industrial.dm
@@ -75,12 +75,7 @@ Industrial extracts:
/obj/item/slimecross/industrial/metal
colour = "metal"
plasmarequired = 3
- itempath = /obj/item/stack/sheet/metal
-
-/obj/item/slimecross/industrial/metal/do_after_spawn(obj/item/spawned)
- var/obj/item/stack/sheet/metal/M = spawned
- if(istype(M))
- M.amount = 10
+ itempath = /obj/item/stack/sheet/metal/ten
/obj/item/slimecross/industrial/yellow
colour = "yellow"
diff --git a/code/modules/tooltip/tooltip.dm b/code/modules/tooltip/tooltip.dm
index 5110b98e8e..ab7dc91739 100644
--- a/code/modules/tooltip/tooltip.dm
+++ b/code/modules/tooltip/tooltip.dm
@@ -42,6 +42,8 @@ Notes:
/datum/tooltip/New(client/C)
if (C)
owner = C
+ var/datum/asset/stuff = get_asset_datum(/datum/asset/simple/jquery)
+ stuff.send(owner)
owner << browse(file2text('code/modules/tooltip/tooltip.html'), "window=[control]")
..()
diff --git a/code/modules/vending/boozeomat.dm b/code/modules/vending/boozeomat.dm
index eddb01171b..59b41d4cef 100644
--- a/code/modules/vending/boozeomat.dm
+++ b/code/modules/vending/boozeomat.dm
@@ -19,6 +19,7 @@
/obj/item/reagent_containers/food/drinks/bottle/orangejuice = 4,
/obj/item/reagent_containers/food/drinks/bottle/tomatojuice = 4,
/obj/item/reagent_containers/food/drinks/bottle/limejuice = 4,
+ /obj/item/reagent_containers/food/drinks/bottle/menthol = 4,
/obj/item/reagent_containers/food/drinks/bottle/cream = 4,
/obj/item/reagent_containers/food/drinks/soda_cans/tonic = 8,
/obj/item/reagent_containers/food/drinks/soda_cans/cola = 8,
@@ -37,5 +38,5 @@
/obj/item/vending_refill/boozeomat
machine_name = "Booze-O-Mat"
icon_state = "refill_booze"
- charges = list(58, 4, 0)//of 174 standard, 12 contraband
- init_charges = list(58, 4, 0)
+ charges = list(59, 4, 0)//of 178 standard, 12 contraband
+ init_charges = list(59, 4, 0)
diff --git a/config/game_options.txt b/config/game_options.txt
index 5f080a7f0f..6ecec1fc9e 100644
--- a/config/game_options.txt
+++ b/config/game_options.txt
@@ -536,7 +536,8 @@ ALLOW_MISCREANTS
## Determines if players are allowed to print integrated circuits, uncomment to allow.
#IC_PRINTING
-## Uncomment to allow roundstart trait selection in the character setup menu.
+## Uncomment to allow roundstart quirk selection in the character setup menu.
+## This used to be named traits, hence the config name, but it handles quirks, not the other kind of trait!
ROUNDSTART_TRAITS
## Uncomment to disable human moods.
diff --git a/html/changelogs/AutoChangeLog-pr-6663.yml b/html/changelogs/AutoChangeLog-pr-6663.yml
new file mode 100644
index 0000000000..97e977b062
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-6663.yml
@@ -0,0 +1,4 @@
+author: "Xhuis"
+delete-after: True
+changes:
+ - tweak: "Character traits are now called character quirks. Functionality remains unaffected."
diff --git a/icons/mob/custom_w.dmi b/icons/mob/custom_w.dmi
index 6b17cc3acb..7c7499ee42 100644
Binary files a/icons/mob/custom_w.dmi and b/icons/mob/custom_w.dmi differ
diff --git a/icons/mob/lavaland/64x64megafauna.dmi b/icons/mob/lavaland/64x64megafauna.dmi
index 64304fdcd1..1794c789de 100644
Binary files a/icons/mob/lavaland/64x64megafauna.dmi and b/icons/mob/lavaland/64x64megafauna.dmi differ
diff --git a/icons/mob/lavaland/lavaland_monsters.dmi b/icons/mob/lavaland/lavaland_monsters.dmi
index dac70998f5..f8394dd235 100644
Binary files a/icons/mob/lavaland/lavaland_monsters.dmi and b/icons/mob/lavaland/lavaland_monsters.dmi differ
diff --git a/icons/mob/uniform.dmi b/icons/mob/uniform.dmi
index 34c0ce3253..23541a8e40 100644
Binary files a/icons/mob/uniform.dmi and b/icons/mob/uniform.dmi differ
diff --git a/icons/obj/clothing/uniforms.dmi b/icons/obj/clothing/uniforms.dmi
index 3635744b6f..c6f6798076 100644
Binary files a/icons/obj/clothing/uniforms.dmi and b/icons/obj/clothing/uniforms.dmi differ
diff --git a/icons/obj/custom.dmi b/icons/obj/custom.dmi
index de5fce96a5..419b14f526 100644
Binary files a/icons/obj/custom.dmi and b/icons/obj/custom.dmi differ
diff --git a/icons/obj/food/burgerbread.dmi b/icons/obj/food/burgerbread.dmi
index 64fac1c3eb..c40dfaaa22 100644
Binary files a/icons/obj/food/burgerbread.dmi and b/icons/obj/food/burgerbread.dmi differ
diff --git a/icons/obj/food/food.dmi b/icons/obj/food/food.dmi
index b3774b26ab..a053eab792 100644
Binary files a/icons/obj/food/food.dmi and b/icons/obj/food/food.dmi differ
diff --git a/icons/obj/vending.dmi b/icons/obj/vending.dmi
index a1471e6418..f66480f3aa 100644
Binary files a/icons/obj/vending.dmi and b/icons/obj/vending.dmi differ
diff --git a/modular_citadel/code/datums/traits/neutral.dm b/modular_citadel/code/datums/traits/neutral.dm
index 2bb9c3a356..264dbfef0a 100644
--- a/modular_citadel/code/datums/traits/neutral.dm
+++ b/modular_citadel/code/datums/traits/neutral.dm
@@ -1,24 +1,24 @@
// Citadel-specific Neutral Traits
-/datum/trait/libido
+/datum/quirk/libido
name = "Nymphomania"
desc = "You're always feeling a bit in heat. Also, you get aroused faster than usual."
value = 0
gain_text = "You are feeling extra wild."
lose_text = "You don't feel that burning sensation anymore."
-/datum/trait/libido/add()
- var/mob/living/M = trait_holder
+/datum/quirk/libido/add()
+ var/mob/living/M = quirk_holder
M.min_arousal = 16
M.arousal_rate = 3
-/datum/trait/libido/remove()
- var/mob/living/M = trait_holder
+/datum/quirk/libido/remove()
+ var/mob/living/M = quirk_holder
M.min_arousal = initial(M.min_arousal)
M.arousal_rate = initial(M.arousal_rate)
-/datum/trait/libido/on_process()
- var/mob/living/M = trait_holder
+/datum/quirk/libido/on_process()
+ var/mob/living/M = quirk_holder
if(M.canbearoused == FALSE)
- to_chat(trait_holder, "Having high libido is useless when you can't feel arousal at all!")
+ to_chat(quirk_holder, "Having high libido is useless when you can't feel arousal at all!")
qdel(src)
diff --git a/modular_citadel/code/modules/client/loadout/__donator.dm b/modular_citadel/code/modules/client/loadout/__donator.dm
index 62924c7305..24f454fd1f 100644
--- a/modular_citadel/code/modules/client/loadout/__donator.dm
+++ b/modular_citadel/code/modules/client/loadout/__donator.dm
@@ -271,10 +271,16 @@ datum/gear/darksabresheath
category = slot_in_backpack
path = /obj/item/clothing/neck/cloak/polychromic/polyce
ckeywhitelist = list("worksbythesea", "blakeryan")
-
+
/datum/gear/ssk
name = "Stun Sword Kit"
category = slot_in_backpack
path = /obj/item/ssword_kit
ckeywhitelist = list("phillip458")
+/datum/gear/techcoat
+ name = "Techomancers Labcoat"
+ category = slot_in_backpack
+ path = /obj/item/clothing/suit/toggle/labcoat/mad/techcoat
+ ckeywhitelist = list("wilchen")
+
diff --git a/modular_citadel/code/modules/custom_loadout/custom_items.dm b/modular_citadel/code/modules/custom_loadout/custom_items.dm
index 481a105749..6c4647f0a2 100644
--- a/modular_citadel/code/modules/custom_loadout/custom_items.dm
+++ b/modular_citadel/code/modules/custom_loadout/custom_items.dm
@@ -343,3 +343,11 @@
desc = "A piece of paper folded into neat little hat."
icon_state = "paperhat"
item_state = "paperhat"
+
+/obj/item/clothing/suit/toggle/labcoat/mad/techcoat
+ name = "Techomancers Labcoat"
+ desc = "An oddly special looking coat."
+ icon = 'icons/obj/custom.dmi'
+ icon_state = "rdcoat"
+ icon_override = 'icons/mob/custom_w.dmi'
+ item_state = "rdcoat"
diff --git a/tgstation.dme b/tgstation.dme
index 586f662b03..d356f887a4 100755
--- a/tgstation.dme
+++ b/tgstation.dme
@@ -261,7 +261,7 @@
#include "code\controllers\subsystem\processing\obj.dm"
#include "code\controllers\subsystem\processing\processing.dm"
#include "code\controllers\subsystem\processing\projectiles.dm"
-#include "code\controllers\subsystem\processing\traits.dm"
+#include "code\controllers\subsystem\processing\quirks.dm"
#include "code\controllers\subsystem\processing\wet_floors.dm"
#include "code\datums\action.dm"
#include "code\datums\ai_laws.dm"
@@ -316,6 +316,7 @@
#include "code\datums\components\_component.dm"
#include "code\datums\components\anti_magic.dm"
#include "code\datums\components\archaeology.dm"
+#include "code\datums\components\armor_plate.dm"
#include "code\datums\components\beauty.dm"
#include "code\datums\components\butchering.dm"
#include "code\datums\components\caltrop.dm"
@@ -444,7 +445,7 @@
#include "code\datums\status_effects\gas.dm"
#include "code\datums\status_effects\neutral.dm"
#include "code\datums\status_effects\status_effect.dm"
-#include "code\datums\traits\_trait.dm"
+#include "code\datums\traits\_quirk.dm"
#include "code\datums\traits\good.dm"
#include "code\datums\traits\negative.dm"
#include "code\datums\traits\neutral.dm"
@@ -2332,6 +2333,7 @@
#include "code\modules\reagents\chemistry\machinery\chem_dispenser.dm"
#include "code\modules\reagents\chemistry\machinery\chem_heater.dm"
#include "code\modules\reagents\chemistry\machinery\chem_master.dm"
+#include "code\modules\reagents\chemistry\machinery\chem_synthesizer.dm"
#include "code\modules\reagents\chemistry\machinery\pandemic.dm"
#include "code\modules\reagents\chemistry\machinery\reagentgrinder.dm"
#include "code\modules\reagents\chemistry\machinery\smoke_machine.dm"
diff --git a/tgui/src/interfaces/chem_synthesizer.ract b/tgui/src/interfaces/chem_synthesizer.ract
new file mode 100644
index 0000000000..f57bd4ba71
--- /dev/null
+++ b/tgui/src/interfaces/chem_synthesizer.ract
@@ -0,0 +1,21 @@
++ {{else}} + Recipient Empty + {{/each}} + {{else}} + No Recipient + {{/if}} + |