diff --git a/code/__DEFINES/xeno_ai.dm b/code/__DEFINES/xeno_ai.dm index a132aa28ed..52bb4f0c91 100644 --- a/code/__DEFINES/xeno_ai.dm +++ b/code/__DEFINES/xeno_ai.dm @@ -7,15 +7,15 @@ #define OPEN_TURF_PENALTY 1 #define DOOR_PENALTY 3 -#define OBJECT_PENALTY 20 #define HUMAN_PENALTY 4 #define XENO_PENALTY 20 -#define VEHICLE_PENALTY 25 +#define OBJECT_PENALTY 20 +#define FIRE_PENALTY 25 #define SENTRY_PENALTY 25 +#define VEHICLE_PENALTY 25 #define WINDOW_FRAME_PENALTY 25 #define BARRICADE_PENALTY 50 #define WALL_PENALTY 50 -#define FIRE_PENALTY 25 /* PROBABILITY CALCULATIONS ARE HERE @@ -90,7 +90,7 @@ PROBABILITY CALCULATIONS ARE HERE /// Special blockers for pathfinding or obstacle handling -#define XENO_AI_SPECIAL_BLOCKERS list(/obj/flamer_fire, /obj/vehicle/multitile, /turf/open/space) +#define XENO_AI_SPECIAL_BLOCKERS list(/obj/flamer_fire, /obj/vehicle/multitile, /turf/open/space, /turf/open/gm/river) // Friend-or-foe universal check #define IS_SAME_HIVENUMBER(A,B) (A.hivenumber == B.hivenumber) diff --git a/code/__HELPERS/unsorted.dm b/code/__HELPERS/unsorted.dm index c443a49ba1..60fa224ef8 100644 --- a/code/__HELPERS/unsorted.dm +++ b/code/__HELPERS/unsorted.dm @@ -318,7 +318,7 @@ var/obj/item/card/id/ID = A if(ID.registered_name == oldname) ID.registered_name = newname - ID.name = "[newname]'s ID Card ([ID.assignment])" + ID.name = "[newname]'s [ID.card_name] ([ID.assignment])" if(!search_pda) break search_id = 0 return 1 diff --git a/code/controllers/subsystem/pathfinding.dm b/code/controllers/subsystem/pathfinding.dm index dfd66ae201..05301a4191 100644 --- a/code/controllers/subsystem/pathfinding.dm +++ b/code/controllers/subsystem/pathfinding.dm @@ -129,10 +129,11 @@ SUBSYSTEM_DEF(xeno_pathfinding) /datum/controller/subsystem/xeno_pathfinding/proc/check_special_blockers(mob/living/carbon/xenomorph/xeno, turf/checking_turf) var/list/pass_back = list() - pass_back += (checking_turf.type in XENO_AI_SPECIAL_BLOCKERS) ? checking_turf : list() + for(var/spec_blocker in XENO_AI_SPECIAL_BLOCKERS) + pass_back += istype(checking_turf, spec_blocker) ? checking_turf : list() - for(var/atom/checked_atom as anything in checking_turf) - pass_back += (checked_atom.type in XENO_AI_SPECIAL_BLOCKERS) ? checked_atom : list() + for(var/atom/checked_atom as anything in checking_turf) + pass_back += istype(checked_atom, spec_blocker) ? checked_atom : list() return pass_back diff --git a/code/datums/ammo/bullet/pistol.dm b/code/datums/ammo/bullet/pistol.dm index 8edb66857d..488b4e22c8 100644 --- a/code/datums/ammo/bullet/pistol.dm +++ b/code/datums/ammo/bullet/pistol.dm @@ -182,9 +182,10 @@ accuracy = HIT_ACCURACY_TIER_2 damage = 50 - penetration = ARMOR_PENETRATION_TIER_4 - shrapnel_chance = SHRAPNEL_CHANCE_TIER_2 - damage_falloff = DAMAGE_FALLOFF_TIER_3 //"VP78 - the only pistol viable as a primary."-Vampmare, probably. + penetration = ARMOR_PENETRATION_TIER_2 + shrapnel_chance = SHRAPNEL_CHANCE_TIER_1 + effective_range_max = 3 //hopefully this fixes the damage woes. + damage_falloff = DAMAGE_FALLOFF_TIER_6 /datum/ammo/bullet/pistol/squash/toxin name = "toxic squash-head pistol bullet" diff --git a/code/game/jobs/job/marine/squads.dm b/code/game/jobs/job/marine/squads.dm index 028dd70ec1..27fb293daa 100644 --- a/code/game/jobs/job/marine/squads.dm +++ b/code/game/jobs/job/marine/squads.dm @@ -360,7 +360,7 @@ continue marine_card.assignment = "[new_name] [marine.job]" - marine_card.name = "[marine_card.registered_name]'s ID Card ([marine_card.assignment])" + marine_card.name = "[marine_card.registered_name]'s [marine_card.card_name] ([marine_card.assignment])" /datum/squad/proc/setup_supply_drop_list() SIGNAL_HANDLER @@ -607,7 +607,7 @@ if(paygrade) C.paygrade = paygrade - C.name = "[C.registered_name]'s ID Card ([C.assignment])" + C.name = "[C.registered_name]'s [C.card_name] ([C.assignment])" var/obj/item/device/radio/headset/almayer/marine/headset = locate() in list(M.wear_l_ear, M.wear_r_ear) if(headset && radio_freq) @@ -629,7 +629,7 @@ C.access -= src.access C.assignment = M.assigned_equipment_preset.assignment - C.name = "[C.registered_name]'s ID Card ([C.assignment])" + C.name = "[C.registered_name]'s [C.card_name] ([C.assignment])" forget_marine_in_squad(M) diff --git a/code/game/machinery/doors/poddoor.dm b/code/game/machinery/doors/poddoor.dm index a4455a988a..562a589c78 100644 --- a/code/game/machinery/doors/poddoor.dm +++ b/code/game/machinery/doors/poddoor.dm @@ -7,7 +7,6 @@ var/base_icon_state = "pdoor" id = 1 dir = NORTH - unslashable = TRUE health = 0 layer = PODDOOR_CLOSED_LAYER open_layer = PODDOOR_OPEN_LAYER @@ -253,13 +252,11 @@ name = "" icon = null icon_state = "" - unslashable = TRUE unacidable = TRUE /obj/structure/machinery/door/poddoor/two_tile/four_tile/secure icon = 'icons/obj/structures/doors/1x4blast_hor_secure.dmi' openspeed = 17 - unslashable = TRUE unacidable = TRUE /obj/structure/machinery/door/poddoor/two_tile/four_tile/secure/opened @@ -268,7 +265,6 @@ /obj/structure/machinery/door/poddoor/two_tile/four_tile/vertical/secure icon = 'icons/obj/structures/doors/1x4blast_vert_secure.dmi' openspeed = 17 - unslashable = TRUE unacidable = TRUE /obj/structure/machinery/door/poddoor/two_tile/four_tile/vertical/secure/open @@ -286,7 +282,6 @@ /obj/structure/machinery/door/poddoor/two_tile/secure icon = 'icons/obj/structures/doors/1x2blast_hor.dmi' openspeed = 17 - unslashable = TRUE unacidable = TRUE /obj/structure/machinery/door/poddoor/two_tile/vertical/secure @@ -325,7 +320,6 @@ addtimer(CALLBACK(src, TYPE_PROC_REF(/atom, relativewall_neighbours)), 10) /obj/structure/machinery/door/poddoor/almayer/locked - unslashable = TRUE unacidable = TRUE /obj/structure/machinery/door/poddoor/almayer/locked/attackby(obj/item/C as obj, mob/user as mob) diff --git a/code/game/objects/items/cards_ids.dm b/code/game/objects/items/cards_ids.dm index b6ce8b11ca..2b6ae446d8 100644 --- a/code/game/objects/items/cards_ids.dm +++ b/code/game/objects/items/cards_ids.dm @@ -92,6 +92,8 @@ var/modification_log = list() + var/card_name = "ID Card" + /obj/item/card/id/Initialize(mapload, ...) . = ..() @@ -132,7 +134,7 @@ /obj/item/card/id/proc/set_assignment(new_assignment) assignment = new_assignment - name = "[registered_name]'s ID Card ([assignment])" + name = "[registered_name]'s [card_name] ([assignment])" /obj/item/card/id/GetAccess() return access @@ -279,7 +281,7 @@ else registered_name = "Agent Card" assignment = "Agent" - name = "[registered_name]'s ID Card ([assignment])" + name = "[registered_name]'s [card_name] ([assignment])" /obj/item/card/id/syndicate/afterattack(obj/item/O as obj, mob/user as mob, proximity) if(!proximity) return @@ -304,7 +306,7 @@ src.registered_name = "" return src.assignment = u - src.name = "[src.registered_name]'s ID Card ([src.assignment])" + src.name = "[src.registered_name]'s [card_name] ([src.assignment])" to_chat(user, SPAN_NOTICE(" You successfully forge the ID card.")) registered_user = user else if(!registered_user || registered_user == user) @@ -324,7 +326,7 @@ alert("Invalid assignment.") return src.assignment = u - src.name = "[src.registered_name]'s ID Card ([src.assignment])" + src.name = "[src.registered_name]'s [card_name] ([src.assignment])" to_chat(user, SPAN_NOTICE(" You successfully forge the ID card.")) return if("Show") @@ -387,6 +389,7 @@ item_state = "dogtag" pinned_on_uniform = FALSE var/dogtag_taken = FALSE + card_name = "dog tags" /obj/item/card/id/dogtag/get_examine_text(mob/user) diff --git a/code/game/objects/items/weapons/blades.dm b/code/game/objects/items/weapons/blades.dm index 2fe80f123b..6d8c8f7231 100644 --- a/code/game/objects/items/weapons/blades.dm +++ b/code/game/objects/items/weapons/blades.dm @@ -273,8 +273,6 @@ if(loc != user) //Only do unique stuff if you are holding it return ..() - if(!do_after(user, interaction_time, INTERRUPT_INCAPACITATED, BUSY_ICON_HOSTILE)) - return playsound(user, 'sound/weapons/flipblade.ogg', 15, 1) change_razor_state(!razor_opened) to_chat(user, SPAN_NOTICE("You [razor_opened ? "reveal" : "hide"] [src]'s blade.")) @@ -375,3 +373,29 @@ human_user.apply_damage(rand(1,5), BRUTE, "head", src) human_user.update_hair() +/obj/item/weapon/straight_razor/attack(mob/target, mob/user) + if((!ishuman(target)) || (user.a_intent == INTENT_HARM) || !razor_opened) + return ..() + var/mob/living/carbon/human/poor_bastard = target + + var/timer = 10 SECONDS + var/message = "\The [user] begins to shave \the [poor_bastard]!" + if(skillcheck(user, SKILL_LEADERSHIP, SKILL_LEAD_EXPERT)) + timer = 5 SECONDS + message = "\The [user] begins to expertly shave \the [poor_bastard]!" + + user.visible_message(SPAN_WARNING(message)) + if(!do_after(user, timer, INTERRUPT_ALL, BUSY_ICON_HOSTILE)) + return + + switch(user.zone_selected) + if("mouth") + poor_bastard.f_style = "Shaved" + user.visible_message(SPAN_WARNING("\The [user] shaves off \the [poor_bastard]'s facial hair!")) + if("head") + poor_bastard.h_style = pick("Skinhead", "Bald") + user.visible_message(SPAN_WARNING("\The [user] shaves off \the [poor_bastard]'s hair!")) + + poor_bastard.apply_damage(rand(1,5), BRUTE, "head", src) + poor_bastard.update_hair() + return TRUE diff --git a/code/modules/admin/game_master/game_master.dm b/code/modules/admin/game_master/game_master.dm index c6ad9063c7..947c49aeb5 100644 --- a/code/modules/admin/game_master/game_master.dm +++ b/code/modules/admin/game_master/game_master.dm @@ -58,6 +58,7 @@ GLOBAL_VAR_INIT(radio_communication_clarity, 100) var/list/submenu_types = list( /obj/structure/pipes/vents = /datum/game_master_submenu/ambush/vents, /obj/structure/tunnel = /datum/game_master_submenu/ambush/tunnels, + /mob/living/carbon/human = /datum/game_master_submenu/infest, ) /// List of current submenus diff --git a/code/modules/admin/game_master/game_master_submenu/infest.dm b/code/modules/admin/game_master/game_master_submenu/infest.dm new file mode 100644 index 0000000000..4d64e66e0b --- /dev/null +++ b/code/modules/admin/game_master/game_master_submenu/infest.dm @@ -0,0 +1,97 @@ +#define DEFAULT_SPAWN_HIVE_STRING XENO_HIVE_NORMAL + +/datum/game_master_submenu/infest + tgui_menu_name = "GameMasterSubmenuInfest" + tgui_menu_title = "Infest Control" + + /// Current selected hive for the embryo + var/selected_hive = DEFAULT_SPAWN_HIVE_STRING + + /// Target growth stage for the embryo + var/embryo_stage = 0 + +/datum/game_master_submenu/infest/ui_data(mob/user) + . = ..() + + var/list/data = list() + + data["selected_hive"] = selected_hive + data["embryo_stage"] = embryo_stage + + return data + +/datum/game_master_submenu/infest/ui_static_data(mob/user) + . = ..() + + var/list/data = list() + + data["selectable_hives"] = ALL_XENO_HIVES + + return data + +/datum/game_master_submenu/infest/ui_act(action, list/params, datum/tgui/ui, datum/ui_state/state) + . = ..() + + switch(action) + if("set_selected_hive") + selected_hive = params["new_hive"] + return TRUE + + if("set_embryo_stage") + embryo_stage = params["stage"] + return TRUE + + if("infest") + setup_embryo() + return TRUE + + if("clear_infest") + remove_embryo() + return TRUE + + if("burst") + force_burst() + return TRUE + +/datum/game_master_submenu/infest/proc/setup_embryo() + var/obj/item/alien_embryo/infesting_embryo + for(var/obj/item/alien_embryo/embryo in referenced_atom) //if this hive's embryo already exists, convert to larva and use it + if(embryo.hivenumber == selected_hive) + infesting_embryo = embryo + else + qdel(embryo) + + if(!infesting_embryo) //else, make a new one + infesting_embryo = new /obj/item/alien_embryo(referenced_atom) + infesting_embryo.hivenumber = selected_hive + + var/mob/living/carbon/human/infested_host = referenced_atom + infested_host.species?.larva_impregnated(infesting_embryo) //Yautja handling + + infesting_embryo.stage = embryo_stage + +/datum/game_master_submenu/infest/proc/remove_embryo() + for(var/obj/item/alien_embryo/embryo in referenced_atom) + qdel(embryo) + +/datum/game_master_submenu/infest/proc/force_burst() + var/mob/living/carbon/xenomorph/larva/infesting_larva = locate() in referenced_atom //if a larva already exists, use it + if(infesting_larva) + infesting_larva.chest_burst(referenced_atom) + return + + for(var/obj/item/alien_embryo/embryo in referenced_atom) //else if this hive's embryo already exists, convert to larva and use it + if(embryo.hivenumber == selected_hive) + embryo.become_larva() + infesting_larva = locate() in referenced_atom + break + if(infesting_larva) + infesting_larva.chest_burst(referenced_atom) + return + + infesting_larva = new /mob/living/carbon/xenomorph/larva(referenced_atom, null, selected_hive) //else, make a new larva + var/mob/living/carbon/human/infested_host = referenced_atom + infesting_larva.ckey = infested_host.ckey + infesting_larva.chest_burst(referenced_atom) + +#undef DEFAULT_SPAWN_HIVE_STRING diff --git a/code/modules/admin/verbs/select_equipment.dm b/code/modules/admin/verbs/select_equipment.dm index b684fc0d6f..83a9cb1a06 100644 --- a/code/modules/admin/verbs/select_equipment.dm +++ b/code/modules/admin/verbs/select_equipment.dm @@ -22,7 +22,7 @@ I.access = J.get_access() I.rank = J.title I.assignment = J.disp_title - I.name = "[I.registered_name]'s ID Card ([I.assignment])" + I.name = "[I.registered_name]'s [I.card_name] ([I.assignment])" I.paygrade = J.get_paygrade() if(H.w_uniform) var/obj/item/clothing/C = H.w_uniform @@ -81,7 +81,7 @@ I.rank = IDtitle I.assignment = IDtitle - I.name = "[I.registered_name]'s ID Card ([I.assignment])" + I.name = "[I.registered_name]'s [I.card_name] ([I.assignment])" var/new_faction = tgui_input_list(usr, "Select faction.", "Faction Choice", FACTION_LIST_HUMANOID) if(!new_faction) diff --git a/code/modules/client/preferences_gear.dm b/code/modules/client/preferences_gear.dm index 232464ade4..0607f83ff6 100644 --- a/code/modules/client/preferences_gear.dm +++ b/code/modules/client/preferences_gear.dm @@ -114,9 +114,25 @@ var/global/list/gear_datums_by_name = list() display_name = "Face wrap, tan" path = /obj/item/clothing/mask/rebreather/scarf/tacticalmask/tan -/datum/gear/mask/face_wrap_squad - display_name = "Face wrap, squad specific" - path =/obj/item/clothing/mask/rebreather/scarf/tacticalmask/squad +/datum/gear/mask/face_wrap_intel + display_name = "Face wrap, black" + path = /obj/item/clothing/mask/rebreather/scarf/tacticalmask/intel + +/datum/gear/mask/face_wrap_bravo + display_name = "Face wrap, yellow" + path = /obj/item/clothing/mask/rebreather/scarf/tacticalmask/bravo + +/datum/gear/mask/face_wrap_charlie + display_name = "Face wrap, purple" + path = /obj/item/clothing/mask/rebreather/scarf/tacticalmask/charlie + +/datum/gear/mask/face_wrap_delta + display_name = "Face wrap, blue" + path = /obj/item/clothing/mask/rebreather/scarf/tacticalmask/delta + +/datum/gear/mask/face_wrap_echo + display_name = "Face wrap, cyan green" + path = /obj/item/clothing/mask/rebreather/scarf/tacticalmask/echo /datum/gear/mask/gas display_name = "Gas mask" @@ -207,10 +223,6 @@ var/global/list/gear_datums_by_name = list() display_name = "USCM beanie, tan" path = /obj/item/clothing/head/beanie/tan -/datum/gear/headwear/uscm/beret_squad - display_name = "USCM beret, squad specific" - path = /obj/item/clothing/head/beret/cm/squadberet - /datum/gear/headwear/uscm/beret_green display_name = "USCM beret, green" path = /obj/item/clothing/head/beret/cm @@ -227,6 +239,34 @@ var/global/list/gear_datums_by_name = list() display_name = "USCM beret, white" path = /obj/item/clothing/head/beret/cm/white +/datum/gear/headwear/uscm/beret_alpha + display_name = "USCM beret, red flash" + path = /obj/item/clothing/head/beret/cm/alpha + +/datum/gear/headwear/uscm/beret_bravo + display_name = "USCM beret, yellow flash" + path = /obj/item/clothing/head/beret/cm/bravo + +/datum/gear/headwear/uscm/beret_charlie + display_name = "USCM beret, purple flash" + path = /obj/item/clothing/head/beret/cm/charlie + +/datum/gear/headwear/uscm/beret_delta + display_name = "USCM beret, blue flash" + path = /obj/item/clothing/head/beret/cm/delta + +/datum/gear/headwear/uscm/beret_echo + display_name = "USCM beret, green flash" + path = /obj/item/clothing/head/beret/cm/echo + +/datum/gear/headwear/uscm/beret_foxtrot + display_name = "USCM beret, brown flash" + path = /obj/item/clothing/head/beret/cm/foxtrot + +/datum/gear/headwear/uscm/beret_intel + display_name = "USCM beret, black flash" + path = /obj/item/clothing/head/beret/cm/intel + /datum/gear/headwear/uscm/boonie_olive display_name = "USCM boonie hat, olive" path = /obj/item/clothing/head/cmcap/boonie @@ -259,9 +299,25 @@ var/global/list/gear_datums_by_name = list() display_name = "USCM headband, tan" path = /obj/item/clothing/head/headband/tan -/datum/gear/headwear/uscm/headband_squad - display_name = "USCM headband, squad specific" - path = /obj/item/clothing/head/headband/squad +/datum/gear/headwear/uscm/headband_intel + display_name = "USCM headband, black" + path = /obj/item/clothing/head/headband/intel + +/datum/gear/headwear/uscm/headband_bravo + display_name = "USCM headband, orange" + path = /obj/item/clothing/head/headband/bravo + +/datum/gear/headwear/uscm/headband_charlie + display_name = "USCM headband, purple" + path = /obj/item/clothing/head/headband/charlie + +/datum/gear/headwear/uscm/headband_delta + display_name = "USCM headband, blue" + path = /obj/item/clothing/head/headband/delta + +/datum/gear/headwear/uscm/headband_echo + display_name = "USCM headband, cyan green" + path = /obj/item/clothing/head/headband/echo /datum/gear/headwear/uscm/headset display_name = "USCM headset" diff --git a/code/modules/clothing/gloves/marine_gloves.dm b/code/modules/clothing/gloves/marine_gloves.dm index bdbfc1c0b5..f12876f389 100644 --- a/code/modules/clothing/gloves/marine_gloves.dm +++ b/code/modules/clothing/gloves/marine_gloves.dm @@ -3,7 +3,7 @@ /obj/item/clothing/gloves/marine name = "marine combat gloves" - desc = "Standard issue marine tactical gloves. It reads: 'knit by Marine Widows Association'." + desc = "Standard USCMC issue combat gloves, reinforced against small sharp objects, and even insulated from electric shock. Very uncomfortable." icon_state = "black" item_state = "black" siemens_coefficient = 0 @@ -47,14 +47,14 @@ /obj/item/clothing/gloves/marine/brown name = "marine brown combat gloves" - desc = "Standard issue marine tactical gloves. It reads: 'knit by Marine Widows Association'. These are brown instead of the classic black." + desc = "USCMC issue combat gloves, now in brown rather than black, reinforced against small sharp objects, and even insulated from electric shock. Very uncomfortable." icon_state = "brown" item_state = "brown" adopts_squad_color = FALSE /obj/item/clothing/gloves/marine/medical name = "marine medical combat gloves" - desc = "Standard issue marine sterile gloves, offers regular protection whilst offering the user a better grip when performing medical work." + desc = "Special USCMC issue to hospital corpsmen or other field medical workers. Offers protection from shock and cuts while also improving one's grip on medical tools. Unlike the regular gloves, these are relatively comfortable to wear." icon_state = "latex" item_state = "lgloves" adopts_squad_color = FALSE @@ -116,7 +116,7 @@ /obj/item/clothing/gloves/marine/veteran name = "armored gloves" - desc = "Non-standard kevlon fiber gloves. They're insulated and heavily armored." + desc = "Non-standard para-aramid fiber gloves. They're insulated and heavily armored." icon_state = "veteran" item_state = "veteran" siemens_coefficient = 0 @@ -135,7 +135,7 @@ /obj/item/clothing/gloves/marine/veteran/insulated name = "insulated armored gloves" - desc = "Non-standard kevlon fiber gloves. These are apparently ESPECIALLY insulated." + desc = "Non-standard para-aramid fiber gloves. These are apparently ESPECIALLY insulated." icon_state = "insulated" item_state = "insulated" @@ -143,7 +143,7 @@ name = "\improper WY PMC gloves" icon_state = "pmc" item_state = "pmc" - desc = "Standard issue kevlon fiber gloves manufactured for and by Weyland-Yutani PMC dispatch division. They are insulated against electrical shock." + desc = "Standard issue venlar protected gloves manufactured for and by Weyland-Yutani for their PMC teams. Features a special polymer that insulates from electric shock." /obj/item/clothing/gloves/marine/veteran/pmc/commando name = "\improper M5X gauntlets" diff --git a/code/modules/clothing/head/head.dm b/code/modules/clothing/head/head.dm index d1743a6c4f..1c9f7ea929 100644 --- a/code/modules/clothing/head/head.dm +++ b/code/modules/clothing/head/head.dm @@ -81,50 +81,33 @@ /obj/item/clothing/head/beret/cm/black icon_state = "beret_black" -/obj/item/clothing/head/beret/cm/squadberet - name = "USCM Squad Beret" - desc = "For those who want to show pride and have nothing to lose (in their head, at least)." +/obj/item/clothing/head/beret/cm/alpha + desc = "Often found atop heads, slightly less found on those still attached." + icon_state = "beret_alpha" -/obj/item/clothing/head/beret/cm/squadberet/equipped(mob/user, slot) - . = ..() - self_set() - RegisterSignal(user, COMSIG_SET_SQUAD, PROC_REF(self_set), TRUE) +/obj/item/clothing/head/beret/cm/bravo + desc = "It has quite a lot of debris on it, the person wearing this probably moves less than a wall." + icon_state = "beret_bravo" -/obj/item/clothing/head/beret/cm/squadberet/dropped(mob/user) - . = ..() - UnregisterSignal(user, COMSIG_SET_SQUAD) - -/obj/item/clothing/head/beret/cm/squadberet/proc/self_set() - var/mob/living/carbon/human/H = loc - if(istype(H)) - if(H.assigned_squad) - switch(H.assigned_squad.name) - if(SQUAD_MARINE_2) - icon_state = "beret_bravo" - desc = "It has quite a lot of debris on it, the person wearing this probably moves less than a wall." - if(SQUAD_MARINE_3) - icon_state = "beret_charlie" - desc = "Still has some morning toast crumbs on it." - if(SQUAD_MARINE_4) - icon_state = "beret_delta" - desc = "Hard to consider protection, but these types of people don't seek protection." - if(SQUAD_MARINE_5) - icon_state = "beret_echo" - desc = "Tightly Woven, as it should be." - if(SQUAD_MARINE_CRYO) - icon_state = "beret_foxtrot" - desc = "Looks and feels starched, cold to the touch." - if(SQUAD_MARINE_INTEL) - icon_state = "beret_intel" - desc = "Looks more intellegent than the person wearing it." - - if(H.assigned_squad.name == GLOB.main_platoon_name) - icon_state = "beret_alpha" - desc = "Often found atop heads, slightly less found on those still attached." - else - icon_state = "beret" - desc = initial(desc) - H.update_inv_head() +/obj/item/clothing/head/beret/cm/charlie + desc = "Still has some morning toast crumbs on it." + icon_state = "beret_charlie" + +/obj/item/clothing/head/beret/cm/delta + desc = "Hard to consider protection, but these types of people don't seek protection." + icon_state = "beret_delta" + +/obj/item/clothing/head/beret/cm/echo + desc = "Tightly Woven, as it should be." + icon_state = "beret_echo" + +/obj/item/clothing/head/beret/cm/foxtrot + desc = "Looks and feels starched, cold to the touch." + icon_state = "beret_foxtrot" + +/obj/item/clothing/head/beret/cm/intel + desc = "Looks more intellegent than the person wearing it." + icon_state = "beret_intel" /obj/item/clothing/head/headband @@ -157,50 +140,33 @@ desc = "A headband made from a simple strip of cloth. The words \"DOWN WITH TYRANTS\" are emblazoned on the front." icon_state = "rebelband" -/obj/item/clothing/head/headband/squad - var/dummy_icon_state = "headband%SQUAD%" +/obj/item/clothing/head/headband/alpha + desc = "A bright red headband made out of durable cloth. it seems brand new, yet to see any wear" + icon_state = "headbandalpha" - var/static/list/valid_icon_states +/obj/item/clothing/head/headband/bravo + desc = "An orangish yellow headband made out of durable cloth. this one stained with sweat and dust from manual labor" + icon_state = "headbandbravo" -/obj/item/clothing/head/headband/squad/Initialize(mapload, ...) - . = ..() - if(!valid_icon_states) - valid_icon_states = icon_states(icon) - adapt_to_squad() +/obj/item/clothing/head/headband/charlie + desc = "A purple headband made out of durable cloth. this one smells of jealousy and breakfast" + icon_state = "headbandcharlie" -/obj/item/clothing/head/headband/squad/proc/update_clothing_wrapper(mob/living/carbon/human/wearer) - SIGNAL_HANDLER +/obj/item/clothing/head/headband/delta + desc = "A blue headband made out of durable cloth. just wearing it makes you want to recklessly charge the enemy" + icon_state = "headbanddelta" - var/is_worn_by_wearer = recursive_holder_check(src) == wearer - if(is_worn_by_wearer) - update_clothing_icon() - else - UnregisterSignal(wearer, COMSIG_SET_SQUAD) // we can't set this in dropped, because dropping into a helmet unsets it and then it never updates +/obj/item/clothing/head/headband/echo + desc = "A sea green headband made out of durable cloth. its color has been washed out from many long sneaking missions and raids behind enemy lines" + icon_state = "headbandecho" -/obj/item/clothing/head/headband/squad/update_clothing_icon() - adapt_to_squad() - if(istype(loc, /obj/item/storage/internal) && istype(loc.loc, /obj/item/clothing/head/helmet)) - var/obj/item/clothing/head/helmet/headwear = loc.loc - headwear.update_icon() - return ..() +/obj/item/clothing/head/headband/foxtrot + desc = "A brown headband made out of durable cloth. it is still cold to the touch from years of cryosleep" + icon_state = "headbandfoxtrot" -/obj/item/clothing/head/headband/squad/pickup(mob/user, silent) - . = ..() - adapt_to_squad() - -/obj/item/clothing/head/headband/squad/equipped(mob/user, slot, silent) - RegisterSignal(user, COMSIG_SET_SQUAD, PROC_REF(update_clothing_wrapper), TRUE) - adapt_to_squad() - return ..() - -/obj/item/clothing/head/headband/squad/proc/adapt_to_squad() - var/squad_color = "Delta" - var/mob/living/carbon/human/wearer = recursive_holder_check(src) - if(istype(wearer) && wearer.assigned_squad) - var/squad_name = lowertext(wearer.assigned_squad.name) - if("headband[squad_name]" in valid_icon_states) - squad_color = squad_name - icon_state = replacetext(initial(dummy_icon_state), "%SQUAD%", squad_color) +/obj/item/clothing/head/headband/intel + desc = "A black headband made out of durable cloth. wearing this makes you feel like a secret agent." + icon_state = "headbandintel" /obj/item/clothing/head/headband/rambo desc = "It flutters in the face of the wind, defiant and unrestrained, like the man who wears it." @@ -258,7 +224,13 @@ /obj/item/clothing/head/headband/red = "hat_headbandred", /obj/item/clothing/head/headband/brown = "hat_headbandbrown", /obj/item/clothing/head/headband/gray = "hat_headbandgray", - /obj/item/clothing/head/headband/squad = HAT_GARB_RELAY_ICON_STATE, + /obj/item/clothing/head/headband/alpha = "hat_headbandalpha", + /obj/item/clothing/head/headband/bravo = "hat_headbandbravo", + /obj/item/clothing/head/headband/charlie = "hat_headbandcharlie", + /obj/item/clothing/head/headband/delta = "hat_headbanddelta", + /obj/item/clothing/head/headband/echo = "hat_headbandecho", + /obj/item/clothing/head/headband/foxtrot = "hat_headbandfoxtrot", + /obj/item/clothing/head/headband/foxtrot = "hat_headbandintel", /obj/item/prop/helmetgarb/lucky_feather = "lucky_feather", /obj/item/prop/helmetgarb/lucky_feather/blue = "lucky_feather_blue", /obj/item/prop/helmetgarb/lucky_feather/purple = "lucky_feather_purple", diff --git a/code/modules/clothing/head/helmet.dm b/code/modules/clothing/head/helmet.dm index db17b808dc..372c4844d5 100644 --- a/code/modules/clothing/head/helmet.dm +++ b/code/modules/clothing/head/helmet.dm @@ -314,7 +314,13 @@ GLOBAL_LIST_INIT(allowed_helmet_items, list( /obj/item/clothing/head/headband/red = "headbandred", /obj/item/clothing/head/headband/brown = "helmet_headbandbrown", /obj/item/clothing/head/headband/gray = "helmet_headbandgray", - /obj/item/clothing/head/headband/squad = HELMET_GARB_RELAY_ICON_STATE, + /obj/item/clothing/head/headband/alpha = "helmet_headbandalpha", + /obj/item/clothing/head/headband/bravo = "helmet_headbandbravo", + /obj/item/clothing/head/headband/charlie = "helmet_headbandcharlie", + /obj/item/clothing/head/headband/delta = "helmet_headbanddelta", + /obj/item/clothing/head/headband/echo = "helmet_headbandecho", + /obj/item/clothing/head/headband/foxtrot = "helmet_headbandfoxtrot", + /obj/item/clothing/head/headband/foxtrot = "helmet_headbandintel", /obj/item/tool/candle = "candle", /obj/item/clothing/mask/facehugger/lamarr = "lamarr", /obj/item/toy/crayon/red = "crayonred", diff --git a/code/modules/clothing/masks/breath.dm b/code/modules/clothing/masks/breath.dm index ffdda93f8a..db57f4db38 100644 --- a/code/modules/clothing/masks/breath.dm +++ b/code/modules/clothing/masks/breath.dm @@ -154,47 +154,40 @@ item_state = "scarf_black" original_state = "scarf_black" -/obj/item/clothing/mask/rebreather/scarf/tacticalmask/squad - var/dummy_icon_state = "scarf_%SQUAD%" - item_state = "scarf_%SQUAD%" - original_state = "scarf_%SQUAD%" - - - var/static/list/valid_icon_states - -/obj/item/clothing/mask/rebreather/scarf/tacticalmask/squad/Initialize(mapload, ...) - . = ..() - if(!valid_icon_states) - valid_icon_states = icon_states(icon) - adapt_to_squad() - -/obj/item/clothing/mask/rebreather/scarf/tacticalmask/squad/update_clothing_icon() - adapt_to_squad() - return ..() - -/obj/item/clothing/mask/rebreather/scarf/tacticalmask/squad/pickup(mob/user, silent) - . = ..() - adapt_to_squad() - -/obj/item/clothing/mask/rebreather/scarf/tacticalmask/squad/equipped(mob/user, slot, silent) - RegisterSignal(user, COMSIG_SET_SQUAD, PROC_REF(update_clothing_icon), TRUE) - adapt_to_squad() - return ..() - -/obj/item/clothing/mask/rebreather/scarf/tacticalmask/squad/dropped(mob/user) - . = ..() - UnregisterSignal(user, COMSIG_SET_SQUAD) - -/obj/item/clothing/mask/rebreather/scarf/tacticalmask/squad/proc/adapt_to_squad() - var/squad_color = "gray" - var/mob/living/carbon/human/wearer = loc - if(istype(wearer) && wearer.assigned_squad) - var/squad_name = lowertext(wearer.assigned_squad.name) - if("scarf_[squad_name]" in valid_icon_states) - squad_color = squad_name - icon_state = replacetext("[initial(dummy_icon_state)][pulled ? "_down" : ""]", "%SQUAD%", squad_color) - item_state = replacetext("[initial(item_state)][pulled ? "_down" : ""]", "%SQUAD%", squad_color) - +/obj/item/clothing/mask/rebreather/scarf/tacticalmask/alpha + icon_state = "scarf_alpha" + item_state = "scarf_alpha" + original_state = "scarf_alpha" + +/obj/item/clothing/mask/rebreather/scarf/tacticalmask/bravo + icon_state = "scarf_bravo" + item_state = "scarf_bravo" + original_state = "scarf_bravo" + +/obj/item/clothing/mask/rebreather/scarf/tacticalmask/charlie + icon_state = "scarf_charlie" + item_state = "scarf_charlie" + original_state = "scarf_charlie" + +/obj/item/clothing/mask/rebreather/scarf/tacticalmask/delta + icon_state = "scarf_delta" + item_state = "scarf_delta" + original_state = "scarf_delta" + +/obj/item/clothing/mask/rebreather/scarf/tacticalmask/echo + icon_state = "scarf_echo" + item_state = "scarf_echo" + original_state = "scarf_echo" + +/obj/item/clothing/mask/rebreather/scarf/tacticalmask/foxtrot + icon_state = "scarf_foxtrot" + item_state = "scarf_foxtrot" + original_state = "scarf_foxtrot" + +/obj/item/clothing/mask/rebreather/scarf/tacticalmask/intel + icon_state = "scarf_black" + item_state = "scarf_black" + original_state = "scarf_black" /obj/item/clothing/mask/tornscarf name = "tactical scarf" diff --git a/code/modules/clothing/suits/armor.dm b/code/modules/clothing/suits/armor.dm index 82d461c5ca..f9edccf774 100644 --- a/code/modules/clothing/suits/armor.dm +++ b/code/modules/clothing/suits/armor.dm @@ -28,7 +28,7 @@ /obj/item/clothing/suit/armor/vest name = "armored vest" - desc = "An armored vest that protects against some damage." + desc = "Generic venlar bulletproof vest found in the hands of various private sector security types." icon_state = "armor" item_state = "armor" blood_overlay_type = "armor" @@ -58,7 +58,7 @@ /obj/item/clothing/suit/armor/vest/pilot name = "\improper M70 flak jacket" - desc = "A flak jacket used by dropship pilots to protect themselves while flying in the cockpit. Excels in protecting the wearer against high-velocity solid projectiles." + desc = "Venlar flak jacket worn by combat support personnel such as dropship crew, or occasionally by smartgunners. Despite the name it's actually better at stopping ballistics..." icon = 'icons/obj/items/clothing/cm_suits.dmi' icon_state = "pilot" blood_overlay_type = "armor" @@ -118,7 +118,7 @@ /obj/item/clothing/suit/armor/vest/security name = "Wey-Yu security armor" - desc = "An armored vest that protects against some damage. This one has a Weyland-Yutani corporate badge." + desc = "Generic venlar bulletproof vest found in the hands of various private sector security types. This one has a Weyland-Yutani corporate badge." icon_state = "armorsec" item_state = "armor" flags_armor_protection = BODY_FLAG_CHEST|BODY_FLAG_GROIN diff --git a/code/modules/clothing/suits/marine_armor.dm b/code/modules/clothing/suits/marine_armor.dm index 15c3bef21f..0ac2106e9d 100644 --- a/code/modules/clothing/suits/marine_armor.dm +++ b/code/modules/clothing/suits/marine_armor.dm @@ -32,7 +32,7 @@ /obj/item/clothing/suit/storage/marine name = "\improper M3 pattern marine armor" - desc = "A standard Colonial Marines M3 Pattern Chestplate. Protects the chest from ballistic rounds, bladed objects and accidents. It has a small leather pouch strapped to it for limited storage." + desc = "Standard USCMC issue M3 Pattern Personal Armor. Composite ballistic armor, integral biomonitoring system, and brackets for the IMP system as well as the TNR Shoulder Lamp. \nHas some extra pouches on the sides for storage." icon = 'icons/obj/items/clothing/cm_suits.dmi' icon_state = "1" item_state = "marine_armor" //Make unique states for Officer & Intel armors. @@ -376,7 +376,7 @@ /obj/item/clothing/suit/storage/marine/smartgunner name = "\improper M56 combat harness" - desc = "A heavy protective vest designed to be worn with the M56 Smartgun System. \nIt has specially designed straps and reinforcement to carry the Smartgun and accessories." + desc = "Lightweight vest composed of ballistic micromesh and a ceramic composite chestplate. Also contains the computers, straps, and bracing required for operating the M56 Smartgun itself." icon_state = "8" item_state = "armor" armor_laser = CLOTHING_ARMOR_LOW @@ -440,7 +440,7 @@ /obj/item/clothing/suit/storage/marine/leader name = "\improper B12 pattern marine armor" - desc = "A lightweight suit of carbon fiber body armor built for quick movement. Designed in a lovely forest green. Use it to toggle the built-in flashlight." + desc = "Semi-experimental body armor system similar to M3, incorporating primarily carbon fiber instead of boron carbide. \nDesigned in a lovely olive green, slightly improved protection against blunt impact and biological hazards." icon_state = "7" armor_melee = CLOTHING_ARMOR_MEDIUMHIGH armor_bomb = CLOTHING_ARMOR_MEDIUM @@ -450,7 +450,7 @@ /obj/item/clothing/suit/storage/marine/tanker name = "\improper M3 pattern tanker armor" - desc = "A modified and refashioned suit of M3 Pattern armor designed to be worn by the loader of a USCM vehicle crew. While the suit is a bit more encumbering to wear with the crewman uniform, it offers the loader a degree of protection that would otherwise not be enjoyed." + desc = "Armored vest sometimes worn by USCMC armor crews. More bulky than a flak vest or service jacket, but substantially improved protection should the wearer need to dismount." icon_state = "tanker" uniform_restricted = list(/obj/item/clothing/under/marine/officer/tanker) specialty = "M3 pattern tanker" @@ -570,10 +570,9 @@ flags_atom = NO_SNOW_TYPE|NO_NAME_OVERRIDE /obj/item/clothing/suit/storage/marine/heavy - name = "\improper M3-EOD pattern heavy armor" - desc = "A heavier version of the standard M3 pattern armor, the armor is primarily designed to withstand ballistic, explosive, and internal damage, with the drawback of increased bulk and thus reduced movement speed, alongside little additional protection from standard blunt force impacts and biological threats." - desc_lore = "This configuration of the iconic armor was developed during the Canton War in 2160 between the UPP and USCM - Designed in response to a need for higher protection for ComTechs assigned as EODs during the conflict, this is the pinnacle of protection for your average marine. The shoulders and kneepads have both been expanded upon heavily, covering up the arteries on each limb. A special spall liner was developed for this suit, with the same technology being used in the M70 Flak Jacket being developed at the same time." - specialty = "\improper M3-EOD pattern" + name = "\improper M3-H pattern heavy armor" + desc = "M3 armor vest with a rheological liner behind the chestplate, additional armor over the limbs to improve protection ballistic and blast protections. \nMarginal improvement in other areas, and the mass of the extra plates degrades agility, especially in null-gee." + specialty = "\improper M3-H pattern" icon_state = "H1" armor_variation = 6 armor_melee = CLOTHING_ARMOR_MEDIUMHIGH diff --git a/code/modules/clothing/under/marine_uniform.dm b/code/modules/clothing/under/marine_uniform.dm index 6420d724e7..ea73409af6 100644 --- a/code/modules/clothing/under/marine_uniform.dm +++ b/code/modules/clothing/under/marine_uniform.dm @@ -4,7 +4,7 @@ /obj/item/clothing/under/marine name = "\improper USCM uniform" - desc = "Standard-issue Marine uniform. They have shards of light Kevlar to help protect against stabbing weapons and bullets." + desc = "Standard-issue Marine uniform, with venlar armor inserts at critical areas to protect from blades and ballistics." siemens_coefficient = 0.9 icon_state = "marine_jumpsuit" worn_state = "marine_jumpsuit" @@ -53,7 +53,7 @@ /obj/item/clothing/under/marine/medic name = "\improper USCM corpsman uniform" - desc = "Standard-issue Marine hospital corpsman fatigues. They have shards of light Kevlar to help protect against stabbing weapons and bullets." + desc = "Standard-issue Marine hospital corpsman fatigues with venlar armor inserts at critical areas to protect from blades and ballistics." icon_state = "marine_medic" worn_state = "marine_medic" specialty = "USCM Hospital Corpsman" @@ -176,7 +176,7 @@ /obj/item/clothing/under/marine/officer/pilot name = "pilot officer bodysuit" - desc = "A bodysuit worn by pilot officers of the USCM, and is meant for survival in inhospitable conditions. Fly the marines onwards to glory. It has shards of light Kevlar to help protect against stabbing weapons and bullets." + desc = "A bodysuit worn by pilot officers of the USCM, good for operating express elevators to hell. Some armor protection provided by the venlar armor weave against shrapnel and ballistics." icon_state = "pilot_flightsuit" item_state = "pilot_flightsuit" worn_state = "pilot_flightsuit" @@ -206,7 +206,7 @@ /obj/item/clothing/under/marine/officer/tanker name = "vehicle crewman uniform" - desc = "A uniform worn by vehicle crewmen of the USCM. Do the corps proud. It has shards of light Kevlar to help protect against stabbing weapons and bullets." + desc = "Armored vehicle crew uniform worn by tankers and cav crew of the USCMC. Shrapnel protection provided by venlar panels, badassery hinges on how well the operator works their vehicle. Do the Corps proud." icon_state = "marine_tanker" worn_state = "marine_tanker" suit_restricted = list(/obj/item/clothing/suit/storage/marine/tanker, /obj/item/clothing/suit/storage/jacket/marine/service/tanker) @@ -451,7 +451,7 @@ /obj/item/clothing/under/marine/veteran/marsoc name = "SOF Uniform" - desc = "A black uniform for elite Marine personnel. Designed to be comfortable and help blend into dark enviorments." + desc = "MARSOC standard uniform, in a dark camouflage pattern. Venlar liners provide slight protection from ballistics or blades." flags_jumpsuit = UNIFORM_SLEEVE_ROLLABLE icon_state = "marsoc" worn_state = "marsoc" diff --git a/code/modules/cm_marines/equipment/guncases.dm b/code/modules/cm_marines/equipment/guncases.dm index 9a21d0317b..7184827fda 100644 --- a/code/modules/cm_marines/equipment/guncases.dm +++ b/code/modules/cm_marines/equipment/guncases.dm @@ -229,7 +229,7 @@ storage_slots = 2 /obj/item/storage/box/guncase/pumpshotgun/special/fill_preset_inventory() - new /obj/item/weapon/gun/shotgun/pump(src) + new /obj/item/weapon/gun/shotgun/pump/special(src) new /obj/item/ammo_magazine/shotgun/buckshot/special(src) /obj/item/storage/box/guncase/mk45_automag diff --git a/code/modules/cm_marines/marines_consoles.dm b/code/modules/cm_marines/marines_consoles.dm index 734972ac7b..14911faf85 100644 --- a/code/modules/cm_marines/marines_consoles.dm +++ b/code/modules/cm_marines/marines_consoles.dm @@ -137,7 +137,7 @@ if(target_id_card) if(target_id_card.registered_name != origin_name || target_id_card.assignment != origin_assignment) GLOB.data_core.manifest_modify(target_id_card.registered_name, target_id_card.registered_ref, target_id_card.assignment, target_id_card.rank) - target_id_card.name = text("[target_id_card.registered_name]'s ID Card ([target_id_card.assignment])") + target_id_card.name = text("[target_id_card.registered_name]'s [target_id_card.card_name] ([target_id_card.assignment])") if(target_id_card.registered_name != origin_name) log_idmod(target_id_card, " [key_name_admin(usr)] changed the registered name of the ID to '[target_id_card.registered_name]'. ") if(target_id_card.assignment != origin_assignment) @@ -451,7 +451,7 @@ usr.put_in_hands(target_id_card) if(operable()) // Powered. Make comp proceed ejection GLOB.data_core.manifest_modify(target_id_card.registered_name, target_id_card.registered_ref, target_id_card.assignment, target_id_card.rank) - target_id_card.name = text("[target_id_card.registered_name]'s ID Card ([target_id_card.assignment])") + target_id_card.name = text("[target_id_card.registered_name]'s [target_id_card.card_name] ([target_id_card.assignment])") visible_message("[SPAN_BOLD("[src]")] states, \"CARD EJECT: Data imprinted. Updating database... Success.\"") else to_chat(usr, "You remove \the [target_id_card] from \the [src].") diff --git a/code/modules/gear_presets/_select_equipment.dm b/code/modules/gear_presets/_select_equipment.dm index ce47c0ffec..6aefa9a673 100644 --- a/code/modules/gear_presets/_select_equipment.dm +++ b/code/modules/gear_presets/_select_equipment.dm @@ -111,7 +111,7 @@ if(!idtype) return var/obj/item/card/id/ID = new idtype() - ID.name = "[new_human.real_name]'s ID Card" + ID.name = "[new_human.real_name]'s [ID.card_name]" if(assignment) ID.name += " ([assignment])" ID.access = access.Copy(1, 0) diff --git a/code/modules/gear_presets/dust_raider.dm b/code/modules/gear_presets/dust_raider.dm index e6464d5608..78fea23a77 100644 --- a/code/modules/gear_presets/dust_raider.dm +++ b/code/modules/gear_presets/dust_raider.dm @@ -89,7 +89,6 @@ new_human.equip_to_slot_or_del(new /obj/item/storage/belt/gun/smartgunner/full(new_human), WEAR_WAIST) new_human.equip_to_slot_or_del(new /obj/item/clothing/head/helmet/marine(new_human), WEAR_HEAD) new_human.equip_to_slot_or_del(new /obj/item/storage/pouch/magazine/large/pmc_m39(new_human), WEAR_L_STORE) - new_human.equip_to_slot_or_del(new /obj/item/clothing/glasses/night/m56_goggles(new_human), WEAR_EYES) //*****************************************************************************************************/ diff --git a/code/modules/gear_presets/pmc.dm b/code/modules/gear_presets/pmc.dm index 25c68e389f..1fb3f15a79 100644 --- a/code/modules/gear_presets/pmc.dm +++ b/code/modules/gear_presets/pmc.dm @@ -1006,7 +1006,6 @@ list("POUCHES (CHOOSE 2)", 0, null, null, null), new_human.equip_to_slot_or_del(new /obj/item/storage/pouch/magazine/pistol/large/vp78, WEAR_R_STORE) new_human.equip_to_slot_or_del(new /obj/item/storage/pouch/firstaid/full, WEAR_L_STORE) new_human.equip_to_slot_or_del(new /obj/item/storage/belt/gun/smartgunner/pmc/full, WEAR_WAIST) - new_human.equip_to_slot_or_del(new /obj/item/clothing/glasses/night/m56_goggles, WEAR_EYES) /datum/equipment_preset/pmc/pmc_gunner/get_antag_clothing_equipment() return list( diff --git a/code/modules/gear_presets/uscm.dm b/code/modules/gear_presets/uscm.dm index a2308e8c7e..1e64a30e17 100644 --- a/code/modules/gear_presets/uscm.dm +++ b/code/modules/gear_presets/uscm.dm @@ -216,7 +216,6 @@ new_human.equip_to_slot_or_del(new /obj/item/storage/belt/gun/smartgunner/full(new_human), WEAR_WAIST) new_human.equip_to_slot_or_del(new /obj/item/clothing/shoes/marine/knife(new_human), WEAR_FEET) new_human.equip_to_slot_or_del(new /obj/item/clothing/gloves/marine(new_human), WEAR_HANDS) - new_human.equip_to_slot_or_del(new /obj/item/clothing/glasses/night/m56_goggles(new_human), WEAR_EYES) /datum/equipment_preset/uscm/sg/full/load_status(mob/living/carbon/human/new_human) return //No cryo munchies @@ -304,6 +303,55 @@ spawn_weapon(/obj/item/weapon/gun/smg/m39, /obj/item/ammo_magazine/smg/m39/extended, new_human, 0, 3) /*****************************************************************************************************/ + +/datum/equipment_preset/uscm/tank/recon + name = "USCM Reconnaissance Vehicle Operator (CRMN)" + flags = EQUIPMENT_PRESET_EXTRA|EQUIPMENT_PRESET_MARINE + + assignment = "Reconnaissance Vehicle Operator" + role_comm_title = "RVO" + paygrade = "ME5" + + utility_under = list(/obj/item/clothing/under/marine/officer/tanker) + +/datum/equipment_preset/uscm/tank/recon/load_gear(mob/living/carbon/human/new_human) + var/obj/item/clothing/under/marine/officer/tanker/uniform = new() + var/obj/item/clothing/accessory/patch/patch_uscm = new() + var/obj/item/clothing/accessory/patch/forecon/patch_forecon = new() + uniform.attach_accessory(new_human,patch_uscm) + uniform.attach_accessory(new_human,patch_forecon) + new_human.equip_to_slot_or_del(new /obj/item/device/radio/headset/almayer/sof(new_human), WEAR_L_EAR) + new_human.equip_to_slot_or_del(uniform, WEAR_BODY) + new_human.equip_to_slot_or_del(new /obj/item/clothing/shoes/marine/jungle/knife(new_human), WEAR_FEET) + new_human.equip_to_slot_or_del(new /obj/item/clothing/gloves/marine/brown(new_human), WEAR_HANDS) + new_human.equip_to_slot_or_del(new /obj/item/storage/belt/gun/m44/gunslinger/full(new_human), WEAR_WAIST) + new_human.equip_to_slot_or_del(new /obj/item/clothing/suit/storage/marine/tanker(new_human), WEAR_JACKET) + new_human.equip_to_slot_or_del(new /obj/item/storage/fancy/cigarettes/lucky_strikes(new_human), WEAR_IN_JACKET) + new_human.equip_to_slot_or_del(new /obj/item/tool/weldingtool/simple(new_human), WEAR_IN_JACKET) + new_human.equip_to_slot_or_del(new /obj/item/storage/backpack/general_belt/standard(new_human), WEAR_J_STORE) + new_human.equip_to_slot_or_del(new /obj/item/reagent_container/food/snacks/packaged_burger(new_human), WEAR_IN_J_STORE) + new_human.equip_to_slot_or_del(new /obj/item/reagent_container/food/snacks/wy_chips/pepper(new_human), WEAR_IN_J_STORE) + new_human.equip_to_slot_or_del(new /obj/item/reagent_container/food/snacks/wrapped/chunk(new_human), WEAR_IN_J_STORE) + new_human.equip_to_slot_or_del(new /obj/item/reagent_container/food/drinks/cans/cola(new_human), WEAR_IN_J_STORE) + new_human.equip_to_slot_or_del(new /obj/item/reagent_container/food/drinks/cans/cola(new_human), WEAR_IN_J_STORE) + new_human.equip_to_slot_or_del(new /obj/item/storage/backpack/marine/engineerpack/welder_chestrig(new_human), WEAR_BACK) + new_human.equip_to_slot_or_del(new /obj/item/tool/weldpack/minitank(new_human), WEAR_IN_BACK) + new_human.equip_to_slot_or_del(new /obj/item/tool/shovel/etool/folded(new_human), WEAR_IN_BACK) + new_human.equip_to_slot_or_del(new /obj/item/stack/sandbags_empty/full(new_human), WEAR_IN_BACK) + new_human.equip_to_slot_or_del(new /obj/item/storage/pouch/tools/tank(new_human), WEAR_R_STORE) + new_human.equip_to_slot_or_del(new /obj/item/storage/pouch/magazine/pistol/large(new_human), WEAR_L_STORE) + new_human.equip_to_slot_or_del(new /obj/item/ammo_magazine/revolver/marksman(new_human), WEAR_IN_L_STORE) + new_human.equip_to_slot_or_del(new /obj/item/ammo_magazine/revolver/marksman(new_human), WEAR_IN_L_STORE) + new_human.equip_to_slot_or_del(new /obj/item/ammo_magazine/revolver/marksman(new_human), WEAR_IN_L_STORE) + new_human.equip_to_slot_or_del(new /obj/item/ammo_magazine/revolver/marksman(new_human), WEAR_IN_L_STORE) + new_human.equip_to_slot_or_del(new /obj/item/ammo_magazine/revolver/marksman(new_human), WEAR_IN_L_STORE) + new_human.equip_to_slot_or_del(new /obj/item/ammo_magazine/revolver/marksman(new_human), WEAR_IN_L_STORE) + new_human.equip_to_slot_or_del(new /obj/item/clothing/head/cmcap(new_human), WEAR_HEAD) + new_human.equip_to_slot_or_del(new /obj/item/clothing/glasses/welding(new_human), WEAR_EYES) + new_human.equip_to_slot_or_del(new /obj/item/clothing/mask/cigarette/ucigarette(new_human), WEAR_FACE) + +/*****************************************************************************************************/ + /datum/equipment_preset/uscm/spec name = "USCM (Cryo) Squad Weapons Specialist" flags = EQUIPMENT_PRESET_EXTRA|EQUIPMENT_PRESET_MARINE @@ -702,7 +750,6 @@ new_human.equip_to_slot_or_del(new /obj/item/storage/belt/gun/smartgunner/full(new_human), WEAR_WAIST) new_human.equip_to_slot_or_del(new /obj/item/clothing/head/helmet/marine(new_human), WEAR_HEAD) new_human.equip_to_slot_or_del(new /obj/item/device/radio/headset/almayer/marine/cryo(new_human), WEAR_L_EAR) - new_human.equip_to_slot_or_del(new /obj/item/clothing/glasses/night/m56_goggles(new_human), WEAR_EYES) /datum/equipment_preset/uscm/smartgunner_equipped/cryo name = "USCM Cryo Squad Smartgunner (Equipped)" diff --git a/code/modules/gear_presets/uscm_ship.dm b/code/modules/gear_presets/uscm_ship.dm index 5e838406eb..b89708e5af 100644 --- a/code/modules/gear_presets/uscm_ship.dm +++ b/code/modules/gear_presets/uscm_ship.dm @@ -756,6 +756,49 @@ //*****************************************************************************************************/ +/datum/equipment_preset/uscm_ship/po/recon + name = "USCM Reconnaissance Pilot" + flags = EQUIPMENT_PRESET_EXTRA|EQUIPMENT_PRESET_MARINE + assignment = "Reconnaissance Pilot" + + utility_under = list(/obj/item/clothing/under/marine/officer/pilot/flight) + +/datum/equipment_preset/uscm_ship/po/recon/load_gear(mob/living/carbon/human/new_human) + var/back_item = /obj/item/storage/backpack/satchel + var/obj/item/clothing/under/marine/officer/pilot/flight/uniform = new() + var/obj/item/clothing/suit/storage/jacket/marine/pilot/jacket = new() + var/obj/item/clothing/accessory/patch/patch_uscm = new() + var/obj/item/clothing/accessory/patch/forecon/patch_forecon = new() + uniform.attach_accessory(new_human,patch_uscm) + uniform.attach_accessory(new_human,patch_forecon) + jacket.attach_accessory(new_human,patch_uscm) + jacket.attach_accessory(new_human,patch_forecon) + new_human.equip_to_slot_or_del(new /obj/item/device/radio/headset/almayer/sof(new_human), WEAR_L_EAR) + new_human.equip_to_slot_or_del(uniform, WEAR_BODY) + new_human.equip_to_slot_or_del(jacket, WEAR_JACKET) + new_human.equip_to_slot_or_del(new /obj/item/clothing/shoes/marine/knife(new_human), WEAR_FEET) + new_human.equip_to_slot_or_del(new /obj/item/clothing/gloves/marine(new_human), WEAR_HANDS) + new_human.equip_to_slot_or_del(new /obj/item/storage/belt/medical/lifesaver/standard/full(new_human), WEAR_WAIST) + new_human.equip_to_slot_or_del(new /obj/item/device/flashlight, WEAR_J_STORE) + new_human.equip_to_slot_or_del(new back_item(new_human), WEAR_BACK) + new_human.equip_to_slot_or_del(new /obj/item/storage/firstaid/adv(new_human), WEAR_IN_BACK) + new_human.equip_to_slot_or_del(new /obj/item/reagent_container/blood/OMinus(new_human), WEAR_IN_BACK) + new_human.equip_to_slot_or_del(new /obj/item/tool/surgery/synthgraft(new_human), WEAR_IN_BACK) + new_human.equip_to_slot_or_del(new /obj/item/tool/surgery/surgical_line(new_human), WEAR_IN_BACK) + new_human.equip_to_slot_or_del(new /obj/item/device/healthanalyzer(new_human), WEAR_IN_JACKET) + new_human.equip_to_slot_or_del(new /obj/item/storage/surgical_case/regular(new_human), WEAR_IN_JACKET) + new_human.equip_to_slot_or_del(new /obj/item/storage/pouch/pistol(new_human), WEAR_L_STORE) + new_human.equip_to_slot_or_del(new /obj/item/weapon/gun/pistol/m1911/socom(new_human), WEAR_IN_L_STORE) + new_human.equip_to_slot_or_del(new /obj/item/storage/pouch/magazine/pistol(new_human), WEAR_R_STORE) + new_human.equip_to_slot_or_del(new /obj/item/ammo_magazine/pistol/m1911(new_human), WEAR_IN_R_STORE) + new_human.equip_to_slot_or_del(new /obj/item/ammo_magazine/pistol/m1911(new_human), WEAR_IN_R_STORE) + new_human.equip_to_slot_or_del(new /obj/item/ammo_magazine/pistol/m1911(new_human), WEAR_IN_R_STORE) + new_human.equip_to_slot_or_del(new /obj/item/clothing/head/cmcap/bridge(new_human), WEAR_HEAD) + new_human.equip_to_slot_or_del(new /obj/item/clothing/glasses/hud/health(new_human), WEAR_EYES) + new_human.equip_to_slot_or_del(new /obj/item/clothing/glasses/sunglasses/big(new_human), WEAR_FACE) + +//*****************************************************************************************************/ + /datum/equipment_preset/uscm_ship/dcc name = "USCM Dropship Crew Chief (DCC) (Cryo)" flags = EQUIPMENT_PRESET_START_OF_ROUND|EQUIPMENT_PRESET_MARINE diff --git a/code/modules/gear_presets/wo.dm b/code/modules/gear_presets/wo.dm index c52d25d255..1b92d36c8d 100644 --- a/code/modules/gear_presets/wo.dm +++ b/code/modules/gear_presets/wo.dm @@ -704,7 +704,6 @@ new_human.equip_to_slot_or_del(new /obj/item/storage/belt/gun/smartgunner/full(new_human), WEAR_WAIST) new_human.equip_to_slot_or_del(new /obj/item/clothing/head/helmet/marine(new_human), WEAR_HEAD) new_human.equip_to_slot_or_del(new /obj/item/storage/pouch/firstaid/full(new_human), WEAR_L_STORE) - new_human.equip_to_slot_or_del(new /obj/item/clothing/glasses/night/m56_goggles(new_human), WEAR_EYES) add_common_wo_equipment(new_human) diff --git a/code/modules/mob/living/carbon/xenomorph/Xenomorph.dm b/code/modules/mob/living/carbon/xenomorph/Xenomorph.dm index 078ad96536..33ed75f36e 100644 --- a/code/modules/mob/living/carbon/xenomorph/Xenomorph.dm +++ b/code/modules/mob/living/carbon/xenomorph/Xenomorph.dm @@ -732,6 +732,13 @@ +/mob/living/carbon/xenomorph/Moved(atom/oldloc, direction, Forced) + . = ..() + if(!client) // We are not, in fact, counted steps for AI xeno in /client/Move() + life_steps_total++ + + + /mob/living/carbon/xenomorph/slip(slip_source_name, stun_level, weaken_level, run_only, override_noslip, slide_steps) return FALSE diff --git a/code/modules/mob/living/carbon/xenomorph/abilities/crusher/crusher_abilities.dm b/code/modules/mob/living/carbon/xenomorph/abilities/crusher/crusher_abilities.dm index 418393afd5..a8ce0e60c1 100644 --- a/code/modules/mob/living/carbon/xenomorph/abilities/crusher/crusher_abilities.dm +++ b/code/modules/mob/living/carbon/xenomorph/abilities/crusher/crusher_abilities.dm @@ -280,10 +280,10 @@ noise_timer = noise_timer ? --noise_timer : 3 if(noise_timer == 3) - playsound(xeno, 'sound/effects/alien_footstep_charge1.ogg', 50) + playsound(xeno, 'sound/effects/alien_footstep_charge1.ogg', 100) - for(var/mob/living/carbon/human/Mob in range(10, xeno)) - shake_camera(Mob, 2, 1) + for(var/mob/living/carbon/human/Mob in range(14, xeno)) + shake_camera(Mob, 2, 2) for(var/mob/living/carbon/human/Mob in xeno.loc) if(Mob.body_position == LYING_DOWN && Mob.stat != DEAD) @@ -309,6 +309,8 @@ continue shake_camera(hit_human, 4, 2) + if(hit_human.buckled) + hit_human.buckled.unbuckle() INVOKE_ASYNC(GLOBAL_PROC, GLOBAL_PROC_REF(xeno_throw_human), hit_human, xeno, get_dir(xeno, hit_human), 1, FALSE) to_chat(hit_human, SPAN_XENOHIGHDANGER("You fall backwards as [xeno] gives you a glancing blow!")) hit_human.take_overall_armored_damage(momentum * 4) diff --git a/code/modules/mob/living/carbon/xenomorph/abilities/crusher/crusher_powers.dm b/code/modules/mob/living/carbon/xenomorph/abilities/crusher/crusher_powers.dm index ca313a69ef..b5dc656d87 100644 --- a/code/modules/mob/living/carbon/xenomorph/abilities/crusher/crusher_powers.dm +++ b/code/modules/mob/living/carbon/xenomorph/abilities/crusher/crusher_powers.dm @@ -109,6 +109,7 @@ if (!check_and_use_plasma_owner()) return + playsound(get_turf(xeno_owner), 'sound/voice/alien_crusher_spawn.ogg', 75) apply_cooldown() ADD_TRAIT(xeno_owner, TRAIT_IMMOBILIZED, TRAIT_SOURCE_ABILITY("Stomp")) @@ -122,7 +123,7 @@ REMOVE_TRAIT(xeno_owner, TRAIT_IMMOBILIZED, TRAIT_SOURCE_ABILITY("Stomp")) xeno_owner.anchored = FALSE - playsound(get_turf(xeno_owner), 'sound/effects/bang.ogg', 25, 0) + playsound(get_turf(xeno_owner), 'sound/effects/alien_footstep_charge3.ogg', 75) xeno_owner.visible_message(SPAN_XENODANGER("[xeno_owner] smashes into the ground!"), SPAN_XENODANGER("You smash into the ground!")) xeno_owner.create_stomp() diff --git a/code/modules/mob/living/carbon/xenomorph/ai/movement/base_define.dm b/code/modules/mob/living/carbon/xenomorph/ai/movement/base_define.dm index 172461bfce..4eaff010c2 100644 --- a/code/modules/mob/living/carbon/xenomorph/ai/movement/base_define.dm +++ b/code/modules/mob/living/carbon/xenomorph/ai/movement/base_define.dm @@ -45,7 +45,7 @@ if(idle_xeno.move_to_next_turf(home_turf, home_locate_range)) if(get_dist(home_turf, idle_xeno) <= 0) - idle_xeno.set_resting(TRUE, FALSE, TRUE) + idle_xeno.set_resting(TRUE, FALSE) else home_turf = null diff --git a/code/modules/mob/living/carbon/xenomorph/ai/xeno_ai.dm b/code/modules/mob/living/carbon/xenomorph/ai/xeno_ai.dm index 2c522b58d2..cf951007be 100644 --- a/code/modules/mob/living/carbon/xenomorph/ai/xeno_ai.dm +++ b/code/modules/mob/living/carbon/xenomorph/ai/xeno_ai.dm @@ -338,14 +338,24 @@ #undef EXTRA_CHECK_DISTANCE_MULTIPLIER -/mob/living/carbon/proc/ai_can_target(mob/living/carbon/xenomorph/ai_xeno) - if(!ai_check_stat(ai_xeno)) +/mob/living/carbon/proc/ai_can_target(mob/living/carbon/xenomorph/X) + if(!ai_check_stat(X)) return FALSE - if(ai_xeno.can_not_harm(src)) + if(X.can_not_harm(src)) return FALSE - if(alpha <= 45 && get_dist(ai_xeno, src) > 2) + if(alpha <= 45 && get_dist(X, src) > 2) + return FALSE + + if(isfacehugger(X)) + if(status_flags & XENO_HOST) + return FALSE + + if(istype(wear_mask, /obj/item/clothing/mask/facehugger)) + return FALSE + + else if(HAS_TRAIT(src, TRAIT_NESTED)) return FALSE return TRUE diff --git a/code/modules/mob/living/carbon/xenomorph/castes/Crusher.dm b/code/modules/mob/living/carbon/xenomorph/castes/Crusher.dm index d326a4d061..780a46ca12 100644 --- a/code/modules/mob/living/carbon/xenomorph/castes/Crusher.dm +++ b/code/modules/mob/living/carbon/xenomorph/castes/Crusher.dm @@ -81,13 +81,19 @@ /mob/living/carbon/xenomorph/crusher/Initialize(mapload, mob/living/carbon/xenomorph/oldXeno, h_number, ai_hard_off = FALSE) . = ..() + AddComponent(/datum/component/footstep, 2, 50, 15, 1, "metalbang") - playsound(src, 'sound/voice/alien_crusher_spawn.ogg', 100, FALSE, 30) + playsound(src, 'sound/voice/alien_death_unused.ogg', 100, TRUE, 30) for(var/mob/current_mob as anything in get_mobs_in_z_level_range(get_turf(src), 30) - src) var/relative_dir = get_dir(current_mob, src) var/final_dir = dir2text(relative_dir) to_chat(current_mob, SPAN_HIGHDANGER("You hear a terrible roar coming from [final_dir ? "the [final_dir]" : "nearby"] as the ground shakes!")) +/mob/living/carbon/xenomorph/crusher/death(cause, gibbed) + . = ..() + playsound(src, 'sound/voice/alien_crusher_death.ogg', 50, FALSE, 15) + + // Refactored to handle all of crusher's interactions with object during charge. /mob/living/carbon/xenomorph/proc/handle_collision(atom/target) if(!target) diff --git a/code/modules/mob/living/carbon/xenomorph/xeno_ai_interaction.dm b/code/modules/mob/living/carbon/xenomorph/xeno_ai_interaction.dm index 5aaf3b0684..177cd07433 100644 --- a/code/modules/mob/living/carbon/xenomorph/xeno_ai_interaction.dm +++ b/code/modules/mob/living/carbon/xenomorph/xeno_ai_interaction.dm @@ -122,6 +122,7 @@ At bare minimum, make sure the relevant checks from parent types gets copied in return + ///////////////////////////// // MOBS // ///////////////////////////// @@ -155,16 +156,6 @@ At bare minimum, make sure the relevant checks from parent types gets copied in if(species.flags & IS_SYNTHETIC) return FALSE - if(HAS_TRAIT(src, TRAIT_NESTED)) - return FALSE - - if(isfacehugger(X)) - if(status_flags & XENO_HOST) - return FALSE - - if(istype(wear_mask, /obj/item/clothing/mask/facehugger)) - return FALSE - return TRUE /mob/living/carbon/human/ai_check_stat(mob/living/carbon/xenomorph/X) @@ -228,7 +219,7 @@ At bare minimum, make sure the relevant checks from parent types gets copied in if(!.) return - return VEHICLE_PENALTY + return SENTRY_PENALTY ///////////////////////////// @@ -239,13 +230,6 @@ At bare minimum, make sure the relevant checks from parent types gets copied in return ..() return WINDOW_FRAME_PENALTY -/obj/structure/barricade/handrail/xeno_ai_obstacle(mob/living/carbon/xenomorph/X, direction, turf/target) - . = ..() - if(!.) - return - - return DOOR_PENALTY - ///////////////////////////// // BARRICADES // @@ -257,6 +241,13 @@ At bare minimum, make sure the relevant checks from parent types gets copied in return BARRICADE_PENALTY +/obj/structure/barricade/handrail/xeno_ai_obstacle(mob/living/carbon/xenomorph/X, direction, turf/target) + . = ..() + if(!.) + return + + return DOOR_PENALTY + ///////////////////////////// // FIRE // @@ -268,6 +259,17 @@ At bare minimum, make sure the relevant checks from parent types gets copied in return FIRE_PENALTY +///////////////////////////// +// WALLS // +///////////////////////////// +/turf/closed/wall/resin/xeno_ai_obstacle(mob/living/carbon/xenomorph/xeno, direction, turf/target) + . = ..() + if(!.) + return + + return WALL_PENALTY + + ///////////////////////////// // FLOOR // ///////////////////////////// @@ -282,6 +284,11 @@ At bare minimum, make sure the relevant checks from parent types gets copied in return OPEN_TURF_PENALTY +/// For now there is no attack_alien() proc overrides on any child of /turf/open +/// Also, we don't want xenos swiping all around - forbit the clicking! +/turf/open/xeno_ai_act(mob/living/carbon/xenomorph/X) + return FALSE + /// Space, do NOT path into space. /turf/open/space/xeno_ai_obstacle(mob/living/carbon/xenomorph/X, direction, turf/target) . = ..() @@ -289,3 +296,18 @@ At bare minimum, make sure the relevant checks from parent types gets copied in return return INFINITY + + +///////////////////////////// +// RIVER // +///////////////////////////// +/turf/open/gm/river/xeno_ai_obstacle(mob/living/carbon/xenomorph/X, direction, turf/target) + . = ..() + if(. && !covered) + . += base_river_slowdown + +/turf/open/gm/river/desert/xeno_ai_obstacle(mob/living/carbon/xenomorph/X, direction, turf/target) + if(toxic && !covered) + return FIRE_PENALTY + + return ..() diff --git a/code/modules/projectiles/guns/pistols.dm b/code/modules/projectiles/guns/pistols.dm index c17ca5bca7..7dff109572 100644 --- a/code/modules/projectiles/guns/pistols.dm +++ b/code/modules/projectiles/guns/pistols.dm @@ -48,7 +48,7 @@ /obj/item/weapon/gun/pistol/m4a3 name = "\improper M4A3 service pistol" - desc = "An M4A3 Service Pistol, once the standard issue sidearm of the Colonial Marines but has recently been replaced with the 88 Mod 4 combat pistol. Fires 9mm pistol rounds." + desc = "An M4A3 Service Pistol, once the standard issue sidearm of the Colonial Marines but has recently been replaced with the Weyland Yutani 88 Mod 4 combat pistol. Fires 9mm pistol rounds." icon = 'icons/obj/items/weapons/guns/guns_by_faction/uscm.dmi' icon_state = "m4a3" item_state = "m4a3" @@ -677,7 +677,7 @@ damage_mult = BASE_BULLET_DAMAGE_MULT + BULLET_DAMAGE_MULT_TIER_4 //------------------------------------------------------- -//VP78 - the only pistol viable as a primary. +//VP78 - High power pistol? /obj/item/weapon/gun/pistol/vp78 name = "\improper VP78 pistol" @@ -717,14 +717,14 @@ /obj/item/weapon/gun/pistol/vp78/set_gun_config_values() ..() - set_fire_delay(FIRE_DELAY_TIER_4) + set_fire_delay(FIRE_DELAY_TIER_6) set_burst_amount(BURST_AMOUNT_TIER_3) set_burst_delay(FIRE_DELAY_TIER_11) - accuracy_mult = BASE_ACCURACY_MULT + accuracy_mult = BASE_ACCURACY_MULT + HIT_ACCURACY_MULT_TIER_6 accuracy_mult_unwielded = BASE_ACCURACY_MULT - scatter = SCATTER_AMOUNT_TIER_6 - burst_scatter_mult = SCATTER_AMOUNT_TIER_6 - scatter_unwielded = SCATTER_AMOUNT_TIER_6 + scatter = SCATTER_AMOUNT_TIER_9 + burst_scatter_mult = SCATTER_AMOUNT_TIER_7 + scatter_unwielded = SCATTER_AMOUNT_TIER_5 damage_mult = BASE_BULLET_DAMAGE_MULT recoil = RECOIL_AMOUNT_TIER_5 recoil_unwielded = RECOIL_AMOUNT_TIER_4 diff --git a/code/modules/projectiles/guns/revolvers.dm b/code/modules/projectiles/guns/revolvers.dm index 48f237f9b5..0e7ff3c9af 100644 --- a/code/modules/projectiles/guns/revolvers.dm +++ b/code/modules/projectiles/guns/revolvers.dm @@ -288,8 +288,8 @@ //M44 Revolver /obj/item/weapon/gun/revolver/m44 - name = "\improper M44 combat revolver" - desc = "A bulky revolver, occasionally carried by assault troops and officers in the Colonial Marines, as well as civilian law enforcement. Fires .44 Magnum rounds." + name = "\improper M44 revolver" + desc = ".44 Magnum revolver, in limited service with the USCMC for personal defense against larger xenofauna. For best results, aim carefully." icon = 'icons/obj/items/weapons/guns/guns_by_faction/uscm.dmi' icon_state = "m44r" item_state = "m44r" @@ -337,7 +337,7 @@ /obj/item/weapon/gun/revolver/m44/custom //loadout name = "\improper M44 custom combat revolver" - desc = "A bulky combat revolver. The handle has been polished to a pearly perfection, and the body is silver plated. Fires .44 Magnum rounds." + desc = "A custom version of the M44 revolver, with a handle that's been polished to a pearly sheen, and a body that's been silver-plated. Fires .44 Magnum rounds." current_mag = /obj/item/ammo_magazine/internal/revolver/m44 icon_state = "m44rc" item_state = "m44rc" @@ -494,8 +494,8 @@ //a lean mean machine, pretty inaccurate unless you play its dance. /obj/item/weapon/gun/revolver/small - name = "\improper S&W .38 model 37 revolver" - desc = "A lean .38 made by Smith & Wesson. A timeless classic, from antiquity to the future. This specific model is known to be wildly inaccurate, yet extremely lethal." + name = "\improper .38 revolver" + desc = "A Frontier Special. Out here, you get a lot of smalltime companies that try to push themselves as better by upping the pressure of their ammo and fiddling with the designs to make it work. It usually means that their accuracy is awful, but the impact is impressive... if you've got the knowhow to shoot them straight." icon = 'icons/obj/items/weapons/guns/guns_by_faction/colony.dmi' icon_state = "sw357" item_state = "ny762" //PLACEHOLDER diff --git a/code/modules/projectiles/guns/rifles.dm b/code/modules/projectiles/guns/rifles.dm index 78cf3a654b..76470513f3 100644 --- a/code/modules/projectiles/guns/rifles.dm +++ b/code/modules/projectiles/guns/rifles.dm @@ -364,7 +364,7 @@ /obj/item/weapon/gun/rifle/m41aMK1 name = "\improper M41A pulse rifle" - desc = "An older design of the Pulse Rifle commonly used by Colonial Marines. Uses 10x24mm caseless ammunition." + desc = "Pulse action 10x24mm caseless assault rifle of the USCMC, personal friend of any Marine." icon = 'icons/obj/items/weapons/guns/guns_by_faction/uscm.dmi' icon_state = "m41amk1" //Placeholder. item_state = "m41amk1" //Placeholder. @@ -878,7 +878,7 @@ /obj/item/weapon/gun/rifle/m16 name = "\improper M16 rifle" - desc = "An old, reliable design first adopted by the U.S. military in the 1960s. Something like this belongs in a museum of war history. It is chambered in 5.56x45mm." + desc = "The manufacturer claims that these are Classic 16 assault rifles. It's another one of the clonetypes you see on the Frontier since the AR-15 patent expired over a century ago. Chambered in 5.56x45mm, popular on the Frontier for home defense and hunting. The old cased rounds can also be used till they disintegrate, if you can be bothered to police the brass." icon = 'icons/obj/items/weapons/guns/guns_by_faction/colony.dmi' icon_state = "m16" item_state = "m16" @@ -963,7 +963,7 @@ /obj/item/weapon/gun/rifle/m16/grenadier name = "\improper M16 grenadier rifle" - desc = "An old, reliable design first adopted by the U.S. military in the 1960s. Something like this belongs in a museum of war history. It is chambered in 5.56x45mm. This one has an irremovable M203 grenade launcher attached to it, holds one propriatary 40mm shell at a time, it lacks modern IFF systems and will impact the first target it hits; introduce your little friend." + desc = "The little worn and faded sticker on the lower receiver claims that this is a Mustang Special, Little Friend Edition. Point is, it's an M16 repro with an irremovable M203 underslung. 40mm, careful where you point it." icon_state = "m16g" item_state = "m16" fire_sound = 'sound/weapons/gun_m16.ogg' @@ -1009,9 +1009,8 @@ //awesome vietnam era special forces carbine version of the M16 /obj/item/weapon/gun/rifle/xm177 - name = "\improper XM177E2 carbine" - desc = "An old design, essentially a shortened M16A1 with a collapsable stock. It is chambered in 5.56x45mm. The short length inhibits the attachment of most underbarrel attachments, and the barrel moderator prohibits the attachment of all muzzle devices." - desc_lore = "A carbine similar to the M16A1, with a collapsible stock and a distinct flash suppressor. A stamp on the receiver reads: 'COLT AR-15 - PROPERTY OF U.S. GOVT - XM177E2 - CAL 5.56MM' \nA design originating from the Vietnam War, the XM177, also known as the Colt Commando or GAU-5/A, was an improvement on the CAR-15 Model 607, fixing multiple issues found with the limited service of the Model 607 with Special Forces. The XM177 saw primary use with Army Special Forces and Navy Seals operating as commandos. \nHow this got here is a mystery." + name = "\improper XM177 carbine" + desc = "5.56x45mm carbine. Either this is a really cheap replica of the old XM177, someone's crappy DIY modification, or somehow an actual genuine antique which probably is worth at least a couple grand to a museum. Who knows?" icon = 'icons/obj/items/weapons/guns/guns_by_faction/colony.dmi' icon_state = "xm177" item_state = "m16" diff --git a/code/modules/projectiles/guns/smartgun.dm b/code/modules/projectiles/guns/smartgun.dm index 3e5e3718f5..2484e29c12 100644 --- a/code/modules/projectiles/guns/smartgun.dm +++ b/code/modules/projectiles/guns/smartgun.dm @@ -4,7 +4,7 @@ //Come get some. /obj/item/weapon/gun/smartgun name = "\improper M56B smartgun" - desc = "The actual firearm in the 4-piece M56B Smartgun System. Essentially a heavy, mobile machinegun.\nYou may toggle firing restrictions by using a special action.\nAlt-click it to open the feed cover and allow for reloading." + desc = "The actual firearm in the 4-piece M56 Smartgun System. Essentially a heavy, mobile machinegun.\nYou may toggle firing restrictions by using a special action.\nAlt-click it to open the feed cover and allow for reloading." icon = 'icons/obj/items/weapons/guns/guns_by_faction/uscm.dmi' icon_state = "m56" item_state = "m56" @@ -315,14 +315,15 @@ return FALSE var/mob/living/carbon/human/H = user if(!skillcheckexplicit(user, SKILL_SPEC_WEAPONS, SKILL_SPEC_SMARTGUN) && !skillcheckexplicit(user, SKILL_SPEC_WEAPONS, SKILL_SPEC_ALL)) - to_chat(H, SPAN_WARNING("You don't seem to know how to use \the [src]...")) + balloon_alert(user, "insufficient skills") return FALSE if(requires_harness) if(!H.wear_suit || !(H.wear_suit.flags_inventory & SMARTGUN_HARNESS)) - to_chat(H, SPAN_WARNING("You need a harness suit to be able to fire [src]...")) + balloon_alert(user, "harness required") return FALSE if(cover_open) to_chat(H, SPAN_WARNING("You can't fire \the [src] with the feed cover open! (alt-click to close)")) + balloon_alert(user, "cannot fire; feed cover open") return FALSE /obj/item/weapon/gun/smartgun/unique_action(mob/user) @@ -336,6 +337,7 @@ return secondary_toggled = !secondary_toggled to_chat(user, "[icon2html(src, usr)] You changed \the [src]'s ammo preparation procedures. You now fire [secondary_toggled ? "armor shredding rounds" : "highly precise rounds"].") + balloon_alert(user, "firing [secondary_toggled ? "armor shredding" : "highly precise"]") playsound(loc,'sound/machines/click.ogg', 25, 1) @@ -382,7 +384,7 @@ return FALSE return TRUE if(!battery || battery.power_cell.charge == 0) - to_chat(usr, SPAN_WARNING("[src] emits a low power warning and immediately shuts down!")) + balloon_alert(usr, "low power") return FALSE return FALSE diff --git a/code/modules/projectiles/guns/smgs.dm b/code/modules/projectiles/guns/smgs.dm index 24eddf3159..b5923a202e 100644 --- a/code/modules/projectiles/guns/smgs.dm +++ b/code/modules/projectiles/guns/smgs.dm @@ -11,7 +11,7 @@ aim_slowdown = SLOWDOWN_ADS_QUICK wield_delay = WIELD_DELAY_VERY_FAST attachable_allowed = list( - /obj/item/attachable/suppressor, + /obj/item/attachable/suppressor, /obj/item/attachable/reddot, /obj/item/attachable/reflex, /obj/item/attachable/flashlight, @@ -50,7 +50,7 @@ /obj/item/attachable/suppressor, /obj/item/attachable/reddot, /obj/item/attachable/reflex, - /obj/item/attachable/angledgrip, + /obj/item/attachable/angledgrip, /obj/item/attachable/verticalgrip, /obj/item/attachable/flashlight/grip, /obj/item/attachable/stock/smg, @@ -145,7 +145,7 @@ /obj/item/weapon/gun/smg/mp5 name = "\improper MP5 submachinegun" - desc = "A German design, this was one of the most widely used submachine guns in the world. It's still possible to find this firearm in the hands of collectors or gun fanatics." + desc = "Knockoff of an antique UPP submachine gun, made somewhere in the former German state. Chambered for 9x19mm cased ammunition." icon = 'icons/obj/items/weapons/guns/guns_by_faction/colony.dmi' icon_state = "mp5" item_state = "mp5" @@ -197,7 +197,7 @@ /obj/item/weapon/gun/smg/mp27 name = "\improper MP27 submachinegun" - desc = "An archaic design going back almost a century, the MP27 was common in its day. Today it sees limited use as cheap computer-printed replicas or family heirlooms. An extremely ergonomic and lightweight design allows easy mass production and surpisingly good handling, but the cheap materials used hurt the weapon's scatter noticeably." + desc = "Once a respectable weapon, now after the design files were leaked in '67 the cheaply made copies are everywhere. Lightweight and fast firing, but the poor construction of almost every copy severely hampers accuracy." icon = 'icons/obj/items/weapons/guns/guns_by_faction/colony.dmi' icon_state = "mp7" item_state = "mp7" @@ -475,7 +475,7 @@ /obj/item/weapon/gun/smg/uzi name = "\improper UZI" - desc = "Exported to over 90 countries, somehow this relic has managed to end up here. Couldn't be simpler to use." + desc = "Antique firearm, now almost two centuries old. 9mm, fully automatic. Pull the trigger and hold on tight." icon = 'icons/obj/items/weapons/guns/guns_by_faction/colony.dmi' icon_state = "uzi" item_state = "uzi" diff --git a/code/modules/projectiles/magazines/revolvers.dm b/code/modules/projectiles/magazines/revolvers.dm index 07fc75a50f..7d56612530 100644 --- a/code/modules/projectiles/magazines/revolvers.dm +++ b/code/modules/projectiles/magazines/revolvers.dm @@ -3,7 +3,7 @@ /obj/item/ammo_magazine/revolver name = "\improper M44 speed loader (.44)" - desc = "A revolver speed loader." + desc = "A revolver speed loader for the M44 revolver." default_ammo = /datum/ammo/bullet/revolver flags_equip_slot = NO_FLAGS caliber = ".44" @@ -69,9 +69,10 @@ icon_state = "zhnk72loader_shrapnel" /obj/item/ammo_magazine/revolver/small - name = "\improper S&W speed loader (.38)" + name = "\improper .38 overpressure speedloader (.38 +P)" + desc = "A speedloader of 6 handloaded overpressure .38 bullets. Substantial impact, but suffers from accuracy issues compared to factory ammunition. Liable to damage firearms not built to handle the chamber pressure." default_ammo = /datum/ammo/bullet/revolver/small - caliber = ".38" + caliber = ".38 +P" icon = 'icons/obj/items/weapons/guns/ammo_by_faction/colony.dmi' icon_state = "38" max_rounds = 6 @@ -79,7 +80,7 @@ /obj/item/ammo_magazine/revolver/cmb name = "\improper Spearhead hollowpoint speed loader (.357)" - desc = "This speedloader was created for the Colonial Marshals' most commonly issued sidearm, loaded with hollowpoint rounds either for colonies with wildlife problems or orbital stations, which favor the lesser penetration over other ammunition to lessen the risk of hull breaches. In exchange, they're near useless against armored targets, but what's the chance of that being a problem on a space station?" + desc = "A speedloader of 6 hollowpoint .357 bullets, issued to Colonial Marshals to both prevent overpenetration and improve performance against unarmored criminals or wildlife. Less effective against hard targets, but what're the chances of encountering those?" default_ammo = /datum/ammo/bullet/revolver/small/hollowpoint caliber = ".357" icon = 'icons/obj/items/weapons/guns/ammo_by_faction/colony.dmi' @@ -89,7 +90,7 @@ /obj/item/ammo_magazine/revolver/cmb/normalpoint //put these in the marshal ert - ok sure :) name = "\improper Spearhead speed loader (.357)" - desc = "This speedloader is fitted with standard .357 revolver bullets. A surprising rarity, as most CMB revolvers are issued to Marshals on colonies with wildlife, or weakly-hulled space stations." + desc = "A speedloader of 6 FMJ .357 bullets, uncommonly issued to Colonial Marshals due to overpenetration risks." default_ammo = /datum/ammo/bullet/revolver/small icon_state = "cmb" @@ -181,7 +182,7 @@ /obj/item/ammo_magazine/internal/revolver/small default_ammo = /datum/ammo/bullet/revolver/small - caliber = ".38" + caliber = ".357 Hotload" gun_type = /obj/item/weapon/gun/revolver/small //------------------------------------------------------- diff --git a/code/modules/projectiles/magazines/rifles.dm b/code/modules/projectiles/magazines/rifles.dm index 47ee89fb79..91f7bbca33 100644 --- a/code/modules/projectiles/magazines/rifles.dm +++ b/code/modules/projectiles/magazines/rifles.dm @@ -78,8 +78,8 @@ //M41A (MK1) TRUE AND ORIGINAL /obj/item/ammo_magazine/rifle/m41aMK1 - name = "\improper M41A MK1 magazine (10x24mm)" - desc = "A long rectangular box of rounds that is only compatible with the older M41A MK1. Holds up to 99 rounds." + name = "\improper M41A magazine (10x24mm)" + desc = "A long rectangular box magazine for the M41A. Holds 99 caseless 10x24mm rounds." icon_state = "m41a_mk1" max_rounds = 99 gun_type = /obj/item/weapon/gun/rifle/m41aMK1 @@ -87,21 +87,33 @@ ammo_band_icon = "+m41a_mk1_band" ammo_band_icon_empty = "+m41a_mk1_band_e" +/obj/item/ammo_magazine/rifle/m41aMK1/rubber + name = "\improper M41A Less Lethal magazine" + desc = "A long rectangular box magazine for the M41A. Holds 99 caseless 10x24mm less lethal rubber bullets. Be careful, they're LESS, lethal, not NON, lethal." + default_ammo = /datum/ammo/bullet/rifle/rubber + ammo_band_color = AMMO_BAND_COLOR_RUBBER + +/obj/item/ammo_magazine/rifle/m41aMK1/training + name = "\improper M41A training magazine" + desc = "A long rectangular box magazine for the M41A. Holds 99 caseless 10x24mm training rounds." + default_ammo = /datum/ammo/bullet/rifle/rubber + ammo_band_color = AMMO_BAND_COLOR_TRAINING + /obj/item/ammo_magazine/rifle/m41aMK1/ap - name = "\improper M41A MK1 AP magazine (10x24mm)" - desc = "A long rectangular box of rounds that is only compatible with the older M41A MK1. Holds up to 99 rounds. This one contains AP bullets." + name = "\improper M41A AP magazine (10x24mm)" + desc = "A long rectangular box magazine for the M41A. Holds 99 caseless 10x24mm steelcore armor piercing rounds." default_ammo = /datum/ammo/bullet/rifle/ap ammo_band_color = AMMO_BAND_COLOR_AP /obj/item/ammo_magazine/rifle/m41aMK1/heap - name = "\improper M41A MK1 HEAP magazine (10x24mm)" - desc = "A long rectangular box of rounds that is only compatible with the older M41A MK1. Holds up to 99 rounds. This one contains High-Explosive Armor-Piercing bullets." + name = "\improper M41A HEAP magazine (10x24mm)" + desc = "A long rectangular box magazine for the M41A. Holds 99 caseless 10x24mm M309 Armor Piercing High Explosive rounds." default_ammo = /datum/ammo/bullet/rifle/heap ammo_band_color = AMMO_BAND_COLOR_HEAP /obj/item/ammo_magazine/rifle/m41aMK1/incendiary name = "\improper M41A MK1 incendiary magazine (10x24mm)" - desc = "A long rectangular box of rounds that is only compatible with the older M41A MK1. Holds up to 99 rounds. This one contains incendiary bullets." + desc = "A long rectangular box magazine for the M41A. Holds 99 caseless 10x24mm incendiary rounds." default_ammo = /datum/ammo/bullet/rifle/incendiary ammo_band_color = AMMO_BAND_COLOR_INCENDIARY @@ -227,8 +239,8 @@ //M16 RIFLE /obj/item/ammo_magazine/rifle/m16 - name = "\improper M16 magazine (5.56x45mm)" - desc = "A 5.56x45mm magazine for the M16 assault rifle." + name = "\improper M16 magazine" + desc = "An FMJ 5.56x45mm magazine for the M16 assault rifle and its clones. Holds 20 rounds." caliber = "5.56x45mm" icon = 'icons/obj/items/weapons/guns/ammo_by_faction/colony.dmi' icon_state = "m16" @@ -239,9 +251,22 @@ ammo_band_icon = "+m16_band" ammo_band_icon_empty = "+m16_band_e" +/obj/item/ammo_magazine/rifle/m16/extended + name = "\improper M16 extended magazine" + desc = "An FMJ 5.56x45mm magazine for the M16 assault rifle and its clones. Holds 30 rounds." + caliber = "5.56x45mm" + icon = 'icons/obj/items/weapons/guns/ammo_by_faction/colony.dmi' + icon_state = "m16" + default_ammo = /datum/ammo/bullet/rifle + max_rounds = 30 + gun_type = /obj/item/weapon/gun/rifle/m16 + w_class = SIZE_MEDIUM + ammo_band_icon = "+m16_band" + ammo_band_icon_empty = "+m16_band_e" + /obj/item/ammo_magazine/rifle/m16/ap - name = "\improper M16 AP magazine (5.56x45mm)" - desc = "An AP 5.56x45mm magazine for the M16 assault rifle." + name = "\improper M16 AP magazine" + desc = "An AP 5.56x45mm magazine for the M16 assault rifle and its clones. Holds 20 rounds." caliber = "5.56x45mm" default_ammo = /datum/ammo/bullet/rifle/ap max_rounds = 20 diff --git a/colonialmarines.dme b/colonialmarines.dme index 50b122a0a2..9872ffc48e 100644 --- a/colonialmarines.dme +++ b/colonialmarines.dme @@ -1393,6 +1393,7 @@ #include "code\modules\admin\game_master\extra_buttons\toggle_join_xeno.dm" #include "code\modules\admin\game_master\extra_buttons\toggle_vehicle_blockers.dm" #include "code\modules\admin\game_master\game_master_submenu\ambush.dm" +#include "code\modules\admin\game_master\game_master_submenu\infest.dm" #include "code\modules\admin\game_master\game_master_submenu\tunnels.dm" #include "code\modules\admin\game_master\game_master_submenu\vents.dm" #include "code\modules\admin\medal_panel\medals_panel.dm" diff --git a/icons/obj/items/clothing/cm_hats.dmi b/icons/obj/items/clothing/cm_hats.dmi index e68f26baae..5df0576c6a 100644 Binary files a/icons/obj/items/clothing/cm_hats.dmi and b/icons/obj/items/clothing/cm_hats.dmi differ diff --git a/sound/voice/alien_crusher_death.ogg b/sound/voice/alien_crusher_death.ogg new file mode 100644 index 0000000000..67629295be Binary files /dev/null and b/sound/voice/alien_crusher_death.ogg differ diff --git a/tgui/packages/tgui/interfaces/GameMasterSubmenuInfest.js b/tgui/packages/tgui/interfaces/GameMasterSubmenuInfest.js new file mode 100644 index 0000000000..05514969d2 --- /dev/null +++ b/tgui/packages/tgui/interfaces/GameMasterSubmenuInfest.js @@ -0,0 +1,85 @@ +import { useBackend } from '../backend'; +import { Stack, Dropdown, Button, Section, Slider } from '../components'; +import { Window } from '../layouts'; + +export const GameMasterSubmenuInfest = (props, context) => { + const { data, act } = useBackend(context); + + return ( + + + + + + + + ); +}; + +export const GameMasterSubmenuInfestInfestingPanel = (props, context) => { + const { data, act } = useBackend(context); + + return ( +
+ + + + + { + act('set_selected_hive', { new_hive }); + }} + /> + + + + Embryo Stage + + { + act('set_embryo_stage', { stage }); + }} + /> + + + + +
+ ); +};