From c54497483bbe82af3a7183d34225aab5e1a36989 Mon Sep 17 00:00:00 2001 From: Novacat <35587478+Novacat@users.noreply.github.com> Date: Mon, 19 Jul 2021 20:53:37 -0400 Subject: [PATCH 01/34] Merge pull request #11159 from VOREStation/Fixes/11156 Fix some uses of tgui_input_list with bad calls --- code/modules/admin/verbs/randomverbs.dm | 4 ++-- code/modules/admin/verbs/striketeam.dm | 2 +- code/modules/library/lib_machines.dm | 4 ++-- code/modules/mob/living/carbon/human/emote_vr.dm | 2 +- code/modules/mob/living/silicon/robot/robot_items.dm | 4 ++-- 5 files changed, 8 insertions(+), 8 deletions(-) diff --git a/code/modules/admin/verbs/randomverbs.dm b/code/modules/admin/verbs/randomverbs.dm index e903df406a..754b650332 100644 --- a/code/modules/admin/verbs/randomverbs.dm +++ b/code/modules/admin/verbs/randomverbs.dm @@ -892,13 +892,13 @@ Traitors and the like can also be revived with the previous role mostly intact. var/choice if(ticker.mode.auto_recall_shuttle) - choice = tgui_input_list(usr, "The shuttle will just return if you call it. Call anyway?", list("Confirm", "Cancel")) + choice = tgui_input_list(usr, "The shuttle will just return if you call it. Call anyway?", "Shuttle Call", list("Confirm", "Cancel")) if(choice == "Confirm") emergency_shuttle.auto_recall = 1 //enable auto-recall else return - choice = tgui_input_list(usr, "Is this an emergency evacuation or a crew transfer?", list("Emergency", "Crew Transfer")) + choice = tgui_input_list(usr, "Is this an emergency evacuation or a crew transfer?", "Shuttle Call", list("Emergency", "Crew Transfer")) if (choice == "Emergency") emergency_shuttle.call_evac() else diff --git a/code/modules/admin/verbs/striketeam.dm b/code/modules/admin/verbs/striketeam.dm index 1a27de10c4..d7b2c1ffff 100644 --- a/code/modules/admin/verbs/striketeam.dm +++ b/code/modules/admin/verbs/striketeam.dm @@ -20,7 +20,7 @@ var/const/commandos_possible = 6 //if more Commandos are needed in the future var/datum/antagonist/deathsquad/team - var/choice = tgui_input_list(usr, "Select type of strike team:", list("Heavy Asset Protection", "Mercenaries")) + var/choice = tgui_input_list(usr, "Select type of strike team:", "Strike Team", list("Heavy Asset Protection", "Mercenaries")) if(!choice) return diff --git a/code/modules/library/lib_machines.dm b/code/modules/library/lib_machines.dm index 50980217a3..adec042a0f 100644 --- a/code/modules/library/lib_machines.dm +++ b/code/modules/library/lib_machines.dm @@ -82,7 +82,7 @@ title = null title = sanitizeSQL(title) if(href_list["setcategory"]) - var/newcategory = tgui_input_list(usr, "Choose a category to search for:", list("Any", "Fiction", "Non-Fiction", "Adult", "Reference", "Religion")) + var/newcategory = tgui_input_list(usr, "Choose a category to search for:", "Category", list("Any", "Fiction", "Non-Fiction", "Adult", "Reference", "Religion")) if(newcategory) category = sanitize(newcategory) else @@ -397,7 +397,7 @@ if(newauthor) scanner.cache.author = newauthor if(href_list["setcategory"]) - var/newcategory = tgui_input_list(usr, "Choose a category: ", list("Fiction", "Non-Fiction", "Adult", "Reference", "Religion")) + var/newcategory = tgui_input_list(usr, "Choose a category: ", "Category", list("Fiction", "Non-Fiction", "Adult", "Reference", "Religion")) if(newcategory) upload_category = newcategory diff --git a/code/modules/mob/living/carbon/human/emote_vr.dm b/code/modules/mob/living/carbon/human/emote_vr.dm index 0b73e71514..9ba2ca4ad5 100644 --- a/code/modules/mob/living/carbon/human/emote_vr.dm +++ b/code/modules/mob/living/carbon/human/emote_vr.dm @@ -36,7 +36,7 @@ set name = "Set Gender Identity" set desc = "Sets the pronouns when examined and performing an emote." set category = "IC" - var/new_gender_identity = tgui_input_list(usr, "Please select a gender Identity.", list(FEMALE, MALE, NEUTER, PLURAL, HERM)) + var/new_gender_identity = tgui_input_list(usr, "Please select a gender Identity:", "Set Gender Identity", list(FEMALE, MALE, NEUTER, PLURAL, HERM)) if(!new_gender_identity) return 0 change_gender_identity(new_gender_identity) diff --git a/code/modules/mob/living/silicon/robot/robot_items.dm b/code/modules/mob/living/silicon/robot/robot_items.dm index d8212d2904..9636f2da51 100644 --- a/code/modules/mob/living/silicon/robot/robot_items.dm +++ b/code/modules/mob/living/silicon/robot/robot_items.dm @@ -282,7 +282,7 @@ switch(choice) if("Colour") - var/newcolour = tgui_input_list(usr, "Which colour would you like to use?", list("black","blue","red","green","yellow")) + var/newcolour = tgui_input_list(usr, "Which colour would you like to use?", "Color Choice", list("black","blue","red","green","yellow")) if(newcolour) colour = newcolour if("Mode") @@ -401,7 +401,7 @@ set category = "Object" set src in range(0) - var/N = tgui_input_list(usr, "How much damage should the shield absorb?", list("5","10","25","50","75","100")) + var/N = tgui_input_list(usr, "How much damage should the shield absorb?", "Shield Level", list("5","10","25","50","75","100")) if (N) shield_level = text2num(N)/100 From 0dfa34c5787578a8374b6d15d582cdbb29b3a920 Mon Sep 17 00:00:00 2001 From: Novacat <35587478+Novacat@users.noreply.github.com> Date: Mon, 19 Jul 2021 20:58:42 -0400 Subject: [PATCH 03/34] Merge pull request #11160 from VOREStation/Arokha/accessfinder Gives pathfinder an actual access level --- code/game/jobs/access_datum.dm | 4 ++-- code/game/jobs/access_datum_vr.dm | 6 ++++++ code/game/jobs/job/exploration_vr.dm | 4 ++-- maps/tether/tether-05-station1.dmm | 4 ++-- 4 files changed, 12 insertions(+), 6 deletions(-) diff --git a/code/game/jobs/access_datum.dm b/code/game/jobs/access_datum.dm index 5a2e3bd0cf..53dfb77b5a 100644 --- a/code/game/jobs/access_datum.dm +++ b/code/game/jobs/access_datum.dm @@ -262,8 +262,8 @@ desc = "Station Network" region = ACCESS_REGION_RESEARCH -// /var/const/free_access_id = 43 -// /var/const/free_access_id = 44 +// /var/const/free_access_id = 43 // taken in VR +// /var/const/free_access_id = 44 // taken in VR /var/const/access_surgery = 45 /datum/access/surgery diff --git a/code/game/jobs/access_datum_vr.dm b/code/game/jobs/access_datum_vr.dm index bd3906f16c..bdfef8a12b 100644 --- a/code/game/jobs/access_datum_vr.dm +++ b/code/game/jobs/access_datum_vr.dm @@ -5,6 +5,12 @@ var/const/access_explorer = 43 desc = "Explorer" region = ACCESS_REGION_GENERAL +/var/const/access_pathfinder = 44 +/datum/access/pathfinder + id = access_pathfinder + desc = "Pathfinder" + region = ACCESS_REGION_GENERAL + var/const/access_pilot = 67 /datum/access/pilot id = access_pilot diff --git a/code/game/jobs/job/exploration_vr.dm b/code/game/jobs/job/exploration_vr.dm index 4b3227c38e..2a6649543b 100644 --- a/code/game/jobs/job/exploration_vr.dm +++ b/code/game/jobs/job/exploration_vr.dm @@ -43,8 +43,8 @@ pto_type = PTO_EXPLORATION dept_time_required = 20 - access = list(access_eva, access_maint_tunnels, access_external_airlocks, access_pilot, access_explorer, access_gateway) - minimal_access = list(access_eva, access_maint_tunnels, access_external_airlocks, access_pilot, access_explorer, access_gateway) + access = list(access_eva, access_maint_tunnels, access_external_airlocks, access_pilot, access_explorer, access_gateway, access_pathfinder) + minimal_access = list(access_eva, access_maint_tunnels, access_external_airlocks, access_pilot, access_explorer, access_gateway, access_pathfinder) outfit_type = /decl/hierarchy/outfit/job/pathfinder job_description = "The Pathfinder's job is to lead and manage expeditions, and is the primary authority on all off-station expeditions." alt_titles = list("Expedition Lead" = /datum/alt_title/expedition_lead, "Exploration Manager" = /datum/alt_title/exploration_manager) diff --git a/maps/tether/tether-05-station1.dmm b/maps/tether/tether-05-station1.dmm index 9e54c7210b..62a7debfd9 100644 --- a/maps/tether/tether-05-station1.dmm +++ b/maps/tether/tether-05-station1.dmm @@ -34249,8 +34249,8 @@ }, /obj/machinery/door/airlock/science{ name = "Pathfinder"; - req_access = list(62,43,67); - req_one_access = newlist() + req_access = null; + req_one_access = list(44) }, /turf/simulated/floor/tiled/steel_grid, /area/tether/exploration/pathfinder_office) From 9ad7140c674f654bb1436ec0ab91ca9182e8dd91 Mon Sep 17 00:00:00 2001 From: Aronai Sieyes Date: Mon, 19 Jul 2021 23:19:27 -0400 Subject: [PATCH 05/34] Merge pull request #11164 from VOREStation/Arokha/fixpaths Fix some typepaths --- maps/offmap_vr/om_ships/curashuttle.dmm | 2 +- maps/submaps/pois_vr/debris_field/mining_drones.dmm | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/maps/offmap_vr/om_ships/curashuttle.dmm b/maps/offmap_vr/om_ships/curashuttle.dmm index e6b4574392..83fe0dde11 100644 --- a/maps/offmap_vr/om_ships/curashuttle.dmm +++ b/maps/offmap_vr/om_ships/curashuttle.dmm @@ -4826,7 +4826,7 @@ aa /area/shuttle/curabitur/curashuttle/med) "bM" = ( /obj/structure/fans/hardlight, -/obj/machinery/door/airlock/external/glass/bolted{ +/obj/machinery/door/airlock/external/bolted{ frequency = 1480; id_tag = "curadocking" }, diff --git a/maps/submaps/pois_vr/debris_field/mining_drones.dmm b/maps/submaps/pois_vr/debris_field/mining_drones.dmm index 5fa8f77d65..c94ba77182 100644 --- a/maps/submaps/pois_vr/debris_field/mining_drones.dmm +++ b/maps/submaps/pois_vr/debris_field/mining_drones.dmm @@ -166,7 +166,7 @@ /turf/simulated/floor/tiled/airless, /area/submap/debrisfield/mining_outpost) "E" = ( -/obj/machinery/door/airlock/external/glass{ +/obj/machinery/door/airlock/external{ density = 0; health = 0; icon_state = "door_open"; @@ -175,7 +175,7 @@ /turf/simulated/floor/airless, /area/submap/debrisfield/mining_outpost) "F" = ( -/obj/machinery/door/airlock/external/glass/bolted, +/obj/machinery/door/airlock/external/bolted, /turf/simulated/floor/airless, /area/submap/debrisfield/mining_outpost) "G" = ( From 21f58709d7442e8290672da67b1d43689685fa12 Mon Sep 17 00:00:00 2001 From: Chompstation Bot Date: Tue, 20 Jul 2021 03:20:06 +0000 Subject: [PATCH 07/34] Fix two suit cycler problems --- code/__defines/sprite_sheets.dm | 16 + code/game/machinery/suit_cycler_datums.dm | 14 +- code/game/machinery/suit_storage_unit.dm | 19 +- code/modules/clothing/clothing.dm | 2117 +++++++++++++++++ .../clothing/spacesuits/void/ert_vr.dm | 5 + code/modules/clothing/spacesuits/void/void.dm | 28 +- .../clothing/spacesuits/void/void_vr.dm | 18 +- .../clothing/spacesuits/void/wizard.dm | 2 - 8 files changed, 2168 insertions(+), 51 deletions(-) diff --git a/code/__defines/sprite_sheets.dm b/code/__defines/sprite_sheets.dm index c40899e3fe..603bb82d5f 100644 --- a/code/__defines/sprite_sheets.dm +++ b/code/__defines/sprite_sheets.dm @@ -1,5 +1,6 @@ // Default species get default sprites, VR species get VR sprites #define VR_SPECIES_SPRITE_SHEETS_SUIT_MOB list(\ +SPECIES_HUMAN = 'icons/inventory/suit/mob.dmi',\ SPECIES_TAJ = 'icons/inventory/suit/mob_tajaran.dmi',\ SPECIES_SKRELL = 'icons/inventory/suit/mob_skrell.dmi',\ SPECIES_UNATHI = 'icons/inventory/suit/mob_unathi.dmi',\ @@ -12,6 +13,7 @@ SPECIES_VULPKANIN = 'icons/inventory/suit/mob_vr_vulpkanin.dmi',\ SPECIES_ZORREN_HIGH = 'icons/inventory/suit/mob_vr_vulpkanin.dmi',\ SPECIES_FENNEC = 'icons/inventory/suit/mob_vr_vulpkanin.dmi') #define VR_SPECIES_SPRITE_SHEETS_HEAD_MOB list(\ +SPECIES_HUMAN = 'icons/inventory/head/mob.dmi',\ SPECIES_TAJ = 'icons/inventory/head/mob_tajaran.dmi',\ SPECIES_SKRELL = 'icons/inventory/head/mob_skrell.dmi',\ SPECIES_UNATHI = 'icons/inventory/head/mob_unathi.dmi',\ @@ -24,6 +26,7 @@ SPECIES_VULPKANIN = 'icons/inventory/head/mob_vr_vulpkanin.dmi',\ SPECIES_ZORREN_HIGH = 'icons/inventory/head/mob_vr_vulpkanin.dmi',\ SPECIES_FENNEC = 'icons/inventory/head/mob_vr_vulpkanin.dmi') #define VR_SPECIES_SPRITE_SHEETS_HANDS_MOB list(\ +SPECIES_HUMAN = 'icons/inventory/hands/mob.dmi',\ SPECIES_TAJ = 'icons/inventory/hands/mob_tajaran.dmi',\ SPECIES_SKRELL = 'icons/inventory/hands/mob_skrell.dmi',\ SPECIES_UNATHI = 'icons/inventory/hands/mob_unathi.dmi',\ @@ -36,6 +39,7 @@ SPECIES_VULPKANIN = 'icons/inventory/hands/mob_vr_vulpkanin.dmi',\ SPECIES_ZORREN_HIGH = 'icons/inventory/hands/mob_vr_vulpkanin.dmi',\ SPECIES_FENNEC = 'icons/inventory/hands/mob_vr_vulpkanin.dmi') #define VR_SPECIES_SPRITE_SHEETS_FEET_MOB list(\ +SPECIES_HUMAN = 'icons/inventory/feet/mob.dmi',\ SPECIES_TAJ = 'icons/inventory/feet/mob_tajaran.dmi',\ SPECIES_SKRELL = 'icons/inventory/feet/mob_skrell.dmi',\ SPECIES_UNATHI = 'icons/inventory/feet/mob_unathi.dmi',\ @@ -49,6 +53,7 @@ SPECIES_ZORREN_HIGH = 'icons/inventory/feet/mob_vr_vulpkanin.dmi',\ SPECIES_FENNEC = 'icons/inventory/feet/mob_vr_vulpkanin.dmi') #define VR_SPECIES_SPRITE_SHEETS_SUIT_ITEM list(\ +SPECIES_HUMAN = 'icons/inventory/suit/item.dmi',\ SPECIES_TAJ = 'icons/inventory/suit/item_tajaran.dmi',\ SPECIES_SKRELL = 'icons/inventory/suit/item_skrell.dmi',\ SPECIES_UNATHI = 'icons/inventory/suit/item_unathi.dmi',\ @@ -61,6 +66,7 @@ SPECIES_VULPKANIN = 'icons/inventory/suit/item_vr_vulpkanin.dmi',\ SPECIES_ZORREN_HIGH = 'icons/inventory/suit/item_vr_vulpkanin.dmi',\ SPECIES_FENNEC = 'icons/inventory/suit/item_vr_vulpkanin.dmi') #define VR_SPECIES_SPRITE_SHEETS_HEAD_ITEM list(\ +SPECIES_HUMAN = 'icons/inventory/head/item.dmi',\ SPECIES_TAJ = 'icons/inventory/head/item_tajaran.dmi',\ SPECIES_SKRELL = 'icons/inventory/head/item_skrell.dmi',\ SPECIES_UNATHI = 'icons/inventory/head/item_unathi.dmi',\ @@ -73,6 +79,7 @@ SPECIES_VULPKANIN = 'icons/inventory/head/item_vr_vulpkanin.dmi',\ SPECIES_ZORREN_HIGH = 'icons/inventory/head/item_vr_vulpkanin.dmi',\ SPECIES_FENNEC = 'icons/inventory/head/item_vr_vulpkanin.dmi') #define VR_SPECIES_SPRITE_SHEETS_HANDS_ITEM list(\ +SPECIES_HUMAN = 'icons/inventory/hands/item.dmi',\ SPECIES_TAJ = 'icons/inventory/hands/item_tajaran.dmi',\ SPECIES_SKRELL = 'icons/inventory/hands/item_skrell.dmi',\ SPECIES_UNATHI = 'icons/inventory/hands/item_unathi.dmi',\ @@ -85,6 +92,7 @@ SPECIES_VULPKANIN = 'icons/inventory/hands/item_vr_vulpkanin.dmi',\ SPECIES_ZORREN_HIGH = 'icons/inventory/hands/item_vr_vulpkanin.dmi',\ SPECIES_FENNEC = 'icons/inventory/hands/item_vr_vulpkanin.dmi') #define VR_SPECIES_SPRITE_SHEETS_FEET_ITEM list(\ +SPECIES_HUMAN = 'icons/inventory/feet/item.dmi',\ SPECIES_TAJ = 'icons/inventory/feet/item_tajaran.dmi',\ SPECIES_SKRELL = 'icons/inventory/feet/item_skrell.dmi',\ SPECIES_UNATHI = 'icons/inventory/feet/item_unathi.dmi',\ @@ -99,6 +107,7 @@ SPECIES_FENNEC = 'icons/inventory/feet/item_vr_vulpkanin.dmi') // All species get VR sprites #define ALL_VR_SPRITE_SHEETS_SUIT_MOB list(\ +SPECIES_HUMAN = 'icons/inventory/suit/mob_vr.dmi',\ SPECIES_TAJ = 'icons/inventory/suit/mob_vr_tajaran.dmi',\ SPECIES_SKRELL = 'icons/inventory/suit/mob_vr_skrell.dmi',\ SPECIES_UNATHI = 'icons/inventory/suit/mob_vr_unathi.dmi',\ @@ -111,6 +120,7 @@ SPECIES_VULPKANIN = 'icons/inventory/suit/mob_vr_vulpkanin.dmi',\ SPECIES_ZORREN_HIGH = 'icons/inventory/suit/mob_vr_vulpkanin.dmi',\ SPECIES_FENNEC = 'icons/inventory/suit/mob_vr_vulpkanin.dmi') #define ALL_VR_SPRITE_SHEETS_HEAD_MOB list(\ +SPECIES_HUMAN = 'icons/inventory/head/mob_vr.dmi',\ SPECIES_TAJ = 'icons/inventory/head/mob_vr_tajaran.dmi',\ SPECIES_SKRELL = 'icons/inventory/head/mob_vr_skrell.dmi',\ SPECIES_UNATHI = 'icons/inventory/head/mob_vr_unathi.dmi',\ @@ -123,6 +133,7 @@ SPECIES_VULPKANIN = 'icons/inventory/head/mob_vr_vulpkanin.dmi',\ SPECIES_ZORREN_HIGH = 'icons/inventory/head/mob_vr_vulpkanin.dmi',\ SPECIES_FENNEC = 'icons/inventory/head/mob_vr_vulpkanin.dmi') #define ALL_VR_SPRITE_SHEETS_HANDS_MOB list(\ +SPECIES_HUMAN = 'icons/inventory/hands/mob_vr.dmi',\ SPECIES_TAJ = 'icons/inventory/hands/mob_vr_tajaran.dmi',\ SPECIES_SKRELL = 'icons/inventory/hands/mob_vr_skrell.dmi',\ SPECIES_UNATHI = 'icons/inventory/hands/mob_vr_unathi.dmi',\ @@ -135,6 +146,7 @@ SPECIES_VULPKANIN = 'icons/inventory/hands/mob_vr_vulpkanin.dmi',\ SPECIES_ZORREN_HIGH = 'icons/inventory/hands/mob_vr_vulpkanin.dmi',\ SPECIES_FENNEC = 'icons/inventory/hands/mob_vr_vulpkanin.dmi') #define ALL_VR_SPRITE_SHEETS_FEET_MOB list(\ +SPECIES_HUMAN = 'icons/inventory/feet/mob_vr.dmi',\ SPECIES_TAJ = 'icons/inventory/feet/mob_vr_tajaran.dmi',\ SPECIES_SKRELL = 'icons/inventory/feet/mob_vr_skrell.dmi',\ SPECIES_UNATHI = 'icons/inventory/feet/mob_vr_unathi.dmi',\ @@ -148,6 +160,7 @@ SPECIES_ZORREN_HIGH = 'icons/inventory/feet/mob_vr_vulpkanin.dmi',\ SPECIES_FENNEC = 'icons/inventory/feet/mob_vr_vulpkanin.dmi') #define ALL_VR_SPRITE_SHEETS_SUIT_ITEM list(\ +SPECIES_HUMAN = 'icons/inventory/suit/item_vr.dmi',\ SPECIES_TAJ = 'icons/inventory/suit/item_vr_tajaran.dmi',\ SPECIES_SKRELL = 'icons/inventory/suit/item_vr_skrell.dmi',\ SPECIES_UNATHI = 'icons/inventory/suit/item_vr_unathi.dmi',\ @@ -160,6 +173,7 @@ SPECIES_VULPKANIN = 'icons/inventory/suit/item_vr_vulpkanin.dmi',\ SPECIES_ZORREN_HIGH = 'icons/inventory/suit/item_vr_vulpkanin.dmi',\ SPECIES_FENNEC = 'icons/inventory/suit/item_vr_vulpkanin.dmi') #define ALL_VR_SPRITE_SHEETS_HEAD_ITEM list(\ +SPECIES_HUMAN = 'icons/inventory/head/item_vr.dmi',\ SPECIES_TAJ = 'icons/inventory/head/item_vr_tajaran.dmi',\ SPECIES_SKRELL = 'icons/inventory/head/item_vr_skrell.dmi',\ SPECIES_UNATHI = 'icons/inventory/head/item_vr_unathi.dmi',\ @@ -172,6 +186,7 @@ SPECIES_VULPKANIN = 'icons/inventory/head/item_vr_vulpkanin.dmi',\ SPECIES_ZORREN_HIGH = 'icons/inventory/head/item_vr_vulpkanin.dmi',\ SPECIES_FENNEC = 'icons/inventory/head/item_vr_vulpkanin.dmi') #define ALL_VR_SPRITE_SHEETS_HANDS_ITEM list(\ +SPECIES_HUMAN = 'icons/inventory/hands/item_vr.dmi',\ SPECIES_TAJ = 'icons/inventory/hands/item_vr_tajaran.dmi',\ SPECIES_SKRELL = 'icons/inventory/hands/item_vr_skrell.dmi',\ SPECIES_UNATHI = 'icons/inventory/hands/item_vr_unathi.dmi',\ @@ -184,6 +199,7 @@ SPECIES_VULPKANIN = 'icons/inventory/hands/item_vr_vulpkanin.dmi',\ SPECIES_ZORREN_HIGH = 'icons/inventory/hands/item_vr_vulpkanin.dmi',\ SPECIES_FENNEC = 'icons/inventory/hands/item_vr_vulpkanin.dmi') #define ALL_VR_SPRITE_SHEETS_FEET_ITEM list(\ +SPECIES_HUMAN = 'icons/inventory/feet/item_vr.dmi',\ SPECIES_TAJ = 'icons/inventory/feet/item_vr_tajaran.dmi',\ SPECIES_SKRELL = 'icons/inventory/feet/item_vr_skrell.dmi',\ SPECIES_UNATHI = 'icons/inventory/feet/item_vr_unathi.dmi',\ diff --git a/code/game/machinery/suit_cycler_datums.dm b/code/game/machinery/suit_cycler_datums.dm index 205dc99979..e796213acf 100644 --- a/code/game/machinery/suit_cycler_datums.dm +++ b/code/game/machinery/suit_cycler_datums.dm @@ -14,12 +14,13 @@ GLOBAL_LIST_EMPTY(suit_cycler_emagged) var/helmet_becomes /datum/suit_cycler_choice/department/proc/can_refit_helmet(obj/item/clothing/head/helmet/helmet) - return !!helmet_becomes + return helmet && !!helmet_becomes /datum/suit_cycler_choice/department/proc/do_refit_helmet(obj/item/clothing/head/helmet/helmet) var/obj/item/clothing/tmp = new helmet_becomes() helmet.name = "refitted [tmp.name]" helmet.desc = tmp.desc + helmet.icon = tmp.icon helmet.icon_state = tmp.icon_state helmet.item_state = tmp.item_state helmet.item_state_slots = tmp.item_state_slots?.Copy() @@ -28,12 +29,13 @@ GLOBAL_LIST_EMPTY(suit_cycler_emagged) helmet.default_worn_icon = tmp.default_worn_icon /datum/suit_cycler_choice/department/proc/can_refit_suit(obj/item/clothing/suit/space/suit) - return !!suit_becomes + return suit && !!suit_becomes /datum/suit_cycler_choice/department/proc/do_refit_suit(obj/item/clothing/suit/space/suit) var/obj/item/clothing/tmp = new suit_becomes() suit.name = "refitted [tmp.name]" suit.desc = tmp.desc + suit.icon = tmp.icon suit.icon_state = tmp.icon_state suit.item_state = tmp.item_state suit.item_state_slots = tmp.item_state_slots?.Copy() @@ -305,16 +307,16 @@ GLOBAL_LIST_EMPTY(suit_cycler_emagged) // Uses same logic as it used to, which is that it bases an assumption of 'we should have custom sprites' on // the presence of the species in the sprite_sheets_obj list on the helmet and suit -/datum/suit_cycler_choice/species/proc/can_refit_to(obj/item/clothing/head/helmet/helmet, obj/item/clothing/suit/space/suit) - for(var/obj/item/clothing/C in list(helmet, suit)) +/datum/suit_cycler_choice/species/proc/can_refit_to(...) + for(var/obj/item/clothing/C in args) if(LAZYACCESS(C.sprite_sheets_obj, name)) if(!(C.icon_state in cached_icon_states(C.sprite_sheets_obj[name]))) return FALSE // Species was in sprite_sheets_obj, but had no sprite for this object in particular return TRUE -/datum/suit_cycler_choice/species/proc/do_refit_to(obj/item/clothing/head/helmet/helmet, obj/item/clothing/suit/space/suit) - for(var/obj/item/clothing/C in list(helmet, suit)) +/datum/suit_cycler_choice/species/proc/do_refit_to(...) + for(var/obj/item/clothing/C in args) C.refit_for_species(name) /datum/suit_cycler_choice/species/noop diff --git a/code/game/machinery/suit_storage_unit.dm b/code/game/machinery/suit_storage_unit.dm index 6b8c8747cc..175434088d 100644 --- a/code/game/machinery/suit_storage_unit.dm +++ b/code/game/machinery/suit_storage_unit.dm @@ -1114,17 +1114,20 @@ GLOBAL_LIST_EMPTY(suit_cycler_typecache) /obj/machinery/suit_cycler/proc/apply_paintjob() if(!target_species || !target_department) return - if(suit?.helmet) - visible_message("[bicon(src)]Separate the suit and helmet before applying any customizations.") - return - if(helmet && target_department.can_refit_helmet(helmet)) + // Helmet to new paint + if(target_department.can_refit_helmet(helmet)) target_department.do_refit_helmet(helmet) - if(suit && target_department.can_refit_suit(suit)) + // Suit to new paint + if(target_department.can_refit_suit(suit)) target_department.do_refit_suit(suit) - - if(target_species.can_refit_to(helmet, suit)) - target_species.do_refit_to(helmet, suit) + // Attached voidsuit helmet to new paint + if(target_department.can_refit_helmet(suit?.helmet)) + target_department.do_refit_helmet(suit.helmet) + + // Species fitting for all 3 potential changes + if(target_species.can_refit_to(helmet, suit, suit?.helmet)) + target_species.do_refit_to(helmet, suit, suit?.helmet) else visible_message("[bicon(src)]Unable to apply specified cosmetics with specified species. Please try again with a different species or cosmetic option selected.") return diff --git a/code/modules/clothing/clothing.dm b/code/modules/clothing/clothing.dm index c6f0ddee71..d55902f268 100644 --- a/code/modules/clothing/clothing.dm +++ b/code/modules/clothing/clothing.dm @@ -1,3 +1,4 @@ +<<<<<<< HEAD /obj/item/clothing name = "clothing" siemens_coefficient = 0.9 @@ -1059,3 +1060,2119 @@ /obj/item/clothing/under/rank/New() sensor_mode = pick(0,1,2,3) ..() +||||||| parent of 9b03341473... Merge pull request #11162 from VOREStation/Arokha/cycletweaks +/obj/item/clothing + name = "clothing" + siemens_coefficient = 0.9 + drop_sound = 'sound/items/drop/clothing.ogg' + pickup_sound = 'sound/items/pickup/clothing.ogg' + var/list/species_restricted = null //Only these species can wear this kit. + var/gunshot_residue //Used by forensics. + + var/list/accessories + var/list/valid_accessory_slots + var/list/restricted_accessory_slots + var/list/starting_accessories + + var/flash_protection = FLASH_PROTECTION_NONE + var/tint = TINT_NONE + var/list/enables_planes //Enables these planes in the wearing mob's plane_holder + var/list/plane_slots //But only if it's equipped into this specific slot + + /* + Sprites used when the clothing item is refit. This is done by setting icon_override. + For best results, if this is set then sprite_sheets should be null and vice versa, but that is by no means necessary. + Ideally, sprite_sheets_refit should be used for "hard" clothing items that can't change shape very well to fit the wearer (e.g. helmets, hardsuits), + while sprite_sheets should be used for "flexible" clothing items that do not need to be refitted (e.g. aliens wearing jumpsuits). + */ + var/list/sprite_sheets_refit = null + var/ear_protection = 0 + var/blood_sprite_state + + var/update_icon_define = null // Only needed if you've got multiple files for the same type of clothing + + var/polychromic = FALSE //VOREStation edit + +//Updates the icons of the mob wearing the clothing item, if any. +/obj/item/clothing/proc/update_clothing_icon() + return + +// Aurora forensics port. +/obj/item/clothing/clean_blood() + . = ..() + gunshot_residue = null + + +/obj/item/clothing/New() + ..() + if(starting_accessories) + for(var/T in starting_accessories) + var/obj/item/clothing/accessory/tie = new T(src) + src.attach_accessory(null, tie) + set_clothing_index() + + //VOREStation edit start + if(polychromic) + verbs |= /obj/item/clothing/proc/change_color + //VOREStation edit start + +/obj/item/clothing/update_icon() + cut_overlays() //This removes all the overlays on the sprite and then goes down a checklist adding them as required. + if(blood_DNA) + add_blood() + . = ..() + +/obj/item/clothing/equipped(var/mob/user,var/slot) + ..() + if(enables_planes) + user.recalculate_vis() + +/obj/item/clothing/dropped(var/mob/user) + ..() + if(enables_planes) + user.recalculate_vis() + +//BS12: Species-restricted clothing check. +/obj/item/clothing/mob_can_equip(M as mob, slot, disable_warning = FALSE) + + //if we can't equip the item anyway, don't bother with species_restricted (cuts down on spam) + if (!..()) + return 0 + + if(LAZYLEN(species_restricted) && istype(M,/mob/living/carbon/human)) + var/exclusive = null + var/wearable = null + var/mob/living/carbon/human/H = M + + if("exclude" in species_restricted) + exclusive = 1 + + if(H.species) + if(exclusive) + if(!(H.species.get_bodytype(H) in species_restricted)) + wearable = 1 + else + if(H.species.get_bodytype(H) in species_restricted) + wearable = 1 + + if(!wearable && !(slot in list(slot_l_store, slot_r_store, slot_s_store))) + to_chat(H, "Your species cannot wear [src].") + return 0 + return 1 + +/obj/item/clothing/handle_shield(mob/user, var/damage, atom/damage_source = null, mob/attacker = null, var/def_zone = null, var/attack_text = "the attack") + . = ..() + if((. == 0) && LAZYLEN(accessories)) + for(var/obj/item/I in accessories) + var/check = I.handle_shield(user, damage, damage_source, attacker, def_zone, attack_text) + + if(check != 0) // Projectiles sometimes use negatives IIRC, 0 is only returned if something is not blocked. + . = check + break + +// For now, these two temp procs only return TRUE or FALSE if they can provide resistance to a given temperature. +/obj/item/clothing/proc/handle_low_temperature(var/tempcheck = T20C) + . = FALSE + if(LAZYLEN(accessories)) + for(var/obj/item/clothing/C in accessories) + if(C.handle_low_temperature(tempcheck)) + . = TRUE + + if(min_cold_protection_temperature && min_cold_protection_temperature <= tempcheck) + . = TRUE + +/obj/item/clothing/proc/handle_high_temperature(var/tempcheck = T20C) + . = FALSE + if(LAZYLEN(accessories)) + for(var/obj/item/clothing/C in accessories) + if(C.handle_high_temperature(tempcheck)) + . = TRUE + + if(max_heat_protection_temperature && max_heat_protection_temperature >= tempcheck) + . = TRUE + +// Returns the relative flag-vars for covered protection. +/obj/item/clothing/proc/get_cold_protection_flags() + . = cold_protection + + if(LAZYLEN(accessories)) + for(var/obj/item/clothing/C in accessories) + . |= C.get_cold_protection_flags() + +/obj/item/clothing/proc/get_heat_protection_flags() + . = heat_protection + + if(LAZYLEN(accessories)) + for(var/obj/item/clothing/C in accessories) + . |= C.get_heat_protection_flags() + +/obj/item/clothing/proc/refit_for_species(var/target_species) + if(!species_restricted) + return //this item doesn't use the species_restricted system + + //Set species_restricted list + switch(target_species) + //VOREStation Edit Start + if(SPECIES_HUMAN, SPECIES_SKRELL) //humanoid bodytypes + species_restricted = list(SPECIES_HUMAN, SPECIES_SKRELL, SPECIES_RAPALA, SPECIES_VASILISSAN, SPECIES_ALRAUNE, SPECIES_PROMETHEAN, SPECIES_XENOCHIMERA) + if(SPECIES_UNATHI) + species_restricted = list(SPECIES_UNATHI, SPECIES_XENOHYBRID) + if(SPECIES_VULPKANIN) + species_restricted = list(SPECIES_VULPKANIN, SPECIES_ZORREN_HIGH, SPECIES_FENNEC) + if(SPECIES_SERGAL) + species_restricted = list(SPECIES_SERGAL, SPECIES_NEVREAN) + //VOREStation Edit End + else + species_restricted = list(target_species) + + //Set icon + if (sprite_sheets_refit && (target_species in sprite_sheets_refit)) + LAZYSET(sprite_sheets, target_species, sprite_sheets_refit[target_species]) + + if (sprite_sheets_obj && (target_species in sprite_sheets_obj)) + icon = sprite_sheets_obj[target_species] + else + icon = initial(icon) + +//VOREStation edit start +/obj/item/clothing/proc/change_color() + set name = "Change Color" + set category = "Object" + set desc = "Change the color of the clothing." + set src in usr + + if(usr.stat || usr.restrained() || usr.incapacitated()) + return + + var/new_color = input(usr, "Pick a new color", "Color", color) as color|null + + if(new_color && (new_color != color)) + color = new_color + update_icon() + update_clothing_icon() +//VOREStation edit end + +/obj/item/clothing/head/helmet/refit_for_species(var/target_species) + if(!species_restricted) + return //this item doesn't use the species_restricted system + + //Set species_restricted list + switch(target_species) + //VOREStation Edit Start + if(SPECIES_HUMAN) + species_restricted = list(SPECIES_HUMAN, SPECIES_RAPALA, SPECIES_VASILISSAN, SPECIES_ALRAUNE, SPECIES_PROMETHEAN, SPECIES_XENOCHIMERA) + if(SPECIES_SKRELL) + species_restricted = list(SPECIES_HUMAN, SPECIES_SKRELL, SPECIES_RAPALA, SPECIES_VASILISSAN, SPECIES_ALRAUNE, SPECIES_PROMETHEAN, SPECIES_XENOCHIMERA) + if(SPECIES_UNATHI) + species_restricted = list(SPECIES_UNATHI, SPECIES_XENOHYBRID) + if(SPECIES_VULPKANIN) + species_restricted = list(SPECIES_VULPKANIN, SPECIES_ZORREN_HIGH, SPECIES_FENNEC) + if(SPECIES_SERGAL) + species_restricted = list(SPECIES_SERGAL, SPECIES_NEVREAN) + //VOREStation Edit End + else + species_restricted = list(target_species) + + //Set icon + if (sprite_sheets_refit && (target_species in sprite_sheets_refit)) + LAZYSET(sprite_sheets, target_species, sprite_sheets_refit[target_species]) + + if (sprite_sheets_obj && (target_species in sprite_sheets_obj)) + icon = sprite_sheets_obj[target_species] + else + icon = initial(icon) + +/////////////////////////////////////////////////////////////////////// +// Ears: headsets, earmuffs and tiny objects +/obj/item/clothing/ears + name = "ears" + w_class = ITEMSIZE_TINY + throwforce = 2 + slot_flags = SLOT_EARS + sprite_sheets = list( + SPECIES_TESHARI = 'icons/inventory/ears/mob_teshari.dmi') + +/obj/item/clothing/ears/attack_hand(mob/user as mob) + if (!user) return + + if (src.loc != user || !istype(user,/mob/living/carbon/human)) + ..() + return + + var/mob/living/carbon/human/H = user + if(H.l_ear != src && H.r_ear != src) + ..() + return + + if(!canremove) + return + + var/obj/item/clothing/ears/O + if(slot_flags & SLOT_TWOEARS ) + O = (H.l_ear == src ? H.r_ear : H.l_ear) + user.u_equip(O) + if(!istype(src,/obj/item/clothing/ears/offear)) + qdel(O) + O = src + else + O = src + + user.unEquip(src) + + if (O) + user.put_in_hands(O) + O.add_fingerprint(user) + + if(istype(src,/obj/item/clothing/ears/offear)) + qdel(src) + +/obj/item/clothing/ears/update_clothing_icon() + if (ismob(src.loc)) + var/mob/M = src.loc + M.update_inv_ears() + +/obj/item/clothing/ears/MouseDrop(var/obj/over_object) + if(ishuman(usr)) + var/mob/living/carbon/human/H = usr + // If this covers both ears, we want to return the result of unequipping the primary object, and kill the off-ear one + if(slot_flags & SLOT_TWOEARS) + var/obj/item/clothing/ears/O = (H.l_ear == src ? H.r_ear : H.l_ear) + if(istype(src, /obj/item/clothing/ears/offear)) + . = O.MouseDrop(over_object) + H.drop_from_inventory(src) + qdel(src) + else + . = ..() + H.drop_from_inventory(O) + qdel(O) + else + . = ..() + + +/obj/item/clothing/ears/offear + name = "Other ear" + w_class = ITEMSIZE_HUGE + icon = 'icons/mob/screen1_Midnight.dmi' + icon_state = "block" + slot_flags = SLOT_EARS | SLOT_TWOEARS + +/obj/item/clothing/ears/offear/New(var/obj/O) + name = O.name + desc = O.desc + icon = O.icon + icon_state = O.icon_state + set_dir(O.dir) + +//////////////////////////////////////////////////////////////////////////////////////// +//Gloves +/obj/item/clothing/gloves + name = "gloves" + item_icons = list( + slot_l_hand_str = 'icons/mob/items/lefthand_gloves.dmi', + slot_r_hand_str = 'icons/mob/items/righthand_gloves.dmi', + ) + gender = PLURAL //Carn: for grammarically correct text-parsing + w_class = ITEMSIZE_SMALL + icon = 'icons/inventory/hands/item.dmi' + siemens_coefficient = 0.9 + blood_sprite_state = "bloodyhands" + var/wired = 0 + var/obj/item/weapon/cell/cell = 0 + var/fingerprint_chance = 0 //How likely the glove is to let fingerprints through + var/obj/item/clothing/gloves/ring = null //Covered ring + var/mob/living/carbon/human/wearer = null //Used for covered rings when dropping + var/glove_level = 2 //What "layer" the glove is on + var/overgloves = 0 //Used by gauntlets and arm_guards + var/punch_force = 0 //How much damage do these gloves add to a punch? + var/punch_damtype = BRUTE //What type of damage does this make fists be? + body_parts_covered = HANDS + slot_flags = SLOT_GLOVES + attack_verb = list("challenged") + sprite_sheets = list( + SPECIES_TESHARI = 'icons/inventory/hands/mob_teshari.dmi', + SPECIES_VOX = 'icons/inventory/hands/mob_vox.dmi' + ) + drop_sound = 'sound/items/drop/gloves.ogg' + pickup_sound = 'sound/items/pickup/gloves.ogg' + +/obj/item/clothing/proc/set_clothing_index() + return + +/obj/item/clothing/gloves/update_clothing_icon() + if (ismob(src.loc)) + var/mob/M = src.loc + M.update_inv_gloves() + +/obj/item/clothing/gloves/emp_act(severity) + if(cell) + cell.emp_act(severity) + if(ring) + ring.emp_act(severity) + ..() + +// Called just before an attack_hand(), in mob/UnarmedAttack() +/obj/item/clothing/gloves/proc/Touch(var/atom/A, var/proximity) + return 0 // return 1 to cancel attack_hand() + +/*/obj/item/clothing/gloves/attackby(obj/item/weapon/W, mob/user) + if(W.is_wirecutter() || istype(W, /obj/item/weapon/scalpel)) + if (clipped) + to_chat(user, "The [src] have already been clipped!") + update_icon() + return + + playsound(src, W.usesound, 50, 1) + user.visible_message("[user] cuts the fingertips off of the [src].","You cut the fingertips off of the [src].") + + clipped = 1 + name = "modified [name]" + desc = "[desc]
They have had the fingertips cut off of them." + if("exclude" in species_restricted) + species_restricted -= SPECIES_UNATHI + species_restricted -= SPECIES_TAJ + return +*/ + +/obj/item/clothing/gloves/clean_blood() + . = ..() + transfer_blood = 0 + update_icon() + +/obj/item/clothing/gloves/mob_can_equip(mob/user, slot, disable_warning = FALSE) + var/mob/living/carbon/human/H = user + + if(slot && slot == slot_gloves) + var/obj/item/clothing/gloves/G = H.gloves + if(istype(G)) + ring = H.gloves + if(ring.glove_level >= src.glove_level) + to_chat(user, "You are unable to wear \the [src] as \the [H.gloves] are in the way.") + ring = null + return 0 + else + H.drop_from_inventory(ring) //Remove the ring (or other under-glove item in the hand slot?) so you can put on the gloves. + ring.forceMove(src) + to_chat(user, "You slip \the [src] on over \the [src.ring].") + if(!(flags & THICKMATERIAL)) + punch_force += ring.punch_force + else + ring = null + + if(!..()) + if(ring) //Put the ring back on if the check fails. + if(H.equip_to_slot_if_possible(ring, slot_gloves)) + src.ring = null + punch_force = initial(punch_force) + return 0 + + wearer = H //TODO clean this when magboots are cleaned + return 1 + +/obj/item/clothing/gloves/dropped() + ..() + + if(!wearer) + return + + var/mob/living/carbon/human/H = wearer + if(ring && istype(H)) + if(!H.equip_to_slot_if_possible(ring, slot_gloves)) + ring.forceMove(get_turf(src)) + src.ring = null + punch_force = initial(punch_force) + wearer = null + +/obj/item/clothing/gloves + var/datum/unarmed_attack/special_attack = null //do the gloves have a special unarmed attack? + var/special_attack_type = null + +/obj/item/clothing/gloves/New() + ..() + if(special_attack_type && ispath(special_attack_type)) + special_attack = new special_attack_type + + + +///////////////////////////////////////////////////////////////////// +//Rings + +/obj/item/clothing/gloves/ring + name = "ring" + w_class = ITEMSIZE_TINY + icon = 'icons/inventory/hands/item.dmi' + gender = NEUTER + species_restricted = list("exclude", SPECIES_DIONA) + siemens_coefficient = 1 + glove_level = 1 + fingerprint_chance = 100 + punch_force = 2 + body_parts_covered = 0 + drop_sound = 'sound/items/drop/ring.ogg' + pickup_sound = 'sound/items/pickup/ring.ogg' + +/////////////////////////////////////////////////////////////////////// +//Head +/obj/item/clothing/head + name = "head" + icon = 'icons/inventory/head/item.dmi' + item_icons = list( + slot_l_hand_str = 'icons/mob/items/lefthand_hats.dmi', + slot_r_hand_str = 'icons/mob/items/righthand_hats.dmi', + ) + body_parts_covered = HEAD + slot_flags = SLOT_HEAD + w_class = ITEMSIZE_SMALL + blood_sprite_state = "helmetblood" + + light_system = MOVABLE_LIGHT_DIRECTIONAL + light_cone_y_offset = 11 + + var/light_overlay = "helmet_light" + var/image/helmet_light + + sprite_sheets = list( + SPECIES_TESHARI = 'icons/inventory/head/mob_teshari.dmi', + SPECIES_VOX = 'icons/inventory/head/mob_vox.dmi' + ) + drop_sound = 'sound/items/drop/hat.ogg' + pickup_sound = 'sound/items/pickup/hat.ogg' + +/obj/item/clothing/head/attack_self(mob/user) + if(light_range) + if(!isturf(user.loc)) + to_chat(user, "You cannot toggle the light while in this [user.loc]") + return + update_flashlight(user) + to_chat(user, "You [light_on ? "enable" : "disable"] the helmet light.") + else + return ..(user) + +/obj/item/clothing/head/proc/update_flashlight(var/mob/user = null) + set_light_on(!light_on) + + if(light_system == STATIC_LIGHT) + update_light() + + update_icon(user) + user.update_action_buttons() + +/obj/item/clothing/head/attack_ai(var/mob/user) + if(!mob_wear_hat(user)) + return ..() + +/obj/item/clothing/head/attack_generic(var/mob/user) + if(!mob_wear_hat(user)) + return ..() + +/obj/item/clothing/head/proc/mob_wear_hat(var/mob/user) + if(!Adjacent(user)) + return 0 + var/success + if(istype(user, /mob/living/silicon/robot/drone)) + var/mob/living/silicon/robot/drone/D = user + if(D.hat) + success = 2 + else + D.wear_hat(src) + success = 1 + else if(istype(user, /mob/living/carbon/alien/diona)) + var/mob/living/carbon/alien/diona/D = user + if(D.hat) + success = 2 + else + D.wear_hat(src) + success = 1 + + if(!success) + return 0 + else if(success == 2) + to_chat(user, "You are already wearing a hat.") + else if(success == 1) + to_chat(user, "You crawl under \the [src].") + return 1 + +/obj/item/clothing/head/update_icon(var/mob/user) + var/mob/living/carbon/human/H + if(ishuman(user)) + H = user + + if(light_on) + // Generate object icon. + if(!light_overlay_cache["[light_overlay]_icon"]) + light_overlay_cache["[light_overlay]_icon"] = image(icon = 'icons/obj/light_overlays.dmi', icon_state = "[light_overlay]") + helmet_light = light_overlay_cache["[light_overlay]_icon"] + add_overlay(helmet_light) + + // Generate and cache the on-mob icon, which is used in update_inv_head(). + var/body_type = (H && H.species.get_bodytype(H)) + var/cache_key = "[light_overlay][body_type && LAZYACCESS(sprite_sheets, body_type) ? body_type : ""]" + if(!light_overlay_cache[cache_key]) + var/use_icon = LAZYACCESS(sprite_sheets, body_type) || 'icons/mob/light_overlays.dmi' + light_overlay_cache[cache_key] = image(icon = use_icon, icon_state = "[light_overlay]") + + else if(helmet_light) + cut_overlay(helmet_light) + helmet_light = null + + user.update_inv_head() //Will redraw the helmet with the light on the mob + +/obj/item/clothing/head/update_clothing_icon() + if (ismob(src.loc)) + var/mob/M = src.loc + M.update_inv_head() + +/////////////////////////////////////////////////////////////////////// +//Mask +/obj/item/clothing/mask + name = "mask" + icon = 'icons/inventory/face/item.dmi' + item_icons = list( + slot_l_hand_str = 'icons/mob/items/lefthand_masks.dmi', + slot_r_hand_str = 'icons/mob/items/righthand_masks.dmi', + ) + body_parts_covered = HEAD + slot_flags = SLOT_MASK + body_parts_covered = FACE|EYES + blood_sprite_state = "maskblood" + sprite_sheets = list( + SPECIES_TESHARI = 'icons/inventory/face/mob_teshari.dmi', + SPECIES_VOX = 'icons/inventory/face/mob_vox.dmi', + SPECIES_TAJ = 'icons/inventory/face/mob_tajaran.dmi', + SPECIES_UNATHI = 'icons/inventory/face/mob_unathi.dmi' + ) + + var/voicechange = 0 + var/list/say_messages + var/list/say_verbs + + drop_sound = "generic_drop" + pickup_sound = "generic_pickup" + +/obj/item/clothing/mask/update_clothing_icon() + if (ismob(src.loc)) + var/mob/M = src.loc + M.update_inv_wear_mask() + +/obj/item/clothing/mask/proc/filter_air(datum/gas_mixture/air) + return + +/////////////////////////////////////////////////////////////////////// +//Shoes +/obj/item/clothing/shoes + name = "shoes" + icon = 'icons/inventory/feet/item.dmi' + item_icons = list( + slot_l_hand_str = 'icons/mob/items/lefthand_shoes.dmi', + slot_r_hand_str = 'icons/mob/items/righthand_shoes.dmi', + ) + desc = "Comfortable-looking shoes." + gender = PLURAL //Carn: for grammarically correct text-parsing + siemens_coefficient = 0.9 + body_parts_covered = FEET + slot_flags = SLOT_FEET + blood_sprite_state = "shoeblood" + + var/can_hold_knife = 0 + var/obj/item/holding + + var/shoes_under_pants = 0 + + var/water_speed = 0 //Speed boost/decrease in water, lower/negative values mean more speed + var/snow_speed = 0 //Speed boost/decrease on snow, lower/negative values mean more speed + var/rock_climbing = FALSE // If true, allows climbing cliffs with clickdrag. + + var/step_volume_mod = 1 //How quiet or loud footsteps in this shoe are + + permeability_coefficient = 0.50 + slowdown = SHOES_SLOWDOWN + force = 2 + var/overshoes = 0 + species_restricted = list("exclude",SPECIES_TESHARI, SPECIES_VOX) + sprite_sheets = list( + SPECIES_TESHARI = 'icons/inventory/feet/mob_teshari.dmi', + SPECIES_VOX = 'icons/inventory/feet/mob_vox.dmi' + ) + drop_sound = 'sound/items/drop/shoes.ogg' + pickup_sound = 'sound/items/pickup/shoes.ogg' + +/obj/item/clothing/shoes/proc/draw_knife() + set name = "Draw Boot Knife" + set desc = "Pull out your boot knife." + set category = "IC" + set src in usr + + if(usr.stat || usr.restrained() || usr.incapacitated()) + return + + holding.forceMove(get_turf(usr)) + + if(usr.put_in_hands(holding)) + usr.visible_message("\The [usr] pulls a knife out of their boot!") + playsound(src, 'sound/weapons/holster/sheathout.ogg', 25) + holding = null + cut_overlay("[icon_state]_knife") + else + to_chat(usr, "Your need an empty, unbroken hand to do that.") + holding.forceMove(src) + + if(!holding) + verbs -= /obj/item/clothing/shoes/proc/draw_knife + + update_icon() + return + +/obj/item/clothing/shoes/attack_hand(var/mob/living/M) + if(can_hold_knife == 1 && holding && src.loc == M) + draw_knife() + return + ..() + +/obj/item/clothing/shoes/attackby(var/obj/item/I, var/mob/user) + if((can_hold_knife == 1) && (istype(I, /obj/item/weapon/material/shard) || \ + istype(I, /obj/item/weapon/material/butterfly) || \ + istype(I, /obj/item/weapon/material/kitchen/utensil) || \ + istype(I, /obj/item/weapon/material/knife/tacknife))) + if(holding) + to_chat(user, "\The [src] is already holding \a [holding].") + return + user.unEquip(I) + I.forceMove(src) + holding = I + user.visible_message("\The [user] shoves \the [I] into \the [src].") + verbs |= /obj/item/clothing/shoes/proc/draw_knife + update_icon() + else + return ..() + +/obj/item/clothing/shoes/verb/toggle_layer() + set name = "Switch Shoe Layer" + set category = "Object" + + if(shoes_under_pants == -1) + to_chat(usr, "\The [src] cannot be worn above your suit!") + return + shoes_under_pants = !shoes_under_pants + update_icon() + +/obj/item/clothing/shoes/update_icon() + . = ..() + if(holding) + add_overlay("[icon_state]_knife") + if(contaminated) + add_overlay(contamination_overlay) + if(gurgled) //VOREStation Edit Start + decontaminate() + gurgle_contaminate() //VOREStation Edit End + if(ismob(usr)) + var/mob/M = usr + M.update_inv_shoes() + +/obj/item/clothing/shoes/clean_blood() + update_icon() + return ..() + +/obj/item/clothing/shoes/proc/handle_movement(var/turf/walking, var/running) + if(prob(1) && !recent_squish) //VOREStation edit begin + recent_squish = 1 + spawn(100) + recent_squish = 0 + for(var/mob/living/M in contents) + var/emote = pick(inside_emotes) + to_chat(M,emote) //VOREStation edit end + return + +/obj/item/clothing/shoes/update_clothing_icon() + if (ismob(src.loc)) + var/mob/M = src.loc + M.update_inv_shoes() + + +/////////////////////////////////////////////////////////////////////// +//Suit +/obj/item/clothing/suit + icon = 'icons/inventory/suit/item.dmi' + item_icons = list( + slot_l_hand_str = 'icons/mob/items/lefthand_suits.dmi', + slot_r_hand_str = 'icons/mob/items/righthand_suits.dmi', + ) + name = "suit" + var/fire_resist = T0C+100 + body_parts_covered = UPPER_TORSO|LOWER_TORSO|ARMS|LEGS + allowed = list(/obj/item/weapon/tank/emergency/oxygen) + armor = list("melee" = 0, "bullet" = 0, "laser" = 0, "energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 0) + slot_flags = SLOT_OCLOTHING + var/blood_overlay_type = "suit" + blood_sprite_state = "suitblood" //Defaults to the suit's blood overlay, so that some blood renders instead of no blood. + + var/taurized = FALSE + siemens_coefficient = 0.9 + w_class = ITEMSIZE_NORMAL + preserve_item = 1 + equip_sound = 'sound/items/jumpsuit_equip.ogg' + + + sprite_sheets = list( + SPECIES_TESHARI = 'icons/inventory/suit/mob_teshari.dmi', + SPECIES_VOX = 'icons/inventory/suit/mob_vox.dmi' + ) + + valid_accessory_slots = (ACCESSORY_SLOT_OVER | ACCESSORY_SLOT_ARMBAND) + restricted_accessory_slots = (ACCESSORY_SLOT_ARMBAND) + +/obj/item/clothing/suit/update_clothing_icon() + if (ismob(src.loc)) + var/mob/M = src.loc + M.update_inv_wear_suit() + +/obj/item/clothing/suit/equipped(var/mob/user, var/slot) + if(ishuman(user)) + var/mob/living/carbon/human/H = user + var/taurtail = istaurtail(H.tail_style) + if((taurized && !taurtail) || (!taurized && taurtail)) + taurize(user, taurtail) + + return ..() + +/obj/item/clothing/suit/proc/taurize(var/mob/living/carbon/human/Taur, has_taur_tail = FALSE) + if(has_taur_tail) + var/datum/sprite_accessory/tail/taur/taurtail = Taur.tail_style + if(taurtail.suit_sprites && (get_worn_icon_state(slot_wear_suit_str) in cached_icon_states(taurtail.suit_sprites))) + icon_override = taurtail.suit_sprites + taurized = TRUE + // means that if a taur puts on an already taurized suit without a taur sprite + // for their taur type, but the previous taur type had a sprite, it stays + // taurized and they end up with that taur style which is funny + else + taurized = FALSE + + if(!taurized) + icon_override = initial(icon_override) + taurized = FALSE + +// Taur suits need to be shifted so its centered on their taur half. +/obj/item/clothing/suit/make_worn_icon(var/body_type,var/slot_name,var/inhands,var/default_icon,var/default_layer = 0,var/icon/clip_mask) + var/image/standing = ..() + if(taurized) //Special snowflake var on suits + standing.pixel_x = -16 + standing.layer = BODY_LAYER + 15 // 15 is above tail layer, so will not be covered by taurbody. + return standing + +/obj/item/clothing/suit/apply_accessories(var/image/standing) + if(LAZYLEN(accessories) && taurized) + for(var/obj/item/clothing/accessory/A in accessories) + var/image/I = new(A.get_mob_overlay()) + I.pixel_x = 16 //Opposite of the pixel_x on the suit (-16) from taurization to cancel it out and puts the accessory in the correct place on the body. + standing.add_overlay(I) + else + return ..() + + +/////////////////////////////////////////////////////////////////////// +//Under clothing +/obj/item/clothing/under + icon = 'icons/inventory/uniform/item.dmi' + item_icons = list( + slot_l_hand_str = 'icons/mob/items/lefthand_uniforms.dmi', + slot_r_hand_str = 'icons/mob/items/righthand_uniforms.dmi', + ) + name = "under" + body_parts_covered = UPPER_TORSO|LOWER_TORSO|LEGS|ARMS + permeability_coefficient = 0.90 + slot_flags = SLOT_ICLOTHING + armor = list(melee = 0, bullet = 0, laser = 0,energy = 0, bomb = 0, bio = 0, rad = 0) + equip_sound = 'sound/items/jumpsuit_equip.ogg' + w_class = ITEMSIZE_NORMAL + show_messages = 1 + blood_sprite_state = "uniformblood" + + var/has_sensor = 1 //For the crew computer 2 = unable to change mode + var/sensor_mode = 0 + /* + 1 = Report living/dead + 2 = Report detailed damages + 3 = Report location + */ + var/displays_id = 1 + var/rolled_down = -1 //0 = unrolled, 1 = rolled, -1 = cannot be toggled + var/rolled_sleeves = -1 //0 = unrolled, 1 = rolled, -1 = cannot be toggled + sprite_sheets = list( + SPECIES_TESHARI = 'icons/inventory/uniform/mob_teshari.dmi', + SPECIES_VOX = 'icons/inventory/uniform/mob_vox.dmi' + ) + + //convenience var for defining the icon state for the overlay used when the clothing is worn. + //Also used by rolling/unrolling. + var/worn_state = null + valid_accessory_slots = (\ + ACCESSORY_SLOT_UTILITY\ + |ACCESSORY_SLOT_WEAPON\ + |ACCESSORY_SLOT_ARMBAND\ + |ACCESSORY_SLOT_DECOR\ + |ACCESSORY_SLOT_MEDAL\ + |ACCESSORY_SLOT_INSIGNIA\ + |ACCESSORY_SLOT_TIE\ + |ACCESSORY_SLOT_RANK\ + |ACCESSORY_SLOT_DEPT\ + |ACCESSORY_SLOT_OVER) + restricted_accessory_slots = (\ + ACCESSORY_SLOT_UTILITY\ + |ACCESSORY_SLOT_WEAPON\ + |ACCESSORY_SLOT_ARMBAND\ + |ACCESSORY_SLOT_TIE\ + |ACCESSORY_SLOT_RANK\ + |ACCESSORY_SLOT_DEPT\ + |ACCESSORY_SLOT_OVER) + + var/icon/rolled_down_icon = 'icons/inventory/uniform/mob_rolled_down.dmi' + var/icon/rolled_down_sleeves_icon = 'icons/inventory/uniform/mob_sleeves_rolled.dmi' + +/obj/item/clothing/under/attack_hand(var/mob/user) + if(LAZYLEN(accessories)) + ..() + if ((ishuman(usr) || issmall(usr)) && src.loc == user) + return + ..() + +/obj/item/clothing/under/New() + ..() + if(worn_state) + LAZYSET(item_state_slots, slot_w_uniform_str, worn_state) + else + worn_state = icon_state + + //autodetect rollability + if(rolled_down < 0) + if(("[worn_state]_d" in cached_icon_states(icon)) || (worn_state in cached_icon_states(rolled_down_icon)) || ("[worn_state]_d" in cached_icon_states(icon_override))) + rolled_down = 0 + + if(rolled_down == -1) + verbs -= /obj/item/clothing/under/verb/rollsuit + if(rolled_sleeves == -1) + verbs -= /obj/item/clothing/under/verb/rollsleeves + +/obj/item/clothing/under/proc/update_rolldown_status() + var/mob/living/carbon/human/H + if(istype(src.loc, /mob/living/carbon/human)) + H = src.loc + + var/icon/under_icon + if(icon_override) + under_icon = icon_override + else if(H && LAZYACCESS(sprite_sheets, H.species.get_bodytype(H))) + under_icon = sprite_sheets[H.species.get_bodytype(H)] + else if(LAZYACCESS(item_icons, slot_w_uniform_str)) + under_icon = item_icons[slot_w_uniform_str] + else if (worn_state in cached_icon_states(rolled_down_icon)) + under_icon = rolled_down_icon + + // The _s is because the icon update procs append it. + if((under_icon == rolled_down_icon && ("[worn_state]" in cached_icon_states(under_icon))) || ("[worn_state]_d" in cached_icon_states(under_icon))) + if(rolled_down != 1) + rolled_down = 0 + else + rolled_down = -1 + if(H) update_clothing_icon() + +/obj/item/clothing/under/proc/update_rollsleeves_status() + var/mob/living/carbon/human/H + if(istype(src.loc, /mob/living/carbon/human)) + H = src.loc + + var/icon/under_icon + if(icon_override) + under_icon = icon_override + else if(H && LAZYACCESS(sprite_sheets, H.species.get_bodytype(H))) + under_icon = sprite_sheets[H.species.get_bodytype(H)] + else if(LAZYACCESS(item_icons, slot_w_uniform_str)) + under_icon = item_icons[slot_w_uniform_str] + else if (worn_state in cached_icon_states(rolled_down_sleeves_icon)) + under_icon = rolled_down_sleeves_icon + else + under_icon = new /icon(INV_W_UNIFORM_DEF_ICON) + + // The _s is because the icon update procs append it. + if((under_icon == rolled_down_sleeves_icon && ("[worn_state]" in cached_icon_states(under_icon))) || ("[worn_state]_r" in cached_icon_states(under_icon))) + if(rolled_sleeves != 1) + rolled_sleeves = 0 + else + rolled_sleeves = -1 + if(H) update_clothing_icon() + +/obj/item/clothing/under/update_clothing_icon() + if (ismob(src.loc)) + var/mob/M = src.loc + M.update_inv_w_uniform() + + set_clothing_index() + + +/obj/item/clothing/under/examine(mob/user) + . = ..() + switch(src.sensor_mode) + if(0) + . += "Its sensors appear to be disabled." + if(1) + . += "Its binary life sensors appear to be enabled." + if(2) + . += "Its vital tracker appears to be enabled." + if(3) + . += "Its vital tracker and tracking beacon appear to be enabled." + +/obj/item/clothing/under/proc/set_sensors(mob/usr as mob) + var/mob/M = usr + if (istype(M, /mob/observer)) return + if (usr.stat || usr.restrained()) return + if(has_sensor >= 2) + to_chat(usr, "The controls are locked.") + return 0 + if(has_sensor <= 0) + to_chat(usr, "This suit does not have any sensors.") + return 0 + + var/list/modes = list("Off", "Binary sensors", "Vitals tracker", "Tracking beacon") + var/switchMode = tgui_input_list(usr, "Select a sensor mode:", "Suit Sensor Mode", modes) + if(get_dist(usr, src) > 1) + to_chat(usr, "You have moved too far away.") + return + sensor_mode = modes.Find(switchMode) - 1 + + if (src.loc == usr) + switch(sensor_mode) + if(0) + usr.visible_message("[usr] adjusts their sensors.", "You disable your suit's remote sensing equipment.") + if(1) + usr.visible_message("[usr] adjusts their sensors.", "Your suit will now report whether you are live or dead.") + if(2) + usr.visible_message("[usr] adjusts their sensors.", "Your suit will now report your vital lifesigns.") + if(3) + usr.visible_message("[usr] adjusts their sensors.", "Your suit will now report your vital lifesigns as well as your coordinate position.") + + else if (istype(src.loc, /mob)) + usr.visible_message("[usr] adjusts [src.loc]'s sensors.", "You adjust [src.loc]'s sensors.") + +/obj/item/clothing/under/verb/toggle() + set name = "Toggle Suit Sensors" + set category = "Object" + set src in usr + set_sensors(usr) + +/obj/item/clothing/under/verb/rollsuit() + set name = "Roll Down Jumpsuit" + set category = "Object" + set src in usr + if(!istype(usr, /mob/living)) return + if(usr.stat) return + + update_rolldown_status() + if(rolled_down == -1) + to_chat(usr, "You cannot roll down [src]!") + return + if((rolled_sleeves == 1) && !(rolled_down)) + rolled_sleeves = 0 + + rolled_down = !rolled_down + if(rolled_down) + body_parts_covered = initial(body_parts_covered) + body_parts_covered &= ~(UPPER_TORSO|ARMS) + if(worn_state in cached_icon_states(rolled_down_icon)) + icon_override = rolled_down_icon + LAZYSET(item_state_slots, slot_w_uniform_str, worn_state) + else + LAZYSET(item_state_slots, slot_w_uniform_str, "[worn_state]_d") + + to_chat(usr, "You roll down your [src].") + else + body_parts_covered = initial(body_parts_covered) + if(icon_override == rolled_down_icon) + icon_override = initial(icon_override) + LAZYSET(item_state_slots, slot_w_uniform_str, worn_state) + to_chat(usr, "You roll up your [src].") + update_clothing_icon() + +/obj/item/clothing/under/verb/rollsleeves() + set name = "Roll Up Sleeves" + set category = "Object" + set src in usr + if(!istype(usr, /mob/living)) return + if(usr.stat) return + + update_rollsleeves_status() + if(rolled_sleeves == -1) + to_chat(usr, "You cannot roll up your [src]'s sleeves!") + return + if(rolled_down == 1) + to_chat(usr, "You must roll up your [src] first!") + return + + rolled_sleeves = !rolled_sleeves + if(rolled_sleeves) + body_parts_covered &= ~(ARMS) + if(worn_state in cached_icon_states(rolled_down_sleeves_icon)) + icon_override = rolled_down_sleeves_icon + LAZYSET(item_state_slots, slot_w_uniform_str, worn_state) + else + LAZYSET(item_state_slots, slot_w_uniform_str, "[worn_state]_r") + to_chat(usr, "You roll up your [src]'s sleeves.") + else + body_parts_covered = initial(body_parts_covered) + if(icon_override == rolled_down_sleeves_icon) + icon_override = initial(icon_override) + LAZYSET(item_state_slots, slot_w_uniform_str, worn_state) + to_chat(usr, "You roll down your [src]'s sleeves.") + update_clothing_icon() + +/obj/item/clothing/under/rank/New() + sensor_mode = pick(0,1,2,3) + ..() +======= +/obj/item/clothing + name = "clothing" + siemens_coefficient = 0.9 + drop_sound = 'sound/items/drop/clothing.ogg' + pickup_sound = 'sound/items/pickup/clothing.ogg' + var/list/species_restricted = null //Only these species can wear this kit. + var/gunshot_residue //Used by forensics. + + var/list/accessories + var/list/valid_accessory_slots + var/list/restricted_accessory_slots + var/list/starting_accessories + + var/flash_protection = FLASH_PROTECTION_NONE + var/tint = TINT_NONE + var/list/enables_planes //Enables these planes in the wearing mob's plane_holder + var/list/plane_slots //But only if it's equipped into this specific slot + + var/ear_protection = 0 + var/blood_sprite_state + + var/update_icon_define = null // Only needed if you've got multiple files for the same type of clothing + + var/polychromic = FALSE //VOREStation edit + +//Updates the icons of the mob wearing the clothing item, if any. +/obj/item/clothing/proc/update_clothing_icon() + return + +// Aurora forensics port. +/obj/item/clothing/clean_blood() + . = ..() + gunshot_residue = null + + +/obj/item/clothing/New() + ..() + if(starting_accessories) + for(var/T in starting_accessories) + var/obj/item/clothing/accessory/tie = new T(src) + src.attach_accessory(null, tie) + set_clothing_index() + + //VOREStation edit start + if(polychromic) + verbs |= /obj/item/clothing/proc/change_color + //VOREStation edit start + +/obj/item/clothing/update_icon() + cut_overlays() //This removes all the overlays on the sprite and then goes down a checklist adding them as required. + if(blood_DNA) + add_blood() + . = ..() + +/obj/item/clothing/equipped(var/mob/user,var/slot) + ..() + if(enables_planes) + user.recalculate_vis() + +/obj/item/clothing/dropped(var/mob/user) + ..() + if(enables_planes) + user.recalculate_vis() + +//BS12: Species-restricted clothing check. +/obj/item/clothing/mob_can_equip(M as mob, slot, disable_warning = FALSE) + + //if we can't equip the item anyway, don't bother with species_restricted (cuts down on spam) + if (!..()) + return 0 + + if(LAZYLEN(species_restricted) && istype(M,/mob/living/carbon/human)) + var/exclusive = null + var/wearable = null + var/mob/living/carbon/human/H = M + + if("exclude" in species_restricted) + exclusive = 1 + + if(H.species) + if(exclusive) + if(!(H.species.get_bodytype(H) in species_restricted)) + wearable = 1 + else + if(H.species.get_bodytype(H) in species_restricted) + wearable = 1 + + if(!wearable && !(slot in list(slot_l_store, slot_r_store, slot_s_store))) + to_chat(H, "Your species cannot wear [src].") + return 0 + return 1 + +/obj/item/clothing/handle_shield(mob/user, var/damage, atom/damage_source = null, mob/attacker = null, var/def_zone = null, var/attack_text = "the attack") + . = ..() + if((. == 0) && LAZYLEN(accessories)) + for(var/obj/item/I in accessories) + var/check = I.handle_shield(user, damage, damage_source, attacker, def_zone, attack_text) + + if(check != 0) // Projectiles sometimes use negatives IIRC, 0 is only returned if something is not blocked. + . = check + break + +// For now, these two temp procs only return TRUE or FALSE if they can provide resistance to a given temperature. +/obj/item/clothing/proc/handle_low_temperature(var/tempcheck = T20C) + . = FALSE + if(LAZYLEN(accessories)) + for(var/obj/item/clothing/C in accessories) + if(C.handle_low_temperature(tempcheck)) + . = TRUE + + if(min_cold_protection_temperature && min_cold_protection_temperature <= tempcheck) + . = TRUE + +/obj/item/clothing/proc/handle_high_temperature(var/tempcheck = T20C) + . = FALSE + if(LAZYLEN(accessories)) + for(var/obj/item/clothing/C in accessories) + if(C.handle_high_temperature(tempcheck)) + . = TRUE + + if(max_heat_protection_temperature && max_heat_protection_temperature >= tempcheck) + . = TRUE + +// Returns the relative flag-vars for covered protection. +/obj/item/clothing/proc/get_cold_protection_flags() + . = cold_protection + + if(LAZYLEN(accessories)) + for(var/obj/item/clothing/C in accessories) + . |= C.get_cold_protection_flags() + +/obj/item/clothing/proc/get_heat_protection_flags() + . = heat_protection + + if(LAZYLEN(accessories)) + for(var/obj/item/clothing/C in accessories) + . |= C.get_heat_protection_flags() + +/obj/item/clothing/proc/refit_for_species(var/target_species) + if(!species_restricted) + return //this item doesn't use the species_restricted system + + //Set species_restricted list + switch(target_species) + //VOREStation Edit Start + if(SPECIES_HUMAN, SPECIES_SKRELL) //humanoid bodytypes + species_restricted = list(SPECIES_HUMAN, SPECIES_SKRELL, SPECIES_RAPALA, SPECIES_VASILISSAN, SPECIES_ALRAUNE, SPECIES_PROMETHEAN, SPECIES_XENOCHIMERA) + if(SPECIES_UNATHI) + species_restricted = list(SPECIES_UNATHI, SPECIES_XENOHYBRID) + if(SPECIES_VULPKANIN) + species_restricted = list(SPECIES_VULPKANIN, SPECIES_ZORREN_HIGH, SPECIES_FENNEC) + if(SPECIES_SERGAL) + species_restricted = list(SPECIES_SERGAL, SPECIES_NEVREAN) + //VOREStation Edit End + else + species_restricted = list(target_species) + + //Set icon + if (sprite_sheets_obj && (target_species in sprite_sheets_obj)) + icon = sprite_sheets_obj[target_species] + else + icon = initial(icon) + +//VOREStation edit start +/obj/item/clothing/proc/change_color() + set name = "Change Color" + set category = "Object" + set desc = "Change the color of the clothing." + set src in usr + + if(usr.stat || usr.restrained() || usr.incapacitated()) + return + + var/new_color = input(usr, "Pick a new color", "Color", color) as color|null + + if(new_color && (new_color != color)) + color = new_color + update_icon() + update_clothing_icon() +//VOREStation edit end + +/obj/item/clothing/head/helmet/refit_for_species(var/target_species) + if(!species_restricted) + return //this item doesn't use the species_restricted system + + //Set species_restricted list + switch(target_species) + //VOREStation Edit Start + if(SPECIES_HUMAN) + species_restricted = list(SPECIES_HUMAN, SPECIES_RAPALA, SPECIES_VASILISSAN, SPECIES_ALRAUNE, SPECIES_PROMETHEAN, SPECIES_XENOCHIMERA) + if(SPECIES_SKRELL) + species_restricted = list(SPECIES_HUMAN, SPECIES_SKRELL, SPECIES_RAPALA, SPECIES_VASILISSAN, SPECIES_ALRAUNE, SPECIES_PROMETHEAN, SPECIES_XENOCHIMERA) + if(SPECIES_UNATHI) + species_restricted = list(SPECIES_UNATHI, SPECIES_XENOHYBRID) + if(SPECIES_VULPKANIN) + species_restricted = list(SPECIES_VULPKANIN, SPECIES_ZORREN_HIGH, SPECIES_FENNEC) + if(SPECIES_SERGAL) + species_restricted = list(SPECIES_SERGAL, SPECIES_NEVREAN) + //VOREStation Edit End + else + species_restricted = list(target_species) + + //Set icon + if (sprite_sheets_obj && (target_species in sprite_sheets_obj)) + icon = sprite_sheets_obj[target_species] + else + icon = initial(icon) + +/////////////////////////////////////////////////////////////////////// +// Ears: headsets, earmuffs and tiny objects +/obj/item/clothing/ears + name = "ears" + w_class = ITEMSIZE_TINY + throwforce = 2 + slot_flags = SLOT_EARS + sprite_sheets = list( + SPECIES_TESHARI = 'icons/inventory/ears/mob_teshari.dmi') + +/obj/item/clothing/ears/attack_hand(mob/user as mob) + if (!user) return + + if (src.loc != user || !istype(user,/mob/living/carbon/human)) + ..() + return + + var/mob/living/carbon/human/H = user + if(H.l_ear != src && H.r_ear != src) + ..() + return + + if(!canremove) + return + + var/obj/item/clothing/ears/O + if(slot_flags & SLOT_TWOEARS ) + O = (H.l_ear == src ? H.r_ear : H.l_ear) + user.u_equip(O) + if(!istype(src,/obj/item/clothing/ears/offear)) + qdel(O) + O = src + else + O = src + + user.unEquip(src) + + if (O) + user.put_in_hands(O) + O.add_fingerprint(user) + + if(istype(src,/obj/item/clothing/ears/offear)) + qdel(src) + +/obj/item/clothing/ears/update_clothing_icon() + if (ismob(src.loc)) + var/mob/M = src.loc + M.update_inv_ears() + +/obj/item/clothing/ears/MouseDrop(var/obj/over_object) + if(ishuman(usr)) + var/mob/living/carbon/human/H = usr + // If this covers both ears, we want to return the result of unequipping the primary object, and kill the off-ear one + if(slot_flags & SLOT_TWOEARS) + var/obj/item/clothing/ears/O = (H.l_ear == src ? H.r_ear : H.l_ear) + if(istype(src, /obj/item/clothing/ears/offear)) + . = O.MouseDrop(over_object) + H.drop_from_inventory(src) + qdel(src) + else + . = ..() + H.drop_from_inventory(O) + qdel(O) + else + . = ..() + + +/obj/item/clothing/ears/offear + name = "Other ear" + w_class = ITEMSIZE_HUGE + icon = 'icons/mob/screen1_Midnight.dmi' + icon_state = "block" + slot_flags = SLOT_EARS | SLOT_TWOEARS + +/obj/item/clothing/ears/offear/New(var/obj/O) + name = O.name + desc = O.desc + icon = O.icon + icon_state = O.icon_state + set_dir(O.dir) + +//////////////////////////////////////////////////////////////////////////////////////// +//Gloves +/obj/item/clothing/gloves + name = "gloves" + item_icons = list( + slot_l_hand_str = 'icons/mob/items/lefthand_gloves.dmi', + slot_r_hand_str = 'icons/mob/items/righthand_gloves.dmi', + ) + gender = PLURAL //Carn: for grammarically correct text-parsing + w_class = ITEMSIZE_SMALL + icon = 'icons/inventory/hands/item.dmi' + siemens_coefficient = 0.9 + blood_sprite_state = "bloodyhands" + var/wired = 0 + var/obj/item/weapon/cell/cell = 0 + var/fingerprint_chance = 0 //How likely the glove is to let fingerprints through + var/obj/item/clothing/gloves/ring = null //Covered ring + var/mob/living/carbon/human/wearer = null //Used for covered rings when dropping + var/glove_level = 2 //What "layer" the glove is on + var/overgloves = 0 //Used by gauntlets and arm_guards + var/punch_force = 0 //How much damage do these gloves add to a punch? + var/punch_damtype = BRUTE //What type of damage does this make fists be? + body_parts_covered = HANDS + slot_flags = SLOT_GLOVES + attack_verb = list("challenged") + sprite_sheets = list( + SPECIES_TESHARI = 'icons/inventory/hands/mob_teshari.dmi', + SPECIES_VOX = 'icons/inventory/hands/mob_vox.dmi' + ) + drop_sound = 'sound/items/drop/gloves.ogg' + pickup_sound = 'sound/items/pickup/gloves.ogg' + +/obj/item/clothing/proc/set_clothing_index() + return + +/obj/item/clothing/gloves/update_clothing_icon() + if (ismob(src.loc)) + var/mob/M = src.loc + M.update_inv_gloves() + +/obj/item/clothing/gloves/emp_act(severity) + if(cell) + cell.emp_act(severity) + if(ring) + ring.emp_act(severity) + ..() + +// Called just before an attack_hand(), in mob/UnarmedAttack() +/obj/item/clothing/gloves/proc/Touch(var/atom/A, var/proximity) + return 0 // return 1 to cancel attack_hand() + +/*/obj/item/clothing/gloves/attackby(obj/item/weapon/W, mob/user) + if(W.is_wirecutter() || istype(W, /obj/item/weapon/scalpel)) + if (clipped) + to_chat(user, "The [src] have already been clipped!") + update_icon() + return + + playsound(src, W.usesound, 50, 1) + user.visible_message("[user] cuts the fingertips off of the [src].","You cut the fingertips off of the [src].") + + clipped = 1 + name = "modified [name]" + desc = "[desc]
They have had the fingertips cut off of them." + if("exclude" in species_restricted) + species_restricted -= SPECIES_UNATHI + species_restricted -= SPECIES_TAJ + return +*/ + +/obj/item/clothing/gloves/clean_blood() + . = ..() + transfer_blood = 0 + update_icon() + +/obj/item/clothing/gloves/mob_can_equip(mob/user, slot, disable_warning = FALSE) + var/mob/living/carbon/human/H = user + + if(slot && slot == slot_gloves) + var/obj/item/clothing/gloves/G = H.gloves + if(istype(G)) + ring = H.gloves + if(ring.glove_level >= src.glove_level) + to_chat(user, "You are unable to wear \the [src] as \the [H.gloves] are in the way.") + ring = null + return 0 + else + H.drop_from_inventory(ring) //Remove the ring (or other under-glove item in the hand slot?) so you can put on the gloves. + ring.forceMove(src) + to_chat(user, "You slip \the [src] on over \the [src.ring].") + if(!(flags & THICKMATERIAL)) + punch_force += ring.punch_force + else + ring = null + + if(!..()) + if(ring) //Put the ring back on if the check fails. + if(H.equip_to_slot_if_possible(ring, slot_gloves)) + src.ring = null + punch_force = initial(punch_force) + return 0 + + wearer = H //TODO clean this when magboots are cleaned + return 1 + +/obj/item/clothing/gloves/dropped() + ..() + + if(!wearer) + return + + var/mob/living/carbon/human/H = wearer + if(ring && istype(H)) + if(!H.equip_to_slot_if_possible(ring, slot_gloves)) + ring.forceMove(get_turf(src)) + src.ring = null + punch_force = initial(punch_force) + wearer = null + +/obj/item/clothing/gloves + var/datum/unarmed_attack/special_attack = null //do the gloves have a special unarmed attack? + var/special_attack_type = null + +/obj/item/clothing/gloves/New() + ..() + if(special_attack_type && ispath(special_attack_type)) + special_attack = new special_attack_type + + + +///////////////////////////////////////////////////////////////////// +//Rings + +/obj/item/clothing/gloves/ring + name = "ring" + w_class = ITEMSIZE_TINY + icon = 'icons/inventory/hands/item.dmi' + gender = NEUTER + species_restricted = list("exclude", SPECIES_DIONA) + siemens_coefficient = 1 + glove_level = 1 + fingerprint_chance = 100 + punch_force = 2 + body_parts_covered = 0 + drop_sound = 'sound/items/drop/ring.ogg' + pickup_sound = 'sound/items/pickup/ring.ogg' + +/////////////////////////////////////////////////////////////////////// +//Head +/obj/item/clothing/head + name = "head" + icon = 'icons/inventory/head/item.dmi' + item_icons = list( + slot_l_hand_str = 'icons/mob/items/lefthand_hats.dmi', + slot_r_hand_str = 'icons/mob/items/righthand_hats.dmi', + ) + body_parts_covered = HEAD + slot_flags = SLOT_HEAD + w_class = ITEMSIZE_SMALL + blood_sprite_state = "helmetblood" + + light_system = MOVABLE_LIGHT_DIRECTIONAL + light_cone_y_offset = 11 + + var/light_overlay = "helmet_light" + var/image/helmet_light + + sprite_sheets = list( + SPECIES_TESHARI = 'icons/inventory/head/mob_teshari.dmi', + SPECIES_VOX = 'icons/inventory/head/mob_vox.dmi' + ) + drop_sound = 'sound/items/drop/hat.ogg' + pickup_sound = 'sound/items/pickup/hat.ogg' + +/obj/item/clothing/head/attack_self(mob/user) + if(light_range) + if(!isturf(user.loc)) + to_chat(user, "You cannot toggle the light while in this [user.loc]") + return + update_flashlight(user) + to_chat(user, "You [light_on ? "enable" : "disable"] the helmet light.") + else + return ..(user) + +/obj/item/clothing/head/proc/update_flashlight(var/mob/user = null) + set_light_on(!light_on) + + if(light_system == STATIC_LIGHT) + update_light() + + update_icon(user) + user.update_action_buttons() + +/obj/item/clothing/head/attack_ai(var/mob/user) + if(!mob_wear_hat(user)) + return ..() + +/obj/item/clothing/head/attack_generic(var/mob/user) + if(!mob_wear_hat(user)) + return ..() + +/obj/item/clothing/head/proc/mob_wear_hat(var/mob/user) + if(!Adjacent(user)) + return 0 + var/success + if(istype(user, /mob/living/silicon/robot/drone)) + var/mob/living/silicon/robot/drone/D = user + if(D.hat) + success = 2 + else + D.wear_hat(src) + success = 1 + else if(istype(user, /mob/living/carbon/alien/diona)) + var/mob/living/carbon/alien/diona/D = user + if(D.hat) + success = 2 + else + D.wear_hat(src) + success = 1 + + if(!success) + return 0 + else if(success == 2) + to_chat(user, "You are already wearing a hat.") + else if(success == 1) + to_chat(user, "You crawl under \the [src].") + return 1 + +/obj/item/clothing/head/update_icon(var/mob/user) + var/mob/living/carbon/human/H + if(ishuman(user)) + H = user + + if(light_on) + // Generate object icon. + if(!light_overlay_cache["[light_overlay]_icon"]) + light_overlay_cache["[light_overlay]_icon"] = image(icon = 'icons/obj/light_overlays.dmi', icon_state = "[light_overlay]") + helmet_light = light_overlay_cache["[light_overlay]_icon"] + add_overlay(helmet_light) + + // Generate and cache the on-mob icon, which is used in update_inv_head(). + var/body_type = (H && H.species.get_bodytype(H)) + var/cache_key = "[light_overlay][body_type && LAZYACCESS(sprite_sheets, body_type) ? body_type : ""]" + if(!light_overlay_cache[cache_key]) + var/use_icon = LAZYACCESS(sprite_sheets, body_type) || 'icons/mob/light_overlays.dmi' + light_overlay_cache[cache_key] = image(icon = use_icon, icon_state = "[light_overlay]") + + else if(helmet_light) + cut_overlay(helmet_light) + helmet_light = null + + user.update_inv_head() //Will redraw the helmet with the light on the mob + +/obj/item/clothing/head/update_clothing_icon() + if (ismob(src.loc)) + var/mob/M = src.loc + M.update_inv_head() + +/////////////////////////////////////////////////////////////////////// +//Mask +/obj/item/clothing/mask + name = "mask" + icon = 'icons/inventory/face/item.dmi' + item_icons = list( + slot_l_hand_str = 'icons/mob/items/lefthand_masks.dmi', + slot_r_hand_str = 'icons/mob/items/righthand_masks.dmi', + ) + body_parts_covered = HEAD + slot_flags = SLOT_MASK + body_parts_covered = FACE|EYES + blood_sprite_state = "maskblood" + sprite_sheets = list( + SPECIES_TESHARI = 'icons/inventory/face/mob_teshari.dmi', + SPECIES_VOX = 'icons/inventory/face/mob_vox.dmi', + SPECIES_TAJ = 'icons/inventory/face/mob_tajaran.dmi', + SPECIES_UNATHI = 'icons/inventory/face/mob_unathi.dmi' + ) + + var/voicechange = 0 + var/list/say_messages + var/list/say_verbs + + drop_sound = "generic_drop" + pickup_sound = "generic_pickup" + +/obj/item/clothing/mask/update_clothing_icon() + if (ismob(src.loc)) + var/mob/M = src.loc + M.update_inv_wear_mask() + +/obj/item/clothing/mask/proc/filter_air(datum/gas_mixture/air) + return + +/////////////////////////////////////////////////////////////////////// +//Shoes +/obj/item/clothing/shoes + name = "shoes" + icon = 'icons/inventory/feet/item.dmi' + item_icons = list( + slot_l_hand_str = 'icons/mob/items/lefthand_shoes.dmi', + slot_r_hand_str = 'icons/mob/items/righthand_shoes.dmi', + ) + desc = "Comfortable-looking shoes." + gender = PLURAL //Carn: for grammarically correct text-parsing + siemens_coefficient = 0.9 + body_parts_covered = FEET + slot_flags = SLOT_FEET + blood_sprite_state = "shoeblood" + + var/can_hold_knife = 0 + var/obj/item/holding + + var/shoes_under_pants = 0 + + var/water_speed = 0 //Speed boost/decrease in water, lower/negative values mean more speed + var/snow_speed = 0 //Speed boost/decrease on snow, lower/negative values mean more speed + var/rock_climbing = FALSE // If true, allows climbing cliffs with clickdrag. + + var/step_volume_mod = 1 //How quiet or loud footsteps in this shoe are + + permeability_coefficient = 0.50 + slowdown = SHOES_SLOWDOWN + force = 2 + var/overshoes = 0 + species_restricted = list("exclude",SPECIES_TESHARI, SPECIES_VOX) + sprite_sheets = list( + SPECIES_TESHARI = 'icons/inventory/feet/mob_teshari.dmi', + SPECIES_VOX = 'icons/inventory/feet/mob_vox.dmi' + ) + drop_sound = 'sound/items/drop/shoes.ogg' + pickup_sound = 'sound/items/pickup/shoes.ogg' + +/obj/item/clothing/shoes/proc/draw_knife() + set name = "Draw Boot Knife" + set desc = "Pull out your boot knife." + set category = "IC" + set src in usr + + if(usr.stat || usr.restrained() || usr.incapacitated()) + return + + holding.forceMove(get_turf(usr)) + + if(usr.put_in_hands(holding)) + usr.visible_message("\The [usr] pulls a knife out of their boot!") + playsound(src, 'sound/weapons/holster/sheathout.ogg', 25) + holding = null + cut_overlay("[icon_state]_knife") + else + to_chat(usr, "Your need an empty, unbroken hand to do that.") + holding.forceMove(src) + + if(!holding) + verbs -= /obj/item/clothing/shoes/proc/draw_knife + + update_icon() + return + +/obj/item/clothing/shoes/attack_hand(var/mob/living/M) + if(can_hold_knife == 1 && holding && src.loc == M) + draw_knife() + return + ..() + +/obj/item/clothing/shoes/attackby(var/obj/item/I, var/mob/user) + if((can_hold_knife == 1) && (istype(I, /obj/item/weapon/material/shard) || \ + istype(I, /obj/item/weapon/material/butterfly) || \ + istype(I, /obj/item/weapon/material/kitchen/utensil) || \ + istype(I, /obj/item/weapon/material/knife/tacknife))) + if(holding) + to_chat(user, "\The [src] is already holding \a [holding].") + return + user.unEquip(I) + I.forceMove(src) + holding = I + user.visible_message("\The [user] shoves \the [I] into \the [src].") + verbs |= /obj/item/clothing/shoes/proc/draw_knife + update_icon() + else + return ..() + +/obj/item/clothing/shoes/verb/toggle_layer() + set name = "Switch Shoe Layer" + set category = "Object" + + if(shoes_under_pants == -1) + to_chat(usr, "\The [src] cannot be worn above your suit!") + return + shoes_under_pants = !shoes_under_pants + update_icon() + +/obj/item/clothing/shoes/update_icon() + . = ..() + if(holding) + add_overlay("[icon_state]_knife") + if(contaminated) + add_overlay(contamination_overlay) + if(gurgled) //VOREStation Edit Start + decontaminate() + gurgle_contaminate() //VOREStation Edit End + if(ismob(usr)) + var/mob/M = usr + M.update_inv_shoes() + +/obj/item/clothing/shoes/clean_blood() + update_icon() + return ..() + +/obj/item/clothing/shoes/proc/handle_movement(var/turf/walking, var/running) + if(prob(1) && !recent_squish) //VOREStation edit begin + recent_squish = 1 + spawn(100) + recent_squish = 0 + for(var/mob/living/M in contents) + var/emote = pick(inside_emotes) + to_chat(M,emote) //VOREStation edit end + return + +/obj/item/clothing/shoes/update_clothing_icon() + if (ismob(src.loc)) + var/mob/M = src.loc + M.update_inv_shoes() + + +/////////////////////////////////////////////////////////////////////// +//Suit +/obj/item/clothing/suit + icon = 'icons/inventory/suit/item.dmi' + item_icons = list( + slot_l_hand_str = 'icons/mob/items/lefthand_suits.dmi', + slot_r_hand_str = 'icons/mob/items/righthand_suits.dmi', + ) + name = "suit" + var/fire_resist = T0C+100 + body_parts_covered = UPPER_TORSO|LOWER_TORSO|ARMS|LEGS + allowed = list(/obj/item/weapon/tank/emergency/oxygen) + armor = list("melee" = 0, "bullet" = 0, "laser" = 0, "energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 0) + slot_flags = SLOT_OCLOTHING + var/blood_overlay_type = "suit" + blood_sprite_state = "suitblood" //Defaults to the suit's blood overlay, so that some blood renders instead of no blood. + + var/taurized = FALSE + siemens_coefficient = 0.9 + w_class = ITEMSIZE_NORMAL + preserve_item = 1 + equip_sound = 'sound/items/jumpsuit_equip.ogg' + + + sprite_sheets = list( + SPECIES_TESHARI = 'icons/inventory/suit/mob_teshari.dmi', + SPECIES_VOX = 'icons/inventory/suit/mob_vox.dmi' + ) + + valid_accessory_slots = (ACCESSORY_SLOT_OVER | ACCESSORY_SLOT_ARMBAND) + restricted_accessory_slots = (ACCESSORY_SLOT_ARMBAND) + +/obj/item/clothing/suit/update_clothing_icon() + if (ismob(src.loc)) + var/mob/M = src.loc + M.update_inv_wear_suit() + +/obj/item/clothing/suit/equipped(var/mob/user, var/slot) + if(ishuman(user)) + var/mob/living/carbon/human/H = user + var/taurtail = istaurtail(H.tail_style) + if((taurized && !taurtail) || (!taurized && taurtail)) + taurize(user, taurtail) + + return ..() + +/obj/item/clothing/suit/proc/taurize(var/mob/living/carbon/human/Taur, has_taur_tail = FALSE) + if(has_taur_tail) + var/datum/sprite_accessory/tail/taur/taurtail = Taur.tail_style + if(taurtail.suit_sprites && (get_worn_icon_state(slot_wear_suit_str) in cached_icon_states(taurtail.suit_sprites))) + icon_override = taurtail.suit_sprites + taurized = TRUE + // means that if a taur puts on an already taurized suit without a taur sprite + // for their taur type, but the previous taur type had a sprite, it stays + // taurized and they end up with that taur style which is funny + else + taurized = FALSE + + if(!taurized) + icon_override = initial(icon_override) + taurized = FALSE + +// Taur suits need to be shifted so its centered on their taur half. +/obj/item/clothing/suit/make_worn_icon(var/body_type,var/slot_name,var/inhands,var/default_icon,var/default_layer = 0,var/icon/clip_mask) + var/image/standing = ..() + if(taurized) //Special snowflake var on suits + standing.pixel_x = -16 + standing.layer = BODY_LAYER + 15 // 15 is above tail layer, so will not be covered by taurbody. + return standing + +/obj/item/clothing/suit/apply_accessories(var/image/standing) + if(LAZYLEN(accessories) && taurized) + for(var/obj/item/clothing/accessory/A in accessories) + var/image/I = new(A.get_mob_overlay()) + I.pixel_x = 16 //Opposite of the pixel_x on the suit (-16) from taurization to cancel it out and puts the accessory in the correct place on the body. + standing.add_overlay(I) + else + return ..() + + +/////////////////////////////////////////////////////////////////////// +//Under clothing +/obj/item/clothing/under + icon = 'icons/inventory/uniform/item.dmi' + item_icons = list( + slot_l_hand_str = 'icons/mob/items/lefthand_uniforms.dmi', + slot_r_hand_str = 'icons/mob/items/righthand_uniforms.dmi', + ) + name = "under" + body_parts_covered = UPPER_TORSO|LOWER_TORSO|LEGS|ARMS + permeability_coefficient = 0.90 + slot_flags = SLOT_ICLOTHING + armor = list(melee = 0, bullet = 0, laser = 0,energy = 0, bomb = 0, bio = 0, rad = 0) + equip_sound = 'sound/items/jumpsuit_equip.ogg' + w_class = ITEMSIZE_NORMAL + show_messages = 1 + blood_sprite_state = "uniformblood" + + var/has_sensor = 1 //For the crew computer 2 = unable to change mode + var/sensor_mode = 0 + /* + 1 = Report living/dead + 2 = Report detailed damages + 3 = Report location + */ + var/displays_id = 1 + var/rolled_down = -1 //0 = unrolled, 1 = rolled, -1 = cannot be toggled + var/rolled_sleeves = -1 //0 = unrolled, 1 = rolled, -1 = cannot be toggled + sprite_sheets = list( + SPECIES_TESHARI = 'icons/inventory/uniform/mob_teshari.dmi', + SPECIES_VOX = 'icons/inventory/uniform/mob_vox.dmi' + ) + + //convenience var for defining the icon state for the overlay used when the clothing is worn. + //Also used by rolling/unrolling. + var/worn_state = null + valid_accessory_slots = (\ + ACCESSORY_SLOT_UTILITY\ + |ACCESSORY_SLOT_WEAPON\ + |ACCESSORY_SLOT_ARMBAND\ + |ACCESSORY_SLOT_DECOR\ + |ACCESSORY_SLOT_MEDAL\ + |ACCESSORY_SLOT_INSIGNIA\ + |ACCESSORY_SLOT_TIE\ + |ACCESSORY_SLOT_RANK\ + |ACCESSORY_SLOT_DEPT\ + |ACCESSORY_SLOT_OVER) + restricted_accessory_slots = (\ + ACCESSORY_SLOT_UTILITY\ + |ACCESSORY_SLOT_WEAPON\ + |ACCESSORY_SLOT_ARMBAND\ + |ACCESSORY_SLOT_TIE\ + |ACCESSORY_SLOT_RANK\ + |ACCESSORY_SLOT_DEPT\ + |ACCESSORY_SLOT_OVER) + + var/icon/rolled_down_icon = 'icons/inventory/uniform/mob_rolled_down.dmi' + var/icon/rolled_down_sleeves_icon = 'icons/inventory/uniform/mob_sleeves_rolled.dmi' + +/obj/item/clothing/under/attack_hand(var/mob/user) + if(LAZYLEN(accessories)) + ..() + if ((ishuman(usr) || issmall(usr)) && src.loc == user) + return + ..() + +/obj/item/clothing/under/New() + ..() + if(worn_state) + LAZYSET(item_state_slots, slot_w_uniform_str, worn_state) + else + worn_state = icon_state + + //autodetect rollability + if(rolled_down < 0) + if(("[worn_state]_d" in cached_icon_states(icon)) || (worn_state in cached_icon_states(rolled_down_icon)) || ("[worn_state]_d" in cached_icon_states(icon_override))) + rolled_down = 0 + + if(rolled_down == -1) + verbs -= /obj/item/clothing/under/verb/rollsuit + if(rolled_sleeves == -1) + verbs -= /obj/item/clothing/under/verb/rollsleeves + +/obj/item/clothing/under/proc/update_rolldown_status() + var/mob/living/carbon/human/H + if(istype(src.loc, /mob/living/carbon/human)) + H = src.loc + + var/icon/under_icon + if(icon_override) + under_icon = icon_override + else if(H && LAZYACCESS(sprite_sheets, H.species.get_bodytype(H))) + under_icon = sprite_sheets[H.species.get_bodytype(H)] + else if(LAZYACCESS(item_icons, slot_w_uniform_str)) + under_icon = item_icons[slot_w_uniform_str] + else if (worn_state in cached_icon_states(rolled_down_icon)) + under_icon = rolled_down_icon + + // The _s is because the icon update procs append it. + if((under_icon == rolled_down_icon && ("[worn_state]" in cached_icon_states(under_icon))) || ("[worn_state]_d" in cached_icon_states(under_icon))) + if(rolled_down != 1) + rolled_down = 0 + else + rolled_down = -1 + if(H) update_clothing_icon() + +/obj/item/clothing/under/proc/update_rollsleeves_status() + var/mob/living/carbon/human/H + if(istype(src.loc, /mob/living/carbon/human)) + H = src.loc + + var/icon/under_icon + if(icon_override) + under_icon = icon_override + else if(H && LAZYACCESS(sprite_sheets, H.species.get_bodytype(H))) + under_icon = sprite_sheets[H.species.get_bodytype(H)] + else if(LAZYACCESS(item_icons, slot_w_uniform_str)) + under_icon = item_icons[slot_w_uniform_str] + else if (worn_state in cached_icon_states(rolled_down_sleeves_icon)) + under_icon = rolled_down_sleeves_icon + else + under_icon = new /icon(INV_W_UNIFORM_DEF_ICON) + + // The _s is because the icon update procs append it. + if((under_icon == rolled_down_sleeves_icon && ("[worn_state]" in cached_icon_states(under_icon))) || ("[worn_state]_r" in cached_icon_states(under_icon))) + if(rolled_sleeves != 1) + rolled_sleeves = 0 + else + rolled_sleeves = -1 + if(H) update_clothing_icon() + +/obj/item/clothing/under/update_clothing_icon() + if (ismob(src.loc)) + var/mob/M = src.loc + M.update_inv_w_uniform() + + set_clothing_index() + + +/obj/item/clothing/under/examine(mob/user) + . = ..() + switch(src.sensor_mode) + if(0) + . += "Its sensors appear to be disabled." + if(1) + . += "Its binary life sensors appear to be enabled." + if(2) + . += "Its vital tracker appears to be enabled." + if(3) + . += "Its vital tracker and tracking beacon appear to be enabled." + +/obj/item/clothing/under/proc/set_sensors(mob/usr as mob) + var/mob/M = usr + if (istype(M, /mob/observer)) return + if (usr.stat || usr.restrained()) return + if(has_sensor >= 2) + to_chat(usr, "The controls are locked.") + return 0 + if(has_sensor <= 0) + to_chat(usr, "This suit does not have any sensors.") + return 0 + + var/list/modes = list("Off", "Binary sensors", "Vitals tracker", "Tracking beacon") + var/switchMode = tgui_input_list(usr, "Select a sensor mode:", "Suit Sensor Mode", modes) + if(get_dist(usr, src) > 1) + to_chat(usr, "You have moved too far away.") + return + sensor_mode = modes.Find(switchMode) - 1 + + if (src.loc == usr) + switch(sensor_mode) + if(0) + usr.visible_message("[usr] adjusts their sensors.", "You disable your suit's remote sensing equipment.") + if(1) + usr.visible_message("[usr] adjusts their sensors.", "Your suit will now report whether you are live or dead.") + if(2) + usr.visible_message("[usr] adjusts their sensors.", "Your suit will now report your vital lifesigns.") + if(3) + usr.visible_message("[usr] adjusts their sensors.", "Your suit will now report your vital lifesigns as well as your coordinate position.") + + else if (istype(src.loc, /mob)) + usr.visible_message("[usr] adjusts [src.loc]'s sensors.", "You adjust [src.loc]'s sensors.") + +/obj/item/clothing/under/verb/toggle() + set name = "Toggle Suit Sensors" + set category = "Object" + set src in usr + set_sensors(usr) + +/obj/item/clothing/under/verb/rollsuit() + set name = "Roll Down Jumpsuit" + set category = "Object" + set src in usr + if(!istype(usr, /mob/living)) return + if(usr.stat) return + + update_rolldown_status() + if(rolled_down == -1) + to_chat(usr, "You cannot roll down [src]!") + return + if((rolled_sleeves == 1) && !(rolled_down)) + rolled_sleeves = 0 + + rolled_down = !rolled_down + if(rolled_down) + body_parts_covered = initial(body_parts_covered) + body_parts_covered &= ~(UPPER_TORSO|ARMS) + if(worn_state in cached_icon_states(rolled_down_icon)) + icon_override = rolled_down_icon + LAZYSET(item_state_slots, slot_w_uniform_str, worn_state) + else + LAZYSET(item_state_slots, slot_w_uniform_str, "[worn_state]_d") + + to_chat(usr, "You roll down your [src].") + else + body_parts_covered = initial(body_parts_covered) + if(icon_override == rolled_down_icon) + icon_override = initial(icon_override) + LAZYSET(item_state_slots, slot_w_uniform_str, worn_state) + to_chat(usr, "You roll up your [src].") + update_clothing_icon() + +/obj/item/clothing/under/verb/rollsleeves() + set name = "Roll Up Sleeves" + set category = "Object" + set src in usr + if(!istype(usr, /mob/living)) return + if(usr.stat) return + + update_rollsleeves_status() + if(rolled_sleeves == -1) + to_chat(usr, "You cannot roll up your [src]'s sleeves!") + return + if(rolled_down == 1) + to_chat(usr, "You must roll up your [src] first!") + return + + rolled_sleeves = !rolled_sleeves + if(rolled_sleeves) + body_parts_covered &= ~(ARMS) + if(worn_state in cached_icon_states(rolled_down_sleeves_icon)) + icon_override = rolled_down_sleeves_icon + LAZYSET(item_state_slots, slot_w_uniform_str, worn_state) + else + LAZYSET(item_state_slots, slot_w_uniform_str, "[worn_state]_r") + to_chat(usr, "You roll up your [src]'s sleeves.") + else + body_parts_covered = initial(body_parts_covered) + if(icon_override == rolled_down_sleeves_icon) + icon_override = initial(icon_override) + LAZYSET(item_state_slots, slot_w_uniform_str, worn_state) + to_chat(usr, "You roll down your [src]'s sleeves.") + update_clothing_icon() + +/obj/item/clothing/under/rank/New() + sensor_mode = pick(0,1,2,3) + ..() +>>>>>>> 9b03341473... Merge pull request #11162 from VOREStation/Arokha/cycletweaks diff --git a/code/modules/clothing/spacesuits/void/ert_vr.dm b/code/modules/clothing/spacesuits/void/ert_vr.dm index 6dd1c3b7d4..47094c4f98 100644 --- a/code/modules/clothing/spacesuits/void/ert_vr.dm +++ b/code/modules/clothing/spacesuits/void/ert_vr.dm @@ -239,4 +239,9 @@ SPECIES_ALRAUNE = 'icons/inventory/head/item_vr.dmi', SPECIES_ZADDAT = 'icons/inventory/head/item_vr.dmi' ) +<<<<<<< HEAD sprite_sheets_refit = list() //have to nullify this as well just to be thorough +||||||| parent of 9b03341473... Merge pull request #11162 from VOREStation/Arokha/cycletweaks + sprite_sheets_refit = list() //have to nullify this as well just to be thorough +======= +>>>>>>> 9b03341473... Merge pull request #11162 from VOREStation/Arokha/cycletweaks diff --git a/code/modules/clothing/spacesuits/void/void.dm b/code/modules/clothing/spacesuits/void/void.dm index 9d1f4e7c90..a47fd885cd 100644 --- a/code/modules/clothing/spacesuits/void/void.dm +++ b/code/modules/clothing/spacesuits/void/void.dm @@ -14,18 +14,8 @@ //Species-specific stuff. species_restricted = list("Human", "Promethean") - sprite_sheets_refit = list( - SPECIES_UNATHI = 'icons/inventory/head/mob_unathi.dmi', - SPECIES_TAJ = 'icons/inventory/head/mob_tajaran.dmi', - SPECIES_SKRELL = 'icons/inventory/head/mob_skrell.dmi' - //Teshari have a general sprite sheet defined in modules/clothing/clothing.dm - ) - sprite_sheets_obj = list( - SPECIES_UNATHI = 'icons/inventory/head/item_unathi.dmi', - SPECIES_TAJ = 'icons/inventory/head/item_tajaran.dmi', - SPECIES_SKRELL = 'icons/inventory/head/item_skrell.dmi', - SPECIES_TESHARI = 'icons/inventory/head/item_teshari.dmi' - ) + sprite_sheets = VR_SPECIES_SPRITE_SHEETS_HEAD_MOB + sprite_sheets_obj = VR_SPECIES_SPRITE_SHEETS_HEAD_ITEM light_overlay = "helmet_light" var/no_cycle = FALSE //stop this item from being put in a cycler @@ -44,18 +34,8 @@ max_pressure_protection = 10 * ONE_ATMOSPHERE species_restricted = list("Human", SPECIES_SKRELL, "Promethean") - sprite_sheets_refit = list( - SPECIES_UNATHI = 'icons/inventory/suit/mob_unathi.dmi', - SPECIES_TAJ = 'icons/inventory/suit/mob_tajaran.dmi', - SPECIES_SKRELL = 'icons/inventory/suit/mob_skrell.dmi' - //Teshari have a general sprite sheet defined in modules/clothing/clothing.dm - ) - sprite_sheets_obj = list( - SPECIES_UNATHI = 'icons/inventory/suit/item_unathi.dmi', - SPECIES_TAJ = 'icons/inventory/suit/item_tajaran.dmi', - SPECIES_SKRELL = 'icons/inventory/suit/item_skrell.dmi', - SPECIES_TESHARI = 'icons/inventory/suit/item_teshari.dmi' - ) + sprite_sheets = VR_SPECIES_SPRITE_SHEETS_SUIT_MOB + sprite_sheets_obj = VR_SPECIES_SPRITE_SHEETS_SUIT_ITEM //Breach thresholds, should ideally be inherited by most (if not all) voidsuits. //With 0.2 resiliance, will reach 10 breach damage after 3 laser carbine blasts or 8 smg hits. diff --git a/code/modules/clothing/spacesuits/void/void_vr.dm b/code/modules/clothing/spacesuits/void/void_vr.dm index eb78925427..4f166e61e8 100644 --- a/code/modules/clothing/spacesuits/void/void_vr.dm +++ b/code/modules/clothing/spacesuits/void/void_vr.dm @@ -7,20 +7,10 @@ /obj/item/clothing/head/helmet/space/void species_restricted = list(SPECIES_HUMAN, SPECIES_RAPALA, SPECIES_VASILISSAN, SPECIES_ALRAUNE, SPECIES_PROMETHEAN, SPECIES_XENOCHIMERA) - sprite_sheets = VR_SPECIES_SPRITE_SHEETS_HEAD_MOB - sprite_sheets_obj = VR_SPECIES_SPRITE_SHEETS_HEAD_ITEM /obj/item/clothing/suit/space/void species_restricted = list(SPECIES_HUMAN, SPECIES_SKRELL, SPECIES_RAPALA, SPECIES_VASILISSAN, SPECIES_ALRAUNE, SPECIES_PROMETHEAN, SPECIES_XENOCHIMERA) - sprite_sheets = VR_SPECIES_SPRITE_SHEETS_SUIT_MOB - sprite_sheets_obj = VR_SPECIES_SPRITE_SHEETS_SUIT_ITEM - // This is a hack to prevent the item_state variable on the suits from taking effect - // when the item is equipped in outer clothing slot. - // This variable is normally used to set the icon_override when the suit is refitted, - // however the species spritesheet now means we no longer need that anyway! - sprite_sheets_refit = list() - /obj/item/clothing/head/helmet/space/void/heck name = "\improper H.E.C.K. helmet" desc = "Hostile Environiment Cross-Kinetic Helmet: A helmet designed to withstand the wide variety of hazards from \[REDACTED\]. It wasn't enough for its last owner." @@ -106,7 +96,6 @@ default_worn_icon = 'icons/inventory/suit/mob_vr.dmi' sprite_sheets = ALL_VR_SPRITE_SHEETS_SUIT_MOB sprite_sheets_obj = null - sprite_sheets_refit = null /obj/item/clothing/suit/space/void/autolok/Initialize() . = ..() @@ -162,4 +151,11 @@ default_worn_icon = 'icons/inventory/head/mob_vr.dmi' sprite_sheets = ALL_VR_SPRITE_SHEETS_HEAD_MOB sprite_sheets_obj = null +<<<<<<< HEAD sprite_sheets_refit = null +||||||| parent of 9b03341473... Merge pull request #11162 from VOREStation/Arokha/cycletweaks + sprite_sheets_refit = null + +======= + +>>>>>>> 9b03341473... Merge pull request #11162 from VOREStation/Arokha/cycletweaks diff --git a/code/modules/clothing/spacesuits/void/wizard.dm b/code/modules/clothing/spacesuits/void/wizard.dm index 7dab89d1d7..bcef9752ac 100644 --- a/code/modules/clothing/spacesuits/void/wizard.dm +++ b/code/modules/clothing/spacesuits/void/wizard.dm @@ -7,7 +7,6 @@ unacidable = TRUE //No longer shall our kind be foiled by lone chemists with spray bottles! armor = list(melee = 40, bullet = 20, laser = 20,energy = 20, bomb = 35, bio = 100, rad = 60) siemens_coefficient = 0.7 - sprite_sheets_refit = null sprite_sheets_obj = null wizard_garb = 1 @@ -20,6 +19,5 @@ unacidable = TRUE armor = list(melee = 40, bullet = 20, laser = 20,energy = 20, bomb = 35, bio = 100, rad = 60) siemens_coefficient = 0.7 - sprite_sheets_refit = null sprite_sheets_obj = null wizard_garb = 1 From 6b785cb0deec3f22cbc5a5029e0065fe7fef0336 Mon Sep 17 00:00:00 2001 From: Novacat <35587478+Novacat@users.noreply.github.com> Date: Tue, 20 Jul 2021 09:12:26 -0400 Subject: [PATCH 08/34] Merge pull request #11174 from Very-Soft/smoletweak Smole gateway tweak --- code/modules/awaymissions/gateway.dm | 2 ++ 1 file changed, 2 insertions(+) diff --git a/code/modules/awaymissions/gateway.dm b/code/modules/awaymissions/gateway.dm index 1fa45f6a10..9e8967732e 100644 --- a/code/modules/awaymissions/gateway.dm +++ b/code/modules/awaymissions/gateway.dm @@ -176,6 +176,8 @@ GLOBAL_DATUM(gateway_station, /obj/machinery/gateway/centerstation) //VOREStation Addition Start: Abduction! if(istype(M, /mob/living) && dest.abductor) var/mob/living/L = M + if(L.nutrition > 500) + L.nutrition = 500 //If the aim is to negate people overpreparing, then they shouldn't be able to stuff themselves full of food either. //Situations to get the mob out of if(L.buckled) L.buckled.unbuckle_mob() From 60bc7333ea2def8ebe21408ab9de8cb74b8ec4db Mon Sep 17 00:00:00 2001 From: Aronai Sieyes Date: Tue, 20 Jul 2021 10:42:20 -0400 Subject: [PATCH 10/34] Merge pull request #11168 from Heroman3003/emptylines Fixes some more potential issues with empty lines on examine with pAIs --- code/modules/vore/eating/living_vr.dm | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/code/modules/vore/eating/living_vr.dm b/code/modules/vore/eating/living_vr.dm index d69ccb25b9..a5bd3eff04 100644 --- a/code/modules/vore/eating/living_vr.dm +++ b/code/modules/vore/eating/living_vr.dm @@ -319,8 +319,11 @@ var/list/message_list = list() for (var/belly in vore_organs) var/obj/belly/B = belly - message_list += B.get_examine_msg() - message_list += B.get_examine_msg_absorbed() + var/bellymessage = B.get_examine_msg() + if(bellymessage) message_list += bellymessage + + bellymessage = B.get_examine_msg_absorbed() + if(bellymessage) message_list += bellymessage return message_list From 66669af98db6427f5c34fcb10aec2b0cbea38788 Mon Sep 17 00:00:00 2001 From: Aronai Sieyes Date: Tue, 20 Jul 2021 10:45:40 -0400 Subject: [PATCH 12/34] Merge pull request #11170 from Heroman3003/thepurge Finishes purge of Industrial Expansion --- code/game/objects/random/mapping.dm | 12 ++++---- code/modules/mining/alloys.dm | 3 +- code/modules/mining/drilling/drill.dm | 10 +++---- code/modules/mining/drilling/scanner.dm | 8 +++--- code/modules/mining/mine_turfs.dm | 8 +++--- code/modules/mining/ore.dm | 8 +++--- code/modules/mining/ore_datum.dm | 7 +++-- code/modules/random_map/noise/ore.dm | 36 ++++++++++++------------ maps/expedition_vr/aerostat/_aerostat.dm | 3 +- maps/tether/tether_turfs.dm | 11 +------- 10 files changed, 49 insertions(+), 57 deletions(-) diff --git a/code/game/objects/random/mapping.dm b/code/game/objects/random/mapping.dm index 06a5e75fd1..f61567d6de 100644 --- a/code/game/objects/random/mapping.dm +++ b/code/game/objects/random/mapping.dm @@ -464,7 +464,7 @@ /obj/random/multiple/ore_pile/item_to_spawn() return pick( - prob(10);list( + /*prob(10);list( /obj/item/weapon/ore/bauxite, /obj/item/weapon/ore/bauxite, /obj/item/weapon/ore/bauxite, @@ -475,7 +475,7 @@ /obj/item/weapon/ore/bauxite, /obj/item/weapon/ore/bauxite, /obj/item/weapon/ore/bauxite - ), + ),*/ prob(10);list( /obj/item/weapon/ore/coal, /obj/item/weapon/ore/coal, @@ -488,7 +488,7 @@ /obj/item/weapon/ore/coal, /obj/item/weapon/ore/coal ), - prob(10);list( + /*prob(10);list( /obj/item/weapon/ore/copper, /obj/item/weapon/ore/copper, /obj/item/weapon/ore/copper, @@ -499,7 +499,7 @@ /obj/item/weapon/ore/copper, /obj/item/weapon/ore/copper, /obj/item/weapon/ore/copper - ), + ),*/ prob(3);list( /obj/item/weapon/ore/diamond, /obj/item/weapon/ore/diamond, @@ -598,11 +598,11 @@ prob(2);list( /obj/item/weapon/ore/verdantium, /obj/item/weapon/ore/verdantium - ), + ),/* prob(2);list( /obj/item/weapon/ore/void_opal, /obj/item/weapon/ore/void_opal - ), + ),*/ ) /obj/random/multiple/corp_crate diff --git a/code/modules/mining/alloys.dm b/code/modules/mining/alloys.dm index 219a2becdb..4ca7e64571 100644 --- a/code/modules/mining/alloys.dm +++ b/code/modules/mining/alloys.dm @@ -44,7 +44,7 @@ "sand" = 2 ) product = /obj/item/stack/material/glass/phoronglass - +/* /datum/alloy/bronze metaltag = "bronze" requires = list( @@ -52,3 +52,4 @@ "tin" = 1 ) product = /obj/item/stack/material/bronze +*/ \ No newline at end of file diff --git a/code/modules/mining/drilling/drill.dm b/code/modules/mining/drilling/drill.dm index f1b8816c8a..b8618ccf86 100644 --- a/code/modules/mining/drilling/drill.dm +++ b/code/modules/mining/drilling/drill.dm @@ -28,9 +28,9 @@ "hydrogen" = /obj/item/weapon/ore/hydrogen, "silicates" = /obj/item/weapon/ore/glass, "carbon" = /obj/item/weapon/ore/coal, - "copper" = /obj/item/weapon/ore/copper, + // "copper" = /obj/item/weapon/ore/copper, // "tin" = /obj/item/weapon/ore/tin, - "bauxite" = /obj/item/weapon/ore/bauxite, + // "bauxite" = /obj/item/weapon/ore/bauxite, "rutile" = /obj/item/weapon/ore/rutile ) @@ -44,14 +44,14 @@ // Found with an advanced laser. exotic_drilling >= 1 var/list/ore_types_uncommon = list( MAT_MARBLE = /obj/item/weapon/ore/marble, - "painite" = /obj/item/weapon/ore/painite, - "quartz" = /obj/item/weapon/ore/quartz, + //"painite" = /obj/item/weapon/ore/painite, + //"quartz" = /obj/item/weapon/ore/quartz, MAT_LEAD = /obj/item/weapon/ore/lead ) // Found with an ultra laser. exotic_drilling >= 2 var/list/ore_types_rare = list( - "void opal" = /obj/item/weapon/ore/void_opal, + //"void opal" = /obj/item/weapon/ore/void_opal, MAT_VERDANTIUM = /obj/item/weapon/ore/verdantium ) diff --git a/code/modules/mining/drilling/scanner.dm b/code/modules/mining/drilling/scanner.dm index 302216b8d4..9d6eea4607 100644 --- a/code/modules/mining/drilling/scanner.dm +++ b/code/modules/mining/drilling/scanner.dm @@ -41,13 +41,13 @@ var/ore_type switch(metal) - if("silicates", "carbon", "marble", "quartz") ore_type = "surface minerals" - if("hematite", "tin", "copper", "bauxite", "lead") ore_type = "industrial metals" + if("silicates", "carbon", "marble", /*"quartz"*/) ore_type = "surface minerals" + if("hematite", /*"tin", "copper", "bauxite",*/ "lead") ore_type = "industrial metals" if("gold", "silver", "rutile") ore_type = "precious metals" - if("diamond", "painite") ore_type = "precious gems" + if("diamond", /*"painite"*/) ore_type = "precious gems" if("uranium") ore_type = "nuclear fuel" if("phoron", "osmium", "hydrogen") ore_type = "exotic matter" - if("verdantium", "void opal") ore_type = "anomalous matter" + if("verdantium", /*"void opal"*/) ore_type = "anomalous matter" if(ore_type) metals[ore_type] += T.resources[metal] diff --git a/code/modules/mining/mine_turfs.dm b/code/modules/mining/mine_turfs.dm index 9155f054a4..174fb7ad91 100644 --- a/code/modules/mining/mine_turfs.dm +++ b/code/modules/mining/mine_turfs.dm @@ -63,9 +63,9 @@ var/list/mining_overlay_cache = list() "verdantium" = /obj/item/weapon/ore/verdantium, "marble" = /obj/item/weapon/ore/marble, "lead" = /obj/item/weapon/ore/lead, - "copper" = /obj/item/weapon/ore/copper, +// "copper" = /obj/item/weapon/ore/copper, // "tin" = /obj/item/weapon/ore/tin, - "bauxite" = /obj/item/weapon/ore/bauxite, +// "bauxite" = /obj/item/weapon/ore/bauxite, // "void opal" = /obj/item/weapon/ore/void_opal, // "painite" = /obj/item/weapon/ore/painite, // "quartz" = /obj/item/weapon/ore/quartz, @@ -689,10 +689,10 @@ var/list/mining_overlay_cache = list() var/mineral_name if(rare_ore) - mineral_name = pickweight(list("marble" = 5,/* "quartz" = 15,*/ "copper" = 10, /*"tin" = 5,*/ "bauxite" = 5, "uranium" = 15, "platinum" = 20, "hematite" = 15, "rutile" = 20, "carbon" = 15, "diamond" = 3, "gold" = 15, "silver" = 15, "phoron" = 25, "lead" = 5,/* "void opal" = 1,*/ "verdantium" = 2/*, "painite" = 1*/)) + mineral_name = pickweight(list("marble" = 5,/* "quartz" = 15, "copper" = 10, "tin" = 5, "bauxite" = 5*/, "uranium" = 15, "platinum" = 20, "hematite" = 15, "rutile" = 20, "carbon" = 15, "diamond" = 3, "gold" = 15, "silver" = 15, "phoron" = 25, "lead" = 5,/* "void opal" = 1,*/ "verdantium" = 2/*, "painite" = 1*/)) else - mineral_name = pickweight(list("marble" = 3,/* "quartz" = 10,*/ "copper" = 20, /*"tin" = 15,*/ "bauxite" = 15, "uranium" = 10, "platinum" = 10, "hematite" = 70, "rutile" = 15, "carbon" = 70, "diamond" = 2, "gold" = 10, "silver" = 10, "phoron" = 20, "lead" = 3,/* "void opal" = 1,*/ "verdantium" = 1/*, "painite" = 1*/)) + mineral_name = pickweight(list("marble" = 3,/* "quartz" = 10, "copper" = 20, "tin" = 15, "bauxite" = 15*/, "uranium" = 10, "platinum" = 10, "hematite" = 70, "rutile" = 15, "carbon" = 70, "diamond" = 2, "gold" = 10, "silver" = 10, "phoron" = 20, "lead" = 3,/* "void opal" = 1,*/ "verdantium" = 1/*, "painite" = 1*/)) if(mineral_name && (mineral_name in GLOB.ore_data)) mineral = GLOB.ore_data[mineral_name] diff --git a/code/modules/mining/ore.dm b/code/modules/mining/ore.dm index dc95d0e082..4fc2091b03 100644 --- a/code/modules/mining/ore.dm +++ b/code/modules/mining/ore.dm @@ -106,7 +106,7 @@ icon_state = "ore_lead" material = MAT_LEAD origin_tech = list(TECH_MATERIAL = 3) - +/* /obj/item/weapon/ore/copper name = "raw copper" icon_state = "ore_copper" @@ -121,12 +121,12 @@ name = "raw bauxite" icon_state = "ore_bauxite" material = "bauxite" - +*/ /obj/item/weapon/ore/rutile name = "raw rutile" icon_state = "ore_rutile" material = "rutile" - +/* /obj/item/weapon/ore/void_opal name = "raw void opal" icon_state = "ore_void_opal" @@ -141,7 +141,7 @@ name = "raw quartz" icon_state = "ore_quartz" material = "quartz" - +*/ /obj/item/weapon/ore/slag name = "Slag" desc = "Someone screwed up..." diff --git a/code/modules/mining/ore_datum.dm b/code/modules/mining/ore_datum.dm index 5a26dcf0fd..382e31b8bd 100644 --- a/code/modules/mining/ore_datum.dm +++ b/code/modules/mining/ore_datum.dm @@ -175,7 +175,7 @@ ore = /obj/item/weapon/ore/lead scan_icon = "mineral_rare" reagent = "lead" - +/* /ore/copper name = "copper" display_name = "copper" @@ -215,7 +215,7 @@ ore = /obj/item/weapon/ore/bauxite scan_icon = "mineral_common" reagent = "aluminum" - +*/ /ore/rutile name = "rutile" display_name = "rutile" @@ -225,7 +225,7 @@ alloy = 1 ore = /obj/item/weapon/ore/rutile scan_icon = "mineral_uncommon" - +/* /ore/painite name = "painite" display_name = "rough painite" @@ -243,3 +243,4 @@ spread_chance = 1 ore = /obj/item/weapon/ore/void_opal scan_icon = "mineral_rare" +*/ \ No newline at end of file diff --git a/code/modules/random_map/noise/ore.dm b/code/modules/random_map/noise/ore.dm index 4881154d60..112a01b493 100644 --- a/code/modules/random_map/noise/ore.dm +++ b/code/modules/random_map/noise/ore.dm @@ -64,13 +64,13 @@ T.resources["hydrogen"] = 0 T.resources["verdantium"] = 0 T.resources["lead"] = 0 - T.resources["copper"] = rand(RESOURCE_MID_MIN, RESOURCE_HIGH_MAX) - T.resources["tin"] = rand(RESOURCE_LOW_MIN, RESOURCE_MID_MAX) - T.resources["bauxite"] = rand(RESOURCE_LOW_MIN, RESOURCE_LOW_MAX) + //T.resources["copper"] = rand(RESOURCE_MID_MIN, RESOURCE_HIGH_MAX) + //T.resources["tin"] = rand(RESOURCE_LOW_MIN, RESOURCE_MID_MAX) + //T.resources["bauxite"] = rand(RESOURCE_LOW_MIN, RESOURCE_LOW_MAX) T.resources["rutile"] = 0 - T.resources["void opal"] = 0 - T.resources["quartz"] = 0 - T.resources["painite"] = 0 + //T.resources["void opal"] = 0 + //T.resources["quartz"] = 0 + //T.resources["painite"] = 0 else if(current_cell < deep_val) // Rare metals. T.resources["gold"] = rand(RESOURCE_MID_MIN, RESOURCE_MID_MAX) T.resources["silver"] = rand(RESOURCE_MID_MIN, RESOURCE_MID_MAX) @@ -83,13 +83,13 @@ T.resources["diamond"] = 0 T.resources["hematite"] = 0 T.resources["marble"] = 0 - T.resources["copper"] = 0 - T.resources["tin"] = rand(RESOURCE_MID_MIN, RESOURCE_MID_MAX) - T.resources["bauxite"] = 0 + //T.resources["copper"] = 0 + //T.resources["tin"] = rand(RESOURCE_MID_MIN, RESOURCE_MID_MAX) + //T.resources["bauxite"] = 0 T.resources["rutile"] = rand(RESOURCE_LOW_MIN, RESOURCE_MID_MAX) - T.resources["void opal"] = 0 - T.resources["quartz"] = 0 - T.resources["painite"] = 0 + //T.resources["void opal"] = 0 + //T.resources["quartz"] = 0 + //T.resources["painite"] = 0 else // Deep metals. T.resources["uranium"] = rand(RESOURCE_LOW_MIN, RESOURCE_LOW_MAX) T.resources["diamond"] = rand(RESOURCE_LOW_MIN, RESOURCE_LOW_MAX) @@ -102,13 +102,13 @@ T.resources["hematite"] = 0 T.resources["gold"] = 0 T.resources["silver"] = 0 - T.resources["copper"] = 0 - T.resources["tin"] = 0 - T.resources["bauxite"] = 0 + //T.resources["copper"] = 0 + //T.resources["tin"] = 0 + //T.resources["bauxite"] = 0 T.resources["rutile"] = rand(RESOURCE_MID_MIN, RESOURCE_HIGH_MAX) - T.resources["void opal"] = 0 - T.resources["quartz"] = 0 - T.resources["painite"] = 0 + //T.resources["void opal"] = 0 + //T.resources["quartz"] = 0 + //T.resources["painite"] = 0 return /datum/random_map/noise/ore/get_map_char(var/value) diff --git a/maps/expedition_vr/aerostat/_aerostat.dm b/maps/expedition_vr/aerostat/_aerostat.dm index 09b5eb3632..04d3b4ad82 100644 --- a/maps/expedition_vr/aerostat/_aerostat.dm +++ b/maps/expedition_vr/aerostat/_aerostat.dm @@ -133,7 +133,7 @@ VIRGO2_TURF_CREATE(/turf/simulated/mineral) if(mineral) return - var/mineral_name = pickweight(list("marble" = 5, "uranium" = 5, "platinum" = 5, "hematite" = 5, "carbon" = 5, "diamond" = 5, "gold" = 5, "silver" = 5, "lead" = 5, "verdantium" = 5, "rutile" = 10, "copper" = 5, "tin" = 5, "bauxite" = 5)) + var/mineral_name = pickweight(list("marble" = 5, "uranium" = 5, "platinum" = 5, "hematite" = 5, "carbon" = 5, "diamond" = 5, "gold" = 5, "silver" = 5, "lead" = 5, "verdantium" = 5, "rutile" = 20)) if(mineral_name && (mineral_name in GLOB.ore_data)) mineral = GLOB.ore_data[mineral_name] @@ -211,4 +211,3 @@ VIRGO2_TURF_CREATE(/turf/simulated/floor/hull) name = "V4 Outpost - Power Room" /area/tether_away/aerostat/surface/outpost/guardpost name = "V4 Outpost - Guard Post" - \ No newline at end of file diff --git a/maps/tether/tether_turfs.dm b/maps/tether/tether_turfs.dm index e10c6a5fe0..0bf0ef290f 100644 --- a/maps/tether/tether_turfs.dm +++ b/maps/tether/tether_turfs.dm @@ -69,10 +69,6 @@ VIRGO3B_TURF_CREATE(/turf/simulated/mineral/floor) "uranium" = 10, "platinum" = 10, "hematite" = 20, - "copper" = 8, -// "tin" = 4, - "bauxite" = 4, - "rutile" = 4, "carbon" = 20, "diamond" = 1, "gold" = 8, @@ -86,10 +82,6 @@ VIRGO3B_TURF_CREATE(/turf/simulated/mineral/floor) "uranium" = 5, "platinum" = 5, "hematite" = 35, - "copper" = 15, -// "tin" = 10, - "bauxite" = 10, - "rutile" = 10, "carbon" = 35, "gold" = 3, "silver" = 3, @@ -272,7 +264,7 @@ VIRGO3B_TURF_CREATE(/turf/simulated/mineral/floor) new_junction |= (1<<5) icon_state = "[base_icon_state]-[new_junction]" - + add_vis_overlay('icons/effects/effects.dmi', "white", plane = SPACE_PLANE, add_vis_flags = VIS_INHERIT_ID|VIS_UNDERLAY) /turf/space/v3b_midpoint/Initialize() @@ -283,4 +275,3 @@ VIRGO3B_TURF_CREATE(/turf/simulated/mineral/floor) . = ..() for(var/obj/effect/step_trigger/teleporter/planetary_fall/virgo3b/F in src) qdel(F) - \ No newline at end of file From cbb54c7c7e21d6d75fad35b517b446331f2c3db2 Mon Sep 17 00:00:00 2001 From: Aronai Sieyes Date: Tue, 20 Jul 2021 10:46:35 -0400 Subject: [PATCH 14/34] Merge pull request #11171 from Heroman3003/paifix Should allow pAI to resize uncapped in dorms (as well as any other user of Set Size) --- code/modules/vore/resizing/resize_vr.dm | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/code/modules/vore/resizing/resize_vr.dm b/code/modules/vore/resizing/resize_vr.dm index 3d7086f9c3..ec2aead7de 100644 --- a/code/modules/vore/resizing/resize_vr.dm +++ b/code/modules/vore/resizing/resize_vr.dm @@ -78,7 +78,7 @@ var/datum/component/resize_guard/guard = GetComponent(/datum/component/resize_guard) if(guard) qdel(guard) - + if(size_multiplier == new_size) return 1 @@ -143,7 +143,7 @@ var/nagmessage = "Adjust your mass to be a size between 25 to 200% (or 1% to 600% in dormitories). (DO NOT ABUSE)" var/new_size = input(nagmessage, "Pick a Size") as num|null if(size_range_check(new_size)) - resize(new_size/100) + resize(new_size/100, uncapped = has_large_resize_bounds(), ignore_prefs = TRUE) // I'm not entirely convinced that `src ? ADMIN_JMP(src) : "null"` here does anything // but just in case it does, I'm leaving the null-src checking message_admins("[key_name(src)] used the resize command in-game to be [new_size]% size. [src ? ADMIN_JMP(src) : "null"]") From 16673f8a2b76a32db569c4690a48802d47a454f7 Mon Sep 17 00:00:00 2001 From: Chompstation Bot Date: Tue, 20 Jul 2021 14:50:49 +0000 Subject: [PATCH 16/34] Adds xenochimera water breathing trait + refactors water breathing --- .../carbon/human/species/outsider/event.dm | 6 +----- .../carbon/human/species/shadekin/shadekin.dm | 4 +--- .../living/carbon/human/species/species.dm | 3 ++- .../carbon/human/species/station/alraune.dm | 4 +--- .../carbon/human/species/station/blank_vr.dm | 6 ------ .../carbon/human/species/station/station.dm | 5 ++--- .../human/species/station/station_vr.dm | 21 ++++++++++++------- .../species/station/traits_vr/positive.dm | 1 + .../species/station/xenochimera_trait_vr.dm | 11 +++++++++- 9 files changed, 31 insertions(+), 30 deletions(-) diff --git a/code/modules/mob/living/carbon/human/species/outsider/event.dm b/code/modules/mob/living/carbon/human/species/outsider/event.dm index f88768aa74..32c3314b0b 100644 --- a/code/modules/mob/living/carbon/human/species/outsider/event.dm +++ b/code/modules/mob/living/carbon/human/species/outsider/event.dm @@ -112,7 +112,6 @@ Variables you may want to make use of are: ) var/use_bodyshape = SPECIES_HUMAN - var/waterbreathing = 0 var/overcome_gravity = 0 var/hover = 0 @@ -199,7 +198,7 @@ Variables you may want to make use of are: /datum/species/event1/proc/toggle_cloning() flags ^= NO_SCAN - + /datum/species/event1/proc/toggle_defibbing() flags ^= NO_DEFIB @@ -215,9 +214,6 @@ Variables you may want to make use of are: /datum/species/event1/get_bodytype(var/mob/living/carbon/human/H) //Default to human sprites, if they're based on another species, var edit use_bodyshape to the correct thing in _defines/mobs.dm of the species you want to use. return use_bodyshape -/datum/species/event1/can_breathe_water() - return waterbreathing - /datum/species/event1/can_overcome_gravity(var/mob/living/carbon/human/H) return overcome_gravity diff --git a/code/modules/mob/living/carbon/human/species/shadekin/shadekin.dm b/code/modules/mob/living/carbon/human/species/shadekin/shadekin.dm index 5cf9fa8f73..2e589f3fbb 100644 --- a/code/modules/mob/living/carbon/human/species/shadekin/shadekin.dm +++ b/code/modules/mob/living/carbon/human/species/shadekin/shadekin.dm @@ -74,6 +74,7 @@ breath_type = null poison_type = null + water_breather = TRUE //They don't quite breathe vision_flags = SEE_SELF|SEE_MOBS appearance_flags = HAS_HAIR_COLOR | HAS_LIPS | HAS_SKIN_COLOR | HAS_EYE_COLOR | HAS_UNDERWEAR @@ -135,9 +136,6 @@ /datum/species/shadekin/handle_environment_special(var/mob/living/carbon/human/H) handle_shade(H) -/datum/species/shadekin/can_breathe_water() - return TRUE //they dont quite breathe - /datum/species/shadekin/add_inherent_verbs(var/mob/living/carbon/human/H) ..() add_shadekin_abilities(H) diff --git a/code/modules/mob/living/carbon/human/species/species.dm b/code/modules/mob/living/carbon/human/species/species.dm index d63681898d..b93a56b3db 100644 --- a/code/modules/mob/living/carbon/human/species/species.dm +++ b/code/modules/mob/living/carbon/human/species/species.dm @@ -132,6 +132,7 @@ var/breath_type = "oxygen" // Non-oxygen gas breathed, if any. var/poison_type = "phoron" // Poisonous air. var/exhale_type = "carbon_dioxide" // Exhaled gas type. + var/water_breather = FALSE var/body_temperature = 310.15 // Species will try to stabilize at this temperature. (also affects temperature processing) @@ -504,7 +505,7 @@ // Called when lying down on a water tile. /datum/species/proc/can_breathe_water() - return FALSE + return water_breather // Impliments different trails for species depending on if they're wearing shoes. /datum/species/proc/get_move_trail(var/mob/living/carbon/human/H) diff --git a/code/modules/mob/living/carbon/human/species/station/alraune.dm b/code/modules/mob/living/carbon/human/species/station/alraune.dm index e7151b9608..bb788ad5b3 100644 --- a/code/modules/mob/living/carbon/human/species/station/alraune.dm +++ b/code/modules/mob/living/carbon/human/species/station/alraune.dm @@ -24,6 +24,7 @@ breath_type = "oxygen" poison_type = "phoron" exhale_type = "oxygen" + water_breather = TRUE //eh, why not? Aquatic plants are a thing. // Heat and cold resistances are 20 degrees broader on the level 1 range, level 2 is default, level 3 is much weaker, halfway between L2 and normal L3. // Essentially, they can tolerate a broader range of comfortable temperatures, but suffer more at extremes. @@ -92,9 +93,6 @@ A_FRUIT = /obj/item/organ/internal/fruitgland, ) -/datum/species/alraune/can_breathe_water() - return TRUE //eh, why not? Aquatic plants are a thing. - /datum/species/alraune/handle_environment_special(var/mob/living/carbon/human/H) if(H.inStasisNow()) // if they're in stasis, they won't need this stuff. diff --git a/code/modules/mob/living/carbon/human/species/station/blank_vr.dm b/code/modules/mob/living/carbon/human/species/station/blank_vr.dm index af626ee68b..2962b30fc5 100644 --- a/code/modules/mob/living/carbon/human/species/station/blank_vr.dm +++ b/code/modules/mob/living/carbon/human/species/station/blank_vr.dm @@ -60,12 +60,6 @@ // Stub species overrides for shoving trait abilities into -//Called when face-down in the water or otherwise over their head. -// Return: TRUE for able to breathe fine in water. -/datum/species/custom/can_breathe_water() - return /datum/trait/positive/water_breather in traits - - //Called during handle_environment in Life() ticks. // Return: Not used. /datum/species/custom/handle_environment_special(var/mob/living/carbon/human/H) diff --git a/code/modules/mob/living/carbon/human/species/station/station.dm b/code/modules/mob/living/carbon/human/species/station/station.dm index 1bd96fae47..21a5efb14a 100644 --- a/code/modules/mob/living/carbon/human/species/station/station.dm +++ b/code/modules/mob/living/carbon/human/species/station/station.dm @@ -349,6 +349,8 @@ reagent_tag = IS_SKRELL allergens = ALLERGEN_MEAT|ALLERGEN_FISH|ALLERGEN_DAIRY|ALLERGEN_EGGS + water_breather = TRUE + has_limbs = list( BP_TORSO = list("path" = /obj/item/organ/external/chest), BP_GROIN = list("path" = /obj/item/organ/external/groin), @@ -363,9 +365,6 @@ BP_R_FOOT = list("path" = /obj/item/organ/external/foot/right) ) -/datum/species/skrell/can_breathe_water() - return TRUE - /datum/species/zaddat name = SPECIES_ZADDAT name_plural = "Zaddat" diff --git a/code/modules/mob/living/carbon/human/species/station/station_vr.dm b/code/modules/mob/living/carbon/human/species/station/station_vr.dm index 6b51d9db8a..03b9987385 100644 --- a/code/modules/mob/living/carbon/human/species/station/station_vr.dm +++ b/code/modules/mob/living/carbon/human/species/station/station_vr.dm @@ -112,13 +112,12 @@ spawn_flags = SPECIES_CAN_JOIN appearance_flags = HAS_HAIR_COLOR | HAS_LIPS | HAS_UNDERWEAR | HAS_SKIN_COLOR | HAS_EYE_COLOR + water_breather = TRUE + flesh_color = "#AFA59E" base_color = "#777777" blood_color = "#1D2CBF" -/datum/species/akula/can_breathe_water() - return TRUE // Surprise, SHERKS. - /datum/species/nevrean name = SPECIES_NEVREAN name_plural = "Nevreans" @@ -323,7 +322,7 @@ /datum/species/zaddat spawn_flags = SPECIES_CAN_JOIN min_age = 18 - inherent_verbs = list(/mob/living/carbon/human/proc/tie_hair) //I don't even know if Zaddat can HAVE hair, but here we are, I suppose + inherent_verbs = list(/mob/living/carbon/human/proc/tie_hair) //I don't even know if Zaddat can HAVE hair, but here we are, I suppose gluttonous = 0 genders = list(MALE, FEMALE, PLURAL, NEUTER) descriptors = list() @@ -373,8 +372,16 @@ /datum/species/vox gluttonous = 0 +<<<<<<< HEAD spawn_flags = SPECIES_CAN_JOIN | SPECIES_IS_WHITELISTED | SPECIES_WHITELIST_SELECTABLE //CHOMPStation Edit min_age = 18 +||||||| parent of e5c49f772b... Merge pull request #11173 from Heroman3003/waterbreath + spawn_flags = SPECIES_CAN_JOIN | SPECIES_IS_WHITELISTED | SPECIES_WHITELIST_SELECTABLE + min_age = 18 +======= + spawn_flags = SPECIES_CAN_JOIN | SPECIES_IS_WHITELISTED | SPECIES_WHITELIST_SELECTABLE + min_age = 18 +>>>>>>> e5c49f772b... Merge pull request #11173 from Heroman3003/waterbreath inherent_verbs = list(/mob/living/carbon/human/proc/tie_hair) //Get ya quills done did icobase = 'icons/mob/human_races/r_vox_old.dmi' deform = 'icons/mob/human_races/r_def_vox_old.dmi' @@ -504,6 +511,7 @@ breath_type = null poison_type = null + water_breather = TRUE //They do not quite breathe... appearance_flags = HAS_HAIR_COLOR | HAS_LIPS | HAS_SKIN_COLOR | HAS_UNDERWEAR @@ -534,12 +542,9 @@ BP_R_FOOT = list("path" = /obj/item/organ/external/foot/right/crewkin) ) -/datum/species/shadekin/get_bodytype() +/datum/species/crew_shadekin/get_bodytype() return SPECIES_SHADEKIN -/datum/species/shadekin/can_breathe_water() - return TRUE //they dont quite breathe - //These species are not really species but are just there for custom species selection /datum/species/fl_zorren diff --git a/code/modules/mob/living/carbon/human/species/station/traits_vr/positive.dm b/code/modules/mob/living/carbon/human/species/station/traits_vr/positive.dm index 171ded07f8..8e068aee2a 100644 --- a/code/modules/mob/living/carbon/human/species/station/traits_vr/positive.dm +++ b/code/modules/mob/living/carbon/human/species/station/traits_vr/positive.dm @@ -209,3 +209,4 @@ name = "Water Breather" desc = "You can breathe under water." cost = 1 + var_changes = list("water_breather" = 1) diff --git a/code/modules/mob/living/carbon/human/species/station/xenochimera_trait_vr.dm b/code/modules/mob/living/carbon/human/species/station/xenochimera_trait_vr.dm index 2065d91cc4..bd1eb55172 100644 --- a/code/modules/mob/living/carbon/human/species/station/xenochimera_trait_vr.dm +++ b/code/modules/mob/living/carbon/human/species/station/xenochimera_trait_vr.dm @@ -1,4 +1,4 @@ -/* +/* ** For now, these are just neutral traits for Xenochimera only to take. ** These are only traits that they should reasonably be able to evolve to acquire themselves. ** I won't add the resistances though because those are kinda lame for a 'chimera to take! @@ -49,3 +49,12 @@ cost = 0 category = 0 custom_only = FALSE + +/datum/trait/positive/water_breather/xenochimera + sort = TRAIT_SORT_SPECIES + allowed_species = list(SPECIES_XENOCHIMERA) + name = "Xenochimera: Water Breather" + desc = "You can breathe under water." + cost = 0 + category = 0 + custom_only = FALSE \ No newline at end of file From 7437154387f5328f8f69ab49d5e903cf013c12ef Mon Sep 17 00:00:00 2001 From: Chompstation Bot Date: Tue, 20 Jul 2021 15:03:10 +0000 Subject: [PATCH 17/34] Allows hiding mobs/areas from observers without completely forbidding --- code/game/objects/effects/landmarks.dm | 9 + code/modules/mob/dead/observer/observer.dm | 2000 ++++++++++++++++++++ maps/~map_system/maps.dm | 1 + 3 files changed, 2010 insertions(+) diff --git a/code/game/objects/effects/landmarks.dm b/code/game/objects/effects/landmarks.dm index 3a60ef5480..82070a520a 100644 --- a/code/game/objects/effects/landmarks.dm +++ b/code/game/objects/effects/landmarks.dm @@ -123,6 +123,15 @@ else log_error("[type] mapped in but no using_map") +/obj/effect/landmark/hidden_level + delete_me = 1 +/obj/effect/landmark/hidden_level/Initialize() + . = ..() + if(using_map) + using_map.hidden_levels |= z + else + log_error("[type] mapped in but no using_map") + /obj/effect/landmark/virtual_reality name = "virtual_reality" diff --git a/code/modules/mob/dead/observer/observer.dm b/code/modules/mob/dead/observer/observer.dm index 9e80b75da5..7566448252 100644 --- a/code/modules/mob/dead/observer/observer.dm +++ b/code/modules/mob/dead/observer/observer.dm @@ -1,3 +1,4 @@ +<<<<<<< HEAD /mob/observer name = "observer" desc = "This shouldn't appear" @@ -994,3 +995,2002 @@ This is the proc mobs get to turn into a ghost. Forked from ghostize due to comp set name = "Respawn" set category = "Ghost" src.abandon_mob() +||||||| parent of bb3b3d6214... Merge pull request #11176 from Very-Soft/ghosties +/mob/observer + name = "observer" + desc = "This shouldn't appear" + density = FALSE + vis_flags = NONE + +/mob/observer/dead + name = "ghost" + desc = "It's a g-g-g-g-ghooooost!" //jinkies! + icon = 'icons/mob/ghost.dmi' + icon_state = "ghost" + stat = DEAD + canmove = 0 + blinded = 0 + anchored = TRUE // don't get pushed around + + var/can_reenter_corpse + var/datum/hud/living/carbon/hud = null // hud + var/bootime = 0 + var/started_as_observer //This variable is set to 1 when you enter the game as an observer. + //If you died in the game and are a ghsot - this will remain as null. + //Note that this is not a reliable way to determine if admins started as observers, since they change mobs a lot. + var/has_enabled_antagHUD = 0 + var/medHUD = 0 + var/secHUD = 0 + var/antagHUD = 0 + universal_speak = 1 + var/atom/movable/following = null + var/admin_ghosted = 0 + var/anonsay = 0 + var/ghostvision = 1 //is the ghost able to see things humans can't? + incorporeal_move = 1 + + var/is_manifest = 0 //If set to 1, the ghost is able to whisper. Usually only set if a cultist drags them through the veil. + var/ghost_sprite = null + var/global/list/possible_ghost_sprites = list( + "Clear" = "blank", + "Green Blob" = "otherthing", + "Bland" = "ghost", + "Robed-B" = "ghost1", + "Robed-BAlt" = "ghost2", + "King" = "ghostking", + "Shade" = "shade", + "Hecate" = "ghost-narsie", + "Glowing Statue" = "armour", + "Artificer" = "artificer", + "Behemoth" = "behemoth", + "Harvester" = "harvester", + "Wraith" = "wraith", + "Viscerator" = "viscerator", + "Corgi" = "corgi", + "Tamaskan" = "tamaskan", + "Black Cat" = "blackcat", + "Lizard" = "lizard", + "Goat" = "goat", + "Space Bear" = "bear", + "Bats" = "bat", + "Chicken" = "chicken_white", + "Parrot"= "parrot_fly", + "Goose" = "goose", + "Penguin" = "penguin", + "Brown Crab" = "crab", + "Gray Crab" = "evilcrab", + "Trout" = "trout-swim", + "Salmon" = "salmon-swim", + "Pike" = "pike-swim", + "Koi" = "koi-swim", + "Carp" = "carp", + "Red Robes" = "robe_red", + "Faithless" = "faithless", + "Shadowform" = "forgotten", + "Dark Ethereal" = "bloodguardian", + "Holy Ethereal" = "lightguardian", + "Red Elemental" = "magicRed", + "Blue Elemental" = "magicBlue", + "Pink Elemental" = "magicPink", + "Orange Elemental" = "magicOrange", + "Green Elemental" = "magicGreen", + "Daemon" = "daemon", + "Guard Spider" = "guard", + "Hunter Spider" = "hunter", + "Nurse Spider" = "nurse", + "Rogue Drone" = "drone", + "ED-209" = "ed209", + "Beepsky" = "secbot" + ) + var/last_revive_notification = null // world.time of last notification, used to avoid spamming players from defibs or cloners. + var/cleanup_timer // Refernece to a timer that will delete this mob if no client returns + +/mob/observer/dead/New(mob/body) + + appearance = body + invisibility = INVISIBILITY_OBSERVER + layer = BELOW_MOB_LAYER + plane = PLANE_GHOSTS + alpha = 127 + + sight |= SEE_TURFS | SEE_MOBS | SEE_OBJS | SEE_SELF + see_invisible = SEE_INVISIBLE_OBSERVER + see_in_dark = world.view //I mean. I don't even know if byond has occlusion culling... but... + + var/turf/T + if(ismob(body)) + T = get_turf(body) //Where is the body located? + attack_log = body.attack_log //preserve our attack logs by copying them to our ghost + gender = body.gender + if(body.mind && body.mind.name) + name = body.mind.name + else + if(body.real_name) + name = body.real_name + else + if(gender == MALE) + name = capitalize(pick(first_names_male)) + " " + capitalize(pick(last_names)) + else + name = capitalize(pick(first_names_female)) + " " + capitalize(pick(last_names)) + + mind = body.mind //we don't transfer the mind but we keep a reference to it. + + // Fix for naked ghosts. + // Unclear why this isn't being grabbed by appearance. + if(ishuman(body)) + var/mob/living/carbon/human/H = body + add_overlay(H.overlays_standing) + + if(!T) T = pick(latejoin) //Safety in case we cannot find the body's position + forceMove(T) + + if(!name) //To prevent nameless ghosts + name = capitalize(pick(first_names_male)) + " " + capitalize(pick(last_names)) + real_name = name + animate(src, pixel_y = 2, time = 10, loop = -1) + observer_mob_list += src + ..() + +/mob/observer/dead/Topic(href, href_list) + if (href_list["track"]) + var/mob/target = locate(href_list["track"]) in mob_list + if(target) + ManualFollow(target) + if(href_list["reenter"]) + reenter_corpse() + return + +/mob/observer/dead/attackby(obj/item/W, mob/user) + if(istype(W,/obj/item/weapon/book/tome)) + var/mob/observer/dead/M = src + M.manifest(user) + +/mob/observer/dead/CanPass(atom/movable/mover, turf/target) + return TRUE + +/mob/observer/dead/set_stat(var/new_stat) + if(new_stat != DEAD) + CRASH("It is best if observers stay dead, thank you.") + +/mob/observer/dead/examine_icon() + var/icon/I = get_cached_examine_icon(src) + if(!I) + I = getFlatIcon(src, defdir = SOUTH, no_anim = TRUE) + set_cached_examine_icon(src, I, 200 SECONDS) + return I + +/mob/observer/dead/examine(mob/user) + . = ..() + + if(is_admin(user)) + . += "\t>[ADMIN_FULLMONTY(src)]" + +/* +Transfer_mind is there to check if mob is being deleted/not going to have a body. +Works together with spawning an observer, noted above. +*/ + +/mob/observer/dead/Life() + ..() + if(!loc) return + if(!client) return 0 + + handle_regular_hud_updates() + handle_vision() + +/mob/proc/ghostize(var/can_reenter_corpse = 1) + if(key) + if(ishuman(src)) + var/mob/living/carbon/human/H = src + if(H.vr_holder && !can_reenter_corpse) + H.exit_vr() + return 0 + var/mob/observer/dead/ghost = new(src) //Transfer safety to observer spawning proc. + ghost.can_reenter_corpse = can_reenter_corpse + ghost.timeofdeath = src.timeofdeath //BS12 EDIT + ghost.key = key + if(istype(loc, /obj/structure/morgue)) + var/obj/structure/morgue/M = loc + M.update() + else if(istype(loc, /obj/structure/closet/body_bag)) + var/obj/structure/closet/body_bag/B = loc + B.update() + if(ghost.client) + ghost.client.time_died_as_mouse = ghost.timeofdeath + if(ghost.client && !ghost.client.holder && !config.antag_hud_allowed) // For new ghosts we remove the verb from even showing up if it's not allowed. + ghost.verbs -= /mob/observer/dead/verb/toggle_antagHUD // Poor guys, don't know what they are missing! + return ghost + +/* +This is the proc mobs get to turn into a ghost. Forked from ghostize due to compatibility issues. +*/ +/mob/living/verb/ghost() + set category = "OOC" + set name = "Ghost" + set desc = "Relinquish your life and enter the land of the dead." + + if(stat == DEAD && !forbid_seeing_deadchat) + announce_ghost_joinleave(ghostize(1)) + else + var/response + if(src.client && src.client.holder) + response = tgui_alert(src, "You have the ability to Admin-Ghost. The regular Ghost verb will announce your presence to dead chat. Both variants will allow you to return to your body using 'aghost'.\n\nWhat do you wish to do?", "Are you sure you want to ghost?", list("Ghost", "Admin Ghost", "Stay in body")) + if(response == "Admin Ghost") + if(!src.client) + return + src.client.admin_ghost() + else + response = tgui_alert(src, "Are you -sure- you want to ghost?\n(You are alive, or otherwise have the potential to become alive. Don't abuse ghost unless you are inside a cryopod or equivalent! You can't change your mind so choose wisely!)", "Are you sure you want to ghost?", list("Ghost", "Stay in body")) // VOREStation edit because we don't make players stay dead for 30 minutes. + if(response != "Ghost") + return + resting = 1 + var/turf/location = get_turf(src) + var/special_role = check_special_role() + if(!istype(loc,/obj/machinery/cryopod)) + log_and_message_admins("has ghosted outside cryo[special_role ? " as [special_role]" : ""]. (JMP)",usr) + else if(special_role) + log_and_message_admins("has ghosted in cryo as [special_role]. (JMP)",usr) + var/mob/observer/dead/ghost = ghostize(0) // 0 parameter is so we can never re-enter our body, "Charlie, you can never come baaaack~" :3 + if(ghost) + ghost.timeofdeath = world.time // Because the living mob won't have a time of death and we want the respawn timer to work properly. + ghost.set_respawn_timer() + announce_ghost_joinleave(ghost) + +/mob/observer/dead/can_use_hands() return 0 +/mob/observer/dead/is_active() return 0 + +/mob/observer/dead/Stat() + ..() + if(statpanel("Status")) + if(emergency_shuttle) + var/eta_status = emergency_shuttle.get_status_panel_eta() + if(eta_status) + stat(null, eta_status) + +/mob/observer/dead/verb/reenter_corpse() + set category = "Ghost" + set name = "Re-enter Corpse" + if(!client) return + if(!(mind && mind.current && can_reenter_corpse)) + to_chat(src, "You have no body.") + return + if(mind.current.key && copytext(mind.current.key,1,2)!="@") //makes sure we don't accidentally kick any clients + to_chat(usr, "Another consciousness is in your body... it is resisting you.") + return + //VOREStation Add + if(prevent_respawns.Find(mind.name)) + to_chat(usr, "You already quit this round as this character, sorry!") + return + //VOREStation Add End + if(mind.current.ajourn && mind.current.stat != DEAD) //check if the corpse is astral-journeying (it's client ghosted using a cultist rune). + var/found_rune + for(var/obj/effect/rune/R in mind.current.loc) //whilst corpse is alive, we can only reenter the body if it's on the rune + if(R && R.word1 == cultwords["hell"] && R.word2 == cultwords["travel"] && R.word3 == cultwords["self"]) // Found an astral journey rune. + found_rune = 1 + break + if(!found_rune) + to_chat(usr, "The astral cord that ties your body and your spirit has been severed. You are likely to wander the realm beyond until your body is finally dead and thus reunited with you.") + return + mind.current.ajourn=0 + mind.current.key = key + mind.current.teleop = null + if(istype(mind.current.loc, /obj/structure/morgue)) + var/obj/structure/morgue/M = mind.current.loc + M.update(1) + else if(istype(mind.current.loc, /obj/structure/closet/body_bag)) + var/obj/structure/closet/body_bag/B = mind.current.loc + B.update(1) + if(!admin_ghosted) + announce_ghost_joinleave(mind, 0, "They now occupy their body again.") + return 1 + +/mob/observer/dead/verb/toggle_medHUD() + set category = "Ghost" + set name = "Toggle MedicHUD" + set desc = "Toggles Medical HUD allowing you to see how everyone is doing" + + medHUD = !medHUD + plane_holder.set_vis(VIS_CH_HEALTH, medHUD) + plane_holder.set_vis(VIS_CH_STATUS_OOC, medHUD) + to_chat(src, "Medical HUD [medHUD ? "Enabled" : "Disabled"]") + +/mob/observer/dead/verb/toggle_secHUD() + set category = "Ghost" + set name = "Toggle Security HUD" + set desc = "Toggles Security HUD allowing you to see people's displayed ID's job, wanted status, etc" + + secHUD = !secHUD + plane_holder.set_vis(VIS_CH_ID, secHUD) + plane_holder.set_vis(VIS_CH_WANTED, secHUD) + plane_holder.set_vis(VIS_CH_IMPTRACK, secHUD) + plane_holder.set_vis(VIS_CH_IMPLOYAL, secHUD) + plane_holder.set_vis(VIS_CH_IMPCHEM, secHUD) + to_chat(src, "Security HUD [secHUD ? "Enabled" : "Disabled"]") + +/mob/observer/dead/verb/toggle_antagHUD() + set category = "Ghost" + set name = "Toggle AntagHUD" + set desc = "Toggles AntagHUD allowing you to see who is the antagonist" + + if(!config.antag_hud_allowed && !client.holder) + to_chat(src, "Admins have disabled this for this round.") + return + if(jobban_isbanned(src, "AntagHUD")) + to_chat(src, "You have been banned from using this feature") + return + if(config.antag_hud_restricted && !has_enabled_antagHUD && !client.holder) + var/response = tgui_alert(src, "If you turn this on, you will not be able to take any part in the round.","Are you sure you want to turn this feature on?",list("Yes","No")) + if(response == "No") return + can_reenter_corpse = FALSE + set_respawn_timer(-1) // Foreeeever + if(!has_enabled_antagHUD && !client.holder) + has_enabled_antagHUD = TRUE + + antagHUD = !antagHUD + plane_holder.set_vis(VIS_CH_SPECIAL, antagHUD) + to_chat(src, "AntagHUD [antagHUD ? "Enabled" : "Disabled"]") + +/mob/observer/dead/proc/jumpable_areas() + var/list/areas = return_sorted_areas() + if(client?.holder) + return areas + + for(var/key in areas) + var/area/A = areas[key] + if(A.z in using_map?.secret_levels) + areas -= key + + return areas + +/mob/observer/dead/proc/jumpable_mobs() + var/list/mobs = getmobs() + if(client?.holder) + return mobs + + for(var/key in mobs) + var/mobz = get_z(mobs[key]) + if(mobz in using_map?.secret_levels) + mobs -= key + + return mobs + +/mob/observer/dead/verb/dead_tele(areaname as null|anything in jumpable_areas()) + set name = "Teleport" + set category = "Ghost" + set desc = "Teleport to a location." + + if(!istype(usr, /mob/observer/dead)) + to_chat(usr, "Not when you're not dead!") + return + + var/area/A + + if(!areaname) + var/list/areas = jumpable_areas() + var/input = tgui_input_list(usr, "Select an area:", "Ghost Teleport", areas) + if(!input) + return + A = areas[input] + if(!A) + return + + if(!istype(usr, /mob/observer/dead)) + to_chat(usr, "Not when you're not dead!") + return + + usr.forceMove(pick(get_area_turfs(A || jumpable_areas()[areaname]))) + usr.on_mob_jump() + +/mob/observer/dead/verb/follow(mobname as null|anything in jumpable_mobs()) + set name = "Follow" + set category = "Ghost" + set desc = "Follow and haunt a mob." + + if(!istype(usr, /mob/observer/dead)) + to_chat(usr, "Not when you're not dead!") + return + + var/mob/M + + if(!mobname) + var/list/possible_mobs = jumpable_mobs() + var/input = tgui_input_list(usr, "Select a mob:", "Ghost Follow", possible_mobs) + if(!input) + return + M = possible_mobs[input] + if(!M) + return + + if(!istype(usr, /mob/observer/dead)) + to_chat(usr, "Not when you're not dead!") + return + + ManualFollow(M || jumpable_mobs()[mobname]) + +/mob/observer/dead/forceMove(atom/destination) + if(client?.holder) + return ..() + + if(get_z(destination) in using_map?.secret_levels) + to_chat(src,SPAN_WARNING("Sorry, that z-level does not allow ghosts.")) + if(following) + stop_following() + return + + return ..() + +/mob/observer/dead/Move(atom/newloc, direct = 0, movetime) + if(client?.holder) + return ..() + + if(get_z(newloc) in using_map?.secret_levels) + to_chat(src,SPAN_WARNING("Sorry, that z-level does not allow ghosts.")) + if(following) + stop_following() + return + + return ..() + +// This is the ghost's follow verb with an argument +/mob/observer/dead/proc/ManualFollow(var/atom/movable/target) + if(!target) + return + + var/turf/targetloc = get_turf(target) + if(check_holy(targetloc)) + to_chat(usr, "You cannot follow a mob standing on holy grounds!") + return + if(get_z(target) in using_map?.secret_levels) + to_chat(src, SPAN_WARNING("Sorry, that target is in an area that ghosts aren't allowed to go.")) + return + if(target != src) + if(following && following == target) + return + following = target + to_chat(src, "Now following [target]") + if(ismob(target)) + forceMove(get_turf(target)) + var/mob/M = target + M.following_mobs += src + else + spawn(0) + while(target && following == target && client) + var/turf/T = get_turf(target) + if(!T) + break + // To stop the ghost flickering. + if(loc != T) + forceMove(T) + sleep(15) + + var/icon/I = icon(target.icon,target.icon_state,target.dir) + + var/orbitsize = (I.Width()+I.Height())*0.5 + orbitsize -= (orbitsize/world.icon_size)*(world.icon_size*0.25) + + var/rot_seg + + /* We don't have this pref yet + switch(ghost_orbit) + if(GHOST_ORBIT_TRIANGLE) + rot_seg = 3 + if(GHOST_ORBIT_SQUARE) + rot_seg = 4 + if(GHOST_ORBIT_PENTAGON) + rot_seg = 5 + if(GHOST_ORBIT_HEXAGON) + rot_seg = 6 + else //Circular + rot_seg = 36 //360/10 bby, smooth enough aproximation of a circle + */ + + orbit(target, orbitsize, FALSE, 20, rot_seg) + +/mob/observer/dead/orbit() + set_dir(2) //reset dir so the right directional sprites show up + return ..() + +/mob/observer/dead/stop_orbit() + . = ..() + //restart our floating animation after orbit is done. + pixel_y = 0 + pixel_x = 0 + transform = null + animate(src, pixel_y = 2, time = 10, loop = -1) + +/mob/observer/dead/proc/stop_following() + following = null + stop_orbit() + +/mob/proc/update_following() + . = get_turf(src) + for(var/mob/observer/dead/M in following_mobs) + if(!.) + M.stop_following() + + if(M.following != src) + following_mobs -= M + else + if(M.loc != .) + M.forceMove(.) + +/mob + var/list/following_mobs = list() + +/mob/Destroy() + for(var/mob/observer/dead/M in following_mobs) + M.stop_following() + following_mobs = null + return ..() + +/mob/observer/dead/Destroy() + if(ismob(following)) + var/mob/M = following + M.following_mobs -= src + stop_following() + observer_mob_list -= src + return ..() + +/mob/Moved(atom/old_loc, direction, forced = FALSE) + . = ..() + update_following() + +/mob/Life() + // to catch teleports etc which directly set loc + update_following() + return ..() + +/mob/proc/check_holy(var/turf/T) + return 0 + +/mob/observer/dead/check_holy(var/turf/T) + if(check_rights(R_ADMIN|R_FUN|R_EVENT, 0, src)) + return 0 + + return (T && T.holy) && (is_manifest || (mind in cult.current_antagonists)) + +/mob/observer/dead/verb/jumptomob() //Moves the ghost instead of just changing the ghosts's eye -Nodrak + set category = "Ghost" + set name = "Jump to Mob" + set desc = "Teleport to a mob" + set popup_menu = FALSE + + if(!istype(usr, /mob/observer/dead)) //Make sure they're an observer! + return + + var/list/possible_mobs = jumpable_mobs() + var/input = tgui_input_list(usr, "Select a mob:", "Ghost Jump", possible_mobs) + if(!input) + return + + var/target = possible_mobs[input] + if (!target)//Make sure we actually have a target + return + else + var/mob/M = target //Destination mob + var/turf/T = get_turf(M) //Turf of the destination mob + + if(T && isturf(T)) //Make sure the turf exists, then move the source to that destination. + forceMove(T) + stop_following() + else + to_chat(src, "This mob is not located in the game world.") + +/mob/observer/dead/memory() + set hidden = 1 + to_chat(src, "You are dead! You have no mind to store memory!") + +/mob/observer/dead/add_memory() + set hidden = 1 + to_chat(src, "You are dead! You have no mind to store memory!") + +/mob/observer/dead/Post_Incorpmove() + stop_following() + +/mob/observer/dead/verb/analyze_air() + set name = "Analyze Air" + set category = "Ghost" + + if(!istype(usr, /mob/observer/dead)) return + + // Shamelessly copied from the Gas Analyzers + if (!( istype(usr.loc, /turf) )) + return + + var/datum/gas_mixture/environment = usr.loc.return_air() + + var/pressure = environment.return_pressure() + var/total_moles = environment.total_moles + + to_chat(src, "Results:") + if(abs(pressure - ONE_ATMOSPHERE) < 10) + to_chat(src, "Pressure: [round(pressure,0.1)] kPa") + else + to_chat(src, "Pressure: [round(pressure,0.1)] kPa") + if(total_moles) + for(var/g in environment.gas) + to_chat(src, "[gas_data.name[g]]: [round((environment.gas[g] / total_moles) * 100)]% ([round(environment.gas[g], 0.01)] moles)") + to_chat(src, "Temperature: [round(environment.temperature-T0C,0.1)]°C ([round(environment.temperature,0.1)]K)") + to_chat(src, "Heat Capacity: [round(environment.heat_capacity(),0.1)]") + +/mob/observer/dead/verb/check_radiation() + set name = "Check Radiation" + set category = "Ghost" + + var/turf/t = get_turf(src) + if(t) + var/rads = SSradiation.get_rads_at_turf(t) + to_chat(src, "Radiation level: [rads ? rads : "0"] Bq.") + + +/mob/observer/dead/verb/become_mouse() + set name = "Become mouse" + set category = "Ghost" + + if(config.disable_player_mice) + to_chat(src, "Spawning as a mouse is currently disabled.") + return + + if(!MayRespawn(1)) + return + + var/turf/T = get_turf(src) + if(!T || (T.z in using_map.admin_levels)) + to_chat(src, "You may not spawn as a mouse on this Z-level.") + return + + var/timedifference = world.time - client.time_died_as_mouse + if(client.time_died_as_mouse && timedifference <= mouse_respawn_time * 600) + var/timedifference_text + timedifference_text = time2text(mouse_respawn_time * 600 - timedifference,"mm:ss") + to_chat(src, "You may only spawn again as a mouse more than [mouse_respawn_time] minutes after your death. You have [timedifference_text] left.") + return + + var/response = tgui_alert(src, "Are you -sure- you want to become a mouse?","Are you sure you want to squeek?",list("Squeek!","Nope!")) + if(response != "Squeek!") return //Hit the wrong key...again. + + + //find a viable mouse candidate + var/mob/living/simple_mob/animal/passive/mouse/host + var/obj/machinery/atmospherics/unary/vent_pump/vent_found + var/list/found_vents = list() + for(var/obj/machinery/atmospherics/unary/vent_pump/v in machines) + if(!v.welded && v.z == T.z && v.network && v.network.normal_members.len > 20) + found_vents.Add(v) + if(found_vents.len) + vent_found = pick(found_vents) + host = new /mob/living/simple_mob/animal/passive/mouse(vent_found) + else + to_chat(src, "Unable to find any unwelded vents to spawn mice at.") + + if(host) + if(config.uneducated_mice) + host.universal_understand = 0 + announce_ghost_joinleave(src, 0, "They are now a mouse.") + host.ckey = src.ckey + host.add_ventcrawl(vent_found) + to_chat(host, "You are now a mouse. Try to avoid interaction with players, and do not give hints away that you are more than a simple rodent.") + +/mob/observer/dead/verb/view_manfiest() + set name = "Show Crew Manifest" + set category = "Ghost" + + var/dat + dat += "

Crew Manifest

" + dat += data_core.get_manifest() + + src << browse(dat, "window=manifest;size=370x420;can_close=1") + +//This is called when a ghost is drag clicked to something. +/mob/observer/dead/MouseDrop(atom/over) + if(!usr || !over) return + if (isobserver(usr) && usr.client && usr.client.holder && isliving(over)) + if (usr.client.holder.cmd_ghost_drag(src,over)) + return + + return ..() + +//Used for drawing on walls with blood puddles as a spooky ghost. +/mob/observer/dead/verb/bloody_doodle() + + set category = "Ghost" + set name = "Write in blood" + set desc = "If the round is sufficiently spooky, write a short message in blood on the floor or a wall. Remember, no IC in OOC or OOC in IC." + + if(!(config.cult_ghostwriter)) + to_chat(src, "That verb is not currently permitted.") + return + + if (!src.stat) + return + + if (usr != src) + return 0 //something is terribly wrong + + var/ghosts_can_write + if(ticker.mode.name == "cult") + if(cult.current_antagonists.len > config.cult_ghostwriter_req_cultists) + ghosts_can_write = 1 + + if(!ghosts_can_write && !check_rights(R_ADMIN|R_EVENT|R_FUN, 0)) //Let's allow for admins to write in blood for events and the such. + to_chat(src, "The veil is not thin enough for you to do that.") + return + + var/list/choices = list() + for(var/obj/effect/decal/cleanable/blood/B in view(1,src)) + if(B.amount > 0) + choices += B + + if(!choices.len) + to_chat(src, "There is no blood to use nearby.") + return + + var/obj/effect/decal/cleanable/blood/choice = tgui_input_list(src, "What blood would you like to use?", "Blood Choice", choices) + + var/direction = tgui_input_list(src,"Which way?","Tile selection", list("Here","North","South","East","West")) + var/turf/simulated/T = src.loc + if (direction != "Here") + T = get_step(T,text2dir(direction)) + + if (!istype(T)) + to_chat(src, "You cannot doodle there.") + return + + if(!choice || choice.amount == 0 || !(src.Adjacent(choice))) + return + + var/doodle_color = (choice.basecolor) ? choice.basecolor : "#A10808" + + var/num_doodles = 0 + for (var/obj/effect/decal/cleanable/blood/writing/W in T) + num_doodles++ + if (num_doodles > 4) + to_chat(src, "There is no space to write on!") + return + + var/max_length = 50 + + var/message = sanitize(input(usr, "Write a message. It cannot be longer than [max_length] characters.","Blood writing", "")) + + if (message) + + if (length(message) > max_length) + message += "-" + to_chat(src, "You ran out of blood to write with!") + + var/obj/effect/decal/cleanable/blood/writing/W = new(T) + W.basecolor = doodle_color + W.update_icon() + W.message = message + W.add_hiddenprint(src) + W.visible_message("Invisible fingers crudely paint something in blood on [T]...") + +/mob/observer/dead/pointed(atom/A as mob|obj|turf in view()) + if(!..()) + return 0 + usr.visible_message("[src] points to [A]") + return 1 + +/mob/observer/dead/proc/manifest(mob/user) + is_manifest = TRUE + verbs |= /mob/observer/dead/proc/toggle_visibility + verbs |= /mob/observer/dead/proc/ghost_whisper + to_chat(src, "As you are now in the realm of the living, you can whisper to the living with the Spectral Whisper verb, inside the IC tab.") + if(plane != PLANE_WORLD) + user.visible_message( \ + "\The [user] drags ghost, [src], to our plane of reality!", \ + "You drag [src] to our plane of reality!" \ + ) + toggle_visibility(TRUE) + else + var/datum/gender/T = gender_datums[user.get_visible_gender()] + user.visible_message ( \ + "\The [user] just tried to smash [T.his] book into that ghost! It's not very effective.", \ + "You get the feeling that the ghost can't become any more visible." \ + ) + +/mob/observer/dead/proc/toggle_icon(var/icon) + if(!client) + return + + var/iconRemoved = 0 + for(var/image/I in client.images) + if(I.icon_state == icon) + iconRemoved = 1 + qdel(I) + + if(!iconRemoved) + var/image/J = image('icons/mob/mob.dmi', loc = src, icon_state = icon) + client.images += J + +/mob/observer/dead/proc/toggle_visibility(var/forced = 0) + set category = "Ghost" + set name = "Toggle Visibility" + set desc = "Allows you to turn (in)visible (almost) at will." + + var/toggled_invisible + if(!forced && plane == PLANE_GHOSTS && world.time < toggled_invisible + 600) + to_chat(src, "You must gather strength before you can turn visible again...") + return + + if(plane == PLANE_WORLD) + toggled_invisible = world.time + visible_message("It fades from sight...", "You are now invisible.") + else + to_chat(src, "You are now visible!") + + plane = (plane == PLANE_GHOSTS) ? PLANE_WORLD : PLANE_GHOSTS + invisibility = (plane == PLANE_WORLD) ? 0 : INVISIBILITY_OBSERVER + + // Give the ghost a cult icon which should be visible only to itself + toggle_icon("cult") + +/mob/observer/dead/verb/toggle_anonsay() + set category = "Ghost" + set name = "Toggle Anonymous Chat" + set desc = "Toggles showing your key in dead chat." + + src.anonsay = !src.anonsay + if(anonsay) + to_chat(src, "Your key won't be shown when you speak in dead chat.") + else + to_chat(src, "Your key will be publicly visible again.") + +/mob/observer/dead/canface() + return 1 + +/mob/observer/dead/proc/can_admin_interact() + return check_rights(R_ADMIN|R_EVENT, 0, src) + +/mob/observer/dead/verb/toggle_ghostsee() + set name = "Toggle Ghost Vision" + set desc = "Toggles your ability to see things only ghosts can see, like other ghosts" + set category = "Ghost" + ghostvision = !ghostvision + updateghostsight() + to_chat(src, "You [ghostvision ? "now" : "no longer"] have ghost vision.") + +/mob/observer/dead/verb/toggle_darkness() + set name = "Toggle Darkness" + set desc = "Toggles your ability to see lighting overlays, and the darkness they create." + set category = "Ghost" + seedarkness = !seedarkness + updateghostsight() + to_chat(src, "You [seedarkness ? "now" : "no longer"] see darkness.") + +/mob/observer/dead/proc/updateghostsight() + plane_holder.set_vis(VIS_FULLBRIGHT, !seedarkness) //Inversion, because "not seeing" the darkness is "seeing" the lighting plane master. + plane_holder.set_vis(VIS_GHOSTS, ghostvision) + +/mob/observer/dead/MayRespawn(var/feedback = 0) + if(!client) + return 0 + if(mind && mind.current && mind.current.stat != DEAD && can_reenter_corpse) + if(feedback) + to_chat(src, "Your non-dead body prevent you from respawning.") + return 0 + if(config.antag_hud_restricted && has_enabled_antagHUD == 1) + if(feedback) + to_chat(src, "antagHUD restrictions prevent you from respawning.") + return 0 + return 1 + +/atom/proc/extra_ghost_link() + return + +/mob/extra_ghost_link(var/atom/ghost) + if(client && eyeobj) + return "|eye" + +/mob/observer/dead/extra_ghost_link(var/atom/ghost) + if(mind && mind.current) + return "|body" + +/proc/ghost_follow_link(var/atom/target, var/atom/ghost) + if((!target) || (!ghost)) return + . = "follow" + . += target.extra_ghost_link(ghost) + +//Culted Ghosts + +/mob/observer/dead/proc/ghost_whisper() + set name = "Spectral Whisper" + set category = "IC" + + if(is_manifest) //Only able to whisper if it's hit with a tome. + var/list/options = list() + for(var/mob/living/Ms in view(src)) + options += Ms + var/mob/living/M = tgui_input_list(src, "Select who to whisper to:", "Whisper to?", options) + if(!M) + return 0 + var/msg = sanitize(input(src, "Message:", "Spectral Whisper") as text|null) + if(msg) + log_say("(SPECWHISP to [key_name(M)]): [msg]", src) + to_chat(M, " You hear a strange, unidentifiable voice in your head... [msg]") + to_chat(src, " You said: '[msg]' to [M].") + else + return + return 1 + else + to_chat(src, "You have not been pulled past the veil!") + +/mob/observer/dead/verb/choose_ghost_sprite() + set category = "Ghost" + set name = "Choose Sprite" + + var/choice + var/previous_state + var/finalized = "No" + + while(finalized == "No" && src.client) + choice = tgui_input_list(usr, "What would you like to use for your ghost sprite?", "Ghost Sprite", possible_ghost_sprites) + if(!choice) + return + + if(choice) + icon = 'icons/mob/ghost.dmi' + cut_overlays() + + if(icon_state && icon) + previous_state = icon_state + + icon_state = possible_ghost_sprites[choice] + finalized = tgui_alert(src, "Look at your sprite. Is this what you wish to use?","Ghost Sprite",list("No","Yes")) + + ghost_sprite = possible_ghost_sprites[choice] + + if(finalized == "No") + icon_state = previous_state + +/mob/observer/dead/is_blind() + return FALSE + +/mob/observer/dead/is_deaf() + return FALSE + +/mob/observer/dead/verb/paialert() + set category = "Ghost" + set name = "Blank pAI alert" + set desc = "Flash an indicator light on available blank pAI devices for a smidgen of hope." + + if(usr.client.prefs?.be_special & BE_PAI) + var/count = 0 + for(var/obj/item/device/paicard/p in all_pai_cards) + var/obj/item/device/paicard/PP = p + if(PP.pai == null) + count++ + PP.icon = 'icons/obj/pda_vr.dmi' // VOREStation Edit + PP.add_overlay("pai-ghostalert") + spawn(54) + PP.cut_overlays() + to_chat(usr,"Flashing the displays of [count] unoccupied PAIs.") + else + to_chat(usr,"You have 'Be pAI' disabled in your character prefs, so we can't help you.") + +/mob/observer/dead/speech_bubble_appearance() + return "ghost" + +// Lets a ghost know someone's trying to bring them back, and for them to get into their body. +// Mostly the same as TG's sans the hud element, since we don't have TG huds. +/mob/observer/dead/proc/notify_revive(var/message, var/sound, flashwindow = TRUE, var/atom/source) + if((last_revive_notification + 2 MINUTES) > world.time) + return + last_revive_notification = world.time + + if(flashwindow) + window_flash(client) + if(message) + to_chat(src, "[message]") + if(source) + throw_alert("\ref[source]_notify_revive", /obj/screen/alert/notify_cloning, new_master = source) + to_chat(src, "(Click to re-enter)") + if(sound) + SEND_SOUND(src, sound(sound)) + +/mob/observer/dead/verb/respawn() + set name = "Respawn" + set category = "Ghost" + src.abandon_mob() +======= +/mob/observer + name = "observer" + desc = "This shouldn't appear" + density = FALSE + vis_flags = NONE + +/mob/observer/dead + name = "ghost" + desc = "It's a g-g-g-g-ghooooost!" //jinkies! + icon = 'icons/mob/ghost.dmi' + icon_state = "ghost" + stat = DEAD + canmove = 0 + blinded = 0 + anchored = TRUE // don't get pushed around + + var/can_reenter_corpse + var/datum/hud/living/carbon/hud = null // hud + var/bootime = 0 + var/started_as_observer //This variable is set to 1 when you enter the game as an observer. + //If you died in the game and are a ghsot - this will remain as null. + //Note that this is not a reliable way to determine if admins started as observers, since they change mobs a lot. + var/has_enabled_antagHUD = 0 + var/medHUD = 0 + var/secHUD = 0 + var/antagHUD = 0 + universal_speak = 1 + var/atom/movable/following = null + var/admin_ghosted = 0 + var/anonsay = 0 + var/ghostvision = 1 //is the ghost able to see things humans can't? + incorporeal_move = 1 + + var/is_manifest = 0 //If set to 1, the ghost is able to whisper. Usually only set if a cultist drags them through the veil. + var/ghost_sprite = null + var/global/list/possible_ghost_sprites = list( + "Clear" = "blank", + "Green Blob" = "otherthing", + "Bland" = "ghost", + "Robed-B" = "ghost1", + "Robed-BAlt" = "ghost2", + "King" = "ghostking", + "Shade" = "shade", + "Hecate" = "ghost-narsie", + "Glowing Statue" = "armour", + "Artificer" = "artificer", + "Behemoth" = "behemoth", + "Harvester" = "harvester", + "Wraith" = "wraith", + "Viscerator" = "viscerator", + "Corgi" = "corgi", + "Tamaskan" = "tamaskan", + "Black Cat" = "blackcat", + "Lizard" = "lizard", + "Goat" = "goat", + "Space Bear" = "bear", + "Bats" = "bat", + "Chicken" = "chicken_white", + "Parrot"= "parrot_fly", + "Goose" = "goose", + "Penguin" = "penguin", + "Brown Crab" = "crab", + "Gray Crab" = "evilcrab", + "Trout" = "trout-swim", + "Salmon" = "salmon-swim", + "Pike" = "pike-swim", + "Koi" = "koi-swim", + "Carp" = "carp", + "Red Robes" = "robe_red", + "Faithless" = "faithless", + "Shadowform" = "forgotten", + "Dark Ethereal" = "bloodguardian", + "Holy Ethereal" = "lightguardian", + "Red Elemental" = "magicRed", + "Blue Elemental" = "magicBlue", + "Pink Elemental" = "magicPink", + "Orange Elemental" = "magicOrange", + "Green Elemental" = "magicGreen", + "Daemon" = "daemon", + "Guard Spider" = "guard", + "Hunter Spider" = "hunter", + "Nurse Spider" = "nurse", + "Rogue Drone" = "drone", + "ED-209" = "ed209", + "Beepsky" = "secbot" + ) + var/last_revive_notification = null // world.time of last notification, used to avoid spamming players from defibs or cloners. + var/cleanup_timer // Refernece to a timer that will delete this mob if no client returns + +/mob/observer/dead/New(mob/body) + + appearance = body + invisibility = INVISIBILITY_OBSERVER + layer = BELOW_MOB_LAYER + plane = PLANE_GHOSTS + alpha = 127 + + sight |= SEE_TURFS | SEE_MOBS | SEE_OBJS | SEE_SELF + see_invisible = SEE_INVISIBLE_OBSERVER + see_in_dark = world.view //I mean. I don't even know if byond has occlusion culling... but... + + var/turf/T + if(ismob(body)) + T = get_turf(body) //Where is the body located? + attack_log = body.attack_log //preserve our attack logs by copying them to our ghost + gender = body.gender + if(body.mind && body.mind.name) + name = body.mind.name + else + if(body.real_name) + name = body.real_name + else + if(gender == MALE) + name = capitalize(pick(first_names_male)) + " " + capitalize(pick(last_names)) + else + name = capitalize(pick(first_names_female)) + " " + capitalize(pick(last_names)) + + mind = body.mind //we don't transfer the mind but we keep a reference to it. + + // Fix for naked ghosts. + // Unclear why this isn't being grabbed by appearance. + if(ishuman(body)) + var/mob/living/carbon/human/H = body + add_overlay(H.overlays_standing) + + if(!T) T = pick(latejoin) //Safety in case we cannot find the body's position + forceMove(T) + + if(!name) //To prevent nameless ghosts + name = capitalize(pick(first_names_male)) + " " + capitalize(pick(last_names)) + real_name = name + animate(src, pixel_y = 2, time = 10, loop = -1) + observer_mob_list += src + ..() + +/mob/observer/dead/Topic(href, href_list) + if (href_list["track"]) + var/mob/target = locate(href_list["track"]) in mob_list + if(target) + ManualFollow(target) + if(href_list["reenter"]) + reenter_corpse() + return + +/mob/observer/dead/attackby(obj/item/W, mob/user) + if(istype(W,/obj/item/weapon/book/tome)) + var/mob/observer/dead/M = src + M.manifest(user) + +/mob/observer/dead/CanPass(atom/movable/mover, turf/target) + return TRUE + +/mob/observer/dead/set_stat(var/new_stat) + if(new_stat != DEAD) + CRASH("It is best if observers stay dead, thank you.") + +/mob/observer/dead/examine_icon() + var/icon/I = get_cached_examine_icon(src) + if(!I) + I = getFlatIcon(src, defdir = SOUTH, no_anim = TRUE) + set_cached_examine_icon(src, I, 200 SECONDS) + return I + +/mob/observer/dead/examine(mob/user) + . = ..() + + if(is_admin(user)) + . += "\t>[ADMIN_FULLMONTY(src)]" + +/* +Transfer_mind is there to check if mob is being deleted/not going to have a body. +Works together with spawning an observer, noted above. +*/ + +/mob/observer/dead/Life() + ..() + if(!loc) return + if(!client) return 0 + + handle_regular_hud_updates() + handle_vision() + +/mob/proc/ghostize(var/can_reenter_corpse = 1) + if(key) + if(ishuman(src)) + var/mob/living/carbon/human/H = src + if(H.vr_holder && !can_reenter_corpse) + H.exit_vr() + return 0 + var/mob/observer/dead/ghost = new(src) //Transfer safety to observer spawning proc. + ghost.can_reenter_corpse = can_reenter_corpse + ghost.timeofdeath = src.timeofdeath //BS12 EDIT + ghost.key = key + if(istype(loc, /obj/structure/morgue)) + var/obj/structure/morgue/M = loc + M.update() + else if(istype(loc, /obj/structure/closet/body_bag)) + var/obj/structure/closet/body_bag/B = loc + B.update() + if(ghost.client) + ghost.client.time_died_as_mouse = ghost.timeofdeath + if(ghost.client && !ghost.client.holder && !config.antag_hud_allowed) // For new ghosts we remove the verb from even showing up if it's not allowed. + ghost.verbs -= /mob/observer/dead/verb/toggle_antagHUD // Poor guys, don't know what they are missing! + return ghost + +/* +This is the proc mobs get to turn into a ghost. Forked from ghostize due to compatibility issues. +*/ +/mob/living/verb/ghost() + set category = "OOC" + set name = "Ghost" + set desc = "Relinquish your life and enter the land of the dead." + + if(stat == DEAD && !forbid_seeing_deadchat) + announce_ghost_joinleave(ghostize(1)) + else + var/response + if(src.client && src.client.holder) + response = tgui_alert(src, "You have the ability to Admin-Ghost. The regular Ghost verb will announce your presence to dead chat. Both variants will allow you to return to your body using 'aghost'.\n\nWhat do you wish to do?", "Are you sure you want to ghost?", list("Ghost", "Admin Ghost", "Stay in body")) + if(response == "Admin Ghost") + if(!src.client) + return + src.client.admin_ghost() + else + response = tgui_alert(src, "Are you -sure- you want to ghost?\n(You are alive, or otherwise have the potential to become alive. Don't abuse ghost unless you are inside a cryopod or equivalent! You can't change your mind so choose wisely!)", "Are you sure you want to ghost?", list("Ghost", "Stay in body")) // VOREStation edit because we don't make players stay dead for 30 minutes. + if(response != "Ghost") + return + resting = 1 + var/turf/location = get_turf(src) + var/special_role = check_special_role() + if(!istype(loc,/obj/machinery/cryopod)) + log_and_message_admins("has ghosted outside cryo[special_role ? " as [special_role]" : ""]. (JMP)",usr) + else if(special_role) + log_and_message_admins("has ghosted in cryo as [special_role]. (JMP)",usr) + var/mob/observer/dead/ghost = ghostize(0) // 0 parameter is so we can never re-enter our body, "Charlie, you can never come baaaack~" :3 + if(ghost) + ghost.timeofdeath = world.time // Because the living mob won't have a time of death and we want the respawn timer to work properly. + ghost.set_respawn_timer() + announce_ghost_joinleave(ghost) + +/mob/observer/dead/can_use_hands() return 0 +/mob/observer/dead/is_active() return 0 + +/mob/observer/dead/Stat() + ..() + if(statpanel("Status")) + if(emergency_shuttle) + var/eta_status = emergency_shuttle.get_status_panel_eta() + if(eta_status) + stat(null, eta_status) + +/mob/observer/dead/verb/reenter_corpse() + set category = "Ghost" + set name = "Re-enter Corpse" + if(!client) return + if(!(mind && mind.current && can_reenter_corpse)) + to_chat(src, "You have no body.") + return + if(mind.current.key && copytext(mind.current.key,1,2)!="@") //makes sure we don't accidentally kick any clients + to_chat(usr, "Another consciousness is in your body... it is resisting you.") + return + //VOREStation Add + if(prevent_respawns.Find(mind.name)) + to_chat(usr, "You already quit this round as this character, sorry!") + return + //VOREStation Add End + if(mind.current.ajourn && mind.current.stat != DEAD) //check if the corpse is astral-journeying (it's client ghosted using a cultist rune). + var/found_rune + for(var/obj/effect/rune/R in mind.current.loc) //whilst corpse is alive, we can only reenter the body if it's on the rune + if(R && R.word1 == cultwords["hell"] && R.word2 == cultwords["travel"] && R.word3 == cultwords["self"]) // Found an astral journey rune. + found_rune = 1 + break + if(!found_rune) + to_chat(usr, "The astral cord that ties your body and your spirit has been severed. You are likely to wander the realm beyond until your body is finally dead and thus reunited with you.") + return + mind.current.ajourn=0 + mind.current.key = key + mind.current.teleop = null + if(istype(mind.current.loc, /obj/structure/morgue)) + var/obj/structure/morgue/M = mind.current.loc + M.update(1) + else if(istype(mind.current.loc, /obj/structure/closet/body_bag)) + var/obj/structure/closet/body_bag/B = mind.current.loc + B.update(1) + if(!admin_ghosted) + announce_ghost_joinleave(mind, 0, "They now occupy their body again.") + return 1 + +/mob/observer/dead/verb/toggle_medHUD() + set category = "Ghost" + set name = "Toggle MedicHUD" + set desc = "Toggles Medical HUD allowing you to see how everyone is doing" + + medHUD = !medHUD + plane_holder.set_vis(VIS_CH_HEALTH, medHUD) + plane_holder.set_vis(VIS_CH_STATUS_OOC, medHUD) + to_chat(src, "Medical HUD [medHUD ? "Enabled" : "Disabled"]") + +/mob/observer/dead/verb/toggle_secHUD() + set category = "Ghost" + set name = "Toggle Security HUD" + set desc = "Toggles Security HUD allowing you to see people's displayed ID's job, wanted status, etc" + + secHUD = !secHUD + plane_holder.set_vis(VIS_CH_ID, secHUD) + plane_holder.set_vis(VIS_CH_WANTED, secHUD) + plane_holder.set_vis(VIS_CH_IMPTRACK, secHUD) + plane_holder.set_vis(VIS_CH_IMPLOYAL, secHUD) + plane_holder.set_vis(VIS_CH_IMPCHEM, secHUD) + to_chat(src, "Security HUD [secHUD ? "Enabled" : "Disabled"]") + +/mob/observer/dead/verb/toggle_antagHUD() + set category = "Ghost" + set name = "Toggle AntagHUD" + set desc = "Toggles AntagHUD allowing you to see who is the antagonist" + + if(!config.antag_hud_allowed && !client.holder) + to_chat(src, "Admins have disabled this for this round.") + return + if(jobban_isbanned(src, "AntagHUD")) + to_chat(src, "You have been banned from using this feature") + return + if(config.antag_hud_restricted && !has_enabled_antagHUD && !client.holder) + var/response = tgui_alert(src, "If you turn this on, you will not be able to take any part in the round.","Are you sure you want to turn this feature on?",list("Yes","No")) + if(response == "No") return + can_reenter_corpse = FALSE + set_respawn_timer(-1) // Foreeeever + if(!has_enabled_antagHUD && !client.holder) + has_enabled_antagHUD = TRUE + + antagHUD = !antagHUD + plane_holder.set_vis(VIS_CH_SPECIAL, antagHUD) + to_chat(src, "AntagHUD [antagHUD ? "Enabled" : "Disabled"]") + +/mob/observer/dead/proc/jumpable_areas() + var/list/areas = return_sorted_areas() + if(client?.holder) + return areas + + for(var/key in areas) + var/area/A = areas[key] + if(A.z in using_map?.secret_levels) + areas -= key + if(A.z in using_map?.hidden_levels) + areas -= key + + return areas + +/mob/observer/dead/proc/jumpable_mobs() + var/list/mobs = getmobs() + if(client?.holder) + return mobs + + for(var/key in mobs) + var/mobz = get_z(mobs[key]) + if(mobz in using_map?.secret_levels) + mobs -= key + if(mobz in using_map?.hidden_levels) + mobs -= key + + return mobs + +/mob/observer/dead/verb/dead_tele(areaname as null|anything in jumpable_areas()) + set name = "Teleport" + set category = "Ghost" + set desc = "Teleport to a location." + + if(!istype(usr, /mob/observer/dead)) + to_chat(usr, "Not when you're not dead!") + return + + var/area/A + + if(!areaname) + var/list/areas = jumpable_areas() + var/input = tgui_input_list(usr, "Select an area:", "Ghost Teleport", areas) + if(!input) + return + A = areas[input] + if(!A) + return + + if(!istype(usr, /mob/observer/dead)) + to_chat(usr, "Not when you're not dead!") + return + + usr.forceMove(pick(get_area_turfs(A || jumpable_areas()[areaname]))) + usr.on_mob_jump() + +/mob/observer/dead/verb/follow(mobname as null|anything in jumpable_mobs()) + set name = "Follow" + set category = "Ghost" + set desc = "Follow and haunt a mob." + + if(!istype(usr, /mob/observer/dead)) + to_chat(usr, "Not when you're not dead!") + return + + var/mob/M + + if(!mobname) + var/list/possible_mobs = jumpable_mobs() + var/input = tgui_input_list(usr, "Select a mob:", "Ghost Follow", possible_mobs) + if(!input) + return + M = possible_mobs[input] + if(!M) + return + + if(!istype(usr, /mob/observer/dead)) + to_chat(usr, "Not when you're not dead!") + return + + ManualFollow(M || jumpable_mobs()[mobname]) + +/mob/observer/dead/forceMove(atom/destination) + if(client?.holder) + return ..() + + if(get_z(destination) in using_map?.secret_levels) + to_chat(src,SPAN_WARNING("Sorry, that z-level does not allow ghosts.")) + if(following) + stop_following() + return + + return ..() + +/mob/observer/dead/Move(atom/newloc, direct = 0, movetime) + if(client?.holder) + return ..() + + if(get_z(newloc) in using_map?.secret_levels) + to_chat(src,SPAN_WARNING("Sorry, that z-level does not allow ghosts.")) + if(following) + stop_following() + return + + return ..() + +// This is the ghost's follow verb with an argument +/mob/observer/dead/proc/ManualFollow(var/atom/movable/target) + if(!target) + return + + var/turf/targetloc = get_turf(target) + if(check_holy(targetloc)) + to_chat(usr, "You cannot follow a mob standing on holy grounds!") + return + if(get_z(target) in using_map?.secret_levels) + to_chat(src, SPAN_WARNING("Sorry, that target is in an area that ghosts aren't allowed to go.")) + return + if(target != src) + if(following && following == target) + return + following = target + to_chat(src, "Now following [target]") + if(ismob(target)) + forceMove(get_turf(target)) + var/mob/M = target + M.following_mobs += src + else + spawn(0) + while(target && following == target && client) + var/turf/T = get_turf(target) + if(!T) + break + // To stop the ghost flickering. + if(loc != T) + forceMove(T) + sleep(15) + + var/icon/I = icon(target.icon,target.icon_state,target.dir) + + var/orbitsize = (I.Width()+I.Height())*0.5 + orbitsize -= (orbitsize/world.icon_size)*(world.icon_size*0.25) + + var/rot_seg + + /* We don't have this pref yet + switch(ghost_orbit) + if(GHOST_ORBIT_TRIANGLE) + rot_seg = 3 + if(GHOST_ORBIT_SQUARE) + rot_seg = 4 + if(GHOST_ORBIT_PENTAGON) + rot_seg = 5 + if(GHOST_ORBIT_HEXAGON) + rot_seg = 6 + else //Circular + rot_seg = 36 //360/10 bby, smooth enough aproximation of a circle + */ + + orbit(target, orbitsize, FALSE, 20, rot_seg) + +/mob/observer/dead/orbit() + set_dir(2) //reset dir so the right directional sprites show up + return ..() + +/mob/observer/dead/stop_orbit() + . = ..() + //restart our floating animation after orbit is done. + pixel_y = 0 + pixel_x = 0 + transform = null + animate(src, pixel_y = 2, time = 10, loop = -1) + +/mob/observer/dead/proc/stop_following() + following = null + stop_orbit() + +/mob/proc/update_following() + . = get_turf(src) + for(var/mob/observer/dead/M in following_mobs) + if(!.) + M.stop_following() + + if(M.following != src) + following_mobs -= M + else + if(M.loc != .) + M.forceMove(.) + +/mob + var/list/following_mobs = list() + +/mob/Destroy() + for(var/mob/observer/dead/M in following_mobs) + M.stop_following() + following_mobs = null + return ..() + +/mob/observer/dead/Destroy() + if(ismob(following)) + var/mob/M = following + M.following_mobs -= src + stop_following() + observer_mob_list -= src + return ..() + +/mob/Moved(atom/old_loc, direction, forced = FALSE) + . = ..() + update_following() + +/mob/Life() + // to catch teleports etc which directly set loc + update_following() + return ..() + +/mob/proc/check_holy(var/turf/T) + return 0 + +/mob/observer/dead/check_holy(var/turf/T) + if(check_rights(R_ADMIN|R_FUN|R_EVENT, 0, src)) + return 0 + + return (T && T.holy) && (is_manifest || (mind in cult.current_antagonists)) + +/mob/observer/dead/verb/jumptomob() //Moves the ghost instead of just changing the ghosts's eye -Nodrak + set category = "Ghost" + set name = "Jump to Mob" + set desc = "Teleport to a mob" + set popup_menu = FALSE + + if(!istype(usr, /mob/observer/dead)) //Make sure they're an observer! + return + + var/list/possible_mobs = jumpable_mobs() + var/input = tgui_input_list(usr, "Select a mob:", "Ghost Jump", possible_mobs) + if(!input) + return + + var/target = possible_mobs[input] + if (!target)//Make sure we actually have a target + return + else + var/mob/M = target //Destination mob + var/turf/T = get_turf(M) //Turf of the destination mob + + if(T && isturf(T)) //Make sure the turf exists, then move the source to that destination. + forceMove(T) + stop_following() + else + to_chat(src, "This mob is not located in the game world.") + +/mob/observer/dead/memory() + set hidden = 1 + to_chat(src, "You are dead! You have no mind to store memory!") + +/mob/observer/dead/add_memory() + set hidden = 1 + to_chat(src, "You are dead! You have no mind to store memory!") + +/mob/observer/dead/Post_Incorpmove() + stop_following() + +/mob/observer/dead/verb/analyze_air() + set name = "Analyze Air" + set category = "Ghost" + + if(!istype(usr, /mob/observer/dead)) return + + // Shamelessly copied from the Gas Analyzers + if (!( istype(usr.loc, /turf) )) + return + + var/datum/gas_mixture/environment = usr.loc.return_air() + + var/pressure = environment.return_pressure() + var/total_moles = environment.total_moles + + to_chat(src, "Results:") + if(abs(pressure - ONE_ATMOSPHERE) < 10) + to_chat(src, "Pressure: [round(pressure,0.1)] kPa") + else + to_chat(src, "Pressure: [round(pressure,0.1)] kPa") + if(total_moles) + for(var/g in environment.gas) + to_chat(src, "[gas_data.name[g]]: [round((environment.gas[g] / total_moles) * 100)]% ([round(environment.gas[g], 0.01)] moles)") + to_chat(src, "Temperature: [round(environment.temperature-T0C,0.1)]°C ([round(environment.temperature,0.1)]K)") + to_chat(src, "Heat Capacity: [round(environment.heat_capacity(),0.1)]") + +/mob/observer/dead/verb/check_radiation() + set name = "Check Radiation" + set category = "Ghost" + + var/turf/t = get_turf(src) + if(t) + var/rads = SSradiation.get_rads_at_turf(t) + to_chat(src, "Radiation level: [rads ? rads : "0"] Bq.") + + +/mob/observer/dead/verb/become_mouse() + set name = "Become mouse" + set category = "Ghost" + + if(config.disable_player_mice) + to_chat(src, "Spawning as a mouse is currently disabled.") + return + + if(!MayRespawn(1)) + return + + var/turf/T = get_turf(src) + if(!T || (T.z in using_map.admin_levels)) + to_chat(src, "You may not spawn as a mouse on this Z-level.") + return + + var/timedifference = world.time - client.time_died_as_mouse + if(client.time_died_as_mouse && timedifference <= mouse_respawn_time * 600) + var/timedifference_text + timedifference_text = time2text(mouse_respawn_time * 600 - timedifference,"mm:ss") + to_chat(src, "You may only spawn again as a mouse more than [mouse_respawn_time] minutes after your death. You have [timedifference_text] left.") + return + + var/response = tgui_alert(src, "Are you -sure- you want to become a mouse?","Are you sure you want to squeek?",list("Squeek!","Nope!")) + if(response != "Squeek!") return //Hit the wrong key...again. + + + //find a viable mouse candidate + var/mob/living/simple_mob/animal/passive/mouse/host + var/obj/machinery/atmospherics/unary/vent_pump/vent_found + var/list/found_vents = list() + for(var/obj/machinery/atmospherics/unary/vent_pump/v in machines) + if(!v.welded && v.z == T.z && v.network && v.network.normal_members.len > 20) + found_vents.Add(v) + if(found_vents.len) + vent_found = pick(found_vents) + host = new /mob/living/simple_mob/animal/passive/mouse(vent_found) + else + to_chat(src, "Unable to find any unwelded vents to spawn mice at.") + + if(host) + if(config.uneducated_mice) + host.universal_understand = 0 + announce_ghost_joinleave(src, 0, "They are now a mouse.") + host.ckey = src.ckey + host.add_ventcrawl(vent_found) + to_chat(host, "You are now a mouse. Try to avoid interaction with players, and do not give hints away that you are more than a simple rodent.") + +/mob/observer/dead/verb/view_manfiest() + set name = "Show Crew Manifest" + set category = "Ghost" + + var/dat + dat += "

Crew Manifest

" + dat += data_core.get_manifest() + + src << browse(dat, "window=manifest;size=370x420;can_close=1") + +//This is called when a ghost is drag clicked to something. +/mob/observer/dead/MouseDrop(atom/over) + if(!usr || !over) return + if (isobserver(usr) && usr.client && usr.client.holder && isliving(over)) + if (usr.client.holder.cmd_ghost_drag(src,over)) + return + + return ..() + +//Used for drawing on walls with blood puddles as a spooky ghost. +/mob/observer/dead/verb/bloody_doodle() + + set category = "Ghost" + set name = "Write in blood" + set desc = "If the round is sufficiently spooky, write a short message in blood on the floor or a wall. Remember, no IC in OOC or OOC in IC." + + if(!(config.cult_ghostwriter)) + to_chat(src, "That verb is not currently permitted.") + return + + if (!src.stat) + return + + if (usr != src) + return 0 //something is terribly wrong + + var/ghosts_can_write + if(ticker.mode.name == "cult") + if(cult.current_antagonists.len > config.cult_ghostwriter_req_cultists) + ghosts_can_write = 1 + + if(!ghosts_can_write && !check_rights(R_ADMIN|R_EVENT|R_FUN, 0)) //Let's allow for admins to write in blood for events and the such. + to_chat(src, "The veil is not thin enough for you to do that.") + return + + var/list/choices = list() + for(var/obj/effect/decal/cleanable/blood/B in view(1,src)) + if(B.amount > 0) + choices += B + + if(!choices.len) + to_chat(src, "There is no blood to use nearby.") + return + + var/obj/effect/decal/cleanable/blood/choice = tgui_input_list(src, "What blood would you like to use?", "Blood Choice", choices) + + var/direction = tgui_input_list(src,"Which way?","Tile selection", list("Here","North","South","East","West")) + var/turf/simulated/T = src.loc + if (direction != "Here") + T = get_step(T,text2dir(direction)) + + if (!istype(T)) + to_chat(src, "You cannot doodle there.") + return + + if(!choice || choice.amount == 0 || !(src.Adjacent(choice))) + return + + var/doodle_color = (choice.basecolor) ? choice.basecolor : "#A10808" + + var/num_doodles = 0 + for (var/obj/effect/decal/cleanable/blood/writing/W in T) + num_doodles++ + if (num_doodles > 4) + to_chat(src, "There is no space to write on!") + return + + var/max_length = 50 + + var/message = sanitize(input(usr, "Write a message. It cannot be longer than [max_length] characters.","Blood writing", "")) + + if (message) + + if (length(message) > max_length) + message += "-" + to_chat(src, "You ran out of blood to write with!") + + var/obj/effect/decal/cleanable/blood/writing/W = new(T) + W.basecolor = doodle_color + W.update_icon() + W.message = message + W.add_hiddenprint(src) + W.visible_message("Invisible fingers crudely paint something in blood on [T]...") + +/mob/observer/dead/pointed(atom/A as mob|obj|turf in view()) + if(!..()) + return 0 + usr.visible_message("[src] points to [A]") + return 1 + +/mob/observer/dead/proc/manifest(mob/user) + is_manifest = TRUE + verbs |= /mob/observer/dead/proc/toggle_visibility + verbs |= /mob/observer/dead/proc/ghost_whisper + to_chat(src, "As you are now in the realm of the living, you can whisper to the living with the Spectral Whisper verb, inside the IC tab.") + if(plane != PLANE_WORLD) + user.visible_message( \ + "\The [user] drags ghost, [src], to our plane of reality!", \ + "You drag [src] to our plane of reality!" \ + ) + toggle_visibility(TRUE) + else + var/datum/gender/T = gender_datums[user.get_visible_gender()] + user.visible_message ( \ + "\The [user] just tried to smash [T.his] book into that ghost! It's not very effective.", \ + "You get the feeling that the ghost can't become any more visible." \ + ) + +/mob/observer/dead/proc/toggle_icon(var/icon) + if(!client) + return + + var/iconRemoved = 0 + for(var/image/I in client.images) + if(I.icon_state == icon) + iconRemoved = 1 + qdel(I) + + if(!iconRemoved) + var/image/J = image('icons/mob/mob.dmi', loc = src, icon_state = icon) + client.images += J + +/mob/observer/dead/proc/toggle_visibility(var/forced = 0) + set category = "Ghost" + set name = "Toggle Visibility" + set desc = "Allows you to turn (in)visible (almost) at will." + + var/toggled_invisible + if(!forced && plane == PLANE_GHOSTS && world.time < toggled_invisible + 600) + to_chat(src, "You must gather strength before you can turn visible again...") + return + + if(plane == PLANE_WORLD) + toggled_invisible = world.time + visible_message("It fades from sight...", "You are now invisible.") + else + to_chat(src, "You are now visible!") + + plane = (plane == PLANE_GHOSTS) ? PLANE_WORLD : PLANE_GHOSTS + invisibility = (plane == PLANE_WORLD) ? 0 : INVISIBILITY_OBSERVER + + // Give the ghost a cult icon which should be visible only to itself + toggle_icon("cult") + +/mob/observer/dead/verb/toggle_anonsay() + set category = "Ghost" + set name = "Toggle Anonymous Chat" + set desc = "Toggles showing your key in dead chat." + + src.anonsay = !src.anonsay + if(anonsay) + to_chat(src, "Your key won't be shown when you speak in dead chat.") + else + to_chat(src, "Your key will be publicly visible again.") + +/mob/observer/dead/canface() + return 1 + +/mob/observer/dead/proc/can_admin_interact() + return check_rights(R_ADMIN|R_EVENT, 0, src) + +/mob/observer/dead/verb/toggle_ghostsee() + set name = "Toggle Ghost Vision" + set desc = "Toggles your ability to see things only ghosts can see, like other ghosts" + set category = "Ghost" + ghostvision = !ghostvision + updateghostsight() + to_chat(src, "You [ghostvision ? "now" : "no longer"] have ghost vision.") + +/mob/observer/dead/verb/toggle_darkness() + set name = "Toggle Darkness" + set desc = "Toggles your ability to see lighting overlays, and the darkness they create." + set category = "Ghost" + seedarkness = !seedarkness + updateghostsight() + to_chat(src, "You [seedarkness ? "now" : "no longer"] see darkness.") + +/mob/observer/dead/proc/updateghostsight() + plane_holder.set_vis(VIS_FULLBRIGHT, !seedarkness) //Inversion, because "not seeing" the darkness is "seeing" the lighting plane master. + plane_holder.set_vis(VIS_GHOSTS, ghostvision) + +/mob/observer/dead/MayRespawn(var/feedback = 0) + if(!client) + return 0 + if(mind && mind.current && mind.current.stat != DEAD && can_reenter_corpse) + if(feedback) + to_chat(src, "Your non-dead body prevent you from respawning.") + return 0 + if(config.antag_hud_restricted && has_enabled_antagHUD == 1) + if(feedback) + to_chat(src, "antagHUD restrictions prevent you from respawning.") + return 0 + return 1 + +/atom/proc/extra_ghost_link() + return + +/mob/extra_ghost_link(var/atom/ghost) + if(client && eyeobj) + return "|eye" + +/mob/observer/dead/extra_ghost_link(var/atom/ghost) + if(mind && mind.current) + return "|body" + +/proc/ghost_follow_link(var/atom/target, var/atom/ghost) + if((!target) || (!ghost)) return + . = "follow" + . += target.extra_ghost_link(ghost) + +//Culted Ghosts + +/mob/observer/dead/proc/ghost_whisper() + set name = "Spectral Whisper" + set category = "IC" + + if(is_manifest) //Only able to whisper if it's hit with a tome. + var/list/options = list() + for(var/mob/living/Ms in view(src)) + options += Ms + var/mob/living/M = tgui_input_list(src, "Select who to whisper to:", "Whisper to?", options) + if(!M) + return 0 + var/msg = sanitize(input(src, "Message:", "Spectral Whisper") as text|null) + if(msg) + log_say("(SPECWHISP to [key_name(M)]): [msg]", src) + to_chat(M, " You hear a strange, unidentifiable voice in your head... [msg]") + to_chat(src, " You said: '[msg]' to [M].") + else + return + return 1 + else + to_chat(src, "You have not been pulled past the veil!") + +/mob/observer/dead/verb/choose_ghost_sprite() + set category = "Ghost" + set name = "Choose Sprite" + + var/choice + var/previous_state + var/finalized = "No" + + while(finalized == "No" && src.client) + choice = tgui_input_list(usr, "What would you like to use for your ghost sprite?", "Ghost Sprite", possible_ghost_sprites) + if(!choice) + return + + if(choice) + icon = 'icons/mob/ghost.dmi' + cut_overlays() + + if(icon_state && icon) + previous_state = icon_state + + icon_state = possible_ghost_sprites[choice] + finalized = tgui_alert(src, "Look at your sprite. Is this what you wish to use?","Ghost Sprite",list("No","Yes")) + + ghost_sprite = possible_ghost_sprites[choice] + + if(finalized == "No") + icon_state = previous_state + +/mob/observer/dead/is_blind() + return FALSE + +/mob/observer/dead/is_deaf() + return FALSE + +/mob/observer/dead/verb/paialert() + set category = "Ghost" + set name = "Blank pAI alert" + set desc = "Flash an indicator light on available blank pAI devices for a smidgen of hope." + + if(usr.client.prefs?.be_special & BE_PAI) + var/count = 0 + for(var/obj/item/device/paicard/p in all_pai_cards) + var/obj/item/device/paicard/PP = p + if(PP.pai == null) + count++ + PP.icon = 'icons/obj/pda_vr.dmi' // VOREStation Edit + PP.add_overlay("pai-ghostalert") + spawn(54) + PP.cut_overlays() + to_chat(usr,"Flashing the displays of [count] unoccupied PAIs.") + else + to_chat(usr,"You have 'Be pAI' disabled in your character prefs, so we can't help you.") + +/mob/observer/dead/speech_bubble_appearance() + return "ghost" + +// Lets a ghost know someone's trying to bring them back, and for them to get into their body. +// Mostly the same as TG's sans the hud element, since we don't have TG huds. +/mob/observer/dead/proc/notify_revive(var/message, var/sound, flashwindow = TRUE, var/atom/source) + if((last_revive_notification + 2 MINUTES) > world.time) + return + last_revive_notification = world.time + + if(flashwindow) + window_flash(client) + if(message) + to_chat(src, "[message]") + if(source) + throw_alert("\ref[source]_notify_revive", /obj/screen/alert/notify_cloning, new_master = source) + to_chat(src, "(Click to re-enter)") + if(sound) + SEND_SOUND(src, sound(sound)) + +/mob/observer/dead/verb/respawn() + set name = "Respawn" + set category = "Ghost" + src.abandon_mob() +>>>>>>> bb3b3d6214... Merge pull request #11176 from Very-Soft/ghosties diff --git a/maps/~map_system/maps.dm b/maps/~map_system/maps.dm index 4a6b06fc77..12a31b74a1 100644 --- a/maps/~map_system/maps.dm +++ b/maps/~map_system/maps.dm @@ -35,6 +35,7 @@ var/list/all_maps = list() var/static/list/xenoarch_exempt_levels = list() //Z-levels exempt from xenoarch finds and digsites spawning. var/static/list/persist_levels = list() // Z-levels where SSpersistence should persist between rounds. Defaults to station_levels if unset. var/static/list/secret_levels = list() // Z-levels that (non-admin) ghosts can't get to + var/static/list/hidden_levels = list() // Z-levels who's contents are hidden, but not forbidden (gateways) var/static/list/empty_levels = list() // Empty Z-levels that may be used for various things var/static/list/vorespawn_levels = list() //Z-levels where players are allowed to vore latejoin to. //CHOMPedit: the number of missing chompedits is giving me an aneurysm var/static/list/mappable_levels = list()// List of levels where mapping or other similar devices might work fully From 82dfa37a0494fcaba17d5f18529e9851681094c6 Mon Sep 17 00:00:00 2001 From: Aronai Sieyes Date: Tue, 20 Jul 2021 17:29:17 -0400 Subject: [PATCH 18/34] Merge pull request #11185 from VOREStation/Arokha/protsynth Proteans are synthetic, yeah --- .../carbon/human/species/station/protean_vr/protean_blob.dm | 3 +++ 1 file changed, 3 insertions(+) diff --git a/code/modules/mob/living/carbon/human/species/station/protean_vr/protean_blob.dm b/code/modules/mob/living/carbon/human/species/station/protean_vr/protean_blob.dm index 0830d10e83..3c0fbf3492 100644 --- a/code/modules/mob/living/carbon/human/species/station/protean_vr/protean_blob.dm +++ b/code/modules/mob/living/carbon/human/species/station/protean_vr/protean_blob.dm @@ -93,6 +93,9 @@ /mob/living/simple_mob/protean_blob/init_vore() return //Don't make a random belly, don't waste your time +/mob/living/simple_mob/protean_blob/isSynthetic() + return TRUE // yup + /mob/living/simple_mob/protean_blob/Stat() ..() if(humanform) From 2bcc08b16f3425af359a37bb8d32c2d117e3662a Mon Sep 17 00:00:00 2001 From: Aronai Sieyes Date: Tue, 20 Jul 2021 17:29:12 -0400 Subject: [PATCH 20/34] Merge pull request #11184 from VOREStation/Fixes/11003 Fixes #11003 --- .../carbon/human/species/station/protean_vr/protean_blob.dm | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/code/modules/mob/living/carbon/human/species/station/protean_vr/protean_blob.dm b/code/modules/mob/living/carbon/human/species/station/protean_vr/protean_blob.dm index 0830d10e83..7a3ace6da0 100644 --- a/code/modules/mob/living/carbon/human/species/station/protean_vr/protean_blob.dm +++ b/code/modules/mob/living/carbon/human/species/station/protean_vr/protean_blob.dm @@ -84,6 +84,12 @@ healing.expire() return ..() +/mob/living/simple_mob/protean_blob/say_understands(var/mob/other, var/datum/language/speaking = null) + // The parent of this proc and its parent are SHAMS and should be rewritten, but I'm not up to it right now. + if(!speaking) + return TRUE // can understand common, they're like, a normal person thing + return ..() + /mob/living/simple_mob/protean_blob/speech_bubble_appearance() return "synthetic" From aea925d17d535b1ffdbd66268b041e75326171a8 Mon Sep 17 00:00:00 2001 From: Aronai Sieyes Date: Tue, 20 Jul 2021 17:29:05 -0400 Subject: [PATCH 22/34] Merge pull request #11183 from VOREStation/Fixes/11167 Fixes #11167 --- icons/mob/pai_vr.dmi | Bin 157362 -> 166129 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/icons/mob/pai_vr.dmi b/icons/mob/pai_vr.dmi index 45ee85a06628f75e6a2e3be9d1712a0d008bcef2..0b8b985ff7c54a9b8aabe28d622755e628333ce0 100644 GIT binary patch literal 166129 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 literal 157362 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⩔ncUsXWp4oBe&a3H_7VEJlXz{y~bn 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 K&*U07hW!`tY}teW From 369afc60186ef310a30403f1b5ca4690259afe93 Mon Sep 17 00:00:00 2001 From: Aronai Sieyes Date: Tue, 20 Jul 2021 17:29:00 -0400 Subject: [PATCH 24/34] Merge pull request #11182 from VOREStation/Arokha/bucklefind Add code to trace recursive buckle issue --- code/game/objects/buckling.dm | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/code/game/objects/buckling.dm b/code/game/objects/buckling.dm index b0f4f4c2c1..484c51012e 100644 --- a/code/game/objects/buckling.dm +++ b/code/game/objects/buckling.dm @@ -54,6 +54,10 @@ if(!can_buckle_check(M, forced)) return FALSE + if(M == src) + stack_trace("Recursive buckle warning: [M] being buckled to self.") + return + M.buckled = src M.facing_dir = null M.set_dir(buckle_dir ? buckle_dir : dir) From 442c888d5e4ae351d6a748d1b137b7460aa2386b Mon Sep 17 00:00:00 2001 From: Aronai Sieyes Date: Tue, 20 Jul 2021 17:28:52 -0400 Subject: [PATCH 26/34] Merge pull request #11181 from VOREStation/Arokha/farpaint Add art possibility to Virgo 2 surface outpost --- code/game/objects/structures/artstuff.dm | 6 ++++ maps/expedition_vr/aerostat/surface.dmm | 36 ++++++++++++++++++++---- 2 files changed, 36 insertions(+), 6 deletions(-) diff --git a/code/game/objects/structures/artstuff.dm b/code/game/objects/structures/artstuff.dm index 2e2f4052b8..cbb95e955f 100644 --- a/code/game/objects/structures/artstuff.dm +++ b/code/game/objects/structures/artstuff.dm @@ -375,6 +375,12 @@ persistence_id = "library_private" req_one_access = list(access_library) +/obj/structure/sign/painting/away_areas // for very hard-to-get-to areas + name = "\improper Remote Painting Exhibit mounting" + desc = "For art pieces made in the depths of space." + desc_with_canvas = "A painting hung where only the determined can reach it." + persistence_id = "away_area" + /obj/structure/sign/painting/Initialize(mapload, dir, building) . = ..() if(persistence_id) diff --git a/maps/expedition_vr/aerostat/surface.dmm b/maps/expedition_vr/aerostat/surface.dmm index 6b519879a9..b60deeb4de 100644 --- a/maps/expedition_vr/aerostat/surface.dmm +++ b/maps/expedition_vr/aerostat/surface.dmm @@ -421,6 +421,12 @@ /obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, /turf/simulated/floor/tiled/eris/dark, /area/tether_away/aerostat/surface/outpost/cafe) +"nx" = ( +/obj/structure/sign/painting/away_areas{ + pixel_x = -32 + }, +/turf/simulated/floor/tiled/eris/bcircuit, +/area/tether_away/aerostat/surface/outpost/hallway) "nI" = ( /obj/structure/cable/cyan{ icon_state = "1-2" @@ -550,6 +556,13 @@ }, /turf/simulated/floor/plating/eris/under, /area/tether_away/aerostat/surface/outpost/powerroom) +"ru" = ( +/obj/structure/table/woodentable, +/obj/structure/sign/painting/away_areas{ + pixel_x = 32 + }, +/turf/simulated/floor/tiled/eris/dark, +/area/tether_away/aerostat/surface/outpost/cafe) "rA" = ( /obj/machinery/atmospherics/pipe/simple/hidden/supply{ dir = 6 @@ -1116,6 +1129,13 @@ /obj/structure/medical_stand/anesthetic, /turf/simulated/floor/tiled/eris/bcircuit, /area/tether_away/aerostat/surface/outpost/backroom) +"GH" = ( +/obj/structure/table/woodentable, +/obj/structure/sign/painting/away_areas{ + pixel_x = 32 + }, +/turf/simulated/floor/wood, +/area/tether_away/aerostat/surface/outpost/barracks) "Ha" = ( /obj/structure/cable/cyan{ icon_state = "1-2" @@ -1402,6 +1422,8 @@ "ON" = ( /obj/structure/table/rack/shelf/steel, /obj/item/weapon/storage/box/glasses, +/obj/item/paint_brush, +/obj/item/paint_palette, /turf/simulated/floor/tiled/eris/dark/monofloor, /area/tether_away/aerostat/surface/outpost/cafe) "OT" = ( @@ -1550,6 +1572,8 @@ "Ur" = ( /obj/structure/table/rack/shelf/steel, /obj/item/weapon/storage/box/glasses/pint, +/obj/item/canvas/twentyfour_twentyfour, +/obj/item/canvas/nineteen_nineteen, /turf/simulated/floor/tiled/eris/dark/monofloor, /area/tether_away/aerostat/surface/outpost/cafe) "UC" = ( @@ -2602,9 +2626,9 @@ Ge QJ Zb br -zN -zN -zN +nx +nx +nx br zN dE @@ -5308,9 +5332,9 @@ gq dE zr WC +ru Ra -Ra -Ra +ru iu WF Oi @@ -6301,7 +6325,7 @@ Rw Bs sA nK -nK +GH tG gx gx From 609e62764e153a12aa49bf84388b4ea73e9b41e6 Mon Sep 17 00:00:00 2001 From: Nadyr <41974248+Darlantanis@users.noreply.github.com> Date: Tue, 20 Jul 2021 18:45:26 -0400 Subject: [PATCH 28/34] powder that makes you say yes --- vorestation.dme | 1 - 1 file changed, 1 deletion(-) diff --git a/vorestation.dme b/vorestation.dme index a0685571f0..29a53ccd20 100644 --- a/vorestation.dme +++ b/vorestation.dme @@ -790,7 +790,6 @@ #include "code\game\jobs\access.dm" #include "code\game\jobs\access_datum.dm" #include "code\game\jobs\access_datum_vr.dm" -#include "code\game\jobs\access_datum_yw.dm" #include "code\game\jobs\job_controller.dm" #include "code\game\jobs\jobs.dm" #include "code\game\jobs\whitelist.dm" From b6c96f375aea5d68423d836fdeeb33a309523b5d Mon Sep 17 00:00:00 2001 From: Nadyr <41974248+Darlantanis@users.noreply.github.com> Date: Tue, 20 Jul 2021 19:39:11 -0400 Subject: [PATCH 29/34] powder that makes you say yes --- code/modules/clothing/clothing.dm | 2130 ----------------------------- 1 file changed, 2130 deletions(-) diff --git a/code/modules/clothing/clothing.dm b/code/modules/clothing/clothing.dm index d55902f268..bf81706f3f 100644 --- a/code/modules/clothing/clothing.dm +++ b/code/modules/clothing/clothing.dm @@ -1,4 +1,3 @@ -<<<<<<< HEAD /obj/item/clothing name = "clothing" siemens_coefficient = 0.9 @@ -17,13 +16,6 @@ var/list/enables_planes //Enables these planes in the wearing mob's plane_holder var/list/plane_slots //But only if it's equipped into this specific slot - /* - Sprites used when the clothing item is refit. This is done by setting icon_override. - For best results, if this is set then sprite_sheets should be null and vice versa, but that is by no means necessary. - Ideally, sprite_sheets_refit should be used for "hard" clothing items that can't change shape very well to fit the wearer (e.g. helmets, hardsuits), - while sprite_sheets should be used for "flexible" clothing items that do not need to be refitted (e.g. aliens wearing jumpsuits). - */ - var/list/sprite_sheets_refit = null var/ear_protection = 0 var/blood_sprite_state @@ -164,9 +156,6 @@ species_restricted = list(target_species) //Set icon - if (sprite_sheets_refit && (target_species in sprite_sheets_refit)) - LAZYSET(sprite_sheets, target_species, sprite_sheets_refit[target_species]) - if (sprite_sheets_obj && (target_species in sprite_sheets_obj)) icon = sprite_sheets_obj[target_species] else @@ -212,9 +201,6 @@ species_restricted = list(target_species) //Set icon - if (sprite_sheets_refit && (target_species in sprite_sheets_refit)) - LAZYSET(sprite_sheets, target_species, sprite_sheets_refit[target_species]) - if (sprite_sheets_obj && (target_species in sprite_sheets_obj)) icon = sprite_sheets_obj[target_species] else @@ -1060,2119 +1046,3 @@ /obj/item/clothing/under/rank/New() sensor_mode = pick(0,1,2,3) ..() -||||||| parent of 9b03341473... Merge pull request #11162 from VOREStation/Arokha/cycletweaks -/obj/item/clothing - name = "clothing" - siemens_coefficient = 0.9 - drop_sound = 'sound/items/drop/clothing.ogg' - pickup_sound = 'sound/items/pickup/clothing.ogg' - var/list/species_restricted = null //Only these species can wear this kit. - var/gunshot_residue //Used by forensics. - - var/list/accessories - var/list/valid_accessory_slots - var/list/restricted_accessory_slots - var/list/starting_accessories - - var/flash_protection = FLASH_PROTECTION_NONE - var/tint = TINT_NONE - var/list/enables_planes //Enables these planes in the wearing mob's plane_holder - var/list/plane_slots //But only if it's equipped into this specific slot - - /* - Sprites used when the clothing item is refit. This is done by setting icon_override. - For best results, if this is set then sprite_sheets should be null and vice versa, but that is by no means necessary. - Ideally, sprite_sheets_refit should be used for "hard" clothing items that can't change shape very well to fit the wearer (e.g. helmets, hardsuits), - while sprite_sheets should be used for "flexible" clothing items that do not need to be refitted (e.g. aliens wearing jumpsuits). - */ - var/list/sprite_sheets_refit = null - var/ear_protection = 0 - var/blood_sprite_state - - var/update_icon_define = null // Only needed if you've got multiple files for the same type of clothing - - var/polychromic = FALSE //VOREStation edit - -//Updates the icons of the mob wearing the clothing item, if any. -/obj/item/clothing/proc/update_clothing_icon() - return - -// Aurora forensics port. -/obj/item/clothing/clean_blood() - . = ..() - gunshot_residue = null - - -/obj/item/clothing/New() - ..() - if(starting_accessories) - for(var/T in starting_accessories) - var/obj/item/clothing/accessory/tie = new T(src) - src.attach_accessory(null, tie) - set_clothing_index() - - //VOREStation edit start - if(polychromic) - verbs |= /obj/item/clothing/proc/change_color - //VOREStation edit start - -/obj/item/clothing/update_icon() - cut_overlays() //This removes all the overlays on the sprite and then goes down a checklist adding them as required. - if(blood_DNA) - add_blood() - . = ..() - -/obj/item/clothing/equipped(var/mob/user,var/slot) - ..() - if(enables_planes) - user.recalculate_vis() - -/obj/item/clothing/dropped(var/mob/user) - ..() - if(enables_planes) - user.recalculate_vis() - -//BS12: Species-restricted clothing check. -/obj/item/clothing/mob_can_equip(M as mob, slot, disable_warning = FALSE) - - //if we can't equip the item anyway, don't bother with species_restricted (cuts down on spam) - if (!..()) - return 0 - - if(LAZYLEN(species_restricted) && istype(M,/mob/living/carbon/human)) - var/exclusive = null - var/wearable = null - var/mob/living/carbon/human/H = M - - if("exclude" in species_restricted) - exclusive = 1 - - if(H.species) - if(exclusive) - if(!(H.species.get_bodytype(H) in species_restricted)) - wearable = 1 - else - if(H.species.get_bodytype(H) in species_restricted) - wearable = 1 - - if(!wearable && !(slot in list(slot_l_store, slot_r_store, slot_s_store))) - to_chat(H, "Your species cannot wear [src].") - return 0 - return 1 - -/obj/item/clothing/handle_shield(mob/user, var/damage, atom/damage_source = null, mob/attacker = null, var/def_zone = null, var/attack_text = "the attack") - . = ..() - if((. == 0) && LAZYLEN(accessories)) - for(var/obj/item/I in accessories) - var/check = I.handle_shield(user, damage, damage_source, attacker, def_zone, attack_text) - - if(check != 0) // Projectiles sometimes use negatives IIRC, 0 is only returned if something is not blocked. - . = check - break - -// For now, these two temp procs only return TRUE or FALSE if they can provide resistance to a given temperature. -/obj/item/clothing/proc/handle_low_temperature(var/tempcheck = T20C) - . = FALSE - if(LAZYLEN(accessories)) - for(var/obj/item/clothing/C in accessories) - if(C.handle_low_temperature(tempcheck)) - . = TRUE - - if(min_cold_protection_temperature && min_cold_protection_temperature <= tempcheck) - . = TRUE - -/obj/item/clothing/proc/handle_high_temperature(var/tempcheck = T20C) - . = FALSE - if(LAZYLEN(accessories)) - for(var/obj/item/clothing/C in accessories) - if(C.handle_high_temperature(tempcheck)) - . = TRUE - - if(max_heat_protection_temperature && max_heat_protection_temperature >= tempcheck) - . = TRUE - -// Returns the relative flag-vars for covered protection. -/obj/item/clothing/proc/get_cold_protection_flags() - . = cold_protection - - if(LAZYLEN(accessories)) - for(var/obj/item/clothing/C in accessories) - . |= C.get_cold_protection_flags() - -/obj/item/clothing/proc/get_heat_protection_flags() - . = heat_protection - - if(LAZYLEN(accessories)) - for(var/obj/item/clothing/C in accessories) - . |= C.get_heat_protection_flags() - -/obj/item/clothing/proc/refit_for_species(var/target_species) - if(!species_restricted) - return //this item doesn't use the species_restricted system - - //Set species_restricted list - switch(target_species) - //VOREStation Edit Start - if(SPECIES_HUMAN, SPECIES_SKRELL) //humanoid bodytypes - species_restricted = list(SPECIES_HUMAN, SPECIES_SKRELL, SPECIES_RAPALA, SPECIES_VASILISSAN, SPECIES_ALRAUNE, SPECIES_PROMETHEAN, SPECIES_XENOCHIMERA) - if(SPECIES_UNATHI) - species_restricted = list(SPECIES_UNATHI, SPECIES_XENOHYBRID) - if(SPECIES_VULPKANIN) - species_restricted = list(SPECIES_VULPKANIN, SPECIES_ZORREN_HIGH, SPECIES_FENNEC) - if(SPECIES_SERGAL) - species_restricted = list(SPECIES_SERGAL, SPECIES_NEVREAN) - //VOREStation Edit End - else - species_restricted = list(target_species) - - //Set icon - if (sprite_sheets_refit && (target_species in sprite_sheets_refit)) - LAZYSET(sprite_sheets, target_species, sprite_sheets_refit[target_species]) - - if (sprite_sheets_obj && (target_species in sprite_sheets_obj)) - icon = sprite_sheets_obj[target_species] - else - icon = initial(icon) - -//VOREStation edit start -/obj/item/clothing/proc/change_color() - set name = "Change Color" - set category = "Object" - set desc = "Change the color of the clothing." - set src in usr - - if(usr.stat || usr.restrained() || usr.incapacitated()) - return - - var/new_color = input(usr, "Pick a new color", "Color", color) as color|null - - if(new_color && (new_color != color)) - color = new_color - update_icon() - update_clothing_icon() -//VOREStation edit end - -/obj/item/clothing/head/helmet/refit_for_species(var/target_species) - if(!species_restricted) - return //this item doesn't use the species_restricted system - - //Set species_restricted list - switch(target_species) - //VOREStation Edit Start - if(SPECIES_HUMAN) - species_restricted = list(SPECIES_HUMAN, SPECIES_RAPALA, SPECIES_VASILISSAN, SPECIES_ALRAUNE, SPECIES_PROMETHEAN, SPECIES_XENOCHIMERA) - if(SPECIES_SKRELL) - species_restricted = list(SPECIES_HUMAN, SPECIES_SKRELL, SPECIES_RAPALA, SPECIES_VASILISSAN, SPECIES_ALRAUNE, SPECIES_PROMETHEAN, SPECIES_XENOCHIMERA) - if(SPECIES_UNATHI) - species_restricted = list(SPECIES_UNATHI, SPECIES_XENOHYBRID) - if(SPECIES_VULPKANIN) - species_restricted = list(SPECIES_VULPKANIN, SPECIES_ZORREN_HIGH, SPECIES_FENNEC) - if(SPECIES_SERGAL) - species_restricted = list(SPECIES_SERGAL, SPECIES_NEVREAN) - //VOREStation Edit End - else - species_restricted = list(target_species) - - //Set icon - if (sprite_sheets_refit && (target_species in sprite_sheets_refit)) - LAZYSET(sprite_sheets, target_species, sprite_sheets_refit[target_species]) - - if (sprite_sheets_obj && (target_species in sprite_sheets_obj)) - icon = sprite_sheets_obj[target_species] - else - icon = initial(icon) - -/////////////////////////////////////////////////////////////////////// -// Ears: headsets, earmuffs and tiny objects -/obj/item/clothing/ears - name = "ears" - w_class = ITEMSIZE_TINY - throwforce = 2 - slot_flags = SLOT_EARS - sprite_sheets = list( - SPECIES_TESHARI = 'icons/inventory/ears/mob_teshari.dmi') - -/obj/item/clothing/ears/attack_hand(mob/user as mob) - if (!user) return - - if (src.loc != user || !istype(user,/mob/living/carbon/human)) - ..() - return - - var/mob/living/carbon/human/H = user - if(H.l_ear != src && H.r_ear != src) - ..() - return - - if(!canremove) - return - - var/obj/item/clothing/ears/O - if(slot_flags & SLOT_TWOEARS ) - O = (H.l_ear == src ? H.r_ear : H.l_ear) - user.u_equip(O) - if(!istype(src,/obj/item/clothing/ears/offear)) - qdel(O) - O = src - else - O = src - - user.unEquip(src) - - if (O) - user.put_in_hands(O) - O.add_fingerprint(user) - - if(istype(src,/obj/item/clothing/ears/offear)) - qdel(src) - -/obj/item/clothing/ears/update_clothing_icon() - if (ismob(src.loc)) - var/mob/M = src.loc - M.update_inv_ears() - -/obj/item/clothing/ears/MouseDrop(var/obj/over_object) - if(ishuman(usr)) - var/mob/living/carbon/human/H = usr - // If this covers both ears, we want to return the result of unequipping the primary object, and kill the off-ear one - if(slot_flags & SLOT_TWOEARS) - var/obj/item/clothing/ears/O = (H.l_ear == src ? H.r_ear : H.l_ear) - if(istype(src, /obj/item/clothing/ears/offear)) - . = O.MouseDrop(over_object) - H.drop_from_inventory(src) - qdel(src) - else - . = ..() - H.drop_from_inventory(O) - qdel(O) - else - . = ..() - - -/obj/item/clothing/ears/offear - name = "Other ear" - w_class = ITEMSIZE_HUGE - icon = 'icons/mob/screen1_Midnight.dmi' - icon_state = "block" - slot_flags = SLOT_EARS | SLOT_TWOEARS - -/obj/item/clothing/ears/offear/New(var/obj/O) - name = O.name - desc = O.desc - icon = O.icon - icon_state = O.icon_state - set_dir(O.dir) - -//////////////////////////////////////////////////////////////////////////////////////// -//Gloves -/obj/item/clothing/gloves - name = "gloves" - item_icons = list( - slot_l_hand_str = 'icons/mob/items/lefthand_gloves.dmi', - slot_r_hand_str = 'icons/mob/items/righthand_gloves.dmi', - ) - gender = PLURAL //Carn: for grammarically correct text-parsing - w_class = ITEMSIZE_SMALL - icon = 'icons/inventory/hands/item.dmi' - siemens_coefficient = 0.9 - blood_sprite_state = "bloodyhands" - var/wired = 0 - var/obj/item/weapon/cell/cell = 0 - var/fingerprint_chance = 0 //How likely the glove is to let fingerprints through - var/obj/item/clothing/gloves/ring = null //Covered ring - var/mob/living/carbon/human/wearer = null //Used for covered rings when dropping - var/glove_level = 2 //What "layer" the glove is on - var/overgloves = 0 //Used by gauntlets and arm_guards - var/punch_force = 0 //How much damage do these gloves add to a punch? - var/punch_damtype = BRUTE //What type of damage does this make fists be? - body_parts_covered = HANDS - slot_flags = SLOT_GLOVES - attack_verb = list("challenged") - sprite_sheets = list( - SPECIES_TESHARI = 'icons/inventory/hands/mob_teshari.dmi', - SPECIES_VOX = 'icons/inventory/hands/mob_vox.dmi' - ) - drop_sound = 'sound/items/drop/gloves.ogg' - pickup_sound = 'sound/items/pickup/gloves.ogg' - -/obj/item/clothing/proc/set_clothing_index() - return - -/obj/item/clothing/gloves/update_clothing_icon() - if (ismob(src.loc)) - var/mob/M = src.loc - M.update_inv_gloves() - -/obj/item/clothing/gloves/emp_act(severity) - if(cell) - cell.emp_act(severity) - if(ring) - ring.emp_act(severity) - ..() - -// Called just before an attack_hand(), in mob/UnarmedAttack() -/obj/item/clothing/gloves/proc/Touch(var/atom/A, var/proximity) - return 0 // return 1 to cancel attack_hand() - -/*/obj/item/clothing/gloves/attackby(obj/item/weapon/W, mob/user) - if(W.is_wirecutter() || istype(W, /obj/item/weapon/scalpel)) - if (clipped) - to_chat(user, "The [src] have already been clipped!") - update_icon() - return - - playsound(src, W.usesound, 50, 1) - user.visible_message("[user] cuts the fingertips off of the [src].","You cut the fingertips off of the [src].") - - clipped = 1 - name = "modified [name]" - desc = "[desc]
They have had the fingertips cut off of them." - if("exclude" in species_restricted) - species_restricted -= SPECIES_UNATHI - species_restricted -= SPECIES_TAJ - return -*/ - -/obj/item/clothing/gloves/clean_blood() - . = ..() - transfer_blood = 0 - update_icon() - -/obj/item/clothing/gloves/mob_can_equip(mob/user, slot, disable_warning = FALSE) - var/mob/living/carbon/human/H = user - - if(slot && slot == slot_gloves) - var/obj/item/clothing/gloves/G = H.gloves - if(istype(G)) - ring = H.gloves - if(ring.glove_level >= src.glove_level) - to_chat(user, "You are unable to wear \the [src] as \the [H.gloves] are in the way.") - ring = null - return 0 - else - H.drop_from_inventory(ring) //Remove the ring (or other under-glove item in the hand slot?) so you can put on the gloves. - ring.forceMove(src) - to_chat(user, "You slip \the [src] on over \the [src.ring].") - if(!(flags & THICKMATERIAL)) - punch_force += ring.punch_force - else - ring = null - - if(!..()) - if(ring) //Put the ring back on if the check fails. - if(H.equip_to_slot_if_possible(ring, slot_gloves)) - src.ring = null - punch_force = initial(punch_force) - return 0 - - wearer = H //TODO clean this when magboots are cleaned - return 1 - -/obj/item/clothing/gloves/dropped() - ..() - - if(!wearer) - return - - var/mob/living/carbon/human/H = wearer - if(ring && istype(H)) - if(!H.equip_to_slot_if_possible(ring, slot_gloves)) - ring.forceMove(get_turf(src)) - src.ring = null - punch_force = initial(punch_force) - wearer = null - -/obj/item/clothing/gloves - var/datum/unarmed_attack/special_attack = null //do the gloves have a special unarmed attack? - var/special_attack_type = null - -/obj/item/clothing/gloves/New() - ..() - if(special_attack_type && ispath(special_attack_type)) - special_attack = new special_attack_type - - - -///////////////////////////////////////////////////////////////////// -//Rings - -/obj/item/clothing/gloves/ring - name = "ring" - w_class = ITEMSIZE_TINY - icon = 'icons/inventory/hands/item.dmi' - gender = NEUTER - species_restricted = list("exclude", SPECIES_DIONA) - siemens_coefficient = 1 - glove_level = 1 - fingerprint_chance = 100 - punch_force = 2 - body_parts_covered = 0 - drop_sound = 'sound/items/drop/ring.ogg' - pickup_sound = 'sound/items/pickup/ring.ogg' - -/////////////////////////////////////////////////////////////////////// -//Head -/obj/item/clothing/head - name = "head" - icon = 'icons/inventory/head/item.dmi' - item_icons = list( - slot_l_hand_str = 'icons/mob/items/lefthand_hats.dmi', - slot_r_hand_str = 'icons/mob/items/righthand_hats.dmi', - ) - body_parts_covered = HEAD - slot_flags = SLOT_HEAD - w_class = ITEMSIZE_SMALL - blood_sprite_state = "helmetblood" - - light_system = MOVABLE_LIGHT_DIRECTIONAL - light_cone_y_offset = 11 - - var/light_overlay = "helmet_light" - var/image/helmet_light - - sprite_sheets = list( - SPECIES_TESHARI = 'icons/inventory/head/mob_teshari.dmi', - SPECIES_VOX = 'icons/inventory/head/mob_vox.dmi' - ) - drop_sound = 'sound/items/drop/hat.ogg' - pickup_sound = 'sound/items/pickup/hat.ogg' - -/obj/item/clothing/head/attack_self(mob/user) - if(light_range) - if(!isturf(user.loc)) - to_chat(user, "You cannot toggle the light while in this [user.loc]") - return - update_flashlight(user) - to_chat(user, "You [light_on ? "enable" : "disable"] the helmet light.") - else - return ..(user) - -/obj/item/clothing/head/proc/update_flashlight(var/mob/user = null) - set_light_on(!light_on) - - if(light_system == STATIC_LIGHT) - update_light() - - update_icon(user) - user.update_action_buttons() - -/obj/item/clothing/head/attack_ai(var/mob/user) - if(!mob_wear_hat(user)) - return ..() - -/obj/item/clothing/head/attack_generic(var/mob/user) - if(!mob_wear_hat(user)) - return ..() - -/obj/item/clothing/head/proc/mob_wear_hat(var/mob/user) - if(!Adjacent(user)) - return 0 - var/success - if(istype(user, /mob/living/silicon/robot/drone)) - var/mob/living/silicon/robot/drone/D = user - if(D.hat) - success = 2 - else - D.wear_hat(src) - success = 1 - else if(istype(user, /mob/living/carbon/alien/diona)) - var/mob/living/carbon/alien/diona/D = user - if(D.hat) - success = 2 - else - D.wear_hat(src) - success = 1 - - if(!success) - return 0 - else if(success == 2) - to_chat(user, "You are already wearing a hat.") - else if(success == 1) - to_chat(user, "You crawl under \the [src].") - return 1 - -/obj/item/clothing/head/update_icon(var/mob/user) - var/mob/living/carbon/human/H - if(ishuman(user)) - H = user - - if(light_on) - // Generate object icon. - if(!light_overlay_cache["[light_overlay]_icon"]) - light_overlay_cache["[light_overlay]_icon"] = image(icon = 'icons/obj/light_overlays.dmi', icon_state = "[light_overlay]") - helmet_light = light_overlay_cache["[light_overlay]_icon"] - add_overlay(helmet_light) - - // Generate and cache the on-mob icon, which is used in update_inv_head(). - var/body_type = (H && H.species.get_bodytype(H)) - var/cache_key = "[light_overlay][body_type && LAZYACCESS(sprite_sheets, body_type) ? body_type : ""]" - if(!light_overlay_cache[cache_key]) - var/use_icon = LAZYACCESS(sprite_sheets, body_type) || 'icons/mob/light_overlays.dmi' - light_overlay_cache[cache_key] = image(icon = use_icon, icon_state = "[light_overlay]") - - else if(helmet_light) - cut_overlay(helmet_light) - helmet_light = null - - user.update_inv_head() //Will redraw the helmet with the light on the mob - -/obj/item/clothing/head/update_clothing_icon() - if (ismob(src.loc)) - var/mob/M = src.loc - M.update_inv_head() - -/////////////////////////////////////////////////////////////////////// -//Mask -/obj/item/clothing/mask - name = "mask" - icon = 'icons/inventory/face/item.dmi' - item_icons = list( - slot_l_hand_str = 'icons/mob/items/lefthand_masks.dmi', - slot_r_hand_str = 'icons/mob/items/righthand_masks.dmi', - ) - body_parts_covered = HEAD - slot_flags = SLOT_MASK - body_parts_covered = FACE|EYES - blood_sprite_state = "maskblood" - sprite_sheets = list( - SPECIES_TESHARI = 'icons/inventory/face/mob_teshari.dmi', - SPECIES_VOX = 'icons/inventory/face/mob_vox.dmi', - SPECIES_TAJ = 'icons/inventory/face/mob_tajaran.dmi', - SPECIES_UNATHI = 'icons/inventory/face/mob_unathi.dmi' - ) - - var/voicechange = 0 - var/list/say_messages - var/list/say_verbs - - drop_sound = "generic_drop" - pickup_sound = "generic_pickup" - -/obj/item/clothing/mask/update_clothing_icon() - if (ismob(src.loc)) - var/mob/M = src.loc - M.update_inv_wear_mask() - -/obj/item/clothing/mask/proc/filter_air(datum/gas_mixture/air) - return - -/////////////////////////////////////////////////////////////////////// -//Shoes -/obj/item/clothing/shoes - name = "shoes" - icon = 'icons/inventory/feet/item.dmi' - item_icons = list( - slot_l_hand_str = 'icons/mob/items/lefthand_shoes.dmi', - slot_r_hand_str = 'icons/mob/items/righthand_shoes.dmi', - ) - desc = "Comfortable-looking shoes." - gender = PLURAL //Carn: for grammarically correct text-parsing - siemens_coefficient = 0.9 - body_parts_covered = FEET - slot_flags = SLOT_FEET - blood_sprite_state = "shoeblood" - - var/can_hold_knife = 0 - var/obj/item/holding - - var/shoes_under_pants = 0 - - var/water_speed = 0 //Speed boost/decrease in water, lower/negative values mean more speed - var/snow_speed = 0 //Speed boost/decrease on snow, lower/negative values mean more speed - var/rock_climbing = FALSE // If true, allows climbing cliffs with clickdrag. - - var/step_volume_mod = 1 //How quiet or loud footsteps in this shoe are - - permeability_coefficient = 0.50 - slowdown = SHOES_SLOWDOWN - force = 2 - var/overshoes = 0 - species_restricted = list("exclude",SPECIES_TESHARI, SPECIES_VOX) - sprite_sheets = list( - SPECIES_TESHARI = 'icons/inventory/feet/mob_teshari.dmi', - SPECIES_VOX = 'icons/inventory/feet/mob_vox.dmi' - ) - drop_sound = 'sound/items/drop/shoes.ogg' - pickup_sound = 'sound/items/pickup/shoes.ogg' - -/obj/item/clothing/shoes/proc/draw_knife() - set name = "Draw Boot Knife" - set desc = "Pull out your boot knife." - set category = "IC" - set src in usr - - if(usr.stat || usr.restrained() || usr.incapacitated()) - return - - holding.forceMove(get_turf(usr)) - - if(usr.put_in_hands(holding)) - usr.visible_message("\The [usr] pulls a knife out of their boot!") - playsound(src, 'sound/weapons/holster/sheathout.ogg', 25) - holding = null - cut_overlay("[icon_state]_knife") - else - to_chat(usr, "Your need an empty, unbroken hand to do that.") - holding.forceMove(src) - - if(!holding) - verbs -= /obj/item/clothing/shoes/proc/draw_knife - - update_icon() - return - -/obj/item/clothing/shoes/attack_hand(var/mob/living/M) - if(can_hold_knife == 1 && holding && src.loc == M) - draw_knife() - return - ..() - -/obj/item/clothing/shoes/attackby(var/obj/item/I, var/mob/user) - if((can_hold_knife == 1) && (istype(I, /obj/item/weapon/material/shard) || \ - istype(I, /obj/item/weapon/material/butterfly) || \ - istype(I, /obj/item/weapon/material/kitchen/utensil) || \ - istype(I, /obj/item/weapon/material/knife/tacknife))) - if(holding) - to_chat(user, "\The [src] is already holding \a [holding].") - return - user.unEquip(I) - I.forceMove(src) - holding = I - user.visible_message("\The [user] shoves \the [I] into \the [src].") - verbs |= /obj/item/clothing/shoes/proc/draw_knife - update_icon() - else - return ..() - -/obj/item/clothing/shoes/verb/toggle_layer() - set name = "Switch Shoe Layer" - set category = "Object" - - if(shoes_under_pants == -1) - to_chat(usr, "\The [src] cannot be worn above your suit!") - return - shoes_under_pants = !shoes_under_pants - update_icon() - -/obj/item/clothing/shoes/update_icon() - . = ..() - if(holding) - add_overlay("[icon_state]_knife") - if(contaminated) - add_overlay(contamination_overlay) - if(gurgled) //VOREStation Edit Start - decontaminate() - gurgle_contaminate() //VOREStation Edit End - if(ismob(usr)) - var/mob/M = usr - M.update_inv_shoes() - -/obj/item/clothing/shoes/clean_blood() - update_icon() - return ..() - -/obj/item/clothing/shoes/proc/handle_movement(var/turf/walking, var/running) - if(prob(1) && !recent_squish) //VOREStation edit begin - recent_squish = 1 - spawn(100) - recent_squish = 0 - for(var/mob/living/M in contents) - var/emote = pick(inside_emotes) - to_chat(M,emote) //VOREStation edit end - return - -/obj/item/clothing/shoes/update_clothing_icon() - if (ismob(src.loc)) - var/mob/M = src.loc - M.update_inv_shoes() - - -/////////////////////////////////////////////////////////////////////// -//Suit -/obj/item/clothing/suit - icon = 'icons/inventory/suit/item.dmi' - item_icons = list( - slot_l_hand_str = 'icons/mob/items/lefthand_suits.dmi', - slot_r_hand_str = 'icons/mob/items/righthand_suits.dmi', - ) - name = "suit" - var/fire_resist = T0C+100 - body_parts_covered = UPPER_TORSO|LOWER_TORSO|ARMS|LEGS - allowed = list(/obj/item/weapon/tank/emergency/oxygen) - armor = list("melee" = 0, "bullet" = 0, "laser" = 0, "energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 0) - slot_flags = SLOT_OCLOTHING - var/blood_overlay_type = "suit" - blood_sprite_state = "suitblood" //Defaults to the suit's blood overlay, so that some blood renders instead of no blood. - - var/taurized = FALSE - siemens_coefficient = 0.9 - w_class = ITEMSIZE_NORMAL - preserve_item = 1 - equip_sound = 'sound/items/jumpsuit_equip.ogg' - - - sprite_sheets = list( - SPECIES_TESHARI = 'icons/inventory/suit/mob_teshari.dmi', - SPECIES_VOX = 'icons/inventory/suit/mob_vox.dmi' - ) - - valid_accessory_slots = (ACCESSORY_SLOT_OVER | ACCESSORY_SLOT_ARMBAND) - restricted_accessory_slots = (ACCESSORY_SLOT_ARMBAND) - -/obj/item/clothing/suit/update_clothing_icon() - if (ismob(src.loc)) - var/mob/M = src.loc - M.update_inv_wear_suit() - -/obj/item/clothing/suit/equipped(var/mob/user, var/slot) - if(ishuman(user)) - var/mob/living/carbon/human/H = user - var/taurtail = istaurtail(H.tail_style) - if((taurized && !taurtail) || (!taurized && taurtail)) - taurize(user, taurtail) - - return ..() - -/obj/item/clothing/suit/proc/taurize(var/mob/living/carbon/human/Taur, has_taur_tail = FALSE) - if(has_taur_tail) - var/datum/sprite_accessory/tail/taur/taurtail = Taur.tail_style - if(taurtail.suit_sprites && (get_worn_icon_state(slot_wear_suit_str) in cached_icon_states(taurtail.suit_sprites))) - icon_override = taurtail.suit_sprites - taurized = TRUE - // means that if a taur puts on an already taurized suit without a taur sprite - // for their taur type, but the previous taur type had a sprite, it stays - // taurized and they end up with that taur style which is funny - else - taurized = FALSE - - if(!taurized) - icon_override = initial(icon_override) - taurized = FALSE - -// Taur suits need to be shifted so its centered on their taur half. -/obj/item/clothing/suit/make_worn_icon(var/body_type,var/slot_name,var/inhands,var/default_icon,var/default_layer = 0,var/icon/clip_mask) - var/image/standing = ..() - if(taurized) //Special snowflake var on suits - standing.pixel_x = -16 - standing.layer = BODY_LAYER + 15 // 15 is above tail layer, so will not be covered by taurbody. - return standing - -/obj/item/clothing/suit/apply_accessories(var/image/standing) - if(LAZYLEN(accessories) && taurized) - for(var/obj/item/clothing/accessory/A in accessories) - var/image/I = new(A.get_mob_overlay()) - I.pixel_x = 16 //Opposite of the pixel_x on the suit (-16) from taurization to cancel it out and puts the accessory in the correct place on the body. - standing.add_overlay(I) - else - return ..() - - -/////////////////////////////////////////////////////////////////////// -//Under clothing -/obj/item/clothing/under - icon = 'icons/inventory/uniform/item.dmi' - item_icons = list( - slot_l_hand_str = 'icons/mob/items/lefthand_uniforms.dmi', - slot_r_hand_str = 'icons/mob/items/righthand_uniforms.dmi', - ) - name = "under" - body_parts_covered = UPPER_TORSO|LOWER_TORSO|LEGS|ARMS - permeability_coefficient = 0.90 - slot_flags = SLOT_ICLOTHING - armor = list(melee = 0, bullet = 0, laser = 0,energy = 0, bomb = 0, bio = 0, rad = 0) - equip_sound = 'sound/items/jumpsuit_equip.ogg' - w_class = ITEMSIZE_NORMAL - show_messages = 1 - blood_sprite_state = "uniformblood" - - var/has_sensor = 1 //For the crew computer 2 = unable to change mode - var/sensor_mode = 0 - /* - 1 = Report living/dead - 2 = Report detailed damages - 3 = Report location - */ - var/displays_id = 1 - var/rolled_down = -1 //0 = unrolled, 1 = rolled, -1 = cannot be toggled - var/rolled_sleeves = -1 //0 = unrolled, 1 = rolled, -1 = cannot be toggled - sprite_sheets = list( - SPECIES_TESHARI = 'icons/inventory/uniform/mob_teshari.dmi', - SPECIES_VOX = 'icons/inventory/uniform/mob_vox.dmi' - ) - - //convenience var for defining the icon state for the overlay used when the clothing is worn. - //Also used by rolling/unrolling. - var/worn_state = null - valid_accessory_slots = (\ - ACCESSORY_SLOT_UTILITY\ - |ACCESSORY_SLOT_WEAPON\ - |ACCESSORY_SLOT_ARMBAND\ - |ACCESSORY_SLOT_DECOR\ - |ACCESSORY_SLOT_MEDAL\ - |ACCESSORY_SLOT_INSIGNIA\ - |ACCESSORY_SLOT_TIE\ - |ACCESSORY_SLOT_RANK\ - |ACCESSORY_SLOT_DEPT\ - |ACCESSORY_SLOT_OVER) - restricted_accessory_slots = (\ - ACCESSORY_SLOT_UTILITY\ - |ACCESSORY_SLOT_WEAPON\ - |ACCESSORY_SLOT_ARMBAND\ - |ACCESSORY_SLOT_TIE\ - |ACCESSORY_SLOT_RANK\ - |ACCESSORY_SLOT_DEPT\ - |ACCESSORY_SLOT_OVER) - - var/icon/rolled_down_icon = 'icons/inventory/uniform/mob_rolled_down.dmi' - var/icon/rolled_down_sleeves_icon = 'icons/inventory/uniform/mob_sleeves_rolled.dmi' - -/obj/item/clothing/under/attack_hand(var/mob/user) - if(LAZYLEN(accessories)) - ..() - if ((ishuman(usr) || issmall(usr)) && src.loc == user) - return - ..() - -/obj/item/clothing/under/New() - ..() - if(worn_state) - LAZYSET(item_state_slots, slot_w_uniform_str, worn_state) - else - worn_state = icon_state - - //autodetect rollability - if(rolled_down < 0) - if(("[worn_state]_d" in cached_icon_states(icon)) || (worn_state in cached_icon_states(rolled_down_icon)) || ("[worn_state]_d" in cached_icon_states(icon_override))) - rolled_down = 0 - - if(rolled_down == -1) - verbs -= /obj/item/clothing/under/verb/rollsuit - if(rolled_sleeves == -1) - verbs -= /obj/item/clothing/under/verb/rollsleeves - -/obj/item/clothing/under/proc/update_rolldown_status() - var/mob/living/carbon/human/H - if(istype(src.loc, /mob/living/carbon/human)) - H = src.loc - - var/icon/under_icon - if(icon_override) - under_icon = icon_override - else if(H && LAZYACCESS(sprite_sheets, H.species.get_bodytype(H))) - under_icon = sprite_sheets[H.species.get_bodytype(H)] - else if(LAZYACCESS(item_icons, slot_w_uniform_str)) - under_icon = item_icons[slot_w_uniform_str] - else if (worn_state in cached_icon_states(rolled_down_icon)) - under_icon = rolled_down_icon - - // The _s is because the icon update procs append it. - if((under_icon == rolled_down_icon && ("[worn_state]" in cached_icon_states(under_icon))) || ("[worn_state]_d" in cached_icon_states(under_icon))) - if(rolled_down != 1) - rolled_down = 0 - else - rolled_down = -1 - if(H) update_clothing_icon() - -/obj/item/clothing/under/proc/update_rollsleeves_status() - var/mob/living/carbon/human/H - if(istype(src.loc, /mob/living/carbon/human)) - H = src.loc - - var/icon/under_icon - if(icon_override) - under_icon = icon_override - else if(H && LAZYACCESS(sprite_sheets, H.species.get_bodytype(H))) - under_icon = sprite_sheets[H.species.get_bodytype(H)] - else if(LAZYACCESS(item_icons, slot_w_uniform_str)) - under_icon = item_icons[slot_w_uniform_str] - else if (worn_state in cached_icon_states(rolled_down_sleeves_icon)) - under_icon = rolled_down_sleeves_icon - else - under_icon = new /icon(INV_W_UNIFORM_DEF_ICON) - - // The _s is because the icon update procs append it. - if((under_icon == rolled_down_sleeves_icon && ("[worn_state]" in cached_icon_states(under_icon))) || ("[worn_state]_r" in cached_icon_states(under_icon))) - if(rolled_sleeves != 1) - rolled_sleeves = 0 - else - rolled_sleeves = -1 - if(H) update_clothing_icon() - -/obj/item/clothing/under/update_clothing_icon() - if (ismob(src.loc)) - var/mob/M = src.loc - M.update_inv_w_uniform() - - set_clothing_index() - - -/obj/item/clothing/under/examine(mob/user) - . = ..() - switch(src.sensor_mode) - if(0) - . += "Its sensors appear to be disabled." - if(1) - . += "Its binary life sensors appear to be enabled." - if(2) - . += "Its vital tracker appears to be enabled." - if(3) - . += "Its vital tracker and tracking beacon appear to be enabled." - -/obj/item/clothing/under/proc/set_sensors(mob/usr as mob) - var/mob/M = usr - if (istype(M, /mob/observer)) return - if (usr.stat || usr.restrained()) return - if(has_sensor >= 2) - to_chat(usr, "The controls are locked.") - return 0 - if(has_sensor <= 0) - to_chat(usr, "This suit does not have any sensors.") - return 0 - - var/list/modes = list("Off", "Binary sensors", "Vitals tracker", "Tracking beacon") - var/switchMode = tgui_input_list(usr, "Select a sensor mode:", "Suit Sensor Mode", modes) - if(get_dist(usr, src) > 1) - to_chat(usr, "You have moved too far away.") - return - sensor_mode = modes.Find(switchMode) - 1 - - if (src.loc == usr) - switch(sensor_mode) - if(0) - usr.visible_message("[usr] adjusts their sensors.", "You disable your suit's remote sensing equipment.") - if(1) - usr.visible_message("[usr] adjusts their sensors.", "Your suit will now report whether you are live or dead.") - if(2) - usr.visible_message("[usr] adjusts their sensors.", "Your suit will now report your vital lifesigns.") - if(3) - usr.visible_message("[usr] adjusts their sensors.", "Your suit will now report your vital lifesigns as well as your coordinate position.") - - else if (istype(src.loc, /mob)) - usr.visible_message("[usr] adjusts [src.loc]'s sensors.", "You adjust [src.loc]'s sensors.") - -/obj/item/clothing/under/verb/toggle() - set name = "Toggle Suit Sensors" - set category = "Object" - set src in usr - set_sensors(usr) - -/obj/item/clothing/under/verb/rollsuit() - set name = "Roll Down Jumpsuit" - set category = "Object" - set src in usr - if(!istype(usr, /mob/living)) return - if(usr.stat) return - - update_rolldown_status() - if(rolled_down == -1) - to_chat(usr, "You cannot roll down [src]!") - return - if((rolled_sleeves == 1) && !(rolled_down)) - rolled_sleeves = 0 - - rolled_down = !rolled_down - if(rolled_down) - body_parts_covered = initial(body_parts_covered) - body_parts_covered &= ~(UPPER_TORSO|ARMS) - if(worn_state in cached_icon_states(rolled_down_icon)) - icon_override = rolled_down_icon - LAZYSET(item_state_slots, slot_w_uniform_str, worn_state) - else - LAZYSET(item_state_slots, slot_w_uniform_str, "[worn_state]_d") - - to_chat(usr, "You roll down your [src].") - else - body_parts_covered = initial(body_parts_covered) - if(icon_override == rolled_down_icon) - icon_override = initial(icon_override) - LAZYSET(item_state_slots, slot_w_uniform_str, worn_state) - to_chat(usr, "You roll up your [src].") - update_clothing_icon() - -/obj/item/clothing/under/verb/rollsleeves() - set name = "Roll Up Sleeves" - set category = "Object" - set src in usr - if(!istype(usr, /mob/living)) return - if(usr.stat) return - - update_rollsleeves_status() - if(rolled_sleeves == -1) - to_chat(usr, "You cannot roll up your [src]'s sleeves!") - return - if(rolled_down == 1) - to_chat(usr, "You must roll up your [src] first!") - return - - rolled_sleeves = !rolled_sleeves - if(rolled_sleeves) - body_parts_covered &= ~(ARMS) - if(worn_state in cached_icon_states(rolled_down_sleeves_icon)) - icon_override = rolled_down_sleeves_icon - LAZYSET(item_state_slots, slot_w_uniform_str, worn_state) - else - LAZYSET(item_state_slots, slot_w_uniform_str, "[worn_state]_r") - to_chat(usr, "You roll up your [src]'s sleeves.") - else - body_parts_covered = initial(body_parts_covered) - if(icon_override == rolled_down_sleeves_icon) - icon_override = initial(icon_override) - LAZYSET(item_state_slots, slot_w_uniform_str, worn_state) - to_chat(usr, "You roll down your [src]'s sleeves.") - update_clothing_icon() - -/obj/item/clothing/under/rank/New() - sensor_mode = pick(0,1,2,3) - ..() -======= -/obj/item/clothing - name = "clothing" - siemens_coefficient = 0.9 - drop_sound = 'sound/items/drop/clothing.ogg' - pickup_sound = 'sound/items/pickup/clothing.ogg' - var/list/species_restricted = null //Only these species can wear this kit. - var/gunshot_residue //Used by forensics. - - var/list/accessories - var/list/valid_accessory_slots - var/list/restricted_accessory_slots - var/list/starting_accessories - - var/flash_protection = FLASH_PROTECTION_NONE - var/tint = TINT_NONE - var/list/enables_planes //Enables these planes in the wearing mob's plane_holder - var/list/plane_slots //But only if it's equipped into this specific slot - - var/ear_protection = 0 - var/blood_sprite_state - - var/update_icon_define = null // Only needed if you've got multiple files for the same type of clothing - - var/polychromic = FALSE //VOREStation edit - -//Updates the icons of the mob wearing the clothing item, if any. -/obj/item/clothing/proc/update_clothing_icon() - return - -// Aurora forensics port. -/obj/item/clothing/clean_blood() - . = ..() - gunshot_residue = null - - -/obj/item/clothing/New() - ..() - if(starting_accessories) - for(var/T in starting_accessories) - var/obj/item/clothing/accessory/tie = new T(src) - src.attach_accessory(null, tie) - set_clothing_index() - - //VOREStation edit start - if(polychromic) - verbs |= /obj/item/clothing/proc/change_color - //VOREStation edit start - -/obj/item/clothing/update_icon() - cut_overlays() //This removes all the overlays on the sprite and then goes down a checklist adding them as required. - if(blood_DNA) - add_blood() - . = ..() - -/obj/item/clothing/equipped(var/mob/user,var/slot) - ..() - if(enables_planes) - user.recalculate_vis() - -/obj/item/clothing/dropped(var/mob/user) - ..() - if(enables_planes) - user.recalculate_vis() - -//BS12: Species-restricted clothing check. -/obj/item/clothing/mob_can_equip(M as mob, slot, disable_warning = FALSE) - - //if we can't equip the item anyway, don't bother with species_restricted (cuts down on spam) - if (!..()) - return 0 - - if(LAZYLEN(species_restricted) && istype(M,/mob/living/carbon/human)) - var/exclusive = null - var/wearable = null - var/mob/living/carbon/human/H = M - - if("exclude" in species_restricted) - exclusive = 1 - - if(H.species) - if(exclusive) - if(!(H.species.get_bodytype(H) in species_restricted)) - wearable = 1 - else - if(H.species.get_bodytype(H) in species_restricted) - wearable = 1 - - if(!wearable && !(slot in list(slot_l_store, slot_r_store, slot_s_store))) - to_chat(H, "Your species cannot wear [src].") - return 0 - return 1 - -/obj/item/clothing/handle_shield(mob/user, var/damage, atom/damage_source = null, mob/attacker = null, var/def_zone = null, var/attack_text = "the attack") - . = ..() - if((. == 0) && LAZYLEN(accessories)) - for(var/obj/item/I in accessories) - var/check = I.handle_shield(user, damage, damage_source, attacker, def_zone, attack_text) - - if(check != 0) // Projectiles sometimes use negatives IIRC, 0 is only returned if something is not blocked. - . = check - break - -// For now, these two temp procs only return TRUE or FALSE if they can provide resistance to a given temperature. -/obj/item/clothing/proc/handle_low_temperature(var/tempcheck = T20C) - . = FALSE - if(LAZYLEN(accessories)) - for(var/obj/item/clothing/C in accessories) - if(C.handle_low_temperature(tempcheck)) - . = TRUE - - if(min_cold_protection_temperature && min_cold_protection_temperature <= tempcheck) - . = TRUE - -/obj/item/clothing/proc/handle_high_temperature(var/tempcheck = T20C) - . = FALSE - if(LAZYLEN(accessories)) - for(var/obj/item/clothing/C in accessories) - if(C.handle_high_temperature(tempcheck)) - . = TRUE - - if(max_heat_protection_temperature && max_heat_protection_temperature >= tempcheck) - . = TRUE - -// Returns the relative flag-vars for covered protection. -/obj/item/clothing/proc/get_cold_protection_flags() - . = cold_protection - - if(LAZYLEN(accessories)) - for(var/obj/item/clothing/C in accessories) - . |= C.get_cold_protection_flags() - -/obj/item/clothing/proc/get_heat_protection_flags() - . = heat_protection - - if(LAZYLEN(accessories)) - for(var/obj/item/clothing/C in accessories) - . |= C.get_heat_protection_flags() - -/obj/item/clothing/proc/refit_for_species(var/target_species) - if(!species_restricted) - return //this item doesn't use the species_restricted system - - //Set species_restricted list - switch(target_species) - //VOREStation Edit Start - if(SPECIES_HUMAN, SPECIES_SKRELL) //humanoid bodytypes - species_restricted = list(SPECIES_HUMAN, SPECIES_SKRELL, SPECIES_RAPALA, SPECIES_VASILISSAN, SPECIES_ALRAUNE, SPECIES_PROMETHEAN, SPECIES_XENOCHIMERA) - if(SPECIES_UNATHI) - species_restricted = list(SPECIES_UNATHI, SPECIES_XENOHYBRID) - if(SPECIES_VULPKANIN) - species_restricted = list(SPECIES_VULPKANIN, SPECIES_ZORREN_HIGH, SPECIES_FENNEC) - if(SPECIES_SERGAL) - species_restricted = list(SPECIES_SERGAL, SPECIES_NEVREAN) - //VOREStation Edit End - else - species_restricted = list(target_species) - - //Set icon - if (sprite_sheets_obj && (target_species in sprite_sheets_obj)) - icon = sprite_sheets_obj[target_species] - else - icon = initial(icon) - -//VOREStation edit start -/obj/item/clothing/proc/change_color() - set name = "Change Color" - set category = "Object" - set desc = "Change the color of the clothing." - set src in usr - - if(usr.stat || usr.restrained() || usr.incapacitated()) - return - - var/new_color = input(usr, "Pick a new color", "Color", color) as color|null - - if(new_color && (new_color != color)) - color = new_color - update_icon() - update_clothing_icon() -//VOREStation edit end - -/obj/item/clothing/head/helmet/refit_for_species(var/target_species) - if(!species_restricted) - return //this item doesn't use the species_restricted system - - //Set species_restricted list - switch(target_species) - //VOREStation Edit Start - if(SPECIES_HUMAN) - species_restricted = list(SPECIES_HUMAN, SPECIES_RAPALA, SPECIES_VASILISSAN, SPECIES_ALRAUNE, SPECIES_PROMETHEAN, SPECIES_XENOCHIMERA) - if(SPECIES_SKRELL) - species_restricted = list(SPECIES_HUMAN, SPECIES_SKRELL, SPECIES_RAPALA, SPECIES_VASILISSAN, SPECIES_ALRAUNE, SPECIES_PROMETHEAN, SPECIES_XENOCHIMERA) - if(SPECIES_UNATHI) - species_restricted = list(SPECIES_UNATHI, SPECIES_XENOHYBRID) - if(SPECIES_VULPKANIN) - species_restricted = list(SPECIES_VULPKANIN, SPECIES_ZORREN_HIGH, SPECIES_FENNEC) - if(SPECIES_SERGAL) - species_restricted = list(SPECIES_SERGAL, SPECIES_NEVREAN) - //VOREStation Edit End - else - species_restricted = list(target_species) - - //Set icon - if (sprite_sheets_obj && (target_species in sprite_sheets_obj)) - icon = sprite_sheets_obj[target_species] - else - icon = initial(icon) - -/////////////////////////////////////////////////////////////////////// -// Ears: headsets, earmuffs and tiny objects -/obj/item/clothing/ears - name = "ears" - w_class = ITEMSIZE_TINY - throwforce = 2 - slot_flags = SLOT_EARS - sprite_sheets = list( - SPECIES_TESHARI = 'icons/inventory/ears/mob_teshari.dmi') - -/obj/item/clothing/ears/attack_hand(mob/user as mob) - if (!user) return - - if (src.loc != user || !istype(user,/mob/living/carbon/human)) - ..() - return - - var/mob/living/carbon/human/H = user - if(H.l_ear != src && H.r_ear != src) - ..() - return - - if(!canremove) - return - - var/obj/item/clothing/ears/O - if(slot_flags & SLOT_TWOEARS ) - O = (H.l_ear == src ? H.r_ear : H.l_ear) - user.u_equip(O) - if(!istype(src,/obj/item/clothing/ears/offear)) - qdel(O) - O = src - else - O = src - - user.unEquip(src) - - if (O) - user.put_in_hands(O) - O.add_fingerprint(user) - - if(istype(src,/obj/item/clothing/ears/offear)) - qdel(src) - -/obj/item/clothing/ears/update_clothing_icon() - if (ismob(src.loc)) - var/mob/M = src.loc - M.update_inv_ears() - -/obj/item/clothing/ears/MouseDrop(var/obj/over_object) - if(ishuman(usr)) - var/mob/living/carbon/human/H = usr - // If this covers both ears, we want to return the result of unequipping the primary object, and kill the off-ear one - if(slot_flags & SLOT_TWOEARS) - var/obj/item/clothing/ears/O = (H.l_ear == src ? H.r_ear : H.l_ear) - if(istype(src, /obj/item/clothing/ears/offear)) - . = O.MouseDrop(over_object) - H.drop_from_inventory(src) - qdel(src) - else - . = ..() - H.drop_from_inventory(O) - qdel(O) - else - . = ..() - - -/obj/item/clothing/ears/offear - name = "Other ear" - w_class = ITEMSIZE_HUGE - icon = 'icons/mob/screen1_Midnight.dmi' - icon_state = "block" - slot_flags = SLOT_EARS | SLOT_TWOEARS - -/obj/item/clothing/ears/offear/New(var/obj/O) - name = O.name - desc = O.desc - icon = O.icon - icon_state = O.icon_state - set_dir(O.dir) - -//////////////////////////////////////////////////////////////////////////////////////// -//Gloves -/obj/item/clothing/gloves - name = "gloves" - item_icons = list( - slot_l_hand_str = 'icons/mob/items/lefthand_gloves.dmi', - slot_r_hand_str = 'icons/mob/items/righthand_gloves.dmi', - ) - gender = PLURAL //Carn: for grammarically correct text-parsing - w_class = ITEMSIZE_SMALL - icon = 'icons/inventory/hands/item.dmi' - siemens_coefficient = 0.9 - blood_sprite_state = "bloodyhands" - var/wired = 0 - var/obj/item/weapon/cell/cell = 0 - var/fingerprint_chance = 0 //How likely the glove is to let fingerprints through - var/obj/item/clothing/gloves/ring = null //Covered ring - var/mob/living/carbon/human/wearer = null //Used for covered rings when dropping - var/glove_level = 2 //What "layer" the glove is on - var/overgloves = 0 //Used by gauntlets and arm_guards - var/punch_force = 0 //How much damage do these gloves add to a punch? - var/punch_damtype = BRUTE //What type of damage does this make fists be? - body_parts_covered = HANDS - slot_flags = SLOT_GLOVES - attack_verb = list("challenged") - sprite_sheets = list( - SPECIES_TESHARI = 'icons/inventory/hands/mob_teshari.dmi', - SPECIES_VOX = 'icons/inventory/hands/mob_vox.dmi' - ) - drop_sound = 'sound/items/drop/gloves.ogg' - pickup_sound = 'sound/items/pickup/gloves.ogg' - -/obj/item/clothing/proc/set_clothing_index() - return - -/obj/item/clothing/gloves/update_clothing_icon() - if (ismob(src.loc)) - var/mob/M = src.loc - M.update_inv_gloves() - -/obj/item/clothing/gloves/emp_act(severity) - if(cell) - cell.emp_act(severity) - if(ring) - ring.emp_act(severity) - ..() - -// Called just before an attack_hand(), in mob/UnarmedAttack() -/obj/item/clothing/gloves/proc/Touch(var/atom/A, var/proximity) - return 0 // return 1 to cancel attack_hand() - -/*/obj/item/clothing/gloves/attackby(obj/item/weapon/W, mob/user) - if(W.is_wirecutter() || istype(W, /obj/item/weapon/scalpel)) - if (clipped) - to_chat(user, "The [src] have already been clipped!") - update_icon() - return - - playsound(src, W.usesound, 50, 1) - user.visible_message("[user] cuts the fingertips off of the [src].","You cut the fingertips off of the [src].") - - clipped = 1 - name = "modified [name]" - desc = "[desc]
They have had the fingertips cut off of them." - if("exclude" in species_restricted) - species_restricted -= SPECIES_UNATHI - species_restricted -= SPECIES_TAJ - return -*/ - -/obj/item/clothing/gloves/clean_blood() - . = ..() - transfer_blood = 0 - update_icon() - -/obj/item/clothing/gloves/mob_can_equip(mob/user, slot, disable_warning = FALSE) - var/mob/living/carbon/human/H = user - - if(slot && slot == slot_gloves) - var/obj/item/clothing/gloves/G = H.gloves - if(istype(G)) - ring = H.gloves - if(ring.glove_level >= src.glove_level) - to_chat(user, "You are unable to wear \the [src] as \the [H.gloves] are in the way.") - ring = null - return 0 - else - H.drop_from_inventory(ring) //Remove the ring (or other under-glove item in the hand slot?) so you can put on the gloves. - ring.forceMove(src) - to_chat(user, "You slip \the [src] on over \the [src.ring].") - if(!(flags & THICKMATERIAL)) - punch_force += ring.punch_force - else - ring = null - - if(!..()) - if(ring) //Put the ring back on if the check fails. - if(H.equip_to_slot_if_possible(ring, slot_gloves)) - src.ring = null - punch_force = initial(punch_force) - return 0 - - wearer = H //TODO clean this when magboots are cleaned - return 1 - -/obj/item/clothing/gloves/dropped() - ..() - - if(!wearer) - return - - var/mob/living/carbon/human/H = wearer - if(ring && istype(H)) - if(!H.equip_to_slot_if_possible(ring, slot_gloves)) - ring.forceMove(get_turf(src)) - src.ring = null - punch_force = initial(punch_force) - wearer = null - -/obj/item/clothing/gloves - var/datum/unarmed_attack/special_attack = null //do the gloves have a special unarmed attack? - var/special_attack_type = null - -/obj/item/clothing/gloves/New() - ..() - if(special_attack_type && ispath(special_attack_type)) - special_attack = new special_attack_type - - - -///////////////////////////////////////////////////////////////////// -//Rings - -/obj/item/clothing/gloves/ring - name = "ring" - w_class = ITEMSIZE_TINY - icon = 'icons/inventory/hands/item.dmi' - gender = NEUTER - species_restricted = list("exclude", SPECIES_DIONA) - siemens_coefficient = 1 - glove_level = 1 - fingerprint_chance = 100 - punch_force = 2 - body_parts_covered = 0 - drop_sound = 'sound/items/drop/ring.ogg' - pickup_sound = 'sound/items/pickup/ring.ogg' - -/////////////////////////////////////////////////////////////////////// -//Head -/obj/item/clothing/head - name = "head" - icon = 'icons/inventory/head/item.dmi' - item_icons = list( - slot_l_hand_str = 'icons/mob/items/lefthand_hats.dmi', - slot_r_hand_str = 'icons/mob/items/righthand_hats.dmi', - ) - body_parts_covered = HEAD - slot_flags = SLOT_HEAD - w_class = ITEMSIZE_SMALL - blood_sprite_state = "helmetblood" - - light_system = MOVABLE_LIGHT_DIRECTIONAL - light_cone_y_offset = 11 - - var/light_overlay = "helmet_light" - var/image/helmet_light - - sprite_sheets = list( - SPECIES_TESHARI = 'icons/inventory/head/mob_teshari.dmi', - SPECIES_VOX = 'icons/inventory/head/mob_vox.dmi' - ) - drop_sound = 'sound/items/drop/hat.ogg' - pickup_sound = 'sound/items/pickup/hat.ogg' - -/obj/item/clothing/head/attack_self(mob/user) - if(light_range) - if(!isturf(user.loc)) - to_chat(user, "You cannot toggle the light while in this [user.loc]") - return - update_flashlight(user) - to_chat(user, "You [light_on ? "enable" : "disable"] the helmet light.") - else - return ..(user) - -/obj/item/clothing/head/proc/update_flashlight(var/mob/user = null) - set_light_on(!light_on) - - if(light_system == STATIC_LIGHT) - update_light() - - update_icon(user) - user.update_action_buttons() - -/obj/item/clothing/head/attack_ai(var/mob/user) - if(!mob_wear_hat(user)) - return ..() - -/obj/item/clothing/head/attack_generic(var/mob/user) - if(!mob_wear_hat(user)) - return ..() - -/obj/item/clothing/head/proc/mob_wear_hat(var/mob/user) - if(!Adjacent(user)) - return 0 - var/success - if(istype(user, /mob/living/silicon/robot/drone)) - var/mob/living/silicon/robot/drone/D = user - if(D.hat) - success = 2 - else - D.wear_hat(src) - success = 1 - else if(istype(user, /mob/living/carbon/alien/diona)) - var/mob/living/carbon/alien/diona/D = user - if(D.hat) - success = 2 - else - D.wear_hat(src) - success = 1 - - if(!success) - return 0 - else if(success == 2) - to_chat(user, "You are already wearing a hat.") - else if(success == 1) - to_chat(user, "You crawl under \the [src].") - return 1 - -/obj/item/clothing/head/update_icon(var/mob/user) - var/mob/living/carbon/human/H - if(ishuman(user)) - H = user - - if(light_on) - // Generate object icon. - if(!light_overlay_cache["[light_overlay]_icon"]) - light_overlay_cache["[light_overlay]_icon"] = image(icon = 'icons/obj/light_overlays.dmi', icon_state = "[light_overlay]") - helmet_light = light_overlay_cache["[light_overlay]_icon"] - add_overlay(helmet_light) - - // Generate and cache the on-mob icon, which is used in update_inv_head(). - var/body_type = (H && H.species.get_bodytype(H)) - var/cache_key = "[light_overlay][body_type && LAZYACCESS(sprite_sheets, body_type) ? body_type : ""]" - if(!light_overlay_cache[cache_key]) - var/use_icon = LAZYACCESS(sprite_sheets, body_type) || 'icons/mob/light_overlays.dmi' - light_overlay_cache[cache_key] = image(icon = use_icon, icon_state = "[light_overlay]") - - else if(helmet_light) - cut_overlay(helmet_light) - helmet_light = null - - user.update_inv_head() //Will redraw the helmet with the light on the mob - -/obj/item/clothing/head/update_clothing_icon() - if (ismob(src.loc)) - var/mob/M = src.loc - M.update_inv_head() - -/////////////////////////////////////////////////////////////////////// -//Mask -/obj/item/clothing/mask - name = "mask" - icon = 'icons/inventory/face/item.dmi' - item_icons = list( - slot_l_hand_str = 'icons/mob/items/lefthand_masks.dmi', - slot_r_hand_str = 'icons/mob/items/righthand_masks.dmi', - ) - body_parts_covered = HEAD - slot_flags = SLOT_MASK - body_parts_covered = FACE|EYES - blood_sprite_state = "maskblood" - sprite_sheets = list( - SPECIES_TESHARI = 'icons/inventory/face/mob_teshari.dmi', - SPECIES_VOX = 'icons/inventory/face/mob_vox.dmi', - SPECIES_TAJ = 'icons/inventory/face/mob_tajaran.dmi', - SPECIES_UNATHI = 'icons/inventory/face/mob_unathi.dmi' - ) - - var/voicechange = 0 - var/list/say_messages - var/list/say_verbs - - drop_sound = "generic_drop" - pickup_sound = "generic_pickup" - -/obj/item/clothing/mask/update_clothing_icon() - if (ismob(src.loc)) - var/mob/M = src.loc - M.update_inv_wear_mask() - -/obj/item/clothing/mask/proc/filter_air(datum/gas_mixture/air) - return - -/////////////////////////////////////////////////////////////////////// -//Shoes -/obj/item/clothing/shoes - name = "shoes" - icon = 'icons/inventory/feet/item.dmi' - item_icons = list( - slot_l_hand_str = 'icons/mob/items/lefthand_shoes.dmi', - slot_r_hand_str = 'icons/mob/items/righthand_shoes.dmi', - ) - desc = "Comfortable-looking shoes." - gender = PLURAL //Carn: for grammarically correct text-parsing - siemens_coefficient = 0.9 - body_parts_covered = FEET - slot_flags = SLOT_FEET - blood_sprite_state = "shoeblood" - - var/can_hold_knife = 0 - var/obj/item/holding - - var/shoes_under_pants = 0 - - var/water_speed = 0 //Speed boost/decrease in water, lower/negative values mean more speed - var/snow_speed = 0 //Speed boost/decrease on snow, lower/negative values mean more speed - var/rock_climbing = FALSE // If true, allows climbing cliffs with clickdrag. - - var/step_volume_mod = 1 //How quiet or loud footsteps in this shoe are - - permeability_coefficient = 0.50 - slowdown = SHOES_SLOWDOWN - force = 2 - var/overshoes = 0 - species_restricted = list("exclude",SPECIES_TESHARI, SPECIES_VOX) - sprite_sheets = list( - SPECIES_TESHARI = 'icons/inventory/feet/mob_teshari.dmi', - SPECIES_VOX = 'icons/inventory/feet/mob_vox.dmi' - ) - drop_sound = 'sound/items/drop/shoes.ogg' - pickup_sound = 'sound/items/pickup/shoes.ogg' - -/obj/item/clothing/shoes/proc/draw_knife() - set name = "Draw Boot Knife" - set desc = "Pull out your boot knife." - set category = "IC" - set src in usr - - if(usr.stat || usr.restrained() || usr.incapacitated()) - return - - holding.forceMove(get_turf(usr)) - - if(usr.put_in_hands(holding)) - usr.visible_message("\The [usr] pulls a knife out of their boot!") - playsound(src, 'sound/weapons/holster/sheathout.ogg', 25) - holding = null - cut_overlay("[icon_state]_knife") - else - to_chat(usr, "Your need an empty, unbroken hand to do that.") - holding.forceMove(src) - - if(!holding) - verbs -= /obj/item/clothing/shoes/proc/draw_knife - - update_icon() - return - -/obj/item/clothing/shoes/attack_hand(var/mob/living/M) - if(can_hold_knife == 1 && holding && src.loc == M) - draw_knife() - return - ..() - -/obj/item/clothing/shoes/attackby(var/obj/item/I, var/mob/user) - if((can_hold_knife == 1) && (istype(I, /obj/item/weapon/material/shard) || \ - istype(I, /obj/item/weapon/material/butterfly) || \ - istype(I, /obj/item/weapon/material/kitchen/utensil) || \ - istype(I, /obj/item/weapon/material/knife/tacknife))) - if(holding) - to_chat(user, "\The [src] is already holding \a [holding].") - return - user.unEquip(I) - I.forceMove(src) - holding = I - user.visible_message("\The [user] shoves \the [I] into \the [src].") - verbs |= /obj/item/clothing/shoes/proc/draw_knife - update_icon() - else - return ..() - -/obj/item/clothing/shoes/verb/toggle_layer() - set name = "Switch Shoe Layer" - set category = "Object" - - if(shoes_under_pants == -1) - to_chat(usr, "\The [src] cannot be worn above your suit!") - return - shoes_under_pants = !shoes_under_pants - update_icon() - -/obj/item/clothing/shoes/update_icon() - . = ..() - if(holding) - add_overlay("[icon_state]_knife") - if(contaminated) - add_overlay(contamination_overlay) - if(gurgled) //VOREStation Edit Start - decontaminate() - gurgle_contaminate() //VOREStation Edit End - if(ismob(usr)) - var/mob/M = usr - M.update_inv_shoes() - -/obj/item/clothing/shoes/clean_blood() - update_icon() - return ..() - -/obj/item/clothing/shoes/proc/handle_movement(var/turf/walking, var/running) - if(prob(1) && !recent_squish) //VOREStation edit begin - recent_squish = 1 - spawn(100) - recent_squish = 0 - for(var/mob/living/M in contents) - var/emote = pick(inside_emotes) - to_chat(M,emote) //VOREStation edit end - return - -/obj/item/clothing/shoes/update_clothing_icon() - if (ismob(src.loc)) - var/mob/M = src.loc - M.update_inv_shoes() - - -/////////////////////////////////////////////////////////////////////// -//Suit -/obj/item/clothing/suit - icon = 'icons/inventory/suit/item.dmi' - item_icons = list( - slot_l_hand_str = 'icons/mob/items/lefthand_suits.dmi', - slot_r_hand_str = 'icons/mob/items/righthand_suits.dmi', - ) - name = "suit" - var/fire_resist = T0C+100 - body_parts_covered = UPPER_TORSO|LOWER_TORSO|ARMS|LEGS - allowed = list(/obj/item/weapon/tank/emergency/oxygen) - armor = list("melee" = 0, "bullet" = 0, "laser" = 0, "energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 0) - slot_flags = SLOT_OCLOTHING - var/blood_overlay_type = "suit" - blood_sprite_state = "suitblood" //Defaults to the suit's blood overlay, so that some blood renders instead of no blood. - - var/taurized = FALSE - siemens_coefficient = 0.9 - w_class = ITEMSIZE_NORMAL - preserve_item = 1 - equip_sound = 'sound/items/jumpsuit_equip.ogg' - - - sprite_sheets = list( - SPECIES_TESHARI = 'icons/inventory/suit/mob_teshari.dmi', - SPECIES_VOX = 'icons/inventory/suit/mob_vox.dmi' - ) - - valid_accessory_slots = (ACCESSORY_SLOT_OVER | ACCESSORY_SLOT_ARMBAND) - restricted_accessory_slots = (ACCESSORY_SLOT_ARMBAND) - -/obj/item/clothing/suit/update_clothing_icon() - if (ismob(src.loc)) - var/mob/M = src.loc - M.update_inv_wear_suit() - -/obj/item/clothing/suit/equipped(var/mob/user, var/slot) - if(ishuman(user)) - var/mob/living/carbon/human/H = user - var/taurtail = istaurtail(H.tail_style) - if((taurized && !taurtail) || (!taurized && taurtail)) - taurize(user, taurtail) - - return ..() - -/obj/item/clothing/suit/proc/taurize(var/mob/living/carbon/human/Taur, has_taur_tail = FALSE) - if(has_taur_tail) - var/datum/sprite_accessory/tail/taur/taurtail = Taur.tail_style - if(taurtail.suit_sprites && (get_worn_icon_state(slot_wear_suit_str) in cached_icon_states(taurtail.suit_sprites))) - icon_override = taurtail.suit_sprites - taurized = TRUE - // means that if a taur puts on an already taurized suit without a taur sprite - // for their taur type, but the previous taur type had a sprite, it stays - // taurized and they end up with that taur style which is funny - else - taurized = FALSE - - if(!taurized) - icon_override = initial(icon_override) - taurized = FALSE - -// Taur suits need to be shifted so its centered on their taur half. -/obj/item/clothing/suit/make_worn_icon(var/body_type,var/slot_name,var/inhands,var/default_icon,var/default_layer = 0,var/icon/clip_mask) - var/image/standing = ..() - if(taurized) //Special snowflake var on suits - standing.pixel_x = -16 - standing.layer = BODY_LAYER + 15 // 15 is above tail layer, so will not be covered by taurbody. - return standing - -/obj/item/clothing/suit/apply_accessories(var/image/standing) - if(LAZYLEN(accessories) && taurized) - for(var/obj/item/clothing/accessory/A in accessories) - var/image/I = new(A.get_mob_overlay()) - I.pixel_x = 16 //Opposite of the pixel_x on the suit (-16) from taurization to cancel it out and puts the accessory in the correct place on the body. - standing.add_overlay(I) - else - return ..() - - -/////////////////////////////////////////////////////////////////////// -//Under clothing -/obj/item/clothing/under - icon = 'icons/inventory/uniform/item.dmi' - item_icons = list( - slot_l_hand_str = 'icons/mob/items/lefthand_uniforms.dmi', - slot_r_hand_str = 'icons/mob/items/righthand_uniforms.dmi', - ) - name = "under" - body_parts_covered = UPPER_TORSO|LOWER_TORSO|LEGS|ARMS - permeability_coefficient = 0.90 - slot_flags = SLOT_ICLOTHING - armor = list(melee = 0, bullet = 0, laser = 0,energy = 0, bomb = 0, bio = 0, rad = 0) - equip_sound = 'sound/items/jumpsuit_equip.ogg' - w_class = ITEMSIZE_NORMAL - show_messages = 1 - blood_sprite_state = "uniformblood" - - var/has_sensor = 1 //For the crew computer 2 = unable to change mode - var/sensor_mode = 0 - /* - 1 = Report living/dead - 2 = Report detailed damages - 3 = Report location - */ - var/displays_id = 1 - var/rolled_down = -1 //0 = unrolled, 1 = rolled, -1 = cannot be toggled - var/rolled_sleeves = -1 //0 = unrolled, 1 = rolled, -1 = cannot be toggled - sprite_sheets = list( - SPECIES_TESHARI = 'icons/inventory/uniform/mob_teshari.dmi', - SPECIES_VOX = 'icons/inventory/uniform/mob_vox.dmi' - ) - - //convenience var for defining the icon state for the overlay used when the clothing is worn. - //Also used by rolling/unrolling. - var/worn_state = null - valid_accessory_slots = (\ - ACCESSORY_SLOT_UTILITY\ - |ACCESSORY_SLOT_WEAPON\ - |ACCESSORY_SLOT_ARMBAND\ - |ACCESSORY_SLOT_DECOR\ - |ACCESSORY_SLOT_MEDAL\ - |ACCESSORY_SLOT_INSIGNIA\ - |ACCESSORY_SLOT_TIE\ - |ACCESSORY_SLOT_RANK\ - |ACCESSORY_SLOT_DEPT\ - |ACCESSORY_SLOT_OVER) - restricted_accessory_slots = (\ - ACCESSORY_SLOT_UTILITY\ - |ACCESSORY_SLOT_WEAPON\ - |ACCESSORY_SLOT_ARMBAND\ - |ACCESSORY_SLOT_TIE\ - |ACCESSORY_SLOT_RANK\ - |ACCESSORY_SLOT_DEPT\ - |ACCESSORY_SLOT_OVER) - - var/icon/rolled_down_icon = 'icons/inventory/uniform/mob_rolled_down.dmi' - var/icon/rolled_down_sleeves_icon = 'icons/inventory/uniform/mob_sleeves_rolled.dmi' - -/obj/item/clothing/under/attack_hand(var/mob/user) - if(LAZYLEN(accessories)) - ..() - if ((ishuman(usr) || issmall(usr)) && src.loc == user) - return - ..() - -/obj/item/clothing/under/New() - ..() - if(worn_state) - LAZYSET(item_state_slots, slot_w_uniform_str, worn_state) - else - worn_state = icon_state - - //autodetect rollability - if(rolled_down < 0) - if(("[worn_state]_d" in cached_icon_states(icon)) || (worn_state in cached_icon_states(rolled_down_icon)) || ("[worn_state]_d" in cached_icon_states(icon_override))) - rolled_down = 0 - - if(rolled_down == -1) - verbs -= /obj/item/clothing/under/verb/rollsuit - if(rolled_sleeves == -1) - verbs -= /obj/item/clothing/under/verb/rollsleeves - -/obj/item/clothing/under/proc/update_rolldown_status() - var/mob/living/carbon/human/H - if(istype(src.loc, /mob/living/carbon/human)) - H = src.loc - - var/icon/under_icon - if(icon_override) - under_icon = icon_override - else if(H && LAZYACCESS(sprite_sheets, H.species.get_bodytype(H))) - under_icon = sprite_sheets[H.species.get_bodytype(H)] - else if(LAZYACCESS(item_icons, slot_w_uniform_str)) - under_icon = item_icons[slot_w_uniform_str] - else if (worn_state in cached_icon_states(rolled_down_icon)) - under_icon = rolled_down_icon - - // The _s is because the icon update procs append it. - if((under_icon == rolled_down_icon && ("[worn_state]" in cached_icon_states(under_icon))) || ("[worn_state]_d" in cached_icon_states(under_icon))) - if(rolled_down != 1) - rolled_down = 0 - else - rolled_down = -1 - if(H) update_clothing_icon() - -/obj/item/clothing/under/proc/update_rollsleeves_status() - var/mob/living/carbon/human/H - if(istype(src.loc, /mob/living/carbon/human)) - H = src.loc - - var/icon/under_icon - if(icon_override) - under_icon = icon_override - else if(H && LAZYACCESS(sprite_sheets, H.species.get_bodytype(H))) - under_icon = sprite_sheets[H.species.get_bodytype(H)] - else if(LAZYACCESS(item_icons, slot_w_uniform_str)) - under_icon = item_icons[slot_w_uniform_str] - else if (worn_state in cached_icon_states(rolled_down_sleeves_icon)) - under_icon = rolled_down_sleeves_icon - else - under_icon = new /icon(INV_W_UNIFORM_DEF_ICON) - - // The _s is because the icon update procs append it. - if((under_icon == rolled_down_sleeves_icon && ("[worn_state]" in cached_icon_states(under_icon))) || ("[worn_state]_r" in cached_icon_states(under_icon))) - if(rolled_sleeves != 1) - rolled_sleeves = 0 - else - rolled_sleeves = -1 - if(H) update_clothing_icon() - -/obj/item/clothing/under/update_clothing_icon() - if (ismob(src.loc)) - var/mob/M = src.loc - M.update_inv_w_uniform() - - set_clothing_index() - - -/obj/item/clothing/under/examine(mob/user) - . = ..() - switch(src.sensor_mode) - if(0) - . += "Its sensors appear to be disabled." - if(1) - . += "Its binary life sensors appear to be enabled." - if(2) - . += "Its vital tracker appears to be enabled." - if(3) - . += "Its vital tracker and tracking beacon appear to be enabled." - -/obj/item/clothing/under/proc/set_sensors(mob/usr as mob) - var/mob/M = usr - if (istype(M, /mob/observer)) return - if (usr.stat || usr.restrained()) return - if(has_sensor >= 2) - to_chat(usr, "The controls are locked.") - return 0 - if(has_sensor <= 0) - to_chat(usr, "This suit does not have any sensors.") - return 0 - - var/list/modes = list("Off", "Binary sensors", "Vitals tracker", "Tracking beacon") - var/switchMode = tgui_input_list(usr, "Select a sensor mode:", "Suit Sensor Mode", modes) - if(get_dist(usr, src) > 1) - to_chat(usr, "You have moved too far away.") - return - sensor_mode = modes.Find(switchMode) - 1 - - if (src.loc == usr) - switch(sensor_mode) - if(0) - usr.visible_message("[usr] adjusts their sensors.", "You disable your suit's remote sensing equipment.") - if(1) - usr.visible_message("[usr] adjusts their sensors.", "Your suit will now report whether you are live or dead.") - if(2) - usr.visible_message("[usr] adjusts their sensors.", "Your suit will now report your vital lifesigns.") - if(3) - usr.visible_message("[usr] adjusts their sensors.", "Your suit will now report your vital lifesigns as well as your coordinate position.") - - else if (istype(src.loc, /mob)) - usr.visible_message("[usr] adjusts [src.loc]'s sensors.", "You adjust [src.loc]'s sensors.") - -/obj/item/clothing/under/verb/toggle() - set name = "Toggle Suit Sensors" - set category = "Object" - set src in usr - set_sensors(usr) - -/obj/item/clothing/under/verb/rollsuit() - set name = "Roll Down Jumpsuit" - set category = "Object" - set src in usr - if(!istype(usr, /mob/living)) return - if(usr.stat) return - - update_rolldown_status() - if(rolled_down == -1) - to_chat(usr, "You cannot roll down [src]!") - return - if((rolled_sleeves == 1) && !(rolled_down)) - rolled_sleeves = 0 - - rolled_down = !rolled_down - if(rolled_down) - body_parts_covered = initial(body_parts_covered) - body_parts_covered &= ~(UPPER_TORSO|ARMS) - if(worn_state in cached_icon_states(rolled_down_icon)) - icon_override = rolled_down_icon - LAZYSET(item_state_slots, slot_w_uniform_str, worn_state) - else - LAZYSET(item_state_slots, slot_w_uniform_str, "[worn_state]_d") - - to_chat(usr, "You roll down your [src].") - else - body_parts_covered = initial(body_parts_covered) - if(icon_override == rolled_down_icon) - icon_override = initial(icon_override) - LAZYSET(item_state_slots, slot_w_uniform_str, worn_state) - to_chat(usr, "You roll up your [src].") - update_clothing_icon() - -/obj/item/clothing/under/verb/rollsleeves() - set name = "Roll Up Sleeves" - set category = "Object" - set src in usr - if(!istype(usr, /mob/living)) return - if(usr.stat) return - - update_rollsleeves_status() - if(rolled_sleeves == -1) - to_chat(usr, "You cannot roll up your [src]'s sleeves!") - return - if(rolled_down == 1) - to_chat(usr, "You must roll up your [src] first!") - return - - rolled_sleeves = !rolled_sleeves - if(rolled_sleeves) - body_parts_covered &= ~(ARMS) - if(worn_state in cached_icon_states(rolled_down_sleeves_icon)) - icon_override = rolled_down_sleeves_icon - LAZYSET(item_state_slots, slot_w_uniform_str, worn_state) - else - LAZYSET(item_state_slots, slot_w_uniform_str, "[worn_state]_r") - to_chat(usr, "You roll up your [src]'s sleeves.") - else - body_parts_covered = initial(body_parts_covered) - if(icon_override == rolled_down_sleeves_icon) - icon_override = initial(icon_override) - LAZYSET(item_state_slots, slot_w_uniform_str, worn_state) - to_chat(usr, "You roll down your [src]'s sleeves.") - update_clothing_icon() - -/obj/item/clothing/under/rank/New() - sensor_mode = pick(0,1,2,3) - ..() ->>>>>>> 9b03341473... Merge pull request #11162 from VOREStation/Arokha/cycletweaks From a8bb6baf59b1073544157bfc1486f4916172d681 Mon Sep 17 00:00:00 2001 From: Nadyr <41974248+Darlantanis@users.noreply.github.com> Date: Tue, 20 Jul 2021 19:39:42 -0400 Subject: [PATCH 30/34] powder that makes you say yes --- code/modules/clothing/spacesuits/void/ert_vr.dm | 6 ------ 1 file changed, 6 deletions(-) diff --git a/code/modules/clothing/spacesuits/void/ert_vr.dm b/code/modules/clothing/spacesuits/void/ert_vr.dm index 47094c4f98..0393b4ecf7 100644 --- a/code/modules/clothing/spacesuits/void/ert_vr.dm +++ b/code/modules/clothing/spacesuits/void/ert_vr.dm @@ -239,9 +239,3 @@ SPECIES_ALRAUNE = 'icons/inventory/head/item_vr.dmi', SPECIES_ZADDAT = 'icons/inventory/head/item_vr.dmi' ) -<<<<<<< HEAD - sprite_sheets_refit = list() //have to nullify this as well just to be thorough -||||||| parent of 9b03341473... Merge pull request #11162 from VOREStation/Arokha/cycletweaks - sprite_sheets_refit = list() //have to nullify this as well just to be thorough -======= ->>>>>>> 9b03341473... Merge pull request #11162 from VOREStation/Arokha/cycletweaks From c9e382f86ad25a4767a9a76f846cbc7c0be149f1 Mon Sep 17 00:00:00 2001 From: Nadyr <41974248+Darlantanis@users.noreply.github.com> Date: Tue, 20 Jul 2021 19:40:21 -0400 Subject: [PATCH 31/34] powder that makes you say yes --- code/modules/clothing/spacesuits/void/void_vr.dm | 8 -------- 1 file changed, 8 deletions(-) diff --git a/code/modules/clothing/spacesuits/void/void_vr.dm b/code/modules/clothing/spacesuits/void/void_vr.dm index 4f166e61e8..57774c8d2d 100644 --- a/code/modules/clothing/spacesuits/void/void_vr.dm +++ b/code/modules/clothing/spacesuits/void/void_vr.dm @@ -151,11 +151,3 @@ default_worn_icon = 'icons/inventory/head/mob_vr.dmi' sprite_sheets = ALL_VR_SPRITE_SHEETS_HEAD_MOB sprite_sheets_obj = null -<<<<<<< HEAD - sprite_sheets_refit = null -||||||| parent of 9b03341473... Merge pull request #11162 from VOREStation/Arokha/cycletweaks - sprite_sheets_refit = null - -======= - ->>>>>>> 9b03341473... Merge pull request #11162 from VOREStation/Arokha/cycletweaks From 5cb877a1d2ae4c494d8236cb731858530d58270a Mon Sep 17 00:00:00 2001 From: Nadyr <41974248+Darlantanis@users.noreply.github.com> Date: Tue, 20 Jul 2021 20:31:27 -0400 Subject: [PATCH 32/34] powder that makes you say yes --- .../human/species/station/station_vr.dm | 22 ++++++------------- 1 file changed, 7 insertions(+), 15 deletions(-) diff --git a/code/modules/mob/living/carbon/human/species/station/station_vr.dm b/code/modules/mob/living/carbon/human/species/station/station_vr.dm index 03b9987385..25f7eb890e 100644 --- a/code/modules/mob/living/carbon/human/species/station/station_vr.dm +++ b/code/modules/mob/living/carbon/human/species/station/station_vr.dm @@ -32,7 +32,7 @@ lifespan, but due to their lust for violence, only a handful have ever survived beyond the age of 80, such as the infamous and \ legendary General Rain Silves who is claimed to have lived to 5000." -//CHOMPStation Removal TFF 12/24/19 - Wikilinks removed +//CHOMPStation Removal // wikilink="https://www.yawn.ocry.com/Sergal" catalogue_data = list(/datum/category_item/catalogue/fauna/sergal) @@ -100,7 +100,7 @@ surviving in open air for long periods of time. However, Akula even today still require a high humidity environment to avoid drying out \ after a few days, which would make life on an arid world like Virgo-Prime nearly impossible if it were not for Skrellean technology to aid them." -//CHOMPStation Removal TFF 12/24/19 - Wikilinks removed +//CHOMPStation Removal // wikilink="https://www.yawn.ocry.com/Akula" catalogue_data = list(/datum/category_item/catalogue/fauna/akula) @@ -150,7 +150,7 @@ over and over again. Consequently, they struggle to make copies of same things. Both genders have a voice that echoes a lot. Their natural \ tone oscillates between tenor and soprano. They are excessively noisy when they quarrel in their native language." -//CHOMPStation Removal TFF 12/24/19 - Wikilinks removed +//CHOMPStation Removal // wikilink="https://www.yawn.ocry.com/Nevrean" catalogue_data = list(/datum/category_item/catalogue/fauna/nevrean) @@ -251,7 +251,7 @@ to the degree it can cause conflict with more rigorous and strict authorities. They speak a guttural language known as 'Canilunzt' \ which has a heavy emphasis on utilizing tail positioning and ear twitches to communicate intent." -//CHOMPStation Removal TFF 12/24/19 - Wikilinks removed +//CHOMPStation Removal // wikilink="https://www.yawn.ocry.com/Vulpkanin" catalogue_data = list(/datum/category_item/catalogue/fauna/vulpkanin) @@ -339,7 +339,7 @@ H.equip_to_slot_or_del(L, slot_in_backpack) /datum/species/diona - spawn_flags = SPECIES_CAN_JOIN | SPECIES_IS_WHITELISTED | SPECIES_WHITELIST_SELECTABLE //CHOMPStation Edit TFF 20/1/20 - restore whitelist requirement + spawn_flags = SPECIES_CAN_JOIN | SPECIES_IS_WHITELISTED | SPECIES_WHITELIST_SELECTABLE //CHOMPStation Edit: restore whitelist requirement min_age = 18 wikilink="https://wiki.chompstation13.net/index.php?title=Diona" //CHOMPedit genders = list(MALE, FEMALE, PLURAL, NEUTER) @@ -372,16 +372,8 @@ /datum/species/vox gluttonous = 0 -<<<<<<< HEAD - spawn_flags = SPECIES_CAN_JOIN | SPECIES_IS_WHITELISTED | SPECIES_WHITELIST_SELECTABLE //CHOMPStation Edit - min_age = 18 -||||||| parent of e5c49f772b... Merge pull request #11173 from Heroman3003/waterbreath - spawn_flags = SPECIES_CAN_JOIN | SPECIES_IS_WHITELISTED | SPECIES_WHITELIST_SELECTABLE - min_age = 18 -======= spawn_flags = SPECIES_CAN_JOIN | SPECIES_IS_WHITELISTED | SPECIES_WHITELIST_SELECTABLE min_age = 18 ->>>>>>> e5c49f772b... Merge pull request #11173 from Heroman3003/waterbreath inherent_verbs = list(/mob/living/carbon/human/proc/tie_hair) //Get ya quills done did icobase = 'icons/mob/human_races/r_vox_old.dmi' deform = 'icons/mob/human_races/r_def_vox_old.dmi' @@ -420,7 +412,7 @@ who are known for having massive winged arms and talons as feet. They've been clocked at speeds of over 35 miler per hour chasing the planet's many fish-like fauna.\ The Rapalan's home-world 'Verita' is a strangely habitable gas giant, while no physical earth exists, there are fertile floating islands orbiting around the planet from past asteroid activity." -//CHOMPStation Removal TFF 12/24/19 - Wikilinks removed +//CHOMPStation Removal // wikilink="https://www.yawn.ocry.com/Rapala" catalogue_data = list(/datum/category_item/catalogue/fauna/rapala) @@ -450,7 +442,7 @@ documented in the Virgo system, following a mining bombardment of Virgo 3. The crew of NSB Adephagia have \ taken to calling these creatures 'Shadekin', and the name has generally stuck and spread. " //TODO: Something more fitting for black-eyes -//CHOMPStation Removal TFF 12/24/19 - Wikilinks removed +//CHOMPStation Removal // wikilink = "https://wiki.vore-station.net/Shadekin" catalogue_data = list(/datum/category_item/catalogue/fauna/shadekin) From f5c21e41bc9bdc9be10d61f2291591bdb682b019 Mon Sep 17 00:00:00 2001 From: Nadyr <41974248+Darlantanis@users.noreply.github.com> Date: Tue, 20 Jul 2021 20:36:52 -0400 Subject: [PATCH 33/34] powder that makes you say yes --- code/modules/mob/dead/observer/observer.dm | 2005 +------------------- 1 file changed, 5 insertions(+), 2000 deletions(-) diff --git a/code/modules/mob/dead/observer/observer.dm b/code/modules/mob/dead/observer/observer.dm index 7566448252..90bbd85beb 100644 --- a/code/modules/mob/dead/observer/observer.dm +++ b/code/modules/mob/dead/observer/observer.dm @@ -1,4 +1,4 @@ -<<<<<<< HEAD +<<<<<<< HEAD /mob/observer name = "observer" desc = "This shouldn't appear" @@ -342,6 +342,8 @@ This is the proc mobs get to turn into a ghost. Forked from ghostize due to comp var/area/A = areas[key] if(A.z in using_map?.secret_levels) areas -= key + if(A.z in using_map?.hidden_levels) + areas -= key return areas @@ -354,6 +356,8 @@ This is the proc mobs get to turn into a ghost. Forked from ghostize due to comp var/mobz = get_z(mobs[key]) if(mobz in using_map?.secret_levels) mobs -= key + if(mobz in using_map?.hidden_levels) + mobs -= key return mobs @@ -995,2002 +999,3 @@ This is the proc mobs get to turn into a ghost. Forked from ghostize due to comp set name = "Respawn" set category = "Ghost" src.abandon_mob() -||||||| parent of bb3b3d6214... Merge pull request #11176 from Very-Soft/ghosties -/mob/observer - name = "observer" - desc = "This shouldn't appear" - density = FALSE - vis_flags = NONE - -/mob/observer/dead - name = "ghost" - desc = "It's a g-g-g-g-ghooooost!" //jinkies! - icon = 'icons/mob/ghost.dmi' - icon_state = "ghost" - stat = DEAD - canmove = 0 - blinded = 0 - anchored = TRUE // don't get pushed around - - var/can_reenter_corpse - var/datum/hud/living/carbon/hud = null // hud - var/bootime = 0 - var/started_as_observer //This variable is set to 1 when you enter the game as an observer. - //If you died in the game and are a ghsot - this will remain as null. - //Note that this is not a reliable way to determine if admins started as observers, since they change mobs a lot. - var/has_enabled_antagHUD = 0 - var/medHUD = 0 - var/secHUD = 0 - var/antagHUD = 0 - universal_speak = 1 - var/atom/movable/following = null - var/admin_ghosted = 0 - var/anonsay = 0 - var/ghostvision = 1 //is the ghost able to see things humans can't? - incorporeal_move = 1 - - var/is_manifest = 0 //If set to 1, the ghost is able to whisper. Usually only set if a cultist drags them through the veil. - var/ghost_sprite = null - var/global/list/possible_ghost_sprites = list( - "Clear" = "blank", - "Green Blob" = "otherthing", - "Bland" = "ghost", - "Robed-B" = "ghost1", - "Robed-BAlt" = "ghost2", - "King" = "ghostking", - "Shade" = "shade", - "Hecate" = "ghost-narsie", - "Glowing Statue" = "armour", - "Artificer" = "artificer", - "Behemoth" = "behemoth", - "Harvester" = "harvester", - "Wraith" = "wraith", - "Viscerator" = "viscerator", - "Corgi" = "corgi", - "Tamaskan" = "tamaskan", - "Black Cat" = "blackcat", - "Lizard" = "lizard", - "Goat" = "goat", - "Space Bear" = "bear", - "Bats" = "bat", - "Chicken" = "chicken_white", - "Parrot"= "parrot_fly", - "Goose" = "goose", - "Penguin" = "penguin", - "Brown Crab" = "crab", - "Gray Crab" = "evilcrab", - "Trout" = "trout-swim", - "Salmon" = "salmon-swim", - "Pike" = "pike-swim", - "Koi" = "koi-swim", - "Carp" = "carp", - "Red Robes" = "robe_red", - "Faithless" = "faithless", - "Shadowform" = "forgotten", - "Dark Ethereal" = "bloodguardian", - "Holy Ethereal" = "lightguardian", - "Red Elemental" = "magicRed", - "Blue Elemental" = "magicBlue", - "Pink Elemental" = "magicPink", - "Orange Elemental" = "magicOrange", - "Green Elemental" = "magicGreen", - "Daemon" = "daemon", - "Guard Spider" = "guard", - "Hunter Spider" = "hunter", - "Nurse Spider" = "nurse", - "Rogue Drone" = "drone", - "ED-209" = "ed209", - "Beepsky" = "secbot" - ) - var/last_revive_notification = null // world.time of last notification, used to avoid spamming players from defibs or cloners. - var/cleanup_timer // Refernece to a timer that will delete this mob if no client returns - -/mob/observer/dead/New(mob/body) - - appearance = body - invisibility = INVISIBILITY_OBSERVER - layer = BELOW_MOB_LAYER - plane = PLANE_GHOSTS - alpha = 127 - - sight |= SEE_TURFS | SEE_MOBS | SEE_OBJS | SEE_SELF - see_invisible = SEE_INVISIBLE_OBSERVER - see_in_dark = world.view //I mean. I don't even know if byond has occlusion culling... but... - - var/turf/T - if(ismob(body)) - T = get_turf(body) //Where is the body located? - attack_log = body.attack_log //preserve our attack logs by copying them to our ghost - gender = body.gender - if(body.mind && body.mind.name) - name = body.mind.name - else - if(body.real_name) - name = body.real_name - else - if(gender == MALE) - name = capitalize(pick(first_names_male)) + " " + capitalize(pick(last_names)) - else - name = capitalize(pick(first_names_female)) + " " + capitalize(pick(last_names)) - - mind = body.mind //we don't transfer the mind but we keep a reference to it. - - // Fix for naked ghosts. - // Unclear why this isn't being grabbed by appearance. - if(ishuman(body)) - var/mob/living/carbon/human/H = body - add_overlay(H.overlays_standing) - - if(!T) T = pick(latejoin) //Safety in case we cannot find the body's position - forceMove(T) - - if(!name) //To prevent nameless ghosts - name = capitalize(pick(first_names_male)) + " " + capitalize(pick(last_names)) - real_name = name - animate(src, pixel_y = 2, time = 10, loop = -1) - observer_mob_list += src - ..() - -/mob/observer/dead/Topic(href, href_list) - if (href_list["track"]) - var/mob/target = locate(href_list["track"]) in mob_list - if(target) - ManualFollow(target) - if(href_list["reenter"]) - reenter_corpse() - return - -/mob/observer/dead/attackby(obj/item/W, mob/user) - if(istype(W,/obj/item/weapon/book/tome)) - var/mob/observer/dead/M = src - M.manifest(user) - -/mob/observer/dead/CanPass(atom/movable/mover, turf/target) - return TRUE - -/mob/observer/dead/set_stat(var/new_stat) - if(new_stat != DEAD) - CRASH("It is best if observers stay dead, thank you.") - -/mob/observer/dead/examine_icon() - var/icon/I = get_cached_examine_icon(src) - if(!I) - I = getFlatIcon(src, defdir = SOUTH, no_anim = TRUE) - set_cached_examine_icon(src, I, 200 SECONDS) - return I - -/mob/observer/dead/examine(mob/user) - . = ..() - - if(is_admin(user)) - . += "\t>[ADMIN_FULLMONTY(src)]" - -/* -Transfer_mind is there to check if mob is being deleted/not going to have a body. -Works together with spawning an observer, noted above. -*/ - -/mob/observer/dead/Life() - ..() - if(!loc) return - if(!client) return 0 - - handle_regular_hud_updates() - handle_vision() - -/mob/proc/ghostize(var/can_reenter_corpse = 1) - if(key) - if(ishuman(src)) - var/mob/living/carbon/human/H = src - if(H.vr_holder && !can_reenter_corpse) - H.exit_vr() - return 0 - var/mob/observer/dead/ghost = new(src) //Transfer safety to observer spawning proc. - ghost.can_reenter_corpse = can_reenter_corpse - ghost.timeofdeath = src.timeofdeath //BS12 EDIT - ghost.key = key - if(istype(loc, /obj/structure/morgue)) - var/obj/structure/morgue/M = loc - M.update() - else if(istype(loc, /obj/structure/closet/body_bag)) - var/obj/structure/closet/body_bag/B = loc - B.update() - if(ghost.client) - ghost.client.time_died_as_mouse = ghost.timeofdeath - if(ghost.client && !ghost.client.holder && !config.antag_hud_allowed) // For new ghosts we remove the verb from even showing up if it's not allowed. - ghost.verbs -= /mob/observer/dead/verb/toggle_antagHUD // Poor guys, don't know what they are missing! - return ghost - -/* -This is the proc mobs get to turn into a ghost. Forked from ghostize due to compatibility issues. -*/ -/mob/living/verb/ghost() - set category = "OOC" - set name = "Ghost" - set desc = "Relinquish your life and enter the land of the dead." - - if(stat == DEAD && !forbid_seeing_deadchat) - announce_ghost_joinleave(ghostize(1)) - else - var/response - if(src.client && src.client.holder) - response = tgui_alert(src, "You have the ability to Admin-Ghost. The regular Ghost verb will announce your presence to dead chat. Both variants will allow you to return to your body using 'aghost'.\n\nWhat do you wish to do?", "Are you sure you want to ghost?", list("Ghost", "Admin Ghost", "Stay in body")) - if(response == "Admin Ghost") - if(!src.client) - return - src.client.admin_ghost() - else - response = tgui_alert(src, "Are you -sure- you want to ghost?\n(You are alive, or otherwise have the potential to become alive. Don't abuse ghost unless you are inside a cryopod or equivalent! You can't change your mind so choose wisely!)", "Are you sure you want to ghost?", list("Ghost", "Stay in body")) // VOREStation edit because we don't make players stay dead for 30 minutes. - if(response != "Ghost") - return - resting = 1 - var/turf/location = get_turf(src) - var/special_role = check_special_role() - if(!istype(loc,/obj/machinery/cryopod)) - log_and_message_admins("has ghosted outside cryo[special_role ? " as [special_role]" : ""]. (
JMP)",usr) - else if(special_role) - log_and_message_admins("has ghosted in cryo as [special_role]. (JMP)",usr) - var/mob/observer/dead/ghost = ghostize(0) // 0 parameter is so we can never re-enter our body, "Charlie, you can never come baaaack~" :3 - if(ghost) - ghost.timeofdeath = world.time // Because the living mob won't have a time of death and we want the respawn timer to work properly. - ghost.set_respawn_timer() - announce_ghost_joinleave(ghost) - -/mob/observer/dead/can_use_hands() return 0 -/mob/observer/dead/is_active() return 0 - -/mob/observer/dead/Stat() - ..() - if(statpanel("Status")) - if(emergency_shuttle) - var/eta_status = emergency_shuttle.get_status_panel_eta() - if(eta_status) - stat(null, eta_status) - -/mob/observer/dead/verb/reenter_corpse() - set category = "Ghost" - set name = "Re-enter Corpse" - if(!client) return - if(!(mind && mind.current && can_reenter_corpse)) - to_chat(src, "You have no body.") - return - if(mind.current.key && copytext(mind.current.key,1,2)!="@") //makes sure we don't accidentally kick any clients - to_chat(usr, "Another consciousness is in your body... it is resisting you.") - return - //VOREStation Add - if(prevent_respawns.Find(mind.name)) - to_chat(usr, "You already quit this round as this character, sorry!") - return - //VOREStation Add End - if(mind.current.ajourn && mind.current.stat != DEAD) //check if the corpse is astral-journeying (it's client ghosted using a cultist rune). - var/found_rune - for(var/obj/effect/rune/R in mind.current.loc) //whilst corpse is alive, we can only reenter the body if it's on the rune - if(R && R.word1 == cultwords["hell"] && R.word2 == cultwords["travel"] && R.word3 == cultwords["self"]) // Found an astral journey rune. - found_rune = 1 - break - if(!found_rune) - to_chat(usr, "The astral cord that ties your body and your spirit has been severed. You are likely to wander the realm beyond until your body is finally dead and thus reunited with you.") - return - mind.current.ajourn=0 - mind.current.key = key - mind.current.teleop = null - if(istype(mind.current.loc, /obj/structure/morgue)) - var/obj/structure/morgue/M = mind.current.loc - M.update(1) - else if(istype(mind.current.loc, /obj/structure/closet/body_bag)) - var/obj/structure/closet/body_bag/B = mind.current.loc - B.update(1) - if(!admin_ghosted) - announce_ghost_joinleave(mind, 0, "They now occupy their body again.") - return 1 - -/mob/observer/dead/verb/toggle_medHUD() - set category = "Ghost" - set name = "Toggle MedicHUD" - set desc = "Toggles Medical HUD allowing you to see how everyone is doing" - - medHUD = !medHUD - plane_holder.set_vis(VIS_CH_HEALTH, medHUD) - plane_holder.set_vis(VIS_CH_STATUS_OOC, medHUD) - to_chat(src, "Medical HUD [medHUD ? "Enabled" : "Disabled"]") - -/mob/observer/dead/verb/toggle_secHUD() - set category = "Ghost" - set name = "Toggle Security HUD" - set desc = "Toggles Security HUD allowing you to see people's displayed ID's job, wanted status, etc" - - secHUD = !secHUD - plane_holder.set_vis(VIS_CH_ID, secHUD) - plane_holder.set_vis(VIS_CH_WANTED, secHUD) - plane_holder.set_vis(VIS_CH_IMPTRACK, secHUD) - plane_holder.set_vis(VIS_CH_IMPLOYAL, secHUD) - plane_holder.set_vis(VIS_CH_IMPCHEM, secHUD) - to_chat(src, "Security HUD [secHUD ? "Enabled" : "Disabled"]") - -/mob/observer/dead/verb/toggle_antagHUD() - set category = "Ghost" - set name = "Toggle AntagHUD" - set desc = "Toggles AntagHUD allowing you to see who is the antagonist" - - if(!config.antag_hud_allowed && !client.holder) - to_chat(src, "Admins have disabled this for this round.") - return - if(jobban_isbanned(src, "AntagHUD")) - to_chat(src, "You have been banned from using this feature") - return - if(config.antag_hud_restricted && !has_enabled_antagHUD && !client.holder) - var/response = tgui_alert(src, "If you turn this on, you will not be able to take any part in the round.","Are you sure you want to turn this feature on?",list("Yes","No")) - if(response == "No") return - can_reenter_corpse = FALSE - set_respawn_timer(-1) // Foreeeever - if(!has_enabled_antagHUD && !client.holder) - has_enabled_antagHUD = TRUE - - antagHUD = !antagHUD - plane_holder.set_vis(VIS_CH_SPECIAL, antagHUD) - to_chat(src, "AntagHUD [antagHUD ? "Enabled" : "Disabled"]") - -/mob/observer/dead/proc/jumpable_areas() - var/list/areas = return_sorted_areas() - if(client?.holder) - return areas - - for(var/key in areas) - var/area/A = areas[key] - if(A.z in using_map?.secret_levels) - areas -= key - - return areas - -/mob/observer/dead/proc/jumpable_mobs() - var/list/mobs = getmobs() - if(client?.holder) - return mobs - - for(var/key in mobs) - var/mobz = get_z(mobs[key]) - if(mobz in using_map?.secret_levels) - mobs -= key - - return mobs - -/mob/observer/dead/verb/dead_tele(areaname as null|anything in jumpable_areas()) - set name = "Teleport" - set category = "Ghost" - set desc = "Teleport to a location." - - if(!istype(usr, /mob/observer/dead)) - to_chat(usr, "Not when you're not dead!") - return - - var/area/A - - if(!areaname) - var/list/areas = jumpable_areas() - var/input = tgui_input_list(usr, "Select an area:", "Ghost Teleport", areas) - if(!input) - return - A = areas[input] - if(!A) - return - - if(!istype(usr, /mob/observer/dead)) - to_chat(usr, "Not when you're not dead!") - return - - usr.forceMove(pick(get_area_turfs(A || jumpable_areas()[areaname]))) - usr.on_mob_jump() - -/mob/observer/dead/verb/follow(mobname as null|anything in jumpable_mobs()) - set name = "Follow" - set category = "Ghost" - set desc = "Follow and haunt a mob." - - if(!istype(usr, /mob/observer/dead)) - to_chat(usr, "Not when you're not dead!") - return - - var/mob/M - - if(!mobname) - var/list/possible_mobs = jumpable_mobs() - var/input = tgui_input_list(usr, "Select a mob:", "Ghost Follow", possible_mobs) - if(!input) - return - M = possible_mobs[input] - if(!M) - return - - if(!istype(usr, /mob/observer/dead)) - to_chat(usr, "Not when you're not dead!") - return - - ManualFollow(M || jumpable_mobs()[mobname]) - -/mob/observer/dead/forceMove(atom/destination) - if(client?.holder) - return ..() - - if(get_z(destination) in using_map?.secret_levels) - to_chat(src,SPAN_WARNING("Sorry, that z-level does not allow ghosts.")) - if(following) - stop_following() - return - - return ..() - -/mob/observer/dead/Move(atom/newloc, direct = 0, movetime) - if(client?.holder) - return ..() - - if(get_z(newloc) in using_map?.secret_levels) - to_chat(src,SPAN_WARNING("Sorry, that z-level does not allow ghosts.")) - if(following) - stop_following() - return - - return ..() - -// This is the ghost's follow verb with an argument -/mob/observer/dead/proc/ManualFollow(var/atom/movable/target) - if(!target) - return - - var/turf/targetloc = get_turf(target) - if(check_holy(targetloc)) - to_chat(usr, "You cannot follow a mob standing on holy grounds!") - return - if(get_z(target) in using_map?.secret_levels) - to_chat(src, SPAN_WARNING("Sorry, that target is in an area that ghosts aren't allowed to go.")) - return - if(target != src) - if(following && following == target) - return - following = target - to_chat(src, "Now following [target]") - if(ismob(target)) - forceMove(get_turf(target)) - var/mob/M = target - M.following_mobs += src - else - spawn(0) - while(target && following == target && client) - var/turf/T = get_turf(target) - if(!T) - break - // To stop the ghost flickering. - if(loc != T) - forceMove(T) - sleep(15) - - var/icon/I = icon(target.icon,target.icon_state,target.dir) - - var/orbitsize = (I.Width()+I.Height())*0.5 - orbitsize -= (orbitsize/world.icon_size)*(world.icon_size*0.25) - - var/rot_seg - - /* We don't have this pref yet - switch(ghost_orbit) - if(GHOST_ORBIT_TRIANGLE) - rot_seg = 3 - if(GHOST_ORBIT_SQUARE) - rot_seg = 4 - if(GHOST_ORBIT_PENTAGON) - rot_seg = 5 - if(GHOST_ORBIT_HEXAGON) - rot_seg = 6 - else //Circular - rot_seg = 36 //360/10 bby, smooth enough aproximation of a circle - */ - - orbit(target, orbitsize, FALSE, 20, rot_seg) - -/mob/observer/dead/orbit() - set_dir(2) //reset dir so the right directional sprites show up - return ..() - -/mob/observer/dead/stop_orbit() - . = ..() - //restart our floating animation after orbit is done. - pixel_y = 0 - pixel_x = 0 - transform = null - animate(src, pixel_y = 2, time = 10, loop = -1) - -/mob/observer/dead/proc/stop_following() - following = null - stop_orbit() - -/mob/proc/update_following() - . = get_turf(src) - for(var/mob/observer/dead/M in following_mobs) - if(!.) - M.stop_following() - - if(M.following != src) - following_mobs -= M - else - if(M.loc != .) - M.forceMove(.) - -/mob - var/list/following_mobs = list() - -/mob/Destroy() - for(var/mob/observer/dead/M in following_mobs) - M.stop_following() - following_mobs = null - return ..() - -/mob/observer/dead/Destroy() - if(ismob(following)) - var/mob/M = following - M.following_mobs -= src - stop_following() - observer_mob_list -= src - return ..() - -/mob/Moved(atom/old_loc, direction, forced = FALSE) - . = ..() - update_following() - -/mob/Life() - // to catch teleports etc which directly set loc - update_following() - return ..() - -/mob/proc/check_holy(var/turf/T) - return 0 - -/mob/observer/dead/check_holy(var/turf/T) - if(check_rights(R_ADMIN|R_FUN|R_EVENT, 0, src)) - return 0 - - return (T && T.holy) && (is_manifest || (mind in cult.current_antagonists)) - -/mob/observer/dead/verb/jumptomob() //Moves the ghost instead of just changing the ghosts's eye -Nodrak - set category = "Ghost" - set name = "Jump to Mob" - set desc = "Teleport to a mob" - set popup_menu = FALSE - - if(!istype(usr, /mob/observer/dead)) //Make sure they're an observer! - return - - var/list/possible_mobs = jumpable_mobs() - var/input = tgui_input_list(usr, "Select a mob:", "Ghost Jump", possible_mobs) - if(!input) - return - - var/target = possible_mobs[input] - if (!target)//Make sure we actually have a target - return - else - var/mob/M = target //Destination mob - var/turf/T = get_turf(M) //Turf of the destination mob - - if(T && isturf(T)) //Make sure the turf exists, then move the source to that destination. - forceMove(T) - stop_following() - else - to_chat(src, "This mob is not located in the game world.") - -/mob/observer/dead/memory() - set hidden = 1 - to_chat(src, "You are dead! You have no mind to store memory!") - -/mob/observer/dead/add_memory() - set hidden = 1 - to_chat(src, "You are dead! You have no mind to store memory!") - -/mob/observer/dead/Post_Incorpmove() - stop_following() - -/mob/observer/dead/verb/analyze_air() - set name = "Analyze Air" - set category = "Ghost" - - if(!istype(usr, /mob/observer/dead)) return - - // Shamelessly copied from the Gas Analyzers - if (!( istype(usr.loc, /turf) )) - return - - var/datum/gas_mixture/environment = usr.loc.return_air() - - var/pressure = environment.return_pressure() - var/total_moles = environment.total_moles - - to_chat(src, "Results:") - if(abs(pressure - ONE_ATMOSPHERE) < 10) - to_chat(src, "Pressure: [round(pressure,0.1)] kPa") - else - to_chat(src, "Pressure: [round(pressure,0.1)] kPa") - if(total_moles) - for(var/g in environment.gas) - to_chat(src, "[gas_data.name[g]]: [round((environment.gas[g] / total_moles) * 100)]% ([round(environment.gas[g], 0.01)] moles)") - to_chat(src, "Temperature: [round(environment.temperature-T0C,0.1)]°C ([round(environment.temperature,0.1)]K)") - to_chat(src, "Heat Capacity: [round(environment.heat_capacity(),0.1)]") - -/mob/observer/dead/verb/check_radiation() - set name = "Check Radiation" - set category = "Ghost" - - var/turf/t = get_turf(src) - if(t) - var/rads = SSradiation.get_rads_at_turf(t) - to_chat(src, "Radiation level: [rads ? rads : "0"] Bq.") - - -/mob/observer/dead/verb/become_mouse() - set name = "Become mouse" - set category = "Ghost" - - if(config.disable_player_mice) - to_chat(src, "Spawning as a mouse is currently disabled.") - return - - if(!MayRespawn(1)) - return - - var/turf/T = get_turf(src) - if(!T || (T.z in using_map.admin_levels)) - to_chat(src, "You may not spawn as a mouse on this Z-level.") - return - - var/timedifference = world.time - client.time_died_as_mouse - if(client.time_died_as_mouse && timedifference <= mouse_respawn_time * 600) - var/timedifference_text - timedifference_text = time2text(mouse_respawn_time * 600 - timedifference,"mm:ss") - to_chat(src, "You may only spawn again as a mouse more than [mouse_respawn_time] minutes after your death. You have [timedifference_text] left.") - return - - var/response = tgui_alert(src, "Are you -sure- you want to become a mouse?","Are you sure you want to squeek?",list("Squeek!","Nope!")) - if(response != "Squeek!") return //Hit the wrong key...again. - - - //find a viable mouse candidate - var/mob/living/simple_mob/animal/passive/mouse/host - var/obj/machinery/atmospherics/unary/vent_pump/vent_found - var/list/found_vents = list() - for(var/obj/machinery/atmospherics/unary/vent_pump/v in machines) - if(!v.welded && v.z == T.z && v.network && v.network.normal_members.len > 20) - found_vents.Add(v) - if(found_vents.len) - vent_found = pick(found_vents) - host = new /mob/living/simple_mob/animal/passive/mouse(vent_found) - else - to_chat(src, "Unable to find any unwelded vents to spawn mice at.") - - if(host) - if(config.uneducated_mice) - host.universal_understand = 0 - announce_ghost_joinleave(src, 0, "They are now a mouse.") - host.ckey = src.ckey - host.add_ventcrawl(vent_found) - to_chat(host, "You are now a mouse. Try to avoid interaction with players, and do not give hints away that you are more than a simple rodent.") - -/mob/observer/dead/verb/view_manfiest() - set name = "Show Crew Manifest" - set category = "Ghost" - - var/dat - dat += "

Crew Manifest

" - dat += data_core.get_manifest() - - src << browse(dat, "window=manifest;size=370x420;can_close=1") - -//This is called when a ghost is drag clicked to something. -/mob/observer/dead/MouseDrop(atom/over) - if(!usr || !over) return - if (isobserver(usr) && usr.client && usr.client.holder && isliving(over)) - if (usr.client.holder.cmd_ghost_drag(src,over)) - return - - return ..() - -//Used for drawing on walls with blood puddles as a spooky ghost. -/mob/observer/dead/verb/bloody_doodle() - - set category = "Ghost" - set name = "Write in blood" - set desc = "If the round is sufficiently spooky, write a short message in blood on the floor or a wall. Remember, no IC in OOC or OOC in IC." - - if(!(config.cult_ghostwriter)) - to_chat(src, "That verb is not currently permitted.") - return - - if (!src.stat) - return - - if (usr != src) - return 0 //something is terribly wrong - - var/ghosts_can_write - if(ticker.mode.name == "cult") - if(cult.current_antagonists.len > config.cult_ghostwriter_req_cultists) - ghosts_can_write = 1 - - if(!ghosts_can_write && !check_rights(R_ADMIN|R_EVENT|R_FUN, 0)) //Let's allow for admins to write in blood for events and the such. - to_chat(src, "The veil is not thin enough for you to do that.") - return - - var/list/choices = list() - for(var/obj/effect/decal/cleanable/blood/B in view(1,src)) - if(B.amount > 0) - choices += B - - if(!choices.len) - to_chat(src, "There is no blood to use nearby.") - return - - var/obj/effect/decal/cleanable/blood/choice = tgui_input_list(src, "What blood would you like to use?", "Blood Choice", choices) - - var/direction = tgui_input_list(src,"Which way?","Tile selection", list("Here","North","South","East","West")) - var/turf/simulated/T = src.loc - if (direction != "Here") - T = get_step(T,text2dir(direction)) - - if (!istype(T)) - to_chat(src, "You cannot doodle there.") - return - - if(!choice || choice.amount == 0 || !(src.Adjacent(choice))) - return - - var/doodle_color = (choice.basecolor) ? choice.basecolor : "#A10808" - - var/num_doodles = 0 - for (var/obj/effect/decal/cleanable/blood/writing/W in T) - num_doodles++ - if (num_doodles > 4) - to_chat(src, "There is no space to write on!") - return - - var/max_length = 50 - - var/message = sanitize(input(usr, "Write a message. It cannot be longer than [max_length] characters.","Blood writing", "")) - - if (message) - - if (length(message) > max_length) - message += "-" - to_chat(src, "You ran out of blood to write with!") - - var/obj/effect/decal/cleanable/blood/writing/W = new(T) - W.basecolor = doodle_color - W.update_icon() - W.message = message - W.add_hiddenprint(src) - W.visible_message("Invisible fingers crudely paint something in blood on [T]...") - -/mob/observer/dead/pointed(atom/A as mob|obj|turf in view()) - if(!..()) - return 0 - usr.visible_message("[src] points to [A]") - return 1 - -/mob/observer/dead/proc/manifest(mob/user) - is_manifest = TRUE - verbs |= /mob/observer/dead/proc/toggle_visibility - verbs |= /mob/observer/dead/proc/ghost_whisper - to_chat(src, "As you are now in the realm of the living, you can whisper to the living with the Spectral Whisper verb, inside the IC tab.") - if(plane != PLANE_WORLD) - user.visible_message( \ - "\The [user] drags ghost, [src], to our plane of reality!", \ - "You drag [src] to our plane of reality!" \ - ) - toggle_visibility(TRUE) - else - var/datum/gender/T = gender_datums[user.get_visible_gender()] - user.visible_message ( \ - "\The [user] just tried to smash [T.his] book into that ghost! It's not very effective.", \ - "You get the feeling that the ghost can't become any more visible." \ - ) - -/mob/observer/dead/proc/toggle_icon(var/icon) - if(!client) - return - - var/iconRemoved = 0 - for(var/image/I in client.images) - if(I.icon_state == icon) - iconRemoved = 1 - qdel(I) - - if(!iconRemoved) - var/image/J = image('icons/mob/mob.dmi', loc = src, icon_state = icon) - client.images += J - -/mob/observer/dead/proc/toggle_visibility(var/forced = 0) - set category = "Ghost" - set name = "Toggle Visibility" - set desc = "Allows you to turn (in)visible (almost) at will." - - var/toggled_invisible - if(!forced && plane == PLANE_GHOSTS && world.time < toggled_invisible + 600) - to_chat(src, "You must gather strength before you can turn visible again...") - return - - if(plane == PLANE_WORLD) - toggled_invisible = world.time - visible_message("It fades from sight...", "You are now invisible.") - else - to_chat(src, "You are now visible!") - - plane = (plane == PLANE_GHOSTS) ? PLANE_WORLD : PLANE_GHOSTS - invisibility = (plane == PLANE_WORLD) ? 0 : INVISIBILITY_OBSERVER - - // Give the ghost a cult icon which should be visible only to itself - toggle_icon("cult") - -/mob/observer/dead/verb/toggle_anonsay() - set category = "Ghost" - set name = "Toggle Anonymous Chat" - set desc = "Toggles showing your key in dead chat." - - src.anonsay = !src.anonsay - if(anonsay) - to_chat(src, "Your key won't be shown when you speak in dead chat.") - else - to_chat(src, "Your key will be publicly visible again.") - -/mob/observer/dead/canface() - return 1 - -/mob/observer/dead/proc/can_admin_interact() - return check_rights(R_ADMIN|R_EVENT, 0, src) - -/mob/observer/dead/verb/toggle_ghostsee() - set name = "Toggle Ghost Vision" - set desc = "Toggles your ability to see things only ghosts can see, like other ghosts" - set category = "Ghost" - ghostvision = !ghostvision - updateghostsight() - to_chat(src, "You [ghostvision ? "now" : "no longer"] have ghost vision.") - -/mob/observer/dead/verb/toggle_darkness() - set name = "Toggle Darkness" - set desc = "Toggles your ability to see lighting overlays, and the darkness they create." - set category = "Ghost" - seedarkness = !seedarkness - updateghostsight() - to_chat(src, "You [seedarkness ? "now" : "no longer"] see darkness.") - -/mob/observer/dead/proc/updateghostsight() - plane_holder.set_vis(VIS_FULLBRIGHT, !seedarkness) //Inversion, because "not seeing" the darkness is "seeing" the lighting plane master. - plane_holder.set_vis(VIS_GHOSTS, ghostvision) - -/mob/observer/dead/MayRespawn(var/feedback = 0) - if(!client) - return 0 - if(mind && mind.current && mind.current.stat != DEAD && can_reenter_corpse) - if(feedback) - to_chat(src, "Your non-dead body prevent you from respawning.") - return 0 - if(config.antag_hud_restricted && has_enabled_antagHUD == 1) - if(feedback) - to_chat(src, "antagHUD restrictions prevent you from respawning.") - return 0 - return 1 - -/atom/proc/extra_ghost_link() - return - -/mob/extra_ghost_link(var/atom/ghost) - if(client && eyeobj) - return "|eye" - -/mob/observer/dead/extra_ghost_link(var/atom/ghost) - if(mind && mind.current) - return "|body" - -/proc/ghost_follow_link(var/atom/target, var/atom/ghost) - if((!target) || (!ghost)) return - . = "follow" - . += target.extra_ghost_link(ghost) - -//Culted Ghosts - -/mob/observer/dead/proc/ghost_whisper() - set name = "Spectral Whisper" - set category = "IC" - - if(is_manifest) //Only able to whisper if it's hit with a tome. - var/list/options = list() - for(var/mob/living/Ms in view(src)) - options += Ms - var/mob/living/M = tgui_input_list(src, "Select who to whisper to:", "Whisper to?", options) - if(!M) - return 0 - var/msg = sanitize(input(src, "Message:", "Spectral Whisper") as text|null) - if(msg) - log_say("(SPECWHISP to [key_name(M)]): [msg]", src) - to_chat(M, " You hear a strange, unidentifiable voice in your head... [msg]") - to_chat(src, " You said: '[msg]' to [M].") - else - return - return 1 - else - to_chat(src, "You have not been pulled past the veil!") - -/mob/observer/dead/verb/choose_ghost_sprite() - set category = "Ghost" - set name = "Choose Sprite" - - var/choice - var/previous_state - var/finalized = "No" - - while(finalized == "No" && src.client) - choice = tgui_input_list(usr, "What would you like to use for your ghost sprite?", "Ghost Sprite", possible_ghost_sprites) - if(!choice) - return - - if(choice) - icon = 'icons/mob/ghost.dmi' - cut_overlays() - - if(icon_state && icon) - previous_state = icon_state - - icon_state = possible_ghost_sprites[choice] - finalized = tgui_alert(src, "Look at your sprite. Is this what you wish to use?","Ghost Sprite",list("No","Yes")) - - ghost_sprite = possible_ghost_sprites[choice] - - if(finalized == "No") - icon_state = previous_state - -/mob/observer/dead/is_blind() - return FALSE - -/mob/observer/dead/is_deaf() - return FALSE - -/mob/observer/dead/verb/paialert() - set category = "Ghost" - set name = "Blank pAI alert" - set desc = "Flash an indicator light on available blank pAI devices for a smidgen of hope." - - if(usr.client.prefs?.be_special & BE_PAI) - var/count = 0 - for(var/obj/item/device/paicard/p in all_pai_cards) - var/obj/item/device/paicard/PP = p - if(PP.pai == null) - count++ - PP.icon = 'icons/obj/pda_vr.dmi' // VOREStation Edit - PP.add_overlay("pai-ghostalert") - spawn(54) - PP.cut_overlays() - to_chat(usr,"Flashing the displays of [count] unoccupied PAIs.") - else - to_chat(usr,"You have 'Be pAI' disabled in your character prefs, so we can't help you.") - -/mob/observer/dead/speech_bubble_appearance() - return "ghost" - -// Lets a ghost know someone's trying to bring them back, and for them to get into their body. -// Mostly the same as TG's sans the hud element, since we don't have TG huds. -/mob/observer/dead/proc/notify_revive(var/message, var/sound, flashwindow = TRUE, var/atom/source) - if((last_revive_notification + 2 MINUTES) > world.time) - return - last_revive_notification = world.time - - if(flashwindow) - window_flash(client) - if(message) - to_chat(src, "[message]") - if(source) - throw_alert("\ref[source]_notify_revive", /obj/screen/alert/notify_cloning, new_master = source) - to_chat(src, "(Click to re-enter)") - if(sound) - SEND_SOUND(src, sound(sound)) - -/mob/observer/dead/verb/respawn() - set name = "Respawn" - set category = "Ghost" - src.abandon_mob() -======= -/mob/observer - name = "observer" - desc = "This shouldn't appear" - density = FALSE - vis_flags = NONE - -/mob/observer/dead - name = "ghost" - desc = "It's a g-g-g-g-ghooooost!" //jinkies! - icon = 'icons/mob/ghost.dmi' - icon_state = "ghost" - stat = DEAD - canmove = 0 - blinded = 0 - anchored = TRUE // don't get pushed around - - var/can_reenter_corpse - var/datum/hud/living/carbon/hud = null // hud - var/bootime = 0 - var/started_as_observer //This variable is set to 1 when you enter the game as an observer. - //If you died in the game and are a ghsot - this will remain as null. - //Note that this is not a reliable way to determine if admins started as observers, since they change mobs a lot. - var/has_enabled_antagHUD = 0 - var/medHUD = 0 - var/secHUD = 0 - var/antagHUD = 0 - universal_speak = 1 - var/atom/movable/following = null - var/admin_ghosted = 0 - var/anonsay = 0 - var/ghostvision = 1 //is the ghost able to see things humans can't? - incorporeal_move = 1 - - var/is_manifest = 0 //If set to 1, the ghost is able to whisper. Usually only set if a cultist drags them through the veil. - var/ghost_sprite = null - var/global/list/possible_ghost_sprites = list( - "Clear" = "blank", - "Green Blob" = "otherthing", - "Bland" = "ghost", - "Robed-B" = "ghost1", - "Robed-BAlt" = "ghost2", - "King" = "ghostking", - "Shade" = "shade", - "Hecate" = "ghost-narsie", - "Glowing Statue" = "armour", - "Artificer" = "artificer", - "Behemoth" = "behemoth", - "Harvester" = "harvester", - "Wraith" = "wraith", - "Viscerator" = "viscerator", - "Corgi" = "corgi", - "Tamaskan" = "tamaskan", - "Black Cat" = "blackcat", - "Lizard" = "lizard", - "Goat" = "goat", - "Space Bear" = "bear", - "Bats" = "bat", - "Chicken" = "chicken_white", - "Parrot"= "parrot_fly", - "Goose" = "goose", - "Penguin" = "penguin", - "Brown Crab" = "crab", - "Gray Crab" = "evilcrab", - "Trout" = "trout-swim", - "Salmon" = "salmon-swim", - "Pike" = "pike-swim", - "Koi" = "koi-swim", - "Carp" = "carp", - "Red Robes" = "robe_red", - "Faithless" = "faithless", - "Shadowform" = "forgotten", - "Dark Ethereal" = "bloodguardian", - "Holy Ethereal" = "lightguardian", - "Red Elemental" = "magicRed", - "Blue Elemental" = "magicBlue", - "Pink Elemental" = "magicPink", - "Orange Elemental" = "magicOrange", - "Green Elemental" = "magicGreen", - "Daemon" = "daemon", - "Guard Spider" = "guard", - "Hunter Spider" = "hunter", - "Nurse Spider" = "nurse", - "Rogue Drone" = "drone", - "ED-209" = "ed209", - "Beepsky" = "secbot" - ) - var/last_revive_notification = null // world.time of last notification, used to avoid spamming players from defibs or cloners. - var/cleanup_timer // Refernece to a timer that will delete this mob if no client returns - -/mob/observer/dead/New(mob/body) - - appearance = body - invisibility = INVISIBILITY_OBSERVER - layer = BELOW_MOB_LAYER - plane = PLANE_GHOSTS - alpha = 127 - - sight |= SEE_TURFS | SEE_MOBS | SEE_OBJS | SEE_SELF - see_invisible = SEE_INVISIBLE_OBSERVER - see_in_dark = world.view //I mean. I don't even know if byond has occlusion culling... but... - - var/turf/T - if(ismob(body)) - T = get_turf(body) //Where is the body located? - attack_log = body.attack_log //preserve our attack logs by copying them to our ghost - gender = body.gender - if(body.mind && body.mind.name) - name = body.mind.name - else - if(body.real_name) - name = body.real_name - else - if(gender == MALE) - name = capitalize(pick(first_names_male)) + " " + capitalize(pick(last_names)) - else - name = capitalize(pick(first_names_female)) + " " + capitalize(pick(last_names)) - - mind = body.mind //we don't transfer the mind but we keep a reference to it. - - // Fix for naked ghosts. - // Unclear why this isn't being grabbed by appearance. - if(ishuman(body)) - var/mob/living/carbon/human/H = body - add_overlay(H.overlays_standing) - - if(!T) T = pick(latejoin) //Safety in case we cannot find the body's position - forceMove(T) - - if(!name) //To prevent nameless ghosts - name = capitalize(pick(first_names_male)) + " " + capitalize(pick(last_names)) - real_name = name - animate(src, pixel_y = 2, time = 10, loop = -1) - observer_mob_list += src - ..() - -/mob/observer/dead/Topic(href, href_list) - if (href_list["track"]) - var/mob/target = locate(href_list["track"]) in mob_list - if(target) - ManualFollow(target) - if(href_list["reenter"]) - reenter_corpse() - return - -/mob/observer/dead/attackby(obj/item/W, mob/user) - if(istype(W,/obj/item/weapon/book/tome)) - var/mob/observer/dead/M = src - M.manifest(user) - -/mob/observer/dead/CanPass(atom/movable/mover, turf/target) - return TRUE - -/mob/observer/dead/set_stat(var/new_stat) - if(new_stat != DEAD) - CRASH("It is best if observers stay dead, thank you.") - -/mob/observer/dead/examine_icon() - var/icon/I = get_cached_examine_icon(src) - if(!I) - I = getFlatIcon(src, defdir = SOUTH, no_anim = TRUE) - set_cached_examine_icon(src, I, 200 SECONDS) - return I - -/mob/observer/dead/examine(mob/user) - . = ..() - - if(is_admin(user)) - . += "\t>[ADMIN_FULLMONTY(src)]" - -/* -Transfer_mind is there to check if mob is being deleted/not going to have a body. -Works together with spawning an observer, noted above. -*/ - -/mob/observer/dead/Life() - ..() - if(!loc) return - if(!client) return 0 - - handle_regular_hud_updates() - handle_vision() - -/mob/proc/ghostize(var/can_reenter_corpse = 1) - if(key) - if(ishuman(src)) - var/mob/living/carbon/human/H = src - if(H.vr_holder && !can_reenter_corpse) - H.exit_vr() - return 0 - var/mob/observer/dead/ghost = new(src) //Transfer safety to observer spawning proc. - ghost.can_reenter_corpse = can_reenter_corpse - ghost.timeofdeath = src.timeofdeath //BS12 EDIT - ghost.key = key - if(istype(loc, /obj/structure/morgue)) - var/obj/structure/morgue/M = loc - M.update() - else if(istype(loc, /obj/structure/closet/body_bag)) - var/obj/structure/closet/body_bag/B = loc - B.update() - if(ghost.client) - ghost.client.time_died_as_mouse = ghost.timeofdeath - if(ghost.client && !ghost.client.holder && !config.antag_hud_allowed) // For new ghosts we remove the verb from even showing up if it's not allowed. - ghost.verbs -= /mob/observer/dead/verb/toggle_antagHUD // Poor guys, don't know what they are missing! - return ghost - -/* -This is the proc mobs get to turn into a ghost. Forked from ghostize due to compatibility issues. -*/ -/mob/living/verb/ghost() - set category = "OOC" - set name = "Ghost" - set desc = "Relinquish your life and enter the land of the dead." - - if(stat == DEAD && !forbid_seeing_deadchat) - announce_ghost_joinleave(ghostize(1)) - else - var/response - if(src.client && src.client.holder) - response = tgui_alert(src, "You have the ability to Admin-Ghost. The regular Ghost verb will announce your presence to dead chat. Both variants will allow you to return to your body using 'aghost'.\n\nWhat do you wish to do?", "Are you sure you want to ghost?", list("Ghost", "Admin Ghost", "Stay in body")) - if(response == "Admin Ghost") - if(!src.client) - return - src.client.admin_ghost() - else - response = tgui_alert(src, "Are you -sure- you want to ghost?\n(You are alive, or otherwise have the potential to become alive. Don't abuse ghost unless you are inside a cryopod or equivalent! You can't change your mind so choose wisely!)", "Are you sure you want to ghost?", list("Ghost", "Stay in body")) // VOREStation edit because we don't make players stay dead for 30 minutes. - if(response != "Ghost") - return - resting = 1 - var/turf/location = get_turf(src) - var/special_role = check_special_role() - if(!istype(loc,/obj/machinery/cryopod)) - log_and_message_admins("has ghosted outside cryo[special_role ? " as [special_role]" : ""]. (JMP)",usr) - else if(special_role) - log_and_message_admins("has ghosted in cryo as [special_role]. (JMP)",usr) - var/mob/observer/dead/ghost = ghostize(0) // 0 parameter is so we can never re-enter our body, "Charlie, you can never come baaaack~" :3 - if(ghost) - ghost.timeofdeath = world.time // Because the living mob won't have a time of death and we want the respawn timer to work properly. - ghost.set_respawn_timer() - announce_ghost_joinleave(ghost) - -/mob/observer/dead/can_use_hands() return 0 -/mob/observer/dead/is_active() return 0 - -/mob/observer/dead/Stat() - ..() - if(statpanel("Status")) - if(emergency_shuttle) - var/eta_status = emergency_shuttle.get_status_panel_eta() - if(eta_status) - stat(null, eta_status) - -/mob/observer/dead/verb/reenter_corpse() - set category = "Ghost" - set name = "Re-enter Corpse" - if(!client) return - if(!(mind && mind.current && can_reenter_corpse)) - to_chat(src, "You have no body.") - return - if(mind.current.key && copytext(mind.current.key,1,2)!="@") //makes sure we don't accidentally kick any clients - to_chat(usr, "Another consciousness is in your body... it is resisting you.") - return - //VOREStation Add - if(prevent_respawns.Find(mind.name)) - to_chat(usr, "You already quit this round as this character, sorry!") - return - //VOREStation Add End - if(mind.current.ajourn && mind.current.stat != DEAD) //check if the corpse is astral-journeying (it's client ghosted using a cultist rune). - var/found_rune - for(var/obj/effect/rune/R in mind.current.loc) //whilst corpse is alive, we can only reenter the body if it's on the rune - if(R && R.word1 == cultwords["hell"] && R.word2 == cultwords["travel"] && R.word3 == cultwords["self"]) // Found an astral journey rune. - found_rune = 1 - break - if(!found_rune) - to_chat(usr, "The astral cord that ties your body and your spirit has been severed. You are likely to wander the realm beyond until your body is finally dead and thus reunited with you.") - return - mind.current.ajourn=0 - mind.current.key = key - mind.current.teleop = null - if(istype(mind.current.loc, /obj/structure/morgue)) - var/obj/structure/morgue/M = mind.current.loc - M.update(1) - else if(istype(mind.current.loc, /obj/structure/closet/body_bag)) - var/obj/structure/closet/body_bag/B = mind.current.loc - B.update(1) - if(!admin_ghosted) - announce_ghost_joinleave(mind, 0, "They now occupy their body again.") - return 1 - -/mob/observer/dead/verb/toggle_medHUD() - set category = "Ghost" - set name = "Toggle MedicHUD" - set desc = "Toggles Medical HUD allowing you to see how everyone is doing" - - medHUD = !medHUD - plane_holder.set_vis(VIS_CH_HEALTH, medHUD) - plane_holder.set_vis(VIS_CH_STATUS_OOC, medHUD) - to_chat(src, "Medical HUD [medHUD ? "Enabled" : "Disabled"]") - -/mob/observer/dead/verb/toggle_secHUD() - set category = "Ghost" - set name = "Toggle Security HUD" - set desc = "Toggles Security HUD allowing you to see people's displayed ID's job, wanted status, etc" - - secHUD = !secHUD - plane_holder.set_vis(VIS_CH_ID, secHUD) - plane_holder.set_vis(VIS_CH_WANTED, secHUD) - plane_holder.set_vis(VIS_CH_IMPTRACK, secHUD) - plane_holder.set_vis(VIS_CH_IMPLOYAL, secHUD) - plane_holder.set_vis(VIS_CH_IMPCHEM, secHUD) - to_chat(src, "Security HUD [secHUD ? "Enabled" : "Disabled"]") - -/mob/observer/dead/verb/toggle_antagHUD() - set category = "Ghost" - set name = "Toggle AntagHUD" - set desc = "Toggles AntagHUD allowing you to see who is the antagonist" - - if(!config.antag_hud_allowed && !client.holder) - to_chat(src, "Admins have disabled this for this round.") - return - if(jobban_isbanned(src, "AntagHUD")) - to_chat(src, "You have been banned from using this feature") - return - if(config.antag_hud_restricted && !has_enabled_antagHUD && !client.holder) - var/response = tgui_alert(src, "If you turn this on, you will not be able to take any part in the round.","Are you sure you want to turn this feature on?",list("Yes","No")) - if(response == "No") return - can_reenter_corpse = FALSE - set_respawn_timer(-1) // Foreeeever - if(!has_enabled_antagHUD && !client.holder) - has_enabled_antagHUD = TRUE - - antagHUD = !antagHUD - plane_holder.set_vis(VIS_CH_SPECIAL, antagHUD) - to_chat(src, "AntagHUD [antagHUD ? "Enabled" : "Disabled"]") - -/mob/observer/dead/proc/jumpable_areas() - var/list/areas = return_sorted_areas() - if(client?.holder) - return areas - - for(var/key in areas) - var/area/A = areas[key] - if(A.z in using_map?.secret_levels) - areas -= key - if(A.z in using_map?.hidden_levels) - areas -= key - - return areas - -/mob/observer/dead/proc/jumpable_mobs() - var/list/mobs = getmobs() - if(client?.holder) - return mobs - - for(var/key in mobs) - var/mobz = get_z(mobs[key]) - if(mobz in using_map?.secret_levels) - mobs -= key - if(mobz in using_map?.hidden_levels) - mobs -= key - - return mobs - -/mob/observer/dead/verb/dead_tele(areaname as null|anything in jumpable_areas()) - set name = "Teleport" - set category = "Ghost" - set desc = "Teleport to a location." - - if(!istype(usr, /mob/observer/dead)) - to_chat(usr, "Not when you're not dead!") - return - - var/area/A - - if(!areaname) - var/list/areas = jumpable_areas() - var/input = tgui_input_list(usr, "Select an area:", "Ghost Teleport", areas) - if(!input) - return - A = areas[input] - if(!A) - return - - if(!istype(usr, /mob/observer/dead)) - to_chat(usr, "Not when you're not dead!") - return - - usr.forceMove(pick(get_area_turfs(A || jumpable_areas()[areaname]))) - usr.on_mob_jump() - -/mob/observer/dead/verb/follow(mobname as null|anything in jumpable_mobs()) - set name = "Follow" - set category = "Ghost" - set desc = "Follow and haunt a mob." - - if(!istype(usr, /mob/observer/dead)) - to_chat(usr, "Not when you're not dead!") - return - - var/mob/M - - if(!mobname) - var/list/possible_mobs = jumpable_mobs() - var/input = tgui_input_list(usr, "Select a mob:", "Ghost Follow", possible_mobs) - if(!input) - return - M = possible_mobs[input] - if(!M) - return - - if(!istype(usr, /mob/observer/dead)) - to_chat(usr, "Not when you're not dead!") - return - - ManualFollow(M || jumpable_mobs()[mobname]) - -/mob/observer/dead/forceMove(atom/destination) - if(client?.holder) - return ..() - - if(get_z(destination) in using_map?.secret_levels) - to_chat(src,SPAN_WARNING("Sorry, that z-level does not allow ghosts.")) - if(following) - stop_following() - return - - return ..() - -/mob/observer/dead/Move(atom/newloc, direct = 0, movetime) - if(client?.holder) - return ..() - - if(get_z(newloc) in using_map?.secret_levels) - to_chat(src,SPAN_WARNING("Sorry, that z-level does not allow ghosts.")) - if(following) - stop_following() - return - - return ..() - -// This is the ghost's follow verb with an argument -/mob/observer/dead/proc/ManualFollow(var/atom/movable/target) - if(!target) - return - - var/turf/targetloc = get_turf(target) - if(check_holy(targetloc)) - to_chat(usr, "You cannot follow a mob standing on holy grounds!") - return - if(get_z(target) in using_map?.secret_levels) - to_chat(src, SPAN_WARNING("Sorry, that target is in an area that ghosts aren't allowed to go.")) - return - if(target != src) - if(following && following == target) - return - following = target - to_chat(src, "Now following [target]") - if(ismob(target)) - forceMove(get_turf(target)) - var/mob/M = target - M.following_mobs += src - else - spawn(0) - while(target && following == target && client) - var/turf/T = get_turf(target) - if(!T) - break - // To stop the ghost flickering. - if(loc != T) - forceMove(T) - sleep(15) - - var/icon/I = icon(target.icon,target.icon_state,target.dir) - - var/orbitsize = (I.Width()+I.Height())*0.5 - orbitsize -= (orbitsize/world.icon_size)*(world.icon_size*0.25) - - var/rot_seg - - /* We don't have this pref yet - switch(ghost_orbit) - if(GHOST_ORBIT_TRIANGLE) - rot_seg = 3 - if(GHOST_ORBIT_SQUARE) - rot_seg = 4 - if(GHOST_ORBIT_PENTAGON) - rot_seg = 5 - if(GHOST_ORBIT_HEXAGON) - rot_seg = 6 - else //Circular - rot_seg = 36 //360/10 bby, smooth enough aproximation of a circle - */ - - orbit(target, orbitsize, FALSE, 20, rot_seg) - -/mob/observer/dead/orbit() - set_dir(2) //reset dir so the right directional sprites show up - return ..() - -/mob/observer/dead/stop_orbit() - . = ..() - //restart our floating animation after orbit is done. - pixel_y = 0 - pixel_x = 0 - transform = null - animate(src, pixel_y = 2, time = 10, loop = -1) - -/mob/observer/dead/proc/stop_following() - following = null - stop_orbit() - -/mob/proc/update_following() - . = get_turf(src) - for(var/mob/observer/dead/M in following_mobs) - if(!.) - M.stop_following() - - if(M.following != src) - following_mobs -= M - else - if(M.loc != .) - M.forceMove(.) - -/mob - var/list/following_mobs = list() - -/mob/Destroy() - for(var/mob/observer/dead/M in following_mobs) - M.stop_following() - following_mobs = null - return ..() - -/mob/observer/dead/Destroy() - if(ismob(following)) - var/mob/M = following - M.following_mobs -= src - stop_following() - observer_mob_list -= src - return ..() - -/mob/Moved(atom/old_loc, direction, forced = FALSE) - . = ..() - update_following() - -/mob/Life() - // to catch teleports etc which directly set loc - update_following() - return ..() - -/mob/proc/check_holy(var/turf/T) - return 0 - -/mob/observer/dead/check_holy(var/turf/T) - if(check_rights(R_ADMIN|R_FUN|R_EVENT, 0, src)) - return 0 - - return (T && T.holy) && (is_manifest || (mind in cult.current_antagonists)) - -/mob/observer/dead/verb/jumptomob() //Moves the ghost instead of just changing the ghosts's eye -Nodrak - set category = "Ghost" - set name = "Jump to Mob" - set desc = "Teleport to a mob" - set popup_menu = FALSE - - if(!istype(usr, /mob/observer/dead)) //Make sure they're an observer! - return - - var/list/possible_mobs = jumpable_mobs() - var/input = tgui_input_list(usr, "Select a mob:", "Ghost Jump", possible_mobs) - if(!input) - return - - var/target = possible_mobs[input] - if (!target)//Make sure we actually have a target - return - else - var/mob/M = target //Destination mob - var/turf/T = get_turf(M) //Turf of the destination mob - - if(T && isturf(T)) //Make sure the turf exists, then move the source to that destination. - forceMove(T) - stop_following() - else - to_chat(src, "This mob is not located in the game world.") - -/mob/observer/dead/memory() - set hidden = 1 - to_chat(src, "You are dead! You have no mind to store memory!") - -/mob/observer/dead/add_memory() - set hidden = 1 - to_chat(src, "You are dead! You have no mind to store memory!") - -/mob/observer/dead/Post_Incorpmove() - stop_following() - -/mob/observer/dead/verb/analyze_air() - set name = "Analyze Air" - set category = "Ghost" - - if(!istype(usr, /mob/observer/dead)) return - - // Shamelessly copied from the Gas Analyzers - if (!( istype(usr.loc, /turf) )) - return - - var/datum/gas_mixture/environment = usr.loc.return_air() - - var/pressure = environment.return_pressure() - var/total_moles = environment.total_moles - - to_chat(src, "Results:") - if(abs(pressure - ONE_ATMOSPHERE) < 10) - to_chat(src, "Pressure: [round(pressure,0.1)] kPa") - else - to_chat(src, "Pressure: [round(pressure,0.1)] kPa") - if(total_moles) - for(var/g in environment.gas) - to_chat(src, "[gas_data.name[g]]: [round((environment.gas[g] / total_moles) * 100)]% ([round(environment.gas[g], 0.01)] moles)") - to_chat(src, "Temperature: [round(environment.temperature-T0C,0.1)]°C ([round(environment.temperature,0.1)]K)") - to_chat(src, "Heat Capacity: [round(environment.heat_capacity(),0.1)]") - -/mob/observer/dead/verb/check_radiation() - set name = "Check Radiation" - set category = "Ghost" - - var/turf/t = get_turf(src) - if(t) - var/rads = SSradiation.get_rads_at_turf(t) - to_chat(src, "Radiation level: [rads ? rads : "0"] Bq.") - - -/mob/observer/dead/verb/become_mouse() - set name = "Become mouse" - set category = "Ghost" - - if(config.disable_player_mice) - to_chat(src, "Spawning as a mouse is currently disabled.") - return - - if(!MayRespawn(1)) - return - - var/turf/T = get_turf(src) - if(!T || (T.z in using_map.admin_levels)) - to_chat(src, "You may not spawn as a mouse on this Z-level.") - return - - var/timedifference = world.time - client.time_died_as_mouse - if(client.time_died_as_mouse && timedifference <= mouse_respawn_time * 600) - var/timedifference_text - timedifference_text = time2text(mouse_respawn_time * 600 - timedifference,"mm:ss") - to_chat(src, "You may only spawn again as a mouse more than [mouse_respawn_time] minutes after your death. You have [timedifference_text] left.") - return - - var/response = tgui_alert(src, "Are you -sure- you want to become a mouse?","Are you sure you want to squeek?",list("Squeek!","Nope!")) - if(response != "Squeek!") return //Hit the wrong key...again. - - - //find a viable mouse candidate - var/mob/living/simple_mob/animal/passive/mouse/host - var/obj/machinery/atmospherics/unary/vent_pump/vent_found - var/list/found_vents = list() - for(var/obj/machinery/atmospherics/unary/vent_pump/v in machines) - if(!v.welded && v.z == T.z && v.network && v.network.normal_members.len > 20) - found_vents.Add(v) - if(found_vents.len) - vent_found = pick(found_vents) - host = new /mob/living/simple_mob/animal/passive/mouse(vent_found) - else - to_chat(src, "Unable to find any unwelded vents to spawn mice at.") - - if(host) - if(config.uneducated_mice) - host.universal_understand = 0 - announce_ghost_joinleave(src, 0, "They are now a mouse.") - host.ckey = src.ckey - host.add_ventcrawl(vent_found) - to_chat(host, "You are now a mouse. Try to avoid interaction with players, and do not give hints away that you are more than a simple rodent.") - -/mob/observer/dead/verb/view_manfiest() - set name = "Show Crew Manifest" - set category = "Ghost" - - var/dat - dat += "

Crew Manifest

" - dat += data_core.get_manifest() - - src << browse(dat, "window=manifest;size=370x420;can_close=1") - -//This is called when a ghost is drag clicked to something. -/mob/observer/dead/MouseDrop(atom/over) - if(!usr || !over) return - if (isobserver(usr) && usr.client && usr.client.holder && isliving(over)) - if (usr.client.holder.cmd_ghost_drag(src,over)) - return - - return ..() - -//Used for drawing on walls with blood puddles as a spooky ghost. -/mob/observer/dead/verb/bloody_doodle() - - set category = "Ghost" - set name = "Write in blood" - set desc = "If the round is sufficiently spooky, write a short message in blood on the floor or a wall. Remember, no IC in OOC or OOC in IC." - - if(!(config.cult_ghostwriter)) - to_chat(src, "That verb is not currently permitted.") - return - - if (!src.stat) - return - - if (usr != src) - return 0 //something is terribly wrong - - var/ghosts_can_write - if(ticker.mode.name == "cult") - if(cult.current_antagonists.len > config.cult_ghostwriter_req_cultists) - ghosts_can_write = 1 - - if(!ghosts_can_write && !check_rights(R_ADMIN|R_EVENT|R_FUN, 0)) //Let's allow for admins to write in blood for events and the such. - to_chat(src, "The veil is not thin enough for you to do that.") - return - - var/list/choices = list() - for(var/obj/effect/decal/cleanable/blood/B in view(1,src)) - if(B.amount > 0) - choices += B - - if(!choices.len) - to_chat(src, "There is no blood to use nearby.") - return - - var/obj/effect/decal/cleanable/blood/choice = tgui_input_list(src, "What blood would you like to use?", "Blood Choice", choices) - - var/direction = tgui_input_list(src,"Which way?","Tile selection", list("Here","North","South","East","West")) - var/turf/simulated/T = src.loc - if (direction != "Here") - T = get_step(T,text2dir(direction)) - - if (!istype(T)) - to_chat(src, "You cannot doodle there.") - return - - if(!choice || choice.amount == 0 || !(src.Adjacent(choice))) - return - - var/doodle_color = (choice.basecolor) ? choice.basecolor : "#A10808" - - var/num_doodles = 0 - for (var/obj/effect/decal/cleanable/blood/writing/W in T) - num_doodles++ - if (num_doodles > 4) - to_chat(src, "There is no space to write on!") - return - - var/max_length = 50 - - var/message = sanitize(input(usr, "Write a message. It cannot be longer than [max_length] characters.","Blood writing", "")) - - if (message) - - if (length(message) > max_length) - message += "-" - to_chat(src, "You ran out of blood to write with!") - - var/obj/effect/decal/cleanable/blood/writing/W = new(T) - W.basecolor = doodle_color - W.update_icon() - W.message = message - W.add_hiddenprint(src) - W.visible_message("Invisible fingers crudely paint something in blood on [T]...") - -/mob/observer/dead/pointed(atom/A as mob|obj|turf in view()) - if(!..()) - return 0 - usr.visible_message("[src] points to [A]") - return 1 - -/mob/observer/dead/proc/manifest(mob/user) - is_manifest = TRUE - verbs |= /mob/observer/dead/proc/toggle_visibility - verbs |= /mob/observer/dead/proc/ghost_whisper - to_chat(src, "As you are now in the realm of the living, you can whisper to the living with the Spectral Whisper verb, inside the IC tab.") - if(plane != PLANE_WORLD) - user.visible_message( \ - "\The [user] drags ghost, [src], to our plane of reality!", \ - "You drag [src] to our plane of reality!" \ - ) - toggle_visibility(TRUE) - else - var/datum/gender/T = gender_datums[user.get_visible_gender()] - user.visible_message ( \ - "\The [user] just tried to smash [T.his] book into that ghost! It's not very effective.", \ - "You get the feeling that the ghost can't become any more visible." \ - ) - -/mob/observer/dead/proc/toggle_icon(var/icon) - if(!client) - return - - var/iconRemoved = 0 - for(var/image/I in client.images) - if(I.icon_state == icon) - iconRemoved = 1 - qdel(I) - - if(!iconRemoved) - var/image/J = image('icons/mob/mob.dmi', loc = src, icon_state = icon) - client.images += J - -/mob/observer/dead/proc/toggle_visibility(var/forced = 0) - set category = "Ghost" - set name = "Toggle Visibility" - set desc = "Allows you to turn (in)visible (almost) at will." - - var/toggled_invisible - if(!forced && plane == PLANE_GHOSTS && world.time < toggled_invisible + 600) - to_chat(src, "You must gather strength before you can turn visible again...") - return - - if(plane == PLANE_WORLD) - toggled_invisible = world.time - visible_message("It fades from sight...", "You are now invisible.") - else - to_chat(src, "You are now visible!") - - plane = (plane == PLANE_GHOSTS) ? PLANE_WORLD : PLANE_GHOSTS - invisibility = (plane == PLANE_WORLD) ? 0 : INVISIBILITY_OBSERVER - - // Give the ghost a cult icon which should be visible only to itself - toggle_icon("cult") - -/mob/observer/dead/verb/toggle_anonsay() - set category = "Ghost" - set name = "Toggle Anonymous Chat" - set desc = "Toggles showing your key in dead chat." - - src.anonsay = !src.anonsay - if(anonsay) - to_chat(src, "Your key won't be shown when you speak in dead chat.") - else - to_chat(src, "Your key will be publicly visible again.") - -/mob/observer/dead/canface() - return 1 - -/mob/observer/dead/proc/can_admin_interact() - return check_rights(R_ADMIN|R_EVENT, 0, src) - -/mob/observer/dead/verb/toggle_ghostsee() - set name = "Toggle Ghost Vision" - set desc = "Toggles your ability to see things only ghosts can see, like other ghosts" - set category = "Ghost" - ghostvision = !ghostvision - updateghostsight() - to_chat(src, "You [ghostvision ? "now" : "no longer"] have ghost vision.") - -/mob/observer/dead/verb/toggle_darkness() - set name = "Toggle Darkness" - set desc = "Toggles your ability to see lighting overlays, and the darkness they create." - set category = "Ghost" - seedarkness = !seedarkness - updateghostsight() - to_chat(src, "You [seedarkness ? "now" : "no longer"] see darkness.") - -/mob/observer/dead/proc/updateghostsight() - plane_holder.set_vis(VIS_FULLBRIGHT, !seedarkness) //Inversion, because "not seeing" the darkness is "seeing" the lighting plane master. - plane_holder.set_vis(VIS_GHOSTS, ghostvision) - -/mob/observer/dead/MayRespawn(var/feedback = 0) - if(!client) - return 0 - if(mind && mind.current && mind.current.stat != DEAD && can_reenter_corpse) - if(feedback) - to_chat(src, "Your non-dead body prevent you from respawning.") - return 0 - if(config.antag_hud_restricted && has_enabled_antagHUD == 1) - if(feedback) - to_chat(src, "antagHUD restrictions prevent you from respawning.") - return 0 - return 1 - -/atom/proc/extra_ghost_link() - return - -/mob/extra_ghost_link(var/atom/ghost) - if(client && eyeobj) - return "|eye" - -/mob/observer/dead/extra_ghost_link(var/atom/ghost) - if(mind && mind.current) - return "|body" - -/proc/ghost_follow_link(var/atom/target, var/atom/ghost) - if((!target) || (!ghost)) return - . = "follow" - . += target.extra_ghost_link(ghost) - -//Culted Ghosts - -/mob/observer/dead/proc/ghost_whisper() - set name = "Spectral Whisper" - set category = "IC" - - if(is_manifest) //Only able to whisper if it's hit with a tome. - var/list/options = list() - for(var/mob/living/Ms in view(src)) - options += Ms - var/mob/living/M = tgui_input_list(src, "Select who to whisper to:", "Whisper to?", options) - if(!M) - return 0 - var/msg = sanitize(input(src, "Message:", "Spectral Whisper") as text|null) - if(msg) - log_say("(SPECWHISP to [key_name(M)]): [msg]", src) - to_chat(M, " You hear a strange, unidentifiable voice in your head... [msg]") - to_chat(src, " You said: '[msg]' to [M].") - else - return - return 1 - else - to_chat(src, "You have not been pulled past the veil!") - -/mob/observer/dead/verb/choose_ghost_sprite() - set category = "Ghost" - set name = "Choose Sprite" - - var/choice - var/previous_state - var/finalized = "No" - - while(finalized == "No" && src.client) - choice = tgui_input_list(usr, "What would you like to use for your ghost sprite?", "Ghost Sprite", possible_ghost_sprites) - if(!choice) - return - - if(choice) - icon = 'icons/mob/ghost.dmi' - cut_overlays() - - if(icon_state && icon) - previous_state = icon_state - - icon_state = possible_ghost_sprites[choice] - finalized = tgui_alert(src, "Look at your sprite. Is this what you wish to use?","Ghost Sprite",list("No","Yes")) - - ghost_sprite = possible_ghost_sprites[choice] - - if(finalized == "No") - icon_state = previous_state - -/mob/observer/dead/is_blind() - return FALSE - -/mob/observer/dead/is_deaf() - return FALSE - -/mob/observer/dead/verb/paialert() - set category = "Ghost" - set name = "Blank pAI alert" - set desc = "Flash an indicator light on available blank pAI devices for a smidgen of hope." - - if(usr.client.prefs?.be_special & BE_PAI) - var/count = 0 - for(var/obj/item/device/paicard/p in all_pai_cards) - var/obj/item/device/paicard/PP = p - if(PP.pai == null) - count++ - PP.icon = 'icons/obj/pda_vr.dmi' // VOREStation Edit - PP.add_overlay("pai-ghostalert") - spawn(54) - PP.cut_overlays() - to_chat(usr,"Flashing the displays of [count] unoccupied PAIs.") - else - to_chat(usr,"You have 'Be pAI' disabled in your character prefs, so we can't help you.") - -/mob/observer/dead/speech_bubble_appearance() - return "ghost" - -// Lets a ghost know someone's trying to bring them back, and for them to get into their body. -// Mostly the same as TG's sans the hud element, since we don't have TG huds. -/mob/observer/dead/proc/notify_revive(var/message, var/sound, flashwindow = TRUE, var/atom/source) - if((last_revive_notification + 2 MINUTES) > world.time) - return - last_revive_notification = world.time - - if(flashwindow) - window_flash(client) - if(message) - to_chat(src, "[message]") - if(source) - throw_alert("\ref[source]_notify_revive", /obj/screen/alert/notify_cloning, new_master = source) - to_chat(src, "(Click to re-enter)") - if(sound) - SEND_SOUND(src, sound(sound)) - -/mob/observer/dead/verb/respawn() - set name = "Respawn" - set category = "Ghost" - src.abandon_mob() ->>>>>>> bb3b3d6214... Merge pull request #11176 from Very-Soft/ghosties From 942f4eeb485cff6dd52ecc79bc5c28a61a521240 Mon Sep 17 00:00:00 2001 From: Nadyr <41974248+Darlantanis@users.noreply.github.com> Date: Tue, 20 Jul 2021 20:39:48 -0400 Subject: [PATCH 34/34] powder that makes you say yes --- code/modules/mob/dead/observer/observer.dm | 1 - 1 file changed, 1 deletion(-) diff --git a/code/modules/mob/dead/observer/observer.dm b/code/modules/mob/dead/observer/observer.dm index 90bbd85beb..d87c8074ea 100644 --- a/code/modules/mob/dead/observer/observer.dm +++ b/code/modules/mob/dead/observer/observer.dm @@ -1,4 +1,3 @@ -<<<<<<< HEAD /mob/observer name = "observer" desc = "This shouldn't appear"