diff --git a/code/ATMOSPHERICS/datum_icon_manager.dm b/code/ATMOSPHERICS/datum_icon_manager.dm
index bf514607b31..75cb0fce8ce 100644
--- a/code/ATMOSPHERICS/datum_icon_manager.dm
+++ b/code/ATMOSPHERICS/datum_icon_manager.dm
@@ -186,9 +186,9 @@ var/global/list/pipe_colors = list("grey" = PIPE_COLOR_GREY, "red" = PIPE_COLOR_
var/cache_name = state
for(var/D in cardinal)
- var/image/I = image('icons/atmos/pipe_underlays.dmi', icon_state = state, dir = D)
+ var/image/I = image(icon('icons/atmos/pipe_underlays.dmi', icon_state = state, dir = D))
underlays[cache_name + "[D]"] = I
for(var/pipe_color in pipe_colors)
- I = image('icons/atmos/pipe_underlays.dmi', icon_state = state, dir = D)
+ I = image(icon('icons/atmos/pipe_underlays.dmi', icon_state = state, dir = D))
I.color = pipe_colors[pipe_color]
underlays[state + "[D]" + "[pipe_colors[pipe_color]]"] = I
diff --git a/code/LINDA/LINDA_turf_tile.dm b/code/LINDA/LINDA_turf_tile.dm
index 30f9be83b4c..b36c5ed82cc 100644
--- a/code/LINDA/LINDA_turf_tile.dm
+++ b/code/LINDA/LINDA_turf_tile.dm
@@ -46,7 +46,8 @@
var/datum/gas_mixture/air
var/archived_cycle = 0
var/current_cycle = 0
-
+ var/icy = 0
+ var/icyoverlay
var/obj/effect/hotspot/active_hotspot
var/temperature_archived //USED ONLY FOR SOLIDS
@@ -67,6 +68,8 @@
air.temperature = temperature
+ update_visuals()
+
/turf/simulated/Destroy()
visibilityChanged()
if(active_hotspot)
@@ -209,8 +212,6 @@
air.react()
- update_visuals()
-
if(air.temperature > FIRE_MINIMUM_TEMPERATURE_TO_EXIST)
hotspot_expose(air.temperature, CELL_VOLUME)
for(var/atom/movable/item in src)
@@ -221,6 +222,13 @@
if(consider_superconductivity(starting = 1))
remove = 0
+ if(air.temperature < T0C && air.return_pressure() > 10)
+ icy = 1
+ else
+ icy = 0
+
+ update_visuals()
+
if(!excited_group && remove == 1)
air_master.remove_from_active(src)
@@ -232,6 +240,13 @@
archived_cycle = air_master.current_cycle
/turf/simulated/proc/update_visuals()
+ if(icy && !icyoverlay)
+ overlays |= icemaster
+ icyoverlay = icemaster
+ else if(icyoverlay && !icy)
+ icyoverlay = null
+ overlays -= icemaster
+
var/new_overlay_type = tile_graphic()
if (new_overlay_type == atmos_overlay_type)
return
diff --git a/code/__DEFINES/hydroponics.dm b/code/__DEFINES/hydroponics.dm
index a53e66f0a0f..f6693b0bcfc 100644
--- a/code/__DEFINES/hydroponics.dm
+++ b/code/__DEFINES/hydroponics.dm
@@ -56,4 +56,5 @@
#define TRAIT_BIOLUM 36
#define TRAIT_BIOLUM_COLOUR 37
#define TRAIT_IMMUTABLE 38
-#define TRAIT_RARITY 39
\ No newline at end of file
+#define TRAIT_RARITY 39
+#define TRAIT_BATTERY_RECHARGE 40
\ No newline at end of file
diff --git a/code/__HELPERS/mobs.dm b/code/__HELPERS/mobs.dm
index eb79649dcec..e30e904a462 100644
--- a/code/__HELPERS/mobs.dm
+++ b/code/__HELPERS/mobs.dm
@@ -1,20 +1,38 @@
-/proc/random_underwear(var/gender)
+proc/random_underwear(gender, species = "Human")
+ var/list/pick_list = list()
switch(gender)
- if(MALE) return pick(underwear_m)
- if(FEMALE) return pick(underwear_f)
- else return pick(underwear_list)
+ if(MALE) pick_list = underwear_m
+ if(FEMALE) pick_list = underwear_f
+ else pick_list = underwear_list
+ return pick_species_allowed_underwear(pick_list, species)
-/proc/random_undershirt(var/gender)
+proc/random_undershirt(gender, species = "Human")
+ var/list/pick_list = list()
switch(gender)
- if(MALE) return pick(undershirt_m)
- if(FEMALE) return pick(undershirt_f)
- else return pick(undershirt_list)
+ if(MALE) pick_list = undershirt_m
+ if(FEMALE) pick_list = undershirt_f
+ else pick_list = undershirt_list
+ return pick_species_allowed_underwear(pick_list, species)
-/proc/random_socks(gender)
+proc/random_socks(gender, species = "Human")
+ var/list/pick_list = list()
switch(gender)
- if(MALE) return pick(socks_m)
- if(FEMALE) return pick(socks_f)
- else return pick(socks_list)
+ if(MALE) pick_list = socks_m
+ if(FEMALE) pick_list = socks_f
+ else pick_list = socks_list
+ return pick_species_allowed_underwear(pick_list, species)
+
+proc/pick_species_allowed_underwear(list/all_picks, species)
+ var/list/valid_picks = list()
+ for(var/test in all_picks)
+ var/datum/sprite_accessory/S = all_picks[test]
+ if(!(species in S.species_allowed))
+ continue
+ valid_picks += test
+
+ if(!valid_picks.len) valid_picks += "Nude"
+
+ return pick(valid_picks)
proc/random_hair_style(var/gender, species = "Human")
var/h_style = "Bald"
@@ -35,7 +53,7 @@ proc/random_hair_style(var/gender, species = "Human")
return h_style
-/proc/GetOppositeDir(var/dir)
+proc/GetOppositeDir(var/dir)
switch(dir)
if(NORTH) return SOUTH
if(SOUTH) return NORTH
diff --git a/code/_globalvars/misc.dm b/code/_globalvars/misc.dm
index bb9d4f354eb..51e0dfa8ab2 100644
--- a/code/_globalvars/misc.dm
+++ b/code/_globalvars/misc.dm
@@ -1,5 +1,6 @@
var/global/obj/effect/overlay/plmaster = null
var/global/obj/effect/overlay/slmaster = null
+var/global/obj/effect/overlay/icemaster = null
// nanomanager, the manager for Nano UIs
var/datum/nanomanager/nanomanager = new()
diff --git a/code/controllers/Processes/air.dm b/code/controllers/Processes/air.dm
index a20169c86d3..df52e295bcf 100644
--- a/code/controllers/Processes/air.dm
+++ b/code/controllers/Processes/air.dm
@@ -140,4 +140,10 @@ var/global/datum/controller/process/air_system/air_master
slmaster.icon = 'icons/effects/tile_effects.dmi'
slmaster.icon_state = "sleeping_agent"
slmaster.layer = FLY_LAYER
- slmaster.mouse_opacity = 0
\ No newline at end of file
+ slmaster.mouse_opacity = 0
+
+ icemaster = new /obj/effect/overlay()
+ icemaster.icon = 'icons/turf/overlays.dmi'
+ icemaster.icon_state = "snowfloor"
+ icemaster.layer = TURF_LAYER+0.1
+ icemaster.mouse_opacity = 0
\ No newline at end of file
diff --git a/code/datums/cargoprofile.dm b/code/datums/cargoprofile.dm
index 9fcb356b9b1..cbb074b8d24 100644
--- a/code/datums/cargoprofile.dm
+++ b/code/datums/cargoprofile.dm
@@ -258,7 +258,7 @@
whitelist = list(/obj/item/weapon/banhammer,/obj/item/weapon/sord,/obj/item/weapon/butch,/obj/item/weapon/claymore,/obj/item/weapon/holo/esword,
/obj/item/weapon/flamethrower,/obj/item/weapon/grenade,/obj/item/weapon/gun,/obj/item/weapon/hatchet,/obj/item/weapon/katana,
/obj/item/weapon/kitchenknife,/obj/item/weapon/melee,/obj/item/weapon/nullrod,/obj/item/weapon/pickaxe,/obj/item/weapon/twohanded,
- /obj/item/weapon/c4,/obj/item/weapon/scalpel,/obj/item/weapon/shield,/obj/item/weapon/grown/deathnettle)
+ /obj/item/weapon/c4,/obj/item/weapon/scalpel,/obj/item/weapon/shield,/obj/item/weapon/grown/nettle/death)
/datum/cargoprofile/tools
name = "Devices & Tools"
diff --git a/code/game/gamemodes/shadowling/shadowling.dm b/code/game/gamemodes/shadowling/shadowling.dm
index 39dd483d1b0..eaa244ca693 100644
--- a/code/game/gamemodes/shadowling/shadowling.dm
+++ b/code/game/gamemodes/shadowling/shadowling.dm
@@ -301,6 +301,8 @@ Made by Xhuis
flags = NO_BLOOD | NO_BREATHE | NO_SCAN | NO_INTORGANS
burn_mod = 1.5 //1.5x burn damage, 2x is excessive
+ silent_steps = 1
+
/datum/game_mode/proc/update_shadow_icons_added(datum/mind/shadow_mind)
var/datum/atom_hud/antag/shadow_hud = huds[ANTAG_HUD_SHADOW]
shadow_hud.join_hud(shadow_mind.current)
diff --git a/code/game/jobs/job/medical.dm b/code/game/jobs/job/medical.dm
index 666023d0af8..cbfb8549923 100644
--- a/code/game/jobs/job/medical.dm
+++ b/code/game/jobs/job/medical.dm
@@ -120,7 +120,7 @@
if(!H) return 0
switch(H.backbag)
if(1) H.equip_to_slot_or_del(new /obj/item/weapon/storage/box/survival(H), slot_r_hand)
- if(2) H.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack(H), slot_back)
+ if(2) H.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/chemistry(H), slot_back)
if(3) H.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/satchel_chem(H), slot_back)
if(4) H.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/satchel(H), slot_back)
H.equip_to_slot_or_del(new /obj/item/device/radio/headset/headset_med(H), slot_l_ear)
@@ -151,7 +151,7 @@
if(!H) return 0
switch(H.backbag)
if(1) H.equip_to_slot_or_del(new /obj/item/weapon/storage/box/survival(H), slot_r_hand)
- if(2) H.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack(H), slot_back)
+ if(2) H.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/genetics(H), slot_back)
if(3) H.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/satchel_gen(H), slot_back)
if(4) H.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/satchel(H), slot_back)
H.equip_to_slot_or_del(new /obj/item/device/radio/headset/headset_medsci(H), slot_l_ear)
@@ -181,8 +181,8 @@
if(!H) return 0
H.equip_or_collect(new /obj/item/device/radio/headset/headset_med(H), slot_l_ear)
switch(H.backbag)
- if(2) H.equip_or_collect(new /obj/item/weapon/storage/backpack/medic(H), slot_back)
- if(3) H.equip_or_collect(new /obj/item/weapon/storage/backpack/satchel_med(H), slot_back)
+ if(2) H.equip_or_collect(new /obj/item/weapon/storage/backpack/virology(H), slot_back)
+ if(3) H.equip_or_collect(new /obj/item/weapon/storage/backpack/satchel_vir(H), slot_back)
if(4) H.equip_or_collect(new /obj/item/weapon/storage/backpack/satchel(H), slot_back)
H.equip_or_collect(new /obj/item/clothing/under/rank/virologist(H), slot_w_uniform)
H.equip_or_collect(new /obj/item/device/pda/viro(H), slot_wear_pda)
diff --git a/code/game/jobs/job/science.dm b/code/game/jobs/job/science.dm
index 2f57243382f..5247727034a 100644
--- a/code/game/jobs/job/science.dm
+++ b/code/game/jobs/job/science.dm
@@ -27,7 +27,7 @@
if(!H) return 0
switch(H.backbag)
if(1) H.equip_to_slot_or_del(new /obj/item/weapon/storage/box/survival(H), slot_r_hand)
- if(2) H.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack(H), slot_back)
+ if(2) H.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/science(H), slot_back)
if(3) H.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/satchel_tox(H), slot_back)
if(4) H.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/satchel(H), slot_back)
H.equip_to_slot_or_del(new /obj/item/device/radio/headset/heads/rd(H), slot_l_ear)
@@ -65,7 +65,7 @@
if(!H) return 0
switch(H.backbag)
if(1) H.equip_to_slot_or_del(new /obj/item/weapon/storage/box/survival(H), slot_r_hand)
- if(2) H.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack(H), slot_back)
+ if(2) H.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/science(H), slot_back)
if(3) H.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/satchel_tox(H), slot_back)
if(4) H.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/satchel(H), slot_back)
H.equip_to_slot_or_del(new /obj/item/device/radio/headset/headset_sci(H), slot_l_ear)
diff --git a/code/game/jobs/job/support.dm b/code/game/jobs/job/support.dm
index 30b3e89e496..156ca4c29f4 100644
--- a/code/game/jobs/job/support.dm
+++ b/code/game/jobs/job/support.dm
@@ -90,7 +90,7 @@
if(!H) return 0
switch(H.backbag)
if(1) H.equip_or_collect(new /obj/item/weapon/storage/box/survival(H), slot_r_hand)
- if(2) H.equip_or_collect(new /obj/item/weapon/storage/backpack(H), slot_back)
+ if(2) H.equip_or_collect(new /obj/item/weapon/storage/backpack/botany(H), slot_back)
if(3) H.equip_or_collect(new /obj/item/weapon/storage/backpack/satchel_hyd(H), slot_back)
if(4) H.equip_or_collect(new /obj/item/weapon/storage/backpack/satchel(H), slot_back)
H.equip_or_collect(new /obj/item/device/radio/headset/headset_service(H), slot_l_ear)
diff --git a/code/game/machinery/computer/robot.dm b/code/game/machinery/computer/robot.dm
index 53a340696a4..e5b8956ad93 100644
--- a/code/game/machinery/computer/robot.dm
+++ b/code/game/machinery/computer/robot.dm
@@ -217,6 +217,15 @@
else
robot["cell"] = 0
+ var/turf/pos = get_turf(R)
+ var/area/bot_area = get_area(R)
+ robot["xpos"] = pos.x
+ robot["ypos"] = pos.y
+ robot["zpos"] = pos.z
+ robot["area"] = format_text(bot_area.name)
+
+ robot["health"] = round(R.health * 100 / R.maxHealth,0.1)
+
robot["module"] = R.module ? R.module.name : "None"
robot["master_ai"] = R.connected_ai ? R.connected_ai.name : "None"
robot["hackable"] = 0
diff --git a/code/game/machinery/constructable_frame.dm b/code/game/machinery/constructable_frame.dm
index f4f2d4d4ec6..87560b65d20 100644
--- a/code/game/machinery/constructable_frame.dm
+++ b/code/game/machinery/constructable_frame.dm
@@ -779,4 +779,15 @@ obj/item/weapon/circuitboard/rdserver
origin_tech = "programming=1;engineering=2"
req_components = list(
/obj/item/weapon/stock_parts/console_screen = 1,
- /obj/item/weapon/stock_parts/matter_bin = 3)
\ No newline at end of file
+ /obj/item/weapon/stock_parts/matter_bin = 3)
+
+/obj/item/weapon/circuitboard/clawgame
+ name = "circuit board (Claw Game)"
+ build_path = /obj/machinery/arcade/claw
+ board_type = "machine"
+ origin_tech = "programming=2"
+ req_components = list(
+ /obj/item/weapon/stock_parts.matter_bin = 1,
+ /obj/item/weapon/stock_parts/manipulator = 1,
+ /obj/item/stack/cable_coil = 5,
+ /obj/item/stack/sheet/glass = 1)
\ No newline at end of file
diff --git a/code/game/machinery/slotmachine.dm b/code/game/machinery/slotmachine.dm
index 192d2355656..7e132f64614 100644
--- a/code/game/machinery/slotmachine.dm
+++ b/code/game/machinery/slotmachine.dm
@@ -1,4 +1,5 @@
var/datum/announcement/minor/slotmachine_announcement = new(do_log = 0)
+
/obj/machinery/slot_machine
name = "slot machine"
desc = "Gambling for the antisocial."
@@ -6,77 +7,70 @@ var/datum/announcement/minor/slotmachine_announcement = new(do_log = 0)
icon_state = "slots-off"
anchored = 1
density = 1
-// mats = 10
- var/money = 25000
var/plays = 0
var/working = 0
var/balance=0
- attack_hand(var/mob/user as mob)
- if(user.mind)
- if(user.mind.initial_account)
- balance = user.mind.initial_account.money
- user.machine = src
- if (src.working)
- var/dat = {"Slot Machine
-