"
dat += " (Return to main menu) "
diff --git a/code/modules/lighting/lighting_atom.dm b/code/modules/lighting/lighting_atom.dm
index 8712a66290..779dd9c3ea 100644
--- a/code/modules/lighting/lighting_atom.dm
+++ b/code/modules/lighting/lighting_atom.dm
@@ -38,7 +38,7 @@
if (!light_power || !light_range) // We won't emit light anyways, destroy the light source.
QDEL_NULL(light)
else
- if (!ismovableatom(loc)) // We choose what atom should be the top atom of the light here.
+ if (!ismovable(loc)) // We choose what atom should be the top atom of the light here.
. = src
else
. = loc
diff --git a/code/modules/mapping/map_template.dm b/code/modules/mapping/map_template.dm
index 3e361179de..873c10fc02 100644
--- a/code/modules/mapping/map_template.dm
+++ b/code/modules/mapping/map_template.dm
@@ -55,11 +55,11 @@
SSmachines.setup_template_powernets(cables)
SSair.setup_template_machinery(atmos_machines)
-/datum/map_template/proc/load_new_z()
+/datum/map_template/proc/load_new_z(list/traits = list(ZTRAIT_AWAY = TRUE))
var/x = round((world.maxx - width)/2)
var/y = round((world.maxy - height)/2)
- var/datum/space_level/level = SSmapping.add_new_zlevel(name, list(ZTRAIT_AWAY = TRUE))
+ var/datum/space_level/level = SSmapping.add_new_zlevel(name, traits)
var/datum/parsed_map/parsed = load_map(file(mappath), x, y, level.z_value, no_changeturf=(SSatoms.initialized == INITIALIZATION_INSSATOMS), placeOnTop=TRUE)
var/list/bounds = parsed.bounds
if(!bounds)
@@ -121,6 +121,6 @@
//for your ever biggening badminnery kevinz000
//❤ - Cyberboss
-/proc/load_new_z_level(var/file, var/name)
+/proc/load_new_z_level(file, name, list/traits)
var/datum/map_template/template = new(file, name)
- template.load_new_z()
+ return template.load_new_z(traits)
diff --git a/code/modules/mapping/reader.dm b/code/modules/mapping/reader.dm
index 86b501c455..e7d7fd4898 100644
--- a/code/modules/mapping/reader.dm
+++ b/code/modules/mapping/reader.dm
@@ -93,7 +93,7 @@
gridSet.ycrd = text2num(dmmRegex.group[4])
gridSet.zcrd = text2num(dmmRegex.group[5])
- bounds[MAP_MINX] = min(bounds[MAP_MINX], CLAMP(gridSet.xcrd, x_lower, x_upper))
+ bounds[MAP_MINX] = min(bounds[MAP_MINX], clamp(gridSet.xcrd, x_lower, x_upper))
bounds[MAP_MINZ] = min(bounds[MAP_MINZ], gridSet.zcrd)
bounds[MAP_MAXZ] = max(bounds[MAP_MAXZ], gridSet.zcrd)
@@ -113,15 +113,15 @@
if(gridLines.len && gridLines[gridLines.len] == "")
gridLines.Cut(gridLines.len) // Remove only one blank line at the end.
- bounds[MAP_MINY] = min(bounds[MAP_MINY], CLAMP(gridSet.ycrd, y_lower, y_upper))
+ bounds[MAP_MINY] = min(bounds[MAP_MINY], clamp(gridSet.ycrd, y_lower, y_upper))
gridSet.ycrd += gridLines.len - 1 // Start at the top and work down
- bounds[MAP_MAXY] = max(bounds[MAP_MAXY], CLAMP(gridSet.ycrd, y_lower, y_upper))
+ bounds[MAP_MAXY] = max(bounds[MAP_MAXY], clamp(gridSet.ycrd, y_lower, y_upper))
var/maxx = gridSet.xcrd
if(gridLines.len) //Not an empty map
maxx = max(maxx, gridSet.xcrd + length(gridLines[1]) / key_len - 1)
- bounds[MAP_MAXX] = CLAMP(max(bounds[MAP_MAXX], maxx), x_lower, x_upper)
+ bounds[MAP_MAXX] = clamp(max(bounds[MAP_MAXX], maxx), x_lower, x_upper)
CHECK_TICK
// Indicate failure to parse any coordinates by nulling bounds
diff --git a/code/modules/mining/lavaland/necropolis_chests.dm b/code/modules/mining/lavaland/necropolis_chests.dm
index 56e1a04b95..4dd86a847a 100644
--- a/code/modules/mining/lavaland/necropolis_chests.dm
+++ b/code/modules/mining/lavaland/necropolis_chests.dm
@@ -428,7 +428,7 @@
/obj/item/projectile/hook/on_hit(atom/target)
. = ..()
- if(ismovableatom(target))
+ if(ismovable(target))
var/atom/movable/A = target
if(A.anchored)
return
@@ -833,13 +833,13 @@
force = 0
var/ghost_counter = ghost_check()
- force = CLAMP((ghost_counter * 4), 0, 75)
+ force = clamp((ghost_counter * 4), 0, 75)
user.visible_message("[user] strikes with the force of [ghost_counter] vengeful spirits!")
return ..()
/obj/item/melee/ghost_sword/run_block(mob/living/owner, atom/object, damage, attack_text, attack_type, armour_penetration, mob/attacker, def_zone, final_block_chance, list/block_return)
var/ghost_counter = ghost_check()
- final_block_chance += CLAMP((ghost_counter * 5), 0, 75)
+ final_block_chance += clamp((ghost_counter * 5), 0, 75)
owner.visible_message("[owner] is protected by a ring of [ghost_counter] ghosts!")
return ..()
diff --git a/code/modules/mining/machine_silo.dm b/code/modules/mining/machine_silo.dm
index c0356dd1ab..09246abc46 100644
--- a/code/modules/mining/machine_silo.dm
+++ b/code/modules/mining/machine_silo.dm
@@ -116,7 +116,7 @@ GLOBAL_LIST_EMPTY(silo_access_logs)
var/list/logs = GLOB.silo_access_logs[REF(src)]
var/len = LAZYLEN(logs)
var/num_pages = 1 + round((len - 1) / 30)
- var/page = CLAMP(log_page, 1, num_pages)
+ var/page = clamp(log_page, 1, num_pages)
if(num_pages > 1)
for(var/i in 1 to num_pages)
if(i == page)
diff --git a/code/modules/mining/machine_vending.dm b/code/modules/mining/machine_vending.dm
index 0182dec254..bcb196a103 100644
--- a/code/modules/mining/machine_vending.dm
+++ b/code/modules/mining/machine_vending.dm
@@ -194,7 +194,7 @@
prize_list += list(
new /datum/data/mining_equipment("Extra Id", /obj/item/card/id/mining, 250),
new /datum/data/mining_equipment("Science Goggles", /obj/item/clothing/glasses/science, 250),
- new /datum/data/mining_equipment("Monkey Cube", /obj/item/reagent_containers/food/snacks/monkeycube, 300),
+ new /datum/data/mining_equipment("Monkey Cube", /obj/item/reagent_containers/food/snacks/cube/monkey, 300),
new /datum/data/mining_equipment("Toolbelt", /obj/item/storage/belt/utility, 350),
new /datum/data/mining_equipment("Royal Cape of the Liberator", /obj/item/bedsheet/rd/royal_cape, 500),
new /datum/data/mining_equipment("Grey Slime Extract", /obj/item/slime_extract/grey, 1000),
diff --git a/code/modules/mining/mint.dm b/code/modules/mining/mint.dm
index d04c0104e5..e89bbef58d 100644
--- a/code/modules/mining/mint.dm
+++ b/code/modules/mining/mint.dm
@@ -87,7 +87,7 @@
if(istype(new_material))
chosen = new_material
if(href_list["chooseAmt"])
- coinsToProduce = CLAMP(coinsToProduce + text2num(href_list["chooseAmt"]), 0, 1000)
+ coinsToProduce = clamp(coinsToProduce + text2num(href_list["chooseAmt"]), 0, 1000)
updateUsrDialog()
if(href_list["makeCoins"])
var/temp_coins = coinsToProduce
diff --git a/code/modules/mob/dead/new_player/preferences_setup.dm b/code/modules/mob/dead/new_player/preferences_setup.dm
index b669e30a06..317efc2c1f 100644
--- a/code/modules/mob/dead/new_player/preferences_setup.dm
+++ b/code/modules/mob/dead/new_player/preferences_setup.dm
@@ -23,11 +23,7 @@
if(!pref_species)
var/rando_race = pick(GLOB.roundstart_races)
pref_species = new rando_race()
- features = random_features(pref_species?.id)
- if(gender == MALE || gender != FEMALE)
- features["body_model"] = gender
- else if(gender == PLURAL)
- features["body_model"] = pick(MALE,FEMALE)
+ features = random_features(pref_species?.id, gender)
age = rand(AGE_MIN,AGE_MAX)
/datum/preferences/proc/update_preview_icon(equip_job = TRUE)
diff --git a/code/modules/mob/dead/new_player/sprite_accessories/pines.dm b/code/modules/mob/dead/new_player/sprite_accessories/spines.dm
similarity index 100%
rename from code/modules/mob/dead/new_player/sprite_accessories/pines.dm
rename to code/modules/mob/dead/new_player/sprite_accessories/spines.dm
diff --git a/code/modules/mob/dead/observer/observer.dm b/code/modules/mob/dead/observer/observer.dm
index b2d02d8fa2..dc7384124d 100644
--- a/code/modules/mob/dead/observer/observer.dm
+++ b/code/modules/mob/dead/observer/observer.dm
@@ -570,7 +570,7 @@ This is the proc mobs get to turn into a ghost. Forked from ghostize due to comp
views |= i
var/new_view = input("Choose your new view", "Modify view range", 7) as null|anything in views
if(new_view)
- client.change_view(CLAMP(new_view, 7, max_view))
+ client.change_view(clamp(new_view, 7, max_view))
else
client.change_view(CONFIG_GET(string/default_view))
diff --git a/code/modules/mob/inventory.dm b/code/modules/mob/inventory.dm
index 9f7d2067de..fad3a7e534 100644
--- a/code/modules/mob/inventory.dm
+++ b/code/modules/mob/inventory.dm
@@ -333,7 +333,8 @@
I.moveToNullspace()
else
I.forceMove(newloc)
- I.dropped(src)
+ if(I.dropped(src) == ITEM_RELOCATED_BY_DROPPED)
+ return FALSE
return TRUE
//Outdated but still in use apparently. This should at least be a human proc.
diff --git a/code/modules/mob/living/brain/brain_item.dm b/code/modules/mob/living/brain/brain_item.dm
index f32d84ae73..4cb93a1b6a 100644
--- a/code/modules/mob/living/brain/brain_item.dm
+++ b/code/modules/mob/living/brain/brain_item.dm
@@ -229,7 +229,7 @@
var/adjusted_amount
if(amount >= 0 && maximum)
var/brainloss = get_brain_damage()
- var/new_brainloss = CLAMP(brainloss + amount, 0, maximum)
+ var/new_brainloss = clamp(brainloss + amount, 0, maximum)
if(brainloss > new_brainloss) //brainloss is over the cap already
return 0
adjusted_amount = new_brainloss - brainloss
diff --git a/code/modules/mob/living/carbon/alien/alien.dm b/code/modules/mob/living/carbon/alien/alien.dm
index bd24a4b4c4..bf9854e0b4 100644
--- a/code/modules/mob/living/carbon/alien/alien.dm
+++ b/code/modules/mob/living/carbon/alien/alien.dm
@@ -12,6 +12,13 @@
bubble_icon = "alien"
type_of_meat = /obj/item/reagent_containers/food/snacks/meat/slab/xeno
+ /// How much brute damage without armor piercing they do against mobs in melee
+ var/meleeSlashHumanPower = 20
+ /// How much power they have for DefaultCombatKnockdown when attacking humans
+ var/meleeKnockdownPower = 100
+ /// How much brute damage they do to simple animals
+ var/meleeSlashSAPower = 35
+
var/obj/item/card/id/wear_id = null // Fix for station bounced radios -- Skie
var/has_fine_manipulation = 0
var/move_delay_add = 0 // movement delay to add
diff --git a/code/modules/mob/living/carbon/alien/humanoid/caste/drone.dm b/code/modules/mob/living/carbon/alien/humanoid/caste/drone.dm
index 183bf07e8c..072c4e0231 100644
--- a/code/modules/mob/living/carbon/alien/humanoid/caste/drone.dm
+++ b/code/modules/mob/living/carbon/alien/humanoid/caste/drone.dm
@@ -4,6 +4,7 @@
maxHealth = 125
health = 125
icon_state = "aliend"
+ meleeKnockdownPower = 80
/mob/living/carbon/alien/humanoid/drone/Initialize()
AddAbility(new/obj/effect/proc_holder/alien/evolve(null))
diff --git a/code/modules/mob/living/carbon/alien/humanoid/caste/hunter.dm b/code/modules/mob/living/carbon/alien/humanoid/caste/hunter.dm
index faea8e9bbc..85204e5ab9 100644
--- a/code/modules/mob/living/carbon/alien/humanoid/caste/hunter.dm
+++ b/code/modules/mob/living/carbon/alien/humanoid/caste/hunter.dm
@@ -1,9 +1,12 @@
/mob/living/carbon/alien/humanoid/hunter
name = "alien hunter"
caste = "h"
- maxHealth = 125
- health = 125
+ maxHealth = 170
+ health = 170
icon_state = "alienh"
+ meleeKnockdownPower = 75
+ meleeSlashHumanPower = 20
+ meleeSlashSAPower = 45
var/obj/screen/leap_icon = null
/mob/living/carbon/alien/humanoid/hunter/create_internal_organs()
@@ -68,6 +71,7 @@
else
L.visible_message("[src] pounces on [L]!", "[src] pounces on you!")
L.DefaultCombatKnockdown(100)
+ L.Stagger(4 SECONDS)
sleep(2)//Runtime prevention (infinite bump() calls on hulks)
step_towards(src,L)
diff --git a/code/modules/mob/living/carbon/alien/humanoid/caste/sentinel.dm b/code/modules/mob/living/carbon/alien/humanoid/caste/sentinel.dm
index 7c6443cfae..67cf6f7d25 100644
--- a/code/modules/mob/living/carbon/alien/humanoid/caste/sentinel.dm
+++ b/code/modules/mob/living/carbon/alien/humanoid/caste/sentinel.dm
@@ -1,9 +1,10 @@
/mob/living/carbon/alien/humanoid/sentinel
name = "alien sentinel"
caste = "s"
- maxHealth = 150
- health = 150
+ maxHealth = 140
+ health = 140
icon_state = "aliens"
+ meleeSlashHumanPower = 15
/mob/living/carbon/alien/humanoid/sentinel/Initialize()
AddAbility(new /obj/effect/proc_holder/alien/sneak)
diff --git a/code/modules/mob/living/carbon/alien/humanoid/humanoid.dm b/code/modules/mob/living/carbon/alien/humanoid/humanoid.dm
index 048b5062ec..c813ce40f0 100644
--- a/code/modules/mob/living/carbon/alien/humanoid/humanoid.dm
+++ b/code/modules/mob/living/carbon/alien/humanoid/humanoid.dm
@@ -112,7 +112,6 @@
return A
return FALSE
-
/mob/living/carbon/alien/humanoid/check_breath(datum/gas_mixture/breath)
if(breath && breath.total_moles() > 0 && !sneaking)
playsound(get_turf(src), pick('sound/voice/lowHiss2.ogg', 'sound/voice/lowHiss3.ogg', 'sound/voice/lowHiss4.ogg'), 50, 0, -5)
diff --git a/code/modules/mob/living/carbon/alien/humanoid/humanoid_defense.dm b/code/modules/mob/living/carbon/alien/humanoid/humanoid_defense.dm
index 1d613db07a..5ebf6210d0 100644
--- a/code/modules/mob/living/carbon/alien/humanoid/humanoid_defense.dm
+++ b/code/modules/mob/living/carbon/alien/humanoid/humanoid_defense.dm
@@ -1,4 +1,3 @@
-
/mob/living/carbon/alien/humanoid/grabbedby(mob/living/carbon/user, supress_message = 0)
if(user == src && pulling && grab_state >= GRAB_AGGRESSIVE && !pulling.anchored && iscarbon(pulling))
devour_mob(pulling, devour_time = 60)
diff --git a/code/modules/mob/living/carbon/alien/humanoid/life.dm b/code/modules/mob/living/carbon/alien/humanoid/life.dm
index fd6a73ae7b..67c9285377 100644
--- a/code/modules/mob/living/carbon/alien/humanoid/life.dm
+++ b/code/modules/mob/living/carbon/alien/humanoid/life.dm
@@ -1,5 +1,3 @@
-
-
/mob/living/carbon/alien/humanoid/proc/adjust_body_temperature(current, loc_temp, boost)
var/temperature = current
var/difference = abs(current-loc_temp) //get difference
diff --git a/code/modules/mob/living/carbon/alien/humanoid/queen.dm b/code/modules/mob/living/carbon/alien/humanoid/queen.dm
index 6141a97c12..1200220ce4 100644
--- a/code/modules/mob/living/carbon/alien/humanoid/queen.dm
+++ b/code/modules/mob/living/carbon/alien/humanoid/queen.dm
@@ -11,6 +11,10 @@
pressure_resistance = 200 //Because big, stompy xenos should not be blown around like paper.
butcher_results = list(/obj/item/reagent_containers/food/snacks/meat/slab/xeno = 20, /obj/item/stack/sheet/animalhide/xeno = 3)
+ meleeKnockdownPower = 125
+ meleeSlashHumanPower = 30
+ meleeSlashSAPower = 60
+
var/alt_inhands_file = 'icons/mob/alienqueen.dmi'
/mob/living/carbon/alien/humanoid/royal/can_inject(mob/user, error_msg, target_zone, penetrate_thick = FALSE, bypass_immunity = FALSE)
diff --git a/code/modules/mob/living/carbon/alien/larva/larva.dm b/code/modules/mob/living/carbon/alien/larva/larva.dm
index fb26a40350..93050a4f9d 100644
--- a/code/modules/mob/living/carbon/alien/larva/larva.dm
+++ b/code/modules/mob/living/carbon/alien/larva/larva.dm
@@ -6,6 +6,7 @@
mob_size = MOB_SIZE_SMALL
density = FALSE
hud_type = /datum/hud/larva
+ mouse_opacity = MOUSE_OPACITY_OPAQUE
maxHealth = 25
health = 25
diff --git a/code/modules/mob/living/carbon/alien/status_procs.dm b/code/modules/mob/living/carbon/alien/status_procs.dm
index 4a63a72686..71d61cab25 100644
--- a/code/modules/mob/living/carbon/alien/status_procs.dm
+++ b/code/modules/mob/living/carbon/alien/status_procs.dm
@@ -20,5 +20,5 @@
/mob/living/carbon/alien/AdjustStun(amount, updating = 1, ignore_canstun = 0)
. = ..()
if(!.)
- move_delay_add = CLAMP(move_delay_add + round(amount/2), 0, 10)
+ move_delay_add = clamp(move_delay_add + round(amount/2), 0, 10)
*/
diff --git a/code/modules/mob/living/carbon/carbon.dm b/code/modules/mob/living/carbon/carbon.dm
index 25f0cb5b89..cef445113b 100644
--- a/code/modules/mob/living/carbon/carbon.dm
+++ b/code/modules/mob/living/carbon/carbon.dm
@@ -7,6 +7,7 @@
update_body_parts() //to update the carbon's new bodyparts appearance
GLOB.carbon_list += src
blood_volume = (BLOOD_VOLUME_NORMAL * blood_ratio)
+ add_movespeed_modifier(/datum/movespeed_modifier/carbon_crawling)
/mob/living/carbon/Destroy()
//This must be done first, so the mob ghosts correctly before DNA etc is nulled
@@ -98,6 +99,8 @@
/mob/living/carbon/throw_impact(atom/hit_atom, datum/thrownthing/throwingdatum)
. = ..()
var/hurt = TRUE
+ if(GetComponent(/datum/component/tackler))
+ return
if(throwingdatum?.thrower && iscyborg(throwingdatum.thrower))
var/mob/living/silicon/robot/R = throwingdatum.thrower
if(!R.emagged)
@@ -572,9 +575,9 @@
become_husk("burn")
med_hud_set_health()
if(stat == SOFT_CRIT)
- add_movespeed_modifier(MOVESPEED_ID_CARBON_SOFTCRIT, TRUE, multiplicative_slowdown = SOFTCRIT_ADD_SLOWDOWN)
+ add_movespeed_modifier(/datum/movespeed_modifier/carbon_softcrit)
else
- remove_movespeed_modifier(MOVESPEED_ID_CARBON_SOFTCRIT, TRUE)
+ remove_movespeed_modifier(/datum/movespeed_modifier/carbon_softcrit)
/mob/living/carbon/update_stamina()
var/stam = getStaminaLoss()
diff --git a/code/modules/mob/living/carbon/carbon_defines.dm b/code/modules/mob/living/carbon/carbon_defines.dm
index 689ab56842..15413f76d4 100644
--- a/code/modules/mob/living/carbon/carbon_defines.dm
+++ b/code/modules/mob/living/carbon/carbon_defines.dm
@@ -63,3 +63,4 @@
var/damageoverlaytemp = 0
var/drunkenness = 0 //Overall drunkenness - check handle_alcohol() in life.dm for effects
+ var/tackling = FALSE //Whether or not we are tackling, this will prevent the knock into effects for carbons
diff --git a/code/modules/mob/living/carbon/human/dummy.dm b/code/modules/mob/living/carbon/human/dummy.dm
index 95746afb73..7918e303e8 100644
--- a/code/modules/mob/living/carbon/human/dummy.dm
+++ b/code/modules/mob/living/carbon/human/dummy.dm
@@ -4,7 +4,6 @@
status_flags = GODMODE|CANPUSH
mouse_drag_pointer = MOUSE_INACTIVE_POINTER
var/in_use = FALSE
- no_vore = TRUE
INITIALIZE_IMMEDIATE(/mob/living/carbon/human/dummy)
diff --git a/code/modules/mob/living/carbon/human/human.dm b/code/modules/mob/living/carbon/human/human.dm
index 94aba6851a..7f5f912ff6 100644
--- a/code/modules/mob/living/carbon/human/human.dm
+++ b/code/modules/mob/living/carbon/human/human.dm
@@ -768,7 +768,7 @@
return
else
if(hud_used.healths)
- var/health_amount = min(health, maxHealth - CLAMP(getStaminaLoss()-50, 0, 80))//CIT CHANGE - makes staminaloss have less of an impact on the health hud
+ var/health_amount = min(health, maxHealth - clamp(getStaminaLoss()-50, 0, 80))//CIT CHANGE - makes staminaloss have less of an impact on the health hud
if(..(health_amount)) //not dead
switch(hal_screwyhud)
if(SCREWYHUD_CRIT)
@@ -1041,7 +1041,7 @@
return FALSE
/mob/living/carbon/human/proc/clear_shove_slowdown()
- remove_movespeed_modifier(MOVESPEED_ID_SHOVE)
+ remove_movespeed_modifier(/datum/movespeed_modifier/shove)
var/active_item = get_active_held_item()
if(is_type_in_typecache(active_item, GLOB.shove_disarming_types))
visible_message("[src.name] regains their grip on \the [active_item]!", "You regain your grip on \the [active_item]", null, COMBAT_MESSAGE_RANGE)
@@ -1050,17 +1050,17 @@
. = ..()
if(HAS_TRAIT(src, TRAIT_IGNORESLOWDOWN))
- remove_movespeed_modifier(MOVESPEED_ID_DAMAGE_SLOWDOWN)
- remove_movespeed_modifier(MOVESPEED_ID_DAMAGE_SLOWDOWN_FLYING)
+ remove_movespeed_modifier(/datum/movespeed_modifier/damage_slowdown)
+ remove_movespeed_modifier(/datum/movespeed_modifier/damage_slowdown_flying)
return
var/stambufferinfluence = (bufferedstam*(100/stambuffer))*0.2 //CIT CHANGE - makes stamina buffer influence movedelay
var/health_deficiency = ((100 + stambufferinfluence) - health + (getStaminaLoss()*0.75))//CIT CHANGE - reduces the impact of staminaloss and makes stamina buffer influence it
if(health_deficiency >= 40)
- add_movespeed_modifier(MOVESPEED_ID_DAMAGE_SLOWDOWN, override = TRUE, multiplicative_slowdown = ((health_deficiency-39) / 75), blacklisted_movetypes = FLOATING|FLYING)
- add_movespeed_modifier(MOVESPEED_ID_DAMAGE_SLOWDOWN_FLYING, override = TRUE, multiplicative_slowdown = ((health_deficiency-39) / 25), movetypes = FLYING, blacklisted_movetypes = FLOATING)
+ add_or_update_variable_movespeed_modifier(/datum/movespeed_modifier/damage_slowdown, TRUE, (health_deficiency-39) / 75)
+ add_or_update_variable_movespeed_modifier(/datum/movespeed_modifier/damage_slowdown_flying, TRUE, (health_deficiency-39) / 25)
else
- remove_movespeed_modifier(MOVESPEED_ID_DAMAGE_SLOWDOWN)
- remove_movespeed_modifier(MOVESPEED_ID_DAMAGE_SLOWDOWN_FLYING)
+ remove_movespeed_modifier(/datum/movespeed_modifier/damage_slowdown)
+ remove_movespeed_modifier(/datum/movespeed_modifier/damage_slowdown_flying)
/mob/living/carbon/human/do_after_coefficent()
. = ..()
diff --git a/code/modules/mob/living/carbon/human/human_block.dm b/code/modules/mob/living/carbon/human/human_block.dm
index b1a5153ce5..8fe0376a08 100644
--- a/code/modules/mob/living/carbon/human/human_block.dm
+++ b/code/modules/mob/living/carbon/human/human_block.dm
@@ -1,8 +1,8 @@
/mob/living/carbon/human/get_blocking_items()
. = ..()
if(wear_suit)
- . += wear_suit
+ . |= wear_suit
if(w_uniform)
- . += w_uniform
+ . |= w_uniform
if(wear_neck)
- . += wear_neck
+ . |= wear_neck
diff --git a/code/modules/mob/living/carbon/human/human_defense.dm b/code/modules/mob/living/carbon/human/human_defense.dm
index 324420a7dd..856c57687f 100644
--- a/code/modules/mob/living/carbon/human/human_defense.dm
+++ b/code/modules/mob/living/carbon/human/human_defense.dm
@@ -155,7 +155,7 @@
if(M.a_intent == INTENT_HARM)
if (w_uniform)
w_uniform.add_fingerprint(M)
- var/damage = prob(90) ? 20 : 0
+ var/damage = prob(90) ? M.meleeSlashHumanPower : 0
if(!damage)
playsound(loc, 'sound/weapons/slashmiss.ogg', 50, 1, -1)
visible_message("[M] has lunged at [src]!", \
@@ -182,10 +182,7 @@
"[M] disarmed [src]!")
else
playsound(loc, 'sound/weapons/pierce.ogg', 25, 1, -1)
- if(!lying) //CITADEL EDIT
- DefaultCombatKnockdown(100, TRUE, FALSE, 30, 25)
- else
- DefaultCombatKnockdown(100)
+ DefaultCombatKnockdown(M.meleeKnockdownPower)
log_combat(M, src, "tackled")
visible_message("[M] has tackled down [src]!", \
"[M] has tackled down [src]!")
diff --git a/code/modules/mob/living/carbon/human/human_movement.dm b/code/modules/mob/living/carbon/human/human_movement.dm
index a26bdd99cd..09dfa602e1 100644
--- a/code/modules/mob/living/carbon/human/human_movement.dm
+++ b/code/modules/mob/living/carbon/human/human_movement.dm
@@ -1,11 +1,13 @@
/mob/living/carbon/human/get_movespeed_modifiers()
var/list/considering = ..()
- . = considering
if(HAS_TRAIT(src, TRAIT_IGNORESLOWDOWN))
- for(var/id in .)
- var/list/data = .[id]
- if(data[MOVESPEED_DATA_INDEX_FLAGS] & IGNORE_NOSLOW)
- .[id] = data
+ . = list()
+ for(var/id in considering)
+ var/datum/movespeed_modifier/M = considering[id]
+ if(M.flags & IGNORE_NOSLOW || M.multiplicative_slowdown < 0)
+ .[id] = M
+ return
+ return considering
/mob/living/carbon/human/movement_delay()
. = ..()
diff --git a/code/modules/mob/living/carbon/human/species.dm b/code/modules/mob/living/carbon/human/species.dm
index 32e492f5fa..683c3e18fd 100644
--- a/code/modules/mob/living/carbon/human/species.dm
+++ b/code/modules/mob/living/carbon/human/species.dm
@@ -331,7 +331,7 @@ GLOBAL_LIST_EMPTY(roundstart_race_names)
if(mutant_bodyparts["meat_type"]) //I can't believe it's come to the meat
H.type_of_meat = GLOB.meat_types[H.dna.features["meat_type"]]
- C.add_movespeed_modifier(MOVESPEED_ID_SPECIES, TRUE, 100, override=TRUE, multiplicative_slowdown=speedmod, movetypes=(~FLYING))
+ C.add_or_update_variable_movespeed_modifier(/datum/movespeed_modifier/species, TRUE, multiplicative_slowdown = speedmod)
SEND_SIGNAL(C, COMSIG_SPECIES_GAIN, src, old_species)
@@ -349,7 +349,7 @@ GLOBAL_LIST_EMPTY(roundstart_race_names)
for(var/X in inherent_traits)
REMOVE_TRAIT(C, X, SPECIES_TRAIT)
- C.remove_movespeed_modifier(MOVESPEED_ID_SPECIES)
+ C.remove_movespeed_modifier(/datum/movespeed_modifier/species)
if(mutant_bodyparts["meat_type"])
C.type_of_meat = GLOB.meat_types[C.dna.features["meat_type"]]
@@ -1299,14 +1299,14 @@ GLOBAL_LIST_EMPTY(roundstart_race_names)
if(H.overeatduration < 100)
to_chat(H, "You feel fit again!")
REMOVE_TRAIT(H, TRAIT_FAT, OBESITY)
- H.remove_movespeed_modifier(MOVESPEED_ID_FAT)
+ H.remove_movespeed_modifier(/datum/movespeed_modifier/obesity)
H.update_inv_w_uniform()
H.update_inv_wear_suit()
else
if(H.overeatduration >= 100)
to_chat(H, "You suddenly feel blubbery!")
ADD_TRAIT(H, TRAIT_FAT, OBESITY)
- H.add_movespeed_modifier(MOVESPEED_ID_FAT, multiplicative_slowdown = 1.5)
+ H.add_movespeed_modifier(/datum/movespeed_modifier/obesity)
H.update_inv_w_uniform()
H.update_inv_wear_suit()
@@ -1362,9 +1362,9 @@ GLOBAL_LIST_EMPTY(roundstart_race_names)
if(!HAS_TRAIT(H, TRAIT_NOHUNGER))
var/hungry = (500 - H.nutrition) / 5 //So overeat would be 100 and default level would be 80
if(hungry >= 70)
- H.add_movespeed_modifier(MOVESPEED_ID_HUNGRY, override = TRUE, multiplicative_slowdown = (hungry / 50))
+ H.add_or_update_variable_movespeed_modifier(/datum/movespeed_modifier/hunger, multiplicative_slowdown = (hungry / 50))
else
- H.remove_movespeed_modifier(MOVESPEED_ID_HUNGRY)
+ H.remove_movespeed_modifier(/datum/movespeed_modifier/hunger)
switch(H.nutrition)
if(NUTRITION_LEVEL_FULL to INFINITY)
@@ -1615,7 +1615,7 @@ GLOBAL_LIST_EMPTY(roundstart_race_names)
"You hear a slap."
)
return FALSE
-
+
else
user.do_attack_animation(target, ATTACK_EFFECT_DISARM)
@@ -1623,10 +1623,10 @@ GLOBAL_LIST_EMPTY(roundstart_race_names)
user.adjustStaminaLossBuffered(1)
else
user.adjustStaminaLossBuffered(3)
-
+
if(attacker_style && attacker_style.disarm_act(user,target))
return TRUE
-
+
if(target.w_uniform)
target.w_uniform.add_fingerprint(user)
//var/randomized_zone = ran_zone(user.zone_selected) CIT CHANGE - comments out to prevent compiling errors
@@ -1659,7 +1659,7 @@ GLOBAL_LIST_EMPTY(roundstart_race_names)
randn -= 25 //if you are a pugilist, you're slapping that item from them pretty reliably
if(HAS_TRAIT(target, TRAIT_PUGILIST))
randn += 25 //meanwhile, pugilists are less likely to get disarmed
-
+
if(randn <= 35)//CIT CHANGE - changes this back to a 35% chance to accomodate for the above being commented out in favor of right-click pushing
var/obj/item/I = null
if(target.pulling)
@@ -1932,8 +1932,8 @@ GLOBAL_LIST_EMPTY(roundstart_race_names)
var/obj/item/target_held_item = target.get_active_held_item()
if(!is_type_in_typecache(target_held_item, GLOB.shove_disarming_types))
target_held_item = null
- if(!target.has_movespeed_modifier(MOVESPEED_ID_SHOVE))
- target.add_movespeed_modifier(MOVESPEED_ID_SHOVE, multiplicative_slowdown = SHOVE_SLOWDOWN_STRENGTH)
+ if(!target.has_movespeed_modifier(/datum/movespeed_modifier/shove))
+ target.add_movespeed_modifier(/datum/movespeed_modifier/shove)
if(target_held_item)
if(!HAS_TRAIT(target_held_item, TRAIT_NODROP))
target.visible_message("[target.name]'s grip on \the [target_held_item] loosens!",
@@ -2084,7 +2084,7 @@ GLOBAL_LIST_EMPTY(roundstart_race_names)
SEND_SIGNAL(H, COMSIG_CLEAR_MOOD_EVENT, "cold")
SEND_SIGNAL(H, COMSIG_ADD_MOOD_EVENT, "hot", /datum/mood_event/hot)
- H.remove_movespeed_modifier(MOVESPEED_ID_COLD)
+ H.remove_movespeed_modifier(/datum/movespeed_modifier/cold)
var/burn_damage
var/firemodifier = H.fire_stacks / 50
@@ -2101,8 +2101,8 @@ GLOBAL_LIST_EMPTY(roundstart_race_names)
else if(H.bodytemperature < BODYTEMP_COLD_DAMAGE_LIMIT && !HAS_TRAIT(H, TRAIT_RESISTCOLD))
SEND_SIGNAL(H, COMSIG_CLEAR_MOOD_EVENT, "hot")
SEND_SIGNAL(H, COMSIG_ADD_MOOD_EVENT, "cold", /datum/mood_event/cold)
- //Sorry for the nasty oneline but I don't want to assign a variable on something run pretty frequently
- H.add_movespeed_modifier(MOVESPEED_ID_COLD, override = TRUE, multiplicative_slowdown = ((BODYTEMP_COLD_DAMAGE_LIMIT - H.bodytemperature) / COLD_SLOWDOWN_FACTOR), blacklisted_movetypes = FLOATING)
+ //Apply cold slowdown
+ H.add_or_update_variable_movespeed_modifier(/datum/movespeed_modifier/cold, multiplicative_slowdown = ((BODYTEMP_COLD_DAMAGE_LIMIT - H.bodytemperature) / COLD_SLOWDOWN_FACTOR))
switch(H.bodytemperature)
if(200 to BODYTEMP_COLD_DAMAGE_LIMIT)
H.apply_damage(COLD_DAMAGE_LEVEL_1*coldmod*H.physiology.cold_mod, BURN)
@@ -2112,7 +2112,7 @@ GLOBAL_LIST_EMPTY(roundstart_race_names)
H.apply_damage(COLD_DAMAGE_LEVEL_3*coldmod*H.physiology.cold_mod, BURN)
else
- H.remove_movespeed_modifier(MOVESPEED_ID_COLD)
+ H.remove_movespeed_modifier(/datum/movespeed_modifier/cold)
SEND_SIGNAL(H, COMSIG_CLEAR_MOOD_EVENT, "cold")
SEND_SIGNAL(H, COMSIG_CLEAR_MOOD_EVENT, "hot")
diff --git a/code/modules/mob/living/carbon/human/species_types/dwarves.dm b/code/modules/mob/living/carbon/human/species_types/dwarves.dm
index 235dacc70a..50b88579f4 100644
--- a/code/modules/mob/living/carbon/human/species_types/dwarves.dm
+++ b/code/modules/mob/living/carbon/human/species_types/dwarves.dm
@@ -6,7 +6,7 @@ GLOBAL_LIST_INIT(dwarf_last, world.file2list("strings/names/dwarf_last.txt")) //
name = "Dwarf"
id = "dwarf" //Also called Homo sapiens pumilionis
default_color = "FFFFFF"
- species_traits = list(EYECOLOR,HAIR,FACEHAIR,LIPS,NO_UNDERWEAR)
+ species_traits = list(EYECOLOR,HAIR,FACEHAIR,LIPS,NO_UNDERWEAR,TRAIT_DWARF)
inherent_traits = list()
limbs_id = "human"
use_skintones = USE_SKINTONES_GRAYSCALE_CUSTOM
@@ -36,7 +36,6 @@ GLOBAL_LIST_INIT(dwarf_last, world.file2list("strings/names/dwarf_last.txt")) //
H.transform = H.transform.Scale(1, 0.8) //We use scale, and yeah. Dwarves can become gnomes with DWARFISM.
RegisterSignal(C, COMSIG_MOB_SAY, .proc/handle_speech) //We register handle_speech is being used.
-
/datum/species/dwarf/on_species_loss(mob/living/carbon/H, datum/species/new_species)
. = ..()
H.transform = H.transform.Scale(1, 1.25) //And we undo it.
@@ -170,7 +169,7 @@ GLOBAL_LIST_INIT(dwarf_last, world.file2list("strings/names/dwarf_last.txt")) //
for(var/datum/reagent/R in owner.reagents.reagent_list)
if(istype(R, /datum/reagent/consumable/ethanol))
var/datum/reagent/consumable/ethanol/E = R
- stored_alcohol = CLAMP(stored_alcohol + E.boozepwr / 50, 0, max_alcohol)
+ stored_alcohol = clamp(stored_alcohol + E.boozepwr / 50, 0, max_alcohol)
var/heal_amt = heal_rate
stored_alcohol -= alcohol_rate //Subtracts alcohol_Rate from stored alcohol so EX: 250 - 0.25 per each loop that occurs.
if(stored_alcohol > 400) //If they are over 400 they start regenerating
diff --git a/code/modules/mob/living/carbon/human/species_types/furrypeople.dm b/code/modules/mob/living/carbon/human/species_types/furrypeople.dm
index d4b8ea7897..b6d56b8e5d 100644
--- a/code/modules/mob/living/carbon/human/species_types/furrypeople.dm
+++ b/code/modules/mob/living/carbon/human/species_types/furrypeople.dm
@@ -74,9 +74,7 @@
//misc
/mob/living/carbon/human/dummy
- no_vore = TRUE
+ vore_flags = NO_VORE
/mob/living/carbon/human/vore
- devourable = TRUE
- digestable = TRUE
- feeding = TRUE
+ vore_flags = DEVOURABLE | DIGESTABLE | FEEDING
diff --git a/code/modules/mob/living/carbon/human/species_types/golems.dm b/code/modules/mob/living/carbon/human/species_types/golems.dm
index abc2288e9b..7a5e347060 100644
--- a/code/modules/mob/living/carbon/human/species_types/golems.dm
+++ b/code/modules/mob/living/carbon/human/species_types/golems.dm
@@ -397,7 +397,7 @@
var/new_y = P.starting.y + pick(0, 0, 0, 0, 0, -1, 1, -2, 2)
var/turf/target = get_turf(P.starting)
// redirect the projectile
- P.preparePixelProjectile(locate(CLAMP(target.x + new_x, 1, world.maxx), CLAMP(target.y + new_y, 1, world.maxy), H.z), H)
+ P.preparePixelProjectile(locate(clamp(target.x + new_x, 1, world.maxx), clamp(target.y + new_y, 1, world.maxy), H.z), H)
return BULLET_ACT_FORCE_PIERCE
return ..()
diff --git a/code/modules/mob/living/carbon/human/species_types/jellypeople.dm b/code/modules/mob/living/carbon/human/species_types/jellypeople.dm
index 775f36cfc7..10a29c72c1 100644
--- a/code/modules/mob/living/carbon/human/species_types/jellypeople.dm
+++ b/code/modules/mob/living/carbon/human/species_types/jellypeople.dm
@@ -606,7 +606,7 @@
var/max_D = CONFIG_GET(number/penis_max_inches_prefs)
var/new_length = input(owner, "Penis length in inches:\n([min_D]-[max_D])", "Genital Alteration") as num|null
if(new_length)
- H.dna.features["cock_length"] = CLAMP(round(new_length), min_D, max_D)
+ H.dna.features["cock_length"] = clamp(round(new_length), min_D, max_D)
H.update_genitals()
H.apply_overlay()
H.give_genital(/obj/item/organ/genital/testicles)
diff --git a/code/modules/mob/living/carbon/human/species_types/vampire.dm b/code/modules/mob/living/carbon/human/species_types/vampire.dm
index f37e718462..f720aa7f8a 100644
--- a/code/modules/mob/living/carbon/human/species_types/vampire.dm
+++ b/code/modules/mob/living/carbon/human/species_types/vampire.dm
@@ -106,8 +106,8 @@
to_chat(victim, "[H] is draining your blood!")
to_chat(H, "You drain some blood!")
playsound(H, 'sound/items/drink.ogg', 30, 1, -2)
- victim.blood_volume = CLAMP(victim.blood_volume - drained_blood, 0, BLOOD_VOLUME_MAXIMUM)
- H.blood_volume = CLAMP(H.blood_volume + drained_blood, 0, BLOOD_VOLUME_MAXIMUM)
+ victim.blood_volume = clamp(victim.blood_volume - drained_blood, 0, BLOOD_VOLUME_MAXIMUM)
+ H.blood_volume = clamp(H.blood_volume + drained_blood, 0, BLOOD_VOLUME_MAXIMUM)
if(!victim.blood_volume)
to_chat(H, "You finish off [victim]'s blood supply!")
diff --git a/code/modules/mob/living/carbon/human/update_icons.dm b/code/modules/mob/living/carbon/human/update_icons.dm
index b049b7e967..10a630e034 100644
--- a/code/modules/mob/living/carbon/human/update_icons.dm
+++ b/code/modules/mob/living/carbon/human/update_icons.dm
@@ -283,7 +283,7 @@ There are several things that need to be remembered:
alt_icon = S.anthro_mob_worn_overlay || 'icons/mob/clothing/feet_digi.dmi'
variation_flag |= STYLE_DIGITIGRADE
- overlays_standing[SHOES_LAYER] = shoes.build_worn_icon(SHOES_LAYER, alt_icon, FALSE, NO_FEMALE_UNIFORM, variation_flag, FALSE)
+ overlays_standing[SHOES_LAYER] = shoes.build_worn_icon(SHOES_LAYER, alt_icon, FALSE, NO_FEMALE_UNIFORM, S.icon_state, variation_flag, FALSE)
var/mutable_appearance/shoes_overlay = overlays_standing[SHOES_LAYER]
if(OFFSET_SHOES in dna.species.offset_features)
shoes_overlay.pixel_x += dna.species.offset_features[OFFSET_SHOES][1]
diff --git a/code/modules/mob/living/carbon/life.dm b/code/modules/mob/living/carbon/life.dm
index 8097859aac..00a0991e19 100644
--- a/code/modules/mob/living/carbon/life.dm
+++ b/code/modules/mob/living/carbon/life.dm
@@ -235,7 +235,7 @@
//TOXINS/PLASMA
if(Toxins_partialpressure > safe_tox_max)
var/ratio = (breath_gases[/datum/gas/plasma]/safe_tox_max) * 10
- adjustToxLoss(CLAMP(ratio, MIN_TOXIC_GAS_DAMAGE, MAX_TOXIC_GAS_DAMAGE))
+ adjustToxLoss(clamp(ratio, MIN_TOXIC_GAS_DAMAGE, MAX_TOXIC_GAS_DAMAGE))
throw_alert("too_much_tox", /obj/screen/alert/too_much_tox)
else
clear_alert("too_much_tox")
diff --git a/code/modules/mob/living/carbon/monkey/monkey.dm b/code/modules/mob/living/carbon/monkey/monkey.dm
index d3e5941e4e..6242fa56be 100644
--- a/code/modules/mob/living/carbon/monkey/monkey.dm
+++ b/code/modules/mob/living/carbon/monkey/monkey.dm
@@ -65,12 +65,11 @@
/mob/living/carbon/monkey/on_reagent_change()
. = ..()
- remove_movespeed_modifier(MOVESPEED_ID_MONKEY_REAGENT_SPEEDMOD, TRUE)
var/amount
if(reagents.has_reagent(/datum/reagent/medicine/morphine))
amount = -1
if(amount)
- add_movespeed_modifier(MOVESPEED_ID_MONKEY_REAGENT_SPEEDMOD, TRUE, 100, override = TRUE, multiplicative_slowdown = amount)
+ add_or_update_variable_movespeed_modifier(/datum/movespeed_modifier/monkey_reagent_speedmod, TRUE, amount)
/mob/living/carbon/monkey/updatehealth()
. = ..()
@@ -78,7 +77,7 @@
var/health_deficiency = (100 - health)
if(health_deficiency >= 45)
slow += (health_deficiency / 25)
- add_movespeed_modifier(MOVESPEED_ID_MONKEY_HEALTH_SPEEDMOD, TRUE, 100, override = TRUE, multiplicative_slowdown = slow)
+ add_or_update_variable_movespeed_modifier(/datum/movespeed_modifier/monkey_health_speedmod, TRUE, slow)
/mob/living/carbon/monkey/adjust_bodytemperature(amount)
. = ..()
@@ -87,7 +86,7 @@
slow += (283.222 - bodytemperature) / 10 * 1.75
if(slow <= 0)
return
- add_movespeed_modifier(MOVESPEED_ID_MONKEY_TEMPERATURE_SPEEDMOD, TRUE, 100, override = TRUE, multiplicative_slowdown = amount)
+ add_or_update_variable_movespeed_modifier(/datum/movespeed_modifier/monkey_temperature_speedmod, TRUE, slow)
/mob/living/carbon/monkey/Stat()
..()
@@ -99,7 +98,6 @@
if(changeling)
stat("Chemical Storage", "[changeling.chem_charges]/[changeling.chem_storage]")
stat("Absorbed DNA", changeling.absorbedcount)
- return
/mob/living/carbon/monkey/verb/removeinternal()
diff --git a/code/modules/mob/living/carbon/status_procs.dm b/code/modules/mob/living/carbon/status_procs.dm
index 6c497bb8d4..a47bb7fb4a 100644
--- a/code/modules/mob/living/carbon/status_procs.dm
+++ b/code/modules/mob/living/carbon/status_procs.dm
@@ -23,10 +23,10 @@
clear_alert("high")
/mob/living/carbon/adjust_disgust(amount)
- disgust = CLAMP(disgust+amount, 0, DISGUST_LEVEL_MAXEDOUT)
+ disgust = clamp(disgust+amount, 0, DISGUST_LEVEL_MAXEDOUT)
/mob/living/carbon/set_disgust(amount)
- disgust = CLAMP(amount, 0, DISGUST_LEVEL_MAXEDOUT)
+ disgust = clamp(amount, 0, DISGUST_LEVEL_MAXEDOUT)
////////////////////////////////////////TRAUMAS/////////////////////////////////////////
diff --git a/code/modules/mob/living/damage_procs.dm b/code/modules/mob/living/damage_procs.dm
index d5e1fa6fc4..3257b0e3bf 100644
--- a/code/modules/mob/living/damage_procs.dm
+++ b/code/modules/mob/living/damage_procs.dm
@@ -88,7 +88,7 @@
if(EFFECT_STUN)
Stun(effect * hit_percent)
if(EFFECT_KNOCKDOWN)
- DefaultCombatKnockdown(effect * hit_percent, override_stamdmg = knockdown_stammax ? CLAMP(knockdown_stamoverride, 0, knockdown_stammax-getStaminaLoss()) : knockdown_stamoverride)
+ DefaultCombatKnockdown(effect * hit_percent, override_stamdmg = knockdown_stammax ? clamp(knockdown_stamoverride, 0, knockdown_stammax-getStaminaLoss()) : knockdown_stamoverride)
if(EFFECT_UNCONSCIOUS)
Unconscious(effect * hit_percent)
if(EFFECT_IRRADIATE)
@@ -140,7 +140,7 @@
/mob/living/proc/adjustBruteLoss(amount, updating_health = TRUE, forced = FALSE)
if(!forced && (status_flags & GODMODE))
return FALSE
- bruteloss = CLAMP((bruteloss + (amount * CONFIG_GET(number/damage_multiplier))), 0, maxHealth * 2)
+ bruteloss = clamp((bruteloss + (amount * CONFIG_GET(number/damage_multiplier))), 0, maxHealth * 2)
if(updating_health)
updatehealth()
return amount
@@ -151,7 +151,7 @@
/mob/living/proc/adjustOxyLoss(amount, updating_health = TRUE, forced = FALSE)
if(!forced && (status_flags & GODMODE))
return FALSE
- oxyloss = CLAMP((oxyloss + (amount * CONFIG_GET(number/damage_multiplier))), 0, maxHealth * 2)
+ oxyloss = clamp((oxyloss + (amount * CONFIG_GET(number/damage_multiplier))), 0, maxHealth * 2)
if(updating_health)
updatehealth()
return amount
@@ -170,7 +170,7 @@
/mob/living/proc/adjustToxLoss(amount, updating_health = TRUE, forced = FALSE)
if(!forced && (status_flags & GODMODE))
return FALSE
- toxloss = CLAMP((toxloss + (amount * CONFIG_GET(number/damage_multiplier))), 0, maxHealth * 2)
+ toxloss = clamp((toxloss + (amount * CONFIG_GET(number/damage_multiplier))), 0, maxHealth * 2)
if(updating_health)
updatehealth()
return amount
@@ -189,7 +189,7 @@
/mob/living/proc/adjustFireLoss(amount, updating_health = TRUE, forced = FALSE)
if(!forced && (status_flags & GODMODE))
return FALSE
- fireloss = CLAMP((fireloss + (amount * CONFIG_GET(number/damage_multiplier))), 0, maxHealth * 2)
+ fireloss = clamp((fireloss + (amount * CONFIG_GET(number/damage_multiplier))), 0, maxHealth * 2)
if(updating_health)
updatehealth()
return amount
@@ -200,7 +200,7 @@
/mob/living/proc/adjustCloneLoss(amount, updating_health = TRUE, forced = FALSE)
if(!forced && (status_flags & GODMODE))
return FALSE
- cloneloss = CLAMP((cloneloss + (amount * CONFIG_GET(number/damage_multiplier))), 0, maxHealth * 2)
+ cloneloss = clamp((cloneloss + (amount * CONFIG_GET(number/damage_multiplier))), 0, maxHealth * 2)
if(updating_health)
updatehealth()
return amount
diff --git a/code/modules/mob/living/living.dm b/code/modules/mob/living/living.dm
index 5fa64e5ab5..89f8381087 100644
--- a/code/modules/mob/living/living.dm
+++ b/code/modules/mob/living/living.dm
@@ -68,7 +68,7 @@
var/obj/O = A
if(ObjBump(O))
return
- if(ismovableatom(A))
+ if(ismovable(A))
var/atom/movable/AM = A
if(PushAM(AM, move_force))
return
@@ -668,19 +668,22 @@
resist_fire() //stop, drop, and roll
// Give clickdelay
return TRUE
+
if(resting) //cit change - allows resisting out of resting
resist_a_rest() // ditto
// DO NOT GIVE CLCIKDELAY - resist_a_rest() handles spam prevention. Somewhat.
return FALSE
- if(last_special <= world.time)
- resist_restraints() //trying to remove cuffs.
- // DO NOT GIVE CLICKDELAY - last_special handles this.
- return FALSE
+
if(CHECK_MOBILITY(src, MOBILITY_USE) && resist_embedded()) //Citadel Change for embedded removal memes - requires being able to use items.
// DO NOT GIVE DEFAULT CLICKDELAY - This is a combat action.
changeNext_move(CLICK_CD_MELEE)
return FALSE
+ if(last_special <= world.time)
+ resist_restraints() //trying to remove cuffs.
+ // DO NOT GIVE CLICKDELAY - last_special handles this.
+ return FALSE
+
/// Proc to resist a grab. moving_resist is TRUE if this began by someone attempting to move. Return FALSE if still grabbed/failed to break out. Use this instead of resist_grab() directly.
/mob/proc/attempt_resist_grab(moving_resist, forced, log = TRUE)
if(!pulledby) //not being grabbed
@@ -1027,7 +1030,7 @@
update_fire()
/mob/living/proc/adjust_fire_stacks(add_fire_stacks) //Adjusting the amount of fire_stacks we have on person
- fire_stacks = CLAMP(fire_stacks + add_fire_stacks, -20, 20)
+ fire_stacks = clamp(fire_stacks + add_fire_stacks, -20, 20)
if(on_fire && fire_stacks <= 0)
ExtinguishMob()
diff --git a/code/modules/mob/living/living_block.dm b/code/modules/mob/living/living_block.dm
index d9e3309e47..d39abb1250 100644
--- a/code/modules/mob/living/living_block.dm
+++ b/code/modules/mob/living/living_block.dm
@@ -57,7 +57,7 @@
if(real_attack)
for(var/obj/item/I in tocheck)
// i don't like this too
- var/final_block_chance = I.block_chance - (CLAMP((armour_penetration-I.armour_penetration)/2,0,100)) + block_chance_modifier //So armour piercing blades can still be parried by other blades, for example
+ var/final_block_chance = I.block_chance - (clamp((armour_penetration-I.armour_penetration)/2,0,100)) + block_chance_modifier //So armour piercing blades can still be parried by other blades, for example
var/results = I.run_block(src, object, damage, attack_text, attack_type, armour_penetration, attacker, def_zone, final_block_chance, return_list)
. |= results
if((results & BLOCK_SUCCESS) && !(results & BLOCK_CONTINUE_CHAIN))
@@ -65,12 +65,13 @@
else
for(var/obj/item/I in tocheck)
// i don't like this too
- var/final_block_chance = I.block_chance - (CLAMP((armour_penetration-I.armour_penetration)/2,0,100)) + block_chance_modifier //So armour piercing blades can still be parried by other blades, for example
+ var/final_block_chance = I.block_chance - (clamp((armour_penetration-I.armour_penetration)/2,0,100)) + block_chance_modifier //So armour piercing blades can still be parried by other blades, for example
I.check_block(src, object, damage, attack_text, attack_type, armour_penetration, attacker, def_zone, final_block_chance, return_list)
/// Gets an unsortedlist of objects to run block checks on.
/mob/living/proc/get_blocking_items()
. = list()
+ SEND_SIGNAL(src, COMSIG_LIVING_GET_BLOCKING_ITEMS, .)
for(var/obj/item/I in held_items)
// this is a bad check but i am not removing it until a better catchall is made
if(istype(I, /obj/item/clothing))
@@ -85,11 +86,13 @@
/// Runs block and returns flag for do_run_block to process.
/obj/item/proc/run_block(mob/living/owner, atom/object, damage, attack_text, attack_type, armour_penetration, mob/attacker, def_zone, final_block_chance, list/block_return)
- SEND_SIGNAL(src, COMSIG_ITEM_RUN_BLOCK, owner, object, damage, attack_text, attack_type, armour_penetration, attacker, def_zone, final_block_chance, block_return)
+ . = SEND_SIGNAL(src, COMSIG_ITEM_RUN_BLOCK, owner, object, damage, attack_text, attack_type, armour_penetration, attacker, def_zone, final_block_chance, block_return)
+ if(. & BLOCK_SUCCESS)
+ return
if(prob(final_block_chance))
owner.visible_message("[owner] blocks [attack_text] with [src]!")
- return BLOCK_SUCCESS | BLOCK_PHYSICAL_EXTERNAL
- return BLOCK_NONE
+ return . | BLOCK_SUCCESS | BLOCK_PHYSICAL_EXTERNAL
+ return . | BLOCK_NONE
/// Returns block information using list/block_return. Used for check_block() on mobs.
/obj/item/proc/check_block(mob/living/owner, atom/object, damage, attack_text, attack_type, armour_penetration, mob/attacker, def_zone, final_block_chance, list/block_return)
diff --git a/code/modules/mob/living/living_defense.dm b/code/modules/mob/living/living_defense.dm
index 7d220739d5..39a94232a3 100644
--- a/code/modules/mob/living/living_defense.dm
+++ b/code/modules/mob/living/living_defense.dm
@@ -88,9 +88,9 @@
/obj/item/proc/get_volume_by_throwforce_and_or_w_class()
if(throwforce && w_class)
- return CLAMP((throwforce + w_class) * 5, 30, 100)// Add the item's throwforce to its weight class and multiply by 5, then clamp the value between 30 and 100
+ return clamp((throwforce + w_class) * 5, 30, 100)// Add the item's throwforce to its weight class and multiply by 5, then clamp the value between 30 and 100
else if(w_class)
- return CLAMP(w_class * 8, 20, 100) // Multiply the item's weight class by 8, then clamp the value between 20 and 100
+ return clamp(w_class * 8, 20, 100) // Multiply the item's weight class by 8, then clamp the value between 20 and 100
else
return 0
diff --git a/code/modules/mob/living/living_mobility.dm b/code/modules/mob/living/living_mobility.dm
index 49d4a20887..32038a6102 100644
--- a/code/modules/mob/living/living_mobility.dm
+++ b/code/modules/mob/living/living_mobility.dm
@@ -94,11 +94,13 @@
if(should_be_lying)
mobility_flags &= ~MOBILITY_STAND
+ setMovetype(movement_type | CRAWLING)
if(!lying) //force them on the ground
lying = pick(90, 270)
if(has_gravity() && !buckled)
playsound(src, "bodyfall", 20, 1)
else
+ setMovetype(movement_type & ~CRAWLING)
mobility_flags |= MOBILITY_STAND
lying = 0
@@ -161,8 +163,8 @@
if(!has_legs && has_arms < 2)
limbless_slowdown += 6 - (has_arms * 3)
if(limbless_slowdown)
- add_movespeed_modifier(MOVESPEED_ID_LIVING_LIMBLESS, update=TRUE, priority=100, override=TRUE, multiplicative_slowdown=limbless_slowdown, blacklisted_movetypes = FLYING|FLOATING)
+ add_or_update_variable_movespeed_modifier(/datum/movespeed_modifier/limbless, multiplicative_slowdown = limbless_slowdown)
else
- remove_movespeed_modifier(MOVESPEED_ID_LIVING_LIMBLESS, update=TRUE)
+ remove_movespeed_modifier(/datum/movespeed_modifier/limbless)
return mobility_flags
diff --git a/code/modules/mob/living/living_movement.dm b/code/modules/mob/living/living_movement.dm
index ec291094fe..ddcf3e6292 100644
--- a/code/modules/mob/living/living_movement.dm
+++ b/code/modules/mob/living/living_movement.dm
@@ -36,38 +36,26 @@
sprint_stamina_cost = CONFIG_GET(number/movedelay/sprint_stamina_cost)
return ..()
-/mob/living/movement_delay(ignorewalk = 0)
- . = ..()
- if(!CHECK_MOBILITY(src, MOBILITY_STAND))
- . += 6
-
/// whether or not we can slide under another living mob. defaults to if we're not dense. CanPass should check "overriding circumstances" like buckled mobs/having PASSMOB flag, etc.
/mob/living/proc/can_move_under_living(mob/living/other)
return !density
/mob/living/proc/update_move_intent_slowdown()
- var/mod = 0
- if(m_intent == MOVE_INTENT_WALK)
- mod = CONFIG_GET(number/movedelay/walk_delay)
- else
- mod = CONFIG_GET(number/movedelay/run_delay)
- if(!isnum(mod))
- mod = 1
- add_movespeed_modifier(MOVESPEED_ID_MOB_WALK_RUN_CONFIG_SPEED, TRUE, 100, override = TRUE, multiplicative_slowdown = mod)
+ add_movespeed_modifier((m_intent == MOVE_INTENT_WALK)? /datum/movespeed_modifier/config_walk_run/walk : /datum/movespeed_modifier/config_walk_run/run)
/mob/living/proc/update_turf_movespeed(turf/open/T)
- if(isopenturf(T) && !is_flying())
- add_movespeed_modifier(MOVESPEED_ID_LIVING_TURF_SPEEDMOD, TRUE, 100, override = TRUE, multiplicative_slowdown = T.slowdown)
+ if(isopenturf(T))
+ add_or_update_variable_movespeed_modifier(/datum/movespeed_modifier/turf_slowdown, multiplicative_slowdown = T.slowdown)
else
- remove_movespeed_modifier(MOVESPEED_ID_LIVING_TURF_SPEEDMOD)
+ remove_movespeed_modifier(/datum/movespeed_modifier/turf_slowdown)
/mob/living/proc/update_pull_movespeed()
if(pulling && isliving(pulling))
var/mob/living/L = pulling
if(drag_slowdown && L.lying && !L.buckled && grab_state < GRAB_AGGRESSIVE)
- add_movespeed_modifier(MOVESPEED_ID_PRONE_DRAGGING, multiplicative_slowdown = PULL_PRONE_SLOWDOWN)
+ add_or_update_variable_movespeed_modifier(/datum/movespeed_modifier/bulky_drag, multiplicative_slowdown = PULL_PRONE_SLOWDOWN)
return
- remove_movespeed_modifier(MOVESPEED_ID_PRONE_DRAGGING)
+ remove_movespeed_modifier(/datum/movespeed_modifier/bulky_drag)
/mob/living/canZMove(dir, turf/target)
return can_zTravel(target, dir) && (movement_type & FLYING)
diff --git a/code/modules/mob/living/login.dm b/code/modules/mob/living/login.dm
index e0bd8a16b3..931f87eb7c 100644
--- a/code/modules/mob/living/login.dm
+++ b/code/modules/mob/living/login.dm
@@ -23,5 +23,5 @@
if(ranged_ability)
ranged_ability.add_ranged_ability(src, "You currently have [ranged_ability] active!")
- if(vore_init && !vorepref_init) //Vore's been initialized, voreprefs haven't. If this triggers then that means that voreprefs failed to load due to the client being missing.
+ if((vore_flags & VORE_INIT) && !(vore_flags & VOREPREF_INIT)) //Vore's been initialized, voreprefs haven't. If this triggers then that means that voreprefs failed to load due to the client being missing.
copy_from_prefs_vr()
diff --git a/code/modules/mob/living/silicon/ai/ai.dm b/code/modules/mob/living/silicon/ai/ai.dm
index d178af9fb0..e959144ed5 100644
--- a/code/modules/mob/living/silicon/ai/ai.dm
+++ b/code/modules/mob/living/silicon/ai/ai.dm
@@ -869,7 +869,7 @@
if(istype(A, /obj/machinery/camera))
current = A
if(client)
- if(ismovableatom(A))
+ if(ismovable(A))
if(A != GLOB.ai_camera_room_landmark)
end_multicam()
client.perspective = EYE_PERSPECTIVE
@@ -1016,7 +1016,7 @@
if("Yes.")
src.ghostize(FALSE, penalize = TRUE)
var/announce_rank = "Artificial Intelligence,"
- if(GLOB.announcement_systems.len)
+ if(GLOB.announcement_systems.len)
// Sends an announcement the AI has cryoed.
var/obj/machinery/announcement_system/announcer = pick(GLOB.announcement_systems)
announcer.announce("CRYOSTORAGE", src.real_name, announce_rank, list())
diff --git a/code/modules/mob/living/silicon/pai/pai.dm b/code/modules/mob/living/silicon/pai/pai.dm
index 26fa3b505d..4b1b108b0e 100644
--- a/code/modules/mob/living/silicon/pai/pai.dm
+++ b/code/modules/mob/living/silicon/pai/pai.dm
@@ -154,7 +154,7 @@
/mob/living/silicon/pai/proc/process_hack()
if(cable && cable.machine && istype(cable.machine, /obj/machinery/door) && cable.machine == hackdoor && get_dist(src, hackdoor) <= 1)
- hackprogress = CLAMP(hackprogress + 4, 0, 100)
+ hackprogress = clamp(hackprogress + 4, 0, 100)
else
temp = "Door Jack: Connection to airlock has been lost. Hack aborted."
hackprogress = 0
@@ -273,9 +273,9 @@
/mob/living/silicon/pai/Process_Spacemove(movement_dir = 0)
. = ..()
if(!.)
- add_movespeed_modifier(MOVESPEED_ID_PAI_SPACEWALK_SPEEDMOD, TRUE, 100, multiplicative_slowdown = 2)
+ add_movespeed_modifier(/datum/movespeed_modifier/pai_spacewalk)
return TRUE
- remove_movespeed_modifier(MOVESPEED_ID_PAI_SPACEWALK_SPEEDMOD, TRUE)
+ remove_movespeed_modifier(/datum/movespeed_modifier/pai_spacewalk)
return TRUE
/mob/living/silicon/pai/examine(mob/user)
@@ -301,7 +301,7 @@
update_stat()
/mob/living/silicon/pai/process()
- emitterhealth = CLAMP((emitterhealth + emitterregen), -50, emittermaxhealth)
+ emitterhealth = clamp((emitterhealth + emitterregen), -50, emittermaxhealth)
/obj/item/paicard/attackby(obj/item/W, mob/user, params)
..()
diff --git a/code/modules/mob/living/silicon/pai/pai_defense.dm b/code/modules/mob/living/silicon/pai/pai_defense.dm
index 0477492c0a..ba162ecf2c 100644
--- a/code/modules/mob/living/silicon/pai/pai_defense.dm
+++ b/code/modules/mob/living/silicon/pai/pai_defense.dm
@@ -69,7 +69,7 @@
return FALSE //No we're not flammable
/mob/living/silicon/pai/proc/take_holo_damage(amount)
- emitterhealth = CLAMP((emitterhealth - amount), -50, emittermaxhealth)
+ emitterhealth = clamp((emitterhealth - amount), -50, emittermaxhealth)
if(emitterhealth < 0)
fold_in(force = TRUE)
if(amount > 0)
diff --git a/code/modules/mob/living/silicon/robot/life.dm b/code/modules/mob/living/silicon/robot/life.dm
index cf67517c52..e04943a8c5 100644
--- a/code/modules/mob/living/silicon/robot/life.dm
+++ b/code/modules/mob/living/silicon/robot/life.dm
@@ -21,7 +21,7 @@
if(cell && cell.charge)
if(cell.charge <= 100)
uneq_all()
- var/amt = CLAMP((lamp_intensity - 2) * 2,1,cell.charge) //Always try to use at least one charge per tick, but allow it to completely drain the cell.
+ var/amt = clamp((lamp_intensity - 2) * 2,1,cell.charge) //Always try to use at least one charge per tick, but allow it to completely drain the cell.
cell.use(amt) //Usage table: 1/tick if off/lowest setting, 4 = 4/tick, 6 = 8/tick, 8 = 12/tick, 10 = 16/tick
else
uneq_all()
diff --git a/code/modules/mob/living/silicon/robot/robot.dm b/code/modules/mob/living/silicon/robot/robot.dm
index 4ef5993d2d..b389e386d4 100644
--- a/code/modules/mob/living/silicon/robot/robot.dm
+++ b/code/modules/mob/living/silicon/robot/robot.dm
@@ -237,7 +237,7 @@
return
if(!CONFIG_GET(flag/disable_secborg) && GLOB.security_level < CONFIG_GET(number/minimum_secborg_alert))
- to_chat(src, "NOTICE: Due to local station regulations, the security cyborg module and its variants are only available during [num2seclevel(CONFIG_GET(number/minimum_secborg_alert))] alert and greater.")
+ to_chat(src, "NOTICE: Due to local station regulations, the security cyborg module and its variants are only available during [NUM2SECLEVEL(CONFIG_GET(number/minimum_secborg_alert))] alert and greater.")
var/list/modulelist = list("Standard" = /obj/item/robot_module/standard, \
"Engineering" = /obj/item/robot_module/engineering, \
diff --git a/code/modules/mob/living/silicon/silicon.dm b/code/modules/mob/living/silicon/silicon.dm
index 7ebd11319d..a4aeeb2ffc 100644
--- a/code/modules/mob/living/silicon/silicon.dm
+++ b/code/modules/mob/living/silicon/silicon.dm
@@ -14,7 +14,7 @@
rad_flags = RAD_PROTECT_CONTENTS | RAD_NO_CONTAMINATE
speech_span = SPAN_ROBOT
flags_1 = PREVENT_CONTENTS_EXPLOSION_1 | HEAR_1
- no_vore = TRUE
+ vore_flags = NO_VORE
/// Enable sprint system but not stamina
combat_flags = COMBAT_FLAGS_STAMEXEMPT_YESSPRINT
diff --git a/code/modules/mob/living/simple_animal/animal_defense.dm b/code/modules/mob/living/simple_animal/animal_defense.dm
index f4feab8824..fe18d48718 100644
--- a/code/modules/mob/living/simple_animal/animal_defense.dm
+++ b/code/modules/mob/living/simple_animal/animal_defense.dm
@@ -61,11 +61,10 @@
"[M] [response_disarm] [name]!", null, COMBAT_MESSAGE_RANGE)
log_combat(M, src, "disarmed")
else
- var/damage = rand(15, 30)
visible_message("[M] has slashed at [src]!", \
"[M] has slashed at [src]!", null, COMBAT_MESSAGE_RANGE)
playsound(loc, 'sound/weapons/slice.ogg', 25, 1, -1)
- attack_threshold_check(damage)
+ attack_threshold_check(M.meleeSlashSAPower)
log_combat(M, src, "attacked")
/mob/living/simple_animal/attack_larva(mob/living/carbon/alien/larva/L)
diff --git a/code/modules/mob/living/simple_animal/corpse.dm b/code/modules/mob/living/simple_animal/corpse.dm
index 2e0e9dadb4..585bf58d95 100644
--- a/code/modules/mob/living/simple_animal/corpse.dm
+++ b/code/modules/mob/living/simple_animal/corpse.dm
@@ -20,7 +20,7 @@
uniform = /obj/item/clothing/under/syndicate
suit = /obj/item/clothing/suit/armor/vest
shoes = /obj/item/clothing/shoes/combat
- gloves = /obj/item/clothing/gloves/combat
+ gloves = /obj/item/clothing/gloves/tackler/combat/insulated
ears = /obj/item/radio/headset
mask = /obj/item/clothing/mask/gas
head = /obj/item/clothing/head/helmet/swat
@@ -39,7 +39,7 @@
uniform = /obj/item/clothing/under/syndicate
suit = /obj/item/clothing/suit/space/hardsuit/syndi
shoes = /obj/item/clothing/shoes/combat
- gloves = /obj/item/clothing/gloves/combat
+ gloves = /obj/item/clothing/gloves/tackler/combat/insulated
ears = /obj/item/radio/headset
mask = /obj/item/clothing/mask/gas/syndicate
back = /obj/item/tank/jetpack/oxygen
@@ -59,7 +59,7 @@
uniform = /obj/item/clothing/under/syndicate
suit = /obj/item/clothing/suit/space/hardsuit/syndi/elite
shoes = /obj/item/clothing/shoes/combat
- gloves = /obj/item/clothing/gloves/combat
+ gloves = /obj/item/clothing/gloves/tackler/combat
ears = /obj/item/radio/headset
mask = /obj/item/clothing/mask/gas/syndicate
back = /obj/item/tank/jetpack/oxygen/harness
@@ -130,7 +130,7 @@
uniform = /obj/item/clothing/under/syndicate/camo
suit = /obj/item/clothing/suit/armor/bulletproof
shoes = /obj/item/clothing/shoes/combat
- gloves = /obj/item/clothing/gloves/combat
+ gloves = /obj/item/clothing/gloves/tackler/combat
ears = /obj/item/radio/headset
head = /obj/item/clothing/head/helmet/alt
mask = /obj/item/clothing/mask/balaclava
@@ -177,7 +177,7 @@
uniform = /obj/item/clothing/under/rank/security/officer
suit = /obj/item/clothing/suit/armor/vest
shoes = /obj/item/clothing/shoes/combat
- gloves = /obj/item/clothing/gloves/combat
+ gloves = /obj/item/clothing/gloves/tackler/combat
ears = /obj/item/radio/headset
mask = /obj/item/clothing/mask/gas/sechailer/swat
head = /obj/item/clothing/head/helmet/swat/nanotrasen
diff --git a/code/modules/mob/living/simple_animal/damage_procs.dm b/code/modules/mob/living/simple_animal/damage_procs.dm
index 0cc097dc08..90fdeb0a62 100644
--- a/code/modules/mob/living/simple_animal/damage_procs.dm
+++ b/code/modules/mob/living/simple_animal/damage_procs.dm
@@ -2,7 +2,7 @@
/mob/living/simple_animal/proc/adjustHealth(amount, updating_health = TRUE, forced = FALSE)
if(!forced && (status_flags & GODMODE))
return FALSE
- bruteloss = round(CLAMP(bruteloss + amount, 0, maxHealth),DAMAGE_PRECISION)
+ bruteloss = round(clamp(bruteloss + amount, 0, maxHealth),DAMAGE_PRECISION)
if(updating_health)
updatehealth()
return amount
diff --git a/code/modules/mob/living/simple_animal/friendly/crab.dm b/code/modules/mob/living/simple_animal/friendly/crab.dm
index 9e1ae48bdd..cce5edc513 100644
--- a/code/modules/mob/living/simple_animal/friendly/crab.dm
+++ b/code/modules/mob/living/simple_animal/friendly/crab.dm
@@ -11,7 +11,7 @@
blood_volume = 350
speak_chance = 1
turns_per_move = 5
- butcher_results = list(/obj/item/reagent_containers/food/snacks/meat/rawcrab = 1)
+ butcher_results = list(/obj/item/reagent_containers/food/snacks/meat/rawcrab = 4)
response_help = "pets"
response_disarm = "gently pushes aside"
response_harm = "stomps"
diff --git a/code/modules/mob/living/simple_animal/hostile/alien.dm b/code/modules/mob/living/simple_animal/hostile/alien.dm
index 3b9700bb58..2045e194d2 100644
--- a/code/modules/mob/living/simple_animal/hostile/alien.dm
+++ b/code/modules/mob/living/simple_animal/hostile/alien.dm
@@ -175,7 +175,7 @@
AddElement(/datum/element/cleaning)
/mob/living/simple_animal/hostile/alien/maid/AttackingTarget()
- if(ismovableatom(target))
+ if(ismovable(target))
if(istype(target, /obj/effect/decal/cleanable))
visible_message("[src] cleans up \the [target].")
qdel(target)
diff --git a/code/modules/mob/living/simple_animal/hostile/carp.dm b/code/modules/mob/living/simple_animal/hostile/carp.dm
index 9c89ff4a4f..ced56f0705 100644
--- a/code/modules/mob/living/simple_animal/hostile/carp.dm
+++ b/code/modules/mob/living/simple_animal/hostile/carp.dm
@@ -7,7 +7,7 @@
icon_living = "carp"
icon_dead = "carp_dead"
icon_gib = "carp_gib"
- threat = 0.2
+ threat = 0.1
mob_biotypes = MOB_ORGANIC|MOB_BEAST
speak_chance = 0
turns_per_move = 5
diff --git a/code/modules/mob/living/simple_animal/hostile/giant_spider.dm b/code/modules/mob/living/simple_animal/hostile/giant_spider.dm
index 439bedf3cc..f19aa0a2a7 100644
--- a/code/modules/mob/living/simple_animal/hostile/giant_spider.dm
+++ b/code/modules/mob/living/simple_animal/hostile/giant_spider.dm
@@ -186,10 +186,10 @@
. = ..()
if(slowed_by_webs)
if(!(locate(/obj/structure/spider/stickyweb) in loc))
- remove_movespeed_modifier(MOVESPEED_ID_TARANTULA_WEB)
+ remove_movespeed_modifier(/datum/movespeed_modifier/tarantula_web)
slowed_by_webs = FALSE
else if(locate(/obj/structure/spider/stickyweb) in loc)
- add_movespeed_modifier(MOVESPEED_ID_TARANTULA_WEB, priority=100, multiplicative_slowdown=3)
+ add_movespeed_modifier(/datum/movespeed_modifier/tarantula_web)
slowed_by_webs = TRUE
//midwives are the queen of the spiders, can send messages to all them and web faster. That rare round where you get a queen spider and turn your 'for honor' players into 'r6siege' players will be a fun one.
diff --git a/code/modules/mob/living/simple_animal/hostile/hostile.dm b/code/modules/mob/living/simple_animal/hostile/hostile.dm
index e496d007a2..cae8948fdd 100644
--- a/code/modules/mob/living/simple_animal/hostile/hostile.dm
+++ b/code/modules/mob/living/simple_animal/hostile/hostile.dm
@@ -347,10 +347,11 @@
/mob/living/simple_animal/hostile/proc/AttackingTarget()
SEND_SIGNAL(src, COMSIG_HOSTILE_ATTACKINGTARGET, target)
in_melee = TRUE
+ /* sorry for the simplemob vore fans
if(vore_active)
if(isliving(target))
var/mob/living/L = target
- if(!client && L.Adjacent(src) && L.devourable) // aggressive check to ensure vore attacks can be made
+ if(!client && L.Adjacent(src) && CHECK_BITFIELD(L.vore_flags,DEVOURABLE)) // aggressive check to ensure vore attacks can be made
if(prob(voracious_chance))
vore_attack(src,L,src)
else
@@ -361,6 +362,8 @@
return target.attack_animal(src)
else
return target.attack_animal(src)
+ */
+ return target.attack_animal(src)
/mob/living/simple_animal/hostile/proc/Aggro()
vision_range = aggro_vision_range
diff --git a/code/modules/mob/living/simple_animal/hostile/megafauna/bubblegum.dm b/code/modules/mob/living/simple_animal/hostile/megafauna/bubblegum.dm
index 5e75088f53..d2680fbf61 100644
--- a/code/modules/mob/living/simple_animal/hostile/megafauna/bubblegum.dm
+++ b/code/modules/mob/living/simple_animal/hostile/megafauna/bubblegum.dm
@@ -65,10 +65,10 @@ Difficulty: Hard
/mob/living/simple_animal/hostile/megafauna/bubblegum/Life()
..()
- move_to_delay = CLAMP(round((health/maxHealth) * 10), 3, 10)
+ move_to_delay = clamp(round((health/maxHealth) * 10), 3, 10)
/mob/living/simple_animal/hostile/megafauna/bubblegum/OpenFire()
- anger_modifier = CLAMP(((maxHealth - health)/50),0,20)
+ anger_modifier = clamp(((maxHealth - health)/50),0,20)
if(charging)
return
ranged_cooldown = world.time + ranged_cooldown_time
diff --git a/code/modules/mob/living/simple_animal/hostile/megafauna/colossus.dm b/code/modules/mob/living/simple_animal/hostile/megafauna/colossus.dm
index 83d27e7ea6..73fb9d4e48 100644
--- a/code/modules/mob/living/simple_animal/hostile/megafauna/colossus.dm
+++ b/code/modules/mob/living/simple_animal/hostile/megafauna/colossus.dm
@@ -56,7 +56,7 @@ Difficulty: Very Hard
L.dust()
/mob/living/simple_animal/hostile/megafauna/colossus/OpenFire()
- anger_modifier = CLAMP(((maxHealth - health)/50),0,20)
+ anger_modifier = clamp(((maxHealth - health)/50),0,20)
ranged_cooldown = world.time + 120
if(enrage(target))
diff --git a/code/modules/mob/living/simple_animal/hostile/megafauna/dragon_vore.dm b/code/modules/mob/living/simple_animal/hostile/megafauna/dragon_vore.dm
index 8c06b01402..a2d18c508e 100644
--- a/code/modules/mob/living/simple_animal/hostile/megafauna/dragon_vore.dm
+++ b/code/modules/mob/living/simple_animal/hostile/megafauna/dragon_vore.dm
@@ -1,6 +1,5 @@
/mob/living/simple_animal/hostile/megafauna/dragon
vore_active = TRUE
- no_vore = FALSE
isPredator = TRUE
/mob/living/simple_animal/hostile/megafauna/dragon/Initialize()
diff --git a/code/modules/mob/living/simple_animal/hostile/megafauna/drake.dm b/code/modules/mob/living/simple_animal/hostile/megafauna/drake.dm
index 4644992ad0..159f8a7f5c 100644
--- a/code/modules/mob/living/simple_animal/hostile/megafauna/drake.dm
+++ b/code/modules/mob/living/simple_animal/hostile/megafauna/drake.dm
@@ -105,7 +105,7 @@ Difficulty: Medium
/mob/living/simple_animal/hostile/megafauna/dragon/OpenFire()
if(swooping)
return
- anger_modifier = CLAMP(((maxHealth - health)/50),0,20)
+ anger_modifier = clamp(((maxHealth - health)/50),0,20)
ranged_cooldown = world.time + ranged_cooldown_time
if(prob(15 + anger_modifier) && !client)
diff --git a/code/modules/mob/living/simple_animal/hostile/megafauna/hierophant.dm b/code/modules/mob/living/simple_animal/hostile/megafauna/hierophant.dm
index a9d42373a2..477c2ce3aa 100644
--- a/code/modules/mob/living/simple_animal/hostile/megafauna/hierophant.dm
+++ b/code/modules/mob/living/simple_animal/hostile/megafauna/hierophant.dm
@@ -191,7 +191,7 @@ Difficulty: Normal
/mob/living/simple_animal/hostile/megafauna/hierophant/proc/calculate_rage() //how angry we are overall
did_reset = FALSE //oh hey we're doing SOMETHING, clearly we might need to heal if we recall
- anger_modifier = CLAMP(((maxHealth - health) / 42),0,50)
+ anger_modifier = clamp(((maxHealth - health) / 42),0,50)
burst_range = initial(burst_range) + round(anger_modifier * 0.08)
beam_range = initial(beam_range) + round(anger_modifier * 0.12)
diff --git a/code/modules/mob/living/simple_animal/hostile/megafauna/megafauna.dm b/code/modules/mob/living/simple_animal/hostile/megafauna/megafauna.dm
index 8aed1ede30..8958916880 100644
--- a/code/modules/mob/living/simple_animal/hostile/megafauna/megafauna.dm
+++ b/code/modules/mob/living/simple_animal/hostile/megafauna/megafauna.dm
@@ -87,7 +87,7 @@
if(!client && ranged && ranged_cooldown <= world.time)
OpenFire()
if(L.Adjacent(src) && (L.stat != CONSCIOUS))
- if(vore_active && L.devourable == TRUE)
+ if(vore_active && CHECK_BITFIELD(L.vore_flags,DEVOURABLE))
vore_attack(src,L,src)
LoseTarget()
else
diff --git a/code/modules/mob/living/simple_animal/hostile/mining_mobs/hivelord.dm b/code/modules/mob/living/simple_animal/hostile/mining_mobs/hivelord.dm
index 89d9919981..8487564c98 100644
--- a/code/modules/mob/living/simple_animal/hostile/mining_mobs/hivelord.dm
+++ b/code/modules/mob/living/simple_animal/hostile/mining_mobs/hivelord.dm
@@ -200,7 +200,7 @@
/mob/living/simple_animal/hostile/asteroid/hivelordbrood/legion/proc/infest(mob/living/carbon/human/H)
visible_message("[name] burrows into the flesh of [H]!")
var/mob/living/simple_animal/hostile/asteroid/hivelord/legion/L
- if(H.dna.check_mutation(DWARFISM)) //dwarf legions aren't just fluff!
+ if(HAS_TRAIT(H, TRAIT_DWARF)) //dwarf legions aren't just fluff!
L = new /mob/living/simple_animal/hostile/asteroid/hivelord/legion/dwarf(H.loc)
else
L = new(H.loc)
diff --git a/code/modules/mob/living/simple_animal/hostile/venus_human_trap.dm b/code/modules/mob/living/simple_animal/hostile/venus_human_trap.dm
index 13a4d1793e..5111b0b180 100644
--- a/code/modules/mob/living/simple_animal/hostile/venus_human_trap.dm
+++ b/code/modules/mob/living/simple_animal/hostile/venus_human_trap.dm
@@ -1,5 +1,13 @@
-
-
+/**
+ * Kudzu Flower Bud
+ *
+ * A flower created by flowering kudzu which spawns a venus human trap after a certain amount of time has passed.
+ *
+ * A flower created by kudzu with the flowering mutation. Spawns a venus human trap after 2 minutes under normal circumstances.
+ * Also spawns 4 vines going out in diagonal directions from the bud. Any living creature not aligned with plants is damaged by these vines.
+ * Once it grows a venus human trap, the bud itself will destroy itself.
+ *
+ */
/obj/structure/alien/resin/flower_bud_enemy //inheriting basic attack/damage stuff from alien structures
name = "flower bud"
desc = "A large pulsating plant..."
@@ -9,9 +17,9 @@
opacity = 0
canSmoothWith = list()
smooth = SMOOTH_FALSE
+ /// The amount of time it takes to create a venus human trap, in deciseconds
var/growth_time = 1200
-
/obj/structure/alien/resin/flower_bud_enemy/Initialize()
. = ..()
var/list/anchors = list()
@@ -25,36 +33,49 @@
B.sleep_time = 10 //these shouldn't move, so let's slow down updates to 1 second (any slower and the deletion of the vines would be too slow)
addtimer(CALLBACK(src, .proc/bear_fruit), growth_time)
+/**
+ * Spawns a venus human trap, then qdels itself.
+ *
+ * Displays a message, spawns a human venus trap, then qdels itself.
+ */
/obj/structure/alien/resin/flower_bud_enemy/proc/bear_fruit()
- visible_message("the plant has borne fruit!")
+ visible_message("The plant has borne fruit!")
new /mob/living/simple_animal/hostile/venus_human_trap(get_turf(src))
qdel(src)
-
/obj/effect/ebeam/vine
name = "thick vine"
mouse_opacity = MOUSE_OPACITY_ICON
desc = "A thick vine, painful to the touch."
-
/obj/effect/ebeam/vine/Crossed(atom/movable/AM)
+ . = ..()
if(isliving(AM))
var/mob/living/L = AM
- if(!("vines" in L.faction))
+ if(!isvineimmune(L))
L.adjustBruteLoss(5)
to_chat(L, "You cut yourself on the thorny vines.")
-
-
+/**
+ * Venus Human Trap
+ *
+ * The result of a kudzu flower bud, these enemies use vines to drag prey close to them for attack.
+ *
+ * A carnivorious plant which uses vines to catch and ensnare prey. Spawns from kudzu flower buds.
+ * Each one has a maximum of four vines, which can be attached to a variety of things. Carbons are stunned when a vine is attached to them, and movable entities are pulled closer over time.
+ * Attempting to attach a vine to something with a vine already attached to it will pull all movable targets closer on command.
+ * Once the prey is in melee range, melee attacks from the venus human trap heals itself for 10% of its max health, assuming the target is alive.
+ * Akin to certain spiders, venus human traps can also be possessed and controlled by ghosts.
+ *
+ */
/mob/living/simple_animal/hostile/venus_human_trap
name = "venus human trap"
desc = "Now you know how the fly feels."
icon_state = "venus_human_trap"
- threat = 1
layer = SPACEVINE_MOB_LAYER
health = 50
maxHealth = 50
- ranged = 1
+ ranged = TRUE
harm_intent_damage = 5
obj_damage = 60
melee_damage_lower = 25
@@ -63,65 +84,110 @@
attack_sound = 'sound/weapons/bladeslice.ogg'
atmos_requirements = list("min_oxy" = 0, "max_oxy" = 0, "min_tox" = 0, "max_tox" = 0, "min_co2" = 0, "max_co2" = 0, "min_n2" = 0, "max_n2" = 0)
unsuitable_atmos_damage = 0
+ lighting_alpha = LIGHTING_PLANE_ALPHA_MOSTLY_INVISIBLE
faction = list("hostile","vines","plants")
- var/list/grasping = list()
- var/max_grasps = 4
- var/grasp_chance = 20
- var/grasp_pull_chance = 85
- var/grasp_range = 4
- del_on_death = 1
+ initial_language_holder = /datum/language_holder/venus
+ del_on_death = TRUE
+ /// A list of all the plant's vines
+ var/list/vines = list()
+ /// The maximum amount of vines a plant can have at one time
+ var/max_vines = 4
+ /// How far away a plant can attach a vine to something
+ var/vine_grab_distance = 5
+ /// Whether or not this plant is ghost possessable
+ var/playable_plant = FALSE //Normal plants can **not** have players.
-/mob/living/simple_animal/hostile/venus_human_trap/Destroy()
- for(var/L in grasping)
- var/datum/beam/B = grasping[L]
- if(B)
- qdel(B)
- grasping = null
- return ..()
+/mob/living/simple_animal/hostile/venus_human_trap/ghost_playable
+ playable_plant = TRUE //For admins that want to buss some harmless plants
-/mob/living/simple_animal/hostile/venus_human_trap/handle_automated_action()
- if(..())
- for(var/mob/living/L in grasping)
- if(L.stat == DEAD)
- var/datum/beam/B = grasping[L]
- if(B)
- B.End()
- grasping -= L
-
- //Can attack+pull multiple times per cycle
- if(L.Adjacent(src))
- L.attack_animal(src)
- else
- if(prob(grasp_pull_chance))
- setDir(get_dir(src,L) )//staaaare
- step(L,get_dir(L,src)) //reel them in
- L.DefaultCombatKnockdown(60) //you can't get away now~
-
- if(grasping.len < max_grasps)
- grasping:
- for(var/mob/living/L in view(grasp_range, src))
- if(L == src || faction_check_mob(L) || (L in grasping) || L == target)
- continue
- for(var/t in getline(src,L))
- for(var/a in t)
- var/atom/A = a
- if(A.density && A != L)
- continue grasping
- if(prob(grasp_chance))
- to_chat(L, "\The [src] has you entangled!")
- grasping[L] = Beam(L, "vine", time=INFINITY, maxdistance=5, beam_type=/obj/effect/ebeam/vine)
-
- break //only take 1 new victim per cycle
+/mob/living/simple_animal/hostile/venus_human_trap/Life()
+ . = ..()
+ pull_vines()
+/mob/living/simple_animal/hostile/venus_human_trap/AttackingTarget()
+ . = ..()
+ if(isliving(target))
+ var/mob/living/L = target
+ if(L.stat != DEAD)
+ adjustHealth(-maxHealth * 0.1)
/mob/living/simple_animal/hostile/venus_human_trap/OpenFire(atom/the_target)
- var/dist = get_dist(src,the_target)
- Beam(the_target, "vine", time=dist*2, maxdistance=dist+2, beam_type=/obj/effect/ebeam/vine)
- the_target.attack_animal(src)
+ for(var/datum/beam/B in vines)
+ if(B.target == the_target)
+ pull_vines()
+ ranged_cooldown = world.time + (ranged_cooldown_time * 0.5)
+ return
+ if(get_dist(src,the_target) > vine_grab_distance || vines.len == max_vines)
+ return
+ for(var/turf/T in getline(src,target))
+ if (T.density)
+ return
+ for(var/obj/O in T)
+ if(O.density)
+ return
+ var/datum/beam/newVine = Beam(the_target, "vine", time=INFINITY, maxdistance = vine_grab_distance, beam_type=/obj/effect/ebeam/vine)
+ RegisterSignal(newVine, COMSIG_PARENT_QDELETING, .proc/remove_vine, newVine)
+ vines += newVine
+ if(isliving(the_target))
+ var/mob/living/L = the_target
+ L.Paralyze(20)
+ ranged_cooldown = world.time + ranged_cooldown_time
-/mob/living/simple_animal/hostile/venus_human_trap/CanAttack(atom/the_target)
+/mob/living/simple_animal/hostile/venus_human_trap/Login()
+ . = ..()
+ to_chat(src, "You a venus human trap! Protect the kudzu at all costs, and feast on those who oppose you!")
+
+/mob/living/simple_animal/hostile/venus_human_trap/attack_ghost(mob/user)
. = ..()
if(.)
- if(the_target in grasping)
- return 0
+ return
+ humanize_plant(user)
+
+/**
+ * Sets a ghost to control the plant if the plant is eligible
+ *
+ * Asks the interacting ghost if they would like to control the plant.
+ * If they answer yes, and another ghost hasn't taken control, sets the ghost to control the plant.
+ * Arguments:
+ * * mob/user - The ghost to possibly control the plant
+ */
+
+/mob/living/simple_animal/hostile/venus_human_trap/proc/humanize_plant(mob/user)
+ if(key || !playable_plant || stat)
+ return
+ var/plant_ask = alert("Become a venus human trap?", "Are you reverse vegan?", "Yes", "No")
+ if(plant_ask == "No" || QDELETED(src))
+ return
+ if(key)
+ to_chat(user, "Someone else already took this plant!")
+ return
+ key = user.key
+ log_game("[key_name(src)] took control of [name].")
+
+/**
+ * Manages how the vines should affect the things they're attached to.
+ *
+ * Pulls all movable targets of the vines closer to the plant
+ * If the target is on the same tile as the plant, destroy the vine
+ * Removes any QDELETED vines from the vines list.
+ */
+/mob/living/simple_animal/hostile/venus_human_trap/proc/pull_vines()
+ for(var/datum/beam/B in vines)
+ if(istype(B.target, /atom/movable))
+ var/atom/movable/AM = B.target
+ if(!AM.anchored)
+ step(AM,get_dir(AM,src))
+ if(get_dist(src,B.target) == 0)
+ B.End()
+
+/**
+ * Removes a vine from the list.
+ *
+ * Removes the vine from our list.
+ * Called specifically when the vine is about to be destroyed, so we don't have any null references.
+ * Arguments:
+ * * datum/beam/vine - The vine to be removed from the list.
+ */
+mob/living/simple_animal/hostile/venus_human_trap/proc/remove_vine(datum/beam/vine, force)
+ vines -= vine
diff --git a/code/modules/mob/living/simple_animal/simple_animal.dm b/code/modules/mob/living/simple_animal/simple_animal.dm
index 3feed2129b..def6327461 100644
--- a/code/modules/mob/living/simple_animal/simple_animal.dm
+++ b/code/modules/mob/living/simple_animal/simple_animal.dm
@@ -128,7 +128,7 @@
/mob/living/simple_animal/updatehealth()
..()
- health = CLAMP(health, 0, maxHealth)
+ health = clamp(health, 0, maxHealth)
/mob/living/simple_animal/update_stat()
if(status_flags & GODMODE)
@@ -292,8 +292,8 @@
/mob/living/simple_animal/proc/update_simplemob_varspeed()
if(speed == 0)
- remove_movespeed_modifier(MOVESPEED_ID_SIMPLEMOB_VARSPEED, TRUE)
- add_movespeed_modifier(MOVESPEED_ID_SIMPLEMOB_VARSPEED, TRUE, 100, multiplicative_slowdown = speed, override = TRUE)
+ remove_movespeed_modifier(/datum/movespeed_modifier/simplemob_varspeed)
+ add_or_update_variable_movespeed_modifier(/datum/movespeed_modifier/simplemob_varspeed, multiplicative_slowdown = speed)
/mob/living/simple_animal/Stat()
..()
diff --git a/code/modules/mob/living/simple_animal/simple_animal_vr.dm b/code/modules/mob/living/simple_animal/simple_animal_vr.dm
index 700ee3b7ce..de5bb578b8 100644
--- a/code/modules/mob/living/simple_animal/simple_animal_vr.dm
+++ b/code/modules/mob/living/simple_animal/simple_animal_vr.dm
@@ -49,54 +49,53 @@
// Simple animals have only one belly. This creates it (if it isn't already set up)
/mob/living/simple_animal/init_vore()
- vore_init = TRUE
+ ENABLE_BITFIELD(vore_flags, VORE_INIT)
if(CHECK_BITFIELD(flags_1, HOLOGRAM_1))
return
- if(!vore_active || no_vore) //If it can't vore, let's not give it a stomach.
+ if(!vore_active || CHECK_BITFIELD(vore_flags, NO_VORE)) //If it can't vore, let's not give it a stomach.
return
if(vore_active && !IsAdvancedToolUser()) //vore active, but doesn't have thumbs to grab people with.
verbs |= /mob/living/simple_animal/proc/animal_nom
- if(LAZYLEN(vore_organs))
- return
-
- LAZYINITLIST(vore_organs)
- var/obj/belly/B = new (src)
- vore_selected = B
- B.immutable = TRUE
- B.name = vore_stomach_name ? vore_stomach_name : "stomach"
- B.desc = vore_stomach_flavor ? vore_stomach_flavor : "Your surroundings are warm, soft, and slimy. Makes sense, considering you're inside \the [name]."
- B.digest_mode = vore_default_mode
- B.vore_sound = vore_default_sound
- B.release_sound = vore_default_release
- B.is_wet = vore_wetness
- B.escapable = vore_escape_chance > 0
- B.escapechance = vore_escape_chance
- B.digestchance = vore_digest_chance
- B.absorbchance = vore_absorb_chance
- B.human_prey_swallow_time = swallowTime
- B.nonhuman_prey_swallow_time = swallowTime
- B.vore_verb = "swallow"
- B.emote_lists[DM_HOLD] = list( // We need more that aren't repetitive. I suck at endo. -Ace
- "The insides knead at you gently for a moment.",
- "The guts glorp wetly around you as some air shifts.",
- "The predator takes a deep breath and sighs, shifting you somewhat.",
- "The stomach squeezes you tight for a moment, then relaxes harmlessly.",
- "The predator's calm breathing and thumping heartbeat pulses around you.",
- "The warm walls kneads harmlessly against you.",
- "The liquids churn around you, though there doesn't seem to be much effect.",
- "The sound of bodily movements drown out everything for a moment.",
- "The predator's movements gently force you into a different position.")
- B.emote_lists[DM_DIGEST] = list(
- "The burning acids eat away at your form.",
- "The muscular stomach flesh grinds harshly against you.",
- "The caustic air stings your chest when you try to breathe.",
- "The slimy guts squeeze inward to help the digestive juices soften you up.",
- "The onslaught against your body doesn't seem to be letting up; you're food now.",
- "The predator's body ripples and crushes against you as digestive enzymes pull you apart.",
- "The juices pooling beneath you sizzle against your sore skin.",
- "The churning walls slowly pulverize you into meaty nutrients.",
- "The stomach glorps and gurgles as it tries to work you into slop.")
+/mob/living/simple_animal/lazy_init_belly()
+ if(!LAZYLEN(vore_organs))
+ LAZYINITLIST(vore_organs)
+ var/obj/belly/B = new (src)
+ vore_selected = B
+ B.immutable = TRUE
+ B.name = vore_stomach_name ? vore_stomach_name : "stomach"
+ B.desc = vore_stomach_flavor ? vore_stomach_flavor : "Your surroundings are warm, soft, and slimy. Makes sense, considering you're inside \the [name]."
+ B.digest_mode = vore_default_mode
+ B.vore_sound = vore_default_sound
+ B.release_sound = vore_default_release
+ B.is_wet = vore_wetness
+ B.escapable = vore_escape_chance > 0
+ B.escapechance = vore_escape_chance
+ B.digestchance = vore_digest_chance
+ B.absorbchance = vore_absorb_chance
+ B.human_prey_swallow_time = swallowTime
+ B.nonhuman_prey_swallow_time = swallowTime
+ B.vore_verb = "swallow"
+ B.emote_lists[DM_HOLD] = list( // We need more that aren't repetitive. I suck at endo. -Ace
+ "The insides knead at you gently for a moment.",
+ "The guts glorp wetly around you as some air shifts.",
+ "The predator takes a deep breath and sighs, shifting you somewhat.",
+ "The stomach squeezes you tight for a moment, then relaxes harmlessly.",
+ "The predator's calm breathing and thumping heartbeat pulses around you.",
+ "The warm walls kneads harmlessly against you.",
+ "The liquids churn around you, though there doesn't seem to be much effect.",
+ "The sound of bodily movements drown out everything for a moment.",
+ "The predator's movements gently force you into a different position.")
+ B.emote_lists[DM_DIGEST] = list(
+ "The burning acids eat away at your form.",
+ "The muscular stomach flesh grinds harshly against you.",
+ "The caustic air stings your chest when you try to breathe.",
+ "The slimy guts squeeze inward to help the digestive juices soften you up.",
+ "The onslaught against your body doesn't seem to be letting up; you're food now.",
+ "The predator's body ripples and crushes against you as digestive enzymes pull you apart.",
+ "The juices pooling beneath you sizzle against your sore skin.",
+ "The churning walls slowly pulverize you into meaty nutrients.",
+ "The stomach glorps and gurgles as it tries to work you into slop.")
//
// Simple proc for animals to have their digestion toggled on/off externally
@@ -134,6 +133,6 @@
if (stat != CONSCIOUS)
return
- if(!T.devourable)
+ if(!CHECK_BITFIELD(T.vore_flags,DEVOURABLE))
return
return vore_attack(src,T,src)
diff --git a/code/modules/mob/living/simple_animal/simplemob_vore_values.dm b/code/modules/mob/living/simple_animal/simplemob_vore_values.dm
index 22ed5e3ab4..3c911c1fcf 100644
--- a/code/modules/mob/living/simple_animal/simplemob_vore_values.dm
+++ b/code/modules/mob/living/simple_animal/simplemob_vore_values.dm
@@ -1,13 +1,9 @@
//CARBON MOBS
/mob/living/carbon/alien
- devourable = TRUE
- digestable = TRUE
- feeding = TRUE
+ vore_flags = DEVOURABLE | DIGESTABLE | FEEDING
/mob/living/carbon/monkey
- devourable = TRUE
- digestable = TRUE
- feeding = TRUE
+ vore_flags = DEVOURABLE | DIGESTABLE | FEEDING
/*
@@ -17,121 +13,68 @@
//NUETRAL MOBS
/mob/living/simple_animal/crab
- devourable = TRUE
- digestable = TRUE
- feeding = TRUE
+ vore_flags = DEVOURABLE | DIGESTABLE | FEEDING
/mob/living/simple_animal/cow
- devourable = TRUE
- digestable = TRUE
- feeding = TRUE
- vore_active = TRUE
- isPredator = TRUE
- vore_default_mode = DM_HOLD
+ vore_flags = DEVOURABLE | DIGESTABLE | FEEDING
/mob/living/simple_animal/chick
- devourable = TRUE
- digestable = TRUE
+ vore_flags = DEVOURABLE | DIGESTABLE
/mob/living/simple_animal/chicken
- devourable = TRUE
- digestable = TRUE
+ vore_flags = DEVOURABLE | DIGESTABLE
/mob/living/simple_animal/mouse
- devourable = TRUE
- digestable = TRUE
+ vore_flags = DEVOURABLE | DIGESTABLE
/mob/living/simple_animal/kiwi
- devourable = TRUE
- digestable = TRUE
+ vore_flags = DEVOURABLE | DIGESTABLE
//STATION PETS
/mob/living/simple_animal/pet
- devourable = TRUE
- digestable = TRUE
- feeding = TRUE
-
-/mob/living/simple_animal/pet/fox
- vore_active = TRUE
- isPredator = TRUE
- vore_default_mode = DM_HOLD
-
-/mob/living/simple_animal/pet/cat
- vore_active = TRUE
- isPredator = TRUE
- vore_default_mode = DM_HOLD
-
-/mob/living/simple_animal/pet/dog
- vore_active = TRUE
- isPredator = TRUE
+ vore_flags = DEVOURABLE | DIGESTABLE | FEEDING
vore_default_mode = DM_HOLD
/mob/living/simple_animal/sloth
- devourable = TRUE
- digestable = TRUE
+ vore_flags = DEVOURABLE | DIGESTABLE
/mob/living/simple_animal/parrot
- devourable = TRUE
- digestable = TRUE
+ vore_flags = DEVOURABLE | DIGESTABLE
//HOSTILE MOBS
/mob/living/simple_animal/hostile/retaliate/goat
- devourable = TRUE
- digestable = TRUE
- feeding = TRUE
- vore_active = TRUE
- isPredator = TRUE
- vore_stomach_flavor = "You find yourself squeezed into the hollow of the goat, the smell of oats and hay thick in the tight space, all of which grinds in on you. Harmless for now..."
+ vore_flags = DEVOURABLE | DIGESTABLE | FEEDING
vore_default_mode = DM_HOLD
+
/mob/living/simple_animal/hostile/lizard
- devourable = TRUE
- digestable = TRUE
- feeding = TRUE
- vore_active = TRUE
- isPredator = TRUE
+ vore_flags = DEVOURABLE | DIGESTABLE | FEEDING
vore_default_mode = DM_DIGEST
/mob/living/simple_animal/hostile/alien
- feeding = TRUE
- vore_active = TRUE
- isPredator = TRUE
+ vore_flags = FEEDING
vore_default_mode = DM_DIGEST
/mob/living/simple_animal/hostile/bear
- feeding = TRUE
- vore_active = TRUE
- isPredator = TRUE
+ vore_flags = FEEDING
vore_default_mode = DM_DIGEST
/mob/living/simple_animal/hostile/poison/giant_spider
- feeding = TRUE
- vore_active = TRUE
- isPredator = TRUE
+ vore_flags = FEEDING
vore_default_mode = DM_DIGEST
/mob/living/simple_animal/hostile/retaliate/poison/snake
- feeding = TRUE
- vore_active = TRUE
- isPredator = TRUE
+ vore_flags = FEEDING
vore_default_mode = DM_DIGEST
/mob/living/simple_animal/hostile/gorilla
- feeding = TRUE
- vore_active = TRUE
- isPredator = TRUE
+ vore_flags = FEEDING
vore_default_mode = DM_DIGEST
/mob/living/simple_animal/hostile/asteroid/goliath
- feeding = TRUE //for pet Goliaths I guess or something.
- vore_active = TRUE
- isPredator = TRUE
+ vore_flags = FEEDING
vore_default_mode = DM_DIGEST
/mob/living/simple_animal/hostile/carp
- devourable = TRUE
- digestable = TRUE
- feeding = TRUE
- vore_active = TRUE
- isPredator = TRUE
+ vore_flags = DEVOURABLE | DIGESTABLE | FEEDING
vore_default_mode = DM_DIGEST
diff --git a/code/modules/mob/living/simple_animal/slime/powers.dm b/code/modules/mob/living/simple_animal/slime/powers.dm
index 4f8e271d6f..d5da6d76fc 100644
--- a/code/modules/mob/living/simple_animal/slime/powers.dm
+++ b/code/modules/mob/living/simple_animal/slime/powers.dm
@@ -190,7 +190,7 @@
step_away(M,src)
M.Friends = Friends.Copy()
babies += M
- M.mutation_chance = CLAMP(mutation_chance+(rand(5,-5)),0,100)
+ M.mutation_chance = clamp(mutation_chance+(rand(5,-5)),0,100)
SSblackbox.record_feedback("tally", "slime_babies_born", 1, M.colour)
var/mob/living/simple_animal/slime/new_slime = pick(babies)
diff --git a/code/modules/mob/living/simple_animal/slime/slime.dm b/code/modules/mob/living/simple_animal/slime/slime.dm
index 8594d53bd1..dd454c4243 100644
--- a/code/modules/mob/living/simple_animal/slime/slime.dm
+++ b/code/modules/mob/living/simple_animal/slime/slime.dm
@@ -147,25 +147,25 @@
/mob/living/simple_animal/slime/on_reagent_change()
. = ..()
- remove_movespeed_modifier(MOVESPEED_ID_SLIME_REAGENTMOD, TRUE)
+ remove_movespeed_modifier(/datum/movespeed_modifier/slime_reagentmod)
var/amount = 0
if(reagents.has_reagent(/datum/reagent/medicine/morphine)) // morphine slows slimes down
amount = 2
if(reagents.has_reagent(/datum/reagent/consumable/frostoil)) // Frostoil also makes them move VEEERRYYYYY slow
amount = 5
if(amount)
- add_movespeed_modifier(MOVESPEED_ID_SLIME_REAGENTMOD, TRUE, 100, override = TRUE, multiplicative_slowdown = amount)
+ add_or_update_variable_movespeed_modifier(/datum/movespeed_modifier/slime_reagentmod, multiplicative_slowdown = amount)
/mob/living/simple_animal/slime/updatehealth()
. = ..()
- remove_movespeed_modifier(MOVESPEED_ID_SLIME_HEALTHMOD, FALSE)
+ remove_movespeed_modifier(/datum/movespeed_modifier/slime_healthmod)
var/health_deficiency = (100 - health)
var/mod = 0
if(health_deficiency >= 45)
mod += (health_deficiency / 25)
if(health <= 0)
mod += 2
- add_movespeed_modifier(MOVESPEED_ID_SLIME_HEALTHMOD, TRUE, 100, multiplicative_slowdown = mod)
+ add_or_update_variable_movespeed_modifier(/datum/movespeed_modifier/slime_healthmod, multiplicative_slowdown = mod)
/mob/living/simple_animal/slime/adjust_bodytemperature()
. = ..()
@@ -173,9 +173,8 @@
if(bodytemperature >= 330.23) // 135 F or 57.08 C
mod = -1 // slimes become supercharged at high temperatures
else if(bodytemperature < 183.222)
- mod = (283.222 - bodytemperature) / 10 * 1.75
- if(mod)
- add_movespeed_modifier(MOVESPEED_ID_SLIME_TEMPMOD, TRUE, 100, override = TRUE, multiplicative_slowdown = mod)
+ mod = min(15, (283.222 - bodytemperature) / 10 * 1.75)
+ add_or_update_variable_movespeed_modifier(/datum/movespeed_modifier/slime_tempmod, multiplicative_slowdown = mod)
/mob/living/simple_animal/slime/ObjBump(obj/O)
if(!client && powerlevel > 0)
diff --git a/code/modules/mob/living/status_procs.dm b/code/modules/mob/living/status_procs.dm
index 1375d88948..0d41347179 100644
--- a/code/modules/mob/living/status_procs.dm
+++ b/code/modules/mob/living/status_procs.dm
@@ -622,10 +622,40 @@
tod = STATION_TIME_TIMESTAMP("hh:mm:ss", world.time)
update_stat()
+///Unignores all slowdowns that lack the IGNORE_NOSLOW flag.
/mob/living/proc/unignore_slowdown(source)
REMOVE_TRAIT(src, TRAIT_IGNORESLOWDOWN, source)
- update_movespeed(FALSE)
+ update_movespeed()
+///Ignores all slowdowns that lack the IGNORE_NOSLOW flag.
/mob/living/proc/ignore_slowdown(source)
ADD_TRAIT(src, TRAIT_IGNORESLOWDOWN, source)
- update_movespeed(FALSE)
+ update_movespeed()
+
+///Ignores specific slowdowns. Accepts a list of slowdowns.
+/mob/living/proc/add_movespeed_mod_immunities(source, slowdown_type, update = TRUE)
+ if(islist(slowdown_type))
+ for(var/listed_type in slowdown_type)
+ if(ispath(listed_type))
+ listed_type = "[listed_type]" //Path2String
+ LAZYADDASSOC(movespeed_mod_immunities, listed_type, source)
+ else
+ if(ispath(slowdown_type))
+ slowdown_type = "[slowdown_type]" //Path2String
+ LAZYADDASSOC(movespeed_mod_immunities, slowdown_type, source)
+ if(update)
+ update_movespeed()
+
+///Unignores specific slowdowns. Accepts a list of slowdowns.
+/mob/living/proc/remove_movespeed_mod_immunities(source, slowdown_type, update = TRUE)
+ if(islist(slowdown_type))
+ for(var/listed_type in slowdown_type)
+ if(ispath(listed_type))
+ listed_type = "[listed_type]" //Path2String
+ LAZYREMOVEASSOC(movespeed_mod_immunities, listed_type, source)
+ else
+ if(ispath(slowdown_type))
+ slowdown_type = "[slowdown_type]" //Path2String
+ LAZYREMOVEASSOC(movespeed_mod_immunities, slowdown_type, source)
+ if(update)
+ update_movespeed()
diff --git a/code/modules/mob/mob.dm b/code/modules/mob/mob.dm
index fd786c8631..b5dc25e4dc 100644
--- a/code/modules/mob/mob.dm
+++ b/code/modules/mob/mob.dm
@@ -284,7 +284,7 @@ mob/visible_message(message, self_message, blind_message, vision_distance = DEFA
/mob/proc/reset_perspective(atom/A)
if(client)
if(A)
- if(ismovableatom(A))
+ if(ismovable(A))
//Set the the thing unless it's us
if(A != src)
client.perspective = EYE_PERSPECTIVE
@@ -1033,17 +1033,22 @@ GLOBAL_VAR_INIT(exploit_warn_spam_prevention, 0)
/// Updates the grab state of the mob and updates movespeed
/mob/setGrabState(newstate)
. = ..()
- if(grab_state == GRAB_PASSIVE)
- remove_movespeed_modifier(MOVESPEED_ID_MOB_GRAB_STATE, update=TRUE)
- else
- add_movespeed_modifier(MOVESPEED_ID_MOB_GRAB_STATE, update=TRUE, priority=100, override=TRUE, multiplicative_slowdown=grab_state*3, blacklisted_movetypes=FLOATING)
+ switch(grab_state)
+ if(GRAB_PASSIVE)
+ remove_movespeed_modifier(MOVESPEED_ID_MOB_GRAB_STATE)
+ if(GRAB_AGGRESSIVE)
+ add_movespeed_modifier(/datum/movespeed_modifier/grab_slowdown/aggressive)
+ if(GRAB_NECK)
+ add_movespeed_modifier(/datum/movespeed_modifier/grab_slowdown/neck)
+ if(GRAB_KILL)
+ add_movespeed_modifier(/datum/movespeed_modifier/grab_slowdown/kill)
/mob/proc/update_equipment_speed_mods()
var/speedies = equipped_speed_mods()
if(!speedies)
- remove_movespeed_modifier(MOVESPEED_ID_MOB_EQUIPMENT, update=TRUE)
+ remove_movespeed_modifier(/datum/movespeed_modifier/equipment_speedmod, update=TRUE)
else
- add_movespeed_modifier(MOVESPEED_ID_MOB_EQUIPMENT, update=TRUE, priority=100, override=TRUE, multiplicative_slowdown=speedies, blacklisted_movetypes=FLOATING)
+ add_or_update_variable_movespeed_modifier(/datum/movespeed_modifier/equipment_speedmod, multiplicative_slowdown = speedies)
/// Gets the combined speed modification of all worn items
/// Except base mob type doesnt really wear items
diff --git a/code/modules/mob/mob_defines.dm b/code/modules/mob/mob_defines.dm
index bf9dad1bc7..7d177e7ac2 100644
--- a/code/modules/mob/mob_defines.dm
+++ b/code/modules/mob/mob_defines.dm
@@ -42,8 +42,11 @@
var/lying_prev = 0
var/is_shifted = FALSE
- //MOVEMENT SPEED
+ /// List of movement speed modifiers applying to this mob
var/list/movespeed_modification //Lazy list, see mob_movespeed.dm
+ /// List of movement speed modifiers ignored by this mob. List -> List (id) -> List (sources)
+ var/list/movespeed_mod_immunities //Lazy list, see mob_movespeed.dm
+ /// The calculated mob speed slowdown based on the modifiers list
var/cached_multiplicative_slowdown
/////////////////
diff --git a/code/modules/mob/mob_movement.dm b/code/modules/mob/mob_movement.dm
index ffc0970bdf..fdc60b30cb 100644
--- a/code/modules/mob/mob_movement.dm
+++ b/code/modules/mob/mob_movement.dm
@@ -80,12 +80,12 @@
var/oldloc = mob.loc
if(L.confused)
- var/newdir = 0
- if(L.confused > 40)
+ var/newdir = NONE
+ if((L.confused > 50) && prob(min(L.confused * 0.5, 50)))
newdir = pick(GLOB.alldirs)
- else if(prob(L.confused * 1.5))
+ else if(prob(L.confused))
newdir = angle2dir(dir2angle(direction) + pick(90, -90))
- else if(prob(L.confused * 3))
+ else if(prob(L.confused * 2))
newdir = angle2dir(dir2angle(direction) + pick(45, -45))
if(newdir)
direction = newdir
@@ -251,9 +251,9 @@
/mob/proc/update_gravity(has_gravity, override=FALSE)
var/speed_change = max(0, has_gravity - STANDARD_GRAVITY)
if(!speed_change)
- remove_movespeed_modifier(MOVESPEED_ID_MOB_GRAVITY, update=TRUE)
+ remove_movespeed_modifier(/datum/movespeed_modifier/gravity)
else
- add_movespeed_modifier(MOVESPEED_ID_MOB_GRAVITY, update=TRUE, priority=100, override=TRUE, multiplicative_slowdown=speed_change, blacklisted_movetypes=FLOATING)
+ add_or_update_variable_movespeed_modifier(/datum/movespeed_modifier/gravity, multiplicative_slowdown = speed_change)
//bodypart selection - Cyberboss
//8 toggles through head - eyes - mouth
diff --git a/code/modules/mob/mob_movespeed.dm b/code/modules/mob/mob_movespeed.dm
deleted file mode 100644
index a0be8ff7cb..0000000000
--- a/code/modules/mob/mob_movespeed.dm
+++ /dev/null
@@ -1,126 +0,0 @@
-
-/*Current movespeed modification list format: list(id = list(
- priority,
- flags,
- legacy slowdown/speedup amount,
- movetype_flags,
- blacklisted_movetypes,
- conflict
- ))
-*/
-
-//ANY ADD/REMOVE DONE IN UPDATE_MOVESPEED MUST HAVE THE UPDATE ARGUMENT SET AS FALSE!
-/mob/proc/add_movespeed_modifier(id, update=TRUE, priority=0, flags=NONE, override=FALSE, multiplicative_slowdown=0, movetypes=ALL, blacklisted_movetypes=NONE, conflict=FALSE)
- var/list/temp = list(priority, flags, multiplicative_slowdown, movetypes, blacklisted_movetypes, conflict) //build the modification list
- var/resort = TRUE
- if(LAZYACCESS(movespeed_modification, id))
- var/list/existing_data = movespeed_modification[id]
- if(movespeed_modifier_identical_check(existing_data, temp))
- return FALSE
- if(!override)
- return FALSE
- if(priority == existing_data[MOVESPEED_DATA_INDEX_PRIORITY])
- resort = FALSE // We don't need to re-sort if we're replacing something already there and it's the same priority
- LAZYSET(movespeed_modification, id, temp)
- if(update)
- update_movespeed(resort)
- return TRUE
-
-/mob/proc/remove_movespeed_modifier(id, update = TRUE)
- if(!LAZYACCESS(movespeed_modification, id))
- return FALSE
- LAZYREMOVE(movespeed_modification, id)
- UNSETEMPTY(movespeed_modification)
- if(update)
- update_movespeed(FALSE)
- return TRUE
-
-/mob/vv_edit_var(var_name, var_value)
- var/slowdown_edit = (var_name == NAMEOF(src, cached_multiplicative_slowdown))
- var/diff
- if(slowdown_edit && isnum(cached_multiplicative_slowdown) && isnum(var_value))
- remove_movespeed_modifier(MOVESPEED_ID_ADMIN_VAREDIT)
- diff = var_value - cached_multiplicative_slowdown
- . = ..()
- if(. && slowdown_edit && isnum(diff))
- add_movespeed_modifier(MOVESPEED_ID_ADMIN_VAREDIT, TRUE, 100, override = TRUE, multiplicative_slowdown = diff)
-
-/mob/proc/has_movespeed_modifier(id)
- return LAZYACCESS(movespeed_modification, id)
-
-/mob/proc/update_config_movespeed()
- add_movespeed_modifier(MOVESPEED_ID_CONFIG_SPEEDMOD, FALSE, 100, override = TRUE, multiplicative_slowdown = get_config_multiplicative_speed())
-
-/mob/proc/get_config_multiplicative_speed()
- if(!islist(GLOB.mob_config_movespeed_type_lookup) || !GLOB.mob_config_movespeed_type_lookup[type])
- return 0
- else
- return GLOB.mob_config_movespeed_type_lookup[type]
-
-/mob/proc/update_movespeed(resort = TRUE)
- if(resort)
- sort_movespeed_modlist()
- . = 0
- var/list/conflict_tracker = list()
- for(var/id in get_movespeed_modifiers())
- var/list/data = movespeed_modification[id]
- if(!(data[MOVESPEED_DATA_INDEX_MOVETYPE] & movement_type)) // We don't affect any of these move types, skip
- continue
- if(data[MOVESPEED_DATA_INDEX_BL_MOVETYPE] & movement_type) // There's a movetype here that disables this modifier, skip
- continue
- var/conflict = data[MOVESPEED_DATA_INDEX_CONFLICT]
- var/amt = data[MOVESPEED_DATA_INDEX_MULTIPLICATIVE_SLOWDOWN]
- if(conflict)
- // Conflicting modifiers prioritize the larger slowdown or the larger speedup
- // We purposefuly don't handle mixing speedups and slowdowns on the same id
- if(abs(conflict_tracker[conflict]) < abs(amt))
- conflict_tracker[conflict] = amt
- else
- continue
- . += amt
- cached_multiplicative_slowdown = .
-
-/mob/proc/get_movespeed_modifiers()
- return movespeed_modification
-
-/mob/proc/movespeed_modifier_identical_check(list/mod1, list/mod2)
- if(!islist(mod1) || !islist(mod2) || mod1.len < MOVESPEED_DATA_INDEX_MAX || mod2.len < MOVESPEED_DATA_INDEX_MAX)
- return FALSE
- for(var/i in 1 to MOVESPEED_DATA_INDEX_MAX)
- if(mod1[i] != mod2[i])
- return FALSE
- return TRUE
-
-/mob/proc/total_multiplicative_slowdown()
- . = 0
- for(var/id in get_movespeed_modifiers())
- var/list/data = movespeed_modification[id]
- . += data[MOVESPEED_DATA_INDEX_MULTIPLICATIVE_SLOWDOWN]
-
-/proc/movespeed_data_null_check(list/data) //Determines if a data list is not meaningful and should be discarded.
- . = TRUE
- if(data[MOVESPEED_DATA_INDEX_MULTIPLICATIVE_SLOWDOWN])
- . = FALSE
-
-/mob/proc/sort_movespeed_modlist() //Verifies it too. Sorts highest priority (first applied) to lowest priority (last applied)
- if(!movespeed_modification)
- return
- var/list/assembled = list()
- for(var/our_id in movespeed_modification)
- var/list/our_data = movespeed_modification[our_id]
- if(!islist(our_data) || (our_data.len < MOVESPEED_DATA_INDEX_PRIORITY) || movespeed_data_null_check(our_data))
- movespeed_modification -= our_id
- continue
- var/our_priority = our_data[MOVESPEED_DATA_INDEX_PRIORITY]
- var/resolved = FALSE
- for(var/their_id in assembled)
- var/list/their_data = assembled[their_id]
- if(their_data[MOVESPEED_DATA_INDEX_PRIORITY] < our_priority)
- assembled.Insert(assembled.Find(their_id), our_id)
- assembled[our_id] = our_data
- resolved = TRUE
- break
- if(!resolved)
- assembled[our_id] = our_data
- movespeed_modification = assembled
- UNSETEMPTY(movespeed_modification)
\ No newline at end of file
diff --git a/code/modules/mob/status_procs.dm b/code/modules/mob/status_procs.dm
index 10abf460c6..cf86e962bd 100644
--- a/code/modules/mob/status_procs.dm
+++ b/code/modules/mob/status_procs.dm
@@ -20,7 +20,7 @@
dizziness = max(amount, 0)
/**
- * Sets a mob's blindness to an amount if it was not above it already, similar to how status effects work
+ * Sets a mob's blindness to an amount if it was not above it already, similar to how status effects work
*/
/mob/proc/blind_eyes(amount)
var/old_blind = eye_blind || HAS_TRAIT(src, TRAIT_BLIND)
@@ -90,8 +90,8 @@
return
var/obj/screen/plane_master/game_world/GW = locate(/obj/screen/plane_master/game_world) in client.screen
var/obj/screen/plane_master/floor/F = locate(/obj/screen/plane_master/floor) in client.screen
- GW.add_filter("blurry_eyes", 2, EYE_BLUR(CLAMP(eye_blurry*0.1,0.6,3)))
- F.add_filter("blurry_eyes", 2, EYE_BLUR(CLAMP(eye_blurry*0.1,0.6,3)))
+ GW.add_filter("blurry_eyes", 2, EYE_BLUR(clamp(eye_blurry*0.1,0.6,3)))
+ F.add_filter("blurry_eyes", 2, EYE_BLUR(clamp(eye_blurry*0.1,0.6,3)))
/mob/proc/remove_eyeblur()
if(!client)
@@ -120,4 +120,4 @@
///Adjust the body temperature of a mob, with min/max settings
/mob/proc/adjust_bodytemperature(amount,min_temp=0,max_temp=INFINITY)
if(bodytemperature >= min_temp && bodytemperature <= max_temp)
- bodytemperature = CLAMP(bodytemperature + amount,min_temp,max_temp)
+ bodytemperature = clamp(bodytemperature + amount,min_temp,max_temp)
diff --git a/code/modules/movespeed/_movespeed_modifier.dm b/code/modules/movespeed/_movespeed_modifier.dm
new file mode 100644
index 0000000000..0976f4d067
--- /dev/null
+++ b/code/modules/movespeed/_movespeed_modifier.dm
@@ -0,0 +1,217 @@
+/*! Movespeed modification datums.
+
+ How move speed for mobs works
+
+Move speed is now calculated by using modifier datums which are added to mobs. Some of them (nonvariable ones) are globally cached, the variable ones are instanced and changed based on need.
+
+This gives us the ability to have multiple sources of movespeed, reliabily keep them applied and remove them when they should be
+
+THey can have unique sources and a bunch of extra fancy flags that control behaviour
+
+Previously trying to update move speed was a shot in the dark that usually meant mobs got stuck going faster or slower
+
+Movespeed modification list is a simple key = datum system. Key will be the datum's ID if it is overridden to not be null, or type if it is not.
+
+DO NOT override datum IDs unless you are going to have multiple types that must overwrite each other. It's more efficient to use types, ID functionality is only kept for cases where dynamic creation of modifiers need to be done.
+
+When update movespeed is called, the list of items is iterated, according to flags priority and a bunch of conditions
+this spits out a final calculated value which is used as a modifer to last_move + modifier for calculating when a mob
+can next move
+
+Key procs
+* [add_movespeed_modifier](mob.html#proc/add_movespeed_modifier)
+* [remove_movespeed_modifier](mob.html#proc/remove_movespeed_modifier)
+* [has_movespeed_modifier](mob.html#proc/has_movespeed_modifier)
+* [update_movespeed](mob.html#proc/update_movespeed)
+*/
+
+/datum/movespeed_modifier
+ /// Whether or not this is a variable modifier. Variable modifiers can NOT be ever auto-cached. ONLY CHECKED VIA INITIAL(), EFFECTIVELY READ ONLY (and for very good reason)
+ var/variable = FALSE
+
+ /// Unique ID. You can never have different modifications with the same ID. By default, this SHOULD NOT be set. Only set it for cases where you're dynamically making modifiers/need to have two types overwrite each other. If unset, uses path (converted to text) as ID.
+ var/id
+
+ /// Higher ones override lower priorities. This is NOT used for ID, ID must be unique, if it isn't unique the newer one overwrites automatically if overriding.
+ var/priority = 0
+ var/flags = NONE
+
+ /// Multiplicative slowdown
+ var/multiplicative_slowdown = 0
+
+ /// Movetypes this applies to
+ var/movetypes = ALL
+
+ /// Movetypes this never applies to
+ var/blacklisted_movetypes = NONE
+
+ /// Other modification datums this conflicts with.
+ var/conflicts_with
+
+/datum/movespeed_modifier/New()
+ . = ..()
+ if(!id)
+ id = "[type]" //We turn the path into a string.
+
+GLOBAL_LIST_EMPTY(movespeed_modification_cache)
+
+/// Grabs a STATIC MODIFIER datum from cache. YOU MUST NEVER EDIT THESE DATUMS, OR IT WILL AFFECT ANYTHING ELSE USING IT TOO!
+/proc/get_cached_movespeed_modifier(modtype)
+ if(!ispath(modtype, /datum/movespeed_modifier))
+ CRASH("[modtype] is not a movespeed modification typepath.")
+ var/datum/movespeed_modifier/M = modtype
+ if(initial(M.variable))
+ CRASH("[modtype] is a variable modifier, and can never be cached.")
+ M = GLOB.movespeed_modification_cache[modtype]
+ if(!M)
+ M = GLOB.movespeed_modification_cache[modtype] = new modtype
+ return M
+
+///Add a move speed modifier to a mob. If a variable subtype is passed in as the first argument, it will make a new datum. If ID conflicts, it will overwrite the old ID.
+/mob/proc/add_movespeed_modifier(datum/movespeed_modifier/type_or_datum, update = TRUE)
+ if(ispath(type_or_datum))
+ if(!initial(type_or_datum.variable))
+ type_or_datum = get_cached_movespeed_modifier(type_or_datum)
+ else
+ type_or_datum = new type_or_datum
+ var/datum/movespeed_modifier/existing = LAZYACCESS(movespeed_modification, type_or_datum.id)
+ if(existing)
+ if(existing == type_or_datum) //same thing don't need to touch
+ return TRUE
+ remove_movespeed_modifier(existing, FALSE)
+ if(length(movespeed_modification))
+ BINARY_INSERT(type_or_datum.id, movespeed_modification, datum/movespeed_modifier, type_or_datum, priority, COMPARE_VALUE)
+ LAZYSET(movespeed_modification, type_or_datum.id, type_or_datum)
+ if(update)
+ update_movespeed()
+ return TRUE
+
+/// Remove a move speed modifier from a mob, whether static or variable.
+/mob/proc/remove_movespeed_modifier(datum/movespeed_modifier/type_id_datum, update = TRUE)
+ var/key
+ if(ispath(type_id_datum))
+ key = initial(type_id_datum.id) || "[type_id_datum]" //id if set, path set to string if not.
+ else if(!istext(type_id_datum)) //if it isn't text it has to be a datum, as it isn't a type.
+ key = type_id_datum.id
+ else //assume it's an id
+ key = type_id_datum
+ if(!LAZYACCESS(movespeed_modification, key))
+ return FALSE
+ LAZYREMOVE(movespeed_modification, key)
+ if(update)
+ update_movespeed(FALSE)
+ return TRUE
+
+/*! Used for variable slowdowns like hunger/health loss/etc, works somewhat like the old list-based modification adds. Returns the modifier datum if successful
+ How this SHOULD work is:
+ 1. Ensures type_id_datum one way or another refers to a /variable datum. This makes sure it can't be cached. This includes if it's already in the modification list.
+ 2. Instantiate a new datum if type_id_datum isn't already instantiated + in the list, using the type. Obviously, wouldn't work for ID only.
+ 3. Add the datum if necessary using the regular add proc
+ 4. If any of the rest of the args are not null (see: multiplicative slowdown), modify the datum
+ 5. Update if necessary
+*/
+/mob/proc/add_or_update_variable_movespeed_modifier(datum/movespeed_modifier/type_id_datum, update = TRUE, multiplicative_slowdown)
+ var/modified = FALSE
+ var/inject = FALSE
+ var/datum/movespeed_modifier/final
+ if(istext(type_id_datum))
+ final = LAZYACCESS(movespeed_modification, type_id_datum)
+ if(!final)
+ CRASH("Couldn't find existing modification when provided a text ID.")
+ else if(ispath(type_id_datum))
+ if(!initial(type_id_datum.variable))
+ CRASH("Not a variable modifier")
+ final = LAZYACCESS(movespeed_modification, initial(type_id_datum.id) || "[type_id_datum]")
+ if(!final)
+ final = new type_id_datum
+ inject = TRUE
+ modified = TRUE
+ else
+ if(!initial(type_id_datum.variable))
+ CRASH("Not a variable modifier")
+ final = type_id_datum
+ if(!LAZYACCESS(movespeed_modification, final.id))
+ inject = TRUE
+ modified = TRUE
+ if(!isnull(multiplicative_slowdown))
+ final.multiplicative_slowdown = multiplicative_slowdown
+ modified = TRUE
+ if(inject)
+ add_movespeed_modifier(final, FALSE)
+ if(update && modified)
+ update_movespeed(TRUE)
+ return final
+
+/// Handles the special case of editing the movement var
+/mob/vv_edit_var(var_name, var_value)
+ var/slowdown_edit = (var_name == NAMEOF(src, cached_multiplicative_slowdown))
+ var/diff
+ if(slowdown_edit && isnum(cached_multiplicative_slowdown) && isnum(var_value))
+ remove_movespeed_modifier(/datum/movespeed_modifier/admin_varedit)
+ diff = var_value - cached_multiplicative_slowdown
+ . = ..()
+ if(. && slowdown_edit && isnum(diff))
+ add_or_update_variable_movespeed_modifier(/datum/movespeed_modifier/admin_varedit, multiplicative_slowdown = diff)
+
+///Is there a movespeed modifier for this mob
+/mob/proc/has_movespeed_modifier(datum/movespeed_modifier/datum_type_id)
+ var/key
+ if(ispath(datum_type_id))
+ key = initial(datum_type_id.id) || "[datum_type_id]"
+ else if(istext(datum_type_id))
+ key = datum_type_id
+ else
+ key = datum_type_id.id
+ return LAZYACCESS(movespeed_modification, key)
+
+/// Set or update the global movespeed config on a mob
+/mob/proc/update_config_movespeed()
+ add_or_update_variable_movespeed_modifier(/datum/movespeed_modifier/mob_config_speedmod, multiplicative_slowdown = get_config_multiplicative_speed())
+
+/// Get the global config movespeed of a mob by type
+/mob/proc/get_config_multiplicative_speed()
+ if(!islist(GLOB.mob_config_movespeed_type_lookup) || !GLOB.mob_config_movespeed_type_lookup[type])
+ return 0
+ else
+ return GLOB.mob_config_movespeed_type_lookup[type]
+
+/// Go through the list of movespeed modifiers and calculate a final movespeed. ANY ADD/REMOVE DONE IN UPDATE_MOVESPEED MUST HAVE THE UPDATE ARGUMENT SET AS FALSE!
+/mob/proc/update_movespeed()
+ . = 0
+ var/list/conflict_tracker = list()
+ for(var/key in get_movespeed_modifiers())
+ var/datum/movespeed_modifier/M = movespeed_modification[key]
+ if(!(M.movetypes & movement_type)) // We don't affect any of these move types, skip
+ continue
+ if(M.blacklisted_movetypes & movement_type) // There's a movetype here that disables this modifier, skip
+ continue
+ var/conflict = M.conflicts_with
+ var/amt = M.multiplicative_slowdown
+ if(conflict)
+ // Conflicting modifiers prioritize the larger slowdown or the larger speedup
+ // We purposefuly don't handle mixing speedups and slowdowns on the same id
+ if(abs(conflict_tracker[conflict]) < abs(amt))
+ conflict_tracker[conflict] = amt
+ else
+ continue
+ . += amt
+ cached_multiplicative_slowdown = .
+
+/// Get the move speed modifiers list of the mob
+/mob/proc/get_movespeed_modifiers()
+ . = LAZYCOPY(movespeed_modification)
+ for(var/id in movespeed_mod_immunities)
+ . -= id
+
+/// Calculate the total slowdown of all movespeed modifiers
+/mob/proc/total_multiplicative_slowdown()
+ . = 0
+ for(var/id in get_movespeed_modifiers())
+ var/datum/movespeed_modifier/M = movespeed_modification[id]
+ . += M.multiplicative_slowdown
+
+/// Checks if a move speed modifier is valid and not missing any data
+/proc/movespeed_data_null_check(datum/movespeed_modifier/M) //Determines if a data list is not meaningful and should be discarded.
+ . = TRUE
+ if(M.multiplicative_slowdown)
+ . = FALSE
diff --git a/code/modules/movespeed/modifiers/components.dm b/code/modules/movespeed/modifiers/components.dm
new file mode 100644
index 0000000000..436b85e2e1
--- /dev/null
+++ b/code/modules/movespeed/modifiers/components.dm
@@ -0,0 +1,21 @@
+/datum/movespeed_modifier/shrink_ray
+ movetypes = GROUND
+ multiplicative_slowdown = 4
+ flags = IGNORE_NOSLOW
+
+/datum/movespeed_modifier/snail_crawl
+ multiplicative_slowdown = -7
+ movetypes = GROUND
+
+/datum/movespeed_modifier/sanity
+ id = MOVESPEED_ID_SANITY
+ blacklisted_movetypes = FLYING
+
+/datum/movespeed_modifier/sanity/insane
+ multiplicative_slowdown = 1.5
+
+/datum/movespeed_modifier/sanity/crazy
+ multiplicative_slowdown = 1
+
+/datum/movespeed_modifier/sanity/disturbed
+ multiplicative_slowdown = 0.5
diff --git a/code/modules/movespeed/modifiers/innate.dm b/code/modules/movespeed/modifiers/innate.dm
new file mode 100644
index 0000000000..a0357ddf0f
--- /dev/null
+++ b/code/modules/movespeed/modifiers/innate.dm
@@ -0,0 +1,20 @@
+/datum/movespeed_modifier/strained_muscles
+ multiplicative_slowdown = -1
+ blacklisted_movetypes = (FLYING|FLOATING)
+
+/datum/movespeed_modifier/pai_spacewalk
+ multiplicative_slowdown = 2
+ flags = IGNORE_NOSLOW
+
+/datum/movespeed_modifier/species
+ movetypes = ~FLYING
+ variable = TRUE
+
+/datum/movespeed_modifier/dna_vault_speedup
+ blacklisted_movetypes = (FLYING|FLOATING)
+ multiplicative_slowdown = -1
+
+/datum/movespeed_modifier/small_stride
+ blacklisted_movetypes = (FLOATING|CRAWLING)
+ variable = TRUE
+ flags = IGNORE_NOSLOW
diff --git a/code/modules/movespeed/modifiers/items.dm b/code/modules/movespeed/modifiers/items.dm
new file mode 100644
index 0000000000..94dc2a1553
--- /dev/null
+++ b/code/modules/movespeed/modifiers/items.dm
@@ -0,0 +1,12 @@
+/datum/movespeed_modifier/jetpack
+ conflicts_with = MOVE_CONFLICT_JETPACK
+ movetypes = FLOATING
+
+/datum/movespeed_modifier/jetpack/cybernetic
+ multiplicative_slowdown = -0.5
+
+/datum/movespeed_modifier/jetpack/fullspeed
+ multiplicative_slowdown = -2
+
+/datum/movespeed_modifier/die_of_fate
+ multiplicative_slowdown = 1
diff --git a/code/modules/movespeed/modifiers/misc.dm b/code/modules/movespeed/modifiers/misc.dm
new file mode 100644
index 0000000000..55c1aef527
--- /dev/null
+++ b/code/modules/movespeed/modifiers/misc.dm
@@ -0,0 +1,6 @@
+/datum/movespeed_modifier/admin_varedit
+ variable = TRUE
+
+/datum/movespeed_modifier/yellow_orb
+ multiplicative_slowdown = -2
+ blacklisted_movetypes = (FLYING|FLOATING)
diff --git a/code/modules/movespeed/modifiers/mobs.dm b/code/modules/movespeed/modifiers/mobs.dm
new file mode 100644
index 0000000000..aa60966591
--- /dev/null
+++ b/code/modules/movespeed/modifiers/mobs.dm
@@ -0,0 +1,120 @@
+/datum/movespeed_modifier/obesity
+ multiplicative_slowdown = 1.5
+
+/datum/movespeed_modifier/monkey_reagent_speedmod
+ blacklisted_movetypes = FLOATING
+ variable = TRUE
+
+/datum/movespeed_modifier/monkey_health_speedmod
+ blacklisted_movetypes = FLOATING
+ variable = TRUE
+
+/datum/movespeed_modifier/monkey_temperature_speedmod
+ blacklisted_movetypes = FLOATING
+ variable = TRUE
+
+/datum/movespeed_modifier/hunger
+ variable = TRUE
+
+/datum/movespeed_modifier/slaughter
+ multiplicative_slowdown = -1
+
+/datum/movespeed_modifier/damage_slowdown
+ blacklisted_movetypes = FLOATING|FLYING
+ variable = TRUE
+
+/datum/movespeed_modifier/damage_slowdown_flying
+ movetypes = FLOATING
+ variable = TRUE
+
+/datum/movespeed_modifier/equipment_speedmod
+ variable = TRUE
+ blacklisted_movetypes = FLOATING
+
+/datum/movespeed_modifier/grab_slowdown
+ id = MOVESPEED_ID_MOB_GRAB_STATE
+ blacklisted_movetypes = FLOATING
+
+/datum/movespeed_modifier/grab_slowdown/aggressive
+ multiplicative_slowdown = 3
+
+/datum/movespeed_modifier/grab_slowdown/neck
+ multiplicative_slowdown = 6
+
+/datum/movespeed_modifier/grab_slowdown/kill
+ multiplicative_slowdown = 9
+
+/datum/movespeed_modifier/slime_reagentmod
+ variable = TRUE
+
+/datum/movespeed_modifier/slime_healthmod
+ variable = TRUE
+
+/datum/movespeed_modifier/config_walk_run
+ multiplicative_slowdown = 1
+ id = MOVESPEED_ID_MOB_WALK_RUN
+ flags = IGNORE_NOSLOW
+
+/datum/movespeed_modifier/config_walk_run/proc/sync()
+
+/datum/movespeed_modifier/config_walk_run/walk/sync()
+ var/mod = CONFIG_GET(number/movedelay/walk_delay)
+ multiplicative_slowdown = isnum(mod)? mod : initial(multiplicative_slowdown)
+
+/datum/movespeed_modifier/config_walk_run/run/sync()
+ var/mod = CONFIG_GET(number/movedelay/run_delay)
+ multiplicative_slowdown = isnum(mod)? mod : initial(multiplicative_slowdown)
+
+/datum/movespeed_modifier/turf_slowdown
+ movetypes = GROUND
+ blacklisted_movetypes = (FLYING|FLOATING)
+ variable = TRUE
+
+/datum/movespeed_modifier/bulky_drag
+ variable = TRUE
+
+/datum/movespeed_modifier/cold
+ blacklisted_movetypes = FLOATING
+ variable = TRUE
+
+/datum/movespeed_modifier/shove
+ multiplicative_slowdown = SHOVE_SLOWDOWN_STRENGTH
+
+/datum/movespeed_modifier/human_carry
+ variable = TRUE
+
+/datum/movespeed_modifier/limbless
+ variable = TRUE
+ movetypes = GROUND
+ flags = IGNORE_NOSLOW
+
+/datum/movespeed_modifier/simplemob_varspeed
+ variable = TRUE
+ flags = IGNORE_NOSLOW
+
+/datum/movespeed_modifier/tarantula_web
+ multiplicative_slowdown = 3
+
+/datum/movespeed_modifier/gravity
+ blacklisted_movetypes = FLOATING
+ variable = TRUE
+ flags = IGNORE_NOSLOW
+
+/datum/movespeed_modifier/carbon_softcrit
+ multiplicative_slowdown = SOFTCRIT_ADD_SLOWDOWN
+
+/datum/movespeed_modifier/slime_tempmod
+ variable = TRUE
+
+/datum/movespeed_modifier/carbon_crawling
+ multiplicative_slowdown = CRAWLING_ADD_SLOWDOWN
+ movetypes = CRAWLING
+ flags = IGNORE_NOSLOW
+
+/datum/movespeed_modifier/mob_config_speedmod
+ variable = TRUE
+ flags = IGNORE_NOSLOW
+
+/datum/movespeed_modifier/liver_cirrhosis
+ blacklisted_movetypes = FLOATING
+ variable = TRUE
diff --git a/code/modules/movespeed/modifiers/reagents.dm b/code/modules/movespeed/modifiers/reagents.dm
new file mode 100644
index 0000000000..b6c2458670
--- /dev/null
+++ b/code/modules/movespeed/modifiers/reagents.dm
@@ -0,0 +1,14 @@
+/datum/movespeed_modifier/reagent
+ blacklisted_movetypes = (FLYING|FLOATING)
+
+/datum/movespeed_modifier/reagent/stimulants
+ multiplicative_slowdown = -0.5
+
+/datum/movespeed_modifier/reagent/changelinghaste
+ multiplicative_slowdown = -2
+
+/datum/movespeed_modifier/reagent/skooma
+ multiplicative_slowdown = -1
+
+/datum/movespeed_modifier/reagent/nitryl
+ multiplicative_slowdown = -1
diff --git a/code/modules/movespeed/modifiers/status_effects.dm b/code/modules/movespeed/modifiers/status_effects.dm
new file mode 100644
index 0000000000..4c710cb483
--- /dev/null
+++ b/code/modules/movespeed/modifiers/status_effects.dm
@@ -0,0 +1,44 @@
+/datum/movespeed_modifier/status_effect/bloodchill
+ multiplicative_slowdown = 3
+
+/datum/movespeed_modifier/status_effect/bonechill
+ multiplicative_slowdown = 3
+
+/datum/movespeed_modifier/status_effect/tarfoot
+ multiplicative_slowdown = 0.5
+ blacklisted_movetypes = (FLYING|FLOATING)
+
+/datum/movespeed_modifier/status_effect/sepia
+ variable = TRUE
+ blacklisted_movetypes = (FLYING|FLOATING)
+
+/datum/movespeed_modifier/status_effect/mesmerize
+ blacklisted_movetypes = CRAWLING
+ multiplicative_slowdown = 5
+ priority = 64
+
+/datum/movespeed_modifier/status_effect/tased
+ multiplicative_slowdown = 1.5
+ priority = 50
+
+/datum/movespeed_modifier/status_effect/tased/no_combat_mode
+ multiplicative_slowdown = 8
+ priority = 100
+
+/datum/movespeed_modifier/status_effect/electrostaff
+ multiplicative_slowdown = 1
+ movetypes = GROUND
+
+//no comment.
+/datum/movespeed_modifier/status_effect/breast_hypertrophy
+ blacklisted_movetypes = FLOATING
+ variable = TRUE
+
+//this shouldn't even exist.
+/datum/movespeed_modifier/status_effect/penis_hypertrophy
+ blacklisted_movetypes = FLOATING
+ variable = TRUE
+
+/datum/movespeed_modifier/status_effect/mkultra
+ multiplicative_slowdown = -2
+ blacklisted_movetypes= FLYING|FLOATING
diff --git a/code/modules/photography/camera/camera.dm b/code/modules/photography/camera/camera.dm
index b7b7bc36b7..f039dc32b2 100644
--- a/code/modules/photography/camera/camera.dm
+++ b/code/modules/photography/camera/camera.dm
@@ -53,8 +53,8 @@
return
var/desired_x = input(user, "How high do you want the camera to shoot, between [picture_size_x_min] and [picture_size_x_max]?", "Zoom", picture_size_x) as num
var/desired_y = input(user, "How wide do you want the camera to shoot, between [picture_size_y_min] and [picture_size_y_max]?", "Zoom", picture_size_y) as num
- picture_size_x = min(CLAMP(desired_x, picture_size_x_min, picture_size_x_max), CAMERA_PICTURE_SIZE_HARD_LIMIT)
- picture_size_y = min(CLAMP(desired_y, picture_size_y_min, picture_size_y_max), CAMERA_PICTURE_SIZE_HARD_LIMIT)
+ picture_size_x = min(clamp(desired_x, picture_size_x_min, picture_size_x_max), CAMERA_PICTURE_SIZE_HARD_LIMIT)
+ picture_size_y = min(clamp(desired_y, picture_size_y_min, picture_size_y_max), CAMERA_PICTURE_SIZE_HARD_LIMIT)
return TRUE
/obj/item/camera/attack(mob/living/carbon/human/M, mob/user)
@@ -155,8 +155,8 @@
if(!isturf(target_turf))
blending = FALSE
return FALSE
- size_x = CLAMP(size_x, 0, CAMERA_PICTURE_SIZE_HARD_LIMIT)
- size_y = CLAMP(size_y, 0, CAMERA_PICTURE_SIZE_HARD_LIMIT)
+ size_x = clamp(size_x, 0, CAMERA_PICTURE_SIZE_HARD_LIMIT)
+ size_y = clamp(size_y, 0, CAMERA_PICTURE_SIZE_HARD_LIMIT)
var/list/desc = list("This is a photo of an area of [size_x+1] meters by [size_y+1] meters.")
var/ai_user = isAI(user)
var/list/seen
diff --git a/code/modules/photography/camera/camera_image_capturing.dm b/code/modules/photography/camera/camera_image_capturing.dm
index f25d80c050..5bd9c108d1 100644
--- a/code/modules/photography/camera/camera_image_capturing.dm
+++ b/code/modules/photography/camera/camera_image_capturing.dm
@@ -4,7 +4,7 @@
if(istype(A))
appearance = A.appearance
dir = A.dir
- if(ismovableatom(A))
+ if(ismovable(A))
var/atom/movable/AM = A
step_x = AM.step_x
step_y = AM.step_y
@@ -68,7 +68,7 @@
for(var/atom/A in sorted)
var/xo = (A.x - center.x) * world.icon_size + A.pixel_x + xcomp
var/yo = (A.y - center.y) * world.icon_size + A.pixel_y + ycomp
- if(ismovableatom(A))
+ if(ismovable(A))
var/atom/movable/AM = A
xo += AM.step_x
yo += AM.step_y
diff --git a/code/modules/power/apc.dm b/code/modules/power/apc.dm
index 1b23b1bb5d..7eabeafcb1 100644
--- a/code/modules/power/apc.dm
+++ b/code/modules/power/apc.dm
@@ -208,7 +208,7 @@
GLOB.apcs_list -= src
if(malfai && operating)
- malfai.malf_picker.processing_time = CLAMP(malfai.malf_picker.processing_time - 10,0,1000)
+ malfai.malf_picker.processing_time = clamp(malfai.malf_picker.processing_time - 10,0,1000)
area.power_light = FALSE
area.power_equip = FALSE
area.power_environ = FALSE
@@ -1350,7 +1350,7 @@
lighting = autoset(lighting, 0)
environ = autoset(environ, 0)
area.poweralert(0, src)
-
+
else if(cell_percent < 15 && longtermpower < 0) // <15%, turn off lighting & equipment
equipment = autoset(equipment, 2)
lighting = autoset(lighting, 2)
@@ -1447,7 +1447,7 @@
/obj/machinery/power/apc/proc/set_broken()
if(malfai && operating)
- malfai.malf_picker.processing_time = CLAMP(malfai.malf_picker.processing_time - 10,0,1000)
+ malfai.malf_picker.processing_time = clamp(malfai.malf_picker.processing_time - 10,0,1000)
stat |= BROKEN
operating = FALSE
if(occupier)
diff --git a/code/modules/power/cable.dm b/code/modules/power/cable.dm
index 49848824e4..eecc1394de 100644
--- a/code/modules/power/cable.dm
+++ b/code/modules/power/cable.dm
@@ -217,7 +217,7 @@ By design, d1 is the smallest direction and d2 is the highest
/obj/structure/cable/proc/surplus()
if(powernet)
- return CLAMP(powernet.avail-powernet.load, 0, powernet.avail)
+ return clamp(powernet.avail-powernet.load, 0, powernet.avail)
else
return 0
@@ -233,7 +233,7 @@ By design, d1 is the smallest direction and d2 is the highest
/obj/structure/cable/proc/delayed_surplus()
if(powernet)
- return CLAMP(powernet.newavail - powernet.delayedload, 0, powernet.newavail)
+ return clamp(powernet.newavail - powernet.delayedload, 0, powernet.newavail)
else
return 0
@@ -533,7 +533,7 @@ By design, d1 is the smallest direction and d2 is the highest
if(affecting && affecting.status == BODYPART_ROBOTIC)
if(user == H)
user.visible_message("[user] starts to fix some of the wires in [H]'s [affecting.name].", "You start fixing some of the wires in [H]'s [affecting.name].")
- if(!do_after(user, H, 50))
+ if(!do_mob(user, H, 50))
return
if(item_heal_robotic(H, user, 0, 15))
use(1)
@@ -556,17 +556,16 @@ By design, d1 is the smallest direction and d2 is the highest
new_cable.update_icon()
/obj/item/stack/cable_coil/attack_self(mob/user)
- if(!use(15))
- to_chat(user, "You dont have enough cable coil to make restraints out of them")
+ if(amount < 15)
+ to_chat(user, "You don't have enough cable coil to make restraints out of them")
return
to_chat(user, "You start making some cable restraints.")
- if(!do_after(user, 30, TRUE, user, TRUE))
- to_chat(user, "You fail to make cable restraints, you need to stand still while doing so.")
- give(15)
+ if(!do_after(user, 30, TRUE, user, TRUE) || !use(15))
+ to_chat(user, "You fail to make cable restraints, you need to be standing still to do it")
return
var/obj/item/restraints/handcuffs/cable/result = new(get_turf(user))
user.put_in_hands(result)
- result.color = color
+ result.color = color
to_chat(user, "You make some restraints out of cable")
//add cables to the stack
@@ -849,4 +848,4 @@ By design, d1 is the smallest direction and d2 is the highest
. = ..()
var/list/cable_colors = GLOB.cable_colors
color = pick(cable_colors)
-
+
diff --git a/code/modules/power/cell.dm b/code/modules/power/cell.dm
index 93fe7e8fa6..cc321fdb4d 100644
--- a/code/modules/power/cell.dm
+++ b/code/modules/power/cell.dm
@@ -157,7 +157,7 @@
/obj/item/stock_parts/cell/proc/get_electrocute_damage()
if(charge >= 1000)
- return CLAMP(round(charge/10000), 10, 90) + rand(-5,5)
+ return clamp(round(charge/10000), 10, 90) + rand(-5,5)
else
return 0
@@ -334,7 +334,7 @@
. = ..()
if(. & EMP_PROTECT_SELF)
return
- charge = CLAMP((charge-(10000/severity)),0,maxcharge)
+ charge = clamp((charge-(10000/severity)),0,maxcharge)
/obj/item/stock_parts/cell/emergency_light
name = "miniature power cell"
diff --git a/code/modules/power/lighting.dm b/code/modules/power/lighting.dm
index 02ff4127eb..7ad9f3a6ce 100644
--- a/code/modules/power/lighting.dm
+++ b/code/modules/power/lighting.dm
@@ -314,7 +314,7 @@
. = ..()
SSvis_overlays.remove_vis_overlay(src, managed_vis_overlays)
if(on && status == LIGHT_OK)
- SSvis_overlays.add_vis_overlay(src, overlayicon, base_state, EMISSIVE_LAYER, EMISSIVE_PLANE, dir, CLAMP(light_power*250, 30, 200))
+ SSvis_overlays.add_vis_overlay(src, overlayicon, base_state, EMISSIVE_LAYER, EMISSIVE_PLANE, dir, clamp(light_power*250, 30, 200))
// update the icon_state and luminosity of the light depending on its state
diff --git a/code/modules/power/power.dm b/code/modules/power/power.dm
index fba526edbd..4cec49945a 100644
--- a/code/modules/power/power.dm
+++ b/code/modules/power/power.dm
@@ -42,7 +42,7 @@
/obj/machinery/power/proc/surplus()
if(powernet)
- return CLAMP(powernet.avail-powernet.load, 0, powernet.avail)
+ return clamp(powernet.avail-powernet.load, 0, powernet.avail)
else
return 0
@@ -58,7 +58,7 @@
/obj/machinery/power/proc/delayed_surplus()
if(powernet)
- return CLAMP(powernet.newavail - powernet.delayedload, 0, powernet.newavail)
+ return clamp(powernet.newavail - powernet.delayedload, 0, powernet.newavail)
else
return 0
diff --git a/code/modules/power/powernet.dm b/code/modules/power/powernet.dm
index 3b70383bee..65d5202ff4 100644
--- a/code/modules/power/powernet.dm
+++ b/code/modules/power/powernet.dm
@@ -96,6 +96,6 @@
/datum/powernet/proc/get_electrocute_damage()
if(avail >= 1000)
- return CLAMP(round(avail/10000), 10, 90) + rand(-5,5)
+ return clamp(round(avail/10000), 10, 90) + rand(-5,5)
else
return 0
\ No newline at end of file
diff --git a/code/modules/power/singularity/narsie.dm b/code/modules/power/singularity/narsie.dm
index c471047682..ed3a098dae 100644
--- a/code/modules/power/singularity/narsie.dm
+++ b/code/modules/power/singularity/narsie.dm
@@ -201,7 +201,7 @@
// if(defer_powernet_rebuild != 2)
// defer_powernet_rebuild = 1
for(var/atom/X in urange(consume_range,src,1))
- if(isturf(X) || ismovableatom(X))
+ if(isturf(X) || ismovable(X))
consume(X)
// if(defer_powernet_rebuild != 2)
// defer_powernet_rebuild = 0
diff --git a/code/modules/power/smes.dm b/code/modules/power/smes.dm
index 47de07cd71..41ed28f0a5 100644
--- a/code/modules/power/smes.dm
+++ b/code/modules/power/smes.dm
@@ -220,7 +220,7 @@
. += "smes-og[clevel]"
/obj/machinery/power/smes/proc/chargedisplay()
- return CLAMP(round(5.5*charge/capacity),0,5)
+ return clamp(round(5.5*charge/capacity),0,5)
/obj/machinery/power/smes/process()
if(stat & BROKEN)
@@ -372,7 +372,7 @@
target = text2num(target)
. = TRUE
if(.)
- input_level = CLAMP(target, 0, input_level_max)
+ input_level = clamp(target, 0, input_level_max)
log_smes(usr)
if("output")
var/target = params["target"]
@@ -394,7 +394,7 @@
target = text2num(target)
. = TRUE
if(.)
- output_level = CLAMP(target, 0, output_level_max)
+ output_level = clamp(target, 0, output_level_max)
log_smes(usr)
/obj/machinery/power/smes/proc/log_smes(mob/user)
diff --git a/code/modules/power/solar.dm b/code/modules/power/solar.dm
index 73ea3ccd59..89452affcb 100644
--- a/code/modules/power/solar.dm
+++ b/code/modules/power/solar.dm
@@ -28,10 +28,8 @@
/obj/machinery/power/solar/Initialize(mapload, obj/item/solar_assembly/S)
. = ..()
panel = new()
-#if DM_VERSION >= 513
panel.vis_flags = VIS_INHERIT_ID|VIS_INHERIT_ICON|VIS_INHERIT_PLANE
vis_contents += panel
-#endif
panel.icon = icon
panel.icon_state = "solar_panel"
panel.layer = FLY_LAYER
@@ -170,7 +168,7 @@
else
//dot product of sun and panel -- Lambert's Cosine Law
. = cos(azimuth_current - sun_azimuth)
- . = CLAMP(round(., 0.01), 0, 1)
+ . = clamp(round(., 0.01), 0, 1)
sunfrac = .
/obj/machinery/power/solar/process()
@@ -385,7 +383,7 @@
if(adjust)
value = azimuth_rate + adjust
if(value != null)
- azimuth_rate = round(CLAMP(value, -2 * SSsun.base_rotation, 2 * SSsun.base_rotation), 0.01)
+ azimuth_rate = round(clamp(value, -2 * SSsun.base_rotation, 2 * SSsun.base_rotation), 0.01)
return TRUE
return FALSE
if(action == "tracking")
@@ -464,7 +462,7 @@
///Rotates the panel to the passed angles
/obj/machinery/power/solar_control/proc/set_panels(azimuth)
- azimuth = CLAMP(round(azimuth, 0.01), -360, 719.99)
+ azimuth = clamp(round(azimuth, 0.01), -360, 719.99)
if(azimuth >= 360)
azimuth -= 360
if(azimuth < 0)
diff --git a/code/modules/power/supermatter/supermatter.dm b/code/modules/power/supermatter/supermatter.dm
index f91dc43990..92d97365b3 100644
--- a/code/modules/power/supermatter/supermatter.dm
+++ b/code/modules/power/supermatter/supermatter.dm
@@ -346,7 +346,7 @@ GLOBAL_DATUM(main_supermatter_engine, /obj/machinery/power/supermatter_crystal)
else
if(takes_damage)
//causing damage
- damage = max(damage + (max(CLAMP(removed.total_moles() / 200, 0.5, 1) * removed.temperature - ((T0C + HEAT_PENALTY_THRESHOLD)*dynamic_heat_resistance), 0) * mole_heat_penalty / 150 ) * DAMAGE_INCREASE_MULTIPLIER, 0)
+ damage = max(damage + (max(clamp(removed.total_moles() / 200, 0.5, 1) * removed.temperature - ((T0C + HEAT_PENALTY_THRESHOLD)*dynamic_heat_resistance), 0) * mole_heat_penalty / 150 ) * DAMAGE_INCREASE_MULTIPLIER, 0)
damage = max(damage + (max(power - POWER_PENALTY_THRESHOLD, 0)/500) * DAMAGE_INCREASE_MULTIPLIER, 0)
damage = max(damage + (max(combined_gas - MOLE_PENALTY_THRESHOLD, 0)/80) * DAMAGE_INCREASE_MULTIPLIER, 0)
@@ -389,10 +389,10 @@ GLOBAL_DATUM(main_supermatter_engine, /obj/machinery/power/supermatter_crystal)
mole_heat_penalty = max(combined_gas / MOLE_HEAT_PENALTY, 0.25)
if (combined_gas > POWERLOSS_INHIBITION_MOLE_THRESHOLD && co2comp > POWERLOSS_INHIBITION_GAS_THRESHOLD)
- powerloss_dynamic_scaling = CLAMP(powerloss_dynamic_scaling + CLAMP(co2comp - powerloss_dynamic_scaling, -0.02, 0.02), 0, 1)
+ powerloss_dynamic_scaling = clamp(powerloss_dynamic_scaling + clamp(co2comp - powerloss_dynamic_scaling, -0.02, 0.02), 0, 1)
else
- powerloss_dynamic_scaling = CLAMP(powerloss_dynamic_scaling - 0.05,0, 1)
- powerloss_inhibitor = CLAMP(1-(powerloss_dynamic_scaling * CLAMP(combined_gas/POWERLOSS_INHIBITION_MOLE_BOOST_THRESHOLD,1 ,1.5)),0 ,1)
+ powerloss_dynamic_scaling = clamp(powerloss_dynamic_scaling - 0.05,0, 1)
+ powerloss_inhibitor = clamp(1-(powerloss_dynamic_scaling * clamp(combined_gas/POWERLOSS_INHIBITION_MOLE_BOOST_THRESHOLD,1 ,1.5)),0 ,1)
if(matter_power)
var/removed_matter = max(matter_power/MATTER_POWER_CONVERSION, 40)
@@ -442,7 +442,7 @@ GLOBAL_DATUM(main_supermatter_engine, /obj/machinery/power/supermatter_crystal)
if(!istype(l.glasses, /obj/item/clothing/glasses/meson))
var/D = sqrt(1 / max(1, get_dist(l, src)))
l.hallucination += power_calc * config_hallucination_power * D
- l.hallucination = CLAMP(0, 200, l.hallucination)
+ l.hallucination = clamp(0, 200, l.hallucination)
for(var/mob/living/l in range(src, round((power / 100) ** 0.25)))
var/rads = (power / 10) * sqrt( 1 / max(get_dist(l, src),1) )
@@ -452,7 +452,7 @@ GLOBAL_DATUM(main_supermatter_engine, /obj/machinery/power/supermatter_crystal)
if ((100-get_integrity()) < 75)
power = (power_calc * ((100 - (0.15*(100-get_integrity()) - 5)**2) / 100)) + power_calc*0.1
else
- power = power_calc * (((100-get_integrity())^((3*(100-get_integrity()))/1000) + 2*(100-get_integrity()))/100) //new and improved, more linear
+ power = power_calc * (((100-get_integrity())**((3*(100-get_integrity()))/1000) + 2*(100-get_integrity()))/100) //new and improved, more linear
//power = power_calc * ((((100-get_integrity())**1.3)-(2*(100-get_integrity())))/100)
if(power > POWER_PENALTY_THRESHOLD || damage > damage_penalty_point)
@@ -466,7 +466,7 @@ GLOBAL_DATUM(main_supermatter_engine, /obj/machinery/power/supermatter_crystal)
supermatter_zap(src, 5, min(power*2, 20000))
else if (damage > damage_penalty_point && prob(20))
playsound(src.loc, 'sound/weapons/emitter2.ogg', 100, 1, extrarange = 10)
- supermatter_zap(src, 5, CLAMP(power*2, 4000, 20000))
+ supermatter_zap(src, 5, clamp(power*2, 4000, 20000))
if(prob(15) && power > POWER_PENALTY_THRESHOLD)
supermatter_pull(src, power/750)
@@ -736,7 +736,7 @@ GLOBAL_DATUM(main_supermatter_engine, /obj/machinery/power/supermatter_crystal)
/obj/machinery/power/supermatter_crystal/proc/supermatter_pull(turf/center, pull_range = 10)
playsound(src.loc, 'sound/weapons/marauder.ogg', 100, 1, extrarange = 7)
for(var/atom/P in orange(pull_range,center))
- if(ismovableatom(P))
+ if(ismovable(P))
var/atom/movable/pulled_object = P
if(ishuman(P))
var/mob/living/carbon/human/H = P
diff --git a/code/modules/power/tesla/energy_ball.dm b/code/modules/power/tesla/energy_ball.dm
index 1b08693d1c..e98fe3c88e 100644
--- a/code/modules/power/tesla/energy_ball.dm
+++ b/code/modules/power/tesla/energy_ball.dm
@@ -65,7 +65,7 @@
pixel_x = -32
pixel_y = -32
for (var/ball in orbiting_balls)
- var/range = rand(1, CLAMP(orbiting_balls.len, 3, 7))
+ var/range = rand(1, clamp(orbiting_balls.len, 3, 7))
tesla_zap(ball, range, TESLA_MINI_POWER/7*range)
else
energy = 0 // ensure we dont have miniballs of miniballs
diff --git a/code/modules/projectiles/ammunition/ballistic/pistol.dm b/code/modules/projectiles/ammunition/ballistic/pistol.dm
index 58a5bfb497..461166ab0d 100644
--- a/code/modules/projectiles/ammunition/ballistic/pistol.dm
+++ b/code/modules/projectiles/ammunition/ballistic/pistol.dm
@@ -1,28 +1,28 @@
// 10mm (Stechkin)
/obj/item/ammo_casing/c10mm
- name = ".10mm bullet casing"
+ name = "10mm bullet casing"
desc = "A 10mm bullet casing."
caliber = "10mm"
projectile_type = /obj/item/projectile/bullet/c10mm
/obj/item/ammo_casing/c10mm/ap
- name = ".10mm armor-piercing bullet casing"
+ name = "10mm armor-piercing bullet casing"
desc = "A 10mm armor-piercing bullet casing."
projectile_type = /obj/item/projectile/bullet/c10mm_ap
/obj/item/ammo_casing/c10mm/hp
- name = ".10mm hollow-point bullet casing"
+ name = "10mm hollow-point bullet casing"
desc = "A 10mm hollow-point bullet casing."
projectile_type = /obj/item/projectile/bullet/c10mm_hp
/obj/item/ammo_casing/c10mm/fire
- name = ".10mm incendiary bullet casing"
+ name = "10mm incendiary bullet casing"
desc = "A 10mm incendiary bullet casing."
projectile_type = /obj/item/projectile/bullet/incendiary/c10mm
/obj/item/ammo_casing/c10mm/soporific
- name = ".10mm soporific bullet casing"
+ name = "10mm soporific bullet casing"
desc = "A 10mm soporific bullet casing."
projectile_type = /obj/item/projectile/bullet/c10mm/soporific
diff --git a/code/modules/projectiles/boxes_magazines/_box_magazine.dm b/code/modules/projectiles/boxes_magazines/_box_magazine.dm
index 4f37cf3ba9..594734c86a 100644
--- a/code/modules/projectiles/boxes_magazines/_box_magazine.dm
+++ b/code/modules/projectiles/boxes_magazines/_box_magazine.dm
@@ -112,11 +112,7 @@
update_icon()
/obj/item/ammo_box/update_icon()
- switch(multiple_sprites)
- if(1)
- icon_state = "[initial(icon_state)]-[stored_ammo.len]"
- if(2)
- icon_state = "[initial(icon_state)]-[stored_ammo.len ? "[max_ammo]" : "0"]"
+ . = ..()
desc = "[initial(desc)] There are [stored_ammo.len] shell\s left!"
for (var/material in bullet_cost)
var/material_amount = bullet_cost[material]
@@ -124,6 +120,13 @@
custom_materials[material] = material_amount
set_custom_materials(custom_materials)//make sure we setup the correct properties again
+/obj/item/ammo_box/update_icon_state()
+ switch(multiple_sprites)
+ if(1)
+ icon_state = "[initial(icon_state)]-[stored_ammo.len]"
+ if(2)
+ icon_state = "[initial(icon_state)]-[stored_ammo.len ? "[max_ammo]" : "0"]"
+
//Behavior for magazines
/obj/item/ammo_box/magazine/proc/ammo_count()
return stored_ammo.len
diff --git a/code/modules/projectiles/guns/ballistic/shotgun.dm b/code/modules/projectiles/guns/ballistic/shotgun.dm
index 7fb17ced57..4894a8d8eb 100644
--- a/code/modules/projectiles/guns/ballistic/shotgun.dm
+++ b/code/modules/projectiles/guns/ballistic/shotgun.dm
@@ -41,9 +41,12 @@
to_chat(user, "You're too exhausted for that.")//CIT CHANGE - ditto
return//CIT CHANGE - ditto
pump(user, TRUE)
- recentpump = world.time + 10
- if(istype(user))//CIT CHANGE - makes pumping shotguns cost a lil bit of stamina.
- user.adjustStaminaLossBuffered(2) //CIT CHANGE - DITTO. make this scale inversely to the strength stat when stats/skills are added
+ if(HAS_TRAIT(user, TRAIT_FAST_PUMP))
+ recentpump = world.time + 2
+ else
+ recentpump = world.time + 10
+ if(istype(user))//CIT CHANGE - makes pumping shotguns cost a lil bit of stamina.
+ user.adjustStaminaLossBuffered(2) //CIT CHANGE - DITTO. make this scale inversely to the strength stat when stats/skills are added
return
/obj/item/gun/ballistic/shotgun/blow_up(mob/user)
@@ -90,7 +93,7 @@
fire_delay = 7
mag_type = /obj/item/ammo_box/magazine/internal/shot/riot
sawn_desc = "Come with me if you want to live."
- unique_reskin = list("Tatical" = "riotshotgun",
+ unique_reskin = list("Tactical" = "riotshotgun",
"Wood Stock" = "wood_riotshotgun"
)
@@ -212,7 +215,7 @@
fire_delay = 5
mag_type = /obj/item/ammo_box/magazine/internal/shot/com
w_class = WEIGHT_CLASS_HUGE
- unique_reskin = list("Tatical" = "cshotgun",
+ unique_reskin = list("Tactical" = "cshotgun",
"Slick" = "cshotgun_slick"
)
diff --git a/code/modules/projectiles/guns/energy.dm b/code/modules/projectiles/guns/energy.dm
index e0c84e7047..ff3f127817 100644
--- a/code/modules/projectiles/guns/energy.dm
+++ b/code/modules/projectiles/guns/energy.dm
@@ -232,7 +232,7 @@
..()
if(!automatic_charge_overlays)
return
- var/ratio = can_shoot() ? CEILING(CLAMP(cell.charge / cell.maxcharge, 0, 1) * charge_sections, 1) : 0
+ var/ratio = can_shoot() ? CEILING(clamp(cell.charge / cell.maxcharge, 0, 1) * charge_sections, 1) : 0
// Sets the ratio to 0 if the gun doesn't have enough charge to fire, or if it's power cell is removed.
// TG issues #5361 & #47908
if(ratio == old_ratio && !force_update)
diff --git a/code/modules/projectiles/guns/misc/beam_rifle.dm b/code/modules/projectiles/guns/misc/beam_rifle.dm
index f230dc7fea..f8ddcb5aae 100644
--- a/code/modules/projectiles/guns/misc/beam_rifle.dm
+++ b/code/modules/projectiles/guns/misc/beam_rifle.dm
@@ -318,7 +318,7 @@
AC.sync_stats()
/obj/item/gun/energy/beam_rifle/proc/delay_penalty(amount)
- aiming_time_left = CLAMP(aiming_time_left + amount, 0, aiming_time)
+ aiming_time_left = clamp(aiming_time_left + amount, 0, aiming_time)
/obj/item/ammo_casing/energy/beam_rifle
name = "particle acceleration lens"
@@ -369,11 +369,11 @@
HS_BB.stun = projectile_stun
HS_BB.impact_structure_damage = impact_structure_damage
HS_BB.aoe_mob_damage = aoe_mob_damage
- HS_BB.aoe_mob_range = CLAMP(aoe_mob_range, 0, 15) //Badmin safety lock
+ HS_BB.aoe_mob_range = clamp(aoe_mob_range, 0, 15) //Badmin safety lock
HS_BB.aoe_fire_chance = aoe_fire_chance
HS_BB.aoe_fire_range = aoe_fire_range
HS_BB.aoe_structure_damage = aoe_structure_damage
- HS_BB.aoe_structure_range = CLAMP(aoe_structure_range, 0, 15) //Badmin safety lock
+ HS_BB.aoe_structure_range = clamp(aoe_structure_range, 0, 15) //Badmin safety lock
HS_BB.wall_devastate = wall_devastate
HS_BB.wall_pierce_amount = wall_pierce_amount
HS_BB.structure_pierce_amount = structure_piercing
@@ -465,7 +465,7 @@
else
target.ex_act(EXPLODE_HEAVY)
return TRUE
- if(ismovableatom(target))
+ if(ismovable(target))
var/atom/movable/AM = target
if(AM.density && !AM.CanPass(src, get_turf(target)) && !ismob(AM))
if(structure_pierce < structure_pierce_amount)
diff --git a/code/modules/projectiles/pins.dm b/code/modules/projectiles/pins.dm
index e754a9c070..8a1db49762 100644
--- a/code/modules/projectiles/pins.dm
+++ b/code/modules/projectiles/pins.dm
@@ -241,3 +241,87 @@
to_chat(user, "The pin beeps, refusing to fire.")
return FALSE
return TRUE
+
+/obj/item/firing_pin/security_level
+ name = "security level firing pin"
+ desc = "A sophisticated firing pin that authorizes operation based on its settings and current security level."
+ icon_state = "firing_pin_sec_level"
+ var/min_sec_level = SEC_LEVEL_GREEN
+ var/max_sec_level = SEC_LEVEL_DELTA
+ var/only_lethals = FALSE
+ var/can_toggle = TRUE
+
+/obj/item/firing_pin/security_level/Initialize()
+ . = ..()
+ fail_message = "INVALID SECURITY LEVEL. CURRENT: [uppertext(NUM2SECLEVEL(GLOB.security_level))]. \
+ MIN: [uppertext(NUM2SECLEVEL(min_sec_level))]. MAX: [uppertext(NUM2SECLEVEL(max_sec_level))]. \
+ ONLY LETHALS: [only_lethals ? "YES" : "NO"]."
+ update_icon()
+
+/obj/item/firing_pin/security_level/examine(mob/user)
+ . = ..()
+ var/lethal = only_lethals ? "only lethal " : ""
+ if(min_sec_level != max_sec_level)
+ . += "It's currently set to disallow [lethal]operation when the security level isn't between [NUM2SECLEVEL(min_sec_level)] and [NUM2SECLEVEL(max_sec_level)]."
+ else
+ . += "It's currently set to disallow [lethal]operation when the security level isn't [NUM2SECLEVEL(min_sec_level)]."
+ if(can_toggle)
+ . += "You can use a multitool to modify its settings."
+
+/obj/item/firing_pin/security_level/multitool_act(mob/living/user, obj/item/I)
+ . = TRUE
+ if(!can_toggle || !user.canUseTopic(src, BE_CLOSE))
+ return
+ var/selection = alert(user, "Which setting would you want to modify?", "Firing Pin Settings", "Minimum Level Setting", "Maximum Level Setting", "Lethals Only Toggle")
+ if(QDELETED(src) || QDELETED(user) || !user.canUseTopic(src, BE_CLOSE))
+ return
+ var/static/list/till_designs_pr_isnt_merged = list("green", "blue", "amber", "red", "delta")
+ switch(selection)
+ if("Minimum Level Setting")
+ var/input = input(user, "Input the new minimum level setting.", "Firing Pin Settings", NUM2SECLEVEL(min_sec_level)) as null|anything in till_designs_pr_isnt_merged
+ if(!input)
+ return
+ min_sec_level = till_designs_pr_isnt_merged.Find(input) - 1
+ if(min_sec_level > max_sec_level)
+ max_sec_level = SEC_LEVEL_DELTA
+ if("Maximum Level Setting")
+ var/input = input(user, "Input the new maximum level setting.", "Firing Pin Settings", NUM2SECLEVEL(max_sec_level)) as null|anything in till_designs_pr_isnt_merged
+ if(!input)
+ return
+ max_sec_level = till_designs_pr_isnt_merged.Find(input) - 1
+ if(max_sec_level < max_sec_level)
+ min_sec_level = SEC_LEVEL_GREEN
+ if("Lethals Only Toggle")
+ only_lethals = !only_lethals
+
+ fail_message = "INVALID SECURITY LEVEL. CURRENT: [uppertext(NUM2SECLEVEL(GLOB.security_level))]. \
+ MIN: [uppertext(NUM2SECLEVEL(min_sec_level))]. MAX: [uppertext(NUM2SECLEVEL(max_sec_level))]. \
+ ONLY LETHALS: [only_lethals ? "YES" : "NO"]."
+ update_icon()
+
+/obj/item/firing_pin/security_level/update_overlays()
+ . = ..()
+ var/offset = 0
+ for(var/level in list(min_sec_level, max_sec_level))
+ var/mutable_appearance/overlay = mutable_appearance(icon, "pin_sec_level_overlay")
+ overlay.pixel_x += offset
+ offset += 4
+ switch(level)
+ if(SEC_LEVEL_GREEN)
+ overlay.color = "#b2ff59" //light green
+ if(SEC_LEVEL_BLUE)
+ overlay.color = "#99ccff" //light blue
+ if(SEC_LEVEL_AMBER)
+ overlay.color = "#ffae42" //light yellow/orange
+ if(SEC_LEVEL_RED)
+ overlay.color = "#ff3f34" //light red
+ else
+ overlay.color = "#fe59c2" //neon fuchsia
+ . += overlay
+ var/mutable_appearance/overlay = mutable_appearance(icon, "pin_sec_level_overlay")
+ overlay.pixel_x += offset
+ overlay.color = only_lethals ? "#b2ff59" : "#ff3f34"
+ . += overlay
+
+/obj/item/firing_pin/security_level/pin_auth(mob/living/user)
+ return (only_lethals && !(gun.chambered?.harmful)) || ISINRANGE(GLOB.security_level, min_sec_level, max_sec_level)
diff --git a/code/modules/projectiles/projectile.dm b/code/modules/projectiles/projectile.dm
index 6094a7aa46..b4303dd5a0 100644
--- a/code/modules/projectiles/projectile.dm
+++ b/code/modules/projectiles/projectile.dm
@@ -224,7 +224,7 @@
/obj/item/projectile/proc/vol_by_damage()
if(src.damage)
- return CLAMP((src.damage) * 0.67, 30, 100)// Multiply projectile damage by 0.67, then CLAMP the value between 30 and 100
+ return clamp((src.damage) * 0.67, 30, 100)// Multiply projectile damage by 0.67, then CLAMP the value between 30 and 100
else
return 50 //if the projectile doesn't do damage, play its hitsound at 50% volume
@@ -255,7 +255,7 @@
def_zone = ran_zone(def_zone, max(100-(7*distance), 5) * zone_accuracy_factor) //Lower accurancy/longer range tradeoff. 7 is a balanced number to use.
if(isturf(A) && hitsound_wall)
- var/volume = CLAMP(vol_by_damage() + 20, 0, 100)
+ var/volume = clamp(vol_by_damage() + 20, 0, 100)
if(suppressed)
volume = 5
playsound(loc, hitsound_wall, volume, 1, -1)
@@ -392,7 +392,7 @@
stack_trace("WARNING: Projectile [type] deleted due to being unable to resolve a target after angle was null!")
qdel(src)
return
- var/turf/target = locate(CLAMP(starting + xo, 1, world.maxx), CLAMP(starting + yo, 1, world.maxy), starting.z)
+ var/turf/target = locate(clamp(starting + xo, 1, world.maxx), clamp(starting + yo, 1, world.maxy), starting.z)
setAngle(Get_Angle(src, target))
original_angle = Angle
if(!nondirectional_sprite)
@@ -525,10 +525,10 @@
if(!homing_target)
return FALSE
var/datum/point/PT = RETURN_PRECISE_POINT(homing_target)
- PT.x += CLAMP(homing_offset_x, 1, world.maxx)
- PT.y += CLAMP(homing_offset_y, 1, world.maxy)
+ PT.x += clamp(homing_offset_x, 1, world.maxx)
+ PT.y += clamp(homing_offset_y, 1, world.maxy)
var/angle = closer_angle_difference(Angle, angle_between_points(RETURN_PRECISE_POINT(src), PT))
- setAngle(Angle + CLAMP(angle, -homing_turn_speed, homing_turn_speed))
+ setAngle(Angle + clamp(angle, -homing_turn_speed, homing_turn_speed))
/obj/item/projectile/proc/set_homing_target(atom/A)
if(!A || (!isturf(A) && !isturf(A.loc)))
@@ -622,7 +622,7 @@
var/ox = round(screenviewX/2) - user.client.pixel_x //"origin" x
var/oy = round(screenviewY/2) - user.client.pixel_y //"origin" y
- angle = ATAN2(y - oy, x - ox)
+ angle = arctan(y - oy, x - ox)
return list(angle, p_x, p_y)
/obj/item/projectile/Crossed(atom/movable/AM) //A mob moving on a tile with a projectile is hit by it.
diff --git a/code/modules/projectiles/projectile/bullets/dart_syringe.dm b/code/modules/projectiles/projectile/bullets/dart_syringe.dm
index 06d94414be..25809cc7ca 100644
--- a/code/modules/projectiles/projectile/bullets/dart_syringe.dm
+++ b/code/modules/projectiles/projectile/bullets/dart_syringe.dm
@@ -60,11 +60,11 @@
if(R.overdose_threshold == 0 || emptrig == TRUE) //Is there a possible OD?
M.reagents.add_reagent(R.type, R.volume)
else
- var/transVol = CLAMP(R.volume, 0, (R.overdose_threshold - M.reagents.get_reagent_amount(R.type)) -1)
+ var/transVol = clamp(R.volume, 0, (R.overdose_threshold - M.reagents.get_reagent_amount(R.type)) -1)
M.reagents.add_reagent(R.type, transVol)
else
if(!R.overdose_threshold == 0)
- var/transVol = CLAMP(R.volume, 0, R.overdose_threshold-1)
+ var/transVol = clamp(R.volume, 0, R.overdose_threshold-1)
M.reagents.add_reagent(R.type, transVol)
else
M.reagents.add_reagent(R.type, R.volume)
diff --git a/code/modules/projectiles/projectile/bullets/shotgun.dm b/code/modules/projectiles/projectile/bullets/shotgun.dm
index 4411334883..ff95b65a49 100644
--- a/code/modules/projectiles/projectile/bullets/shotgun.dm
+++ b/code/modules/projectiles/projectile/bullets/shotgun.dm
@@ -51,7 +51,7 @@
/obj/item/projectile/bullet/shotgun_meteorslug/on_hit(atom/target, blocked = FALSE)
. = ..()
- if(ismovableatom(target))
+ if(ismovable(target))
var/atom/movable/M = target
var/atom/throw_target = get_edge_target_turf(M, get_dir(src, get_step_away(M, src)))
M.safe_throw_at(throw_target, 3, 2)
diff --git a/code/modules/projectiles/projectile/special/neurotoxin.dm b/code/modules/projectiles/projectile/special/neurotoxin.dm
index a72d078384..2f6a55a7d0 100644
--- a/code/modules/projectiles/projectile/special/neurotoxin.dm
+++ b/code/modules/projectiles/projectile/special/neurotoxin.dm
@@ -1,8 +1,9 @@
/obj/item/projectile/bullet/neurotoxin
name = "neurotoxin spit"
icon_state = "neurotoxin"
- damage = 5
+ damage = 15
damage_type = TOX
+ var/stagger_duration = 8 SECONDS
/obj/item/projectile/bullet/neurotoxin/on_hit(atom/target, blocked = FALSE)
if(isalien(target))
@@ -10,5 +11,6 @@
nodamage = TRUE
else if(iscarbon(target))
var/mob/living/L = target
- L.DefaultCombatKnockdown(100, TRUE, FALSE, 30, 25)
+ L.KnockToFloor(TRUE)
+ L.Stagger(stagger_duration)
return ..()
diff --git a/code/modules/reagents/chemistry/holder.dm b/code/modules/reagents/chemistry/holder.dm
index 89dd229407..f4c06f39cc 100644
--- a/code/modules/reagents/chemistry/holder.dm
+++ b/code/modules/reagents/chemistry/holder.dm
@@ -728,7 +728,7 @@
return
//Make sure things are limited, but superacids/bases can push forward the reaction
- pH = CLAMP(pH, 0, 14)
+ pH = clamp(pH, 0, 14)
//return said amount to compare for next step.
return (reactedVol)
@@ -849,7 +849,7 @@
/datum/reagents/proc/adjust_thermal_energy(J, min_temp = 2.7, max_temp = 1000)
var/S = specific_heat()
- chem_temp = CLAMP(chem_temp + (J / (S * total_volume)), min_temp, max_temp)
+ chem_temp = clamp(chem_temp + (J / (S * total_volume)), min_temp, max_temp)
if(istype(my_atom, /obj/item/reagent_containers))
var/obj/item/reagent_containers/RC = my_atom
RC.temp_check()
@@ -877,7 +877,7 @@
for (var/datum/reagent/reagentgas in reagent_list)
R.add_reagent(reagentgas, amount/5)
remove_reagent(reagentgas, amount/5)
- s.set_up(R, CLAMP(amount/10, 0, 2), T)
+ s.set_up(R, clamp(amount/10, 0, 2), T)
s.start()
return FALSE
@@ -995,7 +995,7 @@
RC.pH_check()//checks beaker resilience)
//clamp the removal amount to be between current reagent amount
//and zero, to prevent removing more than the holder has stored
- amount = CLAMP(amount, 0, R.volume)
+ amount = clamp(amount, 0, R.volume)
R.volume -= amount
update_total()
if(!safety)//So it does not handle reactions when it need not to
diff --git a/code/modules/reagents/chemistry/machinery/chem_dispenser.dm b/code/modules/reagents/chemistry/machinery/chem_dispenser.dm
index eb2a6ad162..7f57dd1723 100644
--- a/code/modules/reagents/chemistry/machinery/chem_dispenser.dm
+++ b/code/modules/reagents/chemistry/machinery/chem_dispenser.dm
@@ -508,7 +508,6 @@
upgrade_reagents3 = list(
/datum/reagent/drug/mushroomhallucinogen,
/datum/reagent/consumable/nothing,
- /datum/reagent/medicine/cryoxadone,
/datum/reagent/consumable/peachjuice
)
emagged_reagents = list(
@@ -516,7 +515,8 @@
/datum/reagent/consumable/ethanol/changelingsting,
/datum/reagent/consumable/ethanol/whiskey_cola,
/datum/reagent/toxin/mindbreaker,
- /datum/reagent/toxin/staminatoxin
+ /datum/reagent/toxin/staminatoxin,
+ /datum/reagent/medicine/cryoxadone
)
/obj/machinery/chem_dispenser/drinks/fullupgrade //fully ugpraded stock parts, emagged
@@ -722,4 +722,4 @@
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()
\ No newline at end of file
+ RefreshParts()
diff --git a/code/modules/reagents/chemistry/machinery/chem_heater.dm b/code/modules/reagents/chemistry/machinery/chem_heater.dm
index 63e9d724a4..8572d30efe 100644
--- a/code/modules/reagents/chemistry/machinery/chem_heater.dm
+++ b/code/modules/reagents/chemistry/machinery/chem_heater.dm
@@ -151,7 +151,7 @@
target = text2num(target)
. = TRUE
if(.)
- target_temperature = CLAMP(target, 0, 1000)
+ target_temperature = clamp(target, 0, 1000)
if("eject")
on = FALSE
replace_beaker(usr)
diff --git a/code/modules/reagents/chemistry/reagents.dm b/code/modules/reagents/chemistry/reagents.dm
index 5eb5b94de9..a85ac8b085 100644
--- a/code/modules/reagents/chemistry/reagents.dm
+++ b/code/modules/reagents/chemistry/reagents.dm
@@ -51,7 +51,7 @@ GLOBAL_LIST_INIT(name2reagent, build_name2reagent())
var/inverse_chem // What chem is metabolised when purity is below inverse_chem_val, this shouldn't be made, but if it does, well, I guess I'll know about it.
var/metabolizing = FALSE
var/chemical_flags // See fermi/readme.dm REAGENT_DEAD_PROCESS, REAGENT_DONOTSPLIT, REAGENT_ONLYINVERSE, REAGENT_ONMOBMERGE, REAGENT_INVISIBLE, REAGENT_FORCEONNEW, REAGENT_SNEAKYNAME
- var/value = 0 //How much does it sell for in cargo?
+ var/value = REAGENT_VALUE_NONE //How much does it sell for in cargo?
/datum/reagent/Destroy() // This should only be called by the holder, so it's already handled clearing its references
. = ..()
@@ -62,7 +62,7 @@ GLOBAL_LIST_INIT(name2reagent, build_name2reagent())
return 0
if(method == VAPOR) //smoke, foam, spray
if(M.reagents)
- var/modifier = CLAMP((1 - touch_protection), 0, 1)
+ var/modifier = clamp((1 - touch_protection), 0, 1)
var/amount = round(reac_volume*modifier, 0.1)
if(amount >= 0.5)
M.reagents.add_reagent(type, amount)
diff --git a/code/modules/reagents/chemistry/reagents/alcohol_reagents.dm b/code/modules/reagents/chemistry/reagents/alcohol_reagents.dm
index abe5c7de46..464557f617 100644
--- a/code/modules/reagents/chemistry/reagents/alcohol_reagents.dm
+++ b/code/modules/reagents/chemistry/reagents/alcohol_reagents.dm
@@ -14,6 +14,7 @@
taste_description = "alcohol"
var/boozepwr = 65 //Higher numbers equal higher hardness, higher hardness equals more intense alcohol poisoning
pH = 7.33
+ value = REAGENT_VALUE_VERY_COMMON //don't bother tweaking all drinks values, way too many can easily be done roundstart or with an upgraded dispenser.
/*
Boozepwr Chart
@@ -88,7 +89,6 @@ All effects don't start immediately, but rather get worse over time; the rate is
glass_name = "glass of beer"
glass_desc = "A freezing pint of beer."
pH = 4
- value = 0.1
/datum/reagent/consumable/ethanol/beer/light
name = "Light Beer"
@@ -98,7 +98,6 @@ All effects don't start immediately, but rather get worse over time; the rate is
glass_name = "glass of light beer"
glass_desc = "A freezing pint of watery light beer."
pH = 5
- value = 0.3
/datum/reagent/consumable/ethanol/beer/green
name = "Green Beer"
@@ -109,7 +108,6 @@ All effects don't start immediately, but rather get worse over time; the rate is
glass_name = "glass of green beer"
glass_desc = "A freezing pint of green beer. Festive."
pH = 6
- value = 0.3
/datum/reagent/consumable/ethanol/beer/green/on_mob_life(mob/living/carbon/M)
if(M.color != color)
@@ -129,7 +127,6 @@ All effects don't start immediately, but rather get worse over time; the rate is
glass_desc = "DAMN, THIS THING LOOKS ROBUST!"
shot_glass_icon_state = "shotglasscream"
pH = 6
- value = 0.1
/datum/reagent/consumable/ethanol/kahlua/on_mob_life(mob/living/carbon/M)
@@ -152,7 +149,6 @@ All effects don't start immediately, but rather get worse over time; the rate is
glass_desc = "The silky, smokey whiskey goodness inside the glass makes the drink look very classy."
shot_glass_icon_state = "shotglassbrown"
pH = 4.5
- value = 0.1
/datum/reagent/consumable/ethanol/thirteenloko
name = "Thirteen Loko"
@@ -167,7 +163,6 @@ All effects don't start immediately, but rather get worse over time; the rate is
glass_icon_state = "thirteen_loko_glass"
glass_name = "glass of Thirteen Loko"
glass_desc = "This is a glass of Thirteen Loko, it appears to be of the highest quality. The drink, not the glass."
- value = 0.3
/datum/reagent/consumable/ethanol/thirteenloko/on_mob_life(mob/living/carbon/M)
M.drowsyness = max(0,M.drowsyness-7)
@@ -229,7 +224,6 @@ All effects don't start immediately, but rather get worse over time; the rate is
glass_desc = "The glass contain wodka. Xynta."
shot_glass_icon_state = "shotglassclear"
pH = 8.1
- value = 0.1
/datum/reagent/consumable/ethanol/vodka/on_mob_life(mob/living/carbon/M)
M.radiation = max(M.radiation-2,0)
@@ -245,7 +239,6 @@ All effects don't start immediately, but rather get worse over time; the rate is
glass_icon_state = "glass_brown"
glass_name = "glass of bilk"
glass_desc = "A brew of milk and beer. For those alcoholics who fear osteoporosis."
- value = 0.5
/datum/reagent/consumable/ethanol/bilk/on_mob_life(mob/living/carbon/M)
if(M.getBruteLoss() && prob(10))
@@ -264,7 +257,7 @@ All effects don't start immediately, but rather get worse over time; the rate is
glass_name = "Three Mile Island Ice Tea"
glass_desc = "A glass of this is sure to prevent a meltdown."
pH = 3.5
- value = 1
+ value = REAGENT_VALUE_RARE
/datum/reagent/consumable/ethanol/threemileisland/on_mob_life(mob/living/carbon/M)
M.set_drugginess(50)
@@ -280,7 +273,6 @@ All effects don't start immediately, but rather get worse over time; the rate is
glass_name = "glass of gin"
glass_desc = "A crystal clear glass of Griffeater gin."
pH = 6.9
- value = 0.1
/datum/reagent/consumable/ethanol/rum
name = "Rum"
@@ -293,7 +285,6 @@ All effects don't start immediately, but rather get worse over time; the rate is
glass_desc = "Now you want to Pray for a pirate suit, don't you?"
shot_glass_icon_state = "shotglassbrown"
pH = 6.5
- value = 0.1
/datum/reagent/consumable/ethanol/tequila
name = "Tequila"
@@ -306,7 +297,6 @@ All effects don't start immediately, but rather get worse over time; the rate is
glass_desc = "Now all that's missing is the weird colored shades!"
shot_glass_icon_state = "shotglassgold"
pH = 4
- value = 0.1
/datum/reagent/consumable/ethanol/vermouth
name = "Vermouth"
@@ -319,7 +309,6 @@ All effects don't start immediately, but rather get worse over time; the rate is
glass_desc = "You wonder why you're even drinking this straight."
shot_glass_icon_state = "shotglassclear"
pH = 3.25
- value = 0.1
/datum/reagent/consumable/ethanol/wine
name = "Wine"
@@ -332,7 +321,6 @@ All effects don't start immediately, but rather get worse over time; the rate is
glass_desc = "A very classy looking drink."
shot_glass_icon_state = "shotglassred"
pH = 3.45
- value = 0.1
/datum/reagent/consumable/ethanol/lizardwine
name = "Lizard wine"
@@ -342,7 +330,7 @@ All effects don't start immediately, but rather get worse over time; the rate is
quality = DRINK_FANTASTIC
taste_description = "scaley sweetness"
pH = 3
- value = 2
+ value = REAGENT_VALUE_VERY_RARE
/datum/reagent/consumable/ethanol/grappa
name = "Grappa"
@@ -354,7 +342,6 @@ All effects don't start immediately, but rather get worse over time; the rate is
glass_name = "glass of grappa"
glass_desc = "A fine drink originally made to prevent waste by using the leftovers from winemaking."
pH = 3.5
- value = 0.1
/datum/reagent/consumable/ethanol/cognac
name = "Cognac"
@@ -367,7 +354,6 @@ All effects don't start immediately, but rather get worse over time; the rate is
glass_desc = "Damn, you feel like some kind of French aristocrat just by holding this."
shot_glass_icon_state = "shotglassbrown"
pH = 3.5
- value = 0.1
/datum/reagent/consumable/ethanol/absinthe
name = "Absinthe"
@@ -379,7 +365,6 @@ All effects don't start immediately, but rather get worse over time; the rate is
glass_name = "glass of absinthe"
glass_desc = "It's as strong as it smells."
shot_glass_icon_state = "shotglassgreen"
- value = 0.1
/datum/reagent/consumable/ethanol/absinthe/on_mob_life(mob/living/carbon/M)
if(prob(10) && !HAS_TRAIT(M, TRAIT_ALCOHOL_TOLERANCE))
@@ -395,6 +380,7 @@ All effects don't start immediately, but rather get worse over time; the rate is
glass_icon_state = "glass_brown2"
glass_name = "Hooch"
glass_desc = "You've really hit rock bottom now... your liver packed its bags and left last night."
+ value = REAGENT_VALUE_COMMON
/datum/reagent/consumable/ethanol/hooch/on_mob_life(mob/living/carbon/M)
if(M.mind && M.mind.assigned_role == "Assistant")
@@ -412,7 +398,6 @@ All effects don't start immediately, but rather get worse over time; the rate is
glass_name = "glass of ale"
glass_desc = "A freezing pint of delicious Ale."
pH = 4.5
- value = 0.1
/datum/reagent/consumable/ethanol/goldschlager
name = "Goldschlager"
@@ -425,7 +410,7 @@ All effects don't start immediately, but rather get worse over time; the rate is
glass_name = "glass of goldschlager"
glass_desc = "100% proof that teen girls will drink anything with gold in it."
shot_glass_icon_state = "shotglassgold"
- value = 0.5
+ value = REAGENT_VALUE_COMMON
/datum/reagent/consumable/ethanol/patron
name = "Patron"
@@ -439,7 +424,7 @@ All effects don't start immediately, but rather get worse over time; the rate is
glass_desc = "Drinking patron in the bar, with all the subpar ladies."
shot_glass_icon_state = "shotglassclear"
pH = 4.5
- value = 0.1
+ value = REAGENT_VALUE_COMMON
/datum/reagent/consumable/ethanol/gintonic
name = "Gin and Tonic"
@@ -452,7 +437,6 @@ All effects don't start immediately, but rather get worse over time; the rate is
glass_name = "Gin and Tonic"
glass_desc = "A mild but still great cocktail. Drink up, like a true Englishman."
pH = 3
- value = 0.5
/datum/reagent/consumable/ethanol/rum_coke
name = "Rum and Coke"
@@ -465,7 +449,6 @@ All effects don't start immediately, but rather get worse over time; the rate is
glass_name = "Rum and Coke"
glass_desc = "The classic go-to of space-fratboys."
pH = 4
- value = 1
/datum/reagent/consumable/ethanol/cuba_libre
name = "Cuba Libre"
@@ -477,8 +460,6 @@ All effects don't start immediately, but rather get worse over time; the rate is
glass_icon_state = "cubalibreglass"
glass_name = "Cuba Libre"
glass_desc = "A classic mix of rum, cola, and lime. A favorite of revolutionaries everywhere!"
- value = 0.5
-
/datum/reagent/consumable/ethanol/cuba_libre/on_mob_life(mob/living/carbon/M)
if(M.mind && M.mind.has_antag_datum(/datum/antagonist/rev)) //Cuba Libre, the traditional drink of revolutions! Heals revolutionaries.
@@ -499,7 +480,6 @@ All effects don't start immediately, but rather get worse over time; the rate is
glass_icon_state = "whiskeycolaglass"
glass_name = "whiskey cola"
glass_desc = "An innocent-looking mixture of cola and Whiskey. Delicious."
- value = 0.5
/datum/reagent/consumable/ethanol/martini
name = "Classic Martini"
@@ -511,7 +491,6 @@ All effects don't start immediately, but rather get worse over time; the rate is
glass_icon_state = "martiniglass"
glass_name = "Classic Martini"
glass_desc = "Damn, the bartender even stirred it, not shook it."
- value = 1
/datum/reagent/consumable/ethanol/vodkamartini
name = "Vodka Martini"
@@ -523,7 +502,6 @@ All effects don't start immediately, but rather get worse over time; the rate is
glass_icon_state = "martiniglass"
glass_name = "Vodka martini"
glass_desc ="A bastardisation of the classic martini. Still great."
- value = 1
/datum/reagent/consumable/ethanol/white_russian
@@ -536,7 +514,6 @@ All effects don't start immediately, but rather get worse over time; the rate is
glass_icon_state = "whiterussianglass"
glass_name = "White Russian"
glass_desc = "A very nice looking drink. But that's just, like, your opinion, man."
- value = 1
/datum/reagent/consumable/ethanol/screwdrivercocktail
name = "Screwdriver"
@@ -548,7 +525,6 @@ All effects don't start immediately, but rather get worse over time; the rate is
glass_icon_state = "screwdriverglass"
glass_name = "Screwdriver"
glass_desc = "A simple, yet superb mixture of Vodka and orange juice. Just the thing for the tired engineer."
- value = 1
/datum/reagent/consumable/ethanol/screwdrivercocktail/on_mob_life(mob/living/carbon/M)
if(M.mind && (M.mind.assigned_role in list("Station Engineer", "Atmospheric Technician", "Chief Engineer"))) //Engineers lose radiation poisoning at a massive rate.
@@ -564,7 +540,7 @@ All effects don't start immediately, but rather get worse over time; the rate is
glass_icon_state = "booger"
glass_name = "Booger"
glass_desc = "Ewww..."
- value = 0.3
+ value = REAGENT_VALUE_COMMON
/datum/reagent/consumable/ethanol/bloody_mary
name = "Bloody Mary"
@@ -576,7 +552,6 @@ All effects don't start immediately, but rather get worse over time; the rate is
glass_icon_state = "bloodymaryglass"
glass_name = "Bloody Mary"
glass_desc = "Tomato juice, mixed with Vodka and a lil' bit of lime. Tastes like liquid murder."
- value = 1.3
/datum/reagent/consumable/ethanol/bloody_mary/on_mob_life(mob/living/carbon/C)
if(AmBloodsucker(C))
@@ -595,7 +570,6 @@ All effects don't start immediately, but rather get worse over time; the rate is
glass_icon_state = "bravebullglass"
glass_name = "Brave Bull"
glass_desc = "Tequila and Coffee liqueur, brought together in a mouthwatering mixture. Drink up."
- value = 2
var/tough_text
/datum/reagent/consumable/ethanol/brave_bull/on_mob_metabolize(mob/living/M)
@@ -619,7 +593,6 @@ All effects don't start immediately, but rather get worse over time; the rate is
glass_icon_state = "tequilasunriseglass"
glass_name = "tequila Sunrise"
glass_desc = "Oh great, now you feel nostalgic about sunrises back on Terra..."
- value = 2
var/obj/effect/light_holder
/datum/reagent/consumable/ethanol/tequila_sunrise/on_mob_metabolize(mob/living/M)
@@ -649,7 +622,7 @@ All effects don't start immediately, but rather get worse over time; the rate is
glass_name = "Toxins Special"
glass_desc = "Whoah, this thing is on FIRE!"
shot_glass_icon_state = "toxinsspecialglass"
- value = 2
+ value = REAGENT_VALUE_COMMON
/datum/reagent/consumable/ethanol/toxins_special/on_mob_life(var/mob/living/M)
M.adjust_bodytemperature(15 * TEMPERATURE_DAMAGE_COEFFICIENT, 0, BODYTEMP_NORMAL + 20) //310.15 is the normal bodytemp.
@@ -668,7 +641,6 @@ All effects don't start immediately, but rather get worse over time; the rate is
glass_desc = "Heavy, hot and strong. Just like the Iron fist of the LAW."
pH = 2
overdose_threshold = 40
- value = 3
var/datum/brain_trauma/special/beepsky/B
/datum/reagent/consumable/ethanol/beepsky_smash/on_mob_metabolize(mob/living/carbon/M)
@@ -709,7 +681,6 @@ All effects don't start immediately, but rather get worse over time; the rate is
glass_icon_state = "irishcreamglass"
glass_name = "Irish Cream"
glass_desc = "It's cream, mixed with whiskey. What else would you expect from the Irish?"
- value = 1
/datum/reagent/consumable/ethanol/manly_dorf
name = "The Manly Dorf"
@@ -721,14 +692,13 @@ All effects don't start immediately, but rather get worse over time; the rate is
glass_icon_state = "manlydorfglass"
glass_name = "The Manly Dorf"
glass_desc = "A manly concoction made from Ale and Beer. Intended for true men only."
- value = 2
var/dorf_mode
/datum/reagent/consumable/ethanol/manly_dorf/on_mob_metabolize(mob/living/M)
var/real_dorf = isdwarf(M) //_species(H, /datum/species/dwarf)
if(ishuman(M))
var/mob/living/carbon/human/H = M
- if(H.dna.check_mutation(DWARFISM) || HAS_TRAIT(H, TRAIT_ALCOHOL_TOLERANCE) || real_dorf)
+ if(HAS_TRAIT(H, TRAIT_DWARF) || HAS_TRAIT(H, TRAIT_ALCOHOL_TOLERANCE || real_dorf))
to_chat(H, "Now THAT is MANLY!")
if(real_dorf)
boozepwr = 100 // Don't want dwarves to die because of a low booze power
@@ -752,7 +722,6 @@ All effects don't start immediately, but rather get worse over time; the rate is
glass_icon_state = "longislandicedteaglass"
glass_name = "Long Island Iced Tea"
glass_desc = "The liquor cabinet, brought together in a delicious mix. Intended for middle-aged alcoholic women only."
- value = 1
/datum/reagent/consumable/ethanol/moonshine
name = "Moonshine"
@@ -763,7 +732,7 @@ All effects don't start immediately, but rather get worse over time; the rate is
glass_icon_state = "glass_clear"
glass_name = "Moonshine"
glass_desc = "You've really hit rock bottom now... your liver packed its bags and left last night."
- value = 2
+ value = REAGENT_VALUE_COMMON
/datum/reagent/consumable/ethanol/b52
name = "B-52"
@@ -776,7 +745,6 @@ All effects don't start immediately, but rather get worse over time; the rate is
glass_name = "B-52"
glass_desc = "Kahlua, Irish Cream, and cognac. You will get bombed."
shot_glass_icon_state = "b52glass"
- value = 5.2
/datum/reagent/consumable/ethanol/b52/on_mob_metabolize(mob/living/M)
playsound(M, 'sound/effects/explosion_distant.ogg', 100, FALSE)
@@ -791,7 +759,6 @@ All effects don't start immediately, but rather get worse over time; the rate is
glass_icon_state = "irishcoffeeglass"
glass_name = "Irish Coffee"
glass_desc = "Coffee and alcohol. More fun than a Mimosa to drink in the morning."
- value = 2
/datum/reagent/consumable/ethanol/margarita
name = "Margarita"
@@ -803,7 +770,6 @@ All effects don't start immediately, but rather get worse over time; the rate is
glass_icon_state = "margaritaglass"
glass_name = "Margarita"
glass_desc = "On the rocks with salt on the rim. Arriba~!"
- value = 2
/datum/reagent/consumable/ethanol/black_russian
name = "Black Russian"
@@ -815,7 +781,6 @@ All effects don't start immediately, but rather get worse over time; the rate is
glass_icon_state = "blackrussianglass"
glass_name = "Black Russian"
glass_desc = "For the lactose-intolerant. Still as classy as a White Russian."
- value = 3
/datum/reagent/consumable/ethanol/manhattan
@@ -828,7 +793,6 @@ All effects don't start immediately, but rather get worse over time; the rate is
glass_icon_state = "manhattanglass"
glass_name = "Manhattan"
glass_desc = "The Detective's undercover drink of choice. He never could stomach gin..."
- value = 3
/datum/reagent/consumable/ethanol/manhattan_proj
@@ -841,7 +805,7 @@ All effects don't start immediately, but rather get worse over time; the rate is
glass_icon_state = "proj_manhattanglass"
glass_name = "Manhattan Project"
glass_desc = "A scientist's drink of choice, for thinking how to blow up the station."
- value = 6
+ value = REAGENT_VALUE_RARE
/datum/reagent/consumable/ethanol/manhattan_proj/on_mob_life(mob/living/carbon/M)
@@ -858,7 +822,6 @@ All effects don't start immediately, but rather get worse over time; the rate is
glass_icon_state = "whiskeysodaglass2"
glass_name = "whiskey soda"
glass_desc = "Ultimate refreshment."
- value = 1
/datum/reagent/consumable/ethanol/antifreeze
name = "Anti-freeze"
@@ -870,7 +833,6 @@ All effects don't start immediately, but rather get worse over time; the rate is
glass_icon_state = "antifreeze"
glass_name = "Anti-freeze"
glass_desc = "The ultimate refreshment."
- value = 3
/datum/reagent/consumable/ethanol/antifreeze/on_mob_life(mob/living/carbon/M)
M.adjust_bodytemperature(20 * TEMPERATURE_DAMAGE_COEFFICIENT, 0, BODYTEMP_NORMAL + 20) //310.15 is the normal bodytemp.
@@ -886,7 +848,6 @@ All effects don't start immediately, but rather get worse over time; the rate is
glass_icon_state = "b&p"
glass_name = "Barefoot"
glass_desc = "Barefoot and pregnant."
- value = 4
/datum/reagent/consumable/ethanol/barefoot/on_mob_life(mob/living/carbon/M)
if(ishuman(M)) //Barefoot causes the imbiber to quickly regenerate brute trauma if they're not wearing shoes.
@@ -906,7 +867,6 @@ All effects don't start immediately, but rather get worse over time; the rate is
glass_icon_state = "snowwhite"
glass_name = "Snow White"
glass_desc = "A cold refreshment."
- value = 1
/datum/reagent/consumable/ethanol/demonsblood //Prevents the imbiber from being dragged into a pool of blood by a slaughter demon.
name = "Demon's Blood"
@@ -918,7 +878,6 @@ All effects don't start immediately, but rather get worse over time; the rate is
glass_icon_state = "demonsblood"
glass_name = "Demons Blood"
glass_desc = "Just looking at this thing makes the hair at the back of your neck stand up."
- value = 2
/datum/reagent/consumable/ethanol/devilskiss //If eaten by a slaughter demon, the demon will regret it.
name = "Devil's Kiss"
@@ -930,7 +889,6 @@ All effects don't start immediately, but rather get worse over time; the rate is
glass_icon_state = "devilskiss"
glass_name = "Devils Kiss"
glass_desc = "Creepy time!"
- value = 2
/datum/reagent/consumable/ethanol/vodkatonic
name = "Vodka and Tonic"
@@ -942,7 +900,6 @@ All effects don't start immediately, but rather get worse over time; the rate is
glass_icon_state = "vodkatonicglass"
glass_name = "vodka and tonic"
glass_desc = "For when a gin and tonic isn't Russian enough."
- value = 1
/datum/reagent/consumable/ethanol/ginfizz
name = "Gin Fizz"
@@ -954,7 +911,6 @@ All effects don't start immediately, but rather get worse over time; the rate is
glass_icon_state = "ginfizzglass"
glass_name = "gin fizz"
glass_desc = "Refreshingly lemony, deliciously dry."
- value = 1
/datum/reagent/consumable/ethanol/bahama_mama
name = "Bahama Mama"
@@ -966,7 +922,6 @@ All effects don't start immediately, but rather get worse over time; the rate is
glass_icon_state = "bahama_mama"
glass_name = "Bahama Mama"
glass_desc = "A tropical cocktail with a complex blend of flavors."
- value = 2
/datum/reagent/consumable/ethanol/singulo
name = "Singulo"
@@ -978,7 +933,6 @@ All effects don't start immediately, but rather get worse over time; the rate is
glass_icon_state = "singulo"
glass_name = "Singulo"
glass_desc = "A blue-space beverage."
- value = 4
/datum/reagent/consumable/ethanol/sbiten
name = "Sbiten"
@@ -990,7 +944,6 @@ All effects don't start immediately, but rather get worse over time; the rate is
glass_icon_state = "sbitenglass"
glass_name = "Sbiten"
glass_desc = "A spicy mix of Vodka and Spice. Very hot."
- value = 2
/datum/reagent/consumable/ethanol/sbiten/on_mob_life(mob/living/carbon/M)
M.adjust_bodytemperature(50 * TEMPERATURE_DAMAGE_COEFFICIENT, 0 ,BODYTEMP_HEAT_DAMAGE_LIMIT) //310.15 is the normal bodytemp.
@@ -1006,7 +959,7 @@ All effects don't start immediately, but rather get worse over time; the rate is
glass_icon_state = "red_meadglass"
glass_name = "Red Mead"
glass_desc = "A True Viking's Beverage, though its color is strange."
- value = 5
+ value = REAGENT_VALUE_COMMON
/datum/reagent/consumable/ethanol/mead
name = "Mead"
@@ -1019,7 +972,6 @@ All effects don't start immediately, but rather get worse over time; the rate is
glass_icon_state = "meadglass"
glass_name = "Mead"
glass_desc = "A Viking's Beverage, though a cheap one."
- value = 1
/datum/reagent/consumable/ethanol/iced_beer
name = "Iced Beer"
@@ -1030,7 +982,6 @@ All effects don't start immediately, but rather get worse over time; the rate is
glass_icon_state = "iced_beerglass"
glass_name = "iced beer"
glass_desc = "A beer so frosty, the air around it freezes."
- value = 1
/datum/reagent/consumable/ethanol/iced_beer/on_mob_life(mob/living/carbon/M)
M.adjust_bodytemperature(-20 * TEMPERATURE_DAMAGE_COEFFICIENT, T0C) //310.15 is the normal bodytemp.
@@ -1045,7 +996,6 @@ All effects don't start immediately, but rather get worse over time; the rate is
glass_icon_state = "grogglass"
glass_name = "Grog"
glass_desc = "A fine and cepa drink for Space."
- value = 2.1
/datum/reagent/consumable/ethanol/aloe
name = "Aloe"
@@ -1057,7 +1007,7 @@ All effects don't start immediately, but rather get worse over time; the rate is
glass_icon_state = "aloe"
glass_name = "Aloe"
glass_desc = "Very, very, very good."
- value = 1
+ value = REAGENT_VALUE_COMMON
/datum/reagent/consumable/ethanol/andalusia
name = "Andalusia"
@@ -1069,7 +1019,6 @@ All effects don't start immediately, but rather get worse over time; the rate is
glass_icon_state = "andalusia"
glass_name = "Andalusia"
glass_desc = "A nice, strangely named drink."
- value = 1
/datum/reagent/consumable/ethanol/alliescocktail
name = "Allies Cocktail"
@@ -1081,7 +1030,6 @@ All effects don't start immediately, but rather get worse over time; the rate is
glass_icon_state = "alliescocktail"
glass_name = "Allies cocktail"
glass_desc = "A drink made from your allies."
- value = 4
/datum/reagent/consumable/ethanol/acid_spit
name = "Acid Spit"
@@ -1093,7 +1041,6 @@ All effects don't start immediately, but rather get worse over time; the rate is
glass_icon_state = "acidspitglass"
glass_name = "Acid Spit"
glass_desc = "A drink from Nanotrasen. Made from live aliens."
- value = 3
/datum/reagent/consumable/ethanol/amasec
name = "Amasec"
@@ -1105,7 +1052,6 @@ All effects don't start immediately, but rather get worse over time; the rate is
glass_icon_state = "amasecglass"
glass_name = "Amasec"
glass_desc = "Always handy before COMBAT!!!"
- value = 2
/datum/reagent/consumable/ethanol/changelingsting
name = "Changeling Sting"
@@ -1117,14 +1063,13 @@ All effects don't start immediately, but rather get worse over time; the rate is
glass_icon_state = "changelingsting"
glass_name = "Changeling Sting"
glass_desc = "A stingy drink."
- value = 1.5
/datum/reagent/consumable/ethanol/changelingsting/on_mob_life(mob/living/carbon/M)
if(M.mind) //Changeling Sting assists in the recharging of changeling chemicals.
var/datum/antagonist/changeling/changeling = M.mind.has_antag_datum(/datum/antagonist/changeling)
if(changeling)
changeling.chem_charges += metabolization_rate
- changeling.chem_charges = CLAMP(changeling.chem_charges, 0, changeling.chem_storage)
+ changeling.chem_charges = clamp(changeling.chem_charges, 0, changeling.chem_storage)
return ..()
/datum/reagent/consumable/ethanol/irishcarbomb
@@ -1137,7 +1082,6 @@ All effects don't start immediately, but rather get worse over time; the rate is
glass_icon_state = "irishcarbomb"
glass_name = "Irish Car Bomb"
glass_desc = "An Irish car bomb."
- value = 5
/datum/reagent/consumable/ethanol/syndicatebomb
name = "Syndicate Bomb"
@@ -1149,7 +1093,6 @@ All effects don't start immediately, but rather get worse over time; the rate is
glass_icon_state = "syndicatebomb"
glass_name = "Syndicate Bomb"
glass_desc = "A syndicate bomb."
- value = 2
/datum/reagent/consumable/ethanol/syndicatebomb/on_mob_life(mob/living/carbon/M)
if(prob(5))
@@ -1177,7 +1120,6 @@ All effects don't start immediately, but rather get worse over time; the rate is
glass_icon_state = "erikasurprise"
glass_name = "Erika Surprise"
glass_desc = "The surprise is, it's green!"
- value = 4
/datum/reagent/consumable/ethanol/driestmartini
name = "Driest Martini"
@@ -1190,7 +1132,6 @@ All effects don't start immediately, but rather get worse over time; the rate is
glass_icon_state = "driestmartiniglass"
glass_name = "Driest Martini"
glass_desc = "Only for the experienced. You think you see sand floating in the glass."
- value = 5
/datum/reagent/consumable/ethanol/bananahonk
name = "Banana Honk"
@@ -1203,7 +1144,6 @@ All effects don't start immediately, but rather get worse over time; the rate is
glass_icon_state = "bananahonkglass"
glass_name = "Banana Honk"
glass_desc = "A drink from Clown Heaven."
- value = 8
/datum/reagent/consumable/ethanol/bananahonk/on_mob_life(mob/living/carbon/M)
if((ishuman(M) && M.job == "Clown") || ismonkey(M))
@@ -1222,7 +1162,6 @@ All effects don't start immediately, but rather get worse over time; the rate is
glass_icon_state = "silencerglass"
glass_name = "Silencer"
glass_desc = "A drink from Mime Heaven."
- value = 2
/datum/reagent/consumable/ethanol/silencer/on_mob_life(mob/living/carbon/M)
if(ishuman(M) && M.job == "Mime")
@@ -1240,7 +1179,7 @@ All effects don't start immediately, but rather get worse over time; the rate is
glass_icon_state = "drunkenblumpkin"
glass_name = "Drunken Blumpkin"
glass_desc = "A drink for the drunks."
- value = 3
+ value = REAGENT_VALUE_COMMON
/datum/reagent/consumable/ethanol/whiskey_sour //Requested since we had whiskey cola and soda but not sour.
name = "Whiskey Sour"
@@ -1252,7 +1191,6 @@ All effects don't start immediately, but rather get worse over time; the rate is
glass_icon_state = "whiskey_sour"
glass_name = "whiskey sour"
glass_desc = "Lemon juice mixed with whiskey and a dash of sugar. Surprisingly satisfying."
- value = 2
/datum/reagent/consumable/ethanol/hcider
name = "Hard Cider"
@@ -1265,7 +1203,6 @@ All effects don't start immediately, but rather get worse over time; the rate is
glass_name = "hard cider"
glass_desc = "Tastes like autumn... no wait, fall!"
shot_glass_icon_state = "shotglassbrown"
- value = 3
/datum/reagent/consumable/ethanol/fetching_fizz //A reference to one of my favorite games of all time. Pulls nearby ores to the imbiber!
name = "Fetching Fizz"
@@ -1278,7 +1215,7 @@ All effects don't start immediately, but rather get worse over time; the rate is
glass_icon_state = "fetching_fizz"
glass_name = "Fetching Fizz"
glass_desc = "Induces magnetism in the imbiber. Started as a barroom prank but evolved to become popular with miners and scrappers. Metallic aftertaste."
- value = 2
+ value = REAGENT_VALUE_UNCOMMON
/datum/reagent/consumable/ethanol/fetching_fizz/on_mob_life(mob/living/carbon/M)
for(var/obj/item/stack/ore/O in orange(3, M))
@@ -1297,7 +1234,7 @@ All effects don't start immediately, but rather get worse over time; the rate is
glass_icon_state = "hearty_punch"
glass_name = "Hearty Punch"
glass_desc = "Aromatic beverage served piping hot. According to folk tales it can almost wake the dead."
- value = 1
+ value = REAGENT_VALUE_RARE //considering the low recipe yield.
/datum/reagent/consumable/ethanol/hearty_punch/on_mob_life(mob/living/carbon/M)
if(M.health <= 0)
@@ -1318,8 +1255,7 @@ All effects don't start immediately, but rather get worse over time; the rate is
glass_icon_state = "glass_brown2"
glass_name = "Bacchus' Blessing"
glass_desc = "You didn't think it was possible for a liquid to be so utterly revolting. Are you sure about this...?"
- value = 8
-
+ value = REAGENT_VALUE_RARE
/datum/reagent/consumable/ethanol/atomicbomb
name = "Atomic Bomb"
@@ -1331,7 +1267,7 @@ All effects don't start immediately, but rather get worse over time; the rate is
glass_icon_state = "atomicbombglass"
glass_name = "Atomic Bomb"
glass_desc = "Nanotrasen cannot take legal responsibility for your actions after imbibing."
- value = 3.56
+ value = REAGENT_VALUE_RARE
/datum/reagent/consumable/ethanol/atomicbomb/on_mob_life(mob/living/carbon/M)
M.set_drugginess(50)
@@ -1360,7 +1296,6 @@ All effects don't start immediately, but rather get worse over time; the rate is
glass_icon_state = "gargleblasterglass"
glass_name = "Pan-Galactic Gargle Blaster"
glass_desc = "Like having your brain smashed out by a slice of lemon wrapped around a large gold brick."
- value = 5
/datum/reagent/consumable/ethanol/gargle_blaster/on_mob_life(mob/living/carbon/M)
M.dizziness +=1.5
@@ -1393,7 +1328,7 @@ All effects don't start immediately, but rather get worse over time; the rate is
impure_chem = /datum/reagent/consumable/ethanol/neuroweak
inverse_chem_val = 0.5 //Clear conversion
inverse_chem = /datum/reagent/consumable/ethanol/neuroweak
- value = 4
+ value = REAGENT_VALUE_UNCOMMON
/datum/reagent/consumable/ethanol/neurotoxin/proc/pickt()
return (pick(TRAIT_PARALYSIS_L_ARM,TRAIT_PARALYSIS_R_ARM,TRAIT_PARALYSIS_R_LEG,TRAIT_PARALYSIS_L_LEG))
@@ -1434,7 +1369,6 @@ All effects don't start immediately, but rather get worse over time; the rate is
description = "A mostly safe alcoholic drink for the true daredevils. Counteracts Neurotoxins."
boozepwr = 60
pH = 8
- value = 3
/datum/reagent/consumable/ethanol/neuroweak/on_mob_life(mob/living/carbon/M)
if(holder.has_reagent(/datum/reagent/consumable/ethanol/neurotoxin))
@@ -1460,7 +1394,7 @@ All effects don't start immediately, but rather get worse over time; the rate is
glass_icon_state = "hippiesdelightglass"
glass_name = "Hippie's Delight"
glass_desc = "A drink enjoyed by people during the 1960's."
- value = 1.96
+ value = REAGENT_VALUE_RARE
/datum/reagent/consumable/ethanol/hippies_delight/on_mob_life(mob/living/carbon/M)
M.slurring = max(M.slurring,50)
@@ -1504,8 +1438,6 @@ All effects don't start immediately, but rather get worse over time; the rate is
glass_icon_state = "nog3"
glass_name = "eggnog"
glass_desc = "The traditional way to get absolutely hammered at a Christmas party."
- value = 4
-
/datum/reagent/consumable/ethanol/narsour
name = "Nar'Sour"
@@ -1517,7 +1449,7 @@ All effects don't start immediately, but rather get worse over time; the rate is
glass_icon_state = "narsour"
glass_name = "Nar'Sour"
glass_desc = "A new hit cocktail inspired by THE ARM Breweries will have you shouting Fuu ma'jin in no time!"
- value = 6.66
+ value = REAGENT_VALUE_UNCOMMON
/datum/reagent/consumable/ethanol/narsour/on_mob_life(mob/living/carbon/M)
M.cultslurring = min(M.cultslurring + 3, 3)
@@ -1534,7 +1466,7 @@ All effects don't start immediately, but rather get worse over time; the rate is
glass_icon_state = "cogchamp"
glass_name = "CogChamp"
glass_desc = "Not even Ratvar's Four Generals could withstand this! Qevax Jryy!"
- value = 8.13
+ value = REAGENT_VALUE_UNCOMMON
/datum/reagent/consumable/ethanol/cogchamp/on_mob_life(mob/living/carbon/M)
M.clockcultslurring = min(M.clockcultslurring + 3, 3)
@@ -1550,7 +1482,6 @@ All effects don't start immediately, but rather get worse over time; the rate is
glass_icon_state = "glass_orange"
glass_name = "Triple Sec"
glass_desc = "A glass of straight Triple Sec."
- value = 1.5
/datum/reagent/consumable/ethanol/creme_de_menthe
name = "Creme de Menthe"
@@ -1561,7 +1492,6 @@ All effects don't start immediately, but rather get worse over time; the rate is
glass_icon_state = "glass_green"
glass_name = "Creme de Menthe"
glass_desc = "You can almost feel the first breath of spring just looking at it."
- value = 2
/datum/reagent/consumable/ethanol/creme_de_cacao
name = "Creme de Cacao"
@@ -1572,7 +1502,6 @@ All effects don't start immediately, but rather get worse over time; the rate is
glass_icon_state = "glass_brown"
glass_name = "Creme de Cacao"
glass_desc = "A million hazing lawsuits and alcohol poisonings have started with this humble ingredient."
- value = 1
/datum/reagent/consumable/ethanol/creme_de_coconut
name = "Creme de Coconut"
@@ -1594,7 +1523,6 @@ All effects don't start immediately, but rather get worse over time; the rate is
glass_icon_state = "quadruple_sec"
glass_name = "Quadruple Sec"
glass_desc = "An intimidating and lawful beverage dares you to violate the law and make its day. Still can't drink it on duty, though."
- value = 3.04
/datum/reagent/consumable/ethanol/quadruple_sec/on_mob_life(mob/living/carbon/M)
if(M.mind && HAS_TRAIT(M.mind, TRAIT_LAW_ENFORCEMENT_METABOLISM)) //Securidrink in line with the screwderiver for engineers or nothing for mimes.
@@ -1613,7 +1541,7 @@ All effects don't start immediately, but rather get worse over time; the rate is
glass_icon_state = "quintuple_sec"
glass_name = "Quintuple Sec"
glass_desc = "Now you are become law, destroyer of clowns."
- value = 4.01
+ value = REAGENT_VALUE_EXCEPTIONAL
/datum/reagent/consumable/ethanol/quintuple_sec/on_mob_life(mob/living/carbon/M)
if(M.mind && HAS_TRAIT(M.mind, TRAIT_LAW_ENFORCEMENT_METABOLISM)) //Securidrink in line with the screwderiver for engineers or nothing for mimes but STRONG..
@@ -1657,7 +1585,6 @@ All effects don't start immediately, but rather get worse over time; the rate is
glass_icon_state = "grasshopper"
glass_name = "Grasshopper"
glass_desc = "You weren't aware edible beverages could be that green."
- value = 1
/datum/reagent/consumable/ethanol/stinger
name = "Stinger"
@@ -1669,7 +1596,6 @@ All effects don't start immediately, but rather get worse over time; the rate is
glass_icon_state = "stinger"
glass_name = "Stinger"
glass_desc = "You wonder what would happen if you pointed this at a heat source..."
- value = 1
/datum/reagent/consumable/ethanol/bastion_bourbon
name = "Bastion Bourbon"
@@ -1684,7 +1610,7 @@ All effects don't start immediately, but rather get worse over time; the rate is
glass_desc = "If you're feeling low, count on the buttery flavor of our own bastion bourbon."
shot_glass_icon_state = "shotglassgreen"
pH = 4
- value = 8
+ value = REAGENT_VALUE_UNCOMMON
/datum/reagent/consumable/ethanol/bastion_bourbon/on_mob_metabolize(mob/living/L)
var/heal_points = 10
@@ -1721,7 +1647,6 @@ All effects don't start immediately, but rather get worse over time; the rate is
glass_name = "Squirt Cider"
glass_desc = "Squirt cider will toughen you right up. Too bad about the musty aftertaste."
shot_glass_icon_state = "shotglassgreen"
- value = 1
/datum/reagent/consumable/ethanol/squirt_cider/on_mob_life(mob/living/carbon/M)
M.satiety += 5 //for context, vitamins give 30 satiety per tick
@@ -1738,7 +1663,6 @@ All effects don't start immediately, but rather get worse over time; the rate is
glass_icon_state = "fringe_weaver"
glass_name = "Fringe Weaver"
glass_desc = "It's a wonder it doesn't spill out of the glass."
- value = 1
/datum/reagent/consumable/ethanol/sugar_rush
name = "Sugar Rush"
@@ -1751,7 +1675,6 @@ All effects don't start immediately, but rather get worse over time; the rate is
glass_icon_state = "sugar_rush"
glass_name = "Sugar Rush"
glass_desc = "If you can't mix a Sugar Rush, you can't tend bar."
- value = 1
/datum/reagent/consumable/ethanol/sugar_rush/on_mob_life(mob/living/carbon/M)
M.satiety -= 10 //junky as hell! a whole glass will keep you from being able to eat junk food
@@ -1768,7 +1691,7 @@ All effects don't start immediately, but rather get worse over time; the rate is
glass_icon_state = "crevice_spike"
glass_name = "Crevice Spike"
glass_desc = "It'll either knock the drunkenness out of you or knock you out cold. Both, probably."
- value = 1
+ value = REAGENT_VALUE_COMMON
/datum/reagent/consumable/ethanol/crevice_spike/on_mob_metabolize(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
@@ -1782,7 +1705,6 @@ All effects don't start immediately, but rather get worse over time; the rate is
glass_icon_state = "sakecup"
glass_name = "cup of sake"
glass_desc = "A traditional cup of sake."
- value = 0.1
/datum/reagent/consumable/ethanol/peppermint_patty
name = "Peppermint Patty"
@@ -1794,7 +1716,6 @@ All effects don't start immediately, but rather get worse over time; the rate is
glass_icon_state = "peppermint_patty"
glass_name = "Peppermint Patty"
glass_desc = "A boozy minty hot cocoa that warms your belly on a cold night."
- value = 2
/datum/reagent/consumable/ethanol/peppermint_patty/on_mob_life(mob/living/carbon/M)
M.apply_status_effect(/datum/status_effect/throat_soothed)
@@ -1812,7 +1733,6 @@ All effects don't start immediately, but rather get worse over time; the rate is
glass_name = "Alexander"
glass_desc = "A creamy, indulgent delight that is stronger than it seems."
var/obj/item/shield/mighty_shield
- value = 1
/datum/reagent/consumable/ethanol/alexander/on_mob_metabolize(mob/living/L)
if(ishuman(L))
@@ -1844,7 +1764,6 @@ All effects don't start immediately, but rather get worse over time; the rate is
glass_icon_state = "sidecar"
glass_name = "Sidecar"
glass_desc = "The one ride you'll gladly give up the wheel for."
- value = 1
/datum/reagent/consumable/ethanol/between_the_sheets
name = "Between the Sheets"
@@ -1856,7 +1775,6 @@ All effects don't start immediately, but rather get worse over time; the rate is
glass_icon_state = "between_the_sheets"
glass_name = "Between the Sheets"
glass_desc = "The only drink that comes with a label reminding you of Nanotrasen's zero-tolerance promiscuity policy."
- value = 2
/datum/reagent/consumable/ethanol/between_the_sheets/on_mob_life(mob/living/L)
..()
@@ -1881,7 +1799,6 @@ All effects don't start immediately, but rather get worse over time; the rate is
glass_icon_state = "kamikaze"
glass_name = "Kamikaze"
glass_desc = "Divinely windy."
- value = 1
/datum/reagent/consumable/ethanol/mojito
name = "Mojito"
@@ -1893,7 +1810,6 @@ All effects don't start immediately, but rather get worse over time; the rate is
glass_icon_state = "mojito"
glass_name = "Mojito"
glass_desc = "A drink that looks as refreshing as it tastes."
- value = 1
/datum/reagent/consumable/ethanol/moscow_mule
name = "Moscow Mule"
@@ -1914,7 +1830,6 @@ All effects don't start immediately, but rather get worse over time; the rate is
taste_description = "utter bitterness"
glass_name = "glass of fernet"
glass_desc = "A glass of pure Fernet. Only an absolute madman would drink this alone."
- value = 0.1
/datum/reagent/consumable/ethanol/fernet/on_mob_life(mob/living/carbon/M)
if(M.nutrition <= NUTRITION_LEVEL_STARVING)
@@ -1933,7 +1848,6 @@ All effects don't start immediately, but rather get worse over time; the rate is
glass_icon_state = "godlyblend"
glass_name = "glass of fernet cola"
glass_desc = "A sawed-off cola bottle filled with Fernet Cola. Nothing better after eating like a lardass."
- value = 1
/datum/reagent/consumable/ethanol/fernet_cola/on_mob_life(mob/living/carbon/M)
if(M.nutrition <= NUTRITION_LEVEL_STARVING)
@@ -1943,7 +1857,6 @@ All effects don't start immediately, but rather get worse over time; the rate is
return ..()
/datum/reagent/consumable/ethanol/fanciulli
-
name = "Fanciulli"
description = "What if the Manhattan coctail ACTUALLY used a bitter herb liquour? Helps you sobers up." //also causes a bit of stamina damage to symbolize the afterdrink lazyness
color = "#CA933F" // rgb: 202, 147, 63
@@ -1953,7 +1866,6 @@ All effects don't start immediately, but rather get worse over time; the rate is
glass_icon_state = "fanciulli"
glass_name = "glass of fanciulli"
glass_desc = "A glass of Fanciulli. It's just Manhattan with Fernet."
- value = 1
/datum/reagent/consumable/ethanol/fanciulli/on_mob_life(mob/living/carbon/M)
M.nutrition = max(M.nutrition - 5, 0)
@@ -1966,7 +1878,6 @@ All effects don't start immediately, but rather get worse over time; the rate is
. = TRUE
..()
-
/datum/reagent/consumable/ethanol/branca_menta
name = "Branca Menta"
description = "A refreshing mixture of bitter Fernet with mint creme liquour."
@@ -1977,7 +1888,6 @@ All effects don't start immediately, but rather get worse over time; the rate is
glass_icon_state= "minted_fernet"
glass_name = "glass of branca menta"
glass_desc = "A glass of Branca Menta, perfect for those lazy and hot sunday summer afternoons." //Get lazy literally by drinking this
- value = 1
/datum/reagent/consumable/ethanol/branca_menta/on_mob_life(mob/living/carbon/M)
M.adjust_bodytemperature(-20 * TEMPERATURE_DAMAGE_COEFFICIENT, T0C)
@@ -2000,7 +1910,7 @@ All effects don't start immediately, but rather get worse over time; the rate is
glass_icon_state = "blank_paper"
glass_name = "glass of blank paper"
glass_desc = "A fizzy cocktail for those looking to start fresh."
- value = 1
+ value = REAGENT_VALUE_UNCOMMON
/datum/reagent/consumable/ethanol/blank_paper/on_mob_life(mob/living/carbon/M)
if(ishuman(M) && M.job == "Mime")
@@ -2017,7 +1927,7 @@ All effects don't start immediately, but rather get worse over time; the rate is
glass_icon_state = "champagne_glass"
glass_name = "Champagne"
glass_desc = "The flute clearly displays the slowly rising bubbles."
- value = 1
+ value = REAGENT_VALUE_COMMON
/datum/reagent/consumable/ethanol/wizz_fizz
name = "Wizz Fizz"
@@ -2029,7 +1939,7 @@ All effects don't start immediately, but rather get worse over time; the rate is
glass_icon_state = "wizz_fizz"
glass_name = "Wizz Fizz"
glass_desc = "The glass bubbles and froths with an almost magical intensity."
- value = 1
+ value = REAGENT_VALUE_COMMON
/datum/reagent/consumable/ethanol/wizz_fizz/on_mob_life(mob/living/carbon/M)
//A healing drink similar to Quadruple Sec, Ling Stings, and Screwdrivers for the Wizznerds; the check is consistent with the changeling sting
@@ -2049,7 +1959,6 @@ All effects don't start immediately, but rather get worse over time; the rate is
glass_icon_state = "bug_spray"
glass_name = "Bug Spray"
glass_desc = "Your eyes begin to water as the sting of alcohol reaches them."
- value = 1
/datum/reagent/consumable/ethanol/bug_spray/on_mob_life(mob/living/carbon/M)
//Bugs should not drink Bug spray.
@@ -2071,7 +1980,6 @@ All effects don't start immediately, but rather get worse over time; the rate is
glass_icon_state = "applejack_glass"
glass_name = "Applejack"
glass_desc = "You feel like you could drink this all neight."
- value = 0.1
/datum/reagent/consumable/ethanol/jack_rose
name = "Jack Rose"
@@ -2083,7 +1991,6 @@ All effects don't start immediately, but rather get worse over time; the rate is
glass_icon_state = "jack_rose"
glass_name = "Jack Rose"
glass_desc = "Enough of these, and you really will start to suppose your toeses are roses."
- value = 1
/datum/reagent/consumable/ethanol/turbo
name = "Turbo"
@@ -2095,7 +2002,7 @@ All effects don't start immediately, but rather get worse over time; the rate is
glass_icon_state = "turbo"
glass_name = "Turbo"
glass_desc = "A turbulent cocktail for outlaw hoverbikers."
- value = 0.3
+ value = REAGENT_VALUE_RARE
/datum/reagent/consumable/ethanol/turbo/on_mob_life(mob/living/carbon/M)
if(prob(4))
@@ -2113,7 +2020,7 @@ All effects don't start immediately, but rather get worse over time; the rate is
glass_icon_state = "old_timer"
glass_name = "Old Timer"
glass_desc = "WARNING! May cause premature aging!"
- value = 2
+ value = REAGENT_VALUE_UNCOMMON //Parsnip juice? Really? lol
/datum/reagent/consumable/ethanol/old_timer/on_mob_life(mob/living/carbon/M)
if(prob(20))
@@ -2146,7 +2053,7 @@ All effects don't start immediately, but rather get worse over time; the rate is
glass_icon_state = "rubberneck"
glass_name = "Rubberneck"
glass_desc = "A popular drink amongst those adhering to an all synthetic diet."
- value = 1
+ value = REAGENT_VALUE_COMMON
/datum/reagent/consumable/ethanol/duplex
name = "Duplex"
@@ -2158,7 +2065,6 @@ All effects don't start immediately, but rather get worse over time; the rate is
glass_icon_state = "duplex"
glass_name = "Duplex"
glass_desc = "To imbibe one component separately from the other is consider a great faux pas."
- value = 1
/datum/reagent/consumable/ethanol/trappist
name = "Trappist Beer"
@@ -2170,7 +2076,6 @@ All effects don't start immediately, but rather get worse over time; the rate is
glass_icon_state = "trappistglass"
glass_name = "Trappist Beer"
glass_desc = "boozy Catholicism in a glass."
- value = 1
/datum/reagent/consumable/ethanol/trappist/on_mob_life(mob/living/carbon/M)
if(M.mind.isholy)
@@ -2188,8 +2093,8 @@ All effects don't start immediately, but rather get worse over time; the rate is
glass_icon_state = "blazaamglass"
glass_name = "Blazaam"
glass_desc = "The glass seems to be sliding between realities. Doubles as a Berenstain remover."
+ value = REAGENT_VALUE_UNCOMMON
var/stored_teleports = 0
- value = 4
/datum/reagent/consumable/ethanol/blazaam/on_mob_life(mob/living/carbon/M)
if(M.drunkenness > 40)
@@ -2211,7 +2116,7 @@ All effects don't start immediately, but rather get worse over time; the rate is
glass_icon_state = "planet_cracker"
glass_name = "Planet Cracker"
glass_desc = "Although historians believe the drink was originally created to commemorate the end of an important conflict in man's past, its origins have largely been forgotten and it is today seen more as a general symbol of human supremacy."
- value = 1
+ value = REAGENT_VALUE_VERY_RARE
/datum/reagent/consumable/ethanol/mauna_loa
name = "Mauna Loa"
@@ -2223,6 +2128,7 @@ All effects don't start immediately, but rather get worse over time; the rate is
glass_icon_state = "mauna_loa"
glass_name = "Mauna Loa"
glass_desc = "Lavaland in a drink... mug... volcano... thing."
+ value = REAGENT_VALUE_COMMON
/datum/reagent/consumable/ethanol/mauna_loa/on_mob_life(mob/living/carbon/M)
// Heats the user up while the reagent is in the body. Occasionally makes you burst into flames.
@@ -2236,13 +2142,14 @@ All effects don't start immediately, but rather get worse over time; the rate is
name = "Commander and Chief"
description = "A cocktail for the captain on the go."
color = "#ffffc9"
+ can_synth = FALSE
boozepwr = 50
quality = DRINK_FANTASTIC
taste_description = "duty and responsibility"
glass_icon_state = "commander_and_chief"
glass_name = "Commander and Chief"
glass_desc = "The gems of this majestic chalice represent the departments and their Heads."
- value = 10
+ value = REAGENT_VALUE_AMAZING
/datum/reagent/consumable/ethanol/commander_and_chief/on_mob_life(mob/living/carbon/M)
if(M.mind && HAS_TRAIT(M.mind, TRAIT_CAPTAIN_METABOLISM))
@@ -2281,6 +2188,7 @@ All effects don't start immediately, but rather get worse over time; the rate is
glass_icon_state = "hellfire"
glass_name = "Hellfire"
glass_desc = "An amber colored drink that isn't quite as hot as it looks."
+ value = REAGENT_VALUE_UNCOMMON
/datum/reagent/consumable/ethanol/hellfire/on_mob_life(mob/living/carbon/M)
M.adjust_bodytemperature(30 * TEMPERATURE_DAMAGE_COEFFICIENT, 0, BODYTEMP_NORMAL + 30)
@@ -2296,6 +2204,7 @@ All effects don't start immediately, but rather get worse over time; the rate is
glass_icon_state = "sins_delight"
glass_name = "Sin's Delight"
glass_desc = "You can smell the seven sins rolling off the top of the glass."
+ value = REAGENT_VALUE_RARE
/datum/reagent/consumable/ethanol/strawberry_daiquiri
name = "Strawberry Daiquiri"
@@ -2328,6 +2237,7 @@ All effects don't start immediately, but rather get worse over time; the rate is
glass_icon_state = "miami_vice"
glass_name = "Miami Vice"
glass_desc = "Strawberries and coconut, like yin and yang."
+ value = REAGENT_VALUE_UNCOMMON
/datum/reagent/consumable/ethanol/malibu_sunset
name = "Malibu Sunset"
@@ -2350,6 +2260,7 @@ All effects don't start immediately, but rather get worse over time; the rate is
glass_icon_state = "hotlime_miami"
glass_name = "Hotlime Miami"
glass_desc = "This looks very aesthetically pleasing."
+ value = REAGENT_VALUE_COMMON
/datum/reagent/consumable/ethanol/hotlime_miami/on_mob_life(mob/living/carbon/M)
M.set_drugginess(50)
@@ -2580,7 +2491,6 @@ All effects don't start immediately, but rather get worse over time; the rate is
var/list/names = list("null fruit" = 1) //Names of the fruits used. Associative list where name is key, value is the percentage of that fruit.
var/list/tastes = list("bad coding" = 1) //List of tastes. See above.
pH = 4
- value = 4
/datum/reagent/consumable/ethanol/fruit_wine/on_new(list/data)
names = data["names"]
diff --git a/code/modules/reagents/chemistry/reagents/drink_reagents.dm b/code/modules/reagents/chemistry/reagents/drink_reagents.dm
index ebbce61c57..62aea28009 100644
--- a/code/modules/reagents/chemistry/reagents/drink_reagents.dm
+++ b/code/modules/reagents/chemistry/reagents/drink_reagents.dm
@@ -165,6 +165,7 @@
metabolization_rate = INFINITY
color = "#FF4DD2"
taste_description = "laughter"
+ value = REAGENT_VALUE_VERY_COMMON
/datum/reagent/consumable/laughter/on_mob_life(mob/living/carbon/M)
M.emote("laugh")
@@ -177,6 +178,7 @@
metabolization_rate = 1.5 * REAGENTS_METABOLISM
color = "#FF4DD2"
taste_description = "laughter"
+ value = REAGENT_VALUE_RARE
/datum/reagent/consumable/superlaughter/on_mob_life(mob/living/carbon/M)
if(prob(30))
@@ -210,6 +212,7 @@
glass_name = "glass of milk"
glass_desc = "White and nutritious goodness!"
pH = 6.5
+ value = REAGENT_VALUE_VERY_COMMON
/datum/reagent/consumable/milk/on_mob_life(mob/living/carbon/M)
if(HAS_TRAIT(M, TRAIT_CALCIUM_HEALER))
@@ -231,6 +234,7 @@
glass_icon_state = "glass_white"
glass_name = "glass of soy milk"
glass_desc = "White and nutritious soy goodness!"
+ value = REAGENT_VALUE_VERY_COMMON
/datum/reagent/consumable/soymilk/on_mob_life(mob/living/carbon/M)
if(M.getBruteLoss() && prob(20))
@@ -324,17 +328,18 @@
glass_icon_state = "lemonpitcher"
glass_name = "pitcher of lemonade"
glass_desc = "This drink leaves you feeling nostalgic for some reason."
+ value = REAGENT_VALUE_VERY_COMMON
/datum/reagent/consumable/tea/arnold_palmer
name = "Arnold Palmer"
description = "Encourages the patient to go golfing."
color = "#FFB766"
quality = DRINK_NICE
- nutriment_factor = 2
taste_description = "bitter tea"
glass_icon_state = "arnold_palmer"
glass_name = "Arnold Palmer"
glass_desc = "You feel like taking a few golf swings after a few swigs of this."
+ value = REAGENT_VALUE_VERY_COMMON
/datum/reagent/consumable/tea/arnold_palmer/on_mob_life(mob/living/carbon/M)
if(prob(5))
@@ -384,6 +389,7 @@
/datum/reagent/consumable/space_cola
name = "Cola"
description = "A refreshing beverage."
+ nutriment_factor = 0.5 * REAGENTS_METABOLISM
color = "#100800" // rgb: 16, 8, 0
taste_description = "cola"
glass_icon_state = "glass_brown"
@@ -404,6 +410,7 @@
glass_icon_state = "nuka_colaglass"
glass_name = "glass of Nuka Cola"
glass_desc = "Don't cry, Don't raise your eye, It's only nuclear wasteland."
+ value = REAGENT_VALUE_COMMON
/datum/reagent/consumable/nuka_cola/on_mob_life(mob/living/carbon/M)
M.Jitter(20)
@@ -418,6 +425,7 @@
/datum/reagent/consumable/spacemountainwind
name = "SM Wind"
description = "Blows right through you like a space wind."
+ nutriment_factor = 0.5 * REAGENTS_METABOLISM
color = "#102000" // rgb: 16, 32, 0
taste_description = "sweet citrus soda"
glass_icon_state = "Space_mountain_wind_glass"
@@ -435,6 +443,7 @@
/datum/reagent/consumable/dr_gibb
name = "Dr. Gibb"
description = "A delicious blend of 42 different flavours."
+ nutriment_factor = 0.5 * REAGENTS_METABOLISM
color = "#102000" // rgb: 16, 32, 0
taste_description = "cherry soda" // FALSE ADVERTISING
glass_icon_state = "dr_gibb_glass"
@@ -449,6 +458,7 @@
/datum/reagent/consumable/space_up
name = "Space-Up"
description = "Tastes like a hull breach in your mouth."
+ nutriment_factor = 0.5 * REAGENTS_METABOLISM
color = "#00FF00" // rgb: 0, 255, 0
taste_description = "cherry soda"
glass_icon_state = "space-up_glass"
@@ -463,6 +473,7 @@
/datum/reagent/consumable/lemon_lime
name = "Lemon Lime"
description = "A tangy substance made of 0.5% natural citrus!"
+ nutriment_factor = 0.5 * REAGENTS_METABOLISM
color = "#8CFF00" // rgb: 135, 255, 0
taste_description = "tangy lime and lemon soda"
glass_icon_state = "glass_yellow"
@@ -476,6 +487,7 @@
/datum/reagent/consumable/pwr_game
name = "Pwr Game"
description = "The only drink with the PWR that true gamers crave."
+ nutriment_factor = 0.5 * REAGENTS_METABOLISM
color = "#9385bf" // rgb: 58, 52, 75
taste_description = "sweet and salty tang"
glass_icon_state = "glass_red"
@@ -489,6 +501,7 @@
/datum/reagent/consumable/shamblers
name = "Shambler's Juice"
description = "~Shake me up some of that Shambler's Juice!~"
+ nutriment_factor = 0.5 * REAGENTS_METABOLISM
color = "#f00060" // rgb: 94, 0, 38
taste_description = "carbonated metallic soda"
glass_icon_state = "glass_red"
@@ -502,6 +515,7 @@
/datum/reagent/consumable/buzz_fuzz
name = "Buzz Fuzz"
description = "~A Hive of Flavour!~ NOTICE: Addicting."
+ nutriment_factor = 0
addiction_threshold = 26 //A can and a sip
color = "#8CFF00" // rgb: 135, 255, 0
taste_description = "carbonated honey and pollen"
@@ -552,6 +566,7 @@
glass_icon_state = "grey_bull_glass"
glass_name = "glass of Grey Bull"
glass_desc = "Surprisingly it isnt grey."
+ value = REAGENT_VALUE_COMMON
/datum/reagent/consumable/grey_bull/on_mob_metabolize(mob/living/L)
..()
@@ -572,6 +587,7 @@
/datum/reagent/consumable/sodawater
name = "Soda Water"
description = "A can of club soda. Why not make a scotch and soda?"
+ nutriment_factor = 0
color = "#619494" // rgb: 97, 148, 148
taste_description = "carbonated water"
glass_icon_state = "glass_clear"
@@ -604,6 +620,7 @@
/datum/reagent/consumable/ice
name = "Ice"
description = "Frozen water, your dentist wouldn't like you chewing this."
+ nutriment_factor = 0 //Its water why would this even geive nutriments?
reagent_state = SOLID
color = "#619494" // rgb: 97, 148, 148
taste_description = "ice"
@@ -624,6 +641,7 @@
glass_icon_state = "soy_latte"
glass_name = "soy latte"
glass_desc = "A nice and refreshing beverage while you're reading."
+ value = REAGENT_VALUE_VERY_COMMON
/datum/reagent/consumable/soy_latte/on_mob_life(mob/living/carbon/M)
M.dizziness = max(0,M.dizziness-5)
@@ -645,6 +663,7 @@
glass_icon_state = "cafe_latte"
glass_name = "cafe latte"
glass_desc = "A nice, strong and refreshing beverage while you're reading."
+ value = REAGENT_VALUE_VERY_COMMON
/datum/reagent/consumable/cafe_latte/on_mob_life(mob/living/carbon/M)
M.dizziness = max(0,M.dizziness-5)
@@ -666,6 +685,7 @@
glass_icon_state = "doctorsdelightglass"
glass_name = "Doctor's Delight"
glass_desc = "The space doctor's favorite. Guaranteed to restore bodily injury; side effects include cravings and hunger."
+ value = REAGENT_VALUE_COMMON
/datum/reagent/consumable/doctor_delight/on_mob_life(mob/living/carbon/M)
M.adjustBruteLoss(-0.5, 0)
@@ -688,6 +708,7 @@
glass_icon_state = "chocolatepudding"
glass_name = "chocolate pudding"
glass_desc = "Tasty."
+ value = REAGENT_VALUE_COMMON
/datum/reagent/consumable/vanillapudding
name = "Vanilla Pudding"
@@ -699,50 +720,55 @@
glass_icon_state = "vanillapudding"
glass_name = "vanilla pudding"
glass_desc = "Tasty."
+ value = REAGENT_VALUE_UNCOMMON //real vanilla.
/datum/reagent/consumable/cherryshake
name = "Cherry Shake"
description = "A cherry flavored milkshake."
color = "#FFB6C1"
quality = DRINK_VERYGOOD
- nutriment_factor = 4 * REAGENTS_METABOLISM
+ nutriment_factor = 2 * REAGENTS_METABOLISM
taste_description = "creamy cherry"
glass_icon_state = "cherryshake"
glass_name = "cherry shake"
glass_desc = "A cherry flavored milkshake."
+ value = REAGENT_VALUE_COMMON
/datum/reagent/consumable/bluecherryshake
name = "Blue Cherry Shake"
description = "An exotic milkshake."
color = "#00F1FF"
quality = DRINK_VERYGOOD
- nutriment_factor = 4 * REAGENTS_METABOLISM
+ nutriment_factor = 2 * REAGENTS_METABOLISM
taste_description = "creamy blue cherry"
glass_icon_state = "bluecherryshake"
glass_name = "blue cherry shake"
glass_desc = "An exotic blue milkshake."
+ value = REAGENT_VALUE_UNCOMMON
/datum/reagent/consumable/pumpkin_latte
name = "Pumpkin Latte"
description = "A mix of pumpkin juice and coffee."
color = "#F4A460"
quality = DRINK_VERYGOOD
- nutriment_factor = 3 * REAGENTS_METABOLISM
+ nutriment_factor = 2 * REAGENTS_METABOLISM
taste_description = "creamy pumpkin"
glass_icon_state = "pumpkin_latte"
glass_name = "pumpkin latte"
glass_desc = "A mix of coffee and pumpkin juice."
+ value = REAGENT_VALUE_COMMON
/datum/reagent/consumable/gibbfloats
name = "Gibb Floats"
description = "Ice cream on top of a Dr. Gibb glass."
color = "#B22222"
quality = DRINK_NICE
- nutriment_factor = 3 * REAGENTS_METABOLISM
+ nutriment_factor = 1 * REAGENTS_METABOLISM
taste_description = "creamy cherry"
glass_icon_state = "gibbfloats"
glass_name = "Gibbfloat"
glass_desc = "Dr. Gibb with ice cream on top."
+ value = REAGENT_VALUE_VERY_COMMON
/datum/reagent/consumable/pumpkinjuice
name = "Pumpkin Juice"
@@ -755,6 +781,7 @@
description = "Juiced from real blumpkin."
color = "#00BFFF"
taste_description = "a mouthful of pool water"
+ value = REAGENT_VALUE_VERY_COMMON
/datum/reagent/consumable/triple_citrus
name = "Triple Citrus"
@@ -784,6 +811,7 @@
color = "#7D4E29"
quality = DRINK_NICE
taste_description = "chocolate milk"
+ value = REAGENT_VALUE_VERY_COMMON
/datum/reagent/consumable/menthol
name = "Menthol"
@@ -812,6 +840,7 @@
color = "#FFA500"
taste_description = "parsnip"
glass_name = "glass of parsnip juice"
+ value = REAGENT_VALUE_COMMON
/datum/reagent/consumable/peachjuice //Intended to be extremely rare due to being the limiting ingredients in the blazaam drink
name = "Peach Juice"
@@ -837,6 +866,7 @@
glass_icon_state = "cream_soda"
glass_name = "Cream Soda"
glass_desc = "A classic space-American vanilla flavored soft drink."
+ value = REAGENT_VALUE_VERY_COMMON //just a little vanilla
/datum/reagent/consumable/cream_soda/on_mob_life(mob/living/carbon/M)
M.adjust_bodytemperature(-5 * TEMPERATURE_DAMAGE_COEFFICIENT, BODYTEMP_NORMAL)
@@ -845,6 +875,7 @@
/datum/reagent/consumable/sol_dry
name = "Sol Dry"
description = "A soothing, mellow drink made from ginger."
+ nutriment_factor = 0.5 * REAGENTS_METABOLISM
color = "#f7d26a"
quality = DRINK_NICE
taste_description = "sweet ginger spice"
@@ -864,6 +895,7 @@
glass_icon_state = "red_queen"
glass_name = "Red Queen"
glass_desc = "DRINK ME."
+ value = REAGENT_VALUE_COMMON //growth serum.
var/current_size = RESIZE_DEFAULT_SIZE
/datum/reagent/consumable/red_queen/on_mob_life(mob/living/carbon/H)
@@ -889,10 +921,11 @@
description = "A drink of a bygone era of milk and artificial sweetener back on a rock."
color = "#f76aeb"//rgb(247, 106, 235)
glass_icon_state = "pinkmilk"
- quality = DRINK_FANTASTIC //Love drink
+ quality = DRINK_VERYGOOD
taste_description = "sweet strawberry and milk cream"
glass_name = "tall glass of strawberry milk"
glass_desc = "Delicious flavored strawberry syrup mixed with milk."
+ value = REAGENT_VALUE_VERY_COMMON
/datum/reagent/consumable/tea/pinkmilk/on_mob_life(mob/living/carbon/M)
if(prob(15))
@@ -905,7 +938,7 @@
description = "A timeless classic!"
color = "#f76aeb"//rgb(247, 106, 235)
glass_icon_state = "pinktea"
- quality = DRINK_FANTASTIC //Love drink
+ quality = DRINK_VERYGOOD
taste_description = "sweet tea with a hint of strawberry"
glass_name = "mug of strawberry tea"
glass_desc = "Delicious traditional tea flavored with strawberries."
@@ -948,6 +981,7 @@
glass_icon_state = "monkey_energy_glass"
glass_name = "glass of Monkey Energy"
glass_desc = "You can unleash the ape, but without the pop of the can?"
+ value = REAGENT_VALUE_COMMON
/datum/reagent/consumable/monkey_energy/on_mob_life(mob/living/carbon/M)
M.Jitter(20)
@@ -965,3 +999,4 @@
glass_icon_state = "glass_yellow"
glass_name = "glass of bungo juice"
glass_desc = "Exotic! You feel like you are on vacation already."
+ value = REAGENT_VALUE_COMMON
diff --git a/code/modules/reagents/chemistry/reagents/drug_reagents.dm b/code/modules/reagents/chemistry/reagents/drug_reagents.dm
index c96feec4e2..ef4b7f3a53 100644
--- a/code/modules/reagents/chemistry/reagents/drug_reagents.dm
+++ b/code/modules/reagents/chemistry/reagents/drug_reagents.dm
@@ -1,6 +1,5 @@
/datum/reagent/drug
name = "Drug"
- value = 12
metabolization_rate = 0.5 * REAGENTS_METABOLISM
taste_description = "bitterness"
var/trippy = TRUE //Does this drug make you trip?
@@ -11,7 +10,7 @@
/datum/reagent/drug/space_drugs
name = "Space drugs"
- value = 6
+ value = REAGENT_VALUE_VERY_COMMON
description = "An illegal chemical compound used as drug."
color = "#60A584" // rgb: 96, 165, 132
overdose_threshold = 30
@@ -38,7 +37,6 @@
/datum/reagent/drug/nicotine
name = "Nicotine"
- value = 0
description = "Slightly reduces stun times. If overdosed it will deal toxin and oxygen damage."
reagent_state = LIQUID
color = "#60A584" // rgb: 96, 165, 132
@@ -66,6 +64,7 @@
overdose_threshold = 20
addiction_threshold = 10
pH = 10
+ value = REAGENT_VALUE_UNCOMMON
/datum/reagent/drug/crank/on_mob_life(mob/living/carbon/M)
if(prob(5))
@@ -112,6 +111,7 @@
overdose_threshold = 20
addiction_threshold = 15
pH = 9
+ value = REAGENT_VALUE_UNCOMMON
/datum/reagent/drug/krokodil/on_mob_life(mob/living/carbon/M)
@@ -167,6 +167,7 @@
var/jitter = TRUE
var/confusion = TRUE
pH = 5
+ value = REAGENT_VALUE_UNCOMMON
/datum/reagent/drug/methamphetamine/on_mob_metabolize(mob/living/L)
..()
@@ -196,7 +197,7 @@
. = 1
/datum/reagent/drug/methamphetamine/overdose_process(mob/living/M)
- if(CHECK_MOBILITY(M, MOBILITY_MOVE) && !ismovableatom(M.loc))
+ if(CHECK_MOBILITY(M, MOBILITY_MOVE) && !ismovable(M.loc))
for(var/i in 1 to 4)
step(M, pick(GLOB.cardinals))
if(prob(20))
@@ -223,7 +224,7 @@
..()
/datum/reagent/drug/methamphetamine/addiction_act_stage3(mob/living/M)
- if(CHECK_MOBILITY(M, MOBILITY_MOVE) && !ismovableatom(M.loc))
+ if(CHECK_MOBILITY(M, MOBILITY_MOVE) && !ismovable(M.loc))
for(var/i = 0, i < 4, i++)
step(M, pick(GLOB.cardinals))
M.Jitter(15)
@@ -233,7 +234,7 @@
..()
/datum/reagent/drug/methamphetamine/addiction_act_stage4(mob/living/carbon/human/M)
- if(CHECK_MOBILITY(M, MOBILITY_MOVE) && !ismovableatom(M.loc))
+ if(CHECK_MOBILITY(M, MOBILITY_MOVE) && !ismovable(M.loc))
for(var/i = 0, i < 8, i++)
step(M, pick(GLOB.cardinals))
M.Jitter(20)
@@ -250,6 +251,7 @@
overdose_threshold = 35
jitter = FALSE
brain_damage = FALSE
+ value = REAGENT_VALUE_RARE
/datum/reagent/drug/bath_salts
name = "Bath Salts"
@@ -261,6 +263,7 @@
taste_description = "salt" // because they're bathsalts?
var/datum/brain_trauma/special/psychotic_brawling/bath_salts/rage
pH = 8.2
+ value = REAGENT_VALUE_RARE
/datum/reagent/drug/bath_salts/on_mob_metabolize(mob/living/L)
..()
@@ -285,7 +288,7 @@
M.adjustStaminaLoss(-5, 0)
M.adjustOrganLoss(ORGAN_SLOT_BRAIN, 4)
M.hallucination += 5
- if(CHECK_MOBILITY(M, MOBILITY_MOVE) && !ismovableatom(M.loc))
+ if(CHECK_MOBILITY(M, MOBILITY_MOVE) && !ismovable(M.loc))
step(M, pick(GLOB.cardinals))
step(M, pick(GLOB.cardinals))
..()
@@ -293,7 +296,7 @@
/datum/reagent/drug/bath_salts/overdose_process(mob/living/M)
M.hallucination += 5
- if(CHECK_MOBILITY(M, MOBILITY_MOVE) && !ismovableatom(M.loc))
+ if(CHECK_MOBILITY(M, MOBILITY_MOVE) && !ismovable(M.loc))
for(var/i in 1 to 8)
step(M, pick(GLOB.cardinals))
if(prob(20))
@@ -304,7 +307,7 @@
/datum/reagent/drug/bath_salts/addiction_act_stage1(mob/living/M)
M.hallucination += 10
- if(CHECK_MOBILITY(M, MOBILITY_MOVE) && !ismovableatom(M.loc))
+ if(CHECK_MOBILITY(M, MOBILITY_MOVE) && !ismovable(M.loc))
for(var/i = 0, i < 8, i++)
step(M, pick(GLOB.cardinals))
M.Jitter(5)
@@ -315,7 +318,7 @@
/datum/reagent/drug/bath_salts/addiction_act_stage2(mob/living/M)
M.hallucination += 20
- if(CHECK_MOBILITY(M, MOBILITY_MOVE) && !ismovableatom(M.loc))
+ if(CHECK_MOBILITY(M, MOBILITY_MOVE) && !ismovable(M.loc))
for(var/i = 0, i < 8, i++)
step(M, pick(GLOB.cardinals))
M.Jitter(10)
@@ -327,7 +330,7 @@
/datum/reagent/drug/bath_salts/addiction_act_stage3(mob/living/M)
M.hallucination += 30
- if(CHECK_MOBILITY(M, MOBILITY_MOVE) && !ismovableatom(M.loc))
+ if(CHECK_MOBILITY(M, MOBILITY_MOVE) && !ismovable(M.loc))
for(var/i = 0, i < 12, i++)
step(M, pick(GLOB.cardinals))
M.Jitter(15)
@@ -339,7 +342,7 @@
/datum/reagent/drug/bath_salts/addiction_act_stage4(mob/living/carbon/human/M)
M.hallucination += 30
- if(CHECK_MOBILITY(M, MOBILITY_MOVE) && !ismovableatom(M.loc))
+ if(CHECK_MOBILITY(M, MOBILITY_MOVE) && !ismovable(M.loc))
for(var/i = 0, i < 16, i++)
step(M, pick(GLOB.cardinals))
M.Jitter(50)
@@ -357,6 +360,7 @@
reagent_state = LIQUID
color = "#78FFF0"
pH = 9.2
+ value = REAGENT_VALUE_RARE
/datum/reagent/drug/aranesp/on_mob_life(mob/living/carbon/M)
var/high_message = pick("You feel amped up.", "You feel ready.", "You feel like you can push it to the limit.")
@@ -378,6 +382,7 @@
addiction_threshold = 10
overdose_threshold = 20
pH = 10.5
+ value = REAGENT_VALUE_RARE
/datum/reagent/drug/happiness/on_mob_add(mob/living/L)
..()
@@ -457,10 +462,11 @@
addiction_stage3_end = 40
addiction_stage4_end = 240
pH = 12.5
+ value = REAGENT_VALUE_EXCEPTIONAL
/datum/reagent/drug/skooma/on_mob_metabolize(mob/living/L)
. = ..()
- L.add_movespeed_modifier(type, update=TRUE, priority=100, multiplicative_slowdown=-1, blacklisted_movetypes=(FLYING|FLOATING))
+ L.add_movespeed_modifier(/datum/movespeed_modifier/reagent/skooma)
L.next_move_modifier *= 2
if(ishuman(L))
var/mob/living/carbon/human/H = L
@@ -473,7 +479,7 @@
/datum/reagent/drug/skooma/on_mob_end_metabolize(mob/living/L)
. = ..()
- L.remove_movespeed_modifier(type)
+ L.remove_movespeed_modifier(/datum/movespeed_modifier/reagent/skooma)
L.next_move_modifier *= 0.5
if(ishuman(L))
var/mob/living/carbon/human/H = L
@@ -521,3 +527,35 @@
if(prob(40))
M.emote(pick("twitch","drool","moan"))
..()
+
+/datum/reagent/syndicateadrenals
+ name = "Syndicate Adrenaline"
+ description = "Regenerates your stamina and increases your reaction time."
+ color = "#E62111"
+ overdose_threshold = 6
+ value = REAGENT_VALUE_VERY_RARE
+
+/datum/reagent/syndicateadrenals/on_mob_life(mob/living/M)
+ M.adjustStaminaLoss(-5*REM)
+ . = ..()
+
+/datum/reagent/syndicateadrenals/on_mob_metabolize(mob/living/M)
+ . = ..()
+ if(istype(M))
+ M.next_move_modifier *= 0.5
+ to_chat(M, "You feel an intense surge of energy rushing through your veins.")
+
+/datum/reagent/syndicateadrenals/on_mob_end_metabolize(mob/living/M)
+ . = ..()
+ if(istype(M))
+ M.next_move_modifier *= 2
+ to_chat(M, "You feel as though the world around you is going faster.")
+
+/datum/reagent/syndicateadrenals/overdose_start(mob/living/M)
+ to_chat(M, "You feel an intense pain in your chest...")
+
+/datum/reagent/syndicateadrenals/overdose_process(mob/living/M)
+ if(iscarbon(M))
+ var/mob/living/carbon/C = M
+ if(!C.undergoing_cardiac_arrest())
+ C.set_heartattack(TRUE)
diff --git a/code/modules/reagents/chemistry/reagents/food_reagents.dm b/code/modules/reagents/chemistry/reagents/food_reagents.dm
index 39b687c64a..c7ff3f01c9 100644
--- a/code/modules/reagents/chemistry/reagents/food_reagents.dm
+++ b/code/modules/reagents/chemistry/reagents/food_reagents.dm
@@ -11,7 +11,7 @@
name = "Consumable"
taste_description = "generic food"
taste_mult = 4
- value = 0.1
+ value = REAGENT_VALUE_VERY_COMMON
var/nutriment_factor = 1 * REAGENTS_METABOLISM
var/quality = 0 //affects mood, typically higher for mixed drinks with more complex recipes
@@ -35,15 +35,13 @@
SEND_SIGNAL(M, COMSIG_ADD_MOOD_EVENT, "quality_drink", /datum/mood_event/quality_fantastic)
if (RACE_DRINK)
SEND_SIGNAL(M, COMSIG_ADD_MOOD_EVENT, "quality_drink", /datum/mood_event/race_drink)
- if (FOOD_AMAZING)
- SEND_SIGNAL(M, COMSIG_ADD_MOOD_EVENT, "quality_food", /datum/mood_event/amazingtaste)
return ..()
/datum/reagent/consumable/nutriment
name = "Nutriment"
description = "All the vitamins, minerals, and carbohydrates the body needs in pure form."
reagent_state = SOLID
- nutriment_factor = 15 * REAGENTS_METABOLISM
+ nutriment_factor = 10 * REAGENTS_METABOLISM
color = "#664330" // rgb: 102, 67, 48
var/brute_heal = 1
@@ -92,8 +90,8 @@
/datum/reagent/consumable/nutriment/vitamin
name = "Vitamin"
description = "All the best vitamins, minerals, and carbohydrates the body needs in pure form."
- value = 0.5
-
+ value = REAGENT_VALUE_COMMON
+ nutriment_factor = 15 * REAGENTS_METABOLISM //The are the best food for you!
brute_heal = 1
burn_heal = 1
@@ -107,9 +105,9 @@
description = "A variety of cooking oil derived from fat or plants. Used in food preparation and frying."
color = "#EADD6B" //RGB: 234, 221, 107 (based off of canola oil)
taste_mult = 0.8
- value = 1
+ value = REAGENT_VALUE_COMMON
taste_description = "oil"
- nutriment_factor = 7 * REAGENTS_METABOLISM //Not very healthy on its own
+ nutriment_factor = 5 * REAGENTS_METABOLISM //Not very healthy on its own
metabolization_rate = 10 * REAGENTS_METABOLISM
var/fry_temperature = 450 //Around ~350 F (117 C) which deep fryers operate around in the real world
var/boiling //Used in mob life to determine if the oil kills, and only on touch application
@@ -153,11 +151,11 @@
reagent_state = SOLID
color = "#FFFFFF" // rgb: 255, 255, 255
taste_mult = 1.5 // stop sugar drowning out other flavours
- nutriment_factor = 5 * REAGENTS_METABOLISM
+ nutriment_factor = 3 * REAGENTS_METABOLISM
metabolization_rate = 2 * REAGENTS_METABOLISM
overdose_threshold = 200 // Hyperglycaemic shock
taste_description = "sweetness"
- value = 1
+ value = REAGENT_VALUE_NONE
/datum/reagent/consumable/sugar/overdose_start(mob/living/M)
to_chat(M, "You go into hyperglycaemic shock! Lay off the twinkies!")
@@ -179,21 +177,21 @@
/datum/reagent/consumable/soysauce
name = "Soysauce"
description = "A salty sauce made from the soy plant."
- nutriment_factor = 2 * REAGENTS_METABOLISM
color = "#792300" // rgb: 121, 35, 0
taste_description = "umami"
+ value = REAGENT_VALUE_COMMON
/datum/reagent/consumable/ketchup
name = "Ketchup"
description = "Ketchup, catsup, whatever. It's tomato paste."
- nutriment_factor = 5 * REAGENTS_METABOLISM
+ nutriment_factor = 3 * REAGENTS_METABOLISM
color = "#731008" // rgb: 115, 16, 8
taste_description = "ketchup"
/datum/reagent/consumable/mustard
name = "Mustard"
description = "Mustard, mostly used on hotdogs, corndogs and burgers."
- nutriment_factor = 5 * REAGENTS_METABOLISM
+ nutriment_factor = 3 * REAGENTS_METABOLISM
color = "#DDED26" // rgb: 221, 237, 38
taste_description = "mustard"
@@ -233,7 +231,7 @@
description = "A special oil that noticably chills the body. Extracted from Icepeppers and slimes."
color = "#8BA6E9" // rgb: 139, 166, 233
taste_description = "mint"
- value = 2
+ value = REAGENT_VALUE_COMMON
pH = 13 //HMM! I wonder
/datum/reagent/consumable/frostoil/on_mob_life(mob/living/carbon/M)
@@ -378,14 +376,13 @@
name = "Coco Powder"
description = "A fatty, bitter paste made from coco beans."
reagent_state = SOLID
- nutriment_factor = 5 * REAGENTS_METABOLISM
+ nutriment_factor = 3 * REAGENTS_METABOLISM
color = "#302000" // rgb: 48, 32, 0
taste_description = "bitterness"
/datum/reagent/consumable/hot_coco
name = "Hot Chocolate"
description = "Made with love! And coco beans."
- nutriment_factor = 3 * REAGENTS_METABOLISM
color = "#660000" // rgb: 221, 202, 134
taste_description = "creamy chocolate"
glass_icon_state = "chocolateglass"
@@ -403,6 +400,7 @@
metabolization_rate = 0.2 * REAGENTS_METABOLISM
taste_description = "mushroom"
pH = 11
+ value = REAGENT_VALUE_COMMON
/datum/reagent/drug/mushroomhallucinogen/on_mob_life(mob/living/carbon/M)
M.slurring = max(M.slurring,50)
@@ -433,6 +431,7 @@
color = "#FEFEFE"
taste_description = "garlic"
metabolization_rate = 0.15 * REAGENTS_METABOLISM
+ value = REAGENT_VALUE_COMMON
/datum/reagent/consumable/garlic/on_mob_life(mob/living/carbon/M)
if(isvampire(M)) //incapacitating but not lethal. Unfortunately, vampires cannot vomit.
@@ -463,7 +462,7 @@
M.emote("scream")
if(prob(min(5, current_cycle)) && iscarbon(M))
var/mob/living/carbon/C
- C.vomit()
+ C.vomit()
if(INJECT)
if(prob(min(20, current_cycle)))
to_chat(M, "You feel like your veins are boiling!")
@@ -472,10 +471,10 @@
..()
/datum/reagent/consumable/sprinkles
name = "Sprinkles"
- value = 3
description = "Multi-colored little bits of sugar, commonly found on donuts. Loved by cops."
color = "#FF00FF" // rgb: 255, 0, 255
taste_description = "childhood whimsy"
+ value = REAGENT_VALUE_COMMON
/datum/reagent/consumable/sprinkles/on_mob_life(mob/living/carbon/M)
if(M.mind && HAS_TRAIT(M.mind, TRAIT_LAW_ENFORCEMENT_METABOLISM))
@@ -487,15 +486,15 @@
name = "Peanut Butter"
description = "A popular food paste made from ground dry-roasted peanuts."
color = "#C29261"
- value = 3
- nutriment_factor = 15 * REAGENTS_METABOLISM
+ value = REAGENT_VALUE_UNCOMMON
+ nutriment_factor = 10 * REAGENTS_METABOLISM
taste_description = "peanuts"
/datum/reagent/consumable/cornoil
name = "Corn Oil"
description = "An oil derived from various types of corn."
- nutriment_factor = 20 * REAGENTS_METABOLISM
- value = 4
+ nutriment_factor = 12 * REAGENTS_METABOLISM
+ value = REAGENT_VALUE_UNCOMMON
color = "#302000" // rgb: 48, 32, 0
taste_description = "slime"
@@ -513,7 +512,7 @@
/datum/reagent/consumable/enzyme
name = "Universal Enzyme"
- value = 1
+ value = REAGENT_VALUE_COMMON
description = "A universal enzyme used in the preperation of certain chemicals and foods."
color = "#365E30" // rgb: 54, 94, 48
taste_description = "sweetness"
@@ -549,7 +548,6 @@
/datum/reagent/consumable/flour
name = "Flour"
- value = 0.5
description = "This is what you rub all over yourself to pretend to be a ghost."
reagent_state = SOLID
color = "#FFFFFF" // rgb: 0, 0, 0
@@ -566,19 +564,18 @@
name = "Cherry Jelly"
description = "Totally the best. Only to be spread on foods with excellent lateral symmetry."
color = "#801E28" // rgb: 128, 30, 40
- value = 1
+ value = REAGENT_VALUE_COMMON
taste_description = "cherry"
/datum/reagent/consumable/bluecherryjelly
name = "Blue Cherry Jelly"
description = "Blue and tastier kind of cherry jelly."
color = "#00F0FF"
- value = 12
+ value = REAGENT_VALUE_UNCOMMON
taste_description = "blue cherry"
/datum/reagent/consumable/rice
name = "Rice"
- value = 0.5
description = "tiny nutritious grains"
reagent_state = SOLID
nutriment_factor = 3 * REAGENTS_METABOLISM
@@ -587,7 +584,7 @@
/datum/reagent/consumable/vanilla
name = "Vanilla Powder"
- value = 1
+ value = REAGENT_VALUE_UNCOMMON
description = "A fatty, bitter paste made from vanilla pods."
reagent_state = SOLID
nutriment_factor = 5 * REAGENTS_METABOLISM
@@ -596,7 +593,6 @@
/datum/reagent/consumable/eggyolk
name = "Egg Yolk"
- value = 1
description = "It's full of protein."
nutriment_factor = 3 * REAGENTS_METABOLISM
color = "#FFB500"
@@ -604,14 +600,13 @@
/datum/reagent/consumable/corn_starch
name = "Corn Starch"
- value = 2
description = "A slippery solution."
color = "#f7f6e4"
taste_description = "slime"
/datum/reagent/consumable/corn_syrup
name = "Corn Syrup"
- value = 1
+ value = REAGENT_VALUE_UNCOMMON
description = "Decays into sugar."
color = "#fff882"
metabolization_rate = 3 * REAGENTS_METABOLISM
@@ -625,8 +620,8 @@
name = "honey"
description = "Sweet sweet honey that decays into sugar. Has antibacterial and natural healing properties."
color = "#d3a308"
- value = 15
- nutriment_factor = 15 * REAGENTS_METABOLISM
+ value = REAGENT_VALUE_COMMON
+ nutriment_factor = 10 * REAGENTS_METABOLISM
metabolization_rate = 1 * REAGENTS_METABOLISM
taste_description = "sweetness"
@@ -653,6 +648,7 @@
color = "#DFDFDF"
value = 5
taste_description = "mayonnaise"
+ value = REAGENT_VALUE_COMMON
/datum/reagent/consumable/tearjuice
name = "Tear Juice"
@@ -660,6 +656,7 @@
color = "#c0c9a0"
taste_description = "bitterness"
pH = 5
+ value = REAGENT_VALUE_COMMON
/datum/reagent/consumable/tearjuice/reaction_mob(mob/living/M, method=TOUCH, reac_volume)
if(!istype(M))
@@ -696,8 +693,9 @@
name = "Stabilized Nutriment"
description = "A bioengineered protien-nutrient structure designed to decompose in high saturation. In layman's terms, it won't get you fat."
reagent_state = SOLID
- nutriment_factor = 15 * REAGENTS_METABOLISM
+ nutriment_factor = 12 * REAGENTS_METABOLISM
color = "#664330" // rgb: 102, 67, 48
+ value = REAGENT_VALUE_RARE
/datum/reagent/consumable/nutriment/stabilized/on_mob_life(mob/living/carbon/M)
if(M.nutrition > NUTRITION_LEVEL_FULL - 25)
@@ -713,6 +711,7 @@
color = "#1d043d"
taste_description = "bitter mushroom"
pH = 12
+ value = REAGENT_VALUE_RARE
/datum/reagent/consumable/entpoly/on_mob_life(mob/living/carbon/M)
if(current_cycle >= 10)
@@ -733,6 +732,7 @@
color = "#b5a213"
taste_description = "tingling mushroom"
pH = 11.2
+ value = REAGENT_VALUE_RARE
/datum/reagent/consumable/tinlux/reaction_mob(mob/living/M)
M.set_light(2)
@@ -747,6 +747,7 @@
nutriment_factor = 3 * REAGENTS_METABOLISM
taste_description = "fruity mushroom"
pH = 10.4
+ value = REAGENT_VALUE_RARE
/datum/reagent/consumable/vitfro/on_mob_life(mob/living/carbon/M)
if(prob(80))
@@ -807,11 +808,12 @@
/datum/reagent/consumable/caramel
name = "Caramel"
description = "Who would have guessed that heated sugar could be so delicious?"
- nutriment_factor = 10 * REAGENTS_METABOLISM
+ nutriment_factor = 4 * REAGENTS_METABOLISM
color = "#D98736"
taste_mult = 2
taste_description = "caramel"
reagent_state = SOLID
+ value = REAGENT_VALUE_COMMON
/datum/reagent/consumable/secretsauce
name = "secret sauce"
@@ -819,10 +821,20 @@
nutriment_factor = 2 * REAGENTS_METABOLISM
color = "#792300"
taste_description = "indescribable"
- quality = FOOD_AMAZING
taste_mult = 100
can_synth = FALSE
pH = 6.1
+ value = REAGENT_VALUE_AMAZING
+
+/datum/reagent/consumable/secretsauce/reaction_obj(obj/O, reac_volume)
+ //splashing any amount above or equal to 1u of secret sauce onto a piece of food turns its quality to 100
+ if(reac_volume >= 1 && isfood(O))
+ var/obj/item/reagent_containers/food/splashed_food = O
+ splashed_food.adjust_food_quality(100)
+ // if it's a customisable food, we need to edit its total quality too, to prevent its quality resetting from adding more ingredients!
+ if(istype(O, /obj/item/reagent_containers/food/snacks/customizable))
+ var/obj/item/reagent_containers/food/snacks/customizable/splashed_custom_food = O
+ splashed_custom_food.total_quality += 10000
/datum/reagent/consumable/char
name = "Char"
@@ -833,6 +845,7 @@
taste_mult = 6
taste_description = "smoke"
overdose_threshold = 25
+ value = REAGENT_VALUE_COMMON
/datum/reagent/consumable/char/overdose_process(mob/living/carbon/M)
if(prob(10))
@@ -845,3 +858,4 @@
color = "#78280A" // rgb: 120 40, 10
taste_mult = 2.5 //sugar's 1.5, capsacin's 1.5, so a good middle ground.
taste_description = "smokey sweetness"
+ value = REAGENT_VALUE_COMMON
diff --git a/code/modules/reagents/chemistry/reagents/medicine_reagents.dm b/code/modules/reagents/chemistry/reagents/medicine_reagents.dm
index c758f7c37d..e4973dd2d5 100644
--- a/code/modules/reagents/chemistry/reagents/medicine_reagents.dm
+++ b/code/modules/reagents/chemistry/reagents/medicine_reagents.dm
@@ -7,8 +7,8 @@
/datum/reagent/medicine
name = "Medicine"
- value = 2
taste_description = "bitterness"
+ value = REAGENT_VALUE_VERY_COMMON //Low prices, spess medical companies are cheapstakes and products are taxed honk...
/datum/reagent/medicine/on_mob_life(mob/living/carbon/M)
current_cycle++
@@ -19,6 +19,7 @@
description = "Leporazine will effectively regulate a patient's body temperature, ensuring it never leaves safe levels."
pH = 8.4
color = "#82b8aa"
+ value = REAGENT_VALUE_COMMON
/datum/reagent/medicine/leporazine/on_mob_life(mob/living/carbon/M)
if(M.bodytemperature > BODYTEMP_NORMAL)
@@ -33,6 +34,7 @@
color = "#ffffff"
can_synth = FALSE
taste_description = "badmins"
+ value = REAGENT_VALUE_GLORIOUS
/datum/reagent/medicine/adminordrazine/on_mob_life(mob/living/carbon/M)
M.reagents.remove_all_type(/datum/reagent/toxin, 5*REM, 0, 1)
@@ -101,6 +103,7 @@
description = "Reduces drowsiness, hallucinations, and Histamine from body."
color = "#EC536D" // rgb: 236, 83, 109
pH = 5.2
+ value = REAGENT_VALUE_COMMON
/datum/reagent/medicine/synaphydramine/on_mob_life(mob/living/carbon/M)
M.drowsyness = max(M.drowsyness-5, 0)
@@ -131,6 +134,7 @@
color = "#0000C8"
taste_description = "sludge"
pH = 11
+ value = REAGENT_VALUE_COMMON
/datum/reagent/medicine/cryoxadone/on_mob_life(mob/living/carbon/M)
var/power = -0.00003 * (M.bodytemperature ** 2) + 3
@@ -152,6 +156,7 @@
taste_description = "muscle"
metabolization_rate = 1.5 * REAGENTS_METABOLISM
pH = 13
+ value = REAGENT_VALUE_COMMON
/datum/reagent/medicine/clonexadone/on_mob_life(mob/living/carbon/M)
if(M.bodytemperature < T0C)
@@ -167,6 +172,7 @@
color = "#f7832a"
taste_description = "spicy jelly"
pH = 12
+ value = REAGENT_VALUE_UNCOMMON
/datum/reagent/medicine/pyroxadone/on_mob_life(mob/living/carbon/M)
if(M.bodytemperature > BODYTEMP_HEAT_DAMAGE_LIMIT)
@@ -198,7 +204,7 @@
overdose_threshold = 30
taste_description = "fish"
pH = 12.2
- value = 20
+ value = REAGENT_VALUE_RARE
/datum/reagent/medicine/rezadone/on_mob_life(mob/living/carbon/M)
M.setCloneLoss(0) //Rezadone is almost never used in favor of cryoxadone. Hopefully this will change that.
@@ -239,7 +245,6 @@
color = "#ffeac9"
metabolization_rate = 5 * REAGENTS_METABOLISM
overdose_threshold = 50
- value = 3
/datum/reagent/medicine/silver_sulfadiazine/reaction_obj(obj/O, reac_volume)
if(istype(O, /obj/item/stack/medical/gauze))
@@ -284,7 +289,7 @@
metabolization_rate = 0.5 * REAGENTS_METABOLISM
overdose_threshold = 25
pH = 10.7
- value = 4
+ value = REAGENT_VALUE_COMMON
/datum/reagent/medicine/oxandrolone/on_mob_life(mob/living/carbon/M)
if(M.getFireLoss() > 25)
@@ -308,7 +313,6 @@
pH = 6.7
metabolization_rate = 5 * REAGENTS_METABOLISM
overdose_threshold = 50
- value = 3
/datum/reagent/medicine/styptic_powder/reaction_mob(mob/living/M, method=TOUCH, reac_volume, show_message = 1)
if(iscarbon(M) && M.stat != DEAD)
@@ -356,7 +360,6 @@ datum/reagent/medicine/styptic_powder/overdose_start(mob/living/M)
var/last_added = 0
var/maximum_reachable = BLOOD_VOLUME_NORMAL - 10 //So that normal blood regeneration can continue with salglu active
pH = 5.5
- value = 1
/datum/reagent/medicine/salglu_solution/on_mob_life(mob/living/carbon/M)
if((HAS_TRAIT(M, TRAIT_NOMARROW)))
@@ -397,6 +400,7 @@ datum/reagent/medicine/styptic_powder/overdose_start(mob/living/M)
color = "#6D6374"
metabolization_rate = 0.4 * REAGENTS_METABOLISM
pH = 2.6
+ value = REAGENT_VALUE_COMMON
/datum/reagent/medicine/mine_salve/on_mob_life(mob/living/carbon/C)
C.hal_screwyhud = SCREWYHUD_HEALTHY
@@ -437,7 +441,7 @@ datum/reagent/medicine/styptic_powder/overdose_start(mob/living/M)
pH = 11.5
metabolization_rate = 5 * REAGENTS_METABOLISM
overdose_threshold = 40
- value = 6
+ value = REAGENT_VALUE_COMMON
/datum/reagent/medicine/synthflesh/reaction_mob(mob/living/M, method=TOUCH, reac_volume, show_message = 1)
if(iscarbon(M))
@@ -474,7 +478,6 @@ datum/reagent/medicine/styptic_powder/overdose_start(mob/living/M)
metabolization_rate = 0.5 * REAGENTS_METABOLISM
taste_description = "ash"
pH = 5
- value = 1
/datum/reagent/medicine/charcoal/on_mob_life(mob/living/carbon/M)
M.adjustToxLoss(-2*REM, 0)
@@ -493,7 +496,7 @@ datum/reagent/medicine/styptic_powder/overdose_start(mob/living/M)
metabolization_rate = 0.25 * REAGENTS_METABOLISM
overdose_threshold = 30
pH = 2
- value = 5
+ value = REAGENT_VALUE_UNCOMMON
/datum/reagent/medicine/omnizine/on_mob_life(mob/living/carbon/M)
M.adjustToxLoss(-0.5*REM, 0)
@@ -550,6 +553,7 @@ datum/reagent/medicine/styptic_powder/overdose_start(mob/living/M)
color = "#003153" // RGB 0, 49, 83
metabolization_rate = 0.5 * REAGENTS_METABOLISM
pH = 8.9
+ value = REAGENT_VALUE_COMMON //uncraftable
/datum/reagent/medicine/prussian_blue/on_mob_life(mob/living/carbon/M)
if(M.radiation > 0)
@@ -563,6 +567,7 @@ datum/reagent/medicine/styptic_powder/overdose_start(mob/living/M)
color = "#E6FFF0"
metabolization_rate = 0.5 * REAGENTS_METABOLISM
pH = 1 //One of the best buffers, NEVERMIND!
+ value = REAGENT_VALUE_UNCOMMON
var/healtoxinlover = FALSE
/datum/reagent/medicine/pen_acid/on_mob_life(mob/living/carbon/M)
@@ -581,6 +586,7 @@ datum/reagent/medicine/styptic_powder/overdose_start(mob/living/M)
color = "#91D865"
healtoxinlover = TRUE
pH = 12//invert
+ value = REAGENT_VALUE_RARE
/datum/reagent/medicine/sal_acid
name = "Salicyclic Acid"
@@ -590,6 +596,7 @@ datum/reagent/medicine/styptic_powder/overdose_start(mob/living/M)
metabolization_rate = 0.5 * REAGENTS_METABOLISM
overdose_threshold = 25
pH = 2.1
+ value = REAGENT_VALUE_COMMON
/datum/reagent/medicine/sal_acid/on_mob_life(mob/living/carbon/M)
@@ -701,6 +708,7 @@ datum/reagent/medicine/styptic_powder/overdose_start(mob/living/M)
color = "#64FFE6"
metabolization_rate = 0.5 * REAGENTS_METABOLISM
pH = 11.5
+ value = REAGENT_VALUE_COMMON
/datum/reagent/medicine/diphenhydramine/on_mob_life(mob/living/carbon/M)
if(prob(10))
@@ -721,10 +729,10 @@ datum/reagent/medicine/styptic_powder/overdose_start(mob/living/M)
/datum/reagent/medicine/morphine/on_mob_metabolize(mob/living/L)
..()
- L.ignore_slowdown(type)
+ L.add_movespeed_mod_immunities(type, list(/datum/movespeed_modifier/damage_slowdown, /datum/movespeed_modifier/damage_slowdown_flying, /datum/movespeed_modifier/monkey_health_speedmod))
/datum/reagent/medicine/morphine/on_mob_end_metabolize(mob/living/L)
- L.unignore_slowdown(type)
+ L.remove_movespeed_mod_immunities(type, list(/datum/movespeed_modifier/damage_slowdown, /datum/movespeed_modifier/damage_slowdown_flying, /datum/movespeed_modifier/monkey_health_speedmod))
..()
/datum/reagent/medicine/morphine/on_mob_life(mob/living/carbon/M)
@@ -816,6 +824,7 @@ datum/reagent/medicine/styptic_powder/overdose_start(mob/living/M)
metabolization_rate = 0.25 * REAGENTS_METABOLISM
overdose_threshold = 35
pH = 12
+ value = REAGENT_VALUE_UNCOMMON
/datum/reagent/medicine/atropine/on_mob_life(mob/living/carbon/M)
if(M.health < 0)
@@ -880,6 +889,7 @@ datum/reagent/medicine/styptic_powder/overdose_start(mob/living/M)
metabolization_rate = 0.5 * REAGENTS_METABOLISM
taste_description = "magnets"
pH = 0
+ value = REAGENT_VALUE_RARE
/datum/reagent/medicine/strange_reagent/reaction_mob(mob/living/M, method=TOUCH, reac_volume)
if(M.stat == DEAD)
@@ -1003,14 +1013,15 @@ datum/reagent/medicine/styptic_powder/overdose_start(mob/living/M)
metabolization_rate = 0.5 * REAGENTS_METABOLISM
overdose_threshold = 60
pH = 8.7
+ value = REAGENT_VALUE_RARE
/datum/reagent/medicine/stimulants/on_mob_metabolize(mob/living/L)
..()
- L.add_movespeed_modifier(type, update=TRUE, priority=100, multiplicative_slowdown=-0.5, blacklisted_movetypes=(FLYING|FLOATING))
+ L.add_movespeed_modifier(/datum/movespeed_modifier/reagent/stimulants)
ADD_TRAIT(L, TRAIT_TASED_RESISTANCE, type)
/datum/reagent/medicine/stimulants/on_mob_end_metabolize(mob/living/L)
- L.remove_movespeed_modifier(type)
+ L.remove_movespeed_modifier(/datum/movespeed_modifier/reagent/stimulants)
REMOVE_TRAIT(L, TRAIT_TASED_RESISTANCE, type)
..()
@@ -1167,6 +1178,7 @@ datum/reagent/medicine/styptic_powder/overdose_start(mob/living/M)
reagent_state = LIQUID
color = "#91D865"
taste_description = "jelly"
+ value = REAGENT_VALUE_COMMON
/datum/reagent/medicine/regen_jelly/on_mob_life(mob/living/carbon/M)
M.adjustBruteLoss(-1.5*REM, FALSE)
@@ -1182,6 +1194,7 @@ datum/reagent/medicine/styptic_powder/overdose_start(mob/living/M)
reagent_state = SOLID
color = "#555555"
pH = 11
+ value = REAGENT_VALUE_EXCEPTIONAL
/datum/reagent/medicine/syndicate_nanites/on_mob_life(mob/living/carbon/M)
M.adjustBruteLoss(-5*REM, FALSE) //A ton of healing - this is a 50 telecrystal investment.
@@ -1202,6 +1215,7 @@ datum/reagent/medicine/styptic_powder/overdose_start(mob/living/M)
reagent_state = SOLID
color = "#555555"
pH = 11
+ value = REAGENT_VALUE_VERY_RARE
/datum/reagent/medicine/lesser_syndicate_nanites/on_mob_life(mob/living/carbon/M)
M.adjustBruteLoss(-3*REM, FALSE) // hidden gold shh
@@ -1225,6 +1239,7 @@ datum/reagent/medicine/styptic_powder/overdose_start(mob/living/M)
overdose_threshold = 30
taste_description = "jelly"
pH = 11.8
+ value = REAGENT_VALUE_UNCOMMON
/datum/reagent/medicine/neo_jelly/on_mob_life(mob/living/carbon/M)
M.adjustBruteLoss(-1.5*REM, FALSE)
@@ -1247,6 +1262,7 @@ datum/reagent/medicine/styptic_powder/overdose_start(mob/living/M)
color = rgb(255, 175, 0)
overdose_threshold = 25
pH = 11
+ value = REAGENT_VALUE_COMMON //not any higher. Ambrosia is a milestone for hydroponics already.
/datum/reagent/medicine/earthsblood/on_mob_life(mob/living/carbon/M)
M.adjustBruteLoss(-3 * REM, FALSE)
@@ -1274,6 +1290,7 @@ datum/reagent/medicine/styptic_powder/overdose_start(mob/living/M)
color = "#27870a"
metabolization_rate = 0.4 * REAGENTS_METABOLISM
pH = 4.3
+ value = REAGENT_VALUE_UNCOMMON
/datum/reagent/medicine/haloperidol/on_mob_life(mob/living/carbon/M)
for(var/datum/reagent/drug/R in M.reagents.reagent_list)
@@ -1296,6 +1313,7 @@ datum/reagent/medicine/styptic_powder/overdose_start(mob/living/M)
overdose_threshold = 3 //To prevent people stacking massive amounts of a very strong healing reagent
can_synth = FALSE
pH = 14
+ value = REAGENT_VALUE_AMAZING
/datum/reagent/medicine/lavaland_extract/on_mob_life(mob/living/carbon/M)
M.heal_bodypart_damage(5,5)
@@ -1315,6 +1333,7 @@ datum/reagent/medicine/styptic_powder/overdose_start(mob/living/M)
description = "Reduces the duration of unconciousness, knockdown and stuns. Restores stamina, but deals toxin damage when overdosed."
color = "#918e53"
overdose_threshold = 30
+ value = REAGENT_VALUE_VERY_RARE
/datum/reagent/medicine/changelingadrenaline/on_mob_metabolize(mob/living/L)
..()
@@ -1342,13 +1361,14 @@ datum/reagent/medicine/styptic_powder/overdose_start(mob/living/M)
description = "Drastically increases movement speed, but deals toxin damage."
color = "#669153"
metabolization_rate = 1
+ value = REAGENT_VALUE_VERY_RARE
/datum/reagent/medicine/changelinghaste/on_mob_metabolize(mob/living/L)
..()
- L.add_movespeed_modifier(type, update=TRUE, priority=100, multiplicative_slowdown=-2, blacklisted_movetypes=(FLYING|FLOATING))
+ L.add_movespeed_modifier(/datum/movespeed_modifier/reagent/changelinghaste)
/datum/reagent/medicine/changelinghaste/on_mob_end_metabolize(mob/living/L)
- L.remove_movespeed_modifier(type)
+ L.remove_movespeed_modifier(/datum/movespeed_modifier/reagent/changelinghaste)
..()
/datum/reagent/medicine/changelinghaste/on_mob_life(mob/living/carbon/M)
@@ -1378,14 +1398,15 @@ datum/reagent/medicine/styptic_powder/overdose_start(mob/living/M)
/datum/reagent/medicine/muscle_stimulant
name = "Muscle Stimulant"
description = "A potent chemical that allows someone under its influence to be at full physical ability even when under massive amounts of pain."
+ value = REAGENT_VALUE_RARE
/datum/reagent/medicine/muscle_stimulant/on_mob_metabolize(mob/living/M)
. = ..()
- M.ignore_slowdown(type)
+ M.add_movespeed_mod_immunities(type, list(/datum/movespeed_modifier/damage_slowdown, /datum/movespeed_modifier/damage_slowdown_flying, /datum/movespeed_modifier/monkey_health_speedmod))
/datum/reagent/medicine/muscle_stimulant/on_mob_end_metabolize(mob/living/M)
. = ..()
- M.unignore_slowdown(type)
+ M.remove_movespeed_mod_immunities(type, list(/datum/movespeed_modifier/damage_slowdown, /datum/movespeed_modifier/damage_slowdown_flying, /datum/movespeed_modifier/monkey_health_speedmod))
/datum/reagent/medicine/modafinil
name = "Modafinil"
@@ -1395,6 +1416,7 @@ datum/reagent/medicine/styptic_powder/overdose_start(mob/living/M)
metabolization_rate = 0.1 * REAGENTS_METABOLISM
overdose_threshold = 20 // with the random effects this might be awesome or might kill you at less than 10u (extensively tested)
taste_description = "salt" // it actually does taste salty
+ value = REAGENT_VALUE_RARE
var/overdose_progress = 0 // to track overdose progress
pH = 7.89
@@ -1461,6 +1483,7 @@ datum/reagent/medicine/styptic_powder/overdose_start(mob/living/M)
metabolization_rate = 0.25 * REAGENTS_METABOLISM
overdose_threshold = 30
pH = 9.12
+ value = REAGENT_VALUE_COMMON
/datum/reagent/medicine/psicodine/on_mob_add(mob/living/L)
..()
@@ -1493,6 +1516,7 @@ datum/reagent/medicine/styptic_powder/overdose_start(mob/living/M)
reagent_state = SOLID
color = "#FFFFD0"
metabolization_rate = 1.5 * REAGENTS_METABOLISM
+ value = REAGENT_VALUE_UNCOMMON
/datum/reagent/medicine/silibinin/on_mob_life(mob/living/carbon/M)
M.adjustOrganLoss(ORGAN_SLOT_LIVER, -2)//Add a chance to cure liver trauma once implemented.
@@ -1507,6 +1531,7 @@ datum/reagent/medicine/styptic_powder/overdose_start(mob/living/M)
metabolization_rate = 0.25 * REAGENTS_METABOLISM
overdose_threshold = 50
taste_description = "numbing bitterness"
+ value = REAGENT_VALUE_RARE
/datum/reagent/medicine/polypyr/on_mob_life(mob/living/carbon/M) //I wanted a collection of small positive effects, this is as hard to obtain as coniine after all.
M.adjustOrganLoss(ORGAN_SLOT_LUNGS, -0.25)
diff --git a/code/modules/reagents/chemistry/reagents/other_reagents.dm b/code/modules/reagents/chemistry/reagents/other_reagents.dm
index 04c5d63b28..5fb27bd074 100644
--- a/code/modules/reagents/chemistry/reagents/other_reagents.dm
+++ b/code/modules/reagents/chemistry/reagents/other_reagents.dm
@@ -1,7 +1,7 @@
/datum/reagent/blood
data = list("donor"=null,"viruses"=null,"blood_DNA"=null, "bloodcolor" = BLOOD_COLOR_HUMAN, "blood_type"= null,"resistances"=null,"trace_chem"=null,"mind"=null,"ckey"=null,"gender"=null,"real_name"=null,"cloneable"=null,"factions"=null,"quirks"=null)
name = "Blood"
- value = 1
+ value = REAGENT_VALUE_UNCOMMON // $$$ blood ""donations"" $$$
color = BLOOD_COLOR_HUMAN // rgb: 200, 0, 0
description = "Blood from some creature."
metabolization_rate = 5 //fast rate so it disappears fast.
@@ -140,8 +140,9 @@
data = list("donor"=null,"viruses"=null,"blood_DNA"="REPLICATED", "bloodcolor" = BLOOD_COLOR_SYNTHETIC, "blood_type"="SY","resistances"=null,"trace_chem"=null,"mind"=null,"ckey"=null,"gender"=null,"real_name"=null,"cloneable"=null,"factions"=null)
name = "Synthetic Blood"
description = "A synthetically produced imitation of blood."
- taste_description = "oily"
+ taste_description = "oil"
color = BLOOD_COLOR_SYNTHETIC // rgb: 11, 7, 48
+ value = REAGENT_VALUE_NONE
/datum/reagent/blood/jellyblood
data = list("donor"=null,"viruses"=null,"blood_DNA"=null, "bloodcolor" = BLOOD_COLOR_SLIME, "blood_type"="GEL","resistances"=null,"trace_chem"=null,"mind"=null,"ckey"=null,"gender"=null,"real_name"=null,"cloneable"=null,"factions"=null)
@@ -158,6 +159,7 @@
description = "This highly resembles blood, but it doesnt actually function like it, resembling more ketchup, with a more blood-like consistency."
taste_description = "sap" //Like tree sap?
pH = 7.45
+ value = REAGENT_VALUE_NONE
/datum/reagent/blood/jellyblood/on_mob_life(mob/living/carbon/M)
if(prob(10))
@@ -271,9 +273,9 @@
/datum/reagent/water/reaction_obj(obj/O, reac_volume)
O.extinguish()
O.acid_level = 0
- // Monkey cube
- if(istype(O, /obj/item/reagent_containers/food/snacks/monkeycube))
- var/obj/item/reagent_containers/food/snacks/monkeycube/cube = O
+ // cubes
+ if(istype(O, /obj/item/reagent_containers/food/snacks/cube))
+ var/obj/item/reagent_containers/food/snacks/cube/cube = O
cube.Expand()
// Dehydrated carp
@@ -387,6 +389,7 @@
description = "Something that shouldn't exist on this plane of existence."
taste_description = "suffering"
pH = 6.5
+ value = REAGENT_VALUE_RARE
/datum/reagent/fuel/unholywater/reaction_mob(mob/living/M, method=TOUCH, reac_volume)
if(method == TOUCH || method == VAPOR)
@@ -423,6 +426,7 @@
name = "Hell Water"
description = "YOUR FLESH! IT BURNS!"
taste_description = "burning"
+ value = REAGENT_VALUE_VERY_RARE
/datum/reagent/hellwater/on_mob_life(mob/living/carbon/M)
M.fire_stacks = min(5,M.fire_stacks + 3)
@@ -437,6 +441,7 @@
name = "Zelus Oil"
description = "Oil blessed by a greater being."
taste_description = "metallic oil"
+ value = REAGENT_VALUE_RARE
/datum/reagent/fuel/holyoil/on_mob_life(mob/living/carbon/M)
if(is_servant_of_ratvar(M))
@@ -475,6 +480,7 @@
name = "Godblood"
description = "Slowly heals all damage types. Has a rather high overdose threshold. Glows with mysterious power."
overdose_threshold = 150
+ value = REAGENT_VALUE_RARE
/datum/reagent/lube
name = "Space Lube"
@@ -591,6 +597,7 @@
color = "#5EFF3B" //RGB: 94, 255, 59
metabolization_rate = INFINITY //So it instantly removes all of itself
taste_description = "slime"
+ value = REAGENT_VALUE_RARE
var/datum/species/race = /datum/species/human
var/mutationtext = "The pain subsides. You feel... human."
@@ -750,6 +757,7 @@
color = "#5EFF3B" //RGB: 94, 255, 59
taste_description = "slime"
metabolization_rate = 0.2
+ value = REAGENT_VALUE_RARE
/datum/reagent/slime_toxin/on_mob_life(mob/living/carbon/human/H)
..()
@@ -786,6 +794,7 @@
color = "#5EFF3B" //RGB: 94, 255, 59
metabolization_rate = INFINITY
taste_description = "slime"
+ value = REAGENT_VALUE_RARE
/datum/reagent/mulligan/on_mob_life(mob/living/carbon/human/H)
..()
@@ -800,6 +809,7 @@
description = "An advanced corruptive toxin produced by slimes."
color = "#13BC5E" // rgb: 19, 188, 94
taste_description = "slime"
+ value = REAGENT_VALUE_VERY_RARE
/datum/reagent/aslimetoxin/reaction_mob(mob/living/L, method=TOUCH, reac_volume)
if(method != TOUCH)
@@ -811,6 +821,7 @@
color = "#5EFF3B" //RGB: 94, 255, 59
can_synth = FALSE
taste_description = "decay"
+ value = REAGENT_VALUE_GLORIOUS
/datum/reagent/gluttonytoxin/reaction_mob(mob/living/L, method=TOUCH, reac_volume)
L.ForceContractDisease(new /datum/disease/transformation/morph(), FALSE, TRUE)
@@ -1121,6 +1132,7 @@
color = "#0000CC"
taste_description = "fizzling blue"
pH = 12
+ value = REAGENT_VALUE_RARE
/datum/reagent/bluespace/reaction_mob(mob/living/M, method=TOUCH, reac_volume)
if(method == TOUCH || method == VAPOR)
@@ -1247,6 +1259,7 @@
metabolization_rate = 1.5 * REAGENTS_METABOLISM
taste_description = "acid"
pH = 2
+ value = REAGENT_VALUE_RARE
/datum/reagent/space_cleaner/ez_clean/on_mob_life(mob/living/carbon/M)
M.adjustBruteLoss(3.33)
@@ -1298,6 +1311,7 @@
color = "#535E66" // rgb: 83, 94, 102
can_synth = FALSE
taste_description = "sludge"
+ value = REAGENT_VALUE_GLORIOUS
/datum/reagent/nanomachines/reaction_mob(mob/living/L, method=TOUCH, reac_volume, show_message = 1, touch_protection = 0)
if(method==PATCH || method==INGEST || method==INJECT || (method == VAPOR && prob(min(reac_volume,100)*(1 - touch_protection))))
@@ -1309,6 +1323,7 @@
color = "#535E66" // rgb: 83, 94, 102
can_synth = FALSE
taste_description = "sludge"
+ value = REAGENT_VALUE_GLORIOUS
/datum/reagent/xenomicrobes/reaction_mob(mob/living/L, method=TOUCH, reac_volume, show_message = 1, touch_protection = 0)
if(method==PATCH || method==INGEST || method==INJECT || (method == VAPOR && prob(min(reac_volume,100)*(1 - touch_protection))))
@@ -1321,6 +1336,7 @@
can_synth = FALSE
taste_description = "slime"
pH = 11
+ value = REAGENT_VALUE_GLORIOUS
/datum/reagent/fungalspores/reaction_mob(mob/living/L, method=TOUCH, reac_volume, show_message = 1, touch_protection = 0)
if(method==PATCH || method==INGEST || method==INJECT || (method == VAPOR && prob(min(reac_volume,100)*(1 - touch_protection))))
@@ -1348,6 +1364,7 @@
color = "#664B63" // rgb: 102, 75, 99
taste_description = "metal"
pH = 11.8
+ value = REAGENT_VALUE_UNCOMMON
/datum/reagent/ammonia
name = "Ammonia"
@@ -1425,6 +1442,7 @@
metabolization_rate = 1.5 * REAGENTS_METABOLISM
color = "E1A116"
taste_description = "sourness"
+ value = REAGENT_VALUE_EXCEPTIONAL
/datum/reagent/stimulum/on_mob_metabolize(mob/living/L)
..()
@@ -1450,13 +1468,14 @@
color = "90560B"
taste_description = "burning"
pH = 2
+ value = REAGENT_VALUE_VERY_RARE
/datum/reagent/nitryl/on_mob_metabolize(mob/living/L)
..()
- L.add_movespeed_modifier(type, update=TRUE, priority=100, multiplicative_slowdown=-1, blacklisted_movetypes=(FLYING|FLOATING))
+ L.add_movespeed_modifier(/datum/movespeed_modifier/reagent/nitryl)
/datum/reagent/nitryl/on_mob_end_metabolize(mob/living/L)
- L.remove_movespeed_modifier(type)
+ L.remove_movespeed_modifier(/datum/movespeed_modifier/reagent/nitryl)
..()
/////////////////////////Coloured Crayon Powder////////////////////////////
@@ -1471,6 +1490,7 @@
color = "#FFFFFF" // rgb: 207, 54, 0
taste_description = "the back of class"
no_mob_color = TRUE
+ value = REAGENT_VALUE_NONE
/datum/reagent/colorful_reagent/crayonpowder/New()
description = "\an [colorname] powder made by grinding down crayons, good for colouring chemical reagents."
@@ -1641,6 +1661,7 @@
color = "#FFFF00"
var/list/random_color_list = list("#00aedb","#a200ff","#f47835","#d41243","#d11141","#00b159","#00aedb","#f37735","#ffc425","#008744","#0057e7","#d62d20","#ffa700")
taste_description = "rainbows"
+ value = REAGENT_VALUE_RARE
var/no_mob_color = FALSE
/datum/reagent/colorful_reagent/on_mob_life(mob/living/carbon/M)
@@ -1670,6 +1691,7 @@
color = "#ff00dd"
var/list/potential_colors = list("0ad","a0f","f73","d14","d14","0b5","0ad","f73","fc2","084","05e","d22","fa0") // fucking hair code
taste_description = "sourness"
+ value = REAGENT_VALUE_RARE
/datum/reagent/hair_dye/reaction_mob(mob/living/M, method=TOUCH, reac_volume)
if(method == TOUCH || method == VAPOR)
@@ -1685,6 +1707,7 @@
reagent_state = LIQUID
color = "#fac34b"
taste_description = "sourness"
+ value = REAGENT_VALUE_UNCOMMON
/datum/reagent/barbers_aid/reaction_mob(mob/living/M, method=TOUCH, reac_volume)
if(method == TOUCH || method == VAPOR)
@@ -1702,6 +1725,7 @@
reagent_state = LIQUID
color = "#ffaf00"
taste_description = "sourness"
+ value = REAGENT_VALUE_RARE
/datum/reagent/concentrated_barbers_aid/reaction_mob(mob/living/M, method=TOUCH, reac_volume)
if(method == TOUCH || method == VAPOR)
@@ -1734,6 +1758,7 @@
color = "#A70FFF"
taste_description = "dryness"
pH = 10.7
+ value = REAGENT_VALUE_UNCOMMON
/datum/reagent/drying_agent/reaction_turf(turf/open/T, reac_volume)
if(istype(T))
@@ -1871,6 +1896,7 @@
color = "#00ff80"
taste_description = "strange honey"
pH = 3
+ value = REAGENT_VALUE_UNCOMMON
/datum/reagent/royal_bee_jelly/on_mob_life(mob/living/carbon/M)
if(prob(2))
@@ -1892,6 +1918,7 @@
can_synth = FALSE
taste_description = "brains"
pH = 0.5
+ value = REAGENT_VALUE_GLORIOUS
/datum/reagent/romerol/reaction_mob(mob/living/carbon/human/H, method=TOUCH, reac_volume)
// Silently add the zombie infection organ to be activated upon death
@@ -1905,6 +1932,7 @@
description = "An experimental serum which causes rapid muscular growth in Hominidae. Side-affects may include hypertrichosis, violent outbursts, and an unending affinity for bananas."
reagent_state = LIQUID
color = "#00f041"
+ value = REAGENT_VALUE_EXCEPTIONAL
/datum/reagent/magillitis/on_mob_life(mob/living/carbon/M)
..()
@@ -1916,6 +1944,7 @@
description = "A commercial chemical designed to help older men in the bedroom."//not really it just makes you a giant
color = "#ff0000"//strong red. rgb 255, 0, 0
var/current_size = RESIZE_DEFAULT_SIZE
+ value = REAGENT_VALUE_COMMON
taste_description = "bitterness" // apparently what viagra tastes like
/datum/reagent/growthserum/on_mob_life(mob/living/carbon/H)
@@ -1986,6 +2015,7 @@
color = "#AAAAAA55"
taste_description = "water"
metabolization_rate = 0.25 * REAGENTS_METABOLISM
+ value = REAGENT_VALUE_RARE
pH = 15
/datum/reagent/pax/on_mob_metabolize(mob/living/L)
@@ -2002,6 +2032,7 @@
color = "#FAFF00"
taste_description = "acrid cinnamon"
metabolization_rate = 0.2 * REAGENTS_METABOLISM
+ value = REAGENT_VALUE_UNCOMMON
/datum/reagent/bz_metabolites/on_mob_metabolize(mob/living/L)
..()
@@ -2022,18 +2053,20 @@
name = "synth-pax"
description = "A colorless liquid that suppresses violence on the subjects. Cheaper to synthetize, but wears out faster than normal Pax."
metabolization_rate = 1.5 * REAGENTS_METABOLISM
+ value = REAGENT_VALUE_COMMON
/datum/reagent/peaceborg_confuse
name = "Dizzying Solution"
description = "Makes the target off balance and dizzy"
metabolization_rate = 1.5 * REAGENTS_METABOLISM
taste_description = "dizziness"
+ value = REAGENT_VALUE_COMMON
/datum/reagent/peaceborg_confuse/on_mob_life(mob/living/carbon/M)
if(M.confused < 6)
- M.confused = CLAMP(M.confused + 3, 0, 5)
+ M.confused = clamp(M.confused + 3, 0, 5)
if(M.dizziness < 6)
- M.dizziness = CLAMP(M.dizziness + 3, 0, 5)
+ M.dizziness = clamp(M.dizziness + 3, 0, 5)
if(prob(20))
to_chat(M, "You feel confused and disorientated.")
..()
@@ -2043,6 +2076,7 @@
description = "An extremely weak stamina-toxin that tires out the target. Completely harmless."
metabolization_rate = 1.5 * REAGENTS_METABOLISM
taste_description = "tiredness"
+ value = REAGENT_VALUE_COMMON
/datum/reagent/peaceborg_tire/on_mob_life(mob/living/carbon/M)
var/healthcomp = (100 - M.health) //DOES NOT ACCOUNT FOR ADMINBUS THINGS THAT MAKE YOU HAVE MORE THAN 200/210 HEALTH, OR SOMETHING OTHER THAN A HUMAN PROCESSING THIS.
@@ -2058,6 +2092,7 @@
color = "#9A6750" //RGB: 154, 103, 80
taste_description = "inner peace"
can_synth = FALSE
+ value = REAGENT_VALUE_GLORIOUS
/datum/reagent/tranquility/reaction_mob(mob/living/L, method=TOUCH, reac_volume, show_message = 1, touch_protection = 0)
if(method==PATCH || method==INGEST || method==INJECT || (method == VAPOR && prob(min(reac_volume,100)*(1 - touch_protection))))
@@ -2068,6 +2103,7 @@
description = "The primary precursor for an ancient feline delicacy known as skooma. While it has no notable effects on it's own, mixing it with morphine in a chilled container may yield interesting results."
color = "#FAEAFF"
taste_description = "synthetic catnip"
+ value = REAGENT_VALUE_UNCOMMON
/datum/reagent/moonsugar/on_mob_life(mob/living/carbon/M)
if(prob(20))
@@ -2084,6 +2120,7 @@
var/datum/dna/original_dna
var/reagent_ticks = 0
chemical_flags = REAGENT_INVISIBLE
+ value = REAGENT_VALUE_GLORIOUS
/datum/reagent/changeling_string/on_mob_metabolize(mob/living/carbon/C)
if(ishuman(C) && C.dna && data["desired_dna"])
@@ -2119,6 +2156,7 @@
taste_description = "grass"
description = "A colorless liquid that makes people more peaceful and felines more happy."
metabolization_rate = 1.75 * REAGENTS_METABOLISM
+ value = REAGENT_VALUE_COMMON
/datum/reagent/pax/catnip/on_mob_life(mob/living/carbon/M)
if(prob(20))
diff --git a/code/modules/reagents/chemistry/reagents/pyrotechnic_reagents.dm b/code/modules/reagents/chemistry/reagents/pyrotechnic_reagents.dm
index 939d5c9707..67ff61610d 100644
--- a/code/modules/reagents/chemistry/reagents/pyrotechnic_reagents.dm
+++ b/code/modules/reagents/chemistry/reagents/pyrotechnic_reagents.dm
@@ -5,6 +5,7 @@
reagent_state = SOLID
color = "#550000"
taste_description = "sweet tasting metal"
+ value = REAGENT_VALUE_COMMON
/datum/reagent/thermite/reaction_turf(turf/T, reac_volume)
if(reac_volume >= 1)
@@ -21,13 +22,14 @@
description = "Nitroglycerin is a heavy, colorless, oily, explosive liquid obtained by nitrating glycerol."
color = "#808080" // rgb: 128, 128, 128
taste_description = "oil"
+ value = REAGENT_VALUE_EXCEPTIONAL
/datum/reagent/stabilizing_agent
name = "Stabilizing Agent"
description = "Keeps unstable chemicals stable. This does not work on everything."
reagent_state = LIQUID
color = "#FFFF00"
- value = 3
+ value = REAGENT_VALUE_VERY_COMMON
taste_description = "metal"
/datum/reagent/clf3
@@ -37,6 +39,7 @@
color = "#FFC8C8"
metabolization_rate = 4
taste_description = "burning"
+ value = REAGENT_VALUE_COMMON
/datum/reagent/clf3/on_mob_life(mob/living/carbon/M)
M.adjust_fire_stacks(2)
@@ -79,13 +82,14 @@
reagent_state = LIQUID
color = "#5A64C8"
taste_description = "air and bitterness"
+ value = REAGENT_VALUE_UNCOMMON
/datum/reagent/liquid_dark_matter
name = "Liquid Dark Matter"
description = "Sucks everything into the detonation point."
reagent_state = LIQUID
color = "#210021"
- value = 10
+ value = REAGENT_VALUE_UNCOMMON
taste_description = "compressed bitterness"
/datum/reagent/blackpowder
@@ -93,9 +97,9 @@
description = "Explodes. Violently."
reagent_state = LIQUID
color = "#000000"
- value = 5
metabolization_rate = 0.05
taste_description = "salt"
+ value = REAGENT_VALUE_RARE
/datum/reagent/blackpowder/on_mob_life(mob/living/carbon/M)
..()
@@ -115,6 +119,7 @@
reagent_state = LIQUID
color = "#C8C8C8"
taste_description = "salt"
+ value = REAGENT_VALUE_UNCOMMON
/datum/reagent/smoke_powder
name = "Smoke Powder"
@@ -122,6 +127,7 @@
reagent_state = LIQUID
color = "#C8C8C8"
taste_description = "smoke"
+ value = REAGENT_VALUE_COMMON
/datum/reagent/sonic_powder
name = "Sonic Powder"
@@ -129,6 +135,7 @@
reagent_state = LIQUID
color = "#C8C8C8"
taste_description = "loud noises"
+ value = REAGENT_VALUE_UNCOMMON
/datum/reagent/phlogiston
name = "Phlogiston"
@@ -136,6 +143,7 @@
reagent_state = LIQUID
color = "#FA00AF"
taste_description = "burning"
+ value = REAGENT_VALUE_UNCOMMON
/datum/reagent/phlogiston/reaction_mob(mob/living/M, method=TOUCH, reac_volume)
M.adjust_fire_stacks(1)
@@ -156,8 +164,8 @@
description = "Very flammable."
reagent_state = LIQUID
color = "#FA00AF"
- value = 1
taste_description = "burning"
+ value = REAGENT_VALUE_COMMON
/datum/reagent/napalm/on_mob_life(mob/living/carbon/M)
M.adjust_fire_stacks(1)
@@ -174,7 +182,7 @@
color = "#0000DC"
metabolization_rate = 0.5 * REAGENTS_METABOLISM
taste_description = "bitterness"
-
+ value = REAGENT_VALUE_COMMON
/datum/reagent/cryostylane/on_mob_life(mob/living/carbon/M) //TODO: code freezing into an ice cube
if(M.reagents.has_reagent(/datum/reagent/oxygen))
@@ -193,6 +201,7 @@
color = "#64FAC8"
metabolization_rate = 0.5 * REAGENTS_METABOLISM
taste_description = "bitterness"
+ value = REAGENT_VALUE_COMMON
/datum/reagent/pyrosium/on_mob_life(mob/living/carbon/M)
if(M.reagents.has_reagent(/datum/reagent/oxygen))
@@ -208,6 +217,7 @@
metabolization_rate = 0.5 * REAGENTS_METABOLISM
taste_description = "charged metal"
var/shock_timer = 0
+ value = REAGENT_VALUE_VERY_RARE
/datum/reagent/teslium/on_mob_life(mob/living/carbon/M)
shock_timer++
@@ -242,6 +252,7 @@
reagent_state = LIQUID
color = "#A6FAFF55"
taste_description = "the inside of a fire extinguisher"
+ value = REAGENT_VALUE_UNCOMMON
/datum/reagent/firefighting_foam/reaction_turf(turf/open/T, reac_volume)
if (!istype(T))
diff --git a/code/modules/reagents/chemistry/reagents/toxin_reagents.dm b/code/modules/reagents/chemistry/reagents/toxin_reagents.dm
index 305d12b3c5..3169d2d3aa 100644
--- a/code/modules/reagents/chemistry/reagents/toxin_reagents.dm
+++ b/code/modules/reagents/chemistry/reagents/toxin_reagents.dm
@@ -7,6 +7,7 @@
color = "#CF3600" // rgb: 207, 54, 0
taste_description = "bitterness"
taste_mult = 1.2
+ value = REAGENT_VALUE_COMMON //Encouraging people to mix toxins for reasons beyond harming each other or mixing reagents such as pen acid.
var/toxpwr = 1.5
/datum/reagent/toxin/on_mob_life(mob/living/carbon/M)
@@ -21,6 +22,7 @@
color = "#792300" // rgb: 121, 35, 0
toxpwr = 2.5
taste_description = "mushroom"
+ value = REAGENT_VALUE_UNCOMMON
pH = 13
/datum/reagent/toxin/mutagen
@@ -30,6 +32,7 @@
toxpwr = 0
taste_description = "slime"
taste_mult = 0.9
+ value = REAGENT_VALUE_VERY_COMMON
pH = 2.3
/datum/reagent/toxin/mutagen/reaction_mob(mob/living/carbon/M, method=TOUCH, reac_volume)
@@ -60,6 +63,7 @@
color = "#8228A0"
toxpwr = 3
pH = 4
+ value = REAGENT_VALUE_RARE //sheets are worth more
/datum/reagent/toxin/plasma/on_mob_life(mob/living/carbon/C)
if(holder.has_reagent(/datum/reagent/medicine/epinephrine))
@@ -92,6 +96,7 @@
toxpwr = 0
taste_description = "acid"
pH = 1.2
+ value = REAGENT_VALUE_RARE
/datum/reagent/toxin/lexorin/on_mob_life(mob/living/carbon/C)
. = TRUE
@@ -114,6 +119,7 @@
taste_description = "slime"
taste_mult = 1.3
pH = 10
+ value = REAGENT_VALUE_UNCOMMON
/datum/reagent/toxin/slimejelly/on_mob_life(mob/living/carbon/M)
if(prob(10))
@@ -132,6 +138,7 @@
toxpwr = 0
taste_description = "mint"
pH = 8
+ value = REAGENT_VALUE_UNCOMMON
/datum/reagent/toxin/minttoxin/on_mob_life(mob/living/carbon/M)
if(HAS_TRAIT(M, TRAIT_FAT))
@@ -145,6 +152,7 @@
toxpwr = 2
taste_description = "fish"
pH = 12
+ value = REAGENT_VALUE_RARE
/datum/reagent/toxin/zombiepowder
name = "Zombie Powder"
@@ -155,6 +163,7 @@
taste_description = "death"
var/fakedeath_active = FALSE
pH = 13
+ value = REAGENT_VALUE_EXCEPTIONAL
/datum/reagent/toxin/zombiepowder/on_mob_metabolize(mob/living/L)
..()
@@ -193,6 +202,7 @@
toxpwr = 0.8
taste_description = "death"
pH = 14.5
+ value = REAGENT_VALUE_EXCEPTIONAL
/datum/reagent/toxin/ghoulpowder/on_mob_metabolize(mob/living/L)
..()
@@ -214,6 +224,7 @@
toxpwr = 0
taste_description = "sourness"
pH = 11
+ value = REAGENT_VALUE_UNCOMMON
/datum/reagent/toxin/mindbreaker/on_mob_life(mob/living/carbon/M)
M.hallucination += 5
@@ -226,6 +237,7 @@
toxpwr = 1
taste_mult = 1
pH = 2.7
+ value = REAGENT_VALUE_NONE
/datum/reagent/toxin/plantbgone/reaction_obj(obj/O, reac_volume)
if(istype(O, /obj/structure/alien/weeds))
@@ -250,6 +262,7 @@
description = "A harmful toxic mixture to kill weeds. Do not ingest!"
color = "#4B004B" // rgb: 75, 0, 75
pH = 3
+ value = REAGENT_VALUE_NONE
/datum/reagent/toxin/pestkiller
name = "Pest Killer"
@@ -257,6 +270,7 @@
color = "#4B004B" // rgb: 75, 0, 75
toxpwr = 1
pH = 3.2
+ value = REAGENT_VALUE_NONE
/datum/reagent/toxin/pestkiller/reaction_mob(mob/living/M, method=TOUCH, reac_volume)
..()
@@ -270,6 +284,7 @@
color = "#9ACD32"
toxpwr = 1
pH = 11
+ value = REAGENT_VALUE_RARE
/datum/reagent/toxin/spore/on_mob_life(mob/living/carbon/C)
C.damageoverlaytemp = 60
@@ -284,6 +299,7 @@
toxpwr = 0.5
taste_description = "burning"
pH = 13
+ value = REAGENT_VALUE_VERY_RARE
/datum/reagent/toxin/spore_burning/on_mob_life(mob/living/carbon/M)
M.adjust_fire_stacks(2)
@@ -323,6 +339,7 @@
glass_name = "glass of beer"
glass_desc = "A freezing pint of beer."
pH = 2
+ value = REAGENT_VALUE_VERY_RARE
/datum/reagent/toxin/fakebeer/on_mob_life(mob/living/carbon/M)
switch(current_cycle)
@@ -340,6 +357,7 @@
color = "#5B2E0D" // rgb: 91, 46, 13
toxpwr = 0.5
pH = 4.2
+ value = REAGENT_VALUE_VERY_COMMON
/datum/reagent/toxin/teapowder
name = "Ground Tea Leaves"
@@ -348,6 +366,7 @@
color = "#7F8400" // rgb: 127, 132, 0
toxpwr = 0.5
pH = 4.9
+ value = REAGENT_VALUE_VERY_COMMON
/datum/reagent/toxin/mutetoxin //the new zombie powder.
name = "Mute Toxin"
@@ -367,6 +386,7 @@
color = "#6E2828"
data = 15
toxpwr = 0
+ value = REAGENT_VALUE_UNCOMMON
/datum/reagent/toxin/staminatoxin/on_mob_life(mob/living/carbon/M)
M.adjustStaminaLoss(REM * data, 0)
@@ -381,6 +401,7 @@
color = "#787878"
metabolization_rate = 0.125 * REAGENTS_METABOLISM
toxpwr = 0
+ value = REAGENT_VALUE_VERY_RARE
/datum/reagent/toxin/polonium/on_mob_life(mob/living/carbon/M)
M.radiation += 4
@@ -394,6 +415,7 @@
metabolization_rate = 0.25 * REAGENTS_METABOLISM
overdose_threshold = 30
toxpwr = 0
+ value = REAGENT_VALUE_UNCOMMON
/datum/reagent/toxin/histamine/on_mob_life(mob/living/carbon/M)
if(prob(50))
@@ -441,6 +463,7 @@
color = "#F0FFF0"
metabolization_rate = 0.25 * REAGENTS_METABOLISM
toxpwr = 0
+ value = REAGENT_VALUE_VERY_RARE
/datum/reagent/toxin/venom/on_mob_life(mob/living/carbon/M)
toxpwr = 0.2*volume
@@ -476,6 +499,7 @@
color = "#00B4FF"
metabolization_rate = 0.125 * REAGENTS_METABOLISM
toxpwr = 1.25
+ value = REAGENT_VALUE_UNCOMMON
/datum/reagent/toxin/cyanide/on_mob_life(mob/living/carbon/M)
if(prob(5))
@@ -494,6 +518,7 @@
metabolization_rate = 0.25 * REAGENTS_METABOLISM
toxpwr = 0.5
taste_description = "bad cooking"
+ value = REAGENT_VALUE_NONE
/datum/reagent/toxin/condensed_cooking_oil
name = "Condensed Cooking Oil"
@@ -504,9 +529,10 @@
toxpwr = 0
taste_mult = -2
taste_description = "awful cooking"
+ value = REAGENT_VALUE_NONE
/datum/reagent/toxin/condensed_cooking_oil/on_mob_life(mob/living/carbon/M)
- if(prob(15))
+ if(prob(5))
M.vomit()
else
if(prob(40))
@@ -551,6 +577,7 @@
color = "#7F10C0"
metabolization_rate = 0.5 * REAGENTS_METABOLISM
toxpwr = 2.5
+ value = REAGENT_VALUE_EXCEPTIONAL
/datum/reagent/toxin/initropidril/on_mob_life(mob/living/carbon/C)
if(prob(25))
@@ -582,6 +609,7 @@
metabolization_rate = 0.25 * REAGENTS_METABOLISM
toxpwr = 0
taste_mult = 0 // undetectable, I guess?
+ value = REAGENT_VALUE_VERY_RARE
/datum/reagent/toxin/pancuronium/on_mob_life(mob/living/carbon/M)
if(current_cycle >= 10)
@@ -598,6 +626,7 @@
color = "#6496FA"
metabolization_rate = 0.75 * REAGENTS_METABOLISM
toxpwr = 0
+ value = REAGENT_VALUE_VERY_RARE
/datum/reagent/toxin/sodium_thiopental/on_mob_life(mob/living/carbon/M)
if(current_cycle >= 10)
@@ -626,6 +655,7 @@
color = "#FFFFFF"
toxpwr = 0
metabolization_rate = 0.5 * REAGENTS_METABOLISM
+ value = REAGENT_VALUE_RARE
/datum/reagent/toxin/amanitin/on_mob_end_metabolize(mob/living/M)
var/toxdamage = current_cycle*3*REM
@@ -656,6 +686,7 @@
color = "#7DC3A0"
metabolization_rate = 0.06 * REAGENTS_METABOLISM
toxpwr = 1.75
+ value = REAGENT_VALUE_EXCEPTIONAL
/datum/reagent/toxin/coniine/on_mob_life(mob/living/carbon/M)
M.losebreath += 5
@@ -670,6 +701,7 @@
overdose_threshold = 29
toxpwr = 0
taste_description = "vomit"
+ value = REAGENT_VALUE_VERY_RARE
/datum/reagent/toxin/spewium/on_mob_life(mob/living/carbon/C)
.=..()
@@ -693,6 +725,7 @@
color = "#191919"
metabolization_rate = 0.125 * REAGENTS_METABOLISM
toxpwr = 1
+ value = REAGENT_VALUE_VERY_RARE
/datum/reagent/toxin/curare/on_mob_life(mob/living/carbon/M)
if(current_cycle >= 11)
@@ -708,6 +741,7 @@
color = "#C8C8C8" //RGB: 200, 200, 200
metabolization_rate = 0.2 * REAGENTS_METABOLISM
toxpwr = 0
+ value = REAGENT_VALUE_VERY_RARE
/datum/reagent/toxin/heparin/on_mob_life(mob/living/carbon/M)
if(ishuman(M))
@@ -726,6 +760,7 @@
metabolization_rate = 0.6 * REAGENTS_METABOLISM
toxpwr = 0.5
taste_description = "spinning"
+ value = REAGENT_VALUE_VERY_RARE
/datum/reagent/toxin/rotatium/on_mob_life(mob/living/carbon/M)
if(M.hud_used)
@@ -752,6 +787,7 @@
metabolization_rate = 0.8 * REAGENTS_METABOLISM
toxpwr = 0.25
taste_description = "skewing"
+ value = REAGENT_VALUE_EXCEPTIONAL
/datum/reagent/toxin/skewium/on_mob_life(mob/living/carbon/M)
/*
@@ -788,6 +824,7 @@
color = "#3C5133"
metabolization_rate = 0.08 * REAGENTS_METABOLISM
toxpwr = 0.15
+ value = REAGENT_VALUE_VERY_RARE
/datum/reagent/toxin/anacea/on_mob_life(mob/living/carbon/M)
var/remove_amt = 5
@@ -809,6 +846,7 @@
taste_description = "acid"
self_consuming = TRUE
pH = 2.75
+ value = REAGENT_VALUE_NONE
/datum/reagent/toxin/acid/reaction_mob(mob/living/carbon/C, method=TOUCH, reac_volume)
if(!istype(C))
@@ -840,6 +878,7 @@
color = "#5050FF"
toxpwr = 2
acidpwr = 42.0
+ value = REAGENT_VALUE_COMMON
/datum/reagent/toxin/acid/fluacid/on_mob_life(mob/living/carbon/M)
M.adjustFireLoss(current_cycle/10, 0)
@@ -853,6 +892,7 @@
metabolization_rate = 0 //stays in the system until active.
var/actual_metaboliztion_rate = REAGENTS_METABOLISM
toxpwr = 0
+ value = REAGENT_VALUE_VERY_RARE
var/actual_toxpwr = 5
var/delay = 30
@@ -871,6 +911,7 @@
color = "#F0F8FF" // rgb: 240, 248, 255
toxpwr = 0
taste_description = "stillness"
+ value = REAGENT_VALUE_RARE
/datum/reagent/toxin/mimesbane/on_mob_metabolize(mob/living/L)
ADD_TRAIT(L, TRAIT_EMOTEMUTE, type)
@@ -885,6 +926,7 @@
toxpwr = 0
taste_description = "bone hurting"
overdose_threshold = 20
+ value = REAGENT_VALUE_VERY_RARE //because it's very funny.
/datum/reagent/toxin/bonehurtingjuice/on_mob_add(mob/living/carbon/M)
M.say("oof ouch my bones", forced = /datum/reagent/toxin/bonehurtingjuice)
@@ -944,6 +986,7 @@
toxpwr = 0
taste_description = "brain hurting"
metabolization_rate = 5
+ value = REAGENT_VALUE_EXCEPTIONAL
/datum/reagent/toxin/brainhurtingjuice/on_mob_life(mob/living/carbon/M)
if(prob(50))
@@ -962,6 +1005,7 @@
metabolization_rate = 0.5 * REAGENTS_METABOLISM
toxpwr = 0
taste_description = "tannin"
+ value = REAGENT_VALUE_RARE
/datum/reagent/toxin/bungotoxin/on_mob_life(mob/living/carbon/M)
M.adjustOrganLoss(ORGAN_SLOT_HEART, 3)
diff --git a/code/modules/reagents/chemistry/recipes/medicine.dm b/code/modules/reagents/chemistry/recipes/medicine.dm
index 0b32952d20..9cf9acb424 100644
--- a/code/modules/reagents/chemistry/recipes/medicine.dm
+++ b/code/modules/reagents/chemistry/recipes/medicine.dm
@@ -105,7 +105,7 @@
if(St.purity < 1)
St.volume *= St.purity
St.purity = 1
- var/amount = CLAMP(0.002, 0, N.volume)
+ var/amount = clamp(0.002, 0, N.volume)
N.volume -= amount
St.data["grown_volume"] = St.data["grown_volume"] + added_volume
St.name = "[initial(St.name)] [round(St.data["grown_volume"], 0.1)]u colony"
diff --git a/code/modules/reagents/chemistry/recipes/pyrotechnics.dm b/code/modules/reagents/chemistry/recipes/pyrotechnics.dm
index 2c8be10ace..8782d65f76 100644
--- a/code/modules/reagents/chemistry/recipes/pyrotechnics.dm
+++ b/code/modules/reagents/chemistry/recipes/pyrotechnics.dm
@@ -195,7 +195,7 @@
return
holder.remove_reagent(/datum/reagent/sorium, multiplier*4)
var/turf/T = get_turf(holder.my_atom)
- var/range = CLAMP(sqrt(multiplier*4), 1, 6)
+ var/range = clamp(sqrt(multiplier*4), 1, 6)
goonchem_vortex(T, 1, range)
/datum/chemical_reaction/sorium_vortex
@@ -206,7 +206,7 @@
/datum/chemical_reaction/sorium_vortex/on_reaction(datum/reagents/holder, multiplier)
var/turf/T = get_turf(holder.my_atom)
- var/range = CLAMP(sqrt(multiplier), 1, 6)
+ var/range = clamp(sqrt(multiplier), 1, 6)
goonchem_vortex(T, 1, range)
/datum/chemical_reaction/liquid_dark_matter
@@ -220,7 +220,7 @@
return
holder.remove_reagent(/datum/reagent/liquid_dark_matter, multiplier*3)
var/turf/T = get_turf(holder.my_atom)
- var/range = CLAMP(sqrt(multiplier*3), 1, 6)
+ var/range = clamp(sqrt(multiplier*3), 1, 6)
goonchem_vortex(T, 0, range)
/datum/chemical_reaction/ldm_vortex
@@ -231,7 +231,7 @@
/datum/chemical_reaction/ldm_vortex/on_reaction(datum/reagents/holder, multiplier)
var/turf/T = get_turf(holder.my_atom)
- var/range = CLAMP(sqrt(multiplier/2), 1, 6)
+ var/range = clamp(sqrt(multiplier/2), 1, 6)
goonchem_vortex(T, 0, range)
/datum/chemical_reaction/flash_powder
diff --git a/code/modules/reagents/chemistry/recipes/slime_extracts.dm b/code/modules/reagents/chemistry/recipes/slime_extracts.dm
index eb473950d5..ead47e2a42 100644
--- a/code/modules/reagents/chemistry/recipes/slime_extracts.dm
+++ b/code/modules/reagents/chemistry/recipes/slime_extracts.dm
@@ -42,7 +42,7 @@
/datum/chemical_reaction/slime/slimemonkey/on_reaction(datum/reagents/holder)
for(var/i in 1 to 3)
- new /obj/item/reagent_containers/food/snacks/monkeycube(get_turf(holder.my_atom))
+ new /obj/item/reagent_containers/food/snacks/cube/monkey(get_turf(holder.my_atom))
..()
//Green
diff --git a/code/modules/reagents/reagent_containers.dm b/code/modules/reagents/reagent_containers.dm
index 89de7c409d..f326b94e44 100644
--- a/code/modules/reagents/reagent_containers.dm
+++ b/code/modules/reagents/reagent_containers.dm
@@ -185,7 +185,7 @@
START_PROCESSING(SSobj, src)
else if((reagents.pH < -3) || (reagents.pH > 17))
visible_message("[icon2html(src, viewers(src))] \The [src] is damaged by the super pH and begins to deform!")
- reagents.pH = CLAMP(reagents.pH, -3, 17)
+ reagents.pH = clamp(reagents.pH, -3, 17)
container_HP -= 1
diff --git a/code/modules/reagents/reagent_containers/spray.dm b/code/modules/reagents/reagent_containers/spray.dm
index 62ca5d658e..7fea8250d9 100644
--- a/code/modules/reagents/reagent_containers/spray.dm
+++ b/code/modules/reagents/reagent_containers/spray.dm
@@ -66,7 +66,7 @@
/obj/item/reagent_containers/spray/proc/spray(atom/A)
- var/range = CLAMP(get_dist(src, A), 1, current_range)
+ var/range = clamp(get_dist(src, A), 1, current_range)
var/obj/effect/decal/chempuff/D = new /obj/effect/decal/chempuff(get_turf(src))
D.create_reagents(amount_per_transfer_from_this, NONE, NO_REAGENTS_VALUE)
var/puff_reagent_left = range //how many turf, mob or dense objet we can react with before we consider the chem puff consumed
diff --git a/code/modules/reagents/reagent_containers/syringes.dm b/code/modules/reagents/reagent_containers/syringes.dm
index b8957775b1..1a2742d2a6 100644
--- a/code/modules/reagents/reagent_containers/syringes.dm
+++ b/code/modules/reagents/reagent_containers/syringes.dm
@@ -180,7 +180,7 @@
///Used by update_icon() and update_overlays()
/obj/item/reagent_containers/syringe/proc/get_rounded_vol()
if(reagents && reagents.total_volume)
- return CLAMP(round((reagents.total_volume / volume * 15),5), 1, 15)
+ return clamp(round((reagents.total_volume / volume * 15),5), 1, 15)
else
return 0
diff --git a/code/modules/recycling/conveyor2.dm b/code/modules/recycling/conveyor2.dm
index 425c94cd65..600ee4ad14 100644
--- a/code/modules/recycling/conveyor2.dm
+++ b/code/modules/recycling/conveyor2.dm
@@ -330,7 +330,7 @@ GLOBAL_LIST_EMPTY(conveyors_by_id)
desc = "A conveyor control switch assembly."
icon = 'icons/obj/recycling.dmi'
icon_state = "switch-off"
- w_class = WEIGHT_CLASS_BULKY
+ w_class = WEIGHT_CLASS_NORMAL
var/id = "" //inherited by the switch
/obj/item/conveyor_switch_construct/Initialize()
diff --git a/code/modules/recycling/sortingmachinery.dm b/code/modules/recycling/sortingmachinery.dm
index d6ad1bf042..b47f0de032 100644
--- a/code/modules/recycling/sortingmachinery.dm
+++ b/code/modules/recycling/sortingmachinery.dm
@@ -57,7 +57,7 @@
return ..()
/obj/structure/bigDelivery/relay_container_resist(mob/living/user, obj/O)
- if(ismovableatom(loc))
+ if(ismovable(loc))
var/atom/movable/AM = loc //can't unwrap the wrapped container if it's inside something.
AM.relay_container_resist(user, O)
return
diff --git a/code/modules/research/designs.dm b/code/modules/research/designs.dm
index f3ac118134..cfb6d92723 100644
--- a/code/modules/research/designs.dm
+++ b/code/modules/research/designs.dm
@@ -36,6 +36,9 @@ other types of metals and chemistry for reagents).
var/dangerous_construction = FALSE //notify and log for admin investigations if this is printed.
var/departmental_flags = ALL //bitflags for deplathes.
var/list/datum/techweb_node/unlocked_by = list()
+ ///minimum and security levels the design can be printed on. Currently only available for rnd production machinery and mechfab.
+ var/min_security_level = SEC_LEVEL_GREEN
+ var/max_security_level = SEC_LEVEL_DELTA
var/research_icon //Replaces the item icon in the research console
var/research_icon_state
var/icon_cache
diff --git a/code/modules/research/designs/biogenerator_designs.dm b/code/modules/research/designs/biogenerator_designs.dm
index e82dffbe07..2cf9df6d50 100644
--- a/code/modules/research/designs/biogenerator_designs.dm
+++ b/code/modules/research/designs/biogenerator_designs.dm
@@ -2,6 +2,9 @@
///////Biogenerator Designs ///////
///////////////////////////////////
+//Please be wary to not add inorganic items to the results such as generic glass bottles and metal.
+//as they kind of defeat the design of this feature.
+
/datum/design/milk
name = "10u Milk"
id = "milk"
@@ -18,22 +21,6 @@
make_reagents = list(/datum/reagent/consumable/cream = 10)
category = list("initial","Food")
-/datum/design/milk_carton
- name = "Milk Carton"
- id = "milk_carton"
- build_type = BIOGENERATOR
- materials = list(/datum/material/biomass = 100)
- build_path = /obj/item/reagent_containers/food/condiment/milk
- category = list("initial","Food")
-
-/datum/design/cream_carton
- name = "Cream Carton"
- id = "cream_carton"
- build_type = BIOGENERATOR
- materials = list(/datum/material/biomass = 300)
- build_path = /obj/item/reagent_containers/food/drinks/bottle/cream
- category = list("initial","Food")
-
/datum/design/black_pepper
name = "10u Black Pepper"
id = "black_pepper"
@@ -42,15 +29,6 @@
make_reagents = list(/datum/reagent/consumable/blackpepper = 10)
category = list("initial","Food")
-/datum/design/pepper_mill
- name = "Pepper Mill"
- id = "pepper_mill"
- build_type = BIOGENERATOR
- materials = list(/datum/material/biomass = 50)
- build_path = /obj/item/reagent_containers/food/condiment/peppermill
- make_reagents = list()
- category = list("initial","Food")
-
/datum/design/enzyme
name = "10u Universal Enzyme"
id = "enzyme"
@@ -59,20 +37,12 @@
make_reagents = list(/datum/reagent/consumable/enzyme = 10)
category = list("initial","Food")
-/datum/design/flour_sack
- name = "Flour Sack"
- id = "flour_sack"
- build_type = BIOGENERATOR
- materials = list(/datum/material/biomass = 150)
- build_path = /obj/item/reagent_containers/food/condiment/flour
- category = list("initial","Food")
-
/datum/design/monkey_cube
name = "Monkey Cube"
id = "mcube"
build_type = BIOGENERATOR
materials = list(/datum/material/biomass = 250)
- build_path = /obj/item/reagent_containers/food/snacks/monkeycube
+ build_path = /obj/item/reagent_containers/food/snacks/cube/monkey
category = list("initial", "Food")
/datum/design/smeat
@@ -84,43 +54,43 @@
category = list("initial", "Food")
/datum/design/ez_nut
- name = "E-Z Nutrient"
+ name = "10u E-Z Nutrient"
id = "ez_nut"
build_type = BIOGENERATOR
- materials = list(/datum/material/biomass = 10)
- build_path = /obj/item/reagent_containers/glass/bottle/nutrient/ez
+ materials = list(/datum/material/biomass = 2)
+ make_reagents = list(/datum/reagent/plantnutriment/eznutriment = 10)
category = list("initial","Botany Chemicals")
/datum/design/l4z_nut
- name = "Left 4 Zed"
+ name = "10u Left 4 Zed"
id = "l4z_nut"
build_type = BIOGENERATOR
- materials = list(/datum/material/biomass = 20)
- build_path = /obj/item/reagent_containers/glass/bottle/nutrient/l4z
+ materials = list(/datum/material/biomass = 4)
+ make_reagents = list(/datum/reagent/plantnutriment/left4zednutriment = 10)
category = list("initial","Botany Chemicals")
/datum/design/rh_nut
- name = "Robust Harvest"
+ name = "10u Robust Harvest"
id = "rh_nut"
build_type = BIOGENERATOR
- materials = list(/datum/material/biomass = 25)
- build_path = /obj/item/reagent_containers/glass/bottle/nutrient/rh
+ materials = list(/datum/material/biomass = 5)
+ make_reagents = list(/datum/reagent/plantnutriment/robustharvestnutriment = 10)
category = list("initial","Botany Chemicals")
/datum/design/weed_killer
name = "Weed Killer"
id = "weed_killer"
build_type = BIOGENERATOR
- materials = list(/datum/material/biomass = 50)
- build_path = /obj/item/reagent_containers/glass/bottle/killer/weedkiller
+ materials = list(/datum/material/biomass = 10)
+ make_reagents = list(/datum/reagent/toxin/plantbgone/weedkiller = 10)
category = list("initial","Botany Chemicals")
/datum/design/pest_spray
name = "Pest Killer"
id = "pest_spray"
build_type = BIOGENERATOR
- materials = list(/datum/material/biomass = 50)
- build_path = /obj/item/reagent_containers/glass/bottle/killer/pestkiller
+ materials = list(/datum/material/biomass = 10)
+ make_reagents = list(/datum/reagent/toxin/pestkiller = 10)
category = list("initial","Botany Chemicals")
/datum/design/ammonia
@@ -139,13 +109,13 @@
make_reagents = list(/datum/reagent/saltpetre = 10)
category = list("initial","Botany Chemicals")
-/datum/design/botany_bottle
- name = "Empty Bottle"
- id = "botany_bottle"
+/datum/design/empty_carton
+ name = "Small Empty Carton Box"
+ id = "empty_carton"
build_type = BIOGENERATOR
- materials = list(/datum/material/biomass = 5)
- build_path = /obj/item/reagent_containers/glass/bottle/nutrient/empty
- category = list("initial", "Botany Chemicals")
+ materials = list(/datum/material/biomass = 15)
+ build_path = /obj/item/reagent_containers/food/drinks/bottle/bio_carton
+ category = list("initial", "Organic Materials")
/datum/design/cloth
name = "Roll of Cloth"
diff --git a/code/modules/research/designs/misc_designs.dm b/code/modules/research/designs/misc_designs.dm
index c18c33b04b..e407277ebf 100644
--- a/code/modules/research/designs/misc_designs.dm
+++ b/code/modules/research/designs/misc_designs.dm
@@ -293,20 +293,20 @@
name = "Broom"
desc = "Just your everyday standard broom."
id = "broom"
- build_type = PROTOLATHE
+ build_type = PROTOLATHE | AUTOLATHE
materials = list(/datum/material/iron = 1000, /datum/material/glass = 600)
build_path = /obj/item/twohanded/broom
- category = list("Equipment")
+ category = list("initial", "Equipment", "Misc")
departmental_flags = DEPARTMENTAL_FLAG_SERVICE
/datum/design/mop
name = "Mop"
desc = "Just your everyday standard mop."
id = "mop"
- build_type = PROTOLATHE
+ build_type = PROTOLATHE | AUTOLATHE
materials = list(/datum/material/iron = 1200, /datum/material/glass = 100)
build_path = /obj/item/mop
- category = list("Equipment")
+ category = list("initial", "Equipment", "Misc")
departmental_flags = DEPARTMENTAL_FLAG_SERVICE
/datum/design/advmop
@@ -329,6 +329,16 @@
category = list("Equipment")
departmental_flags = DEPARTMENTAL_FLAG_SERVICE
+/datum/design/normtrash
+ name = "Trashbag"
+ desc = "It's a bag for trash, you put garbage in it."
+ id = "normtrash"
+ build_type = PROTOLATHE
+ materials = list(/datum/material/plastic = 2000)
+ build_path = /obj/item/storage/bag/trash
+ category = list("Equipment")
+ departmental_flags = DEPARTMENTAL_FLAG_SERVICE
+
/datum/design/blutrash
name = "Trashbag of Holding"
desc = "An advanced trash bag with bluespace properties; capable of holding a plethora of garbage."
@@ -349,6 +359,17 @@
category = list("Equipment")
departmental_flags = DEPARTMENTAL_FLAG_SERVICE
+/datum/design/paint_remover
+ name = "Paint Remover"
+ desc = "Removes stains from the floor, and not much else."
+ id = "paint_remover"
+ build_type = PROTOLATHE
+ materials = list(/datum/material/iron = 1000)
+ reagents_list = list(/datum/reagent/acetone = 60)
+ build_path = /obj/item/paint/paint_remover
+ category = list("Equipment")
+ departmental_flags = DEPARTMENTAL_FLAG_SERVICE
+
/datum/design/spraybottle
name = "Spray Bottle"
desc = "A spray bottle, with an unscrewable top."
@@ -614,3 +635,27 @@
build_path = /obj/item/circuitboard/computer/sat_control
category = list("Computer Boards")
departmental_flags = DEPARTMENTAL_FLAG_ENGINEERING
+
+
+
+/////////////////////////////////////////
+////////////Tackle Gloves////////////////
+/////////////////////////////////////////
+
+/datum/design/tackle_dolphin
+ name = "Dolphin Gloves"
+ id = "tackle_dolphin"
+ build_type = PROTOLATHE
+ materials = list(/datum/material/plastic = 2500)
+ build_path = /obj/item/clothing/gloves/tackler/dolphin
+ category = list("Equipment")
+ departmental_flags = DEPARTMENTAL_FLAG_SECURITY
+
+/datum/design/tackle_rocket
+ name = "Rocket Gloves"
+ id = "tackle_rocket"
+ build_type = PROTOLATHE
+ materials = list(/datum/material/plasma = 1000, /datum/material/plastic = 2000)
+ build_path = /obj/item/clothing/gloves/tackler/rocket
+ category = list("Equipment")
+ departmental_flags = DEPARTMENTAL_FLAG_SECURITY
diff --git a/code/modules/research/designs/nanite_designs.dm b/code/modules/research/designs/nanite_designs.dm
index c72ee4fb8c..b157d0c349 100644
--- a/code/modules/research/designs/nanite_designs.dm
+++ b/code/modules/research/designs/nanite_designs.dm
@@ -529,7 +529,6 @@
////////////////////NANITE PROTOCOLS//////////////////////////////////////
//Note about the category name: The UI cuts the last 8 characters from the category name to remove the " Nanites" in the other categories
//Because of this, Protocols was getting cut down to "P", so i had to add some padding
-/*
/datum/design/nanites/kickstart
name = "Kickstart Protocol"
desc = "Replication Protocol: the nanites focus on early growth, heavily boosting replication rate for a few minutes after the initial implantation."
@@ -557,4 +556,10 @@
id = "offline_nanites"
program_type = /datum/nanite_program/protocol/offline
category = list("Protocols_Nanites")
-*/
+
+/datum/design/nanites/synergy
+ name = "Synergy Protocol"
+ desc = "Replication Protocol: the nanites syncronize their tasks and processes within a host, leading to an increase in replication speed proportional to the current nanite volume."
+ id = "synergy_nanites"
+ program_type = /datum/nanite_program/protocol/synergy
+ category = list("Protocols_Nanites")
diff --git a/code/modules/research/designs/weapon_designs.dm b/code/modules/research/designs/weapon_designs.dm
index 658e108288..44b71a025f 100644
--- a/code/modules/research/designs/weapon_designs.dm
+++ b/code/modules/research/designs/weapon_designs.dm
@@ -435,9 +435,9 @@
category = list("Weapons")
departmental_flags = DEPARTMENTAL_FLAG_SECURITY | DEPARTMENTAL_FLAG_MEDICAL | DEPARTMENTAL_FLAG_SCIENCE
-//////////
-//MISC////
-//////////
+///////////
+//Shields//
+///////////
/datum/design/tele_shield
name = "Telescopic Riot Shield"
@@ -449,6 +449,30 @@
category = list("Weapons")
departmental_flags = DEPARTMENTAL_FLAG_SECURITY
+/datum/design/laser_shield
+ name = "Laser Resistant Riot Shield"
+ desc = "An advanced riot shield made of darker glasses to prevent laser fire from passing through."
+ id = "laser_shield"
+ build_type = PROTOLATHE
+ materials = list(/datum/material/iron = 4000, /datum/material/glass = 1000, /datum/material/plastic = 4000, /datum/material/silver = 800, /datum/material/titanium = 600, /datum/material/plasma = 5000)
+ build_path = /obj/item/shield/riot/laser_proof
+ category = list("Weapons")
+ departmental_flags = DEPARTMENTAL_FLAG_SECURITY
+
+/datum/design/bullet_shield
+ name = "Bullet Resistant Riot Shield"
+ desc = "An advanced riot shield made bullet resistant plastics and heavy metals to protect against projectile harm."
+ id = "bullet_shield"
+ build_type = PROTOLATHE
+ materials = list(/datum/material/iron = 4000, /datum/material/glass = 1000, /datum/material/silver = 2000, /datum/material/titanium = 1200, /datum/material/plastic = 2500)
+ build_path = /obj/item/shield/riot/bullet_proof
+ category = list("Weapons")
+ departmental_flags = DEPARTMENTAL_FLAG_SECURITY
+
+//////////
+//MISC////
+//////////
+
/datum/design/suppressor
name = "Suppressor"
desc = "A reverse-engineered suppressor that fits on most small arms with threaded barrels."
diff --git a/code/modules/research/machinery/_production.dm b/code/modules/research/machinery/_production.dm
index 41ed6a556e..0550fa9334 100644
--- a/code/modules/research/machinery/_production.dm
+++ b/code/modules/research/machinery/_production.dm
@@ -3,6 +3,7 @@
desc = "Makes researched and prototype items with materials and energy."
layer = BELOW_OBJ_LAYER
var/consoleless_interface = TRUE //Whether it can be used without a console.
+ var/offstation_security_levels = TRUE
var/efficiency_coeff = 1 //Materials needed / coeff = actual.
var/list/categories = list()
var/datum/component/remote_materials/materials
@@ -98,6 +99,7 @@
var/obj/item/I = O
I.material_flags |= MATERIAL_NO_EFFECTS //Find a better way to do this.
I.set_custom_materials(matlist.Copy())
+ I.rnd_crafted(src)
SSblackbox.record_feedback("nested tally", "item_printed", amount, list("[type]", "[path]"))
investigate_log("[key_name(user)] built [amount] of [path] at [src]([type]).", INVESTIGATE_RESEARCH)
@@ -134,6 +136,12 @@
if(D.build_type && !(D.build_type & allowed_buildtypes))
say("This machine does not have the necessary manipulation systems for this design. Please contact Nanotrasen Support!")
return FALSE
+ if(!(obj_flags & EMAGGED) && (offstation_security_levels || is_station_level(z)))
+ if(GLOB.security_level < D.min_security_level)
+ say("Minimum security alert level required to print this design not met, please contact the command staff.")
+ return FALSE
+ if(GLOB.security_level > D.max_security_level)
+ say("Exceeded maximum security alert level required to print this design, please contact the command staff.")
if(!materials.mat_container)
say("No connection to material storage, please contact the quartermaster.")
return FALSE
@@ -141,7 +149,7 @@
say("Mineral access is on hold, please contact the quartermaster.")
return FALSE
var/power = 1000
- amount = CLAMP(amount, 1, 50)
+ amount = clamp(amount, 1, 50)
for(var/M in D.materials)
power += round(D.materials[M] * amount / 35)
power = min(3000, power)
@@ -275,15 +283,26 @@
temp_material += " [all_materials[M]/coeff] [CallMaterialName(M)]"
c = min(c,t)
- if (c >= 1)
+ var/clearance = !(obj_flags & EMAGGED) && (offstation_security_levels || is_station_level(z))
+ var/sec_text = ""
+ if(clearance && (D.min_security_level > SEC_LEVEL_GREEN || D.max_security_level < SEC_LEVEL_DELTA))
+ sec_text = " (Allowed security levels: "
+ for(var/n in D.min_security_level to D.max_security_level)
+ sec_text += NUM2SECLEVEL(n)
+ if(n + 1 <= D.max_security_level)
+ sec_text += ", "
+ sec_text += ")"
+
+ clearance = !clearance || ISINRANGE(GLOB.security_level, D.min_security_level, D.max_security_level)
+ if (c >= 1 && clearance)
l += "[D.name][RDSCREEN_NOBREAK]"
if(c >= 5)
l += "x5[RDSCREEN_NOBREAK]"
if(c >= 10)
l += "x10[RDSCREEN_NOBREAK]"
- l += "[temp_material][RDSCREEN_NOBREAK]"
+ l += "[temp_material][sec_text][RDSCREEN_NOBREAK]"
else
- l += "[D.name][temp_material][RDSCREEN_NOBREAK]"
+ l += "[D.name][temp_material][sec_text][RDSCREEN_NOBREAK]"
l += ""
return l
diff --git a/code/modules/research/machinery/circuit_imprinter.dm b/code/modules/research/machinery/circuit_imprinter.dm
index 948dad61db..661ebe31c0 100644
--- a/code/modules/research/machinery/circuit_imprinter.dm
+++ b/code/modules/research/machinery/circuit_imprinter.dm
@@ -30,3 +30,9 @@
total_rating += M.rating * 2 //There is only one.
total_rating = max(1, total_rating)
efficiency_coeff = total_rating
+ var/obj/item/circuitboard/machine/circuit_imprinter/C = circuit
+ offstation_security_levels = C.offstation_security_levels
+
+/obj/machinery/rnd/production/circuit_imprinter/offstation
+ offstation_security_levels = FALSE
+ circuit = /obj/item/circuitboard/machine/circuit_imprinter/offstation
diff --git a/code/modules/research/machinery/protolathe.dm b/code/modules/research/machinery/protolathe.dm
index 684f27ccad..b1b31a279c 100644
--- a/code/modules/research/machinery/protolathe.dm
+++ b/code/modules/research/machinery/protolathe.dm
@@ -23,3 +23,12 @@
/obj/machinery/rnd/production/protolathe/disconnect_console()
linked_console.linked_lathe = null
..()
+
+/obj/machinery/rnd/production/protolathe/calculate_efficiency()
+ . = ..()
+ var/obj/item/circuitboard/machine/protolathe/C = circuit
+ offstation_security_levels = C.offstation_security_levels
+
+/obj/machinery/rnd/production/protolathe/offstation
+ offstation_security_levels = FALSE
+ circuit = /obj/item/circuitboard/machine/protolathe/offstation
diff --git a/code/modules/research/nanites/extra_settings/number.dm b/code/modules/research/nanites/extra_settings/number.dm
index 6e63ae067e..75489635f5 100644
--- a/code/modules/research/nanites/extra_settings/number.dm
+++ b/code/modules/research/nanites/extra_settings/number.dm
@@ -16,7 +16,7 @@
value = text2num(value)
if(!value || !isnum(value))
return
- src.value = CLAMP(value, min, max)
+ src.value = clamp(value, min, max)
/datum/nanite_extra_setting/number/get_copy()
return new /datum/nanite_extra_setting/number(value, min, max, unit)
diff --git a/code/modules/research/nanites/nanite_chamber_computer.dm b/code/modules/research/nanites/nanite_chamber_computer.dm
index 0750d3d268..4650af5c80 100644
--- a/code/modules/research/nanites/nanite_chamber_computer.dm
+++ b/code/modules/research/nanites/nanite_chamber_computer.dm
@@ -72,14 +72,14 @@
if("set_safety")
var/threshold = text2num(params["value"])
if(!isnull(threshold))
- chamber.set_safety(CLAMP(round(threshold, 1),0,500))
+ chamber.set_safety(clamp(round(threshold, 1),0,500))
playsound(src, "terminal_type", 25, FALSE)
chamber.occupant.investigate_log("'s nanites' safety threshold was set to [threshold] by [key_name(usr)] via [src] at [AREACOORD(src)].", INVESTIGATE_NANITES)
. = TRUE
if("set_cloud")
var/cloud_id = text2num(params["value"])
if(!isnull(cloud_id))
- chamber.set_cloud(CLAMP(round(cloud_id, 1),0,100))
+ chamber.set_cloud(clamp(round(cloud_id, 1),0,100))
playsound(src, "terminal_type", 25, FALSE)
chamber.occupant.investigate_log("'s nanites' cloud id was set to [cloud_id] by [key_name(usr)] via [src] at [AREACOORD(src)].", INVESTIGATE_NANITES)
. = TRUE
diff --git a/code/modules/research/nanites/nanite_cloud_controller.dm b/code/modules/research/nanites/nanite_cloud_controller.dm
index 439d0c5750..f9d4d71b01 100644
--- a/code/modules/research/nanites/nanite_cloud_controller.dm
+++ b/code/modules/research/nanites/nanite_cloud_controller.dm
@@ -174,7 +174,7 @@
var/cloud_id = new_backup_id
if(!isnull(cloud_id))
playsound(src, 'sound/machines/terminal_prompt.ogg', 50, FALSE)
- cloud_id = CLAMP(round(cloud_id, 1),1,100)
+ cloud_id = clamp(round(cloud_id, 1),1,100)
generate_backup(cloud_id, usr)
. = TRUE
if("delete_backup")
diff --git a/code/modules/research/nanites/nanite_program_hub.dm b/code/modules/research/nanites/nanite_program_hub.dm
index ea4392f236..47ee2447d2 100644
--- a/code/modules/research/nanites/nanite_program_hub.dm
+++ b/code/modules/research/nanites/nanite_program_hub.dm
@@ -21,7 +21,7 @@
list(name = "Augmentation Nanites"),
list(name = "Suppression Nanites"),
list(name = "Weaponized Nanites"),
- //list(name = "Protocols") B.E.P.I.S Content, which we dont have
+ list(name = "Protocols") //Moved to default techweb from B.E.P.I.S. research, for now
)
/obj/machinery/nanite_program_hub/Initialize()
diff --git a/code/modules/research/nanites/nanite_programmer.dm b/code/modules/research/nanites/nanite_programmer.dm
index d81880c6d9..5315a7a507 100644
--- a/code/modules/research/nanites/nanite_programmer.dm
+++ b/code/modules/research/nanites/nanite_programmer.dm
@@ -86,13 +86,13 @@
var/target_code = params["target_code"]
switch(target_code)
if("activation")
- program.activation_code = CLAMP(round(new_code, 1),0,9999)
+ program.activation_code = clamp(round(new_code, 1),0,9999)
if("deactivation")
- program.deactivation_code = CLAMP(round(new_code, 1),0,9999)
+ program.deactivation_code = clamp(round(new_code, 1),0,9999)
if("kill")
- program.kill_code = CLAMP(round(new_code, 1),0,9999)
+ program.kill_code = clamp(round(new_code, 1),0,9999)
if("trigger")
- program.trigger_code = CLAMP(round(new_code, 1),0,9999)
+ program.trigger_code = clamp(round(new_code, 1),0,9999)
. = TRUE
if("set_extra_setting")
program.set_extra_setting(params["target_setting"], params["value"])
@@ -102,7 +102,7 @@
var/timer = text2num(params["delay"])
if(!isnull(timer))
playsound(src, "terminal_type", 25, FALSE)
- timer = CLAMP(round(timer, 1), 0, 3600)
+ timer = clamp(round(timer, 1), 0, 3600)
timer *= 10 //convert to deciseconds
program.timer_restart = timer
. = TRUE
@@ -110,7 +110,7 @@
var/timer = text2num(params["delay"])
if(!isnull(timer))
playsound(src, "terminal_type", 25, FALSE)
- timer = CLAMP(round(timer, 1), 0, 3600)
+ timer = clamp(round(timer, 1), 0, 3600)
timer *= 10 //convert to deciseconds
program.timer_shutdown = timer
. = TRUE
@@ -118,7 +118,7 @@
var/timer = text2num(params["delay"])
if(!isnull(timer))
playsound(src, "terminal_type", 25, FALSE)
- timer = CLAMP(round(timer, 1), 0, 3600)
+ timer = clamp(round(timer, 1), 0, 3600)
timer *= 10 //convert to deciseconds
program.timer_trigger = timer
. = TRUE
@@ -126,7 +126,7 @@
var/timer = text2num(params["delay"])
if(!isnull(timer))
playsound(src, "terminal_type", 25, FALSE)
- timer = CLAMP(round(timer, 1), 0, 3600)
+ timer = clamp(round(timer, 1), 0, 3600)
timer *= 10 //convert to deciseconds
program.timer_trigger_delay = timer
. = TRUE
diff --git a/code/modules/research/nanites/nanite_programs.dm b/code/modules/research/nanites/nanite_programs.dm
index 72f969a77e..faa81be0a5 100644
--- a/code/modules/research/nanites/nanite_programs.dm
+++ b/code/modules/research/nanites/nanite_programs.dm
@@ -290,7 +290,7 @@
qdel(src)
///A nanite program containing a behaviour protocol. Only one protocol of each class can be active at once.
-//Currently unused due to us lacking the B.E.P.I.S
+//Moved to being 'normally' researched due to lack of B.E.P.I.S.
/datum/nanite_program/protocol
name = "Nanite Protocol"
var/protocol_class = NONE
diff --git a/code/modules/research/nanites/nanite_programs/protocols.dm b/code/modules/research/nanites/nanite_programs/protocols.dm
index 73976abe09..3830e7c8ba 100644
--- a/code/modules/research/nanites/nanite_programs/protocols.dm
+++ b/code/modules/research/nanites/nanite_programs/protocols.dm
@@ -105,3 +105,14 @@
/datum/nanite_program/protocol/offline/active_effect()
nanites.adjust_nanites(null, boost)
+
+/datum/nanite_program/protocol/synergy
+ name = "Synergy Protocol"
+ desc = "Replication Protocol: the nanites syncronize their tasks and processes within a host, leading to an increase in replication speed proportional to the current nanite volume."
+ use_rate = 0
+ rogue_types = list(/datum/nanite_program/necrotic)
+ protocol_class = NANITE_PROTOCOL_REPLICATION
+ var/max_boost = 2 //The maximum boost this program applies to the nanite replication, multiplied with the current nanite 'saturation' percentage
+
+/datum/nanite_program/protocol/synergy/active_effect()
+ nanites.adjust_nanites(null, round(max_boost * (nanites.nanite_volume / nanites.max_nanites), 0.1))
diff --git a/code/modules/research/nanites/nanite_programs/weapon.dm b/code/modules/research/nanites/nanite_programs/weapon.dm
index bd2b9618de..ae0d8d35aa 100644
--- a/code/modules/research/nanites/nanite_programs/weapon.dm
+++ b/code/modules/research/nanites/nanite_programs/weapon.dm
@@ -84,7 +84,7 @@
/datum/nanite_program/explosive/on_trigger(comm_message)
host_mob.visible_message("[host_mob] starts emitting a high-pitched buzzing, and [host_mob.p_their()] skin begins to glow...",\
"You start emitting a high-pitched buzzing, and your skin begins to glow...")
- addtimer(CALLBACK(src, .proc/boom), CLAMP((nanites.nanite_volume * 0.35), 25, 150))
+ addtimer(CALLBACK(src, .proc/boom), clamp((nanites.nanite_volume * 0.35), 25, 150))
/datum/nanite_program/explosive/proc/boom()
var/nanite_amount = nanites.nanite_volume
diff --git a/code/modules/research/nanites/nanite_remote.dm b/code/modules/research/nanites/nanite_remote.dm
index 71aecc8f2c..0d9361b534 100644
--- a/code/modules/research/nanites/nanite_remote.dm
+++ b/code/modules/research/nanites/nanite_remote.dm
@@ -106,7 +106,7 @@
return
var/new_code = text2num(params["code"])
if(!isnull(new_code))
- new_code = CLAMP(round(new_code, 1),0,9999)
+ new_code = clamp(round(new_code, 1),0,9999)
code = new_code
. = TRUE
if("set_relay_code")
@@ -114,7 +114,7 @@
return
var/new_code = text2num(params["code"])
if(!isnull(new_code))
- new_code = CLAMP(round(new_code, 1),0,9999)
+ new_code = clamp(round(new_code, 1),0,9999)
relay_code = new_code
. = TRUE
if("update_name")
diff --git a/code/modules/research/rdconsole.dm b/code/modules/research/rdconsole.dm
index be1b9460b0..19f6e3ffdb 100644
--- a/code/modules/research/rdconsole.dm
+++ b/code/modules/research/rdconsole.dm
@@ -301,15 +301,26 @@ Nothing else in the console has ID requirements.
temp_material += " [all_materials[M]/coeff] [CallMaterialName(M)]"
c = min(c,t)
- if (c >= 1)
+ var/clearance = !(linked_lathe.obj_flags & EMAGGED) && (linked_lathe.offstation_security_levels || is_station_level(linked_lathe.z))
+ var/sec_text = ""
+ if(clearance && (D.min_security_level > SEC_LEVEL_GREEN || D.max_security_level < SEC_LEVEL_DELTA))
+ sec_text = " (Allowed security levels: "
+ for(var/n in D.min_security_level to D.max_security_level)
+ sec_text += NUM2SECLEVEL(n)
+ if(n + 1 <= D.max_security_level)
+ sec_text += ", "
+ sec_text += ")"
+
+ clearance = !clearance || ISINRANGE(GLOB.security_level, D.min_security_level, D.max_security_level)
+ if (c >= 1 && clearance)
l += "[D.name][RDSCREEN_NOBREAK]"
if(c >= 5)
l += "x5[RDSCREEN_NOBREAK]"
if(c >= 10)
l += "x10[RDSCREEN_NOBREAK]"
- l += "[temp_material][RDSCREEN_NOBREAK]"
+ l += "[temp_material][sec_text][RDSCREEN_NOBREAK]"
else
- l += "[D.name][temp_material][RDSCREEN_NOBREAK]"
+ l += "[D.name][temp_material][sec_text][RDSCREEN_NOBREAK]"
l += ""
l += ""
return l
diff --git a/code/modules/research/techweb/all_nodes.dm b/code/modules/research/techweb/all_nodes.dm
index dafa119873..002bb3d64b 100644
--- a/code/modules/research/techweb/all_nodes.dm
+++ b/code/modules/research/techweb/all_nodes.dm
@@ -535,7 +535,7 @@
display_name = "Combat Cybernetic Implants"
description = "Military grade combat implants to improve performance."
prereq_ids = list("adv_cyber_implants","weaponry","NVGtech","high_efficiency")
- design_ids = list("ci-xray", "ci-thermals", "ci-antidrop", "ci-antistun", "ci-thrusters")
+ design_ids = list("ci-xray", "ci-thermals", "ci-antidrop", "ci-antistun", "ci-thrusters", "ci-shield")
research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 2500)
////////////////////////Tools////////////////////////
@@ -544,7 +544,7 @@
display_name = "Basic Tools"
description = "Basic mechanical, electronic, surgical and botanical tools."
prereq_ids = list("base")
- design_ids = list("screwdriver", "wrench", "wirecutters", "crowbar", "multitool", "welding_tool", "tscanner", "analyzer", "cable_coil", "pipe_painter", "airlock_painter", "scalpel", "circular_saw", "surgicaldrill", "retractor", "cautery", "hemostat", "cultivator", "plant_analyzer", "shovel", "spade", "hatchet", "mop", "broom")
+ design_ids = list("screwdriver", "wrench", "wirecutters", "crowbar", "multitool", "welding_tool", "tscanner", "analyzer", "cable_coil", "pipe_painter", "airlock_painter", "scalpel", "circular_saw", "surgicaldrill", "retractor", "cautery", "hemostat", "cultivator", "plant_analyzer", "shovel", "spade", "hatchet", "mop", "broom", "normtrash")
research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 500)
/datum/techweb_node/basic_mining
@@ -568,7 +568,7 @@
display_name = "Advanced Sanitation Technology"
description = "Clean things better, faster, stronger, and harder!"
prereq_ids = list("adv_engi")
- design_ids = list("advmop", "buffer", "light_replacer", "spraybottle", "beartrap", "ci-janitor")
+ design_ids = list("advmop", "buffer", "light_replacer", "spraybottle", "beartrap", "ci-janitor", "paint_remover")
research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 1750) // No longer has its bag
/datum/techweb_node/botany
@@ -609,7 +609,7 @@
display_name = "Advanced Weapon Development Technology"
description = "Our weapons are breaking the rules of reality by now."
prereq_ids = list("adv_engi", "weaponry")
- design_ids = list("pin_loyalty")
+ design_ids = list("pin_loyalty", "laser_shield", "bullet_shield")
research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 7500)
/datum/techweb_node/electric_weapons
@@ -957,6 +957,14 @@
design_ids = list("spreading_nanites","mindcontrol_nanites","mitosis_nanites")
research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 10000)
+/datum/techweb_node/nanite_replication_protocols
+ id = "nanite_replication_protocols"
+ display_name = "Nanite Replication Protocols"
+ description = "Advanced behaviours that allow nanites to exploit certain circumstances to replicate faster."
+ prereq_ids = list("nanite_smart")
+ design_ids = list("kickstart_nanites","factory_nanites","tinker_nanites","offline_nanites","synergy_nanites")
+ research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 5000)
+
////////////////////////Alien technology////////////////////////
/datum/techweb_node/alientech //AYYYYYYYYLMAOO tech
id = "alientech"
diff --git a/code/modules/research/xenobiology/crossbreeding/_status_effects.dm b/code/modules/research/xenobiology/crossbreeding/_status_effects.dm
index 95d6c49529..e153176cbe 100644
--- a/code/modules/research/xenobiology/crossbreeding/_status_effects.dm
+++ b/code/modules/research/xenobiology/crossbreeding/_status_effects.dm
@@ -191,7 +191,7 @@
alert_type = /obj/screen/alert/status_effect/bloodchill
/datum/status_effect/bloodchill/on_apply()
- owner.add_movespeed_modifier("bloodchilled", TRUE, 100, NONE, override = TRUE, multiplicative_slowdown = 3)
+ owner.add_movespeed_modifier(/datum/movespeed_modifier/status_effect/bloodchill)
return ..()
/datum/status_effect/bloodchill/tick()
@@ -199,7 +199,7 @@
owner.adjustFireLoss(2)
/datum/status_effect/bloodchill/on_remove()
- owner.remove_movespeed_modifier("bloodchilled")
+ owner.remove_movespeed_modifier(/datum/movespeed_modifier/status_effect/bloodchill)
return ..()
/obj/screen/alert/status_effect/bloodchill
@@ -213,7 +213,7 @@
alert_type = /obj/screen/alert/status_effect/bonechill
/datum/status_effect/bonechill/on_apply()
- owner.add_movespeed_modifier("bonechilled", TRUE, 100, NONE, override = TRUE, multiplicative_slowdown = 3)
+ owner.add_movespeed_modifier(/datum/movespeed_modifier/status_effect/bonechill)
return ..()
/datum/status_effect/bonechill/tick()
@@ -223,7 +223,7 @@
owner.adjust_bodytemperature(-10)
/datum/status_effect/bonechill/on_remove()
- owner.remove_movespeed_modifier("bonechilled")
+ owner.remove_movespeed_modifier(/datum/movespeed_modifier/status_effect/bonechill)
return ..()
/obj/screen/alert/status_effect/bonechill
@@ -385,11 +385,11 @@ datum/status_effect/rebreathing/tick()
duration = 30
/datum/status_effect/tarfoot/on_apply()
- owner.add_movespeed_modifier(MOVESPEED_ID_TARFOOT, update=TRUE, priority=100, multiplicative_slowdown=0.5, blacklisted_movetypes=(FLYING|FLOATING))
+ owner.add_movespeed_modifier(/datum/movespeed_modifier/status_effect/tarfoot)
return ..()
/datum/status_effect/tarfoot/on_remove()
- owner.remove_movespeed_modifier(MOVESPEED_ID_TARFOOT)
+ owner.remove_movespeed_modifier(/datum/movespeed_modifier/status_effect/tarfoot)
return ..()
/datum/status_effect/spookcookie
@@ -624,9 +624,9 @@ datum/status_effect/stabilized/blue/on_remove()
O.extinguish() //All shamelessly copied from water's reaction_obj, since I didn't seem to be able to get it here for some reason.
O.acid_level = 0
// Monkey cube
- if(istype(O, /obj/item/reagent_containers/food/snacks/monkeycube))
+ if(istype(O, /obj/item/reagent_containers/food/snacks/cube))
to_chat(owner, "[linked_extract] kept your hands wet! It makes [O] expand!")
- var/obj/item/reagent_containers/food/snacks/monkeycube/cube = O
+ var/obj/item/reagent_containers/food/snacks/cube/cube = O
cube.Expand()
// Dehydrated carp
@@ -707,15 +707,15 @@ datum/status_effect/stabilized/blue/on_remove()
/datum/status_effect/stabilized/sepia/tick()
if(prob(50) && mod > -1)
mod--
- owner.add_movespeed_modifier(MOVESPEED_ID_SEPIA, update=TRUE, priority=100, multiplicative_slowdown=-1, blacklisted_movetypes=(FLYING|FLOATING))
+ owner.add_or_update_variable_movespeed_modifier(/datum/movespeed_modifier/status_effect/sepia, multiplicative_slowdown = 1)
else if(mod < 1)
mod++
// yeah a value of 0 does nothing but replacing the trait in place is cheaper than removing and adding repeatedly
- owner.add_movespeed_modifier(MOVESPEED_ID_SEPIA, update=TRUE, priority=100, multiplicative_slowdown=0, blacklisted_movetypes=(FLYING|FLOATING))
+ owner.add_or_update_variable_movespeed_modifier(/datum/movespeed_modifier/status_effect/sepia, multiplicative_slowdown = 0)
return ..()
/datum/status_effect/stabilized/sepia/on_remove()
- owner.remove_movespeed_modifier(MOVESPEED_ID_SEPIA)
+ owner.remove_movespeed_modifier(/datum/movespeed_modifier/status_effect/sepia)
return ..()
/datum/status_effect/stabilized/cerulean
@@ -777,11 +777,11 @@ datum/status_effect/stabilized/blue/on_remove()
colour = "red"
/datum/status_effect/stabilized/red/on_apply()
- owner.ignore_slowdown("slimestatus")
- return ..()
+ . = ..()
+ owner.add_movespeed_mod_immunities(type, /datum/movespeed_modifier/equipment_speedmod)
/datum/status_effect/stabilized/red/on_remove()
- owner.unignore_slowdown("slimestatus")
+ owner.remove_movespeed_mod_immunities(type, /datum/movespeed_modifier/equipment_speedmod)
return ..()
/datum/status_effect/stabilized/green
diff --git a/code/modules/research/xenobiology/crossbreeding/industrial.dm b/code/modules/research/xenobiology/crossbreeding/industrial.dm
index bec2c2c1ae..ac9d2e58c5 100644
--- a/code/modules/research/xenobiology/crossbreeding/industrial.dm
+++ b/code/modules/research/xenobiology/crossbreeding/industrial.dm
@@ -53,7 +53,7 @@ Industrial extracts:
/obj/item/slimecross/industrial/grey
colour = "grey"
- itempath = /obj/item/reagent_containers/food/snacks/monkeycube
+ itempath = /obj/item/reagent_containers/food/snacks/cube/monkey
itemamount = 5
/obj/item/slimecross/industrial/orange
diff --git a/code/modules/research/xenobiology/crossbreeding/reproductive.dm b/code/modules/research/xenobiology/crossbreeding/reproductive.dm
index 2f6ca9555a..3662f45355 100644
--- a/code/modules/research/xenobiology/crossbreeding/reproductive.dm
+++ b/code/modules/research/xenobiology/crossbreeding/reproductive.dm
@@ -19,14 +19,14 @@ Reproductive extracts:
return
if(istype(O, /obj/item/storage/bag/bio))
var/list/inserted = list()
- SEND_SIGNAL(O, COMSIG_TRY_STORAGE_TAKE_TYPE, /obj/item/reagent_containers/food/snacks/monkeycube, src, 1, null, null, user, inserted)
+ SEND_SIGNAL(O, COMSIG_TRY_STORAGE_TAKE_TYPE, /obj/item/reagent_containers/food/snacks/cube/monkey, src, 1, null, null, user, inserted)
if(inserted.len)
- var/obj/item/reagent_containers/food/snacks/monkeycube/M = inserted[1]
+ var/obj/item/reagent_containers/food/snacks/cube/monkey/M = inserted[1]
if(istype(M))
eat_cube(M, user)
else
to_chat(user, "There are no monkey cubes in the bio bag!")
- if(istype(O,/obj/item/reagent_containers/food/snacks/monkeycube))
+ if(istype(O,/obj/item/reagent_containers/food/snacks/cube/monkey))
eat_cube(O, user)
if(cubes_eaten >= 3)
var/cores = rand(1,4)
diff --git a/code/modules/research/xenobiology/xenobio_camera.dm b/code/modules/research/xenobiology/xenobio_camera.dm
index 5492e9bc38..ef9c751d57 100644
--- a/code/modules/research/xenobiology/xenobio_camera.dm
+++ b/code/modules/research/xenobiology/xenobio_camera.dm
@@ -146,7 +146,7 @@
else
to_chat(user, "[src] already has the contents of [O] installed!")
return
- if(istype(O, /obj/item/reagent_containers/food/snacks/monkeycube) && (upgradetier & XENOBIO_UPGRADE_MONKEYS)) //CIT CHANGE - makes monkey-related actions require XENOBIO_UPGRADE_MONKEYS
+ if(istype(O, /obj/item/reagent_containers/food/snacks/cube/monkey) && (upgradetier & XENOBIO_UPGRADE_MONKEYS)) //CIT CHANGE - makes monkey-related actions require XENOBIO_UPGRADE_MONKEYS
monkeys++
to_chat(user, "You feed [O] to [src]. It now has [monkeys] monkey cubes stored.")
qdel(O)
@@ -155,7 +155,7 @@
var/obj/item/storage/P = O
var/loaded = FALSE
for(var/obj/G in P.contents)
- if(istype(G, /obj/item/reagent_containers/food/snacks/monkeycube))
+ if(istype(G, /obj/item/reagent_containers/food/snacks/cube/monkey))
loaded = TRUE
monkeys++
qdel(G)
diff --git a/code/modules/research/xenobiology/xenobiology.dm b/code/modules/research/xenobiology/xenobiology.dm
index a346cd697f..573a735f98 100644
--- a/code/modules/research/xenobiology/xenobiology.dm
+++ b/code/modules/research/xenobiology/xenobiology.dm
@@ -83,7 +83,7 @@
/obj/item/slime_extract/grey/activate(mob/living/carbon/human/user, datum/species/jelly/luminescent/species, activation_type)
switch(activation_type)
if(SLIME_ACTIVATE_MINOR)
- var/obj/item/reagent_containers/food/snacks/monkeycube/M = new
+ var/obj/item/reagent_containers/food/snacks/cube/monkey/M = new
if(!user.put_in_active_hand(M))
M.forceMove(user.drop_location())
playsound(user, 'sound/effects/splat.ogg', 50, 1)
@@ -801,7 +801,7 @@
return
to_chat(user, "You feed the slime the stabilizer. It is now less likely to mutate.")
- M.mutation_chance = CLAMP(M.mutation_chance-15,0,100)
+ M.mutation_chance = clamp(M.mutation_chance-15,0,100)
qdel(src)
/obj/item/slimepotion/slime/mutator
@@ -825,7 +825,7 @@
return
to_chat(user, "You feed the slime the mutator. It is now more likely to mutate.")
- M.mutation_chance = CLAMP(M.mutation_chance+12,0,100)
+ M.mutation_chance = clamp(M.mutation_chance+12,0,100)
M.mutator_used = TRUE
qdel(src)
diff --git a/code/modules/ruins/lavaland_ruin_code.dm b/code/modules/ruins/lavaland_ruin_code.dm
index d09c1ce86f..2192b2fddb 100644
--- a/code/modules/ruins/lavaland_ruin_code.dm
+++ b/code/modules/ruins/lavaland_ruin_code.dm
@@ -142,7 +142,7 @@
uniform = /obj/item/clothing/under/syndicate
suit = /obj/item/clothing/suit/toggle/labcoat
shoes = /obj/item/clothing/shoes/combat
- gloves = /obj/item/clothing/gloves/combat
+ gloves = /obj/item/clothing/gloves/tackler/combat/insulated
ears = /obj/item/radio/headset/syndicate/alt
back = /obj/item/storage/backpack
r_pocket = /obj/item/gun/ballistic/automatic/pistol
diff --git a/code/modules/security_levels/keycard_authentication.dm b/code/modules/security_levels/keycard_authentication.dm
index 8a58563407..b9dc9b92d3 100644
--- a/code/modules/security_levels/keycard_authentication.dm
+++ b/code/modules/security_levels/keycard_authentication.dm
@@ -41,7 +41,7 @@ GLOBAL_DATUM_INIT(keycard_events, /datum/events, new)
var/list/data = list()
data["waiting"] = waiting
data["auth_required"] = event_source ? event_source.event : 0
- data["red_alert"] = (seclevel2num(get_security_level()) >= SEC_LEVEL_RED) ? 1 : 0
+ data["red_alert"] = (SECLEVEL2NUM(NUM2SECLEVEL(GLOB.security_level)) >= SEC_LEVEL_RED) ? 1 : 0
data["emergency_maint"] = GLOB.emergency_access
data["bsa_unlock"] = GLOB.bsa_unlock
return data
diff --git a/code/modules/security_levels/security_levels.dm b/code/modules/security_levels/security_levels.dm
index 887891ca16..52fafb81be 100644
--- a/code/modules/security_levels/security_levels.dm
+++ b/code/modules/security_levels/security_levels.dm
@@ -5,20 +5,17 @@ GLOBAL_VAR_INIT(security_level, SEC_LEVEL_GREEN)
//SEC_LEVEL_RED = code red
//SEC_LEVEL_DELTA = code delta
+ /*
+ * All security levels, per ascending alert. Nothing too fancy, really.
+ * Their positions should also match their numerical values.
+ */
+GLOBAL_LIST_INIT(all_security_levels, list("green", "blue", "amber", "red", "delta"))
+
//config.alert_desc_blue_downto
/proc/set_security_level(level)
- switch(level)
- if("green")
- level = SEC_LEVEL_GREEN
- if("blue")
- level = SEC_LEVEL_BLUE
- if("amber")
- level = SEC_LEVEL_AMBER
- if("red")
- level = SEC_LEVEL_RED
- if("delta")
- level = SEC_LEVEL_DELTA
+ if(!isnum(level))
+ level = GLOB.all_security_levels.Find(level)
//Will not be announced if you try to set to the same level as it already is
if(level >= SEC_LEVEL_GREEN && level <= SEC_LEVEL_DELTA && level != GLOB.security_level)
@@ -111,46 +108,7 @@ GLOBAL_VAR_INIT(security_level, SEC_LEVEL_GREEN)
if(D.red_alert_access)
D.visible_message("[D] whirrs as it automatically lifts access requirements!")
playsound(D, 'sound/machines/boltsup.ogg', 50, TRUE)
- SSblackbox.record_feedback("tally", "security_level_changes", 1, get_security_level())
+ SSblackbox.record_feedback("tally", "security_level_changes", 1, NUM2SECLEVEL(GLOB.security_level))
SSnightshift.check_nightshift()
else
return
-
-/proc/get_security_level()
- switch(GLOB.security_level)
- if(SEC_LEVEL_GREEN)
- return "green"
- if(SEC_LEVEL_BLUE)
- return "blue"
- if(SEC_LEVEL_AMBER)
- return "amber"
- if(SEC_LEVEL_RED)
- return "red"
- if(SEC_LEVEL_DELTA)
- return "delta"
-
-/proc/num2seclevel(num)
- switch(num)
- if(SEC_LEVEL_GREEN)
- return "green"
- if(SEC_LEVEL_BLUE)
- return "blue"
- if(SEC_LEVEL_AMBER)
- return "amber"
- if(SEC_LEVEL_RED)
- return "red"
- if(SEC_LEVEL_DELTA)
- return "delta"
-
-/proc/seclevel2num(seclevel)
- switch( lowertext(seclevel) )
- if("green")
- return SEC_LEVEL_GREEN
- if("blue")
- return SEC_LEVEL_BLUE
- if("amber")
- return SEC_LEVEL_AMBER
- if("red")
- return SEC_LEVEL_RED
- if("delta")
- return SEC_LEVEL_DELTA
diff --git a/code/modules/shuttle/emergency.dm b/code/modules/shuttle/emergency.dm
index cd08b7290a..f3b4cbddc9 100644
--- a/code/modules/shuttle/emergency.dm
+++ b/code/modules/shuttle/emergency.dm
@@ -310,7 +310,7 @@
/obj/docking_port/mobile/emergency/request(obj/docking_port/stationary/S, area/signalOrigin, reason, redAlert, set_coefficient=null, silent = FALSE)
if(!isnum(set_coefficient))
- var/security_num = seclevel2num(get_security_level())
+ var/security_num = SECLEVEL2NUM(NUM2SECLEVEL(GLOB.security_level))
switch(security_num)
if(SEC_LEVEL_GREEN)
set_coefficient = 2
diff --git a/code/modules/shuttle/shuttle.dm b/code/modules/shuttle/shuttle.dm
index 2c466564ff..665361af49 100644
--- a/code/modules/shuttle/shuttle.dm
+++ b/code/modules/shuttle/shuttle.dm
@@ -757,13 +757,13 @@
var/change_per_engine = (1 - ENGINE_COEFF_MIN) / ENGINE_DEFAULT_MAXSPEED_ENGINES // 5 by default
if(initial_engines > 0)
change_per_engine = (1 - ENGINE_COEFF_MIN) / initial_engines // or however many it had
- return CLAMP(1 - delta * change_per_engine,ENGINE_COEFF_MIN,ENGINE_COEFF_MAX)
+ return clamp(1 - delta * change_per_engine,ENGINE_COEFF_MIN,ENGINE_COEFF_MAX)
if(new_value < initial_engines)
var/delta = initial_engines - new_value
var/change_per_engine = 1 //doesn't really matter should not be happening for 0 engine shuttles
if(initial_engines > 0)
change_per_engine = (ENGINE_COEFF_MAX - 1) / initial_engines //just linear drop to max delay
- return CLAMP(1 + delta * change_per_engine,ENGINE_COEFF_MIN,ENGINE_COEFF_MAX)
+ return clamp(1 + delta * change_per_engine,ENGINE_COEFF_MIN,ENGINE_COEFF_MAX)
/obj/docking_port/mobile/proc/in_flight()
diff --git a/code/modules/shuttle/special.dm b/code/modules/shuttle/special.dm
index 033187e353..87f9b55aa9 100644
--- a/code/modules/shuttle/special.dm
+++ b/code/modules/shuttle/special.dm
@@ -122,7 +122,7 @@
/obj/structure/table/abductor/wabbajack/proc/sleeper_dreams(mob/living/sleeper)
if(sleeper in sleepers)
to_chat(sleeper, "While you slumber, you have the strangest dream, like you can see yourself from the outside.")
- sleeper.ghostize(TRUE)
+ sleeper.ghostize(TRUE, voluntary = TRUE)
/obj/structure/table/abductor/wabbajack/left
desc = "You sleep so it may wake."
diff --git a/code/modules/spells/spell_types/wizard.dm b/code/modules/spells/spell_types/wizard.dm
index ace542126c..e9432e2f58 100644
--- a/code/modules/spells/spell_types/wizard.dm
+++ b/code/modules/spells/spell_types/wizard.dm
@@ -297,7 +297,7 @@
var/mob/living/M = AM
M.DefaultCombatKnockdown(stun_amt, override_hardstun = stun_amt * 0.2)
to_chat(M, "You're thrown back by [user]!")
- AM.throw_at(throwtarget, ((CLAMP((maxthrow - (CLAMP(distfromcaster - 2, 0, distfromcaster))), 3, maxthrow))), 1,user)//So stuff gets tossed around at the same time.
+ AM.throw_at(throwtarget, ((clamp((maxthrow - (clamp(distfromcaster - 2, 0, distfromcaster))), 3, maxthrow))), 1,user)//So stuff gets tossed around at the same time.
safety--
/obj/effect/proc_holder/spell/aoe_turf/repulse/xeno //i fixed conflicts only to find out that this is in the WIZARD file instead of the xeno file?!
diff --git a/code/modules/station_goals/dna_vault.dm b/code/modules/station_goals/dna_vault.dm
index 2aae17b0f3..6c21456e63 100644
--- a/code/modules/station_goals/dna_vault.dm
+++ b/code/modules/station_goals/dna_vault.dm
@@ -276,7 +276,7 @@
ADD_TRAIT(H, TRAIT_PIERCEIMMUNE, "dna_vault")
if(VAULT_SPEED)
to_chat(H, "Your legs feel faster.")
- H.add_movespeed_modifier(MOVESPEED_ID_DNA_VAULT, update=TRUE, priority=100, multiplicative_slowdown=-1, blacklisted_movetypes=(FLYING|FLOATING))
+ H.add_movespeed_modifier(/datum/movespeed_modifier/dna_vault_speedup)
if(VAULT_QUICK)
to_chat(H, "Your arms move as fast as lightning.")
H.next_move_modifier = 0.5
diff --git a/code/modules/surgery/bodyparts/bodyparts.dm b/code/modules/surgery/bodyparts/bodyparts.dm
index d6f0866936..dd31145491 100644
--- a/code/modules/surgery/bodyparts/bodyparts.dm
+++ b/code/modules/surgery/bodyparts/bodyparts.dm
@@ -164,8 +164,8 @@
return FALSE
switch(animal_origin)
- if(ALIEN_BODYPART,LARVA_BODYPART) //aliens take double burn //nothing can burn with so much snowflake code around
- burn *= 2
+ if(ALIEN_BODYPART,LARVA_BODYPART) //aliens take some additional burn //nothing can burn with so much snowflake code around
+ burn *= 1.2
var/can_inflict = max_damage - get_damage()
if(can_inflict <= 0)
@@ -183,7 +183,7 @@
//We've dealt the physical damages, if there's room lets apply the stamina damage.
var/current_damage = get_damage(TRUE) //This time around, count stamina loss too.
var/available_damage = max_damage - current_damage
- stamina_dam += round(CLAMP(stamina, 0, min(max_stamina_damage - stamina_dam, available_damage)), DAMAGE_PRECISION)
+ stamina_dam += round(clamp(stamina, 0, min(max_stamina_damage - stamina_dam, available_damage)), DAMAGE_PRECISION)
if(disabled && stamina > 10)
incoming_stam_mult = max(0.01, incoming_stam_mult/(stamina*0.1))
diff --git a/code/modules/surgery/bodyparts/dismemberment.dm b/code/modules/surgery/bodyparts/dismemberment.dm
index 276d4893de..66bca919c4 100644
--- a/code/modules/surgery/bodyparts/dismemberment.dm
+++ b/code/modules/surgery/bodyparts/dismemberment.dm
@@ -16,7 +16,7 @@
return FALSE
var/obj/item/bodypart/affecting = C.get_bodypart(BODY_ZONE_CHEST)
- affecting.receive_damage(CLAMP(brute_dam/2 * affecting.body_damage_coeff, 15, 50), CLAMP(burn_dam/2 * affecting.body_damage_coeff, 0, 50)) //Damage the chest based on limb's existing damage
+ affecting.receive_damage(clamp(brute_dam/2 * affecting.body_damage_coeff, 15, 50), clamp(burn_dam/2 * affecting.body_damage_coeff, 0, 50)) //Damage the chest based on limb's existing damage
C.visible_message("[C]'s [src.name] has been violently dismembered!")
C.emote("scream")
SEND_SIGNAL(C, COMSIG_ADD_MOOD_EVENT, "dismembered", /datum/mood_event/dismembered)
diff --git a/code/modules/surgery/helpers.dm b/code/modules/surgery/helpers.dm
index 773048f838..7a92b39692 100644
--- a/code/modules/surgery/helpers.dm
+++ b/code/modules/surgery/helpers.dm
@@ -89,18 +89,23 @@
"You remove [I] from [M]'s [parse_zone(selected_zone)].")
qdel(S)
else if(S.can_cancel)
- var/close_tool_type = /obj/item/cautery
+ var/required_tool_type = TOOL_CAUTERY
var/obj/item/close_tool = user.get_inactive_held_item()
var/is_robotic = S.requires_bodypart_type == BODYPART_ROBOTIC
if(is_robotic)
- close_tool_type = /obj/item/screwdriver
- if(istype(close_tool, close_tool_type) || iscyborg(user))
- M.surgeries -= S
- user.visible_message("[user] closes [M]'s [parse_zone(selected_zone)] with [close_tool] and removes [I].", \
- "You close [M]'s [parse_zone(selected_zone)] with [close_tool] and remove [I].")
- qdel(S)
- else
+ required_tool_type = TOOL_SCREWDRIVER
+ if(iscyborg(user))
+ close_tool = locate(/obj/item/cautery) in user.held_items
+ if(!close_tool)
+ to_chat(user, "You need to equip a cautery in an inactive slot to stop [M]'s surgery!")
+ return
+ else if(!close_tool || close_tool.tool_behaviour != required_tool_type)
to_chat(user, "You need to hold a [is_robotic ? "screwdriver" : "cautery"] in your inactive hand to stop [M]'s surgery!")
+ return
+ M.surgeries -= S
+ user.visible_message("[user] closes [M]'s [parse_zone(selected_zone)] with [close_tool] and removes [I].", \
+ "You close [M]'s [parse_zone(selected_zone)] with [close_tool] and remove [I].")
+ qdel(S)
/proc/get_location_modifier(mob/M)
var/turf/T = get_turf(M)
diff --git a/code/modules/surgery/organs/augments_arms.dm b/code/modules/surgery/organs/augments_arms.dm
index daf3324980..e01059204c 100644
--- a/code/modules/surgery/organs/augments_arms.dm
+++ b/code/modules/surgery/organs/augments_arms.dm
@@ -20,7 +20,28 @@
update_icon()
SetSlotFromZone()
- items_list = contents.Copy()
+ for(var/obj/item/I in contents)
+ add_item(I)
+
+/obj/item/organ/cyberimp/arm/proc/add_item(obj/item/I)
+ if(I in items_list)
+ return
+ I.forceMove(src)
+ items_list += I
+ // ayy only dropped signal for performance, we can't possibly have shitcode that doesn't call it when removing items from a mob, right?
+ // .. right??!
+ RegisterSignal(I, COMSIG_ITEM_DROPPED, .proc/magnetic_catch)
+
+/obj/item/organ/cyberimp/arm/proc/magnetic_catch(datum/source, mob/user)
+ . = COMPONENT_DROPPED_RELOCATION
+ var/obj/item/I = source //if someone is misusing the signal, just runtime
+ if(I in items_list)
+ if(I in contents) //already in us somehow? i probably shouldn't catch this so it's easier to spot bugs but eh..
+ return
+ I.visible_message("[I] snaps back into [src]!")
+ I.forceMove(src)
+ if(I == holder)
+ holder = null
/obj/item/organ/cyberimp/arm/proc/SetSlotFromZone()
switch(zone)
@@ -62,7 +83,7 @@
. = ..()
if(. & EMP_PROTECT_SELF)
return
- if(prob(15/severity) && owner)
+ if(owner)
to_chat(owner, "[src] is hit by EMP!")
// give the owner an idea about why his implant is glitching
Retract()
@@ -75,29 +96,20 @@
"[holder] snaps back into your [zone == BODY_ZONE_R_ARM ? "right" : "left"] arm.",
"You hear a short mechanical noise.")
- if(istype(holder, /obj/item/assembly/flash/armimplant))
- var/obj/item/assembly/flash/F = holder
- F.set_light(0)
-
owner.transferItemToLoc(holder, src, TRUE)
holder = null
playsound(get_turf(owner), 'sound/mecha/mechmove03.ogg', 50, 1)
-/obj/item/organ/cyberimp/arm/proc/Extend(var/obj/item/item)
+/obj/item/organ/cyberimp/arm/proc/Extend(obj/item/item)
if(!(item in src))
return
holder = item
- ADD_TRAIT(holder, TRAIT_NODROP, HAND_REPLACEMENT_TRAIT)
holder.resistance_flags = INDESTRUCTIBLE | LAVA_PROOF | FIRE_PROOF | UNACIDABLE | ACID_PROOF
holder.slot_flags = null
holder.set_custom_materials(null)
- if(istype(holder, /obj/item/assembly/flash/armimplant))
- var/obj/item/assembly/flash/F = holder
- F.set_light(7)
-
var/obj/item/arm_item = owner.get_active_held_item()
if(arm_item)
@@ -223,21 +235,6 @@
icon_state = "arm_taser"
contents = newlist(/obj/item/gun/energy/e_gun/advtaser/mounted)
-/obj/item/organ/cyberimp/arm/gun/emp_act(severity)
- . = ..()
- if(. & EMP_PROTECT_SELF)
- return
- if(prob(30/severity) && owner && !(organ_flags & ORGAN_FAILING))
- Retract()
- owner.visible_message("A loud bang comes from [owner]\'s [zone == BODY_ZONE_R_ARM ? "right" : "left"] arm!")
- playsound(get_turf(owner), 'sound/weapons/flashbang.ogg', 100, 1)
- to_chat(owner, "You feel an explosion erupt inside your [zone == BODY_ZONE_R_ARM ? "right" : "left"] arm as your implant breaks!")
- owner.adjust_fire_stacks(20)
- owner.IgniteMob()
- owner.adjustFireLoss(25)
- crit_fail = 1
- organ_flags |= ORGAN_FAILING
-
/obj/item/organ/cyberimp/arm/flash
name = "integrated high-intensity photon projector" //Why not
desc = "An integrated projector mounted onto a user's arm that is able to be used as a powerful flash."
@@ -275,6 +272,12 @@
desc = "A deployable riot shield to help deal with civil unrest."
contents = newlist(/obj/item/shield/riot/implant)
+/obj/item/organ/cyberimp/arm/shield/Extend(obj/item/I)
+ if(I.obj_integrity == 0) //that's how the shield recharge works
+ to_chat(owner, "[I] is still too unstable to extend. Give it some time!")
+ return FALSE
+ return ..()
+
/obj/item/organ/cyberimp/arm/shield/emag_act()
. = ..()
if(obj_flags & EMAGGED)
diff --git a/code/modules/surgery/organs/augments_chest.dm b/code/modules/surgery/organs/augments_chest.dm
index 47a452cc76..eb42303060 100644
--- a/code/modules/surgery/organs/augments_chest.dm
+++ b/code/modules/surgery/organs/augments_chest.dm
@@ -165,14 +165,14 @@
if(allow_thrust(0.01))
ion_trail.start()
RegisterSignal(owner, COMSIG_MOVABLE_MOVED, .proc/move_react)
- owner.add_movespeed_modifier(MOVESPEED_ID_CYBER_THRUSTER, priority=100, multiplicative_slowdown=-2, movetypes=FLOATING, conflict=MOVE_CONFLICT_JETPACK)
+ owner.add_movespeed_modifier(/datum/movespeed_modifier/jetpack/cybernetic)
if(!silent)
to_chat(owner, "You turn your thrusters set on.")
else
ion_trail.stop()
if(!QDELETED(owner))
UnregisterSignal(owner, COMSIG_MOVABLE_MOVED)
- owner.remove_movespeed_modifier(MOVESPEED_ID_CYBER_THRUSTER)
+ owner.remove_movespeed_modifier(/datum/movespeed_modifier/jetpack/cybernetic)
if(!silent)
to_chat(owner, "You turn your thrusters set off.")
on = FALSE
diff --git a/code/modules/surgery/organs/eyes.dm b/code/modules/surgery/organs/eyes.dm
index 6b93995e62..e5aac2a47d 100644
--- a/code/modules/surgery/organs/eyes.dm
+++ b/code/modules/surgery/organs/eyes.dm
@@ -259,7 +259,7 @@
if(!isnum(range))
return
- set_distance(CLAMP(range, 0, max_light_beam_distance))
+ set_distance(clamp(range, 0, max_light_beam_distance))
assume_rgb(C)
/obj/item/organ/eyes/robotic/glow/proc/assume_rgb(newcolor)
diff --git a/code/modules/surgery/organs/liver.dm b/code/modules/surgery/organs/liver.dm
index 117a45cdbc..f4771de14f 100755
--- a/code/modules/surgery/organs/liver.dm
+++ b/code/modules/surgery/organs/liver.dm
@@ -52,26 +52,26 @@
/obj/item/organ/liver/applyOrganDamage(d, maximum = maxHealth)
. = ..()
- if(!.)
+ if(!. || QDELETED(owner))
return
if(damage >= high_threshold)
var/move_calc = 1+((round(damage) - high_threshold)/(high_threshold/3))
- owner.add_movespeed_modifier(MOVESPEED_ID_CIRRHOSIS, TRUE, 100, NONE, override = TRUE, multiplicative_slowdown = move_calc)
+ owner.add_or_update_variable_movespeed_modifier(/datum/movespeed_modifier/liver_cirrhosis, multiplicative_slowdown = move_calc)
sizeMoveMod(move_calc, owner)
else
- owner.remove_movespeed_modifier(MOVESPEED_ID_CIRRHOSIS)
+ owner.remove_movespeed_modifier(/datum/movespeed_modifier/liver_cirrhosis)
sizeMoveMod(1, owner)
/obj/item/organ/liver/Insert(mob/living/carbon/M, special = FALSE, drop_if_replaced = TRUE)
. = ..()
if(. && damage >= high_threshold)
var/move_calc = 1+((round(damage) - high_threshold)/(high_threshold/3))
- M.add_movespeed_modifier(MOVESPEED_ID_CIRRHOSIS, TRUE, 100, NONE, override = TRUE, multiplicative_slowdown = move_calc)
+ M.add_or_update_variable_movespeed_modifier(/datum/movespeed_modifier/liver_cirrhosis, multiplicative_slowdown = move_calc)
sizeMoveMod(move_calc, owner)
/obj/item/organ/liver/Remove(special = FALSE)
if(!QDELETED(owner))
- owner.remove_movespeed_modifier(MOVESPEED_ID_CIRRHOSIS)
+ owner.remove_movespeed_modifier(/datum/movespeed_modifier/liver_cirrhosis)
sizeMoveMod(1, owner)
return ..()
diff --git a/code/modules/surgery/organs/lungs.dm b/code/modules/surgery/organs/lungs.dm
index ac2b34b855..1b66af6232 100644
--- a/code/modules/surgery/organs/lungs.dm
+++ b/code/modules/surgery/organs/lungs.dm
@@ -146,7 +146,7 @@
if(safe_oxygen_max)
if((O2_pp > safe_oxygen_max) && safe_oxygen_max == 0) //I guess plasma men technically need to have a check.
var/ratio = (breath_gases[/datum/gas/oxygen]/safe_oxygen_max) * 10
- H.apply_damage_type(CLAMP(ratio, oxy_breath_dam_min, oxy_breath_dam_max), oxy_damage_type)
+ H.apply_damage_type(clamp(ratio, oxy_breath_dam_min, oxy_breath_dam_max), oxy_damage_type)
H.throw_alert("too_much_oxy", /obj/screen/alert/too_much_oxy)
else if((O2_pp > safe_oxygen_max) && !(safe_oxygen_max == 0)) //Why yes, this is like too much CO2 and spahget. Dirty lizards.
@@ -188,7 +188,7 @@
if(safe_nitro_max)
if(N2_pp > safe_nitro_max)
var/ratio = (breath_gases[/datum/gas/nitrogen]/safe_nitro_max) * 10
- H.apply_damage_type(CLAMP(ratio, nitro_breath_dam_min, nitro_breath_dam_max), nitro_damage_type)
+ H.apply_damage_type(clamp(ratio, nitro_breath_dam_min, nitro_breath_dam_max), nitro_damage_type)
H.throw_alert("too_much_nitro", /obj/screen/alert/too_much_nitro)
H.losebreath += 2
else
@@ -255,7 +255,7 @@
if(safe_toxins_max)
if(Toxins_pp > safe_toxins_max)
var/ratio = (breath_gases[/datum/gas/plasma]/safe_toxins_max) * 10
- H.apply_damage_type(CLAMP(ratio, tox_breath_dam_min, tox_breath_dam_max), tox_damage_type)
+ H.apply_damage_type(clamp(ratio, tox_breath_dam_min, tox_breath_dam_max), tox_damage_type)
H.throw_alert("too_much_tox", /obj/screen/alert/too_much_tox)
else
H.clear_alert("too_much_tox")
diff --git a/code/modules/surgery/organs/organ_internal.dm b/code/modules/surgery/organs/organ_internal.dm
index d95901bdbe..4e4268c5fe 100644
--- a/code/modules/surgery/organs/organ_internal.dm
+++ b/code/modules/surgery/organs/organ_internal.dm
@@ -209,7 +209,7 @@
return FALSE
if(maximum < damage)
return FALSE
- damage = CLAMP(damage + d, 0, maximum)
+ damage = clamp(damage + d, 0, maximum)
var/mess = check_damage_thresholds()
prev_damage = damage
if(mess && owner)
diff --git a/code/modules/uplink/uplink_items/uplink_badass.dm b/code/modules/uplink/uplink_items/uplink_badass.dm
index 681efea5b3..840f100611 100644
--- a/code/modules/uplink/uplink_items/uplink_badass.dm
+++ b/code/modules/uplink/uplink_items/uplink_badass.dm
@@ -24,13 +24,6 @@
Radio headset does not include encryption key. No gun included."
item = /obj/item/storage/box/syndie_kit/centcom_costume
-/datum/uplink_item/badass/claymore
- name = "Claymore"
- cost = 8
- player_minimum = 25
- desc = "A claymore. We don't know why you'd do this."
- item = /obj/item/claymore
-
/datum/uplink_item/badass/costumes/clown
name = "Clown Costume"
desc = "Nothing is more terrifying than clowns with fully automatic weaponry."
@@ -84,11 +77,3 @@
limited_stock = 1
cant_discount = TRUE
include_modes = list(/datum/game_mode/nuclear, /datum/game_mode/nuclear/clown_ops)
-
-/datum/uplink_item/badass/shades
- name = "Big Sunglasses"
- desc = "Prevents flashes and looks badbass with some Smokes."
- item = /obj/item/clothing/glasses/sunglasses/big
- cost = 1
- surplus = 5
- illegal_tech = FALSE
diff --git a/code/modules/uplink/uplink_items/uplink_bundles.dm b/code/modules/uplink/uplink_items/uplink_bundles.dm
index 7d0e52947a..478be5960e 100644
--- a/code/modules/uplink/uplink_items/uplink_bundles.dm
+++ b/code/modules/uplink/uplink_items/uplink_bundles.dm
@@ -41,6 +41,16 @@
player_minimum = 30
exclude_modes = list(/datum/game_mode/nuclear, /datum/game_mode/nuclear/clown_ops)
+/datum/uplink_item/bundles_TC/northstar_bundle
+ name = "Northstar Bundle"
+ desc = "An item usually reserved for the Gorlex Marauders and their operatives, now available for recreational use. \
+ These armbands let the user punch people very fast and with the lethality of a legendary martial artist. \
+ Does not improve weapon attack speed or the meaty fists of a hulk, but you will be unmatched in martial power. \
+ Combines with all martial arts, but the user will be unable to bring themselves to use guns, nor remove the armbands."
+ item = /obj/item/storage/box/syndie_kit/northstar
+ cost = 20
+ exclude_modes = list(/datum/game_mode/nuclear, /datum/game_mode/nuclear/clown_ops)
+
/datum/uplink_item/suits/infiltrator_bundle
name = "Insidious Infiltration Gear Case"
desc = "Developed by Roseus Galactic in conjunction with the Gorlex Marauders to produce a functional suit for urban operations, \
@@ -150,6 +160,23 @@
U.purchase_log.LogPurchase(goods, I, 0)
return C
+/datum/uplink_item/bundles_TC/reroll
+ name = "Renegotiate Contract"
+ desc = "Selecting this will inform the syndicate that you wish to change employers. Can only be done once; no take-backs."
+ item = /obj/effect/gibspawner/generic
+ cost = 0
+ cant_discount = TRUE
+ restricted = TRUE
+ limited_stock = 1
+
+/datum/uplink_item/bundles_TC/reroll/purchase(mob/user, datum/component/uplink/U)
+ var/datum/antagonist/traitor/T = user?.mind?.has_antag_datum(/datum/antagonist/traitor)
+ if(istype(T))
+ var/new_traitor_kind = get_random_traitor_kind(list(T.traitor_kind.type))
+ T.set_traitor_kind(new_traitor_kind)
+ else
+ to_chat(user,"Invalid user for contract renegotiation.")
+
/datum/uplink_item/bundles_TC/random
name = "Random Item"
desc = "Picking this will purchase a random item. Useful if you have some TC to spare or if you haven't decided on a strategy yet."
diff --git a/code/modules/uplink/uplink_items/uplink_clothing.dm b/code/modules/uplink/uplink_items/uplink_clothing.dm
index d6336bd982..014e0452b5 100644
--- a/code/modules/uplink/uplink_items/uplink_clothing.dm
+++ b/code/modules/uplink/uplink_items/uplink_clothing.dm
@@ -89,4 +89,11 @@
name = "Wall Walking Boots"
desc = "Through bluespace magic stolen from an organisation that hoards technology, these boots simply allow you to slip through the atoms that make up anything, but only while walking, for safety reasons. As well as this, they unfortunately cause minor breath loss as the majority of atoms in your lungs are sucked out into any solid object you walk through."
item = /obj/item/clothing/shoes/wallwalkers
- cost = 6
\ No newline at end of file
+ cost = 6
+
+/datum/uplink_item/device_tools/guerillagloves
+ name = "Guerilla Gloves"
+ desc = "A pair of highly robust combat gripper gloves that excels at performing takedowns at close range, with an added lining of insulation. Careful not to hit a wall!"
+ item = /obj/item/clothing/gloves/tackler/combat/insulated
+ include_modes = list(/datum/game_mode/nuclear, /datum/game_mode/nuclear/clown_ops)
+ cost = 2
diff --git a/code/modules/uplink/uplink_items/uplink_dangerous.dm b/code/modules/uplink/uplink_items/uplink_dangerous.dm
index c798aa5cd9..99c9c505c0 100644
--- a/code/modules/uplink/uplink_items/uplink_dangerous.dm
+++ b/code/modules/uplink/uplink_items/uplink_dangerous.dm
@@ -117,17 +117,6 @@
/datum/uplink_item/dangerous/doublesword/get_discount()
return pick(4;0.8,2;0.65,1;0.5)
-/datum/uplink_item/dangerous/cxneb
- name = "Dragon's Tooth Non-Eutactic Blade"
- desc = "An illegal modification of a weapon that is functionally identical to the energy sword, \
- the Non-Eutactic Blade (NEB) forges a hardlight blade on-demand, \
- generating an extremely sharp, unbreakable edge that is guaranteed to satisfy your every need. \
- This particular model has a polychromic hardlight generator, allowing you to murder in style! \
- The illegal modifications bring this weapon up to par with the classic energy sword, and also gives it the energy sword's distinctive sounds."
- item = /obj/item/melee/transforming/energy/sword/cx/traitor
- cost = 8
- exclude_modes = list(/datum/game_mode/nuclear/clown_ops)
-
/datum/uplink_item/dangerous/sword
name = "Energy Sword"
desc = "The energy sword is an edged weapon with a blade of pure energy. The sword is small enough to be \
diff --git a/code/modules/uplink/uplink_items/uplink_devices.dm b/code/modules/uplink/uplink_items/uplink_devices.dm
index 194281ded6..cda83cf684 100644
--- a/code/modules/uplink/uplink_items/uplink_devices.dm
+++ b/code/modules/uplink/uplink_items/uplink_devices.dm
@@ -188,6 +188,16 @@
item = /obj/item/healthanalyzer/rad_laser
cost = 3
+/datum/uplink_item/device_tools/riflery_primer
+ name = "Riflery Primer"
+ desc = "An old book with blood and vodka stains on it. Freshly pulled from a dusty crate in some old warehouse, \
+ this primer of questionable worth and value is rumored to increase your rifle-bolt-working and/or shotgun \
+ racking fivefold. Then again, the techniques here only work on bolt-actions and pump-actions..."
+ item = /obj/item/book/granter/trait/rifleman
+ cost = 3
+ restricted_roles = list("Operative") // i want it to be surplusable but i also want it to be mostly nukie only, please advise
+ surplus = 90
+
/datum/uplink_item/device_tools/stimpack
name = "Stimpack"
desc = "Stimpacks, the tool of many great heroes, make you nearly immune to stuns and knockdowns for about \
diff --git a/code/modules/uplink/uplink_items/uplink_roles.dm b/code/modules/uplink/uplink_items/uplink_roles.dm
index 778edf8cc8..28479f8da7 100644
--- a/code/modules/uplink/uplink_items/uplink_roles.dm
+++ b/code/modules/uplink/uplink_items/uplink_roles.dm
@@ -64,14 +64,6 @@
restricted_roles = list("Clown")
*/
-/datum/uplink_item/role_restricted/clumsyDNA
- name = "Clumsy Clown DNA"
- desc = "A DNA injector that has been loaded with the clown gene that makes people clumsy.. \
- Making someone clumsy will allow them to use clown firing pins as well as Reverse Revolvers. For a laugh try using this on the HOS to see how many times they shoot themselves in the foot!"
- cost = 1
- item = /obj/item/dnainjector/clumsymut
- restricted_roles = list("Clown")
-
/datum/uplink_item/role_restricted/haunted_magic_eightball
name = "Haunted Magic Eightball"
desc = "Most magic eightballs are toys with dice inside. Although identical in appearance to the harmless toys, this occult device reaches into the spirit world to find its answers. \
@@ -116,19 +108,11 @@
cost = 4
restricted_roles = list("Cook", "Botanist", "Clown", "Mime")
-/datum/uplink_item/role_restricted/strange_seeds
- name = "Pack of strange seeds"
- desc = "Mysterious seeds as strange as their name implies. Spooky."
- item = /obj/item/seeds/random
- cost = 2
- restricted_roles = list("Botanist")
- illegal_tech = FALSE
-
/datum/uplink_item/role_restricted/strange_seeds_10pack
- name = "Pack of strange seeds x10"
+ name = "Pack of strange seeds"
desc = "Mysterious seeds as strange as their name implies. Spooky. These come in bulk"
item = /obj/item/storage/box/strange_seeds_10pack
- cost = 20
+ cost = 10
restricted_roles = list("Botanist")
/datum/uplink_item/role_restricted/ez_clean_bundle
diff --git a/code/modules/vehicles/secway.dm b/code/modules/vehicles/secway.dm
index 868610a149..8ad8b5f1ee 100644
--- a/code/modules/vehicles/secway.dm
+++ b/code/modules/vehicles/secway.dm
@@ -22,7 +22,7 @@
/obj/vehicle/ridden/secway/process()
var/diff = world.time - last_tick
var/regen = chargerate * diff
- charge = CLAMP(charge + regen, 0, chargemax)
+ charge = clamp(charge + regen, 0, chargemax)
last_tick = world.time
/obj/vehicle/ridden/secway/relaymove(mob/user, direction)
diff --git a/code/modules/vending/drinnerware.dm b/code/modules/vending/dinnerware.dm
similarity index 95%
rename from code/modules/vending/drinnerware.dm
rename to code/modules/vending/dinnerware.dm
index 8f257d07ec..da8baa7e1c 100644
--- a/code/modules/vending/drinnerware.dm
+++ b/code/modules/vending/dinnerware.dm
@@ -20,7 +20,7 @@
/obj/item/reagent_containers/food/condiment/saltshaker = 5,
/obj/item/reagent_containers/food/condiment/peppermill = 5)
contraband = list(
- /obj/item/reagent_containers/food/snacks/monkeycube = 1,
+ /obj/item/reagent_containers/food/snacks/cube/monkey= 1,
/obj/item/kitchen/knife/butcher = 2,
/obj/item/reagent_containers/syringe = 3)
premium = list(
diff --git a/code/modules/vending/security.dm b/code/modules/vending/security.dm
index 09681def64..ec741ef574 100644
--- a/code/modules/vending/security.dm
+++ b/code/modules/vending/security.dm
@@ -21,6 +21,7 @@
/obj/item/clothing/head/helmet/blueshirt = 1,
/obj/item/clothing/suit/armor/vest/blueshirt = 1,
/obj/item/clothing/under/rank/security/officer/blueshirt = 1,
+ /obj/item/clothing/gloves/tackler = 5,
/obj/item/ssword_kit = 1)
armor = list("melee" = 100, "bullet" = 100, "laser" = 100, "energy" = 100, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 100, "acid" = 50)
resistance_flags = FIRE_PROOF
diff --git a/code/modules/vore/eating/belly_obj.dm b/code/modules/vore/eating/belly_obj.dm
index ca774ed1f6..b188cc0a99 100644
--- a/code/modules/vore/eating/belly_obj.dm
+++ b/code/modules/vore/eating/belly_obj.dm
@@ -221,9 +221,9 @@
if(isliving(AM))
var/mob/living/L = AM
var/mob/living/OW = owner
- if(L.absorbed && !include_absorbed)
+ if(L.vore_flags & ABSORBED && !include_absorbed)
continue
- L.absorbed = FALSE
+ L.vore_flags &= ~ABSORBED
L.stop_sound_channel(CHANNEL_PREYLOOP)
SEND_SIGNAL(OW, COMSIG_CLEAR_MOOD_EVENT, "fedpred", /datum/mood_event/fedpred)
SEND_SIGNAL(L, COMSIG_CLEAR_MOOD_EVENT, "fedprey", /datum/mood_event/fedprey)
@@ -277,14 +277,14 @@
SEND_SIGNAL(OW, COMSIG_ADD_MOOD_EVENT, "emptypred", /datum/mood_event/emptypred)
SEND_SIGNAL(ML, COMSIG_ADD_MOOD_EVENT, "emptyprey", /datum/mood_event/emptyprey)
- if(ML.absorbed)
- ML.absorbed = FALSE
+ if(CHECK_BITFIELD(ML.vore_flags,ABSORBED))
+ DISABLE_BITFIELD(ML.vore_flags,ABSORBED)
if(ishuman(M) && ishuman(OW))
var/mob/living/carbon/human/Prey = M
var/mob/living/carbon/human/Pred = OW
var/absorbed_count = 2 //Prey that we were, plus the pred gets a portion
for(var/mob/living/P in contents)
- if(P.absorbed)
+ if(CHECK_BITFIELD(P.vore_flags,ABSORBED))
absorbed_count++
Pred.reagents.trans_to(Prey, Pred.reagents.total_volume / absorbed_count)
@@ -389,7 +389,7 @@
formatted_message = replacetext(formatted_message,"%pred",owner)
formatted_message = replacetext(formatted_message,"%prey",english_list(contents))
for(var/mob/living/P in contents)
- if(!P.absorbed) //This is required first, in case there's a person absorbed and not absorbed in a stomach.
+ if(!CHECK_BITFIELD(P.vore_flags, ABSORBED)) //This is required first, in case there's a person absorbed and not absorbed in a stomach.
total_bulge += P.mob_size
if(total_bulge >= bulge_size && bulge_size != 0)
return("[formatted_message] ")
@@ -484,7 +484,7 @@
// Handle a mob being absorbed
/obj/belly/proc/absorb_living(var/mob/living/M)
- M.absorbed = TRUE
+ ENABLE_BITFIELD(M.vore_flags, ABSORBED)
to_chat(M,"[owner]'s [lowertext(name)] absorbs your body, making you part of them.")
to_chat(owner,"Your [lowertext(name)] absorbs [M]'s body, making them part of you.")
@@ -498,7 +498,7 @@
for(var/belly in M.vore_organs)
var/obj/belly/B = belly
for(var/mob/living/Mm in B)
- if(Mm.absorbed)
+ if(CHECK_BITFIELD(Mm.vore_flags, ABSORBED))
absorb_living(Mm)
//Update owner
diff --git a/code/modules/vore/eating/bellymodes.dm b/code/modules/vore/eating/bellymodes.dm
index 965648eb5a..2caaae401e 100644
--- a/code/modules/vore/eating/bellymodes.dm
+++ b/code/modules/vore/eating/bellymodes.dm
@@ -1,6 +1,6 @@
// Process the predator's effects upon the contents of its belly (i.e digestion/transformation etc)
/obj/belly/proc/process_belly(var/times_fired,var/wait) //Passed by controller
- if((times_fired < next_process) || !contents.len)
+ if((times_fired < next_process) || !length(contents))
recent_sound = FALSE
return SSBELLIES_IGNORED
@@ -27,7 +27,7 @@
var/list/EL = emote_lists[digest_mode]
if(LAZYLEN(EL))
for(var/mob/living/M in contents)
- if(M.digestable || !(digest_mode == DM_DIGEST)) // don't give digesty messages to indigestible people
+ if((M.vore_flags & DIGESTABLE) || !(digest_mode == DM_DIGEST)) // don't give digesty messages to indigestible people
to_chat(M,"[pick(EL)]")
///////////////////// Prey Loop Refresh/hack //////////////////////
@@ -51,7 +51,7 @@
//////////////////////// Absorbed Handling ////////////////////////
for(var/mob/living/M in contents)
- if(M.absorbed)
+ if(M.vore_flags & ABSORBED)
M.Stun(5)
////////////////////////// Sound vars /////////////////////////////
@@ -76,7 +76,7 @@
play_sound = pick(pred_digest)
//Pref protection!
- if (!M.digestable || M.absorbed)
+ if (!M.vore_flags & DIGESTABLE || M.vore_flags & ABSORBED)
continue
//Person just died in guts!
@@ -150,7 +150,7 @@
SEND_SOUND(M,prey_digest)
play_sound = pick(pred_digest)
- if(M.absorbed)
+ if(M.vore_flags & ABSORBED)
continue
if(M.nutrition >= 100) //Drain them until there's no nutrients left. Slowly "absorb" them.
@@ -164,8 +164,8 @@
if(DM_UNABSORB)
for (var/mob/living/M in contents)
- if(M.absorbed && owner.nutrition >= 100)
- M.absorbed = FALSE
+ if(M.vore_flags & ABSORBED && owner.nutrition >= 100)
+ DISABLE_BITFIELD(M.vore_flags, ABSORBED)
to_chat(M,"You suddenly feel solid again ")
to_chat(owner,"You feel like a part of you is missing.")
owner.nutrition -= 100
diff --git a/code/modules/vore/eating/living.dm b/code/modules/vore/eating/living.dm
index c59662d5b6..33f8d78300 100644
--- a/code/modules/vore/eating/living.dm
+++ b/code/modules/vore/eating/living.dm
@@ -1,18 +1,11 @@
///////////////////// Mob Living /////////////////////
/mob/living
- var/digestable = FALSE // Can the mob be digested inside a belly?
+ var/vore_flags = 0
var/showvoreprefs = TRUE // Determines if the mechanical vore preferences button will be displayed on the mob or not.
var/obj/belly/vore_selected // Default to no vore capability.
var/list/vore_organs = list() // List of vore containers inside a mob
- var/devourable = FALSE // Can the mob be vored at all?
- var/feeding = FALSE // Are we going to feed someone else?
var/vore_taste = null // What the character tastes like
- var/no_vore = FALSE // If the character/mob can vore.
- var/openpanel = FALSE // Is the vore panel open?
- var/absorbed = FALSE //are we absorbed?
var/next_preyloop
- var/vore_init = FALSE //Has this mob's vore been initialized yet?
- var/vorepref_init = FALSE //Has this mob's voreprefs been initialized?
//
// Hook for generic creation of stuff on new creatures
@@ -22,7 +15,7 @@
M.verbs += /mob/living/proc/lick
M.verbs += /mob/living/proc/escapeOOC
- if(M.no_vore) //If the mob isn't supposed to have a stomach, let's not give it an insidepanel so it can make one for itself, or a stomach.
+ if(M.vore_flags & NO_VORE) //If the mob isn't supposed to have a stomach, let's not give it an insidepanel so it can make one for itself, or a stomach.
return TRUE
M.verbs += /mob/living/proc/insidePanel
@@ -35,7 +28,7 @@
return TRUE
/mob/living/proc/init_vore()
- vore_init = TRUE
+ ENABLE_BITFIELD(vore_flags, VORE_INIT)
//Something else made organs, meanwhile.
if(LAZYLEN(vore_organs))
return TRUE
@@ -49,8 +42,8 @@
vore_selected = vore_organs[1]
return TRUE
- //Or, we can create a basic one for them
- if(!LAZYLEN(vore_organs))
+/mob/living/proc/lazy_init_belly()
+ if(!length(vore_organs))
LAZYINITLIST(vore_organs)
var/obj/belly/B = new /obj/belly(src)
vore_selected = B
@@ -68,6 +61,7 @@
// Critical adjustments due to TG grab changes - Poojawa
/mob/living/proc/vore_attack(var/mob/living/user, var/mob/living/prey, var/mob/living/pred)
+ lazy_init_belly()
if(!user || !prey || !pred)
return
@@ -75,7 +69,7 @@
return
if(pred == prey) //you click your target
- if(!pred.feeding)
+ if(!CHECK_BITFIELD(pred.vore_flags,FEEDING))
to_chat(user, "They aren't able to be fed.")
to_chat(pred, "[user] tried to feed you themselves, but you aren't voracious enough to be fed.")
return
@@ -91,11 +85,11 @@
feed_grabbed_to_self(user, prey)
else // click someone other than you/prey
- if(!pred.feeding)
+ if(!CHECK_BITFIELD(pred.vore_flags,FEEDING))
to_chat(user, "They aren't voracious enough to be fed.")
to_chat(pred, "[user] tried to feed you [prey], but you aren't voracious enough to be fed.")
return
- if(!prey.feeding)
+ if(!CHECK_BITFIELD(prey.vore_flags,FEEDING))
to_chat(user, "They aren't able to be fed to someone.")
to_chat(prey, "[user] tried to feed you to [pred], but you aren't able to be fed to them.")
return
@@ -107,14 +101,17 @@
// Eating procs depending on who clicked what
//
/mob/living/proc/feed_grabbed_to_self(var/mob/living/user, var/mob/living/prey)
+ user.lazy_init_belly()
var/belly = user.vore_selected
return perform_the_nom(user, prey, user, belly)
/mob/living/proc/feed_self_to_grabbed(var/mob/living/user, var/mob/living/pred)
+ pred.lazy_init_belly()
var/belly = input("Choose Belly") in pred.vore_organs
return perform_the_nom(user, user, pred, belly)
/mob/living/proc/feed_grabbed_to_other(var/mob/living/user, var/mob/living/prey, var/mob/living/pred)
+ pred.lazy_init_belly()
var/belly = input("Choose Belly") in pred.vore_organs
return perform_the_nom(user, prey, pred, belly)
@@ -128,7 +125,7 @@
testing("[user] attempted to feed [prey] to [pred], via [lowertext(belly.name)] but it went wrong.")
return
- if (!prey.devourable)
+ if (!prey.vore_flags & DEVOURABLE)
to_chat(user, "This can't be eaten!")
return FALSE
@@ -267,9 +264,7 @@
to_chat(src,"You attempted to save your vore prefs but somehow you're in this character without a client.prefs variable. Tell a dev.")
return FALSE
- client.prefs.digestable = digestable
- client.prefs.devourable = devourable
- client.prefs.feeding = feeding
+ client.prefs.vore_flags = vore_flags // there's garbage data in here, but it doesn't matter
client.prefs.vore_taste = vore_taste
var/list/serialized = list()
@@ -288,12 +283,17 @@
if(!client || !client.prefs)
to_chat(src,"You attempted to apply your vore prefs but somehow you're in this character without a client.prefs variable. Tell a dev.")
return FALSE
- vorepref_init = TRUE
+ ENABLE_BITFIELD(vore_flags,VOREPREF_INIT)
+ // garbage data coming back the other way or breaking absorbed would be bad, so instead we do this
+ vore_flags |= CHECK_BITFIELD(client.prefs.vore_flags,DIGESTABLE) // set to 1 if prefs is 1
+ vore_flags |= CHECK_BITFIELD(client.prefs.vore_flags,DEVOURABLE)
+ vore_flags |= CHECK_BITFIELD(client.prefs.vore_flags,FEEDING)
+
+ vore_flags &= CHECK_BITFIELD(client.prefs.vore_flags,DIGESTABLE) // set to 0 if prefs is 0
+ vore_flags &= CHECK_BITFIELD(client.prefs.vore_flags,DEVOURABLE)
+ vore_flags &= CHECK_BITFIELD(client.prefs.vore_flags,FEEDING)
- digestable = client.prefs.digestable
- devourable = client.prefs.devourable
- feeding = client.prefs.feeding
vore_taste = client.prefs.vore_taste
release_vore_contents(silent = TRUE)
@@ -361,7 +361,7 @@
var/list/choices
for(var/mob/living/L in view(1))
- if(L != src && (!L.ckey || L.client?.prefs.lickable) && Adjacent(L))
+ if(L != src && (!L.ckey || L.client?.prefs.vore_flags & LICKABLE) && Adjacent(L))
LAZYADD(choices, L)
if(!choices)
@@ -369,7 +369,7 @@
var/mob/living/tasted = input(src, "Who would you like to lick? (Excluding yourself and those with the preference disabled)", "Licking") as null|anything in choices
- if(QDELETED(tasted) || (tasted.ckey && !(tasted.client?.prefs.lickable)) || !Adjacent(tasted) || incapacitated(ignore_restraints = TRUE))
+ if(QDELETED(tasted) || (tasted.ckey && !(tasted.client?.prefs.vore_flags & LICKABLE)) || !Adjacent(tasted) || incapacitated(ignore_restraints = TRUE))
return
setClickCooldown(100)
diff --git a/code/modules/vore/eating/vorepanel.dm b/code/modules/vore/eating/vorepanel.dm
index 9c1ff4a84e..1adf5ef6e7 100644
--- a/code/modules/vore/eating/vorepanel.dm
+++ b/code/modules/vore/eating/vorepanel.dm
@@ -20,10 +20,10 @@
picker_holder.popup = new(src, "insidePanel","Vore Panel", 450, 700, picker_holder)
picker_holder.popup.set_content(dat)
picker_holder.popup.open()
- src.openpanel = TRUE
+ vore_flags |= OPEN_PANEL
/mob/living/proc/updateVRPanel() //Panel popup update call from belly events.
- if(src.openpanel == TRUE)
+ if(vore_flags & OPEN_PANEL)
var/datum/vore_look/picker_holder = new()
picker_holder.loop = picker_holder
picker_holder.selected = vore_selected
@@ -65,7 +65,7 @@
//Don't display this part if we couldn't find the belly since could be held in hand.
if(inside_belly)
- dat += "You are currently [user.absorbed ? "absorbed into " : "inside "] [eater]'s [inside_belly]!
"
+ dat += "You are currently [(user.vore_flags & ABSORBED) ? "absorbed into " : "inside "] [eater]'s [inside_belly]!
"
if(inside_belly.desc)
dat += "[inside_belly.desc]
"
@@ -80,8 +80,8 @@
continue
//That's an absorbed person you're checking
- if(M.absorbed)
- if(user.absorbed)
+ if(M.vore_flags & ABSORBED)
+ if(user.vore_flags & ABSORBED)
dat += "[O]"
continue
else
@@ -139,7 +139,7 @@
var/mob/living/M = O
//Absorbed gets special color OOoOOOOoooo
- if(M.absorbed)
+ if(M.vore_flags & ABSORBED)
dat += "[O]"
continue
@@ -243,11 +243,11 @@
dat += ""
var/pref_on = "#173d15"
var/pref_off = "#990000"
- dat += " Toggle Digestable (Currently: [user.digestable ? "ON" : "OFF"])"
- dat += " Toggle Devourable (Currently: [user.devourable ? "ON" : "OFF"])"
- dat += " Toggle Feeding (Currently: [user.feeding ? "ON" : "OFF"])"
+ dat += " Toggle Digestable (Currently: [(user.vore_flags & DIGESTABLE) ? "ON" : "OFF"])"
+ dat += " Toggle Devourable (Currently: [(user.vore_flags & DEVOURABLE) ? "ON" : "OFF"])"
+ dat += " Toggle Feeding (Currently: [(user.vore_flags & FEEDING) ? "ON" : "OFF"])"
if(user.client.prefs)
- dat += " Toggle Licking (Currently: [user.client.prefs.lickable ? "ON" : "OFF"])"
+ dat += " Toggle Licking (Currently: [(user.client.prefs.vore_flags & LICKABLE) ? "ON" : "OFF"])"
//Returns the dat html to the vore_look
return dat
@@ -257,7 +257,7 @@
if(href_list["close"])
qdel(src) // Cleanup
- user.openpanel = FALSE
+ user.vore_flags &= ~OPEN_PANEL
return
if(href_list["show_int"])
@@ -287,7 +287,7 @@
M.examine(user)
if("Help Out") //Help the inside-mob out
- if(user.stat || user.absorbed || M.absorbed)
+ if(user.stat || user.vore_flags & ABSORBED || M.vore_flags & ABSORBED)
to_chat(user,"You can't do that in your state!")
return TRUE
@@ -306,7 +306,7 @@
to_chat(OB.owner,"Your body efficiently shoves [M] back where they belong.")
if("Devour") //Eat the inside mob
- if(user.absorbed || user.stat)
+ if(user.vore_flags & ABSORBED || user.stat)
to_chat(user,"You can't do that in your state!")
return TRUE
@@ -687,58 +687,58 @@
user.vore_taste = new_flavor
if(href_list["toggledg"])
- var/choice = alert(user, "This button is for those who don't like being digested. It can make you undigestable to all mobs. Digesting you is currently: [user.digestable ? "Allowed" : "Prevented"]", "", "Allow Digestion", "Cancel", "Prevent Digestion")
+ var/choice = alert(user, "This button is for those who don't like being digested. It can make you undigestable to all mobs. Digesting you is currently: [(user.vore_flags & DIGESTABLE) ? "Allowed" : "Prevented"]", "", "Allow Digestion", "Cancel", "Prevent Digestion")
if(!user || !user.client)
return
switch(choice)
if("Cancel")
return FALSE
if("Allow Digestion")
- user.digestable = TRUE
+ user.vore_flags |= DIGESTABLE
+ user.client.prefs.vore_flags |= DIGESTABLE
if("Prevent Digestion")
- user.digestable = FALSE
-
- user.client.prefs.digestable = user.digestable
+ user.vore_flags &= ~DIGESTABLE
+ user.client.prefs.vore_flags &= ~DIGESTABLE
if(href_list["toggledvor"])
- var/choice = alert(user, "This button is for those who don't like vore at all. Devouring you is currently: [user.devourable ? "Allowed" : "Prevented"]", "", "Allow Devourment", "Cancel", "Prevent Devourment")
+ var/choice = alert(user, "This button is for those who don't like vore at all. Devouring you is currently: [(user.vore_flags & DEVOURABLE) ? "Allowed" : "Prevented"]", "", "Allow Devourment", "Cancel", "Prevent Devourment")
if(!user || !user.client)
return
switch(choice)
if("Cancel")
return FALSE
if("Allow Devourment")
- user.devourable = TRUE
+ user.vore_flags |= DEVOURABLE
+ user.client.prefs.vore_flags |= DEVOURABLE
if("Prevent Devourment")
- user.devourable = FALSE
-
- user.client.prefs.devourable = user.devourable
+ user.vore_flags &= ~DEVOURABLE
+ user.client.prefs.vore_flags &= ~DEVOURABLE
if(href_list["toggledfeed"])
- var/choice = alert(user, "This button is to toggle your ability to be fed to others. Feeding predators is currently: [user.feeding ? "Allowed" : "Prevented"]", "", "Allow Feeding", "Cancel", "Prevent Feeding")
+ var/choice = alert(user, "This button is to toggle your ability to be fed to others. Feeding predators is currently: [(user.vore_flags & FEEDING) ? "Allowed" : "Prevented"]", "", "Allow Feeding", "Cancel", "Prevent Feeding")
if(!user || !user.client)
return
switch(choice)
if("Cancel")
return FALSE
if("Allow Feeding")
- user.feeding = TRUE
+ user.vore_flags |= FEEDING
+ user.client.prefs.vore_flags |= FEEDING
if("Prevent Feeding")
- user.feeding = FALSE
-
- user.client.prefs.feeding = user.feeding
+ user.vore_flags &= ~FEEDING
+ user.client.prefs.vore_flags &= ~FEEDING
if(href_list["toggledlickable"])
- var/choice = alert(user, "This button is to toggle your ability to be licked. Being licked is currently: [user.client.prefs.lickable ? "Allowed" : "Prevented"]", "", "Allow Licking", "Cancel", "Prevent Licking")
+ var/choice = alert(user, "This button is to toggle your ability to be licked. Being licked is currently: [(user.client.prefs.vore_flags & LICKABLE) ? "Allowed" : "Prevented"]", "", "Allow Licking", "Cancel", "Prevent Licking")
if(!user || !user.client)
return
switch(choice)
if("Cancel")
return FALSE
if("Allow Licking")
- user.client.prefs.lickable = TRUE
+ user.client.prefs.vore_flags |= LICKABLE
if("Prevent Licking")
- user.client.prefs.lickable = FALSE
+ user.client.prefs.vore_flags &= ~LICKABLE
//Refresh when interacted with, returning 1 makes vore_look.Topic update
return TRUE
diff --git a/config/awaymissionconfig.txt b/config/awaymissionconfig.txt
index 545394f3e9..c6a5d9ef8f 100644
--- a/config/awaymissionconfig.txt
+++ b/config/awaymissionconfig.txt
@@ -7,16 +7,16 @@
#Do NOT tick the maps during compile -- the game uses this list to decide which map to load. Ticking the maps will result in them ALL being loaded at once.
#DO tick the associated code file for the away mission you are enabling. Otherwise, the map will be trying to reference objects which do not exist, which will cause runtime errors!
-#_maps/RandomZLevels/blackmarketpackers.dmm
-#_maps/RandomZLevels/spacebattle.dmm
-#_maps/RandomZLevels/TheBeach.dmm
-#_maps/RandomZLevels/Academy.dmm
-#_maps/RandomZLevels/wildwest.dmm
-#_maps/RandomZLevels/challenge.dmm
-#_maps/RandomZLevels/centcomAway.dmm
-#_maps/RandomZLevels/moonoutpost19.dmm
-#_maps/RandomZLevels/undergroundoutpost45.dmm
-#_maps/RandomZLevels/caves.dmm
-#_maps/RandomZLevels/snowdin.dmm
-#_maps/RandomZLevels/research.dmm
-#_maps/RandomZLevels/Cabin.dmm
+#_maps/RandomZLevels/away_mission/blackmarketpackers.dmm
+#_maps/RandomZLevels/away_mission/spacebattle.dmm
+#_maps/RandomZLevels/away_mission/TheBeach.dmm
+#_maps/RandomZLevels/away_mission/Academy.dmm
+#_maps/RandomZLevels/away_mission/wildwest.dmm
+#_maps/RandomZLevels/away_mission/challenge.dmm
+#_maps/RandomZLevels/away_mission/centcomAway.dmm
+#_maps/RandomZLevels/away_mission/moonoutpost19.dmm
+#_maps/RandomZLevels/away_mission/undergroundoutpost45.dmm
+#_maps/RandomZLevels/away_mission/caves.dmm
+#_maps/RandomZLevels/away_mission/snowdin.dmm
+#_maps/RandomZLevels/away_mission/research.dmm
+#_maps/RandomZLevels/away_mission/Cabin.dmm
diff --git a/config/game_options.txt b/config/game_options.txt
index e1294f688a..781be6d5b1 100644
--- a/config/game_options.txt
+++ b/config/game_options.txt
@@ -288,6 +288,9 @@ MINIMUM_SECBORG_ALERT 3
## Uncomment to load one of the missions from awaymissionconfig.txt at roundstart.
#ROUNDSTART_AWAY
+## Uncomment to load one of the virtual reality levels from vr_config at roundstart.
+#ROUNDSTART_VR
+
## How long the delay is before the Away Mission gate opens. Default is half an hour.
## 600 is one minute.
GATEWAY_DELAY 18000
diff --git a/config/vr_config.txt b/config/vr_config.txt
new file mode 100644
index 0000000000..0c6354f8fe
--- /dev/null
+++ b/config/vr_config.txt
@@ -0,0 +1,13 @@
+#List the potential virtual reality Z-levels here. awaymissionconfig copypasta follows.
+
+#Maps must be the full path to them
+#Maps should be 255x255 or smaller and be bounded. Falling off the edge of the map will result in undefined behavior.
+#SPECIFYING AN INVALID MAP WILL RESULT IN RUNTIMES ON GAME START
+
+#!!IMPORTANT NOTES FOR HOSTING VR MAPS!!:
+#Do NOT tick the maps during compile -- the game uses this list to decide which map to load. Ticking the maps will result in them ALL being loaded at once.
+#DO tick the associated code file for the virtual reality levels you are enabling. Otherwise, the map will be trying to reference objects which do not exist, which will cause runtime errors!
+
+#_maps/RandomZLevels/VR/murderdome.dmm
+#_maps/RandomZLevels/VR/snowdin_VR.dmm
+#_maps/RandomZLevels/VR/syndicate_trainer.dmm
\ No newline at end of file
diff --git a/html/changelog.html b/html/changelog.html
index d8e8b8404a..b02b2d74a5 100644
--- a/html/changelog.html
+++ b/html/changelog.html
@@ -50,6 +50,79 @@
-->
+
19 April 2020
+
Anonymous updated:
+
+
Xenohybrids will now scream like xeno.
+
+
Arturlang updated:
+
+
You can no longer spam craft things using the crafting menu
+
+
Detective-Google updated:
+
+
uncorks some of Lambda's rooms.
+
+
Ghommie updated:
+
+
Custom skin tone preferences.
+
Normalized box dorm lockers. Also removed a straight jacket found in the same area.
+
+
Jake Park updated:
+
+
fixed path name for youtool vending
+
+
Putnam3145 updated:
+
+
Objectives now clean theirselves up instead of leaving null entries in lists everywhere.
+
+
Seris02 updated:
+
+
stops magboots from not updating slowdowns
+
+
Trilbyspaceclone updated:
+
+
Maints have seen an uptick in left over types of welders, and tools. As well as different types of masks
+
New type of 02 locker - Rng! It can have almost any type of gas/breath mask and almost any type of o2 tank as well as even plasma men internals - Fancy!
+
Tool lockers have 70% odds to have a spare random tool inside!
+
12 new more drinks for most races!
+
New animations for mauna loa, and colour swap from red to blue for a Paramedic Hardsuit helm
+
Lowers cog champ ((the drink)) flare rate
+
Six more Sci based bounties have been posted at your local Cargo Bounty Request console
+
Mimes have made catnip plants not become invisible. How helpful.
+
Honey Palm now distills into mead rather then wine
+
+
UristMcAstronaut updated:
+
+
Adds circuit analyzers to maps and to integrated circuit printer and circuitry starter crate.
+
+
kappa-sama updated:
+
+
aranesp heals 10 instead of 18 stamina per tick
+
removed roundstart hyper earrape screams from xenohybrids
+
+
kevinz000 updated:
+
+
you can no longer stun xenos
+
Contractor kits are now poplocked to 30 players.
+
Shield bashing has been added
+
+
necromanceranne updated:
+
+
You can now craft armwraps!
+
Pugilists disarm you more easily and are harder to disarm. They also get a discount on disarm.
+
Pugilists only suffer a flat 10% chance to miss you. It's just like old punches! Kinda.
+
Chaplain's armbands are a +2, up from a +1!
+
Martial artists spend stamina when they disarm.
+
Rising Bass had several moves shortened and made stronger. Has a disarm override attack which does stamina damage and trips people on a disarm stun punch.
+
CQC had it's disarm move altered to be a stronger version of Krav Maga's. Dizzies and disarms on a disarm stun punch or just does some stamina damage and brute damage.
+
Sleeping Carp can punch you to the floor on a harm stun punch.
+
Hugs of the Northstar are no longer nodrop.
+
Adding in some overrides and proper flag checks for martial arts.
+
Stun thresholding stops disarm spams at extremely high stamina loss.
+
Ashen Arrows are actually called Ashen Arrows in the crafting menu.
+
+
16 April 2020
ForrestWick updated:
diff --git a/html/changelogs/.all_changelog.yml b/html/changelogs/.all_changelog.yml
index c2cd031447..d07b7c3a4f 100644
--- a/html/changelogs/.all_changelog.yml
+++ b/html/changelogs/.all_changelog.yml
@@ -25771,3 +25771,64 @@ DO NOT EDIT THIS FILE BY HAND! AUTOMATICALLY GENERATED BY ss13_genchangelog.py.
- tweak: changed a certain item to be called meatball, ended racism, thank you obama
Linzolle:
- tweak: remove any slurs, etc. to comply with GitHub's ToS
+2020-04-19:
+ Anonymous:
+ - rscadd: Xenohybrids will now scream like xeno.
+ Arturlang:
+ - bugfix: You can no longer spam craft things using the crafting menu
+ Detective-Google:
+ - bugfix: uncorks some of Lambda's rooms.
+ Ghommie:
+ - rscadd: Custom skin tone preferences.
+ - tweak: Normalized box dorm lockers. Also removed a straight jacket found in the
+ same area.
+ Jake Park:
+ - bugfix: fixed path name for youtool vending
+ Putnam3145:
+ - bugfix: Objectives now clean theirselves up instead of leaving null entries in
+ lists everywhere.
+ Seris02:
+ - bugfix: stops magboots from not updating slowdowns
+ Trilbyspaceclone:
+ - rscadd: Maints have seen an uptick in left over types of welders, and tools. As
+ well as different types of masks
+ - rscadd: New type of 02 locker - Rng! It can have almost any type of gas/breath
+ mask and almost any type of o2 tank as well as even plasma men internals - Fancy!
+ - tweak: Tool lockers have 70% odds to have a spare random tool inside!
+ - rscadd: 12 new more drinks for most races!
+ - rscadd: New animations for mauna loa, and colour swap from red to blue for a Paramedic
+ Hardsuit helm
+ - tweak: Lowers cog champ ((the drink)) flare rate
+ - rscadd: Six more Sci based bounties have been posted at your local Cargo Bounty
+ Request console
+ - bugfix: Mimes have made catnip plants not become invisible. How helpful.
+ - rscadd: Honey Palm now distills into mead rather then wine
+ UristMcAstronaut:
+ - rscadd: Adds circuit analyzers to maps and to integrated circuit printer and circuitry
+ starter crate.
+ kappa-sama:
+ - balance: aranesp heals 10 instead of 18 stamina per tick
+ - rscdel: removed roundstart hyper earrape screams from xenohybrids
+ kevinz000:
+ - bugfix: you can no longer stun xenos
+ - balance: Contractor kits are now poplocked to 30 players.
+ - rscadd: Shield bashing has been added
+ necromanceranne:
+ - rscadd: You can now craft armwraps!
+ - balance: Pugilists disarm you more easily and are harder to disarm. They also
+ get a discount on disarm.
+ - balance: Pugilists only suffer a flat 10% chance to miss you. It's just like old
+ punches! Kinda.
+ - balance: Chaplain's armbands are a +2, up from a +1!
+ - balance: Martial artists spend stamina when they disarm.
+ - balance: Rising Bass had several moves shortened and made stronger. Has a disarm
+ override attack which does stamina damage and trips people on a disarm stun
+ punch.
+ - balance: CQC had it's disarm move altered to be a stronger version of Krav Maga's.
+ Dizzies and disarms on a disarm stun punch or just does some stamina damage
+ and brute damage.
+ - balance: Sleeping Carp can punch you to the floor on a harm stun punch.
+ - bugfix: Hugs of the Northstar are no longer nodrop.
+ - bugfix: Adding in some overrides and proper flag checks for martial arts.
+ - bugfix: Stun thresholding stops disarm spams at extremely high stamina loss.
+ - tweak: Ashen Arrows are actually called Ashen Arrows in the crafting menu.
diff --git a/html/changelogs/AutoChangeLog-pr-11734.yml b/html/changelogs/AutoChangeLog-pr-11734.yml
deleted file mode 100644
index 9748f973fc..0000000000
--- a/html/changelogs/AutoChangeLog-pr-11734.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "Trilbyspaceclone"
-delete-after: True
-changes:
- - rscadd: "Six more Sci based bounties have been posted at your local Cargo Bounty Request console"
diff --git a/html/changelogs/AutoChangeLog-pr-11774.yml b/html/changelogs/AutoChangeLog-pr-11774.yml
deleted file mode 100644
index b694404e75..0000000000
--- a/html/changelogs/AutoChangeLog-pr-11774.yml
+++ /dev/null
@@ -1,6 +0,0 @@
-author: "Trilbyspaceclone"
-delete-after: True
-changes:
- - rscadd: "Maints have seen an uptick in left over types of welders, and tools. As well as different types of masks"
- - rscadd: "New type of 02 locker - Rng! It can have almost any type of gas/breath mask and almost any type of o2 tank as well as even plasma men internals - Fancy!"
- - tweak: "Tool lockers have 70% odds to have a spare random tool inside!"
diff --git a/html/changelogs/AutoChangeLog-pr-11820.yml b/html/changelogs/AutoChangeLog-pr-11820.yml
deleted file mode 100644
index 2aa24287bb..0000000000
--- a/html/changelogs/AutoChangeLog-pr-11820.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "kevinz000"
-delete-after: True
-changes:
- - rscadd: "Shield bashing has been added"
diff --git a/html/changelogs/AutoChangeLog-pr-11839.yml b/html/changelogs/AutoChangeLog-pr-11839.yml
deleted file mode 100644
index a3a97b7949..0000000000
--- a/html/changelogs/AutoChangeLog-pr-11839.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "kevinz000"
-delete-after: True
-changes:
- - bugfix: "you can no longer stun xenos"
diff --git a/html/changelogs/AutoChangeLog-pr-11844.yml b/html/changelogs/AutoChangeLog-pr-11844.yml
deleted file mode 100644
index 980d71f79c..0000000000
--- a/html/changelogs/AutoChangeLog-pr-11844.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "Arturlang"
-delete-after: True
-changes:
- - bugfix: "You can no longer spam craft things using the crafting menu"
diff --git a/html/changelogs/AutoChangeLog-pr-11849.yml b/html/changelogs/AutoChangeLog-pr-11849.yml
deleted file mode 100644
index 2a5bf783dc..0000000000
--- a/html/changelogs/AutoChangeLog-pr-11849.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "Ghommie"
-delete-after: True
-changes:
- - tweak: "Normalized box dorm lockers. Also removed a straight jacket found in the same area."
diff --git a/html/changelogs/AutoChangeLog-pr-11851.yml b/html/changelogs/AutoChangeLog-pr-11851.yml
deleted file mode 100644
index 76b7767258..0000000000
--- a/html/changelogs/AutoChangeLog-pr-11851.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "kevinz000"
-delete-after: True
-changes:
- - balance: "Contractor kits are now poplocked to 30 players."
diff --git a/html/changelogs/AutoChangeLog-pr-11852.yml b/html/changelogs/AutoChangeLog-pr-11852.yml
deleted file mode 100644
index 85a3295af4..0000000000
--- a/html/changelogs/AutoChangeLog-pr-11852.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "Ghommie"
-delete-after: True
-changes:
- - rscadd: "Custom skin tone preferences."
diff --git a/html/changelogs/AutoChangeLog-pr-11853.yml b/html/changelogs/AutoChangeLog-pr-11853.yml
deleted file mode 100644
index 52092c854a..0000000000
--- a/html/changelogs/AutoChangeLog-pr-11853.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "UristMcAstronaut"
-delete-after: True
-changes:
- - rscadd: "Adds circuit analyzers to maps and to integrated circuit printer and circuitry starter crate."
diff --git a/html/changelogs/AutoChangeLog-pr-11857.yml b/html/changelogs/AutoChangeLog-pr-11857.yml
deleted file mode 100644
index f6212d2d00..0000000000
--- a/html/changelogs/AutoChangeLog-pr-11857.yml
+++ /dev/null
@@ -1,6 +0,0 @@
-author: "Trilbyspaceclone"
-delete-after: True
-changes:
- - rscadd: "12 new more drinks for most races!"
- - rscadd: "New animations for mauna loa, and colour swap from red to blue for a Paramedic Hardsuit helm"
- - tweak: "Lowers cog champ ((the drink)) flare rate"
diff --git a/html/changelogs/AutoChangeLog-pr-11863.yml b/html/changelogs/AutoChangeLog-pr-11863.yml
deleted file mode 100644
index f7d9b75d51..0000000000
--- a/html/changelogs/AutoChangeLog-pr-11863.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "Trilbyspaceclone"
-delete-after: True
-changes:
- - rscadd: "Honey Palm now distills into mead rather then wine"
diff --git a/html/changelogs/AutoChangeLog-pr-11869.yml b/html/changelogs/AutoChangeLog-pr-11869.yml
deleted file mode 100644
index c75d84dd90..0000000000
--- a/html/changelogs/AutoChangeLog-pr-11869.yml
+++ /dev/null
@@ -1,15 +0,0 @@
-author: "necromanceranne"
-delete-after: True
-changes:
- - rscadd: "You can now craft armwraps!"
- - balance: "Pugilists disarm you more easily and are harder to disarm. They also get a discount on disarm."
- - balance: "Pugilists only suffer a flat 10% chance to miss you. It's just like old punches! Kinda."
- - balance: "Chaplain's armbands are a +2, up from a +1!"
- - balance: "Martial artists spend stamina when they disarm."
- - balance: "Rising Bass had several moves shortened and made stronger. Has a disarm override attack which does stamina damage and trips people on a disarm stun punch."
- - balance: "CQC had it's disarm move altered to be a stronger version of Krav Maga's. Dizzies and disarms on a disarm stun punch or just does some stamina damage and brute damage."
- - balance: "Sleeping Carp can punch you to the floor on a harm stun punch."
- - bugfix: "Hugs of the Northstar are no longer nodrop."
- - bugfix: "Adding in some overrides and proper flag checks for martial arts."
- - bugfix: "Stun thresholding stops disarm spams at extremely high stamina loss."
- - tweak: "Ashen Arrows are actually called Ashen Arrows in the crafting menu."
diff --git a/html/changelogs/AutoChangeLog-pr-11870.yml b/html/changelogs/AutoChangeLog-pr-11870.yml
deleted file mode 100644
index a2861d1dad..0000000000
--- a/html/changelogs/AutoChangeLog-pr-11870.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "Trilbyspaceclone"
-delete-after: True
-changes:
- - bugfix: "Mimes have made catnip plants not become invisible. How helpful."
diff --git a/html/changelogs/AutoChangeLog-pr-11871.yml b/html/changelogs/AutoChangeLog-pr-11871.yml
deleted file mode 100644
index bcbeb3e4a0..0000000000
--- a/html/changelogs/AutoChangeLog-pr-11871.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "kappa-sama"
-delete-after: True
-changes:
- - balance: "aranesp heals 10 instead of 18 stamina per tick"
diff --git a/html/changelogs/AutoChangeLog-pr-11877.yml b/html/changelogs/AutoChangeLog-pr-11877.yml
deleted file mode 100644
index b75747a3cd..0000000000
--- a/html/changelogs/AutoChangeLog-pr-11877.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "Detective-Google"
-delete-after: True
-changes:
- - bugfix: "uncorks some of Lambda's rooms."
diff --git a/html/changelogs/AutoChangeLog-pr-11879.yml b/html/changelogs/AutoChangeLog-pr-11879.yml
deleted file mode 100644
index 02fc0d23a1..0000000000
--- a/html/changelogs/AutoChangeLog-pr-11879.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "Seris02"
-delete-after: True
-changes:
- - bugfix: "stops magboots from not updating slowdowns"
diff --git a/html/changelogs/AutoChangeLog-pr-11880.yml b/html/changelogs/AutoChangeLog-pr-11880.yml
deleted file mode 100644
index c2bf19a6b3..0000000000
--- a/html/changelogs/AutoChangeLog-pr-11880.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "Anonymous"
-delete-after: True
-changes:
- - rscadd: "Xenohybrids will now scream like xeno."
diff --git a/html/changelogs/AutoChangeLog-pr-11882.yml b/html/changelogs/AutoChangeLog-pr-11882.yml
deleted file mode 100644
index b29829e507..0000000000
--- a/html/changelogs/AutoChangeLog-pr-11882.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "Putnam3145"
-delete-after: True
-changes:
- - bugfix: "Objectives now clean theirselves up instead of leaving null entries in lists everywhere."
diff --git a/html/changelogs/AutoChangeLog-pr-11886.yml b/html/changelogs/AutoChangeLog-pr-11886.yml
deleted file mode 100644
index ca6b194533..0000000000
--- a/html/changelogs/AutoChangeLog-pr-11886.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "Jake Park"
-delete-after: True
-changes:
- - bugfix: "fixed path name for youtool vending"
diff --git a/html/changelogs/AutoChangeLog-pr-11900.yml b/html/changelogs/AutoChangeLog-pr-11900.yml
deleted file mode 100644
index b4fddc3eb2..0000000000
--- a/html/changelogs/AutoChangeLog-pr-11900.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "kappa-sama"
-delete-after: True
-changes:
- - rscdel: "removed roundstart hyper earrape screams from xenohybrids"
diff --git a/icons/mecha/mech_construction.dmi b/icons/mecha/mech_construction.dmi
index d7f0f3e054..a1ac490f00 100644
Binary files a/icons/mecha/mech_construction.dmi and b/icons/mecha/mech_construction.dmi differ
diff --git a/icons/mob/clothing/hands.dmi b/icons/mob/clothing/hands.dmi
index 74aabf6021..3860fa4b7e 100644
Binary files a/icons/mob/clothing/hands.dmi and b/icons/mob/clothing/hands.dmi differ
diff --git a/icons/mob/clothing/uniform.dmi b/icons/mob/clothing/uniform.dmi
index 96ff50e138..371c5066df 100644
Binary files a/icons/mob/clothing/uniform.dmi and b/icons/mob/clothing/uniform.dmi differ
diff --git a/icons/mob/clothing/uniform_digi.dmi b/icons/mob/clothing/uniform_digi.dmi
index 94890dd6ad..7a638ef54c 100644
Binary files a/icons/mob/clothing/uniform_digi.dmi and b/icons/mob/clothing/uniform_digi.dmi differ
diff --git a/icons/mob/inhands/equipment/shields_lefthand.dmi b/icons/mob/inhands/equipment/shields_lefthand.dmi
index 3f29410f98..24bb824f1d 100644
Binary files a/icons/mob/inhands/equipment/shields_lefthand.dmi and b/icons/mob/inhands/equipment/shields_lefthand.dmi differ
diff --git a/icons/mob/inhands/equipment/shields_righthand.dmi b/icons/mob/inhands/equipment/shields_righthand.dmi
index 2c3f291e43..31d84f480c 100644
Binary files a/icons/mob/inhands/equipment/shields_righthand.dmi and b/icons/mob/inhands/equipment/shields_righthand.dmi differ
diff --git a/icons/obj/clothing/gloves.dmi b/icons/obj/clothing/gloves.dmi
index d53f53c029..2a6ce77f38 100644
Binary files a/icons/obj/clothing/gloves.dmi and b/icons/obj/clothing/gloves.dmi differ
diff --git a/icons/obj/clothing/masks.dmi b/icons/obj/clothing/masks.dmi
index 13f678f53a..0590104c30 100644
Binary files a/icons/obj/clothing/masks.dmi and b/icons/obj/clothing/masks.dmi differ
diff --git a/icons/obj/clothing/uniforms.dmi b/icons/obj/clothing/uniforms.dmi
index a987f2484c..cea11f8a49 100644
Binary files a/icons/obj/clothing/uniforms.dmi and b/icons/obj/clothing/uniforms.dmi differ
diff --git a/icons/obj/device.dmi b/icons/obj/device.dmi
index c58fb5d940..58c1cd921c 100644
Binary files a/icons/obj/device.dmi and b/icons/obj/device.dmi differ
diff --git a/icons/obj/drinks.dmi b/icons/obj/drinks.dmi
index c178cdba04..bf1e309b17 100644
Binary files a/icons/obj/drinks.dmi and b/icons/obj/drinks.dmi differ
diff --git a/icons/obj/food/burgerbread.dmi b/icons/obj/food/burgerbread.dmi
index b1d78fa078..5ee3db49e9 100644
Binary files a/icons/obj/food/burgerbread.dmi and b/icons/obj/food/burgerbread.dmi differ
diff --git a/icons/obj/items_and_weapons.dmi b/icons/obj/items_and_weapons.dmi
index 6ee7873469..eee164cead 100644
Binary files a/icons/obj/items_and_weapons.dmi and b/icons/obj/items_and_weapons.dmi differ
diff --git a/icons/obj/shields.dmi b/icons/obj/shields.dmi
new file mode 100644
index 0000000000..ed528d4a5a
Binary files /dev/null and b/icons/obj/shields.dmi differ
diff --git a/modular_citadel/code/_onclick/hud/sprint.dm b/modular_citadel/code/_onclick/hud/sprint.dm
index 89547c0feb..326bb81745 100644
--- a/modular_citadel/code/_onclick/hud/sprint.dm
+++ b/modular_citadel/code/_onclick/hud/sprint.dm
@@ -54,5 +54,5 @@
/obj/screen/sprint_buffer/proc/update_to_mob(mob/living/L)
var/amount = 0
if(L.sprint_buffer_max > 0)
- amount = round(CLAMP((L.sprint_buffer / L.sprint_buffer_max) * 100, 0, 100), 5)
+ amount = round(clamp((L.sprint_buffer / L.sprint_buffer_max) * 100, 0, 100), 5)
icon_state = "prog_bar_[amount]"
diff --git a/modular_citadel/code/_onclick/hud/stamina.dm b/modular_citadel/code/_onclick/hud/stamina.dm
index a7b9a79ecd..5484014f8f 100644
--- a/modular_citadel/code/_onclick/hud/stamina.dm
+++ b/modular_citadel/code/_onclick/hud/stamina.dm
@@ -22,7 +22,7 @@
else if(user.hal_screwyhud == 5)
icon_state = "stamina0"
else
- icon_state = "stamina[CLAMP(FLOOR(user.getStaminaLoss() /20, 1), 0, 6)]"
+ icon_state = "stamina[clamp(FLOOR(user.getStaminaLoss() /20, 1), 0, 6)]"
//stam buffer
/obj/screen/staminabuffer
diff --git a/modular_citadel/code/datums/status_effects/chems.dm b/modular_citadel/code/datums/status_effects/chems.dm
index 369fb377a5..62fe30f2d7 100644
--- a/modular_citadel/code/datums/status_effects/chems.dm
+++ b/modular_citadel/code/datums/status_effects/chems.dm
@@ -76,7 +76,7 @@
to_chat(H, "Your enormous breasts are way too large to fit anything over them!")
if(last_checked_size != B.cached_size)
- H.add_movespeed_modifier(BREAST_MOVEMENT_SPEED, TRUE, 100, NONE, override = TRUE, multiplicative_slowdown = moveCalc)
+ H.add_or_update_variable_movespeed_modifier(/datum/movespeed_modifier/status_effect/breast_hypertrophy, multiplicative_slowdown = moveCalc)
sizeMoveMod(moveCalc)
if (B.size == "huge")
@@ -93,7 +93,7 @@
/datum/status_effect/chem/breast_enlarger/on_remove()
log_game("FERMICHEM: [owner]'s breasts has reduced to an acceptable size. ID: [owner.key]")
to_chat(owner, "Your expansive chest has become a more managable size, liberating your movements.")
- owner.remove_movespeed_modifier(BREAST_MOVEMENT_SPEED)
+ owner.remove_movespeed_modifier(/datum/movespeed_modifier/status_effect/breast_hypertrophy)
sizeMoveMod(1)
return ..()
@@ -152,18 +152,18 @@
playsound(H.loc, 'sound/items/poster_ripped.ogg', 50, 1)
to_chat(H, "Your enormous package is way to large to fit anything over!")
- if(P.length < 22 && H.has_movespeed_modifier(DICK_MOVEMENT_SPEED))
+ if(P.length < 22 && H.has_movespeed_modifier(/datum/movespeed_modifier/status_effect/penis_hypertrophy))
to_chat(owner, "Your rascally willy has become a more managable size, liberating your movements.")
- H.remove_movespeed_modifier(DICK_MOVEMENT_SPEED)
- else if(P.length >= 22 && !H.has_movespeed_modifier(DICK_MOVEMENT_SPEED))
+ H.remove_movespeed_modifier(/datum/movespeed_modifier/status_effect/penis_hypertrophy)
+ else if(P.length >= 22 && !H.has_movespeed_modifier(/datum/movespeed_modifier/status_effect/penis_hypertrophy))
to_chat(H, "Your indulgent johnson is so substantial, it's taking all your blood and affecting your movements!")
- H.add_movespeed_modifier(DICK_MOVEMENT_SPEED, TRUE, 100, NONE, override = TRUE, multiplicative_slowdown = moveCalc)
+ H.add_or_update_variable_movespeed_modifier(/datum/movespeed_modifier/status_effect/penis_hypertrophy, multiplicative_slowdown = moveCalc)
H.AdjustBloodVol(bloodCalc)
..()
/datum/status_effect/chem/penis_enlarger/on_remove()
log_game("FERMICHEM: [owner]'s dick has reduced to an acceptable size. ID: [owner.key]")
- owner.remove_movespeed_modifier(DICK_MOVEMENT_SPEED)
+ owner.remove_movespeed_modifier(/datum/movespeed_modifier/status_effect/penis_hypertrophy)
owner.ResetBloodVol()
return ..()
@@ -280,7 +280,7 @@
var/mob/living/carbon/M = owner
//chem calculations
- if(!owner.reagents.has_reagent(/datum/chemical_reaction/fermi/enthrall) && !owner.reagents.has_reagent(/datum/reagent/fermi/enthrall/test))
+ if(!owner.reagents.has_reagent(/datum/chemical_reaction/fermi/enthrall))
if (phase < 3 && phase != 0)
deltaResist += 3//If you've no chem, then you break out quickly
if(prob(5))
@@ -532,7 +532,7 @@
cooldown += 1 //Cooldown doesn't process till status is done
else if(status == "charge")
- owner.add_movespeed_modifier(MOVESPEED_ID_MKULTRA, update=TRUE, priority=100, multiplicative_slowdown=-2, blacklisted_movetypes=(FLYING|FLOATING))
+ owner.add_movespeed_modifier(/datum/movespeed_modifier/status_effect/mkultra)
status = "charged"
if(lewd)
to_chat(owner, "Your [enthrallGender]'s order fills you with a burst of speed!")
@@ -542,7 +542,7 @@
else if (status == "charged")
if (statusStrength < 0)
status = null
- owner.remove_movespeed_modifier(MOVESPEED_ID_MKULTRA)
+ owner.remove_movespeed_modifier(/datum/movespeed_modifier/status_effect/mkultra)
owner.DefaultCombatKnockdown(50)
to_chat(owner, "Your body gives out as the adrenaline in your system runs out.")
else
diff --git a/modular_citadel/code/game/machinery/wishgranter.dm b/modular_citadel/code/game/machinery/wishgranter.dm
index 7758c0d613..6cfe07b7a0 100644
--- a/modular_citadel/code/game/machinery/wishgranter.dm
+++ b/modular_citadel/code/game/machinery/wishgranter.dm
@@ -94,9 +94,8 @@
var/mob/living/simple_animal/hostile/venus_human_trap/killwish = new /mob/living/simple_animal/hostile/venus_human_trap(loc)
killwish.maxHealth = 1500
killwish.health = killwish.maxHealth
- killwish.grasp_range = 6
+ killwish.vine_grab_distance = 6
killwish.melee_damage_upper = 30
- killwish.grasp_chance = 50
killwish.loot = list(/obj/item/twohanded/dualsaber/hypereutactic)
charges--
insisting = FALSE
diff --git a/modular_citadel/code/modules/arousal/genitals.dm b/modular_citadel/code/modules/arousal/genitals.dm
index 68e9259183..e0e1b37a3d 100644
--- a/modular_citadel/code/modules/arousal/genitals.dm
+++ b/modular_citadel/code/modules/arousal/genitals.dm
@@ -1,6 +1,6 @@
/obj/item/organ/genital
color = "#fcccb3"
- w_class = WEIGHT_CLASS_NORMAL
+ w_class = WEIGHT_CLASS_SMALL
var/shape
var/sensitivity = 1 // wow if this were ever used that'd be cool but it's not but i'm keeping it for my unshit code
var/genital_flags //see citadel_defines.dm
diff --git a/modular_citadel/code/modules/arousal/organs/breasts.dm b/modular_citadel/code/modules/arousal/organs/breasts.dm
index c936eb9dc4..213ebb049a 100644
--- a/modular_citadel/code/modules/arousal/organs/breasts.dm
+++ b/modular_citadel/code/modules/arousal/organs/breasts.dm
@@ -54,7 +54,7 @@
desc += " They're leaking [lowertext(R.name)]."
var/datum/sprite_accessory/S = GLOB.breasts_shapes_list[shape]
var/icon_shape = S ? S.icon_state : "pair"
- var/icon_size = CLAMP(breast_values[size], BREASTS_ICON_MIN_SIZE, BREASTS_ICON_MAX_SIZE)
+ var/icon_size = clamp(breast_values[size], BREASTS_ICON_MIN_SIZE, BREASTS_ICON_MAX_SIZE)
icon_state = "breasts_[icon_shape]_[icon_size]"
if(owner)
if(owner.dna.species.use_skintones && owner.dna.features["genitals_use_skintone"])
@@ -73,7 +73,7 @@
//this is far too lewd wah
/obj/item/organ/genital/breasts/modify_size(modifier, min = -INFINITY, max = INFINITY)
- var/new_value = CLAMP(cached_size + modifier, min, max)
+ var/new_value = clamp(cached_size + modifier, min, max)
if(new_value == cached_size)
return
prev_size = cached_size
diff --git a/modular_citadel/code/modules/arousal/organs/penis.dm b/modular_citadel/code/modules/arousal/organs/penis.dm
index c05549aaa0..e1b8dc0dba 100644
--- a/modular_citadel/code/modules/arousal/organs/penis.dm
+++ b/modular_citadel/code/modules/arousal/organs/penis.dm
@@ -21,11 +21,11 @@
var/diameter_ratio = COCK_DIAMETER_RATIO_DEF //0.25; check citadel_defines.dm
/obj/item/organ/genital/penis/modify_size(modifier, min = -INFINITY, max = INFINITY)
- var/new_value = CLAMP(length + modifier, min, max)
+ var/new_value = clamp(length + modifier, min, max)
if(new_value == length)
return
prev_length = length
- length = CLAMP(length + modifier, min, max)
+ length = clamp(length + modifier, min, max)
update()
..()
@@ -60,7 +60,7 @@
else if(!enlargement && status_effect)
owner.remove_status_effect(STATUS_EFFECT_PENIS_ENLARGEMENT)
if(linked_organ)
- linked_organ.size = CLAMP(size + new_size, BALLS_SIZE_MIN, BALLS_SIZE_MAX)
+ linked_organ.size = clamp(size + new_size, BALLS_SIZE_MIN, BALLS_SIZE_MAX)
linked_organ.update()
size = new_size
diff --git a/modular_citadel/code/modules/client/loadout/uniform.dm b/modular_citadel/code/modules/client/loadout/uniform.dm
index 4c66522df8..e9adc317cb 100644
--- a/modular_citadel/code/modules/client/loadout/uniform.dm
+++ b/modular_citadel/code/modules/client/loadout/uniform.dm
@@ -292,7 +292,7 @@
name = "TOS uniform, ops/sec"
category = SLOT_W_UNIFORM
path = /obj/item/clothing/under/trek/engsec
- restricted_desc = "Engineering and Security"
+ restricted_desc = "Engineering, Security, and Cargo"
restricted_roles = list("Chief Engineer","Atmospheric Technician","Station Engineer","Warden","Detective","Security Officer","Head of Security","Cargo Technician", "Shaft Miner", "Quartermaster")
//TNG
@@ -314,7 +314,7 @@
name = "TNG uniform, ops/sec"
category = SLOT_W_UNIFORM
path = /obj/item/clothing/under/trek/engsec/next
- restricted_desc = "Engineering and Security"
+ restricted_desc = "Engineering, Security, and Cargo"
restricted_roles = list("Chief Engineer","Atmospheric Technician","Station Engineer","Warden","Detective","Security Officer","Head of Security","Cargo Technician", "Shaft Miner", "Quartermaster")
//VOY
@@ -336,7 +336,7 @@
name = "VOY uniform, ops/sec"
category = SLOT_W_UNIFORM
path = /obj/item/clothing/under/trek/engsec/voy
- restricted_desc = "Engineering and Security"
+ restricted_desc = "Engineering, Security, and Cargo"
restricted_roles = list("Chief Engineer","Atmospheric Technician","Station Engineer","Warden","Detective","Security Officer","Head of Security","Cargo Technician", "Shaft Miner", "Quartermaster")
//DS9
@@ -358,7 +358,7 @@
name = "DS9 uniform, ops/sec"
category = SLOT_W_UNIFORM
path = /obj/item/clothing/under/trek/engsec/ds9
- restricted_desc = "Engineering and Security"
+ restricted_desc = "Engineering, Security, and Cargo"
restricted_roles = list("Chief Engineer","Atmospheric Technician","Station Engineer","Warden","Detective","Security Officer","Head of Security","Cargo Technician", "Shaft Miner", "Quartermaster")
//ENT
@@ -380,9 +380,33 @@
name = "ENT uniform, ops/sec"
category = SLOT_W_UNIFORM
path = /obj/item/clothing/under/trek/engsec/ent
- restricted_desc = "Engineering and Security"
+ restricted_desc = "Engineering, Security, and Cargo"
restricted_roles = list("Chief Engineer","Atmospheric Technician","Station Engineer","Warden","Detective","Security Officer","Head of Security","Cargo Technician", "Shaft Miner", "Quartermaster")
+//TheMotionPicture
+/datum/gear/trekfedutil
+ name = "TMP uniform"
+ category = SLOT_W_UNIFORM
+ path = /obj/item/clothing/under/trek/fedutil
+ restricted_desc = "All, barring Service and Civilian"
+ restricted_roles = list("Head of Security","Captain","Head of Personnel","Chief Engineer","Research Director","Chief Medical Officer","Quartermaster",
+ "Medical Doctor","Chemist","Virologist","Geneticist","Scientist", "Roboticist",
+ "Atmospheric Technician","Station Engineer","Warden","Detective","Security Officer",
+ "Cargo Technician", "Shaft Miner")
+
+/datum/gear/trekfedtrainee
+ name = "TMP uniform, trainee"
+ category = SLOT_W_UNIFORM
+ path = /obj/item/clothing/under/trek/fedutil/trainee
+ restricted_roles = list("Assistant", "Janitor", "Cargo Technician")
+
+/datum/gear/trekfedservice
+ name = "TMP uniform, service"
+ category = SLOT_W_UNIFORM
+ path = /obj/item/clothing/under/trek/fedutil/service
+ restricted_desc = "Service and Civilian, barring Clown, Mime and Lawyer"
+ restricted_roles = list("Assistant", "Bartender", "Botanist", "Cook", "Curator", "Janitor")
+
//Memes
/datum/gear/gear_harnesses
name = "Gear Harness"
diff --git a/modular_citadel/code/modules/language/sylvan.dm b/modular_citadel/code/modules/language/sylvan.dm
new file mode 100644
index 0000000000..c9458bb4cf
--- /dev/null
+++ b/modular_citadel/code/modules/language/sylvan.dm
@@ -0,0 +1,23 @@
+// The language of the vinebings. Yes, it's a shameless ripoff of elvish.
+/datum/language/sylvan
+ name = "Sylvan"
+ desc = "A complicated, ancient language spoken by vine like beings."
+ speech_verb = "expresses"
+ ask_verb = "inquires"
+ exclaim_verb = "declares"
+ key = "h"
+ space_chance = 20
+ syllables = list(
+ "fii", "sii", "rii", "rel", "maa", "ala", "san", "tol", "tok", "dia", "eres",
+ "fal", "tis", "bis", "qel", "aras", "losk", "rasa", "eob", "hil", "tanl", "aere",
+ "fer", "bal", "pii", "dala", "ban", "foe", "doa", "cii", "uis", "mel", "wex",
+ "incas", "int", "elc", "ent", "aws", "qip", "nas", "vil", "jens", "dila", "fa",
+ "la", "re", "do", "ji", "ae", "so", "qe", "ce", "na", "mo", "ha", "yu"
+ )
+ icon = 'icons/obj/hydroponics/harvest.dmi'
+ icon_state = "lily"
+ default_priority = 90
+
+/datum/language_holder/venus
+ languages = list(/datum/language/common, /datum/language/sylvan, /datum/language/machine)
+ only_speaks_language = /datum/language/sylvan
diff --git a/modular_citadel/code/modules/mob/living/carbon/damage_procs.dm b/modular_citadel/code/modules/mob/living/carbon/damage_procs.dm
index 2e8feb793a..6963714f04 100644
--- a/modular_citadel/code/modules/mob/living/carbon/damage_procs.dm
+++ b/modular_citadel/code/modules/mob/living/carbon/damage_procs.dm
@@ -6,7 +6,7 @@
var/directstamloss = (bufferedstam + amount) - stambuffer
if(directstamloss > 0)
adjustStaminaLoss(directstamloss)
- bufferedstam = CLAMP(bufferedstam + amount, 0, stambuffer)
+ bufferedstam = clamp(bufferedstam + amount, 0, stambuffer)
stambufferregentime = world.time + 10
if(updating_health)
update_health_hud()
diff --git a/modular_citadel/code/modules/mob/living/silicon/robot/dogborg_equipment.dm b/modular_citadel/code/modules/mob/living/silicon/robot/dogborg_equipment.dm
index b0b18e63a0..f59d18686a 100644
--- a/modular_citadel/code/modules/mob/living/silicon/robot/dogborg_equipment.dm
+++ b/modular_citadel/code/modules/mob/living/silicon/robot/dogborg_equipment.dm
@@ -268,7 +268,7 @@ SLEEPER CODE IS IN game/objects/items/devices/dogborg_sleeper.dm !
else if(isliving(target))
var/mob/living/L = target
if(!status)
- if(L.ckey && !(L.client?.prefs.lickable))
+ if(L.ckey && !(L.client?.prefs.vore_flags & LICKABLE))
to_chat(R, "ERROR ERROR: Target not lickable. Aborting display-of-affection subroutine.")
return
if(check_zone(R.zone_selected) == "head")
@@ -327,7 +327,7 @@ SLEEPER CODE IS IN game/objects/items/devices/dogborg_sleeper.dm !
return
var/mob/living/silicon/robot/R = user
var/mob/living/L = target
- if(L.ckey && !(L.client?.prefs.lickable))
+ if(L.ckey && !(L.client?.prefs.vore_flags & LICKABLE))
to_chat(R, "ERROR ERROR: Target not lickable. Aborting display-of-affection subroutine.")
return
@@ -438,7 +438,7 @@ SLEEPER CODE IS IN game/objects/items/devices/dogborg_sleeper.dm !
DefaultCombatKnockdown(15, 1, 1)
else
L.visible_message("[src] pounces on [L]!", "[src] pounces on you!")
- L.DefaultCombatKnockdown(iscarbon(L) ? 60 : 45, override_stamdmg = CLAMP(pounce_stamloss, 0, pounce_stamloss_cap-L.getStaminaLoss())) // Temporary. If someone could rework how dogborg pounces work to accomodate for combat changes, that'd be nice.
+ L.DefaultCombatKnockdown(iscarbon(L) ? 60 : 45, override_stamdmg = clamp(pounce_stamloss, 0, pounce_stamloss_cap-L.getStaminaLoss())) // Temporary. If someone could rework how dogborg pounces work to accomodate for combat changes, that'd be nice.
playsound(src, 'sound/weapons/Egloves.ogg', 50, 1)
sleep(2)//Runtime prevention (infinite bump() calls on hulks)
step_towards(src,L)
diff --git a/modular_citadel/code/modules/reagents/chemistry/reagents/MKUltra.dm b/modular_citadel/code/modules/reagents/chemistry/reagents/MKUltra.dm
index 2364c617f0..89a7f58cee 100644
--- a/modular_citadel/code/modules/reagents/chemistry/reagents/MKUltra.dm
+++ b/modular_citadel/code/modules/reagents/chemistry/reagents/MKUltra.dm
@@ -144,20 +144,7 @@ Creating a chem with a low purity will make you permanently fall in love with so
pH = 10
chemical_flags = REAGENT_ONMOBMERGE | REAGENT_DONOTSPLIT //Procs on_mob_add when merging into a human
can_synth = FALSE
-
-
-/datum/reagent/fermi/enthrall/test
- name = "MKUltraTest"
- description = "A forbidden deep red mixture that makes you like Fermis a little too much. Unobtainable and due to be removed from the wiki."
- data = list("creatorID" = "honkatonkbramblesnatch", "creatorGender" = "Mistress", "creatorName" = "Fermis Yakumo")
- creatorID = "honkatonkbramblesnatch"//ckey
- creatorGender = "Mistress"
- creatorName = "Fermis Yakumo"
- purity = 1
-
-/datum/reagent/fermi/enthrall/test/on_new()
- ..()
- creator = get_mob_by_key(creatorID)
+ value = REAGENT_VALUE_EXCEPTIONAL
/datum/reagent/fermi/enthrall/on_new(list/data)
creatorID = data["creatorID"]
diff --git a/modular_citadel/code/modules/reagents/chemistry/reagents/SDGF.dm b/modular_citadel/code/modules/reagents/chemistry/reagents/SDGF.dm
index 5f9ea5924d..319cad1714 100644
--- a/modular_citadel/code/modules/reagents/chemistry/reagents/SDGF.dm
+++ b/modular_citadel/code/modules/reagents/chemistry/reagents/SDGF.dm
@@ -52,6 +52,7 @@ IMPORTANT FACTORS TO CONSIDER WHILE BALANCING
inverse_chem_val = 0.5
inverse_chem = /datum/reagent/impure/SDZF
can_synth = TRUE
+ value = REAGENT_VALUE_RARE
//Main SDGF chemical
@@ -309,6 +310,7 @@ IMPORTANT FACTORS TO CONSIDER WHILE BALANCING
can_synth = TRUE
taste_description = "a weird chemical fleshy flavour"
chemical_flags = REAGENT_SNEAKYNAME
+ value = REAGENT_VALUE_RARE
/datum/reagent/impure/SDZF/on_mob_life(mob/living/carbon/M) //If you're bad at fermichem, turns your clone into a zombie instead.
switch(current_cycle)//Pretends to be normal
diff --git a/modular_citadel/code/modules/reagents/chemistry/reagents/astrogen.dm b/modular_citadel/code/modules/reagents/chemistry/reagents/astrogen.dm
index a8ac66ef20..8348569fbb 100644
--- a/modular_citadel/code/modules/reagents/chemistry/reagents/astrogen.dm
+++ b/modular_citadel/code/modules/reagents/chemistry/reagents/astrogen.dm
@@ -30,6 +30,7 @@ I'd like to point out from my calculations it'll take about 60-80 minutes to die
inverse_chem_val = 0.25
can_synth = FALSE
var/datum/action/chem/astral/AS = new/datum/action/chem/astral()
+ value = REAGENT_VALUE_AMAZING
/datum/action/chem/astral
name = "Return to body"
diff --git a/modular_citadel/code/modules/reagents/chemistry/reagents/eigentstasium.dm b/modular_citadel/code/modules/reagents/chemistry/reagents/eigentstasium.dm
index e0b7a6fa14..28645cdc7b 100644
--- a/modular_citadel/code/modules/reagents/chemistry/reagents/eigentstasium.dm
+++ b/modular_citadel/code/modules/reagents/chemistry/reagents/eigentstasium.dm
@@ -29,6 +29,7 @@
var/teleBool = FALSE
pH = 3.7
can_synth = TRUE
+ value = REAGENT_VALUE_EXCEPTIONAL
/datum/reagent/fermi/eigenstate/on_new(list/data)
location_created = data["location_created"]
diff --git a/modular_citadel/code/modules/reagents/chemistry/reagents/enlargement.dm b/modular_citadel/code/modules/reagents/chemistry/reagents/enlargement.dm
index 97261e07f2..7403de6215 100644
--- a/modular_citadel/code/modules/reagents/chemistry/reagents/enlargement.dm
+++ b/modular_citadel/code/modules/reagents/chemistry/reagents/enlargement.dm
@@ -29,6 +29,7 @@
inverse_chem_val = 0.35
inverse_chem = /datum/reagent/fermi/BEsmaller //At really impure vols, it just becomes 100% inverse
can_synth = FALSE
+ value = REAGENT_VALUE_VERY_RARE
var/message_spam = FALSE
/datum/reagent/fermi/breast_enlarger/on_mob_metabolize(mob/living/M)
@@ -126,6 +127,7 @@
taste_description = "a milky ice cream like flavour."
metabolization_rate = 0.25
can_synth = FALSE
+ value = REAGENT_VALUE_RARE
/datum/reagent/fermi/BEsmaller/on_mob_life(mob/living/carbon/M)
var/obj/item/organ/genital/breasts/B = M.getorganslot(ORGAN_SLOT_BREASTS)
@@ -186,6 +188,7 @@
inverse_chem_val = 0.35
inverse_chem = /datum/reagent/fermi/PEsmaller //At really impure vols, it just becomes 100% inverse and shrinks instead.
can_synth = FALSE
+ value = REAGENT_VALUE_VERY_RARE
var/message_spam = FALSE
/datum/reagent/fermi/penis_enlarger/on_mob_metabolize(mob/living/M)
@@ -273,6 +276,7 @@
taste_description = "chinese dragon powder"
metabolization_rate = 0.5
can_synth = FALSE
+ value = REAGENT_VALUE_RARE
/datum/reagent/fermi/PEsmaller/on_mob_life(mob/living/carbon/M)
if(!ishuman(M))
diff --git a/modular_citadel/code/modules/reagents/chemistry/reagents/healing.dm b/modular_citadel/code/modules/reagents/chemistry/reagents/healing.dm
index d98ec7059d..48c9ffb7e6 100644
--- a/modular_citadel/code/modules/reagents/chemistry/reagents/healing.dm
+++ b/modular_citadel/code/modules/reagents/chemistry/reagents/healing.dm
@@ -9,6 +9,7 @@
inverse_chem_val = 0.4
inverse_chem = /datum/reagent/impure/yamerol_tox
can_synth = TRUE
+ value = REAGENT_VALUE_VERY_RARE
/datum/reagent/fermi/yamerol/on_mob_life(mob/living/carbon/C)
var/obj/item/organ/tongue/T = C.getorganslot(ORGAN_SLOT_TONGUE)
@@ -100,6 +101,7 @@
data = list("grown_volume" = 0, "injected_vol" = 0)
var/borrowed_health
color = "#FFDADA"
+ value = REAGENT_VALUE_COMMON
/datum/reagent/synthtissue/reaction_mob(mob/living/M, method=TOUCH, reac_volume,show_message = 1)
if(iscarbon(M))
diff --git a/modular_citadel/code/modules/reagents/chemistry/reagents/other_reagents.dm b/modular_citadel/code/modules/reagents/chemistry/reagents/other_reagents.dm
deleted file mode 100644
index 87f9d71ce2..0000000000
--- a/modular_citadel/code/modules/reagents/chemistry/reagents/other_reagents.dm
+++ /dev/null
@@ -1,32 +0,0 @@
-/datum/reagent/syndicateadrenals
- name = "Syndicate Adrenaline"
- description = "Regenerates your stamina and increases your reaction time."
- color = "#E62111"
- overdose_threshold = 6
-
-/datum/reagent/syndicateadrenals/on_mob_life(mob/living/M)
- M.adjustStaminaLoss(-5*REM)
- . = ..()
-
-/datum/reagent/syndicateadrenals/on_mob_metabolize(mob/living/M)
- . = ..()
- if(istype(M))
- M.next_move_modifier *= 0.5
- to_chat(M, "You feel an intense surge of energy rushing through your veins.")
-
-/datum/reagent/syndicateadrenals/on_mob_end_metabolize(mob/living/M)
- . = ..()
- if(istype(M))
- M.next_move_modifier *= 2
- to_chat(M, "You feel as though the world around you is going faster.")
-
-/datum/reagent/syndicateadrenals/overdose_start(mob/living/M)
- to_chat(M, "You feel an intense pain in your chest...")
- return
-
-/datum/reagent/syndicateadrenals/overdose_process(mob/living/M)
- if(iscarbon(M))
- var/mob/living/carbon/C = M
- if(!C.undergoing_cardiac_arrest())
- C.set_heartattack(TRUE)
- return
diff --git a/modular_citadel/code/modules/reagents/chemistry/recipes/fermi.dm b/modular_citadel/code/modules/reagents/chemistry/recipes/fermi.dm
index eb93d273a7..837524d49f 100644
--- a/modular_citadel/code/modules/reagents/chemistry/recipes/fermi.dm
+++ b/modular_citadel/code/modules/reagents/chemistry/recipes/fermi.dm
@@ -95,7 +95,7 @@
if(!ImpureTot == 0) //If impure, v.small emp (0.6 or less)
ImpureTot *= volume
- var/empVol = CLAMP (volume/10, 0, 15)
+ var/empVol = clamp(volume/10, 0, 15)
empulse(T, empVol, ImpureTot/10, 1)
my_atom.reagents.clear_reagents() //just in case
diff --git a/sound/instruments/synthesis_samples/brass/crisis_brass/c2.ogg b/sound/instruments/synthesis_samples/brass/crisis_brass/c2.ogg
index 9808431b25..aaa1e27ab8 100644
Binary files a/sound/instruments/synthesis_samples/brass/crisis_brass/c2.ogg and b/sound/instruments/synthesis_samples/brass/crisis_brass/c2.ogg differ
diff --git a/sound/instruments/synthesis_samples/brass/crisis_brass/c3.ogg b/sound/instruments/synthesis_samples/brass/crisis_brass/c3.ogg
index 4118cff81c..ce50e76aae 100644
Binary files a/sound/instruments/synthesis_samples/brass/crisis_brass/c3.ogg and b/sound/instruments/synthesis_samples/brass/crisis_brass/c3.ogg differ
diff --git a/sound/instruments/synthesis_samples/brass/crisis_brass/c4.ogg b/sound/instruments/synthesis_samples/brass/crisis_brass/c4.ogg
index ae9e1361d2..22f34d6759 100644
Binary files a/sound/instruments/synthesis_samples/brass/crisis_brass/c4.ogg and b/sound/instruments/synthesis_samples/brass/crisis_brass/c4.ogg differ
diff --git a/sound/instruments/synthesis_samples/brass/crisis_brass/c5.ogg b/sound/instruments/synthesis_samples/brass/crisis_brass/c5.ogg
index f19ddd9300..eb5bb7c295 100644
Binary files a/sound/instruments/synthesis_samples/brass/crisis_brass/c5.ogg and b/sound/instruments/synthesis_samples/brass/crisis_brass/c5.ogg differ
diff --git a/sound/instruments/synthesis_samples/brass/crisis_trombone/C2.ogg b/sound/instruments/synthesis_samples/brass/crisis_trombone/C2.ogg
index d2c872d5a3..bd299e321a 100644
Binary files a/sound/instruments/synthesis_samples/brass/crisis_trombone/C2.ogg and b/sound/instruments/synthesis_samples/brass/crisis_trombone/C2.ogg differ
diff --git a/sound/instruments/synthesis_samples/brass/crisis_trombone/C3.ogg b/sound/instruments/synthesis_samples/brass/crisis_trombone/C3.ogg
index e1e3fc8635..0519d2d20d 100644
Binary files a/sound/instruments/synthesis_samples/brass/crisis_trombone/C3.ogg and b/sound/instruments/synthesis_samples/brass/crisis_trombone/C3.ogg differ
diff --git a/sound/instruments/synthesis_samples/brass/crisis_trombone/C4.ogg b/sound/instruments/synthesis_samples/brass/crisis_trombone/C4.ogg
index 42c4aa755d..3b969a34b1 100644
Binary files a/sound/instruments/synthesis_samples/brass/crisis_trombone/C4.ogg and b/sound/instruments/synthesis_samples/brass/crisis_trombone/C4.ogg differ
diff --git a/sound/instruments/synthesis_samples/brass/crisis_trombone/C5.ogg b/sound/instruments/synthesis_samples/brass/crisis_trombone/C5.ogg
index 762d2868d0..75f709c16f 100644
Binary files a/sound/instruments/synthesis_samples/brass/crisis_trombone/C5.ogg and b/sound/instruments/synthesis_samples/brass/crisis_trombone/C5.ogg differ
diff --git a/sound/instruments/synthesis_samples/brass/crisis_trumpet/C4.ogg b/sound/instruments/synthesis_samples/brass/crisis_trumpet/C4.ogg
index baf71063af..ba347f8003 100644
Binary files a/sound/instruments/synthesis_samples/brass/crisis_trumpet/C4.ogg and b/sound/instruments/synthesis_samples/brass/crisis_trumpet/C4.ogg differ
diff --git a/sound/instruments/synthesis_samples/brass/crisis_trumpet/C5.ogg b/sound/instruments/synthesis_samples/brass/crisis_trumpet/C5.ogg
index 92b4a11018..cee89761d0 100644
Binary files a/sound/instruments/synthesis_samples/brass/crisis_trumpet/C5.ogg and b/sound/instruments/synthesis_samples/brass/crisis_trumpet/C5.ogg differ
diff --git a/sound/instruments/synthesis_samples/chromatic/fluid_celeste/C2.ogg b/sound/instruments/synthesis_samples/chromatic/fluid_celeste/C2.ogg
index 5a50a5091c..105f767655 100644
Binary files a/sound/instruments/synthesis_samples/chromatic/fluid_celeste/C2.ogg and b/sound/instruments/synthesis_samples/chromatic/fluid_celeste/C2.ogg differ
diff --git a/sound/instruments/synthesis_samples/chromatic/fluid_celeste/C3.ogg b/sound/instruments/synthesis_samples/chromatic/fluid_celeste/C3.ogg
index f086938260..4aa33b6cde 100644
Binary files a/sound/instruments/synthesis_samples/chromatic/fluid_celeste/C3.ogg and b/sound/instruments/synthesis_samples/chromatic/fluid_celeste/C3.ogg differ
diff --git a/sound/instruments/synthesis_samples/chromatic/fluid_celeste/C4.ogg b/sound/instruments/synthesis_samples/chromatic/fluid_celeste/C4.ogg
index 1246bd5341..d661e8d758 100644
Binary files a/sound/instruments/synthesis_samples/chromatic/fluid_celeste/C4.ogg and b/sound/instruments/synthesis_samples/chromatic/fluid_celeste/C4.ogg differ
diff --git a/sound/instruments/synthesis_samples/chromatic/fluid_celeste/C5.ogg b/sound/instruments/synthesis_samples/chromatic/fluid_celeste/C5.ogg
index 73680ce627..bf650f1a6f 100644
Binary files a/sound/instruments/synthesis_samples/chromatic/fluid_celeste/C5.ogg and b/sound/instruments/synthesis_samples/chromatic/fluid_celeste/C5.ogg differ
diff --git a/sound/instruments/synthesis_samples/chromatic/fluid_celeste/C6.ogg b/sound/instruments/synthesis_samples/chromatic/fluid_celeste/C6.ogg
index 72841fb189..c00f7949b7 100644
Binary files a/sound/instruments/synthesis_samples/chromatic/fluid_celeste/C6.ogg and b/sound/instruments/synthesis_samples/chromatic/fluid_celeste/C6.ogg differ
diff --git a/sound/instruments/synthesis_samples/chromatic/fluid_celeste/C7.ogg b/sound/instruments/synthesis_samples/chromatic/fluid_celeste/C7.ogg
index 47797e4c00..72588e9ca4 100644
Binary files a/sound/instruments/synthesis_samples/chromatic/fluid_celeste/C7.ogg and b/sound/instruments/synthesis_samples/chromatic/fluid_celeste/C7.ogg differ
diff --git a/sound/instruments/synthesis_samples/chromatic/fluid_celeste/C8.ogg b/sound/instruments/synthesis_samples/chromatic/fluid_celeste/C8.ogg
index ea34703160..b2a0b445b9 100644
Binary files a/sound/instruments/synthesis_samples/chromatic/fluid_celeste/C8.ogg and b/sound/instruments/synthesis_samples/chromatic/fluid_celeste/C8.ogg differ
diff --git a/sound/instruments/synthesis_samples/chromatic/sgmbox/c2.ogg b/sound/instruments/synthesis_samples/chromatic/sgmbox/c2.ogg
index 4b96dd3dd3..ecf6778343 100644
Binary files a/sound/instruments/synthesis_samples/chromatic/sgmbox/c2.ogg and b/sound/instruments/synthesis_samples/chromatic/sgmbox/c2.ogg differ
diff --git a/sound/instruments/synthesis_samples/chromatic/sgmbox/c3.ogg b/sound/instruments/synthesis_samples/chromatic/sgmbox/c3.ogg
index 25daf5372e..867e9ce00d 100644
Binary files a/sound/instruments/synthesis_samples/chromatic/sgmbox/c3.ogg and b/sound/instruments/synthesis_samples/chromatic/sgmbox/c3.ogg differ
diff --git a/sound/instruments/synthesis_samples/chromatic/sgmbox/c4.ogg b/sound/instruments/synthesis_samples/chromatic/sgmbox/c4.ogg
index 9b989404e7..446d45993e 100644
Binary files a/sound/instruments/synthesis_samples/chromatic/sgmbox/c4.ogg and b/sound/instruments/synthesis_samples/chromatic/sgmbox/c4.ogg differ
diff --git a/sound/instruments/synthesis_samples/chromatic/sgmbox/c5.ogg b/sound/instruments/synthesis_samples/chromatic/sgmbox/c5.ogg
index 7fa99d9278..54d56400c0 100644
Binary files a/sound/instruments/synthesis_samples/chromatic/sgmbox/c5.ogg and b/sound/instruments/synthesis_samples/chromatic/sgmbox/c5.ogg differ
diff --git a/sound/instruments/synthesis_samples/chromatic/vibraphone1/c2.ogg b/sound/instruments/synthesis_samples/chromatic/vibraphone1/c2.ogg
index 64578a8fe1..f3770c1f1a 100644
Binary files a/sound/instruments/synthesis_samples/chromatic/vibraphone1/c2.ogg and b/sound/instruments/synthesis_samples/chromatic/vibraphone1/c2.ogg differ
diff --git a/sound/instruments/synthesis_samples/chromatic/vibraphone1/c3.ogg b/sound/instruments/synthesis_samples/chromatic/vibraphone1/c3.ogg
index d97230ce1f..28954fbb47 100644
Binary files a/sound/instruments/synthesis_samples/chromatic/vibraphone1/c3.ogg and b/sound/instruments/synthesis_samples/chromatic/vibraphone1/c3.ogg differ
diff --git a/sound/instruments/synthesis_samples/chromatic/vibraphone1/c4.ogg b/sound/instruments/synthesis_samples/chromatic/vibraphone1/c4.ogg
index eb6f80654a..1233f5314a 100644
Binary files a/sound/instruments/synthesis_samples/chromatic/vibraphone1/c4.ogg and b/sound/instruments/synthesis_samples/chromatic/vibraphone1/c4.ogg differ
diff --git a/sound/instruments/synthesis_samples/chromatic/vibraphone1/c5.ogg b/sound/instruments/synthesis_samples/chromatic/vibraphone1/c5.ogg
index 8f25ee2747..00daf33135 100644
Binary files a/sound/instruments/synthesis_samples/chromatic/vibraphone1/c5.ogg and b/sound/instruments/synthesis_samples/chromatic/vibraphone1/c5.ogg differ
diff --git a/sound/instruments/synthesis_samples/guitar/crisis_clean/C2.ogg b/sound/instruments/synthesis_samples/guitar/crisis_clean/C2.ogg
index 17bea8122c..13ad54bff0 100644
Binary files a/sound/instruments/synthesis_samples/guitar/crisis_clean/C2.ogg and b/sound/instruments/synthesis_samples/guitar/crisis_clean/C2.ogg differ
diff --git a/sound/instruments/synthesis_samples/guitar/crisis_clean/C3.ogg b/sound/instruments/synthesis_samples/guitar/crisis_clean/C3.ogg
index 6dc0d8ad38..17bf392c4b 100644
Binary files a/sound/instruments/synthesis_samples/guitar/crisis_clean/C3.ogg and b/sound/instruments/synthesis_samples/guitar/crisis_clean/C3.ogg differ
diff --git a/sound/instruments/synthesis_samples/guitar/crisis_clean/C4.ogg b/sound/instruments/synthesis_samples/guitar/crisis_clean/C4.ogg
index fbbcacb372..feda419a0a 100644
Binary files a/sound/instruments/synthesis_samples/guitar/crisis_clean/C4.ogg and b/sound/instruments/synthesis_samples/guitar/crisis_clean/C4.ogg differ
diff --git a/sound/instruments/synthesis_samples/guitar/crisis_clean/C5.ogg b/sound/instruments/synthesis_samples/guitar/crisis_clean/C5.ogg
index f9bb3f6e92..bd088dd850 100644
Binary files a/sound/instruments/synthesis_samples/guitar/crisis_clean/C5.ogg and b/sound/instruments/synthesis_samples/guitar/crisis_clean/C5.ogg differ
diff --git a/sound/instruments/synthesis_samples/guitar/crisis_muted/C2.ogg b/sound/instruments/synthesis_samples/guitar/crisis_muted/C2.ogg
index 777a38664f..09cdbeec42 100644
Binary files a/sound/instruments/synthesis_samples/guitar/crisis_muted/C2.ogg and b/sound/instruments/synthesis_samples/guitar/crisis_muted/C2.ogg differ
diff --git a/sound/instruments/synthesis_samples/guitar/crisis_muted/C3.ogg b/sound/instruments/synthesis_samples/guitar/crisis_muted/C3.ogg
index c14aa5ec93..f82c39cee5 100644
Binary files a/sound/instruments/synthesis_samples/guitar/crisis_muted/C3.ogg and b/sound/instruments/synthesis_samples/guitar/crisis_muted/C3.ogg differ
diff --git a/sound/instruments/synthesis_samples/guitar/crisis_muted/C4.ogg b/sound/instruments/synthesis_samples/guitar/crisis_muted/C4.ogg
index b2a457b496..23bfd113d6 100644
Binary files a/sound/instruments/synthesis_samples/guitar/crisis_muted/C4.ogg and b/sound/instruments/synthesis_samples/guitar/crisis_muted/C4.ogg differ
diff --git a/sound/instruments/synthesis_samples/guitar/crisis_muted/C5.ogg b/sound/instruments/synthesis_samples/guitar/crisis_muted/C5.ogg
index c4f5aac8bf..e5ec38d5ab 100644
Binary files a/sound/instruments/synthesis_samples/guitar/crisis_muted/C5.ogg and b/sound/instruments/synthesis_samples/guitar/crisis_muted/C5.ogg differ
diff --git a/sound/instruments/synthesis_samples/guitar/crisis_nylon/c2.ogg b/sound/instruments/synthesis_samples/guitar/crisis_nylon/c2.ogg
index 6a8115f004..42a6cdfad3 100644
Binary files a/sound/instruments/synthesis_samples/guitar/crisis_nylon/c2.ogg and b/sound/instruments/synthesis_samples/guitar/crisis_nylon/c2.ogg differ
diff --git a/sound/instruments/synthesis_samples/guitar/crisis_nylon/c3.ogg b/sound/instruments/synthesis_samples/guitar/crisis_nylon/c3.ogg
index 15ec741bb6..cd6414c0aa 100644
Binary files a/sound/instruments/synthesis_samples/guitar/crisis_nylon/c3.ogg and b/sound/instruments/synthesis_samples/guitar/crisis_nylon/c3.ogg differ
diff --git a/sound/instruments/synthesis_samples/guitar/crisis_nylon/c4.ogg b/sound/instruments/synthesis_samples/guitar/crisis_nylon/c4.ogg
index df4ef3fb79..e536601865 100644
Binary files a/sound/instruments/synthesis_samples/guitar/crisis_nylon/c4.ogg and b/sound/instruments/synthesis_samples/guitar/crisis_nylon/c4.ogg differ
diff --git a/sound/instruments/synthesis_samples/guitar/crisis_nylon/c5.ogg b/sound/instruments/synthesis_samples/guitar/crisis_nylon/c5.ogg
index 961f4a6b90..6038222837 100644
Binary files a/sound/instruments/synthesis_samples/guitar/crisis_nylon/c5.ogg and b/sound/instruments/synthesis_samples/guitar/crisis_nylon/c5.ogg differ
diff --git a/sound/instruments/synthesis_samples/guitar/crisis_steel/c2.ogg b/sound/instruments/synthesis_samples/guitar/crisis_steel/c2.ogg
index 06ccf6ae51..648549d594 100644
Binary files a/sound/instruments/synthesis_samples/guitar/crisis_steel/c2.ogg and b/sound/instruments/synthesis_samples/guitar/crisis_steel/c2.ogg differ
diff --git a/sound/instruments/synthesis_samples/guitar/crisis_steel/c3.ogg b/sound/instruments/synthesis_samples/guitar/crisis_steel/c3.ogg
index 14756fb249..01ba59a908 100644
Binary files a/sound/instruments/synthesis_samples/guitar/crisis_steel/c3.ogg and b/sound/instruments/synthesis_samples/guitar/crisis_steel/c3.ogg differ
diff --git a/sound/instruments/synthesis_samples/guitar/crisis_steel/c4.ogg b/sound/instruments/synthesis_samples/guitar/crisis_steel/c4.ogg
index 544b324786..7cfaa8ca72 100644
Binary files a/sound/instruments/synthesis_samples/guitar/crisis_steel/c4.ogg and b/sound/instruments/synthesis_samples/guitar/crisis_steel/c4.ogg differ
diff --git a/sound/instruments/synthesis_samples/guitar/crisis_steel/c5.ogg b/sound/instruments/synthesis_samples/guitar/crisis_steel/c5.ogg
index df2dc8def5..b4ca49dc04 100644
Binary files a/sound/instruments/synthesis_samples/guitar/crisis_steel/c5.ogg and b/sound/instruments/synthesis_samples/guitar/crisis_steel/c5.ogg differ
diff --git a/sound/instruments/synthesis_samples/organ/crisis_accordian/c2.ogg b/sound/instruments/synthesis_samples/organ/crisis_accordian/c2.ogg
index ba20e3f4b6..7c9870a7c3 100644
Binary files a/sound/instruments/synthesis_samples/organ/crisis_accordian/c2.ogg and b/sound/instruments/synthesis_samples/organ/crisis_accordian/c2.ogg differ
diff --git a/sound/instruments/synthesis_samples/organ/crisis_accordian/c3.ogg b/sound/instruments/synthesis_samples/organ/crisis_accordian/c3.ogg
index fcc8715e04..5723c2edd2 100644
Binary files a/sound/instruments/synthesis_samples/organ/crisis_accordian/c3.ogg and b/sound/instruments/synthesis_samples/organ/crisis_accordian/c3.ogg differ
diff --git a/sound/instruments/synthesis_samples/organ/crisis_accordian/c4.ogg b/sound/instruments/synthesis_samples/organ/crisis_accordian/c4.ogg
index aa21d7e230..329f14f6fe 100644
Binary files a/sound/instruments/synthesis_samples/organ/crisis_accordian/c4.ogg and b/sound/instruments/synthesis_samples/organ/crisis_accordian/c4.ogg differ
diff --git a/sound/instruments/synthesis_samples/organ/crisis_accordian/c5.ogg b/sound/instruments/synthesis_samples/organ/crisis_accordian/c5.ogg
index ac45bc6be4..5e8ac69de2 100644
Binary files a/sound/instruments/synthesis_samples/organ/crisis_accordian/c5.ogg and b/sound/instruments/synthesis_samples/organ/crisis_accordian/c5.ogg differ
diff --git a/sound/instruments/synthesis_samples/organ/crisis_church/c2.ogg b/sound/instruments/synthesis_samples/organ/crisis_church/c2.ogg
index 71b9280e86..ddc44c69c2 100644
Binary files a/sound/instruments/synthesis_samples/organ/crisis_church/c2.ogg and b/sound/instruments/synthesis_samples/organ/crisis_church/c2.ogg differ
diff --git a/sound/instruments/synthesis_samples/organ/crisis_church/c3.ogg b/sound/instruments/synthesis_samples/organ/crisis_church/c3.ogg
index 676a24669f..2855747528 100644
Binary files a/sound/instruments/synthesis_samples/organ/crisis_church/c3.ogg and b/sound/instruments/synthesis_samples/organ/crisis_church/c3.ogg differ
diff --git a/sound/instruments/synthesis_samples/organ/crisis_church/c4.ogg b/sound/instruments/synthesis_samples/organ/crisis_church/c4.ogg
index 24e3732d7e..906fff5bd8 100644
Binary files a/sound/instruments/synthesis_samples/organ/crisis_church/c4.ogg and b/sound/instruments/synthesis_samples/organ/crisis_church/c4.ogg differ
diff --git a/sound/instruments/synthesis_samples/organ/crisis_church/c5.ogg b/sound/instruments/synthesis_samples/organ/crisis_church/c5.ogg
index 72dc2ce764..96d28a7206 100644
Binary files a/sound/instruments/synthesis_samples/organ/crisis_church/c5.ogg and b/sound/instruments/synthesis_samples/organ/crisis_church/c5.ogg differ
diff --git a/sound/instruments/synthesis_samples/organ/crisis_hammond/c2.ogg b/sound/instruments/synthesis_samples/organ/crisis_hammond/c2.ogg
index 853b7591b4..9b917b7eb5 100644
Binary files a/sound/instruments/synthesis_samples/organ/crisis_hammond/c2.ogg and b/sound/instruments/synthesis_samples/organ/crisis_hammond/c2.ogg differ
diff --git a/sound/instruments/synthesis_samples/organ/crisis_hammond/c3.ogg b/sound/instruments/synthesis_samples/organ/crisis_hammond/c3.ogg
index 205e190379..c68410d6f0 100644
Binary files a/sound/instruments/synthesis_samples/organ/crisis_hammond/c3.ogg and b/sound/instruments/synthesis_samples/organ/crisis_hammond/c3.ogg differ
diff --git a/sound/instruments/synthesis_samples/organ/crisis_hammond/c4.ogg b/sound/instruments/synthesis_samples/organ/crisis_hammond/c4.ogg
index e90c28f14c..df84ba99e8 100644
Binary files a/sound/instruments/synthesis_samples/organ/crisis_hammond/c4.ogg and b/sound/instruments/synthesis_samples/organ/crisis_hammond/c4.ogg differ
diff --git a/sound/instruments/synthesis_samples/organ/crisis_hammond/c5.ogg b/sound/instruments/synthesis_samples/organ/crisis_hammond/c5.ogg
index a56d3cc3f6..af8c178efe 100644
Binary files a/sound/instruments/synthesis_samples/organ/crisis_hammond/c5.ogg and b/sound/instruments/synthesis_samples/organ/crisis_hammond/c5.ogg differ
diff --git a/sound/instruments/synthesis_samples/organ/crisis_harmonica/c3.ogg b/sound/instruments/synthesis_samples/organ/crisis_harmonica/c3.ogg
index 14c5f35eef..268b41f1fc 100644
Binary files a/sound/instruments/synthesis_samples/organ/crisis_harmonica/c3.ogg and b/sound/instruments/synthesis_samples/organ/crisis_harmonica/c3.ogg differ
diff --git a/sound/instruments/synthesis_samples/organ/crisis_harmonica/c4.ogg b/sound/instruments/synthesis_samples/organ/crisis_harmonica/c4.ogg
index e06e733eb2..04ceb54bfc 100644
Binary files a/sound/instruments/synthesis_samples/organ/crisis_harmonica/c4.ogg and b/sound/instruments/synthesis_samples/organ/crisis_harmonica/c4.ogg differ
diff --git a/sound/instruments/synthesis_samples/organ/crisis_harmonica/c5.ogg b/sound/instruments/synthesis_samples/organ/crisis_harmonica/c5.ogg
index 3d21e92d53..b321983e74 100644
Binary files a/sound/instruments/synthesis_samples/organ/crisis_harmonica/c5.ogg and b/sound/instruments/synthesis_samples/organ/crisis_harmonica/c5.ogg differ
diff --git a/sound/instruments/synthesis_samples/organ/crisis_tangaccordian/c2.ogg b/sound/instruments/synthesis_samples/organ/crisis_tangaccordian/c2.ogg
index be51b6dcd4..250a5c08e0 100644
Binary files a/sound/instruments/synthesis_samples/organ/crisis_tangaccordian/c2.ogg and b/sound/instruments/synthesis_samples/organ/crisis_tangaccordian/c2.ogg differ
diff --git a/sound/instruments/synthesis_samples/organ/crisis_tangaccordian/c3.ogg b/sound/instruments/synthesis_samples/organ/crisis_tangaccordian/c3.ogg
index 7426d246a0..8b1c23007b 100644
Binary files a/sound/instruments/synthesis_samples/organ/crisis_tangaccordian/c3.ogg and b/sound/instruments/synthesis_samples/organ/crisis_tangaccordian/c3.ogg differ
diff --git a/sound/instruments/synthesis_samples/organ/crisis_tangaccordian/c4.ogg b/sound/instruments/synthesis_samples/organ/crisis_tangaccordian/c4.ogg
index af7b66cf19..098587183b 100644
Binary files a/sound/instruments/synthesis_samples/organ/crisis_tangaccordian/c4.ogg and b/sound/instruments/synthesis_samples/organ/crisis_tangaccordian/c4.ogg differ
diff --git a/sound/instruments/synthesis_samples/organ/crisis_tangaccordian/c5.ogg b/sound/instruments/synthesis_samples/organ/crisis_tangaccordian/c5.ogg
index 58ff4ff216..81b60ef4c2 100644
Binary files a/sound/instruments/synthesis_samples/organ/crisis_tangaccordian/c5.ogg and b/sound/instruments/synthesis_samples/organ/crisis_tangaccordian/c5.ogg differ
diff --git a/sound/instruments/synthesis_samples/piano/crisis_bright_piano/c2.ogg b/sound/instruments/synthesis_samples/piano/crisis_bright_piano/c2.ogg
index 4b7feb77a4..39e992fbd8 100644
Binary files a/sound/instruments/synthesis_samples/piano/crisis_bright_piano/c2.ogg and b/sound/instruments/synthesis_samples/piano/crisis_bright_piano/c2.ogg differ
diff --git a/sound/instruments/synthesis_samples/piano/crisis_bright_piano/c3.ogg b/sound/instruments/synthesis_samples/piano/crisis_bright_piano/c3.ogg
index 5e7eefa79a..04aa985281 100644
Binary files a/sound/instruments/synthesis_samples/piano/crisis_bright_piano/c3.ogg and b/sound/instruments/synthesis_samples/piano/crisis_bright_piano/c3.ogg differ
diff --git a/sound/instruments/synthesis_samples/piano/crisis_bright_piano/c4.ogg b/sound/instruments/synthesis_samples/piano/crisis_bright_piano/c4.ogg
index 13e49d4f3a..aff97942e9 100644
Binary files a/sound/instruments/synthesis_samples/piano/crisis_bright_piano/c4.ogg and b/sound/instruments/synthesis_samples/piano/crisis_bright_piano/c4.ogg differ
diff --git a/sound/instruments/synthesis_samples/piano/crisis_bright_piano/c5.ogg b/sound/instruments/synthesis_samples/piano/crisis_bright_piano/c5.ogg
index 6ef00f0700..19fd937707 100644
Binary files a/sound/instruments/synthesis_samples/piano/crisis_bright_piano/c5.ogg and b/sound/instruments/synthesis_samples/piano/crisis_bright_piano/c5.ogg differ
diff --git a/sound/instruments/synthesis_samples/piano/crisis_bright_piano/c6.ogg b/sound/instruments/synthesis_samples/piano/crisis_bright_piano/c6.ogg
index a868249ca8..452e7485be 100644
Binary files a/sound/instruments/synthesis_samples/piano/crisis_bright_piano/c6.ogg and b/sound/instruments/synthesis_samples/piano/crisis_bright_piano/c6.ogg differ
diff --git a/sound/instruments/synthesis_samples/piano/crisis_bright_piano/c7.ogg b/sound/instruments/synthesis_samples/piano/crisis_bright_piano/c7.ogg
index 2d08d98dd9..66c88185a7 100644
Binary files a/sound/instruments/synthesis_samples/piano/crisis_bright_piano/c7.ogg and b/sound/instruments/synthesis_samples/piano/crisis_bright_piano/c7.ogg differ
diff --git a/sound/instruments/synthesis_samples/piano/crisis_bright_piano/c8.ogg b/sound/instruments/synthesis_samples/piano/crisis_bright_piano/c8.ogg
index 50e3cb76a7..d93c5176ce 100644
Binary files a/sound/instruments/synthesis_samples/piano/crisis_bright_piano/c8.ogg and b/sound/instruments/synthesis_samples/piano/crisis_bright_piano/c8.ogg differ
diff --git a/sound/instruments/synthesis_samples/piano/crisis_grand_piano/c2.ogg b/sound/instruments/synthesis_samples/piano/crisis_grand_piano/c2.ogg
index 0b87714166..fabd90d2e6 100644
Binary files a/sound/instruments/synthesis_samples/piano/crisis_grand_piano/c2.ogg and b/sound/instruments/synthesis_samples/piano/crisis_grand_piano/c2.ogg differ
diff --git a/sound/instruments/synthesis_samples/piano/crisis_grand_piano/c3.ogg b/sound/instruments/synthesis_samples/piano/crisis_grand_piano/c3.ogg
index 31fd625098..e4cda1487a 100644
Binary files a/sound/instruments/synthesis_samples/piano/crisis_grand_piano/c3.ogg and b/sound/instruments/synthesis_samples/piano/crisis_grand_piano/c3.ogg differ
diff --git a/sound/instruments/synthesis_samples/piano/crisis_grand_piano/c4.ogg b/sound/instruments/synthesis_samples/piano/crisis_grand_piano/c4.ogg
index 0ed309dbb7..c596994b3e 100644
Binary files a/sound/instruments/synthesis_samples/piano/crisis_grand_piano/c4.ogg and b/sound/instruments/synthesis_samples/piano/crisis_grand_piano/c4.ogg differ
diff --git a/sound/instruments/synthesis_samples/piano/crisis_grand_piano/c5.ogg b/sound/instruments/synthesis_samples/piano/crisis_grand_piano/c5.ogg
index 7fd820d373..d265514e27 100644
Binary files a/sound/instruments/synthesis_samples/piano/crisis_grand_piano/c5.ogg and b/sound/instruments/synthesis_samples/piano/crisis_grand_piano/c5.ogg differ
diff --git a/sound/instruments/synthesis_samples/piano/crisis_grand_piano/c6.ogg b/sound/instruments/synthesis_samples/piano/crisis_grand_piano/c6.ogg
index b4ed66e27c..3e17b3f99a 100644
Binary files a/sound/instruments/synthesis_samples/piano/crisis_grand_piano/c6.ogg and b/sound/instruments/synthesis_samples/piano/crisis_grand_piano/c6.ogg differ
diff --git a/sound/instruments/synthesis_samples/piano/crisis_grand_piano/c7.ogg b/sound/instruments/synthesis_samples/piano/crisis_grand_piano/c7.ogg
index 13a5f7d873..b57a8a9109 100644
Binary files a/sound/instruments/synthesis_samples/piano/crisis_grand_piano/c7.ogg and b/sound/instruments/synthesis_samples/piano/crisis_grand_piano/c7.ogg differ
diff --git a/sound/instruments/synthesis_samples/piano/crisis_grand_piano/c8.ogg b/sound/instruments/synthesis_samples/piano/crisis_grand_piano/c8.ogg
index 0169d52c21..ce4d9535e8 100644
Binary files a/sound/instruments/synthesis_samples/piano/crisis_grand_piano/c8.ogg and b/sound/instruments/synthesis_samples/piano/crisis_grand_piano/c8.ogg differ
diff --git a/sound/instruments/synthesis_samples/piano/crisis_harpsichord/c2.ogg b/sound/instruments/synthesis_samples/piano/crisis_harpsichord/c2.ogg
index 16d49cb15e..bb02363fff 100644
Binary files a/sound/instruments/synthesis_samples/piano/crisis_harpsichord/c2.ogg and b/sound/instruments/synthesis_samples/piano/crisis_harpsichord/c2.ogg differ
diff --git a/sound/instruments/synthesis_samples/piano/crisis_harpsichord/c3.ogg b/sound/instruments/synthesis_samples/piano/crisis_harpsichord/c3.ogg
index 83e906cd1a..1a532ac8d4 100644
Binary files a/sound/instruments/synthesis_samples/piano/crisis_harpsichord/c3.ogg and b/sound/instruments/synthesis_samples/piano/crisis_harpsichord/c3.ogg differ
diff --git a/sound/instruments/synthesis_samples/piano/crisis_harpsichord/c4.ogg b/sound/instruments/synthesis_samples/piano/crisis_harpsichord/c4.ogg
index 33f766e4aa..16ff313baa 100644
Binary files a/sound/instruments/synthesis_samples/piano/crisis_harpsichord/c4.ogg and b/sound/instruments/synthesis_samples/piano/crisis_harpsichord/c4.ogg differ
diff --git a/sound/instruments/synthesis_samples/piano/crisis_harpsichord/c5.ogg b/sound/instruments/synthesis_samples/piano/crisis_harpsichord/c5.ogg
index 6ce06dda56..04161d2571 100644
Binary files a/sound/instruments/synthesis_samples/piano/crisis_harpsichord/c5.ogg and b/sound/instruments/synthesis_samples/piano/crisis_harpsichord/c5.ogg differ
diff --git a/sound/instruments/synthesis_samples/piano/fluid_harpsi/C2.ogg b/sound/instruments/synthesis_samples/piano/fluid_harpsi/C2.ogg
index 3941e7af03..30a3c653a1 100644
Binary files a/sound/instruments/synthesis_samples/piano/fluid_harpsi/C2.ogg and b/sound/instruments/synthesis_samples/piano/fluid_harpsi/C2.ogg differ
diff --git a/sound/instruments/synthesis_samples/piano/fluid_harpsi/C3.ogg b/sound/instruments/synthesis_samples/piano/fluid_harpsi/C3.ogg
index 4f79ee9987..f6bc891506 100644
Binary files a/sound/instruments/synthesis_samples/piano/fluid_harpsi/C3.ogg and b/sound/instruments/synthesis_samples/piano/fluid_harpsi/C3.ogg differ
diff --git a/sound/instruments/synthesis_samples/piano/fluid_harpsi/C4.ogg b/sound/instruments/synthesis_samples/piano/fluid_harpsi/C4.ogg
index 1d773c62e7..ab47f6940c 100644
Binary files a/sound/instruments/synthesis_samples/piano/fluid_harpsi/C4.ogg and b/sound/instruments/synthesis_samples/piano/fluid_harpsi/C4.ogg differ
diff --git a/sound/instruments/synthesis_samples/piano/fluid_harpsi/C5.ogg b/sound/instruments/synthesis_samples/piano/fluid_harpsi/C5.ogg
index 938a557e04..5dfb9aa529 100644
Binary files a/sound/instruments/synthesis_samples/piano/fluid_harpsi/C5.ogg and b/sound/instruments/synthesis_samples/piano/fluid_harpsi/C5.ogg differ
diff --git a/sound/instruments/synthesis_samples/piano/fluid_harpsi/C6.ogg b/sound/instruments/synthesis_samples/piano/fluid_harpsi/C6.ogg
index c65f06ce3e..7bc8784207 100644
Binary files a/sound/instruments/synthesis_samples/piano/fluid_harpsi/C6.ogg and b/sound/instruments/synthesis_samples/piano/fluid_harpsi/C6.ogg differ
diff --git a/sound/instruments/synthesis_samples/piano/fluid_harpsi/C7.ogg b/sound/instruments/synthesis_samples/piano/fluid_harpsi/C7.ogg
index 87d4943509..185b4d3db6 100644
Binary files a/sound/instruments/synthesis_samples/piano/fluid_harpsi/C7.ogg and b/sound/instruments/synthesis_samples/piano/fluid_harpsi/C7.ogg differ
diff --git a/sound/instruments/synthesis_samples/piano/fluid_harpsi/C8.ogg b/sound/instruments/synthesis_samples/piano/fluid_harpsi/C8.ogg
index 5800b2d0ff..f358ef0810 100644
Binary files a/sound/instruments/synthesis_samples/piano/fluid_harpsi/C8.ogg and b/sound/instruments/synthesis_samples/piano/fluid_harpsi/C8.ogg differ
diff --git a/sound/instruments/synthesis_samples/piano/fluid_piano/c2.ogg b/sound/instruments/synthesis_samples/piano/fluid_piano/c2.ogg
index 9ce5eee76e..048f9640bf 100644
Binary files a/sound/instruments/synthesis_samples/piano/fluid_piano/c2.ogg and b/sound/instruments/synthesis_samples/piano/fluid_piano/c2.ogg differ
diff --git a/sound/instruments/synthesis_samples/piano/fluid_piano/c3.ogg b/sound/instruments/synthesis_samples/piano/fluid_piano/c3.ogg
index 4644327476..f1083d7dcb 100644
Binary files a/sound/instruments/synthesis_samples/piano/fluid_piano/c3.ogg and b/sound/instruments/synthesis_samples/piano/fluid_piano/c3.ogg differ
diff --git a/sound/instruments/synthesis_samples/piano/fluid_piano/c4.ogg b/sound/instruments/synthesis_samples/piano/fluid_piano/c4.ogg
index ab6d8a2a92..244ebc3d5f 100644
Binary files a/sound/instruments/synthesis_samples/piano/fluid_piano/c4.ogg and b/sound/instruments/synthesis_samples/piano/fluid_piano/c4.ogg differ
diff --git a/sound/instruments/synthesis_samples/piano/fluid_piano/c5.ogg b/sound/instruments/synthesis_samples/piano/fluid_piano/c5.ogg
index 0041ea2e13..d3c68d64e9 100644
Binary files a/sound/instruments/synthesis_samples/piano/fluid_piano/c5.ogg and b/sound/instruments/synthesis_samples/piano/fluid_piano/c5.ogg differ
diff --git a/sound/instruments/synthesis_samples/piano/fluid_piano/c6.ogg b/sound/instruments/synthesis_samples/piano/fluid_piano/c6.ogg
index 5d836b9f7c..2666ee6613 100644
Binary files a/sound/instruments/synthesis_samples/piano/fluid_piano/c6.ogg and b/sound/instruments/synthesis_samples/piano/fluid_piano/c6.ogg differ
diff --git a/sound/instruments/synthesis_samples/piano/fluid_piano/c7.ogg b/sound/instruments/synthesis_samples/piano/fluid_piano/c7.ogg
index 1981572cf2..050e463c0d 100644
Binary files a/sound/instruments/synthesis_samples/piano/fluid_piano/c7.ogg and b/sound/instruments/synthesis_samples/piano/fluid_piano/c7.ogg differ
diff --git a/sound/instruments/synthesis_samples/piano/fluid_piano/c8.ogg b/sound/instruments/synthesis_samples/piano/fluid_piano/c8.ogg
index 35e5b147bc..4793c5b7fd 100644
Binary files a/sound/instruments/synthesis_samples/piano/fluid_piano/c8.ogg and b/sound/instruments/synthesis_samples/piano/fluid_piano/c8.ogg differ
diff --git a/sound/instruments/synthesis_samples/tones/Sawtooth.ogg b/sound/instruments/synthesis_samples/tones/Sawtooth.ogg
index e46f5eaced..10b1930a64 100644
Binary files a/sound/instruments/synthesis_samples/tones/Sawtooth.ogg and b/sound/instruments/synthesis_samples/tones/Sawtooth.ogg differ
diff --git a/sound/instruments/synthesis_samples/tones/Sine.ogg b/sound/instruments/synthesis_samples/tones/Sine.ogg
index e0b14869e9..96a09d501b 100644
Binary files a/sound/instruments/synthesis_samples/tones/Sine.ogg and b/sound/instruments/synthesis_samples/tones/Sine.ogg differ
diff --git a/sound/instruments/synthesis_samples/tones/Square.ogg b/sound/instruments/synthesis_samples/tones/Square.ogg
index 817531bcca..71029c07f9 100644
Binary files a/sound/instruments/synthesis_samples/tones/Square.ogg and b/sound/instruments/synthesis_samples/tones/Square.ogg differ
diff --git a/sound/vore/pred/death_01.ogg b/sound/vore/pred/death_01.ogg
index 231884ef54..ed26c1b413 100644
Binary files a/sound/vore/pred/death_01.ogg and b/sound/vore/pred/death_01.ogg differ
diff --git a/sound/vore/pred/death_02.ogg b/sound/vore/pred/death_02.ogg
index 5de3e4148c..15168455a4 100644
Binary files a/sound/vore/pred/death_02.ogg and b/sound/vore/pred/death_02.ogg differ
diff --git a/sound/vore/pred/death_03.ogg b/sound/vore/pred/death_03.ogg
index 4ffa271af7..f9e4f7d08d 100644
Binary files a/sound/vore/pred/death_03.ogg and b/sound/vore/pred/death_03.ogg differ
diff --git a/sound/vore/pred/death_04.ogg b/sound/vore/pred/death_04.ogg
index a4c0e91be6..ec8fac62ec 100644
Binary files a/sound/vore/pred/death_04.ogg and b/sound/vore/pred/death_04.ogg differ
diff --git a/sound/vore/pred/death_05.ogg b/sound/vore/pred/death_05.ogg
index aeec557758..c637e59658 100644
Binary files a/sound/vore/pred/death_05.ogg and b/sound/vore/pred/death_05.ogg differ
diff --git a/sound/vore/pred/death_06.ogg b/sound/vore/pred/death_06.ogg
index f5b077ebd4..024549f5e6 100644
Binary files a/sound/vore/pred/death_06.ogg and b/sound/vore/pred/death_06.ogg differ
diff --git a/sound/vore/pred/death_07.ogg b/sound/vore/pred/death_07.ogg
index afaaab65bb..cc1cdfab4b 100644
Binary files a/sound/vore/pred/death_07.ogg and b/sound/vore/pred/death_07.ogg differ
diff --git a/sound/vore/pred/death_08.ogg b/sound/vore/pred/death_08.ogg
index b1b8479ea8..8a310f7732 100644
Binary files a/sound/vore/pred/death_08.ogg and b/sound/vore/pred/death_08.ogg differ
diff --git a/sound/vore/pred/death_09.ogg b/sound/vore/pred/death_09.ogg
index 1454deafad..87dcb0cc9a 100644
Binary files a/sound/vore/pred/death_09.ogg and b/sound/vore/pred/death_09.ogg differ
diff --git a/sound/vore/pred/death_10.ogg b/sound/vore/pred/death_10.ogg
index f0e23e1d54..69a14fc675 100644
Binary files a/sound/vore/pred/death_10.ogg and b/sound/vore/pred/death_10.ogg differ
diff --git a/sound/vore/pred/death_11.ogg b/sound/vore/pred/death_11.ogg
index 43e80467e0..0f51ec8de2 100644
Binary files a/sound/vore/pred/death_11.ogg and b/sound/vore/pred/death_11.ogg differ
diff --git a/sound/vore/pred/death_12.ogg b/sound/vore/pred/death_12.ogg
index 5ec6029998..99fc7faa02 100644
Binary files a/sound/vore/pred/death_12.ogg and b/sound/vore/pred/death_12.ogg differ
diff --git a/sound/vore/pred/death_13.ogg b/sound/vore/pred/death_13.ogg
index 9073bac4f2..73aec12372 100644
Binary files a/sound/vore/pred/death_13.ogg and b/sound/vore/pred/death_13.ogg differ
diff --git a/sound/vore/pred/digest_01.ogg b/sound/vore/pred/digest_01.ogg
index 20b6d1d43a..9171a568a5 100644
Binary files a/sound/vore/pred/digest_01.ogg and b/sound/vore/pred/digest_01.ogg differ
diff --git a/sound/vore/pred/digest_02.ogg b/sound/vore/pred/digest_02.ogg
index 7fc41e2305..44cfaaeec4 100644
Binary files a/sound/vore/pred/digest_02.ogg and b/sound/vore/pred/digest_02.ogg differ
diff --git a/sound/vore/pred/digest_03.ogg b/sound/vore/pred/digest_03.ogg
index 98b032c7cb..71bc28a8fa 100644
Binary files a/sound/vore/pred/digest_03.ogg and b/sound/vore/pred/digest_03.ogg differ
diff --git a/sound/vore/pred/digest_04.ogg b/sound/vore/pred/digest_04.ogg
index ed494e813c..6552a11aad 100644
Binary files a/sound/vore/pred/digest_04.ogg and b/sound/vore/pred/digest_04.ogg differ
diff --git a/sound/vore/pred/digest_05.ogg b/sound/vore/pred/digest_05.ogg
index 53bb4814f7..f88d1590d5 100644
Binary files a/sound/vore/pred/digest_05.ogg and b/sound/vore/pred/digest_05.ogg differ
diff --git a/sound/vore/pred/digest_06.ogg b/sound/vore/pred/digest_06.ogg
index 787c336282..fbad31b160 100644
Binary files a/sound/vore/pred/digest_06.ogg and b/sound/vore/pred/digest_06.ogg differ
diff --git a/sound/vore/pred/digest_07.ogg b/sound/vore/pred/digest_07.ogg
index f63d4c633a..2efd7504d9 100644
Binary files a/sound/vore/pred/digest_07.ogg and b/sound/vore/pred/digest_07.ogg differ
diff --git a/sound/vore/pred/digest_08.ogg b/sound/vore/pred/digest_08.ogg
index dbbda3b517..5f8cf09ad1 100644
Binary files a/sound/vore/pred/digest_08.ogg and b/sound/vore/pred/digest_08.ogg differ
diff --git a/sound/vore/pred/digest_09.ogg b/sound/vore/pred/digest_09.ogg
index 1877f1ca05..d678bc1588 100644
Binary files a/sound/vore/pred/digest_09.ogg and b/sound/vore/pred/digest_09.ogg differ
diff --git a/sound/vore/pred/digest_10.ogg b/sound/vore/pred/digest_10.ogg
index 3e22b8b2fb..6de49d53fd 100644
Binary files a/sound/vore/pred/digest_10.ogg and b/sound/vore/pred/digest_10.ogg differ
diff --git a/sound/vore/pred/digest_11.ogg b/sound/vore/pred/digest_11.ogg
index 089d4ee7e4..7651912a46 100644
Binary files a/sound/vore/pred/digest_11.ogg and b/sound/vore/pred/digest_11.ogg differ
diff --git a/sound/vore/pred/digest_12.ogg b/sound/vore/pred/digest_12.ogg
index 76a9134646..796058bbc1 100644
Binary files a/sound/vore/pred/digest_12.ogg and b/sound/vore/pred/digest_12.ogg differ
diff --git a/sound/vore/pred/digest_13.ogg b/sound/vore/pred/digest_13.ogg
index 12b1c6bb18..fe1fb37da7 100644
Binary files a/sound/vore/pred/digest_13.ogg and b/sound/vore/pred/digest_13.ogg differ
diff --git a/sound/vore/pred/digest_14.ogg b/sound/vore/pred/digest_14.ogg
index c68231585c..648ba7ff76 100644
Binary files a/sound/vore/pred/digest_14.ogg and b/sound/vore/pred/digest_14.ogg differ
diff --git a/sound/vore/pred/digest_15.ogg b/sound/vore/pred/digest_15.ogg
index 32aecca35b..80fdbc1ca7 100644
Binary files a/sound/vore/pred/digest_15.ogg and b/sound/vore/pred/digest_15.ogg differ
diff --git a/sound/vore/pred/digest_16.ogg b/sound/vore/pred/digest_16.ogg
index d112913570..2f99901c7d 100644
Binary files a/sound/vore/pred/digest_16.ogg and b/sound/vore/pred/digest_16.ogg differ
diff --git a/sound/vore/pred/digest_17.ogg b/sound/vore/pred/digest_17.ogg
index d23c4c6ddc..5670af0722 100644
Binary files a/sound/vore/pred/digest_17.ogg and b/sound/vore/pred/digest_17.ogg differ
diff --git a/sound/vore/pred/digest_18.ogg b/sound/vore/pred/digest_18.ogg
index ae8ac9f74f..8b0ae75028 100644
Binary files a/sound/vore/pred/digest_18.ogg and b/sound/vore/pred/digest_18.ogg differ
diff --git a/sound/vore/pred/escape.ogg b/sound/vore/pred/escape.ogg
index fc093a5acf..a2868183f0 100644
Binary files a/sound/vore/pred/escape.ogg and b/sound/vore/pred/escape.ogg differ
diff --git a/sound/vore/pred/insertion_01.ogg b/sound/vore/pred/insertion_01.ogg
index 4ca8b6e425..58e78f8578 100644
Binary files a/sound/vore/pred/insertion_01.ogg and b/sound/vore/pred/insertion_01.ogg differ
diff --git a/sound/vore/pred/insertion_02.ogg b/sound/vore/pred/insertion_02.ogg
index a23cfaf201..73a3bbb8b2 100644
Binary files a/sound/vore/pred/insertion_02.ogg and b/sound/vore/pred/insertion_02.ogg differ
diff --git a/sound/vore/pred/loop.ogg b/sound/vore/pred/loop.ogg
index 5f0994251a..3fd9f1fa78 100644
Binary files a/sound/vore/pred/loop.ogg and b/sound/vore/pred/loop.ogg differ
diff --git a/sound/vore/pred/schlorp.ogg b/sound/vore/pred/schlorp.ogg
index eefb9dd71e..ff42b64e7b 100644
Binary files a/sound/vore/pred/schlorp.ogg and b/sound/vore/pred/schlorp.ogg differ
diff --git a/sound/vore/pred/squish _02.ogg b/sound/vore/pred/squish _02.ogg
index 846f0a2ece..4d674d1cba 100644
Binary files a/sound/vore/pred/squish _02.ogg and b/sound/vore/pred/squish _02.ogg differ
diff --git a/sound/vore/pred/squish _03.ogg b/sound/vore/pred/squish _03.ogg
index 568aa81a3d..c4e49de60b 100644
Binary files a/sound/vore/pred/squish _03.ogg and b/sound/vore/pred/squish _03.ogg differ
diff --git a/sound/vore/pred/squish_01.ogg b/sound/vore/pred/squish_01.ogg
index bc014b811d..5ae280397a 100644
Binary files a/sound/vore/pred/squish_01.ogg and b/sound/vore/pred/squish_01.ogg differ
diff --git a/sound/vore/pred/squish_02.ogg b/sound/vore/pred/squish_02.ogg
index 8d92bfd19e..c28a82d1c7 100644
Binary files a/sound/vore/pred/squish_02.ogg and b/sound/vore/pred/squish_02.ogg differ
diff --git a/sound/vore/pred/squish_03.ogg b/sound/vore/pred/squish_03.ogg
index f62bf7ff60..1362310411 100644
Binary files a/sound/vore/pred/squish_03.ogg and b/sound/vore/pred/squish_03.ogg differ
diff --git a/sound/vore/pred/squish_04.ogg b/sound/vore/pred/squish_04.ogg
index 47037d9a3a..5ed518ceb8 100644
Binary files a/sound/vore/pred/squish_04.ogg and b/sound/vore/pred/squish_04.ogg differ
diff --git a/sound/vore/pred/stomachmove.ogg b/sound/vore/pred/stomachmove.ogg
index 4e11cc03ed..87ad72846c 100644
Binary files a/sound/vore/pred/stomachmove.ogg and b/sound/vore/pred/stomachmove.ogg differ
diff --git a/sound/vore/pred/struggle_01.ogg b/sound/vore/pred/struggle_01.ogg
index 96c569b0f9..bae92a00a9 100644
Binary files a/sound/vore/pred/struggle_01.ogg and b/sound/vore/pred/struggle_01.ogg differ
diff --git a/sound/vore/pred/struggle_02.ogg b/sound/vore/pred/struggle_02.ogg
index 2f0d3324f1..46d0954e4f 100644
Binary files a/sound/vore/pred/struggle_02.ogg and b/sound/vore/pred/struggle_02.ogg differ
diff --git a/sound/vore/pred/struggle_03.ogg b/sound/vore/pred/struggle_03.ogg
index 9632817010..3fd16e35a4 100644
Binary files a/sound/vore/pred/struggle_03.ogg and b/sound/vore/pred/struggle_03.ogg differ
diff --git a/sound/vore/pred/struggle_04.ogg b/sound/vore/pred/struggle_04.ogg
index 7a30de3baf..a873a56e4c 100644
Binary files a/sound/vore/pred/struggle_04.ogg and b/sound/vore/pred/struggle_04.ogg differ
diff --git a/sound/vore/pred/struggle_05.ogg b/sound/vore/pred/struggle_05.ogg
index 0bae93d50f..411fa1d342 100644
Binary files a/sound/vore/pred/struggle_05.ogg and b/sound/vore/pred/struggle_05.ogg differ
diff --git a/sound/vore/pred/swallow_01.ogg b/sound/vore/pred/swallow_01.ogg
index 45a0008586..9dd0dfb780 100644
Binary files a/sound/vore/pred/swallow_01.ogg and b/sound/vore/pred/swallow_01.ogg differ
diff --git a/sound/vore/pred/swallow_02.ogg b/sound/vore/pred/swallow_02.ogg
index 8f9bcb2e84..c4cd4ec53d 100644
Binary files a/sound/vore/pred/swallow_02.ogg and b/sound/vore/pred/swallow_02.ogg differ
diff --git a/sound/vore/pred/taurswallow.ogg b/sound/vore/pred/taurswallow.ogg
index c700f71803..cfd8b90103 100644
Binary files a/sound/vore/pred/taurswallow.ogg and b/sound/vore/pred/taurswallow.ogg differ
diff --git a/sound/vore/prey/death_01.ogg b/sound/vore/prey/death_01.ogg
index 539a873a7e..e09325bbec 100644
Binary files a/sound/vore/prey/death_01.ogg and b/sound/vore/prey/death_01.ogg differ
diff --git a/sound/vore/prey/death_02.ogg b/sound/vore/prey/death_02.ogg
index 4dd1a285ea..dded921b94 100644
Binary files a/sound/vore/prey/death_02.ogg and b/sound/vore/prey/death_02.ogg differ
diff --git a/sound/vore/prey/death_03.ogg b/sound/vore/prey/death_03.ogg
index 30a3622c86..a7d9787f02 100644
Binary files a/sound/vore/prey/death_03.ogg and b/sound/vore/prey/death_03.ogg differ
diff --git a/sound/vore/prey/death_04.ogg b/sound/vore/prey/death_04.ogg
index ff983c2c31..99f9fda1e4 100644
Binary files a/sound/vore/prey/death_04.ogg and b/sound/vore/prey/death_04.ogg differ
diff --git a/sound/vore/prey/death_05.ogg b/sound/vore/prey/death_05.ogg
index 44b8603048..3426e1c10f 100644
Binary files a/sound/vore/prey/death_05.ogg and b/sound/vore/prey/death_05.ogg differ
diff --git a/sound/vore/prey/death_06.ogg b/sound/vore/prey/death_06.ogg
index 836a4fd18c..1695fa43ec 100644
Binary files a/sound/vore/prey/death_06.ogg and b/sound/vore/prey/death_06.ogg differ
diff --git a/sound/vore/prey/death_07.ogg b/sound/vore/prey/death_07.ogg
index 2406fea727..c94a83506e 100644
Binary files a/sound/vore/prey/death_07.ogg and b/sound/vore/prey/death_07.ogg differ
diff --git a/sound/vore/prey/death_08.ogg b/sound/vore/prey/death_08.ogg
index 0d7627dfae..d41b9f8060 100644
Binary files a/sound/vore/prey/death_08.ogg and b/sound/vore/prey/death_08.ogg differ
diff --git a/sound/vore/prey/death_09.ogg b/sound/vore/prey/death_09.ogg
index fa00a29d31..086407c499 100644
Binary files a/sound/vore/prey/death_09.ogg and b/sound/vore/prey/death_09.ogg differ
diff --git a/sound/vore/prey/death_10.ogg b/sound/vore/prey/death_10.ogg
index 738e7cf909..03f4c498cb 100644
Binary files a/sound/vore/prey/death_10.ogg and b/sound/vore/prey/death_10.ogg differ
diff --git a/sound/vore/prey/death_11.ogg b/sound/vore/prey/death_11.ogg
index bfd47945ae..175c024f70 100644
Binary files a/sound/vore/prey/death_11.ogg and b/sound/vore/prey/death_11.ogg differ
diff --git a/sound/vore/prey/death_12.ogg b/sound/vore/prey/death_12.ogg
index e6e800b2da..3b18c4bfac 100644
Binary files a/sound/vore/prey/death_12.ogg and b/sound/vore/prey/death_12.ogg differ
diff --git a/sound/vore/prey/death_13.ogg b/sound/vore/prey/death_13.ogg
index c9b79887d7..3adbbbaedc 100644
Binary files a/sound/vore/prey/death_13.ogg and b/sound/vore/prey/death_13.ogg differ
diff --git a/sound/vore/prey/digest_01.ogg b/sound/vore/prey/digest_01.ogg
index a1d13f7fb7..d2a6f38995 100644
Binary files a/sound/vore/prey/digest_01.ogg and b/sound/vore/prey/digest_01.ogg differ
diff --git a/sound/vore/prey/digest_02.ogg b/sound/vore/prey/digest_02.ogg
index 443d23c194..ead4fcad7f 100644
Binary files a/sound/vore/prey/digest_02.ogg and b/sound/vore/prey/digest_02.ogg differ
diff --git a/sound/vore/prey/digest_03.ogg b/sound/vore/prey/digest_03.ogg
index eb798b66ff..aaff366fe8 100644
Binary files a/sound/vore/prey/digest_03.ogg and b/sound/vore/prey/digest_03.ogg differ
diff --git a/sound/vore/prey/digest_04.ogg b/sound/vore/prey/digest_04.ogg
index a2c2c3e1ac..7c9bfed0eb 100644
Binary files a/sound/vore/prey/digest_04.ogg and b/sound/vore/prey/digest_04.ogg differ
diff --git a/sound/vore/prey/digest_05.ogg b/sound/vore/prey/digest_05.ogg
index 752a6d48f3..abfa800926 100644
Binary files a/sound/vore/prey/digest_05.ogg and b/sound/vore/prey/digest_05.ogg differ
diff --git a/sound/vore/prey/digest_06.ogg b/sound/vore/prey/digest_06.ogg
index f2e80b919f..537d1470d1 100644
Binary files a/sound/vore/prey/digest_06.ogg and b/sound/vore/prey/digest_06.ogg differ
diff --git a/sound/vore/prey/digest_07.ogg b/sound/vore/prey/digest_07.ogg
index 6a2ff70ff8..96f9e79edf 100644
Binary files a/sound/vore/prey/digest_07.ogg and b/sound/vore/prey/digest_07.ogg differ
diff --git a/sound/vore/prey/digest_08.ogg b/sound/vore/prey/digest_08.ogg
index 4e55f4671d..a79b3518a0 100644
Binary files a/sound/vore/prey/digest_08.ogg and b/sound/vore/prey/digest_08.ogg differ
diff --git a/sound/vore/prey/digest_09.ogg b/sound/vore/prey/digest_09.ogg
index 452e6b4a2e..d0d0b27865 100644
Binary files a/sound/vore/prey/digest_09.ogg and b/sound/vore/prey/digest_09.ogg differ
diff --git a/sound/vore/prey/digest_10.ogg b/sound/vore/prey/digest_10.ogg
index 4c5dc2e333..1afc99589b 100644
Binary files a/sound/vore/prey/digest_10.ogg and b/sound/vore/prey/digest_10.ogg differ
diff --git a/sound/vore/prey/digest_11.ogg b/sound/vore/prey/digest_11.ogg
index e94c0af656..5a342b45e7 100644
Binary files a/sound/vore/prey/digest_11.ogg and b/sound/vore/prey/digest_11.ogg differ
diff --git a/sound/vore/prey/digest_12.ogg b/sound/vore/prey/digest_12.ogg
index cb212fed1c..84d2bd691d 100644
Binary files a/sound/vore/prey/digest_12.ogg and b/sound/vore/prey/digest_12.ogg differ
diff --git a/sound/vore/prey/digest_13.ogg b/sound/vore/prey/digest_13.ogg
index 9fd292184e..e43298a473 100644
Binary files a/sound/vore/prey/digest_13.ogg and b/sound/vore/prey/digest_13.ogg differ
diff --git a/sound/vore/prey/digest_14.ogg b/sound/vore/prey/digest_14.ogg
index 24279d4712..25288719e8 100644
Binary files a/sound/vore/prey/digest_14.ogg and b/sound/vore/prey/digest_14.ogg differ
diff --git a/sound/vore/prey/digest_15.ogg b/sound/vore/prey/digest_15.ogg
index 2bf555ba41..176370a5e6 100644
Binary files a/sound/vore/prey/digest_15.ogg and b/sound/vore/prey/digest_15.ogg differ
diff --git a/sound/vore/prey/digest_16.ogg b/sound/vore/prey/digest_16.ogg
index 98edd6fb61..6a8437ff92 100644
Binary files a/sound/vore/prey/digest_16.ogg and b/sound/vore/prey/digest_16.ogg differ
diff --git a/sound/vore/prey/digest_17.ogg b/sound/vore/prey/digest_17.ogg
index 2ff5c173e1..315b6a8336 100644
Binary files a/sound/vore/prey/digest_17.ogg and b/sound/vore/prey/digest_17.ogg differ
diff --git a/sound/vore/prey/digest_18.ogg b/sound/vore/prey/digest_18.ogg
index 6a1ae78fb8..ca73cee597 100644
Binary files a/sound/vore/prey/digest_18.ogg and b/sound/vore/prey/digest_18.ogg differ
diff --git a/sound/vore/prey/escape.ogg b/sound/vore/prey/escape.ogg
index 621997a56d..eafdd6343a 100644
Binary files a/sound/vore/prey/escape.ogg and b/sound/vore/prey/escape.ogg differ
diff --git a/sound/vore/prey/insertion_01.ogg b/sound/vore/prey/insertion_01.ogg
index 5a3b942bb3..eff2080bf7 100644
Binary files a/sound/vore/prey/insertion_01.ogg and b/sound/vore/prey/insertion_01.ogg differ
diff --git a/sound/vore/prey/insertion_02.ogg b/sound/vore/prey/insertion_02.ogg
index 2d35094522..3879287a1b 100644
Binary files a/sound/vore/prey/insertion_02.ogg and b/sound/vore/prey/insertion_02.ogg differ
diff --git a/sound/vore/prey/loop.ogg b/sound/vore/prey/loop.ogg
index 1584482d92..167dde592a 100644
Binary files a/sound/vore/prey/loop.ogg and b/sound/vore/prey/loop.ogg differ
diff --git a/sound/vore/prey/schlorp.ogg b/sound/vore/prey/schlorp.ogg
index d1895ee26a..96eeb6f15b 100644
Binary files a/sound/vore/prey/schlorp.ogg and b/sound/vore/prey/schlorp.ogg differ
diff --git a/sound/vore/prey/squish_01.ogg b/sound/vore/prey/squish_01.ogg
index 2785a4a080..20d5b897bd 100644
Binary files a/sound/vore/prey/squish_01.ogg and b/sound/vore/prey/squish_01.ogg differ
diff --git a/sound/vore/prey/squish_02.ogg b/sound/vore/prey/squish_02.ogg
index f5671f7165..24849ef8f1 100644
Binary files a/sound/vore/prey/squish_02.ogg and b/sound/vore/prey/squish_02.ogg differ
diff --git a/sound/vore/prey/squish_03.ogg b/sound/vore/prey/squish_03.ogg
index 1e8f2bb896..29dd56868b 100644
Binary files a/sound/vore/prey/squish_03.ogg and b/sound/vore/prey/squish_03.ogg differ
diff --git a/sound/vore/prey/squish_04.ogg b/sound/vore/prey/squish_04.ogg
index 2e618890a9..caa9ef0b79 100644
Binary files a/sound/vore/prey/squish_04.ogg and b/sound/vore/prey/squish_04.ogg differ
diff --git a/sound/vore/prey/stomachmove.ogg b/sound/vore/prey/stomachmove.ogg
index e4e004b072..15a6b252b4 100644
Binary files a/sound/vore/prey/stomachmove.ogg and b/sound/vore/prey/stomachmove.ogg differ
diff --git a/sound/vore/prey/struggle_01.ogg b/sound/vore/prey/struggle_01.ogg
index de0f3ad8bd..ef315e2f3e 100644
Binary files a/sound/vore/prey/struggle_01.ogg and b/sound/vore/prey/struggle_01.ogg differ
diff --git a/sound/vore/prey/struggle_02.ogg b/sound/vore/prey/struggle_02.ogg
index 2695ab0adf..2c37593725 100644
Binary files a/sound/vore/prey/struggle_02.ogg and b/sound/vore/prey/struggle_02.ogg differ
diff --git a/sound/vore/prey/struggle_03.ogg b/sound/vore/prey/struggle_03.ogg
index 17dd8bec8a..bde08feff6 100644
Binary files a/sound/vore/prey/struggle_03.ogg and b/sound/vore/prey/struggle_03.ogg differ
diff --git a/sound/vore/prey/struggle_04.ogg b/sound/vore/prey/struggle_04.ogg
index 8631853509..5bcdbb1287 100644
Binary files a/sound/vore/prey/struggle_04.ogg and b/sound/vore/prey/struggle_04.ogg differ
diff --git a/sound/vore/prey/struggle_05.ogg b/sound/vore/prey/struggle_05.ogg
index 233addec0b..77ade72af2 100644
Binary files a/sound/vore/prey/struggle_05.ogg and b/sound/vore/prey/struggle_05.ogg differ
diff --git a/sound/vore/prey/swallow_01.ogg b/sound/vore/prey/swallow_01.ogg
index 3da3fef66a..194ec691f7 100644
Binary files a/sound/vore/prey/swallow_01.ogg and b/sound/vore/prey/swallow_01.ogg differ
diff --git a/sound/vore/prey/swallow_02.ogg b/sound/vore/prey/swallow_02.ogg
index 30d9a4e44d..8a50ca8d32 100644
Binary files a/sound/vore/prey/swallow_02.ogg and b/sound/vore/prey/swallow_02.ogg differ
diff --git a/sound/vore/prey/taurswallow.ogg b/sound/vore/prey/taurswallow.ogg
index f5b5706b36..6eb5f2a1f8 100644
Binary files a/sound/vore/prey/taurswallow.ogg and b/sound/vore/prey/taurswallow.ogg differ
diff --git a/tgstation.dme b/tgstation.dme
index b358ca8c59..848d149ae0 100755
--- a/tgstation.dme
+++ b/tgstation.dme
@@ -17,7 +17,6 @@
#include "_maps\_basemap.dm"
#include "code\_compile_options.dm"
#include "code\world.dm"
-#include "code\__DEFINES\__513_compatibility.dm"
#include "code\__DEFINES\_globals.dm"
#include "code\__DEFINES\_protect.dm"
#include "code\__DEFINES\_tick.dm"
@@ -97,6 +96,7 @@
#include "code\__DEFINES\rust_g.config.dm"
#include "code\__DEFINES\rust_g.dm"
#include "code\__DEFINES\say.dm"
+#include "code\__DEFINES\security_levels.dm"
#include "code\__DEFINES\shuttles.dm"
#include "code\__DEFINES\sight.dm"
#include "code\__DEFINES\sound.dm"
@@ -124,6 +124,7 @@
#include "code\__DEFINES\dcs\helpers.dm"
#include "code\__DEFINES\dcs\signals.dm"
#include "code\__DEFINES\flags\shields.dm"
+#include "code\__DEFINES\misc\return_values.dm"
#include "code\__HELPERS\_cit_helpers.dm"
#include "code\__HELPERS\_lists.dm"
#include "code\__HELPERS\_logging.dm"
@@ -176,6 +177,7 @@
#include "code\_globalvars\logging.dm"
#include "code\_globalvars\misc.dm"
#include "code\_globalvars\regexes.dm"
+#include "code\_globalvars\traits.dm"
#include "code\_globalvars\lists\flavor_misc.dm"
#include "code\_globalvars\lists\maintenance_loot.dm"
#include "code\_globalvars\lists\mapping.dm"
@@ -265,6 +267,7 @@
#include "code\controllers\subsystem\fail2topic.dm"
#include "code\controllers\subsystem\fire_burning.dm"
#include "code\controllers\subsystem\garbage.dm"
+#include "code\controllers\subsystem\holodeck.dm"
#include "code\controllers\subsystem\icon_smooth.dm"
#include "code\controllers\subsystem\idlenpcpool.dm"
#include "code\controllers\subsystem\input.dm"
@@ -409,6 +412,7 @@
#include "code\datums\components\remote_materials.dm"
#include "code\datums\components\riding.dm"
#include "code\datums\components\rotation.dm"
+#include "code\datums\components\shielded.dm"
#include "code\datums\components\shrapnel.dm"
#include "code\datums\components\shrink.dm"
#include "code\datums\components\sizzle.dm"
@@ -419,6 +423,7 @@
#include "code\datums\components\stationloving.dm"
#include "code\datums\components\summoning.dm"
#include "code\datums\components\swarming.dm"
+#include "code\datums\components\tackle.dm"
#include "code\datums\components\tactical.dm"
#include "code\datums\components\thermite.dm"
#include "code\datums\components\uplink.dm"
@@ -516,6 +521,7 @@
#include "code\datums\elements\mob_holder.dm"
#include "code\datums\elements\polychromic.dm"
#include "code\datums\elements\spellcasting.dm"
+#include "code\datums\elements\squish.dm"
#include "code\datums\elements\swimming.dm"
#include "code\datums\elements\sword_point.dm"
#include "code\datums\elements\update_icon_blocker.dm"
@@ -1729,6 +1735,7 @@
#include "code\modules\clothing\gloves\color.dm"
#include "code\modules\clothing\gloves\miscellaneous.dm"
#include "code\modules\clothing\gloves\ring.dm"
+#include "code\modules\clothing\gloves\tacklers.dm"
#include "code\modules\clothing\head\_head.dm"
#include "code\modules\clothing\head\beanie.dm"
#include "code\modules\clothing\head\cit_hats.dm"
@@ -2195,7 +2202,6 @@
#include "code\modules\mob\mob_defines.dm"
#include "code\modules\mob\mob_helpers.dm"
#include "code\modules\mob\mob_movement.dm"
-#include "code\modules\mob\mob_movespeed.dm"
#include "code\modules\mob\mob_transformation_simple.dm"
#include "code\modules\mob\say.dm"
#include "code\modules\mob\say_vr.dm"
@@ -2221,9 +2227,9 @@
#include "code\modules\mob\dead\new_player\sprite_accessories\horns.dm"
#include "code\modules\mob\dead\new_player\sprite_accessories\ipc_synths.dm"
#include "code\modules\mob\dead\new_player\sprite_accessories\legs_and_taurs.dm"
-#include "code\modules\mob\dead\new_player\sprite_accessories\pines.dm"
#include "code\modules\mob\dead\new_player\sprite_accessories\snouts.dm"
#include "code\modules\mob\dead\new_player\sprite_accessories\socks.dm"
+#include "code\modules\mob\dead\new_player\sprite_accessories\spines.dm"
#include "code\modules\mob\dead\new_player\sprite_accessories\synthliz.dm"
#include "code\modules\mob\dead\new_player\sprite_accessories\tails.dm"
#include "code\modules\mob\dead\new_player\sprite_accessories\undershirt.dm"
@@ -2591,6 +2597,14 @@
#include "code\modules\modular_computers\hardware\printer.dm"
#include "code\modules\modular_computers\hardware\recharger.dm"
#include "code\modules\modular_computers\NTNet\NTNRC\conversation.dm"
+#include "code\modules\movespeed\_movespeed_modifier.dm"
+#include "code\modules\movespeed\modifiers\components.dm"
+#include "code\modules\movespeed\modifiers\innate.dm"
+#include "code\modules\movespeed\modifiers\items.dm"
+#include "code\modules\movespeed\modifiers\misc.dm"
+#include "code\modules\movespeed\modifiers\mobs.dm"
+#include "code\modules\movespeed\modifiers\reagents.dm"
+#include "code\modules\movespeed\modifiers\status_effects.dm"
#include "code\modules\newscaster\_news.dm"
#include "code\modules\newscaster\feed_channel.dm"
#include "code\modules\newscaster\feed_comment.dm"
@@ -2962,6 +2976,7 @@
#include "code\modules\research\nanites\extra_settings\type.dm"
#include "code\modules\research\nanites\nanite_programs\buffing.dm"
#include "code\modules\research\nanites\nanite_programs\healing.dm"
+#include "code\modules\research\nanites\nanite_programs\protocols.dm"
#include "code\modules\research\nanites\nanite_programs\rogue.dm"
#include "code\modules\research\nanites\nanite_programs\sensor.dm"
#include "code\modules\research\nanites\nanite_programs\suppression.dm"
@@ -3208,7 +3223,7 @@
#include "code\modules\vending\clothesmate.dm"
#include "code\modules\vending\coffee.dm"
#include "code\modules\vending\cola.dm"
-#include "code\modules\vending\drinnerware.dm"
+#include "code\modules\vending\dinnerware.dm"
#include "code\modules\vending\engineering.dm"
#include "code\modules\vending\engivend.dm"
#include "code\modules\vending\games.dm"
@@ -3300,6 +3315,7 @@
#include "modular_citadel\code\modules\custom_loadout\custom_items.dm"
#include "modular_citadel\code\modules\custom_loadout\load_to_mob.dm"
#include "modular_citadel\code\modules\custom_loadout\read_from_file.dm"
+#include "modular_citadel\code\modules\language\sylvan.dm"
#include "modular_citadel\code\modules\mentor\dementor.dm"
#include "modular_citadel\code\modules\mentor\follow.dm"
#include "modular_citadel\code\modules\mentor\mentor.dm"
@@ -3338,7 +3354,6 @@
#include "modular_citadel\code\modules\reagents\chemistry\reagents\fermi_reagents.dm"
#include "modular_citadel\code\modules\reagents\chemistry\reagents\healing.dm"
#include "modular_citadel\code\modules\reagents\chemistry\reagents\MKUltra.dm"
-#include "modular_citadel\code\modules\reagents\chemistry\reagents\other_reagents.dm"
#include "modular_citadel\code\modules\reagents\chemistry\reagents\SDGF.dm"
#include "modular_citadel\code\modules\reagents\chemistry\recipes\fermi.dm"
#include "modular_citadel\code\modules\reagents\objects\clothes.dm"