diff --git a/_maps/RandomRuins/SandRuins/whitesands_surface_camp_combination.dmm b/_maps/RandomRuins/SandRuins/whitesands_surface_camp_combination.dmm index 694f707235e1..ddf64b0a5e80 100644 --- a/_maps/RandomRuins/SandRuins/whitesands_surface_camp_combination.dmm +++ b/_maps/RandomRuins/SandRuins/whitesands_surface_camp_combination.dmm @@ -997,7 +997,6 @@ pixel_x = -17 }, /obj/effect/decal/remains/human, -/obj/item/clothing/mask/gas/clown_hat, /obj/effect/decal/cleanable/blood/old, /obj/item/ammo_casing/a357{ pixel_x = 9; @@ -1041,7 +1040,6 @@ pixel_x = 13 }, /obj/effect/decal/remains/human, -/obj/item/clothing/mask/gas/mime, /obj/effect/decal/cleanable/blood/old, /obj/item/ammo_casing/a357{ dir = 10; diff --git a/_maps/RandomRuins/SpaceRuins/bigderelict1.dmm b/_maps/RandomRuins/SpaceRuins/bigderelict1.dmm index 73f4a5875db1..b2c96652e78a 100644 --- a/_maps/RandomRuins/SpaceRuins/bigderelict1.dmm +++ b/_maps/RandomRuins/SpaceRuins/bigderelict1.dmm @@ -2183,8 +2183,8 @@ "Zt" = ( /obj/structure/closet/crate, /obj/item/target/syndicate, -/obj/item/target/clown, -/obj/item/target/clown, +/obj/item/target, +/obj/item/target, /obj/item/target/alien, /obj/item/target, /obj/machinery/light/directional/north, diff --git a/_maps/RandomRuins/SpaceRuins/singularity_lab.dmm b/_maps/RandomRuins/SpaceRuins/singularity_lab.dmm index d42576b02d58..e1dd9533c8e6 100644 --- a/_maps/RandomRuins/SpaceRuins/singularity_lab.dmm +++ b/_maps/RandomRuins/SpaceRuins/singularity_lab.dmm @@ -3890,9 +3890,7 @@ /obj/structure/chair{ dir = 8 }, -/mob/living/simple_animal/hostile/retaliate/clown/longface{ - dir = 8 - }, +/mob/living/simple_animal/hostile/netherworld/asteroid, /turf/open/floor/engine, /area/ruin/space/has_grav/singularitylab/lab) "pp" = ( diff --git a/_maps/RandomRuins/SpaceRuins/spacemall.dmm b/_maps/RandomRuins/SpaceRuins/spacemall.dmm index a0a7605441db..20d7cc8e6368 100644 --- a/_maps/RandomRuins/SpaceRuins/spacemall.dmm +++ b/_maps/RandomRuins/SpaceRuins/spacemall.dmm @@ -4709,7 +4709,7 @@ /area/ruin/space/has_grav/spacemall/maint) "rE" = ( /obj/effect/turf_decal/corner/transparent/lime, -/obj/structure/sign/poster/contraband/clown{ +/obj/structure/sign/poster/contraband/smoke{ pixel_x = 30 }, /obj/machinery/atmospherics/pipe/simple/supply/hidden/layer4{ @@ -10976,11 +10976,6 @@ /turf/open/floor/plasteel, /area/ruin/space/has_grav/spacemall/dorms) "Pj" = ( -/obj/item/clothing/mask/gas/clown_hat{ - pixel_y = 2; - pixel_x = 1; - name = "tainted clown wig and mask" - }, /obj/effect/decal/remains/human, /obj/machinery/light/small/directional/west, /turf/open/floor/wood, diff --git a/_maps/map_files/generic/CentCom.dmm b/_maps/map_files/generic/CentCom.dmm index d8a562fe99e5..5b05c5659f1b 100644 --- a/_maps/map_files/generic/CentCom.dmm +++ b/_maps/map_files/generic/CentCom.dmm @@ -475,7 +475,6 @@ }, /obj/item/clipboard, /obj/item/folder/blue, -/obj/item/stamp/law, /turf/open/floor/plasteel/grimy, /area/centcom/control) "akI" = ( @@ -535,7 +534,6 @@ /obj/structure/table/wood, /obj/item/clipboard, /obj/item/folder/blue, -/obj/item/stamp/law, /turf/open/floor/plasteel/grimy, /area/centcom/control) "ala" = ( diff --git a/_maps/outpost/hangar/indie_space_56x40.dmm b/_maps/outpost/hangar/indie_space_56x40.dmm index c06806acc362..f6021c4d6a27 100644 --- a/_maps/outpost/hangar/indie_space_56x40.dmm +++ b/_maps/outpost/hangar/indie_space_56x40.dmm @@ -144,6 +144,10 @@ planetary_atmos = 1 }, /area/hangar) +"RV" = ( +/obj/effect/landmark/outpost/hangar_numbers, +/turf/open/floor/hangar/plasteel, +/area/hangar) "Yz" = ( /obj/machinery/light/floor/hangar, /turf/open/floor/plasteel/tech{ @@ -1864,7 +1868,7 @@ ck ck ck MN -aA +RV aP aE aM diff --git a/_maps/shuttles/independent/independent_kilo.dmm b/_maps/shuttles/independent/independent_kilo.dmm index 8fdc4422e933..1a9670b4d6ee 100644 --- a/_maps/shuttles/independent/independent_kilo.dmm +++ b/_maps/shuttles/independent/independent_kilo.dmm @@ -674,9 +674,6 @@ dir = 8 }, /obj/item/storage/box/ammo/a12g_buckshot, -/obj/item/gun/ballistic/shotgun/doublebarrel/presawn{ - default_ammo_type = 0 - }, /obj/structure/cable/pink{ icon_state = "4-10" }, diff --git a/_maps/shuttles/independent/independent_rigger.dmm b/_maps/shuttles/independent/independent_rigger.dmm index 77f9b30d1efa..13a617b3374c 100644 --- a/_maps/shuttles/independent/independent_rigger.dmm +++ b/_maps/shuttles/independent/independent_rigger.dmm @@ -2590,7 +2590,7 @@ /obj/item/folder/blue{ pixel_x = 3 }, -/obj/item/stamp/head_of_personnel{ +/obj/item/stamp/officer{ name = "first mate's rubber stamp"; pixel_x = 8; pixel_y = 7 diff --git a/_maps/shuttles/inteq/inteq_colossus.dmm b/_maps/shuttles/inteq/inteq_colossus.dmm index 13d218631edf..d82d3fea324a 100644 --- a/_maps/shuttles/inteq/inteq_colossus.dmm +++ b/_maps/shuttles/inteq/inteq_colossus.dmm @@ -4407,7 +4407,7 @@ /area/ship/cargo) "Wi" = ( /obj/structure/rack, -/obj/item/target/clown{ +/obj/item/target{ pixel_x = -5; pixel_y = 10 }, diff --git a/_maps/shuttles/inteq/inteq_talos.dmm b/_maps/shuttles/inteq/inteq_talos.dmm index 5a853fdcc068..c7e33c4a8008 100644 --- a/_maps/shuttles/inteq/inteq_talos.dmm +++ b/_maps/shuttles/inteq/inteq_talos.dmm @@ -1686,7 +1686,7 @@ /obj/item/target/alien{ pixel_x = 5 }, -/obj/item/target/clown{ +/obj/item/target{ pixel_x = -5; pixel_y = 10 }, diff --git a/_maps/shuttles/inteq/inteq_valor.dmm b/_maps/shuttles/inteq/inteq_valor.dmm index 7e36f1cc310d..36ded4d532b6 100644 --- a/_maps/shuttles/inteq/inteq_valor.dmm +++ b/_maps/shuttles/inteq/inteq_valor.dmm @@ -2259,7 +2259,7 @@ /area/ship/cargo) "te" = ( /obj/structure/rack, -/obj/item/target/clown{ +/obj/item/target{ pixel_x = 9; pixel_y = 5 }, diff --git a/_maps/shuttles/pirate/pirate_tortuga.dmm b/_maps/shuttles/pirate/pirate_tortuga.dmm index 227d239257c1..a0562e80bc13 100644 --- a/_maps/shuttles/pirate/pirate_tortuga.dmm +++ b/_maps/shuttles/pirate/pirate_tortuga.dmm @@ -4113,7 +4113,7 @@ pixel_y = 8; pixel_x = 5 }, -/obj/item/clothing/head/soft/mime, +/obj/item/clothing/head/soft, /turf/open/floor/plasteel/white, /area/ship/crew/canteen) "ZC" = ( diff --git a/code/__DEFINES/flags.dm b/code/__DEFINES/flags.dm index b367c514232e..37343142625e 100644 --- a/code/__DEFINES/flags.dm +++ b/code/__DEFINES/flags.dm @@ -21,31 +21,29 @@ GLOBAL_LIST_INIT(bitflags, list(1, 2, 4, 8, 16, 32, 64, 128, 256, 512, 1024, 204 #define CONDUCT_1 (1<<5) /// For machines and structures that should not break into parts, eg, holodeck stuff #define NODECONSTRUCT_1 (1<<7) -/// atom queued to SSoverlay -#define OVERLAY_QUEUED_1 (1<<8) /// item has priority to check when entering or leaving -#define ON_BORDER_1 (1<<9) +#define ON_BORDER_1 (1<<8) //Whether or not this atom shows screentips when hovered over -#define NO_SCREENTIPS_1 (1<<10) +#define NO_SCREENTIPS_1 (1<<9) /// Prevent clicking things below it on the same turf eg. doors/ fulltile windows -#define PREVENT_CLICK_UNDER_1 (1<<11) -#define HOLOGRAM_1 (1<<12) +#define PREVENT_CLICK_UNDER_1 (1<<10) +#define HOLOGRAM_1 (1<<11) /// Prevents mobs from getting chainshocked by teslas and the supermatter -#define SHOCKED_1 (1<<13) +#define SHOCKED_1 (1<<12) ///Whether /atom/Initialize() has already run for the object -#define INITIALIZED_1 (1<<14) +#define INITIALIZED_1 (1<<13) /// was this spawned by an admin? used for stat tracking stuff. -#define ADMIN_SPAWNED_1 (1<<15) +#define ADMIN_SPAWNED_1 (1<<14) /// should not get harmed if this gets caught by an explosion? -#define PREVENT_CONTENTS_EXPLOSION_1 (1<<16) +#define PREVENT_CONTENTS_EXPLOSION_1 (1<<15) /// should the contents of this atom be acted upon -#define RAD_PROTECT_CONTENTS_1 (1 << 17) +#define RAD_PROTECT_CONTENTS_1 (1 << 16) /// should this object be allowed to be contaminated -#define RAD_NO_CONTAMINATE_1 (1 << 18) +#define RAD_NO_CONTAMINATE_1 (1 << 17) ///Use when this shouldn't be obscured by large icons, like trees. -#define SHOW_BEHIND_LARGE_ICONS_1 (1<<12) +#define SHOW_BEHIND_LARGE_ICONS_1 (1<<18) /// Should we use the initial icon for display? Mostly used by overlay only objects -#define HTML_USE_INITAL_ICON_1 (1<<20) +#define HTML_USE_INITAL_ICON_1 (1<<19) // Update flags for [/atom/proc/update_appearance] /// Update the atom's name diff --git a/code/__DEFINES/is_helpers.dm b/code/__DEFINES/is_helpers.dm index 5bf9e3add6ad..c5e0505487d2 100644 --- a/code/__DEFINES/is_helpers.dm +++ b/code/__DEFINES/is_helpers.dm @@ -140,8 +140,6 @@ GLOBAL_LIST_INIT(turfs_without_ground, typecacheof(list( #define ismegafauna(A) (istype(A, /mob/living/simple_animal/hostile/megafauna)) -#define isclown(A) (istype(A, /mob/living/simple_animal/hostile/retaliate/clown)) - #define isborer(A) (istype(A, /mob/living/simple_animal/borer)) //Misc mobs diff --git a/code/__DEFINES/mobs.dm b/code/__DEFINES/mobs.dm index 7230e7cfab9b..9b8514d8bea8 100644 --- a/code/__DEFINES/mobs.dm +++ b/code/__DEFINES/mobs.dm @@ -444,3 +444,6 @@ //Saves a proc call, life is suffering. If who has no targets_from var, we assume it's just who #define GET_TARGETS_FROM(who) (who.targets_from ? who.get_targets_from() : who) + +/// In dynamic human icon gen we don't replace the held item. +#define NO_REPLACE 0 diff --git a/code/__DEFINES/overlays.dm b/code/__DEFINES/overlays.dm new file mode 100644 index 000000000000..b21bb5007672 --- /dev/null +++ b/code/__DEFINES/overlays.dm @@ -0,0 +1,27 @@ +/* I do want this however this currently only fails on decals specificly in create and destroy. + Updating the overlays in genral was already pretty unatomic.area + I've added porting some updated decal code from tg to resolve this to my list. + WARNING("Too many overlays on [changed_on.type] - [length(changed_on.overlays)], refusing to update and cutting.\ + \n What follows is a printout of all existing overlays at the time of the overflow \n[text_lays]"); \ +*/ + +// A reasonable number of maximum overlays an object needs +// If you think you need more, rethink it +#define MAX_ATOM_OVERLAYS 100 + +/// Checks if an atom has reached the overlay limit, and make a loud error if it does. +#define VALIDATE_OVERLAY_LIMIT(changed_on) \ + if(length(changed_on.overlays) >= MAX_ATOM_OVERLAYS) { \ + changed_on.overlays.Cut(); \ + } \ + +/// Performs any operations that ought to run after an appearance change +#define POST_OVERLAY_CHANGE(changed_on) \ + if(alternate_appearances) { \ + for(var/I in changed_on.alternate_appearances){\ + var/datum/atom_hud/alternate_appearance/AA = changed_on.alternate_appearances[I];\ + if(AA.transfer_overlays){\ + AA.copy_overlays(changed_on, TRUE);\ + }\ + } \ + } diff --git a/code/__DEFINES/stat_tracking.dm b/code/__DEFINES/stat_tracking.dm index 69ea3c598bee..a7be42d4c4e2 100644 --- a/code/__DEFINES/stat_tracking.dm +++ b/code/__DEFINES/stat_tracking.dm @@ -8,10 +8,6 @@ #define STAT_LOG_ENTRY(entrylist, entryname) \ var/list/STAT_ENTRY = entrylist[entryname] || (entrylist[entryname] = new /list(STAT_ENTRY_LENGTH)); \ STAT_ENTRY[STAT_ENTRY_TIME] += STAT_TIME; \ - var/STAT_INCR_AMOUNT = min(1, 2**round((STAT_ENTRY[STAT_ENTRY_COUNT] || 0)/SHORT_REAL_LIMIT)); \ - if (STAT_INCR_AMOUNT == 1 || prob(100/STAT_INCR_AMOUNT)) { \ - STAT_ENTRY[STAT_ENTRY_COUNT] += STAT_INCR_AMOUNT; \ - }; \ - + STAT_ENTRY[STAT_ENTRY_COUNT] += 1; diff --git a/code/__DEFINES/subsystems.dm b/code/__DEFINES/subsystems.dm index b702358a9977..e82c04f57904 100644 --- a/code/__DEFINES/subsystems.dm +++ b/code/__DEFINES/subsystems.dm @@ -241,31 +241,6 @@ #define SSEXPLOSIONS_TURFS 2 #define SSEXPLOSIONS_THROWS 3 -//! ## Overlays subsystem - -///Compile all the overlays for an atom from the cache lists -// |= on overlays is not actually guaranteed to not add same appearances but we're optimistically using it anyway. -#define COMPILE_OVERLAYS(A) \ - do{ \ - var/list/ad = A.add_overlays; \ - var/list/rm = A.remove_overlays; \ - if(LAZYLEN(rm)){ \ - A.overlays -= rm; \ - rm.Cut(); \ - } \ - if(LAZYLEN(ad)){ \ - A.overlays |= ad; \ - ad.Cut(); \ - } \ - for(var/I in A.alternate_appearances){ \ - var/datum/atom_hud/alternate_appearance/AA = A.alternate_appearances[I]; \ - if(AA.transfer_overlays){ \ - AA.copy_overlays(A, TRUE); \ - } \ - } \ - A.flags_1 &= ~OVERLAY_QUEUED_1; \ - }while(FALSE) - // Vote subsystem counting methods /// First past the post. One selection per person, and the selection with the most votes wins. #define VOTE_COUNT_METHOD_SINGLE 1 diff --git a/code/__HELPERS/dynamic_human_icon_gen.dm b/code/__HELPERS/dynamic_human_icon_gen.dm new file mode 100644 index 000000000000..c884e901d4fa --- /dev/null +++ b/code/__HELPERS/dynamic_human_icon_gen.dm @@ -0,0 +1,65 @@ +///Global list of all dynamically generated icons, for caching, so we don't have to generate multiple times. +GLOBAL_LIST_EMPTY(dynamic_human_appearances) + +/// Creates a human with the given parameters and returns an appearance of it +/proc/get_dynamic_human_appearance(outfit_path, species_path = /datum/species/human, mob_spawn_path, r_hand, l_hand, bloody_slots = NONE, animated = TRUE) + if(!species_path) + return FALSE + if(!ispath(species_path)) + stack_trace("Attempted to call get_dynamic_human_appearance() with an instantiated species_path. Pass the species datum typepath instead.") + return FALSE + var/arg_string = "[outfit_path]_[species_path]_[mob_spawn_path]_[l_hand]_[r_hand]_[bloody_slots]" + if(GLOB.dynamic_human_appearances[arg_string]) //if already exists in our cache, just return that + return GLOB.dynamic_human_appearances[arg_string] + var/mob/living/carbon/human/dummy/consistent/dummy = new() + dummy.set_species(species_path) + dummy.stat = CONSCIOUS //He needs to be alive or he has no eyes. Scary + 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, visualsOnly = TRUE) + else if(mob_spawn_path) + var/obj/effect/mob_spawn/human/spawner = new mob_spawn_path(null) + if(r_hand != NO_REPLACE) + spawner.r_hand = r_hand + if(l_hand != NO_REPLACE) + spawner.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() + dummy.regenerate_icons() + var/mutable_appearance/output = dummy.appearance + GLOB.dynamic_human_appearances[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_appearance(atom/target, outfit_path, species_path = /datum/species/human, mob_spawn_path, r_hand, l_hand, bloody_slots = NONE) + INVOKE_ASYNC(GLOBAL_PROC, GLOBAL_PROC_REF(set_dynamic_human_appearance), args) + +///This proc gets an argument of a target and runs +/proc/set_dynamic_human_appearance(list/arguments) + var/atom/target = arguments[1] //1st argument is the target + var/dynamic_appearance = get_dynamic_human_appearance(arglist(arguments.Copy(2))) //the rest of the arguments starting from 2 matter to the proc + target.icon = 'icons/mob/human.dmi' + target.icon_state = "" + target.appearance_flags |= KEEP_TOGETHER + target.copy_overlays(dynamic_appearance, TRUE) diff --git a/code/__HELPERS/icons.dm b/code/__HELPERS/icons.dm index 3e676f289458..9f229669c4a6 100644 --- a/code/__HELPERS/icons.dm +++ b/code/__HELPERS/icons.dm @@ -1084,7 +1084,6 @@ GLOBAL_LIST_EMPTY(friendly_animal_types) var/icon/out_icon = icon('icons/effects/effects.dmi', "nothing") - COMPILE_OVERLAYS(body) for(var/D in showDirs) body.setDir(D) var/icon/partial = getFlatIcon(body, defdir=D) diff --git a/code/_compile_options.dm b/code/_compile_options.dm index 9ff2cbe896ae..d5f43d594be8 100644 --- a/code/_compile_options.dm +++ b/code/_compile_options.dm @@ -87,10 +87,6 @@ #define SHIP_PLACEMENT_TEST #endif -// A reasonable number of maximum overlays an object needs -// If you think you need more, rethink it -#define MAX_ATOM_OVERLAYS 100 - #if defined(OPENDREAM) #if !defined(CIBUILDING) #warn You are building with OpenDream. Remember to build TGUI manually. diff --git a/code/_globalvars/bitfields.dm b/code/_globalvars/bitfields.dm index 61fa476fe7b1..0af9eb6bca23 100644 --- a/code/_globalvars/bitfields.dm +++ b/code/_globalvars/bitfields.dm @@ -99,7 +99,6 @@ DEFINE_BITFIELD(flags_1, list( "NO_LAVA_GEN_1" = NO_LAVA_GEN_1, "NO_RUINS_1" = NO_RUINS_1, "ON_BORDER_1" = ON_BORDER_1, - "OVERLAY_QUEUED_1" = OVERLAY_QUEUED_1, "PREVENT_CLICK_UNDER_1" = PREVENT_CLICK_UNDER_1, "PREVENT_CONTENTS_EXPLOSION_1" = PREVENT_CONTENTS_EXPLOSION_1, "RAD_NO_CONTAMINATE_1" = RAD_NO_CONTAMINATE_1, diff --git a/code/_globalvars/misc.dm b/code/_globalvars/misc.dm index d6c720380f46..cde6b820ad32 100644 --- a/code/_globalvars/misc.dm +++ b/code/_globalvars/misc.dm @@ -29,3 +29,5 @@ GLOBAL_LIST_EMPTY(poll_options) GLOBAL_PROTECT(poll_options) GLOBAL_VAR_INIT(internal_tick_usage, 0.2 * world.tick_lag) //This var is updated every tick by a DLL if present, used to reduce lag + +GLOBAL_VAR_INIT(running_create_and_destroy, FALSE) diff --git a/code/controllers/subsystem/overlays.dm b/code/controllers/subsystem/overlays.dm index 43cccd87abbd..41df60feee45 100644 --- a/code/controllers/subsystem/overlays.dm +++ b/code/controllers/subsystem/overlays.dm @@ -1,184 +1,106 @@ SUBSYSTEM_DEF(overlays) name = "Overlay" - flags = SS_TICKER - wait = 1 - priority = FIRE_PRIORITY_OVERLAYS - init_order = INIT_ORDER_OVERLAY - - var/list/queue + flags = SS_NO_FIRE|SS_NO_INIT var/list/stats - var/list/overlay_icon_state_caches - var/list/overlay_icon_cache /datum/controller/subsystem/overlays/PreInit() - overlay_icon_state_caches = list() - overlay_icon_cache = list() - queue = list() stats = list() -/datum/controller/subsystem/overlays/Initialize() - initialized = TRUE - fire(mc_check = FALSE) - return ..() - - -/datum/controller/subsystem/overlays/stat_entry(msg) - msg = "Ov:[length(queue)]" - return ..() - - /datum/controller/subsystem/overlays/Shutdown() text2file(render_stats(stats), "[GLOB.log_directory]/overlay.log") - /datum/controller/subsystem/overlays/Recover() - overlay_icon_state_caches = SSoverlays.overlay_icon_state_caches - overlay_icon_cache = SSoverlays.overlay_icon_cache - queue = SSoverlays.queue - - -/datum/controller/subsystem/overlays/fire(resumed = FALSE, mc_check = TRUE) - var/list/queue = src.queue - var/static/count = 0 - if (count) - var/c = count - count = 0 //so if we runtime on the Cut, we don't try again. - queue.Cut(1,c+1) - - for (var/thing in queue) - count++ - if(thing) - STAT_START_STOPWATCH - var/atom/A = thing - COMPILE_OVERLAYS(A) - STAT_STOP_STOPWATCH - STAT_LOG_ENTRY(stats, A.type) - if(mc_check) - if(MC_TICK_CHECK) - break - else - CHECK_TICK - - if (count) - queue.Cut(1,count+1) - count = 0 + stats = SSoverlays.stats + +/// Converts an overlay list into text for debug printing +/// Of note: overlays aren't actually mutable appearances, they're just appearances +/// Don't have access to that type tho, so this is the best you're gonna get +/proc/overlays2text(list/overlays) + var/list/unique_overlays = list() + // As anything because we're basically doing type coercion, rather then actually filtering for mutable appearances + for(var/mutable_appearance/overlay as anything in overlays) + var/key = "[overlay.icon]-[overlay.icon_state]-[overlay.dir]" + unique_overlays[key] += 1 + var/list/output_text = list() + for(var/key in unique_overlays) + output_text += "([key]) = [unique_overlays[key]]" + return output_text.Join("\n") /proc/iconstate2appearance(icon, iconstate) var/static/image/stringbro = new() - var/list/icon_states_cache = SSoverlays.overlay_icon_state_caches - var/list/cached_icon = icon_states_cache[icon] - if (cached_icon) - var/cached_appearance = cached_icon["[iconstate]"] - if (cached_appearance) - return cached_appearance stringbro.icon = icon stringbro.icon_state = iconstate - if (!cached_icon) //not using the macro to save an associated lookup - cached_icon = list() - icon_states_cache[icon] = cached_icon - var/cached_appearance = stringbro.appearance - cached_icon["[iconstate]"] = cached_appearance - return cached_appearance + return stringbro.appearance /proc/icon2appearance(icon) var/static/image/iconbro = new() - var/list/icon_cache = SSoverlays.overlay_icon_cache - . = icon_cache[icon] - if (!.) - iconbro.icon = icon - . = iconbro.appearance - icon_cache[icon] = . - -/atom/proc/build_appearance_list(old_overlays) - var/static/image/appearance_bro = new() - var/list/new_overlays = list() - if (!islist(old_overlays)) - old_overlays = list(old_overlays) - for (var/overlay in old_overlays) + iconbro.icon = icon + return iconbro.appearance + +/atom/proc/build_appearance_list(list/build_overlays) + if (!islist(build_overlays)) + build_overlays = list(build_overlays) + for (var/overlay in build_overlays) if(!overlay) + build_overlays -= overlay continue if (istext(overlay)) - new_overlays += iconstate2appearance(icon, overlay) + var/index = build_overlays.Find(overlay) + build_overlays[index] = iconstate2appearance(icon, overlay) else if(isicon(overlay)) - new_overlays += icon2appearance(overlay) - else - if(isloc(overlay)) - var/atom/A = overlay - if (A.flags_1 & OVERLAY_QUEUED_1) - COMPILE_OVERLAYS(A) - appearance_bro.appearance = overlay //this works for images and atoms too! - if(!ispath(overlay)) - var/image/I = overlay - appearance_bro.dir = I.dir - new_overlays += appearance_bro.appearance - return new_overlays - -#define NOT_QUEUED_ALREADY (!(flags_1 & OVERLAY_QUEUED_1)) -#define QUEUE_FOR_COMPILE flags_1 |= OVERLAY_QUEUED_1; SSoverlays.queue += src; -/atom/proc/cut_overlays() - LAZYINITLIST(remove_overlays) - LAZYINITLIST(add_overlays) - remove_overlays = overlays.Copy() - add_overlays.Cut() - - //If not already queued for work and there are overlays to remove - if(NOT_QUEUED_ALREADY && remove_overlays.len) - QUEUE_FOR_COMPILE + var/index = build_overlays.Find(overlay) + build_overlays[index] = icon2appearance(overlay) + return build_overlays -/mob/living/carbon/cut_overlays() - icon_render_keys = list() - return ..() +/atom/proc/cut_overlays() + STAT_START_STOPWATCH + overlays = null + POST_OVERLAY_CHANGE(src) + STAT_STOP_STOPWATCH + STAT_LOG_ENTRY(SSoverlays.stats, type) -/atom/proc/cut_overlay(list/overlays) +/atom/proc/cut_overlay(list/remove_overlays) if(!overlays) return - overlays = build_appearance_list(overlays) - LAZYINITLIST(add_overlays) //always initialized after this point - LAZYINITLIST(remove_overlays) - var/a_len = add_overlays.len - var/r_len = remove_overlays.len - remove_overlays += overlays - add_overlays -= overlays - - var/fa_len = add_overlays.len - var/fr_len = remove_overlays.len - - //If not already queued and there is work to be done - if(NOT_QUEUED_ALREADY && (fa_len != a_len || fr_len != r_len)) - QUEUE_FOR_COMPILE - -/atom/proc/add_overlay(list/overlays) + STAT_START_STOPWATCH + overlays -= build_appearance_list(remove_overlays) + POST_OVERLAY_CHANGE(src) + STAT_STOP_STOPWATCH + STAT_LOG_ENTRY(SSoverlays.stats, type) + +/atom/proc/add_overlay(list/add_overlays) if(!overlays) return - - overlays = build_appearance_list(overlays) - - LAZYINITLIST(add_overlays) //always initialized after this point - var/a_len = add_overlays.len - - add_overlays += overlays - var/fa_len = add_overlays.len - if(NOT_QUEUED_ALREADY && fa_len != a_len) - QUEUE_FOR_COMPILE - -/atom/proc/copy_overlays(atom/other, cut_old) //copys our_overlays from another atom + STAT_START_STOPWATCH + overlays += build_appearance_list(add_overlays) + VALIDATE_OVERLAY_LIMIT(src) + POST_OVERLAY_CHANGE(src) + STAT_STOP_STOPWATCH + STAT_LOG_ENTRY(SSoverlays.stats, type) + +/atom/proc/copy_overlays(atom/other, cut_old) //copys our_overlays from another atom if(!other) if(cut_old) cut_overlays() return + STAT_START_STOPWATCH var/list/cached_other = other.overlays.Copy() - if(cached_other) - if(cut_old || !LAZYLEN(overlays)) - remove_overlays = overlays - add_overlays = cached_other - if(NOT_QUEUED_ALREADY) - QUEUE_FOR_COMPILE - else if(cut_old) - cut_overlays() - -#undef NOT_QUEUED_ALREADY -#undef QUEUE_FOR_COMPILE + if(cut_old) + if(cached_other) + overlays = cached_other + else + overlays = null + VALIDATE_OVERLAY_LIMIT(src) + POST_OVERLAY_CHANGE(src) + STAT_STOP_STOPWATCH + STAT_LOG_ENTRY(SSoverlays.stats, type) + else if(cached_other) + overlays += cached_other + VALIDATE_OVERLAY_LIMIT(src) + POST_OVERLAY_CHANGE(src) + STAT_STOP_STOPWATCH + STAT_LOG_ENTRY(SSoverlays.stats, type) //TODO: Better solution for these? /image/proc/add_overlay(x) @@ -204,3 +126,100 @@ SUBSYSTEM_DEF(overlays) overlays |= cached_other else if(cut_old) cut_overlays() + +// Debug procs + +/atom + /// List of overlay "keys" (info about the appearance) -> mutable versions of static appearances + /// Drawn from the overlays list + var/list/realized_overlays + /// List of underlay "keys" (info about the appearance) -> mutable versions of static appearances + /// Drawn from the underlays list + var/list/realized_underlays + +/image + /// List of overlay "keys" (info about the appearance) -> mutable versions of static appearances + /// Drawn from the overlays list + var/list/realized_overlays + /// List of underlay "keys" (info about the appearance) -> mutable versions of static appearances + /// Drawn from the underlays list + var/list/realized_underlays + +/// Takes the atoms's existing overlays and underlays, and makes them mutable so they can be properly vv'd in the realized_overlays/underlays list +/atom/proc/realize_overlays() + realized_overlays = realize_appearance_queue(overlays) + realized_underlays = realize_appearance_queue(underlays) + +/// Takes the image's existing overlays, and makes them mutable so they can be properly vv'd in the realized_overlays list +/image/proc/realize_overlays() + realized_overlays = realize_appearance_queue(overlays) + realized_underlays = realize_appearance_queue(underlays) + +/// Takes a list of appearnces, makes them mutable so they can be properly vv'd and inspected +/proc/realize_appearance_queue(list/appearances) + var/list/real_appearances = list() + var/list/queue = appearances.Copy() + var/queue_index = 0 + while(queue_index < length(queue)) + queue_index++ + // If it's not a command, we assert that it's an appearance + var/mutable_appearance/appearance = queue[queue_index] + if(!appearance) // Who fucking adds nulls to their sublists god you people are the worst + continue + + var/mutable_appearance/new_appearance = new /mutable_appearance() + new_appearance.appearance = appearance + var/key = "[appearance.icon]-[appearance.icon_state]-[appearance.plane]-[appearance.layer]-[appearance.dir]-[appearance.color]" + var/tmp_key = key + var/appearance_indx = 1 + while(real_appearances[tmp_key]) + tmp_key = "[key]-[appearance_indx]" + appearance_indx++ + + real_appearances[tmp_key] = new_appearance + var/add_index = queue_index + // Now check its children + for(var/mutable_appearance/child_appearance as anything in appearance.overlays) + add_index++ + queue.Insert(add_index, child_appearance) + for(var/mutable_appearance/child_appearance as anything in appearance.underlays) + add_index++ + queue.Insert(add_index, child_appearance) + return real_appearances + +/// Takes two appearances as args, prints out, logs, and returns a text representation of their differences +/// Including suboverlays +/proc/diff_appearances(mutable_appearance/first, mutable_appearance/second, iter = 0) + var/list/diffs = list() + var/list/firstdeet = first.vars + var/list/seconddeet = second.vars + var/diff_found = FALSE + for(var/name in first.vars) + var/firstv = firstdeet[name] + var/secondv = seconddeet[name] + if(firstv ~= secondv) + continue + if((islist(firstv) || islist(secondv)) && length(firstv) == 0 && length(secondv) == 0) + continue + if(name == "vars") // Go away + continue + if(name == "_listen_lookup") // This is just gonna happen with marked datums, don't care + continue + if(name == "overlays") + first.realize_overlays() + second.realize_overlays() + var/overlays_differ = FALSE + for(var/i in 1 to length(first.realized_overlays)) + if(diff_appearances(first.realized_overlays[i], second.realized_overlays[i], iter + 1)) + overlays_differ = TRUE + + if(!overlays_differ) + continue + + diff_found = TRUE + diffs += "Diffs detected at [name]: First ([firstv]), Second ([secondv])" + + var/text = "Depth of: [iter]\n\t[diffs.Join("\n\t")]" + message_admins(text) + log_world(text) + return diff_found diff --git a/code/controllers/subsystem/traumas.dm b/code/controllers/subsystem/traumas.dm index 3a046a9aa020..95398ee7504a 100644 --- a/code/controllers/subsystem/traumas.dm +++ b/code/controllers/subsystem/traumas.dm @@ -68,7 +68,7 @@ SUBSYSTEM_DEF(traumas) "clowns" = typecacheof(list( /obj/item/clothing/under/rank/civilian/clown, /obj/item/clothing/mask/gas/clown_hat, /obj/item/instrument/bikehorn, - /obj/item/pda/clown, /obj/item/grown/bananapeel, /obj/item/reagent_containers/food/snacks/cheesiehonkers, + /obj/item/grown/bananapeel, /obj/item/reagent_containers/food/snacks/cheesiehonkers, /obj/item/trash/cheesie)), "greytide" = typecacheof(list( diff --git a/code/datums/holocall.dm b/code/datums/holocall.dm index d394d7707be8..c2b8a58a1f35 100644 --- a/code/datums/holocall.dm +++ b/code/datums/holocall.dm @@ -324,7 +324,6 @@ if(outfit_type) mannequin.equipOutfit(outfit_type,TRUE) mannequin.setDir(SOUTH) - COMPILE_OVERLAYS(mannequin) . = image(mannequin) unset_busy_human_dummy("HOLODISK_PRESET") diff --git a/code/game/atoms.dm b/code/game/atoms.dm index 75a36e1aa677..fe01a7edd1c4 100644 --- a/code/game/atoms.dm +++ b/code/game/atoms.dm @@ -680,9 +680,13 @@ SSvis_overlays.remove_vis_overlay(src, managed_vis_overlays) var/list/new_overlays = update_overlays() - if(managed_overlays) - cut_overlay(managed_overlays) - managed_overlays = null + if (managed_overlays) + if (length(overlays) == (islist(managed_overlays) ? length(managed_overlays) : 1)) + overlays = null + POST_OVERLAY_CHANGE(src) + else + cut_overlay(managed_overlays) + managed_overlays = null if(length(new_overlays)) managed_overlays = new_overlays add_overlay(new_overlays) diff --git a/code/game/machinery/syndicatebeacon.dm b/code/game/machinery/syndicatebeacon.dm index 4d37127659cd..f02763fb0e73 100644 --- a/code/game/machinery/syndicatebeacon.dm +++ b/code/game/machinery/syndicatebeacon.dm @@ -133,10 +133,6 @@ desc = "A label on it reads: Warning: Activating this device will send a power draining device to your location." droptype = /obj/item/powersink -/obj/item/sbeacondrop/clownbomb - desc = "A label on it reads: Warning: Activating this device will send a silly explosive to your location." - droptype = /obj/machinery/syndicatebomb/badmin/clown - /obj/item/sbeacondrop/semiautoturret desc = "A label on it reads: Warning: Activating this device will send a semi-auto turret to your location." droptype = /obj/machinery/porta_turret/syndicate/pod diff --git a/code/game/machinery/syndicatebomb.dm b/code/game/machinery/syndicatebomb.dm index 7df56b390f1b..eea0c58b4ba0 100644 --- a/code/game/machinery/syndicatebomb.dm +++ b/code/game/machinery/syndicatebomb.dm @@ -225,13 +225,6 @@ desc = "Oh god what is in this thing?" payload = /obj/item/bombcore/badmin/summon -/obj/machinery/syndicatebomb/badmin/clown - name = "clown bomb" - icon_state = "clown-bomb" - desc = "HONK." - payload = /obj/item/bombcore/badmin/summon/clown - beepsound = 'sound/items/bikehorn.ogg' - /obj/machinery/syndicatebomb/empty name = "bomb" icon_state = "base-bomb" @@ -347,14 +340,6 @@ qdel(B) qdel(src) -/obj/item/bombcore/badmin/summon/clown - summon_path = /mob/living/simple_animal/hostile/retaliate/clown - amt_summon = 50 - -/obj/item/bombcore/badmin/summon/clown/defuse() - playsound(src, 'sound/misc/sadtrombone.ogg', 50) - ..() - /obj/item/bombcore/large name = "large bomb payload" range_heavy = 5 diff --git a/code/game/objects/effects/contraband.dm b/code/game/objects/effects/contraband.dm index 1227ff3847b3..547998701310 100644 --- a/code/game/objects/effects/contraband.dm +++ b/code/game/objects/effects/contraband.dm @@ -270,11 +270,6 @@ desc = "A old poster urging people to join the ACLF for not only the right cause, but to explore the galaxy. This is probably outdated." icon_state = "poster_aclf_enlistment" -/obj/structure/sign/poster/contraband/clown - name = "Clown" - desc = "A poster making fun of the 'clown planet incident' You almost cut yourself on the edge of this poster." - icon_state = "poster_honk" - /obj/structure/sign/poster/contraband/smoke name = "Smoke" desc = "A poster advertising some brand of cigarettes." diff --git a/code/game/objects/effects/decals/decal.dm b/code/game/objects/effects/decals/decal.dm index 505221b2b013..41652d539940 100644 --- a/code/game/objects/effects/decals/decal.dm +++ b/code/game/objects/effects/decals/decal.dm @@ -5,12 +5,15 @@ resistance_flags = FIRE_PROOF | UNACIDABLE | ACID_PROOF var/turf_loc_check = TRUE -/obj/effect/decal/Initialize() +/obj/effect/decal/Initialize(mapload) . = ..() - if(turf_loc_check && (!isturf(loc) || NeverShouldHaveComeHere(loc))) + if(NeverShouldHaveComeHere(loc)) + if(mapload) + WARNING("[name] spawned in a bad turf ([loc]) at [AREACOORD(src)] in \the [get_area(src)]. \ + Please remove it or allow it to pass NeverShouldHaveComeHere if it's intended.") return INITIALIZE_HINT_QDEL var/static/list/loc_connections = list( - COMSIG_TURF_CHANGED = PROC_REF(handle_turf_change), + COMSIG_TURF_CHANGE = PROC_REF(on_decal_move), ) AddElement(/datum/element/connect_loc, loc_connections) @@ -24,7 +27,7 @@ if(!(resistance_flags & FIRE_PROOF)) //non fire proof decal or being burned by lava qdel(src) -/obj/effect/decal/proc/handle_turf_change(turf/source, path, list/new_baseturfs, flags, list/post_change_callbacks) +/obj/effect/decal/proc/on_decal_move(turf/source, path, list/new_baseturfs, flags, list/post_change_callbacks) SIGNAL_HANDLER post_change_callbacks += CALLBACK(src, PROC_REF(sanity_check_self)) @@ -61,5 +64,17 @@ /obj/effect/turf_decal/Destroy(force) SHOULD_CALL_PARENT(FALSE) + + // If we don't do this, turf decals will end up stacking up on a tile, and break the overlay limit + // I hate it too bestie + if(GLOB.running_create_and_destroy) + var/turf/T = loc + T.RemoveElement(/datum/element/decal, icon, icon_state, dir, FALSE, color, null, null, alpha, FALSE) + if(detail_overlay) + T.RemoveElement(/datum/element/decal, icon, detail_overlay, dir, FALSE, detail_color, null, null, alpha, appearance_flags) + + // Intentionally used over moveToNullspace(), which calls doMove(), which fires + // off an enormous amount of procs, signals, etc, that this temporary effect object + // never needs or affects. loc = null return QDEL_HINT_QUEUE diff --git a/code/game/objects/items/devices/PDA/PDA_types.dm b/code/game/objects/items/devices/PDA/PDA_types.dm index 4a7817c5eb60..9816ad7eadd6 100644 --- a/code/game/objects/items/devices/PDA/PDA_types.dm +++ b/code/game/objects/items/devices/PDA/PDA_types.dm @@ -1,48 +1,3 @@ -//Clown PDA is slippery. -/obj/item/pda/clown - name = "clown PDA" - default_cartridge = /obj/item/cartridge/virus/clown - inserted_item = /obj/item/toy/crayon/rainbow - icon_state = "pda-clown" - desc = "A portable microcomputer by Thinktronic Systems, LTD. The surface is coated with polytetrafluoroethylene and banana drippings." - ttone = "honk" - var/slipvictims = list() //Track slipped people - -/obj/item/pda/clown/ComponentInitialize() - . = ..() - AddComponent(/datum/component/wearertargeting/sitcomlaughter, CALLBACK(src, PROC_REF(after_sitcom_laugh))) - -/obj/item/pda/clown/proc/AfterSlip(mob/living/carbon/human/M) - if (istype(M) && (M.real_name != owner)) - slipvictims |= M - var/obj/item/cartridge/virus/clown/cart = cartridge - if(istype(cart) && cart.charges < 5) - cart.charges++ - -/obj/item/pda/clown/proc/after_sitcom_laugh(mob/victim) - victim.visible_message("[src] lets out a burst of laughter!") - -//Mime PDA sends "silent" messages. -/obj/item/pda/mime - name = "mime PDA" - default_cartridge = /obj/item/cartridge/virus/mime - inserted_item = /obj/item/toy/crayon/mime - icon_state = "pda-mime" - desc = "A portable microcomputer by Thinktronic Systems, LTD. The hardware has been modified for compliance with the vows of silence." - allow_emojis = TRUE - silent = TRUE - ttone = "silence" - -/obj/item/pda/mime/msg_input(mob/living/U = usr) - if(emped || toff) - return - var/emojis = emoji_sanitize(stripped_input(U, "Please enter emojis", name)) - if(!emojis) - return - if(!U.canUseTopic(src, BE_CLOSE)) - return - return emojis - // Special AI/pAI PDAs that cannot explode. /obj/item/pda/ai icon = null diff --git a/code/game/objects/items/devices/radio/headset.dm b/code/game/objects/items/devices/radio/headset.dm index cc091b4edbce..70a6f7890173 100644 --- a/code/game/objects/items/devices/radio/headset.dm +++ b/code/game/objects/items/devices/radio/headset.dm @@ -28,6 +28,7 @@ GLOBAL_LIST_INIT(channel_tokens, list( var/obj/item/encryptionkey/keyslot2 = null dog_fashion = null supports_variations = VOX_VARIATION + var/hearing_protection = FALSE /obj/item/radio/headset/examine(mob/user) . = ..() @@ -54,6 +55,11 @@ GLOBAL_LIST_INIT(channel_tokens, list( . = ..() recalculateChannels() +/obj/item/radio/headset/ComponentInitialize() + . = ..() + if(hearing_protection) + AddComponent(/datum/component/wearertargeting/earprotection, list(ITEM_SLOT_EARS)) + /obj/item/radio/headset/Destroy() QDEL_NULL(keyslot2) return ..() @@ -80,10 +86,7 @@ GLOBAL_LIST_INIT(channel_tokens, list( name = "bowman headset" desc = "An updated, modular intercom that fits over the head. Protects ears from flashbangs." icon_state = "headset_alt" - -/obj/item/radio/headset/alt/ComponentInitialize() - . = ..() - AddComponent(/datum/component/wearertargeting/earprotection, list(ITEM_SLOT_EARS)) + hearing_protection = TRUE //syndicate /obj/item/radio/headset/syndicate @@ -102,6 +105,7 @@ GLOBAL_LIST_INIT(channel_tokens, list( name = "syndicate bowman headset" desc = "A headset worn by members of the various Syndicate splinters on the frontier. Protects ears from flashbangs." icon_state = "syndie_headset_alt" + hearing_protection = TRUE /obj/item/radio/headset/syndicate/alt/captain name = "syndicate leader bowman headset" @@ -109,10 +113,6 @@ GLOBAL_LIST_INIT(channel_tokens, list( command = TRUE keyslot2 = new /obj/item/encryptionkey/heads/captain -/obj/item/radio/headset/syndicate/alt/ComponentInitialize() - . = ..() - AddComponent(/datum/component/wearertargeting/earprotection, list(ITEM_SLOT_EARS)) - /obj/item/radio/headset/syndicate/alt/leader name = "team leader headset" command = TRUE @@ -154,6 +154,7 @@ GLOBAL_LIST_INIT(channel_tokens, list( name = "nanotrasen bowman headset" desc = "Worn proudly by the battered remnants of Nanotrasen's frontier holdings. Protects ears from flashbangs." icon_state = "nanotrasen_headset_alt" + hearing_protection = TRUE /obj/item/radio/headset/nanotrasen/alt/captain name = "nanotrasen captain's bowman headset" @@ -161,10 +162,6 @@ GLOBAL_LIST_INIT(channel_tokens, list( keyslot2 = new /obj/item/encryptionkey/heads/captain command = TRUE -/obj/item/radio/headset/nanotrasen/alt/ComponentInitialize() - . = ..() - AddComponent(/datum/component/wearertargeting/earprotection, list(ITEM_SLOT_EARS)) - //clip /obj/item/radio/headset/clip name = "minutemen radio headset" @@ -181,7 +178,9 @@ GLOBAL_LIST_INIT(channel_tokens, list( /obj/item/radio/headset/clip/alt name = "minutemen bowman headset" desc = "Used by militias flying the five stars of the Colonial Minutemen. Protects ears from flashbangs." + icon_state = "clip_headset_alt" mob_overlay_state = "cmm_headset_alt" + hearing_protection = TRUE /obj/item/radio/headset/clip/alt/captain name = "minuteman officer bowman headset" @@ -189,10 +188,6 @@ GLOBAL_LIST_INIT(channel_tokens, list( keyslot2 = new /obj/item/encryptionkey/heads/captain command = TRUE -/obj/item/radio/headset/clip/alt/ComponentInitialize() - . = ..() - AddComponent(/datum/component/wearertargeting/earprotection, list(ITEM_SLOT_EARS)) - //inteq /obj/item/radio/headset/inteq name = "inteq radio headset" @@ -210,10 +205,7 @@ GLOBAL_LIST_INIT(channel_tokens, list( name = "inteq bowman headset" desc = "This is used by Inteq Risk Management Group's mercenaries. Protects ears from flashbangs." icon_state = "inteq_headset_alt" - -/obj/item/radio/headset/inteq/alt/ComponentInitialize() - . = ..() - AddComponent(/datum/component/wearertargeting/earprotection, list(ITEM_SLOT_EARS)) + hearing_protection = TRUE /obj/item/radio/headset/inteq/alt/captain name = "vanguard bowman headset" @@ -221,10 +213,6 @@ GLOBAL_LIST_INIT(channel_tokens, list( keyslot2 = new /obj/item/encryptionkey/heads/captain command = TRUE -/obj/item/radio/headset/inteq/alt/ComponentInitialize() - . = ..() - AddComponent(/datum/component/wearertargeting/earprotection, list(ITEM_SLOT_EARS)) - //pirate /obj/item/radio/headset/pirate name = "pirate radio headset" @@ -242,6 +230,7 @@ GLOBAL_LIST_INIT(channel_tokens, list( name = "pirate bowman headset" desc = "Used to sing shanties across the vast emptiness of space, and complain about Minuteman patrols. Protects ears from flashbangs." icon_state = "pirate_headset_alt" + hearing_protection = TRUE /obj/item/radio/headset/pirate/alt/captain name = "pirate captain bowman headset" @@ -249,10 +238,6 @@ GLOBAL_LIST_INIT(channel_tokens, list( keyslot2 = new /obj/item/encryptionkey/heads/captain command = TRUE -/obj/item/radio/headset/pirate/alt/ComponentInitialize() - . = ..() - AddComponent(/datum/component/wearertargeting/earprotection, list(ITEM_SLOT_EARS)) - //PGF /obj/item/radio/headset/pgf name = "\improper PGF headset" @@ -269,6 +254,7 @@ GLOBAL_LIST_INIT(channel_tokens, list( name = "\improper PGF bowman headset" desc = "A headset often worn by members of the PGFN and PGFMC. Protects ears from flashbangs." icon_state = "solgov_headset_alt" + hearing_protection = TRUE /obj/item/radio/headset/pgf/alt/captain name = "\improper PGF official bowman headset" @@ -293,6 +279,7 @@ GLOBAL_LIST_INIT(channel_tokens, list( name = "\improper SolGov bowman headset" desc = "Worn by bureaucrats and, occasionally, Sonnensoldneren. Protects ears from flashbangs." icon_state = "solgov_headset_alt" + hearing_protection = TRUE /obj/item/radio/headset/solgov/alt/captain name = "\improper SolGov official bowman headset" @@ -300,10 +287,6 @@ GLOBAL_LIST_INIT(channel_tokens, list( keyslot2 = new /obj/item/encryptionkey/heads/captain command = TRUE -/obj/item/radio/headset/solgov/alt/ComponentInitialize() - . = ..() - AddComponent(/datum/component/wearertargeting/earprotection, list(ITEM_SLOT_EARS)) - //independent /obj/item/radio/headset/headset_com name = "command radio headset" @@ -315,10 +298,7 @@ GLOBAL_LIST_INIT(channel_tokens, list( name = "command bowman headset" desc = "An officer's headset. Protects ears from flashbangs." icon_state = "headset_alt" - -/obj/item/radio/headset/headset_com/alt/ComponentInitialize() - . = ..() - AddComponent(/datum/component/wearertargeting/earprotection, list(ITEM_SLOT_EARS)) + hearing_protection = TRUE /obj/item/radio/headset/heads command = TRUE @@ -334,10 +314,7 @@ GLOBAL_LIST_INIT(channel_tokens, list( name = "captain's bowman headset" desc = "Dresses the ears of independent ship captains across the frontier. Protects ears from flashbangs." icon_state = "headset_alt" - -/obj/item/radio/headset/heads/captain/alt/ComponentInitialize() - . = ..() - AddComponent(/datum/component/wearertargeting/earprotection, list(ITEM_SLOT_EARS)) + hearing_protection = TRUE //special headsets /obj/item/radio/headset/binary @@ -366,10 +343,7 @@ GLOBAL_LIST_INIT(channel_tokens, list( desc = "A headset especially for emergency response personnel. Protects ears from flashbangs." icon_state = "cent_headset_alt" keyslot = null - -/obj/item/radio/headset/headset_cent/alt/ComponentInitialize() - . = ..() - AddComponent(/datum/component/wearertargeting/earprotection, list(ITEM_SLOT_EARS)) + hearing_protection = TRUE /obj/item/radio/headset/silicon/pai name = "\proper mini Integrated Subspace Transceiver " @@ -392,10 +366,7 @@ GLOBAL_LIST_INIT(channel_tokens, list( name = "security bowman headset" desc = "This is used by your elite security force. Protects ears from flashbangs." icon_state = "sec_headset_alt" - -/obj/item/radio/headset/headset_sec/alt/ComponentInitialize() - . = ..() - AddComponent(/datum/component/wearertargeting/earprotection, list(ITEM_SLOT_EARS)) + hearing_protection = TRUE /obj/item/radio/headset/headset_medsec name = "medical-security radio headset" @@ -406,10 +377,7 @@ GLOBAL_LIST_INIT(channel_tokens, list( name = "medical-security bowman headset" desc = "Used to hear how many security officers need to be stiched back together. Protects ears from flashbangs." icon_state = "medsec_headset_alt" - -/obj/item/radio/headset/headset_medsec/alt/ComponentInitialize() - . = ..() - AddComponent(/datum/component/wearertargeting/earprotection, list(ITEM_SLOT_EARS)) + hearing_protection = TRUE /obj/item/radio/headset/headset_eng name = "engineering radio headset" @@ -460,10 +428,7 @@ GLOBAL_LIST_INIT(channel_tokens, list( name = "\proper the head of security's bowman headset" desc = "The headset of the man in charge of keeping order and protecting the innocent. Protects ears from flashbangs." icon_state = "headset_alt" - -/obj/item/radio/headset/heads/hos/ComponentInitialize() - . = ..() - AddComponent(/datum/component/wearertargeting/earprotection, list(ITEM_SLOT_EARS)) + hearing_protection = TRUE /obj/item/radio/headset/heads/ce name = "\proper the chief engineer's headset" diff --git a/code/game/objects/items/granters.dm b/code/game/objects/items/granters.dm index 2e5c9275d8df..5200e85878e2 100644 --- a/code/game/objects/items/granters.dm +++ b/code/game/objects/items/granters.dm @@ -444,7 +444,7 @@ /obj/item/book/granter/crafting_recipe/cooking_sweets_101 name = "Cooking Desserts 101" - desc = "A cook book that teaches you some more of the newest desserts. AI approved, and a best seller on Honkplanet." + desc = "A cook book that teaches you some more of the newest desserts. A best seller on Maxim." crafting_recipe_types = list( /datum/crafting_recipe/food/berrytart, /datum/crafting_recipe/food/cocolavatart, diff --git a/code/game/objects/items/grenades/spawnergrenade.dm b/code/game/objects/items/grenades/spawnergrenade.dm index 72f378c38907..098a3c57bff3 100644 --- a/code/game/objects/items/grenades/spawnergrenade.dm +++ b/code/game/objects/items/grenades/spawnergrenade.dm @@ -46,19 +46,3 @@ icon_state = "holy_grenade" spawner_type = /mob/living/simple_animal/hostile/poison/bees/toxin deliveryamt = 10 - -/obj/item/grenade/spawnergrenade/clown - name = "C.L.U.W.N.E." - desc = "A sleek device often given to clowns on their 10th birthdays for protection. You can hear faint scratching coming from within." - icon_state = "clown_ball" - item_state = "clown_ball" - spawner_type = list(/mob/living/simple_animal/hostile/retaliate/clown/fleshclown, /mob/living/simple_animal/hostile/retaliate/clown/clownhulk, /mob/living/simple_animal/hostile/retaliate/clown/longface, /mob/living/simple_animal/hostile/retaliate/clown/clownhulk/chlown, /mob/living/simple_animal/hostile/retaliate/clown/clownhulk/honcmunculus, /mob/living/simple_animal/hostile/retaliate/clown/mutant/blob, /mob/living/simple_animal/hostile/retaliate/clown/banana, /mob/living/simple_animal/hostile/retaliate/clown/honkling, /mob/living/simple_animal/hostile/retaliate/clown/lube) - deliveryamt = 1 - -/obj/item/grenade/spawnergrenade/clown_broken - name = "stuffed C.L.U.W.N.E." - desc = "A sleek device often given to clowns on their 10th birthdays for protection. While a typical C.L.U.W.N.E only holds one creature, sometimes foolish young clowns try to cram more in, often to disasterous effect." - icon_state = "clown_broken" - item_state = "clown_broken" - spawner_type = /mob/living/simple_animal/hostile/retaliate/clown/mutant - deliveryamt = 5 diff --git a/code/game/objects/items/robot/robot_items.dm b/code/game/objects/items/robot/robot_items.dm index 84f4ffa1f0a1..243112d84c68 100644 --- a/code/game/objects/items/robot/robot_items.dm +++ b/code/game/objects/items/robot/robot_items.dm @@ -856,7 +856,6 @@ . = ..() var/mutable_appearance/arm = mutable_appearance(icon = icon, icon_state = "borg_beaker_apparatus_arm") if(stored) - COMPILE_OVERLAYS(stored) stored.pixel_x = 0 stored.pixel_y = 0 var/mutable_appearance/stored_copy = new /mutable_appearance(stored) @@ -913,7 +912,6 @@ . = ..() var/mutable_appearance/arm = mutable_appearance(icon, "borg_hardware_apparatus_arm1") if(stored) - COMPILE_OVERLAYS(stored) stored.pixel_x = -3 stored.pixel_y = 0 if(!istype(stored, /obj/item/circuitboard)) diff --git a/code/game/objects/items/shooting_range.dm b/code/game/objects/items/shooting_range.dm index cd554f1b2512..11acbcd75704 100644 --- a/code/game/objects/items/shooting_range.dm +++ b/code/game/objects/items/shooting_range.dm @@ -33,18 +33,9 @@ /obj/item/target/alien/anchored anchored = TRUE -/obj/item/target/clown - icon_state = "target_c" - desc = "A shooting target that looks like a useless clown." - hp = 2000 - #define DECALTYPE_SCORCH 1 #define DECALTYPE_BULLET 2 -/obj/item/target/clown/bullet_act(obj/projectile/P) - . = ..() - playsound(src.loc, 'sound/items/bikehorn.ogg', 50, TRUE) - /obj/item/target/bullet_act(obj/projectile/P) if(istype(P, /obj/projectile/bullet/reusable)) // If it's a foam dart, don't bother with any of this other shit return P.on_hit(src, 0) diff --git a/code/game/objects/items/stacks/rods.dm b/code/game/objects/items/stacks/rods.dm index b5f78d46e951..f8ca6036bb66 100644 --- a/code/game/objects/items/stacks/rods.dm +++ b/code/game/objects/items/stacks/rods.dm @@ -8,6 +8,10 @@ GLOBAL_LIST_INIT(rod_recipes, list ( \ new/datum/stack_recipe("modern railing", /obj/structure/railing/modern, 3, time = 18, window_checks = TRUE), \ new/datum/stack_recipe("modern railing corner", /obj/structure/railing/modern/corner, 1, time = 10, window_checks = TRUE), \ new/datum/stack_recipe("modern railing end", /obj/structure/railing/modern/end, 3, time = 18, window_checks = TRUE), \ + new/datum/stack_recipe("thin railing", /obj/structure/railing/thin, 3, time = 18, window_checks = TRUE), \ + new/datum/stack_recipe("thin railing corner", /obj/structure/railing/thin/corner, 1, time = 10, window_checks = TRUE), \ + new/datum/stack_recipe("thick railing", /obj/structure/railing/thick, 3, time = 18, window_checks = TRUE), \ + new/datum/stack_recipe("thick railing corner", /obj/structure/railing/thick/corner, 1, time = 10, window_checks = TRUE), \ new/datum/stack_recipe("ladder", /obj/structure/ladder/crafted, 15, time = 150, one_per_turf = TRUE, on_floor = FALSE), \ new/datum/stack_recipe("handrail", /obj/structure/chair/handrail, 4, time = 15, one_per_turf = TRUE), \ )) diff --git a/code/game/objects/items/stacks/sheets/sheet_types.dm b/code/game/objects/items/stacks/sheets/sheet_types.dm index daa7f529d84f..8f7a3c49a5e1 100644 --- a/code/game/objects/items/stacks/sheets/sheet_types.dm +++ b/code/game/objects/items/stacks/sheets/sheet_types.dm @@ -251,7 +251,7 @@ GLOBAL_LIST_INIT(cloth_recipes, list ( \ null, \ new/datum/stack_recipe("fingerless gloves", /obj/item/clothing/gloves/fingerless, 1), \ new/datum/stack_recipe("white gloves", /obj/item/clothing/gloves/color/white, 3), \ - new/datum/stack_recipe("white softcap", /obj/item/clothing/head/soft/mime, 2), \ + new/datum/stack_recipe("white softcap", /obj/item/clothing/head/soft, 2), \ new/datum/stack_recipe("white beanie", /obj/item/clothing/head/beanie, 2), \ null, \ new/datum/stack_recipe("blindfold", /obj/item/clothing/glasses/blindfold, 2), \ diff --git a/code/game/objects/items/storage/ammo_can.dm b/code/game/objects/items/storage/ammo_can.dm index e16ef5de4825..63ac672b1cd1 100644 --- a/code/game/objects/items/storage/ammo_can.dm +++ b/code/game/objects/items/storage/ammo_can.dm @@ -6,6 +6,7 @@ item_state = "ammobox" drop_sound = 'sound/items/handling/ammobox_drop.ogg' pickup_sound = 'sound/items/handling/ammobox_pickup.ogg' + supports_variations = null material_flags = NONE has_latches = FALSE w_class = WEIGHT_CLASS_BULKY @@ -26,6 +27,32 @@ /obj/item/grenade, /obj/item/stock_parts/cell/gun )) + unique_reskin = list( + "EXPLOSIVE" = "ammobox_expl", + "12ga Buckshot" = "ammobox_12ga", + ".9mm" = "ammobox_9mm", + "10mm" = "ammobox_10mm", + ".45" = "ammobox_45", + ".38" = "ammobox_38", + ".22lr" = "ammobox_22", + "5.7x39mm" = "ammobox_57", + "5.56x42mm CLIP" = "ammobox_556", + "7.62x40mm CLIP" = "ammobox_762", + ".44 Roumain" = "ammobox_44", + "8x50mmR" = "ammobox_850", + ".308" = "ammobox_308", + "12ga Slug" = "ammobox_slug", + "6.5mm CLIP" = "ammobox_65", + ".300" = "ammobox_300", + ".357" = "ammobox_357", + ".299 Eoehoma" = "ammobox_299", + ".45-70" = "ammobox_4570", + "Cell" = "ammobox_cell", + "PLT" = "ammobox_plt", + ".50BMG" = "ammobox_50", + "Lance" = "ammobox_lance", + "None" = "ammobox", + ) /obj/item/storage/toolbox/ammo/a850r/PopulateContents() name = "ammo can (8x50mmR)" @@ -63,6 +90,78 @@ for (var/i in 1 to 4) new /obj/item/storage/box/ammo/c10mm(src) +/obj/item/storage/toolbox/ammo/c38/PopulateContents() + name = "ammo can (.38)" + icon_state = "ammobox_38" + for (var/i in 1 to 4) + new /obj/item/storage/box/ammo/c38(src) + +/obj/item/storage/toolbox/ammo/a44roum/PopulateContents() + name = "ammo can (.44 Roumain)" + icon_state = "ammobox_44" + for (var/i in 1 to 4) + new /obj/item/storage/box/ammo/a44roum(src) + +/obj/item/storage/toolbox/ammo/c556/PopulateContents() + name = "ammo can (5.56x42mm CLIP)" + icon_state = "ammobox_556" + for (var/i in 1 to 4) + new /obj/item/storage/box/ammo/a556_42(src) + +/obj/item/storage/toolbox/ammo/c556hitp/PopulateContents() + name = "ammo can (5.56 HITP)" + icon_state = "ammobox_556" + for (var/i in 1 to 4) + new /obj/item/storage/box/ammo/c556mm(src) + +/obj/item/storage/toolbox/ammo/c57/PopulateContents() + name = "ammo can (5.7x39mm)" + icon_state = "ammobox_57" + for (var/i in 1 to 4) + new /obj/item/storage/box/ammo/c57x39(src) + +/obj/item/storage/toolbox/ammo/c46/PopulateContents() + name = "ammo can (4.6x30mm)" + icon_state = "ammobox_46" + for (var/i in 1 to 4) + new /obj/item/storage/box/ammo/c46x30mm(src) + +/obj/item/storage/toolbox/ammo/c65/PopulateContents() + name = "ammo can (6.5mm CLIP)" + icon_state = "ammobox_65" + for (var/i in 1 to 4) + new /obj/item/storage/box/ammo/a65clip(src) + +/obj/item/storage/toolbox/ammo/c300/PopulateContents() + name = "ammo can (.300)" + icon_state = "ammobox_300" + for (var/i in 1 to 4) + new /obj/item/storage/box/ammo/a300(src) + +/obj/item/storage/toolbox/ammo/c357/PopulateContents() + name = "ammo can (.357)" + icon_state = "ammobox_357" + for (var/i in 1 to 4) + new /obj/item/storage/box/ammo/a357(src) + +/obj/item/storage/toolbox/ammo/c22lr/PopulateContents() + name = "ammo can (.22LR)" + icon_state = "ammobox_22" + for (var/i in 1 to 4) + new /obj/item/storage/box/ammo/c22lr(src) + +/obj/item/storage/toolbox/ammo/c299/PopulateContents() + name = "ammo can (.299 Eoehoma)" + icon_state = "ammobox_299" + for (var/i in 1 to 4) + new /obj/item/storage/box/ammo/c299(src) + +/obj/item/storage/toolbox/ammo/c4570/PopulateContents() + name = "ammo can (.45-70)" + icon_state = "ammobox_4570" + for (var/i in 1 to 4) + new /obj/item/storage/box/ammo/a4570(src) + /obj/item/storage/toolbox/ammo/shotgun/PopulateContents() name = "ammo can (12ga)" icon_state = "ammobox_12ga" diff --git a/code/game/objects/items/storage/backpack.dm b/code/game/objects/items/storage/backpack.dm index 3fcbd989206c..48d7a1c90823 100644 --- a/code/game/objects/items/storage/backpack.dm +++ b/code/game/objects/items/storage/backpack.dm @@ -667,7 +667,6 @@ STR.silent = TRUE /obj/item/storage/backpack/duffelbag/clown/syndie/PopulateContents() - new /obj/item/pda/clown(src) new /obj/item/clothing/under/rank/civilian/clown(src) new /obj/item/clothing/mask/gas/clown_hat(src) new /obj/item/bikehorn(src) diff --git a/code/game/objects/items/storage/briefcase.dm b/code/game/objects/items/storage/briefcase.dm index dfc65846bd11..ae9f9773c5a6 100644 --- a/code/game/objects/items/storage/briefcase.dm +++ b/code/game/objects/items/storage/briefcase.dm @@ -32,10 +32,6 @@ /obj/item/storage/briefcase/lawyer folder_path = /obj/item/folder/blue -/obj/item/storage/briefcase/lawyer/PopulateContents() - new /obj/item/stamp/law(src) - ..() - /obj/item/storage/briefcase/sniperbundle desc = "Its label reads \"genuine hardened Captain leather\", but suspiciously has no other tags or branding. Smells like L'Air du Temps." force = 10 diff --git a/code/game/objects/objs.dm b/code/game/objects/objs.dm index aa63701ce0e9..4a7c7681bec4 100644 --- a/code/game/objects/objs.dm +++ b/code/game/objects/objs.dm @@ -358,7 +358,7 @@ * * M The mob choosing a reskin option */ -/obj/proc/reskin_obj(mob/M) +/obj/proc/reskin_obj(mob/M, change_name=FALSE) if(!LAZYLEN(unique_reskin)) return @@ -376,6 +376,8 @@ if(!allow_post_reskins) current_skin = pick icon_state = unique_reskin[pick] + if(change_name) + name = pick to_chat(M, "[src] is now skinned as '[pick].'") update_appearance() diff --git a/code/game/objects/structures/crates_lockers/closets/job_closets.dm b/code/game/objects/structures/crates_lockers/closets/job_closets.dm index 6e7de98b21de..6ac81fd41d08 100644 --- a/code/game/objects/structures/crates_lockers/closets/job_closets.dm +++ b/code/game/objects/structures/crates_lockers/closets/job_closets.dm @@ -36,7 +36,7 @@ /obj/item/radio/headset/headset_srv = 2, /obj/item/clothing/accessory/waistcoat = 2, /obj/item/clothing/suit/apron/chef = 3, - /obj/item/clothing/head/soft/mime = 2, + /obj/item/clothing/head/soft = 2, /obj/item/storage/box/mousetraps = 2, /obj/item/circuitboard/machine/dish_drive = 1, /obj/item/clothing/suit/toggle/chef = 1, diff --git a/code/game/objects/structures/crates_lockers/closets/wardrobe.dm b/code/game/objects/structures/crates_lockers/closets/wardrobe.dm index e3a8339dce46..1b9762013c17 100644 --- a/code/game/objects/structures/crates_lockers/closets/wardrobe.dm +++ b/code/game/objects/structures/crates_lockers/closets/wardrobe.dm @@ -109,7 +109,7 @@ for(var/i in 1 to 3) new /obj/item/clothing/shoes/sneakers/white(src) for(var/i in 1 to 3) - new /obj/item/clothing/head/soft/mime(src) + new /obj/item/clothing/head//mime(src) return /obj/structure/closet/wardrobe/pjs diff --git a/code/game/objects/structures/railings.dm b/code/game/objects/structures/railings.dm index b4bf99f17469..a99830600833 100644 --- a/code/game/objects/structures/railings.dm +++ b/code/game/objects/structures/railings.dm @@ -210,9 +210,15 @@ /obj/structure/railing/thick/corner icon_state = "railing_thick_corner" + density = FALSE + climbable = FALSE + buildstackamount = 1 /obj/structure/railing/thin icon_state = "railing_thin" /obj/structure/railing/thin/corner icon_state = "railing_thin_corner" + density = FALSE + climbable = FALSE + buildstackamount = 1 diff --git a/code/modules/admin/verbs/mapping.dm b/code/modules/admin/verbs/mapping.dm index 8f1b69bc831d..19b74e54b60d 100644 --- a/code/modules/admin/verbs/mapping.dm +++ b/code/modules/admin/verbs/mapping.dm @@ -307,7 +307,6 @@ GLOBAL_VAR_INIT(say_disabled, FALSE) qdel(I) randomize_human(D) JB.equip(D, TRUE, FALSE) - COMPILE_OVERLAYS(D) var/icon/I = icon(getFlatIcon(D), frame = 1) final.Insert(I, JB.name) qdel(D) diff --git a/code/modules/admin/verbs/one_click_antag.dm b/code/modules/admin/verbs/one_click_antag.dm index d4b9259a61e9..ddacd0c88dfa 100644 --- a/code/modules/admin/verbs/one_click_antag.dm +++ b/code/modules/admin/verbs/one_click_antag.dm @@ -219,7 +219,6 @@ equipAntagOnDummy(mannequin, ert) - COMPILE_OVERLAYS(mannequin) CHECK_TICK var/icon/preview_icon = icon('icons/effects/effects.dmi', "nothing") preview_icon.Scale(48+32, 16+32) diff --git a/code/modules/antagonists/traitor/equipment/Malf_Modules.dm b/code/modules/antagonists/traitor/equipment/Malf_Modules.dm index 4f5e7bc161c9..ae1ba2bae1a5 100644 --- a/code/modules/antagonists/traitor/equipment/Malf_Modules.dm +++ b/code/modules/antagonists/traitor/equipment/Malf_Modules.dm @@ -10,7 +10,6 @@ GLOBAL_LIST_INIT(blacklisted_malf_machines, typecacheof(list( /obj/machinery/nuclearbomb/syndicate, /obj/machinery/syndicatebomb, /obj/machinery/syndicatebomb/badmin, - /obj/machinery/syndicatebomb/badmin/clown, /obj/machinery/syndicatebomb/empty, /obj/machinery/syndicatebomb/self_destruct, /obj/machinery/syndicatebomb/training diff --git a/code/modules/antagonists/wizard/equipment/artefact.dm b/code/modules/antagonists/wizard/equipment/artefact.dm index fc6af55b3b41..398f625c02fe 100644 --- a/code/modules/antagonists/wizard/equipment/artefact.dm +++ b/code/modules/antagonists/wizard/equipment/artefact.dm @@ -72,24 +72,6 @@ activate_descriptor = "hunger" rend_desc = "Reverberates with the sound of ten thousand moos." -/obj/item/veilrender/honkrender - name = "honk render" - desc = "A wicked curved blade of alien origin, recovered from the ruins of a vast circus." - spawn_type = /mob/living/simple_animal/hostile/retaliate/clown - spawn_amt = 10 - activate_descriptor = "depression" - rend_desc = "Gently wafting with the sounds of endless laughter." - icon_state = "clownrender" - -/obj/item/veilrender/honkrender/honkhulkrender - name = "superior honk render" - desc = "A wicked curved blade of alien origin, recovered from the ruins of a vast circus. This one gleams with a special light." - spawn_type = /mob/living/simple_animal/hostile/retaliate/clown/clownhulk - spawn_amt = 5 - activate_descriptor = "depression" - rend_desc = "Gently wafting with the sounds of mirthful grunting." - icon_state = "clownrender" - ////TEAR IN REALITY /obj/singularity/wizard diff --git a/code/modules/asset_cache/asset_list_items.dm b/code/modules/asset_cache/asset_list_items.dm index 9acdab838e8b..7a9df514ca39 100644 --- a/code/modules/asset_cache/asset_list_items.dm +++ b/code/modules/asset_cache/asset_list_items.dm @@ -96,20 +96,17 @@ /datum/asset/spritesheet/simple/paper name = "paper" assets = list( - "stamp-clown" = 'icons/stamp_icons/large_stamp-clown.png', "stamp-deny" = 'icons/stamp_icons/large_stamp-deny.png', "stamp-ok" = 'icons/stamp_icons/large_stamp-ok.png', "stamp-void" = 'icons/stamp_icons/large_stamp-void.png', - "stamp-hop" = 'icons/stamp_icons/large_stamp-hop.png', + "stamp-fo" = 'icons/stamp_icons/large_stamp-fo.png', "stamp-cmo" = 'icons/stamp_icons/large_stamp-cmo.png', "stamp-ce" = 'icons/stamp_icons/large_stamp-ce.png', "stamp-hos" = 'icons/stamp_icons/large_stamp-hos.png', "stamp-rd" = 'icons/stamp_icons/large_stamp-rd.png', "stamp-cap" = 'icons/stamp_icons/large_stamp-cap.png', "stamp-qm" = 'icons/stamp_icons/large_stamp-qm.png', - "stamp-law" = 'icons/stamp_icons/large_stamp-law.png', "stamp-chap" = 'icons/stamp_icons/large_stamp-chap.png', - "stamp-mime" = 'icons/stamp_icons/large_stamp-mime.png', "stamp-syndicate" = 'icons/stamp_icons/large_stamp-syndicate.png', "stamp-solgov" = 'icons/stamp_icons/large_stamp-solgov.png', "stamp-inteq" = 'icons/stamp_icons/large_stamp-inteq.png', diff --git a/code/modules/autowiki/pages/ships.dm b/code/modules/autowiki/pages/ships.dm index fe07ac402858..854117eb3c1e 100644 --- a/code/modules/autowiki/pages/ships.dm +++ b/code/modules/autowiki/pages/ships.dm @@ -79,7 +79,6 @@ wiki_dummy.wipe_state() to_equip.equip(wiki_dummy, TRUE, FALSE) - COMPILE_OVERLAYS(wiki_dummy) var/icon/wiki_icon = icon(getFlatIcon(wiki_dummy), frame = 1) //Make all icons 32x32 for wiki sizing consistency diff --git a/code/modules/awaymissions/corpse.dm b/code/modules/awaymissions/corpse.dm index 4fb7ceac4527..51aa0dbfc41d 100644 --- a/code/modules/awaymissions/corpse.dm +++ b/code/modules/awaymissions/corpse.dm @@ -175,6 +175,8 @@ var/facial_hairstyle var/skin_tone + var/list/outfit_override + /obj/effect/mob_spawn/human/Initialize() if(ispath(outfit)) outfit = new outfit() diff --git a/code/modules/cargo/packs/magazines.dm b/code/modules/cargo/packs/magazines.dm index b2ec08e1d191..d7a34c778703 100644 --- a/code/modules/cargo/packs/magazines.dm +++ b/code/modules/cargo/packs/magazines.dm @@ -368,15 +368,15 @@ /* etherbor */ -/datum/supply_pack/magazine/guncell/kalix +/datum/supply_pack/magazine/kalixcell name = "Etherbor Cell Crate" desc = "Contains an Etherbor weapon cell, compatible with Etherbor armaments with a slightly higher capacity." contains = list(/obj/item/stock_parts/cell/gun/kalix) cost = 600 faction = /datum/faction/pgf -/datum/supply_pack/magazine/guncell/pgf - name = "Etherbor Cell Crate" +/datum/supply_pack/magazine/pgfcell + name = "Military-Grade Etherbor Cell Crate" desc = "Contains a military-grade Etherbor weapon cell produced for the PGFMC, compatible with Etherbor armaments with a significantly higher capacity." contains = list(/obj/item/stock_parts/cell/gun/pgf) cost = 1000 diff --git a/code/modules/client/loadout/loadout_hat.dm b/code/modules/client/loadout/loadout_hat.dm index a393ec451c30..c83f7a737e27 100644 --- a/code/modules/client/loadout/loadout_hat.dm +++ b/code/modules/client/loadout/loadout_hat.dm @@ -81,27 +81,8 @@ //Soft caps /datum/gear/hat/softcap - subtype_path = /datum/gear/hat/softcap - -/datum/gear/hat/softcap/red - display_name = "cap, red" - path = /obj/item/clothing/head/soft/red - -/datum/gear/hat/softcap/blue - display_name = "cap, blue" - path = /obj/item/clothing/head/soft/blue - -/datum/gear/hat/softcap/grey - display_name = "cap, grey" - path = /obj/item/clothing/head/soft/grey - -/datum/gear/hat/softcap/white - display_name = "cap, white" - path = /obj/item/clothing/head/soft/mime - -/datum/gear/hat/softcap/black - display_name = "cap, black" - path = /obj/item/clothing/head/soft/black + display_name = "cap, recolorable" + path = /obj/item/clothing/head/soft /datum/gear/hat/utility_black display_name = "utility cover, black" @@ -186,3 +167,7 @@ /datum/gear/hat/flowers display_name = "plastic flower, pickable" path = /obj/item/clothing/head/plastic_flower + +/datum/gear/hat/flap + display_name = "flap cap, recolorable" + path = /obj/item/clothing/head/flap diff --git a/code/modules/client/loadout/loadout_suit.dm b/code/modules/client/loadout/loadout_suit.dm index 1edeed63530a..9f44092652f6 100644 --- a/code/modules/client/loadout/loadout_suit.dm +++ b/code/modules/client/loadout/loadout_suit.dm @@ -87,6 +87,10 @@ display_name = "hazard jacket" path = /obj/item/clothing/suit/toggle/hazard +/datum/gear/suit/jacket/windbreaker + display_name = "windbreaker, colorable" + path = /obj/item/clothing/suit/toggle/windbreaker + //Suspenders /datum/gear/suit/suspenders subtype_path = /datum/gear/suit/suspenders diff --git a/code/modules/client/loadout/loadout_uniform.dm b/code/modules/client/loadout/loadout_uniform.dm index a042ab353070..ae3d9b7f9ede 100644 --- a/code/modules/client/loadout/loadout_uniform.dm +++ b/code/modules/client/loadout/loadout_uniform.dm @@ -19,39 +19,12 @@ //Colored jumpsuits /datum/gear/uniform/color - subtype_path = /datum/gear/uniform/color + display_name = "jumpsuit, recolorable" + path = /obj/item/clothing/under/color -/datum/gear/uniform/color/red - display_name = "jumpsuit, red" - path = /obj/item/clothing/under/color/red - -/datum/gear/uniform/color/green - display_name = "jumpsuit, green" - path = /obj/item/clothing/under/color/green - -/datum/gear/uniform/color/blue - display_name = "jumpsuit, blue" - path = /obj/item/clothing/under/color/blue - -/datum/gear/uniform/color/yellow - display_name = "jumpsuit, yellow" - path = /obj/item/clothing/under/color/yellow - -/datum/gear/uniform/color/pink - display_name = "jumpsuit, pink" - path = /obj/item/clothing/under/color/pink - -/datum/gear/uniform/color/black - display_name = "jumpsuit, black" - path = /obj/item/clothing/under/color/black - -/datum/gear/uniform/color/white - display_name = "jumpsuit, white" - path = /obj/item/clothing/under/color/white - -/datum/gear/uniform/color/random - display_name = "jumpsuit, random" - path = /obj/item/clothing/under/color/random //literally useless if grey assistants is off +/datum/gear/uniform/color_skirt + display_name = "jumpskirt, recolorable" + path = /obj/item/clothing/under/color/jumpskirt //Shorts diff --git a/code/modules/clothing/factions/frontiersmen.dm b/code/modules/clothing/factions/frontiersmen.dm index 7c4857823260..06d8609a9838 100644 --- a/code/modules/clothing/factions/frontiersmen.dm +++ b/code/modules/clothing/factions/frontiersmen.dm @@ -130,9 +130,10 @@ name = "frontiersman cap" desc = "An olive-green and grey baseball hat, worn by cargo technicians working under the Frontiersmen. Even they have the rights for a cool cap!" icon_state = "frontiersoft" - soft_type = "frontier" + current_skin = "frontiersoft" icon = 'icons/obj/clothing/faction/frontiersmen/head.dmi' mob_overlay_icon = 'icons/mob/clothing/faction/frontiersmen/head.dmi' + unique_reskin = null /obj/item/clothing/head/beret/sec/frontier name = "\improper Frontiersmen beret" diff --git a/code/modules/clothing/head/flaphat.dm b/code/modules/clothing/head/flaphat.dm new file mode 100644 index 000000000000..5b0768753264 --- /dev/null +++ b/code/modules/clothing/head/flaphat.dm @@ -0,0 +1,104 @@ +//Civilian Flap Caps +/obj/item/clothing/head/flap + name = "Betzu-il cap" + desc = "A common cap popular among Kalixcian travellers. “Betzu-il”, translating to “sun-blocker”, refers to the flap at the back for protection against natural hazards such as sunburns, sandstorms, and biting insects." + icon_state = "flapwhite" + cuttable = TRUE + clothamnt = 2 + unique_reskin = list("white Betzu-il cap" = "flapwhite", + "grey Betzu-il cap" = "flapgrey", + "black Betzu-il cap" = "flapblack", + "red Betzu-il cap" = "flapred", + "maroon Betzu-il cap" = "flapmaroon", + "orange Betzu-il cap" = "flaporange", + "yellow Betzu-il cap" = "flapyellow", + "green Betzu-il cap" = "flapgreen", + "dark green Betzu-il cap" = "flapdarkgreen", + "teal Betzu-il cap" = "flapteal", + "blue Betzu-il cap" = "flapblue", + "dark Betzu-il cap" = "flapdarkblue", + "purple Betzu-il cap" = "flappurple", + "pink Betzu-il cap" = "flappink", + "brown Betzu-il cap" = "flapbrown", + "light brown Betzu-il cap" = "flaplightbrown" + ) + +/obj/item/clothing/head/flap/white + name = "white Betzu-il cap" + desc = "A common cap popular among Kalixcian travellers. “Betzu-il”, translating to “sun-blocker”, refers to the flap at the back for protection against natural hazards such as sunburns, sandstorms, and biting insects. This one is white." + icon_state = "flapwhite" + +/obj/item/clothing/head/flap/grey + name = "grey Betzu-il cap" + desc = "A common cap popular among Kalixcian travellers. “Betzu-il”, translating to “sun-blocker”, refers to the flap at the back for protection against natural hazards such as sunburns, sandstorms, and biting insects. This one is grey." + icon_state = "flapgrey" + +/obj/item/clothing/head/flap/black + name = "black Betzu-il cap" + desc = "A common cap popular among Kalixcian travellers. “Betzu-il”, translating to “sun-blocker”, refers to the flap at the back for protection against natural hazards such as sunburns, sandstorms, and biting insects. This one is black." + icon_state = "flapblack" + +/obj/item/clothing/head/flap/red + name = "red Betzu-il cap" + desc = "A common cap popular among Kalixcian travellers. “Betzu-il”, translating to “sun-blocker”, refers to the flap at the back for protection against natural hazards such as sunburns, sandstorms, and biting insects. This one is red." + icon_state = "flapred" + +/obj/item/clothing/head/flap/maroon + name = "maroon Betzu-il cap" + desc = "A common cap popular among Kalixcian travellers. “Betzu-il”, translating to “sun-blocker”, refers to the flap at the back for protection against natural hazards such as sunburns, sandstorms, and biting insects. This one is maroon." + icon_state = "flapmaroon" + +/obj/item/clothing/head/flap/orange + name = "orange Betzu-il cap" + desc = "A common cap popular among Kalixcian travellers. “Betzu-il”, translating to “sun-blocker”, refers to the flap at the back for protection against natural hazards such as sunburns, sandstorms, and biting insects. This one is orange." + icon_state = "flaporange" + +/obj/item/clothing/head/flap/yellow + name = "yellow Betzu-il cap" + desc = "A common cap popular among Kalixcian travellers. “Betzu-il”, translating to “sun-blocker”, refers to the flap at the back for protection against natural hazards such as sunburns, sandstorms, and biting insects. This one is yellow." + icon_state = "flapyellow" + +/obj/item/clothing/head/flap/green + name = "green Betzu-il cap" + desc = "A common cap popular among Kalixcian travellers. “Betzu-il”, translating to “sun-blocker”, refers to the flap at the back for protection against natural hazards such as sunburns, sandstorms, and biting insects. This one is green." + icon_state = "flapgreen" + +/obj/item/clothing/head/flap/darkgreen + name = "dark green Betzu-il cap" + desc = "A common cap popular among Kalixcian travellers. “Betzu-il”, translating to “sun-blocker”, refers to the flap at the back for protection against natural hazards such as sunburns, sandstorms, and biting insects. This one is dark green." + icon_state = "flapdarkgreen" + +/obj/item/clothing/head/flap/teal + name = "teal Betzu-il cap" + desc = "A common cap popular among Kalixcian travellers. “Betzu-il”, translating to “sun-blocker”, refers to the flap at the back for protection against natural hazards such as sunburns, sandstorms, and biting insects. This one is teal." + icon_state = "flapteal" + +/obj/item/clothing/head/flap/blue + name = "blue Betzu-il cap" + desc = "A common cap popular among Kalixcian travellers. “Betzu-il”, translating to “sun-blocker”, refers to the flap at the back for protection against natural hazards such as sunburns, sandstorms, and biting insects. This one is blue." + icon_state = "flapblue" + +/obj/item/clothing/head/flap/darkblue + name = "dark blue Betzu-il cap" + desc = "A common cap popular among Kalixcian travellers. “Betzu-il”, translating to “sun-blocker”, refers to the flap at the back for protection against natural hazards such as sunburns, sandstorms, and biting insects. This one is dark blue." + icon_state = "flapdarkblue" + +/obj/item/clothing/head/flap/purple + name = "purple Betzu-il cap" + desc = "A common cap popular among Kalixcian travellers. “Betzu-il”, translating to “sun-blocker”, refers to the flap at the back for protection against natural hazards such as sunburns, sandstorms, and biting insects. This one is purple." + icon_state = "flappurple" + +/obj/item/clothing/head/flap/pink + name = "pink Betzu-il cap" + desc = "A common cap popular among Kalixcian travellers. “Betzu-il”, translating to “sun-blocker”, refers to the flap at the back for protection against natural hazards such as sunburns, sandstorms, and biting insects. This one is pink." + icon_state = "flappink" + +/obj/item/clothing/head/flap/brown + name = "brown Betzu-il cap" + desc = "A common cap popular among Kalixcian travellers. “Betzu-il”, translating to “sun-blocker”, refers to the flap at the back for protection against natural hazards such as sunburns, sandstorms, and biting insects. This one is brown." + icon_state = "flapbrown" + +/obj/item/clothing/head/flap/lightbrown + name = "light brown Betzu-il cap" + desc = "A common cap popular among Kalixcian travellers. “Betzu-il”, translating to “sun-blocker”, refers to the flap at the back for protection against natural hazards such as sunburns, sandstorms, and biting insects. This one is light brown." + icon_state = "flaplightbrown" diff --git a/code/modules/clothing/head/soft_caps.dm b/code/modules/clothing/head/soft_caps.dm index 307106409f18..afa26405bfc9 100644 --- a/code/modules/clothing/head/soft_caps.dm +++ b/code/modules/clothing/head/soft_caps.dm @@ -1,18 +1,47 @@ /obj/item/clothing/head/soft - name = "cargo cap" - desc = "It's a baseball hat in a tasteless yellow colour." - icon_state = "cargosoft" + name = "cap" + desc = "It's a baseball cap." + icon_state = "whitesoft" item_state = "helmet" cuttable = TRUE clothamnt = 2 - var/soft_type = "cargo" + unique_reskin = list("white cap" = "whitesoft", + "grey cap" = "greysoft", + "black cap" = "blacksoft", + "red cap" = "redsoft", + "maroon cap" = "maroonsoft", + "orange cap" = "orangesoft", + "yellow cap" = "yellowsoft", + "green cap" = "greensoft", + "dark green cap" = "darkgreensoft", + "teal cap" = "tealsoft", + "blue cap" = "bluesoft", + "dark blue cap" = "darkbluesoft", + "purple cap" = "purplesoft", + "pink cap" = "pinksoft", + "brown cap" = "brownsoft", + "light brown cap" = "lightbrownsoft" + ) + var/flipped = 0 + //we can't use initial for procs because we need to account for unique_reskin, so this stores the skin of the hat we use. + var/hat_icon - dog_fashion = /datum/dog_fashion/head/cargo_tech +/obj/item/clothing/head/soft/Initialize() + . = ..() + hat_icon = icon_state - var/flipped = 0 +/obj/item/clothing/head/soft/examine(mob/user) + . = ..() + if(unique_reskin && !current_skin) + . += "You can Alt-Click [src] to apply a new skin to it." + +/obj/item/clothing/head/soft/reskin_obj(mob/M, change_name) + . = ..() + hat_icon = icon_state + return /obj/item/clothing/head/soft/dropped() - icon_state = "[soft_type]soft" + icon_state = hat_icon flipped=0 ..() @@ -24,103 +53,132 @@ /obj/item/clothing/head/soft/AltClick(mob/user) - ..() - if(!user.canUseTopic(src, BE_CLOSE, ismonkey(user))) - return + if(unique_reskin && !current_skin && user.canUseTopic(src, BE_CLOSE, NO_DEXTERITY)) + reskin_obj(user, TRUE) + return TRUE else - flip(user) - + if(!user.canUseTopic(src, BE_CLOSE, ismonkey(user))) + return FALSE + else + flip(user) + return TRUE /obj/item/clothing/head/soft/proc/flip(mob/user) if(!user.incapacitated()) flipped = !flipped if(src.flipped) - icon_state = "[soft_type]soft_flipped" - to_chat(user, "You flip the hat backwards.") + icon_state = "[icon_state]_flipped" + to_chat(user, span_notice("You flip the hat backwards.")) else - icon_state = "[soft_type]soft" - to_chat(user, "You flip the hat back in normal position.") + icon_state = hat_icon + to_chat(user, span_notice("You flip the hat back in normal position.")) usr.update_inv_head() //so our mob-overlays update /obj/item/clothing/head/soft/examine(mob/user) . = ..() - . += "Alt-click the cap to flip it [flipped ? "forwards" : "backwards"]." + . += span_notice("Alt-click the cap to flip it [flipped ? "forwards" : "backwards"].") + +/obj/item/clothing/head/soft/white + name = "white cap" + desc = "It's a baseball hat in a tasteful white colour." + icon_state = "whitesoft" + current_skin = "whitesoft" + +/obj/item/clothing/head/soft/grey + name = "grey cap" + desc = "It's a baseball hat in a tasteful grey colour." + icon_state = "greysoft" + current_skin = "greysoft" + +/obj/item/clothing/head/soft/black + name = "black cap" + desc = "It's a baseball hat in a tasteful black colour." + icon_state = "blacksoft" + current_skin = "blacksoft" /obj/item/clothing/head/soft/red name = "red cap" - desc = "It's a baseball hat in a tasteless red colour." + desc = "It's a baseball hat in a tasteful red colour." icon_state = "redsoft" - soft_type = "red" - dog_fashion = null + current_skin = "redsoft" -/obj/item/clothing/head/soft/blue - name = "blue cap" - desc = "It's a baseball hat in a tasteless blue colour." - icon_state = "bluesoft" - soft_type = "blue" - dog_fashion = null +/obj/item/clothing/head/soft/maroon + name = "maroon cap" + desc = "It's a baseball hat in a tasteful maroon colour." + icon_state = "maroonsoft" + current_skin = "maroonsoft" -/obj/item/clothing/head/soft/green - name = "green cap" - desc = "It's a baseball hat in a tasteless green colour." - icon_state = "greensoft" - soft_type = "green" - dog_fashion = null +/obj/item/clothing/head/soft/orange + name = "orange cap" + desc = "It's a baseball hat in a tasteful orange colour." + icon_state = "orangesoft" + current_skin = "orangesoft" /obj/item/clothing/head/soft/yellow name = "yellow cap" - desc = "It's a baseball hat in a tasteless yellow colour." + desc = "It's a baseball hat in a tasteful yellow colour." icon_state = "yellowsoft" - soft_type = "yellow" - dog_fashion = null + current_skin = "yellowsoft" -/obj/item/clothing/head/soft/grey - name = "grey cap" - desc = "It's a baseball hat in a tasteful grey colour." - icon_state = "greysoft" - soft_type = "grey" - dog_fashion = null +/obj/item/clothing/head/soft/green + name = "green cap" + desc = "It's a baseball hat in a tasteful green colour." + icon_state = "greensoft" + current_skin = "greensoft" -/obj/item/clothing/head/soft/orange - name = "orange cap" - desc = "It's a baseball hat in a tasteless orange colour." - icon_state = "orangesoft" - soft_type = "orange" - dog_fashion = null +/obj/item/clothing/head/soft/darkgreen + name = "dark green cap" + desc = "It's a baseball hat in a tasteful dark green colour." + icon_state = "darkgreensoft" + current_skin = "darkgreensoft" -/obj/item/clothing/head/soft/mime - name = "white cap" - desc = "It's a baseball hat in a tasteless white colour." - icon_state = "mimesoft" - soft_type = "mime" - dog_fashion = null +/obj/item/clothing/head/soft/teal + name = "teal cap" + desc = "It's a baseball hat in a tasteful teal colour." + icon_state = "tealsoft" + current_skin = "tealsoft" + +/obj/item/clothing/head/soft/blue + name = "blue cap" + desc = "It's a baseball hat in a tasteful blue colour." + icon_state = "bluesoft" + current_skin = "bluesoft" + +/obj/item/clothing/head/soft/darkblue + name = "dark blue cap" + desc = "It's a baseball hat in a tasteful dark blue colour." + icon_state = "darkbluesoft" + current_skin = "darkbluesoft" /obj/item/clothing/head/soft/purple name = "purple cap" - desc = "It's a baseball hat in a tasteless purple colour." + desc = "It's a baseball hat in a tasteful purple colour." icon_state = "purplesoft" - soft_type = "purple" - dog_fashion = null - -/obj/item/clothing/head/soft/black - name = "black cap" - desc = "It's a baseball hat in a tasteless black colour." - icon_state = "blacksoft" - soft_type = "black" - dog_fashion = null - -/obj/item/clothing/head/soft/rainbow - name = "rainbow cap" - desc = "It's a baseball hat in a bright rainbow of colors." - icon_state = "rainbowsoft" - soft_type = "rainbow" - dog_fashion = null + current_skin = "purplesoft" + +/obj/item/clothing/head/soft/pink + name = "pink cap" + desc = "It's a baseball hat in a tasteful pink colour." + icon_state = "pinksoft" + current_skin = "pinksoft" + +/obj/item/clothing/head/soft/brown + name = "brown cap" + desc = "It's a baseball hat in a tasteful brown colour." + icon_state = "brownsoft" + current_skin = "brownsoft" + +/obj/item/clothing/head/soft/lightbrown + name = "light brown cap" + desc = "It's a baseball hat in a tasteful light brown colour." + icon_state = "lightbrownsoft" + current_skin = "lightbrownsoft" /obj/item/clothing/head/soft/sec name = "security cap" desc = "It's a robust baseball hat in tasteful red colour." icon_state = "secsoft" - soft_type = "sec" + unique_reskin = null dog_fashion = null /obj/item/clothing/head/soft/sec/brig_phys @@ -131,62 +189,62 @@ name = "paramedic cap" desc = "It's a baseball hat with a dark turquoise color and a reflective cross on the top." icon_state = "paramedicsoft" - soft_type = "paramedic" + unique_reskin = null dog_fashion = null /obj/item/clothing/head/soft/cybersun name = "cybersun agent cap" desc = "A black baseball hat emblazoned with a reflective Cybersun patch." icon_state = "agentsoft" - soft_type = "agent" + unique_reskin = null dog_fashion = null /obj/item/clothing/head/soft/cybersun/medical name = "cybersun medic cap" desc = "A turquoise baseball hat emblazoned with a reflective cross. Typical of Cybersun Industries field medics." icon_state = "cybersunsoft" - soft_type = "cybersun" + unique_reskin = null dog_fashion = null /obj/item/clothing/head/soft/inteq name = "inteq utility cover" desc = "A rich brown utility cover with the golden shield of the IRMG on it." icon_state = "inteqsoft" - soft_type = "inteq" + unique_reskin = null dog_fashion = null /obj/item/clothing/head/soft/inteq/corpsman name = "inteq corpsman utility cover" desc = "A sterile white utility cover with a green cross emblazoned on it. Worn by the IRMG's support division Corpsmen." icon_state = "inteqmedsoft" - soft_type = "inteqmed" + unique_reskin = null dog_fashion = null /obj/item/clothing/head/soft/utility_beige name = "beige utility cover" desc = "A flat beige utility cover, unbranded. Just the right color for those sandy planetoids." icon_state = "patrolbeigesoft" - soft_type = "patrolbeige" + unique_reskin = null dog_fashion = null /obj/item/clothing/head/soft/utility_black name = "black utility cover" desc = "A flat black utility cover, unbranded. Night Vision Goggles sold separately." icon_state = "patrolblacksoft" - soft_type = "patrolblack" + unique_reskin = null dog_fashion = null /obj/item/clothing/head/soft/utility_olive name = "miskilamao cap" desc = "An olive utility cover emblazoned with the Miskilamo Shipbreaking logo. The material feels cheap." icon_state = "patrololivesoft" - soft_type = "patrololive" + unique_reskin = null dog_fashion = null /obj/item/clothing/head/soft/utility_navy name = "navy utility cover" desc = "A navy blue utility cover, unbranded. Perfect for Seamen on long voyages." icon_state = "patrolnavysoft" - soft_type = "patrolnavy" + unique_reskin = null dog_fashion = null //recompile icons comment!!!!! diff --git a/code/modules/clothing/outfits/ert/indie_ert.dm b/code/modules/clothing/outfits/ert/indie_ert.dm index 57d737ba0f8a..6c0d0a5dfa37 100644 --- a/code/modules/clothing/outfits/ert/indie_ert.dm +++ b/code/modules/clothing/outfits/ert/indie_ert.dm @@ -119,7 +119,7 @@ uniform = /obj/item/clothing/under/suit/burgundy neck = /obj/item/clothing/neck/tie/red shoes = /obj/item/clothing/shoes/sneakers/black - head = /obj/item/clothing/head/soft/mime + head = /obj/item/clothing/head/soft suit = null ears = null belt = null diff --git a/code/modules/clothing/outfits/factions/independent.dm b/code/modules/clothing/outfits/factions/independent.dm index 7b82368f14da..0d5da0c6cd3b 100644 --- a/code/modules/clothing/outfits/factions/independent.dm +++ b/code/modules/clothing/outfits/factions/independent.dm @@ -198,7 +198,7 @@ duffelbag = /obj/item/storage/backpack/duffelbag/captain courierbag = /obj/item/storage/backpack/messenger/com - chameleon_extras = list(/obj/item/gun/energy/e_gun, /obj/item/stamp/head_of_personnel) + chameleon_extras = list(/obj/item/gun/energy/e_gun, /obj/item/stamp/officer) /datum/outfit/job/independent/hop/western name = "Independent - Head of Personnel (Western)" @@ -720,8 +720,6 @@ l_hand = /obj/item/storage/briefcase/lawyer l_pocket = /obj/item/clothing/accessory/lawyers_badge - chameleon_extras = /obj/item/stamp/law - // Curator /datum/outfit/job/independent/curator @@ -771,15 +769,12 @@ ears = /obj/item/radio/headset/headset_srv uniform = /obj/item/clothing/under/rank/civilian/chaplain backpack_contents = list( - /obj/item/stamp/chap = 1, /obj/item/camera/spooky = 1 ) backpack = /obj/item/storage/backpack/cultpack satchel = /obj/item/storage/backpack/cultpack - chameleon_extras = /obj/item/stamp/chap - // Chemist /datum/outfit/job/independent/chemist diff --git a/code/modules/clothing/outfits/factions/minutemen.dm b/code/modules/clothing/outfits/factions/minutemen.dm index 02263a06ce96..29ed5fbfe764 100644 --- a/code/modules/clothing/outfits/factions/minutemen.dm +++ b/code/modules/clothing/outfits/factions/minutemen.dm @@ -147,7 +147,7 @@ /obj/item/melee/classic_baton/telescopic=1, /obj/item/modular_computer/tablet/preset/advanced = 1) - chameleon_extras = list(/obj/item/gun/energy/e_gun, /obj/item/stamp/head_of_personnel) + chameleon_extras = list(/obj/item/gun/energy/e_gun, /obj/item/stamp/officer) /datum/outfit/job/clip/doctor name = "CLIP - Doctor" diff --git a/code/modules/clothing/outfits/factions/nanotrasen.dm b/code/modules/clothing/outfits/factions/nanotrasen.dm index 3d0a75fd2525..c1c8e2fcc34a 100644 --- a/code/modules/clothing/outfits/factions/nanotrasen.dm +++ b/code/modules/clothing/outfits/factions/nanotrasen.dm @@ -100,7 +100,7 @@ chameleon_extras = list( /obj/item/gun/energy/e_gun, - /obj/item/stamp/head_of_personnel, + /obj/item/stamp/nanotrasen/officer, ) // Head of Security @@ -430,8 +430,6 @@ l_pocket = /obj/item/laser_pointer r_pocket = /obj/item/clothing/accessory/lawyers_badge - chameleon_extras = /obj/item/stamp/law - // Corp. Rep /datum/outfit/job/nanotrasen/lawyer/corporaterepresentative name = "Nanotrasen - Corporate Representative" diff --git a/code/modules/clothing/outfits/factions/roumain.dm b/code/modules/clothing/outfits/factions/roumain.dm index e7cc57a33a96..42e28a372907 100644 --- a/code/modules/clothing/outfits/factions/roumain.dm +++ b/code/modules/clothing/outfits/factions/roumain.dm @@ -49,7 +49,7 @@ satchel = /obj/item/storage/backpack/cultpack backpack_contents = list(/obj/item/book/manual/srmlore=1, - /obj/item/stamp/chap = 1, + /obj/item/stamp/roumain = 1, /obj/item/melee/classic_baton/telescopic=1, ) chameleon_extras = null @@ -75,7 +75,7 @@ satchel = /obj/item/storage/backpack/cultpack backpack_contents = list(/obj/item/book/manual/srmlore=1, - /obj/item/stamp/chap = 1, + /obj/item/stamp/roumain = 1, /obj/item/melee/classic_baton/telescopic=1, ) chameleon_extras = null @@ -164,5 +164,5 @@ satchel = /obj/item/storage/backpack/cultpack backpack_contents = list(/obj/item/book/manual/srmlore=1, - /obj/item/stamp/chap = 1, + /obj/item/stamp/roumain = 1, ) diff --git a/code/modules/clothing/outfits/factions/solgov.dm b/code/modules/clothing/outfits/factions/solgov.dm index c4aed59c7e21..0c6fc0ba284c 100644 --- a/code/modules/clothing/outfits/factions/solgov.dm +++ b/code/modules/clothing/outfits/factions/solgov.dm @@ -121,7 +121,7 @@ backpack_contents = list(/obj/item/storage/box/ids=1,\ /obj/item/melee/classic_baton/telescopic=1, /obj/item/modular_computer/tablet/preset/advanced = 1) - chameleon_extras = list(/obj/item/gun/energy/e_gun, /obj/item/stamp/head_of_personnel) + chameleon_extras = list(/obj/item/gun/energy/e_gun, /obj/item/stamp/officer) /datum/outfit/job/solgov/doctor name = "SolGov - Medical Doctor" diff --git a/code/modules/clothing/suits/toggles.dm b/code/modules/clothing/suits/toggles.dm index 8166af12d301..14114be97b3c 100644 --- a/code/modules/clothing/suits/toggles.dm +++ b/code/modules/clothing/suits/toggles.dm @@ -113,11 +113,12 @@ strip_delay = EQUIP_DELAY_COAT * 1.5 /obj/item/clothing/suit/toggle/AltClick(mob/user) - ..() - if(!user.canUseTopic(src, BE_CLOSE, ismonkey(user))) + if(unique_reskin && !current_skin && user.canUseTopic(src, BE_CLOSE, NO_DEXTERITY)) + reskin_obj(user, TRUE) return else suit_toggle(user) + ..() /obj/item/clothing/suit/toggle/ui_action_click() suit_toggle() diff --git a/code/modules/clothing/suits/windbreakers.dm b/code/modules/clothing/suits/windbreakers.dm new file mode 100644 index 000000000000..c09ae4f322da --- /dev/null +++ b/code/modules/clothing/suits/windbreakers.dm @@ -0,0 +1,169 @@ +// Windbreakers + +/obj/item/clothing/suit/toggle/windbreaker + name = "windbreaker" + desc = "Sometimes called a windcheater, this is a simple jacket made of synthetic materials. Good for keeping the chilly wind off of you." + icon = 'icons/obj/clothing/suits/toggle.dmi' + mob_overlay_icon = 'icons/mob/clothing/suits/toggle.dmi' + icon_state = "jacketwhite" + item_state = "jacketwhite" + body_parts_covered = CHEST|GROIN|ARMS + cold_protection = CHEST|GROIN|ARMS + min_cold_protection_temperature = FIRE_SUIT_MIN_TEMP_PROTECT + togglename = "zipper" + allowed = list( /obj/item/flashlight, + /obj/item/tank/internals/emergency_oxygen, + /obj/item/tank/internals/plasmaman, + /obj/item/toy, + /obj/item/storage/fancy/cigarettes, + /obj/item/lighter, + /obj/item/radio, + /obj/item/storage/pill_bottle + ) + unique_reskin = list("white windbreaker" = "jacketwhite", + "grey windbreaker" = "jacketgrey", + "black windbreaker" = "jacketblack", + "red windbreaker" = "jacketred", + "maroon windbreaker" = "jacketmaroon", + "orange windbreaker" = "jacketorange", + "yellow windbreaker" = "jacketyellow", + "green windbreaker" = "jacketgreen", + "dark green windbreaker" = "jacketdarkgreen", + "teal windbreaker" = "jacketteal", + "blue windbreaker" = "jacketblue", + "dark blue windbreaker" = "jacketdarkblue", + "purple windbreaker" = "jacketpurple", + "pink windbreaker" = "jacketpink", + "brown windbreaker" = "jacketbrown", + "light brown windbreaker" = "jacketlightbrown" + ) + var/jacket_icon + +/obj/item/clothing/suit/toggle/windbreaker/Initialize() + . = ..() + jacket_icon = icon_state + +/obj/item/clothing/suit/toggle/windbreaker/examine(mob/user) + . = ..() + if(unique_reskin && !current_skin) + . += "You can Alt-Click [src] to apply a new skin to it." + +/obj/item/clothing/suit/toggle/windbreaker/reskin_obj(mob/M, change_name) + . = ..() + item_state = icon_state + jacket_icon = icon_state + return + +/obj/item/clothing/suit/toggle/windbreaker/suit_toggle() + set src in usr + + if(!can_use(usr)) + return 0 + + to_chat(usr, span_notice("You toggle [src]'s [togglename].")) + if(src.suittoggled) + src.icon_state = "[jacket_icon]" + src.suittoggled = FALSE + else if(!src.suittoggled) + src.icon_state = "[jacket_icon]_t" + src.suittoggled = TRUE + usr.update_inv_wear_suit() + for(var/X in actions) + var/datum/action/A = X + A.UpdateButtonIcon() + +/obj/item/clothing/suit/toggle/windbreaker/white + name = "white windbreaker" + desc = "Sometimes called a windcheater, this is a simple jacket made of synthetic materials. Good for keeping the chilly wind off of you. This one is white." + icon_state = "jacketwhite" + current_skin = "jacketwhite" + +/obj/item/clothing/suit/toggle/windbreaker/grey + name = "grey windbreaker" + desc = "Sometimes called a windcheater, this is a simple jacket made of synthetic materials. Good for keeping the chilly wind off of you. This one is grey." + icon_state = "jacketgrey" + current_skin = "jacketgrey" + +/obj/item/clothing/suit/toggle/windbreaker/black + name = "black windbreaker" + desc = "Sometimes called a windcheater, this is a simple jacket made of synthetic materials. Good for keeping the chilly wind off of you. This one is black." + icon_state = "jacketblack" + current_skin = "jacketblack" + +/obj/item/clothing/suit/toggle/windbreaker/red + name = "red windbreaker" + desc = "Sometimes called a windcheater, this is a simple jacket made of synthetic materials. Good for keeping the chilly wind off of you. This one is red." + icon_state = "jacketred" + current_skin = "jacketred" + +/obj/item/clothing/suit/toggle/windbreaker/maroon + name = "maroon windbreaker" + desc = "Sometimes called a windcheater, this is a simple jacket made of synthetic materials. Good for keeping the chilly wind off of you. This one is maroon." + icon_state = "jacketmaroon" + current_skin = "jacketmaroon" + +/obj/item/clothing/suit/toggle/windbreaker/orange + name = "orange windbreaker" + desc = "Sometimes called a windcheater, this is a simple jacket made of synthetic materials. Good for keeping the chilly wind off of you. This one is orange." + icon_state = "jacketorange" + current_skin = "jacketorange" + +/obj/item/clothing/suit/toggle/windbreaker/yellow + name = "yellow windbreaker" + desc = "Sometimes called a windcheater, this is a simple jacket made of synthetic materials. Good for keeping the chilly wind off of you. This one is yellow." + icon_state = "jacketyellow" + current_skin = "jacketyellow" + +/obj/item/clothing/suit/toggle/windbreaker/green + name = "green windbreaker" + desc = "Sometimes called a windcheater, this is a simple jacket made of synthetic materials. Good for keeping the chilly wind off of you. This one is green." + icon_state = "jacketgreen" + current_skin = "jacketgreen" + +/obj/item/clothing/suit/toggle/windbreaker/darkgreen + name = "dark green windbreaker" + desc = "Sometimes called a windcheater, this is a simple jacket made of synthetic materials. Good for keeping the chilly wind off of you. This one is dark green." + icon_state = "jacketdarkgreen" + current_skin = "jacketdarkgreen" + +/obj/item/clothing/suit/toggle/windbreaker/teal + name = "teal windbreaker" + desc = "Sometimes called a windcheater, this is a simple jacket made of synthetic materials. Good for keeping the chilly wind off of you. This one is teal." + icon_state = "jacketteal" + current_skin = "jacketteal" + +/obj/item/clothing/suit/toggle/windbreaker/blue + name = "blue windbreaker" + desc = "Sometimes called a windcheater, this is a simple jacket made of synthetic materials. Good for keeping the chilly wind off of you. This one is blue." + icon_state = "jacketblue" + current_skin = "jacketblue" + +/obj/item/clothing/suit/toggle/windbreaker/darkblue + name = "dark blue windbreaker" + desc = "Sometimes called a windcheater, this is a simple jacket made of synthetic materials. Good for keeping the chilly wind off of you. This one is dark blue." + icon_state = "jacketdarkblue" + current_skin = "jacketdarkblue" + +/obj/item/clothing/suit/toggle/windbreaker/purple + name = "purple windbreaker" + desc = "Sometimes called a windcheater, this is a simple jacket made of synthetic materials. Good for keeping the chilly wind off of you. This one is purple." + icon_state = "jacketpurple" + current_skin = "jacketpurple" + +/obj/item/clothing/suit/toggle/windbreaker/pink + name = "pink windbreaker" + desc = "Sometimes called a windcheater, this is a simple jacket made of synthetic materials. Good for keeping the chilly wind off of you. This one is pink." + icon_state = "jacketpink" + current_skin = "jacketpink" + +/obj/item/clothing/suit/toggle/windbreaker/brown + name = "brown windbreaker" + desc = "Sometimes called a windcheater, this is a simple jacket made of synthetic materials. Good for keeping the chilly wind off of you. This one is brown." + icon_state = "jacketbrown" + current_skin = "jacketbrown" + +/obj/item/clothing/suit/toggle/windbreaker/lightbrown + name = "light brown windbreaker" + desc = "Sometimes called a windcheater, this is a simple jacket made of synthetic materials. Good for keeping the chilly wind off of you. This one is light brown." + icon_state = "jacketlightbrown" + current_skin = "jacketlightbrown" diff --git a/code/modules/clothing/under/color.dm b/code/modules/clothing/under/color.dm index 7ac32c9c1295..b104fe0d60b8 100644 --- a/code/modules/clothing/under/color.dm +++ b/code/modules/clothing/under/color.dm @@ -1,13 +1,52 @@ /obj/item/clothing/under/color + name = "jumpsuit" desc = "A standard issue colored jumpsuit. Variety is the spice of life!" dying_key = DYE_REGISTRY_UNDER icon = 'icons/obj/clothing/under/color.dmi' mob_overlay_icon = 'icons/mob/clothing/under/color.dmi' supports_variations = DIGITIGRADE_VARIATION | VOX_VARIATION + icon_state = "black" + item_state = "bl_suit" + unique_reskin = list("black jumpsuit" = "black", + "grey jumpsuit" = "grey", + "blue jumpsuit" = "blue", + "green jumpsuit" = "green", + "orange jumpsuit" = "orange", + "pink jumpsuit" = "pink", + "red jumpsuit" = "red", + "white jumpsuit" = "white", + "yellow jumpsuit" = "yellow", + "dark blue jumpsuit" = "darkblue", + "teal jumpsuit" = "teal", + "light purple jumpsuit" = "lightpurple", + "dark green jumpsuit" = "darkgreen", + "light brown jumpsuit" = "lightbrown", + "brown jumpsuit" = "brown", + "maroon jumpsuit" = "maroon" + ) /obj/item/clothing/under/color/jumpskirt + name = "jumpskirt" body_parts_covered = CHEST|GROIN|ARMS can_adjust = TRUE + icon_state = "black_skirt" + unique_reskin = list("black jumpskirt" = "black_skirt", + "grey jumpskirt" = "grey_skirt", + "blue jumpskirt" = "blue_skirt", + "green jumpskirt" = "green_skirt", + "orange jumpskirt" = "orange_skirt", + "pink jumpskirt" = "pink_skirt", + "red jumpskirt" = "red_skirt", + "white jumpskirt" = "white_skirt", + "yellow jumpskirt" = "yellow_skirt", + "dark blue jumpskirt" = "darkblue_skirt", + "teal jumpskirt" = "teal_skirt", + "light purple jumpskirt" = "lightpurple_skirt", + "dark green jumpskirt" = "darkgreen_skirt", + "light brown jumpskirt" = "lightbrown_skirt", + "brown jumpskirt" = "brown_skirt", + "maroon jumpskirt" = "maroon_skirt" + ) /obj/item/clothing/under/color/random icon_state = "random_jumpsuit" diff --git a/code/modules/food_and_drinks/food/snacks_egg.dm b/code/modules/food_and_drinks/food/snacks_egg.dm index c17335bbb140..4db728b748cf 100644 --- a/code/modules/food_and_drinks/food/snacks_egg.dm +++ b/code/modules/food_and_drinks/food/snacks_egg.dm @@ -57,11 +57,6 @@ to_chat(usr, "You colour [src] with [W].") icon_state = "egg-[clr]" - else if(istype(W, /obj/item/stamp/clown)) - var/clowntype = pick("grock", "grimaldi", "rainbow", "chaos", "joker", "sexy", "standard", "bobble", "krusty", "bozo", "pennywise", "ronald", "jacobs", "kelly", "popov", "cluwne") - icon_state = "egg-clown-[clowntype]" - desc = "An egg that has been decorated with the grotesque, robustable likeness of a clown's face. " - to_chat(usr, "You stamp [src] with [W], creating an artistic and not remotely horrifying likeness of clown makeup.") else ..() diff --git a/code/modules/food_and_drinks/food/snacks_pie.dm b/code/modules/food_and_drinks/food/snacks_pie.dm index 1ac3b49c0112..3f1e5d2f9098 100644 --- a/code/modules/food_and_drinks/food/snacks_pie.dm +++ b/code/modules/food_and_drinks/food/snacks_pie.dm @@ -20,7 +20,7 @@ /obj/item/reagent_containers/food/snacks/pie/cream name = "banana cream pie" - desc = "Just like back home, on clown planet! HONK!" + desc = "Just like back home." icon_state = "pie" trash = /obj/item/trash/plate bonus_reagents = list(/datum/reagent/consumable/nutriment = 2, /datum/reagent/consumable/nutriment/vitamin = 2) diff --git a/code/modules/food_and_drinks/food/snacks_soup.dm b/code/modules/food_and_drinks/food/snacks_soup.dm index 5ec9408dc414..3d131fb5cecb 100644 --- a/code/modules/food_and_drinks/food/snacks_soup.dm +++ b/code/modules/food_and_drinks/food/snacks_soup.dm @@ -124,13 +124,13 @@ tastes = list("tomato" = 1, "mint" = 1) foodtype = VEGETABLES | MEAT -/obj/item/reagent_containers/food/snacks/soup/clownchili - name = "chili con carnival" - desc = "A delicious stew of meat, chiles, and salty, salty clown tears." +/obj/item/reagent_containers/food/snacks/soup/meatchili + name = "chili con carne" + desc = "A delicious stew of meat and chiles." icon_state = "clownchili" - bonus_reagents = list(/datum/reagent/consumable/nutriment = 1, /datum/reagent/consumable/tomatojuice = 2, /datum/reagent/consumable/nutriment/vitamin = 2, /datum/reagent/consumable/laughter = 1) - list_reagents = list(/datum/reagent/consumable/nutriment = 5, /datum/reagent/consumable/capsaicin = 1, /datum/reagent/consumable/tomatojuice = 2, /datum/reagent/consumable/nutriment/vitamin = 2, /datum/reagent/consumable/banana = 1) - tastes = list("tomato" = 1, "hot peppers" = 2, "clown feet" = 2, "kind of funny" = 2, "someone's parents" = 2) + bonus_reagents = list(/datum/reagent/consumable/nutriment = 1, /datum/reagent/consumable/tomatojuice = 2, /datum/reagent/consumable/nutriment/vitamin = 2) + list_reagents = list(/datum/reagent/consumable/nutriment = 5, /datum/reagent/consumable/capsaicin = 1, /datum/reagent/consumable/tomatojuice = 2, /datum/reagent/consumable/nutriment/vitamin = 2) + tastes = list("tomato" = 1, "hot peppers" = 2, "meat" = 2, "spice" = 2) foodtype = VEGETABLES | MEAT /obj/item/reagent_containers/food/snacks/soup/monkeysdelight diff --git a/code/modules/food_and_drinks/recipes/tablecraft/recipes_soup.dm b/code/modules/food_and_drinks/recipes/tablecraft/recipes_soup.dm index 9352e1b371aa..a8b1772fd7c7 100644 --- a/code/modules/food_and_drinks/recipes/tablecraft/recipes_soup.dm +++ b/code/modules/food_and_drinks/recipes/tablecraft/recipes_soup.dm @@ -81,15 +81,15 @@ result = /obj/item/reagent_containers/food/snacks/soup/coldchili subcategory = CAT_SOUP -/datum/crafting_recipe/food/clownchili - name = "Chili con carnival" +/datum/crafting_recipe/food/meatchili + name = "Chili con carne" reqs = list( /obj/item/reagent_containers/glass/bowl = 1, /obj/item/reagent_containers/food/snacks/meat/cutlet = 2, /obj/item/reagent_containers/food/snacks/grown/chili = 1, /obj/item/reagent_containers/food/snacks/grown/tomato = 1, ) - result = /obj/item/reagent_containers/food/snacks/soup/clownchili + result = /obj/item/reagent_containers/food/snacks/soup/meatchili subcategory = CAT_SOUP /datum/crafting_recipe/food/tomatosoup diff --git a/code/modules/holiday/halloween.dm b/code/modules/holiday/halloween.dm index 4c2586b7dd4b..0461fe58a38d 100644 --- a/code/modules/holiday/halloween.dm +++ b/code/modules/holiday/halloween.dm @@ -97,12 +97,6 @@ trapped = 0 QDEL_IN(F, 120) - else if(trapped == INSANE_CLOWN) - visible_message("...") - playsound(loc, 'sound/spookoween/scary_clown_appear.ogg', 300, TRUE) - spawn_atom_to_turf(/mob/living/simple_animal/hostile/clown_insane, loc, 1, FALSE) - trapped = 0 - //don't spawn in crates /obj/structure/closet/crate/trigger_spooky_trap() return @@ -171,81 +165,6 @@ /mob/living/simple_animal/shade/howling_ghost/adjustHealth(amount, updating_health = TRUE, forced = FALSE) . = 0 -/////////////////////////// -//Spookoween Insane Clown// -/////////////////////////// - -///Insane clown mob. Basically a clown that haunts you. -/mob/living/simple_animal/hostile/clown_insane - name = "insane clown" - desc = "Some clowns do not manage to be accepted, and go insane. This is one of them." - icon = 'icons/mob/clown_mobs.dmi' - icon_state = "scary_clown" - icon_living = "scary_clown" - icon_dead = "scary_clown" - icon_gib = "scary_clown" - speak = list("...", ". . .") - maxHealth = 1e6 - health = 1e6 - emote_see = list("silently stares") - unsuitable_atmos_damage = 0 - var/timer - -/mob/living/simple_animal/hostile/clown_insane/Initialize() - . = ..() - status_flags |= GODMODE //Slightly easier to maintain. - -/mob/living/simple_animal/hostile/clown_insane/Destroy() - timer = null - return ..() - -/mob/living/simple_animal/hostile/clown_insane/ex_act() - return - -///Adds a timer to call stalk() on Aggro -/mob/living/simple_animal/hostile/clown_insane/Aggro() - . = ..() - timer = addtimer(CALLBACK(src, PROC_REF(stalk)), 30, TIMER_STOPPABLE|TIMER_UNIQUE) - -/mob/living/simple_animal/hostile/clown_insane/LoseAggro() - . = ..() - if(timer) - deltimer(timer) - timer = null - -///Plays scary noises and adds some timers. -/mob/living/simple_animal/hostile/clown_insane/proc/stalk() - var/mob/living/M = target - if(!istype(M)) - LoseAggro() - return - if(M.stat == DEAD) - playsound(M.loc, 'sound/spookoween/insane_low_laugh.ogg', 100, TRUE) - qdel(src) - return - playsound(M, pick('sound/spookoween/scary_horn.ogg','sound/spookoween/scary_horn2.ogg', 'sound/spookoween/scary_horn3.ogg'), 100, TRUE) - timer = addtimer(CALLBACK(src, PROC_REF(stalk)), 30, TIMER_STOPPABLE|TIMER_UNIQUE) - addtimer(CALLBACK(src, PROC_REF(teleport_to_target)), 12, TIMER_STOPPABLE|TIMER_UNIQUE) - -///Does what's in the name. Teleports to target.loc. Called from a timer. -/mob/living/simple_animal/hostile/clown_insane/proc/teleport_to_target() - if(target && isturf(target.loc)) //Hiding in lockers works to get rid of this thing. - forceMove(target.loc) - -/mob/living/simple_animal/hostile/clown_insane/MoveToTarget() - return - -/mob/living/simple_animal/hostile/clown_insane/AttackingTarget() - return - -/mob/living/simple_animal/hostile/clown_insane/adjustHealth(amount, updating_health = TRUE, forced = FALSE) - . = 0 - if(prob(5)) - playsound(loc, 'sound/spookoween/insane_low_laugh.ogg', 300, TRUE) - -/mob/living/simple_animal/hostile/clown_insane/handle_temperature_damage() - return - ///////////////////////// // Spooky Uplink Items // ///////////////////////// diff --git a/code/modules/jobs/job_types/chaplain.dm b/code/modules/jobs/job_types/chaplain.dm index 5efe0a0a00d2..3835613d686f 100644 --- a/code/modules/jobs/job_types/chaplain.dm +++ b/code/modules/jobs/job_types/chaplain.dm @@ -98,11 +98,8 @@ ears = /obj/item/radio/headset/headset_srv uniform = /obj/item/clothing/under/rank/civilian/chaplain backpack_contents = list( - /obj/item/stamp/chap = 1, /obj/item/camera/spooky = 1 ) backpack = /obj/item/storage/backpack/cultpack satchel = /obj/item/storage/backpack/cultpack - - chameleon_extras = /obj/item/stamp/chap diff --git a/code/modules/jobs/job_types/clown.dm b/code/modules/jobs/job_types/clown.dm index e2c0e24501b1..cda0c0970b8c 100644 --- a/code/modules/jobs/job_types/clown.dm +++ b/code/modules/jobs/job_types/clown.dm @@ -19,14 +19,12 @@ job_icon = "clown" jobtype = /datum/job/clown - belt = /obj/item/pda/clown ears = /obj/item/radio/headset/headset_srv uniform = /obj/item/clothing/under/rank/civilian/clown alt_uniform = /obj/item/clothing/under/rank/civilian/clown/green mask = /obj/item/clothing/mask/gas/clown_hat l_pocket = /obj/item/bikehorn backpack_contents = list( - /obj/item/stamp/clown = 1, /obj/item/reagent_containers/spray/waterflower = 1, /obj/item/reagent_containers/food/snacks/grown/banana = 1, /obj/item/instrument/bikehorn = 1, @@ -38,8 +36,6 @@ box = /obj/item/storage/box/hug/survival - chameleon_extras = /obj/item/stamp/clown - /datum/outfit/job/clown/post_equip(mob/living/carbon/human/H, visualsOnly = FALSE) ..() if(visualsOnly) diff --git a/code/modules/jobs/job_types/head_of_personnel.dm b/code/modules/jobs/job_types/head_of_personnel.dm index d535e1fb705e..24e24d6cdf20 100644 --- a/code/modules/jobs/job_types/head_of_personnel.dm +++ b/code/modules/jobs/job_types/head_of_personnel.dm @@ -47,4 +47,4 @@ duffelbag = /obj/item/storage/backpack/duffelbag/captain courierbag = /obj/item/storage/backpack/messenger/com - chameleon_extras = list(/obj/item/gun/energy/e_gun, /obj/item/stamp/head_of_personnel) + chameleon_extras = list(/obj/item/gun/energy/e_gun, /obj/item/stamp/officer) diff --git a/code/modules/jobs/job_types/lawyer.dm b/code/modules/jobs/job_types/lawyer.dm index b43c00caed3e..850968365807 100644 --- a/code/modules/jobs/job_types/lawyer.dm +++ b/code/modules/jobs/job_types/lawyer.dm @@ -25,5 +25,3 @@ l_hand = /obj/item/storage/briefcase/lawyer l_pocket = /obj/item/laser_pointer r_pocket = /obj/item/clothing/accessory/lawyers_badge - - chameleon_extras = /obj/item/stamp/law diff --git a/code/modules/jobs/job_types/mime.dm b/code/modules/jobs/job_types/mime.dm index 3d165c8610b7..776d69a26293 100644 --- a/code/modules/jobs/job_types/mime.dm +++ b/code/modules/jobs/job_types/mime.dm @@ -18,7 +18,6 @@ job_icon = "mime" jobtype = /datum/job/mime - belt = /obj/item/pda/mime ears = /obj/item/radio/headset/headset_srv uniform = /obj/item/clothing/under/rank/civilian/mime alt_uniform = /obj/item/clothing/under/rank/civilian/mime/sexy //WS Edit - Alt Uniforms @@ -27,7 +26,6 @@ head = /obj/item/clothing/head/frenchberet suit = /obj/item/clothing/suit/toggle/suspenders backpack_contents = list( - /obj/item/stamp/mime = 1, /obj/item/book/mimery = 1, /obj/item/reagent_containers/food/drinks/bottle/bottleofnothing = 1 ) @@ -35,8 +33,6 @@ backpack = /obj/item/storage/backpack/mime satchel = /obj/item/storage/backpack/mime - chameleon_extras = /obj/item/stamp/mime - /datum/outfit/job/mime/post_equip(mob/living/carbon/human/H, visualsOnly = FALSE) ..() diff --git a/code/modules/mob/dead/new_player/preferences_setup.dm b/code/modules/mob/dead/new_player/preferences_setup.dm index 71b66ac54fb4..86a2f792a839 100644 --- a/code/modules/mob/dead/new_player/preferences_setup.dm +++ b/code/modules/mob/dead/new_player/preferences_setup.dm @@ -64,6 +64,5 @@ if(selected_outfit && show_gear) selected_outfit.equip(mannequin, TRUE, preference_source = parent) - COMPILE_OVERLAYS(mannequin) parent.show_character_previews(new /mutable_appearance(mannequin)) unset_busy_human_dummy(DUMMY_HUMAN_SLOT_PREFERENCES) diff --git a/code/modules/mob/living/silicon/robot/robot_modules.dm b/code/modules/mob/living/silicon/robot/robot_modules.dm index 0778eaf59fc9..25c739a5667c 100644 --- a/code/modules/mob/living/silicon/robot/robot_modules.dm +++ b/code/modules/mob/living/silicon/robot/robot_modules.dm @@ -745,7 +745,6 @@ /obj/item/assembly/flash/cyborg, /obj/item/toy/crayon/rainbow, /obj/item/instrument/bikehorn, - /obj/item/stamp/clown, /obj/item/bikehorn, /obj/item/bikehorn/airhorn, /obj/item/paint/anycolor, diff --git a/code/modules/mob/living/simple_animal/corpse.dm b/code/modules/mob/living/simple_animal/corpse.dm index f189084e6dc1..39faff1add2c 100644 --- a/code/modules/mob/living/simple_animal/corpse.dm +++ b/code/modules/mob/living/simple_animal/corpse.dm @@ -116,82 +116,6 @@ suit = /obj/item/clothing/suit/pirate head = /obj/item/clothing/head/pirate - -/obj/effect/mob_spawn/human/corpse/frontier - name = "Frontiersman" - outfit = /datum/outfit/frontier - hairstyle = "Bald" - facial_hairstyle = "Shaved" - -/datum/outfit/frontier - name = "Frontiersman Corpse" - uniform = /obj/item/clothing/under/frontiersmen - shoes = /obj/item/clothing/shoes/jackboots - head = /obj/item/clothing/head/beret/sec/frontier - gloves = /obj/item/clothing/gloves/color/black - neck = /obj/item/clothing/neck/dogtag/frontier - -/obj/effect/mob_spawn/human/corpse/frontier/ranged - outfit = /datum/outfit/frontier - -/obj/effect/mob_spawn/human/corpse/frontier/surgeon - outfit = /datum/outfit/job/frontiersmen/doctor/corpse - -/datum/outfit/job/frontiersmen/doctor/corpse - name = "Frontiersmen Surgeon Corpse" - r_pocket = null - -/obj/effect/mob_spawn/human/corpse/frontier/ranged/trooper - outfit = /datum/outfit/frontier/trooper - -/datum/outfit/frontier/trooper - name = "Frontiersman Armored Corpse" - suit = /obj/item/clothing/suit/armor/vest/frontier - shoes = /obj/item/clothing/shoes/combat - gloves = /obj/item/clothing/gloves/tackler/combat - ears = /obj/item/radio/headset - head = /obj/item/clothing/head/helmet/bulletproof/x11/frontier - - -/obj/effect/mob_spawn/human/corpse/frontier/ranged/officer - name = "Frontiersman Officer" - outfit = /datum/outfit/frontier/officer - -/datum/outfit/frontier/officer - name = "Frontiersman Officer Corpse" - uniform = /obj/item/clothing/under/frontiersmen/officer - suit = /obj/item/clothing/suit/armor/frontier - shoes = /obj/item/clothing/shoes/combat - ears = /obj/item/radio/headset - head = /obj/item/clothing/head/frontier/peaked - -/obj/effect/mob_spawn/human/corpse/frontier/ranged/trooper/heavy - outfit = /datum/outfit/frontier/trooper/heavy - -/datum/outfit/frontier/trooper/heavy - name = "Frontiersman Heavy Corpse" - suit = /obj/item/clothing/suit/space/hardsuit/security/independent/frontier - head = /obj/item/clothing/head/beret/sec/frontier/officer - back = /obj/item/minigunpack - -/obj/effect/mob_spawn/human/corpse/frontier/ranged/trooper/heavy/gunless - outfit = /datum/outfit/frontier/trooper/heavy/gunless - -/obj/effect/mob_spawn/human/corpse/frontier/ranged/trooper/flame - outfit = /datum/outfit/job/frontiersmen/ert/flamer/corpse - -/datum/outfit/job/frontiersmen/ert/flamer/corpse - name = "Frontiersman Flametrooper Corpse" - back = null - belt = /obj/item/storage/belt/security/military/frontiersmen - l_hand = null - - backpack_contents = null - -/datum/outfit/frontier/trooper/heavy/gunless - name = "Frontiersman Heavy Corpse (Gunless)" - back = null - /obj/effect/mob_spawn/human/corpse/wizard name = "Space Wizard Corpse" outfit = /datum/outfit/wizardcorpse diff --git a/code/modules/mob/living/simple_animal/corpse_spawners/frontiersman.dm b/code/modules/mob/living/simple_animal/corpse_spawners/frontiersman.dm new file mode 100644 index 000000000000..cb99e06df32a --- /dev/null +++ b/code/modules/mob/living/simple_animal/corpse_spawners/frontiersman.dm @@ -0,0 +1,115 @@ +/obj/effect/mob_spawn/human/corpse/frontier + name = "Frontiersman" + outfit = /datum/outfit/frontier + +/obj/effect/mob_spawn/human/corpse/frontier/internals + outfit = /datum/outfit/frontier/internals + +/datum/outfit/frontier + name = "Frontiersman Corpse" + uniform = /obj/item/clothing/under/frontiersmen + shoes = /obj/item/clothing/shoes/jackboots + head = /obj/item/clothing/head/beret/sec/frontier + gloves = /obj/item/clothing/gloves/color/black + neck = /obj/item/clothing/neck/dogtag/frontier + +/datum/outfit/frontier/internals + name = "Frontiersman Corpse Internals" + mask = /obj/item/clothing/mask/gas/sechailer + l_pocket = /obj/item/tank/internals/emergency_oxygen/engi + +/obj/effect/mob_spawn/human/corpse/frontier/ranged + outfit = /datum/outfit/frontier + +/obj/effect/mob_spawn/human/corpse/frontier/ranged/internals + outfit = /datum/outfit/frontier/internals + +/obj/effect/mob_spawn/human/corpse/frontier/surgeon + outfit = /datum/outfit/job/frontiersmen/doctor/corpse + +/obj/effect/mob_spawn/human/corpse/frontier/surgeon/internals + outfit = /datum/outfit/job/frontiersmen/doctor/corpse/internals + +/datum/outfit/job/frontiersmen/doctor/corpse + name = "Frontiersmen Surgeon Corpse" + r_pocket = null + +/datum/outfit/job/frontiersmen/doctor/corpse/internals + name = "Frontiersmen Surgeon Corpse Internals" + mask = /obj/item/clothing/mask/breath + l_pocket = /obj/item/tank/internals/emergency_oxygen/engi + +/obj/effect/mob_spawn/human/corpse/frontier/ranged/trooper + outfit = /datum/outfit/frontier/trooper + +/obj/effect/mob_spawn/human/corpse/frontier/ranged/trooper/internals + outfit = /datum/outfit/frontier/trooper/internals + +/datum/outfit/frontier/trooper + name = "Frontiersman Armored Corpse" + suit = /obj/item/clothing/suit/armor/vest/frontier + shoes = /obj/item/clothing/shoes/combat + gloves = /obj/item/clothing/gloves/tackler/combat + ears = /obj/item/radio/headset + head = /obj/item/clothing/head/helmet/bulletproof/x11/frontier + +/datum/outfit/frontier/trooper/internals + name = "Frontiersman Armored Corpse Internals" + mask = /obj/item/clothing/mask/gas/frontiersmen + l_pocket = /obj/item/tank/internals/emergency_oxygen/engi + +/obj/effect/mob_spawn/human/corpse/frontier/ranged/officer + name = "Frontiersman Officer" + outfit = /datum/outfit/frontier/officer + +/datum/outfit/frontier/officer + name = "Frontiersman Officer Corpse" + uniform = /obj/item/clothing/under/frontiersmen/officer + suit = /obj/item/clothing/suit/armor/frontier + shoes = /obj/item/clothing/shoes/combat + ears = /obj/item/radio/headset + head = /obj/item/clothing/head/frontier/peaked + +/obj/effect/mob_spawn/human/corpse/frontier/ranged/officer/internals + name = "Frontiersman Officer Corpse Internals" + outfit = /datum/outfit/frontier/officer/internals + +/datum/outfit/frontier/officer/internals + name = "Frontiersman Officer Corpse Internals" + mask = /obj/item/clothing/mask/gas/frontiersmen + l_pocket = /obj/item/tank/internals/emergency_oxygen/engi + +/obj/effect/mob_spawn/human/corpse/frontier/ranged/trooper/heavy + outfit = /datum/outfit/frontier/trooper/heavy + +/datum/outfit/frontier/trooper/heavy + name = "Frontiersman Heavy Corpse" + suit = /obj/item/clothing/suit/space/hardsuit/security/independent/frontier + head = /obj/item/clothing/head/beret/sec/frontier/officer + back = /obj/item/minigunpack + +/obj/effect/mob_spawn/human/corpse/frontier/ranged/trooper/heavy/internals + outfit = /datum/outfit/frontier/trooper/heavy/internals + +/datum/outfit/frontier/trooper/heavy/internals + name = "Frontiersman Heavy Corpse Internals" + mask = /obj/item/clothing/mask/gas/frontiersmen + l_pocket = /obj/item/tank/internals/emergency_oxygen/engi + +/obj/effect/mob_spawn/human/corpse/frontier/ranged/trooper/heavy/gunless + outfit = /datum/outfit/frontier/trooper/heavy/gunless + +/obj/effect/mob_spawn/human/corpse/frontier/ranged/trooper/flame + outfit = /datum/outfit/job/frontiersmen/ert/flamer/corpse + +/datum/outfit/job/frontiersmen/ert/flamer/corpse + name = "Frontiersman Flametrooper Corpse" + back = null + belt = /obj/item/storage/belt/security/military/frontiersmen + l_hand = null + + backpack_contents = null + +/datum/outfit/frontier/trooper/heavy/gunless + name = "Frontiersman Heavy Corpse (Gunless)" + back = null diff --git a/code/modules/mob/living/simple_animal/hostile/clown.dm b/code/modules/mob/living/simple_animal/hostile/clown.dm deleted file mode 100644 index a5883ce91efa..000000000000 --- a/code/modules/mob/living/simple_animal/hostile/clown.dm +++ /dev/null @@ -1,335 +0,0 @@ -/mob/living/simple_animal/hostile/clown - name = "Clown" - desc = "A denizen of clown planet." - icon = 'icons/mob/clown_mobs.dmi' - icon_state = "clown" - icon_living = "clown" - icon_dead = "clown_dead" - icon_gib = "clown_gib" - health_doll_icon = "clown" //if >32x32, it will use this generic. for all the huge clown mobs that subtype from this - mob_biotypes = MOB_ORGANIC|MOB_HUMANOID - turns_per_move = 5 - response_disarm_continuous = "gently pushes aside" - response_disarm_simple = "gently push aside" - response_harm_continuous = "robusts" - response_harm_simple = "robust" - speak = list("HONK", "Honk!", "Welcome to clown planet!") - emote_see = list("honks", "squeaks") - speak_chance = 1 - a_intent = INTENT_HARM - maxHealth = 75 - health = 75 - speed = 1 - harm_intent_damage = 8 - melee_damage_lower = 10 - melee_damage_upper = 10 - attack_sound = 'sound/items/bikehorn.ogg' - obj_damage = 0 - environment_smash = ENVIRONMENT_SMASH_NONE - del_on_death = 1 - loot = list(/obj/effect/mob_spawn/human/clown/corpse) - - minbodytemp = 270 - maxbodytemp = 370 - unsuitable_atmos_damage = 10 - footstep_type = FOOTSTEP_MOB_SHOE - var/banana_time = 0 // If there's no time set it won't spawn. - var/banana_type = /obj/item/grown/bananapeel - var/attack_reagent - -/mob/living/simple_animal/hostile/clown/handle_temperature_damage() - if(bodytemperature < minbodytemp) - adjustBruteLoss(10) - throw_alert("temp", /atom/movable/screen/alert/cold, 2) - else if(bodytemperature > maxbodytemp) - adjustBruteLoss(15) - throw_alert("temp", /atom/movable/screen/alert/hot, 3) - else - clear_alert("temp") - -/mob/living/simple_animal/hostile/clown/attack_hand(mob/living/carbon/human/M) - ..() - playsound(src.loc, 'sound/items/bikehorn.ogg', 50, TRUE) - -/mob/living/simple_animal/hostile/clown/Life() - . = ..() - if(banana_time && banana_time < world.time) - var/turf/T = get_turf(src) - var/list/adjacent = T.get_atmos_adjacent_turfs() - new banana_type(pick(adjacent)) - banana_time = world.time + rand(30,60) - -/mob/living/simple_animal/hostile/clown/AttackingTarget() - . = ..() - if(attack_reagent && . && isliving(target)) - var/mob/living/L = target - if(L.reagents) - L.reagents.add_reagent(attack_reagent, rand(1,5)) - -/mob/living/simple_animal/hostile/clown/lube - name = "Living Lube" - desc = "A puddle of lube brought to life by the honkmother." - icon_state = "lube" - icon_living = "lube" - turns_per_move = 1 - response_help_continuous = "dips a finger into" - response_help_simple = "dip a finger into" - response_disarm_continuous = "gently scoops and pours aside" - response_disarm_simple = "gently scoop and pour aside" - emote_see = list("bubbles", "oozes") - loot = list(/obj/item/clothing/mask/gas/clown_hat, /obj/effect/particle_effect/foam) - -/mob/living/simple_animal/hostile/clown/lube/Initialize() - . = ..() - AddElement(/datum/element/snailcrawl) - -/mob/living/simple_animal/hostile/clown/banana - name = "Clownana" - desc = "A fusion of clown and banana DNA birthed from a botany experiment gone wrong." - icon_state = "banana tree" - icon_living = "banana tree" - response_disarm_continuous = "peels" - response_disarm_simple = "peel" - response_harm_continuous = "peels" - response_harm_simple = "peel" - turns_per_move = 1 - speak = list("HONK", "Honk!", "YA-HONK!!!") - emote_see = list("honks", "bites into the banana", "plucks a banana off its head", "photosynthesizes") - maxHealth = 120 - health = 120 - speed = -10 - loot = list(/obj/item/clothing/mask/gas/clown_hat, /obj/effect/gibspawner/human, /obj/item/soap, /obj/item/seeds/banana) - banana_time = 20 - -/mob/living/simple_animal/hostile/clown/honkling - name = "Honkling" - desc = "A divine being sent by the Honkmother to spread joy. It's not dangerous, but it's a bit of a nuisance." - icon_state = "honkling" - icon_living = "honkling" - turns_per_move = 1 - speed = -10 - harm_intent_damage = 1 - melee_damage_lower = 1 - melee_damage_upper = 1 - attack_verb_continuous = "cheers up" - attack_verb_simple = "cheer up" - loot = list(/obj/item/clothing/mask/gas/clown_hat, /obj/effect/gibspawner/human, /obj/item/soap, /obj/item/seeds/banana/bluespace) - banana_type = /obj/item/grown/bananapeel - attack_reagent = /datum/reagent/consumable/laughter - -/mob/living/simple_animal/hostile/clown/fleshclown - name = "Fleshclown" - desc = "A being forged out of the pure essence of pranking, cursed into existence by a cruel maker." - icon_state = "fleshclown" - icon_living = "fleshclown" - response_help_continuous = "reluctantly pokes" - response_help_simple = "reluctantly poke" - response_disarm_continuous = "sinks his hands into the spongy flesh of" - response_disarm_simple = "sink your hands into the spongy flesh of" - response_harm_continuous = "cleanses the world of" - response_harm_simple = "cleanse the world of" - speak = list("HONK", "Honk!", "I didn't ask for this", "I feel constant and horrible pain", "YA-HONK!!!", "this body is a merciless and unforgiving prison", "I was born out of mirthful pranking but I live in suffering") - emote_see = list("honks", "sweats", "jiggles", "contemplates its existence") - speak_chance = 5 - dextrous = TRUE - ventcrawler = VENTCRAWLER_ALWAYS - maxHealth = 140 - health = 140 - speed = -5 - melee_damage_upper = 15 - attack_verb_continuous = "limply slaps" - attack_verb_simple = "limply slap" - obj_damage = 5 - loot = list(/obj/item/clothing/suit/hooded/bloated_human, /obj/item/clothing/mask/gas/clown_hat, /obj/effect/gibspawner/human, /obj/item/soap) - -/mob/living/simple_animal/hostile/clown/longface - name = "Longface" - desc = "Often found walking into the bar." - icon_state = "long face" - icon_living = "long face" - move_resist = INFINITY - turns_per_move = 10 - response_help_continuous = "tries to awkwardly hug" - response_help_simple = "try to awkwardly hug" - response_disarm_continuous = "pushes the unwieldy frame of" - response_disarm_simple = "push the unwieldy frame of" - response_harm_continuous = "tries to shut up" - response_harm_simple = "try to shut up" - speak = list("YA-HONK!!!") - emote_see = list("honks", "squeaks") - speak_chance = 60 - maxHealth = 150 - health = 150 - pixel_x = -16 - speed = 10 - harm_intent_damage = 15 - melee_damage_lower = 15 - attack_verb_continuous = "YA-HONKs" - attack_verb_simple = "YA-HONK" - loot = list(/obj/item/clothing/mask/gas/clown_hat, /obj/effect/gibspawner/human, /obj/item/soap) - -/mob/living/simple_animal/hostile/clown/clownhulk - name = "Honk Hulk" - desc = "A cruel and fearsome clown. Don't make him angry." - icon_state = "honkhulk" - icon_living = "honkhulk" - move_resist = INFINITY - response_help_continuous = "tries desperately to appease" - response_help_simple = "try desperately to appease" - response_disarm_continuous = "foolishly pushes" - response_disarm_simple = "foolishly push" - response_harm_continuous = "angers" - response_harm_simple = "anger" - speak = list("HONK", "Honk!", "HAUAUANK!!!", "GUUURRRRAAAHHH!!!") - emote_see = list("honks", "sweats", "grunts") - speak_chance = 5 - maxHealth = 250 - health = 250 - pixel_x = -16 - speed = 2 - harm_intent_damage = 15 - melee_damage_lower = 15 - melee_damage_upper = 20 - attack_verb_continuous = "pummels" - attack_verb_simple = "pummel" - obj_damage = 30 - environment_smash = ENVIRONMENT_SMASH_WALLS - loot = list(/obj/item/clothing/mask/gas/clown_hat, /obj/effect/gibspawner/human, /obj/item/soap) - -/mob/living/simple_animal/hostile/clown/clownhulk/chlown - name = "Chlown" - desc = "A real lunkhead who somehow gets all the girls." - icon_state = "chlown" - icon_living = "chlown" - response_help_continuous = "submits to" - response_help_simple = "submit to" - response_disarm_continuous = "tries to assert dominance over" - response_disarm_simple = "try to assert dominance over" - response_harm_continuous = "makes a weak beta attack at" - response_harm_simple = "make a weak beta attack at" - speak = list("HONK", "Honk!", "Bruh", "cheeaaaahhh?") - emote_see = list("asserts his dominance", "emasculates everyone implicitly") - maxHealth = 500 - health = 500 - speed = -2 - armour_penetration = 20 - attack_verb_continuous = "steals the girlfriend of" - attack_verb_simple = "steal the girlfriend of" - attack_sound = 'sound/items/airhorn2.ogg' - loot = list(/obj/item/clothing/mask/gas/clown_hat, /obj/effect/gibspawner/human, /obj/effect/particle_effect/foam, /obj/item/soap) - -/mob/living/simple_animal/hostile/clown/clownhulk/honcmunculus - name = "Honkmunculus" - desc = "A slender wiry figure of alchemical origin." - icon_state = "honkmunculus" - icon_living = "honkmunculus" - response_help_continuous = "skeptically pokes" - response_help_simple = "skeptically poke" - response_disarm_continuous = "pushes the unwieldy frame of" - response_disarm_simple = "push the unwieldy frame of" - speak = list("honk") - emote_see = list("squirms", "writhes") - speak_chance = 1 - maxHealth = 200 - health = 200 - speed = -5 - harm_intent_damage = 15 - melee_damage_lower = 15 - melee_damage_upper = 15 - attack_verb_continuous = "ferociously mauls" - attack_verb_simple = "ferociously maul" - environment_smash = ENVIRONMENT_SMASH_WALLS - loot = list(/obj/item/clothing/mask/gas/clown_hat, /obj/effect/gibspawner/xeno/bodypartless, /obj/effect/particle_effect/foam, /obj/item/soap) - attack_reagent = /datum/reagent/peaceborg/confuse - -/mob/living/simple_animal/hostile/clown/clownhulk/destroyer - name = "The Destroyer" - desc = "An ancient being born of arcane honking." - icon_state = "destroyer" - icon_living = "destroyer" - response_disarm_continuous = "bounces off of" - response_harm_continuous = "bounces off of" - speak = list("HONK!!!", "The Honkmother is merciful, so I must act out her wrath.", "parce mihi ad beatus honkmother placet mihi ut peccata committere,", "DIE!!!") - maxHealth = 400 - health = 400 - speed = 5 - harm_intent_damage = 30 - melee_damage_lower = 20 - melee_damage_upper = 40 - armour_penetration = 30 - stat_attack = HARD_CRIT - attack_verb_continuous = "acts out divine vengeance on" - attack_verb_simple = "act out divine vengeance on" - obj_damage = 50 - environment_smash = ENVIRONMENT_SMASH_RWALLS - loot = list(/obj/item/clothing/mask/gas/clown_hat, /obj/effect/gibspawner/human, /obj/effect/particle_effect/foam, /obj/item/soap) - -/mob/living/simple_animal/hostile/clown/mutant - name = "Unknown" - desc = "Kill it for its own sake." - icon_state = "mutant" - icon_living = "mutant" - move_resist = INFINITY - turns_per_move = 10 - response_help_continuous = "reluctantly sinks a finger into" - response_help_simple = "reluctantly sink a finger into" - response_disarm_continuous = "squishes into" - response_disarm_simple = "squish into" - response_harm_continuous = "squishes into" - response_harm_simple = "squish into" - speak = list("aaaaaahhhhuuhhhuhhhaaaaa", "AAAaaauuuaaAAAaauuhhh", "huuuuuh... hhhhuuuooooonnnnkk", "HuaUAAAnKKKK") - emote_see = list("squirms", "writhes", "pulsates", "froths", "oozes") - speak_chance = 10 - maxHealth = 130 - health = 130 - pixel_x = -16 - speed = -5 - harm_intent_damage = 10 - melee_damage_lower = 10 - melee_damage_upper = 20 - attack_verb_continuous = "awkwardly flails at" - attack_verb_simple = "awkwardly flail at" - loot = list(/obj/item/clothing/mask/gas/clown_hat, /obj/effect/gibspawner/xeno/bodypartless, /obj/item/soap, /obj/effect/gibspawner/generic, /obj/effect/gibspawner/generic/animal, /obj/effect/gibspawner/human/bodypartless, /obj/effect/gibspawner/human) - -/mob/living/simple_animal/hostile/clown/mutant/blob - name = "Something that was once a clown" - desc = "A grotesque bulging figure far mutated from it's original state. You should probably start running. Now." - icon_state = "blob" - icon_living = "blob" - speak = list("hey, buddy", "HONK!!!", "H-h-h-H-HOOOOONK!!!!", "HONKHONKHONK!!!", "HEY, BUCKO, GET BACK HERE!!!", "HOOOOOOOONK!!!", "WHAT'S SO FUNNY!!!") - emote_see = list("jiggles", "wobbles") - health = 300 - mob_size = MOB_SIZE_LARGE - speed = 10 - attack_verb_continuous = "bounces off of" - attack_verb_simple = "bounce off of" - loot = list(/obj/item/clothing/mask/gas/clown_hat, /obj/effect/gibspawner/xeno/bodypartless, /obj/effect/particle_effect/foam, /obj/item/soap, /obj/effect/gibspawner/generic, /obj/effect/gibspawner/generic/animal, /obj/effect/gibspawner/human/bodypartless, /obj/effect/gibspawner/human) - attack_reagent = /datum/reagent/toxin/mindbreaker - melee_damage_lower = 20 - melee_damage_upper = 20 - armour_penetration = 30 - environment_smash = ENVIRONMENT_SMASH_WALLS//no escape - -/mob/living/simple_animal/hostile/clown/stacked - name = "Clownmind" - desc = "You can hear them humming circus music in perfect chorus." - icon_state = "clowns" - icon_living = "clowns" - turns_per_move = 1 - speed = 1 - speak_chance = 10 - speak_emote = list("collectively squeaks") - maxHealth = 125 - health = 125 - deathmessage = "collapses into a heap of inanimate clown dolls!" - speak = list("honkhonkhonkhonkhonk", "join the fun!join the fun!join the fun!join in the fun!", "joinus!joinus!joinus!joinus!") - emote_see = list("does a circus trick.", "forms a hoop and jumps through it.", "vibrates ominously.") - harm_intent_damage = 20 - melee_damage_lower = 20 - melee_damage_upper = 24 - attack_verb_continuous = "collectively strikes" - attack_verb_simple = "collectively strike" - response_harm_continuous = "swats away one of" - response_harm_simple = "swat away one of" - pixel_x = -20 - loot = list(/obj/item/toy/figure/clown = 5) diff --git a/code/modules/mob/living/simple_animal/hostile/giant_spider.dm b/code/modules/mob/living/simple_animal/hostile/giant_spider.dm index fa15c57249e9..becde9bfdb1d 100644 --- a/code/modules/mob/living/simple_animal/hostile/giant_spider.dm +++ b/code/modules/mob/living/simple_animal/hostile/giant_spider.dm @@ -36,8 +36,8 @@ response_help_simple = "pet" response_disarm_continuous = "gently pushes aside" response_disarm_simple = "gently push aside" - maxHealth = 200 - health = 200 + maxHealth = 60 + health = 60 obj_damage = 60 melee_damage_lower = 15 melee_damage_upper = 20 diff --git a/code/modules/mob/living/simple_animal/hostile/hostile.dm b/code/modules/mob/living/simple_animal/hostile/hostile.dm index e12e86e47b00..2cd32b99927f 100644 --- a/code/modules/mob/living/simple_animal/hostile/hostile.dm +++ b/code/modules/mob/living/simple_animal/hostile/hostile.dm @@ -18,6 +18,10 @@ var/projectiletype //set ONLY it and NULLIFY casingtype var, if we have ONLY projectile var/projectilesound var/casingtype //set ONLY it and NULLIFY projectiletype, if we have projectile IN CASING + + //spread, set on humans during init by checking what gun they're holding. + var/spread = 0 + ///delay for the automated movement. var/move_to_delay = 3 var/list/friends = list() @@ -438,7 +442,7 @@ if(casingtype) var/obj/item/ammo_casing/casing = new casingtype(startloc) playsound(src, projectilesound, 100, TRUE) - casing.fire_casing(targeted_atom, src, null, null, null, ran_zone(), 0, src) + casing.fire_casing(targeted_atom, src, null, null, null, ran_zone(), rand(-spread, spread), src) else if(projectiletype) var/obj/projectile/P = new projectiletype(startloc) playsound(src, projectilesound, 100, TRUE) diff --git a/code/modules/mob/living/simple_animal/hostile/human/frontiersman.dm b/code/modules/mob/living/simple_animal/hostile/human/frontiersman.dm index 3257e6440b9e..f7c3099a48ce 100644 --- a/code/modules/mob/living/simple_animal/hostile/human/frontiersman.dm +++ b/code/modules/mob/living/simple_animal/hostile/human/frontiersman.dm @@ -3,66 +3,54 @@ desc = "A member of the brutal Frontiersman terrorist fleet! This one clutches a wicked-looking knife in nimble fingers, eager to relieve you of your innards." icon_state = "frontiersmanmelee" icon = 'icons/mob/simple_frontiersman.dmi' - icon_living = "frontiersmanmelee" - icon_dead = "frontiersmanmelee_dead" speak_chance = 0 melee_damage_lower = 15 melee_damage_upper = 15 - loot = list(/obj/effect/mob_spawn/human/corpse/frontier, - /obj/item/melee/knife/survival) + loot = list() + atmos_requirements = NORMAL_ATMOS_REQS faction = list(FACTION_ANTAG_FRONTIERSMEN) footstep_type = FOOTSTEP_MOB_SHOE + mob_spawner = /obj/effect/mob_spawn/human/corpse/frontier + r_hand = /obj/item/melee/knife/survival /mob/living/simple_animal/hostile/human/frontier/internals icon_state = "frontiersmanmelee_mask" - icon_living = "frontiersmanmelee_mask" - loot = list(/obj/effect/mob_spawn/human/corpse/frontier, - /obj/item/clothing/mask/breath, - /obj/item/tank/internals/emergency_oxygen/engi) atmos_requirements = IMMUNE_ATMOS_REQS minbodytemp = 0 - + mob_spawner = /obj/effect/mob_spawn/human/corpse/frontier/internals /mob/living/simple_animal/hostile/human/frontier/ranged name = "Frontiersman Quickdraw" desc = "A member of the brutal Frontiersman terrorist fleet! This one thumbs a slender revolver, stained chrome and a malicious smile glinting in the light." icon_state = "frontiersmanranged" - icon_living = "frontiersmanranged" - loot = list(/obj/effect/mob_spawn/human/corpse/frontier/ranged, - /obj/item/gun/ballistic/revolver/shadow) ranged = 1 retreat_distance = 5 minimum_distance = 5 projectilesound = 'sound/weapons/gun/revolver/cattleman.ogg' casingtype = /obj/item/ammo_casing/a44roum + mob_spawner = /obj/effect/mob_spawn/human/corpse/frontier/ranged + r_hand = /obj/item/gun/ballistic/revolver/shadow /mob/living/simple_animal/hostile/human/frontier/ranged/internals icon_state = "frontiersmanranged_mask" - icon_living = "frontiersmanranged_mask" - loot = list(/obj/effect/mob_spawn/human/corpse/frontier/ranged, - /obj/item/gun/ballistic/revolver/shadow, - /obj/item/clothing/mask/breath, - /obj/item/tank/internals/emergency_oxygen/engi) atmos_requirements = IMMUNE_ATMOS_REQS minbodytemp = 0 + mob_spawner = /obj/effect/mob_spawn/human/corpse/frontier/ranged/internals /mob/living/simple_animal/hostile/human/frontier/ranged/internals/neutered - loot = list(/obj/effect/mob_spawn/human/corpse/frontier/ranged, - /obj/item/clothing/mask/breath, - /obj/item/tank/internals/emergency_oxygen/engi) + neutered = TRUE /mob/living/simple_animal/hostile/human/frontier/ranged/neutered - loot = list(/obj/effect/mob_spawn/human/corpse/frontier/ranged) + neutered = TRUE /mob/living/simple_animal/hostile/human/frontier/ranged/surgeon name = "Frontiersman Sawbones" desc = "A member of the brutal Frontiersman terrorist fleet! They appear to be a \"doctor\" of some sort, nervously swinging about some kind of makeshift syringe launcher." icon_state = "frontiersmansurgeon" icon_living = "frontiersmansurgeon" - loot = list(/obj/effect/mob_spawn/human/corpse/frontier/surgeon, - /obj/item/melee/knife/survival, - /obj/item/gun/syringe) - + mob_spawner = /obj/effect/mob_spawn/human/corpse/frontier/surgeon + l_hand = /obj/item/melee/knife/survival + r_hand = /obj/item/gun/syringe minimum_distance = 1 retreat_distance = null projectiletype = /obj/projectile/bullet/dart/tranq @@ -73,89 +61,69 @@ armor_base = /obj/item/clothing/suit/frontiersmen /mob/living/simple_animal/hostile/human/frontier/ranged/surgeon/neuter - loot = list(/obj/effect/mob_spawn/human/corpse/frontier/surgeon) + neutered = TRUE /mob/living/simple_animal/hostile/human/frontier/ranged/surgeon/internals icon_state = "frontiersmansurgeon_mask" icon_living = "frontiersmansurgeon_mask" - loot = list(/obj/effect/mob_spawn/human/corpse/frontier/surgeon, - /obj/item/melee/knife/survival, - /obj/item/gun/syringe, - /obj/item/clothing/mask/breath, - /obj/item/tank/internals/emergency_oxygen/engi) + mob_spawner = /obj/effect/mob_spawn/human/corpse/frontier/surgeon/internals /mob/living/simple_animal/hostile/human/frontier/ranged/surgeon/internals/neuter - icon_state = "frontiersmansurgeon_mask" - icon_living = "frontiersmansurgeon_mask" - loot = list(/obj/effect/mob_spawn/human/corpse/frontier/surgeon, - /obj/item/clothing/mask/breath, - /obj/item/tank/internals/emergency_oxygen/engi) + neutered = TRUE /mob/living/simple_animal/hostile/human/frontier/ranged/mosin name = "Frontiersman Sharpshot" desc = "A member of the brutal Frontiersman terrorist fleet! This one confidently mills about with a long rifle slung over their shoulder." icon_state = "frontiersmanrangedrifle" - icon_living = "frontiersmanrangedrifle" - loot = list(/obj/effect/mob_spawn/human/corpse/frontier/ranged, - /obj/item/gun/ballistic/rifle/illestren) casingtype = /obj/item/ammo_casing/a8_50r projectilesound = 'sound/weapons/gun/rifle/mosin.ogg' + r_hand = /obj/item/gun/ballistic/rifle/illestren /mob/living/simple_animal/hostile/human/frontier/ranged/mosin/internals icon_state = "frontiersmanrangedrifle_mask" - icon_living = "frontiersmanrangedrifle_mask" - loot = list(/obj/effect/mob_spawn/human/corpse/frontier/ranged, - /obj/item/gun/ballistic/rifle/illestren, - /obj/item/clothing/mask/breath, - /obj/item/tank/internals/emergency_oxygen/engi) atmos_requirements = IMMUNE_ATMOS_REQS minbodytemp = 0 + mob_spawner = /obj/effect/mob_spawn/human/corpse/frontier/ranged/internals /mob/living/simple_animal/hostile/human/frontier/ranged/mosin/internals/neutered - loot = list(/obj/effect/mob_spawn/human/corpse/frontier/ranged, - /obj/item/clothing/mask/breath, - /obj/item/tank/internals/emergency_oxygen/engi) + neutered = TRUE /mob/living/simple_animal/hostile/human/frontier/ranged/mosin/neutered - loot = list(/obj/effect/mob_spawn/human/corpse/frontier/ranged) + neutered = TRUE /mob/living/simple_animal/hostile/human/frontier/ranged/trooper name = "Frontiersman Doorkicker" desc = "A member of the brutal Frontiersman terrorist fleet! Bedecked in military-grade armor, they swagger their shotgun about with a boldness uncommon even among other Frontiersmen." icon_state = "frontiersmanrangedelite" - icon_living = "frontiersmanrangedelite" + maxHealth = 170 + health = 170 + shoot_point_blank = TRUE projectilesound = 'sound/weapons/gun/shotgun/shot.ogg' casingtype = /obj/item/ammo_casing/shotgun/buckshot - loot = list(/obj/effect/mob_spawn/human/corpse/frontier/ranged/trooper, - /obj/item/gun/ballistic/shotgun/brimstone) + mob_spawner = /obj/effect/mob_spawn/human/corpse/frontier/ranged/trooper + r_hand = /obj/item/gun/ballistic/shotgun/brimstone armor_base = /obj/item/clothing/suit/armor/vest/frontier /mob/living/simple_animal/hostile/human/frontier/ranged/trooper/internals icon_state = "frontiersmanrangedelite_mask" - icon_living = "frontiersmanrangedelite_mask" - loot = list(/obj/effect/mob_spawn/human/corpse/frontier/ranged/trooper, - /obj/item/gun/ballistic/shotgun/brimstone, - /obj/item/clothing/mask/gas, - /obj/item/tank/internals/emergency_oxygen/engi) + mob_spawner = /obj/effect/mob_spawn/human/corpse/frontier/ranged/trooper/internals atmos_requirements = IMMUNE_ATMOS_REQS minbodytemp = 0 /mob/living/simple_animal/hostile/human/frontier/ranged/trooper/internals/neutered - loot = list(/obj/effect/mob_spawn/human/corpse/frontier/ranged/trooper, - /obj/item/clothing/mask/gas, - /obj/item/tank/internals/emergency_oxygen/engi) + neutered = TRUE /mob/living/simple_animal/hostile/human/frontier/ranged/trooper/neutered - loot = list(/obj/effect/mob_spawn/human/corpse/frontier/ranged/trooper) + neutered = TRUE /mob/living/simple_animal/hostile/human/frontier/ranged/trooper/flame name = "Frontiersman Scorcher" desc = "An ashen revenant wades through a sea of flames, mummified under twenty pounds of blackened asbestos fabric. Mirrored lenses glare inscrutably as they swing their instrument of destruction towards you. You should probably run." icon_state = "frontiersmanflametrooper" icon_living = "frontiersmanflametrooper" - loot = list(/obj/effect/mob_spawn/human/corpse/frontier/ranged/trooper/flame, - /obj/item/flamethrower) - atmos_requirements = list("min_oxy" = 0, "max_oxy" = 0, "min_tox" = 0, "max_tox" = 0, "min_co2" = 0, "max_co2" = 0, "min_n2" = 0, "max_n2" = 0) + mob_spawner = /obj/effect/mob_spawn/human/corpse/frontier/ranged/trooper/flame + r_hand = /obj/item/flamethrower + atmos_requirements = IMMUNE_ATMOS_REQS minbodytemp = 0 maxbodytemp = 1000 @@ -176,126 +144,97 @@ ranged_cooldown = world.time + ranged_cooldown_time /mob/living/simple_animal/hostile/human/frontier/ranged/trooper/flame/neuter - loot = list(/obj/effect/mob_spawn/human/corpse/frontier/ranged/trooper/flame) + neutered = TRUE /mob/living/simple_animal/hostile/human/frontier/ranged/trooper/skm name = "Frontiersman Gunner" desc = "A member of the brutal Frontiersman terrorist fleet! This one could almost be mistaken for a real soldier by their assault rifle and armor, if it weren't for their swaggering demeanor." icon_state = "frontiersmanrangedak47" - icon_living = "frontiersmanrangedak47" projectilesound = 'sound/weapons/gun/rifle/skm.ogg' rapid = 4 rapid_fire_delay = 3 casingtype = /obj/item/ammo_casing/a762_40 - loot = list(/obj/effect/mob_spawn/human/corpse/frontier/ranged/trooper, - /obj/item/gun/ballistic/automatic/assault/skm) - armor_base = /obj/item/clothing/suit/armor/vest/frontier + r_hand = /obj/item/gun/ballistic/automatic/assault/skm /mob/living/simple_animal/hostile/human/frontier/ranged/trooper/skm/internals icon_state = "frontiersmanrangedak47_mask" - icon_living = "frontiersmanrangedak47_mask" - loot = list(/obj/effect/mob_spawn/human/corpse/frontier/ranged/trooper, - /obj/item/gun/ballistic/automatic/assault/skm, - /obj/item/clothing/mask/gas, - /obj/item/tank/internals/emergency_oxygen/engi) atmos_requirements = IMMUNE_ATMOS_REQS minbodytemp = 0 + mob_spawner = /obj/effect/mob_spawn/human/corpse/frontier/ranged/trooper/internals + r_hand = /obj/item/gun/ballistic/automatic/assault/skm /mob/living/simple_animal/hostile/human/frontier/ranged/trooper/skm/internals/neutered - loot = list(/obj/effect/mob_spawn/human/corpse/frontier/ranged/trooper, - /obj/item/clothing/mask/gas, - /obj/item/tank/internals/emergency_oxygen/engi) + neutered = TRUE /mob/living/simple_animal/hostile/human/frontier/ranged/trooper/skm/neutured - loot = list(/obj/effect/mob_spawn/human/corpse/frontier/ranged/trooper) + neutered = TRUE /mob/living/simple_animal/hostile/human/frontier/ranged/trooper/rifle name = "Frontiersman Crackshot" desc = "A member of the brutal Frontiersman terrorist fleet! Compared to their allies, they stand a little straighter, laugh a little colder. Their long rifle has a regular series of scratches on the receiver." icon_state = "frontiersmanrangedmosin" - icon_living = "frontiersmanrangedmosin" - - loot = list(/obj/effect/mob_spawn/human/corpse/frontier/ranged/trooper, - /obj/item/gun/ballistic/rifle/illestren) casingtype = /obj/item/ammo_casing/a8_50r projectilesound = 'sound/weapons/gun/rifle/mosin.ogg' - armor_base = /obj/item/clothing/suit/armor/vest/frontier + r_hand = /obj/item/gun/ballistic/rifle/illestren /mob/living/simple_animal/hostile/human/frontier/ranged/trooper/rifle/internals icon_state = "frontiersmanrangedmosin_mask" - icon_living = "frontiersmanrangedmosin_mask" - loot = list(/obj/effect/mob_spawn/human/corpse/frontier/ranged/trooper, - /obj/item/gun/ballistic/rifle/illestren, - /obj/item/clothing/mask/gas, - /obj/item/tank/internals/emergency_oxygen/engi) atmos_requirements = IMMUNE_ATMOS_REQS minbodytemp = 0 + mob_spawner = /obj/effect/mob_spawn/human/corpse/frontier/ranged/trooper/internals /mob/living/simple_animal/hostile/human/frontier/ranged/trooper/rifle/internals/neutered - loot = list(/obj/effect/mob_spawn/human/corpse/frontier/ranged/trooper, - /obj/item/clothing/mask/gas, - /obj/item/tank/internals/emergency_oxygen/engi) + neutered = TRUE /mob/living/simple_animal/hostile/human/frontier/ranged/trooper/rifle/neutered - loot = list(/obj/effect/mob_spawn/human/corpse/frontier/ranged/trooper) + neutered = TRUE /mob/living/simple_animal/hostile/human/frontier/ranged/trooper/heavy name = "Frontiersman Sweeper" desc = "Unseen behind the mirror-visor of this heavily plated hardsuit, flinty eyes dream of cruelty. A mass of chrome and photonics swings your way, the soft whine of its motor a harbinger of iridescent death." icon_state = "frontiersmanrangedminigun" - icon_living = "frontiersmanrangedminigun" projectilesound = 'sound/weapons/laser4.ogg' rapid = 6 rapid_fire_delay = 1.5 casingtype = null projectiletype = /obj/projectile/beam/weak/penetrator - loot = list(/obj/effect/mob_spawn/human/corpse/frontier/ranged/trooper/heavy) + mob_spawner = /obj/effect/mob_spawn/human/corpse/frontier/ranged/trooper/heavy armor_base = /obj/item/clothing/suit/space/hardsuit/security/independent/frontier /mob/living/simple_animal/hostile/human/frontier/ranged/trooper/heavy/internals icon_state = "frontiersmanrangedminigun_mask" - icon_living = "frontiersmanrangedminigun_mask" - loot = list(/obj/effect/mob_spawn/human/corpse/frontier/ranged/trooper/heavy, - /obj/item/clothing/mask/gas, - /obj/item/tank/internals/emergency_oxygen/engi) atmos_requirements = IMMUNE_ATMOS_REQS minbodytemp = 0 - + mob_spawner = /obj/effect/mob_spawn/human/corpse/frontier/ranged/trooper/heavy/internals /mob/living/simple_animal/hostile/human/frontier/ranged/trooper/heavy/internals/neutered - loot = list(/obj/effect/mob_spawn/human/corpse/frontier/ranged/trooper/heavy/gunless, - /obj/item/clothing/mask/gas, - /obj/item/tank/internals/emergency_oxygen/engi) + neutered = TRUE /mob/living/simple_animal/hostile/human/frontier/ranged/trooper/heavy/neutered - loot = list(/obj/effect/mob_spawn/human/corpse/frontier/ranged/trooper/heavy/gunless) + neutered = TRUE /mob/living/simple_animal/hostile/human/frontier/ranged/officer name = "Frontiersman Boss" desc = "This Frontiersman moves with what could almost pass for discipline among the infamously ragtag terrorists. They leer at their underlings, one hand resting consciously over the machine pistol at their hip." icon_state = "frontiersmanofficer" - icon_living = "frontiersmanofficer" - rapid = 4 + maxHealth = 65 + health = 65 + rapid = 6 + rapid_fire_delay = 1 + shoot_point_blank = TRUE projectilesound = 'sound/weapons/gun/pistol/mauler.ogg' casingtype = /obj/item/ammo_casing/c9mm - loot = list(/obj/effect/mob_spawn/human/corpse/frontier/ranged/officer, - /obj/item/gun/ballistic/automatic/pistol/mauler) - armor_base = /obj/item/clothing/suit/armor/frontier + mob_spawner = /obj/effect/mob_spawn/human/corpse/frontier/ranged/officer + r_hand = /obj/item/gun/ballistic/automatic/pistol/mauler /mob/living/simple_animal/hostile/human/frontier/ranged/officer/internals icon_state = "frontiersmanofficer_mask" - icon_living = "frontiersmanofficer_mask" - loot = list(/obj/effect/mob_spawn/human/corpse/frontier/ranged/officer, - /obj/item/gun/ballistic/automatic/pistol/mauler, - /obj/item/clothing/mask/gas, - /obj/item/tank/internals/emergency_oxygen/engi) atmos_requirements = IMMUNE_ATMOS_REQS minbodytemp = 0 + mob_spawner = /obj/effect/mob_spawn/human/corpse/frontier/ranged/officer/internals /mob/living/simple_animal/hostile/human/frontier/ranged/officer/internals/neutered - loot = list(/obj/effect/mob_spawn/human/corpse/frontier/ranged/officer, - /obj/item/clothing/mask/gas, - /obj/item/tank/internals/emergency_oxygen/engi) + neutered = TRUE /mob/living/simple_animal/hostile/human/frontier/ranged/officer/neutured - loot = list(/obj/effect/mob_spawn/human/corpse/frontier/ranged/officer) + neutered = TRUE diff --git a/code/modules/mob/living/simple_animal/hostile/human/human.dm b/code/modules/mob/living/simple_animal/hostile/human/human.dm index 1efe7c02b261..be8fa6b005df 100644 --- a/code/modules/mob/living/simple_animal/hostile/human/human.dm +++ b/code/modules/mob/living/simple_animal/hostile/human/human.dm @@ -33,23 +33,53 @@ unsuitable_atmos_damage = 15 minbodytemp = 180 status_flags = CANPUSH - del_on_death = TRUE footstep_type = FOOTSTEP_MOB_SHOE faction = list("hermit") + /// If we use stuff from dynamic human icon generation for loot + var/human_loot = TRUE + /// Path of the mob spawner we base the mob's visuals off of. + var/mob_spawner + /// 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 + // If we drop l and r hand loot + var/neutered = FALSE + ///Steals the armor datum from this type of armor var/obj/item/clothing/armor_base -/mob/living/simple_animal/hostile/human/Initialize() +/mob/living/simple_animal/hostile/human/Initialize(mapload) . = ..() + if(mob_spawner) + apply_dynamic_human_appearance(src, mob_spawn_path = mob_spawner, r_hand = r_hand, l_hand = l_hand) + if(ispath(r_hand,/obj/item/gun)) + var/obj/item/gun/our_gun = r_hand + spread = our_gun.spread + else if(ispath(l_hand, /obj/item/gun)) + var/obj/item/gun/our_gun = l_hand + spread = our_gun.spread + if(ispath(armor_base, /obj/item/clothing)) //sigh. if only we could get the initial() value of list vars var/obj/item/clothing/instance = new armor_base() armor = instance.armor qdel(instance) +/mob/living/simple_animal/hostile/human/drop_loot() + . = ..() + if(!human_loot) + return + if(mob_spawner) + new mob_spawner(loc) + if(r_hand && !neutered) + new r_hand(loc) + if(l_hand && !neutered) + new r_hand(loc) + /mob/living/simple_animal/hostile/human/vv_edit_var(var_name, var_value) switch(var_name) if (NAMEOF(src, armor_base)) diff --git a/code/modules/mob/living/simple_animal/hostile/human/syndicate.dm b/code/modules/mob/living/simple_animal/hostile/human/syndicate.dm index 7e0f4a8b9c2c..05b9ea0a50ca 100644 --- a/code/modules/mob/living/simple_animal/hostile/human/syndicate.dm +++ b/code/modules/mob/living/simple_animal/hostile/human/syndicate.dm @@ -13,7 +13,7 @@ speak_chance = 0 stat_attack = HARD_CRIT loot = list(/obj/effect/mob_spawn/human/corpse/syndicatesoldier, /obj/item/clothing/neck/dogtag/ramzi) - atmos_requirements = list("min_oxy" = 5, "max_oxy" = 0, "min_tox" = 0, "max_tox" = 1, "min_co2" = 0, "max_co2" = 5, "min_n2" = 0, "max_n2" = 0) + atmos_requirements = NORMAL_ATMOS_REQS maxbodytemp = 400 unsuitable_atmos_damage = 15 faction = list(FACTION_ANTAG_SYNDICATE) diff --git a/code/modules/mob/living/simple_animal/hostile/mining_mobs/basilisk.dm b/code/modules/mob/living/simple_animal/hostile/mining_mobs/basilisk.dm index ca1e4bd0b77b..730522ccfb1a 100644 --- a/code/modules/mob/living/simple_animal/hostile/mining_mobs/basilisk.dm +++ b/code/modules/mob/living/simple_animal/hostile/mining_mobs/basilisk.dm @@ -18,8 +18,8 @@ throw_message = "does nothing against the hard shell of" vision_range = 2 speed = 3 - maxHealth = 175 - health = 175 + maxHealth = 90 + health = 90 harm_intent_damage = 5 obj_damage = 60 melee_damage_lower = 7 diff --git a/code/modules/mob/living/simple_animal/hostile/mining_mobs/hivelord.dm b/code/modules/mob/living/simple_animal/hostile/mining_mobs/hivelord.dm index 601c87498b61..e8e7080a07e8 100644 --- a/code/modules/mob/living/simple_animal/hostile/mining_mobs/hivelord.dm +++ b/code/modules/mob/living/simple_animal/hostile/mining_mobs/hivelord.dm @@ -152,8 +152,8 @@ icon_aggro = "dwarf_legion" icon_dead = "dwarf_legion" //mob_trophy = /obj/item/mob_trophy/dwarf_skull - maxHealth = 150 - health = 150 + maxHealth = 75 + health = 75 move_to_delay = 2 speed = 1 //much faster! dwarf_mob = TRUE diff --git a/code/modules/mob/living/simple_animal/hostile/retaliate/clown.dm b/code/modules/mob/living/simple_animal/hostile/retaliate/clown.dm deleted file mode 100644 index 220f4dab979f..000000000000 --- a/code/modules/mob/living/simple_animal/hostile/retaliate/clown.dm +++ /dev/null @@ -1,310 +0,0 @@ -/mob/living/simple_animal/hostile/retaliate/clown - name = "Clown" - desc = "A denizen of clown planet." - icon = 'icons/mob/clown_mobs.dmi' - icon_state = "clown" - icon_living = "clown" - icon_dead = "clown_dead" - icon_gib = "clown_gib" - health_doll_icon = "clown" //if >32x32, it will use this generic. for all the huge clown mobs that subtype from this - mob_biotypes = MOB_ORGANIC|MOB_HUMANOID - turns_per_move = 5 - response_disarm_continuous = "gently pushes aside" - response_disarm_simple = "gently push aside" - response_harm_continuous = "robusts" - response_harm_simple = "robust" - speak = list("HONK", "Honk!", "Welcome to clown planet!") - emote_see = list("honks", "squeaks") - speak_chance = 1 - a_intent = INTENT_HARM - maxHealth = 75 - health = 75 - speed = 1 - harm_intent_damage = 8 - melee_damage_lower = 10 - melee_damage_upper = 10 - attack_sound = 'sound/items/bikehorn.ogg' - obj_damage = 0 - environment_smash = ENVIRONMENT_SMASH_NONE - del_on_death = 1 - loot = list(/obj/effect/mob_spawn/human/clown/corpse) - - minbodytemp = 270 - maxbodytemp = 370 - unsuitable_atmos_damage = 10 - footstep_type = FOOTSTEP_MOB_SHOE - var/banana_time = 0 // If there's no time set it won't spawn. - var/banana_type = /obj/item/grown/bananapeel - var/attack_reagent - -/mob/living/simple_animal/hostile/retaliate/clown/handle_temperature_damage() - if(bodytemperature < minbodytemp) - adjustBruteLoss(10) - throw_alert("temp", /atom/movable/screen/alert/cold, 2) - else if(bodytemperature > maxbodytemp) - adjustBruteLoss(15) - throw_alert("temp", /atom/movable/screen/alert/hot, 3) - else - clear_alert("temp") - -/mob/living/simple_animal/hostile/retaliate/clown/attack_hand(mob/living/carbon/human/M) - ..() - playsound(src.loc, 'sound/items/bikehorn.ogg', 50, TRUE) - -/mob/living/simple_animal/hostile/retaliate/clown/Life() - . = ..() - if(banana_time && banana_time < world.time) - var/turf/T = get_turf(src) - var/list/adjacent = T.get_atmos_adjacent_turfs() - new banana_type(pick(adjacent)) - banana_time = world.time + rand(30,60) - -/mob/living/simple_animal/hostile/retaliate/clown/AttackingTarget() - . = ..() - if(attack_reagent && . && isliving(target)) - var/mob/living/L = target - if(L.reagents) - L.reagents.add_reagent(attack_reagent, rand(1,5)) - -/mob/living/simple_animal/hostile/retaliate/clown/lube - name = "Living Lube" - desc = "A puddle of lube brought to life by the honkmother." - icon_state = "lube" - icon_living = "lube" - turns_per_move = 1 - response_help_continuous = "dips a finger into" - response_help_simple = "dip a finger into" - response_disarm_continuous = "gently scoops and pours aside" - response_disarm_simple = "gently scoop and pour aside" - emote_see = list("bubbles", "oozes") - loot = list(/obj/item/clothing/mask/gas/clown_hat, /obj/effect/particle_effect/foam) - -/mob/living/simple_animal/hostile/retaliate/clown/lube/Initialize() - . = ..() - AddElement(/datum/element/snailcrawl) - -/mob/living/simple_animal/hostile/retaliate/clown/banana - name = "Clownana" - desc = "A fusion of clown and banana DNA birthed from a botany experiment gone wrong." - icon_state = "banana tree" - icon_living = "banana tree" - response_disarm_continuous = "peels" - response_disarm_simple = "peel" - response_harm_continuous = "peels" - response_harm_simple = "peel" - turns_per_move = 1 - speak = list("HONK", "Honk!", "YA-HONK!!!") - emote_see = list("honks", "bites into the banana", "plucks a banana off its head", "photosynthesizes") - maxHealth = 120 - health = 120 - speed = -10 - loot = list(/obj/item/clothing/mask/gas/clown_hat, /obj/effect/gibspawner/human, /obj/item/soap, /obj/item/seeds/banana) - banana_time = 20 - -/mob/living/simple_animal/hostile/retaliate/clown/honkling - name = "Honkling" - desc = "A divine being sent by the Honkmother to spread joy. It's not dangerous, but it's a bit of a nuisance." - icon_state = "honkling" - icon_living = "honkling" - turns_per_move = 1 - speed = -10 - harm_intent_damage = 1 - melee_damage_lower = 1 - melee_damage_upper = 1 - attack_verb_continuous = "cheers up" - attack_verb_simple = "cheer up" - loot = list(/obj/item/clothing/mask/gas/clown_hat, /obj/effect/gibspawner/human, /obj/item/soap, /obj/item/seeds/banana/bluespace) - banana_type = /obj/item/grown/bananapeel - attack_reagent = /datum/reagent/consumable/laughter - -/mob/living/simple_animal/hostile/retaliate/clown/fleshclown - name = "Fleshclown" - desc = "A being forged out of the pure essence of pranking, cursed into existence by a cruel maker." - icon_state = "fleshclown" - icon_living = "fleshclown" - response_help_continuous = "reluctantly pokes" - response_help_simple = "reluctantly poke" - response_disarm_continuous = "sinks his hands into the spongy flesh of" - response_disarm_simple = "sink your hands into the spongy flesh of" - response_harm_continuous = "cleanses the world of" - response_harm_simple = "cleanse the world of" - speak = list("HONK", "Honk!", "I didn't ask for this", "I feel constant and horrible pain", "YA-HONK!!!", "this body is a merciless and unforgiving prison", "I was born out of mirthful pranking but I live in suffering") - emote_see = list("honks", "sweats", "jiggles", "contemplates its existence") - speak_chance = 5 - dextrous = TRUE - ventcrawler = VENTCRAWLER_ALWAYS - maxHealth = 140 - health = 140 - speed = -5 - melee_damage_upper = 15 - attack_verb_continuous = "limply slaps" - attack_verb_simple = "limply slap" - obj_damage = 5 - loot = list(/obj/item/clothing/suit/hooded/bloated_human, /obj/item/clothing/mask/gas/clown_hat, /obj/effect/gibspawner/human, /obj/item/soap) - -/mob/living/simple_animal/hostile/retaliate/clown/longface - name = "Longface" - desc = "Often found walking into the bar." - icon_state = "long face" - icon_living = "long face" - move_resist = INFINITY - turns_per_move = 10 - response_help_continuous = "tries to awkwardly hug" - response_help_simple = "try to awkwardly hug" - response_disarm_continuous = "pushes the unwieldy frame of" - response_disarm_simple = "push the unwieldy frame of" - response_harm_continuous = "tries to shut up" - response_harm_simple = "try to shut up" - speak = list("YA-HONK!!!") - emote_see = list("honks", "squeaks") - speak_chance = 60 - maxHealth = 150 - health = 150 - pixel_x = -16 - base_pixel_x = -16 - speed = 10 - harm_intent_damage = 5 - melee_damage_lower = 5 - attack_verb_continuous = "YA-HONKs" - attack_verb_simple = "YA-HONK" - loot = list(/obj/item/clothing/mask/gas/clown_hat, /obj/effect/gibspawner/human, /obj/item/soap) - -/mob/living/simple_animal/hostile/retaliate/clown/clownhulk - name = "Honk Hulk" - desc = "A cruel and fearsome clown. Don't make him angry." - icon_state = "honkhulk" - icon_living = "honkhulk" - move_resist = INFINITY - response_help_continuous = "tries desperately to appease" - response_help_simple = "try desperately to appease" - response_disarm_continuous = "foolishly pushes" - response_disarm_simple = "foolishly push" - response_harm_continuous = "angers" - response_harm_simple = "anger" - speak = list("HONK", "Honk!", "HAUAUANK!!!", "GUUURRRRAAAHHH!!!") - emote_see = list("honks", "sweats", "grunts") - speak_chance = 5 - maxHealth = 400 - health = 400 - pixel_x = -16 - base_pixel_x = -16 - speed = 2 - harm_intent_damage = 15 - melee_damage_lower = 15 - melee_damage_upper = 20 - attack_verb_continuous = "pummels" - attack_verb_simple = "pummel" - obj_damage = 30 - environment_smash = ENVIRONMENT_SMASH_WALLS - loot = list(/obj/item/clothing/mask/gas/clown_hat, /obj/effect/gibspawner/human, /obj/item/soap) - -/mob/living/simple_animal/hostile/retaliate/clown/clownhulk/chlown - name = "Chlown" - desc = "A real lunkhead who somehow gets all the girls." - icon_state = "chlown" - icon_living = "chlown" - response_help_continuous = "submits to" - response_help_simple = "submit to" - response_disarm_continuous = "tries to assert dominance over" - response_disarm_simple = "try to assert dominance over" - response_harm_continuous = "makes a weak beta attack at" - response_harm_simple = "make a weak beta attack at" - speak = list("HONK", "Honk!", "Bruh", "cheeaaaahhh?") - emote_see = list("asserts his dominance", "emasculates everyone implicitly") - maxHealth = 500 - health = 500 - speed = -2 - armour_penetration = 20 - attack_verb_continuous = "steals the girlfriend of" - attack_verb_simple = "steal the girlfriend of" - attack_sound = 'sound/items/airhorn2.ogg' - loot = list(/obj/item/clothing/mask/gas/clown_hat, /obj/effect/gibspawner/human, /obj/effect/particle_effect/foam, /obj/item/soap) - -/mob/living/simple_animal/hostile/retaliate/clown/clownhulk/honcmunculus - name = "Honkmunculus" - desc = "A slender wiry figure of alchemical origin." - icon_state = "honkmunculus" - icon_living = "honkmunculus" - response_help_continuous = "skeptically pokes" - response_help_simple = "skeptically poke" - response_disarm_continuous = "pushes the unwieldy frame of" - response_disarm_simple = "push the unwieldy frame of" - speak = list("honk") - emote_see = list("squirms", "writhes") - speak_chance = 1 - maxHealth = 200 - health = 200 - speed = -5 - harm_intent_damage = 5 - melee_damage_lower = 5 - melee_damage_upper = 10 - attack_verb_continuous = "ferociously mauls" - attack_verb_simple = "ferociously maul" - environment_smash = ENVIRONMENT_SMASH_NONE - loot = list(/obj/item/clothing/mask/gas/clown_hat, /obj/effect/gibspawner/xeno/bodypartless, /obj/effect/particle_effect/foam, /obj/item/soap) - attack_reagent = /datum/reagent/peaceborg/confuse - -/mob/living/simple_animal/hostile/retaliate/clown/clownhulk/destroyer - name = "The Destroyer" - desc = "An ancient being born of arcane honking." - icon_state = "destroyer" - icon_living = "destroyer" - response_disarm_continuous = "bounces off of" - response_harm_continuous = "bounces off of" - speak = list("HONK!!!", "The Honkmother is merciful, so I must act out her wrath.", "parce mihi ad beatus honkmother placet mihi ut peccata committere,", "DIE!!!") - maxHealth = 400 - health = 400 - speed = 5 - harm_intent_damage = 30 - melee_damage_lower = 20 - melee_damage_upper = 40 - armour_penetration = 30 - stat_attack = HARD_CRIT - attack_verb_continuous = "acts out divine vengeance on" - attack_verb_simple = "act out divine vengeance on" - obj_damage = 50 - environment_smash = ENVIRONMENT_SMASH_RWALLS - loot = list(/obj/item/clothing/mask/gas/clown_hat, /obj/effect/gibspawner/human, /obj/effect/particle_effect/foam, /obj/item/soap) - -/mob/living/simple_animal/hostile/retaliate/clown/mutant - name = "Unknown" - desc = "Kill it for its own sake." - icon_state = "mutant" - icon_living = "mutant" - move_resist = INFINITY - turns_per_move = 10 - response_help_continuous = "reluctantly sinks a finger into" - response_help_simple = "reluctantly sink a finger into" - response_disarm_continuous = "squishes into" - response_disarm_simple = "squish into" - response_harm_continuous = "squishes into" - response_harm_simple = "squish into" - speak = list("aaaaaahhhhuuhhhuhhhaaaaa", "AAAaaauuuaaAAAaauuhhh", "huuuuuh... hhhhuuuooooonnnnkk", "HuaUAAAnKKKK") - emote_see = list("squirms", "writhes", "pulsates", "froths", "oozes") - speak_chance = 10 - maxHealth = 130 - health = 130 - pixel_x = -16 - base_pixel_x = -16 - speed = -5 - harm_intent_damage = 10 - melee_damage_lower = 10 - melee_damage_upper = 20 - attack_verb_continuous = "awkwardly flails at" - attack_verb_simple = "awkwardly flail at" - loot = list(/obj/item/clothing/mask/gas/clown_hat, /obj/effect/gibspawner/xeno/bodypartless, /obj/item/soap, /obj/effect/gibspawner/generic, /obj/effect/gibspawner/generic/animal, /obj/effect/gibspawner/human/bodypartless, /obj/effect/gibspawner/human) - -/mob/living/simple_animal/hostile/retaliate/clown/mutant/blob - name = "Something that was once a clown" - desc = "A grotesque bulging figure far mutated from it's original state." - icon_state = "blob" - icon_living = "blob" - speak = list("hey, buddy", "HONK!!!", "H-h-h-H-HOOOOONK!!!!", "HONKHONKHONK!!!", "HEY, BUCKO, GET BACK HERE!!!", "HOOOOOOOONK!!!") - emote_see = list("jiggles", "wobbles") - health = 130 - mob_size = MOB_SIZE_LARGE - speed = 20 - attack_verb_continuous = "bounces off of" - attack_verb_simple = "bounce off of" - loot = list(/obj/item/clothing/mask/gas/clown_hat, /obj/effect/gibspawner/xeno/bodypartless, /obj/effect/particle_effect/foam, /obj/item/soap, /obj/effect/gibspawner/generic, /obj/effect/gibspawner/generic/animal, /obj/effect/gibspawner/human/bodypartless, /obj/effect/gibspawner/human) - attack_reagent = /datum/reagent/toxin/mindbreaker diff --git a/code/modules/paperwork/stamps.dm b/code/modules/paperwork/stamps.dm index 46fd25ac685d..87ee5155f32c 100644 --- a/code/modules/paperwork/stamps.dm +++ b/code/modules/paperwork/stamps.dm @@ -26,19 +26,14 @@ icon_state = "stamp-qm" dye_color = DYE_QM -/obj/item/stamp/law - name = "law office's rubber stamp" - icon_state = "stamp-law" - dye_color = DYE_LAW - /obj/item/stamp/captain name = "captain's rubber stamp" icon_state = "stamp-cap" dye_color = DYE_CAPTAIN -/obj/item/stamp/head_of_personnel - name = "head of personnel's rubber stamp" - icon_state = "stamp-hop" +/obj/item/stamp/officer + name = "first officer's rubber stamp" + icon_state = "stamp-fo" dye_color = DYE_FO /obj/item/stamp/hos @@ -66,17 +61,7 @@ icon_state = "stamp-deny" dye_color = DYE_REDCOAT -/obj/item/stamp/clown - name = "clown's rubber stamp" - icon_state = "stamp-clown" - dye_color = DYE_CLOWN - -/obj/item/stamp/mime - name = "mime's rubber stamp" - icon_state = "stamp-mime" - dye_color = DYE_MIME - -/obj/item/stamp/chap +/obj/item/stamp/roumain name = "chaplain's rubber stamp" icon_state = "stamp-chap" dye_color = DYE_CHAP diff --git a/code/modules/projectiles/ammunition/ballistic/revolver.dm b/code/modules/projectiles/ammunition/ballistic/revolver.dm index 60c3722b934a..3f9f1cc5e920 100644 --- a/code/modules/projectiles/ammunition/ballistic/revolver.dm +++ b/code/modules/projectiles/ammunition/ballistic/revolver.dm @@ -28,7 +28,7 @@ caliber = ".45-70" icon_state = "magnum-brass" projectile_type = /obj/projectile/bullet/a4570 - stack_size = 5 + stack_size = 6 /obj/item/ammo_casing/a4570/match name = ".45-70 match bullet casing" diff --git a/code/modules/projectiles/ammunition/energy/laser.dm b/code/modules/projectiles/ammunition/energy/laser.dm index eb08fe0f8d23..9f9fb17d09c9 100644 --- a/code/modules/projectiles/ammunition/energy/laser.dm +++ b/code/modules/projectiles/ammunition/energy/laser.dm @@ -2,6 +2,10 @@ projectile_type = /obj/projectile/beam/laser select_name = "kill" +/obj/item/ammo_casing/energy/laser/sharplite + projectile_type = /obj/projectile/beam/laser/sharplite + select_name = "kill" + /obj/item/ammo_casing/energy/laser/underbarrel projectile_type = /obj/projectile/beam/laser e_cost = 1250 @@ -25,6 +29,12 @@ delay = 2 e_cost = 666 //30 per upgraded cell +/obj/item/ammo_casing/energy/laser/assault/sharplite + projectile_type = /obj/projectile/beam/laser/assault/sharplite + fire_sound = 'sound/weapons/gun/laser/e40_las.ogg' + delay = 2 + e_cost = 666 //30 per upgraded cell + /obj/item/ammo_casing/energy/laser/eoehoma/e50 projectile_type = /obj/projectile/beam/emitter/hitscan fire_sound = 'sound/weapons/gun/laser/heavy_laser.ogg' @@ -36,6 +46,11 @@ e_cost = 830 select_name = "kill" +/obj/item/ammo_casing/energy/lasergun/sharplite + projectile_type = /obj/projectile/beam/laser/sharplite + e_cost = 830 + select_name = "kill" + /obj/item/ammo_casing/energy/lasergun/eoehoma projectile_type = /obj/projectile/beam/laser/eoehoma fire_sound = 'sound/weapons/gun/laser/e-fire.ogg' @@ -46,12 +61,18 @@ select_name = "kill" delay = 0.13 SECONDS +/obj/item/ammo_casing/energy/laser/sharplite/smg + projectile_type = /obj/projectile/beam/weak/sharplite + e_cost = 799 //12 shots with a normal power cell, 25 with an upgraded + select_name = "kill" + delay = 0.13 SECONDS + /obj/item/ammo_casing/energy/lasergun/old projectile_type = /obj/projectile/beam/laser e_cost = 2000 select_name = "kill" -/obj/item/ammo_casing/energy/laser/hos +/obj/item/ammo_casing/energy/laser/sharplite/hos e_cost = 1200 /obj/item/ammo_casing/energy/laser/practice @@ -59,6 +80,11 @@ select_name = "practice" harmful = FALSE +/obj/item/ammo_casing/energy/laser/practice/sharplite + projectile_type = /obj/projectile/beam/practice/sharplite + select_name = "practice" + harmful = FALSE + /obj/item/ammo_casing/energy/laser/scatter projectile_type = /obj/projectile/beam/scatter pellets = 10 diff --git a/code/modules/projectiles/ammunition/energy/stun.dm b/code/modules/projectiles/ammunition/energy/stun.dm index 658a1b41affe..41119357686c 100644 --- a/code/modules/projectiles/ammunition/energy/stun.dm +++ b/code/modules/projectiles/ammunition/energy/stun.dm @@ -25,10 +25,17 @@ fire_sound = 'sound/weapons/taser2.ogg' harmful = FALSE +/obj/item/ammo_casing/energy/disabler/sharplite + projectile_type = /obj/projectile/beam/disabler/sharplite + select_name = "disable" + e_cost = 500 + fire_sound = 'sound/weapons/taser2.ogg' + harmful = FALSE + /obj/item/ammo_casing/energy/disabler/underbarrel e_cost = 625 -/obj/item/ammo_casing/energy/disabler/hos +/obj/item/ammo_casing/energy/disabler/sharplite/hos e_cost = 600 /obj/item/ammo_casing/energy/disabler/scatter //WS edit, scatter repathing @@ -50,3 +57,8 @@ projectile_type = /obj/projectile/beam/disabler/weak/negative_ap e_cost = 330 delay = 0.13 SECONDS + +/obj/item/ammo_casing/energy/disabler/sharplite/smg + projectile_type = /obj/projectile/beam/disabler/weak/negative_ap/sharplite + e_cost = 330 + delay = 0.13 SECONDS diff --git a/code/modules/projectiles/guns/energy/energy_gun.dm b/code/modules/projectiles/guns/energy/energy_gun.dm index 0e7af1fcb26d..6650fe308ae5 100644 --- a/code/modules/projectiles/guns/energy/energy_gun.dm +++ b/code/modules/projectiles/guns/energy/energy_gun.dm @@ -7,7 +7,7 @@ mob_overlay_icon = 'icons/obj/guns/manufacturer/nanotrasen_sharplite/onmob.dmi' icon_state = "energy" item_state = null //so the human update icon uses the icon_state instead. - ammo_type = list(/obj/item/ammo_casing/energy/disabler, /obj/item/ammo_casing/energy/laser) + ammo_type = list(/obj/item/ammo_casing/energy/disabler/sharplite, /obj/item/ammo_casing/energy/laser/sharplite) modifystate = TRUE ammo_x_offset = 2 dual_wield_spread = 60 @@ -46,7 +46,7 @@ icon_state = "energytac" ammo_x_offset = 2 charge_sections = 5 - ammo_type = list(/obj/item/ammo_casing/energy/laser/assault, /obj/item/ammo_casing/energy/disabler) + ammo_type = list(/obj/item/ammo_casing/energy/laser/assault/sharplite, /obj/item/ammo_casing/energy/disabler/sharplite) default_ammo_type = /obj/item/stock_parts/cell/gun/upgraded weapon_weight = WEAPON_MEDIUM @@ -67,7 +67,7 @@ desc = "NT-P:01 Prototype Energy Gun. Early stage development of a unique laser rifle that has a multifaceted energy lens, allowing the gun to alter the form of projectile it fires on command. The project was a dud, and Nanotrasen later acquired Sharplite to suit its laser weapon needs." icon_state = "protolaser" ammo_x_offset = 2 - ammo_type = list(/obj/item/ammo_casing/energy/laser, /obj/item/ammo_casing/energy/electrode/old) + ammo_type = list(/obj/item/ammo_casing/energy/laser/sharplite, /obj/item/ammo_casing/energy/electrode/old) manufacturer = MANUFACTURER_NANOTRASEN_OLD /obj/item/gun/energy/e_gun/hos @@ -76,7 +76,7 @@ default_ammo_type = /obj/item/stock_parts/cell/gun/upgraded icon_state = "hoslaser" force = 10 - ammo_type = list(/obj/item/ammo_casing/energy/disabler/hos, /obj/item/ammo_casing/energy/laser/hos, /obj/item/ammo_casing/energy/ion/hos, /obj/item/ammo_casing/energy/electrode/hos) + ammo_type = list(/obj/item/ammo_casing/energy/disabler/sharplite/hos, /obj/item/ammo_casing/energy/laser/sharplite/hos, /obj/item/ammo_casing/energy/ion/hos, /obj/item/ammo_casing/energy/electrode/hos) shaded_charge = TRUE resistance_flags = INDESTRUCTIBLE | LAVA_PROOF | FIRE_PROOF | ACID_PROOF manufacturer = MANUFACTURER_SHARPLITE_NEW @@ -218,7 +218,7 @@ icon_state = "bsgun" item_state = "gun" force = 7 - ammo_type = list(/obj/item/ammo_casing/energy/disabler/hos, /obj/item/ammo_casing/energy/laser/hos, /obj/item/ammo_casing/energy/trap) + ammo_type = list(/obj/item/ammo_casing/energy/disabler/sharplite/hos, /obj/item/ammo_casing/energy/laser/sharplite/hos, /obj/item/ammo_casing/energy/trap) ammo_x_offset = 1 shaded_charge = TRUE @@ -226,7 +226,7 @@ name = "\improper E-TAR SMG" desc = "A dual-mode energy gun capable of discharging weaker shots at a much faster rate than the standard energy gun." icon_state = "esmg" - ammo_type = list(/obj/item/ammo_casing/energy/disabler/smg, /obj/item/ammo_casing/energy/laser/smg) + ammo_type = list(/obj/item/ammo_casing/energy/disabler/sharplite/smg, /obj/item/ammo_casing/energy/laser/sharplite/smg) ammo_x_offset = 2 charge_sections = 3 weapon_weight = WEAPON_LIGHT diff --git a/code/modules/projectiles/guns/energy/laser.dm b/code/modules/projectiles/guns/energy/laser.dm index 1da484f5de96..a38cb8e1818c 100644 --- a/code/modules/projectiles/guns/energy/laser.dm +++ b/code/modules/projectiles/guns/energy/laser.dm @@ -6,7 +6,7 @@ item_state = "laser" w_class = WEIGHT_CLASS_NORMAL custom_materials = list(/datum/material/iron=2000) - ammo_type = list(/obj/item/ammo_casing/energy/lasergun) + ammo_type = list(/obj/item/ammo_casing/energy/lasergun/sharplite) ammo_x_offset = 1 shaded_charge = TRUE supports_variations = VOX_VARIATION @@ -21,7 +21,7 @@ /obj/item/gun/energy/laser/practice name = "practice laser gun" desc = "A modified version of the L-204 laser gun, this one fires less concentrated energy bolts designed for target practice." - ammo_type = list(/obj/item/ammo_casing/energy/laser/practice) + ammo_type = list(/obj/item/ammo_casing/energy/laser/practice/sharplite) item_flags = NONE /obj/item/gun/energy/laser/retro diff --git a/code/modules/projectiles/projectile/beams.dm b/code/modules/projectiles/projectile/beams.dm index 9faee78eeb06..32967d34d158 100644 --- a/code/modules/projectiles/projectile/beams.dm +++ b/code/modules/projectiles/projectile/beams.dm @@ -40,7 +40,7 @@ impact_type = /obj/effect/projectile/impact/laser /obj/projectile/beam/laser/sharplite - speed = 0.4 + speed = 0.25 /obj/projectile/beam/laser/light damage = 15 @@ -57,6 +57,12 @@ damage = 25 armour_penetration = 20 +/obj/projectile/beam/laser/assault/sharplite + icon_state = "heavylaser" + damage = 25 + armour_penetration = 20 + speed = 0.25 + /obj/projectile/beam/laser/heavylaser name = "heavy laser" icon_state = "heavylaser" @@ -82,6 +88,10 @@ /obj/projectile/beam/weak damage = 15 +/obj/projectile/beam/weak/sharplite + damage = 15 + speed = 0.25 + /obj/projectile/beam/weaker damage = 10 @@ -105,6 +115,12 @@ damage = 0 nodamage = TRUE +/obj/projectile/beam/practice/sharplite + name = "practice laser" + damage = 0 + nodamage = TRUE + speed = 0.25 + /obj/projectile/beam/laser/slug name = "laser slug" icon_state = "heavylaser" @@ -148,7 +164,7 @@ impact_type = /obj/effect/projectile/impact/disabler /obj/projectile/beam/disabler/sharplite - speed = 0.4 + speed = 0.25 /obj/projectile/beam/disabler/weak damage = 15 @@ -160,6 +176,11 @@ armour_penetration = -30 range = 9 +/obj/projectile/beam/disabler/weak/negative_ap/sharplite + armour_penetration = -30 + range = 9 + speed = 0.25 + /obj/projectile/beam/disabler/weak/negative_ap/low_range range = 6 diff --git a/code/modules/unit_tests/create_and_destroy.dm b/code/modules/unit_tests/create_and_destroy.dm index 0e1d850a696f..55d2a99bfdbc 100644 --- a/code/modules/unit_tests/create_and_destroy.dm +++ b/code/modules/unit_tests/create_and_destroy.dm @@ -110,6 +110,7 @@ var/original_baseturfs = islist(spawn_at.baseturfs) ? spawn_at.baseturfs.Copy() : spawn_at.baseturfs var/original_baseturf_count = length(original_baseturfs) + GLOB.running_create_and_destroy = TRUE for(var/type_path in typesof(/atom/movable, /turf) - ignore) //No areas please if(ispath(type_path, /turf)) spawn_at.ChangeTurf(type_path) @@ -212,6 +213,7 @@ if(fails & BAD_INIT_SLEPT) TEST_FAIL("[path] slept during Initialize()") + GLOB.running_create_and_destroy = FALSE SSticker.delay_end = FALSE //This shouldn't be needed, but let's be polite SSgarbage.collection_timeout[GC_QUEUE_CHECK] = GC_CHECK_QUEUE diff --git a/code/modules/uplink/uplink_items.dm b/code/modules/uplink/uplink_items.dm index 91c96289c6d9..e8fd6371356c 100644 --- a/code/modules/uplink/uplink_items.dm +++ b/code/modules/uplink/uplink_items.dm @@ -963,18 +963,6 @@ GLOBAL_LIST_INIT(uplink_items, subtypesof(/datum/uplink_item)) cost = 4 // cant_discount = TRUE -/datum/uplink_item/explosives/clown_bomb_clownops - name = "Clown Bomb" - desc = "The Clown bomb is a hilarious device capable of massive pranks. It has an adjustable timer, \ - with a minimum of 60 seconds, and can be bolted to the floor with a wrench to prevent \ - movement. The bomb is bulky and cannot be moved; upon ordering this item, a smaller beacon will be \ - transported to you that will teleport the actual bomb to it upon activation. Note that this bomb can \ - be defused, and some crew may attempt to do so." - item = /obj/item/sbeacondrop/clownbomb - cost = 15 - surplus = 0 - include_modes = list(/datum/game_mode/nuclear/clown_ops) - /datum/uplink_item/explosives/detomatix name = "Detomatix PDA Cartridge" desc = "When inserted into a personal digital assistant, this cartridge gives you four opportunities to \ @@ -1705,17 +1693,6 @@ GLOBAL_LIST_INIT(uplink_items, subtypesof(/datum/uplink_item)) restricted_roles = list("Medical Doctor", "Chief Medical Officer", "Roboticist") cost = 5 -/datum/uplink_item/role_restricted/clown_bomb - name = "Clown Bomb" - desc = "The Clown bomb is a hilarious device capable of massive pranks. It has an adjustable timer, \ - with a minimum of 60 seconds, and can be bolted to the floor with a wrench to prevent \ - movement. The bomb is bulky and cannot be moved; upon ordering this item, a smaller beacon will be \ - transported to you that will teleport the actual bomb to it upon activation. Note that this bomb can \ - be defused, and some crew may attempt to do so." - item = /obj/item/sbeacondrop/clownbomb - cost = 15 - restricted_roles = list("Clown") - /datum/uplink_item/role_restricted/clumsinessinjector //clown ops can buy this too, but it's in the pointless badassery section for them name = "Clumsiness Injector" desc = "Inject yourself with this to become as clumsy as a clown... or inject someone ELSE with it to make THEM as clumsy as a clown. Useful for clowns who wish to reconnect with their former clownish nature or for clowns who wish to torment and play with their prey before killing them." diff --git a/code/modules/vending/wardrobes.dm b/code/modules/vending/wardrobes.dm index ac4286799eb6..be056a1d242c 100644 --- a/code/modules/vending/wardrobes.dm +++ b/code/modules/vending/wardrobes.dm @@ -284,7 +284,7 @@ /obj/item/clothing/head/beret/service = 2, /obj/item/clothing/accessory/waistcoat = 2, /obj/item/clothing/suit/apron/chef = 3, - /obj/item/clothing/head/soft/mime = 2, + /obj/item/clothing/head/soft = 2, /obj/item/storage/box/mousetraps = 2, /obj/item/circuitboard/machine/dish_drive = 1, /obj/item/clothing/suit/toggle/chef = 1, diff --git a/html/changelogs/AutoChangeLog-pr-4092.yml b/html/changelogs/AutoChangeLog-pr-4092.yml new file mode 100644 index 000000000000..976c2bbd11dd --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-4092.yml @@ -0,0 +1,4 @@ +author: zimon9 +changes: + - {balance: increased the projectile speed of sharplite weaponry} +delete-after: true diff --git a/html/changelogs/AutoChangeLog-pr-4111.yml b/html/changelogs/AutoChangeLog-pr-4111.yml new file mode 100644 index 000000000000..5226e807c6d5 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-4111.yml @@ -0,0 +1,4 @@ +author: Jedi-Toothpaste +changes: + - {rscadd: allows you to reskin ammo cans} +delete-after: true diff --git a/html/changelogs/AutoChangeLog-pr-4112.yml b/html/changelogs/AutoChangeLog-pr-4112.yml new file mode 100644 index 000000000000..502e746b919f --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-4112.yml @@ -0,0 +1,4 @@ +author: firebudgy +changes: + - {balance: Space Basilisks and Dwarf Legions are decently weaker.} +delete-after: true diff --git a/html/changelogs/AutoChangeLog-pr-4129.yml b/html/changelogs/AutoChangeLog-pr-4129.yml deleted file mode 100644 index 6d1f8506fa8c..000000000000 --- a/html/changelogs/AutoChangeLog-pr-4129.yml +++ /dev/null @@ -1,5 +0,0 @@ -author: Ratvarr -changes: - - {bugfix: 'Floral shirts no longer take six whole seconds to put on, because that - is completely insane.'} -delete-after: true diff --git a/html/changelogs/AutoChangeLog-pr-4131.yml b/html/changelogs/AutoChangeLog-pr-4131.yml new file mode 100644 index 000000000000..49f510fcd15b --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-4131.yml @@ -0,0 +1,4 @@ +author: Erikafox +changes: + - {bugfix: 'CLIP bowman sprites, PGF bowman sound protection.'} +delete-after: true diff --git a/html/changelogs/AutoChangeLog-pr-4142.yml b/html/changelogs/AutoChangeLog-pr-4142.yml new file mode 100644 index 000000000000..a9344fb59ea2 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-4142.yml @@ -0,0 +1,4 @@ +author: firebudgy +changes: + - {bugfix: Extra cargo listing} +delete-after: true diff --git a/html/changelogs/AutoChangeLog-pr-4143.yml b/html/changelogs/AutoChangeLog-pr-4143.yml new file mode 100644 index 000000000000..b25b677a12b9 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-4143.yml @@ -0,0 +1,6 @@ +author: Erikafox +changes: + - {rscadd: dynamic simplemobs now add their spread to bullets.} + - {balance: frontiersmen officers now shoot faster and shoot more} + - {balance: frontiersmen shotgunners shoot pb. we cqc in this bitch.} +delete-after: true diff --git a/html/changelogs/archive/2025-02.yml b/html/changelogs/archive/2025-02.yml index 8e066366907b..c7dad0b48006 100644 --- a/html/changelogs/archive/2025-02.yml +++ b/html/changelogs/archive/2025-02.yml @@ -14,3 +14,37 @@ 2025-02-03: Apogee-dev: - rscadd: Model 23 Woodsman hunting rifle +2025-02-04: + Ratvarr: + - bugfix: Floral shirts no longer take six whole seconds to put on, because that + is completely insane. +2025-02-06: + Sadhorizon: + - bugfix: Captain's stamp no longer talks about stations. + - tweak: Replaced HOP's stamp with FO's stamp. + - code_imp: Repathed chaplain's stamp into roumain stamp - no other changes though. + - rscdel: Removed law, clown and mime stamps. +2025-02-07: + Erikafox: + - bugfix: indie space is no longer missing numbers on the 56x40 hangar + FalloutFalcon, Fikou, a hood by Viro: + - refactor: Humanoid mobs automatically generate their sprites, they no longer will + be outdated. + - refactor: Ports some tg overlay improvments. + Moffball, MemeSnorfer, and Erikafox: + - rscadd: Colorable Windbreakers! + - rscadd: Colorable Flapcaps! + - imageadd: Resprites Softcaps, and makes them Colorable! + Sadhorizon: + - tweak: Replaced the selection of 16 jumpsuits in the loadout with a single re-skinnable + one. + - rscadd: Added a re-skinnable jumpskirt to the loadout too. + firebudgy: + - rscdel: clown.dm (hostile and hostile/retaliate) + - rscdel: clown spawner grenades + - rscdel: some clown references in halloween code + - rscdel: clown simplemobs on singulolab + - rscdel: clown and mime PDAs + - rscdel: clown/mime masks in the few places they appeared + - rscdel: clown poster + - rscdel: clown shooting targets from everywhere they appear diff --git a/icons/mob/clothing/head.dmi b/icons/mob/clothing/head.dmi index 638398b7b649..792be214ad03 100644 Binary files a/icons/mob/clothing/head.dmi and b/icons/mob/clothing/head.dmi differ diff --git a/icons/mob/clothing/suits/toggle.dmi b/icons/mob/clothing/suits/toggle.dmi index 99fddcf51169..0d33b5d2dc53 100644 Binary files a/icons/mob/clothing/suits/toggle.dmi and b/icons/mob/clothing/suits/toggle.dmi differ diff --git a/icons/obj/bureaucracy.dmi b/icons/obj/bureaucracy.dmi index 486b7be4e6f3..5dc211db8a19 100644 Binary files a/icons/obj/bureaucracy.dmi and b/icons/obj/bureaucracy.dmi differ diff --git a/icons/obj/clothing/hats.dmi b/icons/obj/clothing/hats.dmi index f4a978b1c733..b7b471c185bf 100644 Binary files a/icons/obj/clothing/hats.dmi and b/icons/obj/clothing/hats.dmi differ diff --git a/icons/obj/clothing/suits/toggle.dmi b/icons/obj/clothing/suits/toggle.dmi index 75a2f1a891b3..176f997b8e38 100644 Binary files a/icons/obj/clothing/suits/toggle.dmi and b/icons/obj/clothing/suits/toggle.dmi differ diff --git a/icons/obj/storage.dmi b/icons/obj/storage.dmi index d9c488a1fe85..8f38b5f80022 100644 Binary files a/icons/obj/storage.dmi and b/icons/obj/storage.dmi differ diff --git a/icons/stamp_icons/large_stamp-cap.png b/icons/stamp_icons/large_stamp-cap.png index 19883563b2c9..a353e228c756 100644 Binary files a/icons/stamp_icons/large_stamp-cap.png and b/icons/stamp_icons/large_stamp-cap.png differ diff --git a/icons/stamp_icons/large_stamp-clown.png b/icons/stamp_icons/large_stamp-clown.png deleted file mode 100644 index d60687050724..000000000000 Binary files a/icons/stamp_icons/large_stamp-clown.png and /dev/null differ diff --git a/icons/stamp_icons/large_stamp-fo.png b/icons/stamp_icons/large_stamp-fo.png new file mode 100644 index 000000000000..9ab076ccfbad Binary files /dev/null and b/icons/stamp_icons/large_stamp-fo.png differ diff --git a/icons/stamp_icons/large_stamp-hop.png b/icons/stamp_icons/large_stamp-hop.png deleted file mode 100644 index 1447d58a8756..000000000000 Binary files a/icons/stamp_icons/large_stamp-hop.png and /dev/null differ diff --git a/icons/stamp_icons/large_stamp-mime.png b/icons/stamp_icons/large_stamp-mime.png deleted file mode 100644 index c9a01434394d..000000000000 Binary files a/icons/stamp_icons/large_stamp-mime.png and /dev/null differ diff --git a/shiptest.dme b/shiptest.dme index 103c22c910c8..0d2e04c4ecd6 100644 --- a/shiptest.dme +++ b/shiptest.dme @@ -106,6 +106,7 @@ #include "code\__DEFINES\nanites.dm" #include "code\__DEFINES\networks.dm" #include "code\__DEFINES\obj_flags.dm" +#include "code\__DEFINES\overlays.dm" #include "code\__DEFINES\overmap.dm" #include "code\__DEFINES\paper.dm" #include "code\__DEFINES\particles.dm" @@ -195,6 +196,7 @@ #include "code\__HELPERS\dates.dm" #include "code\__HELPERS\datums.dm" #include "code\__HELPERS\dna.dm" +#include "code\__HELPERS\dynamic_human_icon_gen.dm" #include "code\__HELPERS\files.dm" #include "code\__HELPERS\filters.dm" #include "code\__HELPERS\game.dm" @@ -2050,6 +2052,7 @@ #include "code\modules\clothing\head\beanie.dm" #include "code\modules\clothing\head\berets.dm" #include "code\modules\clothing\head\collectable.dm" +#include "code\modules\clothing\head\flaphat.dm" #include "code\modules\clothing\head\hardhat.dm" #include "code\modules\clothing\head\helmet.dm" #include "code\modules\clothing\head\jobs.dm" @@ -2105,6 +2108,7 @@ #include "code\modules\clothing\suits\reactive_armour.dm" #include "code\modules\clothing\suits\toggles.dm" #include "code\modules\clothing\suits\utility.dm" +#include "code\modules\clothing\suits\windbreakers.dm" #include "code\modules\clothing\suits\wintercoats.dm" #include "code\modules\clothing\suits\wiz_robe.dm" #include "code\modules\clothing\under\_under.dm" @@ -2722,6 +2726,7 @@ #include "code\modules\mob\living\simple_animal\bot\secbot.dm" #include "code\modules\mob\living\simple_animal\bot\SuperBeepsky.dm" #include "code\modules\mob\living\simple_animal\bot\vibebot.dm" +#include "code\modules\mob\living\simple_animal\corpse_spawners\frontiersman.dm" #include "code\modules\mob\living\simple_animal\friendly\beachcarp.dm" #include "code\modules\mob\living\simple_animal\friendly\butterfly.dm" #include "code\modules\mob\living\simple_animal\friendly\capybara.dm" @@ -2753,7 +2758,6 @@ #include "code\modules\mob\living\simple_animal\hostile\bear.dm" #include "code\modules\mob\living\simple_animal\hostile\bees.dm" #include "code\modules\mob\living\simple_animal\hostile\carp.dm" -#include "code\modules\mob\living\simple_animal\hostile\clown.dm" #include "code\modules\mob\living\simple_animal\hostile\cockroach.dm" #include "code\modules\mob\living\simple_animal\hostile\eyeballs.dm" #include "code\modules\mob\living\simple_animal\hostile\faithless.dm" @@ -2822,7 +2826,6 @@ #include "code\modules\mob\living\simple_animal\hostile\mining_mobs\elites\legionnaire.dm" #include "code\modules\mob\living\simple_animal\hostile\mining_mobs\elites\pandora.dm" #include "code\modules\mob\living\simple_animal\hostile\retaliate\bat.dm" -#include "code\modules\mob\living\simple_animal\hostile\retaliate\clown.dm" #include "code\modules\mob\living\simple_animal\hostile\retaliate\frog.dm" #include "code\modules\mob\living\simple_animal\hostile\retaliate\ghost.dm" #include "code\modules\mob\living\simple_animal\hostile\retaliate\retaliate.dm" diff --git a/tools/UpdatePaths/Scripts/4133_indie_stamps.txt b/tools/UpdatePaths/Scripts/4133_indie_stamps.txt new file mode 100644 index 000000000000..9e28eb301f4d --- /dev/null +++ b/tools/UpdatePaths/Scripts/4133_indie_stamps.txt @@ -0,0 +1,7 @@ +# repaths chaplain's stamp, tweaks HOP stamp, removes clown mime and law stamps + +/obj/item/stamp/chaplain : /obj/item/stamp/roumain {@OLD} +/obj/item/stamp/head_of_personnel : /obj/item/stamp/officer {@OLD} +/obj/item/stamp/clown : @DELETE +/obj/item/stamp/mime : @DELETE +/obj/item/stamp/law : @DELETE \ No newline at end of file