diff --git a/code/__DEFINES/camera.dm b/code/__DEFINES/camera.dm index f50d7d8e2c72..b13adf43e8cd 100644 --- a/code/__DEFINES/camera.dm +++ b/code/__DEFINES/camera.dm @@ -3,6 +3,7 @@ #define CAMERA_NET_CONTAINMENT "Containment" #define CAMERA_NET_CONTAINMENT_HIDDEN "Containment Hidden" #define CAMERA_NET_RESEARCH "Research" +#define CAMERA_NET_BRIG "Brig" #define CAMERA_NET_ALAMO "Alamo" #define CAMERA_NET_NORMANDY "Normandy" #define CAMERA_NET_COLONY "Colony" diff --git a/code/__DEFINES/conflict.dm b/code/__DEFINES/conflict.dm index a6a7aa53f182..17fd8b32c280 100644 --- a/code/__DEFINES/conflict.dm +++ b/code/__DEFINES/conflict.dm @@ -54,24 +54,25 @@ #define GUN_TRIGGER_SAFETY (1<<1) #define GUN_UNUSUAL_DESIGN (1<<2) #define GUN_SILENCED (1<<3) +#define GUN_CANT_EXECUTE (1<<4) ///If checking for ammo with current.mag you have to check it against numerical values, as booleans will not trigger. -#define GUN_INTERNAL_MAG (1<<4) -#define GUN_AUTO_EJECTOR (1<<5) -#define GUN_AMMO_COUNTER (1<<6) -#define GUN_BURST_FIRING (1<<7) -#define GUN_FLASHLIGHT_ON (1<<8) -#define GUN_WY_RESTRICTED (1<<9) -#define GUN_SPECIALIST (1<<10) -#define GUN_WIELDED_FIRING_ONLY (1<<11) +#define GUN_INTERNAL_MAG (1<<5) +#define GUN_AUTO_EJECTOR (1<<6) +#define GUN_AMMO_COUNTER (1<<7) +#define GUN_BURST_FIRING (1<<8) +#define GUN_FLASHLIGHT_ON (1<<9) +#define GUN_WY_RESTRICTED (1<<10) +#define GUN_SPECIALIST (1<<11) +#define GUN_WIELDED_FIRING_ONLY (1<<12) /// removes unwielded accuracy and scatter penalties (not recoil) -#define GUN_ONE_HAND_WIELDED (1<<12) -#define GUN_ANTIQUE (1<<13) +#define GUN_ONE_HAND_WIELDED (1<<13) +#define GUN_ANTIQUE (1<<14) /// Whether the gun has been fired by its current user (reset upon `dropped()`) -#define GUN_RECOIL_BUILDUP (1<<14) +#define GUN_RECOIL_BUILDUP (1<<15) /// support weapon, bipod will grant autofire -#define GUN_SUPPORT_PLATFORM (1<<15) +#define GUN_SUPPORT_PLATFORM (1<<16) /// No gun description, only base desc -#define GUN_NO_DESCRIPTION (1<<16) +#define GUN_NO_DESCRIPTION (1<<17) // NOTE: Don't add flags past 1<<23, it'll break things due to BYOND limitations. You can usually use a Component instead. #define USES_STREAKS (1<<0) diff --git a/code/__DEFINES/job.dm b/code/__DEFINES/job.dm index 79f40c89bb53..3fd552f5369f 100644 --- a/code/__DEFINES/job.dm +++ b/code/__DEFINES/job.dm @@ -360,6 +360,7 @@ GLOBAL_LIST_INIT(job_command_roles, JOB_COMMAND_ROLES_LIST) #define JOB_XENOMORPH_QUEEN "Queen" // For coloring the ranks in the statistics menu +#define JOB_PLAYTIME_TIER_0 (0 HOURS) #define JOB_PLAYTIME_TIER_1 (10 HOURS) #define JOB_PLAYTIME_TIER_2 (25 HOURS) #define JOB_PLAYTIME_TIER_3 (70 HOURS) diff --git a/code/__DEFINES/mobs.dm b/code/__DEFINES/mobs.dm index 77f2393e6542..d8f820ab382b 100644 --- a/code/__DEFINES/mobs.dm +++ b/code/__DEFINES/mobs.dm @@ -113,7 +113,7 @@ #define CANROOT (1<<6) #define GODMODE (1<<12) #define FAKEDEATH (1<<13) //Replaces stuff like changeling.changeling_fakedeath -#define DISFIGURED (1<<14) //I'll probably move this elsewhere if I ever get wround to writing a bitflag mob-damage system +//#define DISFIGURED (1<<14) //unused #define XENO_HOST (1<<15) //Tracks whether we're gonna be a baby alien's mummy. #define IMMOBILE_ACTION (1<<16) // If you are performing an action that prevents you from being pushed by your own people. #define PERMANENTLY_DEAD (1<<17) diff --git a/code/__DEFINES/skills.dm b/code/__DEFINES/skills.dm index d33e26c1c3f6..e4965907f707 100644 --- a/code/__DEFINES/skills.dm +++ b/code/__DEFINES/skills.dm @@ -70,10 +70,11 @@ // engineer skill #define SKILL_ENGINEER_DEFAULT 0 -#define SKILL_ENGINEER_TRAINED 1 //barricade repair && c4 use (mini-engis, specs) -#define SKILL_ENGINEER_ENGI 2 //plasteel barricade deconstruction, hacking&&planet engine fixing&&apc building, Telecomms fixing (Combat Engi, OT, etc.) -#define SKILL_ENGINEER_MASTER 3 //Synths -#define SKILL_ENGINEER_MAX 3 +#define SKILL_ENGINEER_NOVICE 1 //barricade repair && c4 use (mini-engis, specs) +#define SKILL_ENGINEER_TRAINED 2 //plasteel barricade deconstruction, hacking&&planet engine fixing&&apc building, Telecomms fixing (OT, etc.) +#define SKILL_ENGINEER_ENGI 3 // Slightly faster at everything (Combat Technicians) +#define SKILL_ENGINEER_MASTER 4 //Synths +#define SKILL_ENGINEER_MAX 4 //medical skill #define SKILL_MEDICAL_DEFAULT 0 diff --git a/code/__DEFINES/subsystems.dm b/code/__DEFINES/subsystems.dm index 47aa0e732c76..88496c79d630 100644 --- a/code/__DEFINES/subsystems.dm +++ b/code/__DEFINES/subsystems.dm @@ -123,6 +123,7 @@ #define SS_INIT_NIGHTMARE 21.5 #define SS_INIT_TIMETRACK 21.1 #define SS_INIT_HUMANS 21 +#define SS_INIT_WHO 20 #define SS_INIT_POWER 19 #define SS_INIT_INFLUXMCSTATS 12 #define SS_INIT_INFLUXSTATS 11 diff --git a/code/__DEFINES/tgs.dm b/code/__DEFINES/tgs.dm index e2c89df90e9b..17464b44dae8 100644 --- a/code/__DEFINES/tgs.dm +++ b/code/__DEFINES/tgs.dm @@ -1,6 +1,6 @@ // tgstation-server DMAPI -#define TGS_DMAPI_VERSION "7.1.2" +#define TGS_DMAPI_VERSION "7.1.3" // All functions and datums outside this document are subject to change with any version and should not be relied on. diff --git a/code/__HELPERS/_lists.dm b/code/__HELPERS/_lists.dm index e46c92df543a..aa73d6008e02 100644 --- a/code/__HELPERS/_lists.dm +++ b/code/__HELPERS/_lists.dm @@ -128,17 +128,23 @@ * You should only pass integers in. */ /proc/pick_weight(list/list_to_pick) + if(length(list_to_pick) == 0) + return null + var/total = 0 - var/item - for(item in list_to_pick) + for(var/item in list_to_pick) if(!list_to_pick[item]) list_to_pick[item] = 0 total += list_to_pick[item] - total = rand(0, total) - for(item in list_to_pick) - total -= list_to_pick[item] - if(total <= 0 && list_to_pick[item]) + total = rand(1, total) + for(var/item in list_to_pick) + var/item_weight = list_to_pick[item] + if(item_weight == 0) + continue + + total -= item_weight + if(total <= 0) return item return null diff --git a/code/__HELPERS/cmp.dm b/code/__HELPERS/cmp.dm index 31308ac5812f..e27add2c9601 100644 --- a/code/__HELPERS/cmp.dm +++ b/code/__HELPERS/cmp.dm @@ -57,6 +57,9 @@ GLOBAL_LIST_INIT(cmp_field, "name") /proc/cmp_typepaths_asc(A, B) return sorttext("[B]","[A]") +/proc/cmp_typepaths_name_asc(atom/A, atom/B) + return sorttext(initial(A.name), initial(B.name)) + /// Compares mobs based on their timeofdeath value in ascending order /proc/cmp_mob_deathtime_asc(mob/A, mob/B) return A.timeofdeath - B.timeofdeath diff --git a/code/__HELPERS/lists.dm b/code/__HELPERS/lists.dm index d5212611a04b..32ea0f5ec32e 100644 --- a/code/__HELPERS/lists.dm +++ b/code/__HELPERS/lists.dm @@ -87,22 +87,6 @@ result = first ^ second return result -//Pretends to pick an element based on its weight but really just seems to pick a random element. -/proc/pickweight(list/L) - var/total = 0 - var/item - for (item in L) - if (!L[item]) - L[item] = 1 - total += L[item] - - total = rand(1, total) - for (item in L) - total -=L [item] - if (total <= 0) - return item - return null - /// Pick a random element from the list and remove it from the list. /proc/pick_n_take(list/L) RETURN_TYPE(L[_].type) diff --git a/code/__HELPERS/unsorted.dm b/code/__HELPERS/unsorted.dm index d8eebf79bca6..f442ca3b1a32 100644 --- a/code/__HELPERS/unsorted.dm +++ b/code/__HELPERS/unsorted.dm @@ -1100,11 +1100,17 @@ GLOBAL_DATUM(action_purple_power_up, /image) else air_master.tiles_to_update += T2*/ -/proc/get_cardinal_dir(atom/A, atom/B) - var/dx = abs(B.x - A.x) - var/dy = abs(B.y - A.y) - return get_dir(A, B) & (rand() * (dx+dy) < dy ? 3 : 12) - +/// Returns the nearest cardinal dir between two atoms. Favors NORTH/SOUTH on perfect diagonals. Consistent and reversible. +/proc/get_cardinal_dir(atom/start, atom/end) as num + var/dx = end.x - start.x + var/dy = end.y - start.y + if(!(dx || dy)) + return 0 //returns 0 when on same x/y, consistent with get_dir() + + if(abs(dx) > abs(dy)) + return dx < 0 ? WEST : EAST + else + return dy < 0 ? SOUTH : NORTH //Returns the 2 dirs perpendicular to the arg /proc/get_perpen_dir(dir) diff --git a/code/_globalvars/bitfields.dm b/code/_globalvars/bitfields.dm index facc2b951ad3..72e02deb8c1a 100644 --- a/code/_globalvars/bitfields.dm +++ b/code/_globalvars/bitfields.dm @@ -108,6 +108,7 @@ DEFINE_BITFIELD(flags_gun_features, list( "GUN_TRIGGER_SAFETY" = GUN_TRIGGER_SAFETY, "GUN_UNUSUAL_DESIGN" = GUN_UNUSUAL_DESIGN, "GUN_SILENCED" = GUN_SILENCED, + "GUN_CANT_EXECUTE" = GUN_CANT_EXECUTE, "GUN_INTERNAL_MAG" = GUN_INTERNAL_MAG, "GUN_AUTO_EJECTOR" = GUN_AUTO_EJECTOR, "GUN_AMMO_COUNTER" = GUN_AMMO_COUNTER, @@ -356,7 +357,6 @@ DEFINE_BITFIELD(status_flags, list( "PASSEMOTES" = PASSEMOTES, "GODMODE" = GODMODE, "FAKEDEATH" = FAKEDEATH, - "DISFIGURED" = DISFIGURED, "XENO_HOST" = XENO_HOST, "IMMOBILE_ACTION" = IMMOBILE_ACTION, "PERMANENTLY_DEAD" = PERMANENTLY_DEAD, diff --git a/code/controllers/subsystem/communications.dm b/code/controllers/subsystem/communications.dm index 7397d98a0d52..e0ca12c341bd 100644 --- a/code/controllers/subsystem/communications.dm +++ b/code/controllers/subsystem/communications.dm @@ -272,7 +272,6 @@ SUBSYSTEM_DEF(radio) "[VAI_FREQ]" = "vairadio", "[RMC_FREQ]" = "rmcradio", "[CMB_FREQ]" = "cmbradio", - "[CLF_FREQ]" = "clfradio", "[ALPHA_FREQ]" = "alpharadio", "[BRAVO_FREQ]" = "bravoradio", "[CHARLIE_FREQ]" = "charlieradio", @@ -287,6 +286,17 @@ SUBSYSTEM_DEF(radio) "[COLONY_FREQ]" = "deptradio", "[BUG_A_FREQ]" = "airadio", "[BUG_B_FREQ]" = "aiprivradio", + "[UPP_FREQ]" = "syndradio", + "[UPP_CMD_FREQ]" = "opforcmd", + "[UPP_ENGI_FREQ]" = "opforeng", + "[UPP_MED_FREQ]" = "opformed", + "[UPP_CCT_FREQ]" = "opforcct", + "[UPP_KDO_FREQ]" = "opforspe", + "[CLF_FREQ]" = "clfradio", + "[CLF_CMD_FREQ]" = "opforcmd", + "[CLF_ENGI_FREQ]" = "opforeng", + "[CLF_MED_FREQ]" = "opformed", + "[CLF_CCT_FREQ]" = "opforcct", ) /datum/controller/subsystem/radio/proc/add_object(obj/device as obj, new_frequency as num, filter = null as text|null) @@ -359,10 +369,6 @@ SUBSYSTEM_DEF(radio) return freq_span if(frequency in PMC_FREQS) return "pmcradio" - if(frequency in UPP_FREQS) - return "syndradio" - if(frequency in CLF_FREQS) - return "clfradio" if(frequency in ERT_FREQS) return "centradio" if(frequency in DEPT_FREQS) diff --git a/code/controllers/subsystem/init/lobby_art.dm b/code/controllers/subsystem/init/lobby_art.dm index 7c49d5fe1787..4b26d576b8df 100644 --- a/code/controllers/subsystem/init/lobby_art.dm +++ b/code/controllers/subsystem/init/lobby_art.dm @@ -6,5 +6,5 @@ SUBSYSTEM_DEF(lobby_art) /datum/controller/subsystem/lobby_art/Initialize() var/list/lobby_arts = CONFIG_GET(str_list/lobby_art_images) if(length(lobby_arts)) - force_lobby_art(rand(1,length(lobby_arts))) + force_lobby_art(rand(1, length(lobby_arts))) return SS_INIT_SUCCESS diff --git a/code/controllers/subsystem/sound.dm b/code/controllers/subsystem/sound.dm index 13dd6a0dddf1..3cc3f0ef8090 100644 --- a/code/controllers/subsystem/sound.dm +++ b/code/controllers/subsystem/sound.dm @@ -19,7 +19,7 @@ SUBSYSTEM_DEF(sound) if(!run_hearers) // Initialize for handling next template run_hearers = run_queue[run_template] // get base hearers if(run_template.range) // ranging - run_hearers |= SSquadtree.players_in_range(SQUARE(run_template.x, run_template.y, run_template.range), run_template.z) + run_hearers |= SSquadtree.players_in_range(SQUARE(run_template.x, run_template.y, run_template.range * 2), run_template.z) if(MC_TICK_CHECK) return while(length(run_hearers)) // Output sound to hearers diff --git a/code/controllers/subsystem/who.dm b/code/controllers/subsystem/who.dm new file mode 100644 index 000000000000..43ecbb435587 --- /dev/null +++ b/code/controllers/subsystem/who.dm @@ -0,0 +1,312 @@ +SUBSYSTEM_DEF(who) + name = "Who" + flags = SS_BACKGROUND + runlevels = RUNLEVELS_DEFAULT|RUNLEVEL_LOBBY + init_order = SS_INIT_WHO + wait = 5 SECONDS + + var/datum/player_list/who = new + var/datum/player_list/staff/staff_who = new + +/datum/controller/subsystem/who/Initialize() + who.update_data() + staff_who.update_data() + return SS_INIT_SUCCESS + +/datum/controller/subsystem/who/fire(resumed = TRUE) + who.update_data() + staff_who.update_data() + +//datum +/datum/player_list + var/tgui_name = "Who" + var/tgui_interface_name = "Who" + var/list/mobs_ckey = list() + var/list/list_data = list() + +/datum/player_list/proc/update_data() + var/list/new_list_data = list() + var/list/new_mobs_ckey = list() + var/list/additional_data = list( + "lobby" = 0, + "admin_observers" = 0, + "observers" = 0, + "yautja" = 0, + "infected_preds" = 0, + "humans" = 0, + "infected_humans" = 0, + "uscm" = 0, + "uscm_marines" = 0, + ) + new_list_data["additional_info"] = list() + var/list/counted_factions = list() + for(var/client/client as anything in sortTim(GLOB.clients, GLOBAL_PROC_REF(cmp_ckey_asc))) + CHECK_TICK + new_list_data["all_clients"]++ + var/list/client_payload = list() + client_payload["ckey"] = "[client.key]" + client_payload["text"] = "[client.key]" + client_payload["ckey_color"] = "white" + var/mob/client_mob = client.mob + new_mobs_ckey[client.key] = client_mob + if(client_mob) + if(istype(client_mob, /mob/new_player)) + client_payload["text"] += " - in Lobby" + additional_data["lobby"]++ + + else if(isobserver(client_mob)) + client_payload["text"] += " - Playing as [client_mob.real_name]" + if(CLIENT_IS_STAFF(client)) + additional_data["admin_observers"]++ + else + additional_data["observers"]++ + + var/mob/dead/observer/observer = client_mob + if(observer.started_as_observer) + client_payload["color"] += "#ce89cd" + client_payload["text"] += " - Spectating" + else + client_payload["color"] += "#A000D0" + client_payload["text"] += " - DEAD" + + else + client_payload["text"] += " - Playing as [client_mob.real_name]" + + switch(client_mob.stat) + if(UNCONSCIOUS) + client_payload["color"] += "#B0B0B0" + client_payload["text"] += " - Unconscious" + if(DEAD) + client_payload["color"] += "#A000D0" + client_payload["text"] += " - DEAD" + + if(client_mob.stat != DEAD) + if(isxeno(client_mob)) + client_payload["color"] += "#ec3535" + client_payload["text"] += " - Xenomorph" + + else if(ishuman(client_mob)) + if(client_mob.faction == FACTION_ZOMBIE) + counted_factions[FACTION_ZOMBIE]++ + client_payload["color"] += "#2DACB1" + client_payload["text"] += " - Zombie" + else if(client_mob.faction == FACTION_YAUTJA) + client_payload["color"] += "#7ABA19" + client_payload["text"] += " - Yautja" + additional_data["yautja"]++ + if(client_mob.status_flags & XENO_HOST) + additional_data["infected_preds"]++ + else + additional_data["humans"]++ + if(client_mob.status_flags & XENO_HOST) + additional_data["infected_humans"]++ + if(client_mob.faction == FACTION_MARINE) + additional_data["uscm"]++ + if(client_mob.job in (GLOB.ROLES_MARINES)) + additional_data["uscm_marines"]++ + else + counted_factions[client_mob.faction]++ + + new_list_data["total_players"] += list(client_payload) + + new_list_data["additional_info"] += list(list( + "content" = "In Lobby: [additional_data["lobby"]]", + "color" = "#777", + "text" = "Player in lobby", + )) + + new_list_data["additional_info"] += list(list( + "content" = "Spectating Players: [additional_data["observers"]]", + "color" = "#777", + "text" = "Spectating players", + )) + + new_list_data["additional_info"] += list(list( + "content" = "Spectating Admins: [additional_data["admin_observers"]]", + "color" = "#777", + "text" = "Spectating administrators", + )) + + new_list_data["additional_info"] += list(list( + "content" = "Humans: [additional_data["humans"]]", + "color" = "#2C7EFF", + "text" = "Players playing as Human", + )) + + new_list_data["additional_info"] += list(list( + "content" = "Infected Humans: [additional_data["infected_humans"]]", + "color" = "#ec3535", + "text" = "Players playing as Infected Human", + )) + + new_list_data["additional_info"] += list(list( + "content" = "[MAIN_SHIP_NAME] Personnel: [additional_data["uscm"]]", + "color" = "#5442bd", + "text" = "Players playing as [MAIN_SHIP_NAME] Personnel", + )) + + new_list_data["additional_info"] += list(list( + "content" = "Marines: [additional_data["uscm_marines"]]", + "color" = "#5442bd", + "text" = "Players playing as Marines", + )) + + new_list_data["additional_info"] += list(list( + "content" = "Yautjas: [additional_data["yautja"]]", + "color" = "#7ABA19", + "text" = "Players playing as Yautja", + )) + + new_list_data["additional_info"] += list(list( + "content" = "Infected Predators: [additional_data["infected_preds"]]", + "color" = "#7ABA19", + "text" = "Players playing as Infected Yautja", + )) + + for(var/i in 1 to length(counted_factions)) + if(counted_factions[counted_factions[i]]) + new_list_data["factions"] += list(list( + "content" = "[counted_factions[i]]: [counted_factions[counted_factions[i]]]", + "color" = "#2C7EFF", + "text" = "Other", + )) + if(counted_factions[FACTION_NEUTRAL]) + new_list_data["factions"] += list(list( + "content" = "[FACTION_NEUTRAL] Humans: [counted_factions[FACTION_NEUTRAL]]", + "color" = "#688944", + "text" = "Neutrals", + )) + + for(var/faction_to_get in ALL_XENO_HIVES) + var/datum/hive_status/hive = GLOB.hive_datum[faction_to_get] + if(hive && length(hive.totalXenos)) + new_list_data["xenomorphs"] += list(list( + "content" = "[hive.name]: [length(hive.totalXenos)]", + "color" = hive.color ? hive.color : "#8200FF", + "text" = "Queen: [hive.living_xeno_queen ? "Alive" : "Dead"]", + )) + + list_data = new_list_data + mobs_ckey = new_mobs_ckey + +/datum/player_list/tgui_interact(mob/user, datum/tgui/ui) + ui = SStgui.try_update_ui(user, src, ui) + if(!ui) + ui = new(user, src, tgui_name, tgui_interface_name) + ui.open() + ui.set_autoupdate(TRUE) + +/datum/player_list/ui_data(mob/user) + . = list_data + +/datum/player_list/ui_static_data(mob/user) + . = list() + + .["admin"] = CLIENT_IS_STAFF(user.client) + +/datum/player_list/ui_act(action, list/params, datum/tgui/ui, datum/ui_state/state) + . = ..() + if(.) + return + + switch(action) + if("get_player_panel") + if(mobs_ckey[params["ckey"]]) + GLOB.admin_datums[usr.client.ckey].show_player_panel(mobs_ckey[params["ckey"]]) + +/datum/player_list/ui_status(mob/user, datum/ui_state/state) + return UI_INTERACTIVE + + +/datum/player_list/staff + tgui_name = "StaffWho" + tgui_interface_name = "Staff Who" + + var/list/category_colors = list( + "Management" = "purple", + "Maintainers" = "blue", + "Administrators" = "red", + "Moderators" = "orange", + "Mentors" = "green" + ) + +/datum/player_list/staff/update_data() + var/list/new_list_data = list() + mobs_ckey = list() + + var/list/listings + var/list/mappings + if(CONFIG_GET(flag/show_manager)) + LAZYSET(mappings, "Management", R_PERMISSIONS) + if(CONFIG_GET(flag/show_devs)) + LAZYSET(mappings, "Maintainers", R_PROFILER) + LAZYSET(mappings, "Administrators", R_ADMIN) + if(CONFIG_GET(flag/show_mods)) + LAZYSET(mappings, "Moderators", R_MOD && R_BAN) + if(CONFIG_GET(flag/show_mentors)) + LAZYSET(mappings, "Mentors", R_MENTOR) + + for(var/category in mappings) + LAZYSET(listings, category, list()) + + for(var/client/client as anything in GLOB.admins) + if(client.admin_holder?.fakekey && !CLIENT_IS_STAFF(client)) + continue + + for(var/category in mappings) + if(CLIENT_HAS_RIGHTS(client, mappings[category])) + LAZYADD(listings[category], client) + break + + for(var/category in listings) + var/list/admins = list() + for(var/client/entry as anything in listings[category]) + var/list/admin = list() + var/rank = entry.admin_holder.rank + if(entry.admin_holder.extra_titles?.len) + for(var/srank in entry.admin_holder.extra_titles) + rank += " & [srank]" + + admin["content"] = "[entry.key] ([rank])" + admin["text"] = "" + + if(entry.admin_holder?.fakekey) + admin["text"] += " (HIDDEN)" + + if(istype(entry.mob, /mob/dead/observer)) + admin["color"] = "#808080" + admin["text"] += " Spectating" + + else if(istype(entry.mob, /mob/new_player)) + admin["color"] = "#688944" + admin["text"] += " in Lobby" + else + admin["color"] = "#688944" + admin["text"] += " Playing" + + if(entry.is_afk()) + admin["color"] = "#A040D0" + admin["text"] += " (AFK)" + + admins += list(admin) + + new_list_data["administrators"] += list(list( + "category" = category, + "category_color" = category_colors[category], + "category_administrators" = length(listings[category]), + "admins" = admins, + )) + + list_data = new_list_data + +/mob/verb/who() + set category = "OOC" + set name = "Who" + + SSwho.who.tgui_interact(src) + +/mob/verb/staffwho() + set category = "Admin" + set name = "StaffWho" + + SSwho.staff_who.tgui_interact(src) diff --git a/code/datums/action.dm b/code/datums/action.dm index 8dbf6c9df5a5..e6c87eca6a0d 100644 --- a/code/datums/action.dm +++ b/code/datums/action.dm @@ -187,12 +187,6 @@ holder_item = null return ..() -/datum/action/item_action/action_activate() - . = ..() - if(target) - var/obj/item/I = target - I.ui_action_click(owner, holder_item) - /datum/action/item_action/can_use_action() if(ishuman(owner) && !owner.is_mob_incapacitated()) var/mob/living/carbon/human/human = owner @@ -213,6 +207,17 @@ name = "Toggle [target]" button.name = name +/datum/action/item_action/toggle/action_activate() + . = ..() + if(target) + var/obj/item/I = target + I.ui_action_click(owner, holder_item) + +/datum/action/item_action/toggle/use/New(target) + . = ..() + name = "Use [target]" + button.name = name + //This is the proc used to update all the action buttons. /mob/proc/update_action_buttons(reload_screen) if(!client) diff --git a/code/datums/ammo/ammo.dm b/code/datums/ammo/ammo.dm index 022909691cfc..587ffd805b6c 100644 --- a/code/datums/ammo/ammo.dm +++ b/code/datums/ammo/ammo.dm @@ -173,6 +173,10 @@ living_mob.apply_stamina_damage(fired_projectile.ammo.damage, fired_projectile.def_zone, ARMOR_BULLET) /datum/ammo/proc/slowdown(mob/living/living_mob, obj/projectile/fired_projectile) + if(isxeno(living_mob)) + var/mob/living/carbon/xenomorph/xeno = living_mob + if(xeno.caste.tier > 2 || (xeno.caste.tier == 0 && xeno.mob_size >= MOB_SIZE_BIG)) + return //tier 3 and big tier 0 (like queen) are not affected if(iscarbonsizexeno(living_mob)) var/mob/living/carbon/xenomorph/target = living_mob target.apply_effect(1, SUPERSLOW) diff --git a/code/datums/ammo/bullet/pistol.dm b/code/datums/ammo/bullet/pistol.dm index ced951241754..8b5239ba9127 100644 --- a/code/datums/ammo/bullet/pistol.dm +++ b/code/datums/ammo/bullet/pistol.dm @@ -180,12 +180,12 @@ headshot_state = HEADSHOT_OVERLAY_MEDIUM debilitate = list(0,0,0,0,0,0,0,2) - effective_range_max = 3 + effective_range_max = 6 accuracy = HIT_ACCURACY_TIER_4 damage = 45 penetration= ARMOR_PENETRATION_TIER_6 shrapnel_chance = SHRAPNEL_CHANCE_TIER_2 - damage_falloff = DAMAGE_FALLOFF_TIER_6 //"VP78 - the only pistol viable as a primary."-Vampmare, probably. + damage_falloff = DAMAGE_FALLOFF_TIER_6 /datum/ammo/bullet/pistol/squash/toxin name = "toxic squash-head pistol bullet" diff --git a/code/datums/ammo/misc.dm b/code/datums/ammo/misc.dm index 9a9ed2fb505b..28610f283df2 100644 --- a/code/datums/ammo/misc.dm +++ b/code/datums/ammo/misc.dm @@ -49,10 +49,21 @@ drop_flame(get_turf(P), P.weapon_cause_data) /datum/ammo/flamethrower/tank_flamer - flamer_reagent_id = "napalmx" - + flamer_reagent_id = "highdamagenapalm" max_range = 8 +/datum/ammo/flamethrower/tank_flamer/drop_flame(turf/turf, datum/cause_data/cause_data) + if(!istype(turf)) + return + + var/datum/reagent/napalm/high_damage/reagent = new() + new /obj/flamer_fire(turf, cause_data, reagent, 1) + + var/datum/effect_system/smoke_spread/landingsmoke = new /datum/effect_system/smoke_spread + landingsmoke.set_up(1, 0, turf, null, 4, cause_data) + landingsmoke.start() + landingsmoke = null + /datum/ammo/flamethrower/sentry_flamer flags_ammo_behavior = AMMO_IGNORE_ARMOR|AMMO_IGNORE_COVER|AMMO_FLAME flamer_reagent_id = "napalmx" diff --git a/code/datums/autocells/explosion.dm b/code/datums/autocells/explosion.dm index ecc6f9925800..ec310e80367c 100644 --- a/code/datums/autocells/explosion.dm +++ b/code/datums/autocells/explosion.dm @@ -264,7 +264,9 @@ as having entered the turf. falloff = max(falloff, power/100) - msg_admin_attack("Explosion with Power: [power], Falloff: [falloff], Shape: [falloff_shape] in [epicenter.loc.name] ([epicenter.x],[epicenter.y],[epicenter.z]).", epicenter.x, epicenter.y, epicenter.z) + var/obj/causing_obj = explosion_cause_data?.resolve_cause() + var/mob/causing_mob = explosion_cause_data?.resolve_mob() + msg_admin_attack("Explosion with Power: [power], Falloff: [falloff], Shape: [falloff_shape],[causing_obj ? " from [causing_obj]" : ""][causing_mob ? " by [key_name(causing_mob)]" : ""] in [epicenter.loc.name] ([epicenter.x],[epicenter.y],[epicenter.z]).", epicenter.x, epicenter.y, epicenter.z) playsound(epicenter, 'sound/effects/explosionfar.ogg', 100, 1, round(power^2,1)) diff --git a/code/datums/components/bonus_damage_stack.dm b/code/datums/components/bonus_damage_stack.dm index 78da5e036ce4..7a9bf5aa9560 100644 --- a/code/datums/components/bonus_damage_stack.dm +++ b/code/datums/components/bonus_damage_stack.dm @@ -60,7 +60,7 @@ var/color = COLOR_BONUS_DAMAGE var/intensity = bonus_damage_stacks / (initial(bonus_damage_cap) * 2) // if intensity is too high of a value, the hex code will become invalid - color += num2text(BONUS_DAMAGE_MAX_ALPHA * clamp(intensity, 0, 0.5), 1, 16) + color += num2text(BONUS_DAMAGE_MAX_ALPHA * clamp(intensity, 0, 0.5), 2, 16) if(parent) var/atom/A = parent A.add_filter("bonus_damage_stacks", 2, list("type" = "outline", "color" = color, "size" = 1 + clamp(intensity, 0, 1))) diff --git a/code/datums/datacore.dm b/code/datums/datacore.dm index ca4eca8a1a49..e10096059bda 100644 --- a/code/datums/datacore.dm +++ b/code/datums/datacore.dm @@ -6,6 +6,8 @@ GLOBAL_DATUM_INIT(data_core, /datum/datacore, new) var/security[] = list() //This list tracks characters spawned in the world and cannot be modified in-game. Currently referenced by respawn_character(). var/locked[] = list() + var/leveled_riflemen = 0 + var/leveled_riflemen_max = 7 /datum/datacore/proc/get_manifest(monochrome, OOC, nonHTML) var/list/cic = GLOB.ROLES_CIC.Copy() diff --git a/code/datums/elements/strippable.dm b/code/datums/elements/strippable.dm index e0daaee74a8c..d93b07234c9d 100644 --- a/code/datums/elements/strippable.dm +++ b/code/datums/elements/strippable.dm @@ -126,6 +126,14 @@ to_chat(user, SPAN_WARNING("You can't do this right now.")) return FALSE + if (user.is_mob_incapacitated()) + to_chat(user, SPAN_WARNING("You can't do this right now.")) + return FALSE + + if (HAS_TRAIT(user, TRAIT_IMMOBILIZED) || HAS_TRAIT(user, TRAIT_FLOORED)) + to_chat(user, SPAN_WARNING("You can't do this right now.")) + return FALSE + if ((item.flags_inventory & CANTSTRIP) || ((item.flags_item & NODROP) && !(item.flags_item & FORCEDROP_CONDITIONAL)) || (item.flags_item & ITEM_ABSTRACT)) return FALSE diff --git a/code/datums/emergency_calls/cryo_spec.dm b/code/datums/emergency_calls/cryo_spec.dm index 8d563b0693f8..945ab474d4c9 100644 --- a/code/datums/emergency_calls/cryo_spec.dm +++ b/code/datums/emergency_calls/cryo_spec.dm @@ -8,6 +8,16 @@ shuttle_id = "" spawn_max_amount = TRUE +/datum/emergency_call/cryo_spec/remove_nonqualifiers(list/datum/mind/candidates_list) + var/list/datum/mind/candidates_clean = list() + for(var/datum/mind/single_candidate in candidates_list) + if(check_timelock(single_candidate.current?.client, JOB_SQUAD_ROLES_LIST, time_required_for_job)) + candidates_clean.Add(single_candidate) + continue + if(single_candidate.current) + to_chat(single_candidate.current, SPAN_WARNING("You didn't qualify for the ERT beacon because you don't have the specialist job unlocked!")) + return candidates_clean + /datum/emergency_call/cryo_spec/create_member(datum/mind/mind, turf/override_spawn_loc) set waitfor = FALSE if(SSmapping.configs[GROUND_MAP].map_name == MAP_WHISKEY_OUTPOST) diff --git a/code/datums/emergency_calls/emergency_call.dm b/code/datums/emergency_calls/emergency_call.dm index 99b31ab41f19..885844b6ec2e 100644 --- a/code/datums/emergency_calls/emergency_call.dm +++ b/code/datums/emergency_calls/emergency_call.dm @@ -224,11 +224,15 @@ addtimer(CALLBACK(src, TYPE_PROC_REF(/datum/emergency_call, spawn_candidates), quiet_launch, announce_incoming, override_spawn_loc), 30 SECONDS) +/datum/emergency_call/proc/remove_nonqualifiers(list/datum/mind/candidates_list) + return candidates_list //everyone gets selected on 99% of distress beacons. + /datum/emergency_call/proc/spawn_candidates(quiet_launch = FALSE, announce_incoming = TRUE, override_spawn_loc) if(SSticker.mode) SSticker.mode.picked_calls -= src SEND_SIGNAL(src, COMSIG_ERT_SETUP) + candidates = remove_nonqualifiers(candidates) if(length(candidates) < mob_min && !spawn_max_amount) message_admins("Aborting distress beacon, not enough candidates: found [length(candidates)].") diff --git a/code/datums/emergency_calls/inspection.dm b/code/datums/emergency_calls/inspection.dm index e473466f4fb8..4a1a8ecb62be 100644 --- a/code/datums/emergency_calls/inspection.dm +++ b/code/datums/emergency_calls/inspection.dm @@ -1,6 +1,6 @@ //USCM Provost /datum/emergency_call/inspection_provost - name = "Inspection - USCM Provost - ML knowledge required." + name = "Inspection - USCM Provost - ML knowledge and MP playtime required." mob_max = 2 mob_min = 1 probability = 0 @@ -9,6 +9,15 @@ ..() objectives = "Investigate any issues with ML enforcement on the [MAIN_SHIP_NAME]." +/datum/emergency_call/inspection_provost/remove_nonqualifiers(list/datum/mind/candidates_list) + var/list/datum/mind/candidates_clean = list() + for(var/datum/mind/single_candidate in candidates_list) + if(check_timelock(single_candidate.current?.client, JOB_POLICE, time_required_for_job)) + candidates_clean.Add(single_candidate) + continue + if(single_candidate.current) + to_chat(single_candidate.current, SPAN_WARNING("You didn't qualify for the ERT beacon because you don't have enough playtime (5 Hours) as military police!")) + return candidates_clean /datum/emergency_call/inspection_provost/create_member(datum/mind/M, turf/override_spawn_loc) var/turf/T = override_spawn_loc ? override_spawn_loc : get_spawn_point() diff --git a/code/datums/looping_sounds/misc_sounds.dm b/code/datums/looping_sounds/misc_sounds.dm index 6411b3f51f4a..318ac7b331b7 100644 --- a/code/datums/looping_sounds/misc_sounds.dm +++ b/code/datums/looping_sounds/misc_sounds.dm @@ -1,3 +1,24 @@ /datum/looping_sound/looping_launch_announcement_alarm mid_sounds = list('sound/vehicles/Dropships/single_alarm_brr_dropship_1.ogg' = 1) start_sound = list('sound/vehicles/Dropships/single_alarm_brr_dropship_1.ogg' = 1) + +/datum/looping_sound/telephone/ring + start_sound = 'sound/machines/telephone/dial.ogg' + start_length = 3.2 SECONDS + mid_sounds = 'sound/machines/telephone/ring_outgoing.ogg' + mid_length = 2.1 SECONDS + volume = 10 + +/datum/looping_sound/telephone/busy + start_sound = 'sound/voice/callstation_unavailable.ogg' + start_length = 5.7 SECONDS + mid_sounds = 'sound/machines/telephone/phone_busy.ogg' + mid_length = 5 SECONDS + volume = 15 + +/datum/looping_sound/telephone/hangup + start_sound = 'sound/machines/telephone/remote_hangup.ogg' + start_length = 0.6 SECONDS + mid_sounds = 'sound/machines/telephone/phone_busy.ogg' + mid_length = 5 SECONDS + volume = 15 diff --git a/code/datums/mob_hud.dm b/code/datums/mob_hud.dm index 603f9a05d702..011dc8e25dba 100644 --- a/code/datums/mob_hud.dm +++ b/code/datums/mob_hud.dm @@ -408,7 +408,6 @@ GLOBAL_LIST_INIT_TYPED(huds, /datum/mob_hud, list( var/revive_enabled = stat == DEAD && check_tod() && is_revivable() if(stat == DEAD) revive_enabled = check_tod() && is_revivable() - var/datum/internal_organ/heart/heart = islist(internal_organs_by_name) ? internal_organs_by_name["heart"] : null var/holder2_set = 0 if(hivenumber) @@ -475,7 +474,7 @@ GLOBAL_LIST_INIT_TYPED(huds, /datum/mob_hud, list( holder3.icon_state = "huddead" holder2_set = 1 else - if(heart && (heart.organ_status >= ORGAN_BROKEN && check_tod())) // broken heart icon + if(is_heart_broken()) // broken heart icon holder.icon_state = "huddeadheart" if(!holder2_set) holder2.icon_state = "huddeadheart" @@ -784,7 +783,7 @@ GLOBAL_DATUM(hud_icon_hudfocus, /image) // Vampire Execute HUD /mob/living/carbon/human/proc/update_execute_hud() var/image/execute_holder = hud_list[XENO_EXECUTE] - + execute_holder.icon_state = "hudblank" execute_holder.overlays.Cut() diff --git a/code/datums/quadtree.dm b/code/datums/quadtree.dm index 200a51b358a0..9056dfd6bd59 100644 --- a/code/datums/quadtree.dm +++ b/code/datums/quadtree.dm @@ -82,7 +82,7 @@ /// Returns TRUE if this shape's bounding box intersects the provided shape's bounding box, otherwise FALSE. Generally faster than a full intersection test. /datum/shape/proc/intersects_aabb(datum/shape/aabb) - return (abs(src.center_x - aabb.center_x) <= (src.bounds_x + aabb.bounds_x) * 0.5) && (abs(src.center_y - aabb.center_y) <= (src.bounds_x + aabb.bounds_x) * 0.5) + return (abs(src.center_x - aabb.center_x) <= (src.bounds_x + aabb.bounds_x) * 0.5) && (abs(src.center_y - aabb.center_y) <= (src.bounds_y + aabb.bounds_y) * 0.5) /// Returns TRUE if this shape intersects the provided rectangle shape, otherwise FALSE. /datum/shape/proc/intersects_rect(datum/shape/rectangle/rect) diff --git a/code/datums/skills/civilian.dm b/code/datums/skills/civilian.dm index 0ff13ae67225..ff9cadf02913 100644 --- a/code/datums/skills/civilian.dm +++ b/code/datums/skills/civilian.dm @@ -20,7 +20,7 @@ CIVILIAN SKILL_LEADERSHIP = SKILL_LEAD_MASTER, SKILL_OVERWATCH = SKILL_OVERWATCH_TRAINED, SKILL_MEDICAL = SKILL_MEDICAL_TRAINED, - SKILL_ENGINEER = SKILL_ENGINEER_TRAINED, + SKILL_ENGINEER = SKILL_ENGINEER_NOVICE, SKILL_VEHICLE = SKILL_VEHICLE_SMALL, SKILL_INTEL = SKILL_INTEL_EXPERT, ) @@ -31,7 +31,7 @@ CIVILIAN SKILL_CQC = SKILL_CQC_DEFAULT, SKILL_FIREMAN = SKILL_FIREMAN_TRAINED, SKILL_ENDURANCE = SKILL_ENDURANCE_TRAINED, - SKILL_ENGINEER = SKILL_ENGINEER_ENGI, //The ASRS consoles + SKILL_ENGINEER = SKILL_ENGINEER_TRAINED, //The ASRS consoles SKILL_FIREARMS = SKILL_FIREARMS_CIVILIAN, SKILL_POLICE = SKILL_POLICE_SKILLED, //The CMB Tradeband Compliance Device ) @@ -43,7 +43,7 @@ CIVILIAN SKILL_LEADERSHIP = SKILL_LEAD_MASTER, SKILL_OVERWATCH = SKILL_OVERWATCH_TRAINED, SKILL_MEDICAL = SKILL_MEDICAL_TRAINED, - SKILL_ENGINEER = SKILL_ENGINEER_TRAINED, + SKILL_ENGINEER = SKILL_ENGINEER_NOVICE, SKILL_VEHICLE = SKILL_VEHICLE_SMALL, SKILL_POLICE = SKILL_POLICE_SKILLED, SKILL_FIREMAN = SKILL_FIREMAN_SKILLED, @@ -115,7 +115,7 @@ CIVILIAN SKILL_ENDURANCE = SKILL_ENDURANCE_SURVIVOR, SKILL_FIREARMS = SKILL_FIREARMS_EXPERT, SKILL_VEHICLE = SKILL_VEHICLE_SMALL, - SKILL_ENGINEER = SKILL_ENGINEER_ENGI, + SKILL_ENGINEER = SKILL_ENGINEER_TRAINED, SKILL_CONSTRUCTION = SKILL_CONSTRUCTION_ENGI, SKILL_POWERLOADER = SKILL_POWERLOADER_MASTER, ) @@ -131,7 +131,7 @@ CIVILIAN /datum/skills/civilian/survivor/clf name = "Survivor CLF" additional_skills = list( - SKILL_ENGINEER = SKILL_ENGINEER_TRAINED, + SKILL_ENGINEER = SKILL_ENGINEER_NOVICE, SKILL_MEDICAL = SKILL_MEDICAL_TRAINED, SKILL_VEHICLE = SKILL_VEHICLE_SMALL, SKILL_FIREMAN = SKILL_FIREMAN_SKILLED, @@ -158,7 +158,7 @@ CIVILIAN name = "Survivor Miner" additional_skills = list( SKILL_FIREMAN = SKILL_FIREMAN_TRAINED, - SKILL_ENGINEER = SKILL_ENGINEER_TRAINED, + SKILL_ENGINEER = SKILL_ENGINEER_NOVICE, SKILL_POWERLOADER = SKILL_POWERLOADER_MASTER, SKILL_VEHICLE = SKILL_VEHICLE_SMALL, ) @@ -167,7 +167,7 @@ CIVILIAN name = "Survivor Trucker" additional_skills = list( SKILL_FIREMAN = SKILL_FIREMAN_TRAINED, - SKILL_ENGINEER = SKILL_ENGINEER_ENGI, + SKILL_ENGINEER = SKILL_ENGINEER_TRAINED, SKILL_CONSTRUCTION = SKILL_CONSTRUCTION_ENGI, SKILL_VEHICLE = SKILL_VEHICLE_CREWMAN, ) @@ -176,7 +176,7 @@ CIVILIAN name = "Survivor Engineer" additional_skills = list( SKILL_FIREMAN = SKILL_FIREMAN_TRAINED, - SKILL_ENGINEER = SKILL_ENGINEER_ENGI, + SKILL_ENGINEER = SKILL_ENGINEER_TRAINED, SKILL_CONSTRUCTION = SKILL_CONSTRUCTION_ENGI, SKILL_POWERLOADER = SKILL_POWERLOADER_MASTER, SKILL_VEHICLE = SKILL_VEHICLE_SMALL, @@ -192,7 +192,7 @@ CIVILIAN /datum/skills/civilian/survivor/marshal name = "Survivor Marshal" skills = list( - SKILL_ENGINEER = SKILL_ENGINEER_ENGI, + SKILL_ENGINEER = SKILL_ENGINEER_TRAINED, SKILL_MELEE_WEAPONS = SKILL_MELEE_TRAINED, SKILL_CONSTRUCTION = SKILL_CONSTRUCTION_TRAINED, SKILL_MEDICAL = SKILL_MEDICAL_TRAINED, @@ -201,7 +201,7 @@ CIVILIAN SKILL_FIREARMS = SKILL_FIREARMS_TRAINED, SKILL_POLICE = SKILL_POLICE_SKILLED, SKILL_FIREMAN = SKILL_FIREMAN_SKILLED, - SKILL_ENGINEER = SKILL_ENGINEER_TRAINED, + SKILL_ENGINEER = SKILL_ENGINEER_NOVICE, SKILL_CQC = SKILL_CQC_SKILLED, SKILL_FIREARMS = SKILL_FIREARMS_TRAINED, ) diff --git a/code/datums/skills/clf.dm b/code/datums/skills/clf.dm index 88aa14a41f79..64a8864d3c51 100644 --- a/code/datums/skills/clf.dm +++ b/code/datums/skills/clf.dm @@ -12,7 +12,7 @@ COLONIAL LIBERATION FRONT SKILL_POLICE = SKILL_POLICE_SKILLED, SKILL_FIREMAN = SKILL_FIREMAN_TRAINED, SKILL_CONSTRUCTION = SKILL_CONSTRUCTION_TRAINED, - SKILL_ENGINEER = SKILL_ENGINEER_TRAINED, + SKILL_ENGINEER = SKILL_ENGINEER_NOVICE, SKILL_MEDICAL = SKILL_MEDICAL_TRAINED, SKILL_VEHICLE = SKILL_VEHICLE_SMALL, SKILL_ENDURANCE = SKILL_ENDURANCE_WEAK, @@ -24,7 +24,7 @@ COLONIAL LIBERATION FRONT skills = list( SKILL_FIREMAN = SKILL_FIREMAN_TRAINED, SKILL_CONSTRUCTION = SKILL_CONSTRUCTION_ENGI, - SKILL_ENGINEER = SKILL_ENGINEER_ENGI, + SKILL_ENGINEER = SKILL_ENGINEER_TRAINED, SKILL_MEDICAL = SKILL_MEDICAL_TRAINED, SKILL_POWERLOADER = SKILL_POWERLOADER_TRAINED, SKILL_VEHICLE = SKILL_VEHICLE_SMALL, @@ -48,7 +48,7 @@ COLONIAL LIBERATION FRONT skills = list( SKILL_MEDICAL = SKILL_MEDICAL_TRAINED, SKILL_CQC = SKILL_CQC_TRAINED, - SKILL_ENGINEER = SKILL_ENGINEER_TRAINED, //to use c4 in demo set. + SKILL_ENGINEER = SKILL_ENGINEER_NOVICE, //to use c4 in demo set. SKILL_LEADERSHIP = SKILL_LEAD_TRAINED, SKILL_SPEC_WEAPONS = SKILL_SPEC_ALL, SKILL_ENDURANCE = SKILL_ENDURANCE_TRAINED, @@ -60,7 +60,7 @@ COLONIAL LIBERATION FRONT name = "CLF Leader" skills = list( SKILL_FIREARMS = SKILL_FIREARMS_TRAINED, - SKILL_ENGINEER = SKILL_ENGINEER_ENGI, // to use their C4 + SKILL_ENGINEER = SKILL_ENGINEER_TRAINED, // to use their C4 SKILL_CQC = SKILL_CQC_SKILLED, SKILL_LEADERSHIP = SKILL_LEAD_EXPERT, SKILL_OVERWATCH = SKILL_OVERWATCH_TRAINED, @@ -78,7 +78,7 @@ COLONIAL LIBERATION FRONT name = "CLF Cell Commander" skills = list( SKILL_FIREARMS = SKILL_FIREARMS_EXPERT, - SKILL_ENGINEER = SKILL_ENGINEER_ENGI, + SKILL_ENGINEER = SKILL_ENGINEER_TRAINED, SKILL_CQC = SKILL_CQC_SKILLED, SKILL_LEADERSHIP = SKILL_LEAD_MASTER, SKILL_OVERWATCH = SKILL_OVERWATCH_TRAINED, diff --git a/code/datums/skills/cmb.dm b/code/datums/skills/cmb.dm index b29a4c314567..8fa7ca4dd892 100644 --- a/code/datums/skills/cmb.dm +++ b/code/datums/skills/cmb.dm @@ -26,7 +26,7 @@ COLONIAL MARSHALS SKILL_LEADERSHIP = SKILL_LEAD_MASTER, SKILL_OVERWATCH = SKILL_OVERWATCH_TRAINED, SKILL_MEDICAL = SKILL_MEDICAL_MEDIC, - SKILL_ENGINEER = SKILL_ENGINEER_ENGI, + SKILL_ENGINEER = SKILL_ENGINEER_TRAINED, SKILL_FIREMAN = SKILL_FIREMAN_MASTER, SKILL_FIREARMS = SKILL_FIREARMS_MAX, SKILL_MELEE_WEAPONS = SKILL_MELEE_TRAINED, diff --git a/code/datums/skills/commando.dm b/code/datums/skills/commando.dm index ed5e5ee086e4..5133cb0e55ea 100644 --- a/code/datums/skills/commando.dm +++ b/code/datums/skills/commando.dm @@ -9,7 +9,7 @@ SPEC-OPS skills = list( SKILL_CQC = SKILL_CQC_EXPERT, SKILL_FIREMAN = SKILL_FIREMAN_SKILLED, - SKILL_ENGINEER = SKILL_ENGINEER_ENGI, + SKILL_ENGINEER = SKILL_ENGINEER_TRAINED, SKILL_CONSTRUCTION = SKILL_CONSTRUCTION_ENGI, SKILL_FIREARMS = SKILL_FIREARMS_EXPERT, SKILL_MEDICAL = SKILL_MEDICAL_TRAINED, @@ -24,7 +24,7 @@ SPEC-OPS skills = list( SKILL_CQC = SKILL_CQC_EXPERT, SKILL_FIREMAN = SKILL_FIREMAN_SKILLED, - SKILL_ENGINEER = SKILL_ENGINEER_ENGI, + SKILL_ENGINEER = SKILL_ENGINEER_TRAINED, SKILL_CONSTRUCTION = SKILL_CONSTRUCTION_ENGI, SKILL_FIREARMS = SKILL_FIREARMS_EXPERT, SKILL_MEDICAL = SKILL_MEDICAL_MEDIC, @@ -40,7 +40,7 @@ SPEC-OPS skills = list( SKILL_CQC = SKILL_CQC_EXPERT, SKILL_FIREMAN = SKILL_FIREMAN_SKILLED, - SKILL_ENGINEER = SKILL_ENGINEER_ENGI, + SKILL_ENGINEER = SKILL_ENGINEER_TRAINED, SKILL_CONSTRUCTION = SKILL_CONSTRUCTION_ENGI, SKILL_FIREARMS = SKILL_FIREARMS_EXPERT, SKILL_LEADERSHIP = SKILL_LEAD_TRAINED, @@ -56,7 +56,7 @@ SPEC-OPS skills = list( SKILL_CQC = SKILL_CQC_MASTER, SKILL_FIREMAN = SKILL_FIREMAN_SKILLED, - SKILL_ENGINEER = SKILL_ENGINEER_ENGI, + SKILL_ENGINEER = SKILL_ENGINEER_TRAINED, SKILL_CONSTRUCTION = SKILL_CONSTRUCTION_ENGI, SKILL_FIREARMS = SKILL_FIREARMS_EXPERT, SKILL_MEDICAL = SKILL_MEDICAL_MEDIC, @@ -71,7 +71,7 @@ SPEC-OPS skills = list( SKILL_CQC = SKILL_CQC_MASTER, SKILL_FIREMAN = SKILL_FIREMAN_MASTER, - SKILL_ENGINEER = SKILL_ENGINEER_ENGI, + SKILL_ENGINEER = SKILL_ENGINEER_TRAINED, SKILL_CONSTRUCTION = SKILL_CONSTRUCTION_ENGI, SKILL_FIREARMS = SKILL_FIREARMS_EXPERT, SKILL_LEADERSHIP = SKILL_LEAD_TRAINED, @@ -87,7 +87,7 @@ SPEC-OPS skills = list( SKILL_CQC = SKILL_CQC_MASTER, SKILL_FIREMAN = SKILL_FIREMAN_MASTER, - SKILL_ENGINEER = SKILL_ENGINEER_ENGI, + SKILL_ENGINEER = SKILL_ENGINEER_TRAINED, SKILL_CONSTRUCTION = SKILL_CONSTRUCTION_ENGI, SKILL_FIREARMS = SKILL_FIREARMS_EXPERT, SKILL_LEADERSHIP = SKILL_LEAD_EXPERT, @@ -105,7 +105,7 @@ SPEC-OPS SKILL_CQC = SKILL_CQC_TRAINED, SKILL_FIREMAN = SKILL_FIREMAN_TRAINED, SKILL_FIREARMS = SKILL_FIREARMS_EXPERT, - SKILL_ENGINEER = SKILL_ENGINEER_ENGI, + SKILL_ENGINEER = SKILL_ENGINEER_TRAINED, SKILL_CONSTRUCTION = SKILL_CONSTRUCTION_ENGI, SKILL_MEDICAL = SKILL_MEDICAL_TRAINED, SKILL_POWERLOADER = SKILL_POWERLOADER_MASTER, diff --git a/code/datums/skills/contractor.dm b/code/datums/skills/contractor.dm index 183e95c941f5..5e079e5664d4 100644 --- a/code/datums/skills/contractor.dm +++ b/code/datums/skills/contractor.dm @@ -7,7 +7,7 @@ CONTRACTORS name = "Contractor Standard" skills = list( SKILL_CQC = SKILL_CQC_TRAINED, - SKILL_ENGINEER = SKILL_ENGINEER_TRAINED, + SKILL_ENGINEER = SKILL_ENGINEER_NOVICE, SKILL_CONSTRUCTION = SKILL_CONSTRUCTION_TRAINED, SKILL_FIREARMS = SKILL_FIREARMS_MAX, SKILL_POLICE = SKILL_POLICE_SKILLED, @@ -22,7 +22,7 @@ CONTRACTORS /datum/skills/contractor/leader name = "Contractor Leader" skills = list( - SKILL_ENGINEER = SKILL_ENGINEER_ENGI, + SKILL_ENGINEER = SKILL_ENGINEER_TRAINED, SKILL_FIREARMS = SKILL_FIREARMS_MAX, SKILL_CONSTRUCTION = SKILL_CONSTRUCTION_ENGI, SKILL_LEADERSHIP = SKILL_LEAD_MASTER, @@ -45,7 +45,7 @@ CONTRACTORS SKILL_POLICE = SKILL_POLICE_SKILLED, SKILL_FIREMAN = SKILL_FIREMAN_SKILLED, SKILL_CONSTRUCTION = SKILL_CONSTRUCTION_TRAINED, - SKILL_ENGINEER = SKILL_ENGINEER_TRAINED, + SKILL_ENGINEER = SKILL_ENGINEER_NOVICE, SKILL_MEDICAL = SKILL_MEDICAL_DOCTOR, SKILL_SURGERY = SKILL_SURGERY_TRAINED, SKILL_VEHICLE = SKILL_VEHICLE_LARGE, @@ -76,7 +76,7 @@ CONTRACTORS name = "Contractor Machinegunner" skills = list( SKILL_CQC = SKILL_CQC_TRAINED, - SKILL_ENGINEER = SKILL_ENGINEER_TRAINED, + SKILL_ENGINEER = SKILL_ENGINEER_NOVICE, SKILL_CONSTRUCTION = SKILL_CONSTRUCTION_TRAINED, SKILL_FIREARMS = SKILL_FIREARMS_MAX, SKILL_POLICE = SKILL_POLICE_SKILLED, diff --git a/code/datums/skills/dutch.dm b/code/datums/skills/dutch.dm index 4f19233e66d0..ec550f8e2bdf 100644 --- a/code/datums/skills/dutch.dm +++ b/code/datums/skills/dutch.dm @@ -4,7 +4,7 @@ SKILL_CQC = SKILL_CQC_MASTER, SKILL_FIREMAN = SKILL_FIREMAN_MAX, SKILL_MELEE_WEAPONS = SKILL_MELEE_MAX, - SKILL_ENGINEER = SKILL_ENGINEER_ENGI, + SKILL_ENGINEER = SKILL_ENGINEER_TRAINED, SKILL_CONSTRUCTION = SKILL_CONSTRUCTION_ENGI, SKILL_FIREARMS = SKILL_FIREARMS_EXPERT, SKILL_LEADERSHIP = SKILL_LEAD_MASTER, @@ -20,7 +20,7 @@ name = "Dutch's Dozen Mercenary" skills = list( SKILL_CQC = SKILL_CQC_TRAINED, - SKILL_ENGINEER = SKILL_ENGINEER_ENGI, + SKILL_ENGINEER = SKILL_ENGINEER_TRAINED, SKILL_CONSTRUCTION = SKILL_CONSTRUCTION_ENGI, SKILL_FIREARMS = SKILL_FIREARMS_EXPERT, SKILL_MEDICAL = SKILL_MEDICAL_TRAINED, @@ -35,7 +35,7 @@ name = "Dutch's Dozen Medic" skills = list( SKILL_CQC = SKILL_CQC_TRAINED, - SKILL_ENGINEER = SKILL_ENGINEER_ENGI, + SKILL_ENGINEER = SKILL_ENGINEER_TRAINED, SKILL_CONSTRUCTION = SKILL_CONSTRUCTION_TRAINED, SKILL_FIREARMS = SKILL_FIREARMS_EXPERT, SKILL_MEDICAL = SKILL_MEDICAL_DOCTOR, diff --git a/code/datums/skills/forecon.dm b/code/datums/skills/forecon.dm index 724a49ee98ca..aef187ce05dd 100644 --- a/code/datums/skills/forecon.dm +++ b/code/datums/skills/forecon.dm @@ -8,7 +8,7 @@ MILITARY SURVIVORS /datum/skills/military/survivor/forecon_standard name = "Reconnaissance Rifleman" skills = list( - SKILL_ENGINEER = SKILL_ENGINEER_ENGI, + SKILL_ENGINEER = SKILL_ENGINEER_TRAINED, SKILL_CONSTRUCTION = SKILL_CONSTRUCTION_DEFAULT, SKILL_MELEE_WEAPONS = SKILL_MELEE_TRAINED, SKILL_CQC = SKILL_CQC_TRAINED, @@ -24,7 +24,7 @@ MILITARY SURVIVORS /datum/skills/military/survivor/forecon_techician name = "Reconnaissance Support Technician" skills = list( - SKILL_ENGINEER = SKILL_ENGINEER_ENGI, + SKILL_ENGINEER = SKILL_ENGINEER_TRAINED, SKILL_CONSTRUCTION = SKILL_CONSTRUCTION_ENGI, SKILL_MELEE_WEAPONS = SKILL_MELEE_TRAINED, SKILL_CQC = SKILL_CQC_TRAINED, @@ -41,7 +41,7 @@ MILITARY SURVIVORS /datum/skills/military/survivor/forecon_marksman name = "Reconnaissance Designated Marksman" skills = list( - SKILL_ENGINEER = SKILL_ENGINEER_ENGI, + SKILL_ENGINEER = SKILL_ENGINEER_TRAINED, SKILL_CONSTRUCTION = SKILL_CONSTRUCTION_DEFAULT, SKILL_MELEE_WEAPONS = SKILL_MELEE_TRAINED, SKILL_CQC = SKILL_CQC_TRAINED, @@ -58,7 +58,7 @@ MILITARY SURVIVORS /datum/skills/military/survivor/forecon_smartgunner name = "Reconnaissance Smartgunner" skills = list( - SKILL_ENGINEER = SKILL_ENGINEER_ENGI, + SKILL_ENGINEER = SKILL_ENGINEER_TRAINED, SKILL_CONSTRUCTION = SKILL_CONSTRUCTION_DEFAULT, SKILL_MELEE_WEAPONS = SKILL_MELEE_TRAINED, SKILL_CQC = SKILL_CQC_TRAINED, @@ -75,7 +75,7 @@ MILITARY SURVIVORS /datum/skills/military/survivor/forecon_sniper name = "Reconnaissance Sniper" skills = list( - SKILL_ENGINEER = SKILL_ENGINEER_ENGI, + SKILL_ENGINEER = SKILL_ENGINEER_TRAINED, SKILL_CONSTRUCTION = SKILL_CONSTRUCTION_DEFAULT, SKILL_MELEE_WEAPONS = SKILL_MELEE_TRAINED, SKILL_CQC = SKILL_CQC_TRAINED, @@ -92,7 +92,7 @@ MILITARY SURVIVORS /datum/skills/military/survivor/forecon_squad_leader name = "Reconnaissance Squad Leader" skills = list( - SKILL_ENGINEER = SKILL_ENGINEER_ENGI, + SKILL_ENGINEER = SKILL_ENGINEER_TRAINED, SKILL_CONSTRUCTION = SKILL_CONSTRUCTION_DEFAULT, SKILL_MELEE_WEAPONS = SKILL_MELEE_TRAINED, SKILL_CQC = SKILL_CQC_SKILLED, diff --git a/code/datums/skills/freelancer.dm b/code/datums/skills/freelancer.dm index 09df9f32369c..cf7baa15532b 100644 --- a/code/datums/skills/freelancer.dm +++ b/code/datums/skills/freelancer.dm @@ -11,7 +11,7 @@ FREELANCERS skills = list( SKILL_FIREMAN = SKILL_FIREMAN_TRAINED, SKILL_CONSTRUCTION = SKILL_CONSTRUCTION_ENGI, - SKILL_ENGINEER = SKILL_ENGINEER_ENGI, + SKILL_ENGINEER = SKILL_ENGINEER_TRAINED, SKILL_ENDURANCE = SKILL_ENDURANCE_TRAINED, ) @@ -20,7 +20,7 @@ FREELANCERS skills = list( SKILL_FIREMAN = SKILL_FIREMAN_TRAINED, SKILL_CONSTRUCTION = SKILL_CONSTRUCTION_ENGI, - SKILL_ENGINEER = SKILL_ENGINEER_ENGI, + SKILL_ENGINEER = SKILL_ENGINEER_TRAINED, SKILL_ENDURANCE = SKILL_ENDURANCE_TRAINED, SKILL_MEDICAL = SKILL_MEDICAL_MEDIC, SKILL_SURGERY = SKILL_SURGERY_TRAINED, @@ -31,7 +31,7 @@ FREELANCERS skills = list( SKILL_FIREMAN = SKILL_FIREMAN_SKILLED, SKILL_CONSTRUCTION = SKILL_CONSTRUCTION_ENGI, - SKILL_ENGINEER = SKILL_ENGINEER_ENGI, + SKILL_ENGINEER = SKILL_ENGINEER_TRAINED, SKILL_ENDURANCE = SKILL_ENDURANCE_TRAINED, SKILL_MEDICAL = SKILL_MEDICAL_MEDIC, SKILL_CQC = SKILL_CQC_TRAINED, diff --git a/code/datums/skills/mercenary.dm b/code/datums/skills/mercenary.dm index 1dc18eaa2fbc..35a6378f51a4 100644 --- a/code/datums/skills/mercenary.dm +++ b/code/datums/skills/mercenary.dm @@ -3,7 +3,7 @@ skills = list( SKILL_CQC = SKILL_CQC_SKILLED, SKILL_FIREMAN = SKILL_FIREMAN_SKILLED, - SKILL_ENGINEER = SKILL_ENGINEER_ENGI, + SKILL_ENGINEER = SKILL_ENGINEER_TRAINED, SKILL_CONSTRUCTION = SKILL_CONSTRUCTION_ENGI, SKILL_FIREARMS = SKILL_FIREARMS_EXPERT, SKILL_MEDICAL = SKILL_MEDICAL_TRAINED, @@ -16,7 +16,7 @@ skills = list( SKILL_CQC = SKILL_CQC_SKILLED, SKILL_FIREMAN = SKILL_FIREMAN_SKILLED, - SKILL_ENGINEER = SKILL_ENGINEER_ENGI, + SKILL_ENGINEER = SKILL_ENGINEER_TRAINED, SKILL_CONSTRUCTION = SKILL_CONSTRUCTION_ENGI, SKILL_FIREARMS = SKILL_FIREARMS_MAX, SKILL_MEDICAL = SKILL_MEDICAL_TRAINED, @@ -31,7 +31,7 @@ skills = list( SKILL_CQC = SKILL_CQC_SKILLED, SKILL_FIREMAN = SKILL_FIREMAN_SKILLED, - SKILL_ENGINEER = SKILL_ENGINEER_ENGI, + SKILL_ENGINEER = SKILL_ENGINEER_TRAINED, SKILL_CONSTRUCTION = SKILL_CONSTRUCTION_ENGI, SKILL_FIREARMS = SKILL_FIREARMS_MAX, SKILL_MEDICAL = SKILL_MEDICAL_MASTER, @@ -62,7 +62,7 @@ skills = list( SKILL_CQC = SKILL_CQC_SKILLED, SKILL_FIREMAN = SKILL_FIREMAN_SKILLED, - SKILL_ENGINEER = SKILL_ENGINEER_ENGI, + SKILL_ENGINEER = SKILL_ENGINEER_TRAINED, SKILL_CONSTRUCTION = SKILL_CONSTRUCTION_ENGI, SKILL_FIREARMS = SKILL_FIREARMS_MAX, SKILL_MEDICAL = SKILL_MEDICAL_TRAINED, @@ -78,7 +78,7 @@ skills = list( SKILL_CQC = SKILL_CQC_SKILLED, SKILL_FIREMAN = SKILL_FIREMAN_SKILLED, - SKILL_ENGINEER = SKILL_ENGINEER_ENGI, + SKILL_ENGINEER = SKILL_ENGINEER_TRAINED, SKILL_CONSTRUCTION = SKILL_CONSTRUCTION_ENGI, SKILL_FIREARMS = SKILL_FIREARMS_MAX, SKILL_LEADERSHIP = SKILL_LEAD_MASTER, diff --git a/code/datums/skills/misc.dm b/code/datums/skills/misc.dm index 0f0ca657f995..204890685b91 100644 --- a/code/datums/skills/misc.dm +++ b/code/datums/skills/misc.dm @@ -11,7 +11,7 @@ MISCELLANEOUS SKILL_LEADERSHIP = SKILL_LEAD_EXPERT, SKILL_OVERWATCH = SKILL_OVERWATCH_TRAINED, SKILL_POWERLOADER = SKILL_POWERLOADER_MASTER, - SKILL_ENGINEER = SKILL_ENGINEER_ENGI, + SKILL_ENGINEER = SKILL_ENGINEER_TRAINED, SKILL_FIREMAN = SKILL_FIREMAN_TRAINED, SKILL_LEADERSHIP = SKILL_LEAD_TRAINED, SKILL_JTAC = SKILL_JTAC_EXPERT, @@ -23,7 +23,7 @@ MISCELLANEOUS SKILL_CQC = SKILL_CQC_MASTER, SKILL_MELEE_WEAPONS = SKILL_MELEE_SUPER, SKILL_ENDURANCE = SKILL_ENDURANCE_MASTER, - SKILL_ENGINEER = SKILL_ENGINEER_ENGI, + SKILL_ENGINEER = SKILL_ENGINEER_TRAINED, SKILL_CONSTRUCTION = SKILL_CONSTRUCTION_ENGI, SKILL_MEDICAL = SKILL_MEDICAL_MEDIC, SKILL_SURGERY = SKILL_SURGERY_EXPERT, @@ -52,7 +52,7 @@ MISCELLANEOUS name = "Souto Man" skills = list( SKILL_CQC = SKILL_CQC_MASTER, - SKILL_ENGINEER = SKILL_ENGINEER_ENGI, + SKILL_ENGINEER = SKILL_ENGINEER_TRAINED, SKILL_CONSTRUCTION = SKILL_CONSTRUCTION_ENGI, SKILL_FIREARMS = SKILL_FIREARMS_EXPERT, SKILL_MEDICAL = SKILL_MEDICAL_TRAINED, diff --git a/code/datums/skills/pmc.dm b/code/datums/skills/pmc.dm index df7027e2a7ab..1860157c0a54 100644 --- a/code/datums/skills/pmc.dm +++ b/code/datums/skills/pmc.dm @@ -14,7 +14,7 @@ Private Military Contractors SKILL_POLICE = SKILL_POLICE_SKILLED, SKILL_FIREMAN = SKILL_FIREMAN_SKILLED, SKILL_CONSTRUCTION = SKILL_CONSTRUCTION_ENGI, - SKILL_ENGINEER = SKILL_ENGINEER_ENGI, + SKILL_ENGINEER = SKILL_ENGINEER_TRAINED, SKILL_ENDURANCE = SKILL_ENDURANCE_MASTER, ) @@ -26,7 +26,7 @@ Private Military Contractors SKILL_POLICE = SKILL_POLICE_SKILLED, SKILL_FIREMAN = SKILL_FIREMAN_SKILLED, SKILL_CONSTRUCTION = SKILL_CONSTRUCTION_ENGI, - SKILL_ENGINEER = SKILL_ENGINEER_ENGI, + SKILL_ENGINEER = SKILL_ENGINEER_TRAINED, SKILL_MEDICAL = SKILL_MEDICAL_MEDIC, SKILL_SURGERY = SKILL_SURGERY_NOVICE, SKILL_ENDURANCE = SKILL_ENDURANCE_MASTER, @@ -40,7 +40,7 @@ Private Military Contractors SKILL_POLICE = SKILL_POLICE_SKILLED, SKILL_FIREMAN = SKILL_FIREMAN_SKILLED, SKILL_CONSTRUCTION = SKILL_CONSTRUCTION_ENGI, - SKILL_ENGINEER = SKILL_ENGINEER_ENGI, + SKILL_ENGINEER = SKILL_ENGINEER_TRAINED, SKILL_MEDICAL = SKILL_MEDICAL_MEDIC, SKILL_ENDURANCE = SKILL_ENDURANCE_MASTER, SKILL_RESEARCH = SKILL_RESEARCH_TRAINED, @@ -54,7 +54,7 @@ Private Military Contractors SKILL_POLICE = SKILL_POLICE_SKILLED, SKILL_FIREMAN = SKILL_FIREMAN_SKILLED, SKILL_CONSTRUCTION = SKILL_CONSTRUCTION_ENGI, - SKILL_ENGINEER = SKILL_ENGINEER_ENGI, + SKILL_ENGINEER = SKILL_ENGINEER_TRAINED, SKILL_SPEC_WEAPONS = SKILL_SPEC_SMARTGUN, SKILL_ENDURANCE = SKILL_ENDURANCE_MASTER, SKILL_JTAC = SKILL_JTAC_BEGINNER, @@ -68,7 +68,7 @@ Private Military Contractors SKILL_POLICE = SKILL_POLICE_SKILLED, SKILL_FIREMAN = SKILL_FIREMAN_SKILLED, SKILL_CONSTRUCTION = SKILL_CONSTRUCTION_ENGI, - SKILL_ENGINEER = SKILL_ENGINEER_ENGI, + SKILL_ENGINEER = SKILL_ENGINEER_TRAINED, SKILL_CQC = SKILL_CQC_TRAINED, SKILL_SPEC_WEAPONS = SKILL_SPEC_ALL, SKILL_MELEE_WEAPONS = SKILL_MELEE_TRAINED, @@ -83,7 +83,7 @@ Private Military Contractors SKILL_POLICE = SKILL_POLICE_SKILLED, SKILL_FIREMAN = SKILL_FIREMAN_SKILLED, SKILL_CONSTRUCTION = SKILL_CONSTRUCTION_ENGI, - SKILL_ENGINEER = SKILL_ENGINEER_ENGI, + SKILL_ENGINEER = SKILL_ENGINEER_TRAINED, SKILL_CQC = SKILL_CQC_SKILLED, SKILL_LEADERSHIP = SKILL_LEAD_TRAINED, SKILL_OVERWATCH = SKILL_OVERWATCH_TRAINED, @@ -99,7 +99,7 @@ Private Military Contractors SKILL_POLICE = SKILL_POLICE_SKILLED, SKILL_FIREMAN = SKILL_FIREMAN_SKILLED, SKILL_CONSTRUCTION = SKILL_CONSTRUCTION_ENGI, - SKILL_ENGINEER = SKILL_ENGINEER_ENGI, + SKILL_ENGINEER = SKILL_ENGINEER_TRAINED, SKILL_CQC = SKILL_CQC_SKILLED, SKILL_LEADERSHIP = SKILL_LEAD_TRAINED, SKILL_OVERWATCH = SKILL_OVERWATCH_TRAINED, @@ -116,7 +116,7 @@ Private Military Contractors SKILL_POLICE = SKILL_POLICE_SKILLED, SKILL_FIREMAN = SKILL_FIREMAN_SKILLED, SKILL_CONSTRUCTION = SKILL_CONSTRUCTION_ENGI, - SKILL_ENGINEER = SKILL_ENGINEER_ENGI, + SKILL_ENGINEER = SKILL_ENGINEER_TRAINED, SKILL_ENDURANCE = SKILL_ENDURANCE_MASTER, SKILL_LEADERSHIP = SKILL_LEAD_TRAINED, SKILL_JTAC = SKILL_JTAC_TRAINED, @@ -131,7 +131,7 @@ Private Military Contractors SKILL_POLICE = SKILL_POLICE_SKILLED, SKILL_FIREMAN = SKILL_FIREMAN_SKILLED, SKILL_CONSTRUCTION = SKILL_CONSTRUCTION_TRAINED, - SKILL_ENGINEER = SKILL_ENGINEER_TRAINED, + SKILL_ENGINEER = SKILL_ENGINEER_NOVICE, SKILL_MEDICAL = SKILL_MEDICAL_DOCTOR, SKILL_SURGERY = SKILL_SURGERY_EXPERT, SKILL_ENDURANCE = SKILL_ENDURANCE_MASTER, //trained in medicine more than combat @@ -160,7 +160,7 @@ Private Military Contractors SKILL_POLICE = SKILL_POLICE_SKILLED, SKILL_FIREMAN = SKILL_FIREMAN_SKILLED, SKILL_CONSTRUCTION = SKILL_CONSTRUCTION_ENGI, - SKILL_ENGINEER = SKILL_ENGINEER_ENGI, + SKILL_ENGINEER = SKILL_ENGINEER_TRAINED, SKILL_MEDICAL = SKILL_MEDICAL_MEDIC, SKILL_CQC = SKILL_CQC_TRAINED, SKILL_LEADERSHIP = SKILL_LEAD_MASTER, diff --git a/code/datums/skills/rmc.dm b/code/datums/skills/rmc.dm index 89aa39b154ad..4385253e9a28 100644 --- a/code/datums/skills/rmc.dm +++ b/code/datums/skills/rmc.dm @@ -14,7 +14,7 @@ Royal Marines Commando SKILL_POLICE = SKILL_POLICE_SKILLED, SKILL_FIREMAN = SKILL_FIREMAN_SKILLED, SKILL_CONSTRUCTION = SKILL_CONSTRUCTION_ENGI, - SKILL_ENGINEER = SKILL_ENGINEER_ENGI, + SKILL_ENGINEER = SKILL_ENGINEER_TRAINED, SKILL_ENDURANCE = SKILL_ENDURANCE_MASTER, SKILL_MEDICAL = SKILL_MEDICAL_MEDIC, SKILL_SURGERY = SKILL_SURGERY_NOVICE, @@ -28,7 +28,7 @@ Royal Marines Commando SKILL_POLICE = SKILL_POLICE_SKILLED, SKILL_FIREMAN = SKILL_FIREMAN_SKILLED, SKILL_CONSTRUCTION = SKILL_CONSTRUCTION_ENGI, - SKILL_ENGINEER = SKILL_ENGINEER_ENGI, + SKILL_ENGINEER = SKILL_ENGINEER_TRAINED, SKILL_ENDURANCE = SKILL_ENDURANCE_MASTER, SKILL_MEDICAL = SKILL_MEDICAL_MEDIC, SKILL_SURGERY = SKILL_SURGERY_NOVICE, @@ -44,7 +44,7 @@ Royal Marines Commando SKILL_POLICE = SKILL_POLICE_SKILLED, SKILL_FIREMAN = SKILL_FIREMAN_SKILLED, SKILL_CONSTRUCTION = SKILL_CONSTRUCTION_ENGI, - SKILL_ENGINEER = SKILL_ENGINEER_ENGI, + SKILL_ENGINEER = SKILL_ENGINEER_TRAINED, SKILL_ENDURANCE = SKILL_ENDURANCE_MASTER, SKILL_MEDICAL = SKILL_MEDICAL_MEDIC, SKILL_SURGERY = SKILL_SURGERY_NOVICE, @@ -61,7 +61,7 @@ Royal Marines Commando SKILL_POLICE = SKILL_POLICE_SKILLED, SKILL_FIREMAN = SKILL_FIREMAN_SKILLED, SKILL_CONSTRUCTION = SKILL_CONSTRUCTION_ENGI, - SKILL_ENGINEER = SKILL_ENGINEER_ENGI, + SKILL_ENGINEER = SKILL_ENGINEER_TRAINED, SKILL_ENDURANCE = SKILL_ENDURANCE_MASTER, SKILL_MEDICAL = SKILL_MEDICAL_MEDIC, SKILL_SURGERY = SKILL_SURGERY_NOVICE, diff --git a/code/datums/skills/synthetic.dm b/code/datums/skills/synthetic.dm index 3925dd9605b3..c4d7296dee5d 100644 --- a/code/datums/skills/synthetic.dm +++ b/code/datums/skills/synthetic.dm @@ -33,7 +33,7 @@ SYNTHETIC name = SYNTH_COLONY skills = list( SKILL_CQC = SKILL_CQC_EXPERT, - SKILL_ENGINEER = SKILL_ENGINEER_ENGI, + SKILL_ENGINEER = SKILL_ENGINEER_TRAINED, SKILL_CONSTRUCTION = SKILL_CONSTRUCTION_ENGI, SKILL_FIREARMS = SKILL_FIREARMS_EXPERT, SKILL_SPEC_WEAPONS = SKILL_SPEC_ALL, diff --git a/code/datums/skills/upp.dm b/code/datums/skills/upp.dm index e367372719d6..8ada7ccad124 100644 --- a/code/datums/skills/upp.dm +++ b/code/datums/skills/upp.dm @@ -10,7 +10,7 @@ UNITED PROGRESSIVE PEOPLES name = "UPP Private" skills = list( SKILL_CONSTRUCTION = SKILL_CONSTRUCTION_TRAINED, - SKILL_ENGINEER = SKILL_ENGINEER_TRAINED, + SKILL_ENGINEER = SKILL_ENGINEER_NOVICE, SKILL_MEDICAL = SKILL_MEDICAL_TRAINED, SKILL_ENDURANCE = SKILL_ENDURANCE_TRAINED, SKILL_CQC = SKILL_CQC_DEFAULT, @@ -22,7 +22,7 @@ UNITED PROGRESSIVE PEOPLES name = "UPP Sapper" skills = list( SKILL_CONSTRUCTION = SKILL_CONSTRUCTION_ENGI, - SKILL_ENGINEER = SKILL_ENGINEER_ENGI, + SKILL_ENGINEER = SKILL_ENGINEER_TRAINED, SKILL_MEDICAL = SKILL_MEDICAL_TRAINED, SKILL_ENDURANCE = SKILL_ENDURANCE_TRAINED, SKILL_CQC = SKILL_CQC_DEFAULT, @@ -45,7 +45,7 @@ UNITED PROGRESSIVE PEOPLES name = "UPP Specialist" skills = list( SKILL_CONSTRUCTION = SKILL_CONSTRUCTION_TRAINED, - SKILL_ENGINEER = SKILL_ENGINEER_TRAINED, + SKILL_ENGINEER = SKILL_ENGINEER_NOVICE, SKILL_ENDURANCE = SKILL_ENDURANCE_MASTER, SKILL_CQC = SKILL_CQC_TRAINED, SKILL_FIREMAN = SKILL_FIREMAN_TRAINED, @@ -60,7 +60,7 @@ UNITED PROGRESSIVE PEOPLES name = "UPP Squad Leader" skills = list( SKILL_CONSTRUCTION = SKILL_CONSTRUCTION_ENGI, - SKILL_ENGINEER = SKILL_ENGINEER_ENGI, + SKILL_ENGINEER = SKILL_ENGINEER_TRAINED, SKILL_ENDURANCE = SKILL_ENDURANCE_MASTER, SKILL_CQC = SKILL_CQC_TRAINED, SKILL_FIREMAN = SKILL_FIREMAN_SKILLED, @@ -78,7 +78,7 @@ UNITED PROGRESSIVE PEOPLES SKILL_FIREMAN = SKILL_FIREMAN_EXPERT, SKILL_ENDURANCE = SKILL_ENDURANCE_MASTER, SKILL_CONSTRUCTION = SKILL_CONSTRUCTION_TRAINED, - SKILL_ENGINEER = SKILL_ENGINEER_TRAINED, + SKILL_ENGINEER = SKILL_ENGINEER_NOVICE, SKILL_MEDICAL = SKILL_MEDICAL_TRAINED, SKILL_FIREARMS = SKILL_FIREARMS_EXPERT, ) @@ -93,7 +93,7 @@ UNITED PROGRESSIVE PEOPLES SKILL_CONSTRUCTION = SKILL_CONSTRUCTION_ENGI, SKILL_LEADERSHIP = SKILL_LEAD_EXPERT, SKILL_OVERWATCH = SKILL_OVERWATCH_TRAINED, - SKILL_ENGINEER = SKILL_ENGINEER_TRAINED, + SKILL_ENGINEER = SKILL_ENGINEER_NOVICE, SKILL_MEDICAL = SKILL_MEDICAL_MEDIC, SKILL_FIREARMS = SKILL_FIREARMS_EXPERT, SKILL_VEHICLE = SKILL_VEHICLE_SMALL, @@ -109,7 +109,7 @@ UNITED PROGRESSIVE PEOPLES SKILL_LEADERSHIP = SKILL_LEAD_MASTER, SKILL_OVERWATCH = SKILL_OVERWATCH_TRAINED, SKILL_ENDURANCE = SKILL_ENDURANCE_MASTER, - SKILL_ENGINEER = SKILL_ENGINEER_ENGI, + SKILL_ENGINEER = SKILL_ENGINEER_TRAINED, SKILL_CONSTRUCTION = SKILL_CONSTRUCTION_ENGI, SKILL_MEDICAL = SKILL_MEDICAL_MEDIC, SKILL_FIREARMS = SKILL_FIREARMS_EXPERT, @@ -126,7 +126,7 @@ UNITED PROGRESSIVE PEOPLES SKILL_LEADERSHIP = SKILL_LEAD_MASTER, SKILL_OVERWATCH = SKILL_OVERWATCH_TRAINED, SKILL_ENDURANCE = SKILL_ENDURANCE_MASTER, - SKILL_ENGINEER = SKILL_ENGINEER_ENGI, + SKILL_ENGINEER = SKILL_ENGINEER_TRAINED, SKILL_CONSTRUCTION = SKILL_CONSTRUCTION_ENGI, SKILL_MEDICAL = SKILL_MEDICAL_MEDIC, SKILL_FIREARMS = SKILL_FIREARMS_EXPERT, @@ -147,7 +147,7 @@ UNITED PROGRESSIVE PEOPLES name = "UPP Private" skills = list( SKILL_CONSTRUCTION = SKILL_CONSTRUCTION_TRAINED, - SKILL_ENGINEER = SKILL_ENGINEER_ENGI, + SKILL_ENGINEER = SKILL_ENGINEER_TRAINED, SKILL_MEDICAL = SKILL_MEDICAL_TRAINED, SKILL_ENDURANCE = SKILL_ENDURANCE_TRAINED, SKILL_CQC = SKILL_CQC_TRAINED, @@ -161,7 +161,7 @@ UNITED PROGRESSIVE PEOPLES name = "UPP Sapper" skills = list( SKILL_CONSTRUCTION = SKILL_CONSTRUCTION_ENGI, - SKILL_ENGINEER = SKILL_ENGINEER_ENGI, + SKILL_ENGINEER = SKILL_ENGINEER_TRAINED, SKILL_MEDICAL = SKILL_MEDICAL_TRAINED, SKILL_ENDURANCE = SKILL_ENDURANCE_TRAINED, SKILL_CQC = SKILL_CQC_TRAINED, @@ -176,7 +176,7 @@ UNITED PROGRESSIVE PEOPLES name = "UPP Medic" skills = list( SKILL_CONSTRUCTION = SKILL_CONSTRUCTION_TRAINED, - SKILL_ENGINEER = SKILL_ENGINEER_ENGI, + SKILL_ENGINEER = SKILL_ENGINEER_TRAINED, SKILL_MEDICAL = SKILL_MEDICAL_DOCTOR, SKILL_SURGERY = SKILL_SURGERY_TRAINED, SKILL_ENDURANCE = SKILL_ENDURANCE_TRAINED, @@ -192,7 +192,7 @@ UNITED PROGRESSIVE PEOPLES name = "UPP Specialist" skills = list( SKILL_CONSTRUCTION = SKILL_CONSTRUCTION_TRAINED, - SKILL_ENGINEER = SKILL_ENGINEER_ENGI, + SKILL_ENGINEER = SKILL_ENGINEER_TRAINED, SKILL_MEDICAL = SKILL_MEDICAL_TRAINED, SKILL_ENDURANCE = SKILL_ENDURANCE_TRAINED, SKILL_CQC = SKILL_CQC_TRAINED, @@ -210,7 +210,7 @@ UNITED PROGRESSIVE PEOPLES name = "UPP Squad Leader" skills = list( SKILL_CONSTRUCTION = SKILL_CONSTRUCTION_ENGI, - SKILL_ENGINEER = SKILL_ENGINEER_ENGI, + SKILL_ENGINEER = SKILL_ENGINEER_TRAINED, SKILL_ENDURANCE = SKILL_ENDURANCE_TRAINED, SKILL_SPEC_WEAPONS = SKILL_SPEC_UPP, SKILL_FIREARMS = SKILL_FIREARMS_TRAINED, diff --git a/code/datums/skills/uscm.dm b/code/datums/skills/uscm.dm index f694e8789dcd..1bfb58996b4e 100644 --- a/code/datums/skills/uscm.dm +++ b/code/datums/skills/uscm.dm @@ -12,7 +12,7 @@ United States Colonial Marines name = "Crafty Private" skills = list( SKILL_CONSTRUCTION = SKILL_CONSTRUCTION_TRAINED, - SKILL_ENGINEER = SKILL_ENGINEER_TRAINED, + SKILL_ENGINEER = SKILL_ENGINEER_NOVICE, ) /datum/skills/combat_medic @@ -28,7 +28,7 @@ United States Colonial Marines name = "Crafty Combat Medic" skills = list( SKILL_CONSTRUCTION = SKILL_CONSTRUCTION_TRAINED, - SKILL_ENGINEER = SKILL_ENGINEER_TRAINED, + SKILL_ENGINEER = SKILL_ENGINEER_NOVICE, ) /datum/skills/combat_engineer @@ -55,7 +55,7 @@ United States Colonial Marines SKILL_FIREMAN = SKILL_FIREMAN_TRAINED, SKILL_CQC = SKILL_CQC_TRAINED, SKILL_CONSTRUCTION = SKILL_CONSTRUCTION_TRAINED, - SKILL_ENGINEER = SKILL_ENGINEER_TRAINED, //to use c4 in demo set. + SKILL_ENGINEER = SKILL_ENGINEER_NOVICE, //to use c4 in demo set. SKILL_SPEC_WEAPONS = SKILL_SPEC_TRAINED, SKILL_MELEE_WEAPONS = SKILL_MELEE_TRAINED, SKILL_ENDURANCE = SKILL_ENDURANCE_TRAINED, @@ -66,7 +66,7 @@ United States Colonial Marines name = "Fireteam Leader" skills = list( SKILL_FIREMAN = SKILL_FIREMAN_TRAINED, - SKILL_ENGINEER = SKILL_ENGINEER_ENGI, + SKILL_ENGINEER = SKILL_ENGINEER_TRAINED, SKILL_CONSTRUCTION = SKILL_CONSTRUCTION_ENGI, SKILL_JTAC = SKILL_JTAC_EXPERT, ) @@ -77,7 +77,7 @@ United States Colonial Marines SKILL_CQC = SKILL_CQC_TRAINED, SKILL_FIREMAN = SKILL_FIREMAN_TRAINED, SKILL_CONSTRUCTION = SKILL_CONSTRUCTION_ENGI, - SKILL_ENGINEER = SKILL_ENGINEER_ENGI, + SKILL_ENGINEER = SKILL_ENGINEER_TRAINED, SKILL_LEADERSHIP = SKILL_LEAD_TRAINED, SKILL_MEDICAL = SKILL_MEDICAL_TRAINED, SKILL_ENDURANCE = SKILL_ENDURANCE_TRAINED, @@ -90,7 +90,7 @@ United States Colonial Marines name = "Intelligence Officer" skills = list( SKILL_FIREMAN = SKILL_FIREMAN_TRAINED, - SKILL_ENGINEER = SKILL_ENGINEER_ENGI, + SKILL_ENGINEER = SKILL_ENGINEER_TRAINED, SKILL_LEADERSHIP = SKILL_LEAD_TRAINED, SKILL_OVERWATCH = SKILL_OVERWATCH_TRAINED, SKILL_CQC = SKILL_CQC_TRAINED, @@ -157,7 +157,7 @@ MILITARY NONCOMBATANT SKILL_MEDICAL = SKILL_MEDICAL_MEDIC, SKILL_SURGERY = SKILL_SURGERY_NOVICE, SKILL_JTAC = SKILL_JTAC_TRAINED, - SKILL_ENGINEER = SKILL_ENGINEER_ENGI, + SKILL_ENGINEER = SKILL_ENGINEER_TRAINED, ) /datum/skills/MP @@ -180,7 +180,7 @@ MILITARY NONCOMBATANT SKILL_ENDURANCE = SKILL_ENDURANCE_TRAINED, SKILL_MEDICAL = SKILL_MEDICAL_TRAINED, SKILL_CONSTRUCTION = SKILL_CONSTRUCTION_ENGI, - SKILL_ENGINEER = SKILL_ENGINEER_ENGI, + SKILL_ENGINEER = SKILL_ENGINEER_TRAINED, ) /datum/skills/provost @@ -216,7 +216,7 @@ MILITARY NONCOMBATANT name = "Mess Technician" skills = list( SKILL_FIREARMS = SKILL_FIREARMS_EXPERT, // need to hunt food somehow - SKILL_ENGINEER = SKILL_ENGINEER_TRAINED, + SKILL_ENGINEER = SKILL_ENGINEER_NOVICE, SKILL_FIREMAN = SKILL_FIREMAN_TRAINED, SKILL_CONSTRUCTION = SKILL_CONSTRUCTION_TRAINED, SKILL_DOMESTIC = SKILL_DOMESTIC_MASTER @@ -240,7 +240,7 @@ COMMAND STAFF name = "General" skills = list( SKILL_CQC = SKILL_CQC_TRAINED, - SKILL_ENGINEER = SKILL_ENGINEER_ENGI, + SKILL_ENGINEER = SKILL_ENGINEER_TRAINED, SKILL_CONSTRUCTION = SKILL_CONSTRUCTION_ENGI, SKILL_LEADERSHIP = SKILL_LEAD_MASTER, SKILL_OVERWATCH = SKILL_OVERWATCH_TRAINED, @@ -259,7 +259,7 @@ COMMAND STAFF /datum/skills/commander name = "Commanding Officer" skills = list( - SKILL_ENGINEER = SKILL_ENGINEER_ENGI, + SKILL_ENGINEER = SKILL_ENGINEER_TRAINED, SKILL_CONSTRUCTION = SKILL_CONSTRUCTION_ENGI, SKILL_LEADERSHIP = SKILL_LEAD_MASTER, SKILL_OVERWATCH = SKILL_OVERWATCH_TRAINED, @@ -282,13 +282,13 @@ COMMAND STAFF /datum/skills/XO name = "Executive Officer" skills = list( - SKILL_ENGINEER = SKILL_ENGINEER_ENGI, //to fix CIC apc. + SKILL_ENGINEER = SKILL_ENGINEER_TRAINED, //to fix CIC apc. SKILL_CONSTRUCTION = SKILL_CONSTRUCTION_ENGI, SKILL_LEADERSHIP = SKILL_LEAD_MASTER, SKILL_OVERWATCH = SKILL_OVERWATCH_TRAINED, SKILL_MEDICAL = SKILL_MEDICAL_DOCTOR, SKILL_SURGERY = SKILL_SURGERY_NOVICE, - SKILL_POLICE = SKILL_POLICE_FLASH, + SKILL_POLICE = SKILL_POLICE_SKILLED, SKILL_VEHICLE = SKILL_VEHICLE_SMALL, SKILL_FIREMAN = SKILL_FIREMAN_SKILLED, SKILL_CQC = SKILL_CQC_SKILLED, @@ -303,7 +303,7 @@ COMMAND STAFF /datum/skills/SO name = "Staff Officer" skills = list( - SKILL_ENGINEER = SKILL_ENGINEER_ENGI, + SKILL_ENGINEER = SKILL_ENGINEER_TRAINED, SKILL_CONSTRUCTION = SKILL_CONSTRUCTION_ENGI, SKILL_LEADERSHIP = SKILL_LEAD_EXPERT, SKILL_OVERWATCH = SKILL_OVERWATCH_TRAINED, @@ -322,7 +322,7 @@ COMMAND STAFF name = "Senior Enlisted Advisor" skills = list( SKILL_CQC = SKILL_CQC_SKILLED, - SKILL_ENGINEER = SKILL_ENGINEER_ENGI, + SKILL_ENGINEER = SKILL_ENGINEER_TRAINED, SKILL_CONSTRUCTION = SKILL_CONSTRUCTION_ENGI, SKILL_FIREARMS = SKILL_FIREARMS_EXPERT, SKILL_LEADERSHIP = SKILL_LEAD_EXPERT, @@ -375,7 +375,7 @@ COMMAND STAFF SKILL_JTAC = SKILL_JTAC_EXPERT, SKILL_MEDICAL = SKILL_MEDICAL_TRAINED, SKILL_CONSTRUCTION = SKILL_CONSTRUCTION_ENGI, - SKILL_ENGINEER = SKILL_ENGINEER_ENGI, + SKILL_ENGINEER = SKILL_ENGINEER_TRAINED, SKILL_MELEE_WEAPONS = SKILL_MELEE_TRAINED, SKILL_INTEL = SKILL_INTEL_TRAINED, ) @@ -392,7 +392,7 @@ COMMAND STAFF SKILL_JTAC = SKILL_JTAC_EXPERT, SKILL_INTEL = SKILL_INTEL_EXPERT, SKILL_VEHICLE = SKILL_VEHICLE_SMALL, - SKILL_ENGINEER = SKILL_ENGINEER_ENGI, + SKILL_ENGINEER = SKILL_ENGINEER_TRAINED, SKILL_CONSTRUCTION = SKILL_CONSTRUCTION_ENGI, SKILL_POLICE = SKILL_POLICE_FLASH, SKILL_NAVIGATIONS = SKILL_NAVIGATIONS_TRAINED, diff --git a/code/datums/skills/wygoons.dm b/code/datums/skills/wygoons.dm index 2d2c247bd1ea..73d8da15b976 100644 --- a/code/datums/skills/wygoons.dm +++ b/code/datums/skills/wygoons.dm @@ -18,7 +18,7 @@ SKILL_MELEE_WEAPONS = SKILL_MELEE_TRAINED, SKILL_MEDICAL = SKILL_MEDICAL_TRAINED, SKILL_CONSTRUCTION = SKILL_CONSTRUCTION_ENGI, - SKILL_ENGINEER = SKILL_ENGINEER_ENGI, + SKILL_ENGINEER = SKILL_ENGINEER_TRAINED, ) /datum/skills/wy_goon_lead @@ -31,6 +31,6 @@ SKILL_MELEE_WEAPONS = SKILL_MELEE_TRAINED, SKILL_MEDICAL = SKILL_MEDICAL_TRAINED, SKILL_CONSTRUCTION = SKILL_CONSTRUCTION_ENGI, - SKILL_ENGINEER = SKILL_ENGINEER_ENGI, + SKILL_ENGINEER = SKILL_ENGINEER_TRAINED, SKILL_LEADERSHIP = SKILL_LEAD_TRAINED, ) diff --git a/code/datums/supply_packs/explosives.dm b/code/datums/supply_packs/explosives.dm index 032ef047c78a..78f0f3e9251a 100644 --- a/code/datums/supply_packs/explosives.dm +++ b/code/datums/supply_packs/explosives.dm @@ -89,6 +89,18 @@ containername = "\improper explosive M40 HEDP grenades crate (WARNING)" group = "Explosives" +/datum/supply_packs/explosives_sebb + name = "G2 electroshock grenades crate (x6)" + contains = list( + /obj/item/storage/box/packet/sebb, + /obj/item/storage/box/packet/sebb, + ) + cost = 30 + containertype = /obj/structure/closet/crate/explosives + containername = "\improper G2 electroshock grenades crate (WARNING)" + group = "Explosives" + + /datum/supply_packs/explosives_hedp name = "M40 HEDP blast grenade box crate (x25)" contains = list( diff --git a/code/datums/tutorial/xenomorph/abomination.dm b/code/datums/tutorial/xenomorph/abomination.dm index db9b77cf2e75..83ac86b8f09e 100644 --- a/code/datums/tutorial/xenomorph/abomination.dm +++ b/code/datums/tutorial/xenomorph/abomination.dm @@ -147,6 +147,7 @@ /datum/tutorial/xenomorph/abomination/proc/frenzy_tutorial_4() var/mob/living/carbon/human/marine = new(loc_from_corner(4, 2)) add_to_tracking_atoms(marine) + RegisterSignal(marine, COMSIG_MOB_DEATH, PROC_REF(on_marine_early_death)) arm_equipment(marine, /datum/equipment_preset/uscm/private_equipped) var/datum/action/frenzy = give_action(xeno, /datum/action/xeno_action/activable/feralfrenzy) @@ -202,6 +203,7 @@ return UnregisterSignal(frenzy, COMSIG_XENO_ACTION_USED) + UnregisterSignal(marine, COMSIG_MOB_DEATH) remove_highlight(frenzy.button) message_to_player("Good. As you may have noticed, the AOE version of Feral Frenzy takes longer to wind up, in addition to doing less overall damage.") addtimer(CALLBACK(src, PROC_REF(kill_marines)), 6 SECONDS) @@ -245,3 +247,10 @@ tutorial_end_in(7 SECONDS, TRUE) // END OF SCRIPTING + +/// In case a marine dies early to prevent softlocks +/datum/tutorial/xenomorph/abomination/proc/on_marine_early_death(datum/source) + SIGNAL_HANDLER + + TUTORIAL_ATOM_FROM_TRACKING(/mob/living/carbon/human, marine) + marine.rejuvenate() diff --git a/code/game/area/almayer.dm b/code/game/area/almayer.dm index b75baccd7353..a065a0b8671f 100644 --- a/code/game/area/almayer.dm +++ b/code/game/area/almayer.dm @@ -132,7 +132,7 @@ icon_state = "workshop" /area/almayer/engineering/lower/workshop/hangar - name = "\improper Ordnance workshop" + name = "\improper Ordnance Workshop" /area/almayer/engineering/lower/engine_core name = "\improper Engine Reactor Core Room" diff --git a/code/game/gamemodes/colonialmarines/whiskey_outpost/skills.dm b/code/game/gamemodes/colonialmarines/whiskey_outpost/skills.dm index a5126627adaf..746e6ed53c18 100644 --- a/code/game/gamemodes/colonialmarines/whiskey_outpost/skills.dm +++ b/code/game/gamemodes/colonialmarines/whiskey_outpost/skills.dm @@ -35,7 +35,7 @@ /datum/skills/honor_guard/lead name = "Honor Guard Squad Leader" skills = list( - SKILL_ENGINEER = SKILL_ENGINEER_ENGI, //to fix CIC apc. + SKILL_ENGINEER = SKILL_ENGINEER_TRAINED, //to fix CIC apc. SKILL_CONSTRUCTION = SKILL_CONSTRUCTION_ENGI, SKILL_LEADERSHIP = SKILL_LEAD_MASTER, SKILL_OVERWATCH = SKILL_OVERWATCH_TRAINED, @@ -49,7 +49,7 @@ /datum/skills/mortar_crew name = "Mortar Crew" skills = list( - SKILL_ENGINEER = SKILL_ENGINEER_ENGI, + SKILL_ENGINEER = SKILL_ENGINEER_TRAINED, SKILL_CONSTRUCTION = SKILL_CONSTRUCTION_ENGI, SKILL_JTAC = SKILL_JTAC_BEGINNER, SKILL_POWERLOADER = SKILL_POWERLOADER_MASTER, diff --git a/code/game/jobs/job/job.dm b/code/game/jobs/job/job.dm index 0af315fc3b9d..640866db8ca2 100644 --- a/code/game/jobs/job/job.dm +++ b/code/game/jobs/job/job.dm @@ -155,7 +155,7 @@ if(!gear_preset) return "" if(GLOB.gear_path_presets_list[gear_preset]) - return GLOB.gear_path_presets_list[gear_preset].paygrade + return GLOB.gear_path_presets_list[gear_preset].paygrades[1] return "" /datum/job/proc/get_comm_title() diff --git a/code/game/jobs/job/marine/squad_info.dm b/code/game/jobs/job/marine/squad_info.dm index 37db48c3116e..406263115196 100644 --- a/code/game/jobs/job/marine/squad_info.dm +++ b/code/game/jobs/job/marine/squad_info.dm @@ -146,7 +146,7 @@ if(skillcheck(H, SKILL_MEDICAL, SKILL_MEDICAL_TRAINED)) Med = TRUE else - if(skillcheck(H, SKILL_ENGINEER, SKILL_ENGINEER_TRAINED)) + if(skillcheck(H, SKILL_ENGINEER, SKILL_ENGINEER_NOVICE)) Eng = TRUE ID = H.get_idcard() squad_info_data["fireteams"][team]["tl"] = list( @@ -223,7 +223,7 @@ if(skillcheck(H, SKILL_MEDICAL, SKILL_MEDICAL_TRAINED)) Med = TRUE else - if(skillcheck(H, SKILL_ENGINEER, SKILL_ENGINEER_TRAINED)) + if(skillcheck(H, SKILL_ENGINEER, SKILL_ENGINEER_NOVICE)) Eng = TRUE mar[H.real_name] = list( "name" = H.real_name, @@ -270,7 +270,7 @@ if(skillcheck(H, SKILL_MEDICAL, SKILL_MEDICAL_TRAINED)) Med = TRUE else - if(skillcheck(H, SKILL_ENGINEER, SKILL_ENGINEER_TRAINED)) + if(skillcheck(H, SKILL_ENGINEER, SKILL_ENGINEER_NOVICE)) Eng = TRUE mar[H.real_name] = list( "name" = H.real_name, diff --git a/code/game/machinery/air_sensor.dm b/code/game/machinery/air_sensor.dm deleted file mode 100644 index 55963bae979a..000000000000 --- a/code/game/machinery/air_sensor.dm +++ /dev/null @@ -1,64 +0,0 @@ -/obj/structure/machinery/air_sensor - icon = 'icons/obj/structures/props/stationobjs.dmi' - icon_state = "gsensor1" - name = "Gas Sensor" - - anchored = TRUE - var/state = 0 - - var/id_tag - var/frequency = 1439 - - var/on = 1 - var/output = 3 - //Flags: - // 1 for pressure - // 2 for temperature - // Output >= 4 includes gas composition - // 4 for oxygen concentration - // 8 for phoron concentration - // 16 for nitrogen concentration - // 32 for carbon dioxide concentration - - var/datum/radio_frequency/radio_connection - -/obj/structure/machinery/air_sensor/update_icon() - icon_state = "gsensor[on]" - -/obj/structure/machinery/air_sensor/process() - if(on) - var/datum/signal/signal = new - signal.transmission_method = 1 //radio signal - signal.data["tag"] = id_tag - signal.data["timestamp"] = world.time - - var/turf/T = loc - var/pressure_ = T.return_pressure() - var/temperature_ = T.return_temperature() - - if(output&1) - signal.data["pressure"] = num2text(round(pressure_,0.1),) - if(output&2) - signal.data["temperature"] = round(temperature_,0.1) - - if(output>4) - signal.data["oxygen"] = 0 - signal.data["phoron"] = 0 - signal.data["nitrogen"] = 0 - signal.data["carbon_dioxide"] = 0 - signal.data["sigtype"]="status" - radio_connection.post_signal(src, signal, filter = RADIO_ATMOSIA) - - -/obj/structure/machinery/air_sensor/proc/set_frequency(new_frequency) - SSradio.remove_object(src, frequency) - frequency = new_frequency - radio_connection = SSradio.add_object(src, frequency, RADIO_ATMOSIA) - -/obj/structure/machinery/air_sensor/Initialize() - . = ..() - set_frequency(frequency) - -/obj/structure/machinery/air_sensor/Destroy() - SSradio.remove_object(src, frequency) - return ..() diff --git a/code/game/machinery/autolathe.dm b/code/game/machinery/autolathe.dm index 4150aead979e..4013aec3fb29 100644 --- a/code/game/machinery/autolathe.dm +++ b/code/game/machinery/autolathe.dm @@ -224,7 +224,7 @@ if("cutwire") if(!panel_open) return FALSE - if(!skillcheck(usr, SKILL_ENGINEER, SKILL_ENGINEER_ENGI)) + if(!skillcheck(usr, SKILL_ENGINEER, SKILL_ENGINEER_TRAINED)) to_chat(usr, SPAN_WARNING("You don't understand anything about this wiring...")) return FALSE var/obj/item/held_item = usr.get_held_item() @@ -238,7 +238,7 @@ if("fixwire") if(!panel_open) return FALSE - if(!skillcheck(usr, SKILL_ENGINEER, SKILL_ENGINEER_ENGI)) + if(!skillcheck(usr, SKILL_ENGINEER, SKILL_ENGINEER_TRAINED)) to_chat(usr, SPAN_WARNING("You don't understand anything about this wiring...")) return FALSE var/obj/item/held_item = usr.get_held_item() @@ -251,7 +251,7 @@ if("pulsewire") if(!panel_open) return FALSE - if(!skillcheck(usr, SKILL_ENGINEER, SKILL_ENGINEER_ENGI)) + if(!skillcheck(usr, SKILL_ENGINEER, SKILL_ENGINEER_TRAINED)) to_chat(usr, SPAN_WARNING("You don't understand anything about this wiring...")) return FALSE var/obj/item/held_item = usr.get_held_item() @@ -269,7 +269,7 @@ /obj/structure/machinery/autolathe/attackby(obj/item/O as obj, mob/user as mob) if(HAS_TRAIT(O, TRAIT_TOOL_SCREWDRIVER)) - if(!skillcheck(user, SKILL_ENGINEER, SKILL_ENGINEER_ENGI)) + if(!skillcheck(user, SKILL_ENGINEER, SKILL_ENGINEER_TRAINED)) to_chat(user, SPAN_WARNING("You are not trained to dismantle machines...")) return panel_open = !panel_open @@ -586,7 +586,7 @@ stored_material = list("metal" = 56250, "plastic" = 20000) //15 metal and 10 plastic sheets /obj/structure/machinery/autolathe/armylathe/attack_hand(mob/user) - if(!skillcheck(user, SKILL_ENGINEER, SKILL_ENGINEER_ENGI)) + if(!skillcheck(user, SKILL_ENGINEER, SKILL_ENGINEER_TRAINED)) to_chat(user, SPAN_WARNING("You have no idea how to operate the [name].")) return FALSE . = ..() diff --git a/code/game/machinery/autolathe_datums.dm b/code/game/machinery/autolathe_datums.dm index 78a8e46b64aa..9c8ee271845d 100644 --- a/code/game/machinery/autolathe_datums.dm +++ b/code/game/machinery/autolathe_datums.dm @@ -136,11 +136,6 @@ path = /obj/item/circuitboard/apc category = AUTOLATHE_CATEGORY_ENGINEERING -/datum/autolathe/recipe/rcd_ammo - name = "matter cartridge" - path = /obj/item/ammo_rcd - category = AUTOLATHE_CATEGORY_ENGINEERING - /datum/autolathe/recipe/table_parts name = "table parts" path = /obj/item/frame/table diff --git a/code/game/machinery/bio-dome_floodlights.dm b/code/game/machinery/bio-dome_floodlights.dm deleted file mode 100644 index e23dbcc023f4..000000000000 --- a/code/game/machinery/bio-dome_floodlights.dm +++ /dev/null @@ -1,169 +0,0 @@ -/obj/structure/machinery/hydro_floodlight_switch - name = "Biodome Floodlight Switch" - icon = 'icons/obj/structures/machinery/power.dmi' - icon_state = "panelnopower" - desc = "This switch controls the floodlights surrounding the archaeology complex. It only functions when there is power." - density = FALSE - anchored = TRUE - var/ispowered = FALSE - var/turned_on = 0 //has to be toggled in engineering - use_power = USE_POWER_IDLE - unslashable = TRUE - unacidable = TRUE - var/list/floodlist = list() // This will save our list of floodlights on the map - -/obj/structure/machinery/hydro_floodlight_switch/Initialize(mapload, ...) - . = ..() - for(var/obj/structure/machinery/hydro_floodlight/F in GLOB.machines) - floodlist += F - F.fswitch = src - start_processing() - -/obj/structure/machinery/hydro_floodlight_switch/Destroy() - for(var/obj/structure/machinery/hydro_floodlight/floodlight as anything in floodlist) - floodlight.fswitch = null - floodlist = null - return ..() - - -/obj/structure/machinery/hydro_floodlight_switch/process() - var/lightpower = 0 - for(var/obj/structure/machinery/hydro_floodlight/H in floodlist) - if(!H.is_lit) - continue - lightpower += H.power_tick - use_power(lightpower) - -/obj/structure/machinery/hydro_floodlight_switch/update_icon() - if(!ispowered) - icon_state = "panelnopower" - else if(turned_on) - icon_state = "panelon" - else - icon_state = "paneloff" - -/obj/structure/machinery/hydro_floodlight_switch/power_change() - ..() - if((stat & NOPOWER)) - if(ispowered && turned_on) - toggle_lights() - ispowered = FALSE - turned_on = 0 - update_icon() - else - ispowered = TRUE - update_icon() - -/obj/structure/machinery/hydro_floodlight_switch/proc/toggle_lights() - for(var/obj/structure/machinery/hydro_floodlight/F in floodlist) - if(!istype(F) || QDELETED(F) || F.damaged) continue //Missing or damaged, skip it - - spawn(rand(0,50)) - if(F.is_lit) //Shut it down - F.set_light(0) - else - F.set_light(F.lum_value) - F.is_lit = !(F.is_lit) - F.update_icon() - return 0 - -/obj/structure/machinery/hydro_floodlight_switch/attack_hand(mob/user as mob) - if(!ishuman(user)) - to_chat(user, "Nice try.") - return 0 - if(!ispowered) - to_chat(user, "Nothing happens.") - return 0 - playsound(src,'sound/machines/click.ogg', 15, 1) - use_power(5) - toggle_lights() - turned_on = !(src.turned_on) - update_icon() - return 1 - -/obj/structure/machinery/hydro_floodlight - name = "Biodome Floodlight" - icon = 'icons/obj/structures/machinery/big_floodlight.dmi' - icon_state = "flood_s_off" - density = TRUE - anchored = TRUE - layer = WINDOW_LAYER - var/damaged = 0 //Can be smashed by xenos - var/is_lit = 0 - unslashable = TRUE - unacidable = TRUE - var/power_tick = 800 // power each floodlight takes up per process - use_power = USE_POWER_NONE //It's the switch that uses the actual power, not the lights - var/obj/structure/machinery/hydro_floodlight_switch/fswitch = null //Reverse lookup for power grabbing in area - var/lum_value = 7 - -/obj/structure/machinery/hydro_floodlight/Destroy() - if(fswitch?.floodlist) - fswitch.floodlist -= src - fswitch = null - return ..() - -/obj/structure/machinery/hydro_floodlight/update_icon() - if(damaged) - icon_state = "flood_s_dmg" - else if(is_lit) - icon_state = "flood_s_on" - else - icon_state = "flood_s_off" - -/obj/structure/machinery/hydro_floodlight/attackby(obj/item/W as obj, mob/user as mob) - var/obj/item/tool/weldingtool/WT = W - if(istype(WT)) - if(!damaged) return - if(!HAS_TRAIT(WT, TRAIT_TOOL_BLOWTORCH)) - to_chat(user, SPAN_WARNING("You need a stronger blowtorch!")) - return - if(WT.remove_fuel(0, user)) - playsound(src.loc, 'sound/items/weldingtool_weld.ogg', 25) - user.visible_message(SPAN_NOTICE("[user] starts welding [src]'s damage."), \ - SPAN_NOTICE("You start welding [src]'s damage.")) - if(do_after(user, 200 * user.get_skill_duration_multiplier(SKILL_ENGINEER), INTERRUPT_ALL|BEHAVIOR_IMMOBILE, BUSY_ICON_BUILD)) - playsound(get_turf(src), 'sound/items/Welder2.ogg', 25, 1) - if(!src || !WT.isOn()) return - damaged = 0 - user.visible_message(SPAN_NOTICE("[user] finishes welding [src]'s damage."), \ - SPAN_NOTICE("You finish welding [src]'s damage.")) - if(is_lit) - set_light(lum_value) - update_icon() - return 1 - else - to_chat(user, SPAN_WARNING("You need more welding fuel to complete this task.")) - return 0 - ..() - return 0 - -/obj/structure/machinery/hydro_floodlight/attack_hand(mob/user as mob) - if(ishuman(user)) - to_chat(user, SPAN_WARNING("Nothing happens. Looks like it's powered elsewhere.")) - return 0 - else if(!is_lit) - to_chat(user, SPAN_WARNING("Why bother? It's just some weird metal thing.")) - return 0 - else - if(damaged) - to_chat(user, SPAN_WARNING("It's already damaged.")) - return 0 - else - if(islarva(user)) - return //Larvae can't do shit - if(user.get_active_hand()) - to_chat(user, SPAN_WARNING("You need your claws empty for this!")) - return FALSE - user.visible_message(SPAN_DANGER("[user] starts to slash and claw away at [src]!"), - SPAN_DANGER("You start slashing and clawing at [src]!")) - if(do_after(user, 50, INTERRUPT_ALL, BUSY_ICON_HOSTILE) && !damaged) //Not when it's already damaged. - if(!src) return 0 - damaged = 1 - set_light(0) - user.visible_message(SPAN_DANGER("[user] slashes up [src]!"), - SPAN_DANGER("You slash up [src]!")) - playsound(src, 'sound/weapons/blade1.ogg', 25, 1) - update_icon() - return 0 - ..() diff --git a/code/game/machinery/camera/presets.dm b/code/game/machinery/camera/presets.dm index a1d7f00cf94a..f8ce33eb9911 100644 --- a/code/game/machinery/camera/presets.dm +++ b/code/game/machinery/camera/presets.dm @@ -99,6 +99,10 @@ name = "ares core camera" network = list(CAMERA_NET_ARES) +/obj/structure/machinery/camera/autoname/almayer/brig + name = "brig camera" + network = list(CAMERA_NET_BRIG) + //used by the landing camera dropship equipment. Do not place them right under where the dropship lands. //Should place them near each corner of your LZs. /obj/structure/machinery/camera/autoname/lz_camera diff --git a/code/game/machinery/colony_floodlights.dm b/code/game/machinery/colony_floodlights.dm index 0267c7e95487..e8f59ad643d7 100644 --- a/code/game/machinery/colony_floodlights.dm +++ b/code/game/machinery/colony_floodlights.dm @@ -125,7 +125,7 @@ /obj/structure/machinery/colony_floodlight/attackby(obj/item/I, mob/user) if(damaged) if(HAS_TRAIT(I, TRAIT_TOOL_SCREWDRIVER)) - if(!skillcheck(user, SKILL_ENGINEER, SKILL_ENGINEER_ENGI)) + if(!skillcheck(user, SKILL_ENGINEER, SKILL_ENGINEER_TRAINED)) to_chat(user, SPAN_WARNING("You have no clue how to repair [src].")) return FALSE @@ -160,7 +160,7 @@ return TRUE else if(HAS_TRAIT(I, TRAIT_TOOL_CROWBAR)) - if(!skillcheck(user, SKILL_ENGINEER, SKILL_ENGINEER_ENGI)) + if(!skillcheck(user, SKILL_ENGINEER, SKILL_ENGINEER_TRAINED)) to_chat(user, SPAN_WARNING("You have no clue how to repair [src].")) return FALSE @@ -183,7 +183,7 @@ return var/obj/item/tool/weldingtool/welder = I - if(!skillcheck(user, SKILL_ENGINEER, SKILL_ENGINEER_ENGI)) + if(!skillcheck(user, SKILL_ENGINEER, SKILL_ENGINEER_TRAINED)) to_chat(user, SPAN_WARNING("You have no clue how to repair [src].")) return FALSE @@ -206,7 +206,7 @@ else if(iscoil(I)) var/obj/item/stack/cable_coil/coil = I - if(!skillcheck(user, SKILL_ENGINEER, SKILL_ENGINEER_ENGI)) + if(!skillcheck(user, SKILL_ENGINEER, SKILL_ENGINEER_TRAINED)) to_chat(user, SPAN_WARNING("You have no clue how to repair [src].")) return FALSE @@ -228,7 +228,7 @@ return TRUE else if(istype(I, /obj/item/device/lightreplacer)) - if(!skillcheck(user, SKILL_ENGINEER, SKILL_ENGINEER_ENGI)) + if(!skillcheck(user, SKILL_ENGINEER, SKILL_ENGINEER_TRAINED)) to_chat(user, SPAN_WARNING("You have no clue how to repair [src].")) return FALSE @@ -271,7 +271,7 @@ if(ishuman(user)) if(damaged) . += SPAN_WARNING("It is damaged.") - if(skillcheck(user, SKILL_ENGINEER, SKILL_ENGINEER_ENGI)) + if(skillcheck(user, SKILL_ENGINEER, SKILL_ENGINEER_TRAINED)) switch(repair_state) if(FLOODLIGHT_REPAIR_UNSCREW) . += SPAN_INFO("You must first unscrew its maintenance hatch.") if(FLOODLIGHT_REPAIR_CROWBAR) . += SPAN_INFO("You must crowbar its lighting assembly out or use a light replacer.") diff --git a/code/game/machinery/computer/arcade.dm b/code/game/machinery/computer/arcade.dm index ff8f3959d64e..4f6f4df4ef08 100644 --- a/code/game/machinery/computer/arcade.dm +++ b/code/game/machinery/computer/arcade.dm @@ -123,7 +123,7 @@ src.temp = "[src.enemy_name] has fallen! Rejoice!" if(!length(contents)) - var/prizeselect = pickweight(prizes) + var/prizeselect = pick_weight(prizes) new prizeselect(src.loc) if(istype(prizeselect, /obj/item/toy/gun)) //Ammo comes with the gun @@ -176,5 +176,5 @@ if(2) num_of_prizes = rand(0,2) for(num_of_prizes; num_of_prizes > 0; num_of_prizes--) - empprize = pickweight(prizes) + empprize = pick_weight(prizes) new empprize(src.loc) diff --git a/code/game/machinery/computer/camera_console.dm b/code/game/machinery/computer/camera_console.dm index c818df9fbfb9..e549436669de 100644 --- a/code/game/machinery/computer/camera_console.dm +++ b/code/game/machinery/computer/camera_console.dm @@ -352,6 +352,10 @@ /obj/structure/machinery/computer/cameras/almayer_network/vehicle network = list(CAMERA_NET_ALMAYER, CAMERA_NET_VEHICLE) +/obj/structure/machinery/computer/cameras/almayer_brig + name = "Brig Cameras Console" + network = list(CAMERA_NET_BRIG) + /obj/structure/machinery/computer/cameras/mortar name = "Mortar Camera Interface" alpha = 0 diff --git a/code/game/machinery/computer/computer.dm b/code/game/machinery/computer/computer.dm index bfa64ab174ed..bb434e8ca114 100644 --- a/code/game/machinery/computer/computer.dm +++ b/code/game/machinery/computer/computer.dm @@ -99,7 +99,7 @@ if(!deconstructible) to_chat(user, SPAN_WARNING("You can't figure out how to deconstruct [src]...")) return - if(!skillcheck(user, SKILL_ENGINEER, SKILL_ENGINEER_ENGI)) + if(!skillcheck(user, SKILL_ENGINEER, SKILL_ENGINEER_TRAINED)) to_chat(user, SPAN_WARNING("You don't know how to deconstruct [src]...")) return playsound(src.loc, 'sound/items/Screwdriver.ogg', 25, 1) diff --git a/code/game/machinery/computer/demo_sim.dm b/code/game/machinery/computer/demo_sim.dm index f633e8f351d4..2b2ca9fda775 100644 --- a/code/game/machinery/computer/demo_sim.dm +++ b/code/game/machinery/computer/demo_sim.dm @@ -11,7 +11,7 @@ /obj/structure/machinery/computer/demo_sim/attackby(obj/item/B, mob/living/user) if(inoperable()) return - if(!skillcheck(user, SKILL_ENGINEER, SKILL_ENGINEER_ENGI)) + if(!skillcheck(user, SKILL_ENGINEER, SKILL_ENGINEER_TRAINED)) to_chat(user, SPAN_WARNING("You don't know how to configure [src].")) return if(configuration) diff --git a/code/game/machinery/constructable_frame.dm b/code/game/machinery/constructable_frame.dm index 0c8cc62c3f87..3b7880320da7 100644 --- a/code/game/machinery/constructable_frame.dm +++ b/code/game/machinery/constructable_frame.dm @@ -15,7 +15,7 @@ var/list/req_component_names = null var/state = CONSTRUCTION_STATE_BEGIN var/required_skill = SKILL_CONSTRUCTION_ENGI - var/required_dismantle_skill = SKILL_ENGINEER_ENGI + var/required_dismantle_skill = SKILL_ENGINEER_TRAINED /obj/structure/machinery/constructable_frame/Initialize(mapload, ...) . = ..() diff --git a/code/game/machinery/door_control.dm b/code/game/machinery/door_control.dm index 3f5e78dfc39f..266a58f62023 100644 --- a/code/game/machinery/door_control.dm +++ b/code/game/machinery/door_control.dm @@ -61,6 +61,9 @@ var/obj/docking_port/mobile/marine_dropship/shuttle = SSshuttle.getShuttle(ship_id) if (!istype(shuttle)) return + var/obj/structure/machinery/computer/shuttle/dropship/flight/comp = shuttle.getControlConsole() + if(comp?.dropship_control_lost) + return if(is_mainship_level(z)) // on the almayer return diff --git a/code/game/machinery/doors/airlock.dm b/code/game/machinery/doors/airlock.dm index 84f02f0a5bbd..9ac9765371f3 100644 --- a/code/game/machinery/doors/airlock.dm +++ b/code/game/machinery/doors/airlock.dm @@ -439,7 +439,7 @@ GLOBAL_LIST_INIT(airlock_wire_descriptions, list( return if(panel_open) - if(ishuman(usr) && !skillcheck(usr, SKILL_ENGINEER, SKILL_ENGINEER_ENGI)) + if(ishuman(usr) && !skillcheck(usr, SKILL_ENGINEER, SKILL_ENGINEER_TRAINED)) to_chat(usr, SPAN_WARNING("You look into \the [src]'s access panel and can only see a jumbled mess of colored wires...")) return FALSE @@ -483,7 +483,7 @@ GLOBAL_LIST_INIT(airlock_wire_descriptions, list( add_fingerprint(usr) if((in_range(src, usr) && istype(loc, /turf)) && panel_open) - if(ishuman(usr) && !skillcheck(usr, SKILL_ENGINEER, SKILL_ENGINEER_ENGI)) + if(ishuman(usr) && !skillcheck(usr, SKILL_ENGINEER, SKILL_ENGINEER_TRAINED)) to_chat(usr, SPAN_WARNING("You don't understand anything about [src]'s wiring!")) return FALSE @@ -649,7 +649,7 @@ GLOBAL_LIST_INIT(airlock_wire_descriptions, list( else if(attacking_item.pry_capable) if(attacking_item.pry_capable == IS_PRY_CAPABLE_CROWBAR && panel_open && welded) - if(!skillcheck(user, SKILL_ENGINEER, SKILL_ENGINEER_ENGI)) + if(!skillcheck(user, SKILL_ENGINEER, SKILL_ENGINEER_TRAINED)) to_chat(user, SPAN_WARNING("You don't seem to know how to deconstruct machines.")) return playsound(loc, 'sound/items/Crowbar.ogg', 25, 1) diff --git a/code/game/machinery/doors/multi_tile.dm b/code/game/machinery/doors/multi_tile.dm index f95ef09e812f..6e7f571a0d4e 100644 --- a/code/game/machinery/doors/multi_tile.dm +++ b/code/game/machinery/doors/multi_tile.dm @@ -262,14 +262,14 @@ var/datum/door_controller/single/control = linked_dropship.door_control.door_controllers[direction] if (control.status != SHUTTLE_DOOR_BROKEN) return ..() - if(!skillcheck(user, SKILL_ENGINEER, SKILL_ENGINEER_ENGI) && !skillcheck(user, SKILL_PILOT, SKILL_PILOT_TRAINED)) + if(!skillcheck(user, SKILL_ENGINEER, SKILL_ENGINEER_TRAINED) && !skillcheck(user, SKILL_PILOT, SKILL_PILOT_TRAINED)) to_chat(user, SPAN_WARNING("You don't seem to understand how to restore a remote connection to [src].")) return if(user.action_busy) return to_chat(user, SPAN_WARNING("You begin to restore the remote connection to [src].")) - if(!do_after(user, (skillcheck(user, SKILL_ENGINEER, SKILL_ENGINEER_ENGI) ? 5 SECONDS : 8 SECONDS), INTERRUPT_ALL, BUSY_ICON_BUILD)) + if(!do_after(user, (skillcheck(user, SKILL_ENGINEER, SKILL_ENGINEER_TRAINED) ? 5 SECONDS : 8 SECONDS), INTERRUPT_ALL, BUSY_ICON_BUILD)) to_chat(user, SPAN_WARNING("You fail to restore a remote connection to [src].")) return unlock(TRUE) diff --git a/code/game/machinery/fusion_engine.dm b/code/game/machinery/fusion_engine.dm index 72f836717b0f..06ae3321a2c5 100644 --- a/code/game/machinery/fusion_engine.dm +++ b/code/game/machinery/fusion_engine.dm @@ -140,7 +140,7 @@ if(overloaded) . += SPAN_INFO("It is overloaded.") return - if(skillcheck(user, SKILL_ENGINEER, SKILL_ENGINEER_ENGI)) + if(skillcheck(user, SKILL_ENGINEER, SKILL_ENGINEER_TRAINED)) . += SPAN_INFO("You could overload its safeties with a multitool.") /obj/structure/machinery/power/reactor/power_change() @@ -344,7 +344,7 @@ if(!is_ship_reactor) return - if(!skillcheck(user, SKILL_ENGINEER, SKILL_ENGINEER_ENGI)) + if(!skillcheck(user, SKILL_ENGINEER, SKILL_ENGINEER_TRAINED)) return to_chat(user, SPAN_WARNING("You start [overloaded ? "overloading" : "restoring"] the safeties on [src].")) @@ -446,7 +446,7 @@ var/repair_time = 20 SECONDS repair_time *= user.get_skill_duration_multiplier(SKILL_ENGINEER) - if(!skillcheck(user, SKILL_ENGINEER, SKILL_ENGINEER_ENGI)) + if(!skillcheck(user, SKILL_ENGINEER, SKILL_ENGINEER_TRAINED)) repair_time += 5 SECONDS to_chat(user, SPAN_NOTICE("You start repairing [src] with [tool].")) diff --git a/code/game/machinery/hologram.dm b/code/game/machinery/hologram.dm deleted file mode 100644 index fe8243704a72..000000000000 --- a/code/game/machinery/hologram.dm +++ /dev/null @@ -1,61 +0,0 @@ -/* Holograms! - * Contains: - * Hologram - * Holopad - * Other stuff - */ - - - -/* - * Hologram - */ - -/obj/structure/machinery/hologram - anchored = TRUE - use_power = USE_POWER_IDLE - idle_power_usage = 5 - active_power_usage = 100 - var/obj/effect/overlay/hologram //The projection itself. If there is one, the instrument is on, off otherwise. - -/obj/structure/machinery/hologram/ex_act(severity) - switch(severity) - if(0 to EXPLOSION_THRESHOLD_LOW) - if (prob(5)) - qdel(src) - if(EXPLOSION_THRESHOLD_LOW to EXPLOSION_THRESHOLD_MEDIUM) - if (prob(50)) - qdel(src) - if(EXPLOSION_THRESHOLD_MEDIUM to INFINITY) - qdel(src) - -/obj/structure/machinery/hologram/Destroy() - if(hologram) - clear_holo() - return ..() - -/obj/structure/machinery/hologram/proc/clear_holo() - if(hologram) - qdel(hologram) - hologram = null - - - -/* - * Holopad - */ - -/obj/structure/machinery/hologram/holopad - name = "\improper AI holopad" - desc = "It's a floor-mounted device for projecting holographic images. It is activated remotely." - icon_state = "holopad0" - - layer = TURF_LAYER+0.1 //Preventing mice and drones from sneaking under them. -/* - * Other Stuff: Is this even used? - */ -/obj/structure/machinery/hologram/projector - name = "hologram projector" - desc = "It makes a hologram appear...with magnets or something..." - icon = 'icons/obj/structures/props/stationobjs.dmi' - icon_state = "holopad0" diff --git a/code/game/machinery/kitchen/gibber.dm b/code/game/machinery/kitchen/gibber.dm index b71fb51a49de..9e6a2198962e 100644 --- a/code/game/machinery/kitchen/gibber.dm +++ b/code/game/machinery/kitchen/gibber.dm @@ -20,37 +20,6 @@ if (PF) PF.flags_can_pass_all = PASS_HIGH_OVER_ONLY|PASS_AROUND|PASS_OVER_THROW_ITEM -//auto-gibs anything that bumps into it -/obj/structure/machinery/gibber/autogibber - var/turf/input_plate - -/obj/structure/machinery/gibber/autogibber/New() - ..() - spawn(5) - for(var/i in GLOB.cardinals) - var/obj/structure/machinery/mineral/input/input_obj = locate( /obj/structure/machinery/mineral/input, get_step(loc, i) ) - if(input_obj) - if(isturf(input_obj.loc)) - input_plate = input_obj.loc - qdel(input_obj) - break - - if(!input_plate) - log_misc("a [src] didn't find an input plate.") - return - -/obj/structure/machinery/gibber/autogibber/Collided(atom/A) - if(!input_plate) return - - if(ismob(A)) - var/mob/M = A - - if(M.loc == input_plate - ) - M.forceMove(src) - M.gib() - - /obj/structure/machinery/gibber/New() ..() overlays += image('icons/obj/structures/machinery/kitchen.dmi', "grjam") diff --git a/code/game/machinery/kitchen/smartfridge.dm b/code/game/machinery/kitchen/smartfridge.dm index 774153316baa..957f6c97eca3 100644 --- a/code/game/machinery/kitchen/smartfridge.dm +++ b/code/game/machinery/kitchen/smartfridge.dm @@ -350,7 +350,7 @@ if("cutwire") if(!panel_open) return FALSE - if(!skillcheck(usr, SKILL_ENGINEER, SKILL_ENGINEER_ENGI)) + if(!skillcheck(usr, SKILL_ENGINEER, SKILL_ENGINEER_TRAINED)) to_chat(usr, SPAN_WARNING("You don't understand anything about this wiring...")) return FALSE var/obj/item/held_item = user.get_held_item() @@ -364,7 +364,7 @@ if("fixwire") if(!panel_open) return FALSE - if(!skillcheck(usr, SKILL_ENGINEER, SKILL_ENGINEER_ENGI)) + if(!skillcheck(usr, SKILL_ENGINEER, SKILL_ENGINEER_TRAINED)) to_chat(usr, SPAN_WARNING("You don't understand anything about this wiring...")) return FALSE var/obj/item/held_item = user.get_held_item() @@ -377,7 +377,7 @@ if("pulsewire") if(!panel_open) return FALSE - if(!skillcheck(usr, SKILL_ENGINEER, SKILL_ENGINEER_ENGI)) + if(!skillcheck(usr, SKILL_ENGINEER, SKILL_ENGINEER_TRAINED)) to_chat(usr, SPAN_WARNING("You don't understand anything about this wiring...")) return FALSE var/obj/item/held_item = user.get_held_item() diff --git a/code/game/machinery/machinery.dm b/code/game/machinery/machinery.dm index f835ecaa424c..f7244fb8ce0d 100644 --- a/code/game/machinery/machinery.dm +++ b/code/game/machinery/machinery.dm @@ -171,7 +171,7 @@ Class Procs: . += "It does not appear to be working." var/msg = get_repair_move_text(FALSE) - if(msg && skillcheck(user, SKILL_ENGINEER, SKILL_ENGINEER_ENGI)) + if(msg && skillcheck(user, SKILL_ENGINEER, SKILL_ENGINEER_TRAINED)) . += SPAN_WARNING("[msg]") /obj/structure/machinery/emp_act(severity) diff --git a/code/game/machinery/mass_driver.dm b/code/game/machinery/mass_driver.dm deleted file mode 100644 index f1b0081e3a39..000000000000 --- a/code/game/machinery/mass_driver.dm +++ /dev/null @@ -1,10 +0,0 @@ -// Legacy SS13 machinery turned into a prop -/obj/structure/machinery/mass_driver - name = "mass driver" - desc = "Shoots things into space." - icon = 'icons/obj/structures/props/stationobjs.dmi' - icon_state = "mass_driver" - anchored = TRUE - use_power = USE_POWER_IDLE - idle_power_usage = 2 - active_power_usage = 50 diff --git a/code/game/machinery/medical_pod/autodoc.dm b/code/game/machinery/medical_pod/autodoc.dm index ef335c6841e6..b5fd43b35651 100644 --- a/code/game/machinery/medical_pod/autodoc.dm +++ b/code/game/machinery/medical_pod/autodoc.dm @@ -238,11 +238,6 @@ surgery_list += create_autodoc_surgery(L,ORGAN_SURGERY,"damage",0,I) organdamagesurgery++ - if(istype(L,/obj/limb/head)) - var/obj/limb/head/H = L - if(H.disfigured) - surgery_list += create_autodoc_surgery(L,LIMB_SURGERY,"facial") - if(L.status & LIMB_BROKEN) surgery_list += create_autodoc_surgery(L,LIMB_SURGERY,"broken") if(L.status & LIMB_DESTROYED) @@ -521,20 +516,6 @@ if(!surgery) break close_incision(H,S.limb_ref) - if("facial") - if(prob(30)) visible_message("[icon2html(src, viewers(src))] \The [src] speaks: Beginning Facial Reconstruction Surgery."); - if(S.unneeded) - sleep(UNNEEDED_DELAY) - visible_message("[icon2html(src, viewers(src))] \The [src] speaks: Procedure has been deemed unnecessary."); - surgery_todo_list -= S - continue - if(istype(S.limb_ref, /obj/limb/head)) - var/obj/limb/head/F = S.limb_ref - sleep(SCALPEL_MAX_DURATION + HEMOSTAT_MAX_DURATION + RETRACTOR_MAX_DURATION + CAUTERY_MAX_DURATION) - F.remove_all_bleeding(TRUE) - F.disfigured = 0 - F.owner.name = F.owner.get_visible_name() - if("open") if(prob(30)) visible_message("[icon2html(src, viewers(src))] \The [src]croaks: Closing surgical incision."); close_encased(H,S.limb_ref) @@ -753,9 +734,6 @@ if("shrapnel") surgeryqueue["shrapnel"] = 1 dat += "Shrapnel Removal Surgery" - if("facial") - surgeryqueue["facial"] = 1 - dat += "Facial Reconstruction Surgery" if("open") surgeryqueue["open"] = 1 dat += "Close Open Incisions" @@ -902,18 +880,6 @@ N.fields["autodoc_manual"] += create_autodoc_surgery(null,LIMB_SURGERY,"shrapnel",1) updateUsrDialog() - if(href_list["facial"]) - for(var/obj/limb/L in connected.occupant.limbs) - if(L) - if(istype(L,/obj/limb/head)) - var/obj/limb/head/J = L - if(J.disfigured) - N.fields["autodoc_manual"] += create_autodoc_surgery(L,LIMB_SURGERY,"facial") - else - N.fields["autodoc_manual"] += create_autodoc_surgery(L,LIMB_SURGERY,"facial",1) - updateUsrDialog() - break - if(href_list["open"]) for(var/obj/limb/L in connected.occupant.limbs) if(L) diff --git a/code/game/machinery/mining.dm b/code/game/machinery/mining.dm index 0662817174fc..97ba4a804f1d 100644 --- a/code/game/machinery/mining.dm +++ b/code/game/machinery/mining.dm @@ -1,25 +1,3 @@ -/obj/structure/machinery/mineral/input - icon = 'icons/mob/hud/screen1.dmi' - icon_state = "x2" - name = "Input area" - density = FALSE - anchored = TRUE - -/obj/structure/machinery/mineral/input/Initialize(mapload, ...) - . = ..() - icon_state = "blank" - -/obj/structure/machinery/mineral/output - icon = 'icons/mob/hud/screen1.dmi' - icon_state = "x" - name = "Output area" - density = FALSE - anchored = TRUE - -/obj/structure/machinery/mineral/output/Initialize(mapload, ...) - . = ..() - icon_state = "blank" - /obj/structure/machinery/mineral/processing_unit name = "material processor" //This isn't actually a goddamn furnace, we're in space and it's processing platinum and flammable phoron... icon = 'icons/obj/structures/machinery/mining_machines.dmi' diff --git a/code/game/machinery/seed_extractor.dm b/code/game/machinery/seed_extractor.dm index 0b4574cc9fb4..71caa7a869cf 100644 --- a/code/game/machinery/seed_extractor.dm +++ b/code/game/machinery/seed_extractor.dm @@ -6,32 +6,61 @@ density = TRUE anchored = TRUE -/obj/structure/machinery/seed_extractor/attackby(obj/item/O as obj, mob/user as mob) +/obj/structure/machinery/seed_extractor/attackby(obj/item/object as obj, mob/user as mob) + // Plant bag and other storage containers. + if(istype(object,/obj/item/storage)) + var/obj/item/storage/container = object + if(length(container.contents) == 0) + to_chat(user, SPAN_NOTICE("[container] is empty.")) + return + + to_chat(user, SPAN_NOTICE("You start dumping the contents of [container] into [src].")) + if(!do_after(user, 1.5 SECONDS, INTERRUPT_ALL, BUSY_ICON_GENERIC)) + return + + for(var/obj/item/item as anything in container) + if(extract(item, user)) + // Properly deletes container contents after they've been processed + container.remove_from_storage(item) + item.moveToNullspace() + + playsound(user.loc, "rustle", 15, 1, 6) + else + extract(object, user) + + + +/obj/structure/machinery/seed_extractor/proc/extract(obj/item/object as obj, mob/user as mob) // Fruits and vegetables. - if(istype(O, /obj/item/reagent_container/food/snacks/grown) || istype(O, /obj/item/grown)) - if(user.temp_drop_inv_item(O)) + if(istype(object, /obj/item/reagent_container/food/snacks/grown) || istype(object, /obj/item/grown)) + if(user.temp_drop_inv_item(object)) var/datum/seed/new_seed_type - if(istype(O, /obj/item/grown)) - var/obj/item/grown/F = O - new_seed_type = GLOB.seed_types[F.plantname] + if(istype(object, /obj/item/grown)) + var/obj/item/grown/plant = object + new_seed_type = GLOB.seed_types[plant.plantname] else - var/obj/item/reagent_container/food/snacks/grown/F = O - new_seed_type = GLOB.seed_types[F.plantname] + var/obj/item/reagent_container/food/snacks/grown/plant = object + new_seed_type = GLOB.seed_types[plant.plantname] if(new_seed_type) - to_chat(user, SPAN_NOTICE("You extract some seeds from [O].")) + to_chat(user, SPAN_NOTICE("You extract some seeds from [object].")) var/produce = rand(1,4) for(var/i = 0;i<=produce;i++) var/obj/item/seeds/seeds = new(get_turf(src)) seeds.seed_type = new_seed_type.name seeds.update_seed() else - to_chat(user, "[O] doesn't seem to have any usable seeds inside it.") - qdel(O) + to_chat(user, "[object] doesn't seem to have any usable seeds inside it.") + qdel(object) + return TRUE //Grass. - else if(istype(O, /obj/item/stack/tile/grass)) - var/obj/item/stack/tile/grass/S = O - if (S.use(1)) + else if(istype(object, /obj/item/stack/tile/grass)) + var/obj/item/stack/tile/grass/grass = object + if (grass.use(1)) to_chat(user, SPAN_NOTICE("You extract some seeds from the grass tile.")) new /obj/item/seeds/grassseed(loc) + return TRUE + else + to_chat(user, SPAN_WARNING("Cannot get seeds from [object].")) + return FALSE diff --git a/code/game/machinery/telecomms/machine_interactions.dm b/code/game/machinery/telecomms/machine_interactions.dm index 9bffa8ebe450..31cd2cf94d4e 100644 --- a/code/game/machinery/telecomms/machine_interactions.dm +++ b/code/game/machinery/telecomms/machine_interactions.dm @@ -22,7 +22,7 @@ attack_hand(user) else - if(!skillcheck(user, SKILL_ENGINEER, SKILL_ENGINEER_ENGI)) + if(!skillcheck(user, SKILL_ENGINEER, SKILL_ENGINEER_TRAINED)) to_chat(user, SPAN_WARNING("You stare at \the [src] cluelessly...")) return 0 @@ -103,7 +103,7 @@ // You need a multitool to use this, or be silicon if(!isSilicon(user)) - if(!skillcheck(user, SKILL_ENGINEER, SKILL_ENGINEER_ENGI)) + if(!skillcheck(user, SKILL_ENGINEER, SKILL_ENGINEER_TRAINED)) to_chat(user, SPAN_WARNING("You stare at \the [src] cluelessly...")) return // istype returns false if the value is null diff --git a/code/game/machinery/telecomms/portable_comms.dm b/code/game/machinery/telecomms/portable_comms.dm index c2a9bb1072ac..cf7ef1c1f2ef 100644 --- a/code/game/machinery/telecomms/portable_comms.dm +++ b/code/game/machinery/telecomms/portable_comms.dm @@ -3,7 +3,7 @@ desc = "A portable compact TC-4T telecommunications construction kit. Used to set up subspace communications lines between planetary and extra-planetary locations. Needs cabling." icon = 'icons/obj/structures/machinery/comm_tower2.dmi' icon_state = "construct_0_0" - required_skill = SKILL_ENGINEER_ENGI + required_skill = SKILL_ENGINEER_TRAINED required_dismantle_skill = 5 density = TRUE anchored = FALSE diff --git a/code/game/machinery/telecomms/presets.dm b/code/game/machinery/telecomms/presets.dm index 0c9e875534da..de2491126c7c 100644 --- a/code/game/machinery/telecomms/presets.dm +++ b/code/game/machinery/telecomms/presets.dm @@ -122,7 +122,7 @@ return if(user.action_busy) return - if(!skillcheck(user, SKILL_ENGINEER, SKILL_ENGINEER_TRAINED)) + if(!skillcheck(user, SKILL_ENGINEER, SKILL_ENGINEER_NOVICE)) to_chat(user, SPAN_WARNING("You're not trained to repair [src]...")) return var/obj/item/tool/weldingtool/WT = I diff --git a/code/game/machinery/vending/cm_vending.dm b/code/game/machinery/vending/cm_vending.dm index db173e7b1608..2d15d4c37da8 100644 --- a/code/game/machinery/vending/cm_vending.dm +++ b/code/game/machinery/vending/cm_vending.dm @@ -153,7 +153,7 @@ GLOBAL_LIST_EMPTY(vending_products) /obj/structure/machinery/cm_vending/get_examine_text(mob/living/carbon/human/user) . = ..() - if(skillcheck(user, SKILL_ENGINEER, SKILL_ENGINEER_ENGI) && hackable) + if(skillcheck(user, SKILL_ENGINEER, SKILL_ENGINEER_TRAINED) && hackable) . += SPAN_NOTICE("You believe you can hack this one to remove the access requirements.") /obj/structure/machinery/cm_vending/proc/hack_access(mob/user) @@ -678,7 +678,7 @@ GLOBAL_LIST_EMPTY(vending_products) to_chat(user, SPAN_WARNING("You need to set [src] back upright first.")) return if(HAS_TRAIT(W, TRAIT_TOOL_SCREWDRIVER)) - if(!skillcheck(user, SKILL_ENGINEER, SKILL_ENGINEER_ENGI)) + if(!skillcheck(user, SKILL_ENGINEER, SKILL_ENGINEER_TRAINED)) to_chat(user, SPAN_WARNING("You do not understand how to repair the broken [src].")) return FALSE else if(stat & MAINT) @@ -705,7 +705,7 @@ GLOBAL_LIST_EMPTY(vending_products) to_chat(user, SPAN_WARNING("[msg]")) return FALSE else if(HAS_TRAIT(W, TRAIT_TOOL_WIRECUTTERS)) - if(!skillcheck(user, SKILL_ENGINEER, SKILL_ENGINEER_ENGI)) + if(!skillcheck(user, SKILL_ENGINEER, SKILL_ENGINEER_TRAINED)) to_chat(user, SPAN_WARNING("You do not understand how to repair the broken [src].")) return FALSE else if(stat & REPAIR_STEP_ONE) @@ -722,7 +722,7 @@ GLOBAL_LIST_EMPTY(vending_products) to_chat(user, SPAN_WARNING("[msg]")) return FALSE else if(iswire(W)) - if(!skillcheck(user, SKILL_ENGINEER, SKILL_ENGINEER_ENGI)) + if(!skillcheck(user, SKILL_ENGINEER, SKILL_ENGINEER_TRAINED)) to_chat(user, SPAN_WARNING("You do not understand how to repair the broken [src].")) return FALSE var/obj/item/stack/cable_coil/CC = W @@ -745,7 +745,7 @@ GLOBAL_LIST_EMPTY(vending_products) to_chat(user, SPAN_WARNING("[msg]")) return else if(istype(W, /obj/item/stack/sheet/metal)) - if(!skillcheck(user, SKILL_ENGINEER, SKILL_ENGINEER_ENGI)) + if(!skillcheck(user, SKILL_ENGINEER, SKILL_ENGINEER_TRAINED)) to_chat(user, SPAN_WARNING("You do not understand how to repair the broken [src].")) return FALSE var/obj/item/stack/sheet/metal/M = W @@ -768,7 +768,7 @@ GLOBAL_LIST_EMPTY(vending_products) else if(HAS_TRAIT(W, TRAIT_TOOL_MULTITOOL)) var/obj/item/device/multitool/MT = W - if(!skillcheck(user, SKILL_ENGINEER, SKILL_ENGINEER_ENGI) && !skillcheckexplicit(user, SKILL_ANTAG, SKILL_ANTAG_AGENT)) + if(!skillcheck(user, SKILL_ENGINEER, SKILL_ENGINEER_TRAINED) && !skillcheckexplicit(user, SKILL_ANTAG, SKILL_ANTAG_AGENT)) to_chat(user, SPAN_WARNING("You do not understand how tweak access requirements in [src].")) return FALSE if(stat != WORKING) diff --git a/code/game/machinery/vending/vending.dm b/code/game/machinery/vending/vending.dm index a05245e4b185..c6ef6eb7a574 100644 --- a/code/game/machinery/vending/vending.dm +++ b/code/game/machinery/vending/vending.dm @@ -207,7 +207,7 @@ GLOBAL_LIST_EMPTY_TYPED(total_vending_machines, /obj/structure/machinery/vending to_chat(user, "You [panel_open ? "open" : "close"] the maintenance panel.") update_icon() return TRUE - else if(!skillcheck(user, SKILL_ENGINEER, SKILL_ENGINEER_ENGI)) + else if(!skillcheck(user, SKILL_ENGINEER, SKILL_ENGINEER_TRAINED)) to_chat(user, SPAN_WARNING("You do not understand how to repair the broken [src.name].")) return FALSE else if(stat & BROKEN) @@ -234,7 +234,7 @@ GLOBAL_LIST_EMPTY_TYPED(total_vending_machines, /obj/structure/machinery/vending to_chat(user, SPAN_WARNING("[msg]")) return FALSE else if(HAS_TRAIT(item, TRAIT_TOOL_WIRECUTTERS)) - if(!skillcheck(user, SKILL_ENGINEER, SKILL_ENGINEER_ENGI)) + if(!skillcheck(user, SKILL_ENGINEER, SKILL_ENGINEER_TRAINED)) to_chat(user, SPAN_WARNING("You do not understand how to repair the broken [src.name].")) return FALSE else if(stat == WORKING && panel_open) @@ -254,7 +254,7 @@ GLOBAL_LIST_EMPTY_TYPED(total_vending_machines, /obj/structure/machinery/vending to_chat(user, SPAN_WARNING("[msg]")) return FALSE else if(istype(item, /obj/item/stack/cable_coil)) - if(!skillcheck(user, SKILL_ENGINEER, SKILL_ENGINEER_ENGI)) + if(!skillcheck(user, SKILL_ENGINEER, SKILL_ENGINEER_TRAINED)) to_chat(user, SPAN_WARNING("You do not understand how to repair the broken [src.name].")) return FALSE var/obj/item/stack/cable_coil/CC = item @@ -277,7 +277,7 @@ GLOBAL_LIST_EMPTY_TYPED(total_vending_machines, /obj/structure/machinery/vending to_chat(user, SPAN_WARNING("[msg]")) return else if(istype(item, /obj/item/stack/sheet/metal)) - if(!skillcheck(user, SKILL_ENGINEER, SKILL_ENGINEER_ENGI)) + if(!skillcheck(user, SKILL_ENGINEER, SKILL_ENGINEER_TRAINED)) to_chat(user, SPAN_WARNING("You do not understand how to repair the broken [src.name].")) return FALSE var/obj/item/stack/sheet/metal/M = item diff --git a/code/game/machinery/vending/vendor_types/crew/combat_correspondent.dm b/code/game/machinery/vending/vendor_types/crew/combat_correspondent.dm index b0894ca2a5a2..81bee126dbc8 100644 --- a/code/game/machinery/vending/vendor_types/crew/combat_correspondent.dm +++ b/code/game/machinery/vending/vendor_types/crew/combat_correspondent.dm @@ -3,9 +3,11 @@ GLOBAL_LIST_INIT(cm_vending_clothing_combat_correspondent, list( list("STANDARD EQUIPMENT (TAKE ALL)", 0, null, null, null), list("Essential Reporter's Set", 0, /obj/effect/essentials_set/cc, MARINE_CAN_BUY_ESSENTIALS, VENDOR_ITEM_MANDATORY), + list("Leather Satchel", 0, /obj/item/storage/backpack/satchel, MARINE_CAN_BUY_BACKPACK, VENDOR_ITEM_REGULAR), + + list("CIVILIAN EQUIPMENT (TAKE ALL)", 0, null, null, null), list("Portable Press Fax Machine", 0, /obj/item/device/fax_backpack, CIVILIAN_CAN_BUY_BACKPACK, VENDOR_ITEM_RECOMMENDED), list("Press Broadcasting Camera", 0, /obj/item/device/camera/broadcasting, CIVILIAN_CAN_BUY_UTILITY, VENDOR_ITEM_RECOMMENDED), - list("Leather Satchel", 0, /obj/item/storage/backpack/satchel, MARINE_CAN_BUY_BACKPACK, VENDOR_ITEM_REGULAR), list("UNIFORM (CHOOSE 1)", 0, null, null, null), list("Black Uniform", 0, /obj/item/clothing/under/marine/reporter/black, MARINE_CAN_BUY_UNIFORM, VENDOR_ITEM_REGULAR), diff --git a/code/game/machinery/vending/vendor_types/crew/commanding_officer.dm b/code/game/machinery/vending/vendor_types/crew/commanding_officer.dm index d7d49a8ae044..dd2fc9c4a5b7 100644 --- a/code/game/machinery/vending/vendor_types/crew/commanding_officer.dm +++ b/code/game/machinery/vending/vendor_types/crew/commanding_officer.dm @@ -32,6 +32,7 @@ GLOBAL_LIST_INIT(cm_vending_gear_commanding_officer, list( list("HEDP Grenade Pack", 15, /obj/item/storage/box/packet/high_explosive, null, VENDOR_ITEM_REGULAR), list("HEFA Grenade Pack", 15, /obj/item/storage/box/packet/hefa, null, VENDOR_ITEM_REGULAR), list("WP Grenade Pack", 15, /obj/item/storage/box/packet/phosphorus, null, VENDOR_ITEM_REGULAR), + list("G2 Electroshock Grenade Packet (x3 grenades)", 15, /obj/item/storage/box/packet/sebb, null, VENDOR_ITEM_REGULAR), list("RAIL ATTACHMENTS", 0, null, null, null), list("Red-Dot Sight", 15, /obj/item/attachable/reddot, null, VENDOR_ITEM_REGULAR), diff --git a/code/game/machinery/vending/vendor_types/crew/mp.dm b/code/game/machinery/vending/vendor_types/crew/mp.dm index b63a02248168..5f85060dc96f 100644 --- a/code/game/machinery/vending/vendor_types/crew/mp.dm +++ b/code/game/machinery/vending/vendor_types/crew/mp.dm @@ -24,7 +24,7 @@ GLOBAL_LIST_INIT(cm_vending_clothing_military_police, list( list("BELT (CHOOSE 1)", 0, null, null, null), list("M276 General Pistol Holster Rig", 0, /obj/item/storage/belt/gun/m4a3, MARINE_CAN_BUY_BELT, VENDOR_ITEM_REGULAR), - list("M276 M44 Holster Rig", 0, /obj/item/storage/belt/gun/m44, MARINE_CAN_BUY_BELT, VENDOR_ITEM_REGULAR), + list("M276 General Revolver Holster Rig", 0, /obj/item/storage/belt/gun/m44, MARINE_CAN_BUY_BELT, VENDOR_ITEM_REGULAR), list("M276 G8-A General Utility Pouch", 0, /obj/item/storage/backpack/general_belt, MARINE_CAN_BUY_BELT, VENDOR_ITEM_REGULAR), list("POUCHES (CHOOSE 2)", 0, null, null, null), @@ -82,7 +82,7 @@ GLOBAL_LIST_INIT(cm_vending_clothing_military_police_warden, list( list("BELT (CHOOSE 1)", 0, null, null, null), list("M276 General Pistol Holster Rig", 0, /obj/item/storage/belt/gun/m4a3, MARINE_CAN_BUY_BELT, VENDOR_ITEM_REGULAR), - list("M276 M44 Holster Rig", 0, /obj/item/storage/belt/gun/m44, MARINE_CAN_BUY_BELT, VENDOR_ITEM_REGULAR), + list("M276 General Revolver Holster Rig", 0, /obj/item/storage/belt/gun/m44, MARINE_CAN_BUY_BELT, VENDOR_ITEM_REGULAR), list("M276 G8-A General Utility Pouch", 0, /obj/item/storage/backpack/general_belt, MARINE_CAN_BUY_BELT, VENDOR_ITEM_REGULAR), list("POUCHES (CHOOSE 2)", 0, null, null, null), diff --git a/code/game/machinery/vending/vendor_types/crew/pilot_officer.dm b/code/game/machinery/vending/vendor_types/crew/pilot_officer.dm index 8f9ac837cb6a..45ad67d41c74 100644 --- a/code/game/machinery/vending/vendor_types/crew/pilot_officer.dm +++ b/code/game/machinery/vending/vendor_types/crew/pilot_officer.dm @@ -80,7 +80,7 @@ GLOBAL_LIST_INIT(cm_vending_clothing_pilot_officer, list( list("M276 Lifesaver Bag (Full)", 0, /obj/item/storage/belt/medical/lifesaver/full, MARINE_CAN_BUY_BELT, VENDOR_ITEM_RECOMMENDED), list("M276 Medical Storage Rig (Full)", 0, /obj/item/storage/belt/medical/full, MARINE_CAN_BUY_BELT, VENDOR_ITEM_RECOMMENDED), list("M276 M39 Holster Rig", 0, /obj/item/storage/belt/gun/m39, MARINE_CAN_BUY_BELT, VENDOR_ITEM_REGULAR), - list("M276 M44 Holster Rig", 0, /obj/item/storage/belt/gun/m44, MARINE_CAN_BUY_BELT, VENDOR_ITEM_REGULAR), + list("M276 General Revolver Holster Rig", 0, /obj/item/storage/belt/gun/m44, MARINE_CAN_BUY_BELT, VENDOR_ITEM_REGULAR), list("M276 M82F Holster Rig", 0, /obj/item/storage/belt/gun/flaregun, MARINE_CAN_BUY_BELT, VENDOR_ITEM_REGULAR), list("M276 General Pistol Holster Rig", 0, /obj/item/storage/belt/gun/m4a3, MARINE_CAN_BUY_BELT, VENDOR_ITEM_REGULAR), list("M276 Shotgun Shell Loading Rig", 0, /obj/item/storage/belt/shotgun, MARINE_CAN_BUY_BELT, VENDOR_ITEM_REGULAR), @@ -169,7 +169,7 @@ GLOBAL_LIST_INIT(cm_vending_clothing_dropship_crew_chief, list( list("M276 Lifesaver Bag (Full)", 0, /obj/item/storage/belt/medical/lifesaver/full, MARINE_CAN_BUY_BELT, VENDOR_ITEM_RECOMMENDED), list("M276 Medical Storage Rig (Full)", 0, /obj/item/storage/belt/medical/full, MARINE_CAN_BUY_BELT, VENDOR_ITEM_RECOMMENDED), list("M276 M39 Holster Rig", 0, /obj/item/storage/belt/gun/m39, MARINE_CAN_BUY_BELT, VENDOR_ITEM_REGULAR), - list("M276 M44 Holster Rig", 0, /obj/item/storage/belt/gun/m44, MARINE_CAN_BUY_BELT, VENDOR_ITEM_REGULAR), + list("M276 General Revolver Holster Rig", 0, /obj/item/storage/belt/gun/m44, MARINE_CAN_BUY_BELT, VENDOR_ITEM_REGULAR), list("M276 M82F Holster Rig", 0, /obj/item/storage/belt/gun/flaregun, MARINE_CAN_BUY_BELT, VENDOR_ITEM_REGULAR), list("M276 General Pistol Holster Rig", 0, /obj/item/storage/belt/gun/m4a3, MARINE_CAN_BUY_BELT, VENDOR_ITEM_REGULAR), list("M276 Shotgun Shell Loading Rig", 0, /obj/item/storage/belt/shotgun, MARINE_CAN_BUY_BELT, VENDOR_ITEM_REGULAR), diff --git a/code/game/machinery/vending/vendor_types/crew/senior_officers.dm b/code/game/machinery/vending/vendor_types/crew/senior_officers.dm index c43d7e730d89..b63a73a90f06 100644 --- a/code/game/machinery/vending/vendor_types/crew/senior_officers.dm +++ b/code/game/machinery/vending/vendor_types/crew/senior_officers.dm @@ -54,7 +54,7 @@ GLOBAL_LIST_INIT(cm_vending_clothing_military_police_chief, list( list("BELT (CHOOSE 1)", 0, null, null, null), list("M276 General Pistol Holster Rig", 0, /obj/item/storage/belt/gun/m4a3, MARINE_CAN_BUY_BELT, VENDOR_ITEM_REGULAR), - list("M276 M44 Holster Rig", 0, /obj/item/storage/belt/gun/m44, MARINE_CAN_BUY_BELT, VENDOR_ITEM_REGULAR), + list("M276 General Revolver Holster Rig", 0, /obj/item/storage/belt/gun/m44, MARINE_CAN_BUY_BELT, VENDOR_ITEM_REGULAR), list("M276 G8-A General Utility Pouch", 0, /obj/item/storage/backpack/general_belt, MARINE_CAN_BUY_BELT, VENDOR_ITEM_REGULAR), list("POUCHES (CHOOSE 2)", 0, null, null, null), @@ -329,19 +329,21 @@ GLOBAL_LIST_INIT(cm_vending_gear_xo, list( list("Shotgun Slugs", 20, /obj/item/ammo_magazine/shotgun/slugs, null, VENDOR_ITEM_REGULAR), list("Flechette Shells", 20, /obj/item/ammo_magazine/shotgun/flechette, null, VENDOR_ITEM_REGULAR), + list("SPECIALISATION KIT (CHOOSE 1)", 0, null, null, null), + list("Essential Engineer Set", 0, /obj/effect/essentials_set/engi, MARINE_CAN_BUY_ESSENTIALS, VENDOR_ITEM_RECOMMENDED), + list("Essential Medical Set", 0, /obj/effect/essentials_set/medic, MARINE_CAN_BUY_ESSENTIALS, VENDOR_ITEM_RECOMMENDED), + list("EXPLOSIVES", 0, null, null, null), list("HEDP Grenade Pack", 15, /obj/item/storage/box/packet/high_explosive, null, VENDOR_ITEM_REGULAR), list("HEFA Grenade Pack", 15, /obj/item/storage/box/packet/hefa, null, VENDOR_ITEM_REGULAR), list("WP Grenade Pack", 15, /obj/item/storage/box/packet/phosphorus, null, VENDOR_ITEM_REGULAR), list("RAIL ATTACHMENTS", 0, null, null, null), + list("Magnetic Harness", 12, /obj/item/attachable/magnetic_harness, null, VENDOR_ITEM_RECOMMENDED), list("Red-Dot Sight", 15, /obj/item/attachable/reddot, null, VENDOR_ITEM_REGULAR), list("Reflex Sight", 15, /obj/item/attachable/reflex, null, VENDOR_ITEM_REGULAR), list("S4 2x Telescopic Mini-Scope", 15, /obj/item/attachable/scope/mini, null, VENDOR_ITEM_REGULAR), - list("Helmet Visors", 0, null, null, null), - list("Welding Visor", 5, /obj/item/device/helmet_visor/welding_visor, null, VENDOR_ITEM_RECOMMENDED), - list("UNDERBARREL ATTACHMENTS", 0, null, null, null), list("Laser Sight", 15, /obj/item/attachable/lasersight, null, VENDOR_ITEM_REGULAR), list("Angled Grip", 15, /obj/item/attachable/angledgrip, null, VENDOR_ITEM_REGULAR), @@ -355,6 +357,22 @@ GLOBAL_LIST_INIT(cm_vending_gear_xo, list( list("Extended Barrel", 15, /obj/item/attachable/extended_barrel, null, VENDOR_ITEM_REGULAR), list("Recoil Compensator", 15, /obj/item/attachable/compensator, null, VENDOR_ITEM_REGULAR), list("Suppressor", 15, /obj/item/attachable/suppressor, null, VENDOR_ITEM_REGULAR), + + list("OTHER SUPPLIES", 0, null, null, null), + list("Welding Visor", 5, /obj/item/device/helmet_visor/welding_visor, null, VENDOR_ITEM_REGULAR), + list("Insulated Gloves", 3, /obj/item/clothing/gloves/yellow, null, VENDOR_ITEM_REGULAR), + list("Entrenching Tool", 1, /obj/item/tool/shovel/etool, null, VENDOR_ITEM_REGULAR), + list("Magnetic Harness", 12, /obj/item/attachable/magnetic_harness, null, VENDOR_ITEM_RECOMMENDED), + list("Radio Telephone Pack", 15, /obj/item/storage/backpack/marine/satchel/rto, null, VENDOR_ITEM_RECOMMENDED), + list("Motion Detector", 5, /obj/item/device/motiondetector, null, VENDOR_ITEM_RECOMMENDED), + list("Machete Scabbard (Full)", 5, /obj/item/storage/large_holster/machete/full, null, VENDOR_ITEM_REGULAR), + list("Binoculars", 5,/obj/item/device/binoculars, null, VENDOR_ITEM_REGULAR), + list("Rangefinder", 8, /obj/item/device/binoculars/range, null, VENDOR_ITEM_REGULAR), + list("Laser Designator", 12, /obj/item/device/binoculars/range/designator, null, VENDOR_ITEM_RECOMMENDED), + list("Fulton Recovery Device", 5, /obj/item/stack/fulton, null, VENDOR_ITEM_REGULAR), + list("Space Cleaner", 2, /obj/item/reagent_container/spray/cleaner, null, VENDOR_ITEM_REGULAR), + list("Whistle", 5, /obj/item/device/whistle, null, VENDOR_ITEM_REGULAR), + list("Flashlight", 1, /obj/item/device/flashlight, null, VENDOR_ITEM_REGULAR), )) /obj/effect/essentials_set/xo/shotgunpreset @@ -377,10 +395,16 @@ GLOBAL_LIST_INIT(cm_vending_gear_xo, list( //------------UNIFORM/GEAR VENDOR--------------- GLOBAL_LIST_INIT(cm_vending_clothing_xo, list( + list("COMBAT EQUIPMENT (TAKE ALL)", 0, null, null, null), + list("Officer M3 Armor", 0, /obj/item/clothing/suit/storage/marine/MP/SO, MARINE_CAN_BUY_COMBAT_ARMOR, VENDOR_ITEM_MANDATORY), + list("Officer M10 Helmet", 0, /obj/item/clothing/head/helmet/marine/MP/SO, MARINE_CAN_BUY_COMBAT_HELMET, VENDOR_ITEM_MANDATORY), + list("Marine Combat Boots", 0, /obj/item/clothing/shoes/marine/knife, MARINE_CAN_BUY_COMBAT_SHOES, VENDOR_ITEM_MANDATORY), + list("Marine Combat Gloves", 0, /obj/item/clothing/gloves/marine, MARINE_CAN_BUY_GLOVES, VENDOR_ITEM_MANDATORY), list("STANDARD EQUIPMENT (TAKE ALL)", 0, null, null, null), list("Headset", 0, /obj/item/device/radio/headset/almayer/mcom/cdrcom, MARINE_CAN_BUY_EAR, VENDOR_ITEM_MANDATORY), list("Satchel", 0, /obj/item/storage/backpack/satchel, MARINE_CAN_BUY_BACKPACK, VENDOR_ITEM_MANDATORY), + list("MRE", 0, /obj/item/storage/box/MRE, MARINE_CAN_BUY_MRE, VENDOR_ITEM_MANDATORY), list("UNIFORM (CHOOSE ONE)", 0, null, null, null), list("Service Uniform", 0, /obj/item/clothing/under/marine/officer/bridge, MARINE_CAN_BUY_UNIFORM, VENDOR_ITEM_RECOMMENDED), @@ -393,53 +417,60 @@ GLOBAL_LIST_INIT(cm_vending_clothing_xo, list( list("Mod 88 Pistol", 0, /obj/item/storage/belt/gun/m4a3/mod88, MARINE_CAN_BUY_SECONDARY, VENDOR_ITEM_REGULAR), list("M44 Revolver", 0, /obj/item/storage/belt/gun/m44/mp, MARINE_CAN_BUY_SECONDARY, VENDOR_ITEM_REGULAR), - list("BELTS (CHOOSE 1)", 0, null, null, null), - list("G8-A General Utility Pouch", 0, /obj/item/storage/backpack/general_belt, MARINE_CAN_BUY_BELT, VENDOR_ITEM_RECOMMENDED), - list("Military Police Belt", 0, /obj/item/storage/belt/security/MP/full, MARINE_CAN_BUY_BELT, VENDOR_ITEM_RECOMMENDED), - list("M276 Medical Storage Rig", 0, /obj/item/storage/belt/medical/full, MARINE_CAN_BUY_BELT, VENDOR_ITEM_RECOMMENDED), - list("M276 Ammo Load Rig", 0, /obj/item/storage/belt/marine, MARINE_CAN_BUY_BELT, VENDOR_ITEM_RECOMMENDED), - list("M276 Holster Toolrig", 0, /obj/item/storage/belt/gun/utility/full, MARINE_CAN_BUY_BELT, VENDOR_ITEM_RECOMMENDED), - list("M276 M82F Holster Rig", 0, /obj/item/storage/belt/gun/flaregun, MARINE_CAN_BUY_BELT, VENDOR_ITEM_REGULAR), - - list("COMBAT EQUIPMENT (TAKE ALL)", 0, null, null, null), - list("Officer M3 Armor", 0, /obj/item/clothing/suit/storage/marine/MP/SO, MARINE_CAN_BUY_ARMOR, VENDOR_ITEM_MANDATORY), - list("Officer M10 Helmet", 0, /obj/item/clothing/head/helmet/marine/MP/SO, MARINE_CAN_BUY_HELMET, VENDOR_ITEM_MANDATORY), - list("Marine Combat Boots", 0, /obj/item/clothing/shoes/marine/knife, MARINE_CAN_BUY_SHOES, VENDOR_ITEM_MANDATORY), - list("Marine Combat Gloves", 0, /obj/item/clothing/gloves/marine, MARINE_CAN_BUY_GLOVES, VENDOR_ITEM_MANDATORY), - list("EYEWEAR (CHOOSE 1)", 0, null, null, null), list("Medical HUD Glasses", 0, /obj/item/clothing/glasses/hud/health, MARINE_CAN_BUY_GLASSES, VENDOR_ITEM_RECOMMENDED), list("Security HUD Glasses", 0, /obj/item/clothing/glasses/sunglasses/sechud, MARINE_CAN_BUY_GLASSES, VENDOR_ITEM_REGULAR), list("Bimex Personal Shades", 0, /obj/item/clothing/glasses/sunglasses/big, MARINE_CAN_BUY_GLASSES, VENDOR_ITEM_RECOMMENDED), list("Aviator Shades", 0, /obj/item/clothing/glasses/sunglasses/aviator, MARINE_CAN_BUY_GLASSES, VENDOR_ITEM_REGULAR), + list("HATS (CHOOSE 1)", 0, null, null, null), + list("Officer Beret", 0, /obj/item/clothing/head/beret/marine/chiefofficer, MARINE_CAN_BUY_HELMET, VENDOR_ITEM_REGULAR), + list("Service Peaked Cap", 0, /obj/item/clothing/head/marine/peaked/service, MARINE_CAN_BUY_HELMET, VENDOR_ITEM_REGULAR), + list("Patrol Cap", 0, /obj/item/clothing/head/cmcap, MARINE_CAN_BUY_HELMET, VENDOR_ITEM_REGULAR), + list("Officer Cap", 0, /obj/item/clothing/head/cmcap/bridge, MARINE_CAN_BUY_HELMET, VENDOR_ITEM_REGULAR), + list("PATCHES", 0, null, null, null), - list("Falling Falcons Shoulder Patch", 0, /obj/item/clothing/accessory/patch/falcon, MARINE_CAN_BUY_ATTACHMENT, VENDOR_ITEM_MANDATORY), - list("USCM Shoulder Patch", 0, /obj/item/clothing/accessory/patch, MARINE_CAN_BUY_MRE, VENDOR_ITEM_MANDATORY), + list("Falling Falcons Shoulder Patch", 1, /obj/item/clothing/accessory/patch/falcon, null, VENDOR_ITEM_REGULAR), + list("USCM Shoulder Patch", 1, /obj/item/clothing/accessory/patch, null, VENDOR_ITEM_REGULAR), + + + list("BELT (CHOOSE 1)", 0, null, null, null), + list("G8-A General Utility Pouch", 0, /obj/item/storage/backpack/general_belt, MARINE_CAN_BUY_BELT, VENDOR_ITEM_REGULAR), + list("M276 Ammo Load Rig", 0, /obj/item/storage/belt/marine, MARINE_CAN_BUY_BELT, VENDOR_ITEM_RECOMMENDED), + list("M276 Shotgun Shell Loading Rig", 0, /obj/item/storage/belt/shotgun, MARINE_CAN_BUY_BELT, VENDOR_ITEM_RECOMMENDED), + list("M276 Toolbelt Rig (Full)", 0, /obj/item/storage/belt/utility/full, MARINE_CAN_BUY_BELT, VENDOR_ITEM_RECOMMENDED), + list("M276 Holster Toolrig (Full)", 0, /obj/item/storage/belt/gun/utility/full, MARINE_CAN_BUY_BELT, VENDOR_ITEM_REGULAR), + list("M276 Lifesaver Bag (Full)", 0, /obj/item/storage/belt/medical/lifesaver/full, MARINE_CAN_BUY_BELT, VENDOR_ITEM_RECOMMENDED), + list("M276 Medical Storage Rig (Full)", 0, /obj/item/storage/belt/medical/full, MARINE_CAN_BUY_BELT, VENDOR_ITEM_REGULAR), + list("M276 M39 Holster Rig", 0, /obj/item/storage/belt/gun/m39, MARINE_CAN_BUY_BELT, VENDOR_ITEM_REGULAR), + list("M276 M82F Holster Rig", 0, /obj/item/storage/belt/gun/flaregun, MARINE_CAN_BUY_BELT, VENDOR_ITEM_REGULAR), + list("M276 M40 Grenade Rig", 0, /obj/item/storage/belt/grenade, MARINE_CAN_BUY_BELT, VENDOR_ITEM_REGULAR), + list("Military Police Belt", 0, /obj/item/storage/belt/security/MP/full, MARINE_CAN_BUY_BELT, VENDOR_ITEM_RECOMMENDED), list("POUCHES (CHOOSE 2)", 0, null, null, null), - list("First-Aid Pouch (Refillable Injectors)", 0, /obj/item/storage/pouch/firstaid/full, MARINE_CAN_BUY_POUCH, VENDOR_ITEM_REGULAR), + list("Autoinjector Pouch", 0, /obj/item/storage/pouch/autoinjector/full, MARINE_CAN_BUY_POUCH, VENDOR_ITEM_RECOMMENDED), list("First-Aid Pouch (Splints, Gauze, Ointment)", 0, /obj/item/storage/pouch/firstaid/full/alternate, MARINE_CAN_BUY_POUCH, VENDOR_ITEM_REGULAR), - list("First-Aid Pouch (Pill Packets)", 0, /obj/item/storage/pouch/firstaid/full/pills, MARINE_CAN_BUY_POUCH, VENDOR_ITEM_RECOMMENDED), - list("Large General Pouch", 0, /obj/item/storage/pouch/general/large, MARINE_CAN_BUY_POUCH, VENDOR_ITEM_REGULAR), - list("Sidearm Pouch", 0, /obj/item/storage/pouch/pistol, MARINE_CAN_BUY_POUCH, VENDOR_ITEM_REGULAR), + list("First-Aid Pouch (Pill Packets)", 0, /obj/item/storage/pouch/firstaid/full/pills, MARINE_CAN_BUY_POUCH, VENDOR_ITEM_REGULAR), + list("Large General Pouch", 0, /obj/item/storage/pouch/general/large, MARINE_CAN_BUY_POUCH, VENDOR_ITEM_RECOMMENDED), + list("Large Magazine Pouch", 0, /obj/item/storage/pouch/magazine/large, MARINE_CAN_BUY_POUCH, VENDOR_ITEM_RECOMMENDED), + list("Large Shotgun Shell Pouch", 0, /obj/item/storage/pouch/shotgun/large, MARINE_CAN_BUY_POUCH, VENDOR_ITEM_RECOMMENDED), list("Large Pistol Magazine Pouch", 0, /obj/item/storage/pouch/magazine/pistol/large, MARINE_CAN_BUY_POUCH, VENDOR_ITEM_REGULAR), list("Medical Pouch", 0, /obj/item/storage/pouch/medical, MARINE_CAN_BUY_POUCH, VENDOR_ITEM_REGULAR), - list("Document Pouch", 0, /obj/item/storage/pouch/document, MARINE_CAN_BUY_POUCH, VENDOR_ITEM_REGULAR), - list("Shotgun Shell Pouch", 0, /obj/item/storage/pouch/shotgun, MARINE_CAN_BUY_POUCH, VENDOR_ITEM_REGULAR), + list("Medical Kit Pouch", 0, /obj/item/storage/pouch/medkit, MARINE_CAN_BUY_POUCH, VENDOR_ITEM_REGULAR), + list("Pistol Pouch", 0, /obj/item/storage/pouch/pistol, MARINE_CAN_BUY_POUCH, VENDOR_ITEM_REGULAR), + list("Sling Pouch", 0, /obj/item/storage/pouch/sling, MARINE_CAN_BUY_POUCH, VENDOR_ITEM_REGULAR), + list("Tools Pouch (Full)", 0, /obj/item/storage/pouch/tools/full, MARINE_CAN_BUY_POUCH, VENDOR_ITEM_RECOMMENDED), + list("Construction Pouch", 0, /obj/item/storage/pouch/construction, MARINE_CAN_BUY_POUCH, VENDOR_ITEM_REGULAR), + list("Electronics Pouch (Full)", 0, /obj/item/storage/pouch/electronics/full, MARINE_CAN_BUY_POUCH, VENDOR_ITEM_REGULAR), + list("Flare Pouch (Full)", 0, /obj/item/storage/pouch/flare/full, MARINE_CAN_BUY_POUCH, VENDOR_ITEM_REGULAR), + list("Fuel Tank Strap Pouch", 0, /obj/item/storage/pouch/flamertank, MARINE_CAN_BUY_POUCH, VENDOR_ITEM_REGULAR), list("ACCESSORIES (CHOOSE 1)", 0, null, null, null), - list("Shoulder Holster", 0, /obj/item/clothing/accessory/storage/holster, MARINE_CAN_BUY_ACCESSORY, VENDOR_ITEM_REGULAR), - list("Black Webbing Vest", 0, /obj/item/clothing/accessory/storage/black_vest, MARINE_CAN_BUY_ACCESSORY, VENDOR_ITEM_REGULAR), + list("Black Webbing Vest", 0, /obj/item/clothing/accessory/storage/black_vest, MARINE_CAN_BUY_ACCESSORY, VENDOR_ITEM_RECOMMENDED), list("Brown Webbing Vest", 0, /obj/item/clothing/accessory/storage/black_vest/brown_vest, MARINE_CAN_BUY_ACCESSORY, VENDOR_ITEM_REGULAR), - list("Webbing", 0, /obj/item/clothing/accessory/storage/webbing, MARINE_CAN_BUY_ACCESSORY, VENDOR_ITEM_REGULAR), list("Drop Pouch", 0, /obj/item/clothing/accessory/storage/droppouch, MARINE_CAN_BUY_ACCESSORY, VENDOR_ITEM_REGULAR), - - list("HATS (CHOOSE 1)", 0, null, null, null), - list("Officer Beret", 0, /obj/item/clothing/head/beret/marine/chiefofficer, MARINE_CAN_BUY_MASK, VENDOR_ITEM_REGULAR), - list("Service Peaked Cap", 0, /obj/item/clothing/head/marine/peaked/service, MARINE_CAN_BUY_MASK, VENDOR_ITEM_REGULAR), - list("Patrol Cap", 0, /obj/item/clothing/head/cmcap, MARINE_CAN_BUY_MASK, VENDOR_ITEM_REGULAR), - list("Officer Cap", 0, /obj/item/clothing/head/cmcap/bridge, MARINE_CAN_BUY_MASK, VENDOR_ITEM_REGULAR), + list("Webbing", 0, /obj/item/clothing/accessory/storage/webbing, MARINE_CAN_BUY_ACCESSORY, VENDOR_ITEM_REGULAR), + list("Shoulder Holster", 0, /obj/item/clothing/accessory/storage/holster, MARINE_CAN_BUY_ACCESSORY, VENDOR_ITEM_REGULAR), )) @@ -451,7 +482,6 @@ GLOBAL_LIST_INIT(cm_vending_clothing_auxiliary_officer, list( list("Insulated Gloves", 0, /obj/item/clothing/gloves/yellow, MARINE_CAN_BUY_GLOVES, VENDOR_ITEM_MANDATORY), list("Officer Uniform", 0, /obj/item/clothing/under/marine/officer/bridge, MARINE_CAN_BUY_UNIFORM, VENDOR_ITEM_MANDATORY), list("Headset", 0, /obj/item/device/radio/headset/almayer/qm, MARINE_CAN_BUY_EAR, VENDOR_ITEM_MANDATORY), - list("Patrol Cap", 0, /obj/item/clothing/head/cmcap, MARINE_CAN_BUY_MASK, VENDOR_ITEM_MANDATORY), list("Auxiliary Support Officer Jacket", 0, /obj/item/clothing/suit/storage/jacket/marine/service/aso, MARINE_CAN_BUY_MRE, VENDOR_ITEM_MANDATORY), list("BAG (CHOOSE 1)", 0, null, null, null), @@ -463,6 +493,13 @@ GLOBAL_LIST_INIT(cm_vending_clothing_auxiliary_officer, list( list("Mod 88 Pistol", 0, /obj/item/storage/belt/gun/m4a3/mod88, MARINE_CAN_BUY_SECONDARY, VENDOR_ITEM_RECOMMENDED), list("M44 Custom Revolver", 0, /obj/item/storage/belt/gun/m44/custom, MARINE_CAN_BUY_SECONDARY, VENDOR_ITEM_RECOMMENDED), + list("HAT (CHOOSE 1)", 0, null, null, null), + list("Beret, Green", 0, /obj/item/clothing/head/beret/cm, MARINE_CAN_BUY_MASK, VENDOR_ITEM_RECOMMENDED), + list("Beret, Tan", 0, /obj/item/clothing/head/beret/cm/tan, MARINE_CAN_BUY_MASK, VENDOR_ITEM_RECOMMENDED), + list("Patrol Cap", 0, /obj/item/clothing/head/cmcap, MARINE_CAN_BUY_MASK, VENDOR_ITEM_RECOMMENDED), + list("Officer Cap", 0, /obj/item/clothing/head/cmcap/bridge, MARINE_CAN_BUY_MASK, VENDOR_ITEM_RECOMMENDED), + list("Service Peaked Cap", 0, /obj/item/clothing/head/marine/peaked/service, MARINE_CAN_BUY_MASK, VENDOR_ITEM_RECOMMENDED), + list("COMBAT EQUIPMENT (TAKE ALL)", 0, null, null, null), list("Officer M3 Armor", 0, /obj/item/clothing/suit/storage/marine/MP/SO, MARINE_CAN_BUY_ARMOR, VENDOR_ITEM_MANDATORY), list("Officer M10 Helmet", 0, /obj/item/clothing/head/helmet/marine/MP/SO, MARINE_CAN_BUY_HELMET, VENDOR_ITEM_MANDATORY), diff --git a/code/game/machinery/vending/vendor_types/crew/staff_officer.dm b/code/game/machinery/vending/vendor_types/crew/staff_officer.dm index 50b83ccdc54f..65fbf2917699 100644 --- a/code/game/machinery/vending/vendor_types/crew/staff_officer.dm +++ b/code/game/machinery/vending/vendor_types/crew/staff_officer.dm @@ -7,11 +7,11 @@ /obj/structure/machinery/cm_vending/clothing/staff_officer/get_listed_products(mob/user) return GLOB.cm_vending_clothing_staff_officer -//------------GEAR--------------- +//------------CLOTHING--------------- GLOBAL_LIST_INIT(cm_vending_clothing_staff_officer, list( list("STANDARD EQUIPMENT (TAKE ALL)", 0, null, null, null), - list("Boots", 0, /obj/item/clothing/shoes/marine/knife, MARINE_CAN_BUY_SHOES, VENDOR_ITEM_MANDATORY), + list("Boots", 0, /obj/item/clothing/shoes/marine/knife, MARINE_CAN_BUY_COMBAT_SHOES, VENDOR_ITEM_MANDATORY), list("Headset", 0, /obj/item/device/radio/headset/almayer/mcom, MARINE_CAN_BUY_EAR, VENDOR_ITEM_MANDATORY), list("MRE", 0, /obj/item/storage/box/MRE, MARINE_CAN_BUY_MRE, VENDOR_ITEM_MANDATORY), @@ -31,12 +31,24 @@ GLOBAL_LIST_INIT(cm_vending_clothing_staff_officer, list( list("Officer Cap", 0, /obj/item/clothing/head/cmcap/bridge, MARINE_CAN_BUY_HELMET, VENDOR_ITEM_RECOMMENDED), list("Service Peaked Cap", 0, /obj/item/clothing/head/marine/peaked/service, MARINE_CAN_BUY_HELMET, VENDOR_ITEM_RECOMMENDED), + list("PATCHES", 0, null, null, null), + list("Falling Falcons Shoulder Patch", 1, /obj/item/clothing/accessory/patch/falcon, null, VENDOR_ITEM_REGULAR), + list("USCM Shoulder Patch", 1, /obj/item/clothing/accessory/patch, null, VENDOR_ITEM_REGULAR), + list("PERSONAL SIDEARM (CHOOSE 1)", 0, null, null, null), list("M44 Revolver", 0, /obj/item/storage/belt/gun/m44/mp, MARINE_CAN_BUY_SECONDARY, VENDOR_ITEM_RECOMMENDED), + list("Mod 88 Pistol", 0, /obj/item/storage/belt/gun/m4a3/mod88, MARINE_CAN_BUY_SECONDARY, VENDOR_ITEM_RECOMMENDED), list("M4A3 Pistol", 0, /obj/item/storage/belt/gun/m4a3/commander, MARINE_CAN_BUY_SECONDARY, VENDOR_ITEM_RECOMMENDED), list("VP78 Pistol", 0, /obj/item/storage/belt/gun/m4a3/vp78, MARINE_CAN_BUY_SECONDARY, VENDOR_ITEM_RECOMMENDED), + list("ACCESSORIES (CHOOSE 1)", 0, null, null, null), + list("Black Webbing Vest", 0, /obj/item/clothing/accessory/storage/black_vest, MARINE_CAN_BUY_ACCESSORY, VENDOR_ITEM_RECOMMENDED), + list("Brown Webbing Vest", 0, /obj/item/clothing/accessory/storage/black_vest/brown_vest, MARINE_CAN_BUY_ACCESSORY, VENDOR_ITEM_REGULAR), + list("Drop Pouch", 0, /obj/item/clothing/accessory/storage/droppouch, MARINE_CAN_BUY_ACCESSORY, VENDOR_ITEM_REGULAR), + list("Webbing", 0, /obj/item/clothing/accessory/storage/webbing, MARINE_CAN_BUY_ACCESSORY, VENDOR_ITEM_REGULAR), + list("Shoulder Holster", 0, /obj/item/clothing/accessory/storage/holster, MARINE_CAN_BUY_ACCESSORY, VENDOR_ITEM_REGULAR), + list("BACKPACK (CHOOSE 1)", 0, null, null, null), list("Backpack", 0, /obj/item/storage/backpack/marine, MARINE_CAN_BUY_BACKPACK, VENDOR_ITEM_REGULAR), list("Satchel", 0, /obj/item/storage/backpack/marine/satchel, MARINE_CAN_BUY_BACKPACK, VENDOR_ITEM_REGULAR), @@ -46,8 +58,85 @@ GLOBAL_LIST_INIT(cm_vending_clothing_staff_officer, list( list("Binoculars", 5,/obj/item/device/binoculars, null, VENDOR_ITEM_REGULAR), list("Rangefinder", 8, /obj/item/device/binoculars/range, null, VENDOR_ITEM_REGULAR), list("Laser Designator", 12, /obj/item/device/binoculars/range/designator, null, VENDOR_ITEM_RECOMMENDED), - list("Flashlight", 1, /obj/item/device/flashlight, null, VENDOR_ITEM_RECOMMENDED), + list("Flashlight", 1, /obj/item/device/flashlight, null, VENDOR_ITEM_REGULAR), + list("Motion Detector", 5, /obj/item/device/motiondetector, null, VENDOR_ITEM_RECOMMENDED), + list("Space Cleaner", 2, /obj/item/reagent_container/spray/cleaner, null, VENDOR_ITEM_REGULAR), + list("Whistle", 5, /obj/item/device/whistle, null, VENDOR_ITEM_REGULAR), + )) + +/obj/structure/machinery/cm_vending/gear/staff_officer_armory + name = "\improper ColMarTech Staff Officer Armory Equipment Rack" + desc = "An automated combat equipment vendor for Staff Officers." + req_access = list(ACCESS_MARINE_COMMAND) + icon_state = "mar_rack" + vendor_role = list(JOB_SO) + +/obj/structure/machinery/cm_vending/gear/staff_officer_armory/get_listed_products(mob/user) + return GLOB.cm_vending_gear_staff_officer_armory + +//------------ARMORY--------------- + +GLOBAL_LIST_INIT(cm_vending_gear_staff_officer_armory, list( + list("COMBAT EQUIPMENT (TAKE ALL)", 0, null, null, null), + list("Officer M3 Armor", 0, /obj/item/clothing/suit/storage/marine/MP/SO, MARINE_CAN_BUY_COMBAT_ARMOR, VENDOR_ITEM_MANDATORY), + list("Officer M10 Helmet", 0, /obj/item/clothing/head/helmet/marine/MP/SO, MARINE_CAN_BUY_COMBAT_HELMET, VENDOR_ITEM_MANDATORY), + list("Marine Combat Boots", 0, /obj/item/clothing/shoes/marine/knife, MARINE_CAN_BUY_COMBAT_SHOES, VENDOR_ITEM_MANDATORY), + list("Marine Combat Gloves", 0, /obj/item/clothing/gloves/marine, MARINE_CAN_BUY_GLOVES, VENDOR_ITEM_MANDATORY), + list("MRE", 0, /obj/item/storage/box/MRE, MARINE_CAN_BUY_MRE, VENDOR_ITEM_MANDATORY), + list("Aviator Shades", 0, /obj/item/clothing/glasses/sunglasses/aviator, MARINE_CAN_BUY_GLASSES, VENDOR_ITEM_REGULAR), + list("Bayonet", 0, /obj/item/attachable/bayonet, MARINE_CAN_BUY_ATTACHMENT, VENDOR_ITEM_REGULAR), + + list("SPECIALISATION KIT (CHOOSE 1)", 0, null, null, null), + list("Essential Engineer Set", 0, /obj/effect/essentials_set/engi, MARINE_CAN_BUY_ESSENTIALS, VENDOR_ITEM_MANDATORY), + list("Essential Medical Set", 0, /obj/effect/essentials_set/medic, MARINE_CAN_BUY_ESSENTIALS, VENDOR_ITEM_MANDATORY), + + list("BELT (CHOOSE 1)", 0, null, null, null), + list("G8-A General Utility Pouch", 0, /obj/item/storage/backpack/general_belt, MARINE_CAN_BUY_BELT, VENDOR_ITEM_REGULAR), + list("M276 Ammo Load Rig", 0, /obj/item/storage/belt/marine, MARINE_CAN_BUY_BELT, VENDOR_ITEM_RECOMMENDED), + list("M276 Shotgun Shell Loading Rig", 0, /obj/item/storage/belt/shotgun, MARINE_CAN_BUY_BELT, VENDOR_ITEM_RECOMMENDED), + list("M276 Toolbelt Rig (Full)", 0, /obj/item/storage/belt/utility/full, MARINE_CAN_BUY_BELT, VENDOR_ITEM_RECOMMENDED), + list("M276 Lifesaver Bag (Full)", 0, /obj/item/storage/belt/medical/lifesaver/full, MARINE_CAN_BUY_BELT, VENDOR_ITEM_RECOMMENDED), + list("M276 Medical Storage Rig (Full)", 0, /obj/item/storage/belt/medical/full, MARINE_CAN_BUY_BELT, VENDOR_ITEM_REGULAR), + list("M276 M39 Holster Rig", 0, /obj/item/storage/belt/gun/m39, MARINE_CAN_BUY_BELT, VENDOR_ITEM_REGULAR), + list("M276 Holster Toolrig (Full)", 0, /obj/item/storage/belt/gun/utility/full, MARINE_CAN_BUY_BELT, VENDOR_ITEM_REGULAR), + list("M276 M82F Holster Rig", 0, /obj/item/storage/belt/gun/flaregun, MARINE_CAN_BUY_BELT, VENDOR_ITEM_REGULAR), + list("M276 M40 Grenade Rig", 0, /obj/item/storage/belt/grenade, MARINE_CAN_BUY_BELT, VENDOR_ITEM_REGULAR), + + list("POUCHES (CHOOSE 2)", 0, null, null, null), + list("Autoinjector Pouch", 0, /obj/item/storage/pouch/autoinjector/full, MARINE_CAN_BUY_POUCH, VENDOR_ITEM_RECOMMENDED), + list("First-Aid Pouch (Splints, Gauze, Ointment)", 0, /obj/item/storage/pouch/firstaid/full/alternate, MARINE_CAN_BUY_POUCH, VENDOR_ITEM_REGULAR), + list("First-Aid Pouch (Pill Packets)", 0, /obj/item/storage/pouch/firstaid/full/pills, MARINE_CAN_BUY_POUCH, VENDOR_ITEM_REGULAR), + list("Large General Pouch", 0, /obj/item/storage/pouch/general/large, MARINE_CAN_BUY_POUCH, VENDOR_ITEM_RECOMMENDED), + list("Large Magazine Pouch", 0, /obj/item/storage/pouch/magazine/large, MARINE_CAN_BUY_POUCH, VENDOR_ITEM_RECOMMENDED), + list("Large Shotgun Shell Pouch", 0, /obj/item/storage/pouch/shotgun/large, MARINE_CAN_BUY_POUCH, VENDOR_ITEM_RECOMMENDED), + list("Large Pistol Magazine Pouch", 0, /obj/item/storage/pouch/magazine/pistol/large, MARINE_CAN_BUY_POUCH, VENDOR_ITEM_REGULAR), + list("Medical Pouch", 0, /obj/item/storage/pouch/medical, MARINE_CAN_BUY_POUCH, VENDOR_ITEM_REGULAR), + list("Medical Kit Pouch", 0, /obj/item/storage/pouch/medkit, MARINE_CAN_BUY_POUCH, VENDOR_ITEM_REGULAR), + list("Pistol Pouch", 0, /obj/item/storage/pouch/pistol, MARINE_CAN_BUY_POUCH, VENDOR_ITEM_REGULAR), + list("Sling Pouch", 0, /obj/item/storage/pouch/sling, MARINE_CAN_BUY_POUCH, VENDOR_ITEM_REGULAR), + list("Tools Pouch (Full)", 0, /obj/item/storage/pouch/tools/full, MARINE_CAN_BUY_POUCH, VENDOR_ITEM_RECOMMENDED), + list("Construction Pouch", 0, /obj/item/storage/pouch/construction, MARINE_CAN_BUY_POUCH, VENDOR_ITEM_REGULAR), + list("Electronics Pouch (Full)", 0, /obj/item/storage/pouch/electronics/full, MARINE_CAN_BUY_POUCH, VENDOR_ITEM_REGULAR), + list("Flare Pouch (Full)", 0, /obj/item/storage/pouch/flare/full, MARINE_CAN_BUY_POUCH, VENDOR_ITEM_REGULAR), + list("Fuel Tank Strap Pouch", 0, /obj/item/storage/pouch/flamertank, MARINE_CAN_BUY_POUCH, VENDOR_ITEM_REGULAR), + + list("MASK (CHOOSE 1)", 0, null, null, null), + list("Gas Mask", 0, /obj/item/clothing/mask/gas, MARINE_CAN_BUY_MASK, VENDOR_ITEM_REGULAR), + list("Heat Absorbent Coif", 0, /obj/item/clothing/mask/rebreather/scarf, MARINE_CAN_BUY_MASK, VENDOR_ITEM_REGULAR), + + list("OTHER SUPPLIES", 0, null, null, null), + list("Welding Visor", 5, /obj/item/device/helmet_visor/welding_visor, null, VENDOR_ITEM_REGULAR), + list("Insulated Gloves", 3, /obj/item/clothing/gloves/yellow, null, VENDOR_ITEM_REGULAR), + list("Entrenching Tool", 1, /obj/item/tool/shovel/etool, null, VENDOR_ITEM_REGULAR), + list("Magnetic Harness", 12, /obj/item/attachable/magnetic_harness, null, VENDOR_ITEM_RECOMMENDED), + list("Radio Telephone Pack", 15, /obj/item/storage/backpack/marine/satchel/rto, null, VENDOR_ITEM_RECOMMENDED), list("Motion Detector", 5, /obj/item/device/motiondetector, null, VENDOR_ITEM_RECOMMENDED), + list("Machete Scabbard (Full)", 5, /obj/item/storage/large_holster/machete/full, null, VENDOR_ITEM_REGULAR), + list("Binoculars", 5,/obj/item/device/binoculars, null, VENDOR_ITEM_REGULAR), + list("Rangefinder", 8, /obj/item/device/binoculars/range, null, VENDOR_ITEM_REGULAR), + list("Laser Designator", 12, /obj/item/device/binoculars/range/designator, null, VENDOR_ITEM_RECOMMENDED), + list("Fulton Recovery Device", 5, /obj/item/stack/fulton, null, VENDOR_ITEM_REGULAR), list("Space Cleaner", 2, /obj/item/reagent_container/spray/cleaner, null, VENDOR_ITEM_REGULAR), list("Whistle", 5, /obj/item/device/whistle, null, VENDOR_ITEM_REGULAR), + list("Flashlight", 1, /obj/item/device/flashlight, null, VENDOR_ITEM_REGULAR), )) diff --git a/code/game/machinery/vending/vendor_types/crew/staff_officer_armory.dm b/code/game/machinery/vending/vendor_types/crew/staff_officer_armory.dm deleted file mode 100644 index 1e21f2f7256d..000000000000 --- a/code/game/machinery/vending/vendor_types/crew/staff_officer_armory.dm +++ /dev/null @@ -1,89 +0,0 @@ -/obj/structure/machinery/cm_vending/clothing/staff_officer_armory - name = "\improper ColMarTech Staff Officer Armory Equipment Rack" - desc = "An automated combat equipment vendor for Staff Officers." - req_access = list(ACCESS_MARINE_COMMAND) - icon_state = "mar_rack" - vendor_role = list(JOB_SO) - -/obj/structure/machinery/cm_vending/clothing/staff_officer_armory/get_listed_products(mob/user) - return GLOB.cm_vending_clothing_staff_officer_armory - -//------------GEAR--------------- - -GLOBAL_LIST_INIT(cm_vending_clothing_staff_officer_armory, list( - list("COMBAT EQUIPMENT (TAKE ALL)", 0, null, null, null), - list("Officer M3 Armor", 0, /obj/item/clothing/suit/storage/marine/MP/SO, MARINE_CAN_BUY_COMBAT_ARMOR, VENDOR_ITEM_MANDATORY), - list("Officer M10 Helmet", 0, /obj/item/clothing/head/helmet/marine/MP/SO, MARINE_CAN_BUY_COMBAT_HELMET, VENDOR_ITEM_MANDATORY), - list("Marine Combat Boots", 0, /obj/item/clothing/shoes/marine/knife, MARINE_CAN_BUY_SHOES, VENDOR_ITEM_MANDATORY), - list("Marine Combat Gloves", 0, /obj/item/clothing/gloves/marine, MARINE_CAN_BUY_GLOVES, VENDOR_ITEM_MANDATORY), - list("MRE", 0, /obj/item/storage/box/MRE, MARINE_CAN_BUY_MRE, VENDOR_ITEM_MANDATORY), - list("Aviator Shades", 0, /obj/item/clothing/glasses/sunglasses/aviator, MARINE_CAN_BUY_GLASSES, VENDOR_ITEM_REGULAR), - list("Bayonet", 0, /obj/item/attachable/bayonet, null, VENDOR_ITEM_REGULAR), - - list("SPECIALISATION KIT (CHOOSE 1)", 0, null, null, null), - list("Essential Engineer Set", 0, /obj/effect/essentials_set/engi, MARINE_CAN_BUY_ESSENTIALS, VENDOR_ITEM_RECOMMENDED), - list("Essential Medical Set", 0, /obj/effect/essentials_set/medic, MARINE_CAN_BUY_ESSENTIALS, VENDOR_ITEM_RECOMMENDED), - - list("BELT (CHOOSE 1)", 0, null, null, null), - list("G8-A General Utility Pouch", 0, /obj/item/storage/backpack/general_belt, MARINE_CAN_BUY_BELT, VENDOR_ITEM_RECOMMENDED), - list("M276 Ammo Load Rig", 0, /obj/item/storage/belt/marine, MARINE_CAN_BUY_BELT, VENDOR_ITEM_RECOMMENDED), - list("M276 Toolbelt Rig (Full)", 0, /obj/item/storage/belt/utility/full, MARINE_CAN_BUY_BELT, VENDOR_ITEM_RECOMMENDED), - list("M276 Lifesaver Bag (Full)", 0, /obj/item/storage/belt/medical/lifesaver/full, MARINE_CAN_BUY_BELT, VENDOR_ITEM_REGULAR), - list("M276 Medical Storage Rig (Full)", 0, /obj/item/storage/belt/medical/full, MARINE_CAN_BUY_BELT, VENDOR_ITEM_REGULAR), - list("M276 M39 Holster Rig", 0, /obj/item/storage/belt/gun/m39, MARINE_CAN_BUY_BELT, VENDOR_ITEM_REGULAR), - list("M276 M82F Holster Rig", 0, /obj/item/storage/belt/gun/flaregun, MARINE_CAN_BUY_BELT, VENDOR_ITEM_REGULAR), - list("M276 Shotgun Shell Loading Rig", 0, /obj/item/storage/belt/shotgun, MARINE_CAN_BUY_BELT, VENDOR_ITEM_REGULAR), - list("M276 M40 Grenade Rig", 0, /obj/item/storage/belt/grenade, MARINE_CAN_BUY_BELT, VENDOR_ITEM_REGULAR), - - list("POUCHES (CHOOSE 2)", 0, null, null, null), - list("Autoinjector Pouch", 0, /obj/item/storage/pouch/autoinjector, MARINE_CAN_BUY_POUCH, VENDOR_ITEM_REGULAR), - list("Construction Pouch", 0, /obj/item/storage/pouch/construction, MARINE_CAN_BUY_POUCH, VENDOR_ITEM_REGULAR), - list("Document Pouch", 0, /obj/item/storage/pouch/document, MARINE_CAN_BUY_POUCH, VENDOR_ITEM_REGULAR), - list("Electronics Pouch (Full)", 0, /obj/item/storage/pouch/electronics/full, MARINE_CAN_BUY_POUCH, VENDOR_ITEM_REGULAR), - list("First-Aid Pouch (Refillable Injectors)", 0, /obj/item/storage/pouch/firstaid/full, MARINE_CAN_BUY_POUCH, VENDOR_ITEM_REGULAR), - list("First-Aid Pouch (Splints, Gauze, Ointment)", 0, /obj/item/storage/pouch/firstaid/full/alternate, MARINE_CAN_BUY_POUCH, VENDOR_ITEM_REGULAR), - list("First-Aid Pouch (Pill Packets)", 0, /obj/item/storage/pouch/firstaid/full/pills, MARINE_CAN_BUY_POUCH, VENDOR_ITEM_REGULAR), - list("First Responder Pouch", 0, /obj/item/storage/pouch/first_responder, MARINE_CAN_BUY_POUCH, VENDOR_ITEM_REGULAR), - list("Flare Pouch (Full)", 0, /obj/item/storage/pouch/flare/full, MARINE_CAN_BUY_POUCH, VENDOR_ITEM_REGULAR), - list("Fuel Tank Strap Pouch", 0, /obj/item/storage/pouch/flamertank, MARINE_CAN_BUY_POUCH, VENDOR_ITEM_REGULAR), - list("Large General Pouch", 0, /obj/item/storage/pouch/general/large, MARINE_CAN_BUY_POUCH, VENDOR_ITEM_RECOMMENDED), - list("Large Magazine Pouch", 0, /obj/item/storage/pouch/magazine/large, MARINE_CAN_BUY_POUCH, VENDOR_ITEM_REGULAR), - list("Large Shotgun Shell Pouch", 0, /obj/item/storage/pouch/shotgun/large, MARINE_CAN_BUY_POUCH, VENDOR_ITEM_REGULAR), - list("Large Pistol Magazine Pouch", 0, /obj/item/storage/pouch/magazine/pistol/large, MARINE_CAN_BUY_POUCH, VENDOR_ITEM_REGULAR), - list("Medical Pouch", 0, /obj/item/storage/pouch/medical, MARINE_CAN_BUY_POUCH, VENDOR_ITEM_REGULAR), - list("Medical Kit Pouch", 0, /obj/item/storage/pouch/medkit, MARINE_CAN_BUY_POUCH, VENDOR_ITEM_REGULAR), - list("Pistol Pouch", 0, /obj/item/storage/pouch/pistol, MARINE_CAN_BUY_POUCH, VENDOR_ITEM_REGULAR), - list("Sling Pouch", 0, /obj/item/storage/pouch/sling, MARINE_CAN_BUY_POUCH, VENDOR_ITEM_REGULAR), - list("Tools Pouch (Full)", 0, /obj/item/storage/pouch/tools/full, MARINE_CAN_BUY_POUCH, VENDOR_ITEM_REGULAR), - - list("ACCESSORIES (CHOOSE 1)", 0, null, null, null), - list("Black Webbing Vest", 0, /obj/item/clothing/accessory/storage/black_vest, MARINE_CAN_BUY_ACCESSORY, VENDOR_ITEM_REGULAR), - list("Brown Webbing Vest", 0, /obj/item/clothing/accessory/storage/black_vest/brown_vest, MARINE_CAN_BUY_ACCESSORY, VENDOR_ITEM_RECOMMENDED), - list("Drop Pouch", 0, /obj/item/clothing/accessory/storage/droppouch, MARINE_CAN_BUY_ACCESSORY, VENDOR_ITEM_REGULAR), - list("Webbing", 0, /obj/item/clothing/accessory/storage/webbing, MARINE_CAN_BUY_ACCESSORY, VENDOR_ITEM_REGULAR), - list("Shoulder Holster", 0, /obj/item/clothing/accessory/storage/holster, MARINE_CAN_BUY_ACCESSORY, VENDOR_ITEM_REGULAR), - - list("MASK (CHOOSE 1)", 0, null, null, null), - list("Gas Mask", 0, /obj/item/clothing/mask/gas, MARINE_CAN_BUY_MASK, VENDOR_ITEM_REGULAR), - list("Heat Absorbent Coif", 0, /obj/item/clothing/mask/rebreather/scarf, MARINE_CAN_BUY_MASK, VENDOR_ITEM_REGULAR), - - list("OTHER SUPPLIES", 0, null, null, null), - list("Medical Helmet Optic", 5, /obj/item/device/helmet_visor/medical, null, VENDOR_ITEM_REGULAR), - list("Welding Visor", 5, /obj/item/device/helmet_visor/welding_visor, null, VENDOR_ITEM_REGULAR), - list("Magnetic Harness", 12, /obj/item/attachable/magnetic_harness, null, VENDOR_ITEM_REGULAR), - list("Radio Telephone Pack", 15, /obj/item/storage/backpack/marine/satchel/rto, null, VENDOR_ITEM_RECOMMENDED), - list("Binoculars", 5,/obj/item/device/binoculars, null, VENDOR_ITEM_REGULAR), - list("Rangefinder", 8, /obj/item/device/binoculars/range, null, VENDOR_ITEM_REGULAR), - list("Laser Designator", 12, /obj/item/device/binoculars/range/designator, null, VENDOR_ITEM_RECOMMENDED), - list("Data Detector", 5, /obj/item/device/motiondetector/intel, null, VENDOR_ITEM_REGULAR), - list("Flashlight", 1, /obj/item/device/flashlight, null, VENDOR_ITEM_RECOMMENDED), - list("Fulton Recovery Device", 5, /obj/item/stack/fulton, null, VENDOR_ITEM_REGULAR), - list("Motion Detector", 5, /obj/item/device/motiondetector, null, VENDOR_ITEM_REGULAR), - list("Space Cleaner", 2, /obj/item/reagent_container/spray/cleaner, null, VENDOR_ITEM_REGULAR), - list("Blowtorch", 5, /obj/item/tool/weldingtool, null, VENDOR_ITEM_REGULAR), - list("Wrench", 1, /obj/item/tool/wrench, null, VENDOR_ITEM_REGULAR), - list("Crowbar", 1, /obj/item/tool/crowbar, null, VENDOR_ITEM_REGULAR), - list("Entrenching Tool", 1, /obj/item/tool/shovel/etool, null, VENDOR_ITEM_REGULAR), - list("Whistle", 5, /obj/item/device/whistle, null, VENDOR_ITEM_REGULAR), - list("Machete Scabbard (Full)", 5, /obj/item/storage/large_holster/machete/full, null, VENDOR_ITEM_REGULAR) - )) diff --git a/code/game/machinery/vending/vendor_types/crew/synthetic.dm b/code/game/machinery/vending/vendor_types/crew/synthetic.dm index 3f8eff44d052..9ce15535e2da 100644 --- a/code/game/machinery/vending/vendor_types/crew/synthetic.dm +++ b/code/game/machinery/vending/vendor_types/crew/synthetic.dm @@ -188,7 +188,7 @@ GLOBAL_LIST_INIT(cm_vending_clothing_synth, list( GLOBAL_LIST_INIT(cm_vending_clothing_synth_snowflake, list( list("USCM UNIFORMS", 0, null, null, null), list("Medical Scrubs, Blue", 12, /obj/item/clothing/under/rank/medical/blue, null, VENDOR_ITEM_REGULAR), - list("Medical Scrubs, Light Blue", 0, /obj/item/clothing/under/rank/medical/lightblue, null, VENDOR_ITEM_REGULAR), + list("Medical Scrubs, Light Blue", 12, /obj/item/clothing/under/rank/medical/lightblue, null, VENDOR_ITEM_REGULAR), list("Medical Scrubs, Green", 12, /obj/item/clothing/under/rank/medical/green, null, VENDOR_ITEM_REGULAR), list("Medical Scrubs, Purple", 12, /obj/item/clothing/under/rank/medical/purple, null, VENDOR_ITEM_REGULAR), list("Medical Scrubs, Olive", 12, /obj/item/clothing/under/rank/medical/olive, null, VENDOR_ITEM_REGULAR), diff --git a/code/game/machinery/vending/vendor_types/crew/vehicle_crew.dm b/code/game/machinery/vending/vendor_types/crew/vehicle_crew.dm index 53853f7d4e8b..2dd5bdf2ee68 100644 --- a/code/game/machinery/vending/vendor_types/crew/vehicle_crew.dm +++ b/code/game/machinery/vending/vendor_types/crew/vehicle_crew.dm @@ -274,7 +274,7 @@ GLOBAL_LIST_INIT(cm_vending_clothing_vehicle_crew, list( list("M276 Ammo Load Rig", 0, /obj/item/storage/belt/marine, MARINE_CAN_BUY_BELT, VENDOR_ITEM_RECOMMENDED), list("M276 General Pistol Holster Rig", 0, /obj/item/storage/belt/gun/m4a3, MARINE_CAN_BUY_BELT, VENDOR_ITEM_REGULAR), list("M276 M39 Holster Rig", 0, /obj/item/storage/belt/gun/m39, MARINE_CAN_BUY_BELT, VENDOR_ITEM_REGULAR), - list("M276 M44 Holster Rig", 0, /obj/item/storage/belt/gun/m44, MARINE_CAN_BUY_BELT, VENDOR_ITEM_REGULAR), + list("M276 General Revolver Holster Rig", 0, /obj/item/storage/belt/gun/m44, MARINE_CAN_BUY_BELT, VENDOR_ITEM_REGULAR), list("M276 M82F Holster Rig", 0, /obj/item/storage/belt/gun/flaregun, MARINE_CAN_BUY_BELT, VENDOR_ITEM_REGULAR), list("M276 Shotgun Shell Loading Rig", 0, /obj/item/storage/belt/shotgun, MARINE_CAN_BUY_BELT, VENDOR_ITEM_REGULAR), list("M276 Toolbelt Rig (Full)", 0, /obj/item/storage/belt/utility/full, MARINE_CAN_BUY_BELT, VENDOR_ITEM_REGULAR), diff --git a/code/game/machinery/vending/vendor_types/engineering.dm b/code/game/machinery/vending/vendor_types/engineering.dm index 6da719e883ba..3662d447a346 100644 --- a/code/game/machinery/vending/vendor_types/engineering.dm +++ b/code/game/machinery/vending/vendor_types/engineering.dm @@ -89,7 +89,7 @@ list("Supply Ordering Console", 2, /obj/item/circuitboard/computer/ordercomp, VENDOR_ITEM_REGULAR), list("Research Data Terminal", 2, /obj/item/circuitboard/computer/research_terminal, VENDOR_ITEM_REGULAR), list("P.A.C.M.A.N Generator", 1, /obj/item/circuitboard/machine/pacman, VENDOR_ITEM_REGULAR), - list("Auxiliar Power Storage Unit", 2, /obj/item/circuitboard/machine/ghettosmes, VENDOR_ITEM_REGULAR), + list("Auxiliary Power Storage Unit", 2, /obj/item/circuitboard/machine/ghettosmes, VENDOR_ITEM_REGULAR), list("Air Alarm Electronics", 2, /obj/item/circuitboard/airalarm, VENDOR_ITEM_REGULAR), list("Security Camera Monitor", 2, /obj/item/circuitboard/computer/cameras, VENDOR_ITEM_REGULAR), list("Television Set", 4, /obj/item/circuitboard/computer/cameras/tv, VENDOR_ITEM_REGULAR), diff --git a/code/game/machinery/vending/vendor_types/intelligence_officer.dm b/code/game/machinery/vending/vendor_types/intelligence_officer.dm index 73d54cbbffca..63d3e93873d2 100644 --- a/code/game/machinery/vending/vendor_types/intelligence_officer.dm +++ b/code/game/machinery/vending/vendor_types/intelligence_officer.dm @@ -96,7 +96,7 @@ GLOBAL_LIST_INIT(cm_vending_clothing_intelligence_officer, list( list("M276 Ammo Load Rig", 0, /obj/item/storage/belt/marine, MARINE_CAN_BUY_BELT, VENDOR_ITEM_RECOMMENDED), list("M276 General Pistol Holster Rig", 0, /obj/item/storage/belt/gun/m4a3, MARINE_CAN_BUY_BELT, VENDOR_ITEM_REGULAR), list("M276 M39 Holster Rig", 0, /obj/item/storage/belt/gun/m39, MARINE_CAN_BUY_BELT, VENDOR_ITEM_REGULAR), - list("M276 M44 Holster Rig", 0, /obj/item/storage/belt/gun/m44, MARINE_CAN_BUY_BELT, VENDOR_ITEM_REGULAR), + list("M276 General Revolver Holster Rig", 0, /obj/item/storage/belt/gun/m44, MARINE_CAN_BUY_BELT, VENDOR_ITEM_REGULAR), list("M276 Shotgun Shell Loading Rig", 0, /obj/item/storage/belt/shotgun, MARINE_CAN_BUY_BELT, VENDOR_ITEM_REGULAR), list("M276 Toolbelt Rig (Full)", 0, /obj/item/storage/belt/utility/full, MARINE_CAN_BUY_BELT, VENDOR_ITEM_RECOMMENDED), diff --git a/code/game/machinery/vending/vendor_types/requisitions.dm b/code/game/machinery/vending/vendor_types/requisitions.dm index a8d44a8b5012..a4328bad5ea4 100644 --- a/code/game/machinery/vending/vendor_types/requisitions.dm +++ b/code/game/machinery/vending/vendor_types/requisitions.dm @@ -55,6 +55,7 @@ list("M74 AGM-Smoke Airburst Grenade", floor(scale * 4), /obj/item/explosive/grenade/smokebomb/airburst, VENDOR_ITEM_REGULAR), list("M74 AGM-Star Shell", floor(scale * 2), /obj/item/explosive/grenade/high_explosive/airburst/starshell, VENDOR_ITEM_REGULAR), list("M74 AGM-Hornet Shell", floor(scale * 4), /obj/item/explosive/grenade/high_explosive/airburst/hornet_shell, VENDOR_ITEM_REGULAR), + list("G2 Electroshock Grenade", round(scale * 5), /obj/item/explosive/grenade/sebb, VENDOR_ITEM_REGULAR), list("M40 HIRR Baton Slug", floor(scale * 8), /obj/item/explosive/grenade/slug/baton, VENDOR_ITEM_REGULAR), list("M40 MFHS Metal Foam Grenade", floor(scale * 6), /obj/item/explosive/grenade/metal_foam, VENDOR_ITEM_REGULAR), list("Plastic Explosives", floor(scale * 3), /obj/item/explosive/plastic, VENDOR_ITEM_REGULAR), @@ -86,7 +87,7 @@ list("M276 Knife Rig", floor(scale * 5), /obj/item/storage/belt/knifepouch, VENDOR_ITEM_REGULAR), list("M276 M39 Holster Rig", floor(scale * 5), /obj/item/storage/belt/gun/m39, VENDOR_ITEM_REGULAR), list("M276 M40 Grenade Rig", floor(scale * 2), /obj/item/storage/belt/grenade, VENDOR_ITEM_REGULAR), - list("M276 M44 Holster Rig", floor(scale * 5), /obj/item/storage/belt/gun/m44, VENDOR_ITEM_REGULAR), + list("M276 General Revolver Holster Rig", floor(scale * 5), /obj/item/storage/belt/gun/m44, VENDOR_ITEM_REGULAR), list("M276 M82F Holster Rig", floor(scale * 2), /obj/item/storage/belt/gun/flaregun, VENDOR_ITEM_REGULAR), list("M276 Shotgun Shell Loading Rig", floor(scale * 10), /obj/item/storage/belt/shotgun, VENDOR_ITEM_REGULAR), list("M276 Mortar Operator Belt", floor(scale * 2), /obj/item/storage/belt/gun/mortarbelt, VENDOR_ITEM_REGULAR), @@ -139,6 +140,7 @@ list("Powerloader Certification", 0.75, /obj/item/pamphlet/skill/powerloader, VENDOR_ITEM_REGULAR), list("Spare PDT/L Battle Buddy Kit", floor(scale * 4), /obj/item/storage/box/pdt_kit, VENDOR_ITEM_REGULAR), list("W-Y brand rechargeable mini-battery", floor(scale * 3), /obj/item/cell/crap, VENDOR_ITEM_REGULAR), + list("Nailgun Magazine (7x45mm)", floor(scale * 4), /obj/item/ammo_magazine/smg/nailgun, VENDOR_ITEM_REGULAR), list("EXPLOSIVES BOXES", -1, null, null), list("M15 Fragmentation Grenade Packet", 0, /obj/item/storage/box/packet/m15, VENDOR_ITEM_REGULAR), @@ -154,12 +156,14 @@ list("M74 AGM-Airburst Smoke Grenade Packet", 0, /obj/item/storage/box/packet/airburst_smoke, VENDOR_ITEM_REGULAR), list("M74 AGM-S Star Shell Packet", 0, /obj/item/storage/box/packet/flare, VENDOR_ITEM_REGULAR), list("M74 AGM-H Hornet Shell Packet", 0, /obj/item/storage/box/packet/hornet, VENDOR_ITEM_REGULAR), + list("G2 Electroshock grenade packet", 0, /obj/item/storage/box/packet/sebb, VENDOR_ITEM_REGULAR), list("M20 mine box", 0, /obj/item/storage/box/explosive_mines, VENDOR_ITEM_REGULAR), list("OTHER BOXES", -1, null, null), list("Box of M94 Marking Flare Packs", 0, /obj/item/ammo_box/magazine/misc/flares, VENDOR_ITEM_REGULAR), list("Box of M89 Signal Flare Packs", 0, /obj/item/ammo_box/magazine/misc/flares/signal, VENDOR_ITEM_REGULAR), - list("Box of High-Capacity Power Cells", 0, /obj/item/ammo_box/magazine/misc/power_cell, VENDOR_ITEM_REGULAR) + list("Box of High-Capacity Power Cells", 0, /obj/item/ammo_box/magazine/misc/power_cell, VENDOR_ITEM_REGULAR), + list("Nailgun Magazine Box (7x45mm)", floor(scale * 2), /obj/item/ammo_box/magazine/nailgun, VENDOR_ITEM_REGULAR) ) /obj/structure/machinery/cm_vending/sorted/cargo_guns/stock(obj/item/item_to_stock, mob/user) diff --git a/code/game/machinery/vending/vendor_types/squad_prep/squad_engineer.dm b/code/game/machinery/vending/vendor_types/squad_prep/squad_engineer.dm index aaf134c4a459..53ce7986f195 100644 --- a/code/game/machinery/vending/vendor_types/squad_prep/squad_engineer.dm +++ b/code/game/machinery/vending/vendor_types/squad_prep/squad_engineer.dm @@ -35,6 +35,7 @@ GLOBAL_LIST_INIT(cm_vending_gear_engi, list( list("M74 AGM-Hornet Airburst Packet (x3 airburst grenades", 20, /obj/item/storage/box/packet/hornet, null, VENDOR_ITEM_REGULAR), list("M20 Mine Box (x4 mines)", 18, /obj/item/storage/box/explosive_mines, null, VENDOR_ITEM_REGULAR), list("M40 MFHS Metal Foam Grenade", 5, /obj/item/explosive/grenade/metal_foam, null, VENDOR_ITEM_REGULAR), + list("G2 Electroshock Grenade Packet (x3 grenades)", 16, /obj/item/storage/box/packet/sebb, null, VENDOR_ITEM_REGULAR), list("PRIMARY AMMUNITION", 0, null, null, null), list("M4RA AP Magazine (10x24mm)", 6, /obj/item/ammo_magazine/rifle/m4ra/ap, null, VENDOR_ITEM_REGULAR), @@ -131,12 +132,13 @@ GLOBAL_LIST_INIT(cm_vending_clothing_engi, list( list("M276 Ammo Load Rig", 0, /obj/item/storage/belt/marine, MARINE_CAN_BUY_BELT, VENDOR_ITEM_REGULAR), list("M276 General Pistol Holster Rig", 0, /obj/item/storage/belt/gun/m4a3, MARINE_CAN_BUY_BELT, VENDOR_ITEM_REGULAR), list("M276 M39 Holster Rig", 0, /obj/item/storage/belt/gun/m39, MARINE_CAN_BUY_BELT, VENDOR_ITEM_REGULAR), - list("M276 M44 Holster Rig", 0, /obj/item/storage/belt/gun/m44, MARINE_CAN_BUY_BELT, VENDOR_ITEM_REGULAR), + list("M276 General Revolver Holster Rig", 0, /obj/item/storage/belt/gun/m44, MARINE_CAN_BUY_BELT, VENDOR_ITEM_REGULAR), list("M276 M82F Holster Rig", 0, /obj/item/storage/belt/gun/flaregun, MARINE_CAN_BUY_BELT, VENDOR_ITEM_REGULAR), list("M276 Shotgun Shell Loading Rig", 0, /obj/item/storage/belt/shotgun, MARINE_CAN_BUY_BELT, VENDOR_ITEM_REGULAR), list("M276 Mortar Operator Belt", 0, /obj/item/storage/belt/gun/mortarbelt, MARINE_CAN_BUY_BELT, VENDOR_ITEM_REGULAR), list("M276 Toolbelt Rig (Full)", 0, /obj/item/storage/belt/utility/full, MARINE_CAN_BUY_BELT, VENDOR_ITEM_MANDATORY), list("M276 M40 Grenade Rig", 0, /obj/item/storage/belt/grenade, MARINE_CAN_BUY_BELT, VENDOR_ITEM_REGULAR), + list("M277 Pattern Construction Rig", 0, /obj/item/storage/belt/utility/construction, MARINE_CAN_BUY_BELT, VENDOR_ITEM_RECOMMENDED), list("POUCHES (CHOOSE 2)", 0, null, null, null), list("Construction Pouch", 0, /obj/item/storage/pouch/construction, MARINE_CAN_BUY_POUCH, VENDOR_ITEM_RECOMMENDED), @@ -152,6 +154,8 @@ GLOBAL_LIST_INIT(cm_vending_clothing_engi, list( list("Medium General Pouch", 0, /obj/item/storage/pouch/general/medium, MARINE_CAN_BUY_POUCH, VENDOR_ITEM_REGULAR), list("Pistol Pouch", 0, /obj/item/storage/pouch/pistol, MARINE_CAN_BUY_POUCH, VENDOR_ITEM_REGULAR), list("Tools Pouch (Full)", 0, /obj/item/storage/pouch/tools/full, MARINE_CAN_BUY_POUCH, VENDOR_ITEM_REGULAR), + list("Engineer kit Pouch", 0, /obj/item/storage/pouch/engikit, MARINE_CAN_BUY_POUCH, VENDOR_ITEM_REGULAR), + list("ACCESSORIES (CHOOSE 1)", 0, null, null, null), list("Black Webbing Vest", 0, /obj/item/clothing/accessory/storage/black_vest, MARINE_CAN_BUY_ACCESSORY, VENDOR_ITEM_REGULAR), @@ -159,6 +163,7 @@ GLOBAL_LIST_INIT(cm_vending_clothing_engi, list( list("Shoulder Holster", 0, /obj/item/clothing/accessory/storage/holster, MARINE_CAN_BUY_ACCESSORY, VENDOR_ITEM_REGULAR), list("Webbing", 0, /obj/item/clothing/accessory/storage/webbing, MARINE_CAN_BUY_ACCESSORY, VENDOR_ITEM_REGULAR), list("Drop Pouch", 0, /obj/item/clothing/accessory/storage/droppouch, MARINE_CAN_BUY_ACCESSORY, VENDOR_ITEM_REGULAR), + list("Small Tool Webbing (Full)", 0, /obj/item/clothing/accessory/storage/tool_webbing/small/equipped, MARINE_CAN_BUY_ACCESSORY, VENDOR_ITEM_REGULAR), list("MASK (CHOOSE 1)", 0, null, null, null), list("Gas Mask", 0, /obj/item/clothing/mask/gas, MARINE_CAN_BUY_MASK, VENDOR_ITEM_REGULAR), @@ -210,4 +215,5 @@ GLOBAL_LIST_INIT(cm_vending_clothing_engi, list( /obj/item/cell/high, /obj/item/tool/shovel/etool/folded, /obj/item/device/lightreplacer, + /obj/item/weapon/gun/smg/nailgun/compact/tactical, ) diff --git a/code/game/machinery/vending/vendor_types/squad_prep/squad_leader.dm b/code/game/machinery/vending/vendor_types/squad_prep/squad_leader.dm index 17d3419ac2f8..d3985adf5fab 100644 --- a/code/game/machinery/vending/vendor_types/squad_prep/squad_leader.dm +++ b/code/game/machinery/vending/vendor_types/squad_prep/squad_leader.dm @@ -61,6 +61,7 @@ GLOBAL_LIST_INIT(cm_vending_gear_leader, list( list("M74 AGM-Hornet Airburst Packet (x3 airburst grenades", 20, /obj/item/storage/box/packet/hornet, null, VENDOR_ITEM_REGULAR), list("M20 Mine Box (x4 mines)", 20, /obj/item/storage/box/explosive_mines, null, VENDOR_ITEM_REGULAR), list("M40 MFHS Metal Foam Grenade", 5, /obj/item/explosive/grenade/metal_foam, null, VENDOR_ITEM_REGULAR), + list("G2 Electroshock Grenade Packet (x3 grenades)", 16, /obj/item/storage/box/packet/sebb, null, VENDOR_ITEM_REGULAR), list("MEDICAL SUPPLIES", 0, null, null, null), list("Burn Kit", 2, /obj/item/stack/medical/advanced/ointment, null, VENDOR_ITEM_REGULAR), @@ -143,7 +144,7 @@ GLOBAL_LIST_INIT(cm_vending_clothing_leader, list( list("M276 Lifesaver Bag", 0, /obj/item/storage/belt/medical/lifesaver, MARINE_CAN_BUY_BELT, VENDOR_ITEM_REGULAR), list("M276 Medical Storage Rig", 0, /obj/item/storage/belt/medical, MARINE_CAN_BUY_BELT, VENDOR_ITEM_REGULAR), list("M276 M39 Holster Rig", 0, /obj/item/storage/belt/gun/m39, MARINE_CAN_BUY_BELT, VENDOR_ITEM_REGULAR), - list("M276 M44 Holster Rig", 0, /obj/item/storage/belt/gun/m44, MARINE_CAN_BUY_BELT, VENDOR_ITEM_REGULAR), + list("M276 General Revolver Holster Rig", 0, /obj/item/storage/belt/gun/m44, MARINE_CAN_BUY_BELT, VENDOR_ITEM_REGULAR), list("M276 M82F Holster Rig", 0, /obj/item/storage/belt/gun/flaregun, MARINE_CAN_BUY_BELT, VENDOR_ITEM_REGULAR), list("M276 Shotgun Shell Loading Rig", 0, /obj/item/storage/belt/shotgun, MARINE_CAN_BUY_BELT, VENDOR_ITEM_REGULAR), list("M276 Toolbelt Rig (Full)", 0, /obj/item/storage/belt/utility/full, MARINE_CAN_BUY_BELT, VENDOR_ITEM_REGULAR), diff --git a/code/game/machinery/vending/vendor_types/squad_prep/squad_medic.dm b/code/game/machinery/vending/vendor_types/squad_prep/squad_medic.dm index a73df202d4ef..45e63b36a5c8 100644 --- a/code/game/machinery/vending/vendor_types/squad_prep/squad_medic.dm +++ b/code/game/machinery/vending/vendor_types/squad_prep/squad_medic.dm @@ -57,6 +57,7 @@ GLOBAL_LIST_INIT(cm_vending_gear_medic, list( list("M74 AGM-Smoke Airburst Packet (x3 airburst grenades)", 10, /obj/item/storage/box/packet/airburst_smoke, null, VENDOR_ITEM_REGULAR), list("M74 AGM-Hornet Airburst Packet (x3 airburst grenades", 20, /obj/item/storage/box/packet/hornet, null, VENDOR_ITEM_REGULAR), list("M20 Mine Box (x4 mines)", 20, /obj/item/storage/box/explosive_mines, null, VENDOR_ITEM_REGULAR), + list("G2 Electroshock Grenade Packet (x3 grenades)", 16, /obj/item/storage/box/packet/sebb, null, VENDOR_ITEM_REGULAR), list("PRIMARY AMMUNITION", 0, null, null, null), list("M4RA AP Magazine (10x24mm)", 6, /obj/item/ammo_magazine/rifle/m4ra/ap, null, VENDOR_ITEM_REGULAR), @@ -151,7 +152,7 @@ GLOBAL_LIST_INIT(cm_vending_clothing_medic, list( list("M276 Lifesaver Bag (Full)", 0, /obj/item/storage/belt/medical/lifesaver/full, MARINE_CAN_BUY_BELT, VENDOR_ITEM_RECOMMENDED), list("M276 Medical Storage Rig (Full)", 0, /obj/item/storage/belt/medical/full, MARINE_CAN_BUY_BELT, VENDOR_ITEM_RECOMMENDED), list("M276 M39 Holster Rig", 0, /obj/item/storage/belt/gun/m39, MARINE_CAN_BUY_BELT, VENDOR_ITEM_REGULAR), - list("M276 M44 Holster Rig", 0, /obj/item/storage/belt/gun/m44, MARINE_CAN_BUY_BELT, VENDOR_ITEM_REGULAR), + list("M276 General Revolver Holster Rig", 0, /obj/item/storage/belt/gun/m44, MARINE_CAN_BUY_BELT, VENDOR_ITEM_REGULAR), list("M276 M82F Holster Rig", 0, /obj/item/storage/belt/gun/flaregun, MARINE_CAN_BUY_BELT, VENDOR_ITEM_REGULAR), list("M276 Shotgun Shell Loading Rig", 0, /obj/item/storage/belt/shotgun, MARINE_CAN_BUY_BELT, VENDOR_ITEM_REGULAR), list("M276 M40 Grenade Rig", 0, /obj/item/storage/belt/grenade, MARINE_CAN_BUY_BELT, VENDOR_ITEM_REGULAR), diff --git a/code/game/machinery/vending/vendor_types/squad_prep/squad_prep.dm b/code/game/machinery/vending/vendor_types/squad_prep/squad_prep.dm index 35b059ac9611..ff43ca68657d 100644 --- a/code/game/machinery/vending/vendor_types/squad_prep/squad_prep.dm +++ b/code/game/machinery/vending/vendor_types/squad_prep/squad_prep.dm @@ -148,7 +148,7 @@ list("M276 Pattern General Pistol Holster Rig", floor(scale * 15), /obj/item/storage/belt/gun/m4a3, VENDOR_ITEM_REGULAR), list("M276 Pattern M39 Holster Rig", floor(scale * 15), /obj/item/storage/large_holster/m39, VENDOR_ITEM_REGULAR), list("M276 Pattern M39 Holster Rig And Pouch", floor(scale * 10), /obj/item/storage/belt/gun/m39, VENDOR_ITEM_REGULAR), - list("M276 Pattern M44 Holster Rig", floor(scale * 15), /obj/item/storage/belt/gun/m44, VENDOR_ITEM_REGULAR), + list("M276 Pattern General Revolver Holster Rig", floor(scale * 15), /obj/item/storage/belt/gun/m44, VENDOR_ITEM_REGULAR), list("M276 Pattern M82F Holster Rig", floor(scale * 5), /obj/item/storage/belt/gun/flaregun, VENDOR_ITEM_REGULAR), list("M276 Knife Rig (Full)", floor(scale * 15), /obj/item/storage/belt/knifepouch, VENDOR_ITEM_REGULAR), list("M276 G8-A General Utility Pouch", floor(scale * 15), /obj/item/storage/backpack/general_belt, VENDOR_ITEM_REGULAR), @@ -339,7 +339,8 @@ list("Binoculars", floor(scale * 1), /obj/item/device/binoculars, VENDOR_ITEM_REGULAR), list("MB-6 Folding Barricades (x3)", floor(scale * 2), /obj/item/stack/folding_barricade/three, VENDOR_ITEM_REGULAR), list("Spare PDT/L Battle Buddy Kit", floor(scale * 3), /obj/item/storage/box/pdt_kit, VENDOR_ITEM_REGULAR), - list("W-Y brand rechargeable mini-battery", floor(scale * 2.5), /obj/item/cell/crap, VENDOR_ITEM_REGULAR) + list("W-Y brand rechargeable mini-battery", floor(scale * 2.5), /obj/item/cell/crap, VENDOR_ITEM_REGULAR), + list("Nailgun Magazine (7x45mm)", floor(scale * 4), /obj/item/ammo_magazine/smg/nailgun, VENDOR_ITEM_REGULAR) ) //--------------SQUAD ATTACHMENTS VENDOR-------------- diff --git a/code/game/machinery/vending/vendor_types/squad_prep/squad_rifleman.dm b/code/game/machinery/vending/vendor_types/squad_prep/squad_rifleman.dm index 65066731070d..75e7fc36e4d3 100644 --- a/code/game/machinery/vending/vendor_types/squad_prep/squad_rifleman.dm +++ b/code/game/machinery/vending/vendor_types/squad_prep/squad_rifleman.dm @@ -21,7 +21,7 @@ GLOBAL_LIST_INIT(cm_vending_clothing_marine, list( list("M276 General Pistol Holster Rig", 0, /obj/item/storage/belt/gun/m4a3, MARINE_CAN_BUY_BELT, VENDOR_ITEM_REGULAR), list("M276 Knife Rig (Full)", 0, /obj/item/storage/belt/knifepouch, MARINE_CAN_BUY_BELT, VENDOR_ITEM_REGULAR), list("M276 M39 Holster Rig", 0, /obj/item/storage/belt/gun/m39, MARINE_CAN_BUY_BELT, VENDOR_ITEM_REGULAR), - list("M276 M44 Holster Rig", 0, /obj/item/storage/belt/gun/m44, MARINE_CAN_BUY_BELT, VENDOR_ITEM_REGULAR), + list("M276 General Revolver Holster Rig", 0, /obj/item/storage/belt/gun/m44, MARINE_CAN_BUY_BELT, VENDOR_ITEM_REGULAR), list("M276 M82F Holster Rig", 0, /obj/item/storage/belt/gun/flaregun, MARINE_CAN_BUY_BELT, VENDOR_ITEM_REGULAR), list("M276 Shotgun Shell Loading Rig", 0, /obj/item/storage/belt/shotgun, MARINE_CAN_BUY_BELT, VENDOR_ITEM_REGULAR), list("M276 G8-A General Utility Pouch", 0, /obj/item/storage/backpack/general_belt, MARINE_CAN_BUY_BELT, VENDOR_ITEM_REGULAR), diff --git a/code/game/machinery/vending/vendor_types/squad_prep/squad_specialist.dm b/code/game/machinery/vending/vendor_types/squad_prep/squad_specialist.dm index 4d14b7b89ccd..a21207a6645c 100644 --- a/code/game/machinery/vending/vendor_types/squad_prep/squad_specialist.dm +++ b/code/game/machinery/vending/vendor_types/squad_prep/squad_specialist.dm @@ -32,6 +32,7 @@ GLOBAL_LIST_INIT(cm_vending_gear_spec, list( list("M74 AGM-F Fragmentation Grenades x6", 40, /obj/effect/essentials_set/agmf_6_pack, null, VENDOR_ITEM_REGULAR), list("M74 AGM-I Incendiary Grenades x6", 40, /obj/effect/essentials_set/agmi_6_pack, null, VENDOR_ITEM_REGULAR), list("M74 AGM-S Smoke Grenades x6", 20, /obj/effect/essentials_set/agms_6_pack, null, VENDOR_ITEM_REGULAR), + list("G2 Electroshock Grenade Pack x6", 40, /obj/effect/essentials_set/sebb_6_pack, null, VENDOR_ITEM_REGULAR), list("EXTRA FLAMETHROWER TANKS", 0, null, null, null), list("Large Incinerator Tank", 40, /obj/item/ammo_magazine/flamer_tank/large, null, VENDOR_ITEM_REGULAR), @@ -71,7 +72,7 @@ GLOBAL_LIST_INIT(cm_vending_clothing_specialist, list( list("M276 Ammo Load Rig", 0, /obj/item/storage/belt/marine, MARINE_CAN_BUY_BELT, VENDOR_ITEM_REGULAR), list("M276 General Pistol Holster Rig", 0, /obj/item/storage/belt/gun/m4a3, MARINE_CAN_BUY_BELT, VENDOR_ITEM_RECOMMENDED), list("M276 M39 Holster Rig", 0, /obj/item/storage/belt/gun/m39, MARINE_CAN_BUY_BELT, VENDOR_ITEM_REGULAR), - list("M276 M44 Holster Rig", 0, /obj/item/storage/belt/gun/m44, MARINE_CAN_BUY_BELT, VENDOR_ITEM_REGULAR), + list("M276 General Revolver Holster Rig", 0, /obj/item/storage/belt/gun/m44, MARINE_CAN_BUY_BELT, VENDOR_ITEM_REGULAR), list("M276 M82F Holster Rig", 0, /obj/item/storage/belt/gun/flaregun, MARINE_CAN_BUY_BELT, VENDOR_ITEM_REGULAR), list("M276 Shotgun Shell Loading Rig", 0, /obj/item/storage/belt/shotgun, MARINE_CAN_BUY_BELT, VENDOR_ITEM_REGULAR), @@ -249,3 +250,13 @@ GLOBAL_LIST_INIT(cm_vending_clothing_specialist, list( /obj/item/explosive/grenade/smokebomb/airburst, /obj/item/explosive/grenade/smokebomb/airburst, ) + +/obj/effect/essentials_set/sebb_6_pack + spawned_gear_list = list( + /obj/item/explosive/grenade/sebb, + /obj/item/explosive/grenade/sebb, + /obj/item/explosive/grenade/sebb, + /obj/item/explosive/grenade/sebb, + /obj/item/explosive/grenade/sebb, + /obj/item/explosive/grenade/sebb, + ) diff --git a/code/game/machinery/vending/vendor_types/squad_prep/squad_tl.dm b/code/game/machinery/vending/vendor_types/squad_prep/squad_tl.dm index c37dd98ed263..8bd46110aba5 100644 --- a/code/game/machinery/vending/vendor_types/squad_prep/squad_tl.dm +++ b/code/game/machinery/vending/vendor_types/squad_prep/squad_tl.dm @@ -12,6 +12,7 @@ GLOBAL_LIST_INIT(cm_vending_gear_tl, list( list("M74 AGM-Hornet Airburst Packet (x3 airburst grenades", 20, /obj/item/storage/box/packet/hornet, null, VENDOR_ITEM_REGULAR), list("M20 Mine Box (x4 mines)", 20, /obj/item/storage/box/explosive_mines, null, VENDOR_ITEM_REGULAR), list("M40 MFHS Metal Foam Grenade", 5, /obj/item/explosive/grenade/metal_foam, null, VENDOR_ITEM_REGULAR), + list("G2 Electroshock Grenade Packet (x3 grenades)", 16, /obj/item/storage/box/packet/sebb, null, VENDOR_ITEM_REGULAR), list("PRIMARY AMMUNITION", 0, null, null, null), list("M4RA AP Magazine (10x24mm)", 10, /obj/item/ammo_magazine/rifle/m4ra/ap, null, VENDOR_ITEM_REGULAR), @@ -101,7 +102,7 @@ GLOBAL_LIST_INIT(cm_vending_clothing_tl, list( list("M276 Ammo Load Rig", 0, /obj/item/storage/belt/marine, MARINE_CAN_BUY_BELT, VENDOR_ITEM_RECOMMENDED), list("M276 General Pistol Holster Rig", 0, /obj/item/storage/belt/gun/m4a3, MARINE_CAN_BUY_BELT, VENDOR_ITEM_REGULAR), list("M276 M39 Holster Rig", 0, /obj/item/storage/belt/gun/m39, MARINE_CAN_BUY_BELT, VENDOR_ITEM_REGULAR), - list("M276 M44 Holster Rig", 0, /obj/item/storage/belt/gun/m44, MARINE_CAN_BUY_BELT, VENDOR_ITEM_REGULAR), + list("M276 General Revolver Holster Rig", 0, /obj/item/storage/belt/gun/m44, MARINE_CAN_BUY_BELT, VENDOR_ITEM_REGULAR), list("M276 M82F Holster Rig", 0, /obj/item/storage/belt/gun/flaregun, MARINE_CAN_BUY_BELT, VENDOR_ITEM_REGULAR), list("M276 Shotgun Shell Loading Rig", 0, /obj/item/storage/belt/shotgun, MARINE_CAN_BUY_BELT, VENDOR_ITEM_REGULAR), list("M276 Toolbelt Rig (Full)", 0, /obj/item/storage/belt/utility/full, MARINE_CAN_BUY_BELT, VENDOR_ITEM_RECOMMENDED), diff --git a/code/game/machinery/vending/vendor_types/wo_vendors.dm b/code/game/machinery/vending/vendor_types/wo_vendors.dm index 1d6ad60bb357..1a4c3d3b5bd8 100644 --- a/code/game/machinery/vending/vendor_types/wo_vendors.dm +++ b/code/game/machinery/vending/vendor_types/wo_vendors.dm @@ -63,7 +63,7 @@ list("M276 Pattern General Pistol Holster Rig", floor(scale * 10), /obj/item/storage/belt/gun/m4a3, VENDOR_ITEM_REGULAR), list("M276 Pattern M39 Holster Rig", floor(scale * 10), /obj/item/storage/large_holster/m39, VENDOR_ITEM_REGULAR), list("M276 Pattern M39 Holster Rig And Pouch", floor(scale * 5), /obj/item/storage/belt/gun/m39, VENDOR_ITEM_REGULAR), - list("M276 Pattern M44 Holster Rig", floor(scale * 10), /obj/item/storage/belt/gun/m44, VENDOR_ITEM_REGULAR), + list("M276 Pattern General Revolver Holster Rig", floor(scale * 10), /obj/item/storage/belt/gun/m44, VENDOR_ITEM_REGULAR), list("M276 Pattern M82F Holster Rig", floor(scale * 2), /obj/item/storage/belt/gun/flaregun, VENDOR_ITEM_REGULAR), list("M276 Knife Rig (Full)", floor(scale * 10), /obj/item/storage/belt/knifepouch, VENDOR_ITEM_REGULAR), list("M276 G8-A General Utility Pouch", floor(scale * 10), /obj/item/storage/backpack/general_belt, VENDOR_ITEM_REGULAR), diff --git a/code/game/objects/effects/effect_system/particle_effects.dm b/code/game/objects/effects/effect_system/particle_effects.dm index 972d242bf359..9440c16f2d4e 100644 --- a/code/game/objects/effects/effect_system/particle_effects.dm +++ b/code/game/objects/effects/effect_system/particle_effects.dm @@ -8,10 +8,10 @@ mouse_opacity = MOUSE_OPACITY_TRANSPARENT unacidable = TRUE // So effect are not targeted by alien acid. -/obj/effect/particle_effect/initialize_pass_flags(datum/pass_flags_container/PF) +/obj/effect/particle_effect/initialize_pass_flags(datum/pass_flags_container/pass_flags) ..() - if (PF) - PF.flags_pass = PASS_OVER|PASS_AROUND|PASS_UNDER|PASS_THROUGH|PASS_MOB_THRU + if (pass_flags) + pass_flags.flags_pass = PASS_OVER|PASS_AROUND|PASS_UNDER|PASS_THROUGH|PASS_MOB_THRU //Water @@ -22,17 +22,14 @@ var/life = 15 mouse_opacity = MOUSE_OPACITY_TRANSPARENT -/obj/effect/particle_effect/water/initialize_pass_flags(datum/pass_flags_container/PF) +/obj/effect/particle_effect/water/initialize_pass_flags(datum/pass_flags_container/pass_flags) ..() - if (PF) - PF.flags_pass = PASS_THROUGH|PASS_OVER|PASS_MOB_THRU|PASS_UNDER + if (pass_flags) + pass_flags.flags_pass = PASS_THROUGH|PASS_OVER|PASS_MOB_THRU|PASS_UNDER /obj/effect/particle_effect/water/Move(turf/newloc) - //var/turf/T = src.loc - //if (istype(T, /turf)) - // T.firelevel = 0 //TODO: FIX - if (--src.life < 1) - //SN src = null + life -= 1 + if (life < 1) qdel(src) if(newloc.density) return 0 diff --git a/code/game/objects/effects/effect_system/smoke.dm b/code/game/objects/effects/effect_system/smoke.dm index d4152bdee37e..d0ea5d2ed5ef 100644 --- a/code/game/objects/effects/effect_system/smoke.dm +++ b/code/game/objects/effects/effect_system/smoke.dm @@ -731,7 +731,7 @@ location = get_turf(loca) if(direct) direction = direct - if(lifetime) + if(smoke_time) lifetime = smoke_time radius = min(radius, 10) amount = radius diff --git a/code/game/objects/effects/overlays.dm b/code/game/objects/effects/overlays.dm index ce0fd5506cd7..d559137f79b1 100644 --- a/code/game/objects/effects/overlays.dm +++ b/code/game/objects/effects/overlays.dm @@ -223,6 +223,7 @@ icon_state = "empdisable" name = "emp sparks" effect_duration = 10 + mouse_opacity = MOUSE_OPACITY_TRANSPARENT /obj/effect/overlay/temp/emp_sparks/New(loc) setDir(pick(GLOB.cardinals)) @@ -234,8 +235,12 @@ icon_state = "emppulse" effect_duration = 20 - - +/obj/effect/overlay/temp/elec_arc + icon = 'icons/effects/effects.dmi' + icon_state = "electricity" + name = "electric arc" + effect_duration = 3 SECONDS + mouse_opacity = MOUSE_OPACITY_TRANSPARENT //gib animation diff --git a/code/game/objects/explosion_recursive.dm b/code/game/objects/explosion_recursive.dm index 2ec61b0cc1f1..855f6c2f43c7 100644 --- a/code/game/objects/explosion_recursive.dm +++ b/code/game/objects/explosion_recursive.dm @@ -71,7 +71,9 @@ explosion resistance exactly as much as their health falloff = max(falloff0, power/100) //prevent explosions with a range larger than 100 tiles minimum_spread_power = -power * reflection_amplification_limit - msg_admin_attack("Explosion with Power: [power], Falloff: [falloff] in area [epicenter.loc.name] ([epicenter.x],[epicenter.y],[epicenter.z]).", src.loc.x, src.loc.y, src.loc.z) + var/obj/causing_obj = explosion_cause_data?.resolve_cause() + var/mob/causing_mob = explosion_cause_data?.resolve_mob() + msg_admin_attack("Explosion with Power: [power], Falloff: [falloff],[causing_obj ? " from [causing_obj]" : ""][causing_mob ? " by [key_name(causing_mob)]" : ""] in area [epicenter.loc.name] ([epicenter.x],[epicenter.y],[epicenter.z]).", loc.x, loc.y, loc.z) playsound(epicenter, 'sound/effects/explosionfar.ogg', 100, 1, round(power^2,1)) playsound(epicenter, "explosion", 90, 1, max(round(power,1),7) ) diff --git a/code/game/objects/items.dm b/code/game/objects/items.dm index 03e1f126e9d8..d8bf3d9d8f79 100644 --- a/code/game/objects/items.dm +++ b/code/game/objects/items.dm @@ -163,6 +163,9 @@ /// How much to offset the item randomly either way alongside Y visually var/ground_offset_y = 0 + /// Special storages this item prioritizes + var/list/preferred_storage + /obj/item/Initialize(mapload, ...) . = ..() diff --git a/code/game/objects/items/circuitboards/computer.dm b/code/game/objects/items/circuitboards/computer.dm index 43215faf0fbb..58ff86130cd6 100644 --- a/code/game/objects/items/circuitboards/computer.dm +++ b/code/game/objects/items/circuitboards/computer.dm @@ -180,7 +180,7 @@ else if(HAS_TRAIT(tool, TRAIT_TOOL_BLACKMARKET_HACKER)) to_chat(user, SPAN_WARNING("You start messing around with the electronics of [src]...")) if(do_after(user, 8 SECONDS, INTERRUPT_ALL, BUSY_ICON_FRIENDLY)) - if(!skillcheck(user, SKILL_ENGINEER, SKILL_ENGINEER_ENGI)) + if(!skillcheck(user, SKILL_ENGINEER, SKILL_ENGINEER_TRAINED)) to_chat(user, SPAN_WARNING("You have no idea what you're doing.")) return to_chat(user, SPAN_WARNING("Huh? You find a processor bus with the letters 'B.M.' written in white crayon over it. You start fiddling with it.")) diff --git a/code/game/objects/items/devices/RCD.dm b/code/game/objects/items/devices/RCD.dm deleted file mode 100644 index 00e569800314..000000000000 --- a/code/game/objects/items/devices/RCD.dm +++ /dev/null @@ -1,194 +0,0 @@ -//This file was auto-corrected by findeclaration.exe on 25.5.2012 20:42:32 - -/* -CONTAINS: -RCD -*/ -/obj/item/device/rcd - name = "rapid-construction-device (RCD)" - desc = "A device used to rapidly build walls/floor." - icon = 'icons/obj/items/devices.dmi' - icon_state = "rcd" - opacity = FALSE - density = FALSE - anchored = FALSE - flags_atom = FPRINT|CONDUCT - force = 10 - throwforce = 10 - throw_speed = SPEED_FAST - throw_range = 5 - w_class = SIZE_MEDIUM - matter = list("metal" = 50000) - - var/datum/effect_system/spark_spread/spark_system - var/stored_matter = 0 - var/working = 0 - var/mode = 1 - var/canRwall = 0 - var/disabled = 0 - - -/obj/item/device/rcd/New() - desc = "A RCD. It currently holds [stored_matter]/30 matter-units." - src.spark_system = new /datum/effect_system/spark_spread - spark_system.set_up(5, 0, src) - spark_system.attach(src) - return - -/obj/item/device/rcd/Destroy() - QDEL_NULL(spark_system) - return ..() - - -/obj/item/device/rcd/attackby(obj/item/W, mob/user) - ..() - if(istype(W, /obj/item/ammo_rcd)) - if((stored_matter + 10) > 30) - to_chat(user, SPAN_NOTICE("The RCD cant hold any more matter-units.")) - return - user.drop_held_item() - qdel(W) - stored_matter += 10 - playsound(src.loc, 'sound/machines/click.ogg', 15, 1) - to_chat(user, SPAN_NOTICE("The RCD now holds [stored_matter]/30 matter-units.")) - desc = "A RCD. It currently holds [stored_matter]/30 matter-units." - return - - -/obj/item/device/rcd/attack_self(mob/user) - ..() - - //Change the mode - playsound(src.loc, 'sound/effects/pop.ogg', 15, 0) - switch(mode) - if(1) - mode = 2 - to_chat(user, SPAN_NOTICE("Changed mode to 'Airlock'")) - if(prob(20)) - src.spark_system.start() - return - if(2) - mode = 3 - to_chat(user, SPAN_NOTICE("Changed mode to 'Deconstruct'")) - if(prob(20)) - src.spark_system.start() - return - if(3) - mode = 1 - to_chat(user, SPAN_NOTICE("Changed mode to 'Floor & Walls'")) - if(prob(20)) - src.spark_system.start() - return - -/obj/item/device/rcd/proc/activate() - playsound(src.loc, 'sound/items/Deconstruct.ogg', 25, 1) - - -/obj/item/device/rcd/afterattack(atom/A, mob/user, proximity) - if(!proximity) return - if(disabled) - return 0 - if(istype(A,/area/shuttle) || istype(A,/turf/open/space/transit)) - return 0 - if(!(istype(A, /turf) || istype(A, /obj/structure/machinery/door/airlock))) - return 0 - - switch(mode) - if(1) - if(istype(A, /turf/open/space)) - if(useResource(1, user)) - to_chat(user, "Building Floor...") - activate() - A:ChangeTurf(/turf/open/floor/plating/airless) - return 1 - return 0 - - if(istype(A, /turf/open/floor)) - if(checkResource(3, user)) - to_chat(user, "Building Wall ...") - playsound(src.loc, 'sound/machines/click.ogg', 15, 1) - if(do_after(user, 20, INTERRUPT_ALL|BEHAVIOR_IMMOBILE, BUSY_ICON_BUILD)) - if(!useResource(3, user)) return 0 - activate() - A:ChangeTurf(/turf/closed/wall) - return 1 - return 0 - - if(2) - if(istype(A, /turf/open/floor)) - if(checkResource(10, user)) - to_chat(user, "Building Airlock...") - playsound(src.loc, 'sound/machines/click.ogg', 15, 1) - if(do_after(user, 50, INTERRUPT_ALL|BEHAVIOR_IMMOBILE, BUSY_ICON_BUILD)) - if(!useResource(10, user)) return 0 - activate() - var/obj/structure/machinery/door/airlock/T = new /obj/structure/machinery/door/airlock( A ) - T.autoclose = 1 - return 1 - return 0 - return 0 - - if(3) - if(istype(A, /turf/closed/wall)) - var/turf/closed/wall/WL = A - if(WL.hull) - return 0 - if(istype(A, /turf/closed/wall/r_wall) && !canRwall) - return 0 - if(checkResource(5, user)) - to_chat(user, "Deconstructing Wall...") - playsound(src.loc, 'sound/machines/click.ogg', 15, 1) - if(do_after(user, 40, INTERRUPT_ALL|BEHAVIOR_IMMOBILE, BUSY_ICON_BUILD)) - if(!useResource(5, user)) return 0 - activate() - A:ChangeTurf(/turf/open/floor/plating/airless) - return 1 - return 0 - - if(istype(A, /turf/open/floor) && !istype(A, /turf/open/floor/plating)) - if(checkResource(5, user)) - to_chat(user, "Deconstructing Floor...") - playsound(src.loc, 'sound/machines/click.ogg', 15, 1) - if(do_after(user, 50, INTERRUPT_ALL|BEHAVIOR_IMMOBILE, BUSY_ICON_BUILD)) - if(!useResource(5, user)) return 0 - activate() - A:ChangeTurf(/turf/open/floor/plating/airless) - return 1 - return 0 - - if(istype(A, /obj/structure/machinery/door/airlock)) - if(checkResource(10, user)) - to_chat(user, "Deconstructing Airlock...") - playsound(src.loc, 'sound/machines/click.ogg', 15, 1) - if(do_after(user, 50, INTERRUPT_ALL|BEHAVIOR_IMMOBILE, BUSY_ICON_BUILD)) - if(!useResource(10, user)) return 0 - activate() - qdel(A) - return 1 - return 0 - return 0 - else - to_chat(user, "ERROR: RCD in MODE: [mode] attempted use by [user]. Send this text #coderbus or an admin.") - return 0 - -/obj/item/device/rcd/proc/useResource(amount, mob/user) - if(stored_matter < amount) - return 0 - stored_matter -= amount - desc = "A RCD. It currently holds [stored_matter]/30 matter-units." - return 1 - -/obj/item/device/rcd/proc/checkResource(amount, mob/user) - return stored_matter >= amount - -/obj/item/ammo_rcd - name = "compressed matter cartridge" - desc = "Highly compressed matter for the RCD." - icon = 'icons/obj/items/weapons/guns/legacy/old_bayguns.dmi' - icon_state = "rcd" - item_state = "rcdammo" - opacity = FALSE - density = FALSE - anchored = FALSE - - matter = list("metal" = 30000,"glass" = 15000) diff --git a/code/game/objects/items/devices/RSF.dm b/code/game/objects/items/devices/RSF.dm deleted file mode 100644 index 29f84c7c6d0c..000000000000 --- a/code/game/objects/items/devices/RSF.dm +++ /dev/null @@ -1,98 +0,0 @@ -/* -CONTAINS: -RSF - -*/ - -/obj/item/device/rsf - name = "\improper Rapid-Service-Fabricator" - desc = "A device used to rapidly deploy service items." - icon = 'icons/obj/items/devices.dmi' - icon_state = "rcd" - opacity = FALSE - density = FALSE - anchored = FALSE - var/stored_matter = 30 - var/mode = 1 - w_class = SIZE_MEDIUM - -/obj/item/device/rsf/get_examine_text(mob/user) - . = ..() - . += "It currently holds [stored_matter]/30 fabrication-units." - -/obj/item/device/rsf/attackby(obj/item/W, mob/user) - ..() - if (istype(W, /obj/item/ammo_rcd)) - - if ((stored_matter + 10) > 30) - to_chat(user, "The RSF can't hold any more matter.") - return - - qdel(W) - - stored_matter += 10 - playsound(src.loc, 'sound/machines/click.ogg', 15, 1) - to_chat(user, "The RSF now holds [stored_matter]/30 fabrication-units.") - return - -/obj/item/device/rsf/attack_self(mob/user) - ..() - playsound(src.loc, 'sound/effects/pop.ogg', 15, 0) - if (mode == 1) - mode = 2 - to_chat(user, "Changed dispensing mode to 'Drinking Glass'") - return - if (mode == 2) - mode = 3 - to_chat(user, "Changed dispensing mode to 'Paper'") - return - if (mode == 3) - mode = 4 - to_chat(user, "Changed dispensing mode to 'Pen'") - return - if (mode == 4) - mode = 5 - to_chat(user, "Changed dispensing mode to 'Dice Pack'") - return - if (mode == 5) - mode = 6 - to_chat(user, "Changed dispensing mode to 'Cigarette'") - return - if (mode == 6) - mode = 1 - to_chat(user, "Changed dispensing mode to 'Dosh'") - return - // Change mode - -/obj/item/device/rsf/afterattack(atom/A, mob/user, proximity) - - if(!proximity) return - - if(stored_matter <= 0) - return - - if(!istype(A, /obj/structure/surface/table) && !istype(A, /turf/open/floor)) - return - - playsound(src.loc, 'sound/machines/click.ogg', 25, 1) - var/obj/product - - switch(mode) - if(1) - product = new /obj/item/spacecash/c10() - if(2) - product = new /obj/item/reagent_container/food/drinks/drinkingglass() - if(3) - product = new /obj/item/paper() - if(4) - product = new /obj/item/tool/pen() - if(5) - product = new /obj/item/storage/pill_bottle/dice() - if(6) - product = new /obj/item/clothing/mask/cigarette() - - to_chat(user, "Dispensing [product ? product : "product"]...") - product.forceMove(get_turf(A)) - - stored_matter-- - to_chat(user, "The RSF now holds [stored_matter]/30 fabrication-units.") diff --git a/code/game/objects/items/devices/RSP.dm b/code/game/objects/items/devices/RSP.dm deleted file mode 100644 index cb61de1a77cc..000000000000 --- a/code/game/objects/items/devices/RSP.dm +++ /dev/null @@ -1,11 +0,0 @@ -/obj/item/device/rsp - name = "\improper Rapid-Seed-Producer (RSP)" - desc = "A device used to rapidly deploy seeds." - icon = 'icons/obj/items/devices.dmi' - icon_state = "rsp" - opacity = FALSE - density = FALSE - anchored = FALSE - var/stored_matter = 0 - var/mode = 1 - w_class = SIZE_MEDIUM diff --git a/code/game/objects/items/devices/defibrillator.dm b/code/game/objects/items/devices/defibrillator.dm index 518fdb1a9591..2debcf82d7d0 100644 --- a/code/game/objects/items/devices/defibrillator.dm +++ b/code/game/objects/items/devices/defibrillator.dm @@ -108,13 +108,13 @@ if(ghost && (!check_client || ghost.client) && (!check_can_reenter || ghost.can_reenter_corpse)) return ghost -/mob/living/carbon/human/proc/is_revivable() +/mob/living/carbon/human/proc/is_revivable(ignore_heart = FALSE) if(isnull(internal_organs_by_name) || isnull(internal_organs_by_name["heart"])) return FALSE var/datum/internal_organ/heart/heart = internal_organs_by_name["heart"] var/obj/limb/head = get_limb("head") - if(chestburst || !head || head.status & LIMB_DESTROYED || !heart || heart.organ_status >= ORGAN_BROKEN || !has_brain() || status_flags & PERMANENTLY_DEAD) + if(chestburst || !head || head.status & LIMB_DESTROYED || !ignore_heart && (!heart || heart.organ_status >= ORGAN_BROKEN) || !has_brain() || status_flags & PERMANENTLY_DEAD) return FALSE return TRUE diff --git a/code/game/objects/items/devices/drone_devices.dm b/code/game/objects/items/devices/drone_devices.dm deleted file mode 100644 index 0e22b64bf67f..000000000000 --- a/code/game/objects/items/devices/drone_devices.dm +++ /dev/null @@ -1,241 +0,0 @@ - - -//Simple borg hand. -//Limited use. -/obj/item/device/gripper - name = "magnetic gripper" - desc = "A simple grasping tool for synthetic assets." - icon_state = "gripper" - - //Has a list of items that it can hold. - var/list/can_hold = list( - /obj/item/cell, - /obj/item/circuitboard, - /obj/item/stock_parts, - /obj/item/frame, - /obj/item/tank, - /obj/item/stock_parts/smes_coil - ) - - //Item currently being held. - var/obj/item/wrapped = null - -/obj/item/device/gripper/paperwork - name = "paperwork gripper" - desc = "A simple grasping tool for clerical work." - - can_hold = list( - /obj/item/clipboard, - /obj/item/paper, - /obj/item/paper_bundle, - /obj/item/card/id, - ) - -/obj/item/device/gripper/attack_self(mob/user as mob) - ..() - - if(wrapped) - wrapped.attack_self(user) - -/obj/item/device/gripper/verb/drop_item() - - set name = "Drop Item" - set desc = "Release an item from your magnetic gripper." - set category = "Drone" - set src in usr - if(!wrapped) - //There's some weirdness with items being lost inside the arm. Trying to fix all cases. ~Z - for(var/obj/item/thing in src.contents) - thing.forceMove(get_turf(src)) - return - - if(wrapped.loc != src) - wrapped = null - return - - to_chat(src.loc, SPAN_WARNING("You drop \the [wrapped].")) - wrapped.forceMove(get_turf(src)) - wrapped = null - //update_icon() - -/obj/item/device/gripper/attack(mob/living/carbon/M as mob, mob/living/carbon/user as mob) - return - -/obj/item/device/gripper/afterattack(atom/target as mob|obj|turf|area, mob/living/user as mob|obj, proximity, params) - - if(!target || !proximity) //Target is invalid or we are not adjacent. - return - - //There's some weirdness with items being lost inside the arm. Trying to fix all cases. ~Z - if(!wrapped) - for(var/obj/item/thing in src.contents) - wrapped = thing - break - - if(wrapped) //Already have an item. - - //Temporary put wrapped into user so target's attackby() checks pass. - wrapped.forceMove(user) - - //Pass the attack on to the target. This might delete/relocate wrapped. - target.attackby(wrapped,user) - - //If wrapped was neither deleted nor put into target, put it back into the gripper. - if(wrapped && user && (wrapped.loc == user)) - wrapped.forceMove(src) - else - wrapped = null - return - - else if(istype(target,/obj/item)) //Check that we're not pocketing a mob. - - //...and that the item is not in a container. - if(!isturf(target.loc)) - return - - var/obj/item/I = target - - //Check if the item is blacklisted. - var/grab = 0 - for(var/typepath in can_hold) - if(istype(I,typepath)) - grab = 1 - break - - //We can grab the item, finally. - if(grab) - to_chat(user, "You collect \the [I].") - I.forceMove(src) - wrapped = I - return - else - to_chat(user, SPAN_DANGER("Your gripper cannot hold \the [target].")) - - else if(istype(target,/obj/structure/machinery/power/apc)) - var/obj/structure/machinery/power/apc/A = target - if(A.opened) - if(A.cell) - - wrapped = A.cell - - A.cell.add_fingerprint(user) - A.cell.update_icon() - A.cell.forceMove(src) - A.cell = null - - A.charging = 0 - A.update_icon() - - user.visible_message(SPAN_DANGER("[user] removes the power cell from [A]!"), "You remove the power cell.") - - - - - - - -//TODO: Matter decompiler. -/obj/item/device/matter_decompiler - name = "matter decompiler" - desc = "Eating trash, bits of glass, or other debris will replenish your stores." - icon_state = "decompiler" - - //Metal, glass, wood, plastic. - var/list/stored_comms = list( - "metal" = 0, - "glass" = 0, - "wood" = 0, - "plastic" = 0 - ) - -/obj/item/device/matter_decompiler/attack(mob/living/carbon/M as mob, mob/living/carbon/user as mob) - return - -/obj/item/device/matter_decompiler/afterattack(atom/target as mob|obj|turf|area, mob/living/user as mob|obj, proximity, params) - - if(!proximity) return //Not adjacent. - - //We only want to deal with using this on turfs. Specific items aren't important. - var/turf/T = get_turf(target) - if(!istype(T)) - return - - //Used to give the right message. - var/grabbed_something = 0 - - for(var/mob/M in T) - if(istype(M,/mob/living/simple_animal/lizard) || istype(M,/mob/living/simple_animal/mouse)) - src.loc.visible_message(SPAN_DANGER("[src.loc] sucks [M] into its decompiler. There's a horrible crunching noise."),SPAN_DANGER("It's a bit of a struggle, but you manage to suck [M] into your decompiler. It makes a series of visceral crunching noises.")) - new/obj/effect/decal/cleanable/blood/splatter(get_turf(src)) - qdel(M) - stored_comms["wood"]++ - stored_comms["wood"]++ - stored_comms["plastic"]++ - stored_comms["plastic"]++ - return - else - continue - - for(var/obj/W in T) - //Different classes of items give different commodities. - if (istype(W,/obj/item/trash/cigbutt)) - stored_comms["plastic"]++ - else if(istype(W,/obj/effect/spider/spiderling)) - stored_comms["wood"]++ - stored_comms["wood"]++ - stored_comms["plastic"]++ - stored_comms["plastic"]++ - else if(istype(W,/obj/item/light_bulb)) - var/obj/item/light_bulb/L = W - if(L.status >= 2) //In before someone changes the inexplicably local defines. ~ Z - stored_comms["metal"]++ - stored_comms["glass"]++ - else - continue - else if(istype(W,/obj/effect/decal/remains/robot)) - stored_comms["metal"]++ - stored_comms["metal"]++ - stored_comms["plastic"]++ - stored_comms["plastic"]++ - stored_comms["glass"]++ - else if(istype(W,/obj/item/trash)) - stored_comms["metal"]++ - stored_comms["plastic"]++ - stored_comms["plastic"]++ - stored_comms["plastic"]++ - else if(istype(W,/obj/effect/decal/cleanable/blood/gibs/robot)) - stored_comms["metal"]++ - stored_comms["metal"]++ - stored_comms["glass"]++ - stored_comms["glass"]++ - else if(istype(W,/obj/item/ammo_casing)) - stored_comms["metal"]++ - else if(istype(W,/obj/item/shard/shrapnel)) - stored_comms["metal"]++ - stored_comms["metal"]++ - stored_comms["metal"]++ - else if(istype(W,/obj/item/shard)) - stored_comms["glass"]++ - stored_comms["glass"]++ - stored_comms["glass"]++ - else if(istype(W,/obj/item/reagent_container/food/snacks/grown)) - stored_comms["wood"]++ - stored_comms["wood"]++ - stored_comms["wood"]++ - stored_comms["wood"]++ - else if(istype(W,/obj/item/ammo_magazine)) - var/obj/item/ammo_magazine/AM = W - if(AM.current_rounds) - continue - stored_comms["metal"]++ - else - continue - - qdel(W) - grabbed_something = 1 - - if(grabbed_something) - to_chat(user, SPAN_NOTICE(" You deploy your decompiler and clear out the contents of \the [T].")) - else - to_chat(user, SPAN_DANGER("Nothing on \the [T] is useful to you.")) - return diff --git a/code/game/objects/items/devices/flashlight.dm b/code/game/objects/items/devices/flashlight.dm index 8d5e3cc752ff..e506f51ce21c 100644 --- a/code/game/objects/items/devices/flashlight.dm +++ b/code/game/objects/items/devices/flashlight.dm @@ -15,7 +15,7 @@ ground_offset_x = 2 ground_offset_y = 6 - actions_types = list(/datum/action/item_action) + actions_types = list(/datum/action/item_action/toggle) var/on = FALSE var/raillight_compatible = TRUE //Can this be turned into a rail light ? var/toggleable = TRUE diff --git a/code/game/objects/items/devices/motion_detector.dm b/code/game/objects/items/devices/motion_detector.dm index dcbcc0dd8bc7..f68295001f92 100644 --- a/code/game/objects/items/devices/motion_detector.dm +++ b/code/game/objects/items/devices/motion_detector.dm @@ -33,7 +33,7 @@ var/long_range_cooldown = 2 var/blip_type = "detector" var/iff_signal = FACTION_MARINE - actions_types = list(/datum/action/item_action) + actions_types = list(/datum/action/item_action/toggle) var/scanning = FALSE // controls if MD is in process of scan var/datum/shape/rectangle/square/range_bounds var/long_range_locked = FALSE //only long-range MD diff --git a/code/game/objects/items/devices/multitool.dm b/code/game/objects/items/devices/multitool.dm index a92135b9d7ed..73e5b86a69eb 100644 --- a/code/game/objects/items/devices/multitool.dm +++ b/code/game/objects/items/devices/multitool.dm @@ -18,6 +18,7 @@ matter = list("metal" = 50,"glass" = 20) inherent_traits = list(TRAIT_TOOL_MULTITOOL) + preferred_storage = list(/obj/item/clothing/accessory/storage/tool_webbing = WEAR_ACCESSORY) var/hack_speed = 10 SECONDS // Only used for vendors right now var/next_scan @@ -46,7 +47,7 @@ /obj/item/device/multitool/attack_self(mob/user) ..() - if(world.time < next_scan || !ishuman(user) || !skillcheck(user,SKILL_ENGINEER,SKILL_ENGINEER_TRAINED)) + if(world.time < next_scan || !ishuman(user) || !skillcheck(user,SKILL_ENGINEER,SKILL_ENGINEER_NOVICE)) return next_scan = world.time + 15 diff --git a/code/game/objects/items/devices/scanners.dm b/code/game/objects/items/devices/scanners.dm index 8c507dad18e3..0e7680cd2f7d 100644 --- a/code/game/objects/items/devices/scanners.dm +++ b/code/game/objects/items/devices/scanners.dm @@ -329,7 +329,7 @@ FORENSIC SCANNER if(!(istype(user, /mob/living/carbon/human) || SSticker) && SSticker.mode.name != "monkey") to_chat(user, SPAN_DANGER("You don't have the dexterity to do this!")) return - if(!skillcheck(user, SKILL_ENGINEER, SKILL_ENGINEER_ENGI)) + if(!skillcheck(user, SKILL_ENGINEER, SKILL_ENGINEER_TRAINED)) to_chat(user, SPAN_WARNING("You do not know how to use the [name].")) return if(!istype(O)) diff --git a/code/game/objects/items/devices/suit_cooling.dm b/code/game/objects/items/devices/suit_cooling.dm deleted file mode 100644 index 564b3e41f591..000000000000 --- a/code/game/objects/items/devices/suit_cooling.dm +++ /dev/null @@ -1,179 +0,0 @@ -/obj/item/device/suit_cooling_unit - name = "portable suit cooling unit" - desc = "A portable heat sink and liquid cooled radiator that can be hooked up to a space suit's existing temperature controls to provide industrial levels of cooling." - w_class = SIZE_LARGE - icon_state = "suitcooler0" - flags_equip_slot = SLOT_BACK //you can carry it on your back if you want, but it won't do anything unless attached to suit storage - - //copied from tank.dm - flags_atom = FPRINT|CONDUCT - force = 5 - throwforce = 10 - throw_speed = SPEED_FAST - throw_range = 4 - - - - var/on = 0 //is it turned on? - var/cover_open = 0 //is the cover open? - var/obj/item/cell/cell - var/max_cooling = 12 //in degrees per second - probably don't need to mess with heat capacity here - var/charge_consumption = 16.6 //charge per second at max_cooling - var/thermostat = T20C - - //TODO: make it heat up the surroundings when not in space - -/obj/item/device/suit_cooling_unit/Initialize(mapload, ...) - . = ..() - - START_PROCESSING(SSobj, src) - - cell = new/obj/item/cell(src) //comes with the crappy default power cell - high-capacity ones shouldn't be hard to find - -/obj/item/device/suit_cooling_unit/Destroy() - STOP_PROCESSING(SSobj, src) - return ..() - -/obj/item/device/suit_cooling_unit/process() - if (!on || !cell) - return - - if (!ismob(loc)) - return - - if (!attached_to_suit(loc)) //make sure they have a suit and we are attached to it - return - - var/mob/living/carbon/human/H = loc - - var/efficiency = 1 - H.get_pressure_weakness() //you need to have a good seal for effective cooling - var/env_temp = get_environment_temperature() //wont save you from a fire - var/temp_adj = min(H.bodytemperature - max(thermostat, env_temp), max_cooling) - - if (temp_adj < 0.5) //only cools, doesn't heat, also we don't need extreme precision - return - - var/charge_usage = (temp_adj/max_cooling)*charge_consumption - - H.bodytemperature -= temp_adj*efficiency - H.recalculate_move_delay = TRUE - - cell.use(charge_usage) - - if(cell.charge <= 0) - turn_off() - -/obj/item/device/suit_cooling_unit/proc/get_environment_temperature() - if (ishuman(loc)) - var/mob/living/carbon/human/H = loc - return H.return_temperature() - - var/turf/T = get_turf(src) - return T.return_temperature() - -/obj/item/device/suit_cooling_unit/proc/attached_to_suit(mob/M) - if (!ishuman(M)) - return 0 - - var/mob/living/carbon/human/H = M - - if (!H.wear_suit || H.s_store != src) - return 0 - - return 1 - -/obj/item/device/suit_cooling_unit/proc/turn_on() - if(!cell) - return - if(cell.charge <= 0) - return - - on = 1 - updateicon() - -/obj/item/device/suit_cooling_unit/proc/turn_off() - if (ismob(src.loc)) - var/mob/M = src.loc - M.show_message("\The [src] clicks and whines as it powers down.", SHOW_MESSAGE_AUDIBLE) //let them know in case it's run out of power. - on = 0 - updateicon() - -/obj/item/device/suit_cooling_unit/attack_self(mob/user) - ..() - - if(cover_open && cell) - if(ishuman(user)) - user.put_in_hands(cell) - else - cell.forceMove(get_turf(loc)) - - cell.add_fingerprint(user) - cell.update_icon() - - to_chat(user, "You remove [cell].") - src.cell = null - updateicon() - return - - //TODO use a UI like the air tanks - if(on) - turn_off() - else - turn_on() - if (on) - to_chat(user, "You switch on [src].") - -/obj/item/device/suit_cooling_unit/attackby(obj/item/W as obj, mob/user as mob) - if (HAS_TRAIT(W, TRAIT_TOOL_SCREWDRIVER)) - if(cover_open) - cover_open = 0 - to_chat(user, "You screw the panel into place.") - else - cover_open = 1 - to_chat(user, "You unscrew the panel.") - updateicon() - return - - if (istype(W, /obj/item/cell)) - if(cover_open) - if(cell) - to_chat(user, "There is \a [cell] already installed here.") - else - if(user.drop_held_item()) - W.forceMove(src) - cell = W - to_chat(user, "You insert [cell].") - updateicon() - return - - return ..() - -/obj/item/device/suit_cooling_unit/proc/updateicon() - if (cover_open) - if (cell) - icon_state = "suitcooler1" - else - icon_state = "suitcooler2" - else - icon_state = "suitcooler0" - -/obj/item/device/suit_cooling_unit/get_examine_text(mob/user) - . = ..() - if (on) - if (attached_to_suit(src.loc)) - . += "It's switched on and running." - else - . += "It's switched on, but not attached to anything." - else - . += "It is switched off." - - if (cover_open) - if(cell) - . += "The panel is open, exposing [cell]." - else - . += "The panel is open." - - if (cell) - . += "The charge meter reads [floor(cell.percent())]%." - else - . += "It doesn't have a power cell installed." diff --git a/code/game/objects/items/devices/whistle.dm b/code/game/objects/items/devices/whistle.dm index 331df3ffa006..07196a3e1bb9 100644 --- a/code/game/objects/items/devices/whistle.dm +++ b/code/game/objects/items/devices/whistle.dm @@ -5,7 +5,7 @@ w_class = SIZE_TINY flags_atom = FPRINT|CONDUCT flags_equip_slot = SLOT_FACE - actions_types = list(/datum/action/item_action) + actions_types = list(/datum/action/item_action/toggle/use) var/volume = 60 var/spam_cooldown_time = 10 SECONDS @@ -51,7 +51,6 @@ usr.put_in_l_hand(src) add_fingerprint(usr) - /obj/item/device/hailer name = "hailer" desc = "Used by obese officers to save their breath for running." diff --git a/code/game/objects/items/explosives/explosive.dm b/code/game/objects/items/explosives/explosive.dm index 1bd6985bc015..0be81ba8a0ed 100644 --- a/code/game/objects/items/explosives/explosive.dm +++ b/code/game/objects/items/explosives/explosive.dm @@ -259,7 +259,7 @@ to_chat(usr, SPAN_DANGER("This is beyond your understanding...")) return - if(!skillcheck(H, SKILL_ENGINEER, SKILL_ENGINEER_ENGI)) + if(!skillcheck(H, SKILL_ENGINEER, SKILL_ENGINEER_TRAINED)) to_chat(usr, SPAN_DANGER("You have no idea how to use this...")) return diff --git a/code/game/objects/items/explosives/grenades/marines.dm b/code/game/objects/items/explosives/grenades/marines.dm index 1cd3e1577c57..09c0197cda7f 100644 --- a/code/game/objects/items/explosives/grenades/marines.dm +++ b/code/game/objects/items/explosives/grenades/marines.dm @@ -465,6 +465,187 @@ icon_state = "grenade_phos_clf" item_state = "grenade_phos_clf" +/obj/item/explosive/grenade/sebb + name = "\improper G2 Electroshock grenade" + desc = "This is a G2 Electroshock Grenade. Produced by Armat Battlefield Systems, it's sometimes referred to as the Sonic Electric Ball Breaker, \ + after a rash of incidents where the intense 1.2 gV sonic payload caused... rupturing. \ + A bounding landmine mode is available for this weapon which activates a small drill to self-bury itself when planted. Simply plant it at your feet and walk away." + icon_state = "grenade_sebb" + item_state = "grenade_sebb" + det_time = 3 SECONDS + underslug_launchable = TRUE + /// Maximum range of effect + var/range = 5 + /// Maximum possible damage before falloff. + var/damage = 110 + /// Factor to mutiply the effect range has on damage. + var/falloff_dam_reduction_mult = 20 + /// Post falloff calc damage is divided by this to get xeno slowdown + var/xeno_slowdown_numerator = 12 + /// Post falloff calc damage is multipled by this to get human stamina damage + var/human_stam_dam_factor = 0.9 + +/obj/item/explosive/grenade/sebb/get_examine_text(mob/user) + . = ..() + . += SPAN_NOTICE("To put into mine mode, plant at feet.") + +/obj/item/explosive/grenade/sebb/afterattack(atom/target, mob/user, proximity) + var/turf/user_turf = get_turf(user) + if(active) + return + + if(!isturf(target)) + return + + if(user.action_busy) + return + + if(target != get_turf(user)) + return + + if(locate(/obj/item/explosive/mine) in get_turf(src)) + to_chat(user, SPAN_WARNING("There already is a mine at this position!")) + return + + if(antigrief_protection && user.faction == FACTION_MARINE && explosive_antigrief_check(src, user)) + to_chat(user, SPAN_WARNING("\The [name]'s safe-area accident inhibitor prevents you from planting!")) + msg_admin_niche("[key_name(user)] attempted to plant \a [name] in [get_area(src)] [ADMIN_JMP(src.loc)]") + return + + if(ishuman(user)) + var/mob/living/carbon/human/human = user + if(!human.allow_gun_usage) + to_chat(user, SPAN_WARNING("Your programming prevents you from using this!")) + return + + if(user_turf && (user_turf.density || locate(/obj/structure/fence) in user_turf)) + to_chat(user, SPAN_WARNING("You can't plant a mine here.")) + return + + if(Adjacent(/obj/item/explosive/mine)) // bit more strict on this than normal mines + to_chat(user, SPAN_WARNING("Too close to another mine! Plant it somewhere less obvious.")) + return + + user.visible_message(SPAN_NOTICE("[user] starts deploying [src]."), + SPAN_NOTICE("You switch [src] into landmine mode and start placing it...")) + playsound(user.loc, 'sound/effects/thud.ogg', 40) + if(!do_after(user, 5 SECONDS * user.get_skill_duration_multiplier(SKILL_CONSTRUCTION), INTERRUPT_ALL|BEHAVIOR_IMMOBILE, BUSY_ICON_BUILD)) + to_chat(user, SPAN_NOTICE("You stop planting.")) + return + + user.visible_message(SPAN_NOTICE("[user] finishes deploying [src]."), + SPAN_NOTICE("You finish deploying [src].")) + var/obj/item/explosive/mine/sebb/planted = new /obj/item/explosive/mine/sebb(get_turf(user)) + planted.activate_sensors() + planted.iff_signal = user.faction // assuring IFF is set + planted.pixel_x += rand(-5, 5) + planted.pixel_y += rand(-5, 5) + qdel(src) + +/obj/item/explosive/grenade/sebb/activate() + ..() + var/beeplen = 6 // Actual length of the sound rounded up to nearest decisecond + var/soundtime = det_time - beeplen + if(det_time < beeplen) // just play sound if detonation shorter than the sound + playsound(loc, 'sound/effects/sebb_explode.ogg', 90, 0, 10) + else + addtimer(CALLBACK(GLOBAL_PROC, GLOBAL_PROC_REF(playsound), loc, 'sound/effects/sebb_beep.ogg', 60, 0, 10), soundtime) + + + +/obj/item/explosive/grenade/sebb/prime() + var/datum/effect_system/spark_spread/sparka = new + var/turf/sebb_turf = get_turf(src) + var/list/full_range = oview(range, src) // Fill a list of stuff in the range so we won't have to spam oview + new /obj/effect/overlay/temp/sebb(sebb_turf) + + playsound(src.loc, 'sound/effects/sebb_explode.ogg', 90, 0, 10) + + for(var/obj/structure/machinery/defenses/sentry/sentry_stun in full_range) + sentry_stun.sentry_range = 0 // Temporarily "disable" the sentry by killing its range then setting it back. + new /obj/effect/overlay/temp/elec_arc(get_turf(sentry_stun)) // sprites are meh but we need visual indication that the sentry was messed up + addtimer(VARSET_CALLBACK(sentry_stun, sentry_range, initial(sentry_stun.sentry_range)), 5 SECONDS) // assure to set it back + sentry_stun.visible_message(SPAN_DANGER("[src]'s screen flickes violently as it's shocked!")) + sentry_stun.visible_message(SPAN_DANGER("[src] says \"ERROR: Fire control system resetting due to critical voltage flucuation!\"")) + sparka.set_up(1, 1, sentry_stun) + sparka.start() + + for(var/turf/turf in full_range) + if(prob(8)) + var/datum/effect_system/spark_spread/sparkTurf = new //using a different spike system because the spark system doesn't like when you reuse it for differant things + sparkTurf.set_up(1, 1, turf) + sparkTurf.start() + if(prob(10)) + new /obj/effect/overlay/temp/emp_sparks(turf) + + for(var/mob/living/carbon/mob in full_range) // no legacy mob support + + var/mob_dist = get_dist(src, mob) // Distance from mob + + /** + * Damage equation: damage - (mob distance * falloff_dam_reduction_mult) + * Example: A marine is 3 tiles out, the distance (3) is multiplied by falloff_dam_reduction_mult to get falloff. + * The raw damage is minused by falloff to get actual damage + */ + + var/falloff = mob_dist * falloff_dam_reduction_mult + var/damage_applied = damage - falloff // Final damage applied after falloff calc + sparka.set_up(1, 1, mob) + sparka.start() + shake_camera(mob, 1, 1) + if(ishuman(mob)) + var/mob/living/carbon/human/shocked_human = mob + if(isspeciessynth(shocked_human)) // Massive overvoltage to ungrounded robots is pretty bad + shocked_human.Stun(1 + (damage_applied/40)) + damage_applied *= 1.5 + new /obj/effect/overlay/temp/elec_arc(get_turf(shocked_human)) + to_chat(mob, SPAN_HIGHDANGER("All of your systems jam up as your main bus is overvolted by [damage_applied*2] volts.")) + mob.visible_message(SPAN_WARNING("[mob] seizes up from the elctric shock")) + shocked_human.take_overall_armored_damage(damage_applied, ARMOR_ENERGY, BURN, 90) // 90% chance to be on additional limbs + shocked_human.make_dizzy(damage_applied) + mob.apply_stamina_damage(damage_applied*human_stam_dam_factor) // Stamina damage + shocked_human.emote("pain") + else //nonhuman damage + slow + mob.apply_damage(damage_applied, BURN) + if((mob_dist < (range-3))) // 2 tiles around small superslow + mob.Superslow(2) + mob.Slow(damage_applied/11) + + if(mob_dist < 1) // Range based stuff, standing ontop of the equivalent of a canned lighting bolt should mess you up. + mob.Superslow(3) // Note that humans will likely be in stamcrit so it's always worse for them when ontop of it and we can just balancing it on xenos. + mob.eye_blurry = damage_applied/4 + mob.Daze(1) + else if((mob_dist < (range-1)) && (mob.mob_size < MOB_SIZE_XENO_VERY_SMALL)) // Flicker stun humans that are closer to the grenade and larvas too. + mob.apply_effect(1 + (damage_applied/100),WEAKEN) // 1 + damage/40 + mob.eye_blurry = damage_applied/8 + + else + to_chat(mob, SPAN_HIGHDANGER("Your entire body seizes up as a powerful shock courses through it!")) + + + new /obj/effect/overlay/temp/emp_sparks(mob) + mob.make_jittery(damage_applied*2) + empulse(src, 1, 2) // mini EMP + qdel(src) + + +/obj/item/explosive/grenade/sebb/primed + desc = "A G2 Electroshock Grenade, looks like it's quite angry! Oh shit!" + det_time = 7 // 0.7 seconds to blow up. We want them to get caught if they go through. + +/obj/item/explosive/grenade/sebb/primed/Initialize() + . = ..() + src.visible_message(SPAN_HIGHDANGER("[src] pops out of the ground!")) + activate() + +/obj/effect/overlay/temp/sebb + icon = 'icons/effects/sebb.dmi' + icon_state = "sebb_explode" + layer = ABOVE_LIGHTING_PLANE + pixel_x = -175 // We need these offsets to force center the sprite because BYOND is dumb + pixel_y = -175 + appearance_flags = RESET_COLOR + /* //================================================ Nerve Gas Grenades diff --git a/code/game/objects/items/explosives/mine.dm b/code/game/objects/items/explosives/mine.dm index 45065a2de1de..6e7aa2bdccc3 100644 --- a/code/game/objects/items/explosives/mine.dm +++ b/code/game/objects/items/explosives/mine.dm @@ -14,6 +14,7 @@ throw_speed = SPEED_VERY_FAST unacidable = TRUE flags_atom = FPRINT|CONDUCT + antigrief_protection = TRUE allowed_sensors = list(/obj/item/device/assembly/prox_sensor) max_container_volume = 120 reaction_limits = list( "max_ex_power" = 105, "base_ex_falloff" = 60, "max_ex_shards" = 32, @@ -71,7 +72,12 @@ if(active || user.action_busy) return - user.visible_message(SPAN_NOTICE("[user] starts deploying [src]."), \ + if(antigrief_protection && user.faction == FACTION_MARINE && explosive_antigrief_check(src, user)) + to_chat(user, SPAN_WARNING("\The [name]'s safe-area accident inhibitor prevents you from planting!")) + msg_admin_niche("[key_name(user)] attempted to plant \a [name] in [get_area(src)] [ADMIN_JMP(src.loc)]") + return + + user.visible_message(SPAN_NOTICE("[user] starts deploying [src]."), SPAN_NOTICE("You start deploying [src].")) if(!do_after(user, 40, INTERRUPT_NO_NEEDHAND, BUSY_ICON_HOSTILE)) user.visible_message(SPAN_NOTICE("[user] stops deploying [src]."), \ @@ -317,3 +323,19 @@ customizable = TRUE matter = list("metal" = 3750) has_blast_wave_dampener = TRUE + +/obj/item/explosive/mine/sebb + name = "\improper G2 Electroshock grenade" + icon_state = "grenade_sebb_planted" + desc = "A G2 electroshock grenade planted as a landmine." + pixel_y = -5 + anchored = TRUE // this is supposed to be planeted already when spawned + +/obj/item/explosive/mine/sebb/disarm() + . = ..() + new /obj/item/explosive/grenade/sebb(get_turf(src)) + qdel(src) + +/obj/item/explosive/mine/sebb/prime() + new /obj/item/explosive/grenade/sebb/primed(get_turf(src)) + qdel(src) diff --git a/code/game/objects/items/explosives/plastic.dm b/code/game/objects/items/explosives/plastic.dm index 58cbca9a5ab3..c6a3dfaed5f9 100644 --- a/code/game/objects/items/explosives/plastic.dm +++ b/code/game/objects/items/explosives/plastic.dm @@ -25,7 +25,7 @@ antigrief_protection = TRUE //Should it be checked by antigrief? var/req_skill = SKILL_ENGINEER - var/req_skill_level = SKILL_ENGINEER_TRAINED + var/req_skill_level = SKILL_ENGINEER_NOVICE /obj/item/explosive/plastic/Destroy() disarm() @@ -46,7 +46,7 @@ . = ..() /obj/item/explosive/plastic/attack_self(mob/user) - if(!skillcheck(user, SKILL_ENGINEER, SKILL_ENGINEER_TRAINED)) + if(!skillcheck(user, SKILL_ENGINEER, SKILL_ENGINEER_NOVICE)) to_chat(user, SPAN_WARNING("You don't seem to know how to use [src]...")) return diff --git a/code/game/objects/items/frames/table_rack.dm b/code/game/objects/items/frames/table_rack.dm index eda9b9c5749b..95ab43869774 100644 --- a/code/game/objects/items/frames/table_rack.dm +++ b/code/game/objects/items/frames/table_rack.dm @@ -59,7 +59,10 @@ if(istype(get_area(loc), /area/shuttle)) //HANGAR/SHUTTLE BUILDING to_chat(user, SPAN_WARNING("No. This area is needed for the dropship.")) return - + for(var/obj/object in OT) + if(object.density) + to_chat(user, SPAN_WARNING("[object] is blocking you from constructing [src]!")) + return if(!do_after(user, 3 SECONDS, INTERRUPT_ALL, BUSY_ICON_BUILD)) to_chat(user, SPAN_WARNING("Hold still while you're constructing a table!")) return diff --git a/code/game/objects/items/props/helmetgarb.dm b/code/game/objects/items/props/helmetgarb.dm index 5b9b81804311..9da509d16c5a 100644 --- a/code/game/objects/items/props/helmetgarb.dm +++ b/code/game/objects/items/props/helmetgarb.dm @@ -176,12 +176,12 @@ if(src != user.get_inactive_hand()) to_chat(user, SPAN_WARNING("You need to hold \the [src] in hand in order to repair them.")) return - if(!skillcheck(user, SKILL_ENGINEER, SKILL_ENGINEER_TRAINED)) // level 2 is enough to repair damaged NVG + if(!skillcheck(user, SKILL_ENGINEER, SKILL_ENGINEER_NOVICE)) // level 2 is enough to repair damaged NVG to_chat(user, SPAN_WARNING("You are not trained to repair electronics...")) return if(shape == NVG_SHAPE_BROKEN) - if(!skillcheck(user, SKILL_ENGINEER, SKILL_ENGINEER_ENGI)) // level 3 is needed to repair broken NVG + if(!skillcheck(user, SKILL_ENGINEER, SKILL_ENGINEER_TRAINED)) // level 3 is needed to repair broken NVG to_chat(user, SPAN_WARNING("Repair of this complexity is too difficult for you, find someone more trained.")) return diff --git a/code/game/objects/items/stacks/flags.dm b/code/game/objects/items/stacks/flags.dm index e032e2c80157..14833812b06c 100644 --- a/code/game/objects/items/stacks/flags.dm +++ b/code/game/objects/items/stacks/flags.dm @@ -106,7 +106,7 @@ user.visible_message(SPAN_NOTICE("[user] starts taking [src] down..."), SPAN_NOTICE("You start taking [src] down...")) playsound(loc, 'sound/effects/flag_raising.ogg', 30) - if(!do_after(user, 6 SECONDS, INTERRUPT_ALL, BUSY_ICON_GENERIC)) + if(!do_after(user, 6 SECONDS, INTERRUPT_ALL, BUSY_ICON_GENERIC) || QDELETED(src)) return playsound(loc, 'sound/effects/flag_raised.ogg', 30) @@ -170,7 +170,11 @@ icon = 'icons/obj/structures/plantable_flag.dmi' inhand_x_dimension = 64 inhand_y_dimension = 64 + force = 15 + throwforce = 5 + hitsound = "swing_hit" unacidable = TRUE + indestructible = TRUE item_icons = list( WEAR_L_HAND = 'icons/mob/humans/onmob/items_lefthand_64.dmi', WEAR_R_HAND = 'icons/mob/humans/onmob/items_righthand_64.dmi' @@ -233,12 +237,10 @@ if(play_warcry && user.faction == faction && user.a_intent == INTENT_HARM) var/allies_nearby = 0 if(COOLDOWN_FINISHED(src, warcry_cooldown_item)) - for (var/mob/living/carbon/human in orange(planted_flag, 7)) - if (human.is_dead() || human.faction != faction) + for(var/mob/living/carbon/human in orange(planted_flag, 7)) + if(human.is_dead() || human.faction != faction) continue allies_nearby++ - if (prob(40) && human != user) - human.emote("warcry") user.show_speech_bubble("warcry") if(allies_nearby >= allies_required) diff --git a/code/game/objects/items/stacks/stack.dm b/code/game/objects/items/stacks/stack.dm index 5f72e4a75567..3856aebd7971 100644 --- a/code/game/objects/items/stacks/stack.dm +++ b/code/game/objects/items/stacks/stack.dm @@ -197,6 +197,12 @@ Also change the icon to reflect the amount of sheets, if possible.*/ to_chat(usr, SPAN_WARNING("The [R.title] cannot be constructed on a tunnel!")) return + if(R.one_per_turf != ONE_TYPE_PER_BORDER) //all barricade-esque structures utilize this define and have their own check for object density. checking twice is unneeded. + for(var/obj/object in usr.loc) + if(object.density || istype(object, /obj/structure/machinery/door)) + to_chat(usr, SPAN_WARNING("[object] is blocking you from constructing \the [R.title]!")) + return + if((R.flags & RESULT_REQUIRES_SNOW) && !(istype(usr.loc, /turf/open/snow) || istype(usr.loc, /turf/open/auto_turf/snow))) to_chat(usr, SPAN_WARNING("The [R.title] must be built on snow!")) return diff --git a/code/game/objects/items/storage/backpack.dm b/code/game/objects/items/storage/backpack.dm index 06636d2c3f76..9ed53236789d 100644 --- a/code/game/objects/items/storage/backpack.dm +++ b/code/game/objects/items/storage/backpack.dm @@ -15,7 +15,7 @@ cant_hold = list(/obj/item/storage/firstaid, /obj/item/storage/toolkit) can_hold_skill = list( /obj/item/storage/firstaid = list(SKILL_MEDICAL, SKILL_MEDICAL_MEDIC), - /obj/item/storage/toolkit = list(SKILL_ENGINEER, SKILL_ENGINEER_ENGI), + /obj/item/storage/toolkit = list(SKILL_ENGINEER, SKILL_ENGINEER_TRAINED), ) drop_sound = "armorequip" var/worn_accessible = FALSE //whether you can access its content while worn on the back diff --git a/code/game/objects/items/storage/belt.dm b/code/game/objects/items/storage/belt.dm index d16602e04aaa..14961c69eaf5 100644 --- a/code/game/objects/items/storage/belt.dm +++ b/code/game/objects/items/storage/belt.dm @@ -117,7 +117,6 @@ ) storage_slots = 10 - /obj/item/storage/belt/utility/full/fill_preset_inventory() new /obj/item/tool/screwdriver(src) new /obj/item/tool/wrench(src) @@ -136,6 +135,50 @@ new /obj/item/tool/wirecutters(src) new /obj/item/device/t_scanner(src) +/obj/item/storage/belt/utility/construction + name = "\improper M277 pattern construction rig" + desc = "The M277 is a common rig used by Combat Technicians to carry around materials and other supplies. It consists of a modular belt with various clips. This version sarafices storage space for specialized material loading clips." + storage_slots = 6 + can_hold = list( + /obj/item/tool/crowbar, + /obj/item/tool/screwdriver, + /obj/item/tool/weldingtool, + /obj/item/tool/wirecutters, + /obj/item/tool/wrench, + /obj/item/tool/extinguisher/mini, + /obj/item/tool/shovel/etool, + /obj/item/stack/cable_coil, + /obj/item/weapon/gun/smg/nailgun/compact, + /obj/item/cell, + /obj/item/circuitboard, + /obj/item/stock_parts, + /obj/item/device/demo_scanner, + /obj/item/device/reagent_scanner, + /obj/item/device/assembly, + /obj/item/device/multitool, + /obj/item/device/flashlight, + /obj/item/device/t_scanner, + /obj/item/device/analyzer, + /obj/item/explosive/plastic, + /obj/item/device/lightreplacer, + /obj/item/stack/sheet, + /obj/item/stack/sandbags_empty, + /obj/item/stack/sandbags, + /obj/item/stack/barbed_wire, + /obj/item/defenses/handheld/sentry, + /obj/item/stack/rods, + /obj/item/stack/tile, + ) + + bypass_w_limit = list( + /obj/item/tool/shovel/etool, + /obj/item/device/lightreplacer, + /obj/item/stack/sheet, + /obj/item/stack/sandbags_empty, + /obj/item/stack/sandbags, + /obj/item/defenses/handheld/sentry, + ) + /obj/item/storage/belt/utility/full/pred name = "\improper Yautja toolbelt" desc = "A modular belt with various clips. This version lacks any hunting functionality, and is commonly used by engineers to transport important tools." @@ -1296,12 +1339,12 @@ #undef MAXIMUM_MAGAZINE_COUNT /obj/item/storage/belt/gun/m44 - name = "\improper M276 pattern M44 holster rig" - desc = "The M276 is the standard load-bearing equipment of the USCM. It consists of a modular belt with various clips. This version is for the M44 magnum revolver, along with six small pouches for speedloaders. It smells faintly of hay." + name = "\improper M276 pattern general revoler holster rig" + desc = "The M276 is the standard load-bearing equipment of the USCM. It consists of a modular belt with various clips. This version is universal and adjustable for different revolvers, along with six small pouches for speedloaders. It smells faintly of hay." icon_state = "m44r_holster" storage_slots = 7 can_hold = list( - /obj/item/weapon/gun/revolver/m44, + /obj/item/weapon/gun/revolver, /obj/item/ammo_magazine/revolver, ) has_gamemode_skin = TRUE @@ -1413,7 +1456,7 @@ desc = "The M276 is the standard load-bearing equipment of the USCM. It consists of a modular belt with various clips. This version is for the powerful Mateba magnum revolver, along with five small pouches for speedloaders. This one is aging poorly, and seems to be surplus equipment. It's stamped '3rd 'Dust Raiders' Battalion'." icon_state = "s_cmateba_holster" item_state = "s_marinebelt" - storage_slots = 6 + storage_slots = 7 max_w_class = SIZE_MEDIUM can_hold = list( /obj/item/weapon/gun/revolver/mateba, @@ -1697,7 +1740,7 @@ /obj/item/device/flashlight/flare, /obj/item/weapon/gun/flare, /obj/item/weapon/gun/pistol, - /obj/item/weapon/gun/revolver/m44, + /obj/item/weapon/gun/revolver, /obj/item/ammo_magazine/revolver, /obj/item/ammo_magazine/pistol, /obj/item/ammo_magazine/smartgun, @@ -1717,8 +1760,7 @@ /obj/item/device/flashlight/flare, /obj/item/weapon/gun/flare, /obj/item/weapon/gun/pistol, - /obj/item/weapon/gun/revolver/m44, - /obj/item/weapon/gun/revolver/mateba, + /obj/item/weapon/gun/revolver, /obj/item/ammo_magazine/revolver, /obj/item/ammo_magazine/revolver/mateba, /obj/item/ammo_magazine/pistol, @@ -1740,8 +1782,7 @@ /obj/item/device/flashlight/flare, /obj/item/weapon/gun/flare, /obj/item/weapon/gun/pistol, - /obj/item/weapon/gun/revolver/m44, - /obj/item/weapon/gun/revolver/mateba, + /obj/item/weapon/gun/revolver, /obj/item/ammo_magazine/revolver, /obj/item/ammo_magazine/revolver/mateba, /obj/item/ammo_magazine/pistol, @@ -1763,8 +1804,7 @@ /obj/item/device/flashlight/flare, /obj/item/weapon/gun/flare, /obj/item/weapon/gun/pistol, - /obj/item/weapon/gun/revolver/m44, - /obj/item/weapon/gun/revolver/mateba, + /obj/item/weapon/gun/revolver, /obj/item/ammo_magazine/revolver, /obj/item/ammo_magazine/revolver/mateba, /obj/item/ammo_magazine/pistol, diff --git a/code/game/objects/items/storage/boxes.dm b/code/game/objects/items/storage/boxes.dm index ab221b89bfe2..e385d4b5c17d 100644 --- a/code/game/objects/items/storage/boxes.dm +++ b/code/game/objects/items/storage/boxes.dm @@ -470,6 +470,7 @@ item_state = "zippo" w_class = SIZE_TINY flags_equip_slot = SLOT_WAIST + flags_obj = parent_type::flags_obj|OBJ_IS_HELMET_GARB can_hold = list(/obj/item/tool/match) /obj/item/storage/box/matches/fill_preset_inventory() diff --git a/code/game/objects/items/storage/fancy.dm b/code/game/objects/items/storage/fancy.dm index 5d7aecbc03db..79d38603dc7e 100644 --- a/code/game/objects/items/storage/fancy.dm +++ b/code/game/objects/items/storage/fancy.dm @@ -126,6 +126,7 @@ w_class = SIZE_TINY throwforce = 2 flags_equip_slot = SLOT_WAIST + flags_obj = parent_type::flags_obj|OBJ_IS_HELMET_GARB max_w_class = SIZE_TINY storage_slots = 20 can_hold = list( diff --git a/code/game/objects/items/storage/pouch.dm b/code/game/objects/items/storage/pouch.dm index 63516ac20aa0..9c8c7080bdc3 100644 --- a/code/game/objects/items/storage/pouch.dm +++ b/code/game/objects/items/storage/pouch.dm @@ -802,6 +802,28 @@ for(var/i = 1 to storage_slots) new /obj/item/reagent_container/syringe(src) +/obj/item/storage/pouch/engikit + name = "engineer kit pouch" + storage_flags = STORAGE_FLAGS_POUCH + icon_state = "construction" + desc = "It's specifically made to hold engineering items. Requires engineering skills to use effectively." + storage_slots = 6 + can_hold_skill = list( + /obj/item/circuitboard = list(SKILL_ENGINEER, SKILL_ENGINEER_TRAINED), + /obj/item/device/flashlight = list(SKILL_ENGINEER, SKILL_ENGINEER_TRAINED), + /obj/item/clothing/glasses/welding = list(SKILL_ENGINEER, SKILL_ENGINEER_TRAINED), + /obj/item/device/analyzer = list(SKILL_ENGINEER, SKILL_ENGINEER_TRAINED), + /obj/item/device/demo_scanner = list(SKILL_ENGINEER, SKILL_ENGINEER_TRAINED), + /obj/item/device/reagent_scanner = list(SKILL_ENGINEER, SKILL_ENGINEER_TRAINED), + /obj/item/device/t_scanner = list(SKILL_ENGINEER, SKILL_ENGINEER_TRAINED), + /obj/item/stack/cable_coil = list(SKILL_ENGINEER, SKILL_ENGINEER_TRAINED), + /obj/item/cell = list(SKILL_ENGINEER, SKILL_ENGINEER_TRAINED), + /obj/item/device/assembly = list(SKILL_ENGINEER, SKILL_ENGINEER_TRAINED), + /obj/item/stock_parts = list(SKILL_ENGINEER, SKILL_ENGINEER_TRAINED), + /obj/item/explosive/plastic = list(SKILL_ENGINEER, SKILL_ENGINEER_TRAINED), + ) + can_hold_skill_only = TRUE + /obj/item/storage/pouch/medkit name = "medical kit pouch" storage_flags = STORAGE_FLAGS_POUCH diff --git a/code/game/objects/items/storage/toolkit.dm b/code/game/objects/items/storage/toolkit.dm index e3171eca40f6..cccca19c241c 100644 --- a/code/game/objects/items/storage/toolkit.dm +++ b/code/game/objects/items/storage/toolkit.dm @@ -23,7 +23,7 @@ ) storage_flags = STORAGE_FLAGS_BOX required_skill_for_nest_opening = SKILL_ENGINEER - required_skill_level_for_nest_opening = SKILL_ENGINEER_ENGI + required_skill_level_for_nest_opening = SKILL_ENGINEER_TRAINED ///icon state to use when kit is full var/icon_full diff --git a/code/game/objects/items/tanks/jetpack.dm b/code/game/objects/items/tanks/jetpack.dm deleted file mode 100644 index 3a5afef6cf1e..000000000000 --- a/code/game/objects/items/tanks/jetpack.dm +++ /dev/null @@ -1,85 +0,0 @@ -//This file was auto-corrected by findeclaration.exe on 25.5.2012 20:42:32 - -/obj/item/tank/jetpack - name = "Jetpack (Empty)" - desc = "A tank of compressed gas for use as propulsion in zero-gravity areas. Use with caution." - icon_state = "jetpack" - w_class = SIZE_LARGE - item_state = "jetpack" - distribute_pressure = ONE_ATMOSPHERE*O2STANDARD - var/datum/effect_system/ion_trail_follow/ion_trail - var/on = 0 - var/stabilization_on = 0 - var/volume_rate = 500 //Needed for borg jetpack transfer - actions_types = list(/datum/action/item_action) - -/obj/item/tank/jetpack/Initialize() - . = ..() - src.ion_trail = new /datum/effect_system/ion_trail_follow() - src.ion_trail.set_up(src) - -/obj/item/tank/jetpack/Destroy() - QDEL_NULL(ion_trail) - return ..() - - -/obj/item/tank/jetpack/verb/toggle_rockets() - set name = "Toggle Jetpack Stabilization" - set category = "Object" - set src in usr - src.stabilization_on = !( src.stabilization_on ) - to_chat(usr, "You toggle the stabilization [stabilization_on? "on":"off"].") - -/obj/item/tank/jetpack/verb/toggle() - set name = "Toggle Jetpack" - set category = "Object" - set src in usr - on = !on - if(on) - icon_state = "[icon_state]-on" - ion_trail.start() - else - icon_state = initial(icon_state) - ion_trail.stop() - - if (ismob(usr)) - var/mob/M = usr - M.update_inv_back() - - for(var/X in actions) - var/datum/action/A = X - A.update_button_icon() - -/obj/item/tank/jetpack/proc/allow_thrust(num, mob/living/user) - if(!(src.on)) - return 0 - - if(pressure > 5) - return 1 - else - ion_trail.stop() - return 0 - - -/obj/item/tank/jetpack/ui_action_click() - toggle() - - -/obj/item/tank/jetpack/void - name = "Void Jetpack (Oxygen)" - desc = "It works well in a void." - icon_state = "jetpack-void" - item_state = "jetpack-void" - -/obj/item/tank/jetpack/oxygen - name = "Jetpack (Oxygen)" - desc = "A tank of compressed oxygen for use as propulsion in zero-gravity areas. Use with caution." - icon_state = "jetpack" - item_state = "jetpack" - -/obj/item/tank/jetpack/carbondioxide - name = "Jetpack (Carbon Dioxide)" - desc = "A tank of compressed carbon dioxide for use as propulsion in zero-gravity areas. Painted black to indicate that it should not be used as a source for internals." - distribute_pressure = 0 - icon_state = "jetpack-black" - item_state = "jetpack-black" diff --git a/code/game/objects/items/tools/cleaning_tools.dm b/code/game/objects/items/tools/cleaning_tools.dm index f392f096bcf6..9fab254a7153 100644 --- a/code/game/objects/items/tools/cleaning_tools.dm +++ b/code/game/objects/items/tools/cleaning_tools.dm @@ -99,13 +99,15 @@ desc = "This cone is trying to warn you of something!" icon_state = "cone" icon = 'icons/obj/janitor.dmi' + item_icons = 'icons/mob/humans/onmob/head_0.dmi' force = 1 throwforce = 3 throw_speed = SPEED_FAST throw_range = 5 w_class = SIZE_SMALL attack_verb = list("warned", "cautioned", "smashed") - + flags_equip_slot = SLOT_HEAD + flags_inv_hide = HIDEEARS|HIDETOPHAIR @@ -150,7 +152,7 @@ return ..() -/obj/item/tool/soap/nanotrasen +/obj/item/tool/soap/weyland_yutani desc = "A Weyland-Yutani brand bar of soap. Smells of phoron." icon_state = "soapnt" diff --git a/code/game/objects/items/tools/flame_tools.dm b/code/game/objects/items/tools/flame_tools.dm index d5cd708f29b3..8af7d15e0ff3 100644 --- a/code/game/objects/items/tools/flame_tools.dm +++ b/code/game/objects/items/tools/flame_tools.dm @@ -177,6 +177,7 @@ CIGARETTE PACKETS ARE IN FANCY.DM w_class = SIZE_TINY flags_armor_protection = 0 flags_equip_slot = SLOT_EAR | SLOT_FACE + flags_obj = parent_type::flags_obj|OBJ_IS_HELMET_GARB flags_atom = CAN_BE_SYRINGED attack_verb = list("burnt", "singed") blood_overlay_type = "" @@ -693,6 +694,7 @@ CIGARETTE PACKETS ARE IN FANCY.DM throwforce = 4 flags_atom = FPRINT|CONDUCT flags_equip_slot = SLOT_WAIST + flags_obj = parent_type::flags_obj|OBJ_IS_HELMET_GARB attack_verb = list("burnt", "singed") /obj/item/tool/lighter/zippo diff --git a/code/game/objects/items/tools/kitchen_tools.dm b/code/game/objects/items/tools/kitchen_tools.dm index d6473b156a67..a4c4925fba2c 100644 --- a/code/game/objects/items/tools/kitchen_tools.dm +++ b/code/game/objects/items/tools/kitchen_tools.dm @@ -48,7 +48,7 @@ var/fullness = M.nutrition + (M.reagents.get_reagent_amount("nutriment") * 25) if(fullness > NUTRITION_HIGH) to_chat(user, SPAN_WARNING("[user == M ? "You" : "They"] don't feel like eating more right now.")) - return ..() + return reagents.set_source_mob(user) reagents.trans_to_ingest(M, reagents.total_volume) if(M == user) diff --git a/code/game/objects/items/tools/maintenance_tools.dm b/code/game/objects/items/tools/maintenance_tools.dm index 8febff63ee5d..f45953040a07 100644 --- a/code/game/objects/items/tools/maintenance_tools.dm +++ b/code/game/objects/items/tools/maintenance_tools.dm @@ -29,6 +29,7 @@ matter = list("metal" = 150) attack_verb = list("bashed", "battered", "bludgeoned", "whacked") inherent_traits = list(TRAIT_TOOL_WRENCH) + preferred_storage = list(/obj/item/clothing/accessory/storage/tool_webbing = WEAR_ACCESSORY) /* @@ -52,7 +53,7 @@ attack_verb = list("stabbed") flags_item = CAN_DIG_SHRAPNEL inherent_traits = list(TRAIT_TOOL_SCREWDRIVER) - + preferred_storage = list(/obj/item/clothing/accessory/storage/tool_webbing = WEAR_ACCESSORY) /obj/item/tool/screwdriver/Initialize() @@ -135,6 +136,7 @@ sharp = IS_SHARP_ITEM_SIMPLE edge = 1 inherent_traits = list(TRAIT_TOOL_WIRECUTTERS) + preferred_storage = list(/obj/item/clothing/accessory/storage/tool_webbing = WEAR_ACCESSORY) /obj/item/tool/wirecutters/tactical name = "tactical wirecutters" @@ -189,6 +191,7 @@ /// Used to slowly deplete the fuel when the tool is left on. var/weld_tick = 0 var/has_welding_screen = FALSE + preferred_storage = list(/obj/item/clothing/accessory/storage/tool_webbing = WEAR_ACCESSORY) /obj/item/tool/weldingtool/Initialize() . = ..() @@ -472,6 +475,7 @@ attack_verb = list("attacked", "bashed", "battered", "bludgeoned", "whacked") inherent_traits = list(TRAIT_TOOL_CROWBAR) pry_capable = IS_PRY_CAPABLE_CROWBAR + preferred_storage = list(/obj/item/clothing/accessory/storage/tool_webbing = WEAR_ACCESSORY) /obj/item/tool/crowbar/red icon = 'icons/obj/items/items.dmi' diff --git a/code/game/objects/objs.dm b/code/game/objects/objs.dm index 2dc064aa86d4..9a0f21e9655a 100644 --- a/code/game/objects/objs.dm +++ b/code/game/objects/objs.dm @@ -23,6 +23,8 @@ /// an object's "projectile_coverage" var indicates the maximum probability of blocking a projectile, assuming density and throwpass. Used by barricades, tables and window frames var/projectile_coverage = 0 + /// How many tiles away from this object that a shooter needs to be to maximize this barricade's projectile coverage + var/projectile_coverage_distance_limit = 6 /// set to true if the item is garbage and should be deleted after awhile var/garbage = FALSE @@ -277,7 +279,11 @@ //trying to buckle a mob /obj/proc/buckle_mob(mob/M, mob/user) - if (!ismob(M) || (get_dist(src, user) > 1) || user.is_mob_restrained() || user.stat || buckled_mob || M.buckled || !isturf(user.loc)) + if (!ismob(M) || (get_dist(src, user) > 1) || user.stat || buckled_mob || M.buckled || !isturf(user.loc)) + return + + if (user.is_mob_incapacitated() || HAS_TRAIT(user, TRAIT_IMMOBILIZED) || HAS_TRAIT(user, TRAIT_FLOORED)) + to_chat(user, SPAN_WARNING("You can't do this right now.")) return if (isxeno(user) && !HAS_TRAIT(user, TRAIT_OPPOSABLE_THUMBS)) @@ -286,11 +292,6 @@ if (iszombie(user)) return - // mobs that become immobilized should not be able to buckle themselves. - if(M == user && HAS_TRAIT(user, TRAIT_IMMOBILIZED)) - to_chat(user, SPAN_WARNING("You are unable to do this in your current state.")) - return - if(density) density = FALSE if(!step(M, get_dir(M, src)) && loc != M.loc) diff --git a/code/game/objects/prop.dm b/code/game/objects/prop.dm index cc941b19ed97..9e256236e7d6 100644 --- a/code/game/objects/prop.dm +++ b/code/game/objects/prop.dm @@ -169,6 +169,18 @@ icon_state = "game_kit" icon = 'icons/obj/items/items.dmi' +/obj/item/prop/gripper + name = "magnetic gripper" + desc = "A simple grasping tool for synthetic assets." + icon_state = "gripper" + icon = 'icons/obj/items/devices.dmi' + +/obj/item/prop/matter_decompiler + name = "matter decompiler" + desc = "Eating trash, bits of glass, or other debris will replenish your stores." + icon_state = "decompiler" + icon = 'icons/obj/items/devices.dmi' + /// Xeno-specific props /obj/item/prop/alien/hugger diff --git a/code/game/objects/structures/airlock_assembly.dm b/code/game/objects/structures/airlock_assembly.dm index d9e55e868016..01fca4a68783 100644 --- a/code/game/objects/structures/airlock_assembly.dm +++ b/code/game/objects/structures/airlock_assembly.dm @@ -111,6 +111,11 @@ qdel(src) return + for(var/obj/object in loc) + if(object.density && object != src) + to_chat(user, SPAN_WARNING("[object] is blocking you from interacting with [src]!")) + return + switch(state) if(STATE_STANDARD) if(HAS_TRAIT(attacking_item, TRAIT_TOOL_WRENCH)) diff --git a/code/game/objects/structures/barricade/barricade.dm b/code/game/objects/structures/barricade/barricade.dm index 28036f92d018..a7d3d4d16cd4 100644 --- a/code/game/objects/structures/barricade/barricade.dm +++ b/code/game/objects/structures/barricade/barricade.dm @@ -34,6 +34,7 @@ var/is_wired = FALSE flags_barrier = HANDLE_BARRIER_CHANCE projectile_coverage = PROJECTILE_COVERAGE_HIGH + projectile_coverage_distance_limit = 2 var/upgraded var/brute_multiplier = 1 var/burn_multiplier = 1 @@ -453,6 +454,10 @@ to_chat(user, SPAN_WARNING("You'll need some adequate repair material in your other hand to patch up [src]!")) return FALSE + if(material.amount < nailgun.material_per_repair) + to_chat(user, SPAN_WARNING("You'll need more adequate repair material in your other hand to patch up [src]!")) + return FALSE + var/repair_value = 0 for(var/validSheetType in repair_materials) if(validSheetType == material.sheettype) @@ -469,7 +474,7 @@ return FALSE if(!material || (material != user.l_hand && material != user.r_hand) || material.amount <= 0) - to_chat(user, SPAN_WARNING("You seems to have misplaced the repair material!")) + to_chat(user, SPAN_WARNING("You seem to have misplaced the repair material!")) return FALSE if(!nailgun.in_chamber || !nailgun.current_mag || nailgun.current_mag.current_rounds < 3) @@ -479,7 +484,7 @@ update_health(-repair_value*maxhealth) to_chat(user, SPAN_WARNING("You nail [material] to [src], restoring some of its integrity!")) update_damage_state() - material.use(1) + material.use(nailgun.material_per_repair) nailgun.current_mag.current_rounds -= 3 nailgun.in_chamber = null nailgun.load_into_chamber() diff --git a/code/game/objects/structures/barricade/deployable.dm b/code/game/objects/structures/barricade/deployable.dm index e53c917dc2bb..ad559f2e13bd 100644 --- a/code/game/objects/structures/barricade/deployable.dm +++ b/code/game/objects/structures/barricade/deployable.dm @@ -31,7 +31,7 @@ if(HAS_TRAIT(item, TRAIT_TOOL_CROWBAR)) if(user.action_busy) return - if(!skillcheck(user, SKILL_ENGINEER, SKILL_ENGINEER_TRAINED)) + if(!skillcheck(user, SKILL_ENGINEER, SKILL_ENGINEER_NOVICE)) to_chat(user, SPAN_WARNING("You do not know how to collapse [src] using a crowbar...")) return user.visible_message(SPAN_NOTICE("[user] starts collapsing [src]."), \ @@ -95,6 +95,7 @@ w_class = SIZE_LARGE flags_equip_slot = SLOT_BACK|SLOT_SUIT_STORE + flags_item = SMARTGUNNER_BACKPACK_OVERRIDE icon_state = "folding-1" item_state = "folding" item_state_slots = list( diff --git a/code/game/objects/structures/barricade/metal.dm b/code/game/objects/structures/barricade/metal.dm index 3e79af2e21e1..f16e6851341b 100644 --- a/code/game/objects/structures/barricade/metal.dm +++ b/code/game/objects/structures/barricade/metal.dm @@ -48,7 +48,7 @@ if(!..()) return FALSE - if(!skillcheck(user, SKILL_ENGINEER, SKILL_ENGINEER_TRAINED)) + if(!skillcheck(user, SKILL_ENGINEER, SKILL_ENGINEER_NOVICE)) if(!silent) to_chat(user, SPAN_WARNING("You're not trained to repair [src]...")) return FALSE diff --git a/code/game/objects/structures/barricade/plasteel.dm b/code/game/objects/structures/barricade/plasteel.dm index 1acedae9997d..fb5a08954a5d 100644 --- a/code/game/objects/structures/barricade/plasteel.dm +++ b/code/game/objects/structures/barricade/plasteel.dm @@ -69,7 +69,7 @@ if(!..()) return FALSE - if(!skillcheck(user, SKILL_ENGINEER, SKILL_ENGINEER_TRAINED)) + if(!skillcheck(user, SKILL_ENGINEER, SKILL_ENGINEER_NOVICE)) if(!silent) to_chat(user, SPAN_WARNING("You're not trained to repair [src]...")) return FALSE @@ -95,7 +95,7 @@ if(busy || tool_cooldown > world.time) return tool_cooldown = world.time + 10 - if(!skillcheck(user, SKILL_ENGINEER, SKILL_ENGINEER_ENGI)) + if(!skillcheck(user, SKILL_ENGINEER, SKILL_ENGINEER_TRAINED)) to_chat(user, SPAN_WARNING("You are not trained to assemble [src]...")) return @@ -112,7 +112,7 @@ return if(HAS_TRAIT(item, TRAIT_TOOL_CROWBAR)) - if(!skillcheck(user, SKILL_ENGINEER, SKILL_ENGINEER_ENGI)) + if(!skillcheck(user, SKILL_ENGINEER, SKILL_ENGINEER_TRAINED)) to_chat(user, SPAN_WARNING("You are not trained to modify [src]...")) return playsound(src.loc, 'sound/items/Crowbar.ogg', 25, 1) @@ -136,7 +136,7 @@ if(busy || tool_cooldown > world.time) return tool_cooldown = world.time + 10 - if(!skillcheck(user, SKILL_ENGINEER, SKILL_ENGINEER_ENGI)) + if(!skillcheck(user, SKILL_ENGINEER, SKILL_ENGINEER_TRAINED)) to_chat(user, SPAN_WARNING("You are not trained to assemble [src]...")) return if(!do_after(user, 10, INTERRUPT_ALL|BEHAVIOR_IMMOBILE, BUSY_ICON_BUILD, src)) @@ -151,7 +151,7 @@ if(busy || tool_cooldown > world.time) return tool_cooldown = world.time + 10 - if(!skillcheck(user, SKILL_ENGINEER, SKILL_ENGINEER_ENGI)) + if(!skillcheck(user, SKILL_ENGINEER, SKILL_ENGINEER_TRAINED)) to_chat(user, SPAN_WARNING("You are not trained to assemble [src]...")) return if(!do_after(user, 10, INTERRUPT_ALL|BEHAVIOR_IMMOBILE, BUSY_ICON_BUILD, src)) @@ -169,7 +169,7 @@ if(busy || tool_cooldown > world.time) return tool_cooldown = world.time + 10 - if(!skillcheck(user, SKILL_ENGINEER, SKILL_ENGINEER_ENGI)) + if(!skillcheck(user, SKILL_ENGINEER, SKILL_ENGINEER_TRAINED)) to_chat(user, SPAN_WARNING("You are not trained to assemble [src]...")) return var/turf/open/T = loc @@ -190,7 +190,7 @@ if(busy || tool_cooldown > world.time) return tool_cooldown = world.time + 10 - if(!skillcheck(user, SKILL_ENGINEER, SKILL_ENGINEER_ENGI)) + if(!skillcheck(user, SKILL_ENGINEER, SKILL_ENGINEER_TRAINED)) to_chat(user, SPAN_WARNING("You are not trained to assemble [src]...")) return user.visible_message(SPAN_NOTICE("[user] starts unseating [src]'s panels."), diff --git a/code/game/objects/structures/crates_lockers/closets/malfunction.dm b/code/game/objects/structures/crates_lockers/closets/malfunction.dm deleted file mode 100644 index 704e2c79157a..000000000000 --- a/code/game/objects/structures/crates_lockers/closets/malfunction.dm +++ /dev/null @@ -1,16 +0,0 @@ - -/obj/structure/closet/malf/suits - desc = "It's a storage unit for operational gear." - icon_state = "syndicate" - icon_closed = "syndicate" - icon_opened = "syndicate_open" - -/obj/structure/closet/malf/suits/Initialize() - . = ..() - new /obj/item/tank/jetpack/void(src) - new /obj/item/clothing/mask/breath(src) - new /obj/item/clothing/head/helmet/space/uscm(src) - new /obj/item/clothing/suit/space/uscm(src) - new /obj/item/tool/crowbar(src) - new /obj/item/cell(src) - new /obj/item/device/multitool(src) diff --git a/code/game/objects/structures/crates_lockers/closets/utility_closets.dm b/code/game/objects/structures/crates_lockers/closets/utility_closets.dm index b000fd5733a2..0bf39322d107 100644 --- a/code/game/objects/structures/crates_lockers/closets/utility_closets.dm +++ b/code/game/objects/structures/crates_lockers/closets/utility_closets.dm @@ -23,7 +23,7 @@ . = ..() #ifndef UNIT_TESTS - switch (pickweight(list("small" = 55, "aid" = 25, "tank" = 10, "both" = 10, "nothing" = 0, "delete" = 0))) + switch (pick_weight(list("small" = 55, "aid" = 25, "tank" = 10, "both" = 10, "nothing" = 1, "delete" = 1))) #else var/test = "both" switch (test) // We don't want randomness in tests diff --git a/code/game/objects/structures/crates_lockers/crates.dm b/code/game/objects/structures/crates_lockers/crates.dm index d891119a8404..8a10cd4d93ea 100644 --- a/code/game/objects/structures/crates_lockers/crates.dm +++ b/code/game/objects/structures/crates_lockers/crates.dm @@ -277,13 +277,6 @@ name = "RCD crate" desc = "A crate for the storage of the RCD." -/obj/structure/closet/crate/rcd/Initialize() - . = ..() - new /obj/item/ammo_rcd(src) - new /obj/item/ammo_rcd(src) - new /obj/item/ammo_rcd(src) - new /obj/item/device/rcd(src) - /obj/structure/closet/crate/freezer/rations //Fpr use in the escape shuttle desc = "A crate of emergency rations." name = "Emergency Rations" diff --git a/code/game/objects/structures/electricchair.dm b/code/game/objects/structures/electricchair.dm deleted file mode 100644 index 239df3c05973..000000000000 --- a/code/game/objects/structures/electricchair.dm +++ /dev/null @@ -1,47 +0,0 @@ -/obj/structure/bed/chair/e_chair - name = "electric chair" - desc = "Looks absolutely SHOCKING!" - icon_state = "echair1" - var/last_time = 1 - -/obj/structure/bed/chair/e_chair/New() - ..() - overlays += image('icons/obj/objects.dmi', src, "echair_over", MOB_LAYER + 1, dir) - - -/obj/structure/bed/chair/e_chair/rotate() - ..() - overlays.Cut() - overlays += image('icons/obj/objects.dmi', src, "echair_over", MOB_LAYER + 1, dir) //there's probably a better way of handling this, but eh. -Pete - return - -/obj/structure/bed/chair/e_chair/proc/shock() - if(last_time + 50 > world.time) - return - last_time = world.time - - // special power handling - var/area/A = get_area(src) - if(!isarea(A)) - return - if(!A.powered(POWER_CHANNEL_EQUIP)) - return - A.use_power(5000) - var/light = A.power_light - A.updateicon() - - flick("echair1", src) - var/datum/effect_system/spark_spread/s = new /datum/effect_system/spark_spread - s.set_up(12, 1, src) - s.start() - if(buckled_mob) - buckled_mob.burn_skin(85) - to_chat(buckled_mob, SPAN_DANGER("You feel a deep shock course through your body!")) - sleep(1) - buckled_mob.burn_skin(85) - buckled_mob.apply_effect(600, STUN) - visible_message(SPAN_DANGER("The electric chair went off!"), SPAN_DANGER("You hear a deep sharp shock!")) - - A.power_light = light - A.updateicon() - return diff --git a/code/game/objects/structures/girders.dm b/code/game/objects/structures/girders.dm index 01e0e1b717cc..325af12c814b 100644 --- a/code/game/objects/structures/girders.dm +++ b/code/game/objects/structures/girders.dm @@ -110,6 +110,10 @@ if(!HAS_TRAIT(W, TRAIT_TOOL_BLOWTORCH)) to_chat(user, SPAN_WARNING("You need a stronger blowtorch!")) return + for(var/obj/object in loc) + if(object.density) + to_chat(user, SPAN_WARNING("[object] is blocking you from welding [src] together!")) + return if(do_after(user,30, INTERRUPT_ALL|BEHAVIOR_IMMOBILE, BUSY_ICON_BUILD)) if(QDELETED(src)) return @@ -334,7 +338,6 @@ else dmg = floor(P.damage * 0.5) if(dmg) - health -= dmg take_damage(dmg) bullet_ping(P) if(health <= 0) @@ -342,7 +345,9 @@ return TRUE /obj/structure/girder/proc/take_damage(damage) - health = max(health - damage, 0) + health -= damage + if(health <= -100) + qdel(src) if(health <= 0) update_state() @@ -356,10 +361,11 @@ update_state() /obj/structure/girder/proc/update_state() - if (health <= 0) + if(health <= 0 && density) icon_state = "[icon_state]_damaged" density = FALSE - else + + else if(health > 0 && !density) var/underscore_position = findtext(icon_state,"_") var/new_state = copytext(icon_state, 1, underscore_position) icon_state = new_state diff --git a/code/game/objects/structures/stool_bed_chair_nest/wheelchair.dm b/code/game/objects/structures/stool_bed_chair_nest/wheelchair.dm index 986ae99739aa..f71882374518 100644 --- a/code/game/objects/structures/stool_bed_chair_nest/wheelchair.dm +++ b/code/game/objects/structures/stool_bed_chair_nest/wheelchair.dm @@ -36,12 +36,12 @@ move_delay += 4 //harder to move a wheelchair with a single hand working_hands-- else if((left_hand.status & LIMB_BROKEN) && !(left_hand.status & LIMB_SPLINTED)) - move_delay++ + move_delay ++ if(!right_hand || (right_hand.status & LIMB_DESTROYED)) move_delay += 4 working_hands-- else if((right_hand.status & LIMB_BROKEN) && !(right_hand.status & LIMB_SPLINTED)) - move_delay += 2 + move_delay++ if(!working_hands) return // No hands to drive your chair? Tough luck! if(driver.pulling && driver.pulling.drag_delay && driver.get_pull_miltiplier()) //Dragging stuff can slow you down a bit. diff --git a/code/game/objects/structures/tables_racks.dm b/code/game/objects/structures/tables_racks.dm index a1542f7baf75..7d4c3021fd0a 100644 --- a/code/game/objects/structures/tables_racks.dm +++ b/code/game/objects/structures/tables_racks.dm @@ -30,6 +30,7 @@ var/flip_cooldown = 0 //If flip cooldown exists, don't allow flipping or putting back. This carries a WORLD.TIME value health = 100 projectile_coverage = 20 //maximum chance of blocking a projectile + var/flipped_projectile_coverage_distance_limit = 2 var/flipped_projectile_coverage = PROJECTILE_COVERAGE_HIGH var/upright_projectile_coverage = PROJECTILE_COVERAGE_LOW surgery_duration_multiplier = SURGERY_SURFACE_MULT_UNSUITED @@ -42,6 +43,7 @@ qdel(T) if(flipped) projectile_coverage = flipped_projectile_coverage + projectile_coverage_distance_limit = flipped_projectile_coverage_distance_limit else projectile_coverage = upright_projectile_coverage @@ -446,6 +448,7 @@ INVOKE_ASYNC(movable_on_table, TYPE_PROC_REF(/atom/movable, throw_atom), pick(targets), 1, SPEED_FAST) projectile_coverage = flipped_projectile_coverage + projectile_coverage_distance_limit = flipped_projectile_coverage_distance_limit setDir(direction) if(dir != NORTH) @@ -473,6 +476,7 @@ verbs += /obj/structure/surface/table/verb/do_flip projectile_coverage = upright_projectile_coverage + projectile_coverage_distance_limit = src::projectile_coverage_distance_limit layer = initial(layer) flipped = FALSE diff --git a/code/game/sound.dm b/code/game/sound.dm index 1ab8fc42f41a..e95279a37731 100644 --- a/code/game/sound.dm +++ b/code/game/sound.dm @@ -204,6 +204,8 @@ S = pick('sound/items/cane_step_1.ogg', 'sound/items/cane_step_2.ogg', 'sound/items/cane_step_3.ogg', 'sound/items/cane_step_4.ogg', 'sound/items/cane_step_5.ogg', ) if("match") S = pick('sound/effects/match.ogg') + if("throwing") + S = pick('sound/effects/throwing/swoosh1.ogg', 'sound/effects/throwing/swoosh2.ogg', 'sound/effects/throwing/swoosh3.ogg', 'sound/effects/throwing/swoosh4.ogg') if("punch") S = pick('sound/weapons/punch1.ogg','sound/weapons/punch2.ogg','sound/weapons/punch3.ogg','sound/weapons/punch4.ogg') if("swing_hit") @@ -365,6 +367,8 @@ S = pick('sound/voice/upp_warcry/warcry_female_1.ogg', 'sound/voice/upp_warcry/warcry_female_2.ogg') if("rtb_handset") S = pick('sound/machines/telephone/rtb_handset_1.ogg', 'sound/machines/telephone/rtb_handset_2.ogg', 'sound/machines/telephone/rtb_handset_3.ogg', 'sound/machines/telephone/rtb_handset_4.ogg', 'sound/machines/telephone/rtb_handset_5.ogg') + if("talk_phone") + S = pick('sound/machines/telephone/talk_phone1.ogg', 'sound/machines/telephone/talk_phone2.ogg', 'sound/machines/telephone/talk_phone3.ogg', 'sound/machines/telephone/talk_phone4.ogg', 'sound/machines/telephone/talk_phone5.ogg', 'sound/machines/telephone/talk_phone6.ogg', 'sound/machines/telephone/talk_phone7.ogg') if("bone_break") S = pick('sound/effects/bone_break1.ogg','sound/effects/bone_break2.ogg','sound/effects/bone_break3.ogg','sound/effects/bone_break4.ogg','sound/effects/bone_break5.ogg','sound/effects/bone_break6.ogg','sound/effects/bone_break7.ogg') if("plush") diff --git a/code/game/supplyshuttle.dm b/code/game/supplyshuttle.dm index 53b64cbedfad..8974eb36187f 100644 --- a/code/game/supplyshuttle.dm +++ b/code/game/supplyshuttle.dm @@ -532,7 +532,7 @@ GLOBAL_DATUM_INIT(supply_controller, /datum/controller/supply, new()) for(var/datum/supply_packs_asrs/crate in cratelist) var/weight = (floor(10000/crate.cost)) weighted_crate_list[crate] = weight - return pickweight(weighted_crate_list) + return pick_weight(weighted_crate_list) //To stop things being sent to centcomm which should not be sent to centcomm. Recursively checks for these types. /datum/controller/supply/proc/forbidden_atoms_check(atom/A) diff --git a/code/game/turfs/walls/wall_types.dm b/code/game/turfs/walls/wall_types.dm index 21839d35af03..6db61002c2fe 100644 --- a/code/game/turfs/walls/wall_types.dm +++ b/code/game/turfs/walls/wall_types.dm @@ -297,11 +297,10 @@ INITIALIZE_IMMEDIATE(/turf/closed/wall/indestructible/splashscreen) /turf/closed/wall/indestructible/splashscreen name = "Lobby Art" desc = "Assorted artworks." - icon = 'icons/lobby/title.dmi' - icon_state = "" -// icon_state = "title_holiday" + icon = 'icons/lobby/title_loading.dmi' + icon_state = "title" layer = FLY_LAYER - special_icon = 1 + special_icon = TRUE /turf/closed/wall/indestructible/splashscreen/Initialize() . = ..() @@ -309,16 +308,19 @@ INITIALIZE_IMMEDIATE(/turf/closed/wall/indestructible/splashscreen) /proc/force_lobby_art(art_id) GLOB.displayed_lobby_art = art_id - var/turf/closed/wall/indestructible/splashscreen/SS = locate("LOBBYART") + var/turf/closed/wall/indestructible/splashscreen/lobby_art = locate("LOBBYART") var/list/lobby_arts = CONFIG_GET(str_list/lobby_art_images) var/list/lobby_authors = CONFIG_GET(str_list/lobby_art_authors) - SS.icon_state = lobby_arts[GLOB.displayed_lobby_art] - SS.desc = "Artwork by [lobby_authors[GLOB.displayed_lobby_art]]" - for(var/client/C in GLOB.clients) + lobby_art.icon = 'icons/lobby/title.dmi' + lobby_art.icon_state = lobby_arts[GLOB.displayed_lobby_art] + lobby_art.desc = "Artwork by [lobby_authors[GLOB.displayed_lobby_art]]" + lobby_art.pixel_x = -288 + lobby_art.pixel_y = -288 + for(var/client/player in GLOB.clients) if(GLOB.displayed_lobby_art != -1) var/author = lobby_authors[GLOB.displayed_lobby_art] if(author != "Unknown") - to_chat_forced(C, SPAN_ROUNDBODY("