Merge remote-tracking branch 'upstream/master'

This commit is contained in:
Mosley
2025-04-24 17:03:15 -05:00
402 changed files with 2262 additions and 1524 deletions
+6 -6
View File
@@ -89,20 +89,20 @@ INITIALIZE_IMMEDIATE(/mob/dead)
if(alert(src, "Jump to server [pick] ([addr])?", "Server Hop", "Yes", "No") != "Yes")
return
var/client/C = client
to_chat(C, "<span class='notice'>Sending you to [pick].</span>")
new /atom/movable/screen/splash(C)
var/client/hopper = client
to_chat(hopper, "<span class='notice'>Sending you to [pick].</span>")
new /atom/movable/screen/splash(null, src, hopper, FALSE)
mob_transforming = TRUE
sleep(29) //let the animation play
sleep(2.9 SECONDS) //let the animation play
mob_transforming = FALSE
if(!C)
if(!hopper)
return
winset(src, null, "command=.options") //other wise the user never knows if byond is downloading resources
C << link("[addr]")
hopper << link("[addr]")
/mob/dead/proc/update_z(new_z) // 1+ to register, null to unregister
if (registered_z != new_z)
@@ -41,7 +41,3 @@
else
postfix = "soon"
to_chat(src, "Please set up your character and select \"Ready\". The game will start [postfix].")
var/datum/hud/new_player/NH = hud_used
if(istype(NH))
NH.populate_buttons(src)
@@ -27,7 +27,7 @@
/mob/dead/new_player/Initialize(mapload)
if(client && SSticker.state == GAME_STATE_STARTUP)
var/atom/movable/screen/splash/S = new(client, TRUE, TRUE)
var/atom/movable/screen/splash/S = new(null, null, client, TRUE)
S.Fade(TRUE)
if(length(GLOB.newplayer_start))
@@ -496,7 +496,7 @@
if(job && !job.override_latejoin_spawn(character))
SSjob.SendToLateJoin(character)
if(!arrivals_docked)
var/atom/movable/screen/splash/Spl = new(character.client, TRUE)
var/atom/movable/screen/splash/Spl = new(null, character, character.client, TRUE)
Spl.Fade(TRUE)
character.playsound_local(get_turf(character), 'sound/voice/ApproachingTG.ogg', 25)
-4
View File
@@ -794,10 +794,6 @@
else
hud_used.healths.icon_state = "health7"
/mob/living/carbon/proc/update_internals_hud_icon(internal_state = 0)
if(hud_used && hud_used.internals)
hud_used.internals.icon_state = "internal[internal_state]"
/mob/living/carbon/update_stat()
if(status_flags & GODMODE)
return
+23 -17
View File
@@ -50,22 +50,15 @@
//accessory
var/accessory_msg
if(istype(w_uniform, /obj/item/clothing/under))
var/obj/item/clothing/under/U = w_uniform
if(length(U.attached_accessories) && !(U.flags_inv & HIDEACCESSORY))
var/list/weehoo = list()
var/dumb_icons = ""
for(var/obj/item/clothing/accessory/attached_accessory in U.attached_accessories)
if(!(attached_accessory.flags_inv & HIDEACCESSORY))
weehoo += "\a [attached_accessory]"
dumb_icons = "[dumb_icons][icon2html(attached_accessory, user)]"
if(length(weehoo))
accessory_msg += " with [dumb_icons]"
if(length(U.attached_accessories) >= 2)
accessory_msg += jointext(weehoo, ", ", 1, length(weehoo) - 1)
accessory_msg += " and [weehoo[length(weehoo)]]"
else
accessory_msg += weehoo[1]
var/obj/item/clothing/under/worn_thing = w_uniform
if(!CHECK_BITFIELD(worn_thing.flags_inv, HIDEACCESSORY))
var/list/accessory_preparation
for(var/obj/item/clothing/accessory/attached_accessory as anything in worn_thing.attached_accessories)
if(CHECK_BITFIELD(attached_accessory.flags_inv, HIDEACCESSORY))
continue
LAZYADD(accessory_preparation, "[icon2html(attached_accessory, user)] [attached_accessory]")
if(length(accessory_preparation))
accessory_msg = " with [english_list(accessory_preparation)]"
. += "[t_He] [t_is] wearing [w_uniform.get_examine_string(user)][accessory_msg]."
//head
@@ -88,7 +81,20 @@
//gloves
if(gloves && !(ITEM_SLOT_GLOVES in obscured))
. += "[t_He] [t_has] [gloves.get_examine_string(user)] on [t_his] hands."
//accessory
var/accessory_msg
if(istype(gloves, /obj/item/clothing/gloves))
var/obj/item/clothing/gloves/worn_thing = gloves
if(!CHECK_BITFIELD(worn_thing.flags_inv, HIDEACCESSORY))
var/list/accessory_preparation
for(var/obj/item/clothing/accessory/ring/attached_accessory as anything in worn_thing.attached_accessories)
if(CHECK_BITFIELD(attached_accessory.flags_inv, HIDEACCESSORY))
continue
LAZYADD(accessory_preparation, "[icon2html(attached_accessory, user)] [attached_accessory]")
if(length(accessory_preparation))
accessory_msg = " with [english_list(accessory_preparation)] on [t_his] fingers"
. += "[t_He] [t_has] [gloves.get_examine_string(user)] on [t_his] hands[accessory_msg]."
else if(length(blood_DNA))
var/hand_number = get_num_arms(FALSE)
if(hand_number)
@@ -678,11 +678,11 @@
if(hal_screwyhud == SCREWYHUD_HEALTHY)
icon_num = 0
if(icon_num)
hud_used.healthdoll.add_overlay(mutable_appearance('icons/mob/screen_gen.dmi', "[BP.body_zone][icon_num]"))
hud_used.healthdoll.add_overlay(mutable_appearance(ui_style_modular(hud_used.ui_style, "health"), "[BP.body_zone][icon_num]"))
for(var/t in get_missing_limbs()) //Missing limbs
hud_used.healthdoll.add_overlay(mutable_appearance('icons/mob/screen_gen.dmi', "[t]6"))
hud_used.healthdoll.add_overlay(mutable_appearance(ui_style_modular(hud_used.ui_style, "health"), "[t]6"))
for(var/t in get_disabled_limbs()) //Disabled limbs
hud_used.healthdoll.add_overlay(mutable_appearance('icons/mob/screen_gen.dmi', "[t]7"))
hud_used.healthdoll.add_overlay(mutable_appearance(ui_style_modular(hud_used.ui_style, "health"), "[t]7"))
else
hud_used.healthdoll.icon_state = "healthdoll_DEAD"
@@ -6,6 +6,7 @@
can_buckle = TRUE
buckle_lying = FALSE
mob_biotypes = MOB_ORGANIC|MOB_HUMANOID
initial_language_holder = /datum/language_holder/empty // We get stuff from our species
/// Enable stamina combat
combat_flags = COMBAT_FLAGS_STAMINA_COMBAT | COMBAT_FLAG_UNARMED_PARRY
status_flags = CANSTUN|CANKNOCKDOWN|CANUNCONSCIOUS|CANPUSH|CANSTAGGER
@@ -292,12 +292,9 @@ GLOBAL_LIST_INIT(strippable_human_items, create_strippable_list(list(
if(carbon_source.internal)
carbon_source.internal = null
// This isn't meant to be FALSE, it correlates to the icon's name.
carbon_source.update_internals_hud_icon(0)
else if (!QDELETED(item))
if(internals || carbon_source.getorganslot(ORGAN_SLOT_BREATHING_TUBE))
carbon_source.internal = item
carbon_source.update_internals_hud_icon(1)
carbon_source.visible_message(
span_danger("[user] [isnull(carbon_source.internal) ? "closes": "opens"] the valve on [source]'s [item.name]."),
@@ -319,7 +319,6 @@
if((C.flags_inv & (HIDEHAIR|HIDEFACIALHAIR)) || (initial(C.flags_inv) & (HIDEHAIR|HIDEFACIALHAIR)))
update_hair()
if(toggle_off && internal && !getorganslot(ORGAN_SLOT_BREATHING_TUBE))
update_internals_hud_icon(0)
internal = null
if(C.flags_inv & HIDEEYES)
update_inv_glasses()
+15 -11
View File
@@ -90,8 +90,10 @@ GLOBAL_LIST_EMPTY(roundstart_race_names)
var/dangerous_existence //A flag for transformation spells that tells them "hey if you turn a person into one of these without preperation, they'll probably die!"
///Affects the speech message, for example: Motharula flutters, "My speech message is flutters!"
var/say_mod = "says"
///What languages this species can understand and say. Use a [language holder datum][/datum/language_holder] in this var.
var/species_language_holder = /datum/language_holder
/// What languages this species can understand and say.
/// Use a [language holder datum][/datum/language_holder] typepath in this var.
/// Should never be null.
var/datum/language_holder/species_language_holder = /datum/language_holder/human_basic
/**
* Visible CURRENT bodyparts that are unique to a species.
* DO NOT USE THIS AS A LIST OF ALL POSSIBLE BODYPARTS AS IT WILL FUCK
@@ -558,6 +560,16 @@ GLOBAL_LIST_EMPTY(roundstart_race_names)
for(var/obj/item/bodypart/B in C.bodyparts)
B.change_bodypart_status(BODYPART_HYBRID, FALSE, TRUE) // Makes all Bodyparts 'robotic'.
// All languages associated with this language holder are added with source [LANGUAGE_SPECIES]
// rather than source [LANGUAGE_ATOM], so we can track what to remove if our species changes again
var/datum/language_holder/gaining_holder = GLOB.prototype_language_holders[species_language_holder]
for(var/language in gaining_holder.understood_languages)
C.grant_language(language, UNDERSTOOD_LANGUAGE, LANGUAGE_SPECIES)
for(var/language in gaining_holder.spoken_languages)
C.grant_language(language, SPOKEN_LANGUAGE, LANGUAGE_SPECIES)
for(var/language in gaining_holder.blocked_languages)
C.add_blocked_language(language, LANGUAGE_SPECIES)
SEND_SIGNAL(C, COMSIG_SPECIES_GAIN, src, old_species)
/datum/species/proc/update_species_slowdown(mob/living/carbon/human/H)
@@ -1650,15 +1662,7 @@ GLOBAL_LIST_EMPTY(roundstart_race_names)
H.Jitter(5)
hunger_rate = 3 * HUNGER_FACTOR
hunger_rate *= H.physiology.hunger_mod
// SANDSTORM EDIT
if (H.client)
H.adjust_nutrition(-hunger_rate)
else
// Do not allow SSD players to get too hungry.
if (H.nutrition >= NUTRITION_LEVEL_FED)
H.adjust_nutrition(-hunger_rate)
// End of sandstorm edit
H.adjust_nutrition(-hunger_rate)
if (H.nutrition > NUTRITION_LEVEL_FULL)
@@ -70,7 +70,6 @@
H.equipOutfit(O, visualsOnly)
H.internal = H.get_item_for_held_index(2)
H.update_internals_hud_icon(1)
return FALSE
/datum/species/plasmaman/random_name(gender,unique,lastname)
@@ -34,11 +34,11 @@
/mob/living/carbon/human/set_drugginess(amount)
..()
if(!amount)
remove_language(/datum/language/beachbum, TRUE, TRUE, LANGUAGE_HIGH)
remove_language(/datum/language/beachbum, source = LANGUAGE_HIGH)
/mob/living/carbon/human/adjust_drugginess(amount)
..()
if(druggy)
grant_language(/datum/language/beachbum, TRUE, TRUE, LANGUAGE_HIGH)
grant_language(/datum/language/beachbum, source = LANGUAGE_HIGH)
else
remove_language(/datum/language/beachbum, TRUE, TRUE, LANGUAGE_HIGH)
remove_language(/datum/language/beachbum, source = LANGUAGE_HIGH)
-3
View File
@@ -340,12 +340,9 @@
if(internal)
if(internal.loc != src)
internal = null
update_internals_hud_icon(0)
else if (!internals && !getorganslot(ORGAN_SLOT_BREATHING_TUBE))
internal = null
update_internals_hud_icon(0)
else
update_internals_hud_icon(1)
. = internal.remove_air_volume(volume_needed)
if(!.)
return FALSE //to differentiate between no internals and active, but empty internals
@@ -397,7 +397,7 @@
return ..()
/mob/living/carbon/monkey/hitby(atom/movable/hitting_atom, skipcatch = FALSE, hitpush = TRUE, blocked = FALSE, datum/thrownthing/throwingdatum)
if(istype(hitting_atom, /obj/item))
if(isitem(hitting_atom))
var/obj/item/item_hitby = hitting_atom
var/mob/thrown_by = item_hitby.thrownby?.resolve()
if(item_hitby.throwforce < src.health && thrown_by && ishuman(thrown_by))
+8 -3
View File
@@ -107,14 +107,17 @@
return FALSE
/mob/living/hitby(atom/movable/AM, skipcatch, hitpush = TRUE, blocked = FALSE, datum/thrownthing/throwingdatum)
var/zone = ran_zone(BODY_ZONE_CHEST, 65)//Hits a random part of the body, geared towards the chest
if(!isitem(AM))
// Filled with made up numbers for non-items.
if(mob_run_block(AM, 30, "\the [AM.name]", ATTACK_TYPE_THROWN, 0, throwingdatum?.thrower, throwingdatum?.thrower?.zone_selected, list()))
if(mob_run_block(AM, 30, "\the [AM.name]", ATTACK_TYPE_THROWN, 0, throwingdatum?.thrower, throwingdatum?.thrower?.zone_selected, list()) & BLOCK_SUCCESS)
hitpush = FALSE
skipcatch = TRUE
blocked = TRUE
return TRUE
else
playsound(loc, 'sound/weapons/genhit.ogg', 50, TRUE, -1) //Item sounds are handled in the item itself
log_combat(AM, src, "hit ")
return ..()
var/obj/item/thrown_item = AM
@@ -126,18 +129,20 @@
skipcatch = TRUE
blocked = TRUE
var/zone = ran_zone(BODY_ZONE_CHEST, 65)//Hits a random part of the body, geared towards the chest
// zone moved up because things need it early while checking it from the thrower is unnecessary
var/nosell_hit = SEND_SIGNAL(thrown_item, COMSIG_MOVABLE_IMPACT_ZONE, src, zone, throwingdatum, blocked, FALSE)
if(nosell_hit)
skipcatch = TRUE
hitpush = FALSE
if(blocked)
return TRUE
return BLOCK_SUCCESS
var/mob/thrown_by = thrown_item.thrownby?.resolve()
if(thrown_by)
log_combat(thrown_by, src, "threw and hit", thrown_item)
else
log_combat(thrown_item, src, "hit ")
if(nosell_hit)
return ..()
visible_message(span_danger("[src] is hit by [thrown_item]!"), \
-5
View File
@@ -501,8 +501,3 @@ GLOBAL_LIST_INIT(department_radio_keys, list(
// End of Skyrat edits
/mob/living/whisper(message, bubble_type, list/spans = list(), sanitize = TRUE, datum/language/language = null, ignore_spam = FALSE, forced = null)
say("#[message]", bubble_type, spans, sanitize, language, ignore_spam, forced)
/mob/living/get_language_holder(get_minds = TRUE)
if(get_minds && mind)
return mind.get_language_holder()
. = ..()
@@ -6,7 +6,7 @@
var/highlighted = FALSE
var/mob/camera/aiEye/pic_in_pic/aiEye
/atom/movable/screen/movable/pic_in_pic/ai/Initialize(mapload)
/atom/movable/screen/movable/pic_in_pic/ai/Initialize(mapload, datum/hud/hud_owner)
. = ..()
aiEye = new /mob/camera/aiEye/pic_in_pic()
aiEye.screen = src
@@ -138,13 +138,11 @@
var/datum/action/innate/pai/light/AL = new /datum/action/innate/pai/light
var/datum/action/innate/custom_holoform/custom_holoform = new /datum/action/innate/custom_holoform
var/datum/action/language_menu/ALM = new
SW.Grant(src)
AS.Grant(src)
AC.Grant(src)
AR.Grant(src)
AL.Grant(src)
ALM.Grant(src)
custom_holoform.Grant(src)
emitter_next_use = world.time + 10 SECONDS
@@ -270,7 +270,7 @@
encryptmod = TRUE
if("translator")
if(href_list["toggle"]) //This is permanent.
grant_all_languages(TRUE, TRUE, TRUE, LANGUAGE_SOFTWARE)
grant_all_languages(source = LANGUAGE_SOFTWARE)
if("doorjack")
if(href_list["jack"])
if(cable && cable.machine)
@@ -24,9 +24,9 @@
robot_modules_background.layer = HUD_LAYER //Objects that appear on screen are on layer ABOVE_HUD_LAYER, UI should be just below it.
robot_modules_background.plane = HUD_PLANE
inv1 = new /atom/movable/screen/robot/module1()
inv2 = new /atom/movable/screen/robot/module2()
inv3 = new /atom/movable/screen/robot/module3()
inv1 = new /atom/movable/screen/robot/module1(null, src)
inv2 = new /atom/movable/screen/robot/module2(null, src)
inv3 = new /atom/movable/screen/robot/module3(null, src)
ident = rand(1, 999)
@@ -139,7 +139,7 @@
/mob/living/simple_animal/bot/honkbot/hitby(atom/movable/hitting_atom, skipcatch = FALSE, hitpush = TRUE, blocked = FALSE, datum/thrownthing/throwingdatum)
if(istype(hitting_atom, /obj/item))
if(isitem(hitting_atom))
playsound(src, honksound, 50, TRUE, -1)
var/obj/item/item_hitby = hitting_atom
var/mob/thrown_by = item_hitby.thrownby?.resolve()
@@ -352,7 +352,7 @@
/mob/living/simple_animal/bot/secbot/hitby(atom/movable/hitting_atom, skipcatch = FALSE, hitpush = TRUE, blocked = FALSE, datum/thrownthing/throwingdatum)
if(istype(hitting_atom, /obj/item))
if(isitem(hitting_atom))
var/obj/item/item_hitby = hitting_atom
var/mob/thrown_by = item_hitby.thrownby?.resolve()
if(item_hitby.throwforce < src.health && thrown_by && ishuman(thrown_by))
@@ -44,13 +44,13 @@
visible_message("<span class='danger'>[P] has a reduced effect on [src]!</span>")
return ..()
/mob/living/simple_animal/hostile/asteroid/hitby(atom/movable/AM, skipcatch = FALSE, hitpush = TRUE, blocked = FALSE, datum/thrownthing/throwingdatum)//No floor tiling them to death, wiseguy
if(istype(AM, /obj/item))
var/obj/item/T = AM
/mob/living/simple_animal/hostile/asteroid/hitby(atom/movable/hitting_atom, skipcatch = FALSE, hitpush = TRUE, blocked = FALSE, datum/thrownthing/throwingdatum)//No floor tiling them to death, wiseguy
if(isitem(hitting_atom))
var/obj/item/item_hitby = hitting_atom
if(!stat)
Aggro()
if(T.throwforce <= 20)
visible_message(span_notice("The [T.name] [throw_message] [src.name]!"))
if(item_hitby.throwforce <= 20)
visible_message(span_notice("\The [item_hitby] [throw_message] [src]!"))
return
..()
@@ -180,11 +180,11 @@
if(M.a_intent == INTENT_HARM)
Bruise()
/mob/living/simple_animal/hostile/mushroom/hitby(atom/movable/AM, skipcatch = FALSE, hitpush = TRUE, blocked = FALSE, datum/thrownthing/throwingdatum)
/mob/living/simple_animal/hostile/mushroom/hitby(atom/movable/hitting_atom, skipcatch = FALSE, hitpush = TRUE, blocked = FALSE, datum/thrownthing/throwingdatum)
..()
if(istype(AM, /obj/item))
var/obj/item/T = AM
if(T.throwforce)
if(isitem(hitting_atom))
var/obj/item/item_hitby = hitting_atom
if(item_hitby.throwforce)
Bruise()
/mob/living/simple_animal/hostile/mushroom/bullet_act(obj/item/projectile/P)
+3 -4
View File
@@ -49,7 +49,7 @@
dispose_rendering()
qdel(hud_used)
QDEL_LIST(client_colours)
ghostize(can_reenter_corpse = FALSE) //False, since we're deleting it currently
ghostize()
if(mind?.current == src) //Let's just be safe yeah? This will occasionally be cleared, but not always. Can't do it with ghostize without changing behavior
mind.set_current(null)
// if(mock_client)
@@ -1051,12 +1051,11 @@ GLOBAL_VAR_INIT(exploit_warn_spam_prevention, 0)
//Do not do parent's actions, as we *usually* do this differently.
fully_replace_character_name(real_name, new_name)
/mob/verb/open_language_menu()
/mob/verb/open_language_menu_verb()
set name = "Open Language Menu"
set category = "IC"
var/datum/language_holder/H = get_language_holder()
H.open_language_menu(usr)
get_language_holder().open_language_menu(usr)
///Adjust the nutrition of a mob
/mob/proc/adjust_nutrition(change, max = INFINITY) //Honestly FUCK the oldcoders for putting nutrition on /mob someone else can move it up because holy hell I'd have to fix SO many typechecks
+1 -1
View File
@@ -308,7 +308,7 @@ It's fairly easy to fix if dealing with single letters but not so much with comp
a_intent = possible_a_intents[current_intent]
if(hud_used && hud_used.action_intent)
hud_used.action_intent.icon_state = "[a_intent]"
hud_used.action_intent.update_icon()
/proc/is_blind(A)
-1
View File
@@ -438,7 +438,6 @@
mind.transfer_to(new_xeno)
else
transfer_ckey(new_xeno)
update_atom_languages()
to_chat(new_xeno, "<B>You are now an alien.</B>")
. = new_xeno