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/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/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/lists.dm b/code/__HELPERS/lists.dm index 23129318075e..97935dbb0a6e 100644 --- a/code/__HELPERS/lists.dm +++ b/code/__HELPERS/lists.dm @@ -94,22 +94,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/_globalvars/bitfields.dm b/code/_globalvars/bitfields.dm index facc2b951ad3..d3fc9994414a 100644 --- a/code/_globalvars/bitfields.dm +++ b/code/_globalvars/bitfields.dm @@ -356,7 +356,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/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/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/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/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/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/machinery/bio-dome_floodlights.dm b/code/game/machinery/bio-dome_floodlights.dm deleted file mode 100644 index 1dbc1813bd13..000000000000 --- a/code/game/machinery/bio-dome_floodlights.dm +++ /dev/null @@ -1,104 +0,0 @@ -/obj/structure/machinery/colony_floodlight_switch/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." - machinery_type_whitelist = list(/obj/structure/machinery/hydro_floodlight) - -/obj/structure/machinery/colony_floodlight_switch/hydro_floodlight_switch/update_icon() - if(!ispowered) - icon_state = "panelnopower" - else if(is_on) - icon_state = "panelon" - else - icon_state = "paneloff" - -/obj/structure/machinery/hydro_floodlight // TODO: Repath under /obj/structure/machinery/colony_floodlight - name = "biodome floodlight" - icon = 'icons/obj/structures/machinery/big_floodlight.dmi' - icon_state = "flood_s_off" - density = TRUE - anchored = TRUE - layer = WINDOW_LAYER - unslashable = TRUE - unacidable = TRUE - use_power = USE_POWER_NONE //It's the switch that uses the actual power, not the lights - needs_power = FALSE - is_on = FALSE - active_power_usage = 800 //The power each floodlight takes up per process - ///Whether it has been smashed by xenos - var/damaged = FALSE - var/lum_value = 7 - -/obj/structure/machinery/hydro_floodlight/update_icon() - if(damaged) - icon_state = "flood_s_dmg" - else if(is_on) - icon_state = "flood_s_on" - else - icon_state = "flood_s_off" - -/obj/structure/machinery/hydro_floodlight/proc/set_damaged() - playsound(src, "glassbreak", 70, 1) - damaged = TRUE - if(is_on) - set_light(0) - update_icon() - -/obj/structure/machinery/hydro_floodlight/attackby(obj/item/W as obj, mob/user as mob) - var/obj/item/tool/weldingtool/welder = W - if(istype(welder)) - if(!damaged) - return - if(!HAS_TRAIT(welder, TRAIT_TOOL_BLOWTORCH)) - to_chat(user, SPAN_WARNING("You need a stronger blowtorch!")) - return - if(welder.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 || !welder.isOn()) return - damaged = FALSE - user.visible_message(SPAN_NOTICE("[user] finishes welding [src]'s damage."), \ - SPAN_NOTICE("You finish welding [src]'s damage.")) - if(is_on) - set_light(lum_value) - update_icon() - return TRUE - else - to_chat(user, SPAN_WARNING("You need more welding fuel to complete this task.")) - return FALSE - ..() - return FALSE - -/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 FALSE - else if(!is_on) - to_chat(user, SPAN_WARNING("Why bother? It's just some weird metal thing.")) - return FALSE - else - if(damaged) - to_chat(user, SPAN_WARNING("It's already damaged.")) - return FALSE - 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 FALSE - damaged = TRUE - 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 FALSE - ..() diff --git a/code/game/machinery/camera/presets.dm b/code/game/machinery/camera/presets.dm index 1377cf8d7275..e31b96626b29 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/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/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/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/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..b938db1d3db6 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), @@ -451,7 +451,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 +462,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_armory.dm b/code/game/machinery/vending/vendor_types/crew/staff_officer_armory.dm index 1e21f2f7256d..46de6ed028d0 100644 --- a/code/game/machinery/vending/vendor_types/crew/staff_officer_armory.dm +++ b/code/game/machinery/vending/vendor_types/crew/staff_officer_armory.dm @@ -18,7 +18,7 @@ GLOBAL_LIST_INIT(cm_vending_clothing_staff_officer_armory, list( 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("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_RECOMMENDED), 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/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..fee0cde601aa 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), @@ -154,6 +155,7 @@ 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), 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..29299654899e 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,7 +132,7 @@ 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), 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..a799ff25d051 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), 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/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/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/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/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/storage/belt.dm b/code/game/objects/items/storage/belt.dm index d16602e04aaa..97d76729be72 100644 --- a/code/game/objects/items/storage/belt.dm +++ b/code/game/objects/items/storage/belt.dm @@ -1296,12 +1296,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 +1413,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 +1697,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 +1717,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 +1739,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 +1761,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/tools/cleaning_tools.dm b/code/game/objects/items/tools/cleaning_tools.dm index f392f096bcf6..fba21de3328d 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 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/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/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/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("
This round's lobby art is brought to you by [author]
")) + to_chat_forced(player, SPAN_ROUNDBODY("
This round's lobby art is brought to you by [author]
")) /turf/closed/wall/indestructible/other icon_state = "r_wall" diff --git a/code/game/verbs/who.dm b/code/game/verbs/who.dm deleted file mode 100644 index 3a9274dbec62..000000000000 --- a/code/game/verbs/who.dm +++ /dev/null @@ -1,209 +0,0 @@ -/client/verb/who()//likely don't touch any... this is easy can die. (:troll_fale:) - set name = "Who" - set category = "OOC" - - var/list/counted_humanoids = list( - "Observers" = 0, - "Admin observers" = 0, - "Humans" = 0, - "Infected humans" = 0, - FACTION_MARINE = 0, - "USCM Marines" = 0, - "Lobby" = 0, - - FACTION_YAUTJA = 0, - "Infected preds" = 0, - - FACTION_PMC = 0, - FACTION_CLF = 0, - FACTION_UPP = 0, - FACTION_TWE = 0, - FACTION_FREELANCER = 0, - FACTION_SURVIVOR = 0, - FACTION_WY_DEATHSQUAD = 0, - FACTION_COLONIST = 0, - FACTION_MERCENARY = 0, - FACTION_DUTCH = 0, - FACTION_HEFA = 0, - FACTION_GLADIATOR = 0, - FACTION_PIRATE = 0, - FACTION_PIZZA = 0, - FACTION_SOUTO = 0, - - FACTION_NEUTRAL = 0, - - FACTION_ZOMBIE = 0 - ) - - var/list/counted_xenos = list() - - var/players = length(GLOB.clients) - - var/dat = "Current Players:
" - var/list/Lines = list() - if(admin_holder && ((R_ADMIN & admin_holder.rights) || (R_MOD & admin_holder.rights))) - for(var/client/C in GLOB.clients) - if(!CLIENT_HAS_RIGHTS(src, R_STEALTH) && (CLIENT_IS_STEALTHED(C))) - continue - var/entry = "[C.key]" - if(C.mob) //Juuuust in case - if(istype(C.mob, /mob/new_player)) - entry += " - In Lobby" - counted_humanoids["Lobby"]++ - else - entry += " - Playing as [C.mob.real_name]" - - if(isobserver(C.mob)) - counted_humanoids["Observers"]++ - if(C.admin_holder?.rights & R_MOD) - counted_humanoids["Admin observers"]++ - counted_humanoids["Observers"]-- - var/mob/dead/observer/O = C.mob - if(O.started_as_observer) - entry += " - Observing" - else - entry += " - DEAD" - else - switch(C.mob.stat) - if(UNCONSCIOUS) - entry += " - Unconscious" - if(DEAD) - entry += " - DEAD" - - if(C.mob && C.mob.stat != DEAD) - if(ishuman(C.mob)) - if(C.mob.faction == FACTION_ZOMBIE) - counted_humanoids[FACTION_ZOMBIE]++ - entry += " - Zombie" - else if(C.mob.faction == FACTION_YAUTJA) - counted_humanoids[FACTION_YAUTJA]++ - entry += " - Predator" - if(C.mob.status_flags & XENO_HOST) - counted_humanoids["Infected preds"]++ - else - counted_humanoids["Humans"]++ - if(C.mob.status_flags & XENO_HOST) - counted_humanoids["Infected humans"]++ - if(C.mob.faction == FACTION_MARINE) - counted_humanoids[FACTION_MARINE]++ - if(C.mob.job in (GLOB.ROLES_MARINES)) - counted_humanoids["USCM Marines"]++ - else - counted_humanoids[C.mob.faction]++ - else if(isxeno(C.mob)) - var/mob/living/carbon/xenomorph/X = C.mob - counted_xenos[X.hivenumber]++ - if(X.faction == FACTION_PREDALIEN) - counted_xenos[FACTION_PREDALIEN]++ - entry += " - Xenomorph" - entry += " (?)" - Lines += entry - - for(var/line in sortList(Lines)) - dat += "[line]
" - dat += "Total Players: [players]" - dat += "
In Lobby: [counted_humanoids["Lobby"]]" - dat += "
Observers: [counted_humanoids["Observers"]] players and [counted_humanoids["Admin observers"]] staff members" - dat += "
Humans: [counted_humanoids["Humans"]] (Infected: [counted_humanoids["Infected humans"]])" - if(counted_humanoids[FACTION_MARINE]) - dat += "
USCM personnel: [counted_humanoids[FACTION_MARINE]] (Marines: [counted_humanoids["USCM Marines"]])" - if(counted_humanoids[FACTION_YAUTJA]) - dat += "
Predators: [counted_humanoids[FACTION_YAUTJA]] [counted_humanoids["Infected preds"] ? "(Infected: [counted_humanoids["Infected preds"]])" : ""]" - if(counted_humanoids[FACTION_ZOMBIE]) - dat += "
Zombies: [counted_humanoids[FACTION_ZOMBIE]]" - - var/show_fact = TRUE - for(var/i in 10 to LAZYLEN(counted_humanoids) - 2) - if(counted_humanoids[counted_humanoids[i]]) - if(show_fact) - dat += "

Other factions:" - show_fact = FALSE - dat += "
[counted_humanoids[i]]: [counted_humanoids[counted_humanoids[i]]]" - if(counted_humanoids[FACTION_NEUTRAL]) - dat += "
[FACTION_NEUTRAL] Humans: [counted_humanoids[FACTION_NEUTRAL]]" - - show_fact = TRUE - var/datum/hive_status/hive - for(var/hivenumber in counted_xenos) - // Print predalien counts last - if(hivenumber == FACTION_PREDALIEN) - continue - if(show_fact) - dat += "

Xenomorphs:" - show_fact = FALSE - hive = GLOB.hive_datum[hivenumber] - if(hive) - dat += "
[hive.name]: [counted_xenos[hivenumber]] (Queen: [hive.living_xeno_queen ? "Alive" : "Dead"])" - else - dat += "
Error: no hive datum detected for [hivenumber]." - hive = null - if(counted_xenos[FACTION_PREDALIEN]) - dat += "
Predaliens: [counted_xenos[FACTION_PREDALIEN]]" - - else - for(var/client/C in GLOB.clients) - if((C.admin_holder && C.admin_holder.fakekey) || (CLIENT_IS_STEALTHED(C))) - continue - - Lines += C.key - for(var/line in sortList(Lines)) - dat += "[line]
" - dat += "Total Players: [players]
" - - dat += "" - show_browser(usr, dat, "Who", "who", "size=600x800") - - -/client/verb/staffwho() - set name = "Staffwho" - set category = "Admin" - - var/dat = "" - 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, "Admins", R_ADMIN) - if(CONFIG_GET(flag/show_mods)) - LAZYSET(mappings, "Moderators", R_MOD) - if(CONFIG_GET(flag/show_mentors)) - LAZYSET(mappings, "Mentors", R_MENTOR) - - var/list/listings - for(var/category in mappings) - LAZYSET(listings, category, list()) - - for(var/client/C in GLOB.admins) - if(CLIENT_IS_STEALTHED(C) && !CLIENT_HAS_RIGHTS(src, R_STEALTH)) - continue - if(C.admin_holder?.fakekey && !CLIENT_IS_STAFF(src)) - continue - for(var/category in mappings) - if(CLIENT_HAS_RIGHTS(C, mappings[category])) - LAZYADD(listings[category], C) - break - - for(var/category in listings) - dat += "
Current [category] ([length(listings[category])]):
\n" - for(var/client/entry in listings[category]) - dat += "\t[entry.key] is \a [entry.admin_holder.rank]" - if(LAZYLEN(entry.admin_holder.extra_titles)) - for(var/srank in entry.admin_holder.extra_titles) - dat += " & [srank]" - if(CLIENT_IS_STAFF(src)) - if(CLIENT_IS_STEALTHED(entry)) - dat += " (STEALTHED)" - else if(entry.admin_holder?.fakekey) - dat += " (HIDDEN)" - if(istype(entry.mob, /mob/dead/observer)) - dat += " - Observing" - else if(istype(entry.mob, /mob/new_player)) - dat += " - Lobby" - else - dat += " - Playing" - if(entry.is_afk()) - dat += " (AFK)" - dat += "
" - dat += "" - show_browser(usr, dat, "Staffwho", "staffwho", "size=600x800") diff --git a/code/modules/clothing/gloves/boom_glove.dm b/code/modules/clothing/gloves/boom_glove.dm index 8cc3e8d910f6..ddddc5ecef5e 100644 --- a/code/modules/clothing/gloves/boom_glove.dm +++ b/code/modules/clothing/gloves/boom_glove.dm @@ -12,7 +12,7 @@ var/cooldown = 50 var/last_use = 0 - actions_types = list(/datum/action/item_action) + actions_types = list(/datum/action/item_action/toggle/use) /obj/item/clothing/gloves/marine/boom_glove/item_action_slot_check(mob/user, slot) if(!ishuman(user)) return FALSE diff --git a/code/modules/clothing/head/helmet.dm b/code/modules/clothing/head/helmet.dm index e52032d0cba6..463a4b16f7ec 100644 --- a/code/modules/clothing/head/helmet.dm +++ b/code/modules/clothing/head/helmet.dm @@ -354,7 +354,7 @@ GLOBAL_LIST_INIT(allowed_helmet_items, list( armor_melee = CLOTHING_ARMOR_MEDIUM armor_bullet = CLOTHING_ARMOR_MEDIUM armor_laser = CLOTHING_ARMOR_MEDIUMLOW - armor_energy = CLOTHING_ARMOR_NONE + armor_energy = CLOTHING_ARMOR_LOW armor_bomb = CLOTHING_ARMOR_LOW armor_bio = CLOTHING_ARMOR_MEDIUM armor_rad = CLOTHING_ARMOR_LOW diff --git a/code/modules/clothing/spacesuits/spacesuits.dm b/code/modules/clothing/spacesuits/spacesuits.dm index 9c28ca42bc41..a8b056d0bb9d 100644 --- a/code/modules/clothing/spacesuits/spacesuits.dm +++ b/code/modules/clothing/spacesuits/spacesuits.dm @@ -32,7 +32,7 @@ gas_transfer_coefficient = 0.01 permeability_coefficient = 0.02 flags_armor_protection = BODY_FLAG_CHEST|BODY_FLAG_GROIN|BODY_FLAG_LEGS|BODY_FLAG_FEET|BODY_FLAG_ARMS|BODY_FLAG_HANDS - allowed = list(/obj/item/device/flashlight,/obj/item/tank/emergency_oxygen,/obj/item/device/suit_cooling_unit) + allowed = list(/obj/item/device/flashlight,/obj/item/tank/emergency_oxygen) slowdown = 3 armor_melee = CLOTHING_ARMOR_NONE armor_bullet = CLOTHING_ARMOR_NONE diff --git a/code/modules/clothing/suits/marine_armor/_marine_armor.dm b/code/modules/clothing/suits/marine_armor/_marine_armor.dm index e6cf78611a7f..8a8d5934b506 100644 --- a/code/modules/clothing/suits/marine_armor/_marine_armor.dm +++ b/code/modules/clothing/suits/marine_armor/_marine_armor.dm @@ -50,7 +50,7 @@ armor_melee = CLOTHING_ARMOR_MEDIUM armor_bullet = CLOTHING_ARMOR_MEDIUM armor_laser = CLOTHING_ARMOR_MEDIUMLOW - armor_energy = CLOTHING_ARMOR_NONE + armor_energy = CLOTHING_ARMOR_LOW armor_bomb = CLOTHING_ARMOR_MEDIUMLOW armor_bio = CLOTHING_ARMOR_MEDIUM armor_rad = CLOTHING_ARMOR_MEDIUMLOW @@ -361,6 +361,7 @@ armor_bomb = CLOTHING_ARMOR_MEDIUM armor_bio = CLOTHING_ARMOR_MEDIUMHIGH armor_internaldamage = CLOTHING_ARMOR_MEDIUMHIGH + armor_energy = CLOTHING_ARMOR_MEDIUM specialty = "B12 pattern marine" light_range = 5 @@ -547,6 +548,7 @@ armor_bomb = CLOTHING_ARMOR_HIGHPLUS armor_bio = CLOTHING_ARMOR_MEDIUMHIGH armor_rad = CLOTHING_ARMOR_MEDIUM + armor_energy = CLOTHING_ARMOR_MEDIUMLOW armor_internaldamage = CLOTHING_ARMOR_MEDIUMHIGH storage_slots = 2 slowdown = SLOWDOWN_ARMOR_LOWHEAVY @@ -591,6 +593,7 @@ armor_bio = CLOTHING_ARMOR_MEDIUMLOW armor_rad = CLOTHING_ARMOR_MEDIUMHIGH armor_internaldamage = CLOTHING_ARMOR_MEDIUMHIGH + armor_energy = CLOTHING_ARMOR_MEDIUM storage_slots = 2 flags_inventory = BLOCKSHARPOBJ|BLOCK_KNOCKDOWN flags_armor_protection = BODY_FLAG_CHEST|BODY_FLAG_GROIN|BODY_FLAG_ARMS|BODY_FLAG_LEGS|BODY_FLAG_FEET @@ -632,6 +635,7 @@ armor_bullet = CLOTHING_ARMOR_MEDIUMHIGH armor_bomb = CLOTHING_ARMOR_VERYHIGH armor_bio = CLOTHING_ARMOR_MEDIUMLOW + armor_energy = CLOTHING_ARMOR_MEDIUM armor_internaldamage = CLOTHING_ARMOR_MEDIUMHIGH flags_inventory = BLOCKSHARPOBJ|BLOCK_KNOCKDOWN flags_item = MOB_LOCK_ON_EQUIP|NO_CRYO_STORE diff --git a/code/modules/cm_aliens/weeds.dm b/code/modules/cm_aliens/weeds.dm index 2206bc528e82..ed6d628b2263 100644 --- a/code/modules/cm_aliens/weeds.dm +++ b/code/modules/cm_aliens/weeds.dm @@ -624,7 +624,7 @@ return /obj/effect/alien/weeds/node/pylon/cluster - spread_on_semiweedable = FALSE + spread_on_semiweedable = TRUE /obj/effect/alien/weeds/node/pylon/cluster/set_parent_damaged() if(!resin_parent) diff --git a/code/modules/cm_marines/equipment/guncases.dm b/code/modules/cm_marines/equipment/guncases.dm index 22999e97fda2..cbbb791f8f0b 100644 --- a/code/modules/cm_marines/equipment/guncases.dm +++ b/code/modules/cm_marines/equipment/guncases.dm @@ -67,7 +67,6 @@ new /obj/item/ammo_magazine/rifle/lmg(src) new /obj/item/ammo_magazine/rifle/lmg/holo_target(src) new /obj/item/attachable/flashlight - new /obj/item/attachable/bipod //------------ /obj/item/storage/box/guncase/m41aMK1 diff --git a/code/modules/cm_marines/equipment/kit_boxes.dm b/code/modules/cm_marines/equipment/kit_boxes.dm index 951cd30f84ff..2a2c2d450523 100644 --- a/code/modules/cm_marines/equipment/kit_boxes.dm +++ b/code/modules/cm_marines/equipment/kit_boxes.dm @@ -423,7 +423,6 @@ new /obj/item/weapon/gun/rifle/lmg(src) new /obj/item/ammo_magazine/rifle/lmg(src) new /obj/item/ammo_magazine/rifle/lmg/holo_target(src) - new /obj/item/attachable/bipod(src) new /obj/item/stack/folding_barricade/three(src) new /obj/item/clothing/glasses/welding(src) new /obj/item/tool/weldingtool(src) diff --git a/code/modules/cm_preds/yaut_weapons.dm b/code/modules/cm_preds/yaut_weapons.dm index 2db3c2ca4b68..3bbbd11c0784 100644 --- a/code/modules/cm_preds/yaut_weapons.dm +++ b/code/modules/cm_preds/yaut_weapons.dm @@ -486,7 +486,7 @@ throw_range = 6 hitsound = 'sound/weapons/slash.ogg' attack_verb = list("slashed", "stabbed", "sliced", "torn", "ripped", "diced", "cut") - actions_types = list(/datum/action/item_action) + actions_types = list(/datum/action/item_action/toggle/use) unacidable = TRUE /obj/item/weapon/yautja/knife/attack(mob/living/target, mob/living/carbon/human/user) @@ -584,7 +584,6 @@ SPAN_DANGER("[victim] is missing \his head. Pelts like this just aren't the same... You peel the skin around the stump loose with your [tool.name].")) else victim.apply_damage(10, BRUTE, v_head, sharp = TRUE) - v_head.disfigured = TRUE create_leftovers(victim, has_meat = FALSE, skin_amount = 1) if(victim.h_style == "Bald") //you can't scalp someone with no hair. user.visible_message(SPAN_DANGER("[user] makes some rough cuts on [victim]'s head and face with \a [tool]."), diff --git a/code/modules/economy/TradeDestinations.dm b/code/modules/economy/TradeDestinations.dm deleted file mode 100644 index 94ead45bf13e..000000000000 --- a/code/modules/economy/TradeDestinations.dm +++ /dev/null @@ -1,110 +0,0 @@ - -GLOBAL_LIST_EMPTY(weighted_randomevent_locations) -GLOBAL_LIST_EMPTY(weighted_mundaneevent_locations) - -/datum/trade_destination - var/name = "" - var/description = "" - var/distance = 0 - var/list/willing_to_buy = list() - var/list/willing_to_sell = list() - var/can_shuttle_here = 0 //one day crew from the exodus will be able to travel to this destination - var/list/viable_random_events = list() - var/list/temp_price_change[BIOMEDICAL] - var/list/viable_mundane_events = list() - -/datum/trade_destination/proc/get_custom_eventstring(event_type) - return null - -//distance is measured in AU and co-relates to travel time -/datum/trade_destination/centcomm - name = "CentComm" - description = "Weyland-Yutani's administrative centre for Tau Ceti." - distance = 1.2 - willing_to_buy = list() - willing_to_sell = list() - viable_random_events = list(SECURITY_BREACH, CORPORATE_ATTACK, AI_LIBERATION) - viable_mundane_events = list(ELECTION, RESIGNATION, CELEBRITY_DEATH) - -/datum/trade_destination/anansi - name = "NSS Anansi" - description = "Medical station ran by Second Red Cross (but owned by WY) for handling emergency cases from nearby colonies." - distance = 1.7 - willing_to_buy = list() - willing_to_sell = list() - viable_random_events = list(SECURITY_BREACH, CULT_CELL_REVEALED, BIOHAZARD_OUTBREAK, PIRATES, ALIEN_RAIDERS) - viable_mundane_events = list(RESEARCH_BREAKTHROUGH, RESEARCH_BREAKTHROUGH, BARGAINS, GOSSIP) - -/datum/trade_destination/anansi/get_custom_eventstring(event_type) - if(event_type == RESEARCH_BREAKTHROUGH) - return "Thanks to research conducted on the NSS Anansi, Second Red Cross Society wishes to announce a major breakthough in the field of \ - [pick("mind-machine interfacing","neuroscience","nano-augmentation","genetics")]. Weyland-Yutani is expected to announce a co-exploitation deal within the fortnight." - return null - -/datum/trade_destination/icarus - name = "NMV Icarus" - description = "Corvette assigned to patrol NSS Exodus local space." - distance = 0.1 - willing_to_buy = list() - willing_to_sell = list() - viable_random_events = list(SECURITY_BREACH, AI_LIBERATION, PIRATES) - -/datum/trade_destination/redolant - name = "OAV Redolant" - description = "Osiris Atmospherics station in orbit around the only gas giant insystem. They retain tight control over shipping rights, and Osiris warships protecting their prize are not an uncommon sight in Tau Ceti." - distance = 0.6 - willing_to_buy = list() - willing_to_sell = list() - viable_random_events = list(INDUSTRIAL_ACCIDENT, PIRATES, CORPORATE_ATTACK) - viable_mundane_events = list(RESEARCH_BREAKTHROUGH, RESEARCH_BREAKTHROUGH) - -/datum/trade_destination/redolant/get_custom_eventstring(event_type) - if(event_type == RESEARCH_BREAKTHROUGH) - return "Thanks to research conducted on the OAV Redolant, Osiris Atmospherics wishes to announce a major breakthough in the field of \ - [pick("phoron research","high energy flux capacitance","super-compressed materials","theoretical particle physics")]. Weyland-Yutani is expected to announce a co-exploitation deal within the fortnight." - return null - -/datum/trade_destination/beltway - name = "Beltway mining chain" - description = "A co-operative effort between Beltway and Weyland-Yutani to exploit the rich outer asteroid belt of the Tau Ceti system." - distance = 7.5 - willing_to_buy = list() - willing_to_sell = list() - viable_random_events = list(PIRATES, INDUSTRIAL_ACCIDENT) - viable_mundane_events = list(TOURISM) - -/datum/trade_destination/biesel - name = "Biesel" - description = "Large ship yards, strong economy and a stable, well-educated populace, Biesel largely owes allegiance to Sol / Vessel Contracting and begrudgingly tolerates WY. Capital is Lowell City." - distance = 2.3 - willing_to_buy = list() - willing_to_sell = list() - viable_random_events = list(RIOTS, INDUSTRIAL_ACCIDENT, BIOHAZARD_OUTBREAK, CULT_CELL_REVEALED, FESTIVAL, MOURNING) - viable_mundane_events = list(BARGAINS, GOSSIP, SONG_DEBUT, MOVIE_RELEASE, ELECTION, TOURISM, RESIGNATION, CELEBRITY_DEATH) - -/datum/trade_destination/new_gibson - name = "New Gibson" - description = "Heavily industrialised rocky planet containing the majority of the planet-bound resources in the system, New Gibson is torn by unrest and has very little wealth to call it's own except in the hands of the corporations who jostle with WY for control." - distance = 6.6 - willing_to_buy = list() - willing_to_sell = list() - viable_random_events = list(RIOTS, INDUSTRIAL_ACCIDENT, BIOHAZARD_OUTBREAK, CULT_CELL_REVEALED, FESTIVAL, MOURNING) - viable_mundane_events = list(ELECTION, TOURISM, RESIGNATION) - -/datum/trade_destination/luthien - name = "Luthien" - description = "A small colony established on a feral, untamed world (largely jungle). Savages and wild beasts attack the outpost regularly, although WY maintains tight military control." - distance = 8.9 - willing_to_buy = list() - willing_to_sell = list() - viable_random_events = list(WILD_ANIMAL_ATTACK, CULT_CELL_REVEALED, FESTIVAL, MOURNING, ANIMAL_RIGHTS_RAID, ALIEN_RAIDERS) - viable_mundane_events = list(ELECTION, TOURISM, BIG_GAME_HUNTERS, RESIGNATION) - -/datum/trade_destination/reade - name = "Reade" - description = "A cold, metal-deficient world, WY maintains large pastures in whatever available space in an attempt to salvage something from this profitless colony." - distance = 7.5 - willing_to_buy = list() - willing_to_sell = list() - viable_random_events = list(WILD_ANIMAL_ATTACK, CULT_CELL_REVEALED, FESTIVAL, MOURNING, ANIMAL_RIGHTS_RAID, ALIEN_RAIDERS) - viable_mundane_events = list(ELECTION, TOURISM, BIG_GAME_HUNTERS, RESIGNATION) diff --git a/code/modules/economy/economy_misc.dm b/code/modules/economy/economy_misc.dm index d65799f8f96f..afd2b1b8ad36 100644 --- a/code/modules/economy/economy_misc.dm +++ b/code/modules/economy/economy_misc.dm @@ -75,11 +75,6 @@ GLOBAL_VAR_INIT(economy_init, FALSE) if(GLOB.economy_init) return 2 - for(var/loc_type in typesof(/datum/trade_destination) - /datum/trade_destination) - var/datum/trade_destination/D = new loc_type - GLOB.weighted_randomevent_locations[D] = length(D.viable_random_events) - GLOB.weighted_mundaneevent_locations[D] = length(D.viable_mundane_events) - create_station_account() create_department_account("Vendor") diff --git a/code/modules/gear_presets/pmc.dm b/code/modules/gear_presets/pmc.dm index 8dde038f3891..dcce31397ea9 100644 --- a/code/modules/gear_presets/pmc.dm +++ b/code/modules/gear_presets/pmc.dm @@ -132,7 +132,7 @@ 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/large_holster/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 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), @@ -261,7 +261,7 @@ list("POUCHES (CHOOSE 2)", 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 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/large_holster/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 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), @@ -395,7 +395,7 @@ list("POUCHES (CHOOSE 2)", 0, null, null, null), list("M276 Lifesaver Bag (Full)", 0, /obj/item/storage/belt/medical/lifesaver/full/dutch, 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/large_holster/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 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), @@ -573,7 +573,7 @@ list("POUCHES (CHOOSE 2)", 0, null, null, null), list("M276 Lifesaver Bag (Full)", 0, /obj/item/storage/belt/medical/lifesaver/full/dutch, 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/large_holster/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), @@ -756,7 +756,7 @@ list("POUCHES (CHOOSE 2)", 0, null, null, null), 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/large_holster/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 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), @@ -899,7 +899,7 @@ list("POUCHES (CHOOSE 2)", 0, null, null, null), 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/large_holster/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 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), @@ -1145,7 +1145,7 @@ list("POUCHES (CHOOSE 2)", 0, null, null, null), list("M276 Lifesaver Bag (Full)", 0, /obj/item/storage/belt/medical/lifesaver/full/dutch, 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/large_holster/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 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), @@ -1253,7 +1253,7 @@ list("POUCHES (CHOOSE 2)", 0, null, null, null), list("M276 Lifesaver Bag (Full)", 0, /obj/item/storage/belt/medical/lifesaver/full/dutch, 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/large_holster/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 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), @@ -1401,7 +1401,7 @@ list("POUCHES (CHOOSE 2)", 0, null, null, null), list("M276 Lifesaver Bag (Full)", 0, /obj/item/storage/belt/medical/lifesaver/full/dutch, 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/large_holster/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 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), @@ -1547,7 +1547,7 @@ list("POUCHES (CHOOSE 2)", 0, null, null, null), list("M276 Lifesaver Bag (Full)", 0, /obj/item/storage/belt/medical/lifesaver/full/dutch, 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/large_holster/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 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), @@ -1716,7 +1716,7 @@ list("POUCHES (CHOOSE 2)", 0, null, null, null), 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/large_holster/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 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), diff --git a/code/modules/mob/living/carbon/carbon.dm b/code/modules/mob/living/carbon/carbon.dm index 36d2518d7e75..53f222175908 100644 --- a/code/modules/mob/living/carbon/carbon.dm +++ b/code/modules/mob/living/carbon/carbon.dm @@ -388,9 +388,13 @@ if(!do_after(src, 1 SECONDS, INTERRUPT_ALL, BUSY_ICON_HOSTILE)) to_chat(src, SPAN_WARNING("You need to set up the high toss!")) return + animation_attack_on(target) + playsound(src, 'sound/weapons/punchmiss.ogg', 25, 1, 7) drop_inv_item_on_ground(I, TRUE) thrown_thing.throw_atom(target, thrown_thing.throw_range, SPEED_SLOW, src, spin_throw, HIGH_LAUNCH) else + animation_attack_on(target) + playsound(src, 'sound/weapons/punchmiss.ogg', 25, 1, 7) drop_inv_item_on_ground(I, TRUE) thrown_thing.throw_atom(target, thrown_thing.throw_range, thrown_thing.throw_speed, src, spin_throw) diff --git a/code/modules/mob/living/carbon/human/human.dm b/code/modules/mob/living/carbon/human/human.dm index 213d037afe6e..2c5ddf44b3ee 100644 --- a/code/modules/mob/living/carbon/human/human.dm +++ b/code/modules/mob/living/carbon/human/human.dm @@ -350,10 +350,10 @@ return "[face_name] (as [id_name])" return face_name -//Returns "Unknown" if facially disfigured and real_name if not. Useful for setting name when polyacided or when updating a human's name variable +//Returns "Unknown" if facially unidentifiable and real_name if not. Useful for setting name when headless or when updating a human's name variable /mob/living/carbon/human/proc/get_face_name() var/obj/limb/head/head = get_limb("head") - if(!head || head.disfigured || (head.status & LIMB_DESTROYED) || !real_name) //disfigured. use id-name if possible + if(!head || (head.status & LIMB_DESTROYED) || !real_name) //unidentifiable. use id-name if possible return "Unknown" return real_name @@ -907,9 +907,6 @@ var/obj/limb/head/h = get_limb("head") if(QDELETED(h)) h = get_limb("synthetic head") - else - h.disfigured = 0 - name = get_visible_name() if(species && !(species.flags & NO_BLOOD)) restore_blood() @@ -1712,15 +1709,15 @@ /mob/living/carbon/human/on_knockedout_trait_gain(datum/source) . = ..() - + update_execute_hud() - + return . /mob/living/carbon/human/on_knockedout_trait_loss(datum/source) . = ..() update_execute_hud() - + return . - + diff --git a/code/modules/mob/living/carbon/human/human_damage.dm b/code/modules/mob/living/carbon/human/human_damage.dm index 8a528df92de5..48dea97699ea 100644 --- a/code/modules/mob/living/carbon/human/human_damage.dm +++ b/code/modules/mob/living/carbon/human/human_damage.dm @@ -335,7 +335,11 @@ In most cases it makes more sense to use apply_damage() instead! And make sure t for(var/obj/limb/L as anything in parts) var/armor = getarmor(L, armour_type) var/modified_damage = armor_damage_reduction(armour_config, damage, armor, penetration, 0, 0) - L.take_damage(modified_damage / amount_of_parts) + if(damage_type == BURN) + L.take_damage(burn = modified_damage / amount_of_parts) + else + L.take_damage(modified_damage / amount_of_parts) + updatehealth() UpdateDamageIcon() diff --git a/code/modules/mob/living/carbon/human/life/life_helpers.dm b/code/modules/mob/living/carbon/human/life/life_helpers.dm index cab3ae21a782..9388204a967d 100644 --- a/code/modules/mob/living/carbon/human/life/life_helpers.dm +++ b/code/modules/mob/living/carbon/human/life/life_helpers.dm @@ -6,25 +6,6 @@ * Mostly for procs that are not called in the direct Life() loop, except for exact functionality matches (handle_breath, breathe, get_breath_from_internal for example) */ -//Calculate how vulnerable the human is to under- and overpressure. -//Returns 0 (equals 0 %) if sealed in an undamaged suit, 1 if unprotected (equals 100%). -//Suitdamage can modifiy this in 10% steps. -/mob/living/carbon/human/proc/get_pressure_weakness() - - var/pressure_adjustment_coefficient = 1 // Assume no protection at first. - - if(wear_suit && (wear_suit.flags_inventory & NOPRESSUREDMAGE) && head && (head.flags_inventory & NOPRESSUREDMAGE)) //Complete set of pressure-proof suit worn, assume fully sealed. - pressure_adjustment_coefficient = 0 - - //Handles breaches in your space suit. 10 suit damage equals a 100% loss of pressure protection. - if(istype(wear_suit, /obj/item/clothing/suit/space)) - var/obj/item/clothing/suit/space/S = wear_suit - if(S.can_breach && S.damage) - pressure_adjustment_coefficient += S.damage * 0.1 - - pressure_adjustment_coefficient = min(1, max(pressure_adjustment_coefficient, 0)) //So it isn't less than 0 or larger than 1. - return pressure_adjustment_coefficient - /mob/living/carbon/human/proc/stabilize_body_temperature() diff --git a/code/modules/mob/living/carbon/human/species/synthetic.dm b/code/modules/mob/living/carbon/human/species/synthetic.dm index f2d5c50f7391..ab5a8d462713 100644 --- a/code/modules/mob/living/carbon/human/species/synthetic.dm +++ b/code/modules/mob/living/carbon/human/species/synthetic.dm @@ -8,7 +8,7 @@ unarmed_type = /datum/unarmed_attack/punch/synthetic pain_type = /datum/pain/synthetic stamina_type = /datum/stamina/none - mob_inherent_traits = list(TRAIT_SUPER_STRONG) + mob_inherent_traits = list(TRAIT_SUPER_STRONG, TRAIT_IRON_TEETH) rarity_value = 2 insulated = TRUE @@ -64,7 +64,7 @@ name = SYNTH_GEN_ONE uses_skin_color = FALSE special_body_types = FALSE - mob_inherent_traits = list(TRAIT_SUPER_STRONG, TRAIT_INTENT_EYES) + mob_inherent_traits = list(TRAIT_SUPER_STRONG, TRAIT_INTENT_EYES, TRAIT_IRON_TEETH) hair_color = "#000000" icobase = 'icons/mob/humans/species/r_synthetic.dmi' @@ -81,7 +81,7 @@ uses_skin_color = TRUE special_body_types = TRUE burn_mod = 0.8 - mob_inherent_traits = list(TRAIT_SUPER_STRONG) + mob_inherent_traits = list(TRAIT_SUPER_STRONG, TRAIT_IRON_TEETH) pain_type = /datum/pain/synthetic/colonial rarity_value = 1.5 @@ -103,7 +103,7 @@ name = SYNTH_COLONY_GEN_ONE uses_skin_color = FALSE special_body_types = FALSE - mob_inherent_traits = list(TRAIT_SUPER_STRONG, TRAIT_INTENT_EYES) + mob_inherent_traits = list(TRAIT_SUPER_STRONG, TRAIT_INTENT_EYES, TRAIT_IRON_TEETH) //sets colonial_gen_one synth's hair to black hair_color = "#000000" //sets colonial_gen_one synth's icon to WJ sprite @@ -116,7 +116,7 @@ name_plural = "Combat Synthetics" uses_skin_color = FALSE special_body_types = FALSE - mob_inherent_traits = list(TRAIT_SUPER_STRONG, TRAIT_INTENT_EYES) + mob_inherent_traits = list(TRAIT_SUPER_STRONG, TRAIT_INTENT_EYES, TRAIT_IRON_TEETH) burn_mod = 0.6 //made for combat total_health = 250 //made for combat @@ -137,7 +137,7 @@ name = SYNTH_INFILTRATOR name_plural = "Infiltrator Synthetics" uses_skin_color = TRUE - mob_inherent_traits = list(TRAIT_SUPER_STRONG, TRAIT_INFILTRATOR_SYNTH) + mob_inherent_traits = list(TRAIT_SUPER_STRONG, TRAIT_INFILTRATOR_SYNTH, TRAIT_IRON_TEETH) bloodsplatter_type = /obj/effect/temp_visual/dir_setting/bloodsplatter/human diff --git a/code/modules/mob/living/carbon/human/species/working_joe/_species.dm b/code/modules/mob/living/carbon/human/species/working_joe/_species.dm index f2c0e8d4cf26..0273fe6b903f 100644 --- a/code/modules/mob/living/carbon/human/species/working_joe/_species.dm +++ b/code/modules/mob/living/carbon/human/species/working_joe/_species.dm @@ -4,7 +4,7 @@ death_message = "violently gargles fluid and seizes up, the glow in their eyes dimming..." uses_skin_color = FALSE burn_mod = 0.65 // made for hazardous environments, withstanding temperatures up to 1210 degrees - mob_inherent_traits = list(TRAIT_SUPER_STRONG, TRAIT_INTENT_EYES, TRAIT_EMOTE_CD_EXEMPT, TRAIT_CANNOT_EAT, TRAIT_UNSTRIPPABLE) + mob_inherent_traits = list(TRAIT_SUPER_STRONG, TRAIT_INTENT_EYES, TRAIT_EMOTE_CD_EXEMPT, TRAIT_CANNOT_EAT, TRAIT_UNSTRIPPABLE, TRAIT_IRON_TEETH) slowdown = 0.45 hair_color = "#000000" diff --git a/code/modules/mob/living/carbon/human/species/yautja/_species.dm b/code/modules/mob/living/carbon/human/species/yautja/_species.dm index 86653af92b4b..042c9917af61 100644 --- a/code/modules/mob/living/carbon/human/species/yautja/_species.dm +++ b/code/modules/mob/living/carbon/human/species/yautja/_species.dm @@ -14,6 +14,7 @@ TRAIT_FOREIGN_BIO, TRAIT_DEXTROUS, TRAIT_EMOTE_CD_EXEMPT, + TRAIT_IRON_TEETH, ) unarmed_type = /datum/unarmed_attack/punch/strong secondary_unarmed_type = /datum/unarmed_attack/bite/strong diff --git a/code/modules/mob/living/carbon/xenomorph/castes/Queen.dm b/code/modules/mob/living/carbon/xenomorph/castes/Queen.dm index a66903a938c5..5b9c410e235a 100644 --- a/code/modules/mob/living/carbon/xenomorph/castes/Queen.dm +++ b/code/modules/mob/living/carbon/xenomorph/castes/Queen.dm @@ -468,6 +468,9 @@ /mob/living/carbon/xenomorph/queen/proc/make_combat_effective() queen_aged = TRUE + if(queen_age_timer_id != TIMER_ID_NULL) + deltimer(queen_age_timer_id) + queen_age_timer_id = TIMER_ID_NULL give_combat_abilities() recalculate_actions() @@ -545,9 +548,8 @@ . += "Pooled Larvae: [stored_larvae]" . += "Leaders: [xeno_leader_num] / [hive?.queen_leader_limit]" - if(queen_age_timer_id != TIMER_ID_NULL) - var/time_left = time2text(timeleft(queen_age_timer_id) + 1 MINUTES, "mm") // We add a minute so that it basically ceilings the value. - . += "Maturity: [time_left == 1? "[time_left] minute" : "[time_left] minutes"] remaining" + if(!queen_aged && queen_age_timer_id != TIMER_ID_NULL) + . += "Maturity: [time2text(timeleft(queen_age_timer_id), "mm:ss")] remaining" /mob/living/carbon/xenomorph/queen/proc/set_orders() set category = "Alien" diff --git a/code/modules/mob/living/carbon/xenomorph/death.dm b/code/modules/mob/living/carbon/xenomorph/death.dm index 82b9291dc555..ebf58133308f 100644 --- a/code/modules/mob/living/carbon/xenomorph/death.dm +++ b/code/modules/mob/living/carbon/xenomorph/death.dm @@ -137,25 +137,31 @@ /mob/living/carbon/xenomorph/gib(datum/cause_data/cause = create_cause_data("gibbing", src)) var/obj/effect/decal/remains/xeno/remains = new(get_turf(src)) - remains.icon = icon + var/icon_path + var/gib_state = "gibbed-a-corpse" remains.pixel_x = pixel_x //For 2x2. if(!caste) CRASH("CASTE ERROR: gib() was called without a caste. (name: [name], disposed: [QDELETED(src)], health: [health])") - switch(caste.caste_type) //This will need to be changed later, when we have proper xeno pathing. Might do it on caste or something. + if(mob_size >= MOB_SIZE_BIG) + icon_path = 'icons/mob/xenos/xenomorph_64x64.dmi' + else + icon_path = 'icons/mob/xenos/xenomorph_48x48.dmi' + switch(caste.caste_type) + if(XENO_CASTE_RUNNER) + icon_path = 'icons/mob/xenos/xenomorph_64x64.dmi' + gib_state = "gibbed-a-corpse-runner" if(XENO_CASTE_BOILER) var/mob/living/carbon/xenomorph/boiler/src_boiler = src visible_message(SPAN_DANGER("[src] begins to bulge grotesquely, and explodes in a cloud of corrosive gas!")) src_boiler.smoke.set_up(2, 0, get_turf(src), new_cause_data = src_boiler.smoke.cause_data) src_boiler.smoke.start() - remains.icon_state = "gibbed-a-corpse" - if(XENO_CASTE_RUNNER) - remains.icon_state = "gibbed-a-corpse-runner" if(XENO_CASTE_LARVA, XENO_CASTE_PREDALIEN_LARVA) - remains.icon_state = "larva_gib_corpse" - else - remains.icon_state = "gibbed-a-corpse" + icon_path = 'icons/mob/xenos/larva.dmi' + + remains.icon_state = gib_state + remains.icon = icon_path check_blood_splash(35, BURN, 65, 2) //Some testing numbers. 35 burn, 65 chance. @@ -170,8 +176,12 @@ icon_path = 'icons/mob/xenos/xenomorph_48x48.dmi' switch(caste.caste_type) if(XENO_CASTE_RUNNER) + icon_path = 'icons/mob/xenos/xenomorph_64x64.dmi' to_flick = "gibbed-a-runner" + if(XENO_CASTE_BOILER) + to_flick = "gibbed-a-boiler" if(XENO_CASTE_LARVA, XENO_CASTE_PREDALIEN_LARVA) + icon_path = 'icons/mob/xenos/larva.dmi' to_flick = "larva_gib" new /obj/effect/overlay/temp/gib_animation/xeno(loc, src, to_flick, icon_path) diff --git a/code/modules/mob/mob.dm b/code/modules/mob/mob.dm index 0a24468cc176..93b2d8d9e031 100644 --- a/code/modules/mob/mob.dm +++ b/code/modules/mob/mob.dm @@ -471,6 +471,9 @@ return else if(istype(AM, /obj)) AM.add_fingerprint(src) + animation_attack_on(AM) + playsound(loc, 'sound/weapons/thudswoosh.ogg', 25, 1, 7) + flick_attack_overlay(AM, "grab") if(!QDELETED(AM.pulledby) && !QDELETED(M)) visible_message(SPAN_WARNING("[src] has broken [AM.pulledby]'s grip on [M]!"), null, null, 5) @@ -534,6 +537,7 @@ msg_admin_attack("[key_name(src)] grabbed [key_name(M)] in [get_area(src)] ([src.loc.x],[src.loc.y],[src.loc.z]).", src.loc.x, src.loc.y, src.loc.z) if(!no_msg) + animation_attack_on(M) visible_message(SPAN_WARNING("[src] has grabbed [M] passively!"), null, null, 5) if(M.mob_size > MOB_SIZE_HUMAN || !(M.status_flags & CANPUSH)) diff --git a/code/modules/nightmare/nmnodes/flow.dm b/code/modules/nightmare/nmnodes/flow.dm index 1ca8c48f88b8..5f94326bbcaa 100644 --- a/code/modules/nightmare/nmnodes/flow.dm +++ b/code/modules/nightmare/nmnodes/flow.dm @@ -67,15 +67,14 @@ if(!.) return var/list/datum/nmnode/pickables = choices.Copy() for(var/datum/nmnode/node as anything in pickables) - if(isnum(node.raw["weight"])) - pickables[node] = node.raw["weight"] + pickables[node] = isnum(node.raw["weight"]) ? node.raw["weight"] : 1 var/list/datum/nmnode/picked = list() var/remaining = src.amount #if defined(UNIT_TESTS) remaining = length(pickables) // Force all to be picked for testing (this could potentially make false positives though) #endif while(length(pickables) && remaining > 0) - var/datum/nmnode/node = pickweight(pickables) + var/datum/nmnode/node = pick_weight(pickables) remaining-- pickables -= node picked += node diff --git a/code/modules/organs/limbs.dm b/code/modules/organs/limbs.dm index b4086ee898e2..879aeaf89634 100644 --- a/code/modules/organs/limbs.dm +++ b/code/modules/organs/limbs.dm @@ -1424,7 +1424,6 @@ treat_grafted var tells it to apply to grafted but unsalved wounds, for burn kit has_stump_icon = TRUE splint_icon_amount = 4 bandage_icon_amount = 4 - var/disfigured = 0 //whether the head is disfigured. var/eyes_r var/eyes_g @@ -1462,25 +1461,6 @@ treat_grafted var tells it to apply to grafted but unsalved wounds, for burn kit mob/attack_source = null,\ brute_reduced_by = -1, burn_reduced_by = -1) . = ..() - if (!disfigured) - if (brute_dam > 50 || brute_dam > 40 && prob(50)) - disfigure("brute") - if (burn_dam > 40) - disfigure("burn") - -/obj/limb/head/proc/disfigure(type = "brute") - if (disfigured) - return - if(type == "brute") - owner.visible_message(SPAN_DANGER("You hear a sickening cracking sound coming from \the [owner]'s face."), \ - SPAN_DANGER("Your face becomes an unrecognizible mangled mess!"), \ - SPAN_DANGER("You hear a sickening crack.")) - else - owner.visible_message(SPAN_DANGER("[owner]'s face melts away, turning into a mangled mess!"), \ - SPAN_DANGER("Your face melts off!"), \ - SPAN_DANGER("You hear a sickening sizzle.")) - disfigured = 1 - owner.name = owner.get_visible_name() /obj/limb/head/reset_limb_surgeries() for(var/zone in list("head", "eyes", "mouth")) diff --git a/code/modules/projectiles/ammo_boxes/grenade_packets.dm b/code/modules/projectiles/ammo_boxes/grenade_packets.dm index 5546fe3bc520..603e2e3a712f 100644 --- a/code/modules/projectiles/ammo_boxes/grenade_packets.dm +++ b/code/modules/projectiles/ammo_boxes/grenade_packets.dm @@ -109,6 +109,12 @@ GLOBAL_LIST_INIT(grenade_packets, list( icon_state = "general_packet" content_type = /obj/item/explosive/grenade/high_explosive/m15/rubber +/obj/item/storage/box/packet/sebb + name = "\improper G2 Electroshock grenade packet" + desc = "It contains three G2 Electroshock grenades. Handle with care." + icon_state = "sebb_packet" + content_type = /obj/item/explosive/grenade/sebb + /obj/item/storage/box/packet/airburst_he name = "\improper M74 airburst grenade packet" desc = "It contains three M74 airburst fragmentation grenades. This end towards the enemy." diff --git a/code/modules/projectiles/ammunition.dm b/code/modules/projectiles/ammunition.dm index 0e0fccf027db..5db904869973 100644 --- a/code/modules/projectiles/ammunition.dm +++ b/code/modules/projectiles/ammunition.dm @@ -365,7 +365,7 @@ Turn() or Shift() as there is virtually no overhead. ~N overlay_ammo_type = "_blank" overlay_gun_type = "_458" overlay_content = "_458" - magazine_type = /obj/item/ammo_magazine/handful/lever_action/xm88 + magazine_type = /obj/item/ammo_magazine/lever_action/xm88 /obj/item/ammo_box/magazine/lever_action/xm88/empty empty = TRUE diff --git a/code/modules/projectiles/guns/rifles.dm b/code/modules/projectiles/guns/rifles.dm index fbe24434d542..44d6ef845b94 100644 --- a/code/modules/projectiles/guns/rifles.dm +++ b/code/modules/projectiles/guns/rifles.dm @@ -1228,6 +1228,7 @@ fire_sound = 'sound/weapons/gun_hpr.ogg' aim_slowdown = SLOWDOWN_ADS_LMG current_mag = /obj/item/ammo_magazine/rifle/lmg + starting_attachment_types = list(/obj/item/attachable/bipod) attachable_allowed = list( /obj/item/attachable/suppressor, /obj/item/attachable/reddot, diff --git a/code/modules/reagents/chemistry_properties/prop_negative.dm b/code/modules/reagents/chemistry_properties/prop_negative.dm index 783584102182..e7d40c3da31f 100644 --- a/code/modules/reagents/chemistry_properties/prop_negative.dm +++ b/code/modules/reagents/chemistry_properties/prop_negative.dm @@ -137,11 +137,9 @@ if(affecting) if(affecting.take_damage(4, 2)) H.UpdateDamageIcon() - if(prob(meltprob)) //Applies disfigurement + if(prob(meltprob)) if(H.pain.feels_pain) H.emote("scream") - H.status_flags |= DISFIGURED - H.name = H.get_visible_name() else M.take_limb_damage(min(6, volume)) return diff --git a/code/modules/reagents/chemistry_properties/prop_positive.dm b/code/modules/reagents/chemistry_properties/prop_positive.dm index 9243c71ae7df..051befa14fba 100644 --- a/code/modules/reagents/chemistry_properties/prop_positive.dm +++ b/code/modules/reagents/chemistry_properties/prop_positive.dm @@ -949,10 +949,6 @@ /datum/chem_property/positive/aiding/process(mob/living/M, potency = 1, delta_time) M.disabilities = 0 M.sdisabilities = 0 - M.status_flags &= ~DISFIGURED - if(ishuman(M)) - var/mob/living/carbon/human/H = M - H.name = H.get_visible_name() /datum/chem_property/positive/aiding/process_overdose(mob/living/M, potency = 1, delta_time) M.confused = max(M.confused, 20 * potency) //Confusion and some toxins diff --git a/code/modules/shuttle/computer.dm b/code/modules/shuttle/computer.dm index 00dcd987f089..5f17c9a73285 100644 --- a/code/modules/shuttle/computer.dm +++ b/code/modules/shuttle/computer.dm @@ -364,14 +364,47 @@ icon_state = "terminal" req_access = list() breakable = FALSE + unslashable = TRUE + unacidable = TRUE ///If true, the lifeboat is in the process of launching, and so the code will not allow another launch. var/launch_initiated = FALSE + ///If true, the lifeboat is in the process of having the xeno override removed by the pilot. + var/override_being_removed = FALSE + ///How long it takes to unlock the console + var/remaining_time = 180 SECONDS + +/obj/structure/machinery/computer/shuttle/lifeboat/ex_act(severity) + return /obj/structure/machinery/computer/shuttle/lifeboat/attack_hand(mob/user) . = ..() var/obj/docking_port/mobile/crashable/lifeboat/lifeboat = SSshuttle.getShuttle(shuttleId) if(lifeboat.status == LIFEBOAT_LOCKED) - to_chat(user, SPAN_WARNING("[src] flickers with error messages.")) + if(!skillcheck(user, SKILL_PILOT, SKILL_PILOT_TRAINED)) + to_chat(user, SPAN_WARNING("[src] displays an error message and asks you to contact your pilot to resolve the problem.")) + return + if(user.action_busy || override_being_removed) + return + to_chat(user, SPAN_NOTICE("You start to remove the lockout.")) + override_being_removed = TRUE + user.visible_message(SPAN_NOTICE("[user] starts to type on [src]."), + SPAN_NOTICE("You try to take back control over the lifeboat. It will take around [remaining_time / 10] seconds.")) + while(remaining_time > 20 SECONDS) + if(!do_after(user, 20 SECONDS, INTERRUPT_ALL|INTERRUPT_CHANGED_LYING, BUSY_ICON_HOSTILE, numticks = 20)) + to_chat(user, SPAN_WARNING("You fail to remove the lockout!")) + override_being_removed = FALSE + return + remaining_time = remaining_time - 20 SECONDS + if(remaining_time > 0) + to_chat(user, SPAN_NOTICE("You partially bypass the lockout, only [remaining_time / 10] seconds left.")) + to_chat(user, SPAN_NOTICE("You successfully removed the lockout!")) + playsound(loc, 'sound/machines/terminal_success.ogg', KEYBOARD_SOUND_VOLUME, 1) + lifeboat.status = LIFEBOAT_ACTIVE + lifeboat.available = TRUE + user.visible_message(SPAN_NOTICE("[src] blinks with blue lights."), + SPAN_NOTICE("You have successfully taken back control over the lifeboat.")) + override_being_removed = FALSE + return else if(lifeboat.status == LIFEBOAT_INACTIVE) to_chat(user, SPAN_NOTICE("[src]'s screen says \"Awaiting evacuation order\".")) else if(lifeboat.status == LIFEBOAT_ACTIVE) @@ -451,6 +484,8 @@ var/obj/docking_port/stationary/lifeboat_dock/lifeboat_dock = lifeboat.get_docked() lifeboat_dock.open_dock() xeno_message(SPAN_XENOANNOUNCE("We have wrested away control of one of the metal birds! They shall not escape!"), 3, xeno.hivenumber) + launch_initiated = FALSE + remaining_time = initial(remaining_time) return XENO_NO_DELAY_ACTION else return ..() diff --git a/code/modules/surgery/face.dm b/code/modules/surgery/face.dm deleted file mode 100644 index 7d13c0ed5675..000000000000 --- a/code/modules/surgery/face.dm +++ /dev/null @@ -1,174 +0,0 @@ -//Procedures in this file: Facial reconstruction surgery -////////////////////////////////////////////////////////////////// -// FACE SURGERY // -////////////////////////////////////////////////////////////////// - -/datum/surgery/face_fix - name = "Facial Reconstruction" - possible_locs = list("mouth") - invasiveness = list(SURGERY_DEPTH_SURFACE) - pain_reduction_required = PAIN_REDUCTION_HEAVY - required_surgery_skill = SKILL_SURGERY_TRAINED - steps = list( - /datum/surgery_step/facial_incision, - /datum/surgery_step/mend_vocals, - /datum/surgery_step/pull_skin, - /datum/surgery_step/cauterize/close_facial_incision, - ) - -/datum/surgery/face_fix/can_start(mob/user, mob/living/carbon/patient, obj/limb/L, obj/item/tool) - var/obj/limb/head/H = L - return H && H.disfigured - -//------------------------------------ - -/datum/surgery_step/facial_incision - name = "Make Facial Incision" - desc = "make facial incisions" - tools = SURGERY_TOOLS_INCISION - time = 4 SECONDS - -/datum/surgery_step/facial_incision/preop(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, tool_type, datum/surgery/surgery) - user.affected_message(target, - SPAN_NOTICE("You start to cut open [target]'s face and neck with \the [tool]."), - SPAN_NOTICE("[user] starts to cut open your face and neck with \the [tool]."), - SPAN_NOTICE("[user] starts to cut open [target]'s face and neck with \the [tool].")) - - log_interact(user, target, "[key_name(user)] began to cut open [key_name(target)]'s face and neck with \the [tool].") - target.custom_pain("Your face is being cut apart!", 1) - -/datum/surgery_step/facial_incision/success(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, tool_type, datum/surgery/surgery) - user.affected_message(target, - SPAN_NOTICE("You finish opening incisions on [target]'s face and neck."), - SPAN_NOTICE("[user] finishes opening incisions on your face and neck."), - SPAN_NOTICE("[user] finishes opening incisions on [target]'s face and neck.")) - - target.incision_depths[target_zone] = SURGERY_DEPTH_SHALLOW - log_interact(user, target, "[key_name(user)] cut open [key_name(target)]'s face and neck with \the [tool].") - -/datum/surgery_step/facial_incision/failure(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, tool_type, datum/surgery/surgery) - user.affected_message(target, - SPAN_DANGER("Your hand slips, slicing [target]'s throat wth \the [tool]!"), - SPAN_DANGER("[user]'s hand slips, slicing [target]'s throat wth \the [tool]!"), - SPAN_DANGER("[user]'s hand slips, slicing [target]'s throat wth \the [tool]!")) - - log_interact(user, target, "[key_name(user)] failed to cut open [key_name(target)]'s face and neck with \the [tool].") - - target.apply_damage(40, BRUTE, target_zone) - target.losebreath += 20 - user.add_blood(target.get_blood_color(), BLOOD_BODY|BLOOD_HANDS) - return FALSE - -//------------------------------------ - -/datum/surgery_step/mend_vocals - name = "Mend Vocal Cords" - desc = "mend the vocal cords" - tools = SURGERY_TOOLS_PINCH - time = 3 SECONDS - -/datum/surgery_step/mend_vocals/preop(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, tool_type, datum/surgery/surgery) - user.affected_message(target, - SPAN_NOTICE("You start mending [target]'s vocal cords with \the [tool]."), - SPAN_NOTICE("[user] starts to mend your vocal cords with \the [tool]."), - SPAN_NOTICE("[user] starts to mend [target]'s vocal cords with \the [tool].")) - - log_interact(user, target, "[key_name(user)] began to mend [key_name(target)]'s vocal cords with \the [tool].") - target.custom_pain("The insides of your throat are being pinched and pulled at!", 1) - -/datum/surgery_step/mend_vocals/success(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, tool_type, datum/surgery/surgery) - user.affected_message(target, - SPAN_NOTICE("You mend [target]'s vocal cords."), - SPAN_NOTICE("[user] mends your vocal cords."), - SPAN_NOTICE("[user] mends [target]'s vocal cords.")) - - log_interact(user, target, "[key_name(user)] mended [key_name(target)]'s vocal cords with \the [tool].") - -/datum/surgery_step/mend_vocals/failure(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, tool_type, datum/surgery/surgery) - user.affected_message(target, - SPAN_WARNING("Your hand slips, clamping [user]'s trachea shut for a moment with \the [tool]!"), - SPAN_DANGER("[user]'s hand slips, clamping your trachea shut for a moment with \the [tool]!"), - SPAN_WARNING("[user]'s hand slips, clamping [target]'s trachea shut for a moment with \the [tool]!")) - - log_interact(user, target, "[key_name(user)] failed to mend [key_name(target)]'s vocal cords with \the [tool].") - - target.losebreath += 10 - return FALSE - -//------------------------------------ - -/datum/surgery_step/pull_skin - name = "Reconstruct Facial Features" - desc = "reconstruct the face" - tools = SURGERY_TOOLS_PRY_DELICATE - time = 3 SECONDS - -/datum/surgery_step/pull_skin/preop(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, tool_type, datum/surgery/surgery) - user.affected_message(target, - SPAN_NOTICE("You start pulling the skin on [target]'s face back into shape with \the [tool]."), - SPAN_NOTICE("[user] starts to pull the skin on your face back into shape with \the [tool]."), - SPAN_NOTICE("[user] starts to pull the skin on [target]'s face back into shape with \the [tool].")) - - log_interact(user, target, "[key_name(user)] began to pull the skin on [key_name(target)]'s face back in place with \the [tool].") - target.custom_pain("Your face hurts!", 1) - -/datum/surgery_step/pull_skin/success(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, tool_type, datum/surgery/surgery) - user.affected_message(target, - SPAN_NOTICE("You reconstruct [target]'s facial features."), - SPAN_NOTICE("[user] reconstructs your facial features."), - SPAN_NOTICE("[user] reconstructs [target]'s facial features.")) - - log_interact(user, target, "[key_name(user)] pulled the skin on [key_name(target)]'s face back in place with \the [tool].") - -/datum/surgery_step/pull_skin/failure(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, tool_type, datum/surgery/surgery) - user.affected_message(target, - SPAN_WARNING("Your hand slips, tearing skin on [target]'s face with \the [tool]!"), - SPAN_WARNING("[user]'s hand slips, tearing skin on your face with \the [tool]!"), - SPAN_WARNING("[user]'s hand slips, tearing skin on [target]'s face with \the [tool]!")) - - log_interact(user, target, "[key_name(user)] failed to pull the skin on [key_name(target)]'s face back in place with \the [tool].") - - target.apply_damage(10, BRUTE, target_zone) - return FALSE - -//------------------------------------ - -/datum/surgery_step/cauterize/close_facial_incision - name = "Close Facial Incisions" - desc = "close the facial incisions" - time = 5 SECONDS - -/datum/surgery_step/cauterize/close_facial_incision/preop(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, tool_type, datum/surgery/surgery) - user.affected_message(target, - SPAN_NOTICE("You begin to cauterize the incisions on [target]'s face and neck with \the [tool]."), - SPAN_NOTICE("[user] begins to cauterize the incisions on your face and neck with \the [tool]."), - SPAN_NOTICE("[user] begins to cauterize the incisions on [target]'s face and neck with \the [tool].")) - - target.custom_pain("Your face is being burned!", 1) - - log_interact(user, target, "[key_name(user)] began to cauterize [key_name(target)]'s face and neck with \the [tool].") - -/datum/surgery_step/cauterize/close_facial_incision/success(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, tool_type, datum/surgery/surgery) - user.affected_message(target, - SPAN_NOTICE("You cauterize the incisions on [target]'s face and neck."), - SPAN_NOTICE("[user] cauterizes the incisions on your face and neck."), - SPAN_NOTICE("[user] cauterizes the incision on [target]'s face and neck.")) - - log_interact(user, target, "[key_name(user)] cauterized [key_name(target)]'s face and neck with \the [tool], ending [surgery].") - - target.incision_depths[target_zone] = SURGERY_DEPTH_SURFACE - surgery.affected_limb.remove_all_bleeding(TRUE) - var/obj/limb/head/H = surgery.affected_limb - H.disfigured = FALSE - H.owner.name = H.owner.get_visible_name() - -/datum/surgery_step/cauterize/close_facial_incision/failure(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, tool_type, datum/surgery/surgery) - user.affected_message(target, - SPAN_WARNING("Your hand slips, leaving a small burn on [target]'s face!"), - SPAN_WARNING("[user]'s hand slips, leaving a small burn on your face!"), - SPAN_WARNING("[user]'s hand slips, leaving a small burn on [target]'s face!")) - - log_interact(user, target, "[key_name(user)] failed to cauterize [key_name(target)]'s face and neck with \the [tool].") - - target.apply_damage(5, BURN, target_zone) - return FALSE diff --git a/code/modules/tgs/README.md b/code/modules/tgs/README.md index 6319028d8106..35ca73d7e9a8 100644 --- a/code/modules/tgs/README.md +++ b/code/modules/tgs/README.md @@ -1,6 +1,6 @@ # DMAPI Internals -This folder should be placed on it's own inside a codebase that wishes to use the TGS DMAPI. Warranty void if modified. +This folder should be placed on its own inside a codebase that wishes to use the TGS DMAPI. Warranty void if modified. - [includes.dm](./includes.dm) is the file that should be included by DM code, it handles including the rest. - The [core](./core) folder includes all code not directly part of any API version. diff --git a/code/modules/tgs/v5/api.dm b/code/modules/tgs/v5/api.dm index 95b8edd3ee5c..05d0dee25b3c 100644 --- a/code/modules/tgs/v5/api.dm +++ b/code/modules/tgs/v5/api.dm @@ -50,7 +50,9 @@ version = null // we want this to be the TGS version, not the interop version // sleep once to prevent an issue where world.Export on the first tick can hang indefinitely + TGS_DEBUG_LOG("Starting Export bug prevention sleep tick. time:[world.time] sleep_offline:[world.sleep_offline]") sleep(world.tick_lag) + TGS_DEBUG_LOG("Export bug prevention sleep complete") var/list/bridge_response = Bridge(DMAPI5_BRIDGE_COMMAND_STARTUP, list(DMAPI5_BRIDGE_PARAMETER_MINIMUM_SECURITY_LEVEL = minimum_required_security_level, DMAPI5_BRIDGE_PARAMETER_VERSION = api_version.raw_parameter, DMAPI5_PARAMETER_CUSTOM_COMMANDS = ListCustomCommands(), DMAPI5_PARAMETER_TOPIC_PORT = GetTopicPort())) if(!istype(bridge_response)) diff --git a/code/modules/vehicles/hardpoints/hardpoint_ammo/cupola_ammo.dm b/code/modules/vehicles/hardpoints/hardpoint_ammo/cupola_ammo.dm index cadb760bd644..7eecc7d04511 100644 --- a/code/modules/vehicles/hardpoints/hardpoint_ammo/cupola_ammo.dm +++ b/code/modules/vehicles/hardpoints/hardpoint_ammo/cupola_ammo.dm @@ -5,7 +5,7 @@ icon = 'icons/obj/items/weapons/guns/ammo_by_faction/uscm.dmi' icon_state = "cupola_1" w_class = SIZE_LARGE - default_ammo = /datum/ammo/bullet/smartgun + default_ammo = /datum/ammo/bullet/machinegun max_rounds = 500 gun_type = /obj/item/hardpoint/secondary/m56cupola diff --git a/code/modules/vehicles/hardpoints/hardpoint_ammo/primary_flamer_ammo.dm b/code/modules/vehicles/hardpoints/hardpoint_ammo/primary_flamer_ammo.dm index def6016f0759..a164b38383b8 100644 --- a/code/modules/vehicles/hardpoints/hardpoint_ammo/primary_flamer_ammo.dm +++ b/code/modules/vehicles/hardpoints/hardpoint_ammo/primary_flamer_ammo.dm @@ -1,7 +1,7 @@ /obj/item/ammo_magazine/hardpoint/primary_flamer name = "DRG-N Offensive Flamer Unit Fuel Tank" desc = "A primary armament flamethrower magazine." - caliber = "Napalm X" //correlates to flamer mags + caliber = "High-Combustion Napalm" //correlates to flamer mags icon_state = "drgn_flametank" w_class = SIZE_LARGE max_rounds = 60 diff --git a/code/modules/vehicles/hardpoints/primary/flamer.dm b/code/modules/vehicles/hardpoints/primary/flamer.dm index fce6e7f6a410..60a7979cd5fb 100644 --- a/code/modules/vehicles/hardpoints/primary/flamer.dm +++ b/code/modules/vehicles/hardpoints/primary/flamer.dm @@ -1,6 +1,6 @@ /obj/item/hardpoint/primary/flamer name = "\improper DRG-N Offensive Flamer Unit" - desc = "A primary weapon for the tank that spews fire everywhere." + desc = "A primary weapon for the tank that spews out high-combustion napalm in a wide radius. The fuel burns intensely and quickly, which allows for it to be used offensively by armoured vehicles." icon_state = "drgn_flamer" disp_icon = "tank" diff --git a/code/modules/vehicles/hardpoints/secondary/cupola.dm b/code/modules/vehicles/hardpoints/secondary/cupola.dm index a4b40c7dd3a1..70b9f9a4889f 100644 --- a/code/modules/vehicles/hardpoints/secondary/cupola.dm +++ b/code/modules/vehicles/hardpoints/secondary/cupola.dm @@ -28,9 +28,3 @@ burst_amount = 3 burst_delay = 0.3 SECONDS extra_delay = 0.6 SECONDS - -/obj/item/hardpoint/secondary/m56cupola/set_bullet_traits() - ..() - LAZYADD(traits_to_give, list( - BULLET_TRAIT_ENTRY(/datum/element/bullet_trait_iff) - )) diff --git a/code/modules/vehicles/multitile/multitile_bump.dm b/code/modules/vehicles/multitile/multitile_bump.dm index f53d88bac3f3..7b06d306e2aa 100644 --- a/code/modules/vehicles/multitile/multitile_bump.dm +++ b/code/modules/vehicles/multitile/multitile_bump.dm @@ -448,14 +448,6 @@ qdel(src) return TRUE -/obj/structure/machinery/hydro_floodlight/handle_vehicle_bump(obj/vehicle/multitile/V) - if(V.vehicle_flags & VEHICLE_CLASS_WEAK) - return FALSE - playsound(V, 'sound/effects/metal_crash.ogg', 20) - visible_message(SPAN_DANGER("\The [V] crushes \the [src]!")) - qdel(src) - return TRUE - /obj/structure/machinery/floodlight/handle_vehicle_bump(obj/vehicle/multitile/V) if(V.vehicle_flags & VEHICLE_CLASS_WEAK) return FALSE diff --git a/colonialmarines.dme b/colonialmarines.dme index bbed7cc474ec..005ffdd4040c 100644 --- a/colonialmarines.dme +++ b/colonialmarines.dme @@ -311,6 +311,7 @@ #include "code\controllers\subsystem\tracking.dm" #include "code\controllers\subsystem\vote.dm" #include "code\controllers\subsystem\weather.dm" +#include "code\controllers\subsystem\who.dm" #include "code\controllers\subsystem\x_evolution.dm" #include "code\controllers\subsystem\xeno.dm" #include "code\controllers\subsystem\init\landmarks.dm" @@ -846,7 +847,6 @@ #include "code\game\machinery\autolathe.dm" #include "code\game\machinery\autolathe_datums.dm" #include "code\game\machinery\Beacon.dm" -#include "code\game\machinery\bio-dome_floodlights.dm" #include "code\game\machinery\biohazard_lockdown.dm" #include "code\game\machinery\bioprinter.dm" #include "code\game\machinery\buttons.dm" @@ -865,7 +865,6 @@ #include "code\game\machinery\fuelcell_recycler.dm" #include "code\game\machinery\fusion_engine.dm" #include "code\game\machinery\gear.dm" -#include "code\game\machinery\hologram.dm" #include "code\game\machinery\holosign.dm" #include "code\game\machinery\hybrisa_lights.dm" #include "code\game\machinery\igniter.dm" @@ -873,7 +872,6 @@ #include "code\game\machinery\lightswitch.dm" #include "code\game\machinery\line_nexter.dm" #include "code\game\machinery\machinery.dm" -#include "code\game\machinery\mass_driver.dm" #include "code\game\machinery\mining.dm" #include "code\game\machinery\misc.dm" #include "code\game\machinery\navbeacon.dm" @@ -1145,7 +1143,6 @@ #include "code\game\objects\items\devices\pipe_painter.dm" #include "code\game\objects\items\devices\portable_vendor.dm" #include "code\game\objects\items\devices\scanners.dm" -#include "code\game\objects\items\devices\suit_cooling.dm" #include "code\game\objects\items\devices\taperecorder.dm" #include "code\game\objects\items\devices\teleportation.dm" #include "code\game\objects\items\devices\transfer_valve.dm" @@ -1416,7 +1413,6 @@ #include "code\game\verbs\ooc.dm" #include "code\game\verbs\preferences.dm" #include "code\game\verbs\records.dm" -#include "code\game\verbs\who.dm" #include "code\modules\trigger.dm" #include "code\modules\admin\admin.dm" #include "code\modules\admin\admin_ranks.dm" @@ -1747,7 +1743,6 @@ #include "code\modules\economy\cash.dm" #include "code\modules\economy\economy_misc.dm" #include "code\modules\economy\EFTPOS.dm" -#include "code\modules\economy\TradeDestinations.dm" #include "code\modules\emoji\emoji_parse.dm" #include "code\modules\escape_menu\admin_buttons.dm" #include "code\modules\escape_menu\details.dm" @@ -2343,7 +2338,6 @@ #include "code\modules\surgery\brainrepair.dm" #include "code\modules\surgery\chestburster.dm" #include "code\modules\surgery\eye.dm" -#include "code\modules\surgery\face.dm" #include "code\modules\surgery\generic.dm" #include "code\modules\surgery\headreattach.dm" #include "code\modules\surgery\implant.dm" diff --git a/html/changelogs/AutoChangeLog-pr-6616.yml b/html/changelogs/AutoChangeLog-pr-6616.yml new file mode 100644 index 000000000000..8693f93cea3d --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-6616.yml @@ -0,0 +1,4 @@ +author: "Venuska1117" +delete-after: True +changes: + - balance: "Enabled clusters to spread on semi-weedable surfaces." \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-6661.yml b/html/changelogs/AutoChangeLog-pr-6661.yml new file mode 100644 index 000000000000..a4663ee888d2 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-6661.yml @@ -0,0 +1,4 @@ +author: "zzzmike" +delete-after: True +changes: + - rscadd: "pilots can unhack lifeboats, similar to dropship unhacking" \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-6673.yml b/html/changelogs/AutoChangeLog-pr-6673.yml new file mode 100644 index 000000000000..789b53f6cc64 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-6673.yml @@ -0,0 +1,5 @@ +author: "Steelpoint" +delete-after: True +changes: + - rscadd: "Marine Special Forces, Forecon, Echo Squad and CBRN will now appear in their own sub-menu for observers." + - ui: "Foxtrot's colour in the observe menu now reflects the squads true colour scheme." \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-6676.yml b/html/changelogs/AutoChangeLog-pr-6676.yml deleted file mode 100644 index d59200a1b1c1..000000000000 --- a/html/changelogs/AutoChangeLog-pr-6676.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "realforest2001" -delete-after: True -changes: - - rscadd: "The Combat Correspondant's civilian equipment is now in it's own category to make it easier to tell why you can't click it as the military version." \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-6759.yml b/html/changelogs/AutoChangeLog-pr-6759.yml new file mode 100644 index 000000000000..11e32ff6b2f7 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-6759.yml @@ -0,0 +1,5 @@ +author: "Blundir" +delete-after: True +changes: + - rscadd: "grabbing something has a small mob animation now, grabbing items have visual effect, animation and sound" + - rscadd: "throwing has small animation and sound" \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-6761.yml b/html/changelogs/AutoChangeLog-pr-6761.yml new file mode 100644 index 000000000000..f63208251ce3 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-6761.yml @@ -0,0 +1,5 @@ +author: "Blundir" +delete-after: True +changes: + - balance: "revolver belt and sg holster belt can fit any revolver" + - balance: "increased mateba belt storage size from 6 to 7" \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-6762.yml b/html/changelogs/AutoChangeLog-pr-6762.yml new file mode 100644 index 000000000000..af02078356e6 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-6762.yml @@ -0,0 +1,6 @@ +author: "efzapa" +delete-after: True +changes: + - rscadd: "All Brig Detainment Cameras are now linked to a new Brig Camera Console Computer, available in the Brig Lobby, Warden's Office, CIC, and CMP Office." + - maptweak: "Removed one of the Security Records Consoles in the Brig Lobby in place for a Brig Camera Console." + - mapadd: "Both Brig Perma Cells now have brig cameras in them." \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-6729.yml b/html/changelogs/AutoChangeLog-pr-6798.yml similarity index 54% rename from html/changelogs/AutoChangeLog-pr-6729.yml rename to html/changelogs/AutoChangeLog-pr-6798.yml index 430b4216cbeb..6d6b65f651ce 100644 --- a/html/changelogs/AutoChangeLog-pr-6729.yml +++ b/html/changelogs/AutoChangeLog-pr-6798.yml @@ -1,4 +1,4 @@ author: "cuberound" delete-after: True changes: - - rscdel: "Removed malfanction closet" \ No newline at end of file + - rscdel: "holopad removal" \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-6801.yml b/html/changelogs/AutoChangeLog-pr-6801.yml new file mode 100644 index 000000000000..31074d4e1da7 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-6801.yml @@ -0,0 +1,4 @@ +author: "cuberound" +delete-after: True +changes: + - rscdel: "Removes mass driver" \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-6803.yml b/html/changelogs/AutoChangeLog-pr-6803.yml new file mode 100644 index 000000000000..f029cda5b720 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-6803.yml @@ -0,0 +1,4 @@ +author: "cuberound" +delete-after: True +changes: + - rscdel: "removes UNUSED hydro lights that were replaced by colony lights long ago" \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-6810.yml b/html/changelogs/AutoChangeLog-pr-6810.yml new file mode 100644 index 000000000000..b1daf0b6d8b9 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-6810.yml @@ -0,0 +1,4 @@ +author: "zzzmike" +delete-after: True +changes: + - bugfix: "stops attempted stripping when stunned etc." \ No newline at end of file diff --git a/html/changelogs/archive/2024-07.yml b/html/changelogs/archive/2024-07.yml index 7683a63d1a81..3a08f35ded14 100644 --- a/html/changelogs/archive/2024-07.yml +++ b/html/changelogs/archive/2024-07.yml @@ -161,3 +161,93 @@ cuberound: - rscdel: Removed Rapid-Service-Fabricator, rapid construction device and Rapid-Seed-Producer (old ss13 junk) +2024-07-19: + Drathek: + - bugfix: Fixed light blue scrubs having no cost in snowflake vendor. + SpypigDev: + - bugfix: SO Armory vendors no longer infinitely supply knives + TotalEpicness5, Triiodine, monkeyfist, Blundir: + - rscadd: Adds the G2 electroshock grenade. This grenade does not stun nor deal + serious damage to xenos, but it stuns via electric shock. It can create EMP-like + effects when faced with electronic devices like sentries, synths, Area Power + Controllers, etc. It's damage is reduced by energy armor. + - bugfix: take_overall_armoured_damage now can actually deal burn damage + - balance: Marine armor has a small bit of energy armor added back. Heavy armor + has slightly more protection than medium/light. + - bugfix: Mines now check for explosive antigrief checks + VileBeggar: + - balance: The DRG-N Offensive Flamer Unit now fires a 3-tile wide glob of high-combustion + napalm. + Zonespace, Vile Beggar: + - rscadd: Handheld planted flags are now indestructible and do a small amount of + damage on hit. + - bugfix: Plantable flags can no longer be duplicated. + - rscdel: Planting a UA flag no longer forces anyone but the planter to warcry. + cuberound: + - bugfix: having left hand broken and not splinted has the same effect on wheelchair + movement speed as right hand + - bugfix: corrects holoround highligh alpha value + - rscdel: Removed malfanction closet + kiVts: + - bugfix: Surgery sound and alike is fixed + realforest2001: + - rscadd: The Combat Correspondant's civilian equipment is now in it's own category + to make it easier to tell why you can't click it as the military version. +2024-07-20: + Doubleumc: + - rscdel: Removed facial disfigurement + - code_imp: Fixed and refactored probability weighting for pick_weight + - bugfix: no longer stab with utensil when trying to feed while target full + Drathek: + - admin: Added causes for explosion starts to attack logs + Steelpoint: + - rscadd: The Heavy Pulse Rifle (M41AE2) will now start with a pre-attached bipod. + To better inform players of its unique auto-fire function. + Zonespace27: + - bugfix: Fixed a large amount of objects activating erroneous functionality (like + an armor light) when using action buttons tied to that object. + - bugfix: Fixed a potential softlock in the abomination tutorial. + cuberound: + - rscdel: removes trade destinations (they were never used) + - balance: m56 cupola uses m56d ammo rather then standard sg ammo +2024-07-22: + BlackCrystalic: + - bugfix: Queen maturity timer + Blackcrystalic: + - qol: port who/staffwho to TGUI + ThePiachu: + - refactor: Made XM88 box code more uniform with other handful boxes. + zzzmike: + - bugfix: lifeboat launch console is no longer slashable / acidable +2024-07-23: + cuberound: + - code_imp: cleans up water particle code +2024-07-24: + Doubleumc: + - bugfix: sounds & motion detectors should be more reliable +2024-07-25: + cuberound: + - rscdel: removes /obj/item/device/suit_cooling_unit and get_pressure_weakness() +2024-07-26: + BlackCrystalic: + - qol: if server take too long to pre init all before lobby art, players will see + lobbyart "loading" + Blundir: + - bugfix: fixed runner having no gib animation + - bugfix: fixed gib remains being invisible + - imageadd: boiler gib animation + - imageadd: larva gib remains + - imageadd: shoes icons resprite + Steelpoint: + - imageadd: The Sniper and Anti-Material Rifle Specialists will now use an urban + camouflage sprite for their ghillie suit instead of a green camouflage. + realforest2001: + - rscadd: Synthetics and Yautja now spawn with the Iron Teeth trait, not dropping + items held in their mouth. + rythenx: + - rscadd: more options for hats to ASO vendor to bring it in line with what SO has + available +2024-07-29: + TheManWithNoHands: + - code_imp: adds flags to cone, allowing it to be worn on head + - imageadd: added on mob sprites for cone diff --git a/icons/effects/sebb.dmi b/icons/effects/sebb.dmi new file mode 100644 index 000000000000..288a1023ce3d Binary files /dev/null and b/icons/effects/sebb.dmi differ diff --git a/icons/lobby/title_loading.dmi b/icons/lobby/title_loading.dmi new file mode 100644 index 000000000000..3aa2f5ad52c2 Binary files /dev/null and b/icons/lobby/title_loading.dmi differ diff --git a/icons/mob/humans/onmob/head_0.dmi b/icons/mob/humans/onmob/head_0.dmi index 9fc0bc82c123..4a4338eac4c2 100644 Binary files a/icons/mob/humans/onmob/head_0.dmi and b/icons/mob/humans/onmob/head_0.dmi differ diff --git a/icons/mob/humans/onmob/head_1.dmi b/icons/mob/humans/onmob/head_1.dmi index 951c7e89f985..696ab464252d 100644 Binary files a/icons/mob/humans/onmob/head_1.dmi and b/icons/mob/humans/onmob/head_1.dmi differ diff --git a/icons/mob/humans/onmob/items_lefthand_0.dmi b/icons/mob/humans/onmob/items_lefthand_0.dmi index 7d887799815b..a4396aeb93de 100644 Binary files a/icons/mob/humans/onmob/items_lefthand_0.dmi and b/icons/mob/humans/onmob/items_lefthand_0.dmi differ diff --git a/icons/mob/humans/onmob/items_righthand_0.dmi b/icons/mob/humans/onmob/items_righthand_0.dmi index 184946a13f0b..582262e88289 100644 Binary files a/icons/mob/humans/onmob/items_righthand_0.dmi and b/icons/mob/humans/onmob/items_righthand_0.dmi differ diff --git a/icons/mob/humans/onmob/suit_1.dmi b/icons/mob/humans/onmob/suit_1.dmi index c372b8a6d72c..85266a2077ac 100644 Binary files a/icons/mob/humans/onmob/suit_1.dmi and b/icons/mob/humans/onmob/suit_1.dmi differ diff --git a/icons/mob/xenos/larva.dmi b/icons/mob/xenos/larva.dmi index 72cfb7b4e318..f2e6a31ea36d 100644 Binary files a/icons/mob/xenos/larva.dmi and b/icons/mob/xenos/larva.dmi differ diff --git a/icons/mob/xenos/xenomorph_64x64.dmi b/icons/mob/xenos/xenomorph_64x64.dmi index 3fc4d942cd66..17fd4ae7fd5f 100644 Binary files a/icons/mob/xenos/xenomorph_64x64.dmi and b/icons/mob/xenos/xenomorph_64x64.dmi differ diff --git a/icons/obj/items/clothing/cm_hats.dmi b/icons/obj/items/clothing/cm_hats.dmi index 469d7cb7616a..923a26b55c20 100644 Binary files a/icons/obj/items/clothing/cm_hats.dmi and b/icons/obj/items/clothing/cm_hats.dmi differ diff --git a/icons/obj/items/clothing/cm_suits.dmi b/icons/obj/items/clothing/cm_suits.dmi index c1910d21b599..8c39aa77c7d1 100644 Binary files a/icons/obj/items/clothing/cm_suits.dmi and b/icons/obj/items/clothing/cm_suits.dmi differ diff --git a/icons/obj/items/clothing/shoes.dmi b/icons/obj/items/clothing/shoes.dmi index c4e01786e579..90e626503963 100644 Binary files a/icons/obj/items/clothing/shoes.dmi and b/icons/obj/items/clothing/shoes.dmi differ diff --git a/icons/obj/items/weapons/grenade.dmi b/icons/obj/items/weapons/grenade.dmi index 7ee5af737066..ca8aaf9afcd6 100644 Binary files a/icons/obj/items/weapons/grenade.dmi and b/icons/obj/items/weapons/grenade.dmi differ diff --git a/maps/map_files/CORSAT/Corsat.dmm b/maps/map_files/CORSAT/Corsat.dmm index 435659e102e2..f335e4c41e8b 100644 --- a/maps/map_files/CORSAT/Corsat.dmm +++ b/maps/map_files/CORSAT/Corsat.dmm @@ -24911,7 +24911,6 @@ /area/corsat/sigma/south/complex) "bTM" = ( /obj/structure/surface/table/reinforced, -/obj/item/device/suit_cooling_unit, /turf/open/floor/corsat/retrosquareslight, /area/corsat/sigma/south/complex) "bTN" = ( diff --git a/maps/map_files/USS_Almayer/USS_Almayer.dmm b/maps/map_files/USS_Almayer/USS_Almayer.dmm index b4a195ae5969..c1d18d4f9483 100644 --- a/maps/map_files/USS_Almayer/USS_Almayer.dmm +++ b/maps/map_files/USS_Almayer/USS_Almayer.dmm @@ -3320,6 +3320,14 @@ /obj/structure/surface/table/reinforced/almayer_B, /obj/structure/machinery/faxmachine/uscm/command, /obj/item/device/megaphone, +/obj/structure/machinery/computer/cameras/almayer_brig{ + dir = 8; + desc = "Used to access the various cameras in the security brig."; + name = "brig cameras console"; + pixel_y = 12; + pixel_x = 17; + layer = 2.99 + }, /turf/open/floor/almayer/plate, /area/almayer/command/cic) "awQ" = ( @@ -19918,7 +19926,14 @@ "ekZ" = ( /obj/structure/surface/table/almayer, /obj/structure/machinery/computer/secure_data{ - dir = 4 + dir = 4; + pixel_y = 10 + }, +/obj/structure/machinery/computer/cameras/almayer_brig{ + dir = 4; + desc = "Used to access the various cameras in the security brig."; + name = "brig cameras console"; + pixel_y = -11 }, /turf/open/floor/almayer/red/west, /area/almayer/shipboard/brig/warden_office) @@ -31590,7 +31605,16 @@ "jhI" = ( /obj/structure/surface/table/almayer, /obj/structure/machinery/computer/secure_data{ - dir = 4 + dir = 4; + pixel_y = 19; + layer = 2.99 + }, +/obj/structure/machinery/computer/cameras/almayer_brig{ + dir = 4; + desc = "Used to access the various cameras in the security brig."; + name = "brig cameras console"; + pixel_y = 5; + layer = 2.99 }, /turf/open/floor/almayer, /area/almayer/shipboard/brig/chief_mp_office) @@ -33768,7 +33792,7 @@ /obj/structure/pipes/standard/simple/hidden/supply{ dir = 4 }, -/obj/structure/machinery/camera/autoname/almayer, +/obj/structure/machinery/camera/autoname/almayer/brig, /turf/open/floor/almayer, /area/almayer/shipboard/brig/cells) "kcg" = ( @@ -34442,6 +34466,7 @@ id = "Perma 1"; pixel_y = 24 }, +/obj/structure/machinery/camera/autoname/almayer/brig, /turf/open/floor/almayer/plate, /area/almayer/shipboard/brig/perma) "krA" = ( @@ -34630,7 +34655,8 @@ "kvL" = ( /obj/structure/surface/table/almayer, /obj/structure/machinery/computer/cameras/almayer_network{ - dir = 4 + dir = 4; + pixel_y = 0 }, /turf/open/floor/almayer/red/west, /area/almayer/shipboard/brig/warden_office) @@ -61350,9 +61376,8 @@ /turf/open/floor/plating/plating_catwalk, /area/almayer/maint/hull/lower/stern) "vsz" = ( -/obj/structure/machinery/camera/autoname/almayer{ - dir = 8; - name = "ship-grade camera" +/obj/structure/machinery/camera/autoname/almayer/brig{ + dir = 8 }, /turf/open/floor/almayer, /area/almayer/shipboard/brig/cells) @@ -61882,10 +61907,8 @@ /turf/open/floor/almayer/silver, /area/almayer/shipboard/brig/cic_hallway) "vCy" = ( -/obj/structure/machinery/camera/autoname/almayer{ - dir = 4; - name = "ship-grade camera"; - pixel_y = 6 +/obj/structure/machinery/camera/autoname/almayer/brig{ + dir = 4 }, /turf/open/floor/almayer/green/west, /area/almayer/shipboard/brig/cells) @@ -63920,6 +63943,7 @@ id = "Perma 2"; pixel_y = 24 }, +/obj/structure/machinery/camera/autoname/almayer/brig, /turf/open/floor/almayer/plate, /area/almayer/shipboard/brig/perma) "wnL" = ( @@ -64322,7 +64346,8 @@ "wvE" = ( /obj/structure/surface/table/almayer, /obj/structure/machinery/computer/cameras/almayer_network{ - dir = 4 + dir = 4; + pixel_y = 1 }, /obj/structure/machinery/light{ dir = 1 @@ -66191,9 +66216,6 @@ dir = 1 }, /obj/structure/surface/table/almayer, -/obj/structure/machinery/computer/secure_data{ - dir = 4 - }, /obj/structure/sign/safety/terminal{ pixel_x = 3; pixel_y = 27 @@ -66202,6 +66224,11 @@ pixel_x = 15; pixel_y = 27 }, +/obj/structure/machinery/computer/cameras/almayer_brig{ + dir = 4; + desc = "Used to access the various cameras in the security brig."; + name = "brig cameras console" + }, /turf/open/floor/almayer/red/west, /area/almayer/shipboard/brig/processing) "xjK" = ( @@ -68586,10 +68613,8 @@ /turf/open/floor/almayer/cargo, /area/almayer/engineering/lower/engine_core) "yhg" = ( -/obj/structure/machinery/camera/autoname/almayer{ - dir = 4; - name = "ship-grade camera"; - pixel_y = 6 +/obj/structure/machinery/camera/autoname/almayer/brig{ + dir = 4 }, /turf/open/floor/plating/plating_catwalk, /area/almayer/shipboard/brig/cells) diff --git a/maps/map_files/generic/Admin_level.dmm b/maps/map_files/generic/Admin_level.dmm index be0f85e60028..51623753bc0d 100644 --- a/maps/map_files/generic/Admin_level.dmm +++ b/maps/map_files/generic/Admin_level.dmm @@ -579,7 +579,6 @@ /turf/open/floor/almayer/dark_sterile, /area/adminlevel/ert_station) "tx" = ( -/obj/structure/machinery/hologram/holopad, /turf/open/floor/carpet, /area/centcom/living) "tP" = ( @@ -2211,7 +2210,7 @@ hp hp hp hp -kx +hp "} (2,1,1) = {" aa @@ -3570,7 +3569,7 @@ hp hp hp hp -hp +kx hp hp hp diff --git a/maps/templates/baseone.dmm b/maps/templates/baseone.dmm index c054c2310164..80962bf165c5 100644 --- a/maps/templates/baseone.dmm +++ b/maps/templates/baseone.dmm @@ -504,7 +504,7 @@ /turf/open/floor/almayer/blue/north, /area/adminlevel/bunker01/hydroponics) "bD" = ( -/obj/structure/machinery/hydro_floodlight, +/obj/structure/machinery/colony_floodlight, /turf/open/floor/almayer/blue/northeast, /area/adminlevel/bunker01/hydroponics) "bE" = ( diff --git a/maps/templates/basetwo.dmm b/maps/templates/basetwo.dmm index 890d433cb575..1051f515c96d 100644 --- a/maps/templates/basetwo.dmm +++ b/maps/templates/basetwo.dmm @@ -896,7 +896,7 @@ /turf/open/floor/almayer/blue/north, /area/adminlevel/bunker01/hydroponics) "df" = ( -/obj/structure/machinery/hydro_floodlight, +/obj/structure/machinery/colony_floodlight, /turf/open/floor/almayer/blue/northeast, /area/adminlevel/bunker01/hydroponics) "dg" = ( diff --git a/sound/effects/sebb.ogg b/sound/effects/sebb.ogg new file mode 100644 index 000000000000..5fd1f5b396d9 Binary files /dev/null and b/sound/effects/sebb.ogg differ diff --git a/sound/effects/sebb_beep.ogg b/sound/effects/sebb_beep.ogg new file mode 100644 index 000000000000..16c9347d0be2 Binary files /dev/null and b/sound/effects/sebb_beep.ogg differ diff --git a/sound/effects/sebb_explode.ogg b/sound/effects/sebb_explode.ogg new file mode 100644 index 000000000000..999385d9f068 Binary files /dev/null and b/sound/effects/sebb_explode.ogg differ diff --git a/tgui/packages/tgui/interfaces/Orbit/index.tsx b/tgui/packages/tgui/interfaces/Orbit/index.tsx index 6b7089915514..36ceb6359cde 100644 --- a/tgui/packages/tgui/interfaces/Orbit/index.tsx +++ b/tgui/packages/tgui/interfaces/Orbit/index.tsx @@ -158,6 +158,10 @@ const marineSplitter = (members: Array) => { const charlieSquad: Array = []; const deltaSquad: Array = []; const foxtrotSquad: Array = []; + const echoSquad: Array = []; + const CBRNSquad: Array = []; + const FORECONSquad: Array = []; + const SOFSquad: Array = []; const other: Array = []; members.forEach((x) => { @@ -171,6 +175,14 @@ const marineSplitter = (members: Array) => { deltaSquad.push(x); } else if (x.job?.includes('Foxtrot')) { foxtrotSquad.push(x); + } else if (x.job?.includes('Echo')) { + echoSquad.push(x); + } else if (x.job?.includes('CBRN')) { + CBRNSquad.push(x); + } else if (x.job?.includes('FORECON')) { + FORECONSquad.push(x); + } else if (x.job?.includes('SOF')) { + SOFSquad.push(x); } else { other.push(x); } @@ -181,7 +193,11 @@ const marineSplitter = (members: Array) => { buildSquadObservable('Bravo', 'yellow', bravoSquad), buildSquadObservable('Charlie', 'purple', charlieSquad), buildSquadObservable('Delta', 'blue', deltaSquad), - buildSquadObservable('Foxtrot', 'teal', foxtrotSquad), + buildSquadObservable('Foxtrot', 'brown', foxtrotSquad), + buildSquadObservable('Echo', 'teal', echoSquad), + buildSquadObservable('CBRN', 'dark-blue', CBRNSquad), + buildSquadObservable('FORECON', 'green', FORECONSquad), + buildSquadObservable('SOF', 'red', SOFSquad), buildSquadObservable('Other', 'grey', other), ]; return squads; diff --git a/tgui/packages/tgui/interfaces/StaffWho.jsx b/tgui/packages/tgui/interfaces/StaffWho.jsx new file mode 100644 index 000000000000..1ce71c9b5001 --- /dev/null +++ b/tgui/packages/tgui/interfaces/StaffWho.jsx @@ -0,0 +1,78 @@ +import { useBackend } from '../backend'; +import { Button, Collapsible, Stack } from '../components'; +import { Window } from '../layouts'; + +export const StaffWho = (props, context) => { + const { data } = useBackend(context); + const { admin, administrators } = data; + + return ( + + + {administrators !== undefined ? ( + + + {administrators.map((x, index) => ( + + {x.admins.map((x, index) => ( + + ))} + + ))} + + + ) : null} + + + ); +}; + +const StaffWhoCollapsible = (props, context) => { + const { title, color, children } = props; + return ( + + {children} + + ); +}; + +const GetAdminInfo = (props, context) => { + const { admin, content, color, text } = props; + return admin ? ( + + ) : ( + + ); +}; diff --git a/tgui/packages/tgui/interfaces/Who.jsx b/tgui/packages/tgui/interfaces/Who.jsx new file mode 100644 index 000000000000..dccf3d1e39f0 --- /dev/null +++ b/tgui/packages/tgui/interfaces/Who.jsx @@ -0,0 +1,189 @@ +import { useBackend, useLocalState } from '../backend'; +import { + Box, + Button, + Collapsible, + Icon, + Input, + Section, + Stack, +} from '../components'; +import { Window } from '../layouts'; + +export const Who = (props, context) => { + const { act, data } = useBackend(context); + const { + admin, + all_clients, + total_players = [], + additional_info = [], + factions = [], + xenomorphs = [], + } = data; + + const [searchQuery, setSearchQuery] = useLocalState('searchQuery', ''); + + const searchPlayers = () => + total_players.filter((player) => isMatch(player, searchQuery)); + + const filteredTotalPlayers = searchPlayers(); + + return ( + + + + +
+ + + + + + + act('get_player_panel', { + ckey: searchPlayers()?.[0].ckey, + }) + } + onInput={(e) => setSearchQuery(e.target.value)} + placeholder="Search..." + value={searchQuery} + /> + + +
+
+ +
+ + {filteredTotalPlayers.length ? ( + + {filteredTotalPlayers.map((x) => ( + + ))} + + ) : null} + +
+ {admin !== 0 ? ( +
+ + + {additional_info.length + ? additional_info.map((x, index) => ( + + )) + : null} + {factions.length + ? factions.map((x, index) => ( + + )) + : null} + {xenomorphs.length + ? xenomorphs.map((x, index) => ( + + )) + : null} + + +
+ ) : null} +
+
+
+
+ ); +}; + +const WhoCollapsible = (props, context) => { + const { title, color, children } = props; + return ( + + {children} + + ); +}; + +const GetAddInfo = (props, context) => { + const { act } = useBackend(context); + const { content, color, text } = props; + + return ( + + ); +}; + +const GetPlayerInfo = (props, context) => { + const { act } = useBackend(context); + const { + admin, + player: { ckey, ckey_color, color, text }, + } = props; + return admin !== 0 ? ( + + ) : ( + + ); +}; + +const isMatch = (player, searchQuery) => { + if (!searchQuery) { + return true; + } + + return ( + player.ckey.toLowerCase().includes(searchQuery?.toLowerCase()) || false + ); +};