diff --git a/_maps/map_files/generic/CentCom.dmm b/_maps/map_files/generic/CentCom.dmm index 57f4dcc7748..07ced7373d8 100644 --- a/_maps/map_files/generic/CentCom.dmm +++ b/_maps/map_files/generic/CentCom.dmm @@ -5958,10 +5958,7 @@ /area/centcom/central_command_areas/evacuation) "Cg" = ( /obj/item/cardboard_cutout{ - desc = "They seem to be ignoring you... Typical."; - dir = 1; - icon_state = "cutout_ntsec"; - name = "Private Security Officer" + starting_cutout = "Private Security Officer" }, /obj/effect/turf_decal/tile/red{ dir = 1 @@ -8855,9 +8852,7 @@ /area/centcom/central_command_areas/admin) "UA" = ( /obj/item/cardboard_cutout{ - desc = "They seem to be ignoring you... Typical."; - icon_state = "cutout_ntsec"; - name = "Private Security Officer" + starting_cutout = "Private Security Officer" }, /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark, diff --git a/_maps/shuttles/whiteship_box.dmm b/_maps/shuttles/whiteship_box.dmm index ef24e8a4cb0..35f377df0f2 100644 --- a/_maps/shuttles/whiteship_box.dmm +++ b/_maps/shuttles/whiteship_box.dmm @@ -301,7 +301,7 @@ melee_damage_lower = 11; melee_damage_upper = 11; name = "Rotting Carcass"; - zombiejob = "Assistant" + outfit = /datum/outfit/corpse_assistant }, /turf/open/floor/iron/white/corner{ dir = 1 @@ -1546,7 +1546,7 @@ melee_damage_lower = 11; melee_damage_upper = 11; name = "Rotting Carcass"; - zombiejob = "Assistant" + outfit = /datum/outfit/corpse_assistant }, /turf/open/floor/iron, /area/shuttle/abandoned/medbay) diff --git a/_maps/shuttles/whiteship_personalshuttle.dmm b/_maps/shuttles/whiteship_personalshuttle.dmm index 40a110fb07a..cd6bae93ab7 100644 --- a/_maps/shuttles/whiteship_personalshuttle.dmm +++ b/_maps/shuttles/whiteship_personalshuttle.dmm @@ -74,7 +74,7 @@ melee_damage_lower = 11; melee_damage_upper = 11; name = "Rotting Carcass"; - zombiejob = "Assistant" + outfit = /datum/outfit/corpse_assistant }, /turf/open/floor/plating, /area/shuttle/abandoned/engine) @@ -299,7 +299,7 @@ melee_damage_lower = 11; melee_damage_upper = 11; name = "Rotting Carcass"; - zombiejob = "Assistant" + outfit = /datum/outfit/corpse_assistant }, /turf/open/floor/mineral/titanium, /area/shuttle/abandoned/engine) @@ -531,7 +531,7 @@ melee_damage_lower = 11; melee_damage_upper = 11; name = "Rotting Carcass"; - zombiejob = "Assistant" + outfit = /datum/outfit/corpse_assistant }, /turf/open/floor/mineral/plastitanium, /area/shuttle/abandoned/bridge) diff --git a/_maps/templates/holodeck_spacecheckers.dmm b/_maps/templates/holodeck_spacecheckers.dmm index 6f902980b89..f320d7fe191 100644 --- a/_maps/templates/holodeck_spacecheckers.dmm +++ b/_maps/templates/holodeck_spacecheckers.dmm @@ -3,10 +3,7 @@ /turf/open/floor/holofloor/plating, /area/template_noop) "c" = ( -/obj/item/cardboard_cutout/adaptive{ - icon_state = "cutout_greytide"; - name = "White Pawn" - }, +/obj/structure/chess/checker/whiteman, /turf/open/floor/holofloor/dark, /area/template_noop) "d" = ( @@ -19,37 +16,13 @@ /turf/open/floor/holofloor/plating, /area/template_noop) "g" = ( -/obj/item/cardboard_cutout/adaptive{ - icon_state = "cutout_clown"; - name = "White King" - }, -/obj/item/cardboard_cutout/adaptive{ - icon_state = "cutout_clown"; - name = "White King" - }, -/obj/item/cardboard_cutout/adaptive{ - icon_state = "cutout_clown"; - name = "White King" - }, -/obj/item/cardboard_cutout/adaptive{ - icon_state = "cutout_clown"; - name = "White King" - }, -/obj/item/cardboard_cutout/adaptive{ - icon_state = "cutout_clown"; - name = "White King" - }, /obj/effect/turf_decal/board_letter/h{ dir = 1 }, /turf/open/floor/holofloor/plating, /area/template_noop) "i" = ( -/obj/item/cardboard_cutout/adaptive{ - color = "#9999BB"; - icon_state = "cutout_greytide"; - name = "Black Pawn" - }, +/obj/structure/chess/checker/blackman, /obj/effect/turf_decal/board_letter/f{ dir = 1 }, @@ -81,11 +54,16 @@ }, /turf/open/floor/holofloor/plating, /area/template_noop) +"q" = ( +/obj/structure/chess/checker/whiteking, +/obj/structure/chess/checker/whiteking, +/obj/structure/chess/checker/whiteking, +/obj/structure/chess/checker/whiteking, +/obj/structure/chess/checker/whiteking, +/turf/open/floor/holofloor/plating, +/area/template_noop) "r" = ( -/obj/item/cardboard_cutout/adaptive{ - icon_state = "cutout_greytide"; - name = "White Pawn" - }, +/obj/structure/chess/checker/whiteman, /obj/effect/turf_decal/board_number/two{ dir = 4 }, @@ -122,31 +100,11 @@ /turf/open/floor/holofloor/plating, /area/template_noop) "z" = ( -/obj/item/cardboard_cutout/adaptive{ - color = "#9999BB"; - icon_state = "cutout_clown"; - name = "Black King" - }, -/obj/item/cardboard_cutout/adaptive{ - color = "#9999BB"; - icon_state = "cutout_clown"; - name = "Black King" - }, -/obj/item/cardboard_cutout/adaptive{ - color = "#9999BB"; - icon_state = "cutout_clown"; - name = "Black King" - }, -/obj/item/cardboard_cutout/adaptive{ - color = "#9999BB"; - icon_state = "cutout_clown"; - name = "Black King" - }, -/obj/item/cardboard_cutout/adaptive{ - color = "#9999BB"; - icon_state = "cutout_clown"; - name = "Black King" - }, +/obj/structure/chess/checker/blackking, +/obj/structure/chess/checker/blackking, +/obj/structure/chess/checker/blackking, +/obj/structure/chess/checker/blackking, +/obj/structure/chess/checker/blackking, /turf/open/floor/holofloor/plating, /area/template_noop) "A" = ( @@ -158,11 +116,7 @@ }, /area/template_noop) "B" = ( -/obj/item/cardboard_cutout/adaptive{ - color = "#9999BB"; - icon_state = "cutout_greytide"; - name = "Black Pawn" - }, +/obj/structure/chess/checker/blackman, /obj/effect/turf_decal/board_letter/h{ dir = 1 }, @@ -223,19 +177,11 @@ /turf/open/floor/holofloor/dark, /area/template_noop) "M" = ( -/obj/item/cardboard_cutout/adaptive{ - color = "#9999BB"; - icon_state = "cutout_greytide"; - name = "Black Pawn" - }, +/obj/structure/chess/checker/blackman, /turf/open/floor/holofloor/dark, /area/template_noop) "N" = ( -/obj/item/cardboard_cutout/adaptive{ - color = "#9999BB"; - icon_state = "cutout_greytide"; - name = "Black Pawn" - }, +/obj/structure/chess/checker/blackman, /obj/effect/turf_decal/board_number/six{ dir = 4 }, @@ -256,22 +202,14 @@ /turf/open/floor/holofloor/plating, /area/template_noop) "T" = ( -/obj/item/cardboard_cutout/adaptive{ - color = "#9999BB"; - icon_state = "cutout_greytide"; - name = "Black Pawn" - }, +/obj/structure/chess/checker/blackman, /obj/effect/turf_decal/board_letter/b{ dir = 1 }, /turf/open/floor/holofloor/dark, /area/template_noop) "V" = ( -/obj/item/cardboard_cutout/adaptive{ - color = "#9999BB"; - icon_state = "cutout_greytide"; - name = "Black Pawn" - }, +/obj/structure/chess/checker/blackman, /obj/effect/turf_decal/board_letter/d{ dir = 1 }, @@ -309,7 +247,7 @@ /area/template_noop) (1,1,1) = {" -a +z Y w G @@ -318,7 +256,7 @@ k K v x -a +q "} (2,1,1) = {" a @@ -405,7 +343,7 @@ c P "} (9,1,1) = {" -z +a B n N diff --git a/_maps/templates/shelter_2.dmm b/_maps/templates/shelter_2.dmm index ac4e97b5cf1..ce569cb3391 100644 --- a/_maps/templates/shelter_2.dmm +++ b/_maps/templates/shelter_2.dmm @@ -74,9 +74,7 @@ "o" = ( /obj/structure/chair/comfy/black, /obj/item/cardboard_cutout{ - desc = "A cardboard cutout of a xenomorph maid."; - icon_state = "cutout_lusty"; - name = "lusty xenomorph maid" + starting_cutout = "Xenomorph Maid" }, /obj/structure/window/reinforced/survival_pod{ dir = 1 diff --git a/code/__DEFINES/mobs.dm b/code/__DEFINES/mobs.dm index 468e6ca7208..f58242121c1 100644 --- a/code/__DEFINES/mobs.dm +++ b/code/__DEFINES/mobs.dm @@ -771,3 +771,6 @@ /// Checking flags for [/mob/proc/can_read()] #define READING_CHECK_LITERACY (1<<0) #define READING_CHECK_LIGHT (1<<1) + +/// In dynamic human icon gen we don't replace the held item. +#define NO_REPLACE 0 diff --git a/code/__HELPERS/dynamic_human_icon_gen.dm b/code/__HELPERS/dynamic_human_icon_gen.dm new file mode 100644 index 00000000000..74dbe66458a --- /dev/null +++ b/code/__HELPERS/dynamic_human_icon_gen.dm @@ -0,0 +1,60 @@ +///Global list of all dynamically generated icons, for caching, so we don't have to generate multiple times. +GLOBAL_LIST_EMPTY(dynamic_human_icons) + +///This proc takes an amount of arguments and creates a human dummy using the paths, for visuals you want! +/proc/get_dynamic_human_icon(outfit_path, species_path = /datum/species/human, mob_spawn_path, r_hand, l_hand, bloody_slots = NONE, list/generated_dirs = GLOB.cardinals, animated = TRUE) + if(!species_path) + return FALSE + var/arg_string = "[outfit_path]_[species_path]_[mob_spawn_path]_[l_hand]_[r_hand]_[bloody_slots]_[generated_dirs.Join(",")]" + if(GLOB.dynamic_human_icons[arg_string]) //if already exists in our cache, just return that + return GLOB.dynamic_human_icons[arg_string] + var/mob/living/carbon/human/dummy/consistent/dummy = new() + dummy.set_species(species_path) + dummy.stat = DEAD //this is to avoid side effects of mob spawners + dummy.underwear = "Nude" + dummy.undershirt = "Nude" + dummy.socks = "Nude" + if(outfit_path) + var/datum/outfit/outfit = new outfit_path() + if(r_hand != NO_REPLACE) //we can still override to be null, no replace means just use outfit's + outfit.r_hand = r_hand + if(l_hand != NO_REPLACE) + outfit.l_hand = l_hand + dummy.equipOutfit(outfit) + else if(mob_spawn_path) + var/obj/effect/mob_spawn/spawner = new mob_spawn_path(null, TRUE) + spawner.outfit_override = list() + if(r_hand != NO_REPLACE) + spawner.outfit_override["r_hand"] = r_hand + if(l_hand != NO_REPLACE) + spawner.outfit_override["l_hand"] = l_hand + spawner.special(dummy, dummy) + spawner.equip(dummy) + for(var/obj/item/carried_item in dummy) + if(dummy.is_holding(carried_item)) + var/datum/component/two_handed/twohanded = carried_item.GetComponent(/datum/component/two_handed) + if(twohanded) + twohanded.wield(dummy) + var/datum/component/transforming/transforming = carried_item.GetComponent(/datum/component/transforming) + if(transforming) + transforming.set_active(carried_item) + if(bloody_slots & carried_item.slot_flags) + carried_item.add_mob_blood(dummy) + dummy.update_held_items() + var/icon/output = icon('icons/blanks/32x32.dmi', "nothing") + for(var/direction in generated_dirs) + var/icon/partial = getFlatIcon(dummy, defdir = direction, no_anim = !animated) + output.Insert(partial, dir = direction) + GLOB.dynamic_human_icons[arg_string] = output + qdel(dummy) + return output + +///This exists to apply the icons async, as that cannot be done in Initialize because of possible sleeps. +/proc/apply_dynamic_human_icon(atom/target, outfit_path, species_path = /datum/species/human, mob_spawn_path, r_hand, l_hand, bloody_slots = NONE, generated_dirs = GLOB.cardinals) + INVOKE_ASYNC(GLOBAL_PROC, GLOBAL_PROC_REF(set_dynamic_human_icon), args) + +///This proc gets an argument of a target and runs +/proc/set_dynamic_human_icon(list/arguments) + var/atom/target = arguments[1] //1st argument is the target + var/icon/dynamic_icon = get_dynamic_human_icon(arglist(arguments.Copy(2))) //the rest of the arguments starting from 2 matter to the proc + target.icon = dynamic_icon diff --git a/code/datums/holocall.dm b/code/datums/holocall.dm index 90d8c8f3f7b..6075771046c 100644 --- a/code/datums/holocall.dm +++ b/code/datums/holocall.dm @@ -356,7 +356,7 @@ outfit_type = /datum/outfit/job/captain /datum/preset_holoimage/nanotrasenprivatesecurity - outfit_type = /datum/outfit/nanotrasensoldiercorpse2 + outfit_type = /datum/outfit/nanotrasensoldiercorpse /datum/preset_holoimage/hivebot nonhuman_mobtype = /mob/living/simple_animal/hostile/hivebot diff --git a/code/game/objects/items/cardboard_cutouts.dm b/code/game/objects/items/cardboard_cutouts.dm index ac304b5f8fe..1e113692dbb 100644 --- a/code/game/objects/items/cardboard_cutouts.dm +++ b/code/game/objects/items/cardboard_cutouts.dm @@ -1,3 +1,6 @@ +///Global list of all cardboard cutout datums, cached by name to instance. +GLOBAL_LIST(cardboard_cutouts) + //Cardboard cutouts! They're man-shaped and can be colored with a crayon to look like a human in a certain outfit, although it's limited, discolored, and obvious to more than a cursory glance. /obj/item/cardboard_cutout name = "cardboard cutout" @@ -6,35 +9,26 @@ icon_state = "cutout_basic" w_class = WEIGHT_CLASS_BULKY resistance_flags = FLAMMABLE - /// Possible restyles for the cutout, add an entry in change_appearance() if you add to here - var/list/possible_appearances = list() + item_flags = NO_PIXEL_RANDOM_DROP /// If the cutout is pushed over and has to be righted var/pushed_over = FALSE /// If the cutout actually appears as what it portray and not a discolored version var/deceptive = FALSE + /// What cutout datum we spawn at the start? Uses the name, not the path. + var/starting_cutout /obj/item/cardboard_cutout/Initialize(mapload) . = ..() - possible_appearances = sort_list(list( - JOB_ASSISTANT = image(icon = src.icon, icon_state = "cutout_greytide"), - "Clown" = image(icon = src.icon, icon_state = "cutout_clown"), - "Mime" = image(icon = src.icon, icon_state = "cutout_mime"), - "Traitor" = image(icon = src.icon, icon_state = "cutout_traitor"), - "Nuke Op" = image(icon = src.icon, icon_state = "cutout_fluke"), - "Cultist" = image(icon = src.icon, icon_state = "cutout_cultist"), - "Clockwork Cultist" = image(icon = src.icon, icon_state = "cutout_servant"), - "Revolutionary" = image(icon = src.icon, icon_state = "cutout_viva"), - "Wizard" = image(icon = src.icon, icon_state = "cutout_wizard"), - "Nightmare" = image(icon = src.icon, icon_state = "cutout_nightmare"), - "Xenomorph" = image(icon = src.icon, icon_state = "cutout_fukken_xeno"), - "Xenomorph Maid" = image(icon = src.icon, icon_state = "cutout_lusty"), - "Ash Walker" = image(icon = src.icon, icon_state = "cutout_free_antag"), - "Deathsquad Officer" = image(icon = src.icon, icon_state = "cutout_deathsquad"), - "Ian" = image(icon = src.icon, icon_state = "cutout_ian"), - "Slaughter Demon" = image(icon = 'icons/mob/simple/mob.dmi', icon_state = "daemon"), - "Laughter Demon" = image(icon = 'icons/mob/simple/mob.dmi', icon_state = "bowmon"), - "Private Security Officer" = image(icon = src.icon, icon_state = "cutout_ntsec") - )) + if(!GLOB.cardboard_cutouts) + INVOKE_ASYNC(GLOBAL_PROC, GLOBAL_PROC_REF(generate_cardboard_cutouts)) + if(starting_cutout) + return INITIALIZE_HINT_LATELOAD + +/obj/item/cardboard_cutout/LateInitialize() + var/datum/cardboard_cutout/cutout = GLOB.cardboard_cutouts[starting_cutout] + if(!cutout) + CRASH("Given invalid starting_cutout! [starting_cutout]") + cutout.apply(src) //ATTACK HAND IGNORING PARENT RETURN VALUE /obj/item/cardboard_cutout/attack_hand(mob/living/user, list/modifiers) @@ -100,6 +94,10 @@ * * user The mob choosing a skin of the cardboard cutout */ /obj/item/cardboard_cutout/proc/change_appearance(obj/item/toy/crayon/crayon, mob/living/user) + var/list/possible_appearances = list() + for(var/cutout_name in GLOB.cardboard_cutouts) + var/datum/cardboard_cutout/cutout = GLOB.cardboard_cutouts[cutout_name] + possible_appearances[cutout_name] = image(icon = cutout.applied_icon) var/new_appearance = show_radial_menu(user, src, possible_appearances, custom_check = CALLBACK(src, PROC_REF(check_menu), user, crayon), radius = 36, require_near = TRUE) if(!new_appearance) return FALSE @@ -114,85 +112,8 @@ icon = initial(icon) if(!deceptive) add_atom_colour("#FFD7A7", FIXED_COLOUR_PRIORITY) - switch(new_appearance) - if(JOB_ASSISTANT) - name = "[pick(GLOB.first_names_male)] [pick(GLOB.last_names)]" - desc = "A cardboat cutout of an assistant." - icon_state = "cutout_greytide" - if("Clown") - name = pick(GLOB.clown_names) - desc = "A cardboard cutout of a clown. You get the feeling that it should be in a corner." - icon_state = "cutout_clown" - if("Mime") - name = pick(GLOB.mime_names) - desc = "...(A cardboard cutout of a mime.)" - icon_state = "cutout_mime" - if("Traitor") - name = "[pick("Unknown", "Captain")]" - desc = "A cardboard cutout of a traitor." - icon_state = "cutout_traitor" - if("Nuke Op") - name = "[pick("Unknown", "COMMS", "Telecomms", "AI", "stealthy op", "STEALTH", "sneakybeaky", "MEDIC", "Medic")]" - desc = "A cardboard cutout of a nuclear operative." - icon_state = "cutout_fluke" - if("Cultist") - name = "Unknown" - desc = "A cardboard cutout of a cultist." - icon_state = "cutout_cultist" - if("Clockwork Cultist") - name = "[pick(GLOB.first_names_male)] [pick(GLOB.last_names)]" - desc = "A cardboard cutout of a servant of Ratvar." - icon_state = "cutout_servant" - if("Revolutionary") - name = "Unknown" - desc = "A cardboard cutout of a revolutionary." - icon_state = "cutout_viva" - if("Wizard") - name = "[pick(GLOB.wizard_first)], [pick(GLOB.wizard_second)]" - desc = "A cardboard cutout of a wizard." - icon_state = "cutout_wizard" - if("Nightmare") - name = "[pick(GLOB.nightmare_names)]" - desc = "A cardboard cutout of a nightmare." - icon_state = "cutout_nightmare" - if("Xenomorph") - name = "alien hunter ([rand(1, 999)])" - desc = "A cardboard cutout of a xenomorph." - icon_state = "cutout_fukken_xeno" - if(prob(25)) - alpha = 75 //Spooky sneaking! - if("Xenomorph Maid") - name = "lusty xenomorph maid ([rand(1, 999)])" - desc = "A cardboard cutout of a xenomorph maid." - icon_state = "cutout_lusty" - if("Ash Walker") - name = lizard_name(pick(MALE, FEMALE)) - desc = "A cardboard cutout of an ash walker." - icon_state = "cutout_free_antag" - if("Deathsquad Officer") - name = pick(GLOB.commando_names) - desc = "A cardboard cutout of a death commando." - icon_state = "cutout_deathsquad" - if("Ian") - name = "Ian" - desc = "A cardboard cutout of the HoP's beloved corgi." - icon_state = "cutout_ian" - if("Slaughter Demon") - name = "slaughter demon" - desc = "A cardboard cutout of a slaughter demon." - icon = 'icons/mob/simple/mob.dmi' - icon_state = "daemon" - if("Laughter Demon") - name = "laughter demon" - desc = "A cardboard cutout of a laughter demon." - icon = 'icons/mob/simple/mob.dmi' - icon_state = "bowmon" - if("Private Security Officer") - name = "Private Security Officer" - desc = "A cardboard cutout of a private security officer." - icon_state = "cutout_ntsec" - else - return FALSE + var/datum/cardboard_cutout/cutout = GLOB.cardboard_cutouts[new_appearance] + cutout.apply(src) return TRUE /** @@ -219,9 +140,195 @@ return FALSE return TRUE -/obj/item/cardboard_cutout/setDir(newdir) - newdir = SOUTH - return ..() - /obj/item/cardboard_cutout/adaptive //Purchased by Syndicate agents, these cutouts are indistinguishable from normal cutouts but aren't discolored when their appearance is changed deceptive = TRUE + +///Proc that returns a list of all the cardboard cutouts (we create all subtypes) to be used in the global list. +/proc/generate_cardboard_cutouts() + var/list/cutouts = list() + for(var/datum/cardboard_cutout/cutout as anything in subtypesof(/datum/cardboard_cutout)) + cutout = new cutout() + cutouts[cutout.name] = cutout + GLOB.cardboard_cutouts = cutouts + +/datum/cardboard_cutout + /// Name of the cutout, used for radial selection and the global list. + var/name = "Boardjak" + /// The icon we apply to the cardboard cutout. + var/applied_icon = null + /// The base name we actually give to to the cardboard cutout. Can be overridden in get_name(). + var/applied_name = "boardjak" + /// The desc we give to the cardboard cutout. + var/applied_desc = "A cardboard cutout of a boardjak." + /// If we're not using dynamic generation (for non-humans), we can set a direct icon to give. + var/direct_icon = null + /// Same as direct_icon, but icon_state! + var/direct_icon_state = "" + /// If we're using dynamic generation, the outfit the generated mob will have. + var/outfit = null + /// If we're using dynamic generation, the right hand item the generated mob will have. + var/r_hand = NO_REPLACE + /// If we're using dynamic generation, the left hand item the generated mob will have. + var/l_hand = NO_REPLACE + /// If we're using dynamic generation, the mob spawner the generated mob will base visuals from. + var/mob_spawner = null + /// If we're using dynamic generation, the species of the generated mob. + var/species = /datum/species/human + +/datum/cardboard_cutout/New() + . = ..() + if(direct_icon) + applied_icon = icon(direct_icon, direct_icon_state, dir = SOUTH, frame = 1) + else + applied_icon = get_dynamic_human_icon(outfit, species, mob_spawner, l_hand, r_hand, generated_dirs = list(SOUTH), animated = FALSE) + +/// This proc returns the name that the cardboard cutout item will use. +/datum/cardboard_cutout/proc/get_name() + return applied_name + +/// This proc sets the cardboard cutout item's vars. +/datum/cardboard_cutout/proc/apply(obj/item/cardboard_cutout/cutouts) + cutouts.icon = applied_icon + cutouts.name = get_name() + cutouts.desc = applied_desc + +/datum/cardboard_cutout/assistant + name = "Assistant" + applied_name = "John Greytide" + applied_desc = "A cardboard cutout of an assistant." + mob_spawner = /obj/effect/mob_spawn/corpse/human/generic_assistant + +/datum/cardboard_cutout/assistant/get_name() + return "[pick(GLOB.first_names_male)] [pick(GLOB.last_names)]" + +/datum/cardboard_cutout/clown + name = "Clown" + applied_name = "HONK" + applied_desc = "A cardboard cutout of a clown. You get the feeling that it should be in a corner." + outfit = /datum/outfit/job/clown + +/datum/cardboard_cutout/clown/get_name() + return pick(GLOB.clown_names) + +/datum/cardboard_cutout/mime + name = "Mime" + applied_name = "..." + applied_desc = "...(A cardboard cutout of a mime.)" + outfit = /datum/outfit/job/mime + +/datum/cardboard_cutout/mime/get_name() + return pick(GLOB.mime_names) + +/datum/cardboard_cutout/traitor + name = "Traitor" + applied_name = "Unknown" + applied_desc = "A cardboard cutout of a traitor." + outfit = /datum/outfit/traitor_cutout + +/datum/cardboard_cutout/traitor/get_name() + return pick("Unknown", "Captain") + +/datum/cardboard_cutout/nuclear_operative + name = "Nuclear Operative" + applied_name = "Unknown" + applied_desc = "A cardboard cutout of a nuclear operative." + outfit = /datum/outfit/syndicate/full + +/datum/cardboard_cutout/nuclear_operative/get_name() + return pick("Unknown", "COMMS", "Telecomms", "AI", "stealthy op", "STEALTH", "sneakybeaky", "MEDIC", "Medic") + +/datum/cardboard_cutout/cultist + name = "Cultist" + applied_name = "Unknown" + applied_desc = "A cardboard cutout of a cultist." + outfit = /datum/outfit/cult_cutout + +/datum/cardboard_cutout/revolutionary + name = "Revolutionary" + applied_name = "Unknown" + applied_desc = "A cardboard cutout of a revolutionary." + outfit = /datum/outfit/rev_cutout + +/datum/cardboard_cutout/wizard + name = "Wizard" + applied_name = "wizard" + applied_desc = "A cardboard cutout of a wizard." + outfit = /datum/outfit/wizard/bookless + +/datum/cardboard_cutout/wizard/get_name() + return "[pick(GLOB.wizard_first)] [pick(GLOB.wizard_second)]" + +/datum/cardboard_cutout/nightmare + name = "Nightmare" + applied_name = "nightmare" + applied_desc = "A cardboard cutout of a nightmare." + species = /datum/species/shadow/nightmare + +/datum/cardboard_cutout/nightmare/get_name() + return pick(GLOB.nightmare_names) + +/datum/cardboard_cutout/xenomorph + name = "Xenomorph" + applied_name = "alien hunter" + applied_desc = "A cardboard cutout of a xenomorph." + direct_icon = 'icons/mob/nonhuman-player/alien.dmi' + direct_icon_state = "alienh" + +/datum/cardboard_cutout/xenomorph/get_name() + return applied_name + " ([rand(1, 999)])" + +/datum/cardboard_cutout/xenomorph_maid + name = "Xenomorph Maid" + applied_name = "lusty xenomorph maid" + applied_desc = "A cardboard cutout of a xenomorph maid." + direct_icon = 'icons/mob/nonhuman-player/alien.dmi' + direct_icon_state = "maid" + +/datum/cardboard_cutout/xenomorph_maid/get_name() + return applied_name + " ([rand(1, 999)])" + +/datum/cardboard_cutout/ash_walker + name = "Ash Walker" + applied_name = "lizard" + applied_desc = "A cardboard cutout of an ash walker." + species = /datum/species/lizard/ashwalker + outfit = /datum/outfit/ashwalker/spear + +/datum/cardboard_cutout/ash_walker/get_name() + return lizard_name(pick(MALE, FEMALE)) + +/datum/cardboard_cutout/death_squad + name = "Deathsquad Officer" + applied_name = "deathsquad officer" + applied_desc = "A cardboard cutout of a death commando." + outfit = /datum/outfit/centcom/death_commando + +/datum/cardboard_cutout/death_squad/get_name() + return pick(GLOB.commando_names) + +/datum/cardboard_cutout/ian + name = "Ian" + applied_name = "Ian" + applied_desc = "A cardboard cutout of the HoP's beloved corgi." + direct_icon = 'icons/mob/simple/pets.dmi' + direct_icon_state = "corgi" + +/datum/cardboard_cutout/slaughter_demon + name = "Slaughter Demon" + applied_name = "slaughter demon" + applied_desc = "A cardboard cutout of a slaughter demon." + direct_icon = 'icons/mob/simple/mob.dmi' + direct_icon_state = "daemon" + +/datum/cardboard_cutout/laughter_demon + name = "Laughter Demon" + applied_name = "laughter demon" + applied_desc = "A cardboard cutout of a laughter demon." + direct_icon = 'icons/mob/simple/mob.dmi' + direct_icon_state = "bowmon" + +/datum/cardboard_cutout/security_officer + name = "Private Security Officer" + applied_name = "Private Security Officer" + applied_desc = "A cardboard cutout of a private security officer." + mob_spawner = /obj/effect/mob_spawn/corpse/human/nanotrasensoldier diff --git a/code/game/objects/items/stacks/sheets/sheet_types.dm b/code/game/objects/items/stacks/sheets/sheet_types.dm index c8613d24d43..2a3d02dcab5 100644 --- a/code/game/objects/items/stacks/sheets/sheet_types.dm +++ b/code/game/objects/items/stacks/sheets/sheet_types.dm @@ -63,6 +63,12 @@ GLOBAL_LIST_INIT(metal_recipes, list ( \ new /datum/stack_recipe("Black Queen", /obj/structure/chess/blackqueen, 2, time = 1 SECONDS, one_per_turf = TRUE, on_solid_ground = TRUE, category = CAT_ENTERTAINMENT), \ new /datum/stack_recipe("Black King", /obj/structure/chess/blackking, 2, time = 1 SECONDS, one_per_turf = TRUE, on_solid_ground = TRUE, category = CAT_ENTERTAINMENT), \ )), + new /datum/stack_recipe_list("checkers pieces", list( \ + new /datum/stack_recipe("White Checker Man", /obj/structure/chess/checker/whiteman, 2, time = 1 SECONDS, one_per_turf = TRUE, on_solid_ground = TRUE, category = CAT_ENTERTAINMENT), \ + new /datum/stack_recipe("White Checker King", /obj/structure/chess/checker/whiteking, 2, time = 1 SECONDS, one_per_turf = TRUE, on_solid_ground = TRUE, category = CAT_ENTERTAINMENT), \ + new /datum/stack_recipe("Black Checker Man", /obj/structure/chess/checker/blackman, 2, time = 1 SECONDS, one_per_turf = TRUE, on_solid_ground = TRUE, category = CAT_ENTERTAINMENT), \ + new /datum/stack_recipe("Black Checker King", /obj/structure/chess/checker/blackking, 2, time = 1 SECONDS, one_per_turf = TRUE, on_solid_ground = TRUE, category = CAT_ENTERTAINMENT), \ + )), null, \ new/datum/stack_recipe("rack parts", /obj/item/rack_parts, category = CAT_FURNITURE), \ new/datum/stack_recipe("closet", /obj/structure/closet, 2, time = 1.5 SECONDS, one_per_turf = TRUE, on_solid_ground = TRUE, category = CAT_FURNITURE), \ diff --git a/code/game/objects/structures/chess.dm b/code/game/objects/structures/chess.dm index 178d522a0fd..4441d758194 100644 --- a/code/game/objects/structures/chess.dm +++ b/code/game/objects/structures/chess.dm @@ -4,7 +4,7 @@ icon = 'icons/obj/chess.dmi' icon_state = "white_pawn" name = "\improper Probably a White Pawn" - desc = "This is weird. Please inform adminstration on how you managed to get the parent chess piece. Thanks!" + desc = "This is weird. Please inform administration on how you managed to get the parent chess piece. Thanks!" max_integrity = 100 /obj/structure/chess/wrench_act(mob/user, obj/item/tool) @@ -80,3 +80,28 @@ name = "\improper Black King" desc = "A black king chess piece. It can move one tile in any direction." icon_state = "black_king" + +/obj/structure/chess/checker + icon_state = "white_checker_man" + name = "\improper Probably a White Checker" + desc = "This is weird. Please inform administration on how you managed to get the parent checker piece. Thanks!" + +/obj/structure/chess/checker/whiteman + name = "\improper White Checker Man" + desc = "A white checker piece. Looks suspiciously like a flattened chess pawn." + icon_state = "white_checker_man" + +/obj/structure/chess/checker/whiteking + name = "\improper White Checker Man" + desc = "A white checker piece. It's stacked!" + icon_state = "white_checker_king" + +/obj/structure/chess/checker/blackman + name = "\improper Black Checker Man" + desc = "A black checker piece. Looks suspiciously like a flattened chess pawn." + icon_state = "black_checker_man" + +/obj/structure/chess/checker/blackking + name = "\improper Black Checker King" + desc = "A black checker piece. It's stacked!" + icon_state = "black_checker_king" diff --git a/code/modules/antagonists/cult/cult.dm b/code/modules/antagonists/cult/cult.dm index a250563da7a..9b50a259805 100644 --- a/code/modules/antagonists/cult/cult.dm +++ b/code/modules/antagonists/cult/cult.dm @@ -571,7 +571,3 @@ equipped.eye_color_left = BLOODCULT_EYE equipped.eye_color_right = BLOODCULT_EYE equipped.update_body() - - var/obj/item/clothing/suit/hooded/hooded = locate() in equipped - hooded.MakeHood() // This is usually created on Initialize, but we run before atoms - hooded.ToggleHood() diff --git a/code/modules/antagonists/heretic/heretic_antag.dm b/code/modules/antagonists/heretic/heretic_antag.dm index 3dbc9f502d1..f66485fb5f5 100644 --- a/code/modules/antagonists/heretic/heretic_antag.dm +++ b/code/modules/antagonists/heretic/heretic_antag.dm @@ -765,8 +765,3 @@ suit = /obj/item/clothing/suit/hooded/cultrobes/eldritch r_hand = /obj/item/melee/touch_attack/mansus_fist - -/datum/outfit/heretic/post_equip(mob/living/carbon/human/equipper, visualsOnly) - var/obj/item/clothing/suit/hooded/hooded = locate() in equipper - hooded.MakeHood() // This is usually created on Initialize, but we run before atoms - hooded.ToggleHood() diff --git a/code/modules/clothing/outfits/standard.dm b/code/modules/clothing/outfits/standard.dm index 75d9e2ab1ba..01ee43f4d29 100644 --- a/code/modules/clothing/outfits/standard.dm +++ b/code/modules/clothing/outfits/standard.dm @@ -103,6 +103,29 @@ head = /obj/item/clothing/head/helmet/redtaghelm shoes = /obj/item/clothing/shoes/sneakers/red +/datum/outfit/traitor_cutout + name = "Traitor Cutout" + + uniform = /obj/item/clothing/under/color/grey + suit = /obj/item/clothing/suit/armor/vest + gloves = /obj/item/clothing/gloves/chief_engineer + mask = /obj/item/clothing/mask/gas + belt = /obj/item/storage/belt + l_hand = /obj/item/melee/energy/sword/saber/red + r_hand = /obj/item/gun/energy/recharge/ebow + shoes = /obj/item/clothing/shoes/magboots/advance + +/datum/outfit/rev_cutout + name = "Revolutionary Cutout" + + uniform = /obj/item/clothing/under/color/grey + back = /obj/item/storage/backpack + gloves = /obj/item/clothing/gloves/color/yellow + mask = /obj/item/clothing/mask/gas + belt = /obj/item/storage/belt + l_hand = /obj/item/melee/baton/security/cattleprod + shoes = /obj/item/clothing/shoes/sneakers/black + /datum/outfit/laser_tag/blue name = "Laser Tag Blue" @@ -248,6 +271,15 @@ shoes = /obj/item/clothing/shoes/cult/alt/ghost l_hand = /obj/item/melee/cultblade/ghost +/datum/outfit/cult_cutout + name = "Cultist Cutout" + + uniform = /obj/item/clothing/under/rank/civilian/chaplain + suit = /obj/item/clothing/suit/hooded/cultrobes/hardened + shoes = /obj/item/clothing/shoes/cult/alt + back = /obj/item/storage/backpack/cultpack + r_hand = /obj/item/melee/cultblade/dagger + /datum/outfit/wizard name = "Blue Wizard" @@ -255,9 +287,9 @@ suit = /obj/item/clothing/suit/wizrobe back = /obj/item/storage/backpack backpack_contents = list( - /obj/item/storage/box/survival = 1, /obj/item/spellbook = 1, -) + ) + box = /obj/item/storage/box/survival ears = /obj/item/radio/headset head = /obj/item/clothing/head/wizard shoes = /obj/item/clothing/shoes/sandal/magic @@ -272,13 +304,20 @@ if(new_spellbook) new_spellbook.owner = wizard.mind +/datum/outfit/wizard/bookless + name = "Wizard - Bookless" + backpack_contents = list() + +/datum/outfit/wizard/bookless/post_equip(mob/living/carbon/human/wizard, visualsOnly) + return + /datum/outfit/wizard/apprentice name = "Wizard Apprentice" r_pocket = /obj/item/teleportation_scroll/apprentice r_hand = null l_hand = null - backpack_contents = list(/obj/item/storage/box/survival = 1) + backpack_contents = list() /datum/outfit/wizard/red name = "Red Wizard" @@ -299,7 +338,7 @@ r_hand = null suit = /obj/item/clothing/suit/wizrobe/red head = /obj/item/clothing/head/wizard/red - backpack_contents = list(/obj/item/storage/box/survival = 1) + backpack_contents = list() /datum/outfit/centcom/soviet name = "Soviet Admiral" diff --git a/code/modules/clothing/suits/toggles.dm b/code/modules/clothing/suits/toggles.dm index 75466c69716..2c32b5137ef 100644 --- a/code/modules/clothing/suits/toggles.dm +++ b/code/modules/clothing/suits/toggles.dm @@ -36,6 +36,11 @@ RemoveHood() return ..() +/obj/item/clothing/suit/hooded/on_outfit_equip(mob/living/carbon/human/outfit_wearer, visuals_only, item_slot) + if(visuals_only) + MakeHood() + ToggleHood() + /obj/item/clothing/suit/hooded/proc/RemoveHood() src.icon_state = "[initial(icon_state)]" hood_up = FALSE diff --git a/code/modules/clothing/suits/wiz_robe.dm b/code/modules/clothing/suits/wiz_robe.dm index 2547b3552b4..3ac885d2829 100644 --- a/code/modules/clothing/suits/wiz_robe.dm +++ b/code/modules/clothing/suits/wiz_robe.dm @@ -70,6 +70,10 @@ flags_inv = HIDEHAIR|HIDEFACIALHAIR dog_fashion = null +/obj/item/clothing/head/wizard/hood + name = "wizard hood" + icon_state = "wizhood" + /obj/item/clothing/suit/wizrobe name = "wizard robe" desc = "A magnificent, gem-lined robe that seems to radiate power." diff --git a/code/modules/hallucination/body.dm b/code/modules/hallucination/body.dm index aeaca25178f..1e9b78f8240 100644 --- a/code/modules/hallucination/body.dm +++ b/code/modules/hallucination/body.dm @@ -151,11 +151,11 @@ body_floats = TRUE /datum/hallucination/body/weird/faceless - body_image_file = 'icons/mob/simple/simple_human.dmi' + body_image_file = 'icons/mob/simple/traders.dmi' body_image_state = "faceless" /datum/hallucination/body/weird/bones - body_image_file = 'icons/mob/simple/simple_human.dmi' + body_image_file = 'icons/mob/simple/traders.dmi' body_image_state = "mrbones" /datum/hallucination/body/weird/freezer diff --git a/code/modules/hallucination/delusions.dm b/code/modules/hallucination/delusions.dm index 543025038c5..391d9ea77a4 100644 --- a/code/modules/hallucination/delusions.dm +++ b/code/modules/hallucination/delusions.dm @@ -18,6 +18,8 @@ var/delusion_icon_file /// The icon state of the delusion image var/delusion_icon_state + /// Do we use a generated icon? If yes no icon file or state needed. + var/dynamic_icon = FALSE /// The name of the delusion image var/delusion_name @@ -94,7 +96,7 @@ return TRUE /datum/hallucination/delusion/proc/make_delusion_image(mob/over_who) - var/image/funny_image = image(delusion_icon_file, over_who, delusion_icon_state) + var/image/funny_image = image(delusion_icon_file, over_who, dynamic_icon ? "" : delusion_icon_state) funny_image.name = delusion_name funny_image.override = TRUE return funny_image @@ -196,27 +198,24 @@ /datum/hallucination/delusion/preset/syndies random_hallucination_weight = 1 - delusion_icon_file = 'icons/mob/simple/simple_human.dmi' - delusion_icon_state = "syndicate_space" + dynamic_icon = TRUE delusion_name = "Syndicate" affects_others = TRUE affects_us = FALSE /datum/hallucination/delusion/preset/syndies/make_delusion_image(mob/over_who) - var/static/list/syndicate_icon_states - - if(!syndicate_icon_states) - syndicate_icon_states = list() - for(var/state in icon_states(delusion_icon_file)) - if(!findtext(state, "syndicate")) - continue - - syndicate_icon_states += state - - if(length(syndicate_icon_states) > 0) - delusion_name = over_who.name - delusion_icon_state = pick(syndicate_icon_states) - else - stack_trace("Hey! The hallucination [type] couldn't find a single icon state to use, it'll be invisible. Correct this.") - + delusion_icon_file = get_dynamic_human_icon( \ + mob_spawn_path = pick( \ + /obj/effect/mob_spawn/corpse/human/syndicatesoldier, \ + /obj/effect/mob_spawn/corpse/human/syndicatecommando, \ + /obj/effect/mob_spawn/corpse/human/syndicatestormtrooper, \ + ), \ + r_hand = pick( \ + /obj/item/knife/combat/survival, \ + /obj/item/melee/energy/sword/saber, \ + /obj/item/gun/ballistic/automatic/pistol, \ + /obj/item/gun/ballistic/automatic/c20r, \ + /obj/item/gun/ballistic/shotgun/bulldog, \ + ), \ + ) return ..() diff --git a/code/modules/jobs/job_types/shaft_miner.dm b/code/modules/jobs/job_types/shaft_miner.dm index b566713ca60..92f4dbc5cbb 100644 --- a/code/modules/jobs/job_types/shaft_miner.dm +++ b/code/modules/jobs/job_types/shaft_miner.dm @@ -72,14 +72,6 @@ mask = /obj/item/clothing/mask/gas/explorer internals_slot = ITEM_SLOT_SUITSTORE -/datum/outfit/job/miner/equipped/post_equip(mob/living/carbon/human/miner, visualsOnly = FALSE) - ..() - if(visualsOnly) - return - if(istype(miner.wear_suit, /obj/item/clothing/suit/hooded)) - var/obj/item/clothing/suit/hooded/explorer_suit = miner.wear_suit - explorer_suit.ToggleHood() - /datum/outfit/job/miner/equipped/mod name = "Shaft Miner (Equipment + MODsuit)" back = /obj/item/mod/control/pre_equipped/mining diff --git a/code/modules/mapfluff/ruins/spaceruin_code/forgottenship.dm b/code/modules/mapfluff/ruins/spaceruin_code/forgottenship.dm index 926a0cc8143..045ab8ec00c 100644 --- a/code/modules/mapfluff/ruins/spaceruin_code/forgottenship.dm +++ b/code/modules/mapfluff/ruins/spaceruin_code/forgottenship.dm @@ -130,25 +130,21 @@ GLOBAL_VAR_INIT(fscpassword, generate_password()) /mob/living/simple_animal/hostile/nanotrasen/ranged/assault name = "Nanotrasen Assault Officer" desc = "Nanotrasen Assault Officer. Contact CentCom if you saw him on your station. Prepare to die, if you've been found near Syndicate property." - icon_state = "nanotrasenrangedassault" - icon_living = "nanotrasenrangedassault" - icon_dead = null - icon_gib = "syndicate_gib" ranged = TRUE rapid = 4 rapid_fire_delay = 1 rapid_melee = 1 retreat_distance = 2 minimum_distance = 4 - casingtype = /obj/item/ammo_casing/c46x30mm - projectilesound = 'sound/weapons/gun/general/heavy_shot_suppressed.ogg' + casingtype = /obj/item/ammo_casing/a556/weak + projectilesound = 'sound/weapons/gun/smg/shot.ogg' loot = list(/obj/effect/mob_spawn/corpse/human/nanotrasenassaultsoldier) + mob_spawner = /obj/effect/mob_spawn/corpse/human/nanotrasenassaultsoldier + held_item = /obj/item/gun/ballistic/automatic/ar /mob/living/simple_animal/hostile/nanotrasen/elite name = "Nanotrasen Elite Assault Officer" desc = "Pray for your life, syndicate. Run while you can." - icon_state = "nanotrasen_ert" - icon_living = "nanotrasen_ert" maxHealth = 150 health = 150 melee_damage_lower = 13 @@ -165,3 +161,5 @@ GLOBAL_VAR_INIT(fscpassword, generate_password()) projectilesound = 'sound/weapons/laser.ogg' loot = list(/obj/effect/gibspawner/human) faction = list(ROLE_DEATHSQUAD) + mob_spawner = /obj/effect/mob_spawn/corpse/human/nanotrasenelitesoldier + held_item = /obj/item/gun/energy/pulse/carbine/lethal diff --git a/code/modules/mapping/mapping_helpers.dm b/code/modules/mapping/mapping_helpers.dm index 60bd0c9761e..fddbf014e22 100644 --- a/code/modules/mapping/mapping_helpers.dm +++ b/code/modules/mapping/mapping_helpers.dm @@ -366,6 +366,47 @@ INITIALIZE_IMMEDIATE(/obj/effect/mapping_helpers/no_lava) . = ..() . += " | trait name: [trait_name]" +///This helper applies dynamic human icons to things on the map +/obj/effect/mapping_helpers/atom_injector/human_icon_injector + name = "Human Icon Injector" + icon_state = "icon" + /// Path of the outfit we give the human. + var/outfit_path + /// Path of the species we give the human. + var/species_path = /datum/species/human + /// Path of the mob spawner we base the human off of. + var/mob_spawn_path + /// Path of the right hand item we give the human. + var/r_hand = NO_REPLACE + /// Path of the left hand item we give the human. + var/l_hand = NO_REPLACE + /// Which slots on the mob should be bloody? + var/bloody_slots = NONE + /// Directions we generate for the mob. + var/generated_dirs = list(NORTH, SOUTH, EAST, WEST) + /// Do we draw more than one frame for the mob? + var/animated = TRUE + +/obj/effect/mapping_helpers/atom_injector/human_icon_injector/check_validity() + if(!ispath(species_path, /datum/species)) + CRASH("Wrong species path in [type] - [species_path] is not a species") + if(outfit_path && !ispath(outfit_path, /datum/outfit)) + CRASH("Wrong outfit path in [type] - [species_path] is not an outfit") + if(mob_spawn_path && !ispath(mob_spawn_path, /obj/effect/mob_spawn)) + CRASH("Wrong mob spawn path in [type] - [mob_spawn_path] is not a mob spawner") + if(l_hand && !ispath(l_hand, /obj/item)) + CRASH("Wrong left hand item path in [type] - [l_hand] is not an item") + if(r_hand && !ispath(r_hand, /obj/item)) + CRASH("Wrong left hand item path in [type] - [r_hand] is not an item") + return TRUE + +/obj/effect/mapping_helpers/atom_injector/human_icon_injector/inject(atom/target) + apply_dynamic_human_icon(target, outfit_path, species_path, mob_spawn_path, r_hand, l_hand, bloody_slots, generated_dirs, animated) + +/obj/effect/mapping_helpers/atom_injector/human_icon_injector/generate_stack_trace() + . = ..() + . += " | outfit path: [outfit_path] | species path: [species_path] | mob spawner path: [mob_spawn_path] | right/left hand path: [r_hand]/[l_hand]" + ///Fetches an external dmi and applies to the target object /obj/effect/mapping_helpers/atom_injector/custom_icon name = "Custom Icon Injector" diff --git a/code/modules/mob/living/basic/syndicate/syndicate.dm b/code/modules/mob/living/basic/syndicate/syndicate.dm index e8eebfae7f6..1c93cf00042 100644 --- a/code/modules/mob/living/basic/syndicate/syndicate.dm +++ b/code/modules/mob/living/basic/syndicate/syndicate.dm @@ -1,18 +1,9 @@ ///////////////Base Mob//////////// -/obj/effect/light_emitter/red_energy_sword //used so there's a combination of both their head light and light coming off the energy sword - set_luminosity = 2 - set_cap = 2.5 - light_color = COLOR_SOFT_RED - /mob/living/basic/syndicate name = "Syndicate Operative" desc = "Death to Nanotrasen." icon = 'icons/mob/simple/simple_human.dmi' - icon_state = "syndicate" - icon_living = "syndicate" - icon_dead = "syndicate_dead" - icon_gib = "syndicate_gib" mob_biotypes = MOB_ORGANIC|MOB_HUMANOID sentience_type = SENTIENCE_HUMANOID maxHealth = 100 @@ -31,24 +22,30 @@ unsuitable_heat_damage = 7.5 faction = list(ROLE_SYNDICATE) ai_controller = /datum/ai_controller/basic_controller/syndicate - + /// Loot this mob drops on death. var/loot = list(/obj/effect/mob_spawn/corpse/human/syndicatesoldier) + /// Path of the mob spawner we base the mob's visuals off of. + var/mob_spawner = /obj/effect/mob_spawn/corpse/human/syndicatesoldier + /// Path of the right hand held item we give to the mob's visuals. + var/r_hand + /// Path of the left hand held item we give to the mob's visuals. + var/l_hand /mob/living/basic/syndicate/Initialize(mapload) . = ..() + apply_dynamic_human_icon(src, mob_spawn_path = mob_spawner, r_hand = r_hand, l_hand = l_hand) if(LAZYLEN(loot)) AddElement(/datum/element/death_drops, loot) AddElement(/datum/element/footstep, footstep_type = FOOTSTEP_MOB_SHOE) /mob/living/basic/syndicate/space - icon_state = "syndicate_space" - icon_living = "syndicate_space" name = "Syndicate Commando" maxHealth = 170 health = 170 loot = list(/obj/effect/gibspawner/human) unsuitable_atmos_damage = 0 minimum_survivable_temperature = 0 + mob_spawner = /obj/effect/mob_spawn/corpse/human/syndicatecommando /mob/living/basic/syndicate/space/Initialize(mapload) . = ..() @@ -56,22 +53,20 @@ set_light(4) /mob/living/basic/syndicate/space/stormtrooper - icon_state = "syndicate_stormtrooper" - icon_living = "syndicate_stormtrooper" name = "Syndicate Stormtrooper" maxHealth = 250 health = 250 + mob_spawner = /obj/effect/mob_spawn/corpse/human/syndicatestormtrooper /mob/living/basic/syndicate/melee //dude with a knife and no shields melee_damage_lower = 15 melee_damage_upper = 15 - icon_state = "syndicate_knife" - icon_living = "syndicate_knife" loot = list(/obj/effect/gibspawner/human) attack_verb_continuous = "slashes" attack_verb_simple = "slash" attack_sound = 'sound/weapons/bladeslice.ogg' attack_vis_effect = ATTACK_EFFECT_SLASH + r_hand = /obj/item/knife/combat/survival var/projectile_deflect_chance = 0 /mob/living/basic/syndicate/melee/bullet_act(obj/projectile/projectile) @@ -81,13 +76,12 @@ return ..() /mob/living/basic/syndicate/melee/space - icon_state = "syndicate_space_knife" - icon_living = "syndicate_space_knife" name = "Syndicate Commando" maxHealth = 170 health = 170 unsuitable_atmos_damage = 0 minimum_survivable_temperature = 0 + mob_spawner = /obj/effect/mob_spawn/corpse/human/syndicatecommando /mob/living/basic/syndicate/melee/space/Initialize(mapload) . = ..() @@ -95,65 +89,53 @@ set_light(4) /mob/living/basic/syndicate/melee/space/stormtrooper - icon_state = "syndicate_stormtrooper_knife" - icon_living = "syndicate_stormtrooper_knife" name = "Syndicate Stormtrooper" maxHealth = 250 health = 250 + mob_spawner = /obj/effect/mob_spawn/corpse/human/syndicatestormtrooper /mob/living/basic/syndicate/melee/sword melee_damage_lower = 30 melee_damage_upper = 30 - icon_state = "syndicate_sword" - icon_living = "syndicate_sword" attack_verb_continuous = "slashes" attack_verb_simple = "slash" attack_sound = 'sound/weapons/blade1.ogg' armour_penetration = 35 - light_color = COLOR_SOFT_RED projectile_deflect_chance = 50 - -/mob/living/basic/syndicate/melee/sword/Initialize(mapload) - . = ..() - set_light(2) + light_range = 2 + light_power = 2.5 + light_color = COLOR_SOFT_RED + r_hand = /obj/item/melee/energy/sword/saber/red + l_hand = /obj/item/shield/energy /mob/living/basic/syndicate/melee/sword/space - icon_state = "syndicate_space_sword" - icon_living = "syndicate_space_sword" name = "Syndicate Commando" maxHealth = 170 health = 170 unsuitable_atmos_damage = 0 minimum_survivable_temperature = 0 projectile_deflect_chance = 50 - var/obj/effect/light_emitter/red_energy_sword/sord + mob_spawner = /obj/effect/mob_spawn/corpse/human/syndicatecommando /mob/living/basic/syndicate/melee/sword/space/Initialize(mapload) . = ..() ADD_TRAIT(src, TRAIT_SPACEWALK, INNATE_TRAIT) - sord = new(src) - set_light(4) -/mob/living/basic/syndicate/melee/sword/space/Destroy() - QDEL_NULL(sord) - return ..() /mob/living/basic/syndicate/melee/sword/space/stormtrooper - icon_state = "syndicate_stormtrooper_sword" - icon_living = "syndicate_stormtrooper_sword" name = "Syndicate Stormtrooper" maxHealth = 250 health = 250 projectile_deflect_chance = 50 + mob_spawner = /obj/effect/mob_spawn/corpse/human/syndicatestormtrooper ///////////////Guns//////////// /mob/living/basic/syndicate/ranged - icon_state = "syndicate_pistol" - icon_living = "syndicate_pistol" - var/casingtype = /obj/item/ammo_casing/c9mm - var/projectilesound = 'sound/weapons/gun/pistol/shot.ogg' loot = list(/obj/effect/gibspawner/human) ai_controller = /datum/ai_controller/basic_controller/syndicate/ranged + r_hand = /obj/item/gun/ballistic/automatic/pistol + var/casingtype = /obj/item/ammo_casing/c9mm + var/projectilesound = 'sound/weapons/gun/pistol/shot.ogg' /mob/living/basic/syndicate/ranged/Initialize(mapload) . = ..() @@ -164,13 +146,12 @@ loot = list(/obj/effect/mob_spawn/corpse/human/syndicatesoldier) /mob/living/basic/syndicate/ranged/space - icon_state = "syndicate_space_pistol" - icon_living = "syndicate_space_pistol" name = "Syndicate Commando" maxHealth = 170 health = 170 unsuitable_atmos_damage = 0 minimum_survivable_temperature = 0 + mob_spawner = /obj/effect/mob_spawn/corpse/human/syndicatecommando /mob/living/basic/syndicate/ranged/space/Initialize(mapload) . = ..() @@ -178,31 +159,29 @@ set_light(4) /mob/living/basic/syndicate/ranged/space/stormtrooper - icon_state = "syndicate_stormtrooper_pistol" - icon_living = "syndicate_stormtrooper_pistol" name = "Syndicate Stormtrooper" maxHealth = 250 health = 250 + mob_spawner = /obj/effect/mob_spawn/corpse/human/syndicatestormtrooper /mob/living/basic/syndicate/ranged/smg - icon_state = "syndicate_smg" - icon_living = "syndicate_smg" casingtype = /obj/item/ammo_casing/c45 projectilesound = 'sound/weapons/gun/smg/shot.ogg' ai_controller = /datum/ai_controller/basic_controller/syndicate/ranged/burst + r_hand = /obj/item/gun/ballistic/automatic/c20r /mob/living/basic/syndicate/ranged/smg/pilot //caravan ambush ruin name = "Syndicate Salvage Pilot" - loot = list(/obj/effect/mob_spawn/corpse/human/syndicatesoldier) + loot = list(/obj/effect/mob_spawn/corpse/human/syndicatepilot) + mob_spawner = /obj/effect/mob_spawn/corpse/human/syndicatepilot /mob/living/basic/syndicate/ranged/smg/space - icon_state = "syndicate_space_smg" - icon_living = "syndicate_space_smg" name = "Syndicate Commando" maxHealth = 170 health = 170 unsuitable_atmos_damage = 0 minimum_survivable_temperature = 0 + mob_spawner = /obj/effect/mob_spawn/corpse/human/syndicatecommando /mob/living/basic/syndicate/ranged/smg/space/Initialize(mapload) . = ..() @@ -210,27 +189,24 @@ set_light(4) /mob/living/basic/syndicate/ranged/smg/space/stormtrooper - icon_state = "syndicate_stormtrooper_smg" - icon_living = "syndicate_stormtrooper_smg" name = "Syndicate Stormtrooper" maxHealth = 250 health = 250 + mob_spawner = /obj/effect/mob_spawn/corpse/human/syndicatestormtrooper /mob/living/basic/syndicate/ranged/shotgun - icon_state = "syndicate_shotgun" - icon_living = "syndicate_shotgun" casingtype = /obj/item/ammo_casing/shotgun/buckshot //buckshot (up to 72.5 brute) fired in a two-round burst ai_controller = /datum/ai_controller/basic_controller/syndicate/ranged/shotgunner + r_hand = /obj/item/gun/ballistic/shotgun/bulldog /mob/living/basic/syndicate/ranged/shotgun/space - icon_state = "syndicate_space_shotgun" - icon_living = "syndicate_space_shotgun" name = "Syndicate Commando" maxHealth = 170 health = 170 unsuitable_atmos_damage = 0 minimum_survivable_temperature = 0 speed = 1 + mob_spawner = /obj/effect/mob_spawn/corpse/human/syndicatecommando /mob/living/basic/syndicate/ranged/shotgun/space/Initialize(mapload) . = ..() @@ -238,19 +214,16 @@ set_light(4) /mob/living/basic/syndicate/ranged/shotgun/space/stormtrooper - icon_state = "syndicate_stormtrooper_shotgun" - icon_living = "syndicate_stormtrooper_shotgun" name = "Syndicate Stormtrooper" maxHealth = 250 health = 250 + mob_spawner = /obj/effect/mob_spawn/corpse/human/syndicatestormtrooper ///////////////Misc//////////// /mob/living/basic/viscerator name = "viscerator" desc = "A small, twin-bladed machine capable of inflicting very deadly lacerations." - icon_state = "viscerator_attack" - icon_living = "viscerator_attack" pass_flags = PASSTABLE | PASSMOB combat_mode = TRUE mob_biotypes = MOB_ROBOTIC diff --git a/code/modules/mob/living/simple_animal/friendly/trader.dm b/code/modules/mob/living/simple_animal/friendly/trader.dm index 3b6225e1c1d..2605b9a50d8 100644 --- a/code/modules/mob/living/simple_animal/friendly/trader.dm +++ b/code/modules/mob/living/simple_animal/friendly/trader.dm @@ -26,7 +26,7 @@ /mob/living/simple_animal/hostile/retaliate/trader name = "Trader" desc = "Come buy some!" - icon = 'icons/mob/simple/simple_human.dmi' + icon = 'icons/mob/simple/traders.dmi' icon_state = "faceless" maxHealth = 200 health = 200 diff --git a/code/modules/mob/living/simple_animal/hostile/bosses/paperwizard.dm b/code/modules/mob/living/simple_animal/hostile/bosses/paperwizard.dm index f2878850936..8644d652de2 100644 --- a/code/modules/mob/living/simple_animal/hostile/bosses/paperwizard.dm +++ b/code/modules/mob/living/simple_animal/hostile/bosses/paperwizard.dm @@ -8,7 +8,7 @@ del_on_death = TRUE icon = 'icons/mob/simple/simple_human.dmi' icon_state = "paperwizard" - ranged = 1 + ranged = TRUE environment_smash = ENVIRONMENT_SMASH_NONE minimum_distance = 3 retreat_distance = 3 @@ -21,9 +21,12 @@ projectiletype = /obj/projectile/temp projectilesound = 'sound/weapons/emitter.ogg' attack_sound = 'sound/hallucinations/growl1.ogg' + footstep_type = FOOTSTEP_MOB_SHOE var/list/copies = list() - footstep_type = FOOTSTEP_MOB_SHOE +/mob/living/simple_animal/hostile/boss/paper_wizard/Initialize(mapload) + . = ..() + apply_dynamic_human_icon(src, mob_spawn_path = /obj/effect/mob_spawn/corpse/human/wizard/paper) /mob/living/simple_animal/hostile/boss/paper_wizard/Destroy() QDEL_LIST(copies) diff --git a/code/modules/mob/living/simple_animal/hostile/cat_butcher.dm b/code/modules/mob/living/simple_animal/hostile/cat_butcher.dm index 652b082543d..8a869792b02 100644 --- a/code/modules/mob/living/simple_animal/hostile/cat_butcher.dm +++ b/code/modules/mob/living/simple_animal/hostile/cat_butcher.dm @@ -28,7 +28,11 @@ faction = list("hostile") check_friendly_fire = 1 status_flags = CANPUSH - del_on_death = 1 + del_on_death = TRUE + +/mob/living/simple_animal/hostile/cat_butcherer/Initialize(mapload) + . = ..() + apply_dynamic_human_icon(src, mob_spawn_path = /obj/effect/mob_spawn/corpse/human/cat_butcher, l_hand = /obj/item/circular_saw, bloody_slots = ITEM_SLOT_GLOVES|ITEM_SLOT_OCLOTHING) /mob/living/simple_animal/hostile/cat_butcherer/AttackingTarget() . = ..() diff --git a/code/modules/mob/living/simple_animal/hostile/dark_wizard.dm b/code/modules/mob/living/simple_animal/hostile/dark_wizard.dm index e7aa4aa4f53..e7ce64e37ae 100644 --- a/code/modules/mob/living/simple_animal/hostile/dark_wizard.dm +++ b/code/modules/mob/living/simple_animal/hostile/dark_wizard.dm @@ -33,6 +33,10 @@ loot = list(/obj/effect/decal/remains/human) del_on_death = TRUE +/mob/living/simple_animal/hostile/dark_wizard/Initialize(mapload) + . = ..() + apply_dynamic_human_icon(src, mob_spawn_path = /obj/effect/mob_spawn/corpse/human/wizard/dark, r_hand = /obj/item/staff) + /obj/projectile/temp/earth_bolt name = "earth bolt" icon_state = "declone" diff --git a/code/modules/mob/living/simple_animal/hostile/nanotrasen.dm b/code/modules/mob/living/simple_animal/hostile/nanotrasen.dm index 0cc6f8a37c1..2b6596fe9ce 100644 --- a/code/modules/mob/living/simple_animal/hostile/nanotrasen.dm +++ b/code/modules/mob/living/simple_animal/hostile/nanotrasen.dm @@ -2,10 +2,6 @@ name = "\improper Nanotrasen Private Security Officer" desc = "An officer part of Nanotrasen's private security force, he seems rather unpleased to meet you." icon = 'icons/mob/simple/simple_human.dmi' - icon_state = "nanotrasen" - icon_living = "nanotrasen" - icon_dead = null - icon_gib = "syndicate_gib" mob_biotypes = MOB_ORGANIC|MOB_HUMANOID sentience_type = SENTIENCE_HUMANOID speak_chance = 0 @@ -31,17 +27,20 @@ del_on_death = TRUE dodging = TRUE footstep_type = FOOTSTEP_MOB_SHOE + /// Path of the mob spawner we base the mob's visuals off of. + var/mob_spawner = /obj/effect/mob_spawn/corpse/human/nanotrasensoldier + /// Path of the held item we give to the mob's visuals. + var/held_item -/mob/living/simple_animal/hostile/nanotrasen/screaming - icon_state = "nanotrasen" - icon_living = "nanotrasen" +/mob/living/simple_animal/hostile/nanotrasen/Initialize(mapload) + . = ..() + apply_dynamic_human_icon(src, mob_spawn_path = mob_spawner, r_hand = held_item) /mob/living/simple_animal/hostile/nanotrasen/screaming/Aggro() ..() summon_backup(15) say("411 in progress, requesting backup!") - /mob/living/simple_animal/hostile/nanotrasen/ranged icon_state = "nanotrasenranged" icon_living = "nanotrasenranged" @@ -50,7 +49,7 @@ minimum_distance = 5 casingtype = /obj/item/ammo_casing/c45 projectilesound = 'sound/weapons/gun/pistol/shot_alt.ogg' - + held_item = /obj/item/gun/ballistic/automatic/pistol/m1911 /mob/living/simple_animal/hostile/nanotrasen/ranged/smg icon_state = "nanotrasenrangedsmg" @@ -58,3 +57,55 @@ rapid = 3 casingtype = /obj/item/ammo_casing/c46x30mm projectilesound = 'sound/weapons/gun/smg/shot.ogg' + held_item = /obj/item/gun/ballistic/automatic/wt550 + + +/mob/living/simple_animal/hostile/retaliate/nanotrasenpeace + name = "\improper Nanotrasen Private Security Officer" + desc = "An officer part of Nanotrasen's private security force." + icon = 'icons/mob/simple/simple_human.dmi' + turns_per_move = 5 + speed = 0 + stat_attack = HARD_CRIT + robust_searching = 1 + vision_range = 3 + maxHealth = 100 + health = 100 + harm_intent_damage = 5 + melee_damage_lower = 10 + melee_damage_upper = 15 + attack_verb_continuous = "punches" + attack_verb_simple = "punch" + attack_sound = 'sound/weapons/punch1.ogg' + faction = list("nanotrasenprivate") + mob_biotypes = MOB_ORGANIC|MOB_HUMANOID + sentience_type = SENTIENCE_HUMANOID + combat_mode = TRUE + loot = list(/obj/effect/mob_spawn/corpse/human/nanotrasensoldier) + atmos_requirements = list("min_oxy" = 5, "max_oxy" = 0, "min_plas" = 0, "max_plas" = 1, "min_co2" = 0, "max_co2" = 5, "min_n2" = 0, "max_n2" = 0) + unsuitable_atmos_damage = 7.5 + status_flags = CANPUSH + search_objects = 1 + /// Path of the held item we give to the mob's visuals. + var/held_item + +/mob/living/simple_animal/hostile/retaliate/nanotrasenpeace/Initialize(mapload) + . = ..() + apply_dynamic_human_icon(src, mob_spawn_path = /obj/effect/mob_spawn/corpse/human/nanotrasensoldier, r_hand = held_item) + +/mob/living/simple_animal/hostile/retaliate/nanotrasenpeace/Aggro() + ..() + summon_backup(15) + say("411 in progress, requesting backup!") + +/mob/living/simple_animal/hostile/retaliate/nanotrasenpeace/ranged + vision_range = 9 + rapid = 3 + ranged = 1 + retreat_distance = 3 + minimum_distance = 5 + casingtype = /obj/item/ammo_casing/c46x30mm + projectilesound = 'sound/weapons/gun/smg/shot.ogg' + loot = list(/obj/item/gun/ballistic/automatic/wt550, + /obj/effect/mob_spawn/corpse/human/nanotrasensoldier) + held_item = /obj/item/gun/ballistic/automatic/wt550 diff --git a/code/modules/mob/living/simple_animal/hostile/pirate.dm b/code/modules/mob/living/simple_animal/hostile/pirate.dm index 1a9b5dfe70f..50308b7ba32 100644 --- a/code/modules/mob/living/simple_animal/hostile/pirate.dm +++ b/code/modules/mob/living/simple_animal/hostile/pirate.dm @@ -2,9 +2,6 @@ name = "Pirate" desc = "Does what he wants cause a pirate is free." icon = 'icons/mob/simple/simple_human.dmi' - icon_state = "piratemelee" - icon_living = "piratemelee" - icon_dead = "pirate_dead" mob_biotypes = MOB_ORGANIC|MOB_HUMANOID sentience_type = SENTIENCE_HUMANOID speak_chance = 0 @@ -24,17 +21,20 @@ atmos_requirements = list("min_oxy" = 5, "max_oxy" = 0, "min_plas" = 0, "max_plas" = 1, "min_co2" = 0, "max_co2" = 5, "min_n2" = 0, "max_n2" = 0) unsuitable_atmos_damage = 7.5 speak_emote = list("yarrs") - loot = list(/obj/effect/mob_spawn/corpse/human/pirate, - /obj/item/melee/energy/sword/pirate) - del_on_death = 1 + loot = list(/obj/effect/mob_spawn/corpse/human/pirate) + del_on_death = TRUE faction = list("pirate") + /// Path of the mob spawner we base the mob's visuals off of. + var/mob_spawner = /obj/effect/mob_spawn/corpse/human/pirate + /// Path of the held item we give to the mob's visuals. + var/held_item +/mob/living/simple_animal/hostile/pirate/Initialize(mapload) + . = ..() + apply_dynamic_human_icon(src, mob_spawn_path = mob_spawner, r_hand = held_item) /mob/living/simple_animal/hostile/pirate/melee name = "Pirate Swashbuckler" - icon_state = "piratemelee" - icon_living = "piratemelee" - icon_dead = "piratemelee_dead" melee_damage_lower = 30 melee_damage_upper = 30 armour_penetration = 35 @@ -42,40 +42,31 @@ attack_verb_simple = "slash" attack_sound = 'sound/weapons/blade1.ogg' attack_vis_effect = ATTACK_EFFECT_SLASH - var/obj/effect/light_emitter/red_energy_sword/sord - + loot = list(/obj/effect/mob_spawn/corpse/human/pirate/melee) + light_range = 2 + light_power = 2.5 + light_color = COLOR_SOFT_RED footstep_type = FOOTSTEP_MOB_SHOE + loot = list( + /obj/effect/mob_spawn/corpse/human/pirate/melee, + /obj/item/melee/energy/sword/pirate, + ) + mob_spawner = /obj/effect/mob_spawn/corpse/human/pirate/melee + held_item = /obj/item/melee/energy/sword/pirate /mob/living/simple_animal/hostile/pirate/melee/space name = "Space Pirate Swashbuckler" - icon_state = "piratespace" - icon_living = "piratespace" - icon_dead = "piratespace_dead" atmos_requirements = list("min_oxy" = 0, "max_oxy" = 0, "min_plas" = 0, "max_plas" = 0, "min_co2" = 0, "max_co2" = 0, "min_n2" = 0, "max_n2" = 0) minbodytemp = 0 speed = 1 + mob_spawner = /obj/effect/mob_spawn/corpse/human/pirate/melee/space /mob/living/simple_animal/hostile/pirate/melee/space/Initialize(mapload) . = ..() ADD_TRAIT(src, TRAIT_SPACEWALK, INNATE_TRAIT) -/mob/living/simple_animal/hostile/pirate/melee/Initialize(mapload) - . = ..() - sord = new(src) - -/mob/living/simple_animal/hostile/pirate/melee/Destroy() - QDEL_NULL(sord) - return ..() - -/mob/living/simple_animal/hostile/pirate/melee/Initialize(mapload) - . = ..() - set_light(2) - /mob/living/simple_animal/hostile/pirate/ranged name = "Pirate Gunner" - icon_state = "pirateranged" - icon_living = "pirateranged" - icon_dead = "pirateranged_dead" projectilesound = 'sound/weapons/laser.ogg' ranged = 1 rapid = 2 @@ -84,15 +75,16 @@ minimum_distance = 5 projectiletype = /obj/projectile/beam/laser loot = list(/obj/effect/mob_spawn/corpse/human/pirate/ranged) + mob_spawner = /obj/effect/mob_spawn/corpse/human/pirate/ranged + held_item = /obj/item/gun/energy/laser /mob/living/simple_animal/hostile/pirate/ranged/space name = "Space Pirate Gunner" - icon_state = "piratespaceranged" - icon_living = "piratespaceranged" - icon_dead = "piratespaceranged_dead" atmos_requirements = list("min_oxy" = 0, "max_oxy" = 0, "min_plas" = 0, "max_plas" = 0, "min_co2" = 0, "max_co2" = 0, "min_n2" = 0, "max_n2" = 0) minbodytemp = 0 speed = 1 + mob_spawner = /obj/effect/mob_spawn/corpse/human/pirate/ranged/space + held_item = /obj/item/gun/energy/e_gun/lethal /mob/living/simple_animal/hostile/pirate/ranged/space/Initialize(mapload) . = ..() diff --git a/code/modules/mob/living/simple_animal/hostile/retaliate/spaceman.dm b/code/modules/mob/living/simple_animal/hostile/retaliate/spaceman.dm index 3e4e6ddaf32..fd89b71ff06 100644 --- a/code/modules/mob/living/simple_animal/hostile/retaliate/spaceman.dm +++ b/code/modules/mob/living/simple_animal/hostile/retaliate/spaceman.dm @@ -27,52 +27,3 @@ environment_smash = ENVIRONMENT_SMASH_NONE del_on_death = 0 footstep_type = FOOTSTEP_MOB_SHOE - -/mob/living/simple_animal/hostile/retaliate/nanotrasenpeace //this should be in a different file - name = "\improper Nanotrasen Private Security Officer" - desc = "An officer part of Nanotrasen's private security force." - icon = 'icons/mob/simple/simple_human.dmi' - icon_state = "nanotrasen" - icon_living = "nanotrasen" - icon_dead = null - icon_gib = "syndicate_gib" - turns_per_move = 5 - speed = 0 - stat_attack = HARD_CRIT - robust_searching = 1 - vision_range = 3 - maxHealth = 100 - health = 100 - harm_intent_damage = 5 - melee_damage_lower = 10 - melee_damage_upper = 15 - attack_verb_continuous = "punches" - attack_verb_simple = "punch" - attack_sound = 'sound/weapons/punch1.ogg' - faction = list("nanotrasenprivate") - mob_biotypes = MOB_ORGANIC|MOB_HUMANOID - sentience_type = SENTIENCE_HUMANOID - combat_mode = TRUE - loot = list(/obj/effect/mob_spawn/corpse/human/nanotrasensoldier) - atmos_requirements = list("min_oxy" = 5, "max_oxy" = 0, "min_plas" = 0, "max_plas" = 1, "min_co2" = 0, "max_co2" = 5, "min_n2" = 0, "max_n2" = 0) - unsuitable_atmos_damage = 7.5 - status_flags = CANPUSH - search_objects = 1 - -/mob/living/simple_animal/hostile/retaliate/nanotrasenpeace/Aggro() - ..() - summon_backup(15) - say("411 in progress, requesting backup!") - -/mob/living/simple_animal/hostile/retaliate/nanotrasenpeace/ranged - icon_state = "nanotrasenrangedsmg" - icon_living = "nanotrasenrangedsmg" - vision_range = 9 - rapid = 3 - ranged = 1 - retreat_distance = 3 - minimum_distance = 5 - casingtype = /obj/item/ammo_casing/c46x30mm - projectilesound = 'sound/weapons/gun/smg/shot.ogg' - loot = list(/obj/item/gun/ballistic/automatic/wt550, - /obj/effect/mob_spawn/corpse/human/nanotrasensoldier) diff --git a/code/modules/mob/living/simple_animal/hostile/russian.dm b/code/modules/mob/living/simple_animal/hostile/russian.dm index dee84b5f863..e5e7fe4cc66 100644 --- a/code/modules/mob/living/simple_animal/hostile/russian.dm +++ b/code/modules/mob/living/simple_animal/hostile/russian.dm @@ -26,27 +26,35 @@ unsuitable_atmos_damage = 7.5 faction = list("russian") status_flags = CANPUSH - del_on_death = 1 - footstep_type = FOOTSTEP_MOB_SHOE + del_on_death = TRUE + /// The mob spawner we base the icon off of. + var/mob_spawner = /obj/effect/mob_spawn/corpse/human/russian + /// The item the icon will hold. + var/held_item = /obj/item/knife/kitchen +/mob/living/simple_animal/hostile/russian/Initialize(mapload) + . = ..() + apply_dynamic_human_icon(src, mob_spawn_path = mob_spawner, r_hand = held_item) /mob/living/simple_animal/hostile/russian/ranged icon_state = "russianranged" icon_living = "russianranged" loot = list(/obj/effect/mob_spawn/corpse/human/russian/ranged, /obj/item/gun/ballistic/revolver/nagant) - ranged = 1 + ranged = TRUE retreat_distance = 5 minimum_distance = 5 projectilesound = 'sound/weapons/gun/revolver/shot.ogg' casingtype = /obj/item/ammo_casing/n762 - + mob_spawner = /obj/effect/mob_spawn/corpse/human/russian/ranged + held_item = /obj/item/gun/ballistic/revolver/nagant /mob/living/simple_animal/hostile/russian/ranged/mosin loot = list(/obj/effect/mob_spawn/corpse/human/russian/ranged, /obj/item/gun/ballistic/rifle/boltaction) casingtype = /obj/item/ammo_casing/a762 + held_item = /obj/item/gun/ballistic/rifle/boltaction /mob/living/simple_animal/hostile/russian/ranged/trooper icon_state = "russianrangedelite" @@ -56,6 +64,8 @@ casingtype = /obj/item/ammo_casing/shotgun/buckshot loot = list(/obj/effect/mob_spawn/corpse/human/russian/ranged/trooper, /obj/item/gun/ballistic/shotgun/lethal) + mob_spawner = /obj/effect/mob_spawn/corpse/human/russian/ranged/trooper + held_item = /obj/item/gun/ballistic/shotgun/lethal /mob/living/simple_animal/hostile/russian/ranged/officer name = "Russian Officer" @@ -67,6 +77,8 @@ casingtype = /obj/item/ammo_casing/c9mm loot = list(/obj/effect/mob_spawn/corpse/human/russian/ranged/officer, /obj/item/gun/ballistic/automatic/pistol/aps) + mob_spawner = /obj/effect/mob_spawn/corpse/human/russian/ranged/officer + held_item = /obj/item/gun/ballistic/automatic/pistol/aps /mob/living/simple_animal/hostile/russian/ranged/officer/Aggro() ..() diff --git a/code/modules/mob/living/simple_animal/hostile/skeleton.dm b/code/modules/mob/living/simple_animal/hostile/skeleton.dm index 5d439748865..e72af36bdb4 100644 --- a/code/modules/mob/living/simple_animal/hostile/skeleton.dm +++ b/code/modules/mob/living/simple_animal/hostile/skeleton.dm @@ -1,11 +1,8 @@ /mob/living/simple_animal/hostile/skeleton name = "reanimated skeleton" desc = "A real bonefied skeleton, doesn't seem like it wants to socialize." - icon = 'icons/mob/simple/simple_human.dmi' - icon_state = "skeleton" - icon_living = "skeleton" - icon_dead = "skeleton" gender = NEUTER + icon = 'icons/mob/simple/simple_human.dmi' mob_biotypes = MOB_UNDEAD|MOB_HUMANOID turns_per_move = 5 speak_emote = list("rattles") @@ -31,36 +28,47 @@ faction = list("skeleton") see_in_dark = NIGHTVISION_FOV_RANGE lighting_alpha = LIGHTING_PLANE_ALPHA_MOSTLY_INVISIBLE - death_message = "collapses into a pile of bones!" - del_on_death = 1 - loot = list(/obj/effect/decal/remains/human) - footstep_type = FOOTSTEP_MOB_SHOE + death_message = "collapses into a pile of bones!" + del_on_death = TRUE + loot = list(/obj/effect/decal/remains/human) + /// Path of the outfit we give to the mob's visuals. + var/outfit = null + /// Path of the species we give to the mob's visuals. + var/species = /datum/species/skeleton + /// Path of the held item we give to the mob's visuals. + var/held_item + +/mob/living/simple_animal/hostile/skeleton/Initialize(mapload) + . = ..() + apply_dynamic_human_icon(src, outfit, species, r_hand = held_item) /mob/living/simple_animal/hostile/skeleton/eskimo name = "undead eskimo" desc = "The reanimated remains of some poor traveler." - icon_state = "eskimo" - icon_living = "eskimo" - icon_dead = "eskimo_dead" maxHealth = 55 health = 55 weather_immunities = list(TRAIT_SNOWSTORM_IMMUNE) melee_damage_lower = 17 melee_damage_upper = 20 death_message = "collapses into a pile of bones, its gear falling to the floor!" - loot = list(/obj/effect/decal/remains/human, - /obj/item/spear, - /obj/item/clothing/shoes/winterboots, - /obj/item/clothing/suit/hooded/wintercoat) + loot = list( + /obj/effect/decal/remains/human, + /obj/item/spear, + /obj/item/clothing/shoes/winterboots, + /obj/item/clothing/suit/hooded/wintercoat, + ) + outfit = /datum/outfit/eskimo + held_item = /obj/item/spear +/datum/outfit/eskimo + name = "Eskimo" + suit = /obj/item/clothing/suit/hooded/wintercoat + shoes = /obj/item/clothing/shoes/winterboots /mob/living/simple_animal/hostile/skeleton/templar name = "undead templar" desc = "The reanimated remains of a holy templar knight." - icon_state = "templar" - icon_living = "templar" - icon_dead = "templar_dead" maxHealth = 150 health = 150 weather_immunities = list(TRAIT_SNOWSTORM_IMMUNE) @@ -72,10 +80,19 @@ melee_damage_lower = 25 melee_damage_upper = 30 death_message = "collapses into a pile of bones, its gear clanging as it hits the ground!" - loot = list(/obj/effect/decal/remains/human, - /obj/item/clothing/suit/chaplainsuit/armor/templar, - /obj/item/clothing/head/helmet/chaplain, - /obj/item/claymore/weak{name = "holy sword"}) + loot = list( + /obj/effect/decal/remains/human, + /obj/item/clothing/suit/chaplainsuit/armor/templar, + /obj/item/clothing/head/helmet/chaplain, + /obj/item/claymore/weak{name = "holy sword"} + ) + outfit = /datum/outfit/templar + +/datum/outfit/templar + name = "Templar" + head = /obj/item/clothing/head/helmet/chaplain + suit = /obj/item/clothing/suit/chaplainsuit/armor/templar + r_hand = /obj/item/claymore/weak /mob/living/simple_animal/hostile/skeleton/ice name = "ice skeleton" @@ -99,8 +116,11 @@ melee_damage_lower = 15 melee_damage_upper = 20 light_color = LIGHT_COLOR_PURPLE + light_range = 2 death_message = "collapses into a pile of bones, their suit dissolving among the plasma!" loot = list(/obj/effect/decal/remains/plasma) + outfit = /datum/outfit/plasma_miner + species = /datum/species/plasmaman /mob/living/simple_animal/hostile/skeleton/plasmaminer/jackhammer desc = "A plasma-soaked miner, their exposed limbs turned into a grossly incandescent bone seemingly made of plasma. They seem to still have their mining tool in their hand, gripping tightly." @@ -117,7 +137,10 @@ attack_sound = 'sound/weapons/sonic_jackhammer.ogg' attack_vis_effect = null // jackhammer moment loot = list(/obj/effect/decal/remains/plasma, /obj/item/pickaxe/drill/jackhammer) + held_item = /obj/item/pickaxe/drill/jackhammer -/mob/living/simple_animal/hostile/skeleton/plasmaminer/Initialize(mapload) - . = ..() - set_light(2) +/datum/outfit/plasma_miner + name = "Plasma Miner" + uniform = /obj/item/clothing/under/rank/cargo/miner/lavaland + suit = /obj/item/clothing/suit/hooded/explorer + mask = /obj/item/clothing/mask/gas/explorer diff --git a/code/modules/mob/living/simple_animal/hostile/wizard.dm b/code/modules/mob/living/simple_animal/hostile/wizard.dm index b69cd69c21c..007d54cb995 100644 --- a/code/modules/mob/living/simple_animal/hostile/wizard.dm +++ b/code/modules/mob/living/simple_animal/hostile/wizard.dm @@ -40,6 +40,7 @@ /mob/living/simple_animal/hostile/wizard/Initialize(mapload) . = ..() + apply_dynamic_human_icon(src, mob_spawn_path = /obj/effect/mob_spawn/corpse/human/wizard, r_hand = /obj/item/staff) var/obj/item/implant/exile/exiled = new /obj/item/implant/exile(src) exiled.implant(src) diff --git a/code/modules/mob/living/simple_animal/hostile/zombie.dm b/code/modules/mob/living/simple_animal/hostile/zombie.dm index ad916accceb..b1a9d4ba2c7 100644 --- a/code/modules/mob/living/simple_animal/hostile/zombie.dm +++ b/code/modules/mob/living/simple_animal/hostile/zombie.dm @@ -2,8 +2,6 @@ name = "Shambling Corpse" desc = "When there is no more room in hell, the dead will walk in outer space." icon = 'icons/mob/simple/simple_human.dmi' - icon_state = "zombie" - icon_living = "zombie" mob_biotypes = MOB_ORGANIC|MOB_HUMANOID sentience_type = SENTIENCE_HUMANOID speak_chance = 0 @@ -21,28 +19,33 @@ atmos_requirements = list("min_oxy" = 0, "max_oxy" = 0, "min_plas" = 0, "max_plas" = 0, "min_co2" = 0, "max_co2" = 0, "min_n2" = 0, "max_n2" = 0) minbodytemp = 0 status_flags = CANPUSH - del_on_death = 1 - var/zombiejob = JOB_MEDICAL_DOCTOR + death_message = "collapses, flesh gone in a pile of bones!" + del_on_death = TRUE + loot = list(/obj/effect/decal/remains/human) + /// The probability that we give people real zombie infections on hit. var/infection_chance = 0 + /// Outfit the zombie spawns with for visuals. + var/outfit = /datum/outfit/corpse_doctor /mob/living/simple_animal/hostile/zombie/Initialize(mapload) . = ..() - INVOKE_ASYNC(src, PROC_REF(setup_visuals)) - -/mob/living/simple_animal/hostile/zombie/proc/setup_visuals() - var/datum/job/job = SSjob.GetJob(zombiejob) - - var/datum/outfit/outfit = new job.outfit - outfit.l_hand = null - outfit.r_hand = null - - var/mob/living/carbon/human/dummy/dummy = new - dummy.equipOutfit(outfit) - dummy.set_species(/datum/species/zombie) - icon = getFlatIcon(dummy) - qdel(dummy) + apply_dynamic_human_icon(src, outfit, /datum/species/zombie, bloody_slots = ITEM_SLOT_OCLOTHING) /mob/living/simple_animal/hostile/zombie/AttackingTarget() . = ..() if(. && ishuman(target) && prob(infection_chance)) try_to_zombie_infect(target) + +/datum/outfit/corpse_doctor + name = "Corpse Doctor" + suit = /obj/item/clothing/suit/toggle/labcoat + uniform = /obj/item/clothing/under/rank/medical/doctor + shoes = /obj/item/clothing/shoes/sneakers/white + back = /obj/item/storage/backpack/medic + +/datum/outfit/corpse_assistant + name = "Corpse Assistant" + mask = /obj/item/clothing/mask/gas + uniform = /obj/item/clothing/under/color/grey + shoes = /obj/item/clothing/shoes/sneakers/black + back = /obj/item/storage/backpack diff --git a/code/modules/mob_spawn/corpses/mob_corpses.dm b/code/modules/mob_spawn/corpses/mob_corpses.dm index ccedb6ad3f7..968b5e95942 100644 --- a/code/modules/mob_spawn/corpses/mob_corpses.dm +++ b/code/modules/mob_spawn/corpses/mob_corpses.dm @@ -65,6 +65,27 @@ id = /obj/item/card/id/advanced/chameleon id_trim = /datum/id_trim/chameleon/operative +/obj/effect/mob_spawn/corpse/human/syndicatepilot + name = "Syndicate Pilot" + hairstyle = "Bald" + facial_hairstyle = "Shaved" + outfit = /datum/outfit/syndicatepilotcorpse + +/datum/outfit/syndicatepilotcorpse + name = "Syndicate Pilot Corpse" + uniform = /obj/item/clothing/under/syndicate + suit = /obj/item/clothing/suit/armor/vest/alt + shoes = /obj/item/clothing/shoes/combat + neck = /obj/item/clothing/neck/large_scarf/syndie + glasses = /obj/item/clothing/glasses/cold + gloves = /obj/item/clothing/gloves/combat + ears = /obj/item/radio/headset + mask = /obj/item/clothing/mask/gas + head = /obj/item/clothing/head/helmet/swat + back = /obj/item/storage/backpack + id = /obj/item/card/id/advanced/chameleon + id_trim = /datum/id_trim/chameleon/operative + /obj/effect/mob_spawn/corpse/human/pirate name = "Pirate" skin_tone = "caucasian1" //all pirates are white because it's easier that way @@ -76,9 +97,25 @@ name = "Pirate Corpse" uniform = /obj/item/clothing/under/costume/pirate shoes = /obj/item/clothing/shoes/jackboots - glasses = /obj/item/clothing/glasses/eyepatch - head = /obj/item/clothing/head/costume/pirate/bandana +/obj/effect/mob_spawn/corpse/human/pirate/melee + name = "Pirate Swashbuckler" + outfit = /datum/outfit/piratecorpse/melee + +/datum/outfit/piratecorpse/melee + name = "Pirate Swashbuckler Corpse" + glasses = /obj/item/clothing/glasses/eyepatch + head = /obj/item/clothing/head/costume/pirate/bandana/armored + +/obj/effect/mob_spawn/corpse/human/pirate/melee/space + name = "Pirate Swashbuckler - Space" + outfit = /datum/outfit/piratecorpse/melee/space + +/datum/outfit/piratecorpse/melee/space + name = "Pirate Swashbuckler Corpse - Space" + suit = /obj/item/clothing/suit/space/pirate + head = /obj/item/clothing/head/helmet/space/pirate/bandana + back = /obj/item/tank/jetpack/carbondioxide /obj/effect/mob_spawn/corpse/human/pirate/ranged name = "Pirate Gunner" @@ -86,9 +123,19 @@ /datum/outfit/piratecorpse/ranged name = "Pirate Gunner Corpse" - suit = /obj/item/clothing/suit/costume/pirate - head = /obj/item/clothing/head/costume/pirate + glasses = /obj/item/clothing/glasses/eyepatch + suit = /obj/item/clothing/suit/costume/pirate/armored + head = /obj/item/clothing/head/costume/pirate/armored +/obj/effect/mob_spawn/corpse/human/pirate/ranged/space + name = "Pirate Gunner - Space" + outfit = /datum/outfit/piratecorpse/ranged/space + +/datum/outfit/piratecorpse/ranged/space + name = "Pirate Gunner Corpse - Space" + suit = /obj/item/clothing/suit/space/pirate + head = /obj/item/clothing/head/helmet/space/pirate + back = /obj/item/tank/jetpack/carbondioxide /obj/effect/mob_spawn/corpse/human/russian name = "Russian" @@ -156,15 +203,32 @@ shoes = /obj/item/clothing/shoes/sandal/magic head = /obj/item/clothing/head/wizard +/obj/effect/mob_spawn/corpse/human/wizard/dark + name = "Dark Wizard Corpse" + outfit = /datum/outfit/wizardcorpse/dark + +/datum/outfit/wizardcorpse/dark + head = /obj/item/clothing/head/wizard/hood + +/obj/effect/mob_spawn/corpse/human/wizard/paper + name = "Paper Wizard Corpse" + outfit = /datum/outfit/paper_wizard + +/datum/outfit/paper_wizard + name = "Paper Wizard" + uniform = /obj/item/clothing/under/color/white + suit = /obj/item/clothing/suit/wizrobe/paper + shoes = /obj/item/clothing/shoes/sandal/magic + head = /obj/item/clothing/head/collectable/paper /obj/effect/mob_spawn/corpse/human/nanotrasensoldier name = "\improper Nanotrasen Private Security Officer" - outfit = /datum/outfit/nanotrasensoldiercorpse2 + outfit = /datum/outfit/nanotrasensoldiercorpse hairstyle = "Bald" facial_hairstyle = "Shaved" -/datum/outfit/nanotrasensoldiercorpse2 - name = "NT Private Security Officer Corpse" +/datum/outfit/nanotrasensoldiercorpse + name = "\improper NT Private Security Officer Corpse" uniform = /obj/item/clothing/under/rank/security/officer suit = /obj/item/clothing/suit/armor/vest shoes = /obj/item/clothing/shoes/combat @@ -177,13 +241,13 @@ id_trim = /datum/id_trim/centcom/corpse/private_security/tradepost_officer /obj/effect/mob_spawn/corpse/human/nanotrasenassaultsoldier - name = "Nanotrasen Private Security Officer" + name = "\improper Nanotrasen Assault Officer Corpse" outfit = /datum/outfit/nanotrasenassaultsoldiercorpse hairstyle = "Bald" facial_hairstyle = "Shaved" /datum/outfit/nanotrasenassaultsoldiercorpse - name = "NT Assault Officer Corpse" + name = "\improper NT Assault Officer Corpse" uniform = /obj/item/clothing/under/syndicate suit = /obj/item/clothing/suit/armor/vest shoes = /obj/item/clothing/shoes/combat @@ -195,6 +259,22 @@ id = /obj/item/card/id/advanced/centcom id_trim = /datum/id_trim/centcom/corpse/assault +/obj/effect/mob_spawn/corpse/human/nanotrasenelitesoldier + name = "\improper Nanotrasen Elite Assault Officer Corpse" + outfit = /datum/outfit/nanotrasenelitesoldiercorpse + hairstyle = "Bald" + facial_hairstyle = "Shaved" + +/datum/outfit/nanotrasenelitesoldiercorpse + name = "\improper NT Elite Assault Officer Corpse" + uniform = /obj/item/clothing/under/rank/centcom/military + shoes = /obj/item/clothing/shoes/combat + gloves = /obj/item/clothing/gloves/combat + mask = /obj/item/clothing/mask/gas/sechailer/swat + back = /obj/item/mod/control/pre_equipped/responsory/security + id = /obj/item/card/id/advanced/centcom + id_trim = /datum/id_trim/centcom/ert/security + /obj/effect/mob_spawn/corpse/human/cat_butcher name = "The Cat Surgeon" hairstyle = "Cut Hair" @@ -229,3 +309,11 @@ id = /obj/item/card/id/advanced l_pocket = /obj/item/paper/fluff/bee_objectives mask = /obj/item/clothing/mask/animal/small/bee + +/obj/effect/mob_spawn/corpse/human/generic_assistant + name = "Generic Assistant" + hairstyle = "Short Hair" + haircolor = COLOR_BLACK + facial_hairstyle = "Shaved" + skin_tone = "caucasian1" + outfit = /datum/outfit/job/assistant/consistent diff --git a/code/modules/mob_spawn/ghost_roles/mining_roles.dm b/code/modules/mob_spawn/ghost_roles/mining_roles.dm index b5a94784366..49fb6f1d303 100644 --- a/code/modules/mob_spawn/ghost_roles/mining_roles.dm +++ b/code/modules/mob_spawn/ghost_roles/mining_roles.dm @@ -255,10 +255,14 @@ notify_ghosts("An ash walker egg is ready to hatch in \the [spawner_area.name].", source = src, action=NOTIFY_ATTACK, flashwindow = FALSE, ignore_key = POLL_IGNORE_ASHWALKER) /datum/outfit/ashwalker - name ="Ashwalker" + name = "Ash Walker" head = /obj/item/clothing/head/helmet/gladiator uniform = /obj/item/clothing/under/costume/gladiator/ash_walker +/datum/outfit/ashwalker/spear + name = "Ash Walker - Spear" + back = /obj/item/spear/bonespear + ///Syndicate Listening Post /obj/effect/mob_spawn/ghost_role/human/lavaland_syndicate diff --git a/code/modules/mob_spawn/mob_spawn.dm b/code/modules/mob_spawn/mob_spawn.dm index 8b65733aa46..232f58a4fe9 100644 --- a/code/modules/mob_spawn/mob_spawn.dm +++ b/code/modules/mob_spawn/mob_spawn.dm @@ -207,8 +207,10 @@ ///burn damage this corpse will spawn with var/burn_damage = 0 -/obj/effect/mob_spawn/corpse/Initialize(mapload) +/obj/effect/mob_spawn/corpse/Initialize(mapload, no_spawn) . = ..() + if(no_spawn) + return switch(spawn_when) if(CORPSE_INSTANT) INVOKE_ASYNC(src, PROC_REF(create)) diff --git a/code/modules/mod/mod_control.dm b/code/modules/mod/mod_control.dm index ee5c7b5f2f6..240a0829aad 100644 --- a/code/modules/mod/mod_control.dm +++ b/code/modules/mod/mod_control.dm @@ -417,9 +417,11 @@ if(wearer.stat < UNCONSCIOUS && prob(10)) wearer.emote("scream") +/obj/item/mod/control/visual_equipped(mob/user, slot, initial = FALSE) + if(slot & slot_flags) + set_wearer(user) + /obj/item/mod/control/on_outfit_equip(mob/living/carbon/human/outfit_wearer, visuals_only, item_slot) - if(visuals_only) - set_wearer(outfit_wearer) //we need to set wearer manually since it doesnt call equipped quick_activation() /obj/item/mod/control/doStrip(mob/stripper, mob/owner) diff --git a/code/modules/projectiles/ammunition/_firing.dm b/code/modules/projectiles/ammunition/_firing.dm index 4d17c872280..7707dcb19da 100644 --- a/code/modules/projectiles/ammunition/_firing.dm +++ b/code/modules/projectiles/ammunition/_firing.dm @@ -32,7 +32,7 @@ return TRUE /obj/item/ammo_casing/proc/tk_firing(mob/living/user, atom/fired_from) - return !user.contains(fired_from) + return fired_from != user && !user.contains(fired_from) /obj/item/ammo_casing/proc/ready_proj(atom/target, mob/living/user, quiet, zone_override = "", atom/fired_from) if (!loaded_projectile) diff --git a/code/modules/projectiles/ammunition/ballistic/rifle.dm b/code/modules/projectiles/ammunition/ballistic/rifle.dm index 754c872cced..e4edd21c826 100644 --- a/code/modules/projectiles/ammunition/ballistic/rifle.dm +++ b/code/modules/projectiles/ammunition/ballistic/rifle.dm @@ -23,6 +23,9 @@ desc = "A 5.56mm phasic bullet casing." projectile_type = /obj/projectile/bullet/a556/phasic +/obj/item/ammo_casing/a556/weak + projectile_type = /obj/projectile/bullet/a556/weak + // 40mm (Grenade Launcher) /obj/item/ammo_casing/a40mm diff --git a/code/modules/projectiles/guns/energy.dm b/code/modules/projectiles/guns/energy.dm index c4784e55ba9..1f8772c06a3 100644 --- a/code/modules/projectiles/guns/energy.dm +++ b/code/modules/projectiles/guns/energy.dm @@ -132,7 +132,7 @@ // Sometimes ammo_type has paths, sometimes it has atom. for (var/atom/item in ammo_type) qdel(item) - ammo_type -= item + ammo_type = null return ..() diff --git a/code/modules/projectiles/guns/energy/energy_gun.dm b/code/modules/projectiles/guns/energy/energy_gun.dm index 177546515e9..faf35cfe957 100644 --- a/code/modules/projectiles/guns/energy/energy_gun.dm +++ b/code/modules/projectiles/guns/energy/energy_gun.dm @@ -164,3 +164,6 @@ . += "[icon_state]_fail_1" if(151 to INFINITY) . += "[icon_state]_fail_2" + +/obj/item/gun/energy/e_gun/lethal + ammo_type = list(/obj/item/ammo_casing/energy/laser, /obj/item/ammo_casing/energy/disabler) diff --git a/code/modules/projectiles/guns/energy/pulse.dm b/code/modules/projectiles/guns/energy/pulse.dm index 98ccb556a2b..4db8e626bda 100644 --- a/code/modules/projectiles/guns/energy/pulse.dm +++ b/code/modules/projectiles/guns/energy/pulse.dm @@ -48,6 +48,9 @@ overlay_x = 18, \ overlay_y = 12) +/obj/item/gun/energy/pulse/carbine/lethal + ammo_type = list(/obj/item/ammo_casing/energy/laser, /obj/item/ammo_casing/energy/laser/pulse, /obj/item/ammo_casing/energy/electrode) + /obj/item/gun/energy/pulse/carbine/loyalpin pin = /obj/item/firing_pin/implant/mindshield diff --git a/code/modules/projectiles/projectile/bullets/rifle.dm b/code/modules/projectiles/projectile/bullets/rifle.dm index 7c3a7c6e0a1..afe4b4fc140 100644 --- a/code/modules/projectiles/projectile/bullets/rifle.dm +++ b/code/modules/projectiles/projectile/bullets/rifle.dm @@ -6,6 +6,9 @@ armour_penetration = 30 wound_bonus = -40 +/obj/projectile/bullet/a556/weak //centcom + damage = 20 + /obj/projectile/bullet/a556/phasic name = "5.56mm phasic bullet" icon_state = "gaussphase" diff --git a/code/modules/research/xenobiology/crossbreeding/_status_effects.dm b/code/modules/research/xenobiology/crossbreeding/_status_effects.dm index 34f1c80e764..60feedb7565 100644 --- a/code/modules/research/xenobiology/crossbreeding/_status_effects.dm +++ b/code/modules/research/xenobiology/crossbreeding/_status_effects.dm @@ -383,7 +383,7 @@ duration = 300 /datum/status_effect/spookcookie/on_apply() - var/image/I = image(icon = 'icons/mob/simple/simple_human.dmi', icon_state = "skeleton", layer = ABOVE_MOB_LAYER, loc = owner) + var/image/I = image(icon = 'icons/mob/species/human/human.dmi', icon_state = "skeleton", layer = ABOVE_MOB_LAYER, loc = owner) I.override = 1 owner.add_alt_appearance(/datum/atom_hud/alternate_appearance/basic/everyone, "spookyscary", I) return ..() diff --git a/code/modules/unit_tests/hallucination_icons.dm b/code/modules/unit_tests/hallucination_icons.dm index 46ee134e7ea..96bbf464c2a 100644 --- a/code/modules/unit_tests/hallucination_icons.dm +++ b/code/modules/unit_tests/hallucination_icons.dm @@ -19,6 +19,8 @@ // Test preset delusion hallucinations for invalid image setups for(var/datum/hallucination/delusion/preset/hallucination as anything in subtypesof(/datum/hallucination/delusion/preset)) + if(initial(hallucination.dynamic_icon)) + continue var/icon = initial(hallucination.delusion_icon_file) var/icon_state = initial(hallucination.delusion_icon_state) check_hallucination_icon(hallucination, icon, icon_state) diff --git a/code/modules/unit_tests/screenshots/screenshot_antag_icons_syndicateinfiltrator.png b/code/modules/unit_tests/screenshots/screenshot_antag_icons_syndicateinfiltrator.png index 62e23dad5c7..0a9a5ef08e4 100644 Binary files a/code/modules/unit_tests/screenshots/screenshot_antag_icons_syndicateinfiltrator.png and b/code/modules/unit_tests/screenshots/screenshot_antag_icons_syndicateinfiltrator.png differ diff --git a/code/modules/unit_tests/screenshots/screenshot_antag_icons_syndicatesleeperagent.png b/code/modules/unit_tests/screenshots/screenshot_antag_icons_syndicatesleeperagent.png index 62e23dad5c7..0a9a5ef08e4 100644 Binary files a/code/modules/unit_tests/screenshots/screenshot_antag_icons_syndicatesleeperagent.png and b/code/modules/unit_tests/screenshots/screenshot_antag_icons_syndicatesleeperagent.png differ diff --git a/code/modules/unit_tests/screenshots/screenshot_antag_icons_traitor.png b/code/modules/unit_tests/screenshots/screenshot_antag_icons_traitor.png index 62e23dad5c7..0a9a5ef08e4 100644 Binary files a/code/modules/unit_tests/screenshots/screenshot_antag_icons_traitor.png and b/code/modules/unit_tests/screenshots/screenshot_antag_icons_traitor.png differ diff --git a/icons/mob/clothing/head/wizard.dmi b/icons/mob/clothing/head/wizard.dmi index e11123c11e3..9f022fdeac2 100644 Binary files a/icons/mob/clothing/head/wizard.dmi and b/icons/mob/clothing/head/wizard.dmi differ diff --git a/icons/mob/simple/simple_human.dmi b/icons/mob/simple/simple_human.dmi index cdb2275ee24..821ccab33a9 100644 Binary files a/icons/mob/simple/simple_human.dmi and b/icons/mob/simple/simple_human.dmi differ diff --git a/icons/mob/simple/traders.dmi b/icons/mob/simple/traders.dmi new file mode 100644 index 00000000000..2f2b828bed9 Binary files /dev/null and b/icons/mob/simple/traders.dmi differ diff --git a/icons/obj/art/cardboard_cutout.dmi b/icons/obj/art/cardboard_cutout.dmi index 284e77fc1ba..93df896126d 100644 Binary files a/icons/obj/art/cardboard_cutout.dmi and b/icons/obj/art/cardboard_cutout.dmi differ diff --git a/icons/obj/chess.dmi b/icons/obj/chess.dmi index 407df324b4d..2afe1266ee7 100644 Binary files a/icons/obj/chess.dmi and b/icons/obj/chess.dmi differ diff --git a/icons/obj/clothing/head/wizard.dmi b/icons/obj/clothing/head/wizard.dmi index 0f618a1abdb..f161192fb18 100644 Binary files a/icons/obj/clothing/head/wizard.dmi and b/icons/obj/clothing/head/wizard.dmi differ diff --git a/tgstation.dme b/tgstation.dme index 50ca6d1ade5..78ec973be8b 100644 --- a/tgstation.dme +++ b/tgstation.dme @@ -336,6 +336,7 @@ #include "code\__HELPERS\datums.dm" #include "code\__HELPERS\dna.dm" #include "code\__HELPERS\duplicating.dm" +#include "code\__HELPERS\dynamic_human_icon_gen.dm" #include "code\__HELPERS\files.dm" #include "code\__HELPERS\filters.dm" #include "code\__HELPERS\forensics.dm"