diff --git a/baystation12.dme b/baystation12.dme index 62ec42e5ae..9e06cc99fb 100644 --- a/baystation12.dme +++ b/baystation12.dme @@ -546,6 +546,7 @@ #include "code\game\objects\items\crayons.dm" #include "code\game\objects\items\glassjar.dm" #include "code\game\objects\items\latexballoon.dm" +#include "code\game\objects\items\paintkit.dm" #include "code\game\objects\items\shooting_range.dm" #include "code\game\objects\items\toys.dm" #include "code\game\objects\items\trash.dm" @@ -923,13 +924,14 @@ #include "code\modules\clothing\under\syndicate.dm" #include "code\modules\clothing\under\accessories\accessory.dm" #include "code\modules\clothing\under\accessories\armband.dm" +#include "code\modules\clothing\under\accessories\badges.dm" #include "code\modules\clothing\under\accessories\holster.dm" +#include "code\modules\clothing\under\accessories\lockets.dm" #include "code\modules\clothing\under\accessories\storage.dm" #include "code\modules\clothing\under\jobs\civilian.dm" #include "code\modules\clothing\under\jobs\engineering.dm" #include "code\modules\clothing\under\jobs\medsci.dm" #include "code\modules\clothing\under\jobs\security.dm" -#include "code\modules\customitems\item_defines.dm" #include "code\modules\customitems\item_spawning.dm" #include "code\modules\detectivework\evidence.dm" #include "code\modules\detectivework\footprints_and_rag.dm" diff --git a/code/ATMOSPHERICS/components/unary/vent_pump.dm b/code/ATMOSPHERICS/components/unary/vent_pump.dm index d9cfb93a18..4674d52251 100644 --- a/code/ATMOSPHERICS/components/unary/vent_pump.dm +++ b/code/ATMOSPHERICS/components/unary/vent_pump.dm @@ -61,6 +61,16 @@ use_power = 1 icon_state = "map_vent_in" +/obj/machinery/atmospherics/unary/vent_pump/siphon/on/atmos + use_power = 1 + icon_state = "map_vent_in" + external_pressure_bound = 0 + external_pressure_bound_default = 0 + internal_pressure_bound = 2000 + internal_pressure_bound_default = 2000 + pressure_checks = 2 + pressure_checks_default = 2 + /obj/machinery/atmospherics/unary/vent_pump/New() ..() air_contents.volume = ATMOS_DEFAULT_VOLUME_PUMP diff --git a/code/controllers/Processes/machinery.dm b/code/controllers/Processes/machinery.dm index dcc1bb207c..c796afa1f9 100644 --- a/code/controllers/Processes/machinery.dm +++ b/code/controllers/Processes/machinery.dm @@ -6,14 +6,16 @@ /datum/controller/process/machinery/doWork() internal_sort() - internal_process() + internal_process_machinery() + internal_process_power() + internal_process_power_drain() /datum/controller/process/machinery/proc/internal_sort() if(machinery_sort_required) machinery_sort_required = 0 machines = dd_sortedObjectList(machines) -/datum/controller/process/machinery/proc/internal_process() +/datum/controller/process/machinery/proc/internal_process_machinery() for(var/obj/machinery/M in machines) if(M && !M.gcDestroyed) #ifdef PROFILE_MACHINES @@ -39,6 +41,7 @@ scheck() +/datum/controller/process/machinery/proc/internal_process_power() for(var/datum/powernet/powerNetwork in powernets) if(istype(powerNetwork) && !powerNetwork.disposed) powerNetwork.reset() @@ -47,6 +50,7 @@ powernets.Remove(powerNetwork) +/datum/controller/process/machinery/proc/internal_process_power_drain() // Currently only used by powersinks. These items get priority processed before machinery for(var/obj/item/I in processing_power_items) if(!I.pwr_drain()) // 0 = Process Kill, remove from processing list. diff --git a/code/controllers/communications.dm b/code/controllers/communications.dm index 9e82c55d05..723d2e001a 100644 --- a/code/controllers/communications.dm +++ b/code/controllers/communications.dm @@ -72,7 +72,7 @@ Radio: 1355 - Medical 1357 - Engineering 1359 - Security -1341 - death squad +1341 - deathsquad 1443 - Confession Intercom 1347 - Cargo techs 1349 - Service people diff --git a/code/datums/supplypacks.dm b/code/datums/supplypacks.dm index 315c21ef17..1a7a9b8ae0 100644 --- a/code/datums/supplypacks.dm +++ b/code/datums/supplypacks.dm @@ -259,7 +259,7 @@ var/list/all_supply_groups = list("Operations","Security","Hospitality","Enginee name = "Corgi Crate" contains = list() cost = 50 - containertype = /obj/structure/largecrate/lisa + containertype = /obj/structure/largecrate/animal/corgi containername = "Corgi Crate" group = "Hydroponics" @@ -289,7 +289,7 @@ var/list/all_supply_groups = list("Operations","Security","Hospitality","Enginee /datum/supply_packs/cow name = "Cow crate" cost = 30 - containertype = /obj/structure/largecrate/cow + containertype = /obj/structure/largecrate/animal/cow containername = "Cow crate" access = access_hydroponics group = "Hydroponics" @@ -297,7 +297,7 @@ var/list/all_supply_groups = list("Operations","Security","Hospitality","Enginee /datum/supply_packs/goat name = "Goat crate" cost = 25 - containertype = /obj/structure/largecrate/goat + containertype = /obj/structure/largecrate/animal/goat containername = "Goat crate" access = access_hydroponics group = "Hydroponics" @@ -305,19 +305,11 @@ var/list/all_supply_groups = list("Operations","Security","Hospitality","Enginee /datum/supply_packs/chicken name = "Chicken crate" cost = 20 - containertype = /obj/structure/largecrate/chick + containertype = /obj/structure/largecrate/animal/chick containername = "Chicken crate" access = access_hydroponics group = "Hydroponics" -/datum/supply_packs/lisa - name = "Corgi crate" - contains = list() - cost = 50 - containertype = /obj/structure/largecrate/lisa - containername = "Corgi crate" - group = "Hydroponics" - /datum/supply_packs/seeds name = "Seeds crate" contains = list(/obj/item/seeds/chiliseed, @@ -1525,7 +1517,32 @@ var/list/all_supply_groups = list("Operations","Security","Hospitality","Enginee /obj/item/weapon/stock_parts/subspace/crystal, /obj/item/weapon/storage/toolbox/electrical) +/datum/supply_packs/randomised/exosuit_mod + num_contained = 1 + contains = list( + /obj/item/device/kit/paint/ripley, + /obj/item/device/kit/paint/ripley/death, + /obj/item/device/kit/paint/ripley/flames_red, + /obj/item/device/kit/paint/ripley/flames_blue + ) + name = "Random APLU modkit" + cost = 200 + containertype = /obj/structure/closet/crate + containername = "heavy crate" + group = "Miscellaneous" +/datum/supply_packs/randomised/exosuit_mod/durand + contains = list( + /obj/item/device/kit/paint/durand, + /obj/item/device/kit/paint/durand/seraph, + /obj/item/device/kit/paint/durand/phazon + ) + name = "Random Durand exosuit modkit" - - +/datum/supply_packs/randomised/exosuit_mod/gygax + contains = list( + /obj/item/device/kit/paint/gygax, + /obj/item/device/kit/paint/gygax/darkgygax, + /obj/item/device/kit/paint/gygax/recitence + ) + name = "Random Gygax exosuit modkit" diff --git a/code/defines/procs/statistics.dm b/code/defines/procs/statistics.dm index 8a9eb4042d..07856d9251 100644 --- a/code/defines/procs/statistics.dm +++ b/code/defines/procs/statistics.dm @@ -1,34 +1,20 @@ -proc/sql_poll_players() +proc/sql_poll_population() if(!sqllogging) return + var/admincount = admins.len var/playercount = 0 for(var/mob/M in player_list) if(M.client) playercount += 1 establish_db_connection() if(!dbcon.IsConnected()) - log_game("SQL ERROR during player polling. Failed to connect.") + log_game("SQL ERROR during population polling. Failed to connect.") else var/sqltime = time2text(world.realtime, "YYYY-MM-DD hh:mm:ss") - var/DBQuery/query = dbcon_old.NewQuery("INSERT INTO population (playercount, time) VALUES ([playercount], '[sqltime]')") + var/DBQuery/query = dbcon_old.NewQuery("INSERT INTO `tgstation`.`population` (`playercount`, `admincount`, `time`) VALUES ([playercount], [admincount], '[sqltime]')") if(!query.Execute()) var/err = query.ErrorMsg() - log_game("SQL ERROR during player polling. Error : \[[err]\]\n") - - -proc/sql_poll_admins() - if(!sqllogging) - return - var/admincount = admins.len - establish_db_connection() - if(!dbcon.IsConnected()) - log_game("SQL ERROR during admin polling. Failed to connect.") - else - var/sqltime = time2text(world.realtime, "YYYY-MM-DD hh:mm:ss") - var/DBQuery/query = dbcon_old.NewQuery("INSERT INTO population (admincount, time) VALUES ([admincount], '[sqltime]')") - if(!query.Execute()) - var/err = query.ErrorMsg() - log_game("SQL ERROR during admin polling. Error : \[[err]\]\n") + log_game("SQL ERROR during population polling. Error : \[[err]\]\n") proc/sql_report_round_start() // TODO @@ -111,10 +97,8 @@ proc/statistic_cycle() if(!sqllogging) return while(1) - sql_poll_players() + sql_poll_population() sleep(600) - sql_poll_admins() - sleep(6000) // Poll every ten minutes //This proc is used for feedback. It is executed at round end. proc/sql_commit_feedback() @@ -157,4 +141,4 @@ proc/sql_commit_feedback() var/DBQuery/query = dbcon.NewQuery("INSERT INTO erro_feedback (id, roundid, time, variable, value) VALUES (null, [newroundid], Now(), '[variable]', '[value]')") if(!query.Execute()) var/err = query.ErrorMsg() - log_game("SQL ERROR during death reporting. Error : \[[err]\]\n") \ No newline at end of file + log_game("SQL ERROR during death reporting. Error : \[[err]\]\n") diff --git a/code/game/gamemodes/gameticker.dm b/code/game/gamemodes/gameticker.dm index 41183aeffa..08ad7e7253 100644 --- a/code/game/gamemodes/gameticker.dm +++ b/code/game/gamemodes/gameticker.dm @@ -292,7 +292,7 @@ var/global/datum/controller/gameticker/ticker if(player.mind.assigned_role != "MODE") job_master.EquipRank(player, player.mind.assigned_role, 0) UpdateFactionList(player) - EquipCustomItems(player) + equip_custom_items(player) if(captainless) for(var/mob/M in player_list) if(!istype(M,/mob/new_player)) diff --git a/code/game/jobs/job/assistant.dm b/code/game/jobs/job/assistant.dm index d876118a34..def0a007f7 100644 --- a/code/game/jobs/job/assistant.dm +++ b/code/game/jobs/job/assistant.dm @@ -16,10 +16,6 @@ if(!H) return 0 H.equip_to_slot_or_del(new /obj/item/clothing/under/color/grey(H), slot_w_uniform) H.equip_to_slot_or_del(new /obj/item/clothing/shoes/black(H), slot_shoes) - if(H.backbag == 1) - H.equip_to_slot_or_del(new /obj/item/weapon/storage/box/survival(H), slot_r_hand) - else - H.equip_to_slot_or_del(new /obj/item/weapon/storage/box/survival(H.back), slot_in_backpack) return 1 /datum/job/assistant/get_access() diff --git a/code/game/jobs/job/captain.dm b/code/game/jobs/job/captain.dm index f9cd48c6de..28240dbb5b 100644 --- a/code/game/jobs/job/captain.dm +++ b/code/game/jobs/job/captain.dm @@ -33,7 +33,7 @@ var/datum/announcement/minor/captain_announcement = new(do_newscast = 1) H.equip_to_slot_or_del(new /obj/item/clothing/head/caphat(H), slot_head) H.equip_to_slot_or_del(new /obj/item/clothing/glasses/sunglasses(H), slot_glasses) if(H.backbag == 1) - H.equip_to_slot_or_del(new /obj/item/weapon/storage/box/ids(H), slot_r_hand) + H.equip_to_slot_or_del(new /obj/item/weapon/storage/box/ids(H), slot_l_hand) else H.equip_to_slot_or_del(new /obj/item/weapon/storage/box/ids(H.back), slot_in_backpack) @@ -84,12 +84,11 @@ var/datum/announcement/minor/captain_announcement = new(do_newscast = 1) if(2) H.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack(H), slot_back) if(3) H.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/satchel_norm(H), slot_back) if(4) H.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/satchel(H), slot_back) - H.equip_to_slot_or_del(new /obj/item/weapon/storage/box/survival(H.back), slot_in_backpack) H.equip_to_slot_or_del(new /obj/item/clothing/under/rank/head_of_personnel(H), slot_w_uniform) H.equip_to_slot_or_del(new /obj/item/clothing/shoes/brown(H), slot_shoes) H.equip_to_slot_or_del(new /obj/item/device/pda/heads/hop(H), slot_belt) if(H.backbag == 1) - H.equip_to_slot_or_del(new /obj/item/weapon/storage/box/ids(H), slot_r_hand) + H.equip_to_slot_or_del(new /obj/item/weapon/storage/box/ids(H), slot_l_hand) else H.equip_to_slot_or_del(new /obj/item/weapon/storage/box/ids(H.back), slot_in_backpack) return 1 diff --git a/code/game/jobs/job/civilian.dm b/code/game/jobs/job/civilian.dm index 088e3841fd..e5ef21856e 100644 --- a/code/game/jobs/job/civilian.dm +++ b/code/game/jobs/job/civilian.dm @@ -23,21 +23,6 @@ H.equip_to_slot_or_del(new /obj/item/clothing/shoes/black(H), slot_shoes) H.equip_to_slot_or_del(new /obj/item/clothing/under/rank/bartender(H), slot_w_uniform) H.equip_to_slot_or_del(new /obj/item/device/pda/bar(H), slot_belt) - - if(H.backbag == 1) - var/obj/item/weapon/storage/box/survival/Barpack = new /obj/item/weapon/storage/box/survival(H) - H.equip_to_slot_or_del(Barpack, slot_r_hand) - new /obj/item/ammo_casing/shotgun/beanbag(Barpack) - new /obj/item/ammo_casing/shotgun/beanbag(Barpack) - new /obj/item/ammo_casing/shotgun/beanbag(Barpack) - new /obj/item/ammo_casing/shotgun/beanbag(Barpack) - else - H.equip_to_slot_or_del(new /obj/item/weapon/storage/box/survival(H), slot_in_backpack) - H.equip_to_slot_or_del(new /obj/item/ammo_casing/shotgun/beanbag(H), slot_in_backpack) - H.equip_to_slot_or_del(new /obj/item/ammo_casing/shotgun/beanbag(H), slot_in_backpack) - H.equip_to_slot_or_del(new /obj/item/ammo_casing/shotgun/beanbag(H), slot_in_backpack) - H.equip_to_slot_or_del(new /obj/item/ammo_casing/shotgun/beanbag(H), slot_in_backpack) - return 1 @@ -65,10 +50,6 @@ H.equip_to_slot_or_del(new /obj/item/clothing/shoes/black(H), slot_shoes) H.equip_to_slot_or_del(new /obj/item/clothing/head/chefhat(H), slot_head) H.equip_to_slot_or_del(new /obj/item/device/pda/chef(H), slot_belt) - if(H.backbag == 1) - H.equip_to_slot_or_del(new /obj/item/weapon/storage/box/survival(H), slot_r_hand) - else - H.equip_to_slot_or_del(new /obj/item/weapon/storage/box/survival(H.back), slot_in_backpack) return 1 @@ -98,11 +79,9 @@ H.equip_to_slot_or_del(new /obj/item/device/analyzer/plant_analyzer(H), slot_s_store) H.equip_to_slot_or_del(new /obj/item/device/pda/botanist(H), slot_belt) switch(H.backbag) - if(1) H.equip_to_slot_or_del(new /obj/item/weapon/storage/box/survival(H), slot_r_hand) if(2) H.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/hydroponics(H), slot_back) if(3) H.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/satchel_hyd(H), slot_back) if(4) H.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/satchel(H), slot_back) - H.equip_to_slot_or_del(new /obj/item/weapon/storage/box/survival(H.back), slot_in_backpack) return 1 @@ -131,10 +110,6 @@ // H.equip_to_slot_or_del(new /obj/item/clothing/gloves/black(H), slot_gloves) H.equip_to_slot_or_del(new /obj/item/clothing/glasses/sunglasses(H), slot_glasses) H.equip_to_slot_or_del(new /obj/item/weapon/clipboard(H), slot_l_hand) - if(H.backbag == 1) - H.equip_to_slot_or_del(new /obj/item/weapon/storage/box/survival(H), slot_r_hand) - else - H.equip_to_slot_or_del(new /obj/item/weapon/storage/box/survival(H.back), slot_in_backpack) return 1 @@ -160,10 +135,6 @@ H.equip_to_slot_or_del(new /obj/item/clothing/shoes/black(H), slot_shoes) H.equip_to_slot_or_del(new /obj/item/device/pda/cargo(H), slot_belt) // H.equip_to_slot_or_del(new /obj/item/clothing/gloves/black(H), slot_gloves) - if(H.backbag == 1) - H.equip_to_slot_or_del(new /obj/item/weapon/storage/box/survival(H), slot_r_hand) - else - H.equip_to_slot_or_del(new /obj/item/weapon/storage/box/survival(H.back), slot_in_backpack) return 1 @@ -194,11 +165,9 @@ H.equip_to_slot_or_del(new /obj/item/clothing/shoes/black(H), slot_shoes) // H.equip_to_slot_or_del(new /obj/item/clothing/gloves/black(H), slot_gloves) if(H.backbag == 1) - H.equip_to_slot_or_del(new /obj/item/weapon/storage/box/engineer(H), slot_r_hand) H.equip_to_slot_or_del(new /obj/item/weapon/crowbar(H), slot_l_hand) H.equip_to_slot_or_del(new /obj/item/weapon/storage/bag/ore(H), slot_l_store) else - H.equip_to_slot_or_del(new /obj/item/weapon/storage/box/engineer(H.back), slot_in_backpack) H.equip_to_slot_or_del(new /obj/item/weapon/crowbar(H), slot_in_backpack) H.equip_to_slot_or_del(new /obj/item/weapon/storage/bag/ore(H), slot_in_backpack) return 1 @@ -223,7 +192,6 @@ equip(var/mob/living/carbon/human/H) if(!H) return 0 H.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/clown(H), slot_back) - H.equip_to_slot_or_del(new /obj/item/weapon/storage/box/survival(H.back), slot_in_backpack) H.equip_to_slot_or_del(new /obj/item/clothing/under/rank/clown(H), slot_w_uniform) H.equip_to_slot_or_del(new /obj/item/clothing/shoes/clown_shoes(H), slot_shoes) H.equip_to_slot_or_del(new /obj/item/device/pda/clown(H), slot_belt) @@ -264,11 +232,9 @@ H.equip_to_slot_or_del(new /obj/item/clothing/head/beret(H), slot_head) H.equip_to_slot_or_del(new /obj/item/clothing/suit/suspenders(H), slot_wear_suit) if(H.backbag == 1) - H.equip_to_slot_or_del(new /obj/item/weapon/storage/box/survival(H), slot_r_hand) H.equip_to_slot_or_del(new /obj/item/weapon/pen/crayon/mime(H), slot_l_store) H.equip_to_slot_or_del(new /obj/item/weapon/reagent_containers/food/drinks/bottle/bottleofnothing(H), slot_l_hand) else - H.equip_to_slot_or_del(new /obj/item/weapon/storage/box/survival(H.back), slot_in_backpack) H.equip_to_slot_or_del(new /obj/item/weapon/pen/crayon/mime(H), slot_in_backpack) H.equip_to_slot_or_del(new /obj/item/weapon/reagent_containers/food/drinks/bottle/bottleofnothing(H), slot_in_backpack) H.verbs += /client/proc/mimespeak @@ -300,10 +266,6 @@ H.equip_to_slot_or_del(new /obj/item/clothing/under/rank/janitor(H), slot_w_uniform) H.equip_to_slot_or_del(new /obj/item/clothing/shoes/black(H), slot_shoes) H.equip_to_slot_or_del(new /obj/item/device/pda/janitor(H), slot_belt) - if(H.backbag == 1) - H.equip_to_slot_or_del(new /obj/item/weapon/storage/box/survival(H), slot_r_hand) - else - H.equip_to_slot_or_del(new /obj/item/weapon/storage/box/survival(H.back), slot_in_backpack) return 1 @@ -330,10 +292,6 @@ H.equip_to_slot_or_del(new /obj/item/device/pda/librarian(H), slot_belt) H.equip_to_slot_or_del(new /obj/item/clothing/shoes/black(H), slot_shoes) H.equip_to_slot_or_del(new /obj/item/weapon/barcodescanner(H), slot_l_hand) - if(H.backbag == 1) - H.equip_to_slot_or_del(new /obj/item/weapon/storage/box/survival(H), slot_r_hand) - else - H.equip_to_slot_or_del(new /obj/item/weapon/storage/box/survival(H.back), slot_in_backpack) return 1 @@ -366,10 +324,6 @@ H.equip_to_slot_or_del(new /obj/item/clothing/glasses/sunglasses/big(H), slot_glasses) H.equip_to_slot_or_del(new /obj/item/device/pda/lawyer(H), slot_belt) H.equip_to_slot_or_del(new /obj/item/weapon/storage/briefcase(H), slot_l_hand) - if(H.backbag == 1) - H.equip_to_slot_or_del(new /obj/item/weapon/storage/box/survival(H), slot_r_hand) - else - H.equip_to_slot_or_del(new /obj/item/weapon/storage/box/survival(H.back), slot_in_backpack) H.implant_loyalty(H) diff --git a/code/game/jobs/job/civilian_chaplain.dm b/code/game/jobs/job/civilian_chaplain.dm index 9b08e0d47c..a9f441dd22 100644 --- a/code/game/jobs/job/civilian_chaplain.dm +++ b/code/game/jobs/job/civilian_chaplain.dm @@ -22,10 +22,6 @@ H.equip_to_slot_or_del(new /obj/item/clothing/under/rank/chaplain(H), slot_w_uniform) H.equip_to_slot_or_del(new /obj/item/device/pda/chaplain(H), slot_belt) H.equip_to_slot_or_del(new /obj/item/clothing/shoes/black(H), slot_shoes) - if(H.backbag == 1) - H.equip_to_slot_or_del(new /obj/item/weapon/storage/box/survival(H), slot_r_hand) - else - H.equip_to_slot_or_del(new /obj/item/weapon/storage/box/survival(H.back), slot_in_backpack) spawn(0) var/religion_name = "Christianity" var/new_religion = sanitize(input(H, "You are the crew services officer. Would you like to change your religion? Default is Christianity, in SPACE.", "Name change", religion_name), MAX_NAME_LEN) diff --git a/code/game/jobs/job/engineering.dm b/code/game/jobs/job/engineering.dm index 249c103c87..644c2fc1f8 100644 --- a/code/game/jobs/job/engineering.dm +++ b/code/game/jobs/job/engineering.dm @@ -35,10 +35,6 @@ H.equip_to_slot_or_del(new /obj/item/clothing/head/hardhat/white(H), slot_head) H.equip_to_slot_or_del(new /obj/item/weapon/storage/belt/utility/full(H), slot_belt) H.equip_to_slot_or_del(new /obj/item/clothing/gloves/black(H), slot_gloves) - if(H.backbag == 1) - H.equip_to_slot_or_del(new /obj/item/weapon/storage/box/engineer(H), slot_r_hand) - else - H.equip_to_slot_or_del(new /obj/item/weapon/storage/box/engineer(H.back), slot_in_backpack) return 1 @@ -71,10 +67,6 @@ H.equip_to_slot_or_del(new /obj/item/clothing/head/hardhat(H), slot_head) H.equip_to_slot_or_del(new /obj/item/device/t_scanner(H), slot_r_store) H.equip_to_slot_or_del(new /obj/item/device/pda/engineering(H), slot_l_store) - if(H.backbag == 1) - H.equip_to_slot_or_del(new /obj/item/weapon/storage/box/engineer(H), slot_r_hand) - else - H.equip_to_slot_or_del(new /obj/item/weapon/storage/box/engineer(H.back), slot_in_backpack) return 1 @@ -104,8 +96,4 @@ H.equip_to_slot_or_del(new /obj/item/clothing/shoes/black(H), slot_shoes) H.equip_to_slot_or_del(new /obj/item/device/pda/atmos(H), slot_l_store) H.equip_to_slot_or_del(new /obj/item/weapon/storage/belt/utility/atmostech/(H), slot_belt) - if(H.backbag == 1) - H.equip_to_slot_or_del(new /obj/item/weapon/storage/box/engineer(H), slot_r_hand) - else - H.equip_to_slot_or_del(new /obj/item/weapon/storage/box/engineer(H.back), slot_in_backpack) return 1 diff --git a/code/game/jobs/job/medical.dm b/code/game/jobs/job/medical.dm index 8454ced144..c3ebe4e71e 100644 --- a/code/game/jobs/job/medical.dm +++ b/code/game/jobs/job/medical.dm @@ -30,10 +30,6 @@ H.equip_to_slot_or_del(new /obj/item/clothing/shoes/brown(H), slot_shoes) H.equip_to_slot_or_del(new /obj/item/device/pda/heads/cmo(H), slot_belt) H.equip_to_slot_or_del(new /obj/item/weapon/storage/firstaid/adv(H), slot_l_hand) - if(H.backbag == 1) - H.equip_to_slot_or_del(new /obj/item/weapon/storage/box/survival(H), slot_r_hand) - else - H.equip_to_slot_or_del(new /obj/item/weapon/storage/box/survival(H.back), slot_in_backpack) return 1 H.equip_to_slot_or_del(new /obj/item/clothing/suit/storage/toggle/labcoat/cmo(H), slot_wear_suit) H.equip_to_slot_or_del(new /obj/item/device/flashlight/pen(H), slot_s_store) @@ -93,10 +89,6 @@ else H.equip_to_slot_or_del(new /obj/item/clothing/under/rank/medical(H), slot_w_uniform) H.equip_to_slot_or_del(new /obj/item/clothing/suit/storage/toggle/labcoat(H), slot_wear_suit) - if(H.backbag == 1) - H.equip_to_slot_or_del(new /obj/item/weapon/storage/box/survival(H), slot_r_hand) - else - H.equip_to_slot_or_del(new /obj/item/weapon/storage/box/survival(H.back), slot_in_backpack) H.equip_to_slot_or_del(new /obj/item/device/pda/medical(H), slot_belt) H.equip_to_slot_or_del(new /obj/item/device/flashlight/pen(H), slot_s_store) return 1 @@ -126,11 +118,9 @@ H.equip_to_slot_or_del(new /obj/item/clothing/shoes/white(H), slot_shoes) H.equip_to_slot_or_del(new /obj/item/device/pda/chemist(H), slot_belt) switch(H.backbag) - if(1) H.equip_to_slot_or_del(new /obj/item/weapon/storage/box/survival(H), slot_r_hand) if(2) H.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/chemistry(H), slot_back) if(3) H.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/satchel_chem(H), slot_back) if(4) H.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/satchel(H), slot_back) - H.equip_to_slot_or_del(new /obj/item/weapon/storage/box/survival(H.back), slot_in_backpack) H.equip_to_slot_or_del(new /obj/item/clothing/suit/storage/toggle/labcoat/chemist(H), slot_wear_suit) return 1 @@ -157,11 +147,9 @@ H.equip_to_slot_or_del(new /obj/item/clothing/shoes/white(H), slot_shoes) H.equip_to_slot_or_del(new /obj/item/device/pda/geneticist(H), slot_belt) switch(H.backbag) - if(1) H.equip_to_slot_or_del(new /obj/item/weapon/storage/box/survival(H), slot_r_hand) if(2) H.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/genetics(H), slot_back) if(3) H.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/satchel_gen(H), slot_back) if(4) H.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/satchel(H), slot_back) - H.equip_to_slot_or_del(new /obj/item/weapon/storage/box/survival(H.back), slot_in_backpack) H.equip_to_slot_or_del(new /obj/item/clothing/suit/storage/toggle/labcoat/genetics(H), slot_wear_suit) H.equip_to_slot_or_del(new /obj/item/device/flashlight/pen(H), slot_s_store) return 1 @@ -197,10 +185,6 @@ H.equip_to_slot_or_del(new /obj/item/clothing/under/rank/medical(H), slot_w_uniform) H.equip_to_slot_or_del(new /obj/item/clothing/shoes/laceup(H), slot_shoes) H.equip_to_slot_or_del(new /obj/item/device/pda/medical(H), slot_belt) - if(H.backbag == 1) - H.equip_to_slot_or_del(new /obj/item/weapon/storage/box/survival(H), slot_r_hand) - else - H.equip_to_slot_or_del(new /obj/item/weapon/storage/box/survival(H.back), slot_in_backpack) H.equip_to_slot_or_del(new /obj/item/clothing/suit/storage/toggle/labcoat(H), slot_wear_suit) @@ -230,7 +214,7 @@ if (H.mind.role_alt_title) switch(H.mind.role_alt_title) if("Emergency Medical Technician") - H.equip_to_slot_or_del(new /obj/item/clothing/under/rank/medical/fluff/short(H), slot_w_uniform) + H.equip_to_slot_or_del(new /obj/item/clothing/under/rank/medical/paramedic(H), slot_w_uniform) H.equip_to_slot_or_del(new /obj/item/clothing/suit/storage/toggle/fr_jacket(H), slot_wear_suit) if("Paramedic") H.equip_to_slot_or_del(new /obj/item/clothing/under/rank/medical/black(H), slot_w_uniform) @@ -239,8 +223,4 @@ H.equip_to_slot_or_del(new /obj/item/clothing/under/rank/medical(H), slot_w_uniform) H.equip_to_slot_or_del(new /obj/item/weapon/storage/belt/medical/emt(H), slot_belt) H.equip_to_slot_or_del(new /obj/item/device/pda/medical(H), slot_l_store) - if(H.backbag == 1) - H.equip_to_slot_or_del(new /obj/item/weapon/storage/box/engineer(H), slot_r_hand) - else - H.equip_to_slot_or_del(new /obj/item/weapon/storage/box/engineer(H.back), slot_in_backpack) return 1 diff --git a/code/game/jobs/job/science.dm b/code/game/jobs/job/science.dm index 6142296d72..dc0252de53 100644 --- a/code/game/jobs/job/science.dm +++ b/code/game/jobs/job/science.dm @@ -29,11 +29,9 @@ H.equip_to_slot_or_del(new /obj/item/device/pda/heads/rd(H), slot_belt) H.equip_to_slot_or_del(new /obj/item/weapon/clipboard(H), slot_l_hand) switch(H.backbag) - if(1) H.equip_to_slot_or_del(new /obj/item/weapon/storage/box/survival(H), slot_r_hand) if(2) H.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/toxins(H), slot_back) if(3) H.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/satchel_tox(H), slot_back) if(4) H.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/satchel(H), slot_back) - H.equip_to_slot_or_del(new /obj/item/weapon/storage/box/survival(H.back), slot_in_backpack) H.equip_to_slot_or_del(new /obj/item/clothing/suit/storage/toggle/labcoat(H), slot_wear_suit) return 1 @@ -62,11 +60,9 @@ H.equip_to_slot_or_del(new /obj/item/clothing/shoes/white(H), slot_shoes) H.equip_to_slot_or_del(new /obj/item/device/pda/science(H), slot_belt) switch(H.backbag) - if(1) H.equip_to_slot_or_del(new /obj/item/weapon/storage/box/survival(H), slot_r_hand) if(2) H.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/toxins(H), slot_back) if(3) H.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/satchel_tox(H), slot_back) if(4) H.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/satchel(H), slot_back) - H.equip_to_slot_or_del(new /obj/item/weapon/storage/box/survival(H.back), slot_in_backpack) H.equip_to_slot_or_del(new /obj/item/clothing/suit/storage/toggle/labcoat/science(H), slot_wear_suit) return 1 @@ -95,11 +91,9 @@ H.equip_to_slot_or_del(new /obj/item/clothing/shoes/white(H), slot_shoes) H.equip_to_slot_or_del(new /obj/item/device/pda/science(H), slot_belt) switch(H.backbag) - if(1) H.equip_to_slot_or_del(new /obj/item/weapon/storage/box/survival(H), slot_r_hand) if(2) H.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/toxins(H), slot_back) if(3) H.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/satchel_tox(H), slot_back) if(4) H.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/satchel(H), slot_back) - H.equip_to_slot_or_del(new /obj/item/weapon/storage/box/survival(H.back), slot_in_backpack) H.equip_to_slot_or_del(new /obj/item/clothing/suit/storage/toggle/labcoat/science(H), slot_wear_suit) return 1 @@ -128,9 +122,5 @@ H.equip_to_slot_or_del(new /obj/item/clothing/shoes/black(H), slot_shoes) H.equip_to_slot_or_del(new /obj/item/device/pda/roboticist(H), slot_belt) H.equip_to_slot_or_del(new /obj/item/weapon/storage/toolbox/mechanical(H), slot_l_hand) - if(H.backbag == 1) - H.equip_to_slot_or_del(new /obj/item/weapon/storage/box/survival(H), slot_r_hand) - else - H.equip_to_slot_or_del(new /obj/item/weapon/storage/box/survival(H.back), slot_in_backpack) H.equip_to_slot_or_del(new /obj/item/clothing/suit/storage/toggle/labcoat(H), slot_wear_suit) return 1 \ No newline at end of file diff --git a/code/game/jobs/job/security.dm b/code/game/jobs/job/security.dm index 1a0e3bdf3a..e16a6af247 100644 --- a/code/game/jobs/job/security.dm +++ b/code/game/jobs/job/security.dm @@ -36,10 +36,8 @@ H.equip_to_slot_or_del(new /obj/item/clothing/glasses/sunglasses/sechud(H), slot_glasses) H.equip_to_slot_or_del(new /obj/item/weapon/gun/energy/gun(H), slot_s_store) if(H.backbag == 1) - H.equip_to_slot_or_del(new /obj/item/weapon/storage/box/survival(H), slot_r_hand) H.equip_to_slot_or_del(new /obj/item/weapon/handcuffs(H), slot_l_store) else - H.equip_to_slot_or_del(new /obj/item/weapon/storage/box/survival(H.back), slot_in_backpack) H.equip_to_slot_or_del(new /obj/item/weapon/handcuffs(H), slot_in_backpack) H.implant_loyalty(H) return 1 @@ -75,10 +73,8 @@ // H.equip_to_slot_or_del(new /obj/item/clothing/mask/gas(H), slot_wear_mask) //Grab one from the armory you donk H.equip_to_slot_or_del(new /obj/item/device/flash(H), slot_l_store) if(H.backbag == 1) - H.equip_to_slot_or_del(new /obj/item/weapon/storage/box/survival(H), slot_r_hand) H.equip_to_slot_or_del(new /obj/item/weapon/handcuffs(H), slot_l_hand) else - H.equip_to_slot_or_del(new /obj/item/weapon/storage/box/survival(H.back), slot_in_backpack) H.equip_to_slot_or_del(new /obj/item/weapon/handcuffs(H), slot_in_backpack) return 1 @@ -113,11 +109,9 @@ H.equip_to_slot_or_del(new /obj/item/clothing/gloves/black(H), slot_gloves) H.equip_to_slot_or_del(new /obj/item/weapon/flame/lighter/zippo(H), slot_l_store) if(H.backbag == 1)//Why cant some of these things spawn in his office? - H.equip_to_slot_or_del(new /obj/item/weapon/storage/box/survival(H), slot_r_hand) H.equip_to_slot_or_del(new /obj/item/weapon/storage/box/evidence(H), slot_l_hand) H.equip_to_slot_or_del(new /obj/item/device/detective_scanner(H), slot_r_store) else - H.equip_to_slot_or_del(new /obj/item/weapon/storage/box/survival(H.back), slot_in_backpack) H.equip_to_slot_or_del(new /obj/item/weapon/storage/box/evidence(H), slot_in_backpack) H.equip_to_slot_or_del(new /obj/item/device/detective_scanner(H), slot_in_backpack) if(H.mind.role_alt_title && H.mind.role_alt_title == "Forensic Technician") @@ -155,9 +149,7 @@ H.equip_to_slot_or_del(new /obj/item/weapon/handcuffs(H), slot_s_store) H.equip_to_slot_or_del(new /obj/item/device/flash(H), slot_l_store) if(H.backbag == 1) - H.equip_to_slot_or_del(new /obj/item/weapon/storage/box/survival(H), slot_r_hand) H.equip_to_slot_or_del(new /obj/item/weapon/handcuffs(H), slot_l_hand) else - H.equip_to_slot_or_del(new /obj/item/weapon/storage/box/survival(H.back), slot_in_backpack) H.equip_to_slot_or_del(new /obj/item/weapon/handcuffs(H), slot_in_backpack) return 1 diff --git a/code/game/jobs/job_controller.dm b/code/game/jobs/job_controller.dm index 360245ccf1..deab7e2e61 100644 --- a/code/game/jobs/job_controller.dm +++ b/code/game/jobs/job_controller.dm @@ -394,6 +394,8 @@ var/global/datum/controller/occupations/job_master //Equip job items. job.equip(H) job.apply_fingerprints(H) + H.species.equip_survival_gear(H) + //If some custom items could not be equipped before, try again now. for(var/thing in custom_equip_leftovers) var/datum/gear/G = gear_datums[thing] @@ -499,20 +501,6 @@ var/global/datum/controller/occupations/job_master else H << "\red Failed to locate a storage object on your mob, either you spawned with no arms and no backpack or this is a bug." - //TODO: Generalize this by-species - if(H.species) - if(H.species.name == "Tajara" || H.species.name == "Unathi") - H.equip_to_slot_or_del(new /obj/item/clothing/shoes/sandal(H),slot_shoes,1) - else if(H.species.name == "Vox") - H.equip_to_slot_or_del(new /obj/item/clothing/mask/breath(H), slot_wear_mask) - if(!H.r_hand) - H.equip_to_slot_or_del(new /obj/item/weapon/tank/nitrogen(H), slot_r_hand) - H.internal = H.r_hand - else if (!H.l_hand) - H.equip_to_slot_or_del(new /obj/item/weapon/tank/nitrogen(H), slot_l_hand) - H.internal = H.l_hand - H.internals.icon_state = "internal1" - if(istype(H)) //give humans wheelchairs, if they need them. var/obj/item/organ/external/l_foot = H.get_organ("l_foot") var/obj/item/organ/external/r_foot = H.get_organ("r_foot") diff --git a/code/game/machinery/computer/camera.dm b/code/game/machinery/computer/camera.dm index fd68c4ec62..95235be3e4 100644 --- a/code/game/machinery/computer/camera.dm +++ b/code/game/machinery/computer/camera.dm @@ -55,18 +55,11 @@ var/cam = C.nano_structure() cameras[++cameras.len] = cam - if(C == current) - data["current"] = cam + camera_cache=list2json(cameras) - var/list/camera_list = list("cameras" = cameras) - camera_cache=list2json(camera_list) - else - if(current) - data["current"] = current.nano_structure() - - - if(ui) - ui.load_cached_data(camera_cache) + if(current) + data["current"] = current.nano_structure() + data["cameras"] = list("__json_cache" = camera_cache) ui = nanomanager.try_update_ui(user, src, ui_key, ui, data, force_open) if (!ui) @@ -76,8 +69,7 @@ ui.add_template("mapContent", "sec_camera_map_content.tmpl") // adding a template with the key "mapHeader" replaces the map header content ui.add_template("mapHeader", "sec_camera_map_header.tmpl") - - ui.load_cached_data(camera_cache) + ui.set_initial_data(data) ui.open() ui.set_auto_update(1) diff --git a/code/game/machinery/suit_storage_unit.dm b/code/game/machinery/suit_storage_unit.dm index d45cade6c5..d1e728e676 100644 --- a/code/game/machinery/suit_storage_unit.dm +++ b/code/game/machinery/suit_storage_unit.dm @@ -736,6 +736,10 @@ user << "The cycler already contains a helmet." return + if(I.icon_override == CUSTOM_ITEM_MOB) + user << "You cannot refit a customised voidsuit." + return + user << "You fit \the [I] into the suit cycler." user.drop_item() I.loc = src @@ -755,6 +759,10 @@ user << "The cycler already contains a voidsuit." return + if(I.icon_override == CUSTOM_ITEM_MOB) + user << "You cannot refit a customised voidsuit." + return + user << "You fit \the [I] into the suit cycler." user.drop_item() I.loc = src diff --git a/code/game/mecha/combat/gygax.dm b/code/game/mecha/combat/gygax.dm index 7e8df94015..b47564e2b3 100644 --- a/code/game/mecha/combat/gygax.dm +++ b/code/game/mecha/combat/gygax.dm @@ -17,7 +17,7 @@ max_equip = 3 /obj/mecha/combat/gygax/dark - desc = "A lightweight exosuit used by Nanotrasen Death Squads. A significantly upgraded Gygax security mech." + desc = "A lightweight exosuit used by NanoTrasen Heavy Asset Protection. A significantly upgraded Gygax security mech." name = "Dark Gygax" icon_state = "darkgygax" initial_icon = "darkgygax" diff --git a/code/game/mecha/equipment/tools/tools.dm b/code/game/mecha/equipment/tools/tools.dm index 67d8e5667c..432c990114 100644 --- a/code/game/mecha/equipment/tools/tools.dm +++ b/code/game/mecha/equipment/tools/tools.dm @@ -1076,18 +1076,6 @@ do_after_cooldown() return 1 -/obj/item/weapon/paintkit //Please don't use this for anything, it's a base type for custom mech paintjobs. - name = "mecha customisation kit" - desc = "A generic kit containing all the needed tools and parts to turn a mech into another mech." - icon = 'icons/obj/custom_items.dmi' - icon_state = "royce_kit" - - var/new_name = "mech" //What is the variant called? - var/new_desc = "A mech." //How is the new mech described? - var/new_icon = "ripley" //What base icon will the new mech use? - var/removable = null //Can the kit be removed? - var/list/allowed_types = list() //Types of mech that the kit will work on. - /obj/item/mecha_parts/mecha_equipment/tool/passenger name = "passenger compartment" desc = "A mountable passenger compartment for exo-suits. Rather cramped." diff --git a/code/game/mecha/mecha.dm b/code/game/mecha/mecha.dm index 2afb089d68..b52f98827a 100644 --- a/code/game/mecha/mecha.dm +++ b/code/game/mecha/mecha.dm @@ -815,34 +815,6 @@ user.visible_message("[user] attaches [W] to [src].", "You attach [W] to [src]") return - else if(istype(W, /obj/item/weapon/paintkit)) - - if(occupant) - user << "You can't customize a mech while someone is piloting it - that would be unsafe!" - return - - var/obj/item/weapon/paintkit/P = W - var/found = null - - for(var/type in P.allowed_types) - if(type==src.initial_icon) - found = 1 - break - - if(!found) - user << "That kit isn't meant for use on this class of exosuit." - return - - user.visible_message("[user] opens [P] and spends some quality time customising [src].") - - src.name = P.new_name - src.desc = P.new_desc - src.initial_icon = P.new_icon - src.reset_icon() - - user.drop_item() - qdel(P) - else call((proc_res["dynattackby"]||src), "dynattackby")(W,user) /* diff --git a/code/game/objects/effects/chemsmoke.dm b/code/game/objects/effects/chemsmoke.dm index 37ea4fd096..f641561ba8 100644 --- a/code/game/objects/effects/chemsmoke.dm +++ b/code/game/objects/effects/chemsmoke.dm @@ -149,7 +149,7 @@ if(!dist) dist = 1 R.reaction_mob(A, volume = R.volume / dist) - else if(istype(A, /obj)) + else if(istype(A, /obj) && !A.simulated) R.reaction_obj(A, R.volume) sleep(30) diff --git a/code/game/objects/items/devices/PDA/PDA.dm b/code/game/objects/items/devices/PDA/PDA.dm index 9979b66ce2..c908267244 100644 --- a/code/game/objects/items/devices/PDA/PDA.dm +++ b/code/game/objects/items/devices/PDA/PDA.dm @@ -523,10 +523,10 @@ var/global/list/obj/item/device/pda/PDAs = list() data["feed"] = feed + data["manifest"] = list("__json_cache" = ManifestJSON) + nanoUI = data // update the ui if it exists, returns null if no ui is passed/found - if(ui) - ui.load_cached_data(ManifestJSON) ui = nanomanager.try_update_ui(user, src, ui_key, ui, data, force_open) @@ -536,8 +536,6 @@ var/global/list/obj/item/device/pda/PDAs = list() ui = new(user, src, ui_key, "pda.tmpl", title, 520, 400, state = inventory_state) // when the ui is first opened this is the data it will use - ui.load_cached_data(ManifestJSON) - ui.set_initial_data(data) // open the new ui window ui.open() diff --git a/code/game/objects/items/devices/radio/radio.dm b/code/game/objects/items/devices/radio/radio.dm index 2018aa7919..0e5116f5d8 100644 --- a/code/game/objects/items/devices/radio/radio.dm +++ b/code/game/objects/items/devices/radio/radio.dm @@ -211,6 +211,9 @@ M.last_target_radio = world.time // For the projectile targeting system + if(!radio_connection) + set_frequency(frequency) + /* Quick introduction: This new radio system uses a very robust FTL signaling technology unoriginally dubbed "subspace" which is somewhat similar to 'blue-space' but can't diff --git a/code/game/objects/items/paintkit.dm b/code/game/objects/items/paintkit.dm new file mode 100644 index 0000000000..34802577d6 --- /dev/null +++ b/code/game/objects/items/paintkit.dm @@ -0,0 +1,178 @@ +/obj/item/device/kit + icon_state = "modkit" + icon = 'icons/obj/device.dmi' + var/new_name = "mech" //What is the variant called? + var/new_desc = "A mech." //How is the new mech described? + var/new_icon = "ripley" //What base icon will the new mech use? + var/new_icon_file + var/uses = 1 // Uses before the kit deletes itself. + +/obj/item/device/kit/examine() + ..() + usr << "It has [uses] [uses>1?"uses":"use"] left." + +/obj/item/device/kit/proc/use(var/amt, var/mob/user) + uses -= amt + playsound(get_turf(user), 'sound/items/Screwdriver.ogg', 50, 1) + if(uses<1) + user.drop_item() + qdel(src) + +// Root hardsuit kit defines. +// Icons for modified hardsuits need to be in the proper .dmis because suit cyclers may cock them up. +/obj/item/device/kit/suit + name = "voidsuit modification kit" + desc = "A kit for modifying a voidsuit." + uses = 2 + var/new_light_overlay + var/new_mob_icon_file + +/obj/item/clothing/head/helmet/space/void/attackby(var/obj/item/O, var/mob/user) + if(istype(O,/obj/item/device/kit/suit)) + var/obj/item/device/kit/suit/kit = O + name = "[kit.new_name] suit helmet" + desc = kit.new_desc + icon_state = "[kit.new_icon]_helmet" + item_state = "[kit.new_icon]_helmet" + if(kit.new_icon_file) + icon = kit.new_icon_file + if(kit.new_mob_icon_file) + icon_override = kit.new_mob_icon_file + if(kit.new_light_overlay) + light_overlay = kit.new_light_overlay + user << "You set about modifying the helmet into [src]." + var/mob/living/carbon/human/H = user + if(istype(H)) + species_restricted = list(H.species.name) + kit.use(1,user) + return 1 + return ..() + +/obj/item/clothing/suit/space/void/attackby(var/obj/item/O, var/mob/user) + if(istype(O,/obj/item/device/kit/suit)) + var/obj/item/device/kit/suit/kit = O + name = "[kit.new_name] voidsuit" + desc = kit.new_desc + icon_state = "[kit.new_icon]_suit" + item_state = "[kit.new_icon]_suit" + if(kit.new_icon_file) + icon = kit.new_icon_file + if(kit.new_mob_icon_file) + icon_override = kit.new_mob_icon_file + user << "You set about modifying the suit into [src]." + var/mob/living/carbon/human/H = user + if(istype(H)) + species_restricted = list(H.species.name) + kit.use(1,user) + return 1 + return ..() + +/obj/item/device/kit/paint + name = "mecha customisation kit" + desc = "A kit containing all the needed tools and parts to repaint a mech." + var/removable = null + var/list/allowed_types = list() + +/obj/item/device/kit/paint/examine() + ..() + usr << "This kit will convert an exosuit into: [new_name]." + usr << "This kit can be used on the following exosuit models:" + for(var/exotype in allowed_types) + usr << "- [capitalize(exotype)]" + +/obj/mecha/attackby(var/obj/item/weapon/W, var/mob/user) + if(istype(W, /obj/item/device/kit/paint)) + if(occupant) + user << "You can't customize a mech while someone is piloting it - that would be unsafe!" + return + + var/obj/item/device/kit/paint/P = W + var/found = null + + for(var/type in P.allowed_types) + if(type==src.initial_icon) + found = 1 + break + + if(!found) + user << "That kit isn't meant for use on this class of exosuit." + return + + user.visible_message("[user] opens [P] and spends some quality time customising [src].") + src.name = P.new_name + src.desc = P.new_desc + src.initial_icon = P.new_icon + if(P.new_icon_file) + src.icon = P.new_icon_file + src.reset_icon() + P.use(1, user) + return 1 + else + return ..() + +//Ripley APLU kits. +/obj/item/device/kit/paint/ripley + name = "\"Classic\" APLU customisation kit" + new_name = "APLU \"Classic\"" + new_desc = "A very retro APLU unit; didn't they retire these back in 2543?" + new_icon = "ripley-old" + allowed_types = list("ripley") + +/obj/item/device/kit/paint/ripley/death + name = "\"Reaper\" APLU customisation kit" + new_name = "APLU \"Reaper\"" + new_desc = "A terrifying, grim power loader. Why do those clamps have spikes?" + new_icon = "deathripley" + allowed_types = list("ripley","firefighter") + +/obj/item/device/kit/paint/ripley/flames_red + name = "\"Firestarter\" APLU customisation kit" + new_name = "APLU \"Firestarter\"" + new_desc = "A standard APLU exosuit with stylish orange flame decals." + new_icon = "ripley_flames_red" + +/obj/item/device/kit/paint/ripley/flames_blue + name = "\"Burning Chrome\" APLU customisation kit" + new_name = "APLU \"Burning Chrome\"" + new_desc = "A standard APLU exosuit with stylish blue flame decals." + new_icon = "ripley_flames_blue" + +// Durand kits. +/obj/item/device/kit/paint/durand + name = "\"Classic\" Durand customisation kit" + new_name = "Durand \"Classic\"" + new_desc = "An older model of Durand combat exosuit. This model was retired for rotating a pilot's torso 180 degrees." + new_icon = "old_durand" + allowed_types = list("durand") + +/obj/item/device/kit/paint/durand/seraph + name = "\"Cherubim\" Durand customisation kit" + new_name = "Durand \"Cherubim\"" + new_desc = "A Durand combat exosuit modelled after ancient Earth entertainment. Your heart goes doki-doki just looking at it." + new_icon = "old_durand" + +/obj/item/device/kit/paint/durand/phazon + name = "\"Sypher\" Durand customisation kit" + new_name = "Durand \"Sypher\"" + new_desc = "A Durand combat exosuit with some very stylish neons and decals. Seems to blur slightly at the edges; probably an optical illusion." + new_icon = "phazon" + +// Gygax kits. +/obj/item/device/kit/paint/gygax + name = "\"Jester\" Gygax customisation kit" + new_name = "Gygax \"Jester\"" + new_desc = "A Gygax exosuit modelled after the infamous combat-troubadors of Earth's distant past. Terrifying to behold." + new_icon = "honker" + allowed_types = list("gygax") + +/obj/item/device/kit/paint/gygax/darkgygax + name = "\"Silhouette\" Gygax customisation kit" + new_name = "Gygax \"Silhouette\"" + new_desc = "An ominous Gygax exosuit modelled after the fictional corporate 'death squads' that were popular in pulp action-thrillers back in 2554." + new_icon = "darkgygax" + +/obj/item/device/kit/paint/gygax/recitence + name = "\"Gaoler\" Gygax customisation kit" + new_name = "Durand \"Gaoler\"" + new_desc = "A bulky silver Gygax exosuit. The extra armour appears to be painted on, but it's very shiny." + new_icon = "recitence" \ No newline at end of file diff --git a/code/game/objects/items/toys.dm b/code/game/objects/items/toys.dm index 5f5fbff188..09da666a46 100644 --- a/code/game/objects/items/toys.dm +++ b/code/game/objects/items/toys.dm @@ -923,6 +923,11 @@ desc = "A plushie of a fuzzy spider! It has eight legs - all the better to hug you with." icon_state = "spiderplushie" +/obj/item/toy/plushie/farwa + name = "farwa plush" + desc = "A farwa plush doll. It's soft and comforting!" + icon_state = "farwaplushie" + //Toy cult sword /obj/item/toy/cultsword name = "foam sword" diff --git a/code/game/objects/items/weapons/cards_ids.dm b/code/game/objects/items/weapons/cards_ids.dm index 833524399d..75693427ef 100644 --- a/code/game/objects/items/weapons/cards_ids.dm +++ b/code/game/objects/items/weapons/cards_ids.dm @@ -81,7 +81,7 @@ /obj/item/device/taperecorder, /obj/item/device/hailer, /obj/item/device/megaphone, - /obj/item/clothing/accessory/holobadge, + /obj/item/clothing/accessory/badge/holo, /obj/structure/closet/crate/secure, /obj/structure/closet/secure_closet, /obj/machinery/librarycomp, @@ -162,17 +162,6 @@ /obj/item/weapon/card/id/GetID() return src -/obj/item/weapon/card/id/attackby(obj/item/weapon/W as obj, mob/user as mob) - ..() - if(istype(W,/obj/item/weapon/id_wallet)) - user << "You slip [src] into [W]." - src.name = "[src.registered_name]'s [W.name] ([src.assignment])" - src.desc = W.desc - src.icon = W.icon - src.icon_state = W.icon_state - qdel(W) - return - /obj/item/weapon/card/id/verb/read() set name = "Read ID Card" set category = "Object" @@ -297,7 +286,7 @@ /obj/item/weapon/card/id/centcom/ERT name = "\improper Emergency Response Team ID" assignment = "Emergency Response Team" - + /obj/item/weapon/card/id/centcom/ERT/New() ..() access += get_all_accesses() diff --git a/code/game/objects/items/weapons/cigs_lighters.dm b/code/game/objects/items/weapons/cigs_lighters.dm index 957bfde1f5..736c995870 100644 --- a/code/game/objects/items/weapons/cigs_lighters.dm +++ b/code/game/objects/items/weapons/cigs_lighters.dm @@ -416,35 +416,33 @@ CIGARETTE PACKETS ARE IN FANCY.DM icon = 'icons/obj/items.dmi' icon_state = "lighter-g" item_state = "lighter-g" - var/icon_on = "lighter-g-on" - var/icon_off = "lighter-g" w_class = 1 throwforce = 4 flags = CONDUCT slot_flags = SLOT_BELT attack_verb = list("burnt", "singed") + var/base_state /obj/item/weapon/flame/lighter/zippo name = "\improper Zippo lighter" desc = "The zippo." icon_state = "zippo" item_state = "zippo" - icon_on = "zippoon" - icon_off = "zippo" /obj/item/weapon/flame/lighter/random New() - var/color = pick("r","c","y","g") - icon_on = "lighter-[color]-on" - icon_off = "lighter-[color]" - icon_state = icon_off + icon_state = "lighter-[pick("r","c","y","g")]" + item_state = icon_state + base_state = icon_state /obj/item/weapon/flame/lighter/attack_self(mob/living/user) + if(!base_state) + base_state = icon_state if(user.r_hand == src || user.l_hand == src) if(!lit) lit = 1 - icon_state = icon_on - item_state = icon_on + icon_state = "[base_state]on" + item_state = "[base_state]on" if(istype(src, /obj/item/weapon/flame/lighter/zippo) ) user.visible_message("Without even breaking stride, [user] flips open and lights [src] in one smooth movement.") else @@ -462,8 +460,8 @@ CIGARETTE PACKETS ARE IN FANCY.DM processing_objects.Add(src) else lit = 0 - icon_state = icon_off - item_state = icon_off + icon_state = "[base_state]" + item_state = "[base_state]" if(istype(src, /obj/item/weapon/flame/lighter/zippo) ) user.visible_message("You hear a quiet click, as [user] shuts off [src] without even looking at what they're doing.") else diff --git a/code/game/objects/items/weapons/kitchen.dm b/code/game/objects/items/weapons/kitchen.dm index 4eef78e45c..cfb05d1148 100644 --- a/code/game/objects/items/weapons/kitchen.dm +++ b/code/game/objects/items/weapons/kitchen.dm @@ -155,6 +155,12 @@ "\red [user] is slitting \his stomach open with the [src.name]! It looks like \he's trying to commit seppuku.") return (BRUTELOSS) +/obj/item/weapon/kitchenknife/hook + name = "meat hook" + desc = "A sharp, metal hook what sticks into things." + icon_state = "hook_knife" + item_state = "hook_knife" + /obj/item/weapon/kitchenknife/ritual name = "ritual knife" desc = "The unearthly energies that once powered this blade are now dormant." diff --git a/code/game/objects/items/weapons/storage/belt.dm b/code/game/objects/items/weapons/storage/belt.dm index 47821d6a24..79b1852e7b 100644 --- a/code/game/objects/items/weapons/storage/belt.dm +++ b/code/game/objects/items/weapons/storage/belt.dm @@ -92,12 +92,9 @@ /obj/item/weapon/storage/belt/medical/emt name = "EMT utility belt" desc = "A sturdy black webbing belt with attached pouches." - icon = 'icons/obj/custom_items.dmi' icon_state = "emsbelt" item_state = "emsbelt" - - /obj/item/weapon/storage/belt/security name = "security belt" desc = "Can hold security gear like handcuffs and flashes." diff --git a/code/game/objects/items/weapons/storage/boxes.dm b/code/game/objects/items/weapons/storage/boxes.dm index f8be15d3e4..d5af4b2bc7 100644 --- a/code/game/objects/items/weapons/storage/boxes.dm +++ b/code/game/objects/items/weapons/storage/boxes.dm @@ -53,21 +53,20 @@ /obj/item/weapon/storage/box/survival/ New() ..() - contents = list() - sleep(1) new /obj/item/clothing/mask/breath( src ) new /obj/item/weapon/tank/emergency_oxygen( src ) - return + +/obj/item/weapon/storage/box/survival/vox/ + New() + ..() + new /obj/item/clothing/mask/breath( src ) + new /obj/item/weapon/tank/emergency_nitrogen( src ) /obj/item/weapon/storage/box/engineer/ New() ..() - contents = list() - sleep(1) new /obj/item/clothing/mask/breath( src ) new /obj/item/weapon/tank/emergency_oxygen/engi( src ) - return - /obj/item/weapon/storage/box/gloves name = "box of latex gloves" diff --git a/code/game/objects/items/weapons/storage/firstaid.dm b/code/game/objects/items/weapons/storage/firstaid.dm index 7b2c03ba4a..c23dfcdb51 100644 --- a/code/game/objects/items/weapons/storage/firstaid.dm +++ b/code/game/objects/items/weapons/storage/firstaid.dm @@ -289,3 +289,17 @@ new /obj/item/weapon/reagent_containers/pill/tramadol( src ) new /obj/item/weapon/reagent_containers/pill/tramadol( src ) new /obj/item/weapon/reagent_containers/pill/tramadol( src ) + +/obj/item/weapon/storage/pill_bottle/citalopram + name = "bottle of Citalopram pills" + desc = "Contains pills used to stabilize a patient's mood." + + New() + ..() + new /obj/item/weapon/reagent_containers/pill/citalopram( src ) + new /obj/item/weapon/reagent_containers/pill/citalopram( src ) + new /obj/item/weapon/reagent_containers/pill/citalopram( src ) + new /obj/item/weapon/reagent_containers/pill/citalopram( src ) + new /obj/item/weapon/reagent_containers/pill/citalopram( src ) + new /obj/item/weapon/reagent_containers/pill/citalopram( src ) + new /obj/item/weapon/reagent_containers/pill/citalopram( src ) \ No newline at end of file diff --git a/code/game/objects/items/weapons/tanks/tank_types.dm b/code/game/objects/items/weapons/tanks/tank_types.dm index 3f2bbb1826..a43d49a39c 100644 --- a/code/game/objects/items/weapons/tanks/tank_types.dm +++ b/code/game/objects/items/weapons/tanks/tank_types.dm @@ -144,6 +144,29 @@ icon_state = "emergency_double" volume = 10 +/obj/item/weapon/tank/emergency_nitrogen + name = "emergency nitrogen tank" + desc = "An emergency air tank hastily painted red and issued to Vox crewmembers." + icon_state = "emergency_nitro" + flags = CONDUCT + slot_flags = SLOT_BELT + w_class = 2.0 + force = 4.0 + distribute_pressure = ONE_ATMOSPHERE*O2STANDARD + volume = 2 + + New() + ..() + src.air_contents.adjust_gas("nitrogen", (3*ONE_ATMOSPHERE)*volume/(R_IDEAL_GAS_EQUATION*T20C)) + + return + + + examine(mob/user) + if(..(user, 0) && air_contents.gas["nitrogen"] < 0.2 && loc==user) + user << text("\red The meter on the [src.name] indicates you are almost out of air!") + user << sound('sound/effects/alert.ogg') + /* * Nitrogen */ diff --git a/code/game/objects/random/random.dm b/code/game/objects/random/random.dm index de73e5e7b3..18e0c75e1a 100644 --- a/code/game/objects/random/random.dm +++ b/code/game/objects/random/random.dm @@ -158,7 +158,7 @@ spawn_nothing_percentage = 50 item_to_spawn() return pick(prob(3);/obj/item/weapon/storage/pill_bottle/tramadol,\ - prob(4);/obj/item/weapon/haircomb/fluff/cado_keppel_1,\ + prob(4);/obj/item/weapon/haircomb,\ prob(2);/obj/item/weapon/storage/pill_bottle/happy,\ prob(2);/obj/item/weapon/storage/pill_bottle/zoom,\ prob(5);/obj/item/weapon/contraband/poster,\ diff --git a/code/game/objects/structures/coathanger.dm b/code/game/objects/structures/coathanger.dm index a54c40b755..decba4bfd3 100644 --- a/code/game/objects/structures/coathanger.dm +++ b/code/game/objects/structures/coathanger.dm @@ -4,7 +4,7 @@ icon = 'icons/obj/coatrack.dmi' icon_state = "coatrack0" var/obj/item/clothing/suit/coat - var/list/allowed = list(/obj/item/clothing/suit/storage/labcoat, /obj/item/clothing/suit/storage/toggle/labcoat, /obj/item/clothing/suit/storage/det_suit) + var/list/allowed = list(/obj/item/clothing/suit/storage/toggle/labcoat, /obj/item/clothing/suit/storage/det_suit) /obj/structure/coatrack/attack_hand(mob/user as mob) user.visible_message("[user] takes [coat] off \the [src].", "You take [coat] off the \the [src]") diff --git a/code/game/objects/structures/crates_lockers/largecrate.dm b/code/game/objects/structures/crates_lockers/largecrate.dm index 5419ee2639..a0ef655579 100644 --- a/code/game/objects/structures/crates_lockers/largecrate.dm +++ b/code/game/objects/structures/crates_lockers/largecrate.dm @@ -23,44 +23,7 @@ return attack_hand(user) /obj/structure/largecrate/mule - icon_state = "mulecrate" - -/obj/structure/largecrate/lisa - icon_state = "lisacrate" - -/obj/structure/largecrate/lisa/attackby(obj/item/weapon/W as obj, mob/user as mob) //ugly but oh well - if(istype(W, /obj/item/weapon/crowbar)) - new /mob/living/simple_animal/corgi/Lisa(loc) - ..() - -/obj/structure/largecrate/cow - name = "cow crate" - icon_state = "lisacrate" - -/obj/structure/largecrate/cow/attackby(obj/item/weapon/W as obj, mob/user as mob) - if(istype(W, /obj/item/weapon/crowbar)) - new /mob/living/simple_animal/cow(loc) - ..() - -/obj/structure/largecrate/goat - name = "goat crate" - icon_state = "lisacrate" - -/obj/structure/largecrate/goat/attackby(obj/item/weapon/W as obj, mob/user as mob) - if(istype(W, /obj/item/weapon/crowbar)) - new /mob/living/simple_animal/hostile/retaliate/goat(loc) - ..() - -/obj/structure/largecrate/chick - name = "chicken crate" - icon_state = "lisacrate" - -/obj/structure/largecrate/chick/attackby(obj/item/weapon/W as obj, mob/user as mob) - if(istype(W, /obj/item/weapon/crowbar)) - var/num = rand(4, 6) - for(var/i = 0, i < num, i++) - new /mob/living/simple_animal/chick(loc) - ..() + name = "MULE crate" /obj/structure/largecrate/hoverpod name = "\improper Hoverpod assembly crate" @@ -71,9 +34,43 @@ if(istype(W, /obj/item/weapon/crowbar)) var/obj/item/mecha_parts/mecha_equipment/ME var/obj/mecha/working/hoverpod/H = new (loc) - + ME = new /obj/item/mecha_parts/mecha_equipment/tool/hydraulic_clamp ME.attach(H) ME = new /obj/item/mecha_parts/mecha_equipment/tool/passenger ME.attach(H) ..() + +/obj/structure/largecrate/animal + icon_state = "mulecrate" + var/held_count = 1 + var/held_type + +/obj/structure/largecrate/animal/New() + ..() + for(var/i = 1;i<=held_count;i++) + new held_type(src) + +/obj/structure/largecrate/animal/corgi + name = "corgi carrier" + held_type = /mob/living/simple_animal/corgi + +/obj/structure/largecrate/animal/cow + name = "cow crate" + held_type = /mob/living/simple_animal/cow + +/obj/structure/largecrate/animal/goat + name = "goat crate" + held_type = /mob/living/simple_animal/hostile/retaliate/goat + +/obj/structure/largecrate/animal/cat + name = "cat carrier" + held_type = /mob/living/simple_animal/cat + +/obj/structure/largecrate/animal/cat/bones + held_type = /mob/living/simple_animal/cat/fluff/bones + +/obj/structure/largecrate/animal/chick + name = "chicken crate" + held_count = 5 + held_type = /mob/living/simple_animal/chick \ No newline at end of file diff --git a/code/global.dm b/code/global.dm index fce133f586..bfb1806b80 100644 --- a/code/global.dm +++ b/code/global.dm @@ -268,4 +268,4 @@ var/global/obj/item/device/radio/intercom/global_announcer = new(null) var/list/station_departments = list("Command", "Medical", "Engineering", "Science", "Security", "Cargo", "Civilian") var/global/const/TICKS_IN_DAY = 864000 -var/global/const/TICKS_IN_SECOND = 10 +var/global/const/TICKS_IN_SECOND = 10 diff --git a/code/modules/admin/admin.dm b/code/modules/admin/admin.dm index b522d7e7c6..7d29322163 100644 --- a/code/modules/admin/admin.dm +++ b/code/modules/admin/admin.dm @@ -1010,6 +1010,46 @@ var/global/floorIsLava = 0 var/datum/seed/S = plant_controller.seeds[seedtype] S.harvest(usr,0,0,1) +/datum/admins/proc/spawn_custom_item() + set category = "Debug" + set desc = "Spawn a custom item." + set name = "Spawn Custom Item" + + if(!check_rights(R_SPAWN)) return + + var/owner = input("Select a ckey.", "Spawn Custom Item") as null|anything in custom_items + if(!owner|| !custom_items[owner]) + return + + var/list/possible_items = custom_items[owner] + var/datum/custom_item/item_to_spawn = input("Select an item to spawn.", "Spawn Custom Item") as null|anything in possible_items + if(!item_to_spawn) + return + + item_to_spawn.spawn_item(get_turf(usr)) + +/datum/admins/proc/check_custom_items() + + set category = "Debug" + set desc = "Check the custom item list." + set name = "Check Custom Items" + + if(!check_rights(R_SPAWN)) return + + if(!custom_items) + usr << "Custom item list is null." + return + + if(!custom_items.len) + usr << "Custom item list not populated." + return + + for(var/assoc_key in custom_items) + usr << "[assoc_key] has:" + var/list/current_items = custom_items[assoc_key] + for(var/datum/custom_item/item in current_items) + usr << "- name: [item.name] icon: [item.item_icon] path: [item.item_path] desc: [item.item_desc]" + /datum/admins/proc/spawn_plant() set category = "Debug" set desc = "Spawn a spreading plant effect." diff --git a/code/modules/admin/admin_verbs.dm b/code/modules/admin/admin_verbs.dm index 877b29b0b1..c22fc85466 100644 --- a/code/modules/admin/admin_verbs.dm +++ b/code/modules/admin/admin_verbs.dm @@ -115,6 +115,8 @@ var/list/admin_verbs_fun = list( ) var/list/admin_verbs_spawn = list( /datum/admins/proc/spawn_fruit, + /datum/admins/proc/spawn_custom_item, + /datum/admins/proc/check_custom_items, /datum/admins/proc/spawn_plant, /datum/admins/proc/spawn_atom, /*allows us to spawn instances*/ /client/proc/respawn_character, diff --git a/code/modules/admin/verbs/striketeam.dm b/code/modules/admin/verbs/striketeam.dm index c49e09d554..ef217b16f9 100644 --- a/code/modules/admin/verbs/striketeam.dm +++ b/code/modules/admin/verbs/striketeam.dm @@ -4,7 +4,7 @@ var/const/commandos_possible = 6 //if more Commandos are needed in the future /client/proc/strike_team() set category = "Fun" set name = "Spawn Strike Team" - set desc = "Spawns a death squad if you want to run an admin event." + set desc = "Spawns a strike team if you want to run an admin event." if(!src.holder) src << "Only administrators may use this command." @@ -20,12 +20,12 @@ var/const/commandos_possible = 6 //if more Commandos are needed in the future var/datum/antagonist/deathsquad/team - var/choice = input(usr, "Select type of strike team:") as null|anything in list("Death Squad", "Mercenaries") + var/choice = input(usr, "Select type of strike team:") as null|anything in list("Heavy Asset Protection", "Mercenaries") if(!choice) return switch(choice) - if("Death Squad") + if("Heavy Asset Protection") team = deathsquad if("Mercenaries") team = commandos diff --git a/code/modules/client/preferences_gear.dm b/code/modules/client/preferences_gear.dm index 03a1104905..b63869bccb 100644 --- a/code/modules/client/preferences_gear.dm +++ b/code/modules/client/preferences_gear.dm @@ -279,7 +279,7 @@ var/global/list/gear_datums = list() /datum/gear/scanning_goggles display_name = "scanning goggles" - path = /obj/item/clothing/glasses/fluff/uzenwa_sissra_1 + path = /obj/item/clothing/glasses/science/scanners cost = 1 slot = slot_glasses @@ -893,7 +893,7 @@ var/global/list/gear_datums = list() /datum/gear/toeless_jackboots display_name = "toe-less jackboots" - path = /obj/item/clothing/shoes/jackboots/fluff/kecer_eldraran + path = /obj/item/clothing/shoes/jackboots/unathi cost = 1 slot = slot_shoes diff --git a/code/modules/clothing/glasses/glasses.dm b/code/modules/clothing/glasses/glasses.dm index 97eb175277..8233172211 100644 --- a/code/modules/clothing/glasses/glasses.dm +++ b/code/modules/clothing/glasses/glasses.dm @@ -62,6 +62,11 @@ ..() overlay = global_hud.science +/obj/item/clothing/glasses/science/scanners + name = "Scanning Goggles" + desc = "A very oddly shaped pair of goggles with bits of wire poking out the sides. A soft humming sound emanates from it." + icon_state = "uzenwa_sissra_1" + /obj/item/clothing/glasses/night name = "Night Vision Goggles" desc = "You can totally see in the dark now!" diff --git a/code/modules/clothing/shoes/miscellaneous.dm b/code/modules/clothing/shoes/miscellaneous.dm index 616d13e858..9fd713fc74 100644 --- a/code/modules/clothing/shoes/miscellaneous.dm +++ b/code/modules/clothing/shoes/miscellaneous.dm @@ -89,6 +89,13 @@ force = 3 siemens_coefficient = 0.7 +/obj/item/clothing/shoes/jackboots/unathi + name = "toe-less jackboots" + desc = "Modified pair of jackboots, particularly friendly to those species whose toes hold claws." + item_state = "digiboots" + icon_state = "digiboots" + species_restricted = null + /obj/item/clothing/shoes/cult name = "boots" desc = "A pair of boots worn by the followers of Nar-Sie." diff --git a/code/modules/clothing/spacesuits/rig/modules/ninja.dm b/code/modules/clothing/spacesuits/rig/modules/ninja.dm index 51ee46d0d2..e3926d7b0b 100644 --- a/code/modules/clothing/spacesuits/rig/modules/ninja.dm +++ b/code/modules/clothing/spacesuits/rig/modules/ninja.dm @@ -16,8 +16,8 @@ disruptable = 1 disruptive = 0 - use_power_cost = 5 - active_power_cost = 1 + use_power_cost = 50 + active_power_cost = 10 passive_power_cost = 0 module_cooldown = 30 @@ -187,4 +187,4 @@ if(holder && holder.wearer) holder.wearer.drop_from_inventory(src) qdel(holder) - qdel(src) \ No newline at end of file + qdel(src) diff --git a/code/modules/clothing/suits/jobs.dm b/code/modules/clothing/suits/jobs.dm index a589c745d2..e0fa47f64f 100644 --- a/code/modules/clothing/suits/jobs.dm +++ b/code/modules/clothing/suits/jobs.dm @@ -185,6 +185,14 @@ /obj/item/device/healthanalyzer, /obj/item/device/flashlight, /obj/item/device/radio, /obj/item/weapon/tank/emergency_oxygen) body_parts_covered = UPPER_TORSO|ARMS +/obj/item/clothing/suit/storage/toggle/fr_jacket/ems + name = "\improper EMS jacket" + desc = "A dark blue, martian-pattern, EMS jacket. It sports high-visibility reflective stripes and a star of life on the back." + icon_state = "ems_jacket_closed" + item_state = "ems_jacket_closed" + icon_open = "ems_jacket_open" + icon_closed = "ems_jacket_closed" + //Mime /obj/item/clothing/suit/suspenders name = "suspenders" diff --git a/code/modules/clothing/under/accessories/accessory.dm b/code/modules/clothing/under/accessories/accessory.dm index 8ce02ec8e5..10c8bb70b8 100644 --- a/code/modules/clothing/under/accessories/accessory.dm +++ b/code/modules/clothing/under/accessories/accessory.dm @@ -140,78 +140,3 @@ /obj/item/clothing/accessory/medal/gold/heroism name = "medal of exceptional heroism" desc = "An extremely rare golden medal awarded only by CentComm. To recieve such a medal is the highest honor and as such, very few exist. This medal is almost never awarded to anybody but commanders." - -/* - Holobadges are worn on the belt or neck, and can be used to show that the holder is an authorized - Security agent - the user details can be imprinted on the badge with a Security-access ID card, - or they can be emagged to accept any ID for use in disguises. -*/ - -/obj/item/clothing/accessory/holobadge - name = "holobadge" - desc = "This glowing blue badge marks the holder as THE LAW." - icon_state = "holobadge" - slot_flags = SLOT_BELT | SLOT_TIE - - var/emagged = 0 //Emagging removes Sec check. - var/stored_name = null - -/obj/item/clothing/accessory/holobadge/cord - icon_state = "holobadge-cord" - slot_flags = SLOT_MASK | SLOT_TIE - -/obj/item/clothing/accessory/holobadge/attack_self(mob/user as mob) - if(!stored_name) - user << "Waving around a badge before swiping an ID would be pretty pointless." - return - if(isliving(user)) - user.visible_message("\red [user] displays their NanoTrasen Internal Security Legal Authorization Badge.\nIt reads: [stored_name], NT Security.","\red You display your NanoTrasen Internal Security Legal Authorization Badge.\nIt reads: [stored_name], NT Security.") - -/obj/item/clothing/accessory/holobadge/attackby(var/obj/item/O as obj, var/mob/user as mob) - - if (istype(O, /obj/item/weapon/card/emag)) - if (emagged) - user << "\red [src] is already cracked." - return - else - emagged = 1 - user << "\red You swipe [O] and crack the holobadge security checks." - return - - else if(istype(O, /obj/item/weapon/card/id) || istype(O, /obj/item/device/pda)) - - var/obj/item/weapon/card/id/id_card = null - - if(istype(O, /obj/item/weapon/card/id)) - id_card = O - else - var/obj/item/device/pda/pda = O - id_card = pda.id - - if(access_security in id_card.access || emagged) - user << "You imprint your ID details onto the badge." - stored_name = id_card.registered_name - name = "holobadge ([stored_name])" - desc = "This glowing blue badge marks [stored_name] as THE LAW." - else - user << "[src] rejects your insufficient access rights." - return - ..() - -/obj/item/clothing/accessory/holobadge/attack(mob/living/carbon/human/M, mob/living/user) - if(isliving(user)) - user.visible_message("\red [user] invades [M]'s personal space, thrusting [src] into their face insistently.","\red You invade [M]'s personal space, thrusting [src] into their face insistently. You are the law.") - -/obj/item/weapon/storage/box/holobadge - name = "holobadge box" - desc = "A box claiming to contain holobadges." - New() - new /obj/item/clothing/accessory/holobadge(src) - new /obj/item/clothing/accessory/holobadge(src) - new /obj/item/clothing/accessory/holobadge(src) - new /obj/item/clothing/accessory/holobadge(src) - new /obj/item/clothing/accessory/holobadge/cord(src) - new /obj/item/clothing/accessory/holobadge/cord(src) - ..() - return - diff --git a/code/modules/clothing/under/accessories/badges.dm b/code/modules/clothing/under/accessories/badges.dm new file mode 100644 index 0000000000..bb6613582e --- /dev/null +++ b/code/modules/clothing/under/accessories/badges.dm @@ -0,0 +1,98 @@ +/* + Badges are worn on the belt or neck, and can be used to show that the holder is an authorized + Security agent - the user details can be imprinted on holobadges with a Security-access ID card, + or they can be emagged to accept any ID for use in disguises. +*/ + +/obj/item/clothing/accessory/badge + name = "detective's badge" + desc = "NanoTrasen Security Department detective's badge, made from gold." + icon_state = "badge" + slot_flags = SLOT_BELT | SLOT_TIE + + var/stored_name + var/badge_string = "NanoTrasen Security Department" + +/obj/item/clothing/accessory/badge/old + name = "faded badge" + desc = "A faded badge, backed with leather. It bears the emblem of the Forensic division." + icon_state = "badge_round" + +/obj/item/clothing/accessory/badge/proc/set_name(var/new_name) + stored_name = new_name + name = "[initial(name)] ([stored_name])" + +/obj/item/clothing/accessory/badge/attack_self(mob/user as mob) + + if(!stored_name) + user << "You polish your old badge fondly, shining up the surface." + set_name(user.real_name) + return + + if(isliving(user)) + if(stored_name) + user.visible_message("[user] displays their [src.name].\nIt reads: [stored_name], [badge_string].","You display your [src.name].\nIt reads: [stored_name], [badge_string].") + else + user.visible_message("[user] displays their [src.name].\nIt reads: [badge_string].","You display your [src.name]. It reads: [badge_string].") + +/obj/item/clothing/accessory/badge/attack(mob/living/carbon/human/M, mob/living/user) + if(isliving(user)) + user.visible_message("[user] invades [M]'s personal space, thrusting [src] into their face insistently.","You invade [M]'s personal space, thrusting [src] into their face insistently.") + +//.Holobadges. +/obj/item/clothing/accessory/badge/holo + name = "holobadge" + desc = "This glowing blue badge marks the holder as THE LAW." + var/emagged = 0 //Emagging removes Sec check. + +/obj/item/clothing/accessory/badge/holo/cord + icon_state = "holobadge-cord" + slot_flags = SLOT_MASK | SLOT_TIE + +/obj/item/clothing/accessory/badge/holo/attack_self(mob/user as mob) + if(!stored_name) + user << "Waving around a holobadge before swiping an ID would be pretty pointless." + return + return ..() + +/obj/item/clothing/accessory/badge/holo/attackby(var/obj/item/O as obj, var/mob/user as mob) + + if (istype(O, /obj/item/weapon/card/emag)) + if (emagged) + user << "[src] is already cracked." + return + else + emagged = 1 + user << "You swipe [O] and crack the holobadge security checks." + return + + else if(istype(O, /obj/item/weapon/card/id) || istype(O, /obj/item/device/pda)) + + var/obj/item/weapon/card/id/id_card = null + + if(istype(O, /obj/item/weapon/card/id)) + id_card = O + else + var/obj/item/device/pda/pda = O + id_card = pda.id + + if(access_security in id_card.access || emagged) + user << "You imprint your ID details onto the badge." + set_name(user.real_name) + else + user << "[src] rejects your insufficient access rights." + return + ..() + +/obj/item/weapon/storage/box/holobadge + name = "holobadge box" + desc = "A box claiming to contain holobadges." + New() + new /obj/item/clothing/accessory/badge/holo(src) + new /obj/item/clothing/accessory/badge/holo(src) + new /obj/item/clothing/accessory/badge/holo(src) + new /obj/item/clothing/accessory/badge/holo(src) + new /obj/item/clothing/accessory/badge/holo/cord(src) + new /obj/item/clothing/accessory/badge/holo/cord(src) + ..() + return diff --git a/code/modules/clothing/under/accessories/lockets.dm b/code/modules/clothing/under/accessories/lockets.dm new file mode 100644 index 0000000000..d5fa21c0aa --- /dev/null +++ b/code/modules/clothing/under/accessories/lockets.dm @@ -0,0 +1,46 @@ +/obj/item/clothing/accessory/locket + name = "silver locket" + desc = "This oval shaped, argentium sterling silver locket hangs on an incredibly fine, refractive string, almost thin as hair and microweaved from links to a deceptive strength, of similar material. The edges are engraved very delicately with an elegant curving design, but overall the main is unmarked and smooth to the touch, leaving room for either remaining as a stolid piece or future alterations. There is an obvious internal place for a picture or lock of some sort, but even behind that is a very thin compartment unhinged with the pinch of a thumb and forefinger." + icon_state = "locket" + item_state = "locket" + slot_flags = 0 + w_class = 2 + slot_flags = SLOT_MASK | SLOT_TIE + var/base_icon + var/open + var/obj/item/held //Item inside locket. + +/obj/item/clothing/accessory/locket/heart + name = "heart-shaped locket" + desc = " A silver, heart-shaped locket. It flips open to reveal two pictures, one of a young red-headed woman and one of a brunette of similar age. Small writing is etched onto the back, reading 'M+L'. Some may regard it as cheesy." + icon_state = "heartlocket" + +/obj/item/clothing/accessory/locket/attack_self(mob/user as mob) + if(!base_icon) + base_icon = icon_state + open = !open + user << "You flip \the [src] [open?"open":"closed"]." + if(open) + icon_state = "[base_icon]_open" + if(held) + user << "\The [held] falls out!" + held.loc = get_turf(user) + src.held = null + else + icon_state = "[base_icon]" + +/obj/item/clothing/accessory/locket/attackby(var/obj/item/O as obj, mob/user as mob) + if(!open) + user << "You have to open it first." + return + + if(istype(O,/obj/item/weapon/paper) || istype(O, /obj/item/weapon/photo)) + if(held) + usr << "[src] already has something inside it." + else + usr << "You slip [O] into [src]." + user.drop_item() + O.loc = src + src.held = O + return + ..() \ No newline at end of file diff --git a/code/modules/clothing/under/jobs/medsci.dm b/code/modules/clothing/under/jobs/medsci.dm index 10e6b05518..3ceab6cee0 100644 --- a/code/modules/clothing/under/jobs/medsci.dm +++ b/code/modules/clothing/under/jobs/medsci.dm @@ -113,6 +113,13 @@ permeability_coefficient = 0.50 armor = list(melee = 0, bullet = 0, laser = 0,energy = 0, bomb = 0, bio = 10, rad = 0) +/obj/item/clothing/under/rank/medical/paramedic + name = "short sleeve medical jumpsuit" + desc = "It's made of a special fiber that provides minor protection against biohazards. This one has a cross on the chest denoting that the wearer is trained medical personnel." + icon_state = "medical_short" + item_state = "medical_short" + body_parts_covered = UPPER_TORSO|LOWER_TORSO|LEGS + /obj/item/clothing/under/rank/medical/blue name = "medical scrubs" desc = "It's made of a special fiber that provides minor protection against biohazards. This one is in baby blue." diff --git a/code/modules/customitems/item_defines.dm b/code/modules/customitems/item_defines.dm deleted file mode 100644 index f1237cb721..0000000000 --- a/code/modules/customitems/item_defines.dm +++ /dev/null @@ -1,1472 +0,0 @@ -// Add custom items you give to people here, and put their icons in custom_items.dmi -// Remember to change 'icon = 'icons/obj/custom_items.dmi'' for items not using /obj/item/fluff as a base -// Clothing item_state doesn't use custom_items.dmi. Just add them to the normal clothing files. - -/obj/item/fluff // so that they don't spam up the object tree - icon = 'icons/obj/custom_items.dmi' - w_class = 1.0 - -////////////////////////////////// -////////// Fluff Items /////////// -////////////////////////////////// - -/obj/item/weapon/paper/fluff/sue_donem // aikasan: Sue Donem - name = "cyborgification waiver" - desc = "It's some kind of official-looking contract." - -/obj/item/weapon/paper/fluff/sue_donem/New() - ..() - - info = "Organic Carrier AIA and Standard Cyborgification Agreement
\n
\nUnder the authority of Nanotrasen Synthetic Intelligence Division, this document hereby authorizes an accredited Roboticist of the NSS Exodus or a deputized authority to perform a regulation lobotomisation upon the person of one 'Sue Donem' (hereafter referred to as the Subject) with intent to enact a live Artificial Intelligence Assimilation (AIA) or live Cyborgification proceedure.
\n
\nNo further station authorization is required, and the Subject waives all rights as a human under Nanotrasen internal and external legal protocol. This document is subject to amendment under Nanotrasen internal protocol \[REDACTED\].
\n
\nSigned: Sue Donem
\n" - - stamps = (stamps=="" ? "
" : "
") + "This paper has been stamped with the NanoTrasen Synthetic Intelligence Division rubber stamp." - - var/image/stampoverlay = image('icons/obj/bureaucracy.dmi') - stampoverlay.pixel_x = rand(-2, 2) - stampoverlay.pixel_y = rand(-3, 2) - stampoverlay.icon_state = "paper_stamp-rd" - overlays += stampoverlay - - update_icon() - -/obj/item/fluff/wes_solari_1 //tzefa: Wes Solari - name = "family photograph" - desc = "A family photograph of a couple and a young child, Written on the back it says \"See you soon Dad -Roy\"." - icon_state = "wes_solari_1" - -/obj/item/fluff/sarah_calvera_1 //fniff: Sarah Calvera - name = "old photo" - desc = "Looks like it was made on a really old, cheap camera. Low quality. The camera shows a young hispanic looking girl with red hair wearing a white dress is standing in front of\ - an old looking wall. On the back there is a note in black marker that reads \"Sara, Siempre pensé que eras tan linda con ese vestido. Tu hermano, Carlos.\"" - icon_state = "sarah_calvera_1" - -/obj/item/fluff/angelo_wilkerson_1 //fniff: Angleo Wilkerson - name = "fancy watch" - desc = "An old and expensive pocket watch. Engraved on the bottom is \"Odium est Source De Dolor\". On the back, there is an engraving that does not match the bottom and looks more recent.\ - \"Angelo, If you find this, you shall never see me again. Please, for your sake, go anywhere and do anything but stay. I'm proud of you and I will always love you. Your father, Jacob Wilkerson.\"\ - Jacob Wilkerson... Wasn't he that serial killer?" - icon_state = "angelo_wilkerson_1" - -/obj/item/fluff/sarah_carbrokes_1 //gvazdas: Sarah Carbrokes - name = "locket" - desc = "A grey locket with a picture of a black haired man in it. The text above it reads: \"Edwin Carbrokes\"." - icon_state = "sarah_carbrokes_1" - -/obj/item/fluff/ethan_way_1 //whitellama: Ethan Way - name = "old ID" - desc = "A scratched and worn identification card; it appears too damaged to inferface with any technology. You can almost make out \"Tom Cabinet\" in the smeared ink." - icon_state = "ethan_way_1" - -/obj/item/fluff/val_mcneil_1 //silentthunder: Val McNeil - name = "rosary pendant" - desc = "A cross on a ring of beads, has McNeil etched onto the back." - icon_state = "val_mcneil_1" - -/obj/item/fluff/steve_johnson_1 //thebreadbocks: Steve Johnson - name = "bottle of hair dye" - desc = "A bottle of pink hair dye. So that's how he gets his beard so pink..." - icon_state = "steve_johnson_1" - item_state = "steve_johnson_1" - -/obj/item/fluff/david_fanning_1 //sicktrigger: David Fanning - name = "golden scalpel" - desc = "A fine surgical cutting tool covered in thin gold leaf. Does not seem able to cut anything." - icon_state = "david_fanning_1" - item_state = "david_fanning_1" - -/obj/item/fluff/john_mckeever_1 //kirbyelder: John McKeever - name = "Suspicious Paper" - desc = "A piece of paper reading: Smash = 1/3 Leaf Juice, 1/3 Tricker, 1/3 Aajkli Extract" - icon_state = "paper" - item_state = "paper" - -/obj/item/fluff/maurice_bedford_1 - name = "Monogrammed Handkerchief" - desc = "A neatly folded handkerchief embroidered with a 'M'." - icon_state = "maurice_bedford_1" - -/obj/item/weapon/book/fluff/johnathan_falcian_1 - name = "sketchbook" - desc = "A small, well-used sketchbook." - icon = 'icons/obj/custom_items.dmi' - icon_state = "johnathan_notebook" - dat = "In the notebook there are numerous drawings of various crew-mates, locations, and scenes on the ship. They are of fairly good quality." - author = "Johnathan Falcian" - title = "Falcian's sketchbook" - -////////////////////////////////// -////////// Usable Items ////////// -////////////////////////////////// - -/obj/item/weapon/folder/blue/fluff/matthew_riebhardt //Matthew Riebhardt - ZekeSulastin - name = "academic journal" - desc = "An academic journal, seemingly pertaining to medical genetics. This issue is for the second quarter of 2557. Paper flags demarcate some articles the owner finds interesting." - icon = 'icons/obj/custom_items.dmi' - icon_state = "matthewriebhardt" - -/////////////////////// Serveris: Officer's Notebook //////////////////// - -/obj/item/weapon/folder/blue/fluff/officer_notebook - name = "Officer's Notebook" - desc = "A simple, spiral bound notebook. A holographic crescent moon is printed on the cover, as well as 'S. Seto' beneath it. Numerous paper flags divide the pages, titled everything from incident reports to personal notes." - icon = 'icons/obj/custom_items.dmi' - icon_state = "syrus_notebook" - -/////////////////////// Cataguettes - Lucy's Stethoscope - Lucy Kemmerer ////// - -/obj/item/clothing/accessory/stethoscope/fluff/lucystethos - name = "Lucy's Stethoscope" - desc = "A medical apparatus intended to ease in listening to the sounds of the human body. This one looks cleaner and sparklier than the rest. There is a small silver plaque attached to the tubing, with the words 'Lucy Kemmerer' engraved on it." - icon_state = "lucystethos" - item_state = "lucystethos" - icon = 'icons/obj/custom_items.dmi' - -/obj/item/weapon/pen/fluff/multi //spaceman96: Trenna Seber - name = "multicolor pen" - desc = "It's a cool looking pen. Lots of colors!" - -//////////////////////// AIsForAxolotl - Tea Flask - Margaret Stewart ////////// - -/obj/item/weapon/reagent_containers/food/drinks/flask/vacuumflask/fluff/margaret - name = "Tea Flask" - desc = "A plastic vacuum flask with an ugly tartan pattern. 'M.S.' has been written on the bottom with a silver marker." - icon = 'icons/obj/custom_items.dmi' - icon_state = "margaret_flask" - -/obj/item/weapon/pen/fluff/fancypen //orangebottle: Lillian Levett, Lilliana Reade - name = "fancy pen" - desc = "A fancy metal pen. It uses blue ink. An inscription on one side reads,\"L.L. - L.R.\"" - icon = 'icons/obj/custom_items.dmi' - icon_state = "fancypen" - -/obj/item/weapon/pen/fluff/eugene_bissegger_1 //metamorp: eugene bisseger - name = "Gilded Pen" - desc = "A golden pen that is gilded with a meager amount of gold material. The word 'NanoTrasen' is etched on the clip of the pen." - icon = 'icons/obj/custom_items.dmi' - icon_state = "eugene_pen" - -/obj/item/weapon/pen/fluff/fountainpen //paththegreat: Eli Stevens - name = "Engraved Fountain Pen" - desc = "An expensive looking pen with the initials E.S. engraved into the side." - icon = 'icons/obj/custom_items.dmi' - icon_state = "fountainpen" - -/obj/item/fluff/victor_kaminsky_1 //chinsky: Victor Kaminski - name = "golden detective's badge" - desc = "NanoTrasen Security Department detective's badge, made from gold. Badge number is 564." - icon_state = "victor_kaminsky_1" - -/obj/item/fluff/victor_kaminsky_1/attack_self(mob/user as mob) - for(var/mob/O in viewers(user, null)) - O.show_message(text("[] shows you: \icon[] [].", user, src, src.name), 1) - src.add_fingerprint(user) - -/obj/item/fluff/ana_issek_2 //suethecake: Ana Issek - name = "Faded Badge" - desc = "A faded badge, backed with leather, that reads 'NT Security Force' across the front. It bears the emblem of the Forensic division." - icon_state = "ana_badge" - item_state = "ana_badge" - -/obj/item/fluff/ana_issek_2/attack_self(mob/user as mob) - if(isliving(user)) - user.visible_message("\red [user] flashes their golden security badge.\nIt reads: Ana Issek, NT Security.","\red You display the faded bage.\nIt reads: Ana Issek, NT Security.") - -/obj/item/fluff/ana_issek_2/attack(mob/living/carbon/human/M, mob/living/user) - if(isliving(user)) - user.visible_message("\red [user] invades [M]'s personal space, thrusting [src] into their face insistently.","\red You invade [M]'s personal space, thrusting [src] into their face insistently. You are the law.") - -/obj/item/weapon/soap/fluff/azare_siraj_1 //mister fox: Azare Siraj - name = "S'randarr's Tongue Leaf" - desc = "A waxy, scentless leaf." - icon = 'icons/obj/custom_items.dmi' - icon_state = "siraj_tongueleaf" - item_state = "siraj_tongueleaf" - -/obj/item/weapon/clipboard/fluff/smallnote //lexusjjss: Lexus Langg, Zachary Tomlinson - name = "small notebook" - desc = "A generic small spiral notebook that flips upwards." - icon = 'icons/obj/custom_items.dmi' - icon_state = "smallnotetext" - item_state = "smallnotetext" - -/obj/item/weapon/storage/fluff/maye_daye_1 //morrinn: Maye Day - name = "pristine lunchbox" - desc = "A pristine stainless steel lunch box. The initials M.D. are engraved on the inside of the lid." - icon = 'icons/obj/custom_items.dmi' - icon_state = "maye_daye_1" - -/obj/item/weapon/reagent_containers/food/drinks/flask/fluff/william_hackett - name = "handmade flask" - desc = "A wooden flask with a silver lid and bottom. It has a matte, dark blue paint on it with the initials \"W.H.\" etched in black." - icon = 'icons/obj/custom_items.dmi' - icon_state = "williamhackett" - -/obj/item/weapon/storage/firstaid/fluff/asus_rose //Kerbal22 - Asus Rose - name = "rugged medkit" - desc = "A dinged up medkit, it seems to have seen quite a bit of use." - icon = 'icons/obj/custom_items.dmi' - icon_state = "asusrose" - -/obj/item/weapon/reagent_containers/food/drinks/flask/fluff/johann_erzatz_1 //leonheart11: Johann Erzatz - name = "vintage thermos" - desc = "An older thermos with a faint shine." - icon = 'icons/obj/custom_items.dmi' - icon_state = "johann_erzatz_1" - volume = 50 - -/obj/item/weapon/flame/lighter/zippo/fluff/li_matsuda_1 //mangled: Li Matsuda - name = "blue zippo lighter" - desc = "A zippo lighter made of some blue metal." - icon = 'icons/obj/custom_items.dmi' - icon_state = "bluezippo" - icon_on = "bluezippoon" - icon_off = "bluezippo" - -/obj/item/weapon/flame/lighter/zippo/fluff/michael_guess_1 //Dragor23: Michael Guess - name = "engraved lighter" - desc = "A golden lighter, engraved with some ornaments and a G." - icon = 'icons/obj/custom_items.dmi' - icon_state = "guessip" - icon_on = "guessipon" - icon_off = "guessip" - -///////////////////////////// Jarcolr - Uberto Dandolo - Painted secure briefcase ///////////// - -/obj/item/weapon/storage/secure/briefcase/fluff/uberto_dandolo - name = "painted secure briefcase" - desc = "A bulky briefcase with a combination lock. It features the color green, white and red, and a golden eagle in the middle." - icon = 'icons/obj/custom_items.dmi' - icon_state = "painted_secure" - item_state = "painted_secure" - -///////////////////////////// Ziepes - Janis Godmanis - Red Zippo ////////////////////// - -/obj/item/weapon/flame/lighter/zippo/fluff/janis_godmanis - name = "Red-White-Red Zippo" - desc = "A badass zippo that looks like the Austrian flag. Upon closer inspection it is revealed that it's a different shade of red than the Austrian flag.." - icon = 'icons/obj/custom_items.dmi' - icon_state = "redzippo" - icon_on = "redzippoon" - icon_off = "redzippo" - -////////////////////////////// Tudoreleuu - Emilia Scotts - Customized pAI ///////////// - -/obj/item/device/paicard/fluff/emilia_scotts - name = "Customized pAI unit" - desc = "It seems to be a pAI Unit, albeit in a different shell. It acts exactly like the normal one. " - icon = 'icons/obj/custom_items.dmi' - icon_state = "customized_pai" - -////////////////////////////// Vivallion - Isaac Jachym - Butterfly Lighter //////////// - -/obj/item/weapon/flame/lighter/zippo/fluff/isaac_jachym - name = "Butterfly lighter" - desc = "A custom-made zippo lighter, looks rather expensive. On one of it's sides, a clean inscription has been made, 'Butterfly, what is your wisdom?' And I looked down at it's majestic form, flexing it's wings as if to show it's strength. 'Fuck chechenya.' Had it whispered, before fluttering away, and so we went to war." - icon = 'icons/obj/custom_items.dmi' - icon_state = "che_zippo" - icon_on = "che_zippoon" - icon_off = "che_zippo" - -/obj/item/weapon/flame/lighter/zippo/fluff/riley_rohtin_1 //rawrtaicho: Riley Rohtin - name = "Riley's black zippo" - desc = "A black zippo lighter, which holds some form of sentimental value." - icon = 'icons/obj/custom_items.dmi' - icon_state = "blackzippo" - icon_on = "blackzippoon" - icon_off = "blackzippo" - -/obj/item/weapon/flame/lighter/zippo/fluff/fay_sullivan_1 //furohman: Fay Sullivan - name = "Graduation Lighter" - desc = "A silver engraved lighter with 41 on one side and Tharsis University on the other. The lid reads Fay Sullivan, Cybernetic Engineering, 2541" - icon = 'icons/obj/custom_items.dmi' - icon_state = "gradzippo" - icon_on = "gradzippoon" - icon_off = "gradzippo" - -/obj/item/weapon/flame/lighter/zippo/fluff/executivekill_1 //executivekill: Hunter Duke - name = "Gonzo Fist zippo" - desc = "A Zippo lighter with the iconic Gonzo Fist on a matte black finish." - icon = 'icons/obj/custom_items.dmi' - icon_state = "gonzozippo" - icon_on = "gonzozippoon" - icon_off = "gonzozippo" - -/obj/item/weapon/flame/lighter/zippo/fluff/naples_1 //naples: Russell Vierson - name = "Engraved zippo" - desc = "A intricately engraved Zippo lighter." - icon = 'icons/obj/custom_items.dmi' - icon_state = "engravedzippo" - icon_on = "engravedzippoon" - icon_off = "engravedzippo" - -/obj/item/weapon/haircomb/fluff/cado_keppel_1 //sparklysheep: Cado Keppel - name = "purple comb" - desc = "A pristine purple comb made from flexible plastic. It has a small K etched into its side." - -/obj/item/weapon/fluff/hugo_cinderbacth_1 //thatoneguy: Hugo Cinderbatch - name = "Old Cane" - desc = "An old brown cane made from wood. It has a a large, itallicized H on it's handle." - icon = 'icons/obj/custom_items.dmi' - icon_state = "special_cane" - -/obj/item/device/camera/fluff/orange //chinsky: Summer Springfield - name = "orange camera" - icon = 'icons/obj/custom_items.dmi' - desc = "A modified detective's camera, painted in bright orange. On the back you see \"Have fun\" written in small accurate letters with something black." - icon_state = "orangecamera" - icon_on = "orangecamera" - icon_off = "camera_off" - pictures_left = 30 - -/obj/item/device/camera/fluff/oldcamera //magmaram: Maria Crash - name = "Old Camera" - icon = 'icons/obj/custom_items.dmi' - desc = "An old, slightly beat-up digital camera, with a cheap photo printer taped on. It's a nice shade of blue." - icon_state = "oldcamera" - icon_on = "oldcamera" - icon_off = "oldcamera_off" - pictures_left = 30 - -/obj/item/weapon/id_wallet/fluff/reese_mackenzie //Reese MacKenzie - ThoseDernSquirrels - - name = "ID wallet" - desc = "A wallet made of black leather, holding an ID and a gold badge that reads 'NT.' The ID has a small picture of a man, with the caption Reese James MacKenzie, with other pieces of information to the right of the picture." - icon = 'icons/obj/custom_items.dmi' - icon_state = "reesemackenzie" - -/obj/item/weapon/card/id/fluff/lifetime //fastler: Fastler Greay; it seemed like something multiple people would have - name = "Lifetime ID Card" - desc = "A modified ID card given only to those people who have devoted their lives to the better interests of NanoTrasen. It sparkles blue." - icon = 'icons/obj/custom_items.dmi' - icon_state = "lifetimeid" - -/obj/item/weapon/reagent_containers/food/drinks/flask/fluff/shinyflask //lexusjjss: Lexus Langg & Zachary Tomlinson - name = "shiny flask" - desc = "A shiny metal flask. It appears to have a Greek symbol inscribed on it." - icon = 'icons/obj/custom_items.dmi' - icon_state = "shinyflask" - volume = 50 - -/obj/item/weapon/reagent_containers/food/drinks/flask/fluff/lithiumflask //mcgulliver: Wox Derax - name = "Lithium Flask" - desc = "A flask with a Lithium Atom symbol on it." - icon = 'icons/obj/custom_items.dmi' - icon_state = "lithiumflask" - volume = 50 - -/obj/item/weapon/reagent_containers/glass/beaker/large/fluff/nashida_bishara_1 //rukral:Nashida Bisha'ra - name = "Nashida's Etched Beaker" - desc = "The message: 'Please do not be removing this beaker from the chemistry lab. If lost, return to Nashida Bisha'ra' can be seen etched into the side of this large beaker." - icon = 'icons/obj/chemical.dmi' - icon_state = "beakerlarge" - matter = list("glass" = 5000) - volume = 100 - -/obj/item/weapon/reagent_containers/glass/beaker/fluff/eleanor_stone //Rkf45: Eleanor Stone - name = "teapot" - desc = "An elegant teapot. The engraving on the bottom reads 'ENS'" - icon = 'icons/obj/custom_items.dmi' - icon_state = "eleanorstone" - item_state = "eleanorstone" - - volume = 150 - amount_per_transfer_from_this = 10 - possible_transfer_amounts = list(5,10,15,25,30,50,150) - -/obj/item/weapon/storage/pill_bottle/fluff/listermedbottle //compactninja: Lister Black - name = "Pill bottle (anti-depressants)" - desc = "Contains pills used to deal with depression. They appear to be prescribed to Lister Black" - New() - ..() - new /obj/item/weapon/reagent_containers/pill/fluff/listermed( src ) - new /obj/item/weapon/reagent_containers/pill/fluff/listermed( src ) - new /obj/item/weapon/reagent_containers/pill/fluff/listermed( src ) - new /obj/item/weapon/reagent_containers/pill/fluff/listermed( src ) - new /obj/item/weapon/reagent_containers/pill/fluff/listermed( src ) - new /obj/item/weapon/reagent_containers/pill/fluff/listermed( src ) - new /obj/item/weapon/reagent_containers/pill/fluff/listermed( src ) - -/obj/item/weapon/reagent_containers/pill/fluff/listermed - name = "anti-depressant pill" - desc = "Used to deal with depression." - icon_state = "pill9" - New() - ..() - reagents.add_reagent("stoxin", 5) - reagents.add_reagent("sugar", 10) - reagents.add_reagent("ethanol", 5) - -/obj/item/clothing/mask/fluff/electriccig //CubeJackal: Barry Sharke - name = "Electronic cigarette" - desc = "An electronic cigarette. Most of the relief of a real cigarette with none of the side effects. Often used by smokers who are trying to quit the habit." - icon = 'icons/obj/custom_items.dmi' - icon_state = "cigon" - throw_speed = 0.5 - item_state = "ciglit" - w_class = 1 - body_parts_covered = null - -//Strange penlight, Nerezza: Asher Spock - -/obj/item/weapon/reagent_containers/hypospray/fluff/asher_spock_1 - name = "strange penlight" - desc = "Besides the coloring, this penlight looks rather normal and innocent. However, you get a nagging feeling whenever you see it..." - icon = 'icons/obj/custom_items.dmi' - icon_state = "asher_spock_1" - amount_per_transfer_from_this = 5 - volume = 15 - -/obj/item/weapon/reagent_containers/hypospray/fluff/asher_spock_1/New() - ..() - reagents.remove_reagent("tricordrazine", 30) - reagents.add_reagent("oxycodone", 15) - update_icon() - return - -/obj/item/weapon/reagent_containers/hypospray/fluff/asher_spock_1/attack_self(mob/user as mob) - user << "\blue You click \the [src] but get no reaction. Must be dead." - -/obj/item/weapon/reagent_containers/hypospray/fluff/asher_spock_1/attack(mob/M as mob, mob/user as mob) - if (user.ckey != "nerezza") //Because this can end up in the wrong hands, let's make it useless for them! - user << "\blue You click \the [src] but get no reaction. Must be dead." - return - if(!reagents.total_volume) - user << "\red \The [src] is empty." - return - if (!( istype(M, /mob) )) - return - if (reagents.total_volume) - if (M == user && user.ckey == "nerezza") //Make sure this is being used by the right person, for the right reason (self injection) - visible_message("\blue [user] presses their \ - penlight against their skin, quickly clicking the button once.", \ - "\blue You press the disguised autoinjector against your skin and click the button. There's a sharp pain at the injection site that rapidly fades.", \ - "You hear a rustle as someone moves nearby, then a sharp click.") - if (M != user && user.ckey == "nerezza") //Woah now, you better be careful partner - user << "\blue You don't want to contaminate the autoinjector." - return - src.reagents.reaction(M, INGEST) - if(M.reagents) - var/trans = reagents.trans_to(M, amount_per_transfer_from_this) - user << "\blue [trans] units injected. [reagents.total_volume] units remaining in \the [src]." - return - -/obj/item/weapon/reagent_containers/hypospray/fluff/asher_spock_1/examine(mob/user as mob) - ..() - if(user.ckey != "nerezza") return //Only the owner knows how to examine the contents. - if(reagents && reagents.reagent_list.len) - for(var/datum/reagent/R in reagents.reagent_list) - usr << "\blue You examine the penlight closely and see that it has [R.volume] units of [R.name] stored." - else - usr << "\blue You examine the penlight closely and see that it is currently empty." - -//End strange penlight - -/obj/item/weapon/card/id/fluff/asher_spock_2 //Nerezza: Asher Spock - name = "Odysses Specialist ID card" - desc = "A special identification card with a red cross signifying an emergency physician has specialised in Odysseus operations and maintenance.\nIt grants the owner recharge bay access." - icon = 'icons/obj/custom_items.dmi' - icon_state = "odysseus_spec_id" - -/obj/item/weapon/clipboard/fluff/mcreary_journal //sirribbot: James McReary - name = "McReary's journal" - desc = "A journal with a warning sticker on the front cover. The initials \"J.M.\" are written on the back." - icon = 'icons/obj/custom_items.dmi' - icon_state = "mcreary_journal" - item_state = "mcreary_journal" - -/obj/item/device/flashlight/fluff/thejesster14_1 //thejesster14: Rosa Wolff - name = "old red flashlight" - desc = "A very old, childlike flashlight." - icon = 'icons/obj/custom_items.dmi' - icon_state = "wolfflight" - item_state = "wolfflight" - -/obj/item/weapon/crowbar/fluff/zelda_creedy_1 //daaneesh: Zelda Creedy - name = "Zelda's Crowbar" - desc = "A pink crow bar that has an engraving that reads, 'To Zelda. Love always, Dawn'" - icon = 'icons/obj/custom_items.dmi' - icon_state = "zeldacrowbar" - item_state = "crowbar" - -////// Ripley customisation kit - Butchery Royce - MayeDay - -/obj/item/weapon/paintkit/fluff/butcher_royce_1 - name = "Ripley customisation kit" - desc = "A kit containing all the needed tools and parts to turn an APLU Ripley into a Titan's Fist worker mech." - icon = 'icons/obj/custom_items.dmi' - icon_state = "royce_kit" - - new_name = "APLU \"Titan's Fist\"" - new_desc = "This ordinary mining Ripley has been customized to look like a unit of the Titans Fist." - new_icon = "titan" - allowed_types = list("ripley","firefighter") - -////// Ripley customisation kit - Sven Fjeltson - Mordeth221 - -/obj/item/weapon/paintkit/fluff/sven_fjeltson_1 - name = "Mercenary APLU kit" - desc = "A kit containing all the needed tools and parts to turn an APLU Ripley into an old Mercenaries APLU." - icon = 'icons/obj/custom_items.dmi' - icon_state = "sven_kit" - - new_name = "APLU \"Strike the Earth!\"" - new_desc = "Looks like an over worked, under maintained Ripley with some horrific damage." - new_icon = "earth" - allowed_types = list("ripley","firefighter") - -// Root hardsuit kit defines. -// Icons for modified hardsuits need to be in the proper .dmis because suit cyclers may cock them up. -/obj/item/device/kit/suit/fluff - - name = "hardsuit modification kit" - desc = "A kit for modifying a hardsuit." - icon = 'icons/obj/custom_items.dmi' - icon_state = "salvage_kit" - - var/new_name // Modifier for new item name - '[new_name] hardsuit'. - var/new_helmet_desc // Sets helmet desc. - var/new_suit_desc // Sets suit desc. - var/helmet_icon // Sets helmet icon_state and item_state. - var/suit_icon // Sets suit icon_state and item_state. - var/helmet_color // Sets worn_state. - var/uses = 2 // Uses before the kit deletes itself. - var/new_light_overlay - -/obj/item/clothing/head/helmet/space/void/attackby(var/obj/item/O as obj, mob/user as mob) - ..() - - if(istype(O,/obj/item/device/kit/suit/fluff)) - - var/obj/item/device/kit/suit/fluff/kit = O - name = "[kit.new_name] suit helmet" - desc = kit.new_helmet_desc - icon_state = kit.helmet_icon - item_state = kit.helmet_icon - - if(kit.new_light_overlay) - light_overlay = kit.new_light_overlay - - user << "You set about modifying the helmet into [src]." - playsound(user.loc, 'sound/items/Screwdriver.ogg', 50, 1) - - kit.uses-- - if(kit.uses<1) - user.drop_item() - qdel(O) - -/obj/item/clothing/suit/space/void/attackby(var/obj/item/O as obj, mob/user as mob) - ..() - - if(istype(O,/obj/item/device/kit/suit/fluff)) - - var/obj/item/device/kit/suit/fluff/kit = O - name = "[kit.new_name] voidsuit" - desc = kit.new_suit_desc - icon_state = kit.suit_icon - item_state = kit.suit_icon - - user << "You set about modifying the suit into [src]." - playsound(user.loc, 'sound/items/Screwdriver.ogg', 50, 1) - - kit.uses-- - if(kit.uses<1) - user.drop_item() - qdel(O) - -///////// Salvage crew hardsuit - Cybele Petit - solaruin /////////////// -/obj/item/device/kit/suit/fluff/salvage - name = "salvage hardsuit modification kit" - desc = "A kit containing all the needed tools and parts to modify a hardsuit into a salvage hardsuit." - - new_name = "salvage" - new_suit_desc = "An orange hardsuit used by salvage flotillas. Has reinforced plating." - new_helmet_desc = "An orange hardsuit helmet used by salvage flotillas. Has reinforced plating." - helmet_icon = "salvage_helmet" - suit_icon = "salvage_suit" - helmet_color = "salvage" - -///////// Weathered hardsuit - Callum Leamas - roaper /////////////// -/obj/item/device/kit/suit/fluff/roaper - name = "Callum's hardsuit modification kit" - desc = "A kit containing all the needed tools and parts to modify a hardsuit." - - new_name = "weathered" - new_suit_desc = " A jury-rigged and modified engineering hardsuit. It looks slightly damaged and dinged." - new_helmet_desc = "A jury-rigged and modified engineering hardsuit helmet. It looks slightly damaged and dinged" - helmet_icon = "rig0-roaper" - suit_icon = "rig-roaper" - helmet_color = "roaper" - -///////// Hazard Hardsuit - Ronan Harper - Raptor1628 ////////////////// -/obj/item/device/kit/suit/fluff/ronan_harper - name = "hazard hardsuit modification kit" - desc = "A kit containing all the needed tools and parts to modify a hardsuit." - - new_name = "hazard" - new_suit_desc = "An older model of armored NT Hardsuit emblazoned in security colors. The crest of the NAS Rhodes, a copper rose, is painted onto the chestplate." - new_helmet_desc = "An older NT Hardsuit Helmet with built-in atmospheric filters. The name HARPER has been printed on the back." - helmet_icon = "rig0-hazardhardsuit" - suit_icon = "rig-hazardhardsuit" - helmet_color = "hazardhardsuit" - new_light_overlay = "helmet_light_dual" - -//////// Meat Hook - Korom Bhararaya - Matthew951 //////////////////////// - -/obj/item/device/kit/weapon/fluff/hook - name = "hook modification kit" - desc = "A kit containing all the needed tools and parts to modify a knife or a butcher's knife into a hook." - icon = 'icons/obj/custom_items.dmi' - icon_state = "hook_kit" - -/obj/item/weapon/kitchenknife/attackby(var/obj/item/O as obj, mob/user as mob) - ..() - - if(istype(O,/obj/item/device/kit/weapon/fluff/hook)) - name = "meat hook" - desc = "A sharp, metal hook what sticks into things." - icon = 'icons/obj/custom_items.dmi' - icon_state = "hook_knife" - item_state = "hook_knife" - -/obj/item/weapon/butch/attackby(var/obj/item/O as obj, mob/user as mob) - ..() - - if(istype(O,/obj/item/device/kit/weapon/fluff/hook)) - name = "meat hook" - desc = "A sharp, metal hook what sticks into things." - icon = 'icons/obj/custom_items.dmi' - icon_state = "hook_knife" - item_state = "hook_knife" - -////////////////////////////////// -//////////// Clothing //////////// -////////////////////////////////// - -//////////// Gloves //////////// - -/obj/item/clothing/gloves/fluff/murad_hassim_1 - name = "Tajaran Surgical Gloves" - desc = "Reinforced sterile gloves custom tailored to comfortably accommodate Tajaran claws." - icon_state = "latex" - item_state = "lgloves" - siemens_coefficient = 1.00 - permeability_coefficient = 0.01 - species_restricted = list("exclude","Unathi") - -/obj/item/clothing/gloves/fluff/walter_brooks_1 //botanistpower: Walter Brooks - name = "mittens" - desc = "A pair of well worn, blue mittens." - icon = 'icons/obj/custom_items.dmi' - icon_state = "walter_brooks_1" - item_state = "bluegloves" - -/obj/item/clothing/gloves/fluff/chal_appara_1 //furlucis: Chal Appara - name = "Left Black Glove" - desc = "The left one of a pair of black gloves. Wonder where the other one went..." - icon = 'icons/obj/custom_items.dmi' - icon_state = "chal_appara_1" - -//////////// Earpieces //////////////// - -////////////////////////// Skrellian Tailwear - Qokkri Xilo - Paradoxon ///////////// - -/obj/item/clothing/ears/fluff/qokkri - name = "Skrellian Tailwear" - desc = "An ensemble of sophisticated jewels and bands, most likely belonging to a scientific Skrell." - icon_state = "xilobeads" - icon = 'icons/obj/custom_items.dmi' - item_state = "xilobeads" - -//////////// Eye Wear //////////// - -/obj/item/clothing/glasses/meson/fluff/book_berner_1 //asanadas: Book Berner - name = "bespectacled mesonic surveyors" - desc = "One of the older meson scanner models retrofitted to perform like its modern counterparts." - icon = 'icons/obj/custom_items.dmi' - icon_state = "book_berner_1" - -/obj/item/clothing/glasses/fluff/uzenwa_sissra_1 //sparklysheep: Uzenwa Sissra - name = "Scanning Goggles" - desc = "A very oddly shaped pair of goggles with bits of wire poking out the sides. A soft humming sound emanates from it." - icon = 'icons/obj/custom_items.dmi' - icon_state = "uzenwa_sissra_1" - -////// Medical eyepatch - Thysse Ezinwa - Jadepython -/obj/item/clothing/glasses/eyepatch/fluff/thysse_1 - name = "medical eyepatch" - desc = "On the strap, EZINWA is written in white block letters." - -////// Safety Goggles - Arjun Chopra - MindPhyre - APPROVED -/obj/item/clothing/glasses/fluff/arjun_chopra_1 - name = "safety goggles" - desc = "A used pair of leather safety goggles." - icon = 'icons/obj/custom_items.dmi' - icon_state = "arjun_chopra" - item_state = "arjun_chopra" - -/////////////////////////////////// GSTQ - Monogrammed Eyepatch - Edmund Flashman Adler ///////////////////////// - -/obj/item/clothing/glasses/eyepatch/fluff/edmund - name = "Monogrammed Eyepatch" - desc = "A black velvet eyepatch monogrammed in dark purple thread with the initials 'E. A.'" - -//////////// Hats //////////// - -/obj/item/clothing/head/secsoft/fluff/swatcap //deusdactyl: James Girard - name = "\improper SWAT hat" - desc = "A black hat. The inside has the words, \"Lieutenant James Girard, LPD SWAT Team Four.\"" - icon = 'icons/obj/custom_items.dmi' - icon_state = "swatcap" - body_parts_covered = 0 - -/obj/item/clothing/head/welding/fluff/alice_mccrea_1 //madmalicemccrea: Alice McCrea - name = "flame decal welding helmet" - desc = "A welding helmet adorned with flame decals, and several cryptic slogans of varying degrees of legibility. \"Fly the Friendly Skies\" is clearly visible, written above the visor, for some reason." - icon = 'icons/obj/custom_items.dmi' - icon_state = "alice_mccrea_1" - -/obj/item/clothing/head/welding/fluff/yuki_matsuda_1 //searif: Yuki Matsuda - name = "white decal welding helmet" - desc = "A white welding helmet with a character written across it." - icon = 'icons/obj/custom_items.dmi' - icon_state = "yuki_matsuda_1" - -/obj/item/clothing/head/welding/fluff/norah_briggs_1 //bountylord13: Norah Briggs - name = "blue flame decal welding helmet" - desc = "A welding helmet with blue flame decals on it." - icon = 'icons/obj/custom_items.dmi' - icon_state = "norah_briggs_1" - -//////////////// Painted Welding Mask - Kuratas Dotaavi - supercotton //////////////////// - -/obj/item/clothing/head/welding/fluff/kuratas - name = "Painted Welding Mask" - desc = "A blood-red welding mask with an intricate pattern. Smells like burnt rubber." - icon = 'icons/obj/custom_items.dmi' - icon_state = "paintedwelding" - -/obj/item/clothing/head/orangebandana/fluff/taryn_kifer_1 //themij: Taryn Kifer - name = "orange bandana" - desc = "Hey, I think we're missing a hazard vest..." - -/obj/item/clothing/head/fluff - body_parts_covered = 0 - -/obj/item/clothing/head/fluff/edvin_telephosphor_1 //foolamancer: Edvin Telephosphor - name = "Edvin's Hat" - desc = "A hat specially tailored for Skrellian anatomy. It has a yellow badge on the front, with a large red 'T' inscribed on it." - icon = 'icons/obj/custom_items.dmi' - icon_state = "edvin_telephosphor_1" - -/obj/item/clothing/head/fluff/krinnhat //Shirotyrant: Krinn Seeskale - name = "saucepan hat" - desc = "This hat is the shiniest shiny Krinn has ever owned." - icon = 'icons/obj/custom_items.dmi' - icon_state = "krinn_hat" - -/obj/item/clothing/head/fluff/bruce_hachert //Stup1dg33kz: Bruce Hachert - name = "worn hat" - desc = "A worn-looking hat. It is slightly faded in color." - icon = 'icons/obj/custom_items.dmi' - icon_state = "brucehachert" - -/obj/item/clothing/head/fluff/kaine_kalim_1 - name = "Formal Medical Cap" - desc = "An unusually sterile and folded cap. It seems to bare the Nanotrasen logo." - icon = 'icons/obj/custom_items.dmi' - icon_state = "kainecap" - - -/obj/item/clothing/head/beret/fluff/marine_beret //Von2531: Jack Washington - name = "colonial marine beret" - desc = "A well-worn navy blue beret. The insignia of the Martian Colonial Marine Corps is affixed to the front." - icon_state = "officerberet" - -////////////////////////////// Serithi - Adapted Security Helmet ////////////////////////////// - -/obj/item/clothing/head/helmet/fluff/adapted - name = "Adapted helmet" - desc = "Standard Security gear. Protects the head from impacts. This helmet is specially made for horned Unathi." - item_state = "adapted_h" - icon_state = "adapted_h" - icon = 'icons/obj/custom_items.dmi' - -////////////////////////////// Jarcolr - Uberto Dandolo - Feathered trilby ///////////////////// - -/obj/item/clothing/head/feather/fluff/uberto_dandolo - name = "Feathered trilby" - desc = "A sharp, stylish hat with a feather." - -////////////////////////////////////////////////////////// -///////////////////// Belts ////////////////////////////// -////////////////////////////////////////////////////////// - -/obj/item/weapon/storage/belt/medical/fluff/ems - name = "EMS utility belt" - desc = "A sturdy black webbing belt with attached pouches. H. ISHIMARU is scratched on the interior of the buckle." - icon = 'icons/obj/custom_items.dmi' - icon_state = "emsbelt" - item_state = "emsbelt" - -/obj/item/weapon/storage/belt/utility/full/fluff/sophie - name = "Sophie's belt" - desc = "A tool-belt in Atmos colours." - icon = 'icons/obj/custom_items.dmi' - icon_state = "sophie_belt" - item_state = "sophie_belt" - -/obj/item/weapon/storage/belt/medical/fluff/nashi_belt - name = "rainbow medical belt" - desc = "A somewhat-worn, modified, rainbow belt." - icon = 'icons/obj/custom_items.dmi' - icon_state = "nashi_belt" - item_state = "fluff_rbelt" - - New() - ..() - new /obj/item/weapon/reagent_containers/glass/bottle/fluff/nashi_bottle(src, 14, "Bicaridine") - new /obj/item/weapon/reagent_containers/glass/bottle/fluff/nashi_bottle(src, 15, "Dermaline") - new /obj/item/weapon/reagent_containers/glass/bottle/fluff/nashi_bottle(src, 16, "Dylovene") - new /obj/item/weapon/reagent_containers/glass/bottle/fluff/nashi_bottle(src, 17, "Dexalin Plus") - new /obj/item/weapon/reagent_containers/glass/bottle/fluff/nashi_bottle(src, 18, "Tricordrazine") - new /obj/item/weapon/reagent_containers/syringe/(src) - new /obj/item/device/healthanalyzer(src) - -/obj/item/weapon/reagent_containers/glass/bottle/fluff/nashi_bottle - icon = 'icons/obj/chemical.dmi' - New(loc, var/color, var/labeled) - ..() - name = "[labeled] bottle" - desc = "A small bottle. Contains [labeled]" - icon_state = "bottle[color]" - -//////////// Suits //////////// -/obj/item/clothing/suit/storage/labcoat - name = "labcoat" - desc = "A plain labcoat." - icon_state = "labcoat" - body_parts_covered = UPPER_TORSO|LOWER_TORSO|ARMS|LEGS - -/obj/item/clothing/suit/storage/labcoat/fluff/aeneas_rinil //Robotics Labcoat - Aeneas Rinil [APPR] - name = "Robotics labcoat" - desc = "A labcoat with a few markings denoting it as the labcoat of roboticist." - icon = 'icons/obj/custom_items.dmi' - icon_state = "aeneasrinil" - -/obj/item/clothing/suit/storage/labcoat/fluff/pink //spaceman96: Trenna Seber - name = "pink labcoat" - desc = "A suit that protects against minor chemical spills. Has a pink stripe down from the shoulders." - icon = 'icons/obj/custom_items.dmi' - icon_state = "labcoat_pink_open" - -/obj/item/clothing/suit/storage/labcoat/fluff/mit - name = "MiT Labcoat" - desc = "A lab coat from the Martian Institute of Technology with the name 'Dr. Lucina Franco' embroidered onto the right breast pocket." - icon = 'icons/obj/custom_items.dmi' - icon_state = "mitlabcoat" - item_state = "mitlabcoat" - -/obj/item/clothing/suit/storage/toggle/labcoat/fluff/epsilon //Devildabeast: Looping Song - name = "e UMi labcoat" - desc = "A suit that protects against minor chemical spills. Has a black stripe on the shoulder. The abbreviation \"e UMi\" is written on the back in bold text." - icon = 'icons/obj/custom_items.dmi' - icon_state = "labcoat_black_open" - icon_open = "labcoat_black_open" - icon_closed = "labcoat_black" - item_state = "labcoat_black" - -/obj/item/clothing/suit/storage/det_suit/fluff/leatherjack //atomicdog92: Seth Sealis - name = "leather jacket" - desc = "A black leather coat, popular amongst punks, greasers, and other galactic scum." - icon = 'icons/obj/custom_items.dmi' - icon_state = "leatherjack" - item_state = "leatherjack" - -/obj/item/clothing/suit/armor/vest/fluff/deus_blueshield //deusdactyl - name = "blue shield security armor" - desc = "An armored vest with the badge of a Blue Shield Security lieutenant." - icon = 'icons/obj/custom_items.dmi' - icon_state = "deus_blueshield" - item_state = "deus_blueshield" - -/obj/item/clothing/suit/fluff/oldscarf //Writerer2: Javaria Zara - name = "old scarf" - desc = "An old looking scarf, it seems to be fairly worn." - icon = 'icons/obj/clothing/suits.dmi' - icon_state = "mantle-unathi" - item_state = "mantle-unathi" - body_parts_covered = 0 - -/////////////////////////////// 50_n00b - R.A.N.G.E.'s blue dress ////////////////////////// - -/obj/item/clothing/suit/fluff/b_dress - name = "Blue dress" - desc = "A blue dress, worn with a white blouse. It is small, and looks like it won't fit a full grown human." - icon = 'icons/obj/custom_items.dmi' - icon_state = "br_dress" - item_state = "br_dress" - body_parts_covered = UPPER_TORSO|LOWER_TORSO|LEGS - -//////////////////////////////// Broseph Stylin - Lombardi's Jacket /////////////////////////// - -/obj/item/clothing/suit/storage/fluff/lombardi - name = "Lombardi's Jacket" - desc = "A dark blue, martian-pattern, EMS jacket. It sports high-visibility reflective stripes, a star of life on the back, and has a nametag on the right side of the chest that reads 'Lombardi B-'." - icon = 'icons/obj/custom_items.dmi' - icon_state = "lombardi_jacket" - item_state = "lombardi_jacket" - body_parts_covered = UPPER_TORSO|ARMS - - verb/toggle() - set name = "Toggle Jacket Buttons" - set category = "Object" - set src in usr - - if(!usr.canmove || usr.stat || usr.restrained()) - return 0 - - switch(icon_state) - if("lombardi_jacket") - src.icon_state = "lombardi_jacket_open" - usr << "You unbutton the jacket." - if("lombardi_jacket_open") - src.icon_state = "lombardi_jacket" - usr << "You button up the jacket." - update_clothing_icon() - -//////////// Uniforms //////////// - -/obj/item/clothing/under/fluff/milo_hachert //Field Dress Uniform - Milo Hachert - Commissar_Drew - name = "field dress uniform" - desc = "A uniform jacket, its buttons polished to a shine, coupled with a dark pair of trousers. 'Hachert' is embroidered upon the jacket�s shoulder bar." - icon = 'icons/obj/custom_items.dmi' - icon_state = "milohachert" - item_state = "gy_suit" - worn_state = "milohachert" - -/obj/item/clothing/under/fluff/john_saaland //GA Jumpsuit-John Saaland-Foxeye - name = "GA jumpsuit" - desc = "A tan jumpsuit, robustly constructed, with various velcro strips for name and ranking patches distributed over the torso and shoulders. Only one of these strips is in use, holding a patch with 'J. SAALAND' written on it in block lettering over the right breast pocket." - icon = 'icons/obj/custom_items.dmi' - icon_state = "saaland" - item_state = "saaland_suit" - worn_state = "saaland" - -/obj/item/clothing/under/fluff/kaine_kalim_2 - name = "Formal Medical Uniform" - desc = "An unusually sterile and pressed uniform. It seems to have a string of vials crossing the chest." - icon = 'icons/obj/custom_items.dmi' - icon_state = "kaineuniform" - item_state = "w_suit" - worn_state = "kaineuniform" - -/obj/item/clothing/under/fluff/jumpsuitdown //searif: Yuki Matsuda - name = "rolled down jumpsuit" - desc = "A rolled down jumpsuit. Great for mechanics." - icon = 'icons/obj/custom_items.dmi' - icon_state = "jumpsuitdown" - item_state = "gy_suit" - worn_state = "jumpsuitdown" - -/obj/item/clothing/under/fluff/lilith_vinous_1 //slyhidden: Lilith Vinous - name = "casual security uniform" - desc = "A less formal version of the traditional dark red Security uniform. It has the top button undone, rolled up sleeves and different belt." - icon = 'icons/obj/custom_items.dmi' - icon_state = "lilith_uniform" - item_state = "r_suit" - worn_state = "lilith_uniform" - body_parts_covered = UPPER_TORSO|LOWER_TORSO|LEGS - -/obj/item/clothing/under/fluff/ana_issek_1 //suethecake: Ana Issek - name = "retired uniform" - desc = "A silken blouse paired with dark-colored slacks. It has the words 'Chief Investigator' embroidered into the shoulder bar." - icon = 'icons/obj/custom_items.dmi' - icon_state = "ana_uniform" - item_state = "r_suit" - worn_state = "ana_uniform" - body_parts_covered = UPPER_TORSO|LOWER_TORSO|LEGS - -/obj/item/clothing/under/fluff/olddressuniform //desiderium: Momiji Inubashiri - name = "retired dress uniform" - desc = "A retired Station Head of Staff uniform, phased out twenty years ago for the newer jumpsuit design, but still acceptable dress. Lovingly maintained." - icon = 'icons/obj/custom_items.dmi' - icon_state = "olddressuniform" - item_state = "b_suit" - worn_state = "olddressuniform" - -/obj/item/clothing/under/rank/security/fluff/jeremy_wolf_1 //whitewolf41: Jeremy Wolf - name = "worn officer's uniform" - desc = "An old red security jumpsuit. Seems to have some slight modifications." - icon = 'icons/obj/custom_items.dmi' - icon_state = "jeremy_wolf_1" - item_state = "r_suit" - worn_state = "jeremy_wolf_1" - -//////////////////// PRC Uniform - Ronan Harper - Raptor1628 /////////////////// - -/obj/item/clothing/under/rank/security/fluff/ronan_harper - name = "PRC Uniform" - desc = "A well maintained uniform from one of the many Private Security firms Nanotrasen hires from. The name Harper is printed on the back." - icon = 'icons/obj/custom_items.dmi' - icon_state = "harper_uniform" - item_state = "jensensuit" - worn_state = "harper_uniform" - body_parts_covered = UPPER_TORSO|LOWER_TORSO|LEGS - -//////////////////// Corporate Cap - Robert Mason - Masterrbc //////////////////// - -/obj/item/clothing/head/soft/sec/corp/fluff/robert_mason - name = "Corporate Cap" - desc = "It's baseball hat in corporate colors." - -/obj/item/clothing/under/fluff/tian_dress //phaux: Tian Yinhu - name = "purple dress" - desc = "A nicely tailored purple dress made for the taller woman." - icon = 'icons/obj/custom_items.dmi' - icon_state = "tian_dress" - item_state = "r_suit" - worn_state = "tian_dress" - body_parts_covered = UPPER_TORSO|LOWER_TORSO - -/obj/item/clothing/under/rank/bartender/fluff/classy //searif: Ara Al-Jazari - name = "classy bartender uniform" - desc = "A prim and proper uniform that looks very similar to a bartender's, the only differences being a red tie, waistcoat and a rag hanging out of the back pocket." - icon = 'icons/obj/custom_items.dmi' - icon_state = "ara_bar_uniform" - item_state = "ba_suit" - worn_state = "ara_bar_uniform" - -/obj/item/clothing/under/fluff/callum_suit //roaper: Callum Leamus - name = "knockoff suit" - desc = "A knockoff of a suit commonly worn by the upper class." - icon = 'icons/obj/custom_items.dmi' - icon_state = "callum_suit" - item_state = "ba_suit" - worn_state = "callum_suit" - -/obj/item/clothing/under/fluff/solara_light_1 //bluefishie: Solara Born-In-Light - name = "Elaborate Purple Dress" - desc = "An expertly tailored dress, made out of fine fabrics. The interwoven necklace appears to be made out of gold, with three complicated symbols engraved in the front." - icon = 'icons/obj/custom_items.dmi' - icon_state = "solara_dress" - item_state = "p_suit" - worn_state = "solara_dress" - -/obj/item/clothing/under/rank/nursesuit/fluff/sasha - name = "RN Uniform" - desc = "A nurse's uniform that is dark blue and gold. It looks like it's been tailored for a short person." - icon = 'icons/obj/custom_items.dmi' - icon_state = "sasha" - item_state = "b_suit" - worn_state = "sasha" - -/////// NT-SID Suit //Zuhayr: Jane Doe - -/obj/item/clothing/under/fluff/jane_sidsuit - name = "NT-SID jumpsuit" - desc = "A NanoTrasen Synthetic Intelligence Division jumpsuit, issued to 'volunteers'. On other people it looks fine, but right here a scientist has noted: on you it looks stupid." - - icon = 'icons/obj/custom_items.dmi' - icon_state = "jane_sid_suit" - item_state = "o_suit" - worn_state = "jane_sid_suit" - has_sensor = 2 - sensor_mode = 3 - -//Suit roll-down toggle. -/obj/item/clothing/under/fluff/jane_sidsuit/verb/toggle_zipper() - set name = "Toggle Jumpsuit Zipper" - set category = "Object" - set src in usr - - if(!usr.canmove || usr.stat || usr.restrained()) - return 0 - - if(src.icon_state == "jane_sid_suit_down") - src.icon_state = "jane_sid_suit" - usr << "You zip up the [src]." - else - src.icon_state = "jane_sid_suit_down" - usr << "You unzip and roll down the [src]." - - src.item_state_slots[slot_w_uniform_str] = "[src.icon_state]" - update_clothing_icon() - -////// Wyatt's Ex-Commander Jumpsuit - RawrTaicho -/obj/item/clothing/under/fluff/wyatt_1 - - name = "ex-commander jumpsuit" - desc = "A standard Central Command Engineering Commander jumpsuit tailored to fight the wearer tightly. It has a Medal of Service pinned onto the left side of it." - icon = 'icons/obj/custom_items.dmi' - icon_state = "wyatt_uniform" - //item_state = "wyatt_uniform" - worn_state = "wyatt_uniform" - -////// Black Dress - Lillian Amsel - PapaDrow -/obj/item/clothing/under/fluff/lillian_amsel_1 - name = "Black Dress" - desc = "A knee-length, dark gray and black dress made of a soft, velvety material." - icon = 'icons/obj/custom_items.dmi' - icon_state = "lillian_dress" - //item_state = "lillian_dress" - worn_state = "lillian_dress" - body_parts_covered = UPPER_TORSO|LOWER_TORSO - -////// Tailored Security Uniform - Parker Eliza - MrSnapwalk - -/obj/item/clothing/under/fluff/parkereliza - name = "tailored security uniform" - desc = "A red uniform shirt (tailored for easy access to the shoulder joint) and black cargo pants, paired with a set of somewhat bulky white casings for robotic limbs. The arms have a small label on the inner elbow, which reads \"Bishop Corporation Cybernetic Solutions\"." - icon = 'icons/obj/custom_items.dmi' - icon_state = "parker_eliza" - //item_state = "parker_eliza" - worn_state = "parker_eliza" - body_parts_covered = UPPER_TORSO|LOWER_TORSO|LEGS|ARMS|HANDS - -////// Bishop "GOLEM" V2200 Industrial Limb Augments - Parker Eliza - MrSnapwalk - -/obj/item/clothing/suit/fluff/parkereliza - name = "Bishop \"GOLEM\" V2200 Industrial Limb Augments" - desc = "A set of top-of-the-line cyberlimbs, only usable to someone with extensive bone structure augmentation. Often used in industrial applications, they are capable of throwing a man clear across a room. The load limitation circuit in this set appears to be modified." - icon = 'icons/obj/custom_items.dmi' - icon_state = "parker_eliza_arms" - item_state = "parker_eliza_arms" - body_parts_covered = 0 //technicially it's underneath everything, being part of the body - canremove = 0 - -////////////// Accessories ///// - -//////////////////// Blood Red Pendant - Mewth - Mu'taz Radi //////////////// - -/obj/item/clothing/accessory/fluff/radi - name = "Blood Red Pendant" - desc = "A blue chained necklace with a ruby in the middle, it looks pretty!" - icon = 'icons/obj/custom_items.dmi' - icon_state = "radi_pendant" - item_state = "radi_pendant" - w_class = 2.0 - -//////////// Masks //////////// - -/* -/obj/item/clothing/mask/fluff/flagmask //searif: Tsiokeriio Tarbell - name = "\improper First Nations facemask" - desc = "A simple cloth rag that bears the flag of the first nations." - icon = 'icons/obj/custom_items.dmi' - icon_state = "flagmask" - item_state = "flagmask" - flags = MASKCOVERSMOUTH - w_class = 2 - gas_transfer_coefficient = 0.90 -*/ - -/obj/item/clothing/mask/mara_kilpatrick_1 //staghorn: Mara Kilpatrick - name = "shamrock pendant" - desc = "A silver and emerald shamrock pendant. It has the initials \"M.K.\" engraved on the back." - icon = 'icons/obj/custom_items.dmi' - icon_state = "mara_kilpatrick_1" - w_class = 2 - -/////////////// Oen'g Issek Medical Mask ////////////////////////// - -/obj/item/clothing/mask/surgical/fluff/primitive - name = "primitive mask" - desc = "A decorated and creepy gas mask with the filters removed." - icon = 'icons/obj/custom_items.dmi' - item_state = "head_m" - icon_state = "head_m" - body_parts_covered = FACE|EYES - -//Painted mask: Dante Cicero - andrewmeythaler - -/obj/item/clothing/mask/andrewmeythaler - name = "painted mask" - desc = "A ghoulish mask with a stylized painting of a flame over the left eye, and a painted tear stream coming from the right eye." - icon = 'icons/obj/custom_items.dmi' - //item_state = "cicero" - icon_state = "cicero" - body_parts_covered = FACE|EYES - -////// Small locket - Altair An-Nasaqan - Serithi - -/obj/item/clothing/accessory/fluff/altair_locket - name = "small locket" - desc = "A small golden locket attached to an Ii'rka-reed string. Inside the locket is a holo-picture of a female Tajaran, and an inscription writtin in Siik'mas." - icon = 'icons/obj/custom_items.dmi' - icon_state = "altair_locket" - item_state = "altair_locket" - slot_flags = 0 - w_class = 2 - slot_flags = SLOT_MASK | SLOT_TIE - -////// Silver locket - Konaa Hirano - Konaa_Hirano - -/obj/item/clothing/accessory/fluff/konaa_hirano - name = "silver locket" - desc = "This oval shaped, argentium sterling silver locket hangs on an incredibly fine, refractive string, almost thin as hair and microweaved from links to a deceptive strength, of similar material. The edges are engraved very delicately with an elegant curving design, but overall the main is unmarked and smooth to the touch, leaving room for either remaining as a stolid piece or future alterations. There is an obvious internal place for a picture or lock of some sort, but even behind that is a very thin compartment unhinged with the pinch of a thumb and forefinger." - icon = 'icons/obj/custom_items.dmi' - icon_state = "konaahirano" - item_state = "konaahirano" - slot_flags = 0 - w_class = 2 - slot_flags = SLOT_MASK | SLOT_TIE - var/obj/item/held //Item inside locket. - -/obj/item/clothing/accessory/fluff/konaa_hirano/attack_self(mob/user as mob) - if(held) - user << "You open [src] and [held] falls out." - held.loc = get_turf(user) - src.held = null - -/obj/item/clothing/accessory/fluff/konaa_hirano/attackby(var/obj/item/O as obj, mob/user as mob) - if(istype(O,/obj/item/weapon/paper)) - if(held) - usr << "[src] already has something inside it." - else - usr << "You slip [O] into [src]." - user.drop_item() - O.loc = src - src.held = O - return - ..() - -////// Medallion - Nasir Khayyam - Jamini - -/obj/item/clothing/accessory/fluff/nasir_khayyam_1 - name = "medallion" - desc = "This silvered medallion bears the symbol of the Hadii Clan of the Tajaran." - icon = 'icons/obj/custom_items.dmi' - icon_state = "nasir_khayyam_1" - w_class = 2 - slot_flags = SLOT_MASK | SLOT_TIE - -////// Emerald necklace - Ty Foster - Nega - -/obj/item/clothing/mask/mara_kilpatrick_1 - name = "emerald necklace" - desc = "A brass necklace with a green emerald placed at the end. It has a small inscription on the top of the chain, saying \'Foster\'" - icon = 'icons/obj/custom_items.dmi' - icon_state = "ty_foster" - w_class = 2 - -////// Apollon Pendant - Michael Guess - Dragor23 -/obj/item/clothing/mask/michael_guess_1 - name = "Apollon Pendant" - desc = "A pendant with the form of a sacrificial tripod, used in acient greece. It's a symbol of the Olympian Apollon, a god associated with oracles, poetry, the sun and healing." - icon = 'icons/obj/custom_items.dmi' - icon_state = "michael_guess_1" - w_class = 2 - slot_flags = SLOT_MASK - body_parts_covered = 0 - -//////////// Shoes //////////// - -/obj/item/clothing/shoes/magboots/fluff/susan_harris_1 //sniperyeti: Susan Harris - name = "Susan's Magboots" - desc = "A colorful pair of magboots with the name Susan Harris clearly written on the back." - icon = 'icons/obj/custom_items.dmi' - icon_state = "atmosmagboots0" - -/obj/item/clothing/shoes/jackboots/fluff/hal_ishimaru_1 //YankeeSamurai: Hal Ishimaru - name = "duty boots" - desc = "Eight-inch black leather boots with side zips and NT-approved safety toes." - -////////////////////////////////////////// Vivallion - Kecer Eldraran - Toe-less Jackboots ////////////// - -/obj/item/clothing/shoes/jackboots/fluff/kecer_eldraran - name = "Toe-less Jackboots" - desc = "Modified pair of jackboots, particularly friendly to those species whose toes hold claws." - icon = 'icons/obj/custom_items.dmi' - item_state = "digiboots" - icon_state = "digiboots" - species_restricted = null - -/obj/item/clothing/shoes/jackboots/fluff/harmony_singh_1 //Bromuzl: Harmony Singh - name = "Springjacks" - desc = "A pair of highly modified jackboots in medical white, with some type of spring assembly on the ankle and heels, painted orange." - icon = 'icons/obj/custom_items.dmi' - icon_state = "springjacks" - item_state = "springjacks" - slowdown = SHOES_SLOWDOWN+1 //Slowing down because of her injured foot, these are for ease of pain so she can get off painkillers. - siemens_coefficient = 0.7 //copied from Jackboots under code/modules/clothing/shoes/miscellaneous.dm - -//////////// Sets //////////// - -/* -/obj/item/clothing/suit/storage/labcoat/fluff/cdc_labcoat - name = "\improper CDC labcoat" - desc = "A standard-issue CDC labcoat that protects against minor chemical spills. It has the name \"Wiles\" sewn on to the breast pocket." - icon = 'icons/obj/custom_items.dmi' - icon_state = "labcoat_cdc_open" -*/ -////// Short Sleeve Medical Outfit //erthilo: Farah Lants - -/obj/item/clothing/under/rank/medical/fluff/short - name = "short sleeve medical jumpsuit" - desc = "Made of a special fiber that gives special protection against biohazards. Has a cross on the chest denoting that the wearer is trained medical personnel and short sleeves." - icon = 'icons/obj/custom_items.dmi' - icon_state = "medical_short" - item_state = "medical_short" - worn_state = "medical_short" - body_parts_covered = UPPER_TORSO|LOWER_TORSO|LEGS - -/obj/item/clothing/suit/storage/labcoat/fluff/red - name = "red labcoat" - desc = "A suit that protects against minor chemical spills. Has a red stripe on the shoulders and rolled up sleeves." - icon = 'icons/obj/custom_items.dmi' - icon_state = "labcoat_red_open" - -////// Retired Patrol Outfit //desiderium: Rook Maudlin - -/obj/item/clothing/suit/storage/det_suit/fluff/retpolcoat - name = "retired colony patrolman's coat" - desc = "A clean, black nylon windbreaker with the words \"OUTER LIGHT POLICE\" embroidered in gold-dyed thread on the back. \"RETIRED\" is tastefully embroidered below in a smaller font." - icon = 'icons/obj/custom_items.dmi' - icon_state = "retpolcoat" - item_state = "retpolcoat" - -/obj/item/clothing/head/det_hat/fluff/retpolcap - name = "retired colony patrolman's cap" - desc = "A clean and properly creased colony police cap. The badge is shined and polished, the word \"RETIRED\" engraved professionally under the words \"OUTER LIGHT POLICE.\"" - icon = 'icons/obj/custom_items.dmi' - icon_state = "retpolcap" - -/obj/item/clothing/under/det/fluff/retpoluniform - name = "retired colony patrolman's uniform" - desc = "A meticulously clean police uniform belonging to Precinct 31, Outer Light Colony. The word \"RETIRED\" is engraved tastefully and professionally in the badge below the number, 501." - icon = 'icons/obj/custom_items.dmi' - icon_state = "retpoluniform" - worn_state = "retpoluniform" - -//////////// Weapons //////////// - -///// Well-used baton - Oen'g Issek - Donofnyc3 - -/obj/item/weapon/melee/baton/fluff/oeng_baton - name = "well-used stun baton" - desc = "A stun baton used for incapacitating targets; there seems to be a bunch of tally marks set into the handle." - -///// Deckard .44 - Callum Leamas - Roaper -/obj/item/weapon/gun/projectile/revolver/detective/fluff/callum_leamas - name = "Deckard .44" - desc = "A custom built revolver, based off the semi-popular Detective Special model." - icon = 'icons/obj/custom_items.dmi' - icon_state = "leamas-empty" - ammo_type = /obj/item/ammo_magazine/c38/rubber - -/obj/item/weapon/gun/projectile/revolver/detective/fluff/callum_leamas/update_icon() - ..() - if(loaded.len) - icon_state = "leamas-loaded" - else - icon_state = "leamas-empty" - -/obj/item/weapon/gun/projectile/revolver/detective/fluff/callum_leamas/load_ammo(var/obj/item/A, mob/user) - if(istype(A, /obj/item/ammo_magazine)) - flick("leamas-reloading",src) - ..() - -/obj/item/weapon/reagent_containers/food/drinks/flask/fluff/yuri_kornienkovich_flask - name = "Yuri's Flask" - desc = "An old gold plated flask. Nothing noteworthy about it besides it being gold and the red star on the worn out leather around it. There is also an engraving on the cap that is rather hard to see but it looks like \"Kornienkovich\" " - icon = 'icons/obj/custom_items.dmi' - icon_state = "yuri_kornienkovich_flask" - -/obj/item/clothing/under/cheongsam/fluff/mai_yang_dress // Mai Yang's pretty pretty dress. - name = "White Cheongsam" - desc = "It is a white cheongsam dress." - -/obj/item/clothing/under/fluff/sakura_hokkaido_kimono - name = "Sakura Kimono" - desc = "A pale-pink, nearly white, kimono with a red and gold obi. There is a embroidered design of cherry blossom flowers covering the kimono." - icon = 'icons/obj/custom_items.dmi' - icon_state = "sakura_hokkaido_kimono" - item_state = "sakura_hokkaido_kimono" - worn_state = "sakura_hokkaido_kimono" - -///////////////////////////// Astronovus - Harold's Cane //////////////////////////// - -/obj/item/weapon/cane/fluff/harold - name = "Harold's Cane" - desc = "A cane with a wooden handle and a plastic frame capable of folding itself to make it more storable." - w_class = 1.0 - icon = 'icons/obj/custom_items.dmi' - item_state = "foldcane" - icon_state = "foldcane" - - -//////////////////////////// Footman - Farwa Plush Doll ////////////////////////////////// - -/obj/item/weapon/fluff/farwadoll - name = "Farwa plush doll" - desc = "A Farwa plush doll. It's soft and comforting!" - w_class = 1.0 - icon = 'icons/obj/custom_items.dmi' - item_state = "farwaplush" - icon_state = "farwaplush" - -/obj/item/weapon/fluff/farwadoll/attack_self(mob/user as mob) - user.visible_message("[user] hugs [src]! How cute! ", \ - "You hug [src]. Dawwww... ") - -////////////////////////////// Meyar - Cane ///////////////////////////////////////////////// - -/obj/item/weapon/cane/fluff/ryals - name = "cane" - desc = "This cane seems to have 'Ryals' engraved on its handle." - icon_state = "cane" - item_state = "stick" - -////////////////////////////// Foxler - Erstatz Vryroxes ///////////////////////////////////////////////// - -//Use this subtype for spawning in the custom item. -/obj/item/weapon/holder/cat/fluff/bones/custom_item - -/obj/item/weapon/holder/cat/fluff/bones/custom_item/New() - if (!contents.len) - new/mob/living/simple_animal/cat/fluff/bones (src) - ..() - -/obj/item/weapon/holder/cat/fluff/bones - name = "Bones" - desc = "It's Bones! Meow." - gender = MALE - icon_state = "cat3" - -/mob/living/simple_animal/cat/fluff/bones - name = "Bones" - desc = "That's Bones the cat. He's a laid back, black cat. Meow." - gender = MALE - icon_state = "cat3" - icon_living = "cat3" - icon_dead = "cat3_dead" - holder_type = /obj/item/weapon/holder/cat/fluff/bones - var/friend_name = "Erstatz Vryroxes" - -/mob/living/simple_animal/cat/fluff/bones/handle_movement_target() - if (!friend) - for (var/mob/living/carbon/human/M in player_list) - if (M.real_name == friend_name) - friend = M - break - ..() - -///////////////////////////// Sabess - Maria's Heart-Shaped Locket /////////////////////////////////// - -/obj/item/weapon/fluff/mariafontaine - name = "Heart-Shaped Locket" - desc = " A silver, heart-shaped locket. It flips open to reveal two pictures, one of a young red-headed woman and one of a brunette of similar age. Small writing is etched onto the back, reading 'M+L'. Some may regard it as cheesy." - icon = 'icons/obj/custom_items.dmi' - icon_state = "mariaclosed" - item_state = "mariaclosed" - -obj/item/weapon/fluff/mariafontaine/attack_self(mob/user as mob) - if(src.icon_state == "mariaclosed") - src.icon_state = "mariaopen" - src.item_state = "mariaopen" - user << "You flip the locket open." - - else - src.icon_state = "mariaclosed" - src.item_state = "mariaclosed" - user << "You flip the locket closed." diff --git a/code/modules/customitems/item_spawning.dm b/code/modules/customitems/item_spawning.dm index beb8e6b2a7..7904b60b5c 100644 --- a/code/modules/customitems/item_spawning.dm +++ b/code/modules/customitems/item_spawning.dm @@ -1,95 +1,190 @@ -//switch this out to use a database at some point -//list of ckey/ real_name and item paths -//gives item to specific people when they join if it can -//for multiple items just add mutliple entries, unless i change it to be a listlistlist -//yes, it has to be an item, you can't pick up nonitems +// Switch this out to use a database at some point. Each ckey is +// associated with a list of custom item datums. When the character +// spawns, the list is checked and all appropriate datums are spawned. +// See config/example/custom_items.txt for a more detailed overview +// of how the config system works. + +// CUSTOM ITEM ICONS: +// Inventory icons must be in CUSTOM_ITEM_OBJ with state name [item_icon]. +// On-mob icons must be in CUSTOM_ITEM_MOB with state name [item_icon]. +// Inhands must be in CUSTOM_ITEM_MOB as [icon_state]_l and [icon_state]_r. + +// Kits must have mech icons in CUSTOM_ITEM_OBJ under [kit_icon]. +// Broken must be [kit_icon]-broken and open must be [kit_icon]-open. + +// Kits must also have hardsuit icons in CUSTOM_ITEM_MOB as [kit_icon]_suit +// and [kit_icon]_helmet, and in CUSTOM_ITEM_OBJ as [kit_icon]. /var/list/custom_items = list() -/hook/startup/proc/loadCustomItems() - var/custom_items_file = file2text("config/custom_items.txt") - custom_items = text2list(custom_items_file, "\n") +/datum/custom_item + var/assoc_key + var/character_name + var/item_icon + var/item_desc + var/name + var/item_path = /obj/item + var/req_access = 0 + var/list/req_titles = list() + var/kit_name + var/kit_desc + var/kit_icon + var/additional_data + +/datum/custom_item/proc/spawn_item(var/newloc) + var/obj/item/citem = new item_path(newloc) + apply_to_item(citem) + return citem + +/datum/custom_item/proc/apply_to_item(var/obj/item/item) + if(!item) + return + if(name) + item.name = name + if(item_desc) + item.desc = item_desc + if(item_icon) + item.icon = CUSTOM_ITEM_OBJ + item.icon_state = item_icon + if(istype(item, /obj/item)) + item.icon_override = CUSTOM_ITEM_MOB + + // Kits are dumb so this is going to have to be hardcoded/snowflake. + if(istype(item, /obj/item/device/kit)) + var/obj/item/device/kit/K = item + K.new_name = kit_name + K.new_desc = kit_desc + K.new_icon = kit_icon + K.new_icon_file = CUSTOM_ITEM_OBJ + if(istype(item, /obj/item/device/kit/paint)) + var/obj/item/device/kit/paint/kit = item + kit.allowed_types = text2list(additional_data, ", ") + else if(istype(item, /obj/item/device/kit/suit)) + var/obj/item/device/kit/suit/kit = item + kit.new_light_overlay = additional_data + kit.new_mob_icon_file = CUSTOM_ITEM_MOB + + return item + + +// Parses the config file into the custom_items list. +/hook/startup/proc/load_custom_items() + + var/datum/custom_item/current_data + for(var/line in text2list(file2text("config/custom_items.txt"), "\n")) + + line = trim(line) + if(line == "" || !line || findtext(line, "#", 1, 2)) + continue + + if(findtext(line, "{", 1, 2) || findtext(line, "}", 1, 2)) // New block! + if(current_data && current_data.assoc_key) + if(!custom_items[current_data.assoc_key]) + custom_items[current_data.assoc_key] = list() + var/list/L = custom_items[current_data.assoc_key] + L |= current_data + current_data = null + + var/split = findtext(line,":") + if(!split) + continue + var/field = trim(copytext(line,1,split)) + var/field_data = trim(copytext(line,(split+1))) + if(!field || !field_data) + continue + + if(!current_data) + current_data = new() + + switch(field) + if("ckey") + current_data.assoc_key = lowertext(field_data) + if("character_name") + current_data.character_name = lowertext(field_data) + if("item_path") + current_data.item_path = text2path(field_data) + if("item_name") + current_data.name = field_data + if("item_icon") + if(field_data in icon_states(CUSTOM_ITEM_OBJ)) + current_data.item_icon = field_data + if("item_desc") + current_data.item_desc = field_data + if("req_access") + current_data.req_access = text2num(field_data) + if("req_titles") + current_data.req_titles = text2list(field_data,", ") + if("kit_name") + current_data.kit_name = field_data + if("kit_desc") + current_data.kit_desc = field_data + if("kit_icon") + current_data.kit_icon = field_data + if("additional_data") + current_data.additional_data = field_data return 1 -/proc/EquipCustomItems(mob/living/carbon/human/M) - for(var/line in custom_items) - // split & clean up - var/list/Entry = text2list(line, ":") - for(var/i = 1 to Entry.len) - Entry[i] = trim(Entry[i]) +//gets the relevant list for the key from the listlist if it exists, check to make sure they are meant to have it and then calls the giving function +/proc/equip_custom_items(mob/living/carbon/human/M) + var/list/key_list = custom_items[M.ckey] + if(!key_list || key_list.len < 1) + return - if(Entry.len < 3) - continue; + for(var/datum/custom_item/citem in key_list) - if(Entry[1] == M.ckey && Entry[2] == M.real_name) - var/list/Paths = text2list(Entry[3], ",") - for(var/P in Paths) - var/ok = 0 // 1 if the item was placed successfully - P = trim(P) - var/path = text2path(P) - if(!path) continue + // Check for requisite ckey and character name. + if((lowertext(citem.assoc_key) != lowertext(M.ckey)) || (lowertext(citem.character_name) != lowertext(M.real_name))) + continue - var/obj/item/Item = new path() - if(istype(Item,/obj/item/weapon/card/id)) - //id card needs to replace the original ID - if(M.ckey == "nerezza" && M.real_name == "Asher Spock" && M.mind.role_alt_title && M.mind.role_alt_title != "Emergency Physician") - //only spawn ID if asher is joining as an emergency physician - ok = 1 - qdel(Item) - goto skip - var/obj/item/weapon/card/id/I = Item - for(var/obj/item/weapon/card/id/C in M) - //default settings - I.name = "[M.real_name]'s ID Card ([M.mind.role_alt_title ? M.mind.role_alt_title : M.mind.assigned_role])" - I.registered_name = M.real_name - I.access = C.access - I.assignment = C.assignment - I.blood_type = C.blood_type - I.dna_hash = C.dna_hash - I.fingerprint_hash = C.fingerprint_hash - //I.pin = C.pin + // Check for required access. + var/obj/item/weapon/card/id/current_id = M.wear_id + if(citem.req_access && citem.req_access > 0) + if(!(istype(current_id) && (citem.req_access in current_id.access))) + continue - //custom stuff - if(M.ckey == "fastler" && M.real_name == "Fastler Greay") //This is a Lifetime ID - I.name = "[M.real_name]'s Lifetime ID Card ([M.mind.role_alt_title ? M.mind.role_alt_title : M.mind.assigned_role])" - else if(M.ckey == "nerezza" && M.real_name == "Asher Spock") //This is an Odysseus Specialist ID - I.name = "[M.real_name]'s Odysseus Specialist ID Card ([M.mind.role_alt_title ? M.mind.role_alt_title : M.mind.assigned_role])" - I.access += list(access_robotics) //Station-based mecha pilots need this to access the recharge bay. - else if(M.ckey == "roaper" && M.real_name == "Ian Colm") //This is a Technician ID - I.name = "[M.real_name]'s Technician ID ([M.mind.role_alt_title ? M.mind.role_alt_title : M.mind.assigned_role])" + // Check for required job title. + if(citem.req_titles && citem.req_titles.len > 0) + var/has_title + var/current_title = M.mind.role_alt_title ? M.mind.role_alt_title : M.mind.assigned_role + for(var/title in citem.req_titles) + if(title == current_title) + has_title = 1 + break + if(!has_title) + continue - //replace old ID - qdel(C) - ok = M.equip_to_slot_if_possible(I, slot_wear_id, 0) //if 1, last argument deletes on fail - break - else if(istype(Item,/obj/item/weapon/storage/belt)) - if(M.ckey == "jakksergal" && M.real_name == "Nashi Ra'hal" && M.mind.role_alt_title && M.mind.role_alt_title != "Nurse" && M.mind.role_alt_title != "Chemist") - ok = 1 - qdel(Item) - goto skip - var/obj/item/weapon/storage/belt/medical/fluff/nashi_belt/I = Item - if(istype(M.belt,/obj/item/weapon/storage/belt)) - for(var/obj/item/weapon/storage/belt/B in M) - qdel(B) - M.belt=null - ok = M.equip_to_slot_if_possible(I, slot_belt, 0) - break - if(istype(M.belt,/obj/item/device/pda)) - for(var/obj/item/device/pda/Pda in M) - M.belt=null - M.equip_to_slot_if_possible(Pda, slot_l_store, 0) - ok = M.equip_to_slot_if_possible(I, slot_belt, 0) - else if(istype(M.back,/obj/item/weapon/storage) && M.back:contents.len < M.back:storage_slots) // Try to place it in something on the mob's back - Item.loc = M.back - ok = 1 + // ID cards and PDAs are applied directly to the existing object rather than spawned fresh. + var/obj/item/existing_item + if(citem.item_path == /obj/item/weapon/card/id && istype(current_id)) //Set earlier. + existing_item = M.wear_id + else if(citem.item_path == /obj/item/device/pda) + existing_item = locate(/obj/item/device/pda) in M.contents - else - for(var/obj/item/weapon/storage/S in M.contents) // Try to place it in any item that can store stuff, on the mob. - if (S.contents.len < S.storage_slots) - Item.loc = S - ok = 1 - break + // Spawn and equip the item. + if(existing_item) + citem.apply_to_item(existing_item) + else + place_custom_item(M,citem) - skip: - if (ok == 0) // Finally, since everything else failed, place it on the ground - Item.loc = get_turf(M.loc) +// Places the item on the target mob. +/proc/place_custom_item(mob/living/carbon/human/M, var/datum/custom_item/citem) + + if(!citem) return + var/obj/item/newitem = citem.spawn_item() + + if(M.equip_to_appropriate_slot(newitem)) + return newitem + + if(istype(M.back,/obj/item/weapon/storage)) + var/obj/item/weapon/storage/backpack = M.back + if(backpack.contents.len < backpack.storage_slots) + newitem.loc = M.back + return newitem + + // Try to place it in any item that can store stuff, on the mob. + for(var/obj/item/weapon/storage/S in M.contents) + if (S.contents.len < S.storage_slots) + newitem.loc = S + return newitem + newitem.loc = get_turf(M.loc) + return newitem diff --git a/code/modules/lighting/light_source.dm b/code/modules/lighting/light_source.dm index 6322446204..1897272118 100644 --- a/code/modules/lighting/light_source.dm +++ b/code/modules/lighting/light_source.dm @@ -69,7 +69,7 @@ lighting_update_lights += src /datum/light_source/proc/check() - if(!source_atom) + if(!source_atom || !light_range || !light_power) destroy() return 1 @@ -97,7 +97,7 @@ light_color = source_atom.light_color parse_light_color() . = 1 - + if(light_range && light_power && !applied) . = 1 diff --git a/code/modules/lighting/lighting_process.dm b/code/modules/lighting/lighting_process.dm index e2e422bd60..28e1f1fa5e 100644 --- a/code/modules/lighting/lighting_process.dm +++ b/code/modules/lighting/lighting_process.dm @@ -7,11 +7,9 @@ /datum/controller/process/lighting/doWork() for(var/datum/light_source/L in lighting_update_lights) if(L.needs_update) - if(L.destroyed) + if(L.destroyed || L.check() || L.force_update) L.remove_lum() - else if(L.check() || L.force_update) - L.remove_lum() - L.apply_lum() + if(!L.destroyed) L.apply_lum() L.force_update = 0 L.needs_update = 0 diff --git a/code/modules/mob/living/carbon/human/human.dm b/code/modules/mob/living/carbon/human/human.dm index 498b46345d..47ed66c302 100644 --- a/code/modules/mob/living/carbon/human/human.dm +++ b/code/modules/mob/living/carbon/human/human.dm @@ -1296,7 +1296,7 @@ /mob/living/carbon/human/has_eyes() if(internal_organs_by_name["eyes"]) var/obj/item/organ/eyes = internal_organs_by_name["eyes"] - if(eyes && istype(eyes) && !eyes.status & ORGAN_CUT_AWAY) + if(eyes && istype(eyes) && !(eyes.status & ORGAN_CUT_AWAY)) return 1 return 0 diff --git a/code/modules/mob/living/carbon/human/inventory.dm b/code/modules/mob/living/carbon/human/inventory.dm index c19540c800..6b7c3b8eb1 100644 --- a/code/modules/mob/living/carbon/human/inventory.dm +++ b/code/modules/mob/living/carbon/human/inventory.dm @@ -116,7 +116,7 @@ This saves us from having to call add_fingerprint() any time something is put in update_inv_glasses() else if (W == head) head = null - + var/update_hair = 0 if((W.flags & BLOCKHAIR) || (W.flags & BLOCKHEADHAIR)) update_hair = 1 @@ -128,7 +128,7 @@ This saves us from having to call add_fingerprint() any time something is put in update_hair(0) //rebuild hair update_inv_ears(0) update_inv_wear_mask(0) - + update_inv_head() else if (W == l_ear) l_ear = null @@ -168,9 +168,9 @@ This saves us from having to call add_fingerprint() any time something is put in back = null update_inv_back() else if (W == handcuffed) - handcuffed = null + handcuffed = null if(buckled && buckled.buckle_require_restraints) - buckled.unbuckle_mob() + buckled.unbuckle_mob() update_inv_handcuffed() else if (W == legcuffed) legcuffed = null @@ -183,7 +183,7 @@ This saves us from having to call add_fingerprint() any time something is put in update_inv_l_hand() else return 0 - + update_action_buttons() return 1 @@ -321,7 +321,7 @@ This saves us from having to call add_fingerprint() any time something is put in /mob/living/carbon/human/slot_is_accessible(var/slot, var/obj/item/I, mob/user=null) var/obj/item/covering = null var/check_flags = 0 - + switch(slot) if(slot_wear_mask) covering = src.head @@ -331,7 +331,7 @@ This saves us from having to call add_fingerprint() any time something is put in check_flags = HEADCOVERSEYES if(slot_gloves, slot_w_uniform) covering = src.wear_suit - + if(covering) if((covering.body_parts_covered & I.body_parts_covered) || (covering.flags & check_flags)) user << "\The [covering] is in the way." @@ -534,7 +534,7 @@ This saves us from having to call add_fingerprint() any time something is put in var/obj/item/clothing/accessory/A = suit.accessories[1] target.attack_log += "\[[time_stamp()]\] Has had their accessory ([A]) removed by [source.name] ([source.ckey])" source.attack_log += "\[[time_stamp()]\] Attempted to remove [target.name]'s ([target.ckey]) accessory ([A])" - if(istype(A, /obj/item/clothing/accessory/holobadge) || istype(A, /obj/item/clothing/accessory/medal)) + if(istype(A, /obj/item/clothing/accessory/badge) || istype(A, /obj/item/clothing/accessory/medal)) for(var/mob/M in viewers(target, null)) M.show_message("\red [source] tears off \the [A] from [target]'s [suit]!" , 1) done() @@ -799,7 +799,7 @@ It can still be worn/put on as normal. target.drop_from_inventory(target.r_store) //At this stage l_store is already processed by the code above, we only need to process r_store. else source << "You fail to remove \the [strip_item] from [target]!" - else if(item) + else if(item) if(target.has_organ_for_slot(slot_to_process) && item.mob_can_equip(target, slot_to_process, 0)) //Placing an item on the mob source.drop_from_inventory(item) target.equip_to_slot_if_possible(item, slot_to_process, 0, 1, 1) diff --git a/code/modules/mob/living/carbon/human/species/outsider/vox.dm b/code/modules/mob/living/carbon/human/species/outsider/vox.dm index a37e4c41b1..53e8dc0b15 100644 --- a/code/modules/mob/living/carbon/human/species/outsider/vox.dm +++ b/code/modules/mob/living/carbon/human/species/outsider/vox.dm @@ -54,6 +54,25 @@ var/datum/language/species_language = all_languages[default_language] return species_language.get_random_name(gender) +/datum/species/vox/equip_survival_gear(var/mob/living/carbon/human/H) + H.equip_to_slot_or_del(new /obj/item/clothing/mask/breath(H), slot_wear_mask) + if(!H.back) + H.equip_to_slot_or_del(new /obj/item/weapon/tank/nitrogen(H), slot_back) + H.internal = H.back + else if(!H.r_hand) + H.equip_to_slot_or_del(new /obj/item/weapon/tank/nitrogen(H), slot_r_hand) + H.internal = H.r_hand + else if (!H.l_hand) + H.equip_to_slot_or_del(new /obj/item/weapon/tank/nitrogen(H), slot_l_hand) + H.internal = H.l_hand + H.internals.icon_state = "internal1" + + if(H.backbag == 1) + H.equip_to_slot_or_del(new /obj/item/weapon/storage/box/survival/vox(H), slot_r_hand) + else + H.equip_to_slot_or_del(new /obj/item/weapon/storage/box/survival/vox(H.back), slot_in_backpack) + + /datum/species/vox/can_shred(var/mob/living/carbon/human/H, var/ignore_intent) if(!H.mind || !H.mind.special_role) // Pariah check. return 0 diff --git a/code/modules/mob/living/carbon/human/species/species.dm b/code/modules/mob/living/carbon/human/species/species.dm index 5c01ea38b4..b49a634aab 100644 --- a/code/modules/mob/living/carbon/human/species/species.dm +++ b/code/modules/mob/living/carbon/human/species/species.dm @@ -174,6 +174,12 @@ return "unknown" return species_language.get_random_name(gender) +/datum/species/proc/equip_survival_gear(var/mob/living/carbon/human/H) + if(H.backbag == 1) + H.equip_to_slot_or_del(new /obj/item/weapon/storage/box/survival(H), slot_r_hand) + else + H.equip_to_slot_or_del(new /obj/item/weapon/storage/box/survival(H.back), slot_in_backpack) + /datum/species/proc/create_organs(var/mob/living/carbon/human/H) //Handles creation of mob organs. for(var/obj/item/organ/organ in H.contents) 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 ee8a1438d2..c49bdd5a5d 100644 --- a/code/modules/mob/living/carbon/human/species/station/station.dm +++ b/code/modules/mob/living/carbon/human/species/station/station.dm @@ -59,6 +59,10 @@ "Your scales bristle against the cold." ) +/datum/species/unathi/equip_survival_gear(var/mob/living/carbon/human/H) + ..() + H.equip_to_slot_or_del(new /obj/item/clothing/shoes/sandal(H),slot_shoes,1) + /datum/species/tajaran name = "Tajara" name_plural = "Tajaran" @@ -100,6 +104,10 @@ ) cold_discomfort_level = 275 +/datum/species/tajaran/equip_survival_gear(var/mob/living/carbon/human/H) + ..() + H.equip_to_slot_or_del(new /obj/item/clothing/shoes/sandal(H),slot_shoes,1) + /datum/species/skrell name = "Skrell" name_plural = "Skrell" @@ -198,6 +206,12 @@ return 1 return 0 +/datum/species/diona/equip_survival_gear(var/mob/living/carbon/human/H) + if(H.backbag == 1) + H.equip_to_slot_or_del(new /obj/item/device/flashlight/flare(H), slot_r_hand) + else + H.equip_to_slot_or_del(new /obj/item/device/flashlight/flare(H.back), slot_in_backpack) + /datum/species/diona/handle_post_spawn(var/mob/living/carbon/human/H) H.gender = NEUTER return ..() @@ -251,6 +265,8 @@ has_organ = list() //TODO: Positronic brain. +/datum/species/machine/equip_survival_gear(var/mob/living/carbon/human/H) + /datum/species/machine/handle_death(var/mob/living/carbon/human/H) ..() if(flags & IS_SYNTHETIC) diff --git a/code/modules/mob/living/carbon/human/update_icons.dm b/code/modules/mob/living/carbon/human/update_icons.dm index d7776fa18d..e17c0f49f8 100644 --- a/code/modules/mob/living/carbon/human/update_icons.dm +++ b/code/modules/mob/living/carbon/human/update_icons.dm @@ -468,7 +468,7 @@ var/global/list/damage_icon_parts = list() under_icon = w_uniform.item_icons[slot_w_uniform_str] else under_icon = INV_W_UNIFORM_DEF_ICON - + //determine state to use var/under_state if(w_uniform.item_state_slots && w_uniform.item_state_slots[slot_w_uniform_str]) @@ -480,7 +480,7 @@ var/global/list/damage_icon_parts = list() //need to append _s to the icon state for legacy compatibility var/image/standing = image(icon = under_icon, icon_state = "[under_state]_s") - + //apply blood overlay if(w_uniform.blood_DNA) var/image/bloodsies = image(icon = species.blood_mask, icon_state = "uniformblood") @@ -499,7 +499,7 @@ var/global/list/damage_icon_parts = list() overlays_standing[UNIFORM_LAYER] = null if(update_icons) - update_icons() + update_icons() /mob/living/carbon/human/update_inv_wear_id(var/update_icons=1) if(wear_id) @@ -754,7 +754,7 @@ var/global/list/damage_icon_parts = list() /mob/living/carbon/human/update_inv_back(var/update_icons=1) if(back) back.screen_loc = ui_back //TODO - + //determine the icon to use var/icon/overlay_icon if(back.icon_override) @@ -769,7 +769,7 @@ var/global/list/damage_icon_parts = list() overlay_icon = back.item_icons[slot_back_str] else overlay_icon = INV_BACK_DEF_ICON - + //determine state to use var/overlay_state if(back.item_state_slots && back.item_state_slots[slot_back_str]) @@ -778,13 +778,13 @@ var/global/list/damage_icon_parts = list() overlay_state = back.item_state else overlay_state = back.icon_state - + //create the image overlays_standing[BACK_LAYER] = image(icon = overlay_icon, icon_state = overlay_state) else overlays_standing[BACK_LAYER] = null - if(update_icons) + if(update_icons) update_icons() @@ -822,15 +822,6 @@ var/global/list/damage_icon_parts = list() if(r_hand) r_hand.screen_loc = ui_rhand //TODO - //determine icon to use - var/icon/t_icon - if(r_hand.icon_override) - t_icon = r_hand.icon_override - else if(r_hand.item_icons && (slot_r_hand_str in r_hand.item_icons)) - t_icon = r_hand.item_icons[slot_r_hand_str] - else - t_icon = INV_R_HAND_DEF_ICON - //determine icon state to use var/t_state if(r_hand.item_state_slots && r_hand.item_state_slots[slot_r_hand_str]) @@ -839,7 +830,17 @@ var/global/list/damage_icon_parts = list() t_state = r_hand.item_state else t_state = r_hand.icon_state - + + //determine icon to use + var/icon/t_icon + if(r_hand.icon_override) + t_state += "_r" + t_icon = r_hand.icon_override + else if(r_hand.item_icons && (slot_r_hand_str in r_hand.item_icons)) + t_icon = r_hand.item_icons[slot_r_hand_str] + else + t_icon = INV_R_HAND_DEF_ICON + overlays_standing[R_HAND_LAYER] = image(icon = t_icon, icon_state = t_state) if (handcuffed) drop_r_hand() //this should be moved out of icon code @@ -853,15 +854,6 @@ var/global/list/damage_icon_parts = list() if(l_hand) l_hand.screen_loc = ui_lhand //TODO - //determine icon to use - var/icon/t_icon - if(l_hand.icon_override) - t_icon = l_hand.icon_override - else if(l_hand.item_icons && (slot_l_hand_str in l_hand.item_icons)) - t_icon = l_hand.item_icons[slot_l_hand_str] - else - t_icon = INV_L_HAND_DEF_ICON - //determine icon state to use var/t_state if(l_hand.item_state_slots && l_hand.item_state_slots[slot_l_hand_str]) @@ -870,7 +862,17 @@ var/global/list/damage_icon_parts = list() t_state = l_hand.item_state else t_state = l_hand.icon_state - + + //determine icon to use + var/icon/t_icon + if(l_hand.icon_override) + t_state += "_l" + t_icon = l_hand.icon_override + else if(l_hand.item_icons && (slot_l_hand_str in l_hand.item_icons)) + t_icon = l_hand.item_icons[slot_l_hand_str] + else + t_icon = INV_L_HAND_DEF_ICON + overlays_standing[L_HAND_LAYER] = image(icon = t_icon, icon_state = t_state) if (handcuffed) drop_l_hand() //This probably should not be here diff --git a/code/modules/mob/living/silicon/pai/software_modules.dm b/code/modules/mob/living/silicon/pai/software_modules.dm index c2fed82165..f7434ebe91 100644 --- a/code/modules/mob/living/silicon/pai/software_modules.dm +++ b/code/modules/mob/living/silicon/pai/software_modules.dm @@ -125,16 +125,12 @@ var/data[0] // This is dumb, but NanoUI breaks if it has no data to send - data["a"] = "a" - - if(ui) - ui.load_cached_data(ManifestJSON) + data["manifest"] = list("__json_cache" = ManifestJSON) ui = nanomanager.try_update_ui(user, user, id, ui, data, force_open) if(!ui) // Don't copy-paste this unless you're making a pAI software module! ui = new(user, user, id, "pai_manifest.tmpl", "Crew Manifest", 450, 600) - ui.load_cached_data(ManifestJSON) ui.set_initial_data(data) ui.open() ui.set_auto_update(1) @@ -499,7 +495,6 @@ if(!ui) // Don't copy-paste this unless you're making a pAI software module! ui = new(user, user, id, "pai_signaller.tmpl", "Signaller", 320, 150) - ui.load_cached_data(ManifestJSON) ui.set_initial_data(data) ui.open() diff --git a/code/modules/mob/living/simple_animal/friendly/cat.dm b/code/modules/mob/living/simple_animal/friendly/cat.dm index 4e72bf55c0..3197c6023c 100644 --- a/code/modules/mob/living/simple_animal/friendly/cat.dm +++ b/code/modules/mob/living/simple_animal/friendly/cat.dm @@ -228,6 +228,23 @@ icon_dead = "kitten_dead" gender = NEUTER +// Leaving this here for now. +/obj/item/weapon/holder/cat/fluff/bones + name = "Bones" + desc = "It's Bones! Meow." + gender = MALE + icon_state = "cat3" + +/mob/living/simple_animal/cat/fluff/bones + name = "Bones" + desc = "That's Bones the cat. He's a laid back, black cat. Meow." + gender = MALE + icon_state = "cat3" + icon_living = "cat3" + icon_dead = "cat3_dead" + holder_type = /obj/item/weapon/holder/cat/fluff/bones + var/friend_name = "Erstatz Vryroxes" + /mob/living/simple_animal/cat/kitten/New() gender = pick(MALE, FEMALE) ..() diff --git a/code/modules/mob/new_player/new_player.dm b/code/modules/mob/new_player/new_player.dm index fe1a86648d..1e18882137 100644 --- a/code/modules/mob/new_player/new_player.dm +++ b/code/modules/mob/new_player/new_player.dm @@ -314,7 +314,7 @@ var/mob/living/character = create_character() //creates the human and transfers vars and mind character = job_master.EquipRank(character, rank, 1) //equips the human UpdateFactionList(character) - EquipCustomItems(character) + equip_custom_items(character) // AIs don't need a spawnpoint, they must spawn at an empty core if(character.mind.assigned_role == "AI") diff --git a/code/modules/nano/JSON Writer.dm b/code/modules/nano/JSON Writer.dm index 65b9d99eb0..97acc0b2cc 100644 --- a/code/modules/nano/JSON Writer.dm +++ b/code/modules/nano/JSON Writer.dm @@ -1,7 +1,12 @@ - json_writer + var + use_cache = 0 + proc - WriteObject(list/L, cached_data = null) + WriteObject(list/L) + if(use_cache && L["__json_cache"]) + return L["__json_cache"] + . = "{" var/i = 1 for(var/k in L) @@ -9,13 +14,11 @@ json_writer . += {"\"[k]\":[write(val)]"} if(i++ < L.len) . += "," - if(cached_data) - . = copytext(., 1, lentext(.)) + ",\"cached\":[cached_data]}" . += "}" write(val) if(isnum(val)) - return num2text(val, 100) + return num2text(val) else if(isnull(val)) return "null" else if(istype(val, /list)) @@ -35,27 +38,21 @@ json_writer . += "]" write_string(txt) - var/static/list/json_escape = list("\\", "\"", "'", "\n") + var/static/list/json_escape = list("\\" = "\\\\", "\"" = "\\\"", "\n" = "\\n") for(var/targ in json_escape) var/start = 1 while(start <= lentext(txt)) var/i = findtext(txt, targ, start) if(!i) break - if(targ == "\n") - txt = copytext(txt, 1, i) + "\\n" + copytext(txt, i+2) - start = i + 1 // 1 character added - if(targ == "'") - txt = copytext(txt, 1, i) + "`" + copytext(txt, i+1) // apostrophies fuck shit up... - start = i + 1 // 1 character added - else - txt = copytext(txt, 1, i) + "\\" + copytext(txt, i) - start = i + 2 // 2 characters added + var/lrep = length(json_escape[targ]) + txt = copytext(txt, 1, i) + json_escape[targ] + copytext(txt, i + length(targ)) + start = i + lrep return {""[txt]""} is_associative(list/L) for(var/key in L) // if the key is a list that means it's actually an array of lists (stupid Byond...) - if(!isnum(key) && !istype(key, /list)) + if(!isnum(key) && !isnull(L[key]) && !istype(key, /list)) return TRUE diff --git a/code/modules/nano/_JSON.dm b/code/modules/nano/_JSON.dm index 4f70e6e664..9579189981 100644 --- a/code/modules/nano/_JSON.dm +++ b/code/modules/nano/_JSON.dm @@ -7,6 +7,11 @@ proc var/static/json_reader/_jsonr = new() return _jsonr.ReadObject(_jsonr.ScanJson(json)) - list2json(list/L, var/cached_data = null) + list2json(list/L) var/static/json_writer/_jsonw = new() - return _jsonw.WriteObject(L, cached_data) + return _jsonw.write(L) + + list2json_usecache(list/L) + var/static/json_writer/_jsonw = new() + _jsonw.use_cache = 1 + return _jsonw.write(L) diff --git a/code/modules/nano/nanoui.dm b/code/modules/nano/nanoui.dm index ffc6208f39..f53fc98497 100644 --- a/code/modules/nano/nanoui.dm +++ b/code/modules/nano/nanoui.dm @@ -57,8 +57,6 @@ nanoui is used to open and update nano browser uis var/list/datum/nanoui/children = list() var/datum/topic_state/state = null - var/cached_data = null - /** * Create a new nanoui instance. * @@ -349,7 +347,7 @@ nanoui is used to open and update nano browser uis template_data_json = list2json(templates) var/list/send_data = get_send_data(initial_data) - var/initial_data_json = list2json(send_data, cached_data) + var/initial_data_json = replacetext(list2json_usecache(send_data), "'", "'") var/url_parameters_json = list2json(list("src" = "\ref[src]")) @@ -432,19 +430,6 @@ nanoui is used to open and update nano browser uis winset(user, window_id, "on-close=\"nanoclose [params]\"") -/** - * Appends already processed json txt to the list2json proc when setting initial-data and data pushes - * Used for data that is fucking huge like manifests and camera lists that doesn't change often. - * And we only want to process them when they change. - * Fuck javascript - * - * @return nothing - */ -/datum/nanoui/proc/load_cached_data(var/data) - cached_data = data - return - - /** * Push data to an already open UI window * @@ -458,7 +443,7 @@ nanoui is used to open and update nano browser uis var/list/send_data = get_send_data(data) //user << list2json(data) // used for debugging - user << output(list2params(list(list2json(send_data,cached_data))),"[window_id].browser:receiveUpdateData") + user << output(list2params(list(list2json_usecache(send_data))),"[window_id].browser:receiveUpdateData") /** * This Topic() proc is called whenever a user clicks on a link within a Nano UI diff --git a/code/modules/power/cell.dm b/code/modules/power/cell.dm index ad451dde05..6523e2f85f 100644 --- a/code/modules/power/cell.dm +++ b/code/modules/power/cell.dm @@ -43,10 +43,8 @@ if(rigged && amount > 0) explode() return 0 - - if(charge < amount) return 0 - charge = (charge - amount) - return 1 + charge = max(0, charge - amount) + return charge // recharge the cell /obj/item/weapon/cell/proc/give(var/amount) diff --git a/code/modules/projectiles/guns/projectile/revolver.dm b/code/modules/projectiles/guns/projectile/revolver.dm index f0291de0f8..cb17710773 100644 --- a/code/modules/projectiles/guns/projectile/revolver.dm +++ b/code/modules/projectiles/guns/projectile/revolver.dm @@ -41,3 +41,24 @@ name = input M << "You name the gun [input]. Say hello to your new friend." return 1 + +// Blade Runner pistol. +/obj/item/weapon/gun/projectile/revolver/deckard + name = "Deckard .44" + desc = "A custom-built revolver, based off the semi-popular Detective Special model." + icon_state = "deckard-empty" + ammo_type = /obj/item/ammo_magazine/c38/rubber + +/obj/item/weapon/gun/projectile/revolver/deckard/update_icon() + ..() + if(loaded.len) + icon_state = "deckard-loaded" + else + icon_state = "deckard-empty" + +/obj/item/weapon/gun/projectile/revolver/deckard/load_ammo(var/obj/item/A, mob/user) + if(istype(A, /obj/item/ammo_magazine)) + flick("deckard-reload",src) + ..() + + diff --git a/code/modules/reagents/Chemistry-Holder.dm b/code/modules/reagents/Chemistry-Holder.dm index a9562ca861..71b73800b3 100644 --- a/code/modules/reagents/Chemistry-Holder.dm +++ b/code/modules/reagents/Chemistry-Holder.dm @@ -435,6 +435,8 @@ var/const/INGEST = 2 return 0 /datum/reagents/proc/reaction(var/atom/A, var/method=TOUCH, var/volume_modifier=0) + if(!istype(A) || !A.simulated) + return switch(method) if(TOUCH) diff --git a/code/modules/reagents/reagent_containers/food/drinks.dm b/code/modules/reagents/reagent_containers/food/drinks.dm index 8681503304..405737028c 100644 --- a/code/modules/reagents/reagent_containers/food/drinks.dm +++ b/code/modules/reagents/reagent_containers/food/drinks.dm @@ -268,6 +268,15 @@ volume = 120 center_of_mass = list("x"=17, "y"=10) +/obj/item/weapon/reagent_containers/food/drinks/teapot + name = "teapot" + desc = "An elegant teapot. It simply oozes class." + icon_state = "teapot" + item_state = "teapot" + amount_per_transfer_from_this = 10 + volume = 120 + center_of_mass = list("x"=17, "y"=7) + /obj/item/weapon/reagent_containers/food/drinks/flask name = "Captain's Flask" desc = "A metal flask belonging to the captain" @@ -275,6 +284,16 @@ volume = 60 center_of_mass = list("x"=17, "y"=7) +/obj/item/weapon/reagent_containers/food/drinks/flask/shiny + name = "shiny flask" + desc = "A shiny metal flask. It appears to have a Greek symbol inscribed on it." + icon_state = "shinyflask" + +/obj/item/weapon/reagent_containers/food/drinks/flask/lithium + name = "lithium flask" + desc = "A flask with a Lithium Atom symbol on it." + icon_state = "lithiumflask" + /obj/item/weapon/reagent_containers/food/drinks/flask/detflask name = "Detective's Flask" desc = "A metal flask with a leather band and golden badge belonging to the detective." diff --git a/code/modules/research/xenoarchaeology/misc.dm b/code/modules/research/xenoarchaeology/misc.dm index c66e57f3de..b2d8cef42c 100644 --- a/code/modules/research/xenoarchaeology/misc.dm +++ b/code/modules/research/xenoarchaeology/misc.dm @@ -73,7 +73,7 @@ ..() sleep(2) new /obj/item/clothing/under/rank/scientist(src) - new /obj/item/clothing/suit/storage/labcoat(src) + new /obj/item/clothing/suit/storage/toggle/labcoat(src) new /obj/item/clothing/shoes/white(src) new /obj/item/clothing/glasses/science(src) new /obj/item/device/radio/headset/headset_sci(src) diff --git a/code/setup.dm b/code/setup.dm index 7ebb286a0d..7cbcf93bdd 100644 --- a/code/setup.dm +++ b/code/setup.dm @@ -960,4 +960,13 @@ var/list/be_special_flags = list( #define CLAMP01(x) max(0, min(1, x)) -#define DEFAULT_WALL_MATERIAL "steel" \ No newline at end of file +#define DEFAULT_WALL_MATERIAL "steel" + +// Convoluted setup so defines can be supplied by Bay12 main server compile script. +// Should still work fine for people jamming the icons into their repo. +#ifndef CUSTOM_ITEM_OBJ +#define CUSTOM_ITEM_OBJ 'icons/obj/custom_items_obj.dmi' +#endif +#ifndef CUSTOM_ITEM_MOB +#define CUSTOM_ITEM_MOB 'icons/mob/custom_items_mob.dmi' +#endif \ No newline at end of file diff --git a/config/example/custom_items.txt b/config/example/custom_items.txt index f4bb1a7028..79fb05a4c1 100644 --- a/config/example/custom_items.txt +++ b/config/example/custom_items.txt @@ -1 +1,41 @@ -ckey: name: /path/to/obj +## +# Custom items go here. They are modifications of existing paths; look at the example for details. +# Item will spawn if the target has one of the req_titles and if their on-spawn ID has the required access level. +# req_access is going to be a shit to maintain since the config file can't grab constants and has to use integers, use it minimally. +# Separate titles with a single comma and a space (', ') or they'll bork. +# +# EX: +# { +# ckey: zuhayr +# character_name: Jane Doe +# item_path: /obj/item/toy/plushie +# item_name: ugly plush toy +# item_icon: flagmask +# item_desc: It's truly hideous. +# req_titles: Assistant, Security Officer +# req_access: 1 +# } +# +# { +# ckey: zuhayr +# character_name: Jane Doe +# item_path: /obj/item/device/kit/paint +# item_name: APLU customisation kit +# item_desc: A customisation kit with all the parts needed to turn an APLU into a "Titan's Fist" model. +# kit_name: APLU "Titan's Fist" +# kit_desc: Looks like an overworked, under-maintained Ripley with some horrific damage. +# kit_icon: titan +# additional_data: ripley, firefighter +# } +# +# { +# ckey: zuhayr +# character_name: Jane Doe +# item_path: /obj/item/device/kit/suit +# item_name: salvage suit customisation kit +# item_desc: A customisation kit with all the parts needed to convert a suit. +# kit_name: salvage +# kit_desc: An orange voidsuit. Reinforced! +# kit_icon: salvage +# } +## diff --git a/html/changelog.html b/html/changelog.html index 8e4e854561..227e839d13 100644 --- a/html/changelog.html +++ b/html/changelog.html @@ -56,6 +56,23 @@ -->
+

14 May 2015

+

PsiOmegaDelta updated:

+ +

Techhead updated:

+ +

12 May 2015

Dennok updated:

diff --git a/nano/templates/pda.tmpl b/nano/templates/pda.tmpl index 38cc5ef945..3bb864fd01 100644 --- a/nano/templates/pda.tmpl +++ b/nano/templates/pda.tmpl @@ -297,9 +297,9 @@ Used In File(s): \code\game\objects\items\devices\PDA\PDA.dm {{else data.mode== 41}}
- {{if data.cached.heads.length}} + {{if data.manifest.heads.length}} - {{for data.cached["heads"]}} + {{for data.manifest["heads"]}} {{if value.rank == "Captain"}} {{else}} @@ -307,9 +307,9 @@ Used In File(s): \code\game\objects\items\devices\PDA\PDA.dm {{/if}} {{/for}} {{/if}} - {{if data.cached.sec.length}} + {{if data.manifest.sec.length}} - {{for data.cached["sec"]}} + {{for data.manifest["sec"]}} {{if value.rank == "Head of Security"}} {{else}} @@ -317,9 +317,9 @@ Used In File(s): \code\game\objects\items\devices\PDA\PDA.dm {{/if}} {{/for}} {{/if}} - {{if data.cached.eng.length}} + {{if data.manifest.eng.length}} - {{for data.cached["eng"]}} + {{for data.manifest["eng"]}} {{if value.rank == "Chief Engineer"}} {{else}} @@ -327,9 +327,9 @@ Used In File(s): \code\game\objects\items\devices\PDA\PDA.dm {{/if}} {{/for}} {{/if}} - {{if data.cached.med.length}} + {{if data.manifest.med.length}} - {{for data.cached["med"]}} + {{for data.manifest["med"]}} {{if value.rank == "Chief Medical Officer"}} {{else}} @@ -337,9 +337,9 @@ Used In File(s): \code\game\objects\items\devices\PDA\PDA.dm {{/if}} {{/for}} {{/if}} - {{if data.cached.sci.length}} + {{if data.manifest.sci.length}} - {{for data.cached["sci"]}} + {{for data.manifest["sci"]}} {{if value.rank == "Research Director"}} {{else}} @@ -347,9 +347,9 @@ Used In File(s): \code\game\objects\items\devices\PDA\PDA.dm {{/if}} {{/for}} {{/if}} - {{if data.cached.civ.length}} + {{if data.manifest.civ.length}} - {{for data.cached["civ"]}} + {{for data.manifest["civ"]}} {{if value.rank == "Head of Personnel"}} {{else}} @@ -357,9 +357,9 @@ Used In File(s): \code\game\objects\items\devices\PDA\PDA.dm {{/if}} {{/for}} {{/if}} - {{if data.cached.misc.length}} + {{if data.manifest.misc.length}} - {{for data.cached["misc"]}} + {{for data.manifest["misc"]}} {{/for}} {{/if}} diff --git a/nano/templates/sec_camera.tmpl b/nano/templates/sec_camera.tmpl index 886cb0f87c..13ec5ab229 100644 --- a/nano/templates/sec_camera.tmpl +++ b/nano/templates/sec_camera.tmpl @@ -12,7 +12,7 @@ Used In File(s): \code\game\machinery\computer\camera.dm
None
{{/if}} -{{for data.cached.cameras}} +{{for data.cameras}} {{if data.current && value.name == data.current.name}} {{:helper.link(value.name, '', {'switchTo' : value.camera}, 'selected')}} {{else value.deact}} diff --git a/nano/templates/sec_camera_map_content.tmpl b/nano/templates/sec_camera_map_content.tmpl index 55d9e05d4d..a2706d8c35 100644 --- a/nano/templates/sec_camera_map_content.tmpl +++ b/nano/templates/sec_camera_map_content.tmpl @@ -2,7 +2,7 @@ Title: Security Camera Console (Map content) Used In File(s): \code\game\machinery\computer\camera.dm --> -{{for data.cached.cameras}} +{{for data.cameras}} {{if value.z == 1}}
{{if data.current && value.name == data.current.name}}
Command
{{:value.name}}{{:value.rank}}{{:value.active}}
Security
{{:value.name}}{{:value.rank}}{{:value.active}}
Engineering
{{:value.name}}{{:value.rank}}{{:value.active}}
Medical
{{:value.name}}{{:value.rank}}{{:value.active}}
Science
{{:value.name}}{{:value.rank}}{{:value.active}}
Civilian
{{:value.name}}{{:value.rank}}{{:value.active}}
Misc
{{:value.name}}{{:value.rank}}{{:value.active}}