Merge branch 'master' into final_away_maps_additions

# Conflicts:
#	code/__defines/misc.dm
#	code/modules/client/preference_setup/loadout/loadout_xeno/tajara.dm
#	icons/mob/head.dmi
#	maps/exodus/code/exodus.dm
This commit is contained in:
alberyk
2022-04-04 19:47:58 -03:00
100 changed files with 1824 additions and 447407 deletions
@@ -1734,7 +1734,7 @@ Follow by example and make good judgement based on length which list to include
icon = 'icons/mob/hair_gradients.dmi'
species_allowed = list(/datum/species/human,/datum/species/human/offworlder,/datum/species/machine/shell,/datum/species/machine/shell/rogue,/datum/species/zombie,
/datum/species/tajaran,/datum/species/tajaran/zhan_khazan,/datum/species/tajaran/m_sai,/datum/species/zombie/tajara,
/datum/species/skrell, /datum/species/skrell/axiori, /datum/species/zombie/skrell, /datum/species/bug, /datum/species/bug/type_b)
/datum/species/skrell, /datum/species/skrell/axiori, /datum/species/zombie/skrell, /datum/species/bug, /datum/species/bug/type_b, /datum/species/unathi,/datum/species/zombie/unathi)
none
name = "None"
@@ -2267,6 +2267,18 @@ Follow by example and make good judgement based on length which list to include
length = 0
chatname = "lump"
una_droopy
name = "Unathi Droopy Dorsal Frill"
icon_state = "unathi_droopydorsal"
length = 0
chatname = "droopy frill"
una_regal
name = "Unathi Regal Frills"
icon_state = "unathi_regalfrills"
length = 6
chatname = "massive frills"
//skrell tentacles
@@ -3305,6 +3317,14 @@ Follow by example and make good judgement based on length which list to include
name = "Unathi Pachy Boss"
icon_state = "pachylump"
una_droopy
name = "Unathi Droopy Dorsal Frill"
icon_state = "unathi_droopydorsal"
una_regal
name = "Unathi Regal Frills"
icon_state = "unathi_regalfrills"
//ipc screens
ipc_screen_blank
+2
View File
@@ -294,6 +294,8 @@
src.show_message(message)
/mob/proc/hear_sleep(var/message)
if (isdeaf(src))
return
var/heard = ""
if(prob(15))
var/list/punctuation = list(",", "!", ".", ";", "?")
@@ -1257,6 +1257,11 @@
custom_pain("You feel a stabbing pain in your chest!", 50)
L.bruise()
/mob/living/carbon/human/proc/is_lung_rescued()
var/species_organ = species.breathing_organ
var/obj/item/organ/internal/lungs/L = internal_organs_by_name[species_organ]
return L && L.rescued
//returns 1 if made bloody, returns 0 otherwise
/mob/living/carbon/human/add_blood(mob/living/carbon/C as mob)
if (!..())
@@ -146,6 +146,10 @@
return
last_x = x
last_y = y
if(shoes)
var/obj/item/clothing/shoes/S = shoes
if(S.do_special_footsteps(m_intent))
return
if (m_intent == M_RUN)
playsound(src, is_noisy ? footsound : species.footsound, 70, 1, required_asfx_toggles = ASFX_FOOTSTEPS)
else
@@ -287,6 +287,10 @@
/mob/living/silicon/robot/drone/updatename()
return
/mob/living/silicon/robot/drone/setup_icon_cache()
setup_eye_cache()
setup_panel_cache()
/mob/living/silicon/robot/drone/setup_eye_cache()
cached_eye_overlays = list(
I_HELP = image(icon, "[icon_state]-eyes_help"),
@@ -3,10 +3,6 @@
//Returns the thing in our active hand (whatever is in our active module-slot, in this case)
/mob/living/silicon/robot/get_active_hand()
if(istype(module_active, /obj/item/gripper))
var/obj/item/gripper/G = module_active
if(G.wrapped)
return G.wrapped
return module_active
/mob/living/silicon/robot/proc/return_wirecutter()
@@ -54,7 +54,7 @@
return FALSE
return TRUE
/obj/item/gripper/proc/grip_item(var/obj/item/I, var/mob/user, var/feedback = 1)
/obj/item/gripper/proc/grip_item(var/obj/item/I, var/mob/user, var/feedback = TRUE)
//This function returns 1 if we successfully took the item, or 0 if it was invalid. This information is useful to the caller
if(!wrapped)
if((can_hold && is_type_in_list(I, can_hold)) || (cant_hold && !is_type_in_list(I, cant_hold)))
@@ -125,14 +125,14 @@
update_icon()
return TRUE
/obj/item/gripper/attack(mob/living/carbon/M, mob/living/carbon/user)
/obj/item/gripper/attack(mob/M, mob/user)
if(wrapped) //The force of the wrapped obj gets set to zero during the attack() and afterattack().
force_holder = wrapped.force
wrapped.force = 0
wrapped.attack(M,user)
var/resolved = wrapped.attack(M,user)
if(QDELETED(wrapped))
wrapped = null
return TRUE
drop(get_turf(src), user, FALSE)
return resolved
else // mob interactions
switch(user.a_intent)
if(I_HELP)
@@ -148,26 +148,23 @@
/obj/item/gripper/attackby(obj/item/O, mob/user)
if(wrapped)
if(O == wrapped)
attack_self(user) //Allows gripper to be clicked to use item.
attack_self(user) //Allows gripper to be clicked to use item.
return
var/resolved = wrapped.attackby(O,user)
if(!resolved && wrapped && O)
O.afterattack(wrapped, user ,1)//We pass along things targeting the gripper, to objects inside the gripper. So that we can draw chemicals from held beakers for instance
if(!resolved)
O.afterattack(wrapped, user, TRUE)//We pass along things targeting the gripper, to objects inside the gripper. So that we can draw chemicals from held beakers for instance
return
/obj/item/gripper/afterattack(var/atom/target, var/mob/living/user, proximity, params)
if(!proximity)
return // This will prevent them using guns at range but adminbuse can add them directly to modules, so eh.
//There's some weirdness with items being lost inside the arm. Trying to fix all cases. ~Z
if(!wrapped)
for(var/obj/item/thing in src.contents)
wrapped = thing
break
return
if(wrapped) //Already have an item.
return //This is handled in /mob/living/silicon/robot/GripperClickOn
wrapped.afterattack(target, user, TRUE, params)
if(QDELETED(wrapped))
drop(get_turf(src), user, FALSE)
else if(istype(target, /obj/item/storage) && !istype(target, /obj/item/storage/pill_bottle) && !istype(target, /obj/item/storage/secure))
for(var/obj/item/C in target.contents)
if(grip_item(C, user, 0))
for(var/obj/item/C in target)
if(grip_item(C, user, FALSE))
to_chat(user, SPAN_NOTICE("You grab \the [C] from inside \the [target.name]."))
return
to_chat(user, SPAN_NOTICE("There is nothing inside the box that your gripper can collect."))
@@ -183,6 +180,12 @@
target.attack_ai(user)
just_dropped = FALSE
/obj/item/gripper/resolve_attackby(atom/A, mob/user, var/click_parameters)
if(wrapped)
return wrapped.resolve_attackby(A, user, click_parameters)
else
. = ..()
/*
//Definitions of gripper subtypes
*/
@@ -334,4 +337,4 @@
/obj/item/storage,
/obj/item/modular_computer,
/obj/item/card/id
)
)
@@ -842,6 +842,7 @@ var/global/list/robot_modules = list(
modules += new /obj/item/device/flash(src) // Non-lethal tool that prevents any 'borg from going lethal on Crew so long as it's an option according to laws.
modules += new /obj/item/crowbar/robotic(src) // Base crowbar that all 'borgs should have access to.
modules += new /obj/item/storage/part_replacer(src)
modules += new /obj/item/device/multitool/robotic(src) // To enable them to connect machines that require multitools e.g. tech-processors
emag = new /obj/item/hand_tele(src)
var/datum/matter_synth/nanite = new /datum/matter_synth/nanite(10000)
@@ -27,9 +27,9 @@
var/image/blood_overlay
var/bleeding = FALSE
var/blood_amount = 50 // set a limit to the amount of blood it can bleed, otherwise it will keep bleeding forever and crunk the server
var/blood_amount = 20 // set a limit to the amount of blood it can bleed, otherwise it will keep bleeding forever and crunk the server
var/previous_bleed_timer = 0 // they only bleed for as many seconds as force damage was applied to them
var/blood_timer_mod = 1 // tweak to change the amount of seconds a mob will bleed
var/blood_timer_mod = 0.25 // tweak to change the amount of seconds a mob will bleed
var/list/speak = list()
var/speak_chance = 0
+7 -2
View File
@@ -818,6 +818,9 @@
stat("Game ID", game_id)
stat("Map", current_map.full_name)
stat("Current Space Sector", SSatlas.current_sector.name)
var/current_month = text2num(time2text(world.realtime, "MM"))
var/current_day = text2num(time2text(world.realtime, "DD"))
stat("Current Date", "[current_day]/[current_month]/[game_year]")
stat("Station Time", worldtime2text())
stat("Round Duration", get_round_duration_formatted())
stat("Last Transfer Vote", SSvote.last_transfer_vote ? time2text(SSvote.last_transfer_vote, "hh:mm") : "Never")
@@ -953,13 +956,15 @@
/mob/proc/facedir(var/ndir)
if(!canface() || (client && client.moving) || (client && world.time < client.move_delay))
if(!canface() || (client && client.moving))
return 0
if(facing_dir != ndir)
facing_dir = null
set_dir(ndir)
if(buckled_to && buckled_to.buckle_movable)
buckled_to.set_dir(ndir)
if (client)//Fixing a ton of runtime errors that came from checking client vars on an NPC
client.move_delay += movement_delay()
setMoveCooldown(movement_delay())
return 1