diff --git a/_maps/safehouses/bathroom.dmm b/_maps/safehouses/bathroom.dmm index 76712d6193c44..69ad0b25e9520 100644 --- a/_maps/safehouses/bathroom.dmm +++ b/_maps/safehouses/bathroom.dmm @@ -27,7 +27,7 @@ dir = 4 }, /obj/machinery/light/small/blacklight/directional/east, -/turf/open/floor/bitrunning_transport, +/turf/open/indestructible/bitrunning_transport, /area/virtual_domain/safehouse) "v" = ( /obj/machinery/light/small/blacklight/directional/east, @@ -68,7 +68,7 @@ /obj/effect/turf_decal/loading_area{ dir = 4 }, -/turf/open/floor/bitrunning_transport, +/turf/open/indestructible/bitrunning_transport, /area/virtual_domain/safehouse) "M" = ( /obj/effect/decal/cleanable/dirt, diff --git a/_maps/safehouses/den.dmm b/_maps/safehouses/den.dmm index 15debc7e284e6..9b0b37f535150 100644 --- a/_maps/safehouses/den.dmm +++ b/_maps/safehouses/den.dmm @@ -18,7 +18,7 @@ /obj/effect/turf_decal/loading_area{ dir = 4 }, -/turf/open/floor/bitrunning_transport, +/turf/open/indestructible/bitrunning_transport, /area/virtual_domain/safehouse) "e" = ( /obj/structure/table/reinforced/plastitaniumglass, @@ -59,7 +59,7 @@ /obj/effect/turf_decal/loading_area{ dir = 4 }, -/turf/open/floor/bitrunning_transport, +/turf/open/indestructible/bitrunning_transport, /area/virtual_domain/safehouse) "z" = ( /obj/effect/turf_decal/trimline/yellow/corner{ diff --git a/_maps/safehouses/dig.dmm b/_maps/safehouses/dig.dmm index 73f0d247dfbe4..aa26f980d6089 100644 --- a/_maps/safehouses/dig.dmm +++ b/_maps/safehouses/dig.dmm @@ -20,7 +20,7 @@ dir = 8 }, /obj/effect/landmark/bitrunning/cache_goal_turf, -/turf/open/floor/bitrunning_transport, +/turf/open/indestructible/bitrunning_transport, /area/virtual_domain/safehouse) "i" = ( /obj/effect/turf_decal/siding/yellow{ @@ -98,7 +98,7 @@ /obj/effect/turf_decal/loading_area, /obj/effect/turf_decal/box/corners, /obj/effect/landmark/bitrunning/cache_goal_turf, -/turf/open/floor/bitrunning_transport, +/turf/open/indestructible/bitrunning_transport, /area/virtual_domain/safehouse) "T" = ( /obj/effect/landmark/bitrunning/hololadder_spawn, diff --git a/_maps/safehouses/ice.dmm b/_maps/safehouses/ice.dmm index 96d689339ab87..f9716de71032f 100644 --- a/_maps/safehouses/ice.dmm +++ b/_maps/safehouses/ice.dmm @@ -60,7 +60,7 @@ /obj/effect/turf_decal/loading_area{ dir = 4 }, -/turf/open/floor/bitrunning_transport, +/turf/open/indestructible/bitrunning_transport, /area/virtual_domain/safehouse) "p" = ( /obj/structure/railing, @@ -69,7 +69,7 @@ /obj/effect/turf_decal/loading_area{ dir = 4 }, -/turf/open/floor/bitrunning_transport, +/turf/open/indestructible/bitrunning_transport, /area/virtual_domain/safehouse) "u" = ( /obj/effect/decal/cleanable/dirt/dust, diff --git a/_maps/safehouses/lavaland_boss.dmm b/_maps/safehouses/lavaland_boss.dmm index 7331a5b79d7a0..56141803990a5 100644 --- a/_maps/safehouses/lavaland_boss.dmm +++ b/_maps/safehouses/lavaland_boss.dmm @@ -63,7 +63,7 @@ /obj/machinery/light/directional/east, /obj/structure/railing, /obj/effect/landmark/bitrunning/cache_goal_turf, -/turf/open/floor/bitrunning_transport, +/turf/open/indestructible/bitrunning_transport, /area/virtual_domain/safehouse) "A" = ( /obj/effect/turf_decal/trimline/brown/filled/line{ diff --git a/_maps/safehouses/mine.dmm b/_maps/safehouses/mine.dmm index 904c3c5378e8a..4bf99ab14f3ac 100644 --- a/_maps/safehouses/mine.dmm +++ b/_maps/safehouses/mine.dmm @@ -26,7 +26,7 @@ }, /obj/machinery/light/directional/east, /obj/effect/landmark/bitrunning/cache_goal_turf, -/turf/open/floor/bitrunning_transport, +/turf/open/indestructible/bitrunning_transport, /area/virtual_domain/safehouse) "B" = ( /obj/effect/turf_decal/trimline/brown/filled/line{ @@ -52,7 +52,7 @@ }, /obj/structure/railing, /obj/effect/landmark/bitrunning/cache_goal_turf, -/turf/open/floor/bitrunning_transport, +/turf/open/indestructible/bitrunning_transport, /area/virtual_domain/safehouse) "H" = ( /obj/machinery/door/airlock/external/glass{ diff --git a/_maps/safehouses/shuttle.dmm b/_maps/safehouses/shuttle.dmm index 75fe975258c51..19f0c4b73aacc 100644 --- a/_maps/safehouses/shuttle.dmm +++ b/_maps/safehouses/shuttle.dmm @@ -16,7 +16,7 @@ /obj/effect/decal/cleanable/dirt, /obj/effect/landmark/bitrunning/cache_goal_turf, /obj/effect/turf_decal/loading_area, -/turf/open/floor/bitrunning_transport, +/turf/open/indestructible/bitrunning_transport, /area/virtual_domain/safehouse) "i" = ( /obj/effect/turf_decal/stripes/line{ @@ -41,7 +41,7 @@ /obj/machinery/light/small/directional/south, /obj/effect/landmark/bitrunning/cache_goal_turf, /obj/effect/turf_decal/loading_area, -/turf/open/floor/bitrunning_transport, +/turf/open/indestructible/bitrunning_transport, /area/virtual_domain/safehouse) "m" = ( /obj/modular_map_connector, diff --git a/_maps/safehouses/shuttle_space.dmm b/_maps/safehouses/shuttle_space.dmm index 0029f5b0a6e7d..2f4071a834755 100644 --- a/_maps/safehouses/shuttle_space.dmm +++ b/_maps/safehouses/shuttle_space.dmm @@ -67,7 +67,7 @@ /obj/effect/decal/cleanable/dirt, /obj/effect/landmark/bitrunning/cache_goal_turf, /obj/effect/turf_decal/loading_area, -/turf/open/floor/bitrunning_transport, +/turf/open/indestructible/bitrunning_transport, /area/virtual_domain/safehouse) "z" = ( /obj/effect/turf_decal/stripes/line{ @@ -98,7 +98,7 @@ /obj/machinery/light/small/directional/south, /obj/effect/landmark/bitrunning/cache_goal_turf, /obj/effect/turf_decal/loading_area, -/turf/open/floor/bitrunning_transport, +/turf/open/indestructible/bitrunning_transport, /area/virtual_domain/safehouse) "E" = ( /obj/effect/turf_decal/stripes/line{ diff --git a/_maps/safehouses/wood.dmm b/_maps/safehouses/wood.dmm index 05fbb97f915fb..5faa33faa4181 100644 --- a/_maps/safehouses/wood.dmm +++ b/_maps/safehouses/wood.dmm @@ -19,7 +19,7 @@ /obj/effect/turf_decal/loading_area{ dir = 4 }, -/turf/open/floor/bitrunning_transport, +/turf/open/indestructible/bitrunning_transport, /area/virtual_domain/safehouse) "v" = ( /obj/machinery/light/small/directional/east, @@ -50,7 +50,7 @@ /obj/effect/turf_decal/loading_area{ dir = 4 }, -/turf/open/floor/bitrunning_transport, +/turf/open/indestructible/bitrunning_transport, /area/virtual_domain/safehouse) "T" = ( /obj/effect/landmark/bitrunning/hololadder_spawn, diff --git a/_maps/virtual_domains/island_brawl.dmm b/_maps/virtual_domains/island_brawl.dmm index fa04316b9b626..c9010062f54b1 100644 --- a/_maps/virtual_domains/island_brawl.dmm +++ b/_maps/virtual_domains/island_brawl.dmm @@ -2540,7 +2540,7 @@ /area/virtual_domain) "GD" = ( /obj/effect/landmark/bitrunning/permanent_exit, -/turf/open/floor/bitrunning_transport, +/turf/open/indestructible/bitrunning_transport, /area/virtual_domain/protected_space/fullbright) "GI" = ( /turf/open/floor/iron/dark/textured_large, diff --git a/code/__HELPERS/_dreamluau.dm b/code/__HELPERS/_dreamluau.dm index 76d38effd19a2..196774d6a88e8 100644 --- a/code/__HELPERS/_dreamluau.dm +++ b/code/__HELPERS/_dreamluau.dm @@ -1,4 +1,6 @@ -#define DREAMLUAU (world.system_type == MS_WINDOWS ? "dreamluau.dll" : "libdreamluau.so") +/* This comment bypasses grep checks */ /var/__dreamluau + +#define DREAMLUAU (world.system_type == MS_WINDOWS ? "dreamluau.dll" : (__dreamluau || (__dreamluau = __detect_auxtools("dreamluau")))) #define DREAMLUAU_CALL(func) call_ext(DREAMLUAU, "byond:[#func]") diff --git a/code/datums/components/uplink.dm b/code/datums/components/uplink.dm index d831ba2f0d964..d64022d22b872 100644 --- a/code/datums/components/uplink.dm +++ b/code/datums/components/uplink.dm @@ -295,6 +295,8 @@ if (uplink_handler.telecrystals <= 0) return var/desired_amount = tgui_input_number(ui.user, "How many raw telecrystals to buy?", "Buy Raw TC", default = uplink_handler.telecrystals, max_value = uplink_handler.telecrystals) + if(!desired_amount || desired_amount < 1) + return uplink_handler.purchase_raw_tc(ui.user, desired_amount, parent) if("lock") if(!lockable) diff --git a/code/datums/elements/pet_collar.dm b/code/datums/elements/pet_collar.dm new file mode 100644 index 0000000000000..5c49de2eceb5b --- /dev/null +++ b/code/datums/elements/pet_collar.dm @@ -0,0 +1,95 @@ +/datum/element/wears_collar + element_flags = ELEMENT_BESPOKE + argument_hash_start_idx = 2 + ///our icon's pathfile + var/collar_icon + ///our collar's icon state + var/collar_icon_state + ///iconstate of our collar while resting + var/collar_resting_icon_state + +/datum/element/wears_collar/Attach(datum/target, collar_icon = 'icons/mob/simple/pets.dmi', collar_resting_icon_state = FALSE, collar_icon_state) + . = ..() + + if(!isliving(target)) + return ELEMENT_INCOMPATIBLE + + src.collar_icon = collar_icon + src.collar_icon_state = collar_icon_state + src.collar_resting_icon_state = collar_resting_icon_state + + RegisterSignal(target, COMSIG_ATOM_ATTACKBY, PROC_REF(attach_collar)) + RegisterSignal(target, COMSIG_ATOM_UPDATE_OVERLAYS, PROC_REF(on_overlays_updated)) + RegisterSignal(target, COMSIG_ATOM_EXITED, PROC_REF(on_content_exit)) + RegisterSignal(target, COMSIG_ATOM_ENTERED, PROC_REF(on_content_enter)) + RegisterSignal(target, COMSIG_LIVING_RESTING, PROC_REF(on_rest)) + RegisterSignal(target, COMSIG_MOB_STATCHANGE, PROC_REF(on_stat_change)) + +/datum/element/wears_collar/Detach(datum/target) + . = ..() + UnregisterSignal(target, list( + COMSIG_ATOM_ATTACKBY, + COMSIG_ATOM_UPDATE_OVERLAYS, + COMSIG_ATOM_EXITED, + COMSIG_ATOM_ENTERED, + COMSIG_LIVING_RESTING, + COMSIG_MOB_STATCHANGE, + )) + +/datum/element/wears_collar/proc/on_stat_change(mob/living/source) + SIGNAL_HANDLER + + if(collar_icon_state) + source.update_icon(UPDATE_OVERLAYS) + +/datum/element/wears_collar/proc/on_content_exit(mob/living/source, atom/moved) + SIGNAL_HANDLER + + if(!istype(moved, /obj/item/clothing/neck/petcollar)) + return + source.fully_replace_character_name(null, source::name) + if(collar_icon_state) + source.update_appearance() + +/datum/element/wears_collar/proc/on_content_enter(mob/living/source, obj/item/clothing/neck/petcollar/new_collar) + SIGNAL_HANDLER + + if(!istype(new_collar)) + return + + source.fully_replace_character_name(null, "\proper [new_collar.tagname]") + if(collar_icon_state) + source.update_appearance() + +/datum/element/wears_collar/proc/attach_collar(atom/source, atom/movable/attacking_item, atom/user, params) + SIGNAL_HANDLER + + if(!istype(attacking_item, /obj/item/clothing/neck/petcollar)) + return NONE + if(locate(/obj/item/clothing/neck/petcollar) in source) + user.balloon_alert(source, "already wearing a collar!") + return NONE + attacking_item.forceMove(source) + return COMPONENT_NO_AFTERATTACK + +/datum/element/wears_collar/proc/on_overlays_updated(mob/living/source, list/overlays) + SIGNAL_HANDLER + + if(!locate(/obj/item/clothing/neck/petcollar) in source) + return + + var/icon_tag = "" + + if(source.stat == DEAD || HAS_TRAIT(source, TRAIT_FAKEDEATH)) + icon_tag = "_dead" + else if(collar_resting_icon_state && source.resting) + icon_tag = "_rest" + + overlays += mutable_appearance(collar_icon, "[collar_icon_state][icon_tag]collar") + overlays += mutable_appearance(collar_icon, "[collar_icon_state][icon_tag]tag") + + +/datum/element/wears_collar/proc/on_rest(atom/movable/source) + SIGNAL_HANDLER + + source.update_icon(UPDATE_OVERLAYS) diff --git a/code/datums/elements/pet_cult.dm b/code/datums/elements/pet_cult.dm new file mode 100644 index 0000000000000..36941e7b74299 --- /dev/null +++ b/code/datums/elements/pet_cult.dm @@ -0,0 +1,127 @@ +#define PET_CULT_ATTACK_UPPER 15 +#define PET_CULT_HEALTH 50 + +/datum/element/cultist_pet + element_flags = ELEMENT_BESPOKE + argument_hash_start_idx = 2 + ///our pet cult icon's pathfile + var/pet_cult_icon + ///our pet cult icon state + var/pet_cult_icon_state + +/datum/element/cultist_pet/Attach(datum/target, pet_cult_icon = 'icons/mob/simple/pets.dmi', pet_cult_icon_state) + . = ..() + + if(!isliving(target)) + return ELEMENT_INCOMPATIBLE + + src.pet_cult_icon = pet_cult_icon + src.pet_cult_icon_state = pet_cult_icon_state + + RegisterSignal(target, COMSIG_LIVING_CULT_SACRIFICED, PROC_REF(become_cultist)) + RegisterSignal(target, COMSIG_MOB_CLIENT_LOGIN, PROC_REF(on_login)) + RegisterSignal(target, COMSIG_ATOM_UPDATE_ICON_STATE, PROC_REF(on_icon_state_updated)) + RegisterSignal(target, COMSIG_ATOM_UPDATE_OVERLAYS, PROC_REF(on_overlays_updated)) + +/datum/element/cultist_pet/Detach(datum/target) + . = ..() + UnregisterSignal(target, list( + COMSIG_MOB_LOGIN, + COMSIG_LIVING_CULT_SACRIFICED, + COMSIG_ATOM_UPDATE_ICON_STATE, + COMSIG_ATOM_UPDATE_OVERLAYS, + )) + +/datum/element/cultist_pet/proc/on_overlays_updated(mob/living/basic/source, list/overlays) + SIGNAL_HANDLER + + if(isnull(source.mind) && (FACTION_CULT in source.faction)) //cult indicator we show for non sentient pets + var/image/cult_indicator = image(icon = 'icons/mob/simple/pets.dmi', icon_state = "pet_cult_indicator", layer = ABOVE_GAME_PLANE) + overlays += cult_indicator + +/datum/element/cultist_pet/proc/on_icon_state_updated(mob/living/basic/source) + SIGNAL_HANDLER + + if(pet_cult_icon_state && (FACTION_CULT in source.faction)) + source.icon_state = pet_cult_icon_state + source.icon_living = pet_cult_icon_state + +///turn into terrifying beasts +/datum/element/cultist_pet/proc/become_cultist(mob/living/basic/source, list/invokers, datum/team) + SIGNAL_HANDLER + + if(source.stat == DEAD) + return + + if(FACTION_CULT in source.faction) + return STOP_SACRIFICE + + source.mind?.add_antag_datum(/datum/antagonist/cult, team) + qdel(source.GetComponent(/datum/component/obeys_commands)) //if we obey commands previously, forget about them + source.melee_damage_lower = max(PET_CULT_ATTACK_UPPER - 5, source::melee_damage_lower) + source.melee_damage_upper = max(PET_CULT_ATTACK_UPPER, source::melee_damage_upper) + source.maxHealth = max(PET_CULT_HEALTH, source::maxHealth) + source.fully_heal() + + source.faction = list(FACTION_CULT) //we only serve the cult + + if(isnull(pet_cult_icon_state)) + source.add_atom_colour(RUNE_COLOR_MEDIUMRED, FIXED_COLOUR_PRIORITY) + + var/static/list/cult_appetite = list( + /obj/item/organ, + /obj/effect/decal/cleanable/blood, + ) + + var/static/list/death_loot = list( + /obj/effect/gibspawner/generic, + /obj/item/soulstone, + ) + + source.AddElement(/datum/element/basic_eating, heal_amt = 15, food_types = cult_appetite) + source.AddElement(/datum/element/death_drops, death_loot) + + source.basic_mob_flags &= DEL_ON_DEATH + qdel(source.ai_controller) + source.ai_controller = new /datum/ai_controller/basic_controller/pet_cult(source) + var/datum/action/cooldown/spell/conjure/revive_rune/rune_ability = new(source) + rune_ability.Grant(source) + source.ai_controller.set_blackboard_key(BB_RUNE_ABILITY, rune_ability) + source.ai_controller.set_blackboard_key(BB_CULT_TEAM, team) + + var/static/list/new_pet_commands = list( + /datum/pet_command/point_targeting/attack, + /datum/pet_command/follow, + /datum/pet_command/free, + /datum/pet_command/idle, + /datum/pet_command/untargeted_ability/draw_rune, + ) + source.AddComponent(/datum/component/obeys_commands, new_pet_commands) + RegisterSignal(source, COMSIG_HOSTILE_PRE_ATTACKINGTARGET, PROC_REF(activate_rune)) + source.update_appearance() + return STOP_SACRIFICE + + +/datum/element/cultist_pet/proc/activate_rune(datum/source, atom/target) + SIGNAL_HANDLER + + if(!istype(target, /obj/effect/rune/raise_dead)) //we can only revive people... + return NONE + + INVOKE_ASYNC(target, TYPE_PROC_REF(/atom, attack_hand), source) + return COMPONENT_CANCEL_ATTACK_CHAIN + +/datum/element/cultist_pet/proc/on_login(mob/living/source) + SIGNAL_HANDLER + + if(!(FACTION_CULT in source.faction)) + return + var/datum/team/cult_team = source.ai_controller.blackboard[BB_CULT_TEAM] + if(isnull(cult_team)) + return + source.mind.add_antag_datum(/datum/antagonist/cult, cult_team) + source.update_appearance(UPDATE_OVERLAYS) + + +#undef PET_CULT_ATTACK_UPPER +#undef PET_CULT_HEALTH diff --git a/code/game/objects/items/knives.dm b/code/game/objects/items/knives.dm index 4e6795c182b24..848058a6a279e 100644 --- a/code/game/objects/items/knives.dm +++ b/code/game/objects/items/knives.dm @@ -190,7 +190,6 @@ desc = "A sharpened bone. The bare minimum in survival." embed_type = /datum/embed_data/combat_knife/weak obj_flags = parent_type::obj_flags & ~CONDUCTS_ELECTRICITY - slot_flags = NONE force = 15 throwforce = 15 custom_materials = null @@ -202,7 +201,9 @@ name = "cyborg knife" icon = 'icons/obj/items_cyborg.dmi' icon_state = "knife_cyborg" + worn_icon_state = "knife_cyborg" //error sprite - this shouldn't have been dropped desc = "A cyborg-mounted plasteel knife. Extremely sharp and durable." + slot_flags = NONE //you can't put this in your mouth /obj/item/knife/shiv name = "glass shiv" diff --git a/code/game/objects/items/tools/crowbar.dm b/code/game/objects/items/tools/crowbar.dm index c6b0d52cdc1c3..20e3846adefab 100644 --- a/code/game/objects/items/tools/crowbar.dm +++ b/code/game/objects/items/tools/crowbar.dm @@ -191,7 +191,7 @@ desc = "A hydraulic prying tool, simple but powerful." icon = 'icons/obj/items_cyborg.dmi' icon_state = "toolkit_engiborg_crowbar" - worn_icon_state = "crowbar" + worn_icon_state = "toolkit_engiborg_crowbar" //error sprite - this shouldn't have been dropped usesound = 'sound/items/jaws_pry.ogg' force = 10 toolspeed = 0.5 diff --git a/code/modules/admin/verbs/lua/lua_state.dm b/code/modules/admin/verbs/lua/lua_state.dm index 37a60f1fdb5e1..577b0e365c2d8 100644 --- a/code/modules/admin/verbs/lua/lua_state.dm +++ b/code/modules/admin/verbs/lua/lua_state.dm @@ -55,6 +55,8 @@ GLOBAL_PROTECT(lua_state_stack) var/status = result["status"] if(!verbose && status != "error" && status != "panic" && status != "runtime" && !(result["name"] == "input" && (status == "finished" || length(result["return_values"])))) return + if(status == "runtime" && supress_runtimes) + return var/append_to_log = TRUE var/index_of_log if(log.len) diff --git a/code/modules/bitrunning/turfs.dm b/code/modules/bitrunning/turfs.dm index 4c35153311e53..763388b6e0850 100644 --- a/code/modules/bitrunning/turfs.dm +++ b/code/modules/bitrunning/turfs.dm @@ -1,4 +1,4 @@ -/turf/open/floor/bitrunning_transport +/turf/open/indestructible/bitrunning_transport name = "circuit floor" desc = "Looks complex. You can see the circuits running through the floor." icon_state = "bitrunning" diff --git a/code/modules/clothing/spacesuits/plasmamen.dm b/code/modules/clothing/spacesuits/plasmamen.dm index 63a0dd515c3f6..380cd0cf3fb53 100644 --- a/code/modules/clothing/spacesuits/plasmamen.dm +++ b/code/modules/clothing/spacesuits/plasmamen.dm @@ -118,33 +118,45 @@ . = ..() if(!up) . += visor_icon - -/obj/item/clothing/head/helmet/space/plasmaman/attackby(obj/item/hitting_item, mob/living/user) - . = ..() - if(istype(hitting_item, /obj/item/toy/crayon)) - if(smile == FALSE) - var/obj/item/toy/crayon/CR = hitting_item - to_chat(user, span_notice("You start drawing a smiley face on the helmet's visor..")) - if(do_after(user, 2.5 SECONDS, target = src)) - smile = TRUE - smile_color = CR.paint_color - to_chat(user, "You draw a smiley on the helmet visor.") - update_appearance() - else - to_chat(user, span_warning("Seems like someone already drew something on this helmet's visor!")) - return - if(istype(hitting_item, /obj/item/clothing/head)) - var/obj/item/clothing/hitting_clothing = hitting_item - if(hitting_clothing.clothing_flags & STACKABLE_HELMET_EXEMPT) - to_chat(user, span_notice("You cannot place [hitting_clothing.name] on helmet!")) - return - if(attached_hat) - to_chat(user, span_notice("There's already something placed on helmet!")) - return - attached_hat = hitting_clothing - to_chat(user, span_notice("You placed [hitting_clothing.name] on helmet!")) - hitting_clothing.forceMove(src) + if(smile) + var/mutable_appearance/smiley = mutable_appearance(icon, smile_state) + smiley.color = smile_color + . += smiley + +/obj/item/clothing/head/helmet/space/plasmaman/item_interaction(mob/living/user, obj/item/tool, list/modifiers) + if(istype(tool, /obj/item/toy/crayon)) + if(smile) + to_chat(user, span_warning("Seems like someone already drew something on [src]'s visor!")) + return ITEM_INTERACT_BLOCKING + + var/obj/item/toy/crayon/crayon = tool + to_chat(user, span_notice("You start drawing a smiley face on [src]'s visor...")) + if(!do_after(user, 2.5 SECONDS, target = src)) + return ITEM_INTERACT_BLOCKING + + smile = TRUE + smile_color = crayon.paint_color + to_chat(user, "You draw a smiley on [src] visor.") update_appearance() + return ITEM_INTERACT_SUCCESS + + if(!istype(tool, /obj/item/clothing/head)) + return NONE + + var/obj/item/clothing/hitting_clothing = tool + if(hitting_clothing.clothing_flags & STACKABLE_HELMET_EXEMPT) + to_chat(user, span_notice("You cannot place [hitting_clothing.name] on [src]!")) + return ITEM_INTERACT_BLOCKING + + if(attached_hat) + to_chat(user, span_notice("There's already something placed on [src]!")) + return ITEM_INTERACT_BLOCKING + + attached_hat = hitting_clothing + to_chat(user, span_notice("You placed [hitting_clothing.name] on [src]!")) + hitting_clothing.forceMove(src) + update_appearance() + return ITEM_INTERACT_SUCCESS ///By the by, helmets have the update_icon_updates_onmob element, so we don't have to call mob.update_worn_head() /obj/item/clothing/head/helmet/space/plasmaman/worn_overlays(mutable_appearance/standing, isinhands) diff --git a/code/modules/jobs/job_types/assistant/gimmick_assistants.dm b/code/modules/jobs/job_types/assistant/gimmick_assistants.dm index ed2851366153c..23fd9616ee3cb 100644 --- a/code/modules/jobs/job_types/assistant/gimmick_assistants.dm +++ b/code/modules/jobs/job_types/assistant/gimmick_assistants.dm @@ -167,6 +167,7 @@ belt = /obj/item/storage/belt/utility/full head = /obj/item/clothing/head/utility/hardhat uniform = /obj/item/clothing/under/color/yellow + l_pocket = /obj/item/modular_computer/pda/assistant outfit_weight = 6 diff --git a/code/modules/loadout/categories/pocket.dm b/code/modules/loadout/categories/pocket.dm index e1cddde76e5b9..fd3f11e112b27 100644 --- a/code/modules/loadout/categories/pocket.dm +++ b/code/modules/loadout/categories/pocket.dm @@ -106,10 +106,6 @@ name = "Plush (Moth)" item_path = /obj/item/toy/plush/moth -/datum/loadout_item/pocket_items/plush/narsie - name = "Plush (Nar'sie)" - item_path = /obj/item/toy/plush/narplush - /datum/loadout_item/pocket_items/plush/nukie name = "Plush (Nukie)" item_path = /obj/item/toy/plush/nukeplushie @@ -122,10 +118,6 @@ name = "Plush (Plasmaman)" item_path = /obj/item/toy/plush/plasmamanplushie -/datum/loadout_item/pocket_items/plush/ratvar - name = "Plush (Ratvar)" - item_path = /obj/item/toy/plush/ratplush - /datum/loadout_item/pocket_items/plush/rouny name = "Plush (Rouny)" item_path = /obj/item/toy/plush/rouny diff --git a/code/modules/mob/living/basic/lavaland/lobstrosity/lobstrosity.dm b/code/modules/mob/living/basic/lavaland/lobstrosity/lobstrosity.dm index 031ec3d45256c..7dcbc4ae325b0 100644 --- a/code/modules/mob/living/basic/lavaland/lobstrosity/lobstrosity.dm +++ b/code/modules/mob/living/basic/lavaland/lobstrosity/lobstrosity.dm @@ -41,8 +41,6 @@ /mob/living/basic/mining/lobstrosity/Initialize(mapload) . = ..() - var/static/list/food_types = list(/obj/item/fish/lavaloop) - ai_controller.set_blackboard_key(BB_BASIC_FOODS, typecacheof(food_types)) AddComponent(/datum/component/profound_fisher) AddElement(/datum/element/mob_grabber) AddElement(/datum/element/footstep, FOOTSTEP_MOB_CLAW) diff --git a/code/modules/mob/living/basic/lavaland/lobstrosity/lobstrosity_ai.dm b/code/modules/mob/living/basic/lavaland/lobstrosity/lobstrosity_ai.dm index 5ca1ca2cfd5b0..32ec66a62cc37 100644 --- a/code/modules/mob/living/basic/lavaland/lobstrosity/lobstrosity_ai.dm +++ b/code/modules/mob/living/basic/lavaland/lobstrosity/lobstrosity_ai.dm @@ -34,6 +34,14 @@ /datum/ai_planning_subtree/find_and_hunt_target/lobster_fishing, /datum/ai_planning_subtree/find_fingers, ) + +/datum/ai_controller/basic_controller/lobstrosity/TryPossessPawn(atom/new_pawn) + . = ..() + if(. & AI_CONTROLLER_INCOMPATIBLE) + return + var/static/list/food_types = typecacheof(list(/obj/item/fish/lavaloop)) + set_blackboard_key(BB_BASIC_FOODS, food_types) + ///Ensure that juveline lobstrosities witll charge at things they can reach. /datum/ai_controller/basic_controller/lobstrosity/juvenile blackboard = list( diff --git a/code/modules/mob/living/basic/pets/cat/cat.dm b/code/modules/mob/living/basic/pets/cat/cat.dm index 400bd9ac9f173..2bcd715d7f5c8 100644 --- a/code/modules/mob/living/basic/pets/cat/cat.dm +++ b/code/modules/mob/living/basic/pets/cat/cat.dm @@ -24,8 +24,6 @@ response_harm_simple = "kick" mobility_flags = MOBILITY_FLAGS_REST_CAPABLE_DEFAULT gold_core_spawnable = FRIENDLY_SPAWN - collar_icon_state = "cat" - has_collar_resting_icon_state = TRUE can_be_held = TRUE ai_controller = /datum/ai_controller/basic_controller/cat held_state = "cat2" @@ -33,7 +31,8 @@ attack_verb_simple = "claw" attack_sound = 'sound/weapons/slash.ogg' attack_vis_effect = ATTACK_EFFECT_CLAW - cult_icon_state = "cat_cult" + ///icon of the collar we can wear + var/collar_icon_state = "cat" ///can this cat breed? var/can_breed = TRUE ///can hold items? @@ -50,9 +49,13 @@ var/obj/item/held_food ///mutable appearance for held item var/mutable_appearance/held_item_overlay + ///icon state of our cult icon + var/cult_icon_state = "cat_cult" /mob/living/basic/pet/cat/Initialize(mapload) . = ..() + AddElement(/datum/element/cultist_pet, pet_cult_icon_state = cult_icon_state) + AddElement(/datum/element/wears_collar, collar_icon_state = collar_icon_state, collar_resting_icon_state = TRUE) AddElement(/datum/element/ai_retaliate) AddElement(/datum/element/pet_bonus, "purrs!") AddElement(/datum/element/footstep, footstep_type = FOOTSTEP_MOB_CLAW) @@ -147,7 +150,6 @@ icon_living = "breadcat" icon_dead = "breadcat_dead" ai_controller = /datum/ai_controller/basic_controller/cat/bread - collar_icon_state = null held_state = "breadcat" can_interact_with_stove = TRUE butcher_results = list( @@ -156,6 +158,7 @@ /obj/item/organ/external/tail/cat = 1, /obj/item/food/breadslice/plain = 1 ) + collar_icon_state = null /mob/living/basic/pet/cat/breadcat/add_cell_sample() return @@ -167,7 +170,6 @@ icon_state = "original" icon_living = "original" icon_dead = "original_dead" - collar_icon_state = null unique_pet = TRUE held_state = "original" @@ -183,10 +185,10 @@ density = FALSE pass_flags = PASSMOB mob_size = MOB_SIZE_SMALL - collar_icon_state = "kitten" can_breed = FALSE ai_controller = /datum/ai_controller/basic_controller/cat/kitten can_hold_item = FALSE + collar_icon_state = "kitten" /mob/living/basic/pet/cat/kitten/Initialize(mapload) . = ..() diff --git a/code/modules/mob/living/basic/pets/dog/_dog.dm b/code/modules/mob/living/basic/pets/dog/_dog.dm index 5cd970575ec6f..b1c2c5e486fc1 100644 --- a/code/modules/mob/living/basic/pets/dog/_dog.dm +++ b/code/modules/mob/living/basic/pets/dog/_dog.dm @@ -44,9 +44,15 @@ /datum/pet_command/point_targeting/fetch, /datum/pet_command/play_dead, ) + ///icon state of the collar we can wear + var/collar_icon_state + ///icon state of our cult icon + var/cult_icon_state /mob/living/basic/pet/dog/Initialize(mapload) . = ..() + AddElement(/datum/element/cultist_pet, pet_cult_icon_state = cult_icon_state) + AddElement(/datum/element/wears_collar, collar_icon_state = collar_icon_state) ADD_TRAIT(src, TRAIT_WOUND_LICKER, INNATE_TRAIT) AddElement(/datum/element/pet_bonus, "woofs happily!") AddElement(/datum/element/footstep, FOOTSTEP_MOB_CLAW) diff --git a/code/modules/mob/living/basic/pets/dog/corgi.dm b/code/modules/mob/living/basic/pets/dog/corgi.dm index 7e13c792d2830..e1f05b33d81fb 100644 --- a/code/modules/mob/living/basic/pets/dog/corgi.dm +++ b/code/modules/mob/living/basic/pets/dog/corgi.dm @@ -544,9 +544,9 @@ pass_flags = PASSMOB ai_controller = /datum/ai_controller/basic_controller/dog/puppy mob_size = MOB_SIZE_SMALL - collar_icon_state = "puppy" strippable_inventory_slots = list(/datum/strippable_item/pet_collar, /datum/strippable_item/corgi_id) //puppies are too small to handle hats and back slot items can_breed = FALSE + collar_icon_state = "puppy" //PUPPY IAN! SQUEEEEEEEEE~ /mob/living/basic/pet/dog/corgi/puppy/ian diff --git a/code/modules/mob/living/basic/pets/dog/strippable_items.dm b/code/modules/mob/living/basic/pets/dog/strippable_items.dm index 2799ca38b978f..c92948e2b6ffd 100644 --- a/code/modules/mob/living/basic/pets/dog/strippable_items.dm +++ b/code/modules/mob/living/basic/pets/dog/strippable_items.dm @@ -38,11 +38,11 @@ GLOBAL_LIST_INIT(strippable_corgi_items, create_strippable_list(list( key = STRIPPABLE_ITEM_PET_COLLAR /datum/strippable_item/pet_collar/get_item(atom/source) - var/mob/living/basic/pet/pet_source = source + var/mob/living/basic/pet_source = source if(!istype(pet_source)) return - return pet_source.collar + return (locate(/obj/item/clothing/neck/petcollar) in source) /datum/strippable_item/pet_collar/try_equip(atom/source, obj/item/equipping, mob/user) . = ..() @@ -56,18 +56,10 @@ GLOBAL_LIST_INIT(strippable_corgi_items, create_strippable_list(list( return TRUE /datum/strippable_item/pet_collar/finish_equip(atom/source, obj/item/equipping, mob/user) - var/mob/living/basic/pet/pet_source = source - if(!istype(pet_source)) - return - - pet_source.add_collar(equipping, user) + user.transferItemToLoc(equipping, source) /datum/strippable_item/pet_collar/finish_unequip(atom/source, mob/user) - var/mob/living/basic/pet/pet_source = source - if(!istype(pet_source)) - return - - var/obj/collar = pet_source.remove_collar(user.drop_location()) + var/obj/item/clothing/neck/petcollar/collar = locate() in source user.put_in_hands(collar) /datum/strippable_item/corgi_back diff --git a/code/modules/mob/living/basic/pets/fox.dm b/code/modules/mob/living/basic/pets/fox.dm index 03ac2be54bedd..e4e978568a0e6 100644 --- a/code/modules/mob/living/basic/pets/fox.dm +++ b/code/modules/mob/living/basic/pets/fox.dm @@ -31,6 +31,8 @@ /mob/living/basic/pet/fox/Initialize(mapload) . = ..() + AddElement(/datum/element/cultist_pet) + AddElement(/datum/element/wears_collar) AddElement(/datum/element/pet_bonus, "pants and yaps happily!") AddElement(/datum/element/footstep, footstep_type = FOOTSTEP_MOB_CLAW) AddElement(/datum/element/tiny_mob_hunter, MOB_SIZE_SMALL) diff --git a/code/modules/mob/living/basic/pets/penguin.dm b/code/modules/mob/living/basic/pets/penguin.dm index 1bf3adec5574e..a597bd70cbba4 100644 --- a/code/modules/mob/living/basic/pets/penguin.dm +++ b/code/modules/mob/living/basic/pets/penguin.dm @@ -20,6 +20,8 @@ /mob/living/basic/pet/penguin/Initialize(mapload) . = ..() + AddElement(/datum/element/cultist_pet) + AddElement(/datum/element/wears_collar) AddElement(/datum/element/ai_retaliate) AddElement(/datum/element/ai_flee_while_injured) AddElement(/datum/element/pet_bonus, "honks happily!") diff --git a/code/modules/mob/living/basic/pets/pet.dm b/code/modules/mob/living/basic/pets/pet.dm index de5ad59eb1f0c..64896a3f2ab47 100644 --- a/code/modules/mob/living/basic/pets/pet.dm +++ b/code/modules/mob/living/basic/pets/pet.dm @@ -3,146 +3,12 @@ mob_size = MOB_SIZE_SMALL mob_biotypes = MOB_ORGANIC|MOB_BEAST blood_volume = BLOOD_VOLUME_NORMAL - /// if the mob is protected from being renamed by collars. var/unique_pet = FALSE - /// If the mob has collar sprites, this is the base of the icon states. - var/collar_icon_state = null - /// We have a seperate _rest collar icon state when the pet is resting. - var/has_collar_resting_icon_state = FALSE - /// Our collar - var/obj/item/clothing/neck/petcollar/collar - ///can we become cultists? - var/can_cult_convert = TRUE - ///whether we have a custom icon state when we get culted - var/cult_icon_state - -/mob/living/basic/pet/Initialize(mapload) - . = ..() - - /// Can set the collar var beforehand to start the pet with a collar. - if(collar) - collar = new(src) - - update_icon(UPDATE_OVERLAYS) - if(can_cult_convert) - RegisterSignal(src, COMSIG_LIVING_CULT_SACRIFICED, PROC_REF(become_cultist)) - -/mob/living/basic/pet/Destroy() - . = ..() - - QDEL_NULL(collar) - -/mob/living/basic/pet/attackby(obj/item/thing, mob/user, params) - if(istype(thing, /obj/item/clothing/neck/petcollar) && !collar) - add_collar(thing, user) - return TRUE - - if(istype(thing, /obj/item/newspaper) && !stat) - user.visible_message(span_notice("[user] baps [name] on the nose with the rolled up [thing].")) - dance_rotate(src) - return TRUE - return ..() - -/mob/living/basic/pet/update_overlays() - . = ..() - - if(isnull(mind) && (FACTION_CULT in faction)) - var/image/cult_indicator = image(icon = 'icons/mob/simple/pets.dmi', icon_state = "pet_cult_indicator", layer = ABOVE_GAME_PLANE) - . += cult_indicator - - if(!collar || !collar_icon_state) - return - - // Determine which status tag to add to the middle of the icon state. - var/dead_tag = (stat == DEAD || HAS_TRAIT(src, TRAIT_FAKEDEATH)) ? "_dead" : null - var/rest_tag = has_collar_resting_icon_state && resting ? "_rest" : null - var/stat_tag = dead_tag || rest_tag || "" - - . += mutable_appearance(icon, "[collar_icon_state][stat_tag]collar") - . += mutable_appearance(icon, "[collar_icon_state][stat_tag]tag") - -/mob/living/basic/pet/update_icon_state() - if(cult_icon_state && (FACTION_CULT in faction)) - icon_state = cult_icon_state - icon_living = cult_icon_state - return ..() - -/mob/living/basic/pet/gib() - remove_collar(drop_location(), update_visuals = FALSE) - return ..() - -/mob/living/basic/pet/revive(full_heal_flags = NONE, excess_healing = 0, force_grab_ghost = FALSE) - . = ..() - if(!.) - return - - update_icon(UPDATE_OVERLAYS) /mob/living/basic/pet/death(gibbed) . = ..() add_memory_in_range(src, 7, /datum/memory/pet_died, deuteragonist = src) //Protagonist is the person memorizing it -/mob/living/basic/pet/Exited(atom/movable/gone, direction) - . = ..() - if(gone != collar) - return - - collar = null - - if(QDELETED(src)) - return - - update_icon(UPDATE_OVERLAYS) - -/mob/living/basic/pet/update_stat() - . = ..() - - update_icon(UPDATE_OVERLAYS) - -/mob/living/basic/pet/set_resting(new_resting, silent, instant) - . = ..() - - if(!has_collar_resting_icon_state) - return - - update_icon(UPDATE_OVERLAYS) - -/** - * Add a collar to the pet. - * - * Arguments: - * * new_collar - the collar. - * * user - the user that did it. - */ -/mob/living/basic/pet/proc/add_collar(obj/item/clothing/neck/petcollar/new_collar, mob/user) - if(QDELETED(new_collar) || collar) - return - if(!user.transferItemToLoc(new_collar, src)) - return - - collar = new_collar - if(collar_icon_state) - update_icon(UPDATE_OVERLAYS) - - to_chat(user, span_notice("You put [new_collar] around [src]'s neck.")) - if(new_collar.tagname && !unique_pet) - fully_replace_character_name(null, "\proper [new_collar.tagname]") - -/** - * Remove the collar from the pet. - */ -/mob/living/basic/pet/proc/remove_collar(atom/new_loc, update_visuals = TRUE) - if(!collar) - return - - var/obj/old_collar = collar - - collar.forceMove(new_loc) - collar = null - - if(collar_icon_state && update_visuals) - update_icon(UPDATE_OVERLAYS) - return old_collar diff --git a/code/modules/mob/living/basic/pets/pet_cult/pet_cult.dm b/code/modules/mob/living/basic/pets/pet_cult/pet_cult.dm deleted file mode 100644 index 438737a1ad261..0000000000000 --- a/code/modules/mob/living/basic/pets/pet_cult/pet_cult.dm +++ /dev/null @@ -1,85 +0,0 @@ -#define PET_CULT_ATTACK 10 -#define PET_CULT_HEALTH 50 - -///turn into terrifying beasts -/mob/living/basic/pet/proc/become_cultist(datum/source, list/invokers, datum/team) - SIGNAL_HANDLER - - if(stat == DEAD || !can_cult_convert) - return - - if(FACTION_CULT in faction) - return STOP_SACRIFICE - - mind?.add_antag_datum(/datum/antagonist/cult, team) - qdel(GetComponent(/datum/component/obeys_commands)) - melee_damage_lower = max(PET_CULT_ATTACK, initial(melee_damage_lower)) - melee_damage_upper = max(PET_CULT_ATTACK + 5, initial(melee_damage_upper)) - maxHealth = max(PET_CULT_HEALTH, initial(maxHealth)) - fully_heal() - - faction = list(FACTION_CULT) //we only serve the cult - - if(isnull(cult_icon_state)) - add_atom_colour(RUNE_COLOR_MEDIUMRED, FIXED_COLOUR_PRIORITY) - - var/static/list/cult_appetite = list( - /obj/item/organ, - /obj/effect/decal/cleanable/blood, - ) - - var/static/list/death_loot = list( - /obj/effect/gibspawner/generic, - /obj/item/soulstone, - ) - - AddElement(/datum/element/basic_eating, heal_amt = 15, food_types = cult_appetite) - AddElement(/datum/element/death_drops, death_loot) - - basic_mob_flags &= DEL_ON_DEATH - qdel(ai_controller) - ai_controller = new /datum/ai_controller/basic_controller/pet_cult(src) - var/datum/action/cooldown/spell/conjure/revive_rune/rune_ability = new(src) - rune_ability.Grant(src) - ai_controller.set_blackboard_key(BB_RUNE_ABILITY, rune_ability) - ai_controller.set_blackboard_key(BB_CULT_TEAM, team) - - var/static/list/new_pet_commands = list( - /datum/pet_command/point_targeting/attack, - /datum/pet_command/follow, - /datum/pet_command/free, - /datum/pet_command/idle, - /datum/pet_command/untargeted_ability/draw_rune, - ) - AddComponent(/datum/component/obeys_commands, new_pet_commands) - RegisterSignal(src, COMSIG_HOSTILE_PRE_ATTACKINGTARGET, PROC_REF(activate_rune), override = TRUE) - update_appearance() - return STOP_SACRIFICE - - -/mob/living/basic/pet/proc/activate_rune(datum/source, atom/target) - SIGNAL_HANDLER - - if(!istype(target, /obj/effect/rune/raise_dead)) - return NONE - - target.attack_hand(src) - - return COMPONENT_CANCEL_ATTACK_CHAIN - -/mob/living/basic/pet/Login() - . = ..() - if(!. || !client) - return FALSE - - if(!(FACTION_CULT in faction)) - return - var/datum/team/cult_team = locate(/datum/team/cult) in GLOB.antagonist_teams - if(isnull(cult_team)) - return - mind.add_antag_datum(/datum/antagonist/cult, cult_team) - update_appearance(UPDATE_OVERLAYS) - - -#undef PET_CULT_ATTACK -#undef PET_CULT_HEALTH diff --git a/code/modules/mob/living/carbon/alien/alien_defense.dm b/code/modules/mob/living/carbon/alien/alien_defense.dm index 3717cfcb89a1a..630171ba2c15d 100644 --- a/code/modules/mob/living/carbon/alien/alien_defense.dm +++ b/code/modules/mob/living/carbon/alien/alien_defense.dm @@ -33,7 +33,6 @@ In all, this is a lot like the monkey code. /N to_chat(user, span_danger("You bite [src]!")) adjustBruteLoss(1) log_combat(user, src, "attacked") - updatehealth() else to_chat(user, span_warning("[name] is too injured for that.")) diff --git a/code/modules/mob/living/carbon/human/_species.dm b/code/modules/mob/living/carbon/human/_species.dm index 04feb94b524a7..5e1bdf4282686 100644 --- a/code/modules/mob/living/carbon/human/_species.dm +++ b/code/modules/mob/living/carbon/human/_species.dm @@ -1195,10 +1195,9 @@ GLOBAL_LIST_EMPTY(features_by_species) // Get the insulation value based on the area's temp var/thermal_protection = humi.get_insulation_protection(area_temp) - var/original_bodytemp = humi.bodytemperature // Changes to the skin temperature based on the area - var/area_skin_diff = area_temp - original_bodytemp + var/area_skin_diff = area_temp - humi.bodytemperature if(!humi.on_fire || area_skin_diff > 0) // change rate of 0.05 as area temp has large impact on the surface var/area_skin_change = get_temp_change_amount(area_skin_diff, 0.05 * seconds_per_tick) @@ -1218,7 +1217,7 @@ GLOBAL_LIST_EMPTY(features_by_species) // Core to skin temp transfer, when not on fire if(!humi.on_fire) // Get the changes to the skin from the core temp - var/core_skin_diff = humi.coretemperature - original_bodytemp + var/core_skin_diff = humi.coretemperature - humi.bodytemperature // change rate of 0.045 to reflect temp back to the skin at the slight higher rate then core to skin var/core_skin_change = (1 + thermal_protection) * get_temp_change_amount(core_skin_diff, 0.045 * seconds_per_tick) diff --git a/code/modules/mob/living/silicon/ai/ai_defense.dm b/code/modules/mob/living/silicon/ai/ai_defense.dm index 7dea684e56941..0c5eb6ec164b2 100644 --- a/code/modules/mob/living/silicon/ai/ai_defense.dm +++ b/code/modules/mob/living/silicon/ai/ai_defense.dm @@ -14,7 +14,6 @@ /mob/living/silicon/ai/blob_act(obj/structure/blob/B) if (stat != DEAD) adjustBruteLoss(60) - updatehealth() return TRUE return FALSE diff --git a/code/modules/mob/living/silicon/silicon_defense.dm b/code/modules/mob/living/silicon/silicon_defense.dm index b7a669b4a2e62..73d6ac25bdd0f 100644 --- a/code/modules/mob/living/silicon/silicon_defense.dm +++ b/code/modules/mob/living/silicon/silicon_defense.dm @@ -18,7 +18,6 @@ flash_act(affect_silicon = 1) log_combat(user, src, "attacked") adjustBruteLoss(damage) - updatehealth() else playsound(loc, 'sound/weapons/slashmiss.ogg', 25, TRUE, -1) visible_message(span_danger("[user]'s swipe misses [src]!"), \ diff --git a/code/modules/mob/living/simple_animal/animal_defense.dm b/code/modules/mob/living/simple_animal/animal_defense.dm index 2fea2871c0388..baaf1b39b3c56 100644 --- a/code/modules/mob/living/simple_animal/animal_defense.dm +++ b/code/modules/mob/living/simple_animal/animal_defense.dm @@ -27,7 +27,6 @@ playsound(loc, attacked_sound, 25, TRUE, -1) apply_damage(harm_intent_damage) log_combat(user, src, "attacked") - updatehealth() return TRUE /mob/living/simple_animal/get_shoving_message(mob/living/shover, obj/item/weapon, shove_flags) diff --git a/code/modules/surgery/revival.dm b/code/modules/surgery/revival.dm index bda1aaaafef7f..e0111feb52231 100644 --- a/code/modules/surgery/revival.dm +++ b/code/modules/surgery/revival.dm @@ -104,8 +104,7 @@ span_notice("[user] send a powerful shock to [target]'s brain with [tool]..."), ) target.grab_ghost() - target.adjustOxyLoss(-50, 0) - target.updatehealth() + target.adjustOxyLoss(-50) if(iscarbon(target)) var/mob/living/carbon/carbon_target = target carbon_target.set_heartattack(FALSE) diff --git a/code/modules/transport/elevator/elev_music_zone.dm b/code/modules/transport/elevator/elev_music_zone.dm index 8379e742caea5..f5b3de8a67cc4 100644 --- a/code/modules/transport/elevator/elev_music_zone.dm +++ b/code/modules/transport/elevator/elev_music_zone.dm @@ -83,6 +83,8 @@ GLOBAL_LIST_EMPTY(elevator_music) /datum/proximity_monitor/advanced/elevator_music_area/field_turf_uncrossed(mob/exited, turf/old_location, turf/new_location) if (!(exited in tracked_mobs)) return + if ((new_location in field_turfs) || (new_location in edge_turfs)) + return qdel(tracked_mobs[exited]) tracked_mobs -= exited UnregisterSignal(exited, COMSIG_QDELETING) diff --git a/code/modules/vehicles/mecha/equipment/tools/work_tools.dm b/code/modules/vehicles/mecha/equipment/tools/work_tools.dm index c8e77f2e888e4..34216db38d3cd 100644 --- a/code/modules/vehicles/mecha/equipment/tools/work_tools.dm +++ b/code/modules/vehicles/mecha/equipment/tools/work_tools.dm @@ -120,7 +120,6 @@ if(isnull(victim)) //get gibbed stoopid return ..() victim.adjustOxyLoss(round(clamp_damage/2)) - victim.updatehealth() victim.visible_message(span_danger("[chassis] squeezes [victim]!"), \ span_userdanger("[chassis] squeezes you!"),\ span_hear("You hear something crack.")) diff --git a/html/changelogs/AutoChangeLog-pr-85290.yml b/html/changelogs/AutoChangeLog-pr-85290.yml new file mode 100644 index 0000000000000..f64fde94ba83b --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-85290.yml @@ -0,0 +1,4 @@ +author: "Ben10Omintrix" +delete-after: True +changes: + - refactor: "refactors pet collars and cultist pets into elements" \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-85473.yml b/html/changelogs/AutoChangeLog-pr-85473.yml new file mode 100644 index 0000000000000..d3f12bf94347d --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-85473.yml @@ -0,0 +1,4 @@ +author: "SmArtKar" +delete-after: True +changes: + - bugfix: "Bitrunning crate capture zones can no longer be destroyed" \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-85490.yml b/html/changelogs/AutoChangeLog-pr-85490.yml new file mode 100644 index 0000000000000..c86f16c571394 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-85490.yml @@ -0,0 +1,4 @@ +author: "Gaxeer" +delete-after: True +changes: + - rscdel: "Remove narsie and ratvar plushies from loadout" \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-85537.yml b/html/changelogs/AutoChangeLog-pr-85537.yml new file mode 100644 index 0000000000000..1f219cb2d5de6 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-85537.yml @@ -0,0 +1,4 @@ +author: "SmArtKar" +delete-after: True +changes: + - code_imp: "Removed multiple cases of unnecessary updatehealth" \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-85541.yml b/html/changelogs/AutoChangeLog-pr-85541.yml new file mode 100644 index 0000000000000..18374b79f2b44 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-85541.yml @@ -0,0 +1,4 @@ +author: "SmArtKar" +delete-after: True +changes: + - bugfix: "Elevator music no longer restarts when you take a step" \ No newline at end of file diff --git a/html/changelogs/archive/2024-08.yml b/html/changelogs/archive/2024-08.yml index 27ac50a47b3a1..0665fba035a2a 100644 --- a/html/changelogs/archive/2024-08.yml +++ b/html/changelogs/archive/2024-08.yml @@ -142,3 +142,20 @@ necromanceranne: - bugfix: Shoving someone onto a table now causes them to become vulnerable to being stunned. +2024-08-03: + Watermelon914: + - bugfix: Fixed an infinite TC glitch dupe + Y0SH1M4S73R: + - admin: The "Suppress Runtime Logging" toggle in the lua editor actually does what + it says +2024-08-05: + Ben10Omintrix: + - bugfix: juvenile lobstrosities will now look for food + OrionTheFox: + - image: added and updated belt/suit/mask storage sprites for several knives missing + them + SmArtKar: + - bugfix: Lizards no longer die from cold on icebox despite wearing insulation + - bugfix: Fixed handyman assistants spawning without a PDA + Y0SH1M4S73R: + - bugfix: lua scripting now works on linux diff --git a/icons/_nanomaps/Birdshot Station_nanomap_z1.png b/icons/_nanomaps/Birdshot Station_nanomap_z1.png index 79bd33a01f2ec..fc2fd5ff5fb2b 100644 Binary files a/icons/_nanomaps/Birdshot Station_nanomap_z1.png and b/icons/_nanomaps/Birdshot Station_nanomap_z1.png differ diff --git a/icons/_nanomaps/Ice Box Station_nanomap_z1.png b/icons/_nanomaps/Ice Box Station_nanomap_z1.png index 24e8ef0206521..00a5741f3ffe6 100644 Binary files a/icons/_nanomaps/Ice Box Station_nanomap_z1.png and b/icons/_nanomaps/Ice Box Station_nanomap_z1.png differ diff --git a/icons/_nanomaps/Ice Box Station_nanomap_z2.png b/icons/_nanomaps/Ice Box Station_nanomap_z2.png index f7d184081d732..fa355ee6a7c93 100644 Binary files a/icons/_nanomaps/Ice Box Station_nanomap_z2.png and b/icons/_nanomaps/Ice Box Station_nanomap_z2.png differ diff --git a/icons/_nanomaps/Ice Box Station_nanomap_z3.png b/icons/_nanomaps/Ice Box Station_nanomap_z3.png index 031bdf90557f1..ada28a2d694af 100644 Binary files a/icons/_nanomaps/Ice Box Station_nanomap_z3.png and b/icons/_nanomaps/Ice Box Station_nanomap_z3.png differ diff --git a/icons/_nanomaps/Meta Station_nanomap_z1.png b/icons/_nanomaps/Meta Station_nanomap_z1.png index 3b6392f9a4fa7..ddd86a2503162 100644 Binary files a/icons/_nanomaps/Meta Station_nanomap_z1.png and b/icons/_nanomaps/Meta Station_nanomap_z1.png differ diff --git a/icons/_nanomaps/NorthStar_nanomap_z2.png b/icons/_nanomaps/NorthStar_nanomap_z2.png index 04bbf32256e2f..51858a266832a 100644 Binary files a/icons/_nanomaps/NorthStar_nanomap_z2.png and b/icons/_nanomaps/NorthStar_nanomap_z2.png differ diff --git a/icons/_nanomaps/Tramstation_nanomap_z1.png b/icons/_nanomaps/Tramstation_nanomap_z1.png index a823333a26b89..942b6d8eb497e 100644 Binary files a/icons/_nanomaps/Tramstation_nanomap_z1.png and b/icons/_nanomaps/Tramstation_nanomap_z1.png differ diff --git a/icons/_nanomaps/Tramstation_nanomap_z2.png b/icons/_nanomaps/Tramstation_nanomap_z2.png index 45391df25aa1b..a3a42b2abb87c 100644 Binary files a/icons/_nanomaps/Tramstation_nanomap_z2.png and b/icons/_nanomaps/Tramstation_nanomap_z2.png differ diff --git a/icons/mob/clothing/belt.dmi b/icons/mob/clothing/belt.dmi index 4f844c4fa320f..724a29de21b0f 100644 Binary files a/icons/mob/clothing/belt.dmi and b/icons/mob/clothing/belt.dmi differ diff --git a/icons/mob/clothing/belt_mirror.dmi b/icons/mob/clothing/belt_mirror.dmi index 1138dffc8bd31..0507a0301944e 100644 Binary files a/icons/mob/clothing/belt_mirror.dmi and b/icons/mob/clothing/belt_mirror.dmi differ diff --git a/icons/mob/clothing/mask.dmi b/icons/mob/clothing/mask.dmi index 0dad7a30d0b23..ac40c153dd784 100644 Binary files a/icons/mob/clothing/mask.dmi and b/icons/mob/clothing/mask.dmi differ diff --git a/modular_bandastation/loadout/code/categories/pocket.dm b/modular_bandastation/loadout/code/categories/pocket.dm index b62f7f6a30e17..20be3ffed821a 100644 --- a/modular_bandastation/loadout/code/categories/pocket.dm +++ b/modular_bandastation/loadout/code/categories/pocket.dm @@ -33,9 +33,3 @@ /datum/loadout_item/pocket_items/plush/hampter_sec name = "Хамптер офицер" item_path = /obj/item/toy/plush/hampter/security - -/datum/loadout_item/pocket_items/plush/ratvar - donator_level = 3 - -/datum/loadout_item/pocket_items/plush/narsie - donator_level = 3 diff --git a/tgstation.dme b/tgstation.dme index 71f3e4ba28f7c..f80c5652d8048 100644 --- a/tgstation.dme +++ b/tgstation.dme @@ -1511,6 +1511,8 @@ #include "code\datums\elements\organ_set_bonus.dm" #include "code\datums\elements\permanent_fire_overlay.dm" #include "code\datums\elements\pet_bonus.dm" +#include "code\datums\elements\pet_collar.dm" +#include "code\datums\elements\pet_cult.dm" #include "code\datums\elements\plant_backfire.dm" #include "code\datums\elements\point_of_interest.dm" #include "code\datums\elements\poster_tearer.dm" @@ -4913,7 +4915,6 @@ #include "code\modules\mob\living\basic\pets\parrot\parrot_ai\parrot_hoarding.dm" #include "code\modules\mob\living\basic\pets\parrot\parrot_ai\parrot_perching.dm" #include "code\modules\mob\living\basic\pets\parrot\parrot_ai\parroting_action.dm" -#include "code\modules\mob\living\basic\pets\pet_cult\pet_cult.dm" #include "code\modules\mob\living\basic\pets\pet_cult\pet_cult_abilities.dm" #include "code\modules\mob\living\basic\pets\pet_cult\pet_cult_ai.dm" #include "code\modules\mob\living\basic\ruin_defender\cybersun_aicore.dm" diff --git a/tools/nanomap_renderer/nanomap-renderer b/tools/nanomap_renderer/nanomap-renderer index fa7ca86b20588..8f5dfdd19da9a 100755 Binary files a/tools/nanomap_renderer/nanomap-renderer and b/tools/nanomap_renderer/nanomap-renderer differ