diff --git a/.gitignore b/.gitignore index 93727d71e9945..daf69010c2bf9 100644 --- a/.gitignore +++ b/.gitignore @@ -16,6 +16,7 @@ Thumbs.db data/ cfg/ tmp/ +/cache/**/* tools/Runtime Condenser/Input.txt tools/Runtime Condenser/Output.txt tools/MapDaemon/logs/*.txt diff --git a/_maps/map_files/Arachne/TGS_Arachne.dmm b/_maps/map_files/Arachne/TGS_Arachne.dmm index 9b8394517f14e..0d0bd99017b68 100644 --- a/_maps/map_files/Arachne/TGS_Arachne.dmm +++ b/_maps/map_files/Arachne/TGS_Arachne.dmm @@ -7864,9 +7864,7 @@ dir = 1 }, /obj/effect/ai_node, -/obj/structure/disposalpipe/junction/flipped{ - dir = 8 - }, +/obj/structure/disposalpipe/junction/yjunc, /turf/open/floor/mainship/sterile, /area/mainship/medical/lower_medical) "gLH" = ( diff --git a/_maps/map_files/Campaign maps/jungle_outpost/jungle_outpost.dmm b/_maps/map_files/Campaign maps/jungle_outpost/jungle_outpost.dmm index d0eaa030b841c..e57a8ace820d2 100644 --- a/_maps/map_files/Campaign maps/jungle_outpost/jungle_outpost.dmm +++ b/_maps/map_files/Campaign maps/jungle_outpost/jungle_outpost.dmm @@ -6716,7 +6716,7 @@ /area/campaign/jungle_outpost/outpost/landing) "BU" = ( /obj/structure/table/mainship, -/obj/item/trash/barcardine, +/obj/item/trash/barcaridine, /turf/open/floor/tile/neutral/full, /area/campaign/jungle_outpost/outpost/living/canteen) "BV" = ( diff --git a/_maps/map_files/Campaign maps/nt_base/nt_base.dmm b/_maps/map_files/Campaign maps/nt_base/nt_base.dmm index a32fa0e656034..e57d71c016794 100644 --- a/_maps/map_files/Campaign maps/nt_base/nt_base.dmm +++ b/_maps/map_files/Campaign maps/nt_base/nt_base.dmm @@ -27071,7 +27071,7 @@ }, /area/gelida/indoors/a_block/admin) "tKl" = ( -/obj/item/trash/barcardine, +/obj/item/trash/barcaridine, /turf/open/floor/prison, /area/gelida/indoors/a_block/hallway) "tKn" = ( @@ -28497,7 +28497,7 @@ /turf/open/floor/prison/darkbrown/full, /area/gelida/landing_zone_1) "uPv" = ( -/obj/item/trash/barcardine, +/obj/item/trash/barcaridine, /turf/open/floor/prison/blue, /area/gelida/indoors/a_block/hallway) "uPN" = ( diff --git a/_maps/map_files/Lawanka_Outpost/LawankaOutpost.dmm b/_maps/map_files/Lawanka_Outpost/LawankaOutpost.dmm index 22374373c14b7..d15921a2287e3 100644 --- a/_maps/map_files/Lawanka_Outpost/LawankaOutpost.dmm +++ b/_maps/map_files/Lawanka_Outpost/LawankaOutpost.dmm @@ -4503,7 +4503,7 @@ /area/lawankaoutpost/caves/nanotrasen_lab) "dNa" = ( /obj/structure/table/reinforced, -/obj/item/trash/barcardine, +/obj/item/trash/barcaridine, /turf/open/floor/plating/ground/dirt, /area/lawankaoutpost/outside/central) "dND" = ( diff --git a/_maps/map_files/Pillar_of_Spring/TGS_Pillar_of_Spring.dmm b/_maps/map_files/Pillar_of_Spring/TGS_Pillar_of_Spring.dmm index 8aa55f02fa2d1..6b79a7cb1559f 100644 --- a/_maps/map_files/Pillar_of_Spring/TGS_Pillar_of_Spring.dmm +++ b/_maps/map_files/Pillar_of_Spring/TGS_Pillar_of_Spring.dmm @@ -1470,7 +1470,7 @@ /obj/structure/bed/bunkbed, /obj/effect/landmark/start/job/squadmarine, /obj/effect/landmark/start/job/squadmarine, -/obj/item/trash/barcardine, +/obj/item/trash/barcaridine, /obj/machinery/firealarm{ dir = 8 }, @@ -12440,7 +12440,7 @@ /obj/structure/bed/bunkbed, /obj/effect/landmark/start/job/squadmarine, /obj/effect/landmark/start/job/squadmarine, -/obj/item/trash/barcardine, +/obj/item/trash/barcaridine, /turf/open/floor/wood, /area/mainship/living/cryo_cells) "pHV" = ( diff --git a/_maps/map_files/Research_Outpost/Research_Outpost.dmm b/_maps/map_files/Research_Outpost/Research_Outpost.dmm index 2e5ea2adb0379..0ef43c4bd985d 100644 --- a/_maps/map_files/Research_Outpost/Research_Outpost.dmm +++ b/_maps/map_files/Research_Outpost/Research_Outpost.dmm @@ -1990,7 +1990,7 @@ /obj/machinery/light/small{ dir = 8 }, -/obj/item/trash/barcardine, +/obj/item/trash/barcaridine, /turf/open/floor/wood, /area/outpost/dormitories) "jE" = ( @@ -9486,7 +9486,7 @@ /turf/open/floor/plating/ground/mars/random/cave, /area/outpost/caves/north) "Sv" = ( -/obj/item/trash/barcardine, +/obj/item/trash/barcaridine, /turf/open/floor/wood, /area/outpost/dormitories) "Sw" = ( diff --git a/_maps/map_files/desparity/desparity.dmm b/_maps/map_files/desparity/desparity.dmm index 6fdadc4448557..c63cc23b30ebd 100644 --- a/_maps/map_files/desparity/desparity.dmm +++ b/_maps/map_files/desparity/desparity.dmm @@ -5981,7 +5981,7 @@ /area/lv624/ground/caves/west1) "Fe" = ( /obj/structure/table, -/obj/item/trash/barcardine, +/obj/item/trash/barcaridine, /obj/item/clothing/suit/armor/vest/security{ pixel_x = 5; pixel_y = 5 diff --git a/_maps/map_files/gelida_iv/gelida_iv.dmm b/_maps/map_files/gelida_iv/gelida_iv.dmm index 7204f4c5080f6..892158c8872d4 100644 --- a/_maps/map_files/gelida_iv/gelida_iv.dmm +++ b/_maps/map_files/gelida_iv/gelida_iv.dmm @@ -29330,7 +29330,7 @@ }, /area/gelida/indoors/a_block/admin) "tKl" = ( -/obj/item/trash/barcardine, +/obj/item/trash/barcaridine, /turf/open/floor/prison, /area/gelida/indoors/a_block/hallway) "tKn" = ( @@ -30824,7 +30824,7 @@ /turf/open/floor/prison/darkbrown/full, /area/gelida/landing_zone_1) "uPv" = ( -/obj/item/trash/barcardine, +/obj/item/trash/barcaridine, /turf/open/floor/prison/blue, /area/gelida/indoors/a_block/hallway) "uPN" = ( diff --git a/_maps/map_files/slumbridge/slumbridge.dmm b/_maps/map_files/slumbridge/slumbridge.dmm index d5343ba239e23..f76e2c59413cc 100644 --- a/_maps/map_files/slumbridge/slumbridge.dmm +++ b/_maps/map_files/slumbridge/slumbridge.dmm @@ -845,7 +845,7 @@ /turf/open/floor/tile/white, /area/slumbridge/inside/pmcdome/dorms) "aLp" = ( -/obj/item/trash/barcardine, +/obj/item/trash/barcaridine, /obj/effect/decal/cleanable/dirt, /obj/machinery/atmospherics/pipe/manifold/green/hidden, /turf/open/floor/tile/green/whitegreen{ @@ -7822,7 +7822,7 @@ /area/slumbridge/inside/pmcdome) "fYc" = ( /obj/structure/table, -/obj/item/trash/barcardine, +/obj/item/trash/barcaridine, /turf/open/floor/tile/green/whitegreen{ dir = 1 }, @@ -26353,7 +26353,7 @@ "twh" = ( /obj/structure/table/gamblingtable, /obj/item/toy/dice/d20, -/obj/item/trash/barcardine, +/obj/item/trash/barcaridine, /obj/machinery/atmospherics/pipe/simple/green/hidden{ dir = 5 }, diff --git a/_maps/modularmaps/big_red/bigredmedbayvar4.dmm b/_maps/modularmaps/big_red/bigredmedbayvar4.dmm index 8627503c405c5..2dd4502df625a 100644 --- a/_maps/modularmaps/big_red/bigredmedbayvar4.dmm +++ b/_maps/modularmaps/big_red/bigredmedbayvar4.dmm @@ -314,6 +314,9 @@ /area/bigredv2/outside/medical) "js" = ( /obj/structure/bed/roller, +/obj/machinery/atmospherics/pipe/simple/green/hidden{ + dir = 4 + }, /turf/open/floor/tile/green/whitegreen{ dir = 8 }, @@ -334,6 +337,13 @@ /obj/effect/spawner/random/engineering/toolbox, /turf/open/floor/plating, /area/bigredv2/outside/medical) +"kC" = ( +/obj/effect/ai_node, +/obj/machinery/atmospherics/pipe/simple/green/hidden{ + dir = 9 + }, +/turf/open/floor/tile/white, +/area/bigredv2/outside/medical) "kD" = ( /obj/item/healthanalyzer, /turf/open/floor/tile/green/whitegreencorner, @@ -2002,7 +2012,7 @@ Zg bx nl hQ -Hm +fk zx SR tC @@ -2030,7 +2040,7 @@ OI Yk jh rB -hQ +kC ys Cp OC diff --git a/_maps/modularmaps/big_red/bigredmedbayvar5.dmm b/_maps/modularmaps/big_red/bigredmedbayvar5.dmm index e6a82f580326c..0d8c08470604e 100644 --- a/_maps/modularmaps/big_red/bigredmedbayvar5.dmm +++ b/_maps/modularmaps/big_red/bigredmedbayvar5.dmm @@ -843,6 +843,9 @@ /area/bigredv2/outside/medical) "vV" = ( /obj/structure/bed/roller, +/obj/machinery/atmospherics/pipe/simple/green/hidden{ + dir = 4 + }, /turf/open/floor/tile/green/whitegreen{ dir = 8 }, @@ -1442,6 +1445,13 @@ /obj/effect/spawner/random/engineering/toolbox, /turf/open/floor/plating, /area/bigredv2/outside/medical) +"Mk" = ( +/obj/effect/ai_node, +/obj/machinery/atmospherics/pipe/simple/green/hidden{ + dir = 9 + }, +/turf/open/floor/tile/white, +/area/bigredv2/outside/medical) "Mp" = ( /obj/structure/morgue{ dir = 1 @@ -2055,7 +2065,7 @@ Yn lv HT gj -gL +Re na oG IT @@ -2083,7 +2093,7 @@ Zu Ko Uv fI -gj +Mk MO KD GW diff --git a/_maps/shuttles/tgs_canterbury.dmm b/_maps/shuttles/tgs_canterbury.dmm index ffc848c157331..e9d0761157bfd 100644 --- a/_maps/shuttles/tgs_canterbury.dmm +++ b/_maps/shuttles/tgs_canterbury.dmm @@ -530,13 +530,11 @@ /turf/open/floor/mainship/sterile/dark, /area/shuttle/canterbury/medical) "cc" = ( -/obj/machinery/door/window/right{ - dir = 1 - }, +/obj/effect/landmark/start/job/crash/squadsmartgunner, /obj/structure/window/reinforced/toughened{ - dir = 4 + dir = 1 }, -/obj/effect/landmark/start/job/crash/squadsmartgunner, +/obj/machinery/door/window/right, /turf/open/floor/mainship/red, /area/shuttle/canterbury) "cd" = ( diff --git a/code/__DEFINES/cooldowns.dm b/code/__DEFINES/cooldowns.dm index a7a5a179cb3b2..80ba981c66d1c 100644 --- a/code/__DEFINES/cooldowns.dm +++ b/code/__DEFINES/cooldowns.dm @@ -101,6 +101,7 @@ #define TIMER_COOLDOWN_START(cd_source, cd_index, cd_time) LAZYSET(cd_source.cooldowns, cd_index, addtimer(CALLBACK(GLOBAL_PROC, GLOBAL_PROC_REF(end_cooldown), cd_source, cd_index), cd_time)) +/// Returns TRUE if still cooling down, FALSE otherwise #define TIMER_COOLDOWN_CHECK(cd_source, cd_index) LAZYACCESS(cd_source.cooldowns, cd_index) #define TIMER_COOLDOWN_END(cd_source, cd_index) LAZYREMOVE(cd_source.cooldowns, cd_index) diff --git a/code/__DEFINES/layers.dm b/code/__DEFINES/layers.dm index 940a93cc25277..52a84fb8d53ef 100644 --- a/code/__DEFINES/layers.dm +++ b/code/__DEFINES/layers.dm @@ -121,7 +121,8 @@ #define ABOVE_LYING_MOB_LAYER 3.9 //drone (not the xeno) //#define MOB_LAYER 4 -#define RIVER_OVERLAY_LAYER 4.01 + +#define MOB_JUMP_LAYER 4.05 #define ABOVE_MOB_LAYER 4.1 diff --git a/code/__DEFINES/loadout.dm b/code/__DEFINES/loadout.dm index 7205879b71314..b340958ce33dd 100644 --- a/code/__DEFINES/loadout.dm +++ b/code/__DEFINES/loadout.dm @@ -87,7 +87,7 @@ GLOBAL_LIST_INIT(engineer_gear_listed_products, list( /obj/item/minerupgrade/automatic = list(CAT_ENGSUP, "Mining well automation upgrade", 4, "black"), /obj/item/storage/pouch/explosive/razorburn = list(CAT_ENGSUP, "Pack of Razorburn grenades", 11, "orange"), /obj/item/explosive/grenade/chem_grenade/razorburn_large = list(CAT_ENGSUP, "Razorburn canister", 7, "black"), - /obj/item/explosive/grenade/chem_grenade/razorburn_smol = list(CAT_ENGSUP, "Razorburn grenade", 3, "black"), + /obj/item/explosive/grenade/chem_grenade/razorburn_small = list(CAT_ENGSUP, "Razorburn grenade", 3, "black"), /obj/item/mortal_shell/he = list(CAT_ENGSUP, "HE Mortar shell", 2, "black"), /obj/item/mortal_shell/incendiary = list(CAT_ENGSUP, "Incendiary Mortar shell", 2, "black"), /obj/item/mortal_shell/plasmaloss = list(CAT_ENGSUP, "Tanglefoot Mortar shell", 2, "black"), @@ -138,7 +138,7 @@ GLOBAL_LIST_INIT(leader_gear_listed_products, list( /obj/item/explosive/grenade/incendiary = list(CAT_LEDSUP, "M40 HIDP incendiary grenade", 3, "black"), /obj/item/storage/pouch/explosive/razorburn = list(CAT_LEDSUP, "Pack of Razorburn grenades", 24, "orange"), /obj/item/explosive/grenade/chem_grenade/razorburn_large = list(CAT_LEDSUP, "Razorburn canister", 21, "black"), - /obj/item/explosive/grenade/chem_grenade/razorburn_smol = list(CAT_LEDSUP, "Razorburn grenade", 6, "black"), + /obj/item/explosive/grenade/chem_grenade/razorburn_small = list(CAT_LEDSUP, "Razorburn grenade", 6, "black"), /obj/item/weapon/gun/flamer/big_flamer/marinestandard = list(CAT_LEDSUP, "FL-84 flamethrower", 12, "black"), /obj/item/ammo_magazine/flamer_tank/large = list(CAT_LEDSUP, "Flamethrower tank", 4, "black"), /obj/item/storage/backpack/marine/radiopack = list(CAT_LEDSUP, "Radio Pack", 15, "black"), @@ -162,7 +162,7 @@ GLOBAL_LIST_INIT(commander_gear_listed_products, list( /obj/item/explosive/grenade/incendiary = list(CAT_FCSUP, "M40 HIDP incendiary grenade", 3, "black"), /obj/item/storage/pouch/explosive/razorburn = list(CAT_FCSUP, "Pack of Razorburn grenades", 24, "orange"), /obj/item/explosive/grenade/chem_grenade/razorburn_large = list(CAT_FCSUP, "Razorburn canister", 21, "black"), - /obj/item/explosive/grenade/chem_grenade/razorburn_smol = list(CAT_FCSUP, "Razorburn grenade", 6, "black"), + /obj/item/explosive/grenade/chem_grenade/razorburn_small = list(CAT_FCSUP, "Razorburn grenade", 6, "black"), /obj/item/weapon/gun/flamer/big_flamer/marinestandard = list(CAT_FCSUP, "FL-84 flamethrower", 12, "black"), /obj/item/ammo_magazine/flamer_tank/large = list(CAT_FCSUP, "Flamethrower tank", 4, "black"), /obj/item/storage/backpack/marine/radiopack = list(CAT_FCSUP, "Radio Pack", 15, "black"), @@ -703,7 +703,7 @@ GLOBAL_LIST_INIT(job_specific_clothes_vendor, list( GLOBAL_LIST_INIT(loadout_role_essential_set, list( SQUAD_ENGINEER = list ( /obj/item/explosive/plastique = 1, - /obj/item/explosive/grenade/chem_grenade/razorburn_smol = 1, + /obj/item/explosive/grenade/chem_grenade/razorburn_small = 1, /obj/item/clothing/gloves/marine/insulated = 1, /obj/item/cell/high = 1, /obj/item/lightreplacer = 1, diff --git a/code/__DEFINES/mobs.dm b/code/__DEFINES/mobs.dm index 3fe2e04928a4c..5a59b32262795 100644 --- a/code/__DEFINES/mobs.dm +++ b/code/__DEFINES/mobs.dm @@ -480,6 +480,7 @@ GLOBAL_LIST_INIT(xenoupgradetiers, list(XENO_UPGRADE_BASETYPE, XENO_UPGRADE_INVA #define XENO_GARGOYLE_DETECTION_COOLDOWN 30 SECONDS #define XENO_GARGOYLE_DETECTION_RANGE 10//How far gargoyles can detect hostiles #define XENO_RESTING_COOLDOWN 2 SECONDS +#define XENO_UNRESTING_COOLDOWN 0.5 SECONDS #define XENO_HIVEMIND_DETECTION_RANGE 10 //How far out (in tiles) can the hivemind detect hostiles #define XENO_HIVEMIND_DETECTION_COOLDOWN 1 MINUTES diff --git a/code/__DEFINES/span.dm b/code/__DEFINES/span.dm index 67eff4d118b74..ca6ecdb333bc9 100644 --- a/code/__DEFINES/span.dm +++ b/code/__DEFINES/span.dm @@ -68,11 +68,6 @@ #define span_season_additional_info(str) ("" + str + "") #define span_announce_header(str) ("" + str + "") #define span_announce_body(str) ("" + str + "") -#define span_faction_alert(str) ("" + str + "") -#define span_faction_alert_title(str) ("" + str + "") -#define span_faction_alert_minortitle(str) ("" + str + "") -#define span_faction_alert_subtitle(str) ("" + str + "") -#define span_faction_alert_text(str) ("" + str + "") #define span_seasons_announce(str) ("" + str + "") #define span_suicide(str) ("" + str + "") #define span_tip(str) ("" + str + "") diff --git a/code/__HELPERS/announce.dm b/code/__HELPERS/announce.dm index a88b9820f152b..99e46b5d03a90 100644 --- a/code/__HELPERS/announce.dm +++ b/code/__HELPERS/announce.dm @@ -1,34 +1,115 @@ +// the types of priority announcements #define ANNOUNCEMENT_REGULAR 1 #define ANNOUNCEMENT_PRIORITY 2 #define ANNOUNCEMENT_COMMAND 3 -/proc/priority_announce(message, title = "Announcement", type = ANNOUNCEMENT_REGULAR, sound = 'sound/misc/notice2.ogg', list/receivers = (GLOB.alive_human_list + GLOB.ai_list + GLOB.observer_list)) - if(!message) +// don't use any of these macros outside of here to keep the appearance of alerts consistent (unless you need to make them global for some reason) +// if you want to design a faction alert to use in a message or something, use assemble_alert() + +// a style for extra padding on alert titles +#define span_alert_header(str) ("" + str + "") + +// these are spans that just furnish themselves to the appropriate color +#define span_faction_alert_title(str) ("" + str + "") +#define span_faction_alert_minortitle(str) ("" + str + "") +#define span_faction_alert_subtitle(str) ("" + str + "") +#define span_faction_alert_text(str) ("" + str + "") + +// the actual striped background of faction alerts, the spans above will color themselves to match these +#define faction_alert_default_span(string) ("
" + string + "
") +#define faction_alert_colored_span(color, string) ("
" + string + "
") + +// colors for faction alert overrides, used for admin menus +#define faction_alert_colors list("default", "green", "blue", "pink", "yellow", "orange", "red", "purple", "grey") + +/** + * Design a faction alert. Returns a string. + * + * Arguments + * * title - required, the title to use for this alert + * * subtitle - optional, the subtitle/subheader to use for this alert + * * message - required, the message to use for this alert + * * color_override - optional, the color to use for this alert instead of blue + * * minor - is this a minor alert? + */ +/proc/assemble_alert(title, subtitle, message, color_override, minor = FALSE) + if(!title || !message) return - var/announcement + var/list/alert_strings = list() var/header + var/finalized_alert + header = minor ? span_faction_alert_minortitle(title) : span_faction_alert_title(title) + + if(subtitle) + header += span_faction_alert_subtitle(subtitle) + + alert_strings += span_alert_header(header) + alert_strings += span_faction_alert_text(message) + if(color_override) + finalized_alert = faction_alert_colored_span(color_override, jointext(alert_strings, "")) + else + finalized_alert = faction_alert_default_span(jointext(alert_strings, "")) + + return finalized_alert + +/** + * Make a priority announcement to a target + * + * Arguments + * * message - **required,** the content of the announcement + * * title - optional, the title of the announcement + * * subtitle - optional, the subtitle/subheader of the announcement + * * type - optional, the type of the announcement (see defines in `__HELPERS/announce.dm`) + * * sound - optional, the sound played accompanying the announcement + * * channel_override - optional, what channel is this sound going to be played on? + * * color_override - **recommended,** string, use the passed color instead of the default blue (see defines in `__HELPERS/announce.dm`) + * * receivers - a list of all players to send the message to. defaults to all players, not including those in lobby + */ +/proc/priority_announce(message, title = "Announcement", subtitle = "", type = ANNOUNCEMENT_REGULAR, sound = 'sound/misc/notice2.ogg', channel_override = CHANNEL_ANNOUNCEMENTS, color_override, list/receivers = (GLOB.alive_human_list + GLOB.ai_list + GLOB.observer_list)) + if(!message) + return + + + // header/subtitle to use when using assemble_alert() + var/assembly_header + var/assembly_subtitle switch(type) if(ANNOUNCEMENT_REGULAR) - header += "[html_encode(title)]" + assembly_header = title if(ANNOUNCEMENT_PRIORITY) - header += "Priority Announcement" - if(title && title != "Announcement") - header += "[html_encode(title)]" + assembly_header = "Priority Announcement" + if(length(title) > 0) + assembly_subtitle = title if(ANNOUNCEMENT_COMMAND) - header += "Command Announcement" + assembly_header = "Command Announcement" + if(subtitle && type != ANNOUNCEMENT_PRIORITY) + assembly_subtitle = subtitle - announcement += "[span_faction_alert("[span_faction_alert_title("[header]")]
[span_faction_alert_text("[html_encode(message)]")]")]" + var/finalized_announcement + if(color_override) + finalized_announcement = assemble_alert( + title = assembly_header, + subtitle = assembly_subtitle, + message = message, + color_override = color_override + ) + else + finalized_announcement = assemble_alert( + title = assembly_header, + subtitle = assembly_subtitle, + message = message + ) - var/s = sound(sound, channel = CHANNEL_ANNOUNCEMENTS) + var/s = sound(sound, channel = channel_override) for(var/i in receivers) var/mob/M = i if(!isnewplayer(M)) - to_chat(M, announcement) + to_chat(M, finalized_announcement) SEND_SOUND(M, s) @@ -45,7 +126,15 @@ P.info = papermessage P.update_icon() - +/** + * Make a minor announcement to a target + * + * Arguments + * * message - required, this is the announcement message + * * title - optional, the title of the announcement + * * alert - optional, alert or notice? + * * receivers - a list of all players to send the message to + */ /proc/minor_announce(message, title = "Attention:", alert, list/receivers = GLOB.alive_human_list) if(!message) return @@ -54,5 +143,17 @@ S.channel = CHANNEL_ANNOUNCEMENTS for(var/mob/M AS in receivers) if(!isnewplayer(M) && !isdeaf(M)) - to_chat(M, "[span_faction_alert("[span_faction_alert_minortitle("[html_encode(title)]")][span_faction_alert_text("[html_encode(message)]")]")]") + to_chat(M, assemble_alert( + title = title, + message = message, + minor = TRUE + )) SEND_SOUND(M, S) + +#undef span_alert_header +#undef span_faction_alert_title +#undef span_faction_alert_minortitle +#undef span_faction_alert_subtitle +#undef span_faction_alert_text +#undef faction_alert_default_span +#undef faction_alert_colored_span diff --git a/code/controllers/subsystem/evacuation.dm b/code/controllers/subsystem/evacuation.dm index 3e9c7d3c79477..27db35ff8410d 100644 --- a/code/controllers/subsystem/evacuation.dm +++ b/code/controllers/subsystem/evacuation.dm @@ -86,7 +86,7 @@ SUBSYSTEM_DEF(evacuation) evac_time = world.time evac_status = EVACUATION_STATUS_INITIATING SEND_GLOBAL_SIGNAL(COMSIG_GLOB_EVACUATION_STARTED) - priority_announce("Emergency evacuation has been triggered. Please proceed to the escape pods. Evacuation in [EVACUATION_AUTOMATIC_DEPARTURE/600] minutes.", "Priority Alert", sound = 'sound/AI/evacuate.ogg') + priority_announce("Emergency evacuation has been triggered. Please proceed to the escape pods. Evacuation in [EVACUATION_AUTOMATIC_DEPARTURE/600] minutes.", title = "Emergency Evacuation", type = ANNOUNCEMENT_PRIORITY, sound = 'sound/AI/evacuate.ogg', color_override = "orange") xeno_message("A wave of adrenaline ripples through the hive. The fleshy creatures are trying to escape!") pod_list = SSshuttle.escape_pods.Copy() for(var/obj/docking_port/mobile/escape_pod/pod AS in pod_list) @@ -98,7 +98,7 @@ SUBSYSTEM_DEF(evacuation) if(evac_status != EVACUATION_STATUS_INITIATING) return FALSE evac_status = EVACUATION_STATUS_IN_PROGRESS - priority_announce("WARNING: Evacuation order confirmed. Launching escape pods.", "Priority Alert", sound = 'sound/AI/evacuation_confirmed.ogg') + priority_announce("WARNING: Evacuation order confirmed. Launching escape pods.", title = "Emergency Evacuation", type = ANNOUNCEMENT_PRIORITY, sound = 'sound/AI/evacuation_confirmed.ogg', color_override = "orange") return TRUE @@ -108,7 +108,7 @@ SUBSYSTEM_DEF(evacuation) GLOB.enter_allowed = TRUE evac_time = null evac_status = EVACUATION_STATUS_STANDING_BY - priority_announce("Evacuation has been cancelled.", "Priority Alert", sound = 'sound/AI/evacuate_cancelled.ogg') + priority_announce("Evacuation has been cancelled.", title = "Emergency Evacuation", type = ANNOUNCEMENT_PRIORITY, sound = 'sound/AI/evacuate_cancelled.ogg', color_override = "orange") for(var/obj/docking_port/mobile/escape_pod/pod AS in pod_list) pod.unprep_for_launch() return TRUE @@ -123,7 +123,7 @@ SUBSYSTEM_DEF(evacuation) . = "NOW" /datum/controller/subsystem/evacuation/proc/announce_evac_completion() - priority_announce("ATTENTION: Evacuation complete.", "Priority Alert", sound = 'sound/AI/evacuation_complete.ogg') + priority_announce("ATTENTION: Evacuation complete.", title = "Emergency Evacuation", type = ANNOUNCEMENT_PRIORITY, sound = 'sound/AI/evacuation_complete.ogg', color_override = "orange") evac_status = EVACUATION_STATUS_COMPLETE @@ -158,7 +158,7 @@ SUBSYSTEM_DEF(evacuation) I.toggle(TRUE) dest_master.toggle(TRUE) dest_index = 1 - priority_announce("The emergency destruct system has been deactivated.", "Priority Alert", sound = 'sound/AI/selfdestruct_deactivated.ogg') + priority_announce("The emergency destruct system has been deactivated.", title = "Self Destruct System", type = ANNOUNCEMENT_PRIORITY, sound = 'sound/AI/selfdestruct_deactivated.ogg', color_override = "purple") if(evac_status == EVACUATION_STATUS_STANDING_BY) GLOB.marine_main_ship.set_security_level(SEC_LEVEL_RED, TRUE) for(var/obj/machinery/floor_warn_light/self_destruct/light AS in alarm_lights) @@ -177,7 +177,7 @@ SUBSYSTEM_DEF(evacuation) dest_master.visible_message(span_warning("WARNING: Unable to trigger detonation. Please arm all control rods.")) return FALSE - priority_announce("DANGER. DANGER. Self destruct system activated. DANGER. DANGER. Self destruct in progress. DANGER. DANGER.", "Priority Alert") + priority_announce("DANGER. DANGER. Self destruct system activated. DANGER. DANGER. Self destruct in progress. DANGER. DANGER.", title = "Self Destruct System", type = ANNOUNCEMENT_PRIORITY, color_override = "purple") GLOB.enter_allowed = FALSE dest_status = NUKE_EXPLOSION_IN_PROGRESS playsound(dest_master, 'sound/machines/alarm.ogg', 75, 0, 30) diff --git a/code/controllers/subsystem/mapping.dm b/code/controllers/subsystem/mapping.dm index bfbe0edd2d3e9..d7435ad9b72ce 100644 --- a/code/controllers/subsystem/mapping.dm +++ b/code/controllers/subsystem/mapping.dm @@ -133,7 +133,7 @@ SUBSYSTEM_DEF(mapping) z_list = SSmapping.z_list -#define INIT_ANNOUNCE(X) to_chat(world, span_boldwarning("[X]")); log_world(X) +#define INIT_ANNOUNCE(X) to_chat(world, span_alert("[X]")); log_world(X) /datum/controller/subsystem/mapping/proc/LoadGroup(list/errorList, name, path, files, list/traits, list/default_traits, silent = FALSE) . = list() var/start_time = REALTIMEOFDAY diff --git a/code/controllers/subsystem/server_maint.dm b/code/controllers/subsystem/server_maint.dm index 3786348ba556a..1ae502ef1ff2c 100644 --- a/code/controllers/subsystem/server_maint.dm +++ b/code/controllers/subsystem/server_maint.dm @@ -17,6 +17,8 @@ SUBSYSTEM_DEF(server_maint) /datum/controller/subsystem/server_maint/Initialize() + if (fexists("tmp/")) + fdel("tmp/") if(CONFIG_GET(flag/hub)) world.update_hub_visibility(TRUE) return SS_INIT_SUCCESS @@ -105,6 +107,8 @@ SUBSYSTEM_DEF(server_maint) /datum/controller/subsystem/server_maint/Shutdown() + if (fexists("tmp/")) + fdel("tmp/") var/server = CONFIG_GET(string/server) for(var/thing in GLOB.clients) if(!thing) diff --git a/code/datums/components/jump.dm b/code/datums/components/jump.dm index 7fa5d0c983c6b..2b3ba90941c44 100644 --- a/code/datums/components/jump.dm +++ b/code/datums/components/jump.dm @@ -63,7 +63,8 @@ if(jump_sound) playsound(jumper, jump_sound, 65) - jumper.layer = ABOVE_MOB_LAYER + var/original_layer = jumper.layer + var/original_pass_flags = jumper.pass_flags SEND_SIGNAL(jumper, COMSIG_ELEMENT_JUMP_STARTED) jumper.adjustStaminaLoss(stamina_cost) @@ -78,22 +79,21 @@ var/spin_number = ROUND_UP(jump_duration * 0.1) jumper.animation_spin(jump_duration / spin_number, spin_number, jumper.dir == WEST ? FALSE : TRUE) - animate(jumper, pixel_y = jumper.pixel_y + jump_height, layer = ABOVE_MOB_LAYER, time = jump_duration / 2, easing = CIRCULAR_EASING|EASE_OUT, flags = ANIMATION_PARALLEL) - animate(pixel_y = jumper.pixel_y - jump_height, time = jump_duration / 2, easing = CIRCULAR_EASING|EASE_IN) + animate(jumper, pixel_y = jumper.pixel_y + jump_height, layer = MOB_JUMP_LAYER, time = jump_duration / 2, easing = CIRCULAR_EASING|EASE_OUT, flags = ANIMATION_PARALLEL) + animate(pixel_y = jumper.pixel_y - jump_height, layer = original_layer, time = jump_duration / 2, easing = CIRCULAR_EASING|EASE_IN) if(jump_flags & JUMP_SHADOW) animate(shadow_filter, y = -jump_height, size = 4, time = jump_duration / 2, easing = CIRCULAR_EASING|EASE_OUT, flags = ANIMATION_PARALLEL) animate(y = 0, size = 0.9, time = jump_duration / 2, easing = CIRCULAR_EASING|EASE_IN) - addtimer(CALLBACK(src, PROC_REF(end_jump), jumper), jump_duration) + addtimer(CALLBACK(src, PROC_REF(end_jump), jumper, original_pass_flags), jump_duration) TIMER_COOLDOWN_START(jumper, JUMP_COMPONENT_COOLDOWN, jump_cooldown) ///Ends the jump -/datum/component/jump/proc/end_jump(mob/living/jumper) +/datum/component/jump/proc/end_jump(mob/living/jumper, original_pass_flags) jumper.remove_filter(JUMP_COMPONENT) - jumper.layer = initial(jumper.layer) - jumper.pass_flags = initial(jumper.pass_flags) + jumper.pass_flags = original_pass_flags REMOVE_TRAIT(jumper, TRAIT_SILENT_FOOTSTEPS, JUMP_COMPONENT) SEND_SIGNAL(jumper, COMSIG_ELEMENT_JUMP_ENDED, TRUE, 1.5, 2) SEND_SIGNAL(jumper.loc, COMSIG_TURF_JUMP_ENDED_HERE, jumper) diff --git a/code/datums/elements/connect_loc.dm b/code/datums/elements/connect_loc.dm index c373adafffe62..7693fb0febdfb 100644 --- a/code/datums/elements/connect_loc.dm +++ b/code/datums/elements/connect_loc.dm @@ -19,7 +19,7 @@ /datum/element/connect_loc/Detach(atom/movable/listener) . = ..() - unregister_signals(listener, listener.loc) + unregister_signals(listener, listener.loc, listener.locs) UnregisterSignal(listener, COMSIG_MOVABLE_MOVED) /datum/element/connect_loc/proc/update_signals(atom/movable/listener) @@ -29,16 +29,25 @@ for (var/signal in connections) //override=TRUE because more than one connect_loc element instance tracked object can be on the same loc - listener.RegisterSignal(listener_loc, signal, connections[signal], override=TRUE) + if(length(listener.locs) < 2) //this is kinda funny but a multitile object could be inside something + listener.RegisterSignal(listener_loc, signal, connections[signal], override=TRUE) + continue + for(var/turf/turf AS in listener.locs) + listener.RegisterSignal(turf, signal, connections[signal], override=TRUE) -/datum/element/connect_loc/proc/unregister_signals(datum/listener, atom/old_loc) + +/datum/element/connect_loc/proc/unregister_signals(datum/listener, atom/old_loc, list/turf/old_locs) if(isnull(old_loc)) return for (var/signal in connections) - listener.UnregisterSignal(old_loc, signal) + if(length(old_locs) < 2) + listener.UnregisterSignal(old_loc, signal) + continue + for(var/turf/turf AS in old_locs) + listener.UnregisterSignal(turf, signal) -/datum/element/connect_loc/proc/on_moved(atom/movable/listener, atom/old_loc) +/datum/element/connect_loc/proc/on_moved(atom/movable/listener, atom/old_loc, movement_dir, forced, list/turf/old_locs) SIGNAL_HANDLER - unregister_signals(listener, old_loc) + unregister_signals(listener, old_loc, old_locs) update_signals(listener) diff --git a/code/datums/emergency_calls/emergency_call.dm b/code/datums/emergency_calls/emergency_call.dm index df4720d47759b..9257815968d84 100644 --- a/code/datums/emergency_calls/emergency_call.dm +++ b/code/datums/emergency_calls/emergency_call.dm @@ -152,7 +152,7 @@ message_admins("Distress beacon: '[name]' activated. Looking for candidates.") if(announce) - priority_announce("A distress beacon has been launched from the [SSmapping.configs[SHIP_MAP].map_name].", "Priority Alert", sound = 'sound/AI/distressbeacon.ogg') + priority_announce("A distress beacon has been launched from the [SSmapping.configs[SHIP_MAP].map_name].", title = "Distress Beacon", type = ANNOUNCEMENT_PRIORITY, sound = 'sound/AI/distressbeacon.ogg', color_override = "orange") SSticker.mode.on_distress_cooldown = TRUE diff --git a/code/datums/gamemodes/crash.dm b/code/datums/gamemodes/crash.dm index 11c3bb4589b1d..eab2bdf2e4a15 100644 --- a/code/datums/gamemodes/crash.dm +++ b/code/datums/gamemodes/crash.dm @@ -113,7 +113,12 @@ /datum/game_mode/infestation/crash/announce() to_chat(world, span_round_header("The current map is - [SSmapping.configs[GROUND_MAP].map_name]!")) - priority_announce("Scheduled for landing in T-10 Minutes. Prepare for landing. Known hostiles near LZ. Detonation Protocol Active, planet disposable. Marines disposable.", type = ANNOUNCEMENT_PRIORITY) + priority_announce( + message = "Scheduled for landing in T-10 Minutes. Prepare for landing. Known hostiles near LZ. Detonation Protocol Active, planet disposable. Marines disposable.", + title = "Good morning, marines.", + type = ANNOUNCEMENT_PRIORITY, + color_override = "red" + ) playsound(shuttle, 'sound/machines/warning-buzzer.ogg', 75, 0, 30) diff --git a/code/datums/gamemodes/hvh.dm b/code/datums/gamemodes/hvh.dm index d817006b708b0..e5fe2180fc839 100644 --- a/code/datums/gamemodes/hvh.dm +++ b/code/datums/gamemodes/hvh.dm @@ -157,7 +157,7 @@ Sensors indicate [num_tgmc_delta || "no"] unknown lifeform signature[num_tgmc_delta > 1 ? "s":""] present in the area of operations[tgmc_location ? ", including one at: [tgmc_location]":""]"} if(announce_som) - priority_announce(som_scan_input, som_scan_name, sound = 'sound/AI/bioscan.ogg', receivers = (som_list + GLOB.observer_list)) + priority_announce(som_scan_input, som_scan_name, sound = 'sound/AI/bioscan.ogg', color_override = "orange", receivers = (som_list + GLOB.observer_list)) //announcement for TGMC var/marine_scan_name = "Long Range Tactical Bioscan Status" @@ -166,7 +166,7 @@ Sensors indicate [num_tgmc_delta || "no"] unknown lifeform signature[num_tgmc_de Sensors indicate [num_som_delta || "no"] unknown lifeform signature[num_som_delta > 1 ? "s":""] present in the area of operations[som_location ? ", including one at: [som_location]":""]"} if(announce_marines) - priority_announce(marine_scan_input, marine_scan_name, sound = 'sound/AI/bioscan.ogg', receivers = (tgmc_list + GLOB.observer_list)) + priority_announce(marine_scan_input, marine_scan_name, sound = 'sound/AI/bioscan.ogg', color_override = "blue", receivers = (tgmc_list + GLOB.observer_list)) log_game("Bioscan. [num_tgmc] active TGMC personnel[tgmc_location ? " Location: [tgmc_location]":""] and [num_som] active SOM personnel[som_location ? " Location: [som_location]":""]") diff --git a/code/datums/gamemodes/infestation.dm b/code/datums/gamemodes/infestation.dm index 9e65c21ae49fc..efeaaf618d1b4 100644 --- a/code/datums/gamemodes/infestation.dm +++ b/code/datums/gamemodes/infestation.dm @@ -108,15 +108,19 @@ for(var/i in GLOB.alive_xeno_list_hive[XENO_HIVE_NORMAL]) var/mob/M = i SEND_SOUND(M, S) - to_chat(M, span_xenoannounce("The Queen Mother reaches into your mind from worlds away.")) - to_chat(M, span_xenoannounce("To my children and their Queen. I sense [numHostsShipr ? "approximately [numHostsShipr]":"no"] host[numHostsShipr > 1 ? "s":""] in the metal hive[BIOSCAN_LOCATION(show_locations, hostLocationS)], [numHostsPlanet || "none"] scattered elsewhere[BIOSCAN_LOCATION(show_locations, hostLocationP)] and [numHostsTransitr ? "approximately [numHostsTransitr]":"no"] host[numHostsTransitr > 1 ? "s":""] on the metal bird in transit.")) + to_chat(M, assemble_alert( + title = "Queen Mother Report", + subtitle = "The Queen Mother reaches into your mind...", + message = "To my children and their Queen,
I sense [numHostsShipr ? "approximately [numHostsShipr]":"no"] host[numHostsShipr > 1 ? "s":""] in the metal hive[BIOSCAN_LOCATION(show_locations, hostLocationS)], [numHostsPlanet || "none"] scattered elsewhere[BIOSCAN_LOCATION(show_locations, hostLocationP)] and [numHostsTransitr ? "approximately [numHostsTransitr]":"no"] host[numHostsTransitr > 1 ? "s":""] on the metal bird in transit.", + color_override = "purple" + )) var/name = "[MAIN_AI_SYSTEM] Bioscan Status" var/input = {"Bioscan complete. Sensors indicate [numXenosShip || "no"] unknown lifeform signature[numXenosShip > 1 ? "s":""] present on the ship[BIOSCAN_LOCATION(show_locations, xenoLocationS)], [numXenosPlanetr ? "approximately [numXenosPlanetr]":"no"] signature[numXenosPlanetr > 1 ? "s":""] located elsewhere[BIOSCAN_LOCATION(show_locations, xenoLocationP)] and [numXenosTransit || "no"] unknown lifeform signature[numXenosTransit > 1 ? "s":""] in transit."} var/ai_name = "[usr] Bioscan Status" if(ai_operator) - priority_announce(input, ai_name, sound = 'sound/AI/bioscan.ogg') + priority_announce(input, ai_name, sound = 'sound/AI/bioscan.ogg', color_override = "grey", receivers = (GLOB.alive_human_list + GLOB.ai_list)) log_game("Bioscan. Humans: [numHostsPlanet] on the planet[hostLocationP ? " Location:[hostLocationP]":""] and [numHostsShip] on the ship.[hostLocationS ? " Location: [hostLocationS].":""] Xenos: [numXenosPlanetr] on the planet and [numXenosShip] on the ship[xenoLocationP ? " Location:[xenoLocationP]":""] and [numXenosTransit] in transit.") switch(GLOB.current_orbit) @@ -131,7 +135,7 @@ return if(announce_humans) - priority_announce(input, name, sound = 'sound/AI/bioscan.ogg') + priority_announce(input, name, sound = 'sound/AI/bioscan.ogg', color_override = "grey", receivers = (GLOB.alive_human_list + GLOB.ai_list)) // Hide this from observers, they have their own detailed alert. if(send_fax) var/fax_message = generate_templated_fax("Combat Information Center", "[MAIN_AI_SYSTEM] Bioscan Status", "", input, "", MAIN_AI_SYSTEM) @@ -141,13 +145,18 @@ for(var/i in GLOB.observer_list) var/mob/M = i - to_chat(M, "Detailed Information") - to_chat(M, {"[numXenosPlanet] xeno\s on the planet. + to_chat(M, assemble_alert( + title = "Detailed Bioscan", + message = {"[numXenosPlanet] xeno\s on the planet. [numXenosShip] xeno\s on the ship. +[numXenosTransit] xeno\s in transit. + [numHostsPlanet] human\s on the planet. [numHostsShip] human\s on the ship. -[numHostsTransit] human\s in transit. -[numXenosTransit] xeno\s in transit."}) +[numHostsTransit] human\s in transit."}, + color_override = "purple", + minor = TRUE + )) message_admins("Bioscan - Humans: [numHostsPlanet] on the planet[hostLocationP ? ". Location:[hostLocationP]":""]. [numHostsShipr] on the ship.[hostLocationS ? " Location: [hostLocationS].":""]. [numHostsTransitr] in transit.") message_admins("Bioscan - Xenos: [numXenosPlanetr] on the planet[numXenosPlanetr > 0 && xenoLocationP ? ". Location:[xenoLocationP]":""]. [numXenosShip] on the ship.[xenoLocationS ? " Location: [xenoLocationS].":""] [numXenosTransitr] in transit.") @@ -289,7 +298,12 @@ if(!SSmapping.configs[GROUND_MAP].announce_text) return - priority_announce(SSmapping.configs[GROUND_MAP].announce_text, SSmapping.configs[SHIP_MAP].map_name) + priority_announce( + title = "High Command Update", + subtitle = "Good morning, marines.", + message = "Cryosleep disengaged by TGMC High Command.

ATTN: [SSmapping.configs[SHIP_MAP].map_name].
[SSmapping.configs[GROUND_MAP].announce_text]", + color_override = "red" + ) /datum/game_mode/infestation/announce() @@ -306,7 +320,7 @@ /datum/game_mode/infestation/proc/on_nuclear_diffuse(obj/machinery/nuclearbomb/bomb, mob/living/carbon/xenomorph/X) SIGNAL_HANDLER - priority_announce("WARNING. WARNING. Planetary Nuke deactivated. WARNING. WARNING. Self destruct failed. WARNING. WARNING.", "Priority Alert") + priority_announce("WARNING. WARNING. Planetary Nuke deactivated. WARNING. WARNING. Self destruct failed. WARNING. WARNING.", "Planetary Warhead Disengaged", type = ANNOUNCEMENT_PRIORITY) /datum/game_mode/infestation/proc/on_nuclear_explosion(datum/source, z_level) SIGNAL_HANDLER @@ -322,7 +336,7 @@ /datum/game_mode/infestation/proc/play_cinematic(z_level) GLOB.enter_allowed = FALSE - priority_announce("DANGER. DANGER. Planetary Nuke Activated. DANGER. DANGER. Self destruct in progress. DANGER. DANGER.", "Priority Alert") + priority_announce("DANGER. DANGER. Planetary Nuke Activated. DANGER. DANGER. Self destruct in progress. DANGER. DANGER.", "Planetary Warhead Detonation Confirmed", type = ANNOUNCEMENT_PRIORITY) var/sound/S = sound(pick('sound/theme/nuclear_detonation1.ogg','sound/theme/nuclear_detonation2.ogg'), channel = CHANNEL_CINEMATIC) SEND_SOUND(world, S) diff --git a/code/datums/jobs/job/icc.dm b/code/datums/jobs/job/icc.dm index f75b551de556b..1bb8ca8da9d0a 100644 --- a/code/datums/jobs/job/icc.dm +++ b/code/datums/jobs/job/icc.dm @@ -48,8 +48,8 @@ /datum/outfit/job/icc/standard/post_equip(mob/living/carbon/human/H, visualsOnly = FALSE) . = ..() - H.equip_to_slot_or_del(new /obj/item/reagent_containers/food/snacks/wrapped/barcardine, SLOT_IN_SUIT) - H.equip_to_slot_or_del(new /obj/item/reagent_containers/food/snacks/wrapped/barcardine, SLOT_IN_SUIT) + H.equip_to_slot_or_del(new /obj/item/reagent_containers/food/snacks/wrapped/barcaridine, SLOT_IN_SUIT) + H.equip_to_slot_or_del(new /obj/item/reagent_containers/food/snacks/wrapped/barcaridine, SLOT_IN_SUIT) H.equip_to_slot_or_del(new /obj/item/explosive/grenade/som, SLOT_IN_BACKPACK) H.equip_to_slot_or_del(new /obj/item/explosive/grenade/som, SLOT_IN_BACKPACK) @@ -145,8 +145,8 @@ /datum/outfit/job/icc/guard/post_equip(mob/living/carbon/human/H, visualsOnly = FALSE) . = ..() - H.equip_to_slot_or_del(new /obj/item/reagent_containers/food/snacks/wrapped/barcardine, SLOT_IN_SUIT) - H.equip_to_slot_or_del(new /obj/item/reagent_containers/food/snacks/wrapped/barcardine, SLOT_IN_SUIT) + H.equip_to_slot_or_del(new /obj/item/reagent_containers/food/snacks/wrapped/barcaridine, SLOT_IN_SUIT) + H.equip_to_slot_or_del(new /obj/item/reagent_containers/food/snacks/wrapped/barcaridine, SLOT_IN_SUIT) H.equip_to_slot_or_del(new /obj/item/tool/crowbar/red, SLOT_IN_BACKPACK) H.equip_to_slot_or_del(new /obj/item/explosive/grenade/som, SLOT_IN_BACKPACK) @@ -255,8 +255,8 @@ /datum/outfit/job/icc/medic/post_equip(mob/living/carbon/human/H, visualsOnly = FALSE) . = ..() - H.equip_to_slot_or_del(new /obj/item/reagent_containers/food/snacks/wrapped/barcardine, SLOT_IN_SUIT) - H.equip_to_slot_or_del(new /obj/item/reagent_containers/food/snacks/wrapped/barcardine, SLOT_IN_SUIT) + H.equip_to_slot_or_del(new /obj/item/reagent_containers/food/snacks/wrapped/barcaridine, SLOT_IN_SUIT) + H.equip_to_slot_or_del(new /obj/item/reagent_containers/food/snacks/wrapped/barcaridine, SLOT_IN_SUIT) H.equip_to_slot_or_del(new /obj/item/tool/crowbar/red, SLOT_IN_BACKPACK) H.equip_to_slot_or_del(new /obj/item/explosive/grenade/som, SLOT_IN_BACKPACK) @@ -336,8 +336,8 @@ /datum/outfit/job/icc/leader/post_equip(mob/living/carbon/human/H, visualsOnly = FALSE) . = ..() - H.equip_to_slot_or_del(new /obj/item/reagent_containers/food/snacks/wrapped/barcardine, SLOT_IN_SUIT) - H.equip_to_slot_or_del(new /obj/item/reagent_containers/food/snacks/wrapped/barcardine, SLOT_IN_SUIT) + H.equip_to_slot_or_del(new /obj/item/reagent_containers/food/snacks/wrapped/barcaridine, SLOT_IN_SUIT) + H.equip_to_slot_or_del(new /obj/item/reagent_containers/food/snacks/wrapped/barcaridine, SLOT_IN_SUIT) H.equip_to_slot_or_del(new /obj/item/tool/crowbar/red, SLOT_IN_BACKPACK) H.equip_to_slot_or_del(new /obj/item/explosive/grenade/som, SLOT_IN_BACKPACK) diff --git a/code/datums/marine_main_ship.dm b/code/datums/marine_main_ship.dm index 06749955ab862..dff77022f389c 100644 --- a/code/datums/marine_main_ship.dm +++ b/code/datums/marine_main_ship.dm @@ -14,11 +14,11 @@ GLOBAL_DATUM_INIT(marine_main_ship, /datum/marine_main_ship, new) /datum/marine_main_ship/proc/make_maint_all_access() maint_all_access = TRUE - priority_announce("The maintenance access requirement has been revoked on all airlocks.", "Attention!", sound = 'sound/misc/notice1.ogg') + priority_announce("The maintenance access requirement has been revoked on all airlocks.", "Attention!", "Shipside emergency declared.", sound = 'sound/misc/notice1.ogg', color_override = "grey") /datum/marine_main_ship/proc/revoke_maint_all_access() maint_all_access = FALSE - priority_announce("The maintenance access requirement has been readded on all maintenance airlocks.", "Attention!", sound = 'sound/misc/notice2.ogg') + priority_announce("The maintenance access requirement has been readded on all maintenance airlocks.", "Attention!", "Shipside emergency revoked.", sound = 'sound/misc/notice2.ogg', color_override = "grey") /datum/marine_main_ship/proc/set_security_level(level, announce = TRUE) switch(level) @@ -79,7 +79,7 @@ GLOBAL_DATUM_INIT(marine_main_ship, /datum/marine_main_ship, new) switch(level) if(SEC_LEVEL_GREEN) if(announce) - priority_announce("Attention: Security level lowered to GREEN - all clear.", "Priority Alert", sound = 'sound/AI/code_green.ogg') + priority_announce("Attention: Security level lowered to GREEN - all clear.", title = "Security Level Lowered", subtitle = "All Clear", sound = 'sound/AI/code_green.ogg', color_override = "green") security_level = SEC_LEVEL_GREEN for(var/obj/machinery/status_display/SD in GLOB.machines) if(is_mainship_level(SD.z)) @@ -87,10 +87,10 @@ GLOBAL_DATUM_INIT(marine_main_ship, /datum/marine_main_ship, new) if(SEC_LEVEL_BLUE) if(security_level < SEC_LEVEL_BLUE) if(announce) - priority_announce("Attention: Security level elevated to BLUE - potentially hostile activity on board.", "Priority Alert", sound = 'sound/AI/code_blue_elevated.ogg') + priority_announce("Attention: Security level elevated to BLUE - potentially hostile activity on board.", title = "Security Level Elevated", sound = 'sound/AI/code_blue_elevated.ogg') else if(announce) - priority_announce("Attention: Security level lowered to BLUE - potentially hostile activity on board.", "Priority Alert", sound = 'sound/AI/code_blue_lowered.ogg') + priority_announce("Attention: Security level lowered to BLUE - potentially hostile activity on board.", title = "Security Level Lowered", sound = 'sound/AI/code_blue_lowered.ogg') security_level = SEC_LEVEL_BLUE for(var/obj/machinery/status_display/SD in GLOB.machines) if(is_mainship_level(SD.z)) @@ -98,10 +98,10 @@ GLOBAL_DATUM_INIT(marine_main_ship, /datum/marine_main_ship, new) if(SEC_LEVEL_RED) if(security_level < SEC_LEVEL_RED) if(announce) - priority_announce("Attention: Security level elevated to RED - there is an immediate threat to the ship.", "Priority Alert", sound = 'sound/AI/code_red_elevated.ogg') + priority_announce("Attention: Security level elevated to RED - there is an immediate threat to the ship.", title = "Security Level Elevated", sound = 'sound/AI/code_red_elevated.ogg', color_override = "red") else if(announce) - priority_announce("Attention: Security level lowered to RED - there is an immediate threat to the ship.", "Priority Alert", sound = 'sound/AI/code_red_lowered.ogg') + priority_announce("Attention: Security level lowered to RED - there is an immediate threat to the ship.", title = "Ship Destruction Averted", type = ANNOUNCEMENT_PRIORITY, sound = 'sound/AI/code_red_lowered.ogg', color_override = "red") /* var/area/A for(var/obj/machinery/power/apc/O in machines) @@ -117,7 +117,7 @@ GLOBAL_DATUM_INIT(marine_main_ship, /datum/marine_main_ship, new) SD.set_picture("redalert") if(SEC_LEVEL_DELTA) if(announce) - priority_announce("Attention! Delta security level reached! " + CONFIG_GET(string/alert_delta), "Priority Alert") + priority_announce("Attention! Delta security level reached! " + CONFIG_GET(string/alert_delta), title = "Ship Destruction Imminent", type = ANNOUNCEMENT_PRIORITY, color_override = "purple") security_level = SEC_LEVEL_DELTA for(var/obj/machinery/door/poddoor/shutters/mainship/D in GLOB.machines) if(D.id == "sd_lockdown") diff --git a/code/datums/quick_load_beginners.dm b/code/datums/quick_load_beginners.dm index 695b13366ebef..1eb6bb63be3fc 100644 --- a/code/datums/quick_load_beginners.dm +++ b/code/datums/quick_load_beginners.dm @@ -394,7 +394,7 @@ human.equip_to_slot_or_del(new /obj/item/tool/crowbar, SLOT_IN_L_POUCH) human.equip_to_slot_or_del(new /obj/item/tool/weldingtool/hugetank, SLOT_IN_L_POUCH) - human.equip_to_slot_or_del(new /obj/item/explosive/grenade/chem_grenade/razorburn_smol, SLOT_IN_ACCESSORY) + human.equip_to_slot_or_del(new /obj/item/explosive/grenade/chem_grenade/razorburn_small, SLOT_IN_ACCESSORY) human.equip_to_slot_or_del(new /obj/item/circuitboard/apc, SLOT_IN_ACCESSORY) human.equip_to_slot_or_del(new /obj/item/tool/handheld_charger/hicapcell, SLOT_IN_ACCESSORY) human.equip_to_slot_or_del(new /obj/item/stack/medical/heal_pack/gauze, SLOT_IN_ACCESSORY) diff --git a/code/game/atoms/atom_movable.dm b/code/game/atoms/atom_movable.dm index bd8241fbc1024..035bc8574a38d 100644 --- a/code/game/atoms/atom_movable.dm +++ b/code/game/atoms/atom_movable.dm @@ -367,12 +367,12 @@ /atom/movable/proc/Moved(atom/old_loc, movement_dir, forced = FALSE, list/old_locs) - SEND_SIGNAL(src, COMSIG_MOVABLE_MOVED, old_loc, movement_dir, forced, old_locs) + SEND_SIGNAL(src, COMSIG_MOVABLE_MOVED, old_loc, movement_dir, forced, locs) if(client_mobs_in_contents) update_parallax_contents() if(pulledby) - SEND_SIGNAL(src, COMSIG_MOVABLE_PULL_MOVED, old_loc, movement_dir, forced, old_locs) + SEND_SIGNAL(src, COMSIG_MOVABLE_PULL_MOVED, old_loc, movement_dir, forced, locs) //Cycle through the light sources on this atom and tell them to update. for(var/datum/dynamic_light_source/light AS in hybrid_light_sources) light.source_atom.update_light() diff --git a/code/game/objects/effects/effect_system/smoke.dm b/code/game/objects/effects/effect_system/smoke.dm index aab5e308ce759..966dd1ca24938 100644 --- a/code/game/objects/effects/effect_system/smoke.dm +++ b/code/game/objects/effects/effect_system/smoke.dm @@ -352,8 +352,10 @@ /obj/effect/particle_effect/smoke/xeno/toxic lifetime = 2 + alpha = 60 + opacity = FALSE color = "#00B22C" - smoke_traits = SMOKE_XENO|SMOKE_XENO_TOXIC|SMOKE_GASP|SMOKE_COUGH|SMOKE_EXTINGUISH|SMOKE_HUGGER_PACIFY + smoke_traits = SMOKE_XENO|SMOKE_XENO_TOXIC|SMOKE_GASP|SMOKE_COUGH|SMOKE_EXTINGUISH /obj/effect/particle_effect/smoke/xeno/hemodile color = "#0287A1" diff --git a/code/game/objects/effects/spawners/random/food_or_drink.dm b/code/game/objects/effects/spawners/random/food_or_drink.dm index ce720e684ca68..3df1e31df6612 100644 --- a/code/game/objects/effects/spawners/random/food_or_drink.dm +++ b/code/game/objects/effects/spawners/random/food_or_drink.dm @@ -112,7 +112,7 @@ loot = list( /obj/item/reagent_containers/food/snacks/wrapped/booniebars = 26, /obj/item/reagent_containers/food/snacks/wrapped/chunk = 26, - /obj/item/reagent_containers/food/snacks/wrapped/barcardine = 26, + /obj/item/reagent_containers/food/snacks/wrapped/barcaridine = 26, /obj/item/reagent_containers/food/snacks/wrapped/proteinbar = 12, /obj/item/reagent_containers/food/snacks/candy = 5, /obj/item/reagent_containers/food/snacks/enrg_bar = 5, @@ -126,7 +126,7 @@ /obj/item/reagent_containers/food/snacks/wrapped/proteinbar = 10, /obj/item/reagent_containers/food/snacks/wrapped/booniebars = 5, /obj/item/reagent_containers/food/snacks/wrapped/chunk = 5, - /obj/item/reagent_containers/food/snacks/wrapped/barcardine = 5, + /obj/item/reagent_containers/food/snacks/wrapped/barcaridine = 5, ) /obj/effect/spawner/random/food_or_drink/cheesewedge @@ -257,7 +257,7 @@ /obj/item/reagent_containers/food/snacks/sosjerky, /obj/item/reagent_containers/food/snacks/donkpocket, /obj/item/reagent_containers/food/snacks/wrapped/booniebars, - /obj/item/reagent_containers/food/snacks/wrapped/barcardine, + /obj/item/reagent_containers/food/snacks/wrapped/barcaridine, /obj/item/reagent_containers/food/snacks/wrapped/chunk, /obj/item/reagent_containers/food/snacks/lollipop, /obj/item/reagent_containers/food/snacks/pastries/appletart, diff --git a/code/game/objects/effects/spawners/random/misc_item.dm b/code/game/objects/effects/spawners/random/misc_item.dm index d92513cf1a4fd..de1151e3ceab2 100644 --- a/code/game/objects/effects/spawners/random/misc_item.dm +++ b/code/game/objects/effects/spawners/random/misc_item.dm @@ -259,7 +259,7 @@ /obj/item/trash/tgmc_tray, /obj/item/trash/boonie, /obj/item/trash/chunk, - /obj/item/trash/barcardine, + /obj/item/trash/barcaridine, /obj/item/trash/mre, /obj/item/trash/berrybar, ) diff --git a/code/game/objects/items/explosives/grenades/bullet_grenade.dm b/code/game/objects/items/explosives/grenades/bullet_grenade.dm new file mode 100644 index 0000000000000..4ae55adb8c4dc --- /dev/null +++ b/code/game/objects/items/explosives/grenades/bullet_grenade.dm @@ -0,0 +1,53 @@ +///bullet grenade: shoots bullets out from itself in a ring +/obj/item/explosive/grenade/bullet + name = "\improper M90 leadburster grenade" + desc = "Leadburster grenades release a short burst of projectiles after detonation. Keep far away from friendlies. Or don't. I'm just a label." + icon_state = "grenade_rad" + item_state = "grenade_rad" + icon_state_mini = "grenade_red" + det_time = 40 + arm_sound = 'sound/weapons/armbomb.ogg' + hud_state = "grenade_he" + + /// amount of rotations that we will do with these bullets + var/rotations = 2 + ///whether we randomly emit or in equal intervals + var/randomized = FALSE + ///sound to play while shooting + var/fire_sound = 'sound/weapons/burst_phaser2.ogg' + /// total amount of bullets to fire, split evenly between rotations + var/projectile_count = 30 + /// range of the bullets + var/range = 7 + /// speed of the bullets + var/speed = 2 + /// ammo type to shoot out: can be ANY ammo type + var/datum/ammo/ammo_type = /datum/ammo/energy/lasgun/marine/heavy_laser + +/obj/item/explosive/grenade/bullet/prime() + var/list/bullets = list() + var/proj_type = /obj/projectile + if(initial(ammo_type.flags_ammo_behavior) & AMMO_HITSCAN) + proj_type = /obj/projectile/hitscan + for(var/i=1 to projectile_count) + var/obj/projectile/proj = new proj_type(src, initial(ammo_type.hitscan_effect_icon)) + proj.generate_bullet(ammo_type) + bullets += proj + + bullet_burst(loc, bullets, src, fire_sound, range, speed, randomized, rotations) + qdel(src) + + +/obj/item/explosive/grenade/bullet/laser + name = "\improper M80 lasburster grenade" + desc = "Lasburster grenades are supercharged to scatter a beam around them when detonating. Keep far away from friendlies. Or don't. I'm just a label." + icon_state = "grenade_lasburster" + item_state = "grenade_lasburster" + icon_state_mini = "grenade_lasburster" + det_time = 40 + hud_state = "grenade_lasburster" + + rotations = -1 + fire_sound = 'sound/weapons/burst_phaser2.ogg' + projectile_count = 20 + ammo_type = /datum/ammo/energy/lasburster diff --git a/code/game/objects/items/explosives/grenades/chem_grenade.dm b/code/game/objects/items/explosives/grenades/chem_grenade.dm index 45e48dfd03a88..4b01313956619 100644 --- a/code/game/objects/items/explosives/grenades/chem_grenade.dm +++ b/code/game/objects/items/explosives/grenades/chem_grenade.dm @@ -40,7 +40,7 @@ else return ..() -/obj/item/explosive/grenade/chem_grenade/razorburn_smol/attackby(obj/item/I, mob/user, params) +/obj/item/explosive/grenade/chem_grenade/razorburn_small/attackby(obj/item/I, mob/user, params) to_chat(user, span_notice("The [initial(name)] is hermetically sealed, and does not open.")) return @@ -237,7 +237,7 @@ icon_state = initial(icon_state) +"_locked" -/obj/item/explosive/grenade/chem_grenade/razorburn_smol +/obj/item/explosive/grenade/chem_grenade/razorburn_small name = "Razorburn Grenade" desc = "Contains construction nanites ready to turn a small area into razorwire after a few seconds. DO NOT ENTER AREA WHILE ACTIVE." icon_state = "grenade_razorburn" @@ -247,7 +247,7 @@ icon_state_mini = "grenade_chem_yellow" -/obj/item/explosive/grenade/chem_grenade/razorburn_smol/Initialize(mapload, ...) +/obj/item/explosive/grenade/chem_grenade/razorburn_small/Initialize(mapload, ...) . = ..() var/obj/item/reagent_containers/glass/beaker/B1 = new(src) var/obj/item/reagent_containers/glass/beaker/B2 = new(src) diff --git a/code/game/objects/items/reagent_containers/food/snacks.dm b/code/game/objects/items/reagent_containers/food/snacks.dm index e89c149ae7640..10474c37301b7 100644 --- a/code/game/objects/items/reagent_containers/food/snacks.dm +++ b/code/game/objects/items/reagent_containers/food/snacks.dm @@ -1479,12 +1479,12 @@ list_reagents = list(/datum/reagent/consumable/nutriment = 5, /datum/reagent/consumable/coco = 10) tastes = list("compressed matter" = 1) -/obj/item/reagent_containers/food/snacks/wrapped/barcardine - name = "Barcardine Bars" +/obj/item/reagent_containers/food/snacks/wrapped/barcaridine + name = "Barcaridine Bars" desc = "A bar of chocolate, it smells like the medical bay. \"Chocolate always helps the pain go away.\"" icon_state = "barcardine" - wrapper = /obj/item/trash/barcardine - list_reagents = list(/datum/reagent/consumable/nutriment = 3, /datum/reagent/consumable/coco = 2, /datum/reagent/medicine/tramadol = 1, /datum/reagent/medicine/tramadol = 1) + wrapper = /obj/item/trash/barcaridine + list_reagents = list(/datum/reagent/consumable/nutriment = 3, /datum/reagent/consumable/coco = 2, /datum/reagent/medicine/tramadol = 2) tastes = list ("cough syrup" = 1) /obj/item/reagent_containers/food/snacks/wrapped/berrybar diff --git a/code/game/objects/items/storage/belt.dm b/code/game/objects/items/storage/belt.dm index 5fcf497eb4128..993d434d9f55b 100644 --- a/code/game/objects/items/storage/belt.dm +++ b/code/game/objects/items/storage/belt.dm @@ -898,7 +898,7 @@ /obj/item/storage/belt/shotgun/martini name = "martini henry ammo belt" desc = "A belt good enough for holding all your .577/400 ball rounds." - icon_state = "marini_belt" + icon_state = "martini_belt" storage_slots = 12 max_storage_space = 24 sprite_slots = 6 @@ -920,18 +920,22 @@ to_chat(user, span_notice("[src] can only be filled with .557/440 ball rifle rounds.")) return + return ..() /obj/item/storage/belt/shotgun/martini/attack_hand(mob/living/user) - if (loc != user) + if(!ishuman(user)) + return + + if(loc != user) . = ..() for(var/mob/M in content_watchers) close(M) - if(!draw_mode || !ishuman(user) && !length(contents)) - open(user) - if(!length(contents)) - return + open(user) //Empty belt? Open the inventory + + if(!draw_mode) + return ..() //No draw mode so we just click like normal var/obj/item/I = contents[length(contents)] if(!istype(I, /obj/item/ammo_magazine/handful)) @@ -946,7 +950,6 @@ existing_handful.create_handful(user, 1) update_icon() - /obj/item/storage/belt/knifepouch name="\improper M276 pattern knife rig" desc="The M276 is the standard load-bearing equipment of the TGMC. It consists of a modular belt with various clips. This version is specially designed with six holsters to store throwing knives. Not commonly issued, but kept in service." diff --git a/code/game/objects/items/storage/boxes.dm b/code/game/objects/items/storage/boxes.dm index 70e32d64e8bbe..894e43486ed15 100644 --- a/code/game/objects/items/storage/boxes.dm +++ b/code/game/objects/items/storage/boxes.dm @@ -1186,7 +1186,7 @@ storage_slots = 15 max_storage_space = 30 spawn_number = 15 - spawn_type = /obj/item/explosive/grenade/chem_grenade/razorburn_smol + spawn_type = /obj/item/explosive/grenade/chem_grenade/razorburn_small closed_overlay = "grenade_box_overlay_razorburn" /obj/item/storage/box/visual/grenade/razorburn_large @@ -1204,6 +1204,13 @@ spawn_type = /obj/item/explosive/grenade/chem_grenade/teargas closed_overlay = "grenade_box_overlay_teargas" +/obj/item/storage/box/visual/grenade/lasburster + name = "\improper M80 lasburster grenade box" + desc = "A secure box holding 25 M80 lasburster grenades." + spawn_number = 25 + spawn_type = /obj/item/explosive/grenade/bullet/laser + closed_overlay = "grenade_box_overlay_grenade_lasburster" + /obj/item/storage/box/visual/grenade/training name = "\improper M07 training grenade box" desc = "A secure box holding 25 M07 training grenades. Harmless and reusable." diff --git a/code/game/objects/items/storage/pouch.dm b/code/game/objects/items/storage/pouch.dm index 6f82121241c7a..07027e2c0ce55 100644 --- a/code/game/objects/items/storage/pouch.dm +++ b/code/game/objects/items/storage/pouch.dm @@ -395,9 +395,9 @@ /obj/item/storage/pouch/explosive/razorburn/Initialize(mapload) . = ..() - new /obj/item/explosive/grenade/chem_grenade/razorburn_smol(src) - new /obj/item/explosive/grenade/chem_grenade/razorburn_smol(src) - new /obj/item/explosive/grenade/chem_grenade/razorburn_smol(src) + new /obj/item/explosive/grenade/chem_grenade/razorburn_small(src) + new /obj/item/explosive/grenade/chem_grenade/razorburn_small(src) + new /obj/item/explosive/grenade/chem_grenade/razorburn_small(src) new /obj/item/explosive/grenade/chem_grenade/razorburn_large(src) /obj/item/storage/pouch/explosive/upp diff --git a/code/game/objects/items/tools/flame_tools.dm b/code/game/objects/items/tools/flame_tools.dm index e2a2e51998dd7..7fa9fe5222f57 100644 --- a/code/game/objects/items/tools/flame_tools.dm +++ b/code/game/objects/items/tools/flame_tools.dm @@ -411,7 +411,7 @@ CIGARETTE PACKETS ARE IN FANCY.DM /obj/item/clothing/mask/cigarette/bica name = "strawberry flavored cigarette" - desc = "Red tipped. Has got a single word stamped on the side: \"(BICARDINE)\"." + desc = "Red tipped. Has got a single word stamped on the side: \"(BICARIDINE)\"." icon_state = "bicacigoff" item_state = "bicacigoff" icon_on = "bicacigon" diff --git a/code/game/objects/items/trash.dm b/code/game/objects/items/trash.dm index 9d6c8722ff65e..4167ec4a2be05 100644 --- a/code/game/objects/items/trash.dm +++ b/code/game/objects/items/trash.dm @@ -148,9 +148,9 @@ desc = "An empty box from a chunk bar. Significantly less heavy." icon_state = "chunk_trash" -/obj/item/trash/barcardine - name = "barcardine bar wrapper" - desc = "An empty wrapper from a barcardine bar. You notice the inside has several medical labels. You're not sure if you care or not about that." +/obj/item/trash/barcaridine + name = "barcaridine bar wrapper" + desc = "An empty wrapper from a barcaridine bar. You notice the inside has several medical labels. You're not sure if you care or not about that." icon_state = "barcardine_trash" /obj/item/trash/berrybar diff --git a/code/game/objects/items/weapons/twohanded.dm b/code/game/objects/items/weapons/twohanded.dm index 93b0981ce5854..b9c0fc3194e1f 100644 --- a/code/game/objects/items/weapons/twohanded.dm +++ b/code/game/objects/items/weapons/twohanded.dm @@ -390,7 +390,7 @@ /obj/item/weapon/twohanded/spear/tactical/tacticool name = "M-23 TACTICOOL spear" - icon = 'icons/Marine/gun64.dmi' + icon = 'icons/Marine/spear.dmi' desc = "A TACTICOOL spear. Used for TACTICOOLNESS in combat." /obj/item/weapon/twohanded/spear/tactical/tacticool/Initialize(mapload) diff --git a/code/game/objects/machinery/cic_maptable.dm b/code/game/objects/machinery/cic_maptable.dm index 6d467d9e8ad92..af9ccd28672e9 100644 --- a/code/game/objects/machinery/cic_maptable.dm +++ b/code/game/objects/machinery/cic_maptable.dm @@ -178,9 +178,16 @@ pixel_x = -16 pixel_y = -14 coverage = 75 - allow_pass_flags = PASS_LOW_STRUCTURE|PASSABLE + allow_pass_flags = PASS_LOW_STRUCTURE|PASSABLE|PASS_WALKOVER bound_width = 64 +/obj/machinery/cic_maptable/drawable/big/Initialize(mapload) + . = ..() + var/static/list/connections = list( + COMSIG_OBJ_TRY_ALLOW_THROUGH = PROC_REF(can_climb_over), + ) + AddElement(/datum/element/connect_loc, connections) + /obj/machinery/cic_maptable/drawable/big/som minimap_flag = MINIMAP_FLAG_MARINE_SOM screen_overlay = "som_maptable_screen" diff --git a/code/game/objects/machinery/computer/communications.dm b/code/game/objects/machinery/computer/communications.dm index c09e114651341..6f473322125ae 100644 --- a/code/game/objects/machinery/computer/communications.dm +++ b/code/game/objects/machinery/computer/communications.dm @@ -118,7 +118,7 @@ to_chat(usr, span_warning("That announcement contained charachters prohibited in IC chat! Consider reviewing the server rules.")) return FALSE - priority_announce(input, type = ANNOUNCEMENT_COMMAND) + priority_announce(input, subtitle = "Sent by [usr]", type = ANNOUNCEMENT_COMMAND) message_admins("[ADMIN_TPMONTY(usr)] has just sent a command announcement") log_game("[key_name(usr)] has just sent a command announcement.") cooldown_message = world.time diff --git a/code/game/objects/machinery/mortar.dm b/code/game/objects/machinery/mortar.dm index f50035ad0a820..aa9f6f0439cc0 100644 --- a/code/game/objects/machinery/mortar.dm +++ b/code/game/objects/machinery/mortar.dm @@ -577,6 +577,8 @@ allowed_shells = list( /obj/item/mortal_shell/rocket/mlrs, /obj/item/mortal_shell/rocket/mlrs/gas, + /obj/item/mortal_shell/rocket/mlrs/incendiary, + /obj/item/mortal_shell/rocket/mlrs/cloak, ) tally_type = TALLY_ROCKET_ARTY cool_off_time = 80 SECONDS @@ -741,6 +743,18 @@ icon_state = "mlrs_rocket_gas" ammo_type = /datum/ammo/mortar/rocket/smoke/mlrs +/obj/item/mortal_shell/rocket/mlrs/cloak + name = "\improper 60mm 'S-2' cloak rocket" + desc = "A 60mm rocket loaded with cloak smoke that hides any friendlies inside of it with advanced chemical technology." + icon_state = "mlrs_rocket_cloak" + ammo_type = /datum/ammo/mortar/rocket/smoke/mlrs + +/obj/item/mortal_shell/rocket/mlrs/incendiary + name = "\improper 60mm incendiary rocket" + desc = "A 60mm rocket loaded with an incendiary payload with a minor side of explosive." + icon_state = "mlrs_rocket_incendiary" + ammo_type = /datum/ammo/mortar/rocket/mlrs/incendiary + /obj/structure/closet/crate/mortar_ammo name = "\improper T-50S mortar ammo crate" desc = "A crate containing live mortar shells with various payloads. DO NOT DROP. KEEP AWAY FROM FIRE SOURCES." @@ -919,5 +933,53 @@ new /obj/item/mortal_shell/rocket/mlrs/gas(src) new /obj/item/mortal_shell/rocket/mlrs/gas(src) +/obj/item/storage/box/mlrs_rocket_incendiary + name = "\improper TA-40L incendiary rocket crate" + desc = "A large case containing rockets in a compressed setting for the TA-40L MLRS. Drag this sprite into you to open it up!\nNOTE: You cannot put items back inside this case." + storage_slots = 16 + +/obj/item/storage/box/mlrs_rocket_incendiary/Initialize(mapload) + . = ..() + new /obj/item/mortal_shell/rocket/mlrs/incendiary(src) + new /obj/item/mortal_shell/rocket/mlrs/incendiary(src) + new /obj/item/mortal_shell/rocket/mlrs/incendiary(src) + new /obj/item/mortal_shell/rocket/mlrs/incendiary(src) + new /obj/item/mortal_shell/rocket/mlrs/incendiary(src) + new /obj/item/mortal_shell/rocket/mlrs/incendiary(src) + new /obj/item/mortal_shell/rocket/mlrs/incendiary(src) + new /obj/item/mortal_shell/rocket/mlrs/incendiary(src) + new /obj/item/mortal_shell/rocket/mlrs/incendiary(src) + new /obj/item/mortal_shell/rocket/mlrs/incendiary(src) + new /obj/item/mortal_shell/rocket/mlrs/incendiary(src) + new /obj/item/mortal_shell/rocket/mlrs/incendiary(src) + new /obj/item/mortal_shell/rocket/mlrs/incendiary(src) + new /obj/item/mortal_shell/rocket/mlrs/incendiary(src) + new /obj/item/mortal_shell/rocket/mlrs/incendiary(src) + new /obj/item/mortal_shell/rocket/mlrs/incendiary(src) + +/obj/item/storage/box/mlrs_rocket_gas_cloak + name = "\improper TA-40L 'S-2' rocket crate" + desc = "A large case containing rockets in a compressed setting for the TA-40L MLRS. Drag this sprite into you to open it up!\nNOTE: You cannot put items back inside this case." + storage_slots = 16 + +/obj/item/storage/box/mlrs_rocket_gas_cloak/Initialize(mapload) + . = ..() + new /obj/item/mortal_shell/rocket/mlrs/cloak(src) + new /obj/item/mortal_shell/rocket/mlrs/cloak(src) + new /obj/item/mortal_shell/rocket/mlrs/cloak(src) + new /obj/item/mortal_shell/rocket/mlrs/cloak(src) + new /obj/item/mortal_shell/rocket/mlrs/cloak(src) + new /obj/item/mortal_shell/rocket/mlrs/cloak(src) + new /obj/item/mortal_shell/rocket/mlrs/cloak(src) + new /obj/item/mortal_shell/rocket/mlrs/cloak(src) + new /obj/item/mortal_shell/rocket/mlrs/cloak(src) + new /obj/item/mortal_shell/rocket/mlrs/cloak(src) + new /obj/item/mortal_shell/rocket/mlrs/cloak(src) + new /obj/item/mortal_shell/rocket/mlrs/cloak(src) + new /obj/item/mortal_shell/rocket/mlrs/cloak(src) + new /obj/item/mortal_shell/rocket/mlrs/cloak(src) + new /obj/item/mortal_shell/rocket/mlrs/cloak(src) + new /obj/item/mortal_shell/rocket/mlrs/cloak(src) + #undef TALLY_MORTAR #undef TALLY_HOWITZER diff --git a/code/game/objects/machinery/self_destruct.dm b/code/game/objects/machinery/self_destruct.dm index c31edda08bd86..95f89676ce6dd 100644 --- a/code/game/objects/machinery/self_destruct.dm +++ b/code/game/objects/machinery/self_destruct.dm @@ -81,7 +81,7 @@ if("dest_start") to_chat(usr, span_notice("You press a few keys on the panel.")) to_chat(usr, span_notice("The system must be booting up the self-destruct sequence now.")) - priority_announce("Danger. The emergency destruct system is now activated. The ship will detonate in T-minus 20 minutes. Automatic detonation is unavailable. Manual detonation is required.", "Priority Alert", sound = 'sound/AI/selfdestruct.ogg') + priority_announce("Danger. The emergency destruct system is now activated. The ship will detonate in T-minus 20 minutes. Automatic detonation is unavailable. Manual detonation is required.", title = "Self Destruct System", type = ANNOUNCEMENT_PRIORITY, sound = 'sound/AI/selfdestruct.ogg', color_override = "purple") active_state = SELF_DESTRUCT_MACHINE_ARMED var/obj/machinery/self_destruct/rod/I = SSevacuation.dest_rods[SSevacuation.dest_index] I.activate_time = world.time diff --git a/code/game/objects/machinery/vending/marine_vending.dm b/code/game/objects/machinery/vending/marine_vending.dm index 832e1fa3e6c5f..a58fb08aa3026 100644 --- a/code/game/objects/machinery/vending/marine_vending.dm +++ b/code/game/objects/machinery/vending/marine_vending.dm @@ -39,7 +39,7 @@ /obj/item/ammo_magazine/smg/standard_machinepistol = -1, /obj/item/weapon/gun/smg/standard_heavysmg = -1, /obj/item/ammo_magazine/smg/standard_heavysmg = -1, - /obj/item/ammo_magazine/smg/standard_heavysmg/hollowpoint = -1, + /obj/item/ammo_magazine/smg/standard_heavysmg/squashhead = -1, ), "Marksman" = list( /obj/item/weapon/gun/rifle/standard_dmr = -1, @@ -122,6 +122,7 @@ /obj/item/explosive/grenade/smokebomb/cloak = 25, /obj/item/explosive/grenade/sticky/cloaker = 10, /obj/item/explosive/grenade/mirage = 100, + /obj/item/explosive/grenade/bullet/laser = 30, /obj/item/storage/box/m94 = 200, /obj/item/storage/box/m94/cas = 30, ), @@ -256,7 +257,7 @@ /obj/item/ammo_magazine/smg/standard_machinepistol = -1, /obj/item/weapon/gun/smg/standard_heavysmg = -1, /obj/item/ammo_magazine/smg/standard_heavysmg = -1, - /obj/item/ammo_magazine/smg/standard_heavysmg/hollowpoint = -1, + /obj/item/ammo_magazine/smg/standard_heavysmg/squashhead = -1, ), "Marksman" = list( /obj/item/weapon/gun/rifle/standard_dmr = -1, @@ -330,6 +331,7 @@ /obj/item/explosive/grenade/incendiary = 50, /obj/item/explosive/grenade/smokebomb/cloak = 25, /obj/item/explosive/grenade/mirage = 100, + /obj/item/explosive/grenade/bullet/laser = 30, /obj/item/storage/box/m94 = 200, /obj/item/storage/box/m94/cas = 50, ), @@ -456,7 +458,7 @@ /obj/item/ammo_magazine/smg/standard_machinepistol = -1, /obj/item/weapon/gun/smg/standard_heavysmg = -1, /obj/item/ammo_magazine/smg/standard_heavysmg = -1, - /obj/item/ammo_magazine/smg/standard_heavysmg/hollowpoint = -1, + /obj/item/ammo_magazine/smg/standard_heavysmg/squashhead = -1, ), "Marksman" = list( /obj/item/weapon/gun/rifle/standard_dmr = -1, @@ -543,6 +545,7 @@ /obj/item/explosive/grenade/smokebomb/cloak = -1, /obj/item/explosive/grenade/smokebomb/drain = -1, /obj/item/explosive/grenade/mirage = -1, + /obj/item/explosive/grenade/bullet/laser = -1, /obj/item/storage/box/m94 = -1, /obj/item/storage/box/m94/cas = -1, ), @@ -757,6 +760,7 @@ /obj/item/storage/box/visual/grenade/incendiary = 2, /obj/item/storage/box/visual/grenade/M15 = 2, /obj/item/storage/box/visual/grenade/cloak = 1, + /obj/item/storage/box/visual/grenade/lasburster = 1, ), "Ammo Boxes" = list( /obj/item/big_ammo_box = -1, @@ -1502,6 +1506,7 @@ /obj/item/storage/backpack/marine/satchel/scout_cloak/scout = -1, /obj/item/storage/backpack/marine/satchel/scout_cloak/sniper = -1, /obj/item/storage/belt/grenade/b17 = -1, + /obj/item/storage/holster/m25 = -1, /obj/item/armor_module/module/valkyrie_autodoc = -1, /obj/item/armor_module/module/fire_proof = -1, /obj/item/armor_module/module/fire_proof_helmet = -1, @@ -1608,6 +1613,12 @@ /obj/item/weapon/gun/energy/lasgun/lasrifle/volkite/culverin = -1, /obj/item/cell/lasgun/volkite = -1, /obj/item/cell/lasgun/volkite/powerpack = -1, + /obj/item/weapon/gun/launcher/rocket/som = -1, + /obj/item/ammo_magazine/rocket/som = -1, + /obj/item/ammo_magazine/rocket/som/incendiary = -1, + /obj/item/ammo_magazine/rocket/som/heat = -1, + /obj/item/weapon/gun/flamer/som = -1, + /obj/item/ammo_magazine/flamer_tank/large/som = -1, ), "ICC" = list( /obj/item/weapon/gun/rifle/icc_battlecarbine = -1, @@ -1637,6 +1648,15 @@ /obj/item/ammo_magazine/rifle/dpm = -1, /obj/item/weapon/gun/clf_heavyrifle = -1, /obj/item/shotgunbox/clf_heavyrifle = -1, + /obj/item/weapon/gun/launcher/rocket/icc = -1, + /obj/item/ammo_magazine/rocket/icc = -1, + /obj/item/ammo_magazine/rocket/icc/heat = -1, + /obj/item/ammo_magazine/rocket/icc/thermobaric = -1, + /obj/item/weapon/gun/rifle/icc_mg = -1, + /obj/item/ammo_magazine/icc_mg = -1, + /obj/item/ammo_magazine/icc_mg/belt = -1, + /obj/item/weapon/gun/icc_hmg = -1, + /obj/item/ammo_magazine/icc_hmg = -1, ), "PMC" = list( /obj/item/weapon/gun/rifle/sniper/elite = -1, diff --git a/code/game/objects/machinery/vending/new_marine_vendors.dm b/code/game/objects/machinery/vending/new_marine_vendors.dm index 8e4e47adce6cd..a828b87e7f127 100644 --- a/code/game/objects/machinery/vending/new_marine_vendors.dm +++ b/code/game/objects/machinery/vending/new_marine_vendors.dm @@ -710,7 +710,7 @@ /obj/effect/vendor_bundle/engi gear_to_spawn = list( /obj/item/explosive/plastique, - /obj/item/explosive/grenade/chem_grenade/razorburn_smol, + /obj/item/explosive/grenade/chem_grenade/razorburn_small, /obj/item/clothing/gloves/marine/insulated, /obj/item/cell/high, /obj/item/lightreplacer, diff --git a/code/game/objects/machinery/vending/vending_types.dm b/code/game/objects/machinery/vending/vending_types.dm index 8a1856e0dc3a7..dd98590df3fbb 100644 --- a/code/game/objects/machinery/vending/vending_types.dm +++ b/code/game/objects/machinery/vending/vending_types.dm @@ -112,7 +112,7 @@ /obj/item/reagent_containers/food/snacks/enrg_bar = -1, /obj/item/reagent_containers/food/snacks/wrapped/booniebars = -1, /obj/item/reagent_containers/food/snacks/wrapped/chunk = -1, - /obj/item/reagent_containers/food/snacks/wrapped/barcardine = -1, + /obj/item/reagent_containers/food/snacks/wrapped/barcaridine = -1, /obj/item/reagent_containers/food/snacks/lollipop = -1, /obj/item/reagent_containers/food/snacks/wrapped/berrybar = -1, ) diff --git a/code/game/objects/structures/campaign_props.dm b/code/game/objects/structures/campaign_props.dm index 6ce4356e27b24..c0beb09ae244e 100644 --- a/code/game/objects/structures/campaign_props.dm +++ b/code/game/objects/structures/campaign_props.dm @@ -27,7 +27,7 @@ /obj/structure/prop/train/update_overlays() . = ..() - var/image/new_overlay = image(icon, src, "[icon_state]_overlay", ABOVE_MOB_LAYER, dir) + var/image/new_overlay = image(icon, src, "[icon_state]_overlay", ABOVE_ALL_MOB_LAYER, dir) . += new_overlay /obj/structure/prop/train/carriage diff --git a/code/game/objects/structures/campaign_structures/destroy_objectives.dm b/code/game/objects/structures/campaign_structures/destroy_objectives.dm index 6965902ed9e74..d93c75896dafe 100644 --- a/code/game/objects/structures/campaign_structures/destroy_objectives.dm +++ b/code/game/objects/structures/campaign_structures/destroy_objectives.dm @@ -73,7 +73,7 @@ /obj/structure/campaign_objective/destruction_objective/mlrs/update_overlays() . = ..() - var/image/new_overlay = image(icon, src, "[icon_state]_overlay", ABOVE_MOB_LAYER, dir) + var/image/new_overlay = image(icon, src, "[icon_state]_overlay", ABOVE_ALL_MOB_LAYER, dir) . += new_overlay /obj/structure/campaign_objective/destruction_objective/mlrs/plastique_act(mob/living/plastique_user) @@ -173,7 +173,7 @@ /obj/structure/campaign_objective/destruction_objective/supply_objective/train/update_overlays() . = ..() - var/image/new_overlay = image(icon, src, "[icon_state]_overlay", ABOVE_MOB_LAYER, dir) + var/image/new_overlay = image(icon, src, "[icon_state]_overlay", ABOVE_ALL_MOB_LAYER, dir) . += new_overlay /obj/effect/landmark/campaign_structure/train/carriage @@ -209,7 +209,7 @@ /obj/structure/campaign_objective/destruction_objective/supply_objective/phoron_stack/update_overlays() . = ..() - var/image/new_overlay = image(icon, src, "[icon_state]_overlay", ABOVE_MOB_LAYER, dir) + var/image/new_overlay = image(icon, src, "[icon_state]_overlay", ABOVE_ALL_MOB_LAYER, dir) . += new_overlay //NT base diff --git a/code/game/objects/structures/orbital_cannon.dm b/code/game/objects/structures/orbital_cannon.dm index 20f9dd775559a..1f6d075f97d4c 100644 --- a/code/game/objects/structures/orbital_cannon.dm +++ b/code/game/objects/structures/orbital_cannon.dm @@ -208,11 +208,22 @@ if("plasma") inaccurate_fuel = abs(GLOB.marine_main_ship?.ob_type_fuel_requirements[4] - tray.fuel_amt) + // Give marines a warning if misfuelled. + var/fuel_warning = "Warhead fuel level: safe." + if(inaccurate_fuel > 0) + fuel_warning = "Warhead fuel level: incorrect.
Warhead may be inaccurate." + var/turf/target = locate(T.x + inaccurate_fuel * pick(-1,1),T.y + inaccurate_fuel * pick(-1,1),T.z) - playsound_z_humans(target.z, 'sound/effects/OB_warning_announce.ogg', 100) //for marines on ground + priority_announce( + message = "Get out of danger close!

Warhead type: [tray.warhead.warhead_kind].
[fuel_warning]
Estimated location of impact: [get_area(T)].", + title = "Orbital bombardment launch command detected!", + type = ANNOUNCEMENT_PRIORITY, + sound = 'sound/effects/OB_warning_announce.ogg', + channel_override = SSsounds.random_available_channel(), // This way, we can't have it be cut off by other sounds. + color_override = "red" + ) playsound(target, 'sound/effects/OB_warning_announce_novoiceover.ogg', 125, FALSE, 30, 10) //VOX-less version for xenomorphs - playsound_z(z, 'sound/effects/OB_warning_announce.ogg', 100) //for the ship var/impact_time = 10 SECONDS + (WARHEAD_FLY_TIME * (GLOB.current_orbit/3)) diff --git a/code/modules/admin/fun_verbs.dm b/code/modules/admin/fun_verbs.dm index 885c25e96243b..52299a0233c15 100644 --- a/code/modules/admin/fun_verbs.dm +++ b/code/modules/admin/fun_verbs.dm @@ -54,16 +54,19 @@ if(!check_rights(R_FUN)) return - var/customname = tgui_input_text(usr, "What do you want it to be called?.", "Queen Mother Report", "Queen Mother", encode = FALSE) + var/customname = tgui_input_text(usr, "What do you want the title of this report to be?", "Report Title", "Queen Mother Directive", encode = FALSE) var/input = tgui_input_text(usr, "This should be a message from the ruler of the Xenomorph race.", "Queen Mother Report", "", multiline = TRUE, encode = FALSE) if(!input || !customname) return - var/msg = "[span_faction_alert("[span_faction_alert_title("[customname]")]
[span_faction_alert_text("[html_encode(input)]")]")]" for(var/i in (GLOB.xeno_mob_list + GLOB.observer_list)) var/mob/M = i - to_chat(M, msg) + to_chat(M, assemble_alert( + title = customname, + message = input, + color_override = "purple" + )) log_admin("[key_name(usr)] created a Queen Mother report: [input]") message_admins("[ADMIN_TPMONTY(usr)] created a Queen Mother report.") @@ -137,7 +140,9 @@ var/customname = tgui_input_text(usr, "Pick a title for the report.", "Title", "TGMC Update", encode = FALSE) + var/customsubtitle = tgui_input_text(usr, "Pick a subtitle for the report.", "Subtitle", "", encode = FALSE) var/input = tgui_input_text(usr, "Please enter anything you want. Anything. Serious.", "What?", "", multiline = TRUE, encode = FALSE) + var/override = tgui_input_list(usr, "Pick a color for the report.", "Color", faction_alert_colors - "default", default = "blue") if(!input || !customname) return @@ -147,9 +152,9 @@ switch(tgui_alert(usr, "Should this be announced to the general population?", "Announce", list("Yes", "No", "Cancel"))) if("Yes") - priority_announce(input, customname, sound = 'sound/AI/commandreport.ogg'); + priority_announce(input, customname, customsubtitle, sound = 'sound/AI/commandreport.ogg', color_override = override); if("No") - priority_announce("New update available at all communication consoles.", type = ANNOUNCEMENT_COMMAND, sound = 'sound/AI/commandreport.ogg') + priority_announce("New update available at all communication consoles.", "Classified Transmission Received", type = ANNOUNCEMENT_PRIORITY, sound = 'sound/AI/commandreport.ogg') else return @@ -284,7 +289,12 @@ GLOB.custom_info = new_info - to_chat(world, "[span_faction_alert("[span_faction_alert_title("Custom Information")][span_faction_alert_subtitle("The following custom information has been set for this round.")]
[span_faction_alert_text("[GLOB.custom_info]")]")]") + to_chat(world, assemble_alert( + title = "Custom Information", + subtitle = "The following custom information has been set for this round.", + message = GLOB.custom_info, + color_override = "red" + )) log_admin("[key_name(usr)] has changed the custom event text: [GLOB.custom_info]") message_admins("[ADMIN_TPMONTY(usr)] has changed the custom event text.") @@ -298,7 +308,12 @@ to_chat(src, span_notice("There currently is no custom information set.")) return - to_chat(src, "[span_faction_alert("[span_faction_alert_title("Custom Information")][span_faction_alert_subtitle("The following custom information has been set for this round.")]
[span_faction_alert_text("[GLOB.custom_info]")]")]") + to_chat(src, assemble_alert( + title = "Custom Information", + subtitle = "The following custom information has been set for this round.", + message = GLOB.custom_info, + color_override = "red" + )) /datum/admins/proc/sound_file(S as sound) diff --git a/code/modules/admin/topic.dm b/code/modules/admin/topic.dm index 866b3ea843f4a..1b3d0c710e318 100644 --- a/code/modules/admin/topic.dm +++ b/code/modules/admin/topic.dm @@ -2148,6 +2148,12 @@ Status: [status ? status : "Unknown"] | Damage: [health ? health : "None"] message_admins(logtext) log_admin(logtext) + else if(href_list["cancelsummon"]) + GLOB.active_summons.Cut() + var/logtext = "[key_name(usr)] has cancelled all psychic summons" + message_admins(logtext) + log_admin(logtext) + else if(href_list["tag_datum"]) if(!check_rights(R_ADMIN)) return diff --git a/code/modules/asset_cache/asset_list.dm b/code/modules/asset_cache/asset_list.dm index 64a831e6532df..c658aece2ae83 100644 --- a/code/modules/asset_cache/asset_list.dm +++ b/code/modules/asset_cache/asset_list.dm @@ -1,4 +1,4 @@ -#define ASSET_CROSS_ROUND_CACHE_DIRECTORY "tmp/assets" +#define ASSET_CROSS_ROUND_CACHE_DIRECTORY "cache/assets" //These datums are used to populate the asset cache, the proc "register()" does this. //Place any asset datums you create in asset_list_items.dm @@ -385,7 +385,7 @@ GLOBAL_LIST_EMPTY(asset_datums) var/icon/sheet_copy = icon(sheet) size[SPRSZ_STRIPPED] = null sheet_copy.Insert(I, icon_state=sprite_name) - size[SPRSZ_ICON] = sheet_copy + size[SPRSZ_ICON] = sheet_copy sprites[sprite_name] = list(size_id, position) else sizes[size_id] = size = list(1, I, null) diff --git a/code/modules/client/client_procs.dm b/code/modules/client/client_procs.dm index 1cf2119a19e7f..9b5c84ce6f1f5 100644 --- a/code/modules/client/client_procs.dm +++ b/code/modules/client/client_procs.dm @@ -269,7 +269,12 @@ return if(GLOB.custom_info) - to_chat(src, "[span_faction_alert("[span_faction_alert_title("Custom Information")][span_faction_alert_subtitle("The following custom information has been set for this round.")]
[span_faction_alert_text("[GLOB.custom_info]")]")]") + to_chat(src, assemble_alert( + title = "Custom Information", + subtitle = "The following custom information has been set for this round.", + message = GLOB.custom_info, + color_override = "red" + )) connection_time = world.time connection_realtime = world.realtime diff --git a/code/modules/clothing/head/head.dm b/code/modules/clothing/head/head.dm index 4c4988862781c..c2adf03181eb9 100644 --- a/code/modules/clothing/head/head.dm +++ b/code/modules/clothing/head/head.dm @@ -39,8 +39,8 @@ icon = 'icons/obj/clothing/headwear/marine_hats.dmi' item_icons = list( slot_head_str = 'icons/mob/clothing/headwear/marine_hats.dmi', - slot_l_hand_str = 'icons/mob/items_lefthand_1.dmi', - slot_r_hand_str = 'icons/mob/items_righthand_1.dmi', + slot_l_hand_str = 'icons/mob/inhands/items/items_left.dmi', + slot_r_hand_str = 'icons/mob/inhands/items/items_right.dmi', ) icon_state = "beanie_cargo" flags_inv_hide = HIDETOPHAIR @@ -53,8 +53,8 @@ icon = 'icons/obj/clothing/headwear/marine_hats.dmi' item_icons = list( slot_head_str = 'icons/mob/clothing/headwear/marine_hats.dmi', - slot_l_hand_str = 'icons/mob/items_lefthand_1.dmi', - slot_r_hand_str = 'icons/mob/items_righthand_1.dmi', + slot_l_hand_str = 'icons/mob/inhands/items/items_left.dmi', + slot_r_hand_str = 'icons/mob/inhands/items/items_right.dmi', ) icon_state = "beret" soft_armor = list(MELEE = 15, BULLET = 15, LASER = 15, ENERGY = 15, BOMB = 10, BIO = 5, FIRE = 5, ACID = 5) @@ -123,8 +123,8 @@ icon = 'icons/obj/clothing/headwear/marine_hats.dmi' item_icons = list( slot_head_str = 'icons/mob/clothing/headwear/marine_hats.dmi', - slot_l_hand_str = 'icons/mob/items_lefthand_1.dmi', - slot_r_hand_str = 'icons/mob/items_righthand_1.dmi', + slot_l_hand_str = 'icons/mob/inhands/items/items_left.dmi', + slot_r_hand_str = 'icons/mob/inhands/items/items_right.dmi', ) soft_armor = list(MELEE = 15, BULLET = 15, LASER = 15, ENERGY = 15, BOMB = 10, BIO = 5, FIRE = 5, ACID = 5) var/flipped_cap = FALSE @@ -203,8 +203,8 @@ icon = 'icons/obj/clothing/headwear/marine_hats.dmi' item_icons = list( slot_head_str = 'icons/mob/clothing/headwear/marine_hats.dmi', - slot_l_hand_str = 'icons/mob/items_lefthand_1.dmi', - slot_r_hand_str = 'icons/mob/items_righthand_1.dmi', + slot_l_hand_str = 'icons/mob/inhands/items/items_left.dmi', + slot_r_hand_str = 'icons/mob/inhands/items/items_right.dmi', ) icon_state = "headband" soft_armor = list(MELEE = 15, BULLET = 15, LASER = 15, ENERGY = 15, BOMB = 10, BIO = 5, FIRE = 5, ACID = 5) @@ -232,8 +232,8 @@ icon = 'icons/obj/clothing/headwear/marine_hats.dmi' item_icons = list( slot_head_str = 'icons/mob/clothing/headwear/marine_hats.dmi', - slot_l_hand_str = 'icons/mob/items_lefthand_1.dmi', - slot_r_hand_str = 'icons/mob/items_righthand_1.dmi', + slot_l_hand_str = 'icons/mob/inhands/items/items_left.dmi', + slot_r_hand_str = 'icons/mob/inhands/items/items_right.dmi', ) /obj/item/clothing/head/cmo @@ -324,8 +324,8 @@ icon_state = "upp_cap" item_icons = list( slot_head_str = 'icons/mob/clothing/headwear/ert_headwear.dmi', - slot_l_hand_str = 'icons/mob/items_lefthand_1.dmi', - slot_r_hand_str = 'icons/mob/items_righthand_1.dmi', + slot_l_hand_str = 'icons/mob/inhands/items/items_left.dmi', + slot_r_hand_str = 'icons/mob/inhands/items/items_right.dmi', ) siemens_coefficient = 2 //anti_hug = 2 @@ -347,8 +347,8 @@ icon = 'icons/obj/clothing/headwear/ert_headwear.dmi' item_icons = list( slot_head_str = 'icons/mob/clothing/headwear/ert_headwear.dmi', - slot_l_hand_str = 'icons/mob/items_lefthand_1.dmi', - slot_r_hand_str = 'icons/mob/items_righthand_1.dmi', + slot_l_hand_str = 'icons/mob/inhands/items/items_left.dmi', + slot_r_hand_str = 'icons/mob/inhands/items/items_right.dmi', ) icon_state = "freelancer_helmet" siemens_coefficient = 2 @@ -388,8 +388,8 @@ icon = 'icons/obj/clothing/headwear/ert_headwear.dmi' item_icons = list( slot_head_str = 'icons/mob/clothing/headwear/ert_headwear.dmi', - slot_l_hand_str = 'icons/mob/items_lefthand_1.dmi', - slot_r_hand_str = 'icons/mob/items_righthand_1.dmi', + slot_l_hand_str = 'icons/mob/inhands/items/items_left.dmi', + slot_r_hand_str = 'icons/mob/inhands/items/items_right.dmi', ) icon_state = "rebel_hood" siemens_coefficient = 2 @@ -418,8 +418,8 @@ desc = "A cap worn by commissars of the Imperial Army. This one seems to radiate authority." item_icons = list( slot_head_str = 'icons/mob/clothing/headwear/ert_headwear.dmi', - slot_l_hand_str = 'icons/mob/items_lefthand_1.dmi', - slot_r_hand_str = 'icons/mob/items_righthand_1.dmi', + slot_l_hand_str = 'icons/mob/inhands/items/items_left.dmi', + slot_r_hand_str = 'icons/mob/inhands/items/items_right.dmi', ) icon = 'icons/obj/clothing/headwear/ert_headwear.dmi' icon_state = "commissar_cap" @@ -431,8 +431,8 @@ desc = "A hat lined with durathread on the outside, has the usual iconic look of a straw hat. A common hat across the bubble." item_icons = list( slot_head_str = 'icons/mob/clothing/headwear/ert_headwear.dmi', - slot_l_hand_str = 'icons/mob/items_lefthand_1.dmi', - slot_r_hand_str = 'icons/mob/items_righthand_1.dmi', + slot_l_hand_str = 'icons/mob/inhands/items/items_left.dmi', + slot_r_hand_str = 'icons/mob/inhands/items/items_right.dmi', ) icon = 'icons/obj/clothing/headwear/ert_headwear.dmi' icon_state = "straw_hat" diff --git a/code/modules/clothing/head/helmet.dm b/code/modules/clothing/head/helmet.dm index cdc67346d1e23..f390e834b63d3 100644 --- a/code/modules/clothing/head/helmet.dm +++ b/code/modules/clothing/head/helmet.dm @@ -114,8 +114,8 @@ icon = 'icons/obj/clothing/headwear/marine_helmets.dmi' item_icons = list( slot_head_str = 'icons/mob/clothing/headwear/marine_helmets.dmi', - slot_l_hand_str = 'icons/mob/items_lefthand_1.dmi', - slot_r_hand_str = 'icons/mob/items_righthand_1.dmi', + slot_l_hand_str = 'icons/mob/inhands/items/items_left.dmi', + slot_r_hand_str = 'icons/mob/inhands/items/items_right.dmi', ) icon_state = "helmet" soft_armor = list(MELEE = 50, BULLET = 50, LASER = 50, ENERGY = 50, BOMB = 50, BIO = 50, FIRE = 50, ACID = 50) @@ -277,8 +277,8 @@ icon = 'icons/obj/clothing/headwear/ert_headwear.dmi' item_icons = list( slot_head_str = 'icons/mob/clothing/headwear/ert_headwear.dmi', - slot_l_hand_str = 'icons/mob/items_lefthand_1.dmi', - slot_r_hand_str = 'icons/mob/items_righthand_1.dmi', + slot_l_hand_str = 'icons/mob/inhands/items/items_left.dmi', + slot_r_hand_str = 'icons/mob/inhands/items/items_right.dmi', ) flags_item = SYNTH_RESTRICTED @@ -340,8 +340,8 @@ icon_state = "guardhelm" item_icons = list( slot_head_str = 'icons/mob/clothing/headwear/ert_headwear.dmi', - slot_l_hand_str = 'icons/mob/items_lefthand_1.dmi', - slot_r_hand_str = 'icons/mob/items_righthand_1.dmi', + slot_l_hand_str = 'icons/mob/inhands/items/items_left.dmi', + slot_r_hand_str = 'icons/mob/inhands/items/items_right.dmi', ) item_state = "guardhelm" flags_item = SYNTH_RESTRICTED @@ -365,8 +365,8 @@ icon = 'icons/obj/clothing/headwear/ert_headwear.dmi' item_icons = list( slot_head_str = 'icons/mob/clothing/headwear/ert_headwear.dmi', - slot_l_hand_str = 'icons/mob/items_lefthand_1.dmi', - slot_r_hand_str = 'icons/mob/items_righthand_1.dmi', + slot_l_hand_str = 'icons/mob/inhands/items/items_left.dmi', + slot_r_hand_str = 'icons/mob/inhands/items/items_right.dmi', ) icon_state = "upp_helmet1" flags_item = SYNTH_RESTRICTED @@ -388,8 +388,8 @@ icon = 'icons/obj/clothing/headwear/marine_hats.dmi' item_icons = list( slot_head_str = 'icons/mob/clothing/headwear/marine_hats.dmi', - slot_l_hand_str = 'icons/mob/items_lefthand_1.dmi', - slot_r_hand_str = 'icons/mob/items_righthand_1.dmi', + slot_l_hand_str = 'icons/mob/inhands/items/items_left.dmi', + slot_r_hand_str = 'icons/mob/inhands/items/items_right.dmi', ) icon_state = "spec" soft_armor = list(MELEE = 35, BULLET = 35, LASER = 35, ENERGY = 15, BOMB = 10, BIO = 0, FIRE = 15, ACID = 15) @@ -433,8 +433,8 @@ icon_state = "som_helmet" item_icons = list( slot_head_str = 'icons/mob/clothing/headwear/ert_headwear.dmi', - slot_l_hand_str = 'icons/mob/items_lefthand_1.dmi', - slot_r_hand_str = 'icons/mob/items_righthand_1.dmi', + slot_l_hand_str = 'icons/mob/inhands/items/items_left.dmi', + slot_r_hand_str = 'icons/mob/inhands/items/items_right.dmi', ) item_state = "som_helmet" soft_armor = list(MELEE = 50, BULLET = 50, LASER = 50, ENERGY = 50, BOMB = 50, BIO = 50, FIRE = 50, ACID = 50) @@ -479,8 +479,8 @@ icon_state = "icc" item_icons = list( slot_head_str = 'icons/mob/clothing/headwear/ert_headwear.dmi', - slot_l_hand_str = 'icons/mob/items_lefthand_1.dmi', - slot_r_hand_str = 'icons/mob/items_righthand_1.dmi', + slot_l_hand_str = 'icons/mob/inhands/items/items_left.dmi', + slot_r_hand_str = 'icons/mob/inhands/items/items_right.dmi', ) item_state = "icc" soft_armor = list(MELEE = 50, BULLET = 60, LASER = 50, ENERGY = 60, BOMB = 70, BIO = 10, FIRE = 60, ACID = 50) diff --git a/code/modules/clothing/modular_armor/attachments/storage.dm b/code/modules/clothing/modular_armor/attachments/storage.dm index beceeebd0f999..e63701af49770 100644 --- a/code/modules/clothing/modular_armor/attachments/storage.dm +++ b/code/modules/clothing/modular_armor/attachments/storage.dm @@ -272,7 +272,7 @@ /obj/item/tool/multitool, /obj/item/binoculars/tactical/range, /obj/item/explosive/plastique, - /obj/item/explosive/grenade/chem_grenade/razorburn_smol, + /obj/item/explosive/grenade/chem_grenade/razorburn_small, /obj/item/explosive/grenade/chem_grenade/razorburn_large, /obj/item/cell/apc, /obj/item/cell/high, diff --git a/code/modules/clothing/modular_armor/combat_robot.dm b/code/modules/clothing/modular_armor/combat_robot.dm index 5b3d6f874b426..03e01cfeb99c8 100644 --- a/code/modules/clothing/modular_armor/combat_robot.dm +++ b/code/modules/clothing/modular_armor/combat_robot.dm @@ -78,8 +78,8 @@ name = "XN-1 upper armor plating" desc = "Medium armor plating designed for self mounting on the upper half of TerraGov combat robotics. It has self-sealing bolts for mounting on robotic owners inside." item_icons = list( - slot_l_hand_str = 'icons/mob/items_lefthand_1.dmi', - slot_r_hand_str = 'icons/mob/items_righthand_1.dmi', + slot_l_hand_str = 'icons/mob/inhands/items/items_left.dmi', + slot_r_hand_str = 'icons/mob/inhands/items/items_right.dmi', ) icon_state = "helmet" item_state = "helmet" diff --git a/code/modules/clothing/modular_armor/jaeger.dm b/code/modules/clothing/modular_armor/jaeger.dm index 29b5121681a36..fba3073e015e2 100644 --- a/code/modules/clothing/modular_armor/jaeger.dm +++ b/code/modules/clothing/modular_armor/jaeger.dm @@ -102,8 +102,8 @@ name = "Jaeger Pattern Infantry Helmet" desc = "Usually paired with the Jaeger Combat Exoskeleton. Can mount utility functions on the helmet hard points. Has Infantry markings." item_icons = list( - slot_l_hand_str = 'icons/mob/items_lefthand_1.dmi', - slot_r_hand_str = 'icons/mob/items_righthand_1.dmi', + slot_l_hand_str = 'icons/mob/inhands/items/items_left.dmi', + slot_r_hand_str = 'icons/mob/inhands/items/items_right.dmi', ) icon_state = "helmet" item_state = "helmet" diff --git a/code/modules/clothing/modular_armor/mark_one.dm b/code/modules/clothing/modular_armor/mark_one.dm index 537adcee5f9e1..4b198166da2fe 100644 --- a/code/modules/clothing/modular_armor/mark_one.dm +++ b/code/modules/clothing/modular_armor/mark_one.dm @@ -5,8 +5,8 @@ icon_state = "helmet" item_state = "helmet" item_icons = list( - slot_l_hand_str = 'icons/mob/items_lefthand_1.dmi', - slot_r_hand_str = 'icons/mob/items_righthand_1.dmi', + slot_l_hand_str = 'icons/mob/inhands/items/items_left.dmi', + slot_r_hand_str = 'icons/mob/inhands/items/items_right.dmi', ) attachments_allowed = list( diff --git a/code/modules/clothing/modular_armor/style_line.dm b/code/modules/clothing/modular_armor/style_line.dm index b420fad0a493e..fdc6d11b0dc1c 100644 --- a/code/modules/clothing/modular_armor/style_line.dm +++ b/code/modules/clothing/modular_armor/style_line.dm @@ -9,8 +9,8 @@ icon = 'icons/obj/clothing/suits/marine_suits.dmi' item_icons = list( slot_wear_suit_str = 'icons/mob/clothing/suits/marine_suits.dmi', - slot_l_hand_str = 'icons/mob/items_lefthand_1.dmi', - slot_r_hand_str = 'icons/mob/items_righthand_1.dmi', + slot_l_hand_str = 'icons/mob/inhands/items/items_left.dmi', + slot_r_hand_str = 'icons/mob/inhands/items/items_right.dmi', ) attachments_allowed = list( // Armor Modules diff --git a/code/modules/clothing/suits/marine_armor.dm b/code/modules/clothing/suits/marine_armor.dm index e5d62a41ba48f..ebde9f67db5ba 100644 --- a/code/modules/clothing/suits/marine_armor.dm +++ b/code/modules/clothing/suits/marine_armor.dm @@ -9,8 +9,8 @@ item_state = "armor" item_icons = list( slot_wear_suit_str = 'icons/mob/clothing/suits/marine_armor.dmi', - slot_l_hand_str = 'icons/mob/items_lefthand_1.dmi', - slot_r_hand_str = 'icons/mob/items_righthand_1.dmi', + slot_l_hand_str = 'icons/mob/inhands/items/items_left.dmi', + slot_r_hand_str = 'icons/mob/inhands/items/items_right.dmi', ) flags_atom = CONDUCT flags_armor_protection = CHEST|GROIN|ARMS|LEGS|HANDS|FEET @@ -216,8 +216,8 @@ icon = 'icons/obj/clothing/suits/ert_suits.dmi' item_icons = list( slot_wear_suit_str = 'icons/mob/clothing/suits/ert_suits.dmi', - slot_l_hand_str = 'icons/mob/items_lefthand_1.dmi', - slot_r_hand_str = 'icons/mob/items_righthand_1.dmi', + slot_l_hand_str = 'icons/mob/inhands/items/items_left.dmi', + slot_r_hand_str = 'icons/mob/inhands/items/items_right.dmi', ) flags_armor_features = ARMOR_LAMP_OVERLAY @@ -290,8 +290,8 @@ icon = 'icons/obj/clothing/suits/ert_suits.dmi' item_icons = list( slot_wear_suit_str = 'icons/mob/clothing/suits/ert_suits.dmi', - slot_l_hand_str = 'icons/mob/items_lefthand_1.dmi', - slot_r_hand_str = 'icons/mob/items_righthand_1.dmi', + slot_l_hand_str = 'icons/mob/inhands/items/items_left.dmi', + slot_r_hand_str = 'icons/mob/inhands/items/items_right.dmi', ) icon_state = "guardarmor" soft_armor = list(MELEE = 75, BULLET = 65, LASER = 60, ENERGY = 60, BOMB = 50, BIO = 0, FIRE = 60, ACID = 60) @@ -338,8 +338,8 @@ icon = 'icons/obj/clothing/suits/ert_suits.dmi' item_icons = list( slot_wear_suit_str = 'icons/mob/clothing/suits/ert_suits.dmi', - slot_l_hand_str = 'icons/mob/items_lefthand_1.dmi', - slot_r_hand_str = 'icons/mob/items_righthand_1.dmi', + slot_l_hand_str = 'icons/mob/inhands/items/items_left.dmi', + slot_r_hand_str = 'icons/mob/inhands/items/items_right.dmi', ) flags_atom = CONDUCT flags_armor_protection = CHEST|GROIN|ARMS|LEGS|FEET|HANDS @@ -644,8 +644,8 @@ icon = 'icons/obj/clothing/suits/ert_suits.dmi' item_icons = list( slot_wear_suit_str = 'icons/mob/clothing/suits/ert_suits.dmi', - slot_l_hand_str = 'icons/mob/items_lefthand_1.dmi', - slot_r_hand_str = 'icons/mob/items_righthand_1.dmi', + slot_l_hand_str = 'icons/mob/inhands/items/items_left.dmi', + slot_r_hand_str = 'icons/mob/inhands/items/items_right.dmi', ) icon_state = "som_armor" item_state = "som_armor" @@ -678,8 +678,8 @@ icon = 'icons/obj/clothing/suits/ert_suits.dmi' item_icons = list( slot_wear_suit_str = 'icons/mob/clothing/suits/ert_suits.dmi', - slot_l_hand_str = 'icons/mob/items_lefthand_1.dmi', - slot_r_hand_str = 'icons/mob/items_righthand_1.dmi', + slot_l_hand_str = 'icons/mob/inhands/items/items_left.dmi', + slot_r_hand_str = 'icons/mob/inhands/items/items_right.dmi', ) icon_state = "icc" slowdown = SLOWDOWN_ARMOR_MEDIUM diff --git a/code/modules/clothing/suits/miscellaneous.dm b/code/modules/clothing/suits/miscellaneous.dm index 6605025912769..a923129adb32f 100644 --- a/code/modules/clothing/suits/miscellaneous.dm +++ b/code/modules/clothing/suits/miscellaneous.dm @@ -350,8 +350,8 @@ icon = 'icons/obj/clothing/suits/ert_suits.dmi' item_icons = list( slot_wear_suit_str = 'icons/mob/clothing/suits/marine_armor.dmi', - slot_l_hand_str = 'icons/mob/items_lefthand_1.dmi', - slot_r_hand_str = 'icons/mob/items_righthand_1.dmi', + slot_l_hand_str = 'icons/mob/inhands/items/items_left.dmi', + slot_r_hand_str = 'icons/mob/inhands/items/items_right.dmi', ) icon_state = "rebel_armor" item_state = "rebel_armor" diff --git a/code/modules/clothing/under/marine_uniform.dm b/code/modules/clothing/under/marine_uniform.dm index 8896d65d0c2f7..4e2f8e7275a99 100644 --- a/code/modules/clothing/under/marine_uniform.dm +++ b/code/modules/clothing/under/marine_uniform.dm @@ -9,8 +9,8 @@ icon_state = "marine_jumpsuit" item_icons = list( slot_w_uniform_str = 'icons/mob/clothing/uniforms/marine_uniforms.dmi', - slot_l_hand_str = 'icons/mob/items_lefthand_1.dmi', - slot_r_hand_str = 'icons/mob/items_righthand_1.dmi', + slot_l_hand_str = 'icons/mob/inhands/items/items_left.dmi', + slot_r_hand_str = 'icons/mob/inhands/items/items_right.dmi', ) has_sensor = 2 adjustment_variants = list( @@ -294,8 +294,8 @@ icon_state = "guardjumpsuit" item_icons = list( slot_w_uniform_str = 'icons/mob/clothing/uniforms/ert_uniforms.dmi', - slot_l_hand_str = 'icons/mob/items_lefthand_1.dmi', - slot_r_hand_str = 'icons/mob/items_righthand_1.dmi', + slot_l_hand_str = 'icons/mob/inhands/items/items_left.dmi', + slot_r_hand_str = 'icons/mob/inhands/items/items_right.dmi', ) item_state = "guardjumpsuit" soft_armor = list(MELEE = 10, BULLET = 10, LASER = 10, ENERGY = 10, BOMB = 10, BIO = 10, FIRE = 10, ACID = 10) @@ -312,8 +312,8 @@ icon = 'icons/obj/clothing/uniforms/ert_uniforms.dmi' item_icons = list( slot_w_uniform_str = 'icons/mob/clothing/uniforms/ert_uniforms.dmi', - slot_l_hand_str = 'icons/mob/items_lefthand_1.dmi', - slot_r_hand_str = 'icons/mob/items_righthand_1.dmi', + slot_l_hand_str = 'icons/mob/inhands/items/items_left.dmi', + slot_r_hand_str = 'icons/mob/inhands/items/items_right.dmi', ) adjustment_variants = list() @@ -521,8 +521,8 @@ icon_state = "icc" item_icons = list( slot_w_uniform_str = 'icons/mob/clothing/uniforms/ert_uniforms.dmi', - slot_l_hand_str = 'icons/mob/items_lefthand_1.dmi', - slot_r_hand_str = 'icons/mob/items_righthand_1.dmi', + slot_l_hand_str = 'icons/mob/inhands/items/items_left.dmi', + slot_r_hand_str = 'icons/mob/inhands/items/items_right.dmi', ) item_state = "icc" has_sensor = FALSE diff --git a/code/modules/factory/howtopaper.dm b/code/modules/factory/howtopaper.dm index 36e56666bb0a8..4636feecde470 100644 --- a/code/modules/factory/howtopaper.dm +++ b/code/modules/factory/howtopaper.dm @@ -19,6 +19,9 @@ PIZZA:
UNBOXER -> CUTTER -> HEATER

+ ALL C4 PLASTIQUES AND DETPACKS:
+ UNBOXER -> CUTTER -> FLATTER
+
ALL SADAR AMMO TYPES:
UNBOXER -> CUTTER -> HEATER -> FLATTER -> ATOMIC RECONSTRUCTOR

@@ -34,7 +37,8 @@ MATEBA SPEEDLOADER:
UNBOXER -> CUTTER -> FLATTER

- RAILGUN MAGAZINE:
+ ALL RAILGUN AMMO:
+ ALL RAILGUN AMMO:
UNBOXER -> CUTTER -> FLATTER -> ATOMIC RECONSTRUCTOR

MINIGUN POWERPACK:
@@ -43,31 +47,49 @@ RAZORFOAM GRENADES:
UNBOXER -> CUTTER -> FORMER -> HEATER

+ SR-127 FLAK AMMO:
+ UNBOXER -> CUTTER -> ATOMIC RECONSTRUCTOR
+
+ SR-127 FLAK AMMO:
+ UNBOXER -> CUTTER -> ATOMIC RECONSTRUCTOR
+
ALL AMR AMMO:
UNBOXER -> CUTTER -> ATOMIC RECONSTRUCTOR

ALL HOWITZER SHELL TYPES:
UNBOXER -> CUTTER -> DRILLER -> COMPRESSOR -> GALVANIZER

- SWAT MASKS:
- UNBOXER -> COMPRESSOR -> GALVANIZER -> CUTTER
-
- MEDICAL EQUIPMENT:
- UNBOXER -> FLATTER -> COMPRESSOR -> DRILLER -> GALVANIZER
-
- ALL MODULES:
- UNBOXER -> CUTTER -> FLATTER -> DRILLER -> HEATER -> COMPRESSOR -> GALVANIZER
-
ALL MORTAR AMMO:
UNBOXER -> CUTTER -> HEATER -> DRILLER -> ATOMIC RECONSTRUCTOR -> GALVANIZER

MLRS ROCKETS:
UNBOXER -> CUTTER -> HEATER -> DRILLER -> COMPRESSOR -> GALVANIZER

+ ALL AGLS AMMO:
+ UNBOXER -> CUTTER -> HEATER -> CONSTRUCTOR -> FLATTER -> GALVANIZER
+
+ ALL TAT AMMO:
+ UNBOXER -> CUTTER -> HEATER -> FLATTER -> COMPRESSOR -> GALVANIZER
+
+ ALL FK-88 AMMO:
+ UNBOXER -> HEATER -> COMPRESSOR -> DRILLER -> GALVANIZER -> FORMER
+
+ ALL ATR-22 AMMO:
+ UNBOXER -> HEATER -> COMPRESSOR -> GALVANIZER -> FORMER
+
THERMOBARIC WP ROCKETS:
UNBOXER -> CUTTER -> HEATER -> FLATTER -> ATOMIC RECONSTRUCTOR -> GALVANIZER

- DROP PODS:
+ SWAT MASKS:
+ UNBOXER -> COMPRESSOR -> GALVANIZER -> CUTTER
+
+ MEDICAL EQUIPMENT:
+ UNBOXER -> FLATTER -> COMPRESSOR -> DRILLER -> GALVANIZER
+
+ ALL MODULES:
+ UNBOXER -> CUTTER -> FLATTER -> DRILLER -> HEATER -> COMPRESSOR -> GALVANIZER
+
+ MISCELLANEOUS EQUIPMENT (DROP PODS, FLOODLIGHTS, CAMERAS):
UNBOXER -> CUTTER -> HEATER -> ATOMIC RECONSTRUCTOR-> FORMER

"} diff --git a/code/modules/factory/parts.dm b/code/modules/factory/parts.dm index d93b1e96c2afa..09e2a62745253 100644 --- a/code/modules/factory/parts.dm +++ b/code/modules/factory/parts.dm @@ -83,6 +83,38 @@ GLOBAL_LIST_INIT(pizza_recipe, list( . = ..() recipe = GLOB.pizza_recipe +GLOBAL_LIST_INIT(plastique_recipe, list( + list(STEP_NEXT_MACHINE = FACTORY_MACHINE_CUTTER, STEP_ICON_STATE = "cutplate"), + list(STEP_NEXT_MACHINE = FACTORY_MACHINE_FLATTER, STEP_ICON_STATE = "hotplate"), +)) + +/obj/item/factory_part/plastique + name = "\improper C4 explosive assembly" + desc = "An unfinshed C4 plastique explosive assembly." + result = /obj/item/explosive/plastique + +/obj/item/factory_part/plastique/Initialize(mapload) + . = ..() + recipe = GLOB.plastique_recipe + +/obj/item/factory_part/plastique_incendiary + name = "\improper EX-62 Genghis incendiary assembly" + desc = "An unfinshed EX-62 Genghis incendiary charge assembly." + result = /obj/item/explosive/plastique/genghis_charge + +/obj/item/factory_part/plastique_incendiary/Initialize(mapload) + . = ..() + recipe = GLOB.plastique_recipe + +/obj/item/factory_part/detpack + name = "\improper Detpack assembly" + desc = "An unfinished Detpack charge assembly" + result = /obj/item/detpack + +/obj/item/factory_part/detpack/Initialize(mapload) + . = ..() + recipe = GLOB.plastique_recipe + GLOBAL_LIST_INIT(sadar_ammo_recipe, list( list(STEP_NEXT_MACHINE = FACTORY_MACHINE_CUTTER, STEP_ICON_STATE = "uncutplate"), list(STEP_NEXT_MACHINE = FACTORY_MACHINE_HEATER, STEP_ICON_STATE = "cutplate"), @@ -277,6 +309,24 @@ GLOBAL_LIST_INIT(IFF_ammo, list( . = ..() recipe = GLOB.IFF_ammo +/obj/item/factory_part/sniper_flak_magazine + name = "\improper FLAK sniper bullet box" + desc = "A box with unfinished flak sniper rounds inside." + result = /obj/item/ammo_magazine/rifle/chamberedrifle/flak + +/obj/item/factory_part/sniper_flak_magazine/Initialize(mapload) + . = ..() + recipe = GLOB.IFF_ammo + +/obj/item/factory_part/sniper_flak_magazine + name = "\improper FLAK sniper bullet box" + desc = "A box with unfinished flak sniper rounds inside." + result = /obj/item/ammo_magazine/rifle/chamberedrifle/flak + +/obj/item/factory_part/sniper_flak_magazine/Initialize(mapload) + . = ..() + recipe = GLOB.IFF_ammo + GLOBAL_LIST_INIT(mateba_speedloader, list( list(STEP_NEXT_MACHINE = FACTORY_MACHINE_CUTTER, STEP_ICON_STATE = "uncutplate"), list(STEP_NEXT_MACHINE = FACTORY_MACHINE_FLATTER, STEP_ICON_STATE = "bulletbox"), @@ -306,6 +356,24 @@ GLOBAL_LIST_INIT(railgun_magazine, list( . = ..() recipe = GLOB.railgun_magazine +/obj/item/factory_part/railgun_hvap_magazine + name = "railgun round" + desc = "An unfinished magnetically propelled steel rod." + result = /obj/item/ammo_magazine/railgun/hvap + +/obj/item/factory_part/railgun_hvap_magazine/Initialize(mapload) + . = ..() + recipe = GLOB.railgun_magazine + +/obj/item/factory_part/railgun_smart_magazine + name = "railgun round" + desc = "An unfinished magnetically propelled steel rod." + result = /obj/item/ammo_magazine/railgun/smart + +/obj/item/factory_part/railgun_smart_magazine/Initialize(mapload) + . = ..() + recipe = GLOB.railgun_magazine + GLOBAL_LIST_INIT(minigun_powerpack, list( list(STEP_NEXT_MACHINE = FACTORY_MACHINE_CUTTER, STEP_ICON_STATE = "uncutplate"), list(STEP_NEXT_MACHINE = FACTORY_MACHINE_CONSTRUCTOR, STEP_ICON_STATE = "cutplate"), @@ -328,7 +396,7 @@ GLOBAL_LIST_INIT(razornade, list( /obj/item/factory_part/razornade name = "razorfoam grenade" desc = "An unfinished Razorfoam grenade casing." - result = /obj/item/explosive/grenade/chem_grenade/razorburn_smol + result = /obj/item/explosive/grenade/chem_grenade/razorburn_small /obj/item/factory_part/razornade/Initialize(mapload) . = ..() @@ -572,7 +640,7 @@ GLOBAL_LIST_INIT(thermobaric_wp_recipe, list( . = ..() recipe = GLOB.thermobaric_wp_recipe -GLOBAL_LIST_INIT(drop_pod_recipe, list( +GLOBAL_LIST_INIT(equipment_recipe, list( list(STEP_NEXT_MACHINE = FACTORY_MACHINE_CUTTER, STEP_ICON_STATE = "uncutplate"), list(STEP_NEXT_MACHINE = FACTORY_MACHINE_HEATER, STEP_ICON_STATE = "cutplate"), list(STEP_NEXT_MACHINE = FACTORY_MACHINE_CONSTRUCTOR, STEP_ICON_STATE = "hotplate"), @@ -581,10 +649,193 @@ GLOBAL_LIST_INIT(drop_pod_recipe, list( /obj/item/factory_part/drop_pod name = "TGMC Zeus orbital drop pod assembly" - desc = "An incomplete Zeus orbital drop pod assembly" + desc = "An incomplete Zeus orbital drop pod assembly." result = /obj/structure/droppod /obj/item/factory_part/drop_pod/Initialize(mapload) . = ..() - recipe = GLOB.drop_pod_recipe + recipe = GLOB.equipment_recipe + +/obj/item/factory_part/deployable_floodlight + name = "\improper deployable floodlight assembly" + desc = "An incomplete deployable floodlight assembly." + result = /obj/item/deployable_floodlight + +/obj/item/factory_part/deployable_floodlight/Initialize(mapload) + . = ..() + recipe = GLOB.equipment_recipe + +/obj/item/factory_part/deployable_camera + name = "\improper deployable security camera assembly" + desc = "An incomplete deployable security camera assembly." + result = /obj/item/deployable_camera + +/obj/item/factory_part/deployable_camera/Initialize(mapload) + . = ..() + recipe = GLOB.equipment_recipe + +GLOBAL_LIST_INIT(agls_recipe, list( + list(STEP_NEXT_MACHINE = FACTORY_MACHINE_CUTTER, STEP_ICON_STATE = "uncutplate"), + list(STEP_NEXT_MACHINE = FACTORY_MACHINE_HEATER, STEP_ICON_STATE = "cutplate"), + list(STEP_NEXT_MACHINE = FACTORY_MACHINE_CONSTRUCTOR, STEP_ICON_STATE = "hotplate"), + list(STEP_NEXT_MACHINE = FACTORY_MACHINE_FLATTER, STEP_ICON_STATE = "rockettube"), + list(STEP_NEXT_MACHINE = FACTORY_MACHINE_GALVANIZER, STEP_ICON_STATE = "hotplate"), + )) + +/obj/item/factory_part/agls_he + name = "\improper AGLS HE magazine assembly" + desc = "An incomplete AGLS HE magazine assembly." + result = /obj/item/ammo_magazine/standard_agls + +/obj/item/factory_part/obj/item/factory_part/agls_he/Initialize(mapload) + . = ..() + recipe = GLOB.agls_recipe + +/obj/item/factory_part/agls_frag + name = "\improper AGLS Frag magazine assembly" + desc = "An incomplete AGLS Frag magazine assembly." + result = /obj/item/ammo_magazine/standard_agls/fragmentation + +/obj/item/factory_part/agls_frag/Initialize(mapload) + . = ..() + recipe = GLOB.agls_recipe + +/obj/item/factory_part/agls_incendiary + name = "\improper AGLS HE magazine assembly" + desc = "An incomplete AGLS HE magazine assembly." + result = /obj/item/ammo_magazine/standard_agls/incendiary + +/obj/item/factory_part/agls_incendiary/Initialize(mapload) + . = ..() + recipe = GLOB.agls_recipe +/obj/item/factory_part/agls_flare + name = "\improper AGLS HE magazine assembly" + desc = "An incomplete AGLS HE magazine assembly." + result = /obj/item/ammo_magazine/standard_agls/flare + +/obj/item/factory_part/agls_flare/Initialize(mapload) + . = ..() + recipe = GLOB.agls_recipe + +/obj/item/factory_part/agls_cloak + name = "\improper AGLS HE magazine assembly" + desc = "An incomplete AGLS HE magazine assembly." + result = /obj/item/ammo_magazine/standard_agls/cloak + +/obj/item/factory_part/agls_cloak/Initialize(mapload) + . = ..() + recipe = GLOB.agls_recipe + +/obj/item/factory_part/agls_tanglefoot + name = "\improper AGLS HE magazine assembly" + desc = "An incomplete AGLS HE magazine assembly." + result = /obj/item/ammo_magazine/standard_agls/tanglefoot + +/obj/item/factory_part/agls_tanglefoot/Initialize(mapload) + . = ..() + recipe = GLOB.agls_recipe + +GLOBAL_LIST_INIT(atgun_recipe, list( + list(STEP_NEXT_MACHINE = FACTORY_MACHINE_CUTTER, STEP_ICON_STATE = "uncutplate"), + list(STEP_NEXT_MACHINE = FACTORY_MACHINE_HEATER, STEP_ICON_STATE = "cutplate"), + list(STEP_NEXT_MACHINE = FACTORY_MACHINE_FLATTER, STEP_ICON_STATE = "hotplate"), + list(STEP_NEXT_MACHINE = FACTORY_MACHINE_COMPRESSOR, STEP_ICON_STATE = "rockettube"), + list(STEP_NEXT_MACHINE = FACTORY_MACHINE_GALVANIZER, STEP_ICON_STATE = "rockettube"), + )) + +/obj/item/factory_part/atgun_aphe + name = "\improper AT-36 APHE shell assembly" + desc = "An incomplete AT-36 APHE shell assembly." + result = /obj/item/ammo_magazine/standard_atgun + +/obj/item/factory_part/atgun_aphe/Initialize(mapload) + . = ..() + recipe = GLOB.atgun_recipe + +/obj/item/factory_part/atgun_apcr + name = "\improper AT-36 APCR shell assembly" + desc = "An incomplete AT-36 APCR shell assembly." + result = /obj/item/ammo_magazine/standard_atgun/apcr + +/obj/item/factory_part/atgun_apcr/Initialize(mapload) + . = ..() + recipe = GLOB.atgun_recipe + +/obj/item/factory_part/atgun_he + name = "\improper AT-36 HE shell assembly" + desc = "An incomplete AT-36 HE shell assembly." + result = /obj/item/ammo_magazine/standard_atgun/he + +/obj/item/factory_part/atgun_he/Initialize(mapload) + . = ..() + recipe = GLOB.atgun_recipe + +/obj/item/factory_part/atgun_beehive + name = "\improper AT-36 Beehive shell assembly" + desc = "An incomplete AT-36 Beehive shell assembly." + result = /obj/item/ammo_magazine/standard_atgun/beehive + +/obj/item/factory_part/atgun_beehive/Initialize(mapload) + . = ..() + recipe = GLOB.atgun_recipe + +/obj/item/factory_part/atgun_incend + name = "\improper AT-36 Napalm shell assembly" + desc = "An incomplete AT-36 Napalm shell assembly." + result = /obj/item/ammo_magazine/standard_atgun/incend + +/obj/item/factory_part/atgun_incend/Initialize(mapload) + . = ..() + recipe = GLOB.atgun_recipe + +GLOBAL_LIST_INIT(heavy_isg_recipe, list( + list(STEP_NEXT_MACHINE = FACTORY_MACHINE_HEATER, STEP_ICON_STATE = "uncutplate"), + list(STEP_NEXT_MACHINE = FACTORY_MACHINE_COMPRESSOR, STEP_ICON_STATE = "cutplate"), + list(STEP_NEXT_MACHINE = FACTORY_MACHINE_DRILLER, STEP_ICON_STATE = "hotplate"), + list(STEP_NEXT_MACHINE = FACTORY_MACHINE_GALVANIZER, STEP_ICON_STATE = "rockettube"), + list(STEP_NEXT_MACHINE = FACTORY_MACHINE_FORMER, STEP_ICON_STATE = "rockettube"), + )) + +/obj/item/factory_part/heavy_isg_he + name = "\improper FK-88 HE shell assembly" + desc = "An incomplete FK-88 HE shell assembly." + result = /obj/item/ammo_magazine/heavy_isg/he + +/obj/item/factory_part/heavy_isg_he/Initialize(mapload) + . = ..() + recipe = GLOB.heavy_isg_recipe + +/obj/item/factory_part/heavy_isg_sabot + name = "\improper FK-88 HE shell assembly" + desc = "An incomplete FK-88 APFDS shell assembly." + result = /obj/item/ammo_magazine/heavy_isg/sabot + +/obj/item/factory_part/heavy_isg_sabot/Initialize(mapload) + . = ..() + recipe = GLOB.heavy_isg_recipe + +GLOBAL_LIST_INIT(ac_recipe, list( + list(STEP_NEXT_MACHINE = FACTORY_MACHINE_HEATER, STEP_ICON_STATE = "uncutplate"), + list(STEP_NEXT_MACHINE = FACTORY_MACHINE_COMPRESSOR, STEP_ICON_STATE = "cutplate"), + list(STEP_NEXT_MACHINE = FACTORY_MACHINE_GALVANIZER, STEP_ICON_STATE = "rockettube"), + list(STEP_NEXT_MACHINE = FACTORY_MACHINE_FORMER, STEP_ICON_STATE = "rockettube"), + )) + +/obj/item/factory_part/ac_hv + name = "\improper ATR-22 high velocity magazine assembly" + desc = "An incomplete ATR-22 high velocity magazine assembly." + result = /obj/item/ammo_magazine/auto_cannon + +/obj/item/factory_part/ac_hv/Initialize(mapload) + . = ..() + recipe = GLOB.ac_recipe + +/obj/item/factory_part/ac_flak + name = "\improper ATR-22 flak magazine assembly" + desc = "An incomplete ATR-22 flak magazine assembly." + result = /obj/item/ammo_magazine/auto_cannon/flak + +/obj/item/factory_part/ac_flak/Initialize(mapload) + . = ..() + recipe = GLOB.ac_recipe diff --git a/code/modules/factory/unboxer.dm b/code/modules/factory/unboxer.dm index a52b07a9e85e2..4fb021abcba7f 100644 --- a/code/modules/factory/unboxer.dm +++ b/code/modules/factory/unboxer.dm @@ -122,6 +122,24 @@ desc = "A box with round metal plates inside. Used to refill Unboxers." refill_type = /obj/item/factory_part/pizza +/obj/item/factory_refill/plastique_refill + name = "box of rounded metal plates" + desc = "A box with round metal plates inside. Used to refill Unboxers." + refill_type = /obj/item/factory_part/plastique + refill_amount = 10 + +/obj/item/factory_refill/plastique_incendiary_refill + name = "box of rounded metal plates" + desc = "A box with round metal plates inside. Used to refill Unboxers." + refill_type = /obj/item/factory_part/plastique_incendiary + refill_amount = 5 + +/obj/item/factory_refill/detpack_refill + name = "box of rounded metal plates" + desc = "A box with round metal plates inside. Used to refill Unboxers." + refill_type = /obj/item/factory_part/detpack + refill_amount = 10 + /obj/item/factory_refill/sadar_wp_refill name = "box of rounded metal plates" desc = "A box with round metal plates inside. Used to refill Unboxers." @@ -227,6 +245,18 @@ refill_type = /obj/item/factory_part/railgun_magazine refill_amount = 20 +/obj/item/factory_refill/railgun_hvap_magazine_refill + name = "box of rounded metal plates" + desc = "A box with round metal plates inside. Used to refill Unboxers." + refill_type = /obj/item/factory_part/railgun_magazine + refill_amount = 20 + +/obj/item/factory_refill/railgun_smart_magazine_refill + name = "box of rounded metal plates" + desc = "A box with round metal plates inside. Used to refill Unboxers." + refill_type = /obj/item/factory_part/railgun_magazine + refill_amount = 20 + /obj/item/factory_refill/minigun_powerpack_refill name = "box of rounded metal plates" desc = "A box with round metal plates inside. Used to refill Unboxers." @@ -239,6 +269,18 @@ refill_type = /obj/item/factory_part/razornade refill_amount = 30 +/obj/item/factory_refill/sniper_flak_magazine_refill + name = "box of rounded metal plates" + desc = "A box with round metal plates inside. Used to refill Unboxers." + refill_type = /obj/item/factory_part/sniper_flak_magazine + refill_amount = 20 + +/obj/item/factory_refill/sniper_flak_magazine_refill + name = "box of rounded metal plates" + desc = "A box with round metal plates inside. Used to refill Unboxers." + refill_type = /obj/item/factory_part/sniper_flak_magazine + refill_amount = 20 + /obj/item/factory_refill/amr_magazine_refill name = "box of rounded metal plates" desc = "A box with round metal plates inside. Used to refill Unboxers." @@ -359,6 +401,96 @@ refill_type = /obj/item/factory_part/mlrs_rocket refill_amount = 6 +/obj/item/factory_refill/agls_he_refill + name = "box of rounded metal plates" + desc = "A box with round metal plates inside. Used to refill Unboxers." + refill_type = /obj/item/factory_part/agls_he + refill_amount = 10 + +/obj/item/factory_refill/agls_frag_refill + name = "box of rounded metal plates" + desc = "A box with round metal plates inside. Used to refill Unboxers." + refill_type = /obj/item/factory_part/agls_frag + refill_amount = 10 + +/obj/item/factory_refill/agls_incendiary_refill + name = "box of rounded metal plates" + desc = "A box with round metal plates inside. Used to refill Unboxers." + refill_type = /obj/item/factory_part/agls_incendiary + refill_amount = 10 + +/obj/item/factory_refill/agls_flare_refill + name = "box of rounded metal plates" + desc = "A box with round metal plates inside. Used to refill Unboxers." + refill_type = /obj/item/factory_part/agls_he + refill_amount = 10 + +/obj/item/factory_refill/agls_cloak_refill + name = "box of rounded metal plates" + desc = "A box with round metal plates inside. Used to refill Unboxers." + refill_type = /obj/item/factory_part/agls_cloak + refill_amount = 10 + +/obj/item/factory_refill/agls_tanglefoot_refill + name = "box of rounded metal plates" + desc = "A box with round metal plates inside. Used to refill Unboxers." + refill_type = /obj/item/factory_part/agls_tanglefoot + refill_amount = 10 + +/obj/item/factory_refill/atgun_aphe_refill + name = "box of rounded metal plates" + desc = "A box with round metal plates inside. Used to refill Unboxers." + refill_type = /obj/item/factory_part/atgun_aphe + refill_amount = 30 + +/obj/item/factory_refill/atgun_apcr_refill + name = "box of rounded metal plates" + desc = "A box with round metal plates inside. Used to refill Unboxers." + refill_type = /obj/item/factory_part/atgun_apcr + refill_amount = 30 + +/obj/item/factory_refill/atgun_he_refill + name = "box of rounded metal plates" + desc = "A box with round metal plates inside. Used to refill Unboxers." + refill_type = /obj/item/factory_part/atgun_he + refill_amount = 30 + +/obj/item/factory_refill/atgun_beehive_refill + name = "box of rounded metal plates" + desc = "A box with round metal plates inside. Used to refill Unboxers." + refill_type = /obj/item/factory_part/atgun_beehive + refill_amount = 30 + +/obj/item/factory_refill/atgun_incend_refill + name = "box of rounded metal plates" + desc = "A box with round metal plates inside. Used to refill Unboxers." + refill_type = /obj/item/factory_part/atgun_incend + refill_amount = 30 + +/obj/item/factory_refill/heavy_isg_he_refill + name = "box of rounded metal plates" + desc = "A box with round metal plates inside. Used to refill Unboxers." + refill_type = /obj/item/factory_part/heavy_isg_he + refill_amount = 5 + +/obj/item/factory_refill/heavy_isg_sabot_refill + name = "box of rounded metal plates" + desc = "A box with round metal plates inside. Used to refill Unboxers." + refill_type = /obj/item/factory_part/heavy_isg_sabot + refill_amount = 5 + +/obj/item/factory_refill/ac_hv_refill + name = "box of rounded metal plates" + desc = "A box with round metal plates inside. Used to refill Unboxers." + refill_type = /obj/item/factory_part/ac_hv + refill_amount = 10 + +/obj/item/factory_refill/ac_flak_refill + name = "box of rounded metal plates" + desc = "A box with round metal plates inside. Used to refill Unboxers." + refill_type = /obj/item/factory_part/ac_flak + refill_amount = 10 + /obj/item/factory_refill/thermobaric_wp_refill name = "box of rounded metal plates" desc = "A box with round metal plates inside. Used to refill Unboxers." @@ -370,3 +502,27 @@ desc = "A box with round metal plates inside. Used to refill Unboxers." refill_type = /obj/item/factory_part/drop_pod refill_amount = 6 + +/obj/item/factory_refill/deployable_floodlight_refill + name = "box of rounded metal plates" + desc = "A box with round metal plates inside. Used to refill Unboxers." + refill_type = /obj/item/factory_part/deployable_floodlight + refill_amount = 10 + +/obj/item/factory_refill/deployable_camera_refill + name = "box of rounded metal plates" + desc = "A box with round metal plates inside. Used to refill Unboxers." + refill_type = /obj/item/factory_part/deployable_camera + refill_amount = 30 + +/obj/item/factory_refill/deployable_floodlight_refill + name = "box of rounded metal plates" + desc = "A box with round metal plates inside. Used to refill Unboxers." + refill_type = /obj/item/factory_part/deployable_floodlight + refill_amount = 10 + +/obj/item/factory_refill/deployable_camera_refill + name = "box of rounded metal plates" + desc = "A box with round metal plates inside. Used to refill Unboxers." + refill_type = /obj/item/factory_part/deployable_camera + refill_amount = 30 diff --git a/code/modules/mob/living/carbon/human/human_attackhand.dm b/code/modules/mob/living/carbon/human/human_attackhand.dm index f45badbb8f67b..47796afa97083 100644 --- a/code/modules/mob/living/carbon/human/human_attackhand.dm +++ b/code/modules/mob/living/carbon/human/human_attackhand.dm @@ -6,28 +6,28 @@ if(!ishuman(user)) return - var/mob/living/carbon/human/H = user + var/mob/living/carbon/human/human_user = user - if(user != src && !check_shields(COMBAT_TOUCH_ATTACK, H.melee_damage, "melee")) + if(user != src && !check_shields(COMBAT_TOUCH_ATTACK, human_user.melee_damage, "melee")) visible_message(span_danger("[user] attempted to touch [src]!"), null, null, 5) return FALSE - H.changeNext_move(7) - switch(H.a_intent) + human_user.changeNext_move(7) + switch(human_user.a_intent) if(INTENT_HELP) - if(on_fire && H != src) + if(on_fire && human_user != src) fire_stacks = max(fire_stacks - 1, 0) playsound(src.loc, 'sound/weapons/thudswoosh.ogg', 25, 1, 7) - H.visible_message(span_danger("[H] tries to put out the fire on [src]!"), \ + human_user.visible_message(span_danger("[human_user] tries to put out the fire on [src]!"), \ span_warning("You try to put out the fire on [src]!"), null, 5) if(fire_stacks <= 0) - H.visible_message(span_danger("[H] has successfully extinguished the fire on [src]!"), \ + human_user.visible_message(span_danger("[human_user] has successfully extinguished the fire on [src]!"), \ span_notice("You extinguished the fire on [src]."), null, 5) ExtinguishMob() return TRUE - if(istype(wear_mask, /obj/item/clothing/mask/facehugger) && H != src) - H.stripPanelUnequip(wear_mask, src, SLOT_WEAR_MASK) + if(istype(wear_mask, /obj/item/clothing/mask/facehugger) && human_user != src) + human_user.stripPanelUnequip(wear_mask, src, SLOT_WEAR_MASK) return TRUE if(health >= get_crit_threshold()) @@ -35,93 +35,97 @@ if(interaction_emote(src)) return TRUE - help_shake_act(H) + help_shake_act(human_user) return TRUE if(HAS_TRAIT(src, TRAIT_UNDEFIBBABLE)) - to_chat(H, span_boldnotice("Can't help this one. Body has gone cold.")) + to_chat(human_user, span_boldnotice("Can't help this one. Body has gone cold.")) return FALSE if(species?.species_flags & ROBOTIC_LIMBS) - to_chat(H, span_boldnotice("You can't help this one, [p_they()] [p_have()] no lungs!")) + to_chat(human_user, span_boldnotice("You can't help this one, [p_they()] [p_have()] no lungs!")) return FALSE if((head && (head.flags_inventory & COVERMOUTH)) || (wear_mask && (wear_mask.flags_inventory & COVERMOUTH))) - to_chat(H, span_boldnotice("Remove [p_their()] mask!")) + to_chat(human_user, span_boldnotice("Remove [p_their()] mask!")) return FALSE - if((H.head && (H.head.flags_inventory & COVERMOUTH)) || (H.wear_mask && (H.wear_mask.flags_inventory & COVERMOUTH))) - to_chat(H, span_boldnotice("Remove your mask!")) + if((human_user.head && (human_user.head.flags_inventory & COVERMOUTH)) || (human_user.wear_mask && (human_user.wear_mask.flags_inventory & COVERMOUTH))) + to_chat(human_user, span_boldnotice("Remove your mask!")) return FALSE //CPR - if(H.do_actions) + if(human_user.do_actions) return TRUE - H.visible_message(span_danger("[H] is trying perform CPR on [src]!"), null, null, 4) + human_user.visible_message(span_danger("[human_user] is trying perform CPR on [src]!"), null, null, 4) - if(!do_after(H, HUMAN_STRIP_DELAY, NONE, src, BUSY_ICON_FRIENDLY, BUSY_ICON_MEDICAL)) + if(!do_after(human_user, HUMAN_STRIP_DELAY, NONE, src, BUSY_ICON_FRIENDLY, BUSY_ICON_MEDICAL)) return TRUE if(health > get_death_threshold() && health < get_crit_threshold()) var/suff = min(getOxyLoss(), 5) //Pre-merge level, less healing, more prevention of dieing. adjustOxyLoss(-suff) updatehealth() - visible_message(span_warning(" [H] performs CPR on [src]!"), + visible_message(span_warning(" [human_user] performs CPR on [src]!"), span_boldnotice("You feel a breath of fresh air enter your lungs. It feels good."), vision_distance = 3) - to_chat(H, span_warning("Repeat at least every 7 seconds.")) + to_chat(human_user, span_warning("Repeat at least every 7 seconds.")) else if(!HAS_TRAIT(src, TRAIT_UNDEFIBBABLE) && !TIMER_COOLDOWN_CHECK(src, COOLDOWN_CPR)) TIMER_COOLDOWN_START(src, COOLDOWN_CPR, 7 SECONDS) dead_ticks -= 5 - visible_message(span_warning(" [H] performs CPR on [src]!"), vision_distance = 3) - to_chat(H, span_warning("The patient gains a little more time. Repeat every 7 seconds.")) + visible_message(span_warning(" [human_user] performs CPR on [src]!"), vision_distance = 3) + to_chat(human_user, span_warning("The patient gains a little more time. Repeat every 7 seconds.")) else - to_chat(H, span_warning("You fail to aid [src].")) + to_chat(human_user, span_warning("You fail to aid [src].")) return TRUE if(INTENT_GRAB) - if(H == src || anchored) + if(human_user == src || anchored) return FALSE - H.start_pulling(src) + human_user.start_pulling(src) return TRUE if(INTENT_HARM) // See if they can attack, and which attacks to use. - if(H == src && !H.do_self_harm) + if(human_user == src && !human_user.do_self_harm) return FALSE - var/datum/unarmed_attack/attack = H.species.unarmed - if(!attack.is_usable(H)) - attack = H.species.secondary_unarmed - if(!attack.is_usable(H)) + var/datum/unarmed_attack/attack = human_user.species.unarmed + if(!attack.is_usable(human_user)) + attack = human_user.species.secondary_unarmed + if(!attack.is_usable(human_user)) return FALSE - if(!H.melee_damage) - H.do_attack_animation(src) + var/attack_verb = pick(attack.attack_verb) + //if you're lying/buckled, the miss chance is ignored anyway + var/target_zone = get_zone_with_miss_chance(human_user.zone_selected, src, 10 - (human_user.skills.getRating(SKILL_CQC) - skills.getRating(SKILL_CQC)) * 5) + + if(!human_user.melee_damage || !target_zone) + human_user.do_attack_animation(src) playsound(loc, attack.miss_sound, 25, TRUE) - visible_message(span_danger("[H] tried to [pick(attack.attack_verb)] [src]!"), null, null, 5) - log_combat(H, src, "[pick(attack.attack_verb)]ed", "(missed)") - if(!H.mind?.bypass_ff && !mind?.bypass_ff && H.faction == faction) + visible_message(span_danger("[human_user] tried to [attack_verb] [src]!"), null, null, 5) + log_combat(human_user, src, "[attack_verb]ed", "(missed)") + if(!human_user.mind?.bypass_ff && !mind?.bypass_ff && human_user.faction == faction) var/turf/T = get_turf(src) - log_ffattack("[key_name(H)] missed a punch against [key_name(src)] in [AREACOORD(T)].") - msg_admin_ff("[ADMIN_TPMONTY(H)] missed a punch against [ADMIN_TPMONTY(src)] in [ADMIN_VERBOSEJMP(T)].") + log_ffattack("[key_name(human_user)] missed a [attack_verb] against [key_name(src)] in [AREACOORD(T)].") + msg_admin_ff("[ADMIN_TPMONTY(human_user)] missed a [attack_verb] against [ADMIN_TPMONTY(src)] in [ADMIN_VERBOSEJMP(T)].") return FALSE - H.do_attack_animation(src, ATTACK_EFFECT_YELLOWPUNCH) - var/max_dmg = max(H.melee_damage + (H.skills.getRating(SKILL_CQC) * CQC_SKILL_DAMAGE_MOD), 3) - var/damage = rand(1, max_dmg) - - var/target_zone = ran_zone(H.zone_selected) + human_user.do_attack_animation(src, ATTACK_EFFECT_YELLOWPUNCH) + var/max_dmg = max(human_user.melee_damage + (human_user.skills.getRating(SKILL_CQC) * CQC_SKILL_DAMAGE_MOD), 3) + var/damage = max_dmg + if(!lying_angle) + damage = rand(1, max_dmg) playsound(loc, attack.attack_sound, 25, TRUE) - visible_message(span_danger("[H] [pick(attack.attack_verb)]ed [src]!"), null, null, 5) + visible_message(span_danger("[human_user] [attack_verb]ed [src]!"), null, null, 5) var/list/hit_report = list() if(damage >= 4 && prob(25)) - visible_message(span_danger("[H] has weakened [src]!"), null, null, 5) + visible_message(span_danger("[human_user] has weakened [src]!"), null, null, 5) apply_effect(modify_by_armor(6 SECONDS, MELEE, def_zone = target_zone), WEAKEN) hit_report += "(KO)" @@ -130,21 +134,21 @@ hit_report += "(RAW DMG: [damage])" - log_combat(H, src, "[pick(attack.attack_verb)]ed", "[hit_report.Join(" ")]") - if(!H.mind?.bypass_ff && !mind?.bypass_ff && H.faction == faction) + log_combat(human_user, src, "[attack_verb]ed", "[hit_report.Join(" ")]") + if(!human_user.mind?.bypass_ff && !mind?.bypass_ff && human_user.faction == faction) var/turf/T = get_turf(src) - H.ff_check(damage, src) - log_ffattack("[key_name(H)] punched [key_name(src)] in [AREACOORD(T)] [hit_report.Join(" ")].") - msg_admin_ff("[ADMIN_TPMONTY(H)] punched [ADMIN_TPMONTY(src)] in [ADMIN_VERBOSEJMP(T)] [hit_report.Join(" ")].") + human_user.ff_check(damage, src) + log_ffattack("[key_name(human_user)] punched [key_name(src)] in [AREACOORD(T)] [hit_report.Join(" ")].") + msg_admin_ff("[ADMIN_TPMONTY(human_user)] punched [ADMIN_TPMONTY(src)] in [ADMIN_VERBOSEJMP(T)] [hit_report.Join(" ")].") if(INTENT_DISARM) - H.do_attack_animation(src, ATTACK_EFFECT_DISARM) + human_user.do_attack_animation(src, ATTACK_EFFECT_DISARM) - var/target_zone = ran_zone(H.zone_selected) + var/target_zone = ran_zone(human_user.zone_selected) //Accidental gun discharge - if(user.skills.getRating(SKILL_CQC) < SKILL_CQC_MP) + if(human_user.skills.getRating(SKILL_CQC) < SKILL_CQC_MP) if (istype(r_hand,/obj/item/weapon/gun) || istype(l_hand,/obj/item/weapon/gun)) var/obj/item/weapon/gun/W = null var/chance = 0 @@ -159,39 +163,38 @@ if(prob(chance)) visible_message("[src]'s [W] goes off during struggle!", null, null, 5) - log_combat(H, src, "disarmed", "making their [W] go off") + log_combat(human_user, src, "disarmed", "making their [W] go off") var/list/turfs = list() for(var/turf/T in view()) turfs += T var/turf/target = pick(turfs) return W.afterattack(target,src) - var/randn = rand(1, 100) + skills.getRating(SKILL_CQC) * CQC_SKILL_DISARM_MOD - H.skills.getRating(SKILL_CQC) * CQC_SKILL_DISARM_MOD + var/randn = rand(1, 100) + skills.getRating(SKILL_CQC) * CQC_SKILL_DISARM_MOD - human_user.skills.getRating(SKILL_CQC) * CQC_SKILL_DISARM_MOD if (randn <= 25) apply_effect(modify_by_armor(6 SECONDS, MELEE, def_zone = target_zone), WEAKEN) playsound(loc, 'sound/weapons/thudswoosh.ogg', 25, 1, 7) - visible_message(span_danger("[H] has pushed [src]!"), null, null, 5) - log_combat(user, src, "pushed") + visible_message(span_danger("[human_user] has pushed [src]!"), null, null, 5) + log_combat(human_user, src, "pushed") return if(randn <= 60) //BubbleWrap: Disarming breaks a pull if(pulling) - visible_message(span_danger("[H] has broken [src]'s grip on [pulling]!"), null, null, 5) + visible_message(span_danger("[human_user] has broken [src]'s grip on [pulling]!"), null, null, 5) stop_pulling() else drop_held_item() - visible_message(span_danger("[H] has disarmed [src]!"), null, null, 5) + visible_message(span_danger("[human_user] has disarmed [src]!"), null, null, 5) playsound(loc, 'sound/weapons/thudswoosh.ogg', 25, 1, 7) log_combat(user, src, "disarmed") return playsound(loc, 'sound/weapons/punchmiss.ogg', 25, 1, 7) - visible_message(span_danger("[H] attempted to disarm [src]!"), null, null, 5) - log_combat(user, src, "missed a disarm") - return + visible_message(span_danger("[human_user] attempted to disarm [src]!"), null, null, 5) + log_combat(human_user, src, "missed a disarm") /mob/living/carbon/human/proc/afterattack(atom/target as mob|obj|turf|area, mob/living/user as mob|obj, inrange, params) return diff --git a/code/modules/mob/living/carbon/human/human_defense.dm b/code/modules/mob/living/carbon/human/human_defense.dm index 0b46dbb579d0b..bca1b3e113bdc 100644 --- a/code/modules/mob/living/carbon/human/human_defense.dm +++ b/code/modules/mob/living/carbon/human/human_defense.dm @@ -106,6 +106,19 @@ Contains most of the procs that are called when a mob is attacked by something else target_zone = def_zone ? check_zone(def_zone) : get_zone_with_miss_chance(user.zone_selected, src) + var/attack_verb = LAZYLEN(I.attack_verb) ? pick(I.attack_verb) : "attacked" + + if(!target_zone) + user.do_attack_animation(src) + playsound(loc, 'sound/weapons/punchmiss.ogg', 25, TRUE) + visible_message(span_danger("[user] tried to hit [src] with [I]!"), null, null, 5) + log_combat(user, src, "[attack_verb]", "(missed)") + if(!user.mind?.bypass_ff && !mind?.bypass_ff && user.faction == faction) + var/turf/T = get_turf(src) + log_ffattack("[key_name(user)] missed a attack against [key_name(src)] with [I] in [AREACOORD(T)].") + msg_admin_ff("[ADMIN_TPMONTY(user)] missed an against [ADMIN_TPMONTY(src)] with [I] in [ADMIN_VERBOSEJMP(T)].") + return FALSE + var/datum/limb/affecting = get_limb(target_zone) if(affecting.limb_status & LIMB_DESTROYED) to_chat(user, "What [affecting.display_name]?") @@ -122,7 +135,6 @@ Contains most of the procs that are called when a mob is attacked by something var/applied_damage = modify_by_armor(damage, MELEE, I.penetration, target_zone) var/percentage_penetration = applied_damage / damage * 100 - var/attack_verb = LAZYLEN(I.attack_verb) ? pick(I.attack_verb) : "attacked" var/armor_verb switch(percentage_penetration) if(-INFINITY to 0) diff --git a/code/modules/mob/living/carbon/human/life.dm b/code/modules/mob/living/carbon/human/life.dm index c61b5491c87af..0b28ca5237c1c 100644 --- a/code/modules/mob/living/carbon/human/life.dm +++ b/code/modules/mob/living/carbon/human/life.dm @@ -75,10 +75,13 @@ if(species.species_flags & NO_BREATHE) return - if(losebreath <= 10) - adjust_Losebreath(-1) //Since this happens before checking to take/heal oxyloss, a losebreath of 1 or less won't do anything. - else + if(pulledby?.grab_state >= GRAB_KILL) + Losebreath(1) + adjustOxyLoss(4) + else if(losebreath > 10) set_Losebreath(10) //Any single hit is functionally capped - to keep someone suffocating, you need continued losebreath applications. + else if(losebreath > 0) + adjust_Losebreath(-1) //Since this happens before checking to take/heal oxyloss, a losebreath of 1 or less won't do anything. if(health < get_crit_threshold() || losebreath) if(HAS_TRAIT(src, TRAIT_IGNORE_SUFFOCATION)) //Prevent losing health from asphyxiation, but natural recovery can still happen. diff --git a/code/modules/mob/living/carbon/human/update_icons.dm b/code/modules/mob/living/carbon/human/update_icons.dm index a52abcfe70284..0d424021c92c2 100644 --- a/code/modules/mob/living/carbon/human/update_icons.dm +++ b/code/modules/mob/living/carbon/human/update_icons.dm @@ -621,7 +621,7 @@ GLOBAL_LIST_EMPTY(damage_icon_parts) client.screen += r_hand r_hand.screen_loc = ui_rhand - overlays_standing[R_HAND_LAYER] = r_hand.make_worn_icon(species_type = species.name, inhands = TRUE, slot_name = slot_r_hand_str, default_icon = 'icons/mob/items_righthand_1.dmi', default_layer = R_HAND_LAYER) + overlays_standing[R_HAND_LAYER] = r_hand.make_worn_icon(species_type = species.name, inhands = TRUE, slot_name = slot_r_hand_str, default_icon = 'icons/mob/inhands/items/items_right.dmi', default_layer = R_HAND_LAYER) apply_overlay(R_HAND_LAYER) @@ -635,7 +635,7 @@ GLOBAL_LIST_EMPTY(damage_icon_parts) client.screen += l_hand l_hand.screen_loc = ui_lhand - overlays_standing[L_HAND_LAYER] = l_hand.make_worn_icon(species_type = species.name, inhands = TRUE, slot_name = slot_l_hand_str, default_icon = 'icons/mob/items_lefthand_1.dmi', default_layer = L_HAND_LAYER) + overlays_standing[L_HAND_LAYER] = l_hand.make_worn_icon(species_type = species.name, inhands = TRUE, slot_name = slot_l_hand_str, default_icon = 'icons/mob/inhands/items/items_left.dmi', default_layer = L_HAND_LAYER) apply_overlay(L_HAND_LAYER) diff --git a/code/modules/mob/living/carbon/xenomorph/castes/baneling/baneling.dm b/code/modules/mob/living/carbon/xenomorph/castes/baneling/baneling.dm index e4e46a9f2cd2a..689a6f7448aeb 100644 --- a/code/modules/mob/living/carbon/xenomorph/castes/baneling/baneling.dm +++ b/code/modules/mob/living/carbon/xenomorph/castes/baneling/baneling.dm @@ -32,7 +32,7 @@ /mob/living/carbon/xenomorph/baneling/handle_special_wound_states(severity) . = ..() if(m_intent == MOVE_INTENT_RUN) - return "baneling_wounded_running_[severity]" + return "wounded_running_[severity]" /obj/structure/xeno/baneling_pod name = "Baneling pod" diff --git a/code/modules/mob/living/carbon/xenomorph/castes/behemoth/behemoth.dm b/code/modules/mob/living/carbon/xenomorph/castes/behemoth/behemoth.dm index 7e607b6561e27..6c9363ba67f66 100644 --- a/code/modules/mob/living/carbon/xenomorph/castes/behemoth/behemoth.dm +++ b/code/modules/mob/living/carbon/xenomorph/castes/behemoth/behemoth.dm @@ -35,7 +35,7 @@ . = ..() var/datum/action/ability/xeno_action/ready_charge/behemoth_roll/behemoth_roll_action = actions_by_path[/datum/action/ability/xeno_action/ready_charge/behemoth_roll] if(behemoth_roll_action?.charge_ability_on) - return "behemoth_wounded_charging_[severity]" + return "wounded_charging_[severity]" /mob/living/carbon/xenomorph/behemoth/get_status_tab_items() . = ..() diff --git a/code/modules/mob/living/carbon/xenomorph/castes/bull/bull.dm b/code/modules/mob/living/carbon/xenomorph/castes/bull/bull.dm index 15cb5f3b98a8b..329dd2101d41d 100644 --- a/code/modules/mob/living/carbon/xenomorph/castes/bull/bull.dm +++ b/code/modules/mob/living/carbon/xenomorph/castes/bull/bull.dm @@ -27,4 +27,4 @@ /mob/living/carbon/xenomorph/bull/handle_special_wound_states(severity) . = ..() if(is_charging >= CHARGE_ON) - return "bull_wounded_charging_[severity]" + return "wounded_charging_[severity]" diff --git a/code/modules/mob/living/carbon/xenomorph/castes/crusher/crusher.dm b/code/modules/mob/living/carbon/xenomorph/castes/crusher/crusher.dm index 5b4f5cdb6da5f..f92b62b98ebaa 100644 --- a/code/modules/mob/living/carbon/xenomorph/castes/crusher/crusher.dm +++ b/code/modules/mob/living/carbon/xenomorph/castes/crusher/crusher.dm @@ -30,7 +30,7 @@ /mob/living/carbon/xenomorph/crusher/handle_special_wound_states(severity) . = ..() if(is_charging >= CHARGE_ON) - return "crusher_wounded_charging_[severity]" + return "wounded_charging_[severity]" /mob/living/carbon/xenomorph/crusher/buckle_mob(mob/living/buckling_mob, force = FALSE, check_loc = TRUE, lying_buckle = FALSE, hands_needed = 0, target_hands_needed = 0, silent) if(!force)//crushers should be overriden by runners diff --git a/code/modules/mob/living/carbon/xenomorph/castes/defender/defender.dm b/code/modules/mob/living/carbon/xenomorph/castes/defender/defender.dm index 0e52b04c5fcaa..2b680430601a8 100644 --- a/code/modules/mob/living/carbon/xenomorph/castes/defender/defender.dm +++ b/code/modules/mob/living/carbon/xenomorph/castes/defender/defender.dm @@ -29,9 +29,9 @@ /mob/living/carbon/xenomorph/defender/handle_special_wound_states(severity) . = ..() if(fortify) - return "defender_wounded_fortify" + return "wounded_fortify_[severity]" // we don't have the icons, but still if(crest_defense) - return "defender_wounded_crest_[severity]" + return "wounded_crest_[severity]" // *************************************** // *********** Life overrides diff --git a/code/modules/mob/living/carbon/xenomorph/castes/king/abilities_king.dm b/code/modules/mob/living/carbon/xenomorph/castes/king/abilities_king.dm index c4d0edce5035d..3b4303d2e88f7 100644 --- a/code/modules/mob/living/carbon/xenomorph/castes/king/abilities_king.dm +++ b/code/modules/mob/living/carbon/xenomorph/castes/king/abilities_king.dm @@ -478,6 +478,8 @@ owner.balloon_alert(owner, "noone to call") return FALSE +GLOBAL_LIST_EMPTY(active_summons) + /datum/action/ability/xeno_action/psychic_summon/action_activate() var/mob/living/carbon/xenomorph/X = owner @@ -489,7 +491,9 @@ continue sister.add_filter("summonoutline", 2, outline_filter(1, COLOR_VIOLET)) - if(!do_after(X, 10 SECONDS, IGNORE_HELD_ITEM, X, BUSY_ICON_HOSTILE)) + GLOB.active_summons += X + request_admins() + if(!do_after(X, 10 SECONDS, IGNORE_HELD_ITEM, X, BUSY_ICON_HOSTILE, extra_checks = CALLBACK(src, PROC_REF(is_active_summon)))) add_cooldown(5 SECONDS) for(var/mob/living/carbon/xenomorph/sister AS in allxenos) sister.remove_filter("summonoutline") @@ -508,3 +512,23 @@ add_cooldown() succeed_activate() + +///Sends a message to admins, prompting them if they want to cancel a psychic summon +/datum/action/ability/xeno_action/psychic_summon/proc/request_admins() + var/mob/living/carbon/xenomorph/caster = owner + var/canceltext = "[caster] is using [name] at [AREACOORD(caster)] [ADMIN_TPMONTY(caster)] \[CANCEL SUMMON\]" + message_admins("[span_prefix("PSYCHIC SUMMON:")] [canceltext]") + log_game("psychic summon started by [caster] at [AREACOORD(caster)], timerid to cancel: [10 SECONDS]") + notify_ghosts("[caster] has begun to summon at [AREACOORD(caster)]!", action = NOTIFY_JUMP) + +///Checks if our summon was cancelled +/datum/action/ability/xeno_action/psychic_summon/proc/is_active_summon() + var/mob/living/carbon/xenomorph/caster = owner + if(!(caster in GLOB.active_summons)) + return FALSE + return TRUE + +/datum/action/ability/xeno_action/psychic_summon/succeed_activate() + . = ..() + var/mob/living/carbon/xenomorph/caster = owner + GLOB.active_summons -= caster //Remove ourselves from the list once we have completed our summon diff --git a/code/modules/mob/living/carbon/xenomorph/castes/queen/abilities_queen.dm b/code/modules/mob/living/carbon/xenomorph/castes/queen/abilities_queen.dm index f3dd259359f17..623e185697a64 100644 --- a/code/modules/mob/living/carbon/xenomorph/castes/queen/abilities_queen.dm +++ b/code/modules/mob/living/carbon/xenomorph/castes/queen/abilities_queen.dm @@ -39,17 +39,17 @@ var/sound/queen_sound = sound(get_sfx("queen"), channel = CHANNEL_ANNOUNCEMENTS) var/sound/king_sound = sound('sound/voice/xenos_roaring.ogg', channel = CHANNEL_ANNOUNCEMENTS) for(var/mob/living/carbon/xenomorph/X AS in Q.hive.get_all_xenos()) + to_chat(X, assemble_alert( + title = "Hive Announcement", + subtitle = "From [Q.name]", + message = input, + color_override = "purple" + )) switch(Q.caste_base_type) - if(/mob/living/carbon/xenomorph/queen) + if(/mob/living/carbon/xenomorph/queen, /mob/living/carbon/xenomorph/shrike) SEND_SOUND(X, queen_sound) - //In case in combat, couldn't read fast enough, or needs to copy paste into a translator. Here's the old hive message. - to_chat(X, "[span_faction_alert("[span_faction_alert_title("The words of the Queen reverberate in your head...")]
[span_faction_alert_text("[html_encode(input)]")]")]") if(/mob/living/carbon/xenomorph/king) SEND_SOUND(X, king_sound) - to_chat(X, "[span_faction_alert("[span_faction_alert_title("The words of the King reverberate in your head...")]
[span_faction_alert_text("[html_encode(input)]")]")]") - if(/mob/living/carbon/xenomorph/shrike) - SEND_SOUND(X, queen_sound) - to_chat(X, "[span_faction_alert("[span_faction_alert_title("The words of the Shrike reverberate in your head...")]
[span_faction_alert_text("[html_encode(input)]")]")]") //Display the ruler's hive message at the top of the game screen. X.play_screen_text(queens_word, /atom/movable/screen/text/screen_text/queen_order) diff --git a/code/modules/mob/living/carbon/xenomorph/castes/warrior/warrior.dm b/code/modules/mob/living/carbon/xenomorph/castes/warrior/warrior.dm index bf8549b666651..67871b940c1ef 100644 --- a/code/modules/mob/living/carbon/xenomorph/castes/warrior/warrior.dm +++ b/code/modules/mob/living/carbon/xenomorph/castes/warrior/warrior.dm @@ -27,14 +27,14 @@ // *************************************** /mob/living/carbon/xenomorph/warrior/handle_special_state() if(agility) - icon_state = "Warrior Agility" + icon_state = "[xeno_caste.caste_name][is_a_rouny ? " rouny" : ""] Agility" return TRUE return FALSE /mob/living/carbon/xenomorph/warrior/handle_special_wound_states(severity) . = ..() if(agility) - return "warrior_wounded_agility_[severity]" + return "wounded_agility_[severity]" // *************************************** // *********** Mob overrides diff --git a/code/modules/mob/living/carbon/xenomorph/death.dm b/code/modules/mob/living/carbon/xenomorph/death.dm index 8d1fbbab7477c..690a9e52cb920 100644 --- a/code/modules/mob/living/carbon/xenomorph/death.dm +++ b/code/modules/mob/living/carbon/xenomorph/death.dm @@ -23,8 +23,10 @@ if(is_zoomed) zoom_out() - if(tier != XENO_TIER_MINION) - GLOB.key_to_time_of_xeno_death[key] = world.time + if(GLOB.xeno_stat_multiplicator_buff == 1) //if autobalance is on, it won't equal 1, so xeno respawn timer is not set + switch(tier) + if(XENO_TIER_ZERO, XENO_TIER_ONE, XENO_TIER_TWO, XENO_TIER_THREE) //minions and tier fours have no respawn timer + GLOB.key_to_time_of_xeno_death[key] = world.time SSminimaps.remove_marker(src) set_light_on(FALSE) diff --git a/code/modules/mob/living/carbon/xenomorph/update_icons.dm b/code/modules/mob/living/carbon/xenomorph/update_icons.dm index f26c088b270e9..3eeee58510640 100644 --- a/code/modules/mob/living/carbon/xenomorph/update_icons.dm +++ b/code/modules/mob/living/carbon/xenomorph/update_icons.dm @@ -70,7 +70,7 @@ r_hand.screen_loc = ui_rhand client.screen += r_hand - overlays_standing[X_R_HAND_LAYER] = r_hand.make_worn_icon(inhands = TRUE, slot_name = slot_r_hand_str, default_icon = 'icons/mob/items_righthand_1.dmi', default_layer = X_R_HAND_LAYER) + overlays_standing[X_R_HAND_LAYER] = r_hand.make_worn_icon(inhands = TRUE, slot_name = slot_r_hand_str, default_icon = 'icons/mob/inhands/items/items_right.dmi', default_layer = X_R_HAND_LAYER) apply_overlay(X_R_HAND_LAYER) /mob/living/carbon/xenomorph/update_inv_l_hand() @@ -80,7 +80,7 @@ l_hand.screen_loc = ui_lhand client.screen += l_hand - overlays_standing[X_L_HAND_LAYER] = l_hand.make_worn_icon(inhands = TRUE, slot_name = slot_l_hand_str, default_icon = 'icons/mob/items_lefthand_1.dmi', default_layer = X_L_HAND_LAYER) + overlays_standing[X_L_HAND_LAYER] = l_hand.make_worn_icon(inhands = TRUE, slot_name = slot_l_hand_str, default_icon = 'icons/mob/inhands/items/items_left.dmi', default_layer = X_L_HAND_LAYER) apply_overlay(X_L_HAND_LAYER) /mob/living/carbon/xenomorph/proc/create_shriekwave() diff --git a/code/modules/mob/living/carbon/xenomorph/xeno_defines.dm b/code/modules/mob/living/carbon/xenomorph/xeno_defines.dm index cb3cc6db9b618..17cca6e085a1b 100644 --- a/code/modules/mob/living/carbon/xenomorph/xeno_defines.dm +++ b/code/modules/mob/living/carbon/xenomorph/xeno_defines.dm @@ -424,3 +424,5 @@ ///The resting cooldown COOLDOWN_DECLARE(xeno_resting_cooldown) + ///The unresting cooldown + COOLDOWN_DECLARE(xeno_unresting_cooldown) diff --git a/code/modules/mob/living/carbon/xenomorph/xenomorph.dm b/code/modules/mob/living/carbon/xenomorph/xenomorph.dm index ce7fca88486cb..99198510d0593 100644 --- a/code/modules/mob/living/carbon/xenomorph/xenomorph.dm +++ b/code/modules/mob/living/carbon/xenomorph/xenomorph.dm @@ -471,9 +471,13 @@ Returns TRUE when loc_weeds_type changes. Returns FALSE when it doesn’t change var/datum/action/ability/xeno_action/xeno_resting/resting_action = actions_by_path[/datum/action/ability/xeno_action/xeno_resting] if(!resting_action || !resting_action.can_use_action()) return + if(resting) + if(!COOLDOWN_CHECK(src, xeno_resting_cooldown)) + balloon_alert(src, "Cannot get up so soon after resting!") + return - if(!COOLDOWN_CHECK(src, xeno_resting_cooldown)) - balloon_alert(src, "Cannot get up so soon after resting!") + if(!COOLDOWN_CHECK(src, xeno_unresting_cooldown)) + balloon_alert(src, "Cannot rest so soon after getting up!") return return ..() @@ -481,6 +485,8 @@ Returns TRUE when loc_weeds_type changes. Returns FALSE when it doesn’t change . = ..() if(resting) COOLDOWN_START(src, xeno_resting_cooldown, XENO_RESTING_COOLDOWN) + else + COOLDOWN_START(src, xeno_unresting_cooldown, XENO_UNRESTING_COOLDOWN) /mob/living/carbon/xenomorph/set_jump_component(duration = 0.5 SECONDS, cooldown = 2 SECONDS, cost = 0, height = 16, sound = null, flags = JUMP_SHADOW, flags_pass = PASS_LOW_STRUCTURE|PASS_FIRE) var/gravity = get_gravity() diff --git a/code/modules/mob/mob_grab.dm b/code/modules/mob/mob_grab.dm index b416799643b3c..52fc820e11b44 100644 --- a/code/modules/mob/mob_grab.dm +++ b/code/modules/mob/mob_grab.dm @@ -61,7 +61,7 @@ if(user.grab_state > GRAB_KILL) return user.changeNext_move(CLICK_CD_GRABBING) - if(!do_after(user, 2 SECONDS, NONE, victim, BUSY_ICON_HOSTILE, extra_checks = CALLBACK(user, TYPE_PROC_REF(/datum, Adjacent), victim)) || !user.pulling) + if(!do_after(user, max(2 SECONDS - (user.skills.getRating(SKILL_CQC) * 0.5 SECONDS), 1 SECONDS), NONE, victim, BUSY_ICON_HOSTILE, extra_checks = CALLBACK(user, TYPE_PROC_REF(/datum, Adjacent), victim)) || !user.pulling) return user.advance_grab_state() if(user.grab_state == GRAB_NECK) diff --git a/code/modules/paperwork/beginner_tutorials.dm b/code/modules/paperwork/beginner_tutorials.dm index 16c1ba82560c8..6a88dd674aef9 100644 --- a/code/modules/paperwork/beginner_tutorials.dm +++ b/code/modules/paperwork/beginner_tutorials.dm @@ -2,13 +2,13 @@ /obj/item/paper/tutorial/beginner_rifleman name = "Rifleman Tutorial" - info = {"As a rifleman, you are suited for virtually all theatres of combat. Your AR-12 assault rifle is accurate and effective at all ranges, and its powerful underbarrel grenade launcher poses even further danger to mid-range threats. Inside your backpack is a box of flares to refill your flare pouch, gauze and ointment for brute (slashes) and burn (acid) wounds respectively, and backup magazines for your AR 12. Your belt contains backup magazines for your AR-12, while your body armor contains additional grenades to reload your underbarrel grenade launcher with. Your left pocket contains a flare gun holster and several flares. Your right pocket contains a first aid kit, complete with Bicardine (which heals brute damage), Kelotane (which heals burn damage), Tramadol (which is a painkiller), Tricordrazine (which heals all damage, but slowly), and Dylovene (which heals toxin, or poison damage), as well as splints and inaprovaline. Your helmet contains two protein bars, in case you get hungry, and your boots contain a standard issue combat knife for clearing weeds or breaking things.
+ info = {"As a rifleman, you are suited for virtually all theatres of combat. Your AR-12 assault rifle is accurate and effective at all ranges, and its powerful underbarrel grenade launcher poses even further danger to mid-range threats. Inside your backpack is a box of flares to refill your flare pouch, gauze and ointment for brute (slashes) and burn (acid) wounds respectively, and backup magazines for your AR 12. Your belt contains backup magazines for your AR-12, while your body armor contains additional grenades to reload your underbarrel grenade launcher with. Your left pocket contains a flare gun holster and several flares. Your right pocket contains a first aid kit, complete with Bicaridine (which heals brute damage), Kelotane (which heals burn damage), Tramadol (which is a painkiller), Tricordrazine (which heals all damage, but slowly), and Dylovene (which heals toxin, or poison damage), as well as splints and inaprovaline. Your helmet contains two protein bars, in case you get hungry, and your boots contain a standard issue combat knife for clearing weeds or breaking things.

Try to spend as much time as possible near other marines - being alone is very dangerous. Your versatility is an immense strength and makes you the ideal battle buddy for virtually any other marine. You can easily work with a shotgunner to clear close quarters areas, or perhaps with a machine gunner to hold a fortified position, or even take point in front of a marksman. When not in immediate danger, use your flare gun to keep your surroundings lit, as your and your fellow marines' lives may very well depend on it.

TIPS

- BKTT is an acronym that is used to describe the combination of Bicardine, Kelotane, Tricordizine, and Tramadol used as an all-rounder combat medicine mix for any situation that heals all different types of damage. Make sure not to take more than two of each pill at a time - medicine takes a while to process through your system, and too many at once risks a dangerous overdose. Your gauze and ointment are body-part specific, unlike medication, but once you start applying one, you will keep applying it to all body parts that require treatment as long as you hold still. You can remove pills from their packets directly by right clicking on the packet, even while it's in storage.
+ BKTT is an acronym that is used to describe the combination of Bicaridine, Kelotane, Tricordizine, and Tramadol used as an all-rounder combat medicine mix for any situation that heals all different types of damage. Make sure not to take more than two of each pill at a time - medicine takes a while to process through your system, and too many at once risks a dangerous overdose. Your gauze and ointment are body-part specific, unlike medication, but once you start applying one, you will keep applying it to all body parts that require treatment as long as you hold still. You can remove pills from their packets directly by right clicking on the packet, even while it's in storage.

While holding your AR-12, use Z to wield your weapon with both hands, increasing accuracy and stability and reducing recoil. In the top left of your screen are several weapon-specific buttons. The "Take Aim" button toggles aim mode, a feature that slows your rate of fire in exchange for allowing you to shoot through allied marines. (Note that your grenades will NOT go through marines!) The second option changes the firing mode, between Single Automatic, Burst, and Burst Automatic. Automatic modes will keep firing as long as you hold down the mouse button. The third option enables your underbarrel grenade launcher. Once enabled, you can use right click to launch a grenade out!

@@ -22,13 +22,13 @@ /obj/item/paper/tutorial/beginner_machinegunner name = "Machinergunner Tutorial" - info = {"As a machinegunner, you are the backbone of a marine force. While you possess heavy armor reinforced with Tyr-pattern plating (strengthening its defense even further against melee attacks), your slow move speed and the unwieldy nature of your MG-60 machine gun means you should not be spearheading any pushes. Aim mode is your best friend - combined with your red dot sight and bipod, you are very apt at sitting just behind the front line, eliminating threats and keeping the marines in front of you safe. Your backpack contains several additional box magazines, allowing you to carry almost two THOUSAND rounds on your person at any time. Your left pouch contains a first aid kit, complete with Bicardine (which heals brute damage), Kelotane (which heals burn damage), Tramadol (which is a painkiller), Tricordrazine (which heals all damage, but slowly), and Dylovene (which heals toxin, or poison damage), as well as splints and inaprovaline. Your right pocket contains a flare gun holster and several flares. Your suit storage contains two plasma pistols, which are low in damage but can start fires. Your webbing contains an MRE to eat and both gauze and ointment, your helmet contains two protein bars for further eating, and your boots contain a standard issue combat knife for clearing weeds or breaking things.
+ info = {"As a machinegunner, you are the backbone of a marine force. While you possess heavy armor reinforced with Tyr-pattern plating (strengthening its defense even further against melee attacks), your slow move speed and the unwieldy nature of your MG-60 machine gun means you should not be spearheading any pushes. Aim mode is your best friend - combined with your red dot sight and bipod, you are very apt at sitting just behind the front line, eliminating threats and keeping the marines in front of you safe. Your backpack contains several additional box magazines, allowing you to carry almost two THOUSAND rounds on your person at any time. Your left pouch contains a first aid kit, complete with Bicaridine (which heals brute damage), Kelotane (which heals burn damage), Tramadol (which is a painkiller), Tricordrazine (which heals all damage, but slowly), and Dylovene (which heals toxin, or poison damage), as well as splints and inaprovaline. Your right pocket contains a flare gun holster and several flares. Your suit storage contains two plasma pistols, which are low in damage but can start fires. Your webbing contains an MRE to eat and both gauze and ointment, your helmet contains two protein bars for further eating, and your boots contain a standard issue combat knife for clearing weeds or breaking things.

Your full strength is hard to utilize on your own or in the very front of battle. Your ideal positions are either safely behind a barricade guarding a front or flank from assault, or behind your fellow marines, shooting over them with aim mode to protect them from enemies. Keep in mind that your heavy armor and weapon means you move rather slowly - so if you get the order to leave a position, get moving early to avoid being left behind.

TIPS

- BKTT is an acronym that is used to describe the combination of Bicardine, Kelotane, Tricordizine, and Tramadol used as an all-rounder combat medicine mix for any situation that heals all different types of damage. Make sure not to take more than two of each pill at a time - medicine takes a while to process through your system, and too many at once risks a dangerous overdose. Your gauze and ointment are body-part specific, unlike medication, but once you start applying one, you will keep applying it to all body parts that require treatment as long as you hold still. Your splints are used to alleviate the effects of bone fractures, by applying them to a fractured limb. Your inaprovaline autoinjector is not to be applied to yourself - rather, it should be applied to an alive marine that is so heavily injured they are unconscious on the ground (referred to as "critical condition") to rescue them from that state. You can remove pills from their packets directly by right clicking on the packet, even while it's in storage.
+ BKTT is an acronym that is used to describe the combination of Bicaridine, Kelotane, Tricordizine, and Tramadol used as an all-rounder combat medicine mix for any situation that heals all different types of damage. Make sure not to take more than two of each pill at a time - medicine takes a while to process through your system, and too many at once risks a dangerous overdose. Your gauze and ointment are body-part specific, unlike medication, but once you start applying one, you will keep applying it to all body parts that require treatment as long as you hold still. Your splints are used to alleviate the effects of bone fractures, by applying them to a fractured limb. Your inaprovaline autoinjector is not to be applied to yourself - rather, it should be applied to an alive marine that is so heavily injured they are unconscious on the ground (referred to as "critical condition") to rescue them from that state. You can remove pills from their packets directly by right clicking on the packet, even while it's in storage.

While holding your MG-60, use Z to wield your weapon with both hands, increasing accuracy and stability and reducing recoil. In the top left of your screen are several weapon-specific buttons. The "Take Aim" button toggles aim mode, a feature that slows your rate of fire in exchange for allowing you to shoot through allied marines. The bipod button will deploy your bipod, increasing fire rate and accuracy significantly for as long as you remain stationary.

@@ -46,13 +46,13 @@ /obj/item/paper/tutorial/beginner_marksman name = "Marksman Tutorial" - info = {"As a marksman, you are a master of precision and range, and should utilize both of these advantages as much as possible. Your DMR-37 is incredibly accurate at long ranges and packs a devastating punch. Due to your ability to engage at long range - and conversely, your inability to engage properly at short range - you should be staying as far from conflict as possible while still remaining in your rifle's effective range. Your backpack and both of your pouches contain spare magazines for your DMR. Your backpack also contains an MRE to eat, and both gauze and ointment for treating injuries. Your armor contains Bicardine (which heals brute damage), Kelotane (which heals burn damage), Tramadol (which is a painkiller), Tricordrazine (which heals all damage, but slowly), and an inaprovaline injector for helping other marines in critical condition. Your webbing contains the MK88 Mod 4, a fully automatic handgun for self-defense, as well as spare magazines for it. Your helmet contains protein bars to eat, and your boots contain a survival knife for clearing weeds and breaking things.
+ info = {"As a marksman, you are a master of precision and range, and should utilize both of these advantages as much as possible. Your DMR-37 is incredibly accurate at long ranges and packs a devastating punch. Due to your ability to engage at long range - and conversely, your inability to engage properly at short range - you should be staying as far from conflict as possible while still remaining in your rifle's effective range. Your backpack and both of your pouches contain spare magazines for your DMR. Your backpack also contains an MRE to eat, and both gauze and ointment for treating injuries. Your armor contains Bicaridine (which heals brute damage), Kelotane (which heals burn damage), Tramadol (which is a painkiller), Tricordrazine (which heals all damage, but slowly), and an inaprovaline injector for helping other marines in critical condition. Your webbing contains the MK88 Mod 4, a fully automatic handgun for self-defense, as well as spare magazines for it. Your helmet contains protein bars to eat, and your boots contain a survival knife for clearing weeds and breaking things.

With your DMR, aim to support other marines from afar using your scope and aim mode. Your range means that many xenomorphs might not realize you're watching over an area until you're already shooting at them - use this to your advantage. Your rate of fire is relatively slow compared to automatic weapons, so make each of your shots count.

TIPS

- BKTT is an acronym that is used to describe the combination of Bicardine, Kelotane, Tricordizine, and Tramadol used as an all-rounder combat medicine mix for any situation that heals all different types of damage. Make sure not to take more than two of each pill at a time - medicine takes a while to process through your system, and too many at once risks a dangerous overdose. Your gauze and ointment are body-part specific, unlike medication, but once you start applying one, you will keep applying it to all body parts that require treatment as long as you hold still. Your inaprovaline autoinjector is not to be applied to yourself - rather, it should be applied to an alive marine that is so heavily injured they are unconscious on the ground (referred to as "critical condition") to rescue them from that state. You can remove pills from their packets directly by right clicking on the packet, even while it's in storage.
+ BKTT is an acronym that is used to describe the combination of Bicaridine, Kelotane, Tricordizine, and Tramadol used as an all-rounder combat medicine mix for any situation that heals all different types of damage. Make sure not to take more than two of each pill at a time - medicine takes a while to process through your system, and too many at once risks a dangerous overdose. Your gauze and ointment are body-part specific, unlike medication, but once you start applying one, you will keep applying it to all body parts that require treatment as long as you hold still. Your inaprovaline autoinjector is not to be applied to yourself - rather, it should be applied to an alive marine that is so heavily injured they are unconscious on the ground (referred to as "critical condition") to rescue them from that state. You can remove pills from their packets directly by right clicking on the packet, even while it's in storage.

On running out of ammo, the empty magazine will automatically eject from the DMR. To reload, simply grab a new magazine with an empty hand and click your gun with it. Alternatively, you can perform a tactical reload by click-dragging the magazine from its storage directly onto the DMR, which can be done without an empty hand and with a different magazine still in the gun.

@@ -66,13 +66,13 @@ /obj/item/paper/tutorial/beginner_shotgunner name = "Shotgunner Tutorial" - info = {"As a shotgunner, you are the spearhead of the marine force. Your semiautomatic SH-39 fires slugs that will devastate any target at short to medium range, dealing heavy damage as well as leaving them stunned and staggered. Your role is to be at the front of any marine push, side by side with your fellow marines as you charge into danger. Your shotgun shell rig on your belt, as well as your backpack, hold many additional slugs to reload your shotgun with. Your backpack also contains an MRE to eat, and both gauze and ointment for treating injuries, as well as inaprovaline. Your left pouch contains a first aid kit, complete with Bicardine (which heals brute damage), Kelotane (which heals burn damage), Tramadol (which is a painkiller), Tricordrazine (which heals all damage, but slowly), and Dylovene (which heals toxin, or poison damage), as well as splints and inaprovaline. Your right pocket contains a flare gun holster and several flares. Your webbing contains a plasma pistol, a low damage sidearm that starts fires wherever it hits. Your suit storage contains boxes of additional flares. Your helmet contains protein bars to eat, and your boot contains a combat knife for clearing weeds and breaking things.
+ info = {"As a shotgunner, you are the spearhead of the marine force. Your semiautomatic SH-39 fires slugs that will devastate any target at short to medium range, dealing heavy damage as well as leaving them stunned and staggered. Your role is to be at the front of any marine push, side by side with your fellow marines as you charge into danger. Your shotgun shell rig on your belt, as well as your backpack, hold many additional slugs to reload your shotgun with. Your backpack also contains an MRE to eat, and both gauze and ointment for treating injuries, as well as inaprovaline. Your left pouch contains a first aid kit, complete with Bicaridine (which heals brute damage), Kelotane (which heals burn damage), Tramadol (which is a painkiller), Tricordrazine (which heals all damage, but slowly), and Dylovene (which heals toxin, or poison damage), as well as splints and inaprovaline. Your right pocket contains a flare gun holster and several flares. Your webbing contains a plasma pistol, a low damage sidearm that starts fires wherever it hits. Your suit storage contains boxes of additional flares. Your helmet contains protein bars to eat, and your boot contains a combat knife for clearing weeds and breaking things.

You should be close to the enemy constantly to take full advantage of your shotgun. This does not mean you should run off alone, as this is a good way to get yourself killed; rather, be in front of other marines, clearing away enemies to allow them to safely advance and cover you.

TIPS

- BKTT is an acronym that is used to describe the combination of Bicardine, Kelotane, Tricordizine, and Tramadol used as an all-rounder combat medicine mix for any situation that heals all different types of damage. Make sure not to take more than two of each pill at a time - medicine takes a while to process through your system, and too many at once risks a dangerous overdose. Your gauze and ointment are body-part specific, unlike medication, but once you start applying one, you will keep applying it to all body parts that require treatment as long as you hold still. Your splints are used to alleviate the effects of bone fractures, by applying them to a fractured limb. Your inaprovaline autoinjector is not to be applied to yourself - rather, it should be applied to an alive marine that is so heavily injured they are unconscious on the ground (referred to as "critical condition") to rescue them from that state. You can remove pills from their packets directly by right clicking on the packet, even while it's in storage.
+ BKTT is an acronym that is used to describe the combination of Bicaridine, Kelotane, Tricordizine, and Tramadol used as an all-rounder combat medicine mix for any situation that heals all different types of damage. Make sure not to take more than two of each pill at a time - medicine takes a while to process through your system, and too many at once risks a dangerous overdose. Your gauze and ointment are body-part specific, unlike medication, but once you start applying one, you will keep applying it to all body parts that require treatment as long as you hold still. Your splints are used to alleviate the effects of bone fractures, by applying them to a fractured limb. Your inaprovaline autoinjector is not to be applied to yourself - rather, it should be applied to an alive marine that is so heavily injured they are unconscious on the ground (referred to as "critical condition") to rescue them from that state. You can remove pills from their packets directly by right clicking on the packet, even while it's in storage.

While holding your SH-39, use Z to wield your weapon with both hands, increasing accuracy and stability and reducing recoil.

@@ -94,13 +94,13 @@ /obj/item/paper/tutorial/beginner_shocktrooper name = "Shocktrooper Tutorial" - info = {"As a shock trooper, you are a versatile yet powerful frontliner, and aim to change up tactics often to gain the advantage. You use the multimodal laser rifle, an experimental battery-powered weapon with an underbarrel flamethrower. Your belt contains spare energy cells for your laser rifle. Your right pocket and body armor contain a powerpack each- effectively bulkier versions of energy cells. Your body armor also contains a box of flares. Your left pocket contains a flare gun holster and several flares. Your backpack contains a large amount of miniature fuel tanks for use with your underbarrel flamethrower, as well as an inaprovaline autoinjector. Your webbing contains Bicardine (which heals brute damage), Kelotane (which heals burn damage), Tramadol (which is a painkiller), Tricordrazine (which heals all damage, but slowly), and gauze and ointment, which also heal brute and burn damage respectively. Your helmet contains protein bars and your boots contain an MRE, in case you get hungry.
+ info = {"As a shock trooper, you are a versatile yet powerful frontliner, and aim to change up tactics often to gain the advantage. You use the multimodal laser rifle, an experimental battery-powered weapon with an underbarrel flamethrower. Your belt contains spare energy cells for your laser rifle. Your right pocket and body armor contain a powerpack each- effectively bulkier versions of energy cells. Your body armor also contains a box of flares. Your left pocket contains a flare gun holster and several flares. Your backpack contains a large amount of miniature fuel tanks for use with your underbarrel flamethrower, as well as an inaprovaline autoinjector. Your webbing contains Bicaridine (which heals brute damage), Kelotane (which heals burn damage), Tramadol (which is a painkiller), Tricordrazine (which heals all damage, but slowly), and gauze and ointment, which also heal brute and burn damage respectively. Your helmet contains protein bars and your boots contain an MRE, in case you get hungry.

Switching between the different modes of your laser rifle is key to mastery on the battlefield. Like other frontliners, you aim to lead the push into enemy territory, clearing the path forward and facing xenomorphs head-on.

TIPS

- BKTT is an acronym that is used to describe the combination of Bicardine, Kelotane, Tricordizine, and Tramadol used as an all-rounder combat medicine mix for any situation that heals all different types of damage. Make sure not to take more than two of each pill at a time - medicine takes a while to process through your system, and too many at once risks a dangerous overdose. Your gauze and ointment are body-part specific, unlike medication, but once you start applying one, you will keep applying it to all body parts that require treatment as long as you hold still. Your inaprovaline autoinjector is not to be applied to yourself - rather, it should be applied to an alive marine that is so heavily injured they are unconscious on the ground (referred to as "critical condition") to rescue them from that state. You can remove pills from their packets directly by right clicking on the packet, even while it's in storage.
+ BKTT is an acronym that is used to describe the combination of Bicaridine, Kelotane, Tricordizine, and Tramadol used as an all-rounder combat medicine mix for any situation that heals all different types of damage. Make sure not to take more than two of each pill at a time - medicine takes a while to process through your system, and too many at once risks a dangerous overdose. Your gauze and ointment are body-part specific, unlike medication, but once you start applying one, you will keep applying it to all body parts that require treatment as long as you hold still. Your inaprovaline autoinjector is not to be applied to yourself - rather, it should be applied to an alive marine that is so heavily injured they are unconscious on the ground (referred to as "critical condition") to rescue them from that state. You can remove pills from their packets directly by right clicking on the packet, even while it's in storage.

On running out of ammo, the empty battery will automatically eject from the rifle. To reload, simply grab a new battery with an empty hand and click your gun with it. Alternatively, you can perform a tactical reload by click-dragging the battery from its storage directly onto the rifle, which can be done without an empty hand and with a different battery still in the gun. The powerpacks are a bit different - they have to be click-dragged while in one of your pockets to attach to the gun, and once attached remain in your pocket. However, they have four times the energy of a normal magazine. To refuel your underbarrel flamethrower, right click the gun with an empty hand to remove the old tank, then right click the gun again with a fresh tank.

@@ -114,13 +114,13 @@ /obj/item/paper/tutorial/beginner_hazmat name = "Hazmat Tutorial" - info = {"As a HAZMAT, you excel in situations too dangerous for other marines. Your Mimir type armor grants you complete immunity to toxic gas, from acid to neurotoxin. It also provides an increased resistance against acid in general, for dealing with ranged xenomorphs. Your AR-11 is somewhat unwieldy and inaccurate, but packs both potent bursts and an impressive 70-round magazine. Your backpack, left pouch, and suit storage are all filled with spare magazines for your AR-11. Your right pouch contains a first aid kit, complete with Bicardine (which heals brute damage), Kelotane (which heals burn damage), Tramadol (which is a painkiller), Tricordrazine (which heals all damage, but slowly), and Dylovene (which heals toxin, or poison damage), as well as splints and inaprovaline. Your webbing contains flares for lighting areas, gauze and ointment for treating wounds, and a miniature fire extinguisher. Your helmet contains protein bars and your boots contain an MRE, for if you get hungry.
+ info = {"As a HAZMAT, you excel in situations too dangerous for other marines. Your Mimir type armor grants you complete immunity to toxic gas, from acid to neurotoxin. It also provides an increased resistance against acid in general, for dealing with ranged xenomorphs. Your AR-11 is somewhat unwieldy and inaccurate, but packs both potent bursts and an impressive 70-round magazine. Your backpack, left pouch, and suit storage are all filled with spare magazines for your AR-11. Your right pouch contains a first aid kit, complete with Bicaridine (which heals brute damage), Kelotane (which heals burn damage), Tramadol (which is a painkiller), Tricordrazine (which heals all damage, but slowly), and Dylovene (which heals toxin, or poison damage), as well as splints and inaprovaline. Your webbing contains flares for lighting areas, gauze and ointment for treating wounds, and a miniature fire extinguisher. Your helmet contains protein bars and your boots contain an MRE, for if you get hungry.

Unlike other marines, you have no reason to fear toxic gas - and thanks to your tactical sensor, you pose quite a threat to xenomorphs while in it. Hide in smoke and use your sensor to fire at xenomorphs that can't see you back. In the absence of smoke, your AR-11 is still quite powerful, and can be used in many situations, though its inaccuracy makes it somewhat less potent at longer ranges.

TIPS

- BKTT is an acronym that is used to describe the combination of Bicardine, Kelotane, Tricordizine, and Tramadol used as an all-rounder combat medicine mix for any situation that heals all different types of damage. Make sure not to take more than two of each pill at a time - medicine takes a while to process through your system, and too many at once risks a dangerous overdose. Your gauze and ointment are body-part specific, unlike medication, but once you start applying one, you will keep applying it to all body parts that require treatment as long as you hold still. Your splints are used to alleviate the effects of bone fractures, by applying them to a fractured limb. Your inaprovaline autoinjector is not to be applied to yourself - rather, it should be applied to an alive marine that is so heavily injured they are unconscious on the ground (referred to as "critical condition") to rescue them from that state. You can remove pills from their packets directly by right clicking on the packet, even while it's in storage.
+ BKTT is an acronym that is used to describe the combination of Bicaridine, Kelotane, Tricordizine, and Tramadol used as an all-rounder combat medicine mix for any situation that heals all different types of damage. Make sure not to take more than two of each pill at a time - medicine takes a while to process through your system, and too many at once risks a dangerous overdose. Your gauze and ointment are body-part specific, unlike medication, but once you start applying one, you will keep applying it to all body parts that require treatment as long as you hold still. Your splints are used to alleviate the effects of bone fractures, by applying them to a fractured limb. Your inaprovaline autoinjector is not to be applied to yourself - rather, it should be applied to an alive marine that is so heavily injured they are unconscious on the ground (referred to as "critical condition") to rescue them from that state. You can remove pills from their packets directly by right clicking on the packet, even while it's in storage.

While holding your AR-11, use Z to wield your weapon with both hands, increasing accuracy and stability and reducing recoil. In the top left of your screen are several weapon-specific buttons. The "Take Aim" button toggles aim mode, a feature that slows your rate of fire in exchange for allowing you to shoot through allied marines. The second option changes the firing mode, between Single Automatic, Burst, and Burst Automatic. Automatic modes will keep firing as long as you hold down the mouse button. The tactical sensor option toggles your tactical sensor - you should keep this on always.

@@ -136,13 +136,13 @@ /obj/item/paper/tutorial/beginner_cqc name = "CQC Tutorial" - info = {"As a CQC marine, you are incredibly mobile, and should be using and abusing your speed to dart in and out of danger. You are effective both spearheading the assault and pushing into flanks. Your AR-18 carbine isn't the most dangerous rifle, nor does it have a particularly high magazine size, but it's incredibly lightweight compared to almost any other weapon, and its relative accuracy and stability even while moving and high fire rate allow it to pose a surprise threat to almost any xenomorphs. Your belt, body armor, and backpack all contain spare magazines for your AR-18. Your backpack also contains an MRE (in case you get hungry) as well as gauze and ointment to treat injuries with. Your left pocket contains a flare gun and several flares. Your right pouch contains a first aid kit, complete with Bicardine (which heals brute damage), Kelotane (which heals burn damage), Tramadol (which is a painkiller), Tricordrazine (which heals all damage, but slowly), and Dylovene (which heals toxin, or poison damage), as well as splints and inaprovaline. Your webbing contains gauze and ointment for healing, an MRE for eating, and two boxes of flares. Your helmet contains protein bars for eating, and your boots contain a combat knife for clearing weeds and breaking things.
+ info = {"As a CQC marine, you are incredibly mobile, and should be using and abusing your speed to dart in and out of danger. You are effective both spearheading the assault and pushing into flanks. Your AR-18 carbine isn't the most dangerous rifle, nor does it have a particularly high magazine size, but it's incredibly lightweight compared to almost any other weapon, and its relative accuracy and stability even while moving and high fire rate allow it to pose a surprise threat to almost any xenomorphs. Your belt, body armor, and backpack all contain spare magazines for your AR-18. Your backpack also contains an MRE (in case you get hungry) as well as gauze and ointment to treat injuries with. Your left pocket contains a flare gun and several flares. Your right pouch contains a first aid kit, complete with Bicaridine (which heals brute damage), Kelotane (which heals burn damage), Tramadol (which is a painkiller), Tricordrazine (which heals all damage, but slowly), and Dylovene (which heals toxin, or poison damage), as well as splints and inaprovaline. Your webbing contains gauze and ointment for healing, an MRE for eating, and two boxes of flares. Your helmet contains protein bars for eating, and your boots contain a combat knife for clearing weeds and breaking things.

Your speed is your greatest strength. You should be using it to rush into combat and chase after already injured enemies, only to rapidly retreat before things turn south. You're ideal at scouting locations, quickly reinforcing threatened positions, and overall being everywhere at once.

TIPS

- BKTT is an acronym that is used to describe the combination of Bicardine, Kelotane, Tricordizine, and Tramadol used as an all-rounder combat medicine mix for any situation that heals all different types of damage. Make sure not to take more than two of each pill at a time - medicine takes a while to process through your system, and too many at once risks a dangerous overdose. Your gauze and ointment are body-part specific, unlike medication, but once you start applying one, you will keep applying it to all body parts that require treatment as long as you hold still. Your splints are used to alleviate the effects of bone fractures, by applying them to a fractured limb. Your inaprovaline autoinjector is not to be applied to yourself - rather, it should be applied to an alive marine that is so heavily injured they are unconscious on the ground (referred to as "critical condition") to rescue them from that state. You can remove pills from their packets directly by right clicking on the packet, even while it's in storage.
+ BKTT is an acronym that is used to describe the combination of Bicaridine, Kelotane, Tricordizine, and Tramadol used as an all-rounder combat medicine mix for any situation that heals all different types of damage. Make sure not to take more than two of each pill at a time - medicine takes a while to process through your system, and too many at once risks a dangerous overdose. Your gauze and ointment are body-part specific, unlike medication, but once you start applying one, you will keep applying it to all body parts that require treatment as long as you hold still. Your splints are used to alleviate the effects of bone fractures, by applying them to a fractured limb. Your inaprovaline autoinjector is not to be applied to yourself - rather, it should be applied to an alive marine that is so heavily injured they are unconscious on the ground (referred to as "critical condition") to rescue them from that state. You can remove pills from their packets directly by right clicking on the packet, even while it's in storage.

While holding your AR-18, use Z to wield your weapon with both hands, increasing accuracy and stability and reducing recoil. In the top left of your screen are several weapon-specific buttons. The "Take Aim" button toggles aim mode, a feature that slows your rate of fire in exchange for allowing you to shoot through allied marines. The second option changes the firing mode, between Single Automatic, Burst, and Burst Automatic. Automatic modes will keep firing as long as you hold down the mouse button. The tactical sensor option toggles your tactical sensor - you should keep this on always.

@@ -156,13 +156,13 @@ /obj/item/paper/tutorial/beginner_chad name = "Grenadier Tutorial" - info = {"As a grenadier, you are the master of area denial. Your six-chamber GL-70 grenade launcher boasts unparalleled roomclearing potential, and impressive lethality - just take care to avoid harming your fellow marines. Your belt, backpack, both pockets, and body armor are all filled with HEDP grenades to reload your grenade launcher with. Your webbing contains Bicardine (which heals brute damage), Kelotane (which heals burn damage), Tramadol (which is a painkiller), Tricordrazine (which heals all damage, but slowly), and gauze and ointment, which also heal brute and burn damage respectively. Your backpack also contains an inaprovaline injector, which can be used to help other critically injured marines. Your helmet contains two protein bars, in case you get hungry, and your boots contain a derringer, a two-shot sidearm for when the first six grenades didn't kill the bug.
+ info = {"As a grenadier, you are the master of area denial. Your six-chamber GL-70 grenade launcher boasts unparalleled roomclearing potential, and impressive lethality - just take care to avoid harming your fellow marines. Your belt, backpack, both pockets, and body armor are all filled with HEDP grenades to reload your grenade launcher with. Your webbing contains Bicaridine (which heals brute damage), Kelotane (which heals burn damage), Tramadol (which is a painkiller), Tricordrazine (which heals all damage, but slowly), and gauze and ointment, which also heal brute and burn damage respectively. Your backpack also contains an inaprovaline injector, which can be used to help other critically injured marines. Your helmet contains two protein bars, in case you get hungry, and your boots contain a derringer, a two-shot sidearm for when the first six grenades didn't kill the bug.

Your power is as much of a liability as it is a utility if you aren't careful. Before you get happy on the trigger, make SURE there aren't going to be marines in the blast radius, unless you want to end up filled with bullet holes (which your Hod accident prevention plating will partially block!) With that warning out of the way, you can kill even the beefiest of xenomorphs with good aim.

TIPS

- BKTT is an acronym that is used to describe the combination of Bicardine, Kelotane, Tricordizine, and Tramadol used as an all-rounder combat medicine mix for any situation that heals all different types of damage. Make sure not to take more than two of each pill at a time - medicine takes a while to process through your system, and too many at once risks a dangerous overdose. Your gauze and ointment are body-part specific, unlike medication, but once you start applying one, you will keep applying it to all body parts that require treatment as long as you hold still. Your inaprovaline autoinjector is not to be applied to yourself - rather, it should be applied to an alive marine that is so heavily injured they are unconscious on the ground (referred to as "critical condition") to rescue them from that state. You can remove pills from their packets directly by right clicking on the packet, even while it's in storage.
+ BKTT is an acronym that is used to describe the combination of Bicaridine, Kelotane, Tricordizine, and Tramadol used as an all-rounder combat medicine mix for any situation that heals all different types of damage. Make sure not to take more than two of each pill at a time - medicine takes a while to process through your system, and too many at once risks a dangerous overdose. Your gauze and ointment are body-part specific, unlike medication, but once you start applying one, you will keep applying it to all body parts that require treatment as long as you hold still. Your inaprovaline autoinjector is not to be applied to yourself - rather, it should be applied to an alive marine that is so heavily injured they are unconscious on the ground (referred to as "critical condition") to rescue them from that state. You can remove pills from their packets directly by right clicking on the packet, even while it's in storage.

While holding your grenade launcher, press Z to wield it. You MUST wield your grenade launcher to use it!

@@ -188,7 +188,7 @@
All metal barricades can be upgraded, the basic upgrade is of course barbed wire. This damages xenos when they attack the barricade and prevents them (and marines!) from climbing over the barricade.

- BKTT is an acronym that is used to describe the combination of Bicardine, Kelotane, Tricordizine, and Tramadol used as an all-rounder combat medicine mix for any situation that heals all different types of damage. Make sure not to take more than two of each pill at a time - medicine takes a while to process through your system, and too many at once risks a dangerous overdose. Your gauze and ointment are body-part specific, unlike medication, but once you start applying one, you will keep applying it to all body parts that require treatment as long as you hold still. Your splints are used to alleviate the effects of bone fractures, by applying them to a fractured limb. Your inaprovaline autoinjector is not to be applied to yourself - rather, it should be applied to an alive marine that is so heavily injured they are unconscious on the ground (referred to as "critical condition") to rescue them from that state. You can remove pills from their packets directly by right clicking on the packet, even while it's in storage."} + BKTT is an acronym that is used to describe the combination of Bicaridine, Kelotane, Tricordizine, and Tramadol used as an all-rounder combat medicine mix for any situation that heals all different types of damage. Make sure not to take more than two of each pill at a time - medicine takes a while to process through your system, and too many at once risks a dangerous overdose. Your gauze and ointment are body-part specific, unlike medication, but once you start applying one, you will keep applying it to all body parts that require treatment as long as you hold still. Your splints are used to alleviate the effects of bone fractures, by applying them to a fractured limb. Your inaprovaline autoinjector is not to be applied to yourself - rather, it should be applied to an alive marine that is so heavily injured they are unconscious on the ground (referred to as "critical condition") to rescue them from that state. You can remove pills from their packets directly by right clicking on the packet, even while it's in storage."} /obj/item/paper/tutorial/flamer name = "Flamer Tutorial" @@ -202,7 +202,7 @@
Your claymore mines are useful for denying an area from being easily flanked and can cause serious disruption (or even kill!) backlining xenomorphs from causing you a bad day.

- BKTT is an acronym that is used to describe the combination of Bicardine, Kelotane, Tricordizine, and Tramadol used as an all-rounder combat medicine mix for any situation that heals all different types of damage. Make sure not to take more than two of each pill at a time - medicine takes a while to process through your system, and too many at once risks a dangerous overdose. Your gauze and ointment are body-part specific, unlike medication, but once you start applying one, you will keep applying it to all body parts that require treatment as long as you hold still. Your splints are used to alleviate the effects of bone fractures, by applying them to a fractured limb. Your inaprovaline autoinjector is not to be applied to yourself - rather, it should be applied to an alive marine that is so heavily injured they are unconscious on the ground (referred to as "critical condition") to rescue them from that state. You can remove pills from their packets directly by right clicking on the packet, even while it's in storage."} + BKTT is an acronym that is used to describe the combination of Bicaridine, Kelotane, Tricordizine, and Tramadol used as an all-rounder combat medicine mix for any situation that heals all different types of damage. Make sure not to take more than two of each pill at a time - medicine takes a while to process through your system, and too many at once risks a dangerous overdose. Your gauze and ointment are body-part specific, unlike medication, but once you start applying one, you will keep applying it to all body parts that require treatment as long as you hold still. Your splints are used to alleviate the effects of bone fractures, by applying them to a fractured limb. Your inaprovaline autoinjector is not to be applied to yourself - rather, it should be applied to an alive marine that is so heavily injured they are unconscious on the ground (referred to as "critical condition") to rescue them from that state. You can remove pills from their packets directly by right clicking on the packet, even while it's in storage."} /obj/item/paper/tutorial/plasmacutter name = "PlasmaCutter Tutorial" @@ -216,7 +216,7 @@
Your plasma cutter can be used as a melee weapon in emergency situations, while not the best by any means it can work in a pinch and if you manage to smack a xeno you'll get rewarded with draining them of a small amount of plasma and a bit of charge for your plasma cutter. Use this to destroy mazes and punish xenos for trying to attack you by refilling your battery. A recommended combo when frontlining us combining it with a defensive shield!

- BKTT is an acronym that is used to describe the combination of Bicardine, Kelotane, Tricordizine, and Tramadol used as an all-rounder combat medicine mix for any situation that heals all different types of damage. Make sure not to take more than two of each pill at a time - medicine takes a while to process through your system, and too many at once risks a dangerous overdose. Your gauze and ointment are body-part specific, unlike medication, but once you start applying one, you will keep applying it to all body parts that require treatment as long as you hold still. Your splints are used to alleviate the effects of bone fractures, by applying them to a fractured limb. Your inaprovaline autoinjector is not to be applied to yourself - rather, it should be applied to an alive marine that is so heavily injured they are unconscious on the ground (referred to as "critical condition") to rescue them from that state. You can remove pills from their packets directly by right clicking on the packet, even while it's in storage."} + BKTT is an acronym that is used to describe the combination of Bicaridine, Kelotane, Tricordizine, and Tramadol used as an all-rounder combat medicine mix for any situation that heals all different types of damage. Make sure not to take more than two of each pill at a time - medicine takes a while to process through your system, and too many at once risks a dangerous overdose. Your gauze and ointment are body-part specific, unlike medication, but once you start applying one, you will keep applying it to all body parts that require treatment as long as you hold still. Your splints are used to alleviate the effects of bone fractures, by applying them to a fractured limb. Your inaprovaline autoinjector is not to be applied to yourself - rather, it should be applied to an alive marine that is so heavily injured they are unconscious on the ground (referred to as "critical condition") to rescue them from that state. You can remove pills from their packets directly by right clicking on the packet, even while it's in storage."} /obj/item/paper/tutorial/lifesaver name = "Lifesaver Tutorial" @@ -242,7 +242,7 @@
Accidentally overdose a marine? They're full of deadly neurotoxin? Don't panic - use hypervene. While uncomfortable for the marine, this medication (located in your medical belt) will rapidly purge their system.

- You can use meralyne and dermaline at the same time as bicardine and kelotane, for an accelerated healing rate."} + You can use meralyne and dermaline at the same time as Bicaridine and kelotane, for an accelerated healing rate."} /obj/item/paper/tutorial/hypobelt name = "Hypobelt Tutorial" @@ -262,7 +262,7 @@
Accidentally overdose a marine? They're full of deadly neurotoxin? Don't panic - use hypervene. While uncomfortable for the marine, this medication (located in your medical belt) will rapidly purge their system.

- You can use meralyne and dermaline at the same time as bicardine and kelotane, for an accelerated healing rate.
+ You can use meralyne and dermaline at the same time as Bicaridine and kelotane, for an accelerated healing rate.

As your shotgun is pump-action, you'll need to pump it after every shot by pressing Unique Action (default space.)

@@ -270,13 +270,13 @@ /obj/item/paper/tutorial/smartmachinegunner name = "Smartmachinegunner Tutorial" - info = {"As the smartmachinegunner, you are the very backbone of your squad, and should be behind another marine or three at all times. Your SG-29 is capable of firing directly through your teammates without risk of harm, so staying safe and behind your allies is essential to gaining full value out of it. Your backpack and body armor contain both fire extinguishers and spare ammo, with your backpack also containing a plasma pistol to start fires with. Your left pouch contains a flare gun holster and several flares. Your right pouch contains a first aid kit, complete with Bicardine (which heals brute damage), Kelotane (which heals burn damage), Tramadol (which is a painkiller), Tricordrazine (which heals all damage, but slowly), and Dylovene (which heals toxin, or poison damage), as well as splints and inaprovaline. Your webbing contains flares for creating lights and gauze and ointment for treating injuries. Your helmet and boots contain food, in case you get hungry.
+ info = {"As the smartmachinegunner, you are the very backbone of your squad, and should be behind another marine or three at all times. Your SG-29 is capable of firing directly through your teammates without risk of harm, so staying safe and behind your allies is essential to gaining full value out of it. Your backpack and body armor contain both fire extinguishers and spare ammo, with your backpack also containing a plasma pistol to start fires with. Your left pouch contains a flare gun holster and several flares. Your right pouch contains a first aid kit, complete with Bicaridine (which heals brute damage), Kelotane (which heals burn damage), Tramadol (which is a painkiller), Tricordrazine (which heals all damage, but slowly), and Dylovene (which heals toxin, or poison damage), as well as splints and inaprovaline. Your webbing contains flares for creating lights and gauze and ointment for treating injuries. Your helmet and boots contain food, in case you get hungry.

You should NEVER be at the front of a group of marines. Aim to provide covering fire for those who are in front, and let them protect you in turn by, well, being in front of you. Remember that your SG-29 fires through marines, so you don't need to worry about friendly fire.

TIPS

- BKTT is an acronym that is used to describe the combination of Bicardine, Kelotane, Tricordizine, and Tramadol used as an all-rounder combat medicine mix for any situation that heals all different types of damage. Make sure not to take more than two of each pill at a time - medicine takes a while to process through your system, and too many at once risks a dangerous overdose. Your gauze and ointment are body-part specific, unlike medication, but once you start applying one, you will keep applying it to all body parts that require treatment as long as you hold still. Your splints are used to alleviate the effects of bone fractures, by applying them to a fractured limb. Your inaprovaline autoinjector is not to be applied to yourself - rather, it should be applied to an alive marine that is so heavily injured they are unconscious on the ground (referred to as "critical condition") to rescue them from that state. You can remove pills from their packets directly by right clicking on the packet, even while it's in storage.
+ BKTT is an acronym that is used to describe the combination of Bicaridine, Kelotane, Tricordizine, and Tramadol used as an all-rounder combat medicine mix for any situation that heals all different types of damage. Make sure not to take more than two of each pill at a time - medicine takes a while to process through your system, and too many at once risks a dangerous overdose. Your gauze and ointment are body-part specific, unlike medication, but once you start applying one, you will keep applying it to all body parts that require treatment as long as you hold still. Your splints are used to alleviate the effects of bone fractures, by applying them to a fractured limb. Your inaprovaline autoinjector is not to be applied to yourself - rather, it should be applied to an alive marine that is so heavily injured they are unconscious on the ground (referred to as "critical condition") to rescue them from that state. You can remove pills from their packets directly by right clicking on the packet, even while it's in storage.

Your flare gun can be rapidly reloaded by just right clicking the flare pouch with it in hand. Your flare pouch can be refilled by left clicking on it while holding a flare box. Flare any dark area you can see to reduce the risk of a xenomorph ambushing you from the dark. On a similar note, your suit's light can be toggled in the top left - you should almost always keep this on to help your visibility.

@@ -302,12 +302,12 @@ /obj/item/paper/tutorial/smartminigunner name = "Smartminigunner Tutorial" - info = {"As the smartminigunner, you are the very embodiment of BRRT. With your huge SG-85 smart minigun, you can fire ten rounds per second for one hundred straight seconds, providing powerful covering fire for other marines. No enemy wants to get stuck in your line of fire. Instead of a backpack you carry a back mounted powerpack that feeds and powers your SG-85. In your body armor are two bins to refill your powerpack with. Your left pouch contains a flare gun holster and several flares. Your right pouch contains a first aid kit, complete with Bicardine (which heals brute damage), Kelotane (which heals burn damage), Tramadol (which is a painkiller), Tricordrazine (which heals all damage, but slowly), and Dylovene (which heals toxin, or poison damage), as well as splints and inaprovaline. Your webbing contains flares for creating lights and gauze and ointment for treating injuries. Your helmet and boots contain food, in case you get hungry.
+ info = {"As the smartminigunner, you are the very embodiment of BRRT. With your huge SG-85 smart minigun, you can fire ten rounds per second for one hundred straight seconds, providing powerful covering fire for other marines. No enemy wants to get stuck in your line of fire. Instead of a backpack you carry a back mounted powerpack that feeds and powers your SG-85. In your body armor are two bins to refill your powerpack with. Your left pouch contains a flare gun holster and several flares. Your right pouch contains a first aid kit, complete with Bicaridine (which heals brute damage), Kelotane (which heals burn damage), Tramadol (which is a painkiller), Tricordrazine (which heals all damage, but slowly), and Dylovene (which heals toxin, or poison damage), as well as splints and inaprovaline. Your webbing contains flares for creating lights and gauze and ointment for treating injuries. Your helmet and boots contain food, in case you get hungry.

Your minigun boasts both high levels of armor piercing and the ability to shoot through allies - use both to your advantage. Note that the heavy nature of your minigun and your brief windup before you can fire means you're best positioned defensively, firing at the toughest targets within range.

TIPS
- BKTT is an acronym that is used to describe the combination of Bicardine, Kelotane, Tricordizine, and Tramadol used as an all-rounder combat medicine mix for any situation that heals all different types of damage. Make sure not to take more than two of each pill at a time - medicine takes a while to process through your system, and too many at once risks a dangerous overdose. Your gauze and ointment are body-part specific, unlike medication, but once you start applying one, you will keep applying it to all body parts that require treatment as long as you hold still. Your splints are used to alleviate the effects of bone fractures, by applying them to a fractured limb. Your inaprovaline autoinjector is not to be applied to yourself - rather, it should be applied to an alive marine that is so heavily injured they are unconscious on the ground (referred to as "critical condition") to rescue them from that state. You can remove pills from their packets directly by right clicking on the packet, even while it's in storage.
+ BKTT is an acronym that is used to describe the combination of Bicaridine, Kelotane, Tricordizine, and Tramadol used as an all-rounder combat medicine mix for any situation that heals all different types of damage. Make sure not to take more than two of each pill at a time - medicine takes a while to process through your system, and too many at once risks a dangerous overdose. Your gauze and ointment are body-part specific, unlike medication, but once you start applying one, you will keep applying it to all body parts that require treatment as long as you hold still. Your splints are used to alleviate the effects of bone fractures, by applying them to a fractured limb. Your inaprovaline autoinjector is not to be applied to yourself - rather, it should be applied to an alive marine that is so heavily injured they are unconscious on the ground (referred to as "critical condition") to rescue them from that state. You can remove pills from their packets directly by right clicking on the packet, even while it's in storage.

Your flare gun can be rapidly reloaded by just right clicking the flare pouch with it in hand. Your flare pouch can be refilled by left clicking on it while holding a flare box. Flare any dark area you can see to reduce the risk of a xenomorph ambushing you from the dark. On a similar note, your suit's light can be toggled in the top left - you should almost always keep this on to help your visibility.

diff --git a/code/modules/projectiles/ammo_datums.dm b/code/modules/projectiles/ammo_datums.dm index a0695740a434f..42daa598476db 100644 --- a/code/modules/projectiles/ammo_datums.dm +++ b/code/modules/projectiles/ammo_datums.dm @@ -630,6 +630,28 @@ GLOBAL_LIST_INIT(no_sticky_resin, typecacheof(list(/obj/item/clothing/mask/faceh damage_falloff = 3 shrapnel_chance = 45 +/datum/ammo/bullet/smg/squash + name = "squash-head submachinegun bullet" + hud_state = "pistol_squash" + flags_ammo_behavior = AMMO_BALLISTIC|AMMO_SUNDERING + damage = 15 + penetration = 15 + armor_type = BOMB + sundering = 1 + damage_falloff = 2 + shrapnel_chance = 0 + ///shatter effection duration when hitting mobs + var/shatter_duration = 3 SECONDS + +/datum/ammo/bullet/smg/squash/on_hit_mob(mob/M, obj/projectile/proj) + if(!isliving(M)) + return + + var/mob/living/living_victim = M + living_victim.apply_status_effect(STATUS_EFFECT_SHATTER, shatter_duration) + + + /datum/ammo/bullet/smg/incendiary name = "incendiary submachinegun bullet" hud_state = "smg_fire" @@ -2693,6 +2715,11 @@ GLOBAL_LIST_INIT(no_sticky_resin, typecacheof(list(/obj/item/clothing/mask/faceh /datum/ammo/mortar/rocket/mlrs/drop_nade(turf/T) explosion(T, 0, 0, 4, 0, 2) +/datum/ammo/mortar/rocket/mlrs/incendiary/drop_nade(turf/T) + explosion(T, 0, 0, 2, 0, 2) + flame_radius(3, T) + playsound(T, 'sound/weapons/guns/fire/flamethrower2.ogg', 35, 1, 4) + /datum/ammo/mortar/rocket/smoke/mlrs shell_speed = 2.5 smoketype = /datum/effect_system/smoke_spread/mustard @@ -2704,6 +2731,9 @@ GLOBAL_LIST_INIT(no_sticky_resin, typecacheof(list(/obj/item/clothing/mask/faceh smoke.set_up(5, T, 6) smoke.start() +/datum/ammo/mortar/rocket/smoke/mlrs + smoketype = /datum/effect_system/smoke_spread/tactical + /* //================================================ Energy Ammo @@ -2744,6 +2774,7 @@ GLOBAL_LIST_INIT(no_sticky_resin, typecacheof(list(/obj/item/clothing/mask/faceh max_range = 15 accurate_range = 10 bullet_color = COLOR_VIVID_YELLOW + /datum/ammo/energy/taser/on_hit_mob(mob/M,obj/projectile/P) staggerstun(M, P, stun = 20 SECONDS) @@ -2777,6 +2808,16 @@ GLOBAL_LIST_INIT(no_sticky_resin, typecacheof(list(/obj/item/clothing/mask/faceh var/mob/living/carbon/xenomorph/X = M X.use_plasma(0.3 * X.xeno_caste.plasma_max * X.xeno_caste.plasma_regen_limit) //Drains 30% of max plasma on hit +/datum/ammo/energy/lasburster + name = "lasburster bolt" + flags_ammo_behavior = AMMO_ENERGY|AMMO_HITSCAN + hud_state = "laser_overcharge" + armor_type = LASER + damage = 40 + penetration = 5 + max_range = 7 + hitscan_effect_icon = "beam_heavy" + /datum/ammo/energy/lasgun name = "laser bolt" icon_state = "laser" diff --git a/code/modules/projectiles/gun_system.dm b/code/modules/projectiles/gun_system.dm index 8c9c7c1477646..478b504f450c7 100644 --- a/code/modules/projectiles/gun_system.dm +++ b/code/modules/projectiles/gun_system.dm @@ -17,14 +17,13 @@ /obj/item/weapon/gun name = "Guns" desc = "Its a gun. It's pretty terrible, though." - icon = 'icons/obj/items/gun.dmi' icon_state = "" item_state = "gun" item_state_worn = TRUE item_icons = list( - slot_l_hand_str = 'icons/mob/items_lefthand_1.dmi', - slot_r_hand_str = 'icons/mob/items_righthand_1.dmi', - ) + slot_l_hand_str = 'icons/mob/inhands/guns/rifles_left_1.dmi', + slot_r_hand_str = 'icons/mob/inhands/guns/rifles_right_1.dmi', + ) max_integrity = 250 w_class = WEIGHT_CLASS_NORMAL throwforce = 5 @@ -509,7 +508,6 @@ COMSIG_MOB_SKILLS_CHANGED, COMSIG_MOB_SHOCK_STAGE_CHANGED, COMSIG_HUMAN_MARKSMAN_AURA_CHANGED), PROC_REF(setup_bullet_accuracy)) - SEND_SIGNAL(gun_user, COMSIG_GUN_USER_SET, src) if(flags_gun_features & GUN_AMMO_COUNTER) gun_user.hud_used.add_ammo_hud(src, get_ammo_list(), get_display_ammo_count()) if(heat_per_fire) diff --git a/code/modules/projectiles/guns/energy.dm b/code/modules/projectiles/guns/energy.dm index c4efa05757b42..f322f479e4129 100644 --- a/code/modules/projectiles/guns/energy.dm +++ b/code/modules/projectiles/guns/energy.dm @@ -3,6 +3,11 @@ //ENERGY GUNS/ETC /obj/item/weapon/gun/energy + icon = 'icons/obj/items/guns/energy.dmi' + item_icons = list( + slot_l_hand_str = 'icons/mob/inhands/guns/energy_left_1.dmi', + slot_r_hand_str = 'icons/mob/inhands/guns/energy_right_1.dmi', + ) attachable_allowed = list() rounds_per_shot = 10 //100 shots. flags_gun_features = GUN_AMMO_COUNTER|GUN_AMMO_COUNT_BY_SHOTS_REMAINING|GUN_NO_PITCH_SHIFT_NEAR_EMPTY @@ -244,7 +249,7 @@ /obj/item/weapon/gun/energy/lasgun/lasrifle name = "\improper LR-73 lasrifle MK2" desc = "A multifunctional laser based rifle with an integrated mode selector. Ideal for any situation. Uses power cells instead of ballistic magazines." - icon = 'icons/Marine/gun64.dmi' + icon = 'icons/obj/items/guns/energy64.dmi' icon_state = "tx73" item_state = "tx73" max_shots = 50 //codex stuff @@ -1155,14 +1160,13 @@ /obj/item/weapon/gun/energy/lasgun/lasrifle/volkite/caliver name = "\improper VX-33 Caliver" desc = "Volkite weapons are the pride of Martian weapons manufacturing, their construction being a tightly guarded secret. Infamous for its ability to deflagrate organic targets with its tremendous thermal energy, explosively burning flesh in a fiery blast that can be deadly to anyone unfortunate enough to be nearby. The caliver is the primary rifle of the volkite family, and effective at most ranges and situations. Drag click the powerpack to the gun to use that instead of magazines." - icon = 'icons/Marine/gun64.dmi' icon_state = "caliver" item_state = "caliver" inhand_x_dimension = 64 inhand_y_dimension = 32 item_icons = list( - slot_l_hand_str = 'icons/mob/items_lefthand_64.dmi', - slot_r_hand_str = 'icons/mob/items_righthand_64.dmi', + slot_l_hand_str = 'icons/mob/inhands/guns/energy_left_64.dmi', + slot_r_hand_str = 'icons/mob/inhands/guns/energy_right_64.dmi', ) fire_sound = 'sound/weapons/guns/fire/volkite_3.ogg' max_shots = 40 @@ -1212,8 +1216,8 @@ inhand_x_dimension = 64 inhand_y_dimension = 32 item_icons = list( - slot_l_hand_str = 'icons/mob/items_lefthand_64.dmi', - slot_r_hand_str = 'icons/mob/items_righthand_64.dmi', + slot_l_hand_str = 'icons/mob/inhands/guns/energy_left_64.dmi', + slot_r_hand_str = 'icons/mob/inhands/guns/energy_right_64.dmi', ) ammo_level_icon = null gun_skill_category = SKILL_HEAVY_WEAPONS diff --git a/code/modules/projectiles/guns/flamer.dm b/code/modules/projectiles/guns/flamer.dm index 12ea0cbcb054b..0ba7999819730 100644 --- a/code/modules/projectiles/guns/flamer.dm +++ b/code/modules/projectiles/guns/flamer.dm @@ -8,6 +8,10 @@ flags_equip_slot = ITEM_SLOT_BACK w_class = WEIGHT_CLASS_BULKY force = 15 + item_icons = list( + slot_l_hand_str = 'icons/mob/inhands/guns/special_left_1.dmi', + slot_r_hand_str = 'icons/mob/inhands/guns/special_right_1.dmi', + ) fire_sound = "gun_flamethrower" dry_fire_sound = 'sound/weapons/guns/fire/flamethrower_empty.ogg' unload_sound = 'sound/weapons/guns/interact/flamethrower_unload.ogg' @@ -286,21 +290,22 @@ /obj/item/weapon/gun/flamer/big_flamer name = "\improper FL-240 incinerator unit" desc = "The FL-240 has proven to be one of the most effective weapons at clearing out soft-targets. This is a weapon to be feared and respected as it is quite deadly." + icon = 'icons/obj/items/guns/special.dmi' icon_state = "m240" item_state = "m240" /obj/item/weapon/gun/flamer/som name = "\improper V-62 incinerator" desc = "The V-62 is a deadly weapon employed in close quarter combat, favoured as much for the terror it inspires as the actual damage it inflicts. It has good range for a flamer, but lacks the integrated extinguisher of its TGMC equivalent." - icon = 'icons/Marine/gun64.dmi' + icon = 'icons/obj/items/guns/special64.dmi' icon_state = "v62" item_state = "v62" flags_gun_features = GUN_AMMO_COUNTER|GUN_WIELDED_FIRING_ONLY|GUN_WIELDED_STABLE_FIRING_ONLY|GUN_SHOWS_LOADED inhand_x_dimension = 64 inhand_y_dimension = 32 item_icons = list( - slot_l_hand_str = 'icons/mob/items_lefthand_64.dmi', - slot_r_hand_str = 'icons/mob/items_righthand_64.dmi', + slot_l_hand_str = 'icons/mob/inhands/guns/special_left_64.dmi', + slot_r_hand_str = 'icons/mob/inhands/guns/special_right_64.dmi', ) lit_overlay_icon_state = "v62_lit" lit_overlay_offset_x = 0 diff --git a/code/modules/projectiles/guns/grenade_launchers.dm b/code/modules/projectiles/guns/grenade_launchers.dm index 2b4c0c1c65763..32d25cf947ec3 100644 --- a/code/modules/projectiles/guns/grenade_launchers.dm +++ b/code/modules/projectiles/guns/grenade_launchers.dm @@ -15,6 +15,11 @@ The Grenade Launchers force = 5 caliber = CALIBER_40MM //codex load_method = SINGLE_CASING //codex + icon = 'icons/obj/items/guns/special.dmi' + item_icons = list( + slot_l_hand_str = 'icons/mob/inhands/guns/special_left_1.dmi', + slot_r_hand_str = 'icons/mob/inhands/guns/special_right_1.dmi', + ) fire_sound = 'sound/weapons/guns/fire/grenadelauncher.ogg' fire_rattle = 'sound/weapons/guns/fire/grenadelauncher.ogg' cocked_sound = 'sound/weapons/guns/interact/m92_cocked.ogg' @@ -50,11 +55,12 @@ The Grenade Launchers /obj/item/explosive/grenade/chem_grenade, /obj/item/explosive/grenade/chem_grenade/large, /obj/item/explosive/grenade/chem_grenade/metalfoam, - /obj/item/explosive/grenade/chem_grenade/razorburn_smol, + /obj/item/explosive/grenade/chem_grenade/razorburn_small, /obj/item/explosive/grenade/chem_grenade/razorburn_large, /obj/item/explosive/grenade/chem_grenade/incendiary, /obj/item/explosive/grenade/chem_grenade/teargas, /obj/item/explosive/grenade/flashbang/stun, + /obj/item/explosive/grenade/bullet/laser, ) reciever_flags = NONE @@ -109,7 +115,7 @@ The Grenade Launchers /obj/item/weapon/gun/grenade_launcher/multinade_launcher name = "\improper GL-70 grenade launcher" desc = "The GL-70 is the standard grenade launcher used by the TerraGov Marine Corps for area denial and big explosions." - icon = 'icons/Marine/gun64.dmi' + icon = 'icons/obj/items/guns/special64.dmi' icon_state = "t70" item_state = "t70" fire_animation = "t70_fire" diff --git a/code/modules/projectiles/guns/mounted.dm b/code/modules/projectiles/guns/mounted.dm index 15ebaddd77422..79f9376b41d80 100644 --- a/code/modules/projectiles/guns/mounted.dm +++ b/code/modules/projectiles/guns/mounted.dm @@ -25,6 +25,10 @@ flags_equip_slot = ITEM_SLOT_BACK icon = 'icons/Marine/marine-hmg.dmi' icon_state = "turret" + item_icons = list( + slot_l_hand_str = 'icons/mob/inhands/guns/misc_left_1.dmi', + slot_r_hand_str = 'icons/mob/inhands/guns/misc_right_1.dmi', + ) fire_sound = 'sound/weapons/guns/fire/hmg2.ogg' reload_sound = 'sound/weapons/guns/interact/minigun_cocked.ogg' @@ -158,6 +162,10 @@ flags_equip_slot = ITEM_SLOT_BACK icon = 'icons/Marine/marine-ac.dmi' icon_state = "autocannon" + item_icons = list( + slot_l_hand_str = 'icons/mob/inhands/guns/misc_left_1.dmi', + slot_r_hand_str = 'icons/mob/inhands/guns/misc_right_1.dmi', + ) fire_sound = "ac_fire" reload_sound = 'sound/weapons/guns/interact/minigun_cocked.ogg' @@ -355,6 +363,10 @@ flags_equip_slot = ITEM_SLOT_BACK icon = 'icons/Marine/marine-hmg.dmi' icon_state = "mg08" + item_icons = list( + slot_l_hand_str = 'icons/mob/inhands/guns/misc_left_1.dmi', + slot_r_hand_str = 'icons/mob/inhands/guns/misc_right_1.dmi', + ) fire_sound = 'sound/weapons/guns/fire/mg08.ogg' reload_sound = 'sound/weapons/guns/interact/minigun_cocked.ogg' @@ -402,6 +414,10 @@ icon = 'icons/Marine/marine-mmg.dmi' icon_state = "t27" item_state = "t27" + item_icons = list( + slot_l_hand_str = 'icons/mob/inhands/guns/machineguns_left_1.dmi', + slot_r_hand_str = 'icons/mob/inhands/guns/machineguns_right_1.dmi', + ) caliber = CALIBER_10x27_CASELESS // codex max_shells = 150 //codex force = 40 @@ -466,8 +482,8 @@ icon_state = "ptrs" item_state = "ptrs" item_icons = list( - slot_l_hand_str = 'icons/mob/items_lefthand_64.dmi', - slot_r_hand_str = 'icons/mob/items_righthand_64.dmi', + slot_l_hand_str = 'icons/mob/inhands/guns/special_left_64.dmi', + slot_r_hand_str = 'icons/mob/inhands/guns/special_right_64.dmi', ) inhand_x_dimension = 64 inhand_y_dimension = 32 @@ -672,6 +688,10 @@ desc = "The KRD-61ES machinegun is the export variant of the ML-91 HMG. It's too heavy to be wielded or operated without the tripod. No extra work required, just deploy it with Ctrl-Click. Can be repaired with a blowtorch once deployed." icon = 'icons/Marine/marine-mmg.dmi' icon_state = "kord" + item_icons = list( + slot_l_hand_str = 'icons/mob/inhands/guns/misc_left_1.dmi', + slot_r_hand_str = 'icons/mob/inhands/guns/misc_right_1.dmi', + ) fire_sound = 'sound/weapons/guns/fire/hmg2.ogg' reload_sound = 'sound/weapons/guns/interact/minigun_cocked.ogg' diff --git a/code/modules/projectiles/guns/pistols.dm b/code/modules/projectiles/guns/pistols.dm index 82c6fe095feb7..bcca46ed53d3e 100644 --- a/code/modules/projectiles/guns/pistols.dm +++ b/code/modules/projectiles/guns/pistols.dm @@ -2,7 +2,12 @@ //-------------------------------------------------- /obj/item/weapon/gun/pistol + icon = 'icons/obj/items/guns/pistols.dmi' icon_state = "" //Defaults to revolver pistol when there's no sprite. + item_icons = list( + slot_l_hand_str = 'icons/mob/inhands/guns/pistols_left_1.dmi', + slot_r_hand_str = 'icons/mob/inhands/guns/pistols_right_1.dmi', + ) fire_sound = 'sound/weapons/guns/fire/pistol.ogg' unload_sound = 'sound/weapons/guns/interact/pistol_unload.ogg' reload_sound = 'sound/weapons/guns/interact/pistol_reload.ogg' @@ -74,8 +79,13 @@ desc = "An experimental weapon designed to set the terrain and targets on fire. It hums with power as magnetic fields coil round each other." icon_state = "tx7" item_state = "tx7" + item_icons = list( + slot_l_hand_str = 'icons/mob/inhands/guns/energy_left_1.dmi', + slot_r_hand_str = 'icons/mob/inhands/guns/energy_right_1.dmi', + ) caliber = CALIBER_PLASMA max_shots = 10 + icon = 'icons/obj/items/guns/energy.dmi' reload_sound = 'sound/weapons/guns/interact/tp14_reload.ogg' fire_sound = 'sound/weapons/guns/fire/laser3.ogg' default_ammo_type = /obj/item/ammo_magazine/pistol/plasma_pistol @@ -656,7 +666,7 @@ It is a modified Beretta 93R, and can fire three round burst or single fire. Whe desc = "The PL-5 is a true and tested ICCAF handgun, used for a very long time with minimal changes to the core design, best used at close quarters with its higher than usual magazine size for its caliber. It is chambered in .45 ACP." icon_state = "pl5" item_state = "pl5" - icon = 'icons/Marine/gun64.dmi' + icon = 'icons/obj/items/guns/pistols64.dmi' caliber = CALIBER_45ACP //codex max_shells = 18 //codex fire_sound = 'sound/weapons/guns/fire/colt.ogg' @@ -745,7 +755,7 @@ It is a modified Beretta 93R, and can fire three round burst or single fire. Whe /obj/item/weapon/gun/pistol/smart_pistol name = "\improper SP-13 smart pistol" desc = "The SP-13 is a IFF-capable sidearm used by the TerraGov Marine Corps. A cutting-edge miniaturization technology allows mounting of a KTLD IFF system on the pistol, albeit at high manufactoring cost and the usual specialized training required to use such a pistol. Unique design feature high-capacity mag on top of the barrel, with integrated sight." - icon = 'icons/Marine/gun64.dmi' + icon = 'icons/obj/items/guns/pistols64.dmi' icon_state = "sp13" item_state = "sp13" caliber = CALIBER_9X19 //codex diff --git a/code/modules/projectiles/guns/plasma.dm b/code/modules/projectiles/guns/plasma.dm index b807c4be14c82..adaae967bc6b3 100644 --- a/code/modules/projectiles/guns/plasma.dm +++ b/code/modules/projectiles/guns/plasma.dm @@ -1,6 +1,10 @@ /obj/item/weapon/gun/energy/lasgun/lasrifle/plasma name = "generic plasma weapon" - icon = 'icons/Marine/marine-plasmaguns.dmi' + icon = 'icons/obj/items/guns/plasma64.dmi' + item_icons = list( + slot_l_hand_str = 'icons/mob/inhands/guns/plasma_left_1.dmi', + slot_r_hand_str = 'icons/mob/inhands/guns/plasma_right_1.dmi', + ) default_ammo_type = /obj/item/cell/lasgun/plasma_powerpack allowed_ammo_types = list(/obj/item/cell/lasgun/plasma_powerpack) heat_per_fire = 5 diff --git a/code/modules/projectiles/guns/revolvers.dm b/code/modules/projectiles/guns/revolvers.dm index c1ea688f0f295..9a5d50112bbc1 100644 --- a/code/modules/projectiles/guns/revolvers.dm +++ b/code/modules/projectiles/guns/revolvers.dm @@ -4,10 +4,15 @@ /obj/item/weapon/gun/revolver flags_equip_slot = ITEM_SLOT_BELT w_class = WEIGHT_CLASS_NORMAL + item_icons = list( + slot_l_hand_str = 'icons/mob/inhands/guns/pistols_left_1.dmi', + slot_r_hand_str = 'icons/mob/inhands/guns/pistols_right_1.dmi', + ) fire_sound = 'sound/weapons/guns/fire/44mag.ogg' reload_sound = 'sound/weapons/guns/interact/revolver_spun.ogg' cocked_sound = 'sound/weapons/guns/interact/revolver_cocked.ogg' unload_sound = 'sound/weapons/guns/interact/revolver_unload.ogg' + icon = 'icons/obj/items/guns/pistols.dmi' muzzleflash_iconstate = "muzzle_flash_medium" hand_reload_sound = 'sound/weapons/guns/interact/revolver_load.ogg' type_of_casings = "bullet" @@ -275,7 +280,7 @@ /obj/item/weapon/gun/revolver/standard_magnum name = "\improper R-76 KC magnum" desc = "The R-76 magnum is an absolute beast of a handgun used by the TGMC, rumors say it was created as a money laundering scheme by some general due to the sheer inpracticality of this firearm. Hits hard, recommended to be used with its stock attachment. Chambered in 12.7mm." - icon = 'icons/Marine/gun64.dmi' + icon = 'icons/obj/items/guns/pistols64.dmi' icon_state = "t76" item_state = "t76" fire_animation = "t76_fire" diff --git a/code/modules/projectiles/guns/rifles.dm b/code/modules/projectiles/guns/rifles.dm index ebcdcd220777f..2b5845ed165db 100644 --- a/code/modules/projectiles/guns/rifles.dm +++ b/code/modules/projectiles/guns/rifles.dm @@ -1,6 +1,7 @@ //------------------------------------------------------- /obj/item/weapon/gun/rifle + icon = 'icons/obj/items/guns/rifles.dmi' reload_sound = 'sound/weapons/guns/interact/rifle_reload.ogg' cocked_sound = 'sound/weapons/guns/interact/cocked.ogg' flags_equip_slot = ITEM_SLOT_BACK @@ -194,12 +195,12 @@ /obj/item/weapon/gun/rifle/standard_dmr name = "\improper DMR-37 SCA designated marksman rifle" desc = "The San Cristo Arms DMR-37 is the TerraGov Marine Corps designated marksman rifle. It is rather well-known for it's very consistent target placement at longer than usual range, it however lacks a burst fire mode or an automatic mode. It is mostly used by people who prefer to do more careful shooting than most. Uses 10x27mm caseless caliber." - icon = 'icons/Marine/gun64.dmi' + icon = 'icons/obj/items/guns/marksman64.dmi' icon_state = "t37" item_state = "t37" item_icons = list( - slot_l_hand_str = 'icons/mob/items_lefthand_64.dmi', - slot_r_hand_str = 'icons/mob/items_righthand_64.dmi', + slot_l_hand_str = 'icons/mob/inhands/guns/marksman_left_64.dmi', + slot_r_hand_str = 'icons/mob/inhands/guns/marksman_right_64.dmi', ) inhand_x_dimension = 64 inhand_y_dimension = 32 @@ -276,10 +277,10 @@ desc = "The San Cristo Arms BR-64 is the TerraGov Marine Corps main battle rifle. It is known for its consistent ability to perform well at most ranges, and medium range stopping power with bursts. It is mostly used by people who prefer a bigger round than the average. Uses 10x26.5smm caseless caliber." icon_state = "t64" item_state = "t64" - icon = 'icons/Marine/gun64.dmi' + icon = 'icons/obj/items/guns/marksman64.dmi' item_icons = list( - slot_l_hand_str = 'icons/mob/items_lefthand_64.dmi', - slot_r_hand_str = 'icons/mob/items_righthand_64.dmi', + slot_l_hand_str = 'icons/mob/inhands/guns/marksman_left_64.dmi', + slot_r_hand_str = 'icons/mob/inhands/guns/marksman_right_64.dmi', ) inhand_x_dimension = 64 inhand_y_dimension = 32 @@ -350,7 +351,7 @@ /obj/item/weapon/gun/rifle/m412 name = "\improper PR-412 pulse rifle" desc = "The PR-412 rifle is a Pulse Industries rifle, billed as a pulse rifle due to its use of electronic firing for faster velocity. A rather common sight in most systems. Uses 10x24mm caseless ammunition." - icon = 'icons/Marine/gun64.dmi' + icon = 'icons/obj/items/guns/rifles64.dmi' icon_state = "m412" item_state = "m412" muzzleflash_iconstate = "muzzle_flash_medium" @@ -466,9 +467,13 @@ /obj/item/weapon/gun/rifle/m41a name = "\improper PR-11 pulse rifle" desc = "A strange failed electronically fired rifle, a rather unknown weapon of its time. It caused a surge in the use of electronic firing in the modern era though. Uses 10x24mm caseless ammunition. Has a irremoveable grenade launcher." - icon = 'icons/Marine/gun64.dmi' + icon = 'icons/obj/items/guns/machineguns64.dmi' icon_state = "m41a" item_state = "m41a" + item_icons = list( + slot_l_hand_str = 'icons/mob/inhands/guns/machineguns_left_1.dmi', + slot_r_hand_str = 'icons/mob/inhands/guns/machineguns_right_1.dmi', + ) fire_sound = "gun_pulse" dry_fire_sound = 'sound/weapons/guns/fire/m41a_empty.ogg' unload_sound = 'sound/weapons/guns/interact/m41a_unload.ogg' @@ -527,7 +532,7 @@ /obj/item/weapon/gun/rifle/mpi_km name = "\improper MPi-KM assault rifle" desc = "A cheap and robust rifle, sometimes better known as an 'AK'. Chambers 7.62x39mm. Despite lacking attachment points beyond its underbarrel, remains a popular product on the black market with its cheap cost and higher than usual caliber rounds." - icon = 'icons/Marine/gun64.dmi' + icon = 'icons/obj/items/guns/rifles64.dmi' icon_state = "ak47" item_state = "ak47" caliber = CALIBER_762X39 //codex @@ -642,9 +647,13 @@ /obj/item/weapon/gun/rifle/lmg_d name = "\improper lMG-D light machinegun" desc = "A cheap and robust machinegun, sometimes better known as an 'RPD'. Chambers 7.62x39mm. Despite lacking attachment points beyond its underbarrel, remains a popular product on the black market with its cheap cost, high capacity and higher than usual caliber rounds." - icon = 'icons/Marine/gun64.dmi' + icon = 'icons/obj/items/guns/machineguns64.dmi' icon_state = "rpd" item_state = "rpd" + item_icons = list( + slot_l_hand_str = 'icons/mob/inhands/guns/machineguns_left_1.dmi', + slot_r_hand_str = 'icons/mob/inhands/guns/machineguns_right_1.dmi', + ) fire_animation = "rpd_fire" caliber = CALIBER_762X39 //codex muzzleflash_iconstate = "muzzle_flash_medium" @@ -704,9 +713,13 @@ /obj/item/weapon/gun/rifle/dpm name = "\improper Degtyaryov 'RP' machine gun" desc = "A cheap and robust machine gun seen commonly in the fringes of the bubble. Fires high caliber rounds to accommodate for its sluggish rate of fire, it is generally found being called 'The Record Player' due to the resemblance. Fires 7.62x39mm AP rounds." - icon = 'icons/Marine/gun64.dmi' + icon = 'icons/obj/items/guns/machineguns64.dmi' icon_state = "dp27" item_state = "dp27" + item_icons = list( + slot_l_hand_str = 'icons/mob/inhands/guns/machineguns_left_1.dmi', + slot_r_hand_str = 'icons/mob/inhands/guns/machineguns_right_1.dmi', + ) max_shells = 47 //codex caliber = CALIBER_762X39 //codex fire_sound = "svd_fire" @@ -746,7 +759,7 @@ /obj/item/weapon/gun/rifle/m16 name = "\improper FN M16A4 assault rifle" desc = "A light, versatile assault rifle with a 30 round magazine, chambered to fire the 5.56x45mm NATO cartridge. The 4th generation in the M16 platform, this FN variant has added automatic fire selection and retains relevance among mercenaries and militias thanks to its high customizability. It is incredibly good at rapid burst fire, but must be paced correctly." - icon = 'icons/Marine/gun64.dmi' + icon = 'icons/obj/items/guns/rifles64.dmi' icon_state = "m16a4" item_state = "m16a4" muzzleflash_iconstate = "muzzle_flash_medium" @@ -817,7 +830,7 @@ /obj/item/weapon/gun/rifle/famas name = "\improper FAMAS assault rifle" desc = "A light, versatile fast firing assault rifle with a 24 round magazine and short range scope, chambered to fire the 5.56x45mm NATO cartridge within a short amount of time." - icon = 'icons/Marine/gun64.dmi' + icon = 'icons/obj/items/guns/rifles64.dmi' icon_state = "famas" item_state = "famas" muzzleflash_iconstate = "muzzle_flash_medium" @@ -878,8 +891,8 @@ icon_state = "t42" item_state = "t42" item_icons = list( - slot_l_hand_str = 'icons/mob/items_lefthand_64.dmi', - slot_r_hand_str = 'icons/mob/items_righthand_64.dmi', + slot_l_hand_str = 'icons/mob/inhands/guns/machineguns_left_64.dmi', + slot_r_hand_str = 'icons/mob/inhands/guns/machineguns_right_64.dmi', ) inhand_x_dimension = 64 inhand_y_dimension = 32 @@ -954,13 +967,13 @@ /obj/item/weapon/gun/rifle/standard_gpmg name = "\improper MG-60 Raummetall general purpose machine gun" desc = "The Raummetall MG-60 general purpose machinegun is the TGMC's current standard GPMG. Though usually seen mounted on vehicles, it is sometimes used by infantry to hold chokepoints or suppress enemies, or in rare cases for marching fire. It uses 10x26mm boxes." - icon = 'icons/Marine/gun64.dmi' + icon = 'icons/obj/items/guns/machineguns64.dmi' icon_state = "t60" item_state = "t60" fire_animation = "t60_fire" item_icons = list( - slot_l_hand_str = 'icons/mob/items_lefthand_64.dmi', - slot_r_hand_str = 'icons/mob/items_righthand_64.dmi', + slot_l_hand_str = 'icons/mob/inhands/guns/machineguns_left_64.dmi', + slot_r_hand_str = 'icons/mob/inhands/guns/machineguns_right_64.dmi', ) inhand_x_dimension = 64 inhand_y_dimension = 32 @@ -1027,9 +1040,13 @@ /obj/item/weapon/gun/rifle/m412l1_hpr name = "\improper PR-412L1 heavy pulse rifle" desc = "A large weapon capable of laying down supressing fire, based on the PR-412 pulse rifle platform. Effective in burst fire. Uses 10x24mm caseless ammunition." - icon = 'icons/Marine/gun64.dmi' + icon = 'icons/obj/items/guns/machineguns64.dmi' icon_state = "m412l1" item_state = "m412l1" + item_icons = list( + slot_l_hand_str = 'icons/mob/inhands/guns/machineguns_left_1.dmi', + slot_r_hand_str = 'icons/mob/inhands/guns/machineguns_right_1.dmi', + ) caliber = CALIBER_10X24_CASELESS //codex max_shells = 200 //codex aim_slowdown = 0.8 @@ -1094,7 +1111,7 @@ /obj/item/weapon/gun/rifle/type71 name = "\improper Type 71 pulse rifle" desc = "The primary rifle of the USL pirates, the Type 71 is a reliable rifle chambered in 7.62x39mm, firing in three round bursts to conserve ammunition. A newer model for surpression roles to comply with overmatch doctrines is in progress and only issued to a limited number of privates in the USL." - icon = 'icons/Marine/gun64.dmi' + icon = 'icons/obj/items/guns/rifles64.dmi' icon_state = "type71" item_state = "type71" muzzleflash_iconstate = "muzzle_flash_medium" @@ -1207,6 +1224,11 @@ desc = "The Zauer SH-15 Automatic Assault Shotgun, this is a Terran Armories variant. Another iteration of the ZX series of firearms though it has been since regulated as part of the TGMC arsenal, hence the SH designation. It took over the various shotgun models as the semi-automatic shotgun provided to the TGMC. It is rifled, and loads primarily longer ranged munitions, being incompatible with buckshot shells. Takes 12-round 16 gauge magazines." icon_state = "tx15" item_state = "tx15" + icon = 'icons/obj/items/guns/shotguns.dmi' + item_icons = list( + slot_l_hand_str = 'icons/mob/inhands/guns/shotguns_left_1.dmi', + slot_r_hand_str = 'icons/mob/inhands/guns/shotguns_right_1.dmi', + ) fire_sound = 'sound/weapons/guns/fire/tgmc/kinetic/gun_sh15.ogg' dry_fire_sound = 'sound/weapons/guns/fire/shotgun_empty.ogg' caliber = CALIBER_16G //codex @@ -1268,6 +1290,11 @@ desc = "The Raummetall-KT SG-29 is the TGMC's current standard IFF-capable medium machine gun. It's known for its ability to lay down heavy fire support very well. It is generally used when someone wants to hold a position or provide fire support. Requires special training and it cannot turn off IFF. It uses 10x26mm ammunition." icon_state = "sg29" item_state = "sg29" + icon = 'icons/obj/items/guns/machineguns.dmi' + item_icons = list( + slot_l_hand_str = 'icons/mob/inhands/guns/machineguns_left_1.dmi', + slot_r_hand_str = 'icons/mob/inhands/guns/machineguns_right_1.dmi', + ) caliber = CALIBER_10x26_CASELESS //codex max_shells = 300 //codex force = 30 @@ -1324,9 +1351,13 @@ /obj/item/weapon/gun/rifle/standard_smarttargetrifle name = "\improper SG-62 Kauser-KT smart target rifle" desc = "The Kauser-KT SG-62 is a IFF-capable rifle used by the TerraGov Marine Corps, coupled with a spotting rifle that is also IFF capable of applying various bullets with specialized ordnance, this is a gun with many answers to many situations... if you have the right ammo loaded. Requires special training and it cannot turn off IFF. It uses high velocity 10x27mm for the rifle and 12x66mm ammunition for the underslung rifle." - icon = 'icons/Marine/gun64.dmi' + icon = 'icons/obj/items/guns/marksman64.dmi' icon_state = "sg62" item_state = "sg62" + item_icons = list( + slot_l_hand_str = 'icons/mob/inhands/guns/marksman_left_1.dmi', + slot_r_hand_str = 'icons/mob/inhands/guns/marksman_right_1.dmi', + ) caliber = CALIBER_10x27_CASELESS //codex max_shells = 40 //codex aim_slowdown = 0.85 @@ -1373,7 +1404,7 @@ name = "SG-153 spotting rifle" desc = "An underslung spotting rifle, generally found ontop of another gun." icon_state = "sg153" - icon = 'icons/Marine/gun64.dmi' + icon = 'icons/obj/items/guns/marksman64.dmi' fire_sound = 'sound/weapons/guns/fire/spottingrifle.ogg' caliber = CALIBER_12x7 slot = ATTACHMENT_SLOT_UNDER @@ -1407,6 +1438,10 @@ desc = "An unusual gun of alien origin. It is lacking a trigger or any obvious way to fire it." icon_state = "alien_rifle" item_state = "alien_rifle" + item_icons = list( + slot_l_hand_str = 'icons/mob/inhands/guns/energy_left_1.dmi', + slot_r_hand_str = 'icons/mob/inhands/guns/energy_right_1.dmi', + ) fire_sound = 'sound/weapons/guns/fire/alienplasma.ogg' fire_rattle = 'sound/weapons/guns/fire/alienplasma.ogg' dry_fire_sound = 'sound/weapons/guns/fire/vp70_empty.ogg' @@ -1454,12 +1489,12 @@ /obj/item/weapon/gun/rifle/chambered name = "\improper SR-127 Bauer bolt action rifle" desc = "The Bauer SR-127 is the standard issue bolt action rifle used by the TGMC. Known for its long range accuracy and use by marksmen despite its age and lack of IFF, though careful aim allows fire support from behind. It has an irremoveable scope. Uses 8.6×70mm box magazines." - icon = 'icons/Marine/gun64.dmi' + icon = 'icons/obj/items/guns/marksman64.dmi' icon_state = "tl127" item_state = "tl127" item_icons = list( - slot_l_hand_str = 'icons/mob/items_lefthand_64.dmi', - slot_r_hand_str = 'icons/mob/items_righthand_64.dmi', + slot_l_hand_str = 'icons/mob/inhands/guns/marksman_left_64.dmi', + slot_r_hand_str = 'icons/mob/inhands/guns/marksman_right_64.dmi', ) inhand_x_dimension = 64 @@ -1637,12 +1672,12 @@ /obj/item/weapon/gun/rifle/standard_skirmishrifle name = "\improper AR-21 Kauser skirmish rifle" desc = "The Kauser AR-21 is a versatile rifle is developed to bridge a gap between higher caliber weaponry and a normal rifle. It fires a strong 10x25mm round, which has decent stopping power. It however suffers in magazine size and movement capablity compared to smaller peers." - icon = 'icons/Marine/gun64.dmi' + icon = 'icons/obj/items/guns/rifles64.dmi' icon_state = "t21" item_state = "t21" item_icons = list( - slot_l_hand_str = 'icons/mob/items_lefthand_64.dmi', - slot_r_hand_str = 'icons/mob/items_righthand_64.dmi', + slot_l_hand_str = 'icons/mob/inhands/guns/rifles_left_64.dmi', + slot_r_hand_str = 'icons/mob/inhands/guns/rifles_right_64.dmi', ) inhand_x_dimension = 64 @@ -1713,8 +1748,13 @@ /obj/item/weapon/gun/rifle/alf_machinecarbine name = "\improper ALF-51B Kauser machinecarbine" desc = "The Kauser ALF-51B is an unoffical modification of a ALF-51, or better known as the AR-18 carbine, modified to SMG length of barrel, rechambered for a stronger round, and belt based. Truly the peak of CQC. Useless past that. Aiming is impossible. Uses 10x25mm caseless ammunition." + icon = 'icons/obj/items/guns/machineguns.dmi' icon_state = "alf51b" item_state = "alf51b" + item_icons = list( + slot_l_hand_str = 'icons/mob/inhands/guns/machineguns_left_1.dmi', + slot_r_hand_str = 'icons/mob/inhands/guns/machineguns_right_1.dmi', + ) fire_animation = "alf51b_fire" fire_sound = 'sound/weapons/guns/fire/t18b.ogg' dry_fire_sound = 'sound/weapons/guns/fire/m41a_empty.ogg' @@ -1771,7 +1811,7 @@ /obj/item/weapon/gun/rifle/mkh name = "\improper MKH-98 storm rifle" desc = "A certified classic, this reproduction design was hailed as the first successful assault rifle concept, generally termed a 'storm rifle'. Has a higher than usual firerate for its class, but suffers in capacity. This version of it chambers 7.62x39mm." - icon = 'icons/Marine/gun64.dmi' + icon = 'icons/obj/items/guns/rifles64.dmi' icon_state = "mkh98" item_state = "mkh98" caliber = CALIBER_762X39 //codex @@ -1813,9 +1853,13 @@ /obj/item/weapon/gun/rifle/tx54 name = "\improper GL-54 grenade launcher" desc = "A magazine fed, semi-automatic grenade launcher designed to shoot airbursting smart grenades. Requires a T49 scope for precision aiming." - icon = 'icons/Marine/gun64.dmi' + icon = 'icons/obj/items/guns/special64.dmi' icon_state = "tx54" item_state = "tx54" ///todo + item_icons = list( + slot_l_hand_str = 'icons/mob/inhands/guns/special_left_1.dmi', + slot_r_hand_str = 'icons/mob/inhands/guns/special_right_1.dmi', + ) max_shells = 5 //codex max_chamber_items = 1 fire_delay = 1.2 SECONDS @@ -1967,16 +2011,15 @@ /obj/item/weapon/gun/rifle/garand name = "\improper CAU C1 Garand self loading rifle" desc = "The Carlford-1 is a remastered classic made by Carlford Armories, made to fit in the modern day. Most of the noticeable differences are minor rail modifications. Other than that, it is a faithful recreation with the trademark ping sound and all. Uses .30-06 enbloc clips." - icon = 'icons/Marine/gun64.dmi' + icon = 'icons/obj/items/guns/marksman64.dmi' icon_state = "garand" item_state = "garand" - item_icons = list( - slot_l_hand_str = 'icons/mob/items_lefthand_64.dmi', - slot_r_hand_str = 'icons/mob/items_righthand_64.dmi', - ) - inhand_x_dimension = 64 inhand_y_dimension = 32 + item_icons = list( + slot_l_hand_str = 'icons/mob/inhands/guns/marksman_left_64.dmi', + slot_r_hand_str = 'icons/mob/inhands/guns/marksman_right_64.dmi', + ) fire_sound = 'sound/weapons/guns/fire/garand.ogg' dry_fire_sound = 'sound/weapons/guns/fire/sniper_empty.ogg' unload_sound = 'sound/weapons/guns/interact/garand_ping.ogg' @@ -2032,7 +2075,7 @@ name = "\improper V-31 assault rifle" desc = "The V-31 was the primary rifle of the Sons of Mars until the introduction of more advanced energy weapons. Nevertheless, the V-31 continues to see common use due to its comparative ease of production and maintenance, and due to the inbuilt low velocity railgun designed for so called 'micro' grenades. Has good handling due to its compact bullpup design, and is generally effective at all ranges. Uses 10x25mm caseless ammunition." icon_state = "v31" - icon = 'icons/Marine/gun64.dmi' + icon = 'icons/obj/items/guns/rifles64.dmi' item_state = "v31" fire_sound = 'sound/weapons/guns/fire/som_rifle.ogg' dry_fire_sound = 'sound/weapons/guns/fire/m41a_empty.ogg' @@ -2129,7 +2172,7 @@ /obj/item/weapon/gun/rifle/som_carbine name = "\improper V-34 carbine" desc = "An old but robust weapon that saw extensive use in the Martian uprising. A comparatively light and compact weapon, it still packs a considerable punch thanks to a good rate of fire and high calibre, although at range its effective drops off considerably. It is chambered in 7.62x39mm." - icon = 'icons/Marine/gun64.dmi' + icon = 'icons/obj/items/guns/rifles64.dmi' icon_state = "v34" item_state = "v34" caliber = CALIBER_762X39 @@ -2201,13 +2244,13 @@ /obj/item/weapon/gun/rifle/som_mg name = "\improper V-41 machine gun" desc = "The V-41 is a large man portable machine used by the SOM, allowing for sustained, accurate suppressive firepower at the cost of mobility and handling. Commonly seen where their preferred tactics of fast, mobile aggression is ill suited. Takes 10x26mm Caseless." - icon = 'icons/Marine/gun64.dmi' + icon = 'icons/obj/items/guns/machineguns64.dmi' icon_state = "v41" item_state = "v41" fire_animation = "v41_fire" item_icons = list( - slot_l_hand_str = 'icons/mob/items_lefthand_64.dmi', - slot_r_hand_str = 'icons/mob/items_righthand_64.dmi', + slot_l_hand_str = 'icons/mob/inhands/guns/machineguns_left_64.dmi', + slot_r_hand_str = 'icons/mob/inhands/guns/machineguns_right_64.dmi', ) inhand_x_dimension = 64 @@ -2269,12 +2312,12 @@ /obj/item/weapon/gun/rifle/icc_sharpshooter name = "\improper L-11 sharpshooter rifle" desc = "The L-11 is a venerable and battle-tested rifle used by the ICCAF. Although rather heavy, long and unwieldy compared to most ICCAF rifles, which focus on getting up close and personal, it easily makes up with excellent long-range potential when compared to most of its peers, mostly seen in use by reserve troops who expect to fight at distance, rather than up close. Uses 10x27mm magazines." - icon = 'icons/Marine/gun64.dmi' + icon = 'icons/obj/items/guns/marksman64.dmi' icon_state = "l11" item_state = "l11" item_icons = list( - slot_l_hand_str = 'icons/mob/items_lefthand_64.dmi', - slot_r_hand_str = 'icons/mob/items_righthand_64.dmi', + slot_l_hand_str = 'icons/mob/inhands/guns/marksman_left_64.dmi', + slot_r_hand_str = 'icons/mob/inhands/guns/marksman_right_64.dmi', ) inhand_x_dimension = 64 inhand_y_dimension = 32 @@ -2342,12 +2385,12 @@ /obj/item/weapon/gun/rifle/icc_battlecarbine name = "\improper L-15 battlecarbine" desc = "The L-15 battlecarbine is the standard rifle of the ICCAF, boasting a high caliber round and a menacing profile, it presents an excellent CQC firearm. However it struggles at range due to high dropoff from the short barrel, units that use it say that you need to close the gap at any cost to see the true efficacy of this weapon. Uses 10x25mm caseless ammunition." - icon = 'icons/Marine/gun64.dmi' + icon = 'icons/obj/items/guns/rifles64.dmi' icon_state = "l15" item_state = "l15" item_icons = list( - slot_l_hand_str = 'icons/mob/items_lefthand_64.dmi', - slot_r_hand_str = 'icons/mob/items_righthand_64.dmi', + slot_l_hand_str = 'icons/mob/inhands/guns/rifles_left_64.dmi', + slot_r_hand_str = 'icons/mob/inhands/guns/rifles_right_64.dmi', ) inhand_x_dimension = 64 @@ -2414,12 +2457,12 @@ /obj/item/weapon/gun/rifle/icc_confrontationrifle name = "\improper ML-12 confrontation rifle" desc = "The ML-12 confrontation rifle is an absolute beast of a weapon used by the ICCAF. Featuring a high caliber round in a short package, it will absolutely shred enemy targets at close quarters, a operator must mind the incredible recoil while making followup shots, however. Uses 10x28mm caseless ammunition." - icon = 'icons/Marine/gun64.dmi' + icon = 'icons/obj/items/guns/marksman64.dmi' icon_state = "ml12" item_state = "ml12" item_icons = list( - slot_l_hand_str = 'icons/mob/items_lefthand_64.dmi', - slot_r_hand_str = 'icons/mob/items_righthand_64.dmi', + slot_l_hand_str = 'icons/mob/inhands/guns/marksman_left_64.dmi', + slot_r_hand_str = 'icons/mob/inhands/guns/marksman_right_64.dmi', ) inhand_x_dimension = 64 @@ -2481,9 +2524,13 @@ /obj/item/weapon/gun/rifle/icc_autoshotgun name = "\improper ML-41 autoshotgun" desc = "The ML-41 Automatic Shotgun is used by the ICCAF in fast paced boarding assaults, fielding a wide variety of ammo for all situations. Takes 16-round 12 gauge drums." - icon = 'icons/Marine/gun64.dmi' + icon = 'icons/obj/items/guns/shotguns64.dmi' icon_state = "ml41" item_state = "ml41" + item_icons = list( + slot_l_hand_str = 'icons/mob/inhands/guns/shotguns_left_1.dmi', + slot_r_hand_str = 'icons/mob/inhands/guns/shotguns_right_1.dmi', + ) fire_sound = 'sound/weapons/guns/fire/shotgun.ogg' dry_fire_sound = 'sound/weapons/guns/fire/shotgun_empty.ogg' caliber = CALIBER_12G //codex @@ -2534,7 +2581,7 @@ /obj/item/weapon/gun/rifle/icc_assaultcarbine name = "\improper L-88 assault carbine" desc = "An aged, reliable but outdated bullpup rifle used by ICCAF reserve personnel it is best used in close quarters when you need to quickly clear corners at rapid pace, has an integral foregrip and unmagnified scope to increase accuracy and reduce drag. Chambered in 5.56x45mm NATO." - icon = 'icons/Marine/gun64.dmi' + icon = 'icons/obj/items/guns/rifles64.dmi' icon_state = "l88" item_state = "l88" muzzleflash_iconstate = "muzzle_flash_medium" @@ -2586,12 +2633,12 @@ /obj/item/weapon/gun/rifle/icc_mg name = "\improper ML-41 assault machine gun" desc = "The ML-41 is an incredibly lightweight machinegun used by ICCAF forces, being incredibly light for its class allows it to be used in rapid manuevers, at the cost of damage at range and generally high scatter. It uses 10x26mm boxes." - icon = 'icons/Marine/gun64.dmi' + icon = 'icons/obj/items/guns/machineguns64.dmi' icon_state = "minimi" item_state = "minimi" item_icons = list( - slot_l_hand_str = 'icons/mob/items_lefthand_64.dmi', - slot_r_hand_str = 'icons/mob/items_righthand_64.dmi', + slot_l_hand_str = 'icons/mob/inhands/guns/machineguns_left_64.dmi', + slot_r_hand_str = 'icons/mob/inhands/guns/machineguns_right_64.dmi', ) inhand_x_dimension = 64 inhand_y_dimension = 32 diff --git a/code/modules/projectiles/guns/sentries.dm b/code/modules/projectiles/guns/sentries.dm index 6e89e632bffb8..772cc15a38a9e 100644 --- a/code/modules/projectiles/guns/sentries.dm +++ b/code/modules/projectiles/guns/sentries.dm @@ -101,6 +101,10 @@ desc = "The Centurion Omnidirectional Point-defense Energy sentry is a man portable, automated weapon system utilised by the SOM. It is activated in hand then thrown into place before it deploys, where it's ground hugging profile makes it a difficult target to accurately hit. Equipped with a compact volkite weapon system, and a recharging battery to allow for prolonged use, but can take normal volkite cells in a pinch." icon_state = "cope" icon = 'icons/Marine/sentry.dmi' + item_icons = list( + slot_l_hand_str = 'icons/mob/inhands/guns/misc_left_1.dmi', + slot_r_hand_str = 'icons/mob/inhands/guns/misc_right_1.dmi', + ) max_integrity = 225 integrity_failure = 50 deploy_time = 1 SECONDS diff --git a/code/modules/projectiles/guns/shotguns.dm b/code/modules/projectiles/guns/shotguns.dm index a2601c43b4771..fd9e5a501e3c3 100644 --- a/code/modules/projectiles/guns/shotguns.dm +++ b/code/modules/projectiles/guns/shotguns.dm @@ -4,6 +4,11 @@ caliber = CALIBER_12G //codex max_chamber_items = 8 //codex load_method = SINGLE_CASING //codex + icon = 'icons/obj/items/guns/shotguns.dmi' + item_icons = list( + slot_l_hand_str = 'icons/mob/inhands/guns/shotguns_left_1.dmi', + slot_r_hand_str = 'icons/mob/inhands/guns/shotguns_right_1.dmi', + ) fire_sound = 'sound/weapons/guns/fire/shotgun.ogg' dry_fire_sound = 'sound/weapons/guns/fire/shotgun_empty.ogg' reload_sound = 'sound/weapons/guns/interact/shotgun_shell_insert.ogg' @@ -75,7 +80,7 @@ desc = "The Terran Armories SH-39 combat shotgun is a semi automatic shotgun used by breachers and pointmen within the TGMC squads. Uses 12 gauge shells." force = 20 //Has a stock already flags_equip_slot = ITEM_SLOT_BACK - icon = 'icons/Marine/gun64.dmi' + icon = 'icons/obj/items/guns/shotguns64.dmi' icon_state = "t39" item_state = "t39" fire_sound = 'sound/weapons/guns/fire/tgmc/kinetic/gun_sh39.ogg' @@ -285,7 +290,7 @@ /obj/item/weapon/gun/shotgun/pump/cmb name = "\improper SH-12 Paladin pump shotgun" desc = "A nine-round pump action shotgun. A shotgun used for hunting, home defence and police work, many versions of it exist and are used by just about anyone." - icon = 'icons/Marine/gun64.dmi' + icon = 'icons/obj/items/guns/shotguns64.dmi' icon_state = "pal12" item_state = "pal12" fire_sound = 'sound/weapons/guns/fire/shotgun_cmb.ogg' @@ -330,7 +335,7 @@ /obj/item/weapon/gun/shotgun/pump/trenchgun name = "\improper L-4034 trenchgun" desc = "A six-round pump action shotgun. A shotgun used for hunting, home defence and police work, many versions of it exist and are used by just about anyone." - icon = 'icons/Marine/gun64.dmi' + icon = 'icons/obj/items/guns/shotguns64.dmi' icon_state = "trenchgun" item_state = "trenchgun" fire_sound = 'sound/weapons/guns/fire/trenchgun.ogg' @@ -384,9 +389,13 @@ /obj/item/weapon/gun/shotgun/pump/bolt name = "\improper Mosin Nagant rifle" desc = "A mosin nagant rifle, even just looking at it you can feel the cosmoline already. Commonly known by its slang, \"Moist Nugget\", by downbrained colonists and outlaws." - icon = 'icons/Marine/gun64.dmi' + icon = 'icons/obj/items/guns/marksman64.dmi' icon_state = "mosin" item_state = "mosin" + item_icons = list( + slot_l_hand_str = 'icons/mob/inhands/guns/marksman_left_1.dmi', + slot_r_hand_str = 'icons/mob/inhands/guns/marksman_right_1.dmi', + ) fire_sound = 'sound/weapons/guns/fire/tgmc/kinetic/gun_mosin.ogg' fire_rattle = 'sound/weapons/guns/fire/tgmc/kinetic/gun_mosin_low.ogg' dry_fire_sound = 'sound/weapons/guns/fire/sniper_empty.ogg' @@ -451,9 +460,13 @@ name = "\improper Martini Henry lever action rifle" desc = "A lever action with room for a single round of .557/440 ball. Perfect for any kind of hunt, be it elephant or xeno with how quick to the draw it is." flags_equip_slot = ITEM_SLOT_BACK - icon = 'icons/Marine/gun64.dmi' + icon = 'icons/obj/items/guns/marksman64.dmi' icon_state = "martini" item_state = "martini" + item_icons = list( + slot_l_hand_str = 'icons/mob/inhands/guns/marksman_left_1.dmi', + slot_r_hand_str = 'icons/mob/inhands/guns/marksman_right_1.dmi', + ) shell_eject_animation = "martini_flick" caliber = CALIBER_557 //codex muzzle_flash_lum = 7 @@ -510,6 +523,7 @@ desc = "The R-2395 Derringer has been a classic for centuries. This latest iteration combines plasma propulsion powder with the classic design to make an assasination weapon that will leave little to chance." icon_state = "derringer" item_state = "tp17" + icon = 'icons/obj/items/guns/pistols.dmi' gun_skill_category = SKILL_PISTOLS w_class = WEIGHT_CLASS_TINY caliber = CALIBER_41RIM //codex @@ -546,7 +560,7 @@ /obj/item/weapon/gun/shotgun/pump/lever name = "lever action rifle" desc = "A .44 magnum lever action rifle with side loading port. It has a low fire rate, but it packs quite a punch in hunting." - icon = 'icons/obj/items/gun.dmi' + icon = 'icons/obj/items/guns/shotguns.dmi' icon_state = "mares_leg" item_state = "mares_leg" fire_sound = 'sound/weapons/guns/fire/leveraction.ogg'//I like how this one sounds. @@ -587,9 +601,13 @@ /obj/item/weapon/gun/shotgun/pump/lever/repeater name = "\improper Leicester Repeater" desc = "The gun that won the west or so they say. But space is a very different kind of frontier all together, chambered for .45-70 Governemnt." - icon = 'icons/Marine/gun64.dmi' + icon = 'icons/obj/items/guns/marksman64.dmi' icon_state = "leicrepeater" item_state = "leicrepeater" + item_icons = list( + slot_l_hand_str = 'icons/mob/inhands/guns/marksman_left_1.dmi', + slot_r_hand_str = 'icons/mob/inhands/guns/marksman_right_1.dmi', + ) fire_sound = 'sound/weapons/guns/fire/tgmc/kinetic/gun_repeater.ogg' dry_fire_sound = 'sound/weapons/guns/fire/sniper_empty.ogg' reload_sound = 'sound/weapons/guns/interact/mosin_reload.ogg' @@ -682,7 +700,7 @@ name = "\improper SH-35 pump shotgun" desc = "The Terran Armories SH-35 is the shotgun used by the TerraGov Marine Corps. It's used as a close quarters tool when someone wants something more suited for close range than most people, or as an odd sidearm on your back for emergencies. Uses 12 gauge shells.\nRequires a pump, which is the Unique Action key." flags_equip_slot = ITEM_SLOT_BACK - icon = 'icons/Marine/gun64.dmi' + icon = 'icons/obj/items/guns/shotguns64.dmi' icon_state = "t35" item_state = "t35" cock_animation = "t35_pump" @@ -745,7 +763,7 @@ /obj/item/weapon/gun/shotgun/zx76 name = "\improper ZX-76 assault shotgun" desc = "The ZX-76 Assault Shotgun, a incredibly rare, double barreled semi-automatic combat shotgun with a twin shot mode. Possibly the unrivaled master of CQC. Has a 9 round internal magazine." - icon = 'icons/Marine/gun64.dmi' + icon = 'icons/obj/items/guns/shotguns64.dmi' icon_state = "zx-76" item_state = "zx-76" flags_equip_slot = ITEM_SLOT_BACK @@ -793,7 +811,7 @@ desc = "The V-51 is the main shotgun utilised by the Sons of Mars. Slower firing than some other semi automatic shotguns, but packs more of a kick." flags_equip_slot = ITEM_SLOT_BACK icon_state = "v51" - icon = 'icons/Marine/gun64.dmi' + icon = 'icons/obj/items/guns/shotguns64.dmi' item_state = "v51" fire_sound = "shotgun_som" dry_fire_sound = 'sound/weapons/guns/fire/v51_empty.ogg' diff --git a/code/modules/projectiles/guns/smgs.dm b/code/modules/projectiles/guns/smgs.dm index f660bcae9d632..9c660fd2d9bb1 100644 --- a/code/modules/projectiles/guns/smgs.dm +++ b/code/modules/projectiles/guns/smgs.dm @@ -1,4 +1,9 @@ /obj/item/weapon/gun/smg + icon = 'icons/obj/items/guns/submachineguns.dmi' + item_icons = list( + slot_l_hand_str = 'icons/mob/inhands/guns/submachineguns_left_1.dmi', + slot_r_hand_str = 'icons/mob/inhands/guns/submachineguns_right_1.dmi', + ) fire_sound = 'sound/weapons/guns/fire/smg_light.ogg' unload_sound = 'sound/weapons/guns/interact/smg_unload.ogg' reload_sound = 'sound/weapons/guns/interact/smg_reload.ogg' @@ -156,10 +161,10 @@ /obj/item/weapon/gun/smg/standard_heavysmg name = "\improper SMG-45 heavy submachinegun" desc = "The SMG-45 is a heavier than usual subgun used by the TerraGov Marine Corps. Best known for carrying a punch within a small package. It's usually carried by troops who want a lightweight firearm to rush with while beating a mean punch, however it struggles at range. It uses 10x20mm caseless rounds." - icon = 'icons/Marine/gun64.dmi' + icon = 'icons/obj/items/guns/submachineguns64.dmi' icon_state = "t45" item_state = "t45" - caliber = CALIBER_10X20_CASELESS //codex + caliber = CALIBER_45ACP //codex max_shells = 40 //codex fire_sound = 'sound/weapons/guns/fire/skorpevo.ogg' unload_sound = 'sound/weapons/guns/interact/mp5_unload.ogg' @@ -169,7 +174,7 @@ default_ammo_type = /obj/item/ammo_magazine/smg/standard_heavysmg allowed_ammo_types = list( /obj/item/ammo_magazine/smg/standard_heavysmg, - /obj/item/ammo_magazine/smg/standard_heavysmg/hollowpoint, + /obj/item/ammo_magazine/smg/standard_heavysmg/squashhead, ) attachable_allowed = list( /obj/item/attachable/suppressor, @@ -214,7 +219,7 @@ /obj/item/weapon/gun/smg/m25 name = "\improper SMG-25 submachinegun" desc = "The RivArms SMG-25 submachinegun, an update to a classic design. A light firearm capable of effective one-handed use that is ideal for close to medium range engagements. Uses 10x20mm rounds in a high capacity magazine." - icon = 'icons/Marine/gun64.dmi' + icon = 'icons/obj/items/guns/submachineguns64.dmi' icon_state = "m25" item_state = "m25" caliber = CALIBER_10X20_CASELESS //codex @@ -348,7 +353,7 @@ /obj/item/weapon/gun/smg/skorpion name = "\improper CZ-81 submachinegun" desc = "A robust, 20th century firearm that's a combination of pistol and submachinegun. Fires .32ACP caliber rounds from a 20 round magazine." - icon = 'icons/Marine/gun64.dmi' + icon = 'icons/obj/items/guns/submachineguns64.dmi' icon_state = "skorpion" item_state = "skorpion" caliber = CALIBER_32ACP //codex @@ -389,7 +394,7 @@ /obj/item/weapon/gun/smg/ppsh name = "\improper PPSh-17b submachinegun" desc = "The PPSh-17b or \"Papasha\" is replica of a 20th century USSR model submachinegun that many terrorist organizations had copied all over the years. Despite its small-hitting firepower, its reliablity, extreme longevity and high firepower rate proves useful for the hands of the user." - icon = 'icons/Marine/gun64.dmi' + icon = 'icons/obj/items/guns/submachineguns64.dmi' icon_state = "ppsh" item_state = "ppsh" caliber = CALIBER_762X25 //codex @@ -483,7 +488,7 @@ name = "\improper V-21 submachinegun" desc = "The V-21 is the principal submachinegun used by the Sons of Mars, designed to be used effectively one or two handed with a variable rate of fire. When fired at full speed it's performance is severely degraded unless used properly wielded, while the lower rate of fire can still be effectively used one handed when necessary. It uses 10x20mm caseless rounds." icon_state = "v21" - icon = 'icons/Marine/gun64.dmi' + icon = 'icons/obj/items/guns/submachineguns64.dmi' item_state = "v21" caliber = CALIBER_10X20_CASELESS max_shells = 50 @@ -581,12 +586,12 @@ /obj/item/weapon/gun/smg/icc_machinepistol name = "\improper PL-38 machinepistol" desc = "The PL-38 is a machinepistol used by rearline ICCAF personnel, it presents solid performance at longer ranges in a compact package, although suffers due to a slow rate of fire for its class. It uses 10x20mm caseless rounds." - icon = 'icons/Marine/gun64.dmi' + icon = 'icons/obj/items/guns/submachineguns64.dmi' icon_state = "pl38" item_state = "pl38" item_icons = list( - slot_l_hand_str = 'icons/mob/items_lefthand_64.dmi', - slot_r_hand_str = 'icons/mob/items_righthand_64.dmi', + slot_l_hand_str = 'icons/mob/inhands/guns/submachineguns_left_64.dmi', + slot_r_hand_str = 'icons/mob/inhands/guns/submachineguns_right_64.dmi', ) inhand_x_dimension = 64 @@ -648,12 +653,12 @@ /obj/item/weapon/gun/smg/icc_pdw name = "\improper L-40 personal defense weapon" desc = "The L-40 is the primer ICCAF submachinegun, generally termed as a 'PDW' due to its armor-piercing high velocity round, while it has adequate ranged performance, it is mostly tuned for at close quarters combat. It uses 4.6mm high velocity caseless rounds." - icon = 'icons/Marine/gun64.dmi' + icon = 'icons/obj/items/guns/submachineguns64.dmi' icon_state = "l40" item_state = "l40" item_icons = list( - slot_l_hand_str = 'icons/mob/items_lefthand_64.dmi', - slot_r_hand_str = 'icons/mob/items_righthand_64.dmi', + slot_l_hand_str = 'icons/mob/inhands/guns/submachineguns_left_64.dmi', + slot_r_hand_str = 'icons/mob/inhands/guns/submachineguns_right_64.dmi', ) inhand_x_dimension = 64 diff --git a/code/modules/projectiles/guns/specialist.dm b/code/modules/projectiles/guns/specialist.dm index 088522d1a0040..2ef78ce07b7b9 100644 --- a/code/modules/projectiles/guns/specialist.dm +++ b/code/modules/projectiles/guns/specialist.dm @@ -17,6 +17,7 @@ Because this parent type did not exist Note that this means that snipers will have a slowdown of 3, due to the scope */ /obj/item/weapon/gun/rifle/sniper + icon = 'icons/obj/items/guns/marksman.dmi' aim_slowdown = 1 gun_skill_category = SKILL_RIFLES wield_delay = 1 SECONDS @@ -26,9 +27,13 @@ Note that this means that snipers will have a slowdown of 3, due to the scope /obj/item/weapon/gun/rifle/sniper/antimaterial name = "\improper SR-26 scoped rifle" desc = "The SR-26 is an IFF capable sniper rifle which is mostly used by long range marksmen. It excels in long-range combat situations and support sniping. It has a laser designator installed, and the scope itself has IFF integrated into it. Uses specialized 10x28 caseless rounds made to work with the guns odd IFF-scope system. \nIt has an integrated Target Marker and a Laser Targeting system.\n\"Peace Through Superior Firepower\"." - icon = 'icons/Marine/gun64.dmi' + icon = 'icons/obj/items/guns/special64.dmi' icon_state = "t26" item_state = "t26" + item_icons = list( + slot_l_hand_str = 'icons/mob/inhands/guns/special_left_1.dmi', + slot_r_hand_str = 'icons/mob/inhands/guns/special_right_1.dmi', + ) max_shells = 15 //codex caliber = CALIBER_10X28 fire_sound = 'sound/weapons/guns/fire/sniper.ogg' @@ -243,6 +248,10 @@ Note that this means that snipers will have a slowdown of 3, due to the scope desc = "A high end mag-rail heavy sniper rifle from Nanotrasen chambered in the heaviest ammo available, 10x99mm Caseless." icon_state = "m42c" item_state = "m42c" + item_icons = list( + slot_l_hand_str = 'icons/mob/inhands/guns/marksman_left_1.dmi', + slot_r_hand_str = 'icons/mob/inhands/guns/marksman_right_1.dmi', + ) max_shells = 6 //codex caliber = CALIBER_10X99 fire_sound = 'sound/weapons/guns/fire/sniper_heavy.ogg' @@ -278,10 +287,10 @@ Note that this means that snipers will have a slowdown of 3, due to the scope /obj/item/weapon/gun/rifle/sniper/svd name = "\improper SR-33 Dragunov sniper rifle" desc = "A semiautomatic sniper rifle, famed for it's marksmanship, and is built from the ground up for it. Fires 7.62x54mmR rounds." - icon = 'icons/Marine/gun64.dmi' + icon = 'icons/obj/items/guns/marksman64.dmi' item_icons = list( - slot_l_hand_str = 'icons/mob/items_lefthand_64.dmi', - slot_r_hand_str = 'icons/mob/items_righthand_64.dmi', + slot_l_hand_str = 'icons/mob/inhands/guns/marksman_left_64.dmi', + slot_r_hand_str = 'icons/mob/inhands/guns/marksman_right_64.dmi', ) inhand_x_dimension = 64 @@ -329,9 +338,13 @@ Note that this means that snipers will have a slowdown of 3, due to the scope /obj/item/weapon/gun/rifle/tx8 name = "\improper BR-8 scout rifle" desc ="The BR-8 is a light specialized scout rifle, mostly used by light infantry and scouts. It's designed to be useable at all ranges by being very adaptable to different situations due to the ability to use different ammo types. Has IFF. Takes specialized overpressured 10x28mm rounds." - icon = 'icons/Marine/gun64.dmi' + icon = 'icons/obj/items/guns/marksman64.dmi' icon_state = "tx8" item_state = "tx8" + item_icons = list( + slot_l_hand_str = 'icons/mob/inhands/guns/marksman_left_1.dmi', + slot_r_hand_str = 'icons/mob/inhands/guns/marksman_right_1.dmi', + ) max_shells = 25 //codex muzzleflash_iconstate = "muzzle_flash_medium" caliber = CALIBER_10X28_CASELESS //codex @@ -396,9 +409,13 @@ Note that this means that snipers will have a slowdown of 3, due to the scope /obj/item/weapon/gun/minigun name = "\improper MG-100 Vindicator Minigun" desc = "A six barreled rotary machine gun, The ultimate in man-portable firepower, capable of laying down high velocity armor piercing rounds this thing will no doubt pack a punch.. If you don't kill all your friends with it, you can use the stablizing system of the Powerpack to fire aimed fire, but you'll move incredibly slowly." - icon = 'icons/Marine/gun64.dmi' + icon = 'icons/obj/items/guns/special64.dmi' icon_state = "minigun" item_state = "minigun" + item_icons = list( + slot_l_hand_str = 'icons/mob/inhands/guns/special_left_1.dmi', + slot_r_hand_str = 'icons/mob/inhands/guns/special_right_1.dmi', + ) fire_animation = "minigun_fire" max_shells = 500 //codex caliber = CALIBER_762X51 //codex @@ -510,9 +527,13 @@ Note that this means that snipers will have a slowdown of 3, due to the scope /obj/item/weapon/gun/rifle/pepperball name = "\improper PB-12 pepperball gun" desc = "The PB-12 is ostensibly riot control device used by the TGMC in spiffy colors, working through a SAN ball that sends a short acting neutralizing chemical to knock out it's target, or weaken them. Guranteed to work on just about everything. Uses SAN Ball Holders as magazines." - icon = 'icons/Marine/gun64.dmi' + icon = 'icons/obj/items/guns/special64.dmi' icon_state = "pepperball" item_state = "pepperball" + item_icons = list( + slot_l_hand_str = 'icons/mob/inhands/guns/special_left_1.dmi', + slot_r_hand_str = 'icons/mob/inhands/guns/special_right_1.dmi', + ) flags_equip_slot = ITEM_SLOT_BACK|ITEM_SLOT_BELT max_shells = 100 //codex caliber = CALIBER_PEPPERBALL @@ -599,8 +620,13 @@ Note that this means that snipers will have a slowdown of 3, due to the scope /obj/item/weapon/gun/launcher/rocket name = "\improper RL-5 rocket launcher" desc = "The RL-5 is the primary anti-armor used around the galaxy. Used to take out light-tanks and enemy structures, the RL-5 rocket launcher is a dangerous weapon with a variety of combat uses. Uses a variety of 84mm rockets." + icon = 'icons/obj/items/guns/special.dmi' icon_state = "m5" item_state = "m5" + item_icons = list( + slot_l_hand_str = 'icons/mob/inhands/guns/special_left_1.dmi', + slot_r_hand_str = 'icons/mob/inhands/guns/special_right_1.dmi', + ) max_shells = 1 //codex caliber = CALIBER_84MM //codex load_method = SINGLE_CASING //codex @@ -667,12 +693,12 @@ Note that this means that snipers will have a slowdown of 3, due to the scope /obj/item/weapon/gun/launcher/rocket/sadar name = "\improper RL-152 sadar rocket launcher" desc = "The RL-152 is the primary anti-armor weapon of the TGMC. Used to take out light-tanks and enemy structures, the RL-152 rocket launcher is a dangerous weapon with a variety of combat uses. Uses a variety of 84mm rockets." - icon = 'icons/Marine/gun64.dmi' + icon = 'icons/obj/items/guns/special64.dmi' icon_state = "sadar" item_state = "sadar" item_icons = list( - slot_l_hand_str = 'icons/mob/items_lefthand_64.dmi', - slot_r_hand_str = 'icons/mob/items_righthand_64.dmi', + slot_l_hand_str = 'icons/mob/inhands/guns/special_left_64.dmi', + slot_r_hand_str = 'icons/mob/inhands/guns/special_right_64.dmi', slot_s_store_str = 'icons/mob/items_suit_slot_64.dmi', ) inhand_x_dimension = 64 @@ -791,7 +817,7 @@ Note that this means that snipers will have a slowdown of 3, due to the scope /obj/item/weapon/gun/launcher/rocket/recoillessrifle name = "\improper RL-160 recoilless rifle" desc = "The RL-160 recoilless rifle is a long range explosive ordanance device used by the TGMC used to fire explosive shells at far distances. Uses a variety of 67mm shells designed for various purposes." - icon = 'icons/Marine/gun64.dmi' + icon = 'icons/obj/items/guns/special64.dmi' icon_state = "t160" item_state = "t160" max_shells = 1 //codex @@ -839,7 +865,7 @@ Note that this means that snipers will have a slowdown of 3, due to the scope /obj/item/weapon/gun/launcher/rocket/oneuse name = "\improper RL-72 disposable rocket launcher" desc = "This is the premier disposable rocket launcher used throughout the galaxy, it cannot be reloaded or unloaded on the field. This one fires an 84mm explosive rocket. Spacebar to shorten or extend it to make it storeable or fireable, respectively." - icon = 'icons/Marine/gun64.dmi' + icon = 'icons/obj/items/guns/special64.dmi' icon_state = "t72" item_state = "t72" max_shells = 1 //codex @@ -902,7 +928,7 @@ Note that this means that snipers will have a slowdown of 3, due to the scope /obj/item/weapon/gun/launcher/rocket/som name = "\improper V-71 rocket launcher" desc = "The V-71 is a man portable rocket propelled grenade launcher employed by the SOM. It's design has changed little over centuries and is light weight and cheap to manufacture, while capable of firing a wide variety of 84mm rockets to provide excellent tactical flexibility." - icon = 'icons/Marine/gun64.dmi' + icon = 'icons/obj/items/guns/special64.dmi' icon_state = "rpg" item_state = "rpg" flags_gun_features = GUN_WIELDED_FIRING_ONLY|GUN_WIELDED_STABLE_FIRING_ONLY|GUN_AMMO_COUNTER|GUN_SHOWS_LOADED|GUN_SMOKE_PARTICLES @@ -947,7 +973,7 @@ Note that this means that snipers will have a slowdown of 3, due to the scope /obj/item/weapon/gun/launcher/rocket/icc name = "\improper MP-IRL rocket launcher" desc = "The Man Portable-Infantry Rocket Launcher is a man portable warhead launcher employed by the ICC. Being capable of firing a wide variety of 83m rear-mounted rockets to provide excellent tactical flexibility in a compact package." - icon = 'icons/Marine/gun64.dmi' + icon = 'icons/obj/items/guns/special64.dmi' icon_state = "iccrpg" item_state = "iccrpg" flags_gun_features = GUN_WIELDED_FIRING_ONLY|GUN_WIELDED_STABLE_FIRING_ONLY|GUN_AMMO_COUNTER|GUN_SHOWS_LOADED|GUN_SMOKE_PARTICLES @@ -986,9 +1012,13 @@ Note that this means that snipers will have a slowdown of 3, due to the scope /obj/item/weapon/gun/rifle/railgun name = "\improper RG-220 railgun" desc = "The RG-220 is a specialized heavy duty railgun made to shred through hard armor to allow for follow up attacks. Uses specialized canisters to reload." - icon = 'icons/Marine/gun64.dmi' + icon = 'icons/obj/items/guns/special64.dmi' icon_state = "railgun" item_state = "railgun" + item_icons = list( + slot_l_hand_str = 'icons/mob/inhands/guns/special_left_1.dmi', + slot_r_hand_str = 'icons/mob/inhands/guns/special_right_1.dmi', + ) max_shells = 3 //codex caliber = CALIBER_RAILGUN fire_sound = 'sound/weapons/guns/fire/railgun.ogg' @@ -1029,9 +1059,13 @@ Note that this means that snipers will have a slowdown of 3, due to the scope /obj/item/weapon/gun/rifle/icc_coilgun name = "\improper ML-120 coilgun" desc = "The ML-120 coilgun is the most commonly seen coilgun in ICCAF use, firing magnetic projecitles at a incredibly high velocity. It requires some windup but will penetrate walls, your foes, and your friendlies too. So watch out... Uses specialized canisters to reload." - icon = 'icons/Marine/gun64.dmi' + icon = 'icons/obj/items/guns/special64.dmi' icon_state = "ml120" item_state = "ml120" + item_icons = list( + slot_l_hand_str = 'icons/mob/inhands/guns/special_left_1.dmi', + slot_r_hand_str = 'icons/mob/inhands/guns/special_right_1.dmi', + ) max_shells = 5 //codex caliber = CALIBER_RAILGUN fire_sound = 'sound/weapons/guns/fire/railgun.ogg' diff --git a/code/modules/projectiles/magazines/smgs.dm b/code/modules/projectiles/magazines/smgs.dm index 1dce4d33a872d..54a0ddad339fd 100644 --- a/code/modules/projectiles/magazines/smgs.dm +++ b/code/modules/projectiles/magazines/smgs.dm @@ -68,11 +68,12 @@ icon_state_mini = "mag_heavy_smg" bonus_overlay = "t45_mag" -/obj/item/ammo_magazine/smg/standard_heavysmg/hollowpoint - name = "\improper SMG-45 hollowpoint magazine (.45 ACP)" - default_ammo = /datum/ammo/bullet/smg/hollow - icon_state = "t45_hp" - bonus_overlay = "t45_mag_hp" +/obj/item/ammo_magazine/smg/standard_heavysmg/squashhead + name = "\improper SMG-45 squash-head magazine (.45 ACP)" + desc = "A .45 ACP caseless submachinegun magazine that does a minituare explosion upon contact, will shred the armor off of basically anything." + default_ammo = /datum/ammo/bullet/smg/squash + icon_state = "t45_sh" + bonus_overlay = "t45_mag_sh" //------------------------------------------------------- //SMG-27, based on the SMG-27, based on the M7. diff --git a/code/modules/projectiles/projectile.dm b/code/modules/projectiles/projectile.dm index e47f5d134949c..3476dd56f3041 100644 --- a/code/modules/projectiles/projectile.dm +++ b/code/modules/projectiles/projectile.dm @@ -1318,6 +1318,50 @@ So if we are on the 32th absolute pixel coordinate we are on tile 1, but if we a /mob/living/proc/get_sunder() return 0 + +/** + * Fires a list of projectile objects in a circle around an atom + * Arguments: + * * source: [mandatory] atom the bullets are emitting from + * * bullets: [mandatory] list of bullets (in order, clockwise) to fire + * * firer: atom that "shot" these bullets + * * fire_sound: sound to play while the bullets are firing + * * range: bullet range + * * speed: bullet speed + * * randomized: bool, if true we randomly pick where we're firing instead of evenly seperated + * * rotations: how many times to "spin" the rotation. if 0 or less, instead bursts all the bullets at once + */ +/proc/bullet_burst(atom/source, list/obj/projectile/bullets, atom/firer, fire_sound, range, speed, randomized = FALSE, rotations = -1) + var/angle_between_bullets = 0 + var/current_angle = 0 + + //fire in an instant burst, no shrapnel + if(rotations < 1) + angle_between_bullets = 360 / length(bullets) + for(var/obj/projectile/proj in bullets) + if(randomized) + current_angle = rand(1, 360) + else + current_angle += angle_between_bullets + + proj.fire_at(null, firer, source, range, speed, current_angle, loc_override=source) + if(fire_sound) + playsound(source, fire_sound, 60, TRUE) + return + + angle_between_bullets = 360 / (length(bullets) / rotations) + var/play_sound + for(var/obj/projectile/proj in bullets) + if(randomized) + current_angle = rand(1, 360) + else + current_angle += angle_between_bullets + + proj.fire_at(null, firer, source, range, speed, current_angle, loc_override=source) + if(play_sound % 3 && fire_sound) + playsound(source, fire_sound, 60, FALSE) + stoplag(1) + #undef BULLET_FEEDBACK_PEN #undef BULLET_FEEDBACK_SOAK #undef BULLET_FEEDBACK_FIRE diff --git a/code/modules/reqs/supplypacks.dm b/code/modules/reqs/supplypacks.dm index 021929b9c37cd..5d7da6c11225b 100644 --- a/code/modules/reqs/supplypacks.dm +++ b/code/modules/reqs/supplypacks.dm @@ -588,13 +588,13 @@ WEAPONS /datum/supply_packs/weapons/antimaterial_incend_ammo name = "SR-26 AMR incendiary magazine" contains = list(/obj/item/ammo_magazine/sniper/incendiary) - cost = 50 + cost = 30 available_against_xeno_only = TRUE /datum/supply_packs/weapons/antimaterial_flak_ammo name = "SR-26 AMR flak magazine" contains = list(/obj/item/ammo_magazine/sniper/flak) - cost = 40 + cost = 30 available_against_xeno_only = TRUE /datum/supply_packs/weapons/specminigun @@ -846,10 +846,16 @@ EXPLOSIVES /datum/supply_packs/explosives/explosives_cloak name = "M40-2 SCDP grenade box crate" - notes = "contains 25 grenades" + notes = "Contains 25 grenades" contains = list(/obj/item/storage/box/visual/grenade/cloak) cost = 310 +/datum/supply_packs/explosives/explosives_lasburster + name = "M80 lasburster grenade box crate" + notes = "Contains 25 grenades" + contains = list(/obj/item/storage/box/visual/grenade/lasburster) + cost = 310 + /datum/supply_packs/explosives/explosives_hidp name = "M40 HIDP incendiary explosive grenade box crate" notes = "Contains 25 grenades" @@ -932,11 +938,21 @@ EXPLOSIVES contains = list(/obj/item/storage/box/mlrs_rockets) cost = 60 +/datum/supply_packs/explosives/mlrs_rockets_incendiary + name = "TA-40L MLRS Incendiary Rocket Pack (x16)" + contains = list(/obj/item/storage/box/mlrs_rocket_incendiary) + cost = 60 + /datum/supply_packs/explosives/mlrs_rockets_gas name = "TA-40L X-50 MLRS Rocket Pack (x16)" contains = list(/obj/item/storage/box/mlrs_rockets_gas) cost = 60 +/datum/supply_packs/explosives/mlrs_rockets_cloak + name = "TA-40L S-2 MLRS Cloak Rocket Pack (x16)" + contains = list(/obj/item/storage/box/mlrs_rocket_gas_cloak) + cost = 50 + /datum/supply_packs/explosives/howitzer name = "MG-100Y howitzer" contains = list(/obj/item/mortar_kit/howitzer) @@ -2138,6 +2154,16 @@ FACTORY contains = list(/obj/item/factory_refill/railgun_magazine_refill) cost = 200 +/datum/supply_packs/factory/railgun_hvap_magazine_refill + name = "Railgun HVAP magazine assembly refill" + contains = list(/obj/item/factory_refill/railgun_magazine_refill) + cost = 200 + +/datum/supply_packs/factory/railgun_smart_magazine_refill + name = "Railgun magazine assembly refill" + contains = list(/obj/item/factory_refill/railgun_magazine_refill) + cost = 200 + /datum/supply_packs/factory/minigun_powerpack_refill name = "Minigun powerpack assembly refill" contains = list(/obj/item/factory_refill/minigun_powerpack_refill) @@ -2148,6 +2174,11 @@ FACTORY contains = list(/obj/item/factory_refill/razornade_refill) cost = 500 +/datum/supply_packs/factory/flak_sniper_refill + name = "SR-127 flak magazine assembly refill" + contains = list(/obj/item/factory_refill/sniper_flak_magazine_refill) + cost = 600 + /datum/supply_packs/factory/amr_magazine_refill name = "T-26 AMR magazine assembly refill" contains = list(/obj/item/factory_refill/amr_magazine_refill) @@ -2218,6 +2249,21 @@ FACTORY contains = list(/obj/item/factory_refill/module_surt_refill) cost = 600 +/datum/supply_packs/factory/plastique_refill + name = "C4 assembly refill" + contains = list(/obj/item/factory_refill/plastique_refill) + cost = 150 + +/datum/supply_packs/factory/plastique_incendiary_refill + name = "EX-62 Genghis incendiary assembly refill" + contains = list(/obj/item/factory_refill/plastique_incendiary_refill) + cost = 500 + +/datum/supply_packs/factory/detpack_refill + name = "Detpack assembly refill" + contains = list(/obj/item/factory_refill/detpack_refill) + cost = 250 + /datum/supply_packs/factory/mortar_shell_he_refill name = "Mortar High Explosive shell assembly refill" contains = list(/obj/item/factory_refill/mortar_shell_he_refill) @@ -2248,6 +2294,81 @@ FACTORY contains = list(/obj/item/factory_refill/mlrs_rocket_refill) cost = 240 +/datum/supply_packs/factory/agls_he_refill + name = "AGLS HE magazine assembly refill" + contains = list(/obj/item/factory_refill/agls_he_refill) + cost = 300 + +/datum/supply_packs/factory/agls_frag_refill + name = "AGLS FRAG magazine assembly refill" + contains = list(/obj/item/factory_refill/agls_frag_refill) + cost = 300 + +/datum/supply_packs/factory/agls_incendiary_refill + name = "AGLS Incendiary magazine assembly refill" + contains = list(/obj/item/factory_refill/agls_incendiary_refill) + cost = 300 + +/datum/supply_packs/factory/agls_flare_refill + name = "AGLS Flare magazine assembly refill" + contains = list(/obj/item/factory_refill/agls_flare_refill) + cost = 200 + +/datum/supply_packs/factory/agls_cloak_refill + name = "AGLS Cloak magazine assembly refill" + contains = list(/obj/item/factory_refill/agls_cloak_refill) + cost = 200 + +/datum/supply_packs/factory/agls_tanglefoot_refill + name = "AGLS Tanglefoot magazine assembly refill" + contains = list(/obj/item/factory_refill/agls_tanglefoot_refill) + cost = 400 + +/datum/supply_packs/factory/atgun_aphe_refill + name = "AT-36 AP-HE shell assembly refill" + contains = list(/obj/item/factory_refill/atgun_aphe_refill) + cost = 100 + +/datum/supply_packs/factory/atgun_apcr_refill + name = "AT-36 APCR shell assembly refill" + contains = list(/obj/item/factory_refill/atgun_apcr_refill) + cost = 100 + +/datum/supply_packs/factory/atgun_he_refill + name = "AT-36 HE shell assembly refill" + contains = list(/obj/item/factory_refill/atgun_he_refill) + cost = 100 + +/datum/supply_packs/factory/atgun_beehive_refill + name = "AT-36 Beehive shell assembly refill" + contains = list(/obj/item/factory_refill/atgun_beehive_refill) + cost = 100 + +/datum/supply_packs/factory/atgun_incend_refill + name = "AT-36 Napalm shell assembly refill" + contains = list(/obj/item/factory_refill/atgun_incend_refill) + cost = 100 + +/datum/supply_packs/factory/heavy_isg_he_refill + name = "FK-88 HE shell assembly refill" + contains = list(/obj/item/factory_refill/heavy_isg_he_refill) + cost = 300 + +/datum/supply_packs/factory/heavy_isg_sabot_refill + name = "FK-88 APFDS shell assembly refill" + contains = list(/obj/item/factory_refill/heavy_isg_sabot_refill) + cost = 400 + +/datum/supply_packs/factory/ac_hv_refill + name = "ATR-22 High Velocity magazine assembly refill" + contains = list(/obj/item/factory_refill/ac_hv_refill) + cost = 300 + +/datum/supply_packs/factory/ac_flak_refill + name = "ATR-22 Flak magazine assembly refill" + contains = list(/obj/item/factory_refill/ac_flak_refill) + cost = 300 + /datum/supply_packs/factory/thermobaric_wp_refill name = "RL-57 Thermobaric WP rocket array assembly refill" contains = list(/obj/item/factory_refill/thermobaric_wp_refill) @@ -2257,3 +2378,13 @@ FACTORY name = "Zeus orbital drop pod assembly refill" contains = list(/obj/item/factory_refill/drop_pod_refill) cost = 250 + +/datum/supply_packs/factory/deployable_floodlight_refill + name = "Deployable floodlight assembly refill" + contains = list(/obj/item/factory_refill/deployable_floodlight_refill) + cost = 150 + +/datum/supply_packs/factory/deployable_camera_refill + name = "Deplyable security camera refill" + contains = list(/obj/item/factory_refill/deployable_camera_refill) + cost = 100 diff --git a/code/modules/screen_alert/command_alert.dm b/code/modules/screen_alert/command_alert.dm index 02ee3810eaf6a..089ccec2f1823 100644 --- a/code/modules/screen_alert/command_alert.dm +++ b/code/modules/screen_alert/command_alert.dm @@ -53,15 +53,34 @@ S.channel = CHANNEL_ANNOUNCEMENTS TIMER_COOLDOWN_START(owner, COOLDOWN_HUD_ORDER, ORDER_COOLDOWN) log_game("[key_name(human_owner)] has broadcasted the hud message [text] at [AREACOORD(human_owner)]") + var/override_color // for squad colors + var/list/alert_receivers = (GLOB.alive_human_list + GLOB.ai_list + GLOB.observer_list) // for full faction alerts, do this so that faction's AI and ghosts can hear aswell if(human_owner.assigned_squad) - deadchat_broadcast(" has sent a Squad Announcement:

[span_bigdeadsay("[text]")]

", human_owner, human_owner) - for(var/mob/living/carbon/human/marine AS in human_owner.assigned_squad.marines_list) + switch(human_owner.assigned_squad.id) + if(ALPHA_SQUAD) + override_color = "red" + if(BRAVO_SQUAD) + override_color = "orange" + if(CHARLIE_SQUAD) + override_color = "purple" + if(DELTA_SQUAD) + override_color = "blue" + for(var/mob/living/carbon/human/marine AS in human_owner.assigned_squad.marines_list | GLOB.observer_list) marine.play_screen_text("SQUAD ANNOUNCEMENT:
" + text, /atom/movable/screen/text/screen_text/command_order) - to_chat(marine, "[span_faction_alert("[span_faction_alert_minortitle("Squad Announcement")][span_faction_alert_text("[text]

Sent by [human_owner.real_name], the [human_owner.job.title]")]")]") + to_chat(marine, assemble_alert( + title = "Squad [human_owner.assigned_squad.name] Announcement", + subtitle = "Sent by [human_owner.real_name]", + message = text, + color_override = override_color, + minor = TRUE + )) return - deadchat_broadcast(" has sent a Command Announcement:

[span_bigdeadsay("[text]")]

", human_owner, human_owner) - for(var/mob/living/carbon/human/human AS in GLOB.alive_human_list) - if(human.faction == human_owner.faction) - human.play_screen_text("COMMAND ANNOUNCEMENT:
" + text, /atom/movable/screen/text/screen_text/command_order) - to_chat(human, "[span_faction_alert("[span_faction_alert_title("Command Announcement")]
[span_faction_alert_text("[text]

Sent by [human_owner.real_name], the [human_owner.job.title]")]")]") - SEND_SOUND(human, S) + for(var/mob/faction_receiver in alert_receivers) + if(faction_receiver.faction == human_owner.faction || isdead(faction_receiver)) + faction_receiver.play_screen_text("COMMAND ANNOUNCEMENT:
" + text, /atom/movable/screen/text/screen_text/command_order) + to_chat(faction_receiver, assemble_alert( + title = "Command Announcement", + subtitle = "Sent by [human_owner.real_name]", + message = text + )) + SEND_SOUND(faction_receiver, S) diff --git a/code/modules/shuttle/marine_dropship.dm b/code/modules/shuttle/marine_dropship.dm index ce5982e8cbe1d..56a6d44505e72 100644 --- a/code/modules/shuttle/marine_dropship.dm +++ b/code/modules/shuttle/marine_dropship.dm @@ -255,7 +255,7 @@ if(hijack_state != HIJACK_STATE_NORMAL) return cycle_timer = addtimer(CALLBACK(src, PROC_REF(go_to_previous_destination)), 20 SECONDS, TIMER_STOPPABLE) - priority_announce("Dropship taking off in 20 seconds towards [previous.name]", "Dropship Automatic Departure") + priority_announce("The Alamo will depart towards [previous.name] in 20 seconds.", "Dropship Automatic Departure", color_override = "grey") ///Send the dropship to its previous dock /obj/docking_port/mobile/marine_dropship/proc/go_to_previous_destination() @@ -320,7 +320,7 @@ /obj/docking_port/mobile/marine_dropship/on_prearrival() . = ..() if(hijack_state == HIJACK_STATE_CRASHING) - priority_announce("DROPSHIP ON COLLISION COURSE. CRASH IMMINENT.", "EMERGENCY", sound = 'sound/AI/dropship_emergency.ogg') + priority_announce("DROPSHIP ON COLLISION COURSE. CRASH IMMINENT.", "EMERGENCY", sound = 'sound/AI/dropship_emergency.ogg', color_override = "red") for(var/obj/machinery/landinglight/light AS in GLOB.landing_lights) if(light.linked_port == destination) light.turn_on() @@ -375,7 +375,7 @@ message_admins("[ADMIN_TPMONTY(src)] has summoned the dropship") log_admin("[key_name(src)] has summoned the dropship") hive?.xeno_message("[src] has summoned down the metal bird to [port], gather to her now!") - priority_announce("Unknown interference with dropship control. Shutting down autopilot", "Dropship malfunction") + priority_announce("Unknown external interference with dropship control. Shutting down autopilot.", "Critical Dropship Alert", type = ANNOUNCEMENT_PRIORITY, color_override = "red") #define ALIVE_HUMANS_FOR_CALLDOWN 0.1 @@ -436,7 +436,7 @@ D.silicon_lock_airlocks(TRUE) to_chat(user, span_warning("We have overriden the shuttle lockdown!")) playsound(user, "alien_roar", 50) - priority_announce("Alamo lockdown protocol compromised. Interference preventing remote control", "Dropship Lock Alert") + priority_announce("Alamo lockdown protocol compromised. Interference preventing remote control.", "Dropship Lock Alert", type = ANNOUNCEMENT_PRIORITY, color_override = "red") return FALSE if(D.mode != SHUTTLE_IDLE && D.mode != SHUTTLE_RECHARGING) to_chat(user, span_warning("The bird's mind is currently active. We need to wait until it's more vulnerable...")) @@ -502,37 +502,10 @@ to_chat(X, span_xenowarning("It's too early to do this!")) return #endif - var/obj/docking_port/mobile/marine_dropship/M = SSshuttle.getShuttle(shuttleId) - var/dat = "Status: [M ? M.getStatusText() : "*Missing*"]

" - if(M) - dat += "Launch to [SSmapping.configs[SHIP_MAP].map_name]
" - dat += "Capture the [M]
" - M.unlock_all() - M.silicon_lock_airlocks(TRUE) - if(M.hijack_state != HIJACK_STATE_CALLED_DOWN) - to_chat(X, span_xenowarning("We corrupt the bird's controls, unlocking the doors[(M.mode != SHUTTLE_IGNITING) ? "and preventing it from flying." : ", but we are unable to prevent it from flying as it is already taking off!"]")) - SEND_GLOBAL_SIGNAL(COMSIG_GLOB_DROPSHIP_CONTROLS_CORRUPTED, src) - if(M.mode != SHUTTLE_IGNITING) - M.set_hijack_state(HIJACK_STATE_CALLED_DOWN) - M.do_start_hijack_timer() - - var/datum/browser/popup = new(X, "computer", M ? M.name : "shuttle", 300, 200) - popup.set_content("
[dat]
") - popup.open() - + interact(X) -/obj/machinery/computer/shuttle/marine_dropship/can_interact(mob/user) - . = ..() - - if(isxeno(user)) - var/mob/living/carbon/xenomorph/X = user - if(!(X.xeno_caste.caste_flags & CASTE_IS_INTELLIGENT)) - return FALSE - - else if(!allowed(user)) - return FALSE - - return TRUE +/obj/machinery/computer/shuttle/marine_dropship/ui_state(mob/user) + return GLOB.alamo_state /obj/machinery/computer/shuttle/marine_dropship/ui_interact(mob/user, datum/tgui/ui) ui = SStgui.try_update_ui(user, src, ui) @@ -541,19 +514,28 @@ ui = new(user, src, "MarineDropship", name) ui.open() +/obj/machinery/computer/shuttle/marine_dropship/ui_static_data(mob/user) + var/obj/docking_port/mobile/marine_dropship/shuttle = SSshuttle.getShuttle(shuttleId) + var/list/static_data = list() + static_data["current_map"] = SSmapping.configs[SHIP_MAP].map_name + static_data["ship_name"] = shuttle + + return static_data + /obj/machinery/computer/shuttle/marine_dropship/ui_data(mob/user) var/obj/docking_port/mobile/marine_dropship/shuttle = SSshuttle.getShuttle(shuttleId) if(!shuttle) WARNING("[src] could not find shuttle [shuttleId] from SSshuttle") return - . = list() - .["on_flyby"] = shuttle.mode == SHUTTLE_CALL - .["dest_select"] = !(shuttle.mode == SHUTTLE_CALL || shuttle.mode == SHUTTLE_IDLE) - .["hijack_state"] = shuttle.hijack_state != HIJACK_STATE_CALLED_DOWN - .["ship_status"] = shuttle.getStatusText() - .["automatic_cycle_on"] = shuttle.automatic_cycle_on - .["time_between_cycle"] = shuttle.time_between_cycle + var/list/data = list() + data["is_human"] = ishuman(user) + data["on_flyby"] = shuttle.mode == SHUTTLE_CALL + data["dest_select"] = !(shuttle.mode == SHUTTLE_CALL || shuttle.mode == SHUTTLE_IDLE) + data["hijack_state"] = shuttle.hijack_state != HIJACK_STATE_CALLED_DOWN + data["ship_status"] = shuttle.getStatusText() + data["automatic_cycle_on"] = shuttle.automatic_cycle_on + data["time_between_cycle"] = shuttle.time_between_cycle var/locked = 0 var/reardoor = 0 @@ -562,12 +544,12 @@ if(A.locked && A.density) reardoor++ if(!reardoor) - .["rear"] = 0 + data["rear"] = 0 else if(reardoor==length(shuttle.rear_airlocks)) - .["rear"] = 2 + data["rear"] = 2 locked++ else - .["rear"] = 1 + data["rear"] = 1 var/leftdoor = 0 for(var/i in shuttle.left_airlocks) @@ -575,12 +557,12 @@ if(A.locked && A.density) leftdoor++ if(!leftdoor) - .["left"] = 0 + data["left"] = 0 else if(leftdoor==length(shuttle.left_airlocks)) - .["left"] = 2 + data["left"] = 2 locked++ else - .["left"] = 1 + data["left"] = 1 var/rightdoor = 0 for(var/i in shuttle.right_airlocks) @@ -588,19 +570,19 @@ if(A.locked && A.density) rightdoor++ if(!rightdoor) - .["right"] = 0 + data["right"] = 0 else if(rightdoor==length(shuttle.right_airlocks)) - .["right"] = 2 + data["right"] = 2 locked++ else - .["right"] = 1 + data["right"] = 1 if(locked == 3) - .["lockdown"] = 2 + data["lockdown"] = 2 else if(!locked) - .["lockdown"] = 0 + data["lockdown"] = 0 else - .["lockdown"] = 1 + data["lockdown"] = 1 var/list/options = valid_destinations() var/list/valid_destinations = list() @@ -610,9 +592,11 @@ if(!shuttle.check_dock(S, silent=TRUE)) continue valid_destinations += list(list("name" = S.name, "id" = S.id)) - .["destinations"] = valid_destinations + data["destinations"] = valid_destinations -/obj/machinery/computer/shuttle/marine_dropship/ui_act(action, list/params) + return data + +/obj/machinery/computer/shuttle/marine_dropship/ui_act(action, list/params, datum/tgui/ui, datum/ui_state/state) . = ..() if(.) return @@ -645,83 +629,42 @@ deltimer(M.cycle_timer) if("cycle_time_change") M.time_between_cycle = params["cycle_time_change"] - -/obj/machinery/computer/shuttle/marine_dropship/Topic(href, href_list) - var/obj/docking_port/mobile/marine_dropship/M = SSshuttle.getShuttle(shuttleId) - if(!M) - return - if(!isxeno(usr) && M.hijack_state == HIJACK_STATE_CALLED_DOWN) - to_chat(usr, span_warning("The shuttle isn't responding to commands.")) - return - . = ..() - if(.) - return - if(M.hijack_state == HIJACK_STATE_CRASHING) - return - - if(ishuman(usr) || isAI(usr)) - if(!allowed(usr)) - return - if(href_list["lockdown"]) - - else if(href_list["release"]) - - else if(href_list["lock"]) - M.lockdown_airlocks(href_list["lock"]) - else if(href_list["unlock"]) - M.unlock_airlocks(href_list["unlock"]) - return - - if(!is_ground_level(M.z)) - return - - if(!isxeno(usr)) - return - - var/mob/living/carbon/xenomorph/X = usr - - if(href_list["hijack"]) - if(!(X.hive.hive_flags & HIVE_CAN_HIJACK)) - to_chat(X, span_warning("Our hive lacks the psychic prowess to hijack the bird.")) - return - switch(M.mode) - if(SHUTTLE_RECHARGING) - to_chat(X, span_xenowarning("The bird is still cooling down.")) + //These are actions for the Xeno dropship UI + if("hijack") + var/mob/living/carbon/xenomorph/xeno = usr + if(!(xeno.hive.hive_flags & HIVE_CAN_HIJACK)) + to_chat(xeno, span_warning("Our hive lacks the psychic prowess to hijack the bird.")) return - if(SHUTTLE_IDLE) //Continue. - else - to_chat(X, span_xenowarning("We can't do that right now.")) + if(M.mode == SHUTTLE_RECHARGING) + to_chat(xeno, span_xenowarning("The bird is still cooling down.")) + return + if(M.mode != SHUTTLE_IDLE) + to_chat(xeno, span_xenowarning("We can't do that right now.")) + return + var/confirm = tgui_alert(usr, "Would you like to hijack the metal bird?", "Hijack the bird?", list("Yes", "No")) + if(confirm != "Yes") + return + var/obj/docking_port/stationary/marine_dropship/crash_target/CT = pick(SSshuttle.crash_targets) + if(!CT) + return + do_hijack(M, CT, xeno) + if("abduct") + var/groundside_humans = length(GLOB.humans_by_zlevel["[z]"]) + if(groundside_humans > 5) + to_chat(usr, span_xenowarning("There is still prey left to hunt!")) + return + var/confirm = tgui_alert(usr, "Would you like to capture the metal bird?\n THIS WILL END THE ROUND", "Capture the ship?", list( "Yes", "No")) + if(confirm != "Yes") + return + if(groundside_humans > 5) + to_chat(usr, span_xenowarning("There is still prey left to hunt!")) return - var/confirm = tgui_alert(usr, "Would you like to hijack the metal bird?", "Hijack the bird?", list("Yes", "No")) - if(confirm != "Yes") - return - var/obj/docking_port/stationary/marine_dropship/crash_target/CT = pick(SSshuttle.crash_targets) - if(!CT) - return - do_hijack(M, CT, X) - - if(href_list["abduct"]) - var/confirm = tgui_alert(usr, "Would you like to capture the metal bird?\n THIS WILL END THE ROUND", "Capture the ship?", list( "Yes", "No")) - if(confirm != "Yes") - return - var/groundside_humans = length(GLOB.humans_by_zlevel["[z]"]) - if(groundside_humans > 5) - to_chat(X, span_xenowarning("There is still prey left to hunt!")) - return - //these are all stinky checks, someone make this tgui - if(X != usr) - return - if(X.stat) - return - if(!Adjacent(X)) + priority_announce("The Alamo has been captured! Losing their main mean of accessing the ground, the marines have no choice but to retreat.", title = "Alamo Captured", color_override = "orange") + var/datum/game_mode/infestation/infestation_mode = SSticker.mode + infestation_mode.round_stage = INFESTATION_DROPSHIP_CAPTURED_XENOS return - priority_announce("The Alamo has been captured! Losing their main mean of accessing the ground, the marines have no choice but to retreat.", title = "ALAMO CAPTURED") - var/datum/game_mode/infestation/infestation_mode = SSticker.mode - infestation_mode.round_stage = INFESTATION_DROPSHIP_CAPTURED_XENOS - return - /obj/machinery/computer/shuttle/marine_dropship/proc/do_hijack(obj/docking_port/mobile/marine_dropship/crashing_dropship, obj/docking_port/stationary/marine_dropship/crash_target/crash_target, mob/living/carbon/xenomorph/user) crashing_dropship.set_hijack_state(HIJACK_STATE_CRASHING) if(SSticker.mode?.flags_round_type & MODE_HIJACK_POSSIBLE) @@ -731,7 +674,7 @@ crashing_dropship.crashing = TRUE crashing_dropship.unlock_all() SEND_GLOBAL_SIGNAL(COMSIG_GLOB_DROPSHIP_HIJACKED) - priority_announce("Unscheduled dropship departure detected from operational area. Hijack likely.", "Dropship Alert", sound = 'sound/AI/hijack.ogg') + priority_announce("Unscheduled dropship departure detected from operational area. Hijack likely.", title = "Critical Dropship Alert", type = ANNOUNCEMENT_PRIORITY, sound = 'sound/AI/hijack.ogg', color_override = "red") to_chat(user, span_danger("A loud alarm erupts from [src]! The fleshy hosts must know that you can access it!")) user.hive.on_shuttle_hijack(crashing_dropship) playsound(src, 'sound/misc/queen_alarm.ogg') diff --git a/code/modules/tgui/states/alamo.dm b/code/modules/tgui/states/alamo.dm new file mode 100644 index 0000000000000..9f284923cd191 --- /dev/null +++ b/code/modules/tgui/states/alamo.dm @@ -0,0 +1,32 @@ +/** + * tgui state: access_state + * + * Humans need to have access and be adjacent to use it. + * Silicons and other lifeforms get their default ui_state pass. + * Xenomorphs need to be intelligent + */ + +GLOBAL_DATUM_INIT(alamo_state, /datum/ui_state/alamo_state, new) + +/datum/ui_state/alamo_state/can_use_topic(src_object, mob/user) + return user.alamo_can_use_topic(src_object) + +/mob/proc/alamo_can_use_topic(src_object) + return default_can_use_topic(src_object) + +/mob/living/alamo_can_use_topic(src_object) + . = human_adjacent_can_use_topic(src_object) + + var/obj/O = src_object + if(!O?.allowed(src)) //No access? No ui! + to_chat(src, span_warning("Access Denied!")) + return UI_CLOSE + . = min(., UI_INTERACTIVE) + +/mob/living/silicon/alamo_can_use_topic(src_object) + return default_can_use_topic(src_object) + +/mob/living/carbon/xenomorph/alamo_can_use_topic(src_object) + if(!(xeno_caste.caste_flags & CASTE_IS_INTELLIGENT)) + return default_can_use_topic(src_object) + return GLOB.xeno_state.can_use_topic(src_object, src) diff --git a/code/modules/xenomorph/pherotower.dm b/code/modules/xenomorph/pherotower.dm index 5e73b14f09f95..30d1154a38e39 100644 --- a/code/modules/xenomorph/pherotower.dm +++ b/code/modules/xenomorph/pherotower.dm @@ -8,7 +8,7 @@ bound_height = 32 obj_integrity = 400 max_integrity = 400 - xeno_structure_flags = CRITICAL_STRUCTURE + xeno_structure_flags = CRITICAL_STRUCTURE|IGNORE_WEED_REMOVAL ///The type of pheromone currently being emitted. var/datum/aura_bearer/current_aura ///Strength of pheromones given by this tower. diff --git a/code/modules/xenomorph/xenotowers.dm b/code/modules/xenomorph/xenotowers.dm index ffb9cf74bb3e6..6247b3d6dd08a 100644 --- a/code/modules/xenomorph/xenotowers.dm +++ b/code/modules/xenomorph/xenotowers.dm @@ -8,7 +8,7 @@ bound_height = 64 obj_integrity = 600 max_integrity = 600 - xeno_structure_flags = CRITICAL_STRUCTURE + xeno_structure_flags = CRITICAL_STRUCTURE|IGNORE_WEED_REMOVAL ///boost amt to be added per tower per cycle var/boost_amount = 0.2 ///maturity boost amt to be added per tower per cycle @@ -43,7 +43,7 @@ bound_height = 64 obj_integrity = 400 max_integrity = 400 - xeno_structure_flags = CRITICAL_STRUCTURE + xeno_structure_flags = CRITICAL_STRUCTURE|IGNORE_WEED_REMOVAL /obj/structure/xeno/psychictower/Initialize(mapload, _hivenumber) . = ..() diff --git a/config/config.txt b/config/config.txt index 540a84e917d0c..9a9a1588ac7c4 100644 --- a/config/config.txt +++ b/config/config.txt @@ -230,9 +230,9 @@ DEFAULT_VIEW_SQUARE 15x15 AI_ANTI_STUCK_LAG_TIME_DILATION_THRESHOLD 20 -## Assets can opt-in to caching their results into `tmp`. +## Assets can opt-in to caching their results into `cache/`. ## This is important, as preferences assets take upwards of 30 seconds (without sleeps) to collect. -## The cache is assumed to be cleared by TGS recompiling, which deletes `tmp`. +## The cache is assumed to be cleared by TGS recompiling, which deletes `cache/`. ## This should be disabled (through `CACHE_ASSETS 0`) on development, ## but enabled on production (the default). CACHE_ASSETS 0 diff --git a/html/changelogs/archive/2024-02.yml b/html/changelogs/archive/2024-02.yml index 3f03ef0100c67..14b4dd4fbf530 100644 --- a/html/changelogs/archive/2024-02.yml +++ b/html/changelogs/archive/2024-02.yml @@ -186,3 +186,80 @@ - bugfix: Chicken protein bars no longer runtime ivanmixo: - balance: Stagger doesn't stack in duration anymore +2024-02-11: + Dikozda: + - bugfix: SG prep on cantabury no longer has its only door blocked + Helg2: + - bugfix: '[Big Red] fixed pipes in medbay variants 4 and 5.' + Neocloudy: + - rscadd: new announcement design- announcements can be recolored, have a subtitle, + and pop out easier. + - code_imp: priority announcements can now have a color override and subtitle + - admin: added subtitle and color option to command reports + novaepee: + - imageadd: port TG surgery tool sprites +2024-02-12: + AzonStarfall: + - bugfix: Fixed Arachne's Medbay Disposal. + Helg2: + - bugfix: Xenos now show their wound in their special states. + Lumipharon: + - balance: Unarmed damage against humans is no longer rng if your victim is prone + - balance: CQC skill lowers grab upgrade time + - balance: Unarmed attacks against humans uses the same zone targeting as melee + weapons + - bugfix: Choking someone to death once again actually causes oxyloss + - bugfix: Melee attack can now actually miss some times as intended (only for humans + attacking humans) + Naaanii: + - rscadd: Added HVAP and smart railgun rounds to reqtorio. + - rscadd: Added SR-127 flak ammo to reqtorio. + - rscadd: Added deployable floodlights to reqtorio. + - rscadd: Added both plastiques to reqtorio. + - rscadd: Added detpacks to reqtorio. + - spellcheck: Added a missing period to drop pod factory description. + - balance: All AMR mags cost the same. + Pariah919: + - rscadd: Added new cloak and incendiary rockets for MLRS. + TiviPlus: + - code_imp: razorburns have been removed from loadouts due to an internal code change + Xander3359: + - refactor: Alamo console for xenos is TGUI now + Xander3359 Naaanii: + - admin: Admins can cancel king summon +2024-02-13: + Barnet2: + - balance: If autobalance is on or if you are a tier four, the xeno respawn timer + is not applied + - balance: Sentinel gas nade is now transparent (you can see through it) + Lumipharon: + - bugfix: fixed a couple of minor edge case bugs with jumping + - code_imp: connect_loc now works properly for multitile atoms +2024-02-14: + Cpol-CzHa: + - rscadd: Adds a number of missing items to valhalla. + Naaanii: + - rscadd: Added all AGLS ammo to reqtorio. + - rscadd: Added all TAT ammo to reqtorio. + - rscadd: Added all FK-88 ammo to reqtorio. + - rscadd: Added all ATR-22 ammo to reqtorio. + - bugfix: Actually adds the camera refill to req. + TiviPlus: + - rscadd: Added new "lasburster" grenade + - code_imp: added the ability to shoot bullets in a circle + Xander3359: + - bugfix: fix typo in martini belt causing broken sprite + efzapa: + - spellcheck: Bicaridine is now universally spelt correctly. +2024-02-15: + Helg2: + - balance: Psychic Relays, Evolution Towers and Pheromonone Towers now ignore weed + removal. + Pariah919: + - rscadd: New squashhead bullets for SMG-45 + - rscdel: SMG-45 HP + - soundadd: New firesound for SMG-45 + Xander3359: + - bugfix: Fix not being able to click martini belt + yyzsong: + - qol: Adds a cooldown between unresting and then resting again for xenomorphs diff --git a/icons/Marine/gun64.dmi b/icons/Marine/gun64.dmi deleted file mode 100644 index 921f4935fb6ec..0000000000000 Binary files a/icons/Marine/gun64.dmi and /dev/null differ diff --git a/icons/Marine/mortar.dmi b/icons/Marine/mortar.dmi index a24983bc90ce5..887876c3b2a02 100644 Binary files a/icons/Marine/mortar.dmi and b/icons/Marine/mortar.dmi differ diff --git a/icons/Marine/spear.dmi b/icons/Marine/spear.dmi new file mode 100644 index 0000000000000..0b1c0f5d41df7 Binary files /dev/null and b/icons/Marine/spear.dmi differ diff --git a/icons/mob/ammoHUD.dmi b/icons/mob/ammoHUD.dmi index 2357f09203393..68c7ad9d35627 100644 Binary files a/icons/mob/ammoHUD.dmi and b/icons/mob/ammoHUD.dmi differ diff --git a/icons/mob/inhands/equipment/surgery_left.dmi b/icons/mob/inhands/equipment/surgery_left.dmi index 09f78f9a86813..53845029b5649 100644 Binary files a/icons/mob/inhands/equipment/surgery_left.dmi and b/icons/mob/inhands/equipment/surgery_left.dmi differ diff --git a/icons/mob/inhands/equipment/surgery_right.dmi b/icons/mob/inhands/equipment/surgery_right.dmi index e1a101d434918..ea1be3efbcfd0 100644 Binary files a/icons/mob/inhands/equipment/surgery_right.dmi and b/icons/mob/inhands/equipment/surgery_right.dmi differ diff --git a/icons/mob/inhands/guns/energy_left_1.dmi b/icons/mob/inhands/guns/energy_left_1.dmi new file mode 100644 index 0000000000000..34fbd36f2dbe9 Binary files /dev/null and b/icons/mob/inhands/guns/energy_left_1.dmi differ diff --git a/icons/mob/inhands/guns/energy_left_64.dmi b/icons/mob/inhands/guns/energy_left_64.dmi new file mode 100644 index 0000000000000..a831da4c82eb4 Binary files /dev/null and b/icons/mob/inhands/guns/energy_left_64.dmi differ diff --git a/icons/mob/inhands/guns/energy_right_1.dmi b/icons/mob/inhands/guns/energy_right_1.dmi new file mode 100644 index 0000000000000..80bc462d2ee0b Binary files /dev/null and b/icons/mob/inhands/guns/energy_right_1.dmi differ diff --git a/icons/mob/inhands/guns/energy_right_64.dmi b/icons/mob/inhands/guns/energy_right_64.dmi new file mode 100644 index 0000000000000..9aa5ce4523336 Binary files /dev/null and b/icons/mob/inhands/guns/energy_right_64.dmi differ diff --git a/icons/mob/inhands/guns/machineguns_left_1.dmi b/icons/mob/inhands/guns/machineguns_left_1.dmi new file mode 100644 index 0000000000000..e7bff9b2f654b Binary files /dev/null and b/icons/mob/inhands/guns/machineguns_left_1.dmi differ diff --git a/icons/mob/inhands/guns/machineguns_left_64.dmi b/icons/mob/inhands/guns/machineguns_left_64.dmi new file mode 100644 index 0000000000000..f1d65bc0f4190 Binary files /dev/null and b/icons/mob/inhands/guns/machineguns_left_64.dmi differ diff --git a/icons/mob/inhands/guns/machineguns_right_1.dmi b/icons/mob/inhands/guns/machineguns_right_1.dmi new file mode 100644 index 0000000000000..3b9529351dfc7 Binary files /dev/null and b/icons/mob/inhands/guns/machineguns_right_1.dmi differ diff --git a/icons/mob/inhands/guns/machineguns_right_64.dmi b/icons/mob/inhands/guns/machineguns_right_64.dmi new file mode 100644 index 0000000000000..b9f9148ba6cc0 Binary files /dev/null and b/icons/mob/inhands/guns/machineguns_right_64.dmi differ diff --git a/icons/mob/inhands/guns/marksman_left_1.dmi b/icons/mob/inhands/guns/marksman_left_1.dmi new file mode 100644 index 0000000000000..68ec057a0f0e1 Binary files /dev/null and b/icons/mob/inhands/guns/marksman_left_1.dmi differ diff --git a/icons/mob/inhands/guns/marksman_left_64.dmi b/icons/mob/inhands/guns/marksman_left_64.dmi new file mode 100644 index 0000000000000..101221e26a73f Binary files /dev/null and b/icons/mob/inhands/guns/marksman_left_64.dmi differ diff --git a/icons/mob/inhands/guns/marksman_right_1.dmi b/icons/mob/inhands/guns/marksman_right_1.dmi new file mode 100644 index 0000000000000..71352003e6c39 Binary files /dev/null and b/icons/mob/inhands/guns/marksman_right_1.dmi differ diff --git a/icons/mob/inhands/guns/marksman_right_64.dmi b/icons/mob/inhands/guns/marksman_right_64.dmi new file mode 100644 index 0000000000000..7df069eee7a30 Binary files /dev/null and b/icons/mob/inhands/guns/marksman_right_64.dmi differ diff --git a/icons/mob/inhands/guns/misc_left_1.dmi b/icons/mob/inhands/guns/misc_left_1.dmi new file mode 100644 index 0000000000000..732c221feeca9 Binary files /dev/null and b/icons/mob/inhands/guns/misc_left_1.dmi differ diff --git a/icons/mob/inhands/guns/misc_right_1.dmi b/icons/mob/inhands/guns/misc_right_1.dmi new file mode 100644 index 0000000000000..0b59749f80baa Binary files /dev/null and b/icons/mob/inhands/guns/misc_right_1.dmi differ diff --git a/icons/mob/inhands/guns/pistols_left_1.dmi b/icons/mob/inhands/guns/pistols_left_1.dmi new file mode 100644 index 0000000000000..287d47636a96b Binary files /dev/null and b/icons/mob/inhands/guns/pistols_left_1.dmi differ diff --git a/icons/mob/inhands/guns/pistols_right_1.dmi b/icons/mob/inhands/guns/pistols_right_1.dmi new file mode 100644 index 0000000000000..861a569973ca4 Binary files /dev/null and b/icons/mob/inhands/guns/pistols_right_1.dmi differ diff --git a/icons/mob/inhands/guns/plasma_left_1.dmi b/icons/mob/inhands/guns/plasma_left_1.dmi new file mode 100644 index 0000000000000..61912e6f42515 Binary files /dev/null and b/icons/mob/inhands/guns/plasma_left_1.dmi differ diff --git a/icons/mob/inhands/guns/plasma_right_1.dmi b/icons/mob/inhands/guns/plasma_right_1.dmi new file mode 100644 index 0000000000000..86d866798daa3 Binary files /dev/null and b/icons/mob/inhands/guns/plasma_right_1.dmi differ diff --git a/icons/mob/inhands/guns/rifles_left_1.dmi b/icons/mob/inhands/guns/rifles_left_1.dmi new file mode 100644 index 0000000000000..26d5d5832dd3d Binary files /dev/null and b/icons/mob/inhands/guns/rifles_left_1.dmi differ diff --git a/icons/mob/inhands/guns/rifles_left_64.dmi b/icons/mob/inhands/guns/rifles_left_64.dmi new file mode 100644 index 0000000000000..6ab248480cf64 Binary files /dev/null and b/icons/mob/inhands/guns/rifles_left_64.dmi differ diff --git a/icons/mob/inhands/guns/rifles_right_1.dmi b/icons/mob/inhands/guns/rifles_right_1.dmi new file mode 100644 index 0000000000000..45a36ddda3ac1 Binary files /dev/null and b/icons/mob/inhands/guns/rifles_right_1.dmi differ diff --git a/icons/mob/inhands/guns/rifles_right_64.dmi b/icons/mob/inhands/guns/rifles_right_64.dmi new file mode 100644 index 0000000000000..69c8f8fd025cc Binary files /dev/null and b/icons/mob/inhands/guns/rifles_right_64.dmi differ diff --git a/icons/mob/inhands/guns/shotguns_left_1.dmi b/icons/mob/inhands/guns/shotguns_left_1.dmi new file mode 100644 index 0000000000000..5bd6a38abef1c Binary files /dev/null and b/icons/mob/inhands/guns/shotguns_left_1.dmi differ diff --git a/icons/mob/inhands/guns/shotguns_right_1.dmi b/icons/mob/inhands/guns/shotguns_right_1.dmi new file mode 100644 index 0000000000000..061566b15e233 Binary files /dev/null and b/icons/mob/inhands/guns/shotguns_right_1.dmi differ diff --git a/icons/mob/inhands/guns/special_left_1.dmi b/icons/mob/inhands/guns/special_left_1.dmi new file mode 100644 index 0000000000000..af6a5c97f8571 Binary files /dev/null and b/icons/mob/inhands/guns/special_left_1.dmi differ diff --git a/icons/mob/inhands/guns/special_left_64.dmi b/icons/mob/inhands/guns/special_left_64.dmi new file mode 100644 index 0000000000000..1338e360d6514 Binary files /dev/null and b/icons/mob/inhands/guns/special_left_64.dmi differ diff --git a/icons/mob/inhands/guns/special_right_1.dmi b/icons/mob/inhands/guns/special_right_1.dmi new file mode 100644 index 0000000000000..2d9e4ac81c970 Binary files /dev/null and b/icons/mob/inhands/guns/special_right_1.dmi differ diff --git a/icons/mob/inhands/guns/special_right_64.dmi b/icons/mob/inhands/guns/special_right_64.dmi new file mode 100644 index 0000000000000..54d8ad8ffe54f Binary files /dev/null and b/icons/mob/inhands/guns/special_right_64.dmi differ diff --git a/icons/mob/inhands/guns/submachineguns_left_1.dmi b/icons/mob/inhands/guns/submachineguns_left_1.dmi new file mode 100644 index 0000000000000..404426f847eb2 Binary files /dev/null and b/icons/mob/inhands/guns/submachineguns_left_1.dmi differ diff --git a/icons/mob/inhands/guns/submachineguns_left_64.dmi b/icons/mob/inhands/guns/submachineguns_left_64.dmi new file mode 100644 index 0000000000000..e76ab7df6db70 Binary files /dev/null and b/icons/mob/inhands/guns/submachineguns_left_64.dmi differ diff --git a/icons/mob/inhands/guns/submachineguns_right_1.dmi b/icons/mob/inhands/guns/submachineguns_right_1.dmi new file mode 100644 index 0000000000000..e0f21d2326878 Binary files /dev/null and b/icons/mob/inhands/guns/submachineguns_right_1.dmi differ diff --git a/icons/mob/inhands/guns/submachineguns_right_64.dmi b/icons/mob/inhands/guns/submachineguns_right_64.dmi new file mode 100644 index 0000000000000..69d8bdbe2d44a Binary files /dev/null and b/icons/mob/inhands/guns/submachineguns_right_64.dmi differ diff --git a/icons/mob/inhands/items/items_left.dmi b/icons/mob/inhands/items/items_left.dmi new file mode 100644 index 0000000000000..5f50ac05e6d67 Binary files /dev/null and b/icons/mob/inhands/items/items_left.dmi differ diff --git a/icons/mob/inhands/items/items_right.dmi b/icons/mob/inhands/items/items_right.dmi new file mode 100644 index 0000000000000..d12197ddde0eb Binary files /dev/null and b/icons/mob/inhands/items/items_right.dmi differ diff --git a/icons/mob/inhands/weapons/grenades_left.dmi b/icons/mob/inhands/weapons/grenades_left.dmi index 74da406e9da36..718198460bc74 100644 Binary files a/icons/mob/inhands/weapons/grenades_left.dmi and b/icons/mob/inhands/weapons/grenades_left.dmi differ diff --git a/icons/mob/inhands/weapons/grenades_right.dmi b/icons/mob/inhands/weapons/grenades_right.dmi index ad2fc4be6c8d7..1ba094f47015b 100644 Binary files a/icons/mob/inhands/weapons/grenades_right.dmi and b/icons/mob/inhands/weapons/grenades_right.dmi differ diff --git a/icons/mob/items_lefthand_1.dmi b/icons/mob/items_lefthand_1.dmi deleted file mode 100644 index 09aa15cb4cfe1..0000000000000 Binary files a/icons/mob/items_lefthand_1.dmi and /dev/null differ diff --git a/icons/mob/items_lefthand_64.dmi b/icons/mob/items_lefthand_64.dmi deleted file mode 100644 index 6d5b89565552c..0000000000000 Binary files a/icons/mob/items_lefthand_64.dmi and /dev/null differ diff --git a/icons/mob/items_righthand_1.dmi b/icons/mob/items_righthand_1.dmi deleted file mode 100644 index 7bf38beb3b9c6..0000000000000 Binary files a/icons/mob/items_righthand_1.dmi and /dev/null differ diff --git a/icons/mob/items_righthand_64.dmi b/icons/mob/items_righthand_64.dmi deleted file mode 100644 index 9bef53ff1d220..0000000000000 Binary files a/icons/mob/items_righthand_64.dmi and /dev/null differ diff --git a/icons/obj/items/ammo.dmi b/icons/obj/items/ammo.dmi index a6bf58e096678..a50220b5cd85b 100644 Binary files a/icons/obj/items/ammo.dmi and b/icons/obj/items/ammo.dmi differ diff --git a/icons/obj/items/grenade.dmi b/icons/obj/items/grenade.dmi index 44fb86f30fa9b..107deed1f3ab1 100644 Binary files a/icons/obj/items/grenade.dmi and b/icons/obj/items/grenade.dmi differ diff --git a/icons/obj/items/gun.dmi b/icons/obj/items/gun.dmi deleted file mode 100644 index c5b041053a51e..0000000000000 Binary files a/icons/obj/items/gun.dmi and /dev/null differ diff --git a/icons/obj/items/guns/energy.dmi b/icons/obj/items/guns/energy.dmi new file mode 100644 index 0000000000000..10febbe140d1c Binary files /dev/null and b/icons/obj/items/guns/energy.dmi differ diff --git a/icons/obj/items/guns/energy64.dmi b/icons/obj/items/guns/energy64.dmi new file mode 100644 index 0000000000000..b052ae3b8f735 Binary files /dev/null and b/icons/obj/items/guns/energy64.dmi differ diff --git a/icons/obj/items/guns/machineguns.dmi b/icons/obj/items/guns/machineguns.dmi new file mode 100644 index 0000000000000..cb9148e15dc33 Binary files /dev/null and b/icons/obj/items/guns/machineguns.dmi differ diff --git a/icons/obj/items/guns/machineguns64.dmi b/icons/obj/items/guns/machineguns64.dmi new file mode 100644 index 0000000000000..535c5e664d45a Binary files /dev/null and b/icons/obj/items/guns/machineguns64.dmi differ diff --git a/icons/obj/items/guns/marksman.dmi b/icons/obj/items/guns/marksman.dmi new file mode 100644 index 0000000000000..27c83f42ef00d Binary files /dev/null and b/icons/obj/items/guns/marksman.dmi differ diff --git a/icons/obj/items/guns/marksman64.dmi b/icons/obj/items/guns/marksman64.dmi new file mode 100644 index 0000000000000..adffac40d8f38 Binary files /dev/null and b/icons/obj/items/guns/marksman64.dmi differ diff --git a/icons/obj/items/guns/pistols.dmi b/icons/obj/items/guns/pistols.dmi new file mode 100644 index 0000000000000..ddba100602eee Binary files /dev/null and b/icons/obj/items/guns/pistols.dmi differ diff --git a/icons/obj/items/guns/pistols64.dmi b/icons/obj/items/guns/pistols64.dmi new file mode 100644 index 0000000000000..e5d5a9db5a744 Binary files /dev/null and b/icons/obj/items/guns/pistols64.dmi differ diff --git a/icons/Marine/marine-plasmaguns.dmi b/icons/obj/items/guns/plasma64.dmi similarity index 100% rename from icons/Marine/marine-plasmaguns.dmi rename to icons/obj/items/guns/plasma64.dmi diff --git a/icons/obj/items/guns/rifles.dmi b/icons/obj/items/guns/rifles.dmi new file mode 100644 index 0000000000000..cfc00a744f66d Binary files /dev/null and b/icons/obj/items/guns/rifles.dmi differ diff --git a/icons/obj/items/guns/rifles64.dmi b/icons/obj/items/guns/rifles64.dmi new file mode 100644 index 0000000000000..b6aac4b6be09d Binary files /dev/null and b/icons/obj/items/guns/rifles64.dmi differ diff --git a/icons/obj/items/guns/shotguns.dmi b/icons/obj/items/guns/shotguns.dmi new file mode 100644 index 0000000000000..9de51ea635e12 Binary files /dev/null and b/icons/obj/items/guns/shotguns.dmi differ diff --git a/icons/obj/items/guns/shotguns64.dmi b/icons/obj/items/guns/shotguns64.dmi new file mode 100644 index 0000000000000..d228de1d60a94 Binary files /dev/null and b/icons/obj/items/guns/shotguns64.dmi differ diff --git a/icons/obj/items/guns/special.dmi b/icons/obj/items/guns/special.dmi new file mode 100644 index 0000000000000..e20f5d9fd6310 Binary files /dev/null and b/icons/obj/items/guns/special.dmi differ diff --git a/icons/obj/items/guns/special64.dmi b/icons/obj/items/guns/special64.dmi new file mode 100644 index 0000000000000..673eb55dd7d52 Binary files /dev/null and b/icons/obj/items/guns/special64.dmi differ diff --git a/icons/obj/items/guns/submachineguns.dmi b/icons/obj/items/guns/submachineguns.dmi new file mode 100644 index 0000000000000..f979017517383 Binary files /dev/null and b/icons/obj/items/guns/submachineguns.dmi differ diff --git a/icons/obj/items/guns/submachineguns64.dmi b/icons/obj/items/guns/submachineguns64.dmi new file mode 100644 index 0000000000000..ef968b168b979 Binary files /dev/null and b/icons/obj/items/guns/submachineguns64.dmi differ diff --git a/icons/obj/items/items_mini.dmi b/icons/obj/items/items_mini.dmi index d68597ac21f2a..582a8719be71a 100644 Binary files a/icons/obj/items/items_mini.dmi and b/icons/obj/items/items_mini.dmi differ diff --git a/icons/obj/items/storage/storage_boxes.dmi b/icons/obj/items/storage/storage_boxes.dmi index 602abbcd7a721..5abdb53ffd6ce 100644 Binary files a/icons/obj/items/storage/storage_boxes.dmi and b/icons/obj/items/storage/storage_boxes.dmi differ diff --git a/icons/obj/items/surgery_tools.dmi b/icons/obj/items/surgery_tools.dmi index 7256322e703ae..ed66a84eb4b52 100644 Binary files a/icons/obj/items/surgery_tools.dmi and b/icons/obj/items/surgery_tools.dmi differ diff --git a/sound/weapons/burst_phaser2.ogg b/sound/weapons/burst_phaser2.ogg new file mode 100644 index 0000000000000..53758c025adaa Binary files /dev/null and b/sound/weapons/burst_phaser2.ogg differ diff --git a/sound/weapons/guns/fire/skorpevo.ogg b/sound/weapons/guns/fire/skorpevo.ogg index feaa709b05122..5a9ad10c1019d 100644 Binary files a/sound/weapons/guns/fire/skorpevo.ogg and b/sound/weapons/guns/fire/skorpevo.ogg differ diff --git a/tgmc.dme b/tgmc.dme index c12b2198937a0..defbb042e9d2d 100644 --- a/tgmc.dme +++ b/tgmc.dme @@ -814,6 +814,7 @@ #include "code\game\objects\items\explosives\explosive.dm" #include "code\game\objects\items\explosives\mine.dm" #include "code\game\objects\items\explosives\plastique.dm" +#include "code\game\objects\items\explosives\grenades\bullet_grenade.dm" #include "code\game\objects\items\explosives\grenades\chem_grenade.dm" #include "code\game\objects\items\explosives\grenades\emgrenade.dm" #include "code\game\objects\items\explosives\grenades\flashbang.dm" @@ -1976,6 +1977,7 @@ #include "code\modules\tgui\tgui_window.dm" #include "code\modules\tgui\states\access.dm" #include "code\modules\tgui\states\admin.dm" +#include "code\modules\tgui\states\alamo.dm" #include "code\modules\tgui\states\always.dm" #include "code\modules\tgui\states\conscious.dm" #include "code\modules\tgui\states\contained.dm" diff --git a/tgui/packages/tgui-panel/styles/tgchat/chat-dark.scss b/tgui/packages/tgui-panel/styles/tgchat/chat-dark.scss index dbc7b67d8f7bb..020f3c23077d5 100644 --- a/tgui/packages/tgui-panel/styles/tgchat/chat-dark.scss +++ b/tgui/packages/tgui-panel/styles/tgchat/chat-dark.scss @@ -3,6 +3,9 @@ * SPDX-License-Identifier: MIT */ +@use 'sass:map'; +@use 'sass:color'; + em { font-style: normal; font-weight: bold; @@ -1022,38 +1025,118 @@ h2.alert { border-bottom: 1px dashed #fff; } -.faction_alert { - background: #4d0000; - margin: 0.5em; - padding: 0.5em 0.5em 0.5em 0.5em; - color: #ffffff; - font-weight: bold; - display: flex; - flex-direction: column; - background-image: repeating-linear-gradient( - -45deg, - transparent, - transparent 10px, - #420000 10px, - #420000 20px - ); -} +$alert-stripe-colors: ( + 'default': #00283a, + 'green': #003d00, + 'blue': #00283a, + 'pink': #30001b, + 'yellow': #574a00, + 'orange': #593400, + 'red': #420000, + 'purple': #2c0030, + 'grey': #252525, +); + +$alert-stripe-alternate-colors: ( + 'default': #003045, + 'green': #004700, + 'blue': #003045, + 'pink': #400025, + 'yellow': #4d4100, + 'orange': #6b4200, + 'red': #520000, + 'purple': #38003d, + 'grey': #292929, +); + +$alert-major-header-colors: ( + 'default': #33d5ff, + 'green': #00ff80, + 'blue': #33d5ff, + 'pink': #ff5297, + 'yellow': #fff4e0, + 'orange': #feefe7, + 'red': #ff5297, + 'purple': #c7a1f7, + 'grey': #ff5297, +); + +$alert-subheader-header-colors: ( + 'default': #ff5297, + 'green': #ff85b5, + 'blue': #ff5297, + 'pink': #33d5ff, + 'yellow': #33d5ff, + 'orange': #33d5ff, + 'red': #33d5ff, + 'purple': #33d5ff, + 'grey': #33d5ff, +); + +$border-width: 4; + +$border-width-px: $border-width * 1px; + .faction_alert_text { - color: #ffffff; - background: #240000; - padding: 1em 1em 1em 1em; + background: #202020; + padding: 0.5rem 0.5rem; } .faction_alert_subtitle { - color: #ffffff; - padding: 0.5em 0.5em 0.5em 0.5em; + padding: 0 0.5rem; + padding-top: 0.25rem; + font-size: 125%; } .faction_alert_title { - color: #ffffff; - padding: 0.35em 0.35em 0 0.35em; + padding: 0 0.5rem; font-size: 185%; } .faction_alert_minortitle { - color: #ffffff; - padding: 0.35em 0.35em 0.35em 0.35em; - font-size: 135%; + padding: 0 0.5rem; + font-size: 150%; +} +.alert_header { + padding: 0.5rem 0; + display: flex; + flex-direction: column; +} + +@each $color-name, $color-value in $alert-stripe-colors { + .faction_alert_#{$color-name} { + color: #ffffff; + box-shadow: none; + font-weight: bold; + margin: 1rem 0 1rem 0; + padding: 0; + display: flex; + flex-direction: column; + border-image: repeating-linear-gradient( + -45deg, + map.get($alert-stripe-alternate-colors, $color-name), + map.get($alert-stripe-alternate-colors, $color-name) 10px, + $color-value 10px, + $color-value 20px + ); + border-image-slice: $border-width fill; + border-width: $border-width-px; + border-image-width: $border-width-px; + border-image-outset: 0 0 0 0; + border-image-repeat: repeat repeat; + border-style: solid; + } + + .faction_alert_#{$color-name} .faction_alert_title { + color: map.get($alert-major-header-colors, $color-name); + } + + .faction_alert_#{$color-name} .faction_alert_minortitle { + color: map.get($alert-major-header-colors, $color-name); + } + + .faction_alert_#{$color-name} .faction_alert_subtitle { + color: map.get($alert-subheader-header-colors, $color-name); + } + + .faction_alert_#{$color-name} .faction_alert_text { + background-color: darken(map.get($alert-stripe-colors, $color-name), 5); + } } diff --git a/tgui/packages/tgui-panel/styles/tgchat/chat-light.scss b/tgui/packages/tgui-panel/styles/tgchat/chat-light.scss index cfe9e35a5c22f..6ec78262c511d 100644 --- a/tgui/packages/tgui-panel/styles/tgchat/chat-light.scss +++ b/tgui/packages/tgui-panel/styles/tgchat/chat-light.scss @@ -3,6 +3,9 @@ * SPDX-License-Identifier: MIT */ +@use 'sass:map'; +@use 'sass:color'; + html, body { padding: 0; @@ -1055,38 +1058,122 @@ h2.alert { border-bottom: 1px dashed #000; } -.faction_alert { - background: #ffadad; - margin: 0.5em; - padding: 0.5em 0.5em 0.5em 0.5em; - color: #cecece; - font-weight: bold; - display: flex; - flex-direction: column; - background-image: repeating-linear-gradient( - -45deg, - transparent, - transparent 10px, - #ff9999 10px, - #ff9999 20px - ); -} +$alert-stripe-colors: ( + 'default': #b3bfff, + 'green': #adffad, + 'blue': #b3bfff, + 'pink': #ffb3df, + 'yellow': #fff3b3, + 'orange': #ffe2b3, + 'red': #ffb3b3, + 'purple': #fac2ff, + 'grey': #e3e3e3, +); + +$alert-stripe-alternate-colors: ( + 'default': #bdc8ff, + 'green': #bdffbd, + 'blue': #bdc8ff, + 'pink': #ffc2e5, + 'yellow': #fff5c2, + 'orange': #ffe8c2, + 'red': #ffc2c2, + 'purple': #fbd1ff, + 'grey': #ebebeb, +); + +$alert-major-header-colors: ( + 'default': #003061, + 'green': #005229, + 'blue': #003061, + 'pink': #800033, + 'yellow': #754900, + 'orange': #823208, + 'red': #800029, + 'purple': #450d8c, + 'grey': #800033, +); + +$alert-subheader-header-colors: ( + 'default': #6b0020, + 'green': #6b0020, + 'blue': #6b0020, + 'pink': #002c85, + 'yellow': #002c85, + 'orange': #002c85, + 'red': #002c85, + 'purple': #002c85, + 'grey': #002c85, +); + +$border-width: 4; + +$border-width-px: $border-width * 1px; + .faction_alert_text { - color: #0e0e0e; - background: #fcc3c3; - padding: 1em 1em 1em 1em; + color: #202020; + background: #eaeaea; + padding: 0.5rem 0.5rem; } .faction_alert_subtitle { - color: #000000; - padding: 0.5em 0.5em 0.5em 0.5em; + padding: 0 0.5rem; + padding-top: 0.25rem; + font-size: 125%; } .faction_alert_title { - color: #000000; - padding: 0.35em 0.35em 0 0.35em; + padding: 0 0.5rem; font-size: 185%; } .faction_alert_minortitle { - color: #000000; - padding: 0.35em 0.35em 0.35em 0.35em; - font-size: 135%; + padding: 0 0.5rem; + font-size: 150%; +} +.alert_header { + padding: 0.5rem 0; + display: flex; + flex-direction: column; +} + +@each $color-name, $color-value in $alert-stripe-colors { + .faction_alert_#{$color-name} { + color: #ffffff; + box-shadow: none; + font-weight: bold; + margin: 1rem 0 1rem 0; + padding: 0; + display: flex; + flex-direction: column; + border-image: repeating-linear-gradient( + -45deg, + map.get($alert-stripe-alternate-colors, $color-name), + map.get($alert-stripe-alternate-colors, $color-name) 10px, + $color-value 10px, + $color-value 20px + ); + border-image-slice: $border-width fill; + border-width: $border-width-px; + border-image-width: $border-width-px; + border-image-outset: 0 0 0 0; + border-image-repeat: repeat repeat; + border-style: solid; + } + + .faction_alert_#{$color-name} .faction_alert_title { + color: map.get($alert-major-header-colors, $color-name); + } + + .faction_alert_#{$color-name} .faction_alert_minortitle { + color: map.get($alert-major-header-colors, $color-name); + } + + .faction_alert_#{$color-name} .faction_alert_subtitle { + color: map.get($alert-subheader-header-colors, $color-name); + } + + .faction_alert_#{$color-name} .faction_alert_text { + background-color: lighten( + map.get($alert-stripe-alternate-colors, $color-name), + 5 + ); + } } diff --git a/tgui/packages/tgui/interfaces/MarineDropship.jsx b/tgui/packages/tgui/interfaces/MarineDropship.jsx index 7aeff6a4acd7d..1c6592ee021d7 100644 --- a/tgui/packages/tgui/interfaces/MarineDropship.jsx +++ b/tgui/packages/tgui/interfaces/MarineDropship.jsx @@ -13,18 +13,27 @@ export const MarineDropship = (props) => { const { act, data } = useBackend(); return ( - - - {!data.hijack_state ? ( - - POSSIBLE HIJACK - SYSTEMS REBOOTING... - - ) : ( - - )} - - + <> + {data.is_human ? ( + + + {!data.hijack_state ? ( + + POSSIBLE HIJACK + SYSTEMS REBOOTING... + + ) : ( + + )} + + + ) : ( + + + + )} + ; + ); }; @@ -136,3 +145,26 @@ const NormalOperation = (props) => { ); }; + +const CorruptedOperation = (props) => { + const { act, data } = useBackend(); + return ( +
+ + + Status: {data.ship_status} + + + + + + + + +
+ ); +};