mirror of
https://github.com/ParadiseSS13/Paradise.git
synced 2026-08-30 15:37:36 +01:00
Merge branch 'master' into runtime-fix-2
This commit is contained in:
@@ -117,7 +117,6 @@ GLOBAL_VAR_INIT(observer_default_invisibility, INVISIBILITY_OBSERVER)
|
||||
MA.blend_mode = COPY.blend_mode
|
||||
MA.color = COPY.color
|
||||
MA.dir = COPY.dir
|
||||
MA.gender = COPY.gender
|
||||
MA.icon = COPY.icon
|
||||
MA.icon_state = COPY.icon_state
|
||||
MA.layer = COPY.layer
|
||||
@@ -131,7 +130,6 @@ GLOBAL_VAR_INIT(observer_default_invisibility, INVISIBILITY_OBSERVER)
|
||||
if(!isicon(MA.icon) && !LAZYLEN(MA.overlays)) // Gibbing/dusting/melting removes the icon before ghostize()ing the mob, so we need to account for that
|
||||
MA.icon = initial(icon)
|
||||
MA.icon_state = initial(icon_state)
|
||||
MA.suffix = COPY.suffix
|
||||
MA.underlays = COPY.underlays
|
||||
|
||||
. = MA
|
||||
|
||||
@@ -90,7 +90,7 @@
|
||||
if(speaker_name != speaker.real_name && speaker.real_name)
|
||||
speaker_name = "[speaker.real_name] ([speaker_name])"
|
||||
track = "([ghost_follow_link(speaker, ghost=src)]) "
|
||||
if(client.prefs.toggles & CHAT_GHOSTEARS && speaker in view(src))
|
||||
if(client.prefs.toggles & CHAT_GHOSTEARS && (speaker in view(src)))
|
||||
message = "<b>[message]</b>"
|
||||
|
||||
if(!can_hear())
|
||||
|
||||
@@ -98,7 +98,9 @@
|
||||
if(!check_can_speak(speaker))
|
||||
return FALSE
|
||||
|
||||
log_say("([name]-HIVE) [message]", speaker)
|
||||
var/log_message = "([name]-HIVE) [message]"
|
||||
log_say(log_message, speaker)
|
||||
speaker.create_log(SAY_LOG, log_message)
|
||||
|
||||
if(!speaker_mask)
|
||||
speaker_mask = speaker.name
|
||||
@@ -605,7 +607,10 @@
|
||||
if(!message)
|
||||
return
|
||||
|
||||
log_say("(ROBOT) [message]", speaker)
|
||||
var/log_message = "(ROBOT) [message]"
|
||||
log_say(log_message, speaker)
|
||||
speaker.create_log(SAY_LOG, log_message)
|
||||
|
||||
var/message_start = "<i><span class='game say'>[name], <span class='name'>[speaker.name]</span>"
|
||||
var/message_body = "<span class='message'>[speaker.say_quote(message)],</i><span class='robot'>\"[message]\"</span></span></span>"
|
||||
|
||||
|
||||
@@ -83,7 +83,7 @@
|
||||
else //Maybe uses plasma in the future, although that wouldn't make any sense...
|
||||
leaping = 1
|
||||
update_icons()
|
||||
throw_at(A, MAX_ALIEN_LEAP_DIST, 1, spin = 0, diagonals_first = 1, callback = CALLBACK(src, .leap_end))
|
||||
throw_at(A, MAX_ALIEN_LEAP_DIST, 1, spin = 0, diagonals_first = 1, callback = CALLBACK(src, .proc/leap_end))
|
||||
|
||||
/mob/living/carbon/alien/humanoid/hunter/proc/leap_end()
|
||||
leaping = 0
|
||||
|
||||
@@ -2,7 +2,7 @@
|
||||
name = "alien"
|
||||
icon_state = "alien_s"
|
||||
|
||||
butcher_results = list(/obj/item/reagent_containers/food/snacks/xenomeat = 5, /obj/item/stack/sheet/animalhide/xeno = 1)
|
||||
butcher_results = list(/obj/item/reagent_containers/food/snacks/monstermeat/xenomeat= 5, /obj/item/stack/sheet/animalhide/xeno = 1)
|
||||
var/obj/item/r_store = null
|
||||
var/obj/item/l_store = null
|
||||
var/caste = ""
|
||||
|
||||
@@ -69,7 +69,7 @@
|
||||
|
||||
/mob/living/carbon/alien/humanoid/update_transform() //The old method of updating lying/standing was update_icons(). Aliens still expect that.
|
||||
if(lying > 0)
|
||||
lying = 90 //Anything else looks retarded
|
||||
lying = 90 //Anything else looks lousy
|
||||
..()
|
||||
update_icons()
|
||||
|
||||
|
||||
@@ -83,7 +83,7 @@
|
||||
return Attach(AM)
|
||||
return 0
|
||||
|
||||
/obj/item/clothing/mask/facehugger/throw_at(atom/target, range, speed)
|
||||
/obj/item/clothing/mask/facehugger/throw_at(atom/target, range, speed, mob/thrower, spin=1, diagonals_first = 0, datum/callback/callback, force)
|
||||
if(!..())
|
||||
return
|
||||
if(stat == CONSCIOUS)
|
||||
|
||||
@@ -110,7 +110,6 @@
|
||||
if(imprinted_master)
|
||||
to_chat(H, "<span class='biggerdanger'>You are permanently imprinted to [imprinted_master], obey [imprinted_master]'s every order and assist [imprinted_master.p_them()] in completing [imprinted_master.p_their()] goals at any cost.</span>")
|
||||
|
||||
|
||||
/obj/item/mmi/robotic_brain/proc/transfer_personality(mob/candidate)
|
||||
searching = FALSE
|
||||
brainmob.key = candidate.key
|
||||
@@ -206,6 +205,10 @@
|
||||
brainmob.container = src
|
||||
brainmob.stat = CONSCIOUS
|
||||
brainmob.SetSilence(0)
|
||||
brainmob.dna = new(brainmob)
|
||||
brainmob.dna.species = new /datum/species/machine() // Else it will default to human. And we don't want to clone IRC humans now do we?
|
||||
brainmob.dna.ResetSE()
|
||||
brainmob.dna.ResetUI()
|
||||
GLOB.dead_mob_list -= brainmob
|
||||
..()
|
||||
|
||||
|
||||
@@ -432,13 +432,8 @@ GLOBAL_LIST_INIT(ventcrawl_machinery, list(/obj/machinery/atmospherics/unary/ven
|
||||
|
||||
if(!vent_found)
|
||||
for(var/obj/machinery/atmospherics/machine in range(1,src))
|
||||
if(is_type_in_list(machine, GLOB.ventcrawl_machinery))
|
||||
if(is_type_in_list(machine, GLOB.ventcrawl_machinery) && machine.can_crawl_through())
|
||||
vent_found = machine
|
||||
|
||||
if(!vent_found.can_crawl_through())
|
||||
vent_found = null
|
||||
|
||||
if(vent_found)
|
||||
break
|
||||
|
||||
if(vent_found)
|
||||
|
||||
@@ -111,7 +111,7 @@
|
||||
var/obj/item/organ/external/O = get_organ(organ_name)
|
||||
|
||||
if(amount > 0)
|
||||
O.receive_damage(amount, 0, sharp=is_sharp(damage_source), used_weapon=damage_source, list(), FALSE, updating_health)
|
||||
O.receive_damage(amount, 0, sharp=is_sharp(damage_source), used_weapon=damage_source, forbidden_limbs = list(), ignore_resists=FALSE, updating_health=updating_health)
|
||||
else
|
||||
//if you don't want to heal robot organs, they you will have to check that yourself before using this proc.
|
||||
O.heal_damage(-amount, 0, internal = 0, robo_repair = O.is_robotic(), updating_health = updating_health)
|
||||
|
||||
@@ -23,7 +23,7 @@ GLOBAL_DATUM_INIT(default_martial_art, /datum/martial_art, new())
|
||||
var/backbag = 2 //Which backpack type the player has chosen. Nothing, Satchel or Backpack.
|
||||
|
||||
//Equipment slots
|
||||
var/obj/item/w_uniform = null
|
||||
var/obj/item/clothing/under/w_uniform = null
|
||||
var/obj/item/shoes = null
|
||||
var/obj/item/belt = null
|
||||
var/obj/item/gloves = null
|
||||
|
||||
@@ -313,6 +313,11 @@
|
||||
/mob/living/carbon/human/put_in_hands(obj/item/I)
|
||||
if(!I)
|
||||
return FALSE
|
||||
if(istype(I, /obj/item/stack))
|
||||
var/obj/item/stack/S = I
|
||||
if(S.amount == 0)
|
||||
qdel(I)
|
||||
return FALSE
|
||||
if(put_in_active_hand(I))
|
||||
return TRUE
|
||||
else if(put_in_inactive_hand(I))
|
||||
|
||||
@@ -897,7 +897,7 @@
|
||||
|
||||
// Not on the station or mining?
|
||||
var/turf/temp_turf = get_turf(remoteview_target)
|
||||
if(!temp_turf in config.contact_levels)
|
||||
if(!(temp_turf in config.contact_levels))
|
||||
to_chat(src, "<span class='alert'>Your psy-connection grows too faint to maintain!</span>")
|
||||
isRemoteObserve = 0
|
||||
|
||||
@@ -1123,4 +1123,4 @@
|
||||
|
||||
// Need this in species.
|
||||
//#undef HUMAN_MAX_OXYLOSS
|
||||
//#undef HUMAN_CRIT_MAX_OXYLOSS
|
||||
//#undef HUMAN_CRIT_MAX_OXYLOSS
|
||||
|
||||
@@ -347,7 +347,7 @@
|
||||
|
||||
if(H.LAssailant && ishuman(H.LAssailant)) //superheros still get the comical hit markers
|
||||
var/mob/living/carbon/human/A = H.LAssailant
|
||||
if(A.mind && A.mind in (SSticker.mode.superheroes || SSticker.mode.supervillains || SSticker.mode.greyshirts))
|
||||
if(A.mind && (A.mind in (SSticker.mode.superheroes) || SSticker.mode.supervillains || SSticker.mode.greyshirts))
|
||||
var/list/attack_bubble_recipients = list()
|
||||
var/mob/living/user
|
||||
for(var/mob/O in viewers(user, src))
|
||||
@@ -963,7 +963,7 @@ It'll return null if the organ doesn't correspond, so include null checks when u
|
||||
|
||||
/datum/species/proc/spec_hitby(atom/movable/AM, mob/living/carbon/human/H)
|
||||
|
||||
/datum/species/proc/spec_attacked_by(obj/item/I, mob/living/user, obj/item/bodypart/affecting, intent, mob/living/carbon/human/H)
|
||||
/datum/species/proc/spec_attacked_by(obj/item/I, mob/living/user, obj/item/organ/external/affecting, intent, mob/living/carbon/human/H)
|
||||
|
||||
/proc/get_random_species(species_name = FALSE) // Returns a random non black-listed or hazardous species, either as a string or datum
|
||||
var/static/list/random_species = list()
|
||||
|
||||
@@ -474,7 +474,7 @@
|
||||
if(P.is_reflectable)
|
||||
H.visible_message("<span class='danger'>The [P.name] gets reflected by [H]'s glass skin!</span>", \
|
||||
"<span class='userdanger'>The [P.name] gets reflected by [H]'s glass skin!</span>")
|
||||
|
||||
|
||||
P.reflect_back(H)
|
||||
|
||||
return FALSE
|
||||
@@ -534,7 +534,7 @@
|
||||
if(world.time > last_teleport + teleport_cooldown && M != H && M.a_intent != INTENT_HELP)
|
||||
reactive_teleport(H)
|
||||
|
||||
/datum/species/golem/bluespace/spec_attacked_by(obj/item/I, mob/living/user, obj/item/bodypart/affecting, intent, mob/living/carbon/human/H)
|
||||
/datum/species/golem/bluespace/spec_attacked_by(obj/item/I, mob/living/user, obj/item/organ/external/affecting, intent, mob/living/carbon/human/H)
|
||||
..()
|
||||
if(world.time > last_teleport + teleport_cooldown && user != H)
|
||||
reactive_teleport(H)
|
||||
@@ -654,7 +654,7 @@
|
||||
new/obj/item/grown/bananapeel/specialpeel(get_turf(H))
|
||||
last_banana = world.time
|
||||
|
||||
/datum/species/golem/bananium/spec_attacked_by(obj/item/I, mob/living/user, obj/item/bodypart/affecting, intent, mob/living/carbon/human/H)
|
||||
/datum/species/golem/bananium/spec_attacked_by(obj/item/I, mob/living/user, obj/item/organ/external/affecting, intent, mob/living/carbon/human/H)
|
||||
..()
|
||||
if(world.time > last_banana + banana_cooldown && user != H)
|
||||
new/obj/item/grown/bananapeel/specialpeel(get_turf(H))
|
||||
|
||||
@@ -18,6 +18,7 @@
|
||||
is_small = 1
|
||||
has_fine_manipulation = 0
|
||||
ventcrawler = VENTCRAWLER_NUDE
|
||||
dietflags = DIET_OMNI
|
||||
show_ssd = 0
|
||||
eyes = "blank_eyes"
|
||||
death_message = "lets out a faint chimper as it collapses and stops moving..."
|
||||
|
||||
@@ -575,7 +575,7 @@ GLOBAL_LIST_EMPTY(damage_icon_parts)
|
||||
bloodsies.color = w_uniform.blood_color
|
||||
standing.overlays += bloodsies
|
||||
|
||||
if(w_uniform:accessories.len) //WE CHECKED THE TYPE ABOVE. THIS REALLY SHOULD BE FINE. // oh my god kys whoever made this if statement jfc :gun:
|
||||
if(w_uniform.accessories.len) //WE CHECKED THE TYPE ABOVE. THIS REALLY SHOULD BE FINE. // oh my god kys whoever made this if statement jfc :gun:
|
||||
for(var/obj/item/clothing/accessory/A in w_uniform:accessories)
|
||||
var/tie_color = A.item_color
|
||||
if(!tie_color)
|
||||
|
||||
@@ -81,6 +81,7 @@
|
||||
update_canmove()
|
||||
|
||||
timeofdeath = world.time
|
||||
create_log(ATTACK_LOG, "died[gibbed ? " (Gibbed)": ""]")
|
||||
|
||||
GLOB.living_mob_list -= src
|
||||
GLOB.dead_mob_list += src
|
||||
|
||||
@@ -9,7 +9,6 @@
|
||||
prepare_data_huds()
|
||||
|
||||
/mob/living/proc/prepare_data_huds()
|
||||
..()
|
||||
med_hud_set_health()
|
||||
med_hud_set_status()
|
||||
|
||||
|
||||
@@ -177,6 +177,12 @@ proc/get_radio_key_from_channel(var/channel)
|
||||
if(handle_message_mode(message_mode, message_pieces, verb, used_radios))
|
||||
return 1
|
||||
|
||||
// Log of what we've said, plain message, no spans or junk
|
||||
// handle_message_mode should have logged this already if it handled it
|
||||
var/log_message = "[message_mode ? "([message_mode])" : ""] '[message]'"
|
||||
say_log += log_message
|
||||
create_log(SAY_LOG, log_message) // TODO after #13047: Include the channel
|
||||
log_say(log_message, src)
|
||||
|
||||
var/list/handle_v = handle_speech_sound()
|
||||
var/sound/speech_sound = handle_v[1]
|
||||
@@ -274,10 +280,6 @@ proc/get_radio_key_from_channel(var/channel)
|
||||
if(O) //It's possible that it could be deleted in the meantime.
|
||||
O.hear_talk(src, message_pieces, verb)
|
||||
|
||||
//Log of what we've said, plain message, no spans or junk
|
||||
say_log += message
|
||||
create_log(SAY_LOG, message) // TODO after #13047: Include the channel
|
||||
log_say(message, src)
|
||||
return 1
|
||||
|
||||
/obj/effect/speech_bubble
|
||||
|
||||
@@ -48,7 +48,7 @@
|
||||
if(radio)
|
||||
radio.wires.CutWireIndex(RADIO_WIRE_TRANSMIT)
|
||||
|
||||
if(camera && "Robots" in camera.network)
|
||||
if(camera && ("Robots" in camera.network))
|
||||
camera.network.Add("Engineering")
|
||||
|
||||
//They are unable to be upgraded, so let's give them a bit of a better battery.
|
||||
|
||||
@@ -30,29 +30,22 @@
|
||||
/obj/item/circuitboard,
|
||||
/obj/item/stack/tile/light,
|
||||
/obj/item/stack/ore/bluespace_crystal
|
||||
)
|
||||
)
|
||||
|
||||
//Item currently being held.
|
||||
var/obj/item/wrapped = null
|
||||
|
||||
/obj/item/gripper/paperwork
|
||||
name = "paperwork gripper"
|
||||
desc = "A simple grasping tool for clerical work."
|
||||
|
||||
can_hold = list(
|
||||
/obj/item/clipboard,
|
||||
/obj/item/paper,
|
||||
/obj/item/card/id
|
||||
)
|
||||
var/obj/item/gripped_item = null
|
||||
|
||||
/obj/item/gripper/medical
|
||||
name = "medical gripper"
|
||||
desc = "A grasping tool used to help patients up once surgery is complete."
|
||||
can_hold = list()
|
||||
|
||||
/obj/item/gripper/medical/afterattack(atom/target as mob|obj|turf|area, mob/living/user as mob|obj, proximity, params)
|
||||
/obj/item/gripper/medical/attack_self(mob/user)
|
||||
return
|
||||
|
||||
/obj/item/gripper/medical/afterattack(atom/target, mob/living/user, proximity, params)
|
||||
var/mob/living/carbon/human/H
|
||||
if(!wrapped && proximity && target && ishuman(target))
|
||||
if(!gripped_item && proximity && target && ishuman(target))
|
||||
H = target
|
||||
if(H.lying)
|
||||
H.AdjustSleeping(-5)
|
||||
@@ -71,98 +64,69 @@
|
||||
..()
|
||||
can_hold = typecacheof(can_hold)
|
||||
|
||||
/obj/item/gripper/attack_self(mob/user as mob)
|
||||
if(wrapped)
|
||||
wrapped.attack_self(user)
|
||||
|
||||
/obj/item/gripper/verb/drop_item()
|
||||
|
||||
set name = "Drop Gripped Item"
|
||||
set desc = "Release an item from your magnetic gripper."
|
||||
set category = "Drone"
|
||||
|
||||
drop_item_p()
|
||||
drop_gripped_item()
|
||||
|
||||
// The "p" stands for proc, since I was having annoying weird stuff happening with this in the verb
|
||||
// when trying to have default values for arguments and stuff
|
||||
/obj/item/gripper/proc/drop_item_p(var/silent = 0)
|
||||
/obj/item/gripper/attack_self(mob/user)
|
||||
if(gripped_item)
|
||||
gripped_item.attack_self(user)
|
||||
else
|
||||
to_chat(user, "<span class='warning'>[src] is empty.</span>")
|
||||
|
||||
if(!wrapped)
|
||||
//There's some weirdness with items being lost inside the arm. Trying to fix all cases. ~Z
|
||||
for(var/obj/item/thing in src.contents)
|
||||
thing.forceMove(get_turf(src))
|
||||
return
|
||||
/obj/item/gripper/proc/drop_gripped_item(silent = FALSE)
|
||||
if(gripped_item)
|
||||
if(!silent)
|
||||
to_chat(loc, "<span class='warning'>You drop [gripped_item].</span>")
|
||||
gripped_item.forceMove(get_turf(src))
|
||||
gripped_item = null
|
||||
|
||||
if(wrapped.loc != src)
|
||||
wrapped = null
|
||||
return
|
||||
|
||||
if(!silent)
|
||||
to_chat(src.loc, "<span class='warning'>You drop \the [wrapped].</span>")
|
||||
wrapped.forceMove(get_turf(src))
|
||||
wrapped = null
|
||||
|
||||
/obj/item/gripper/attack(mob/living/carbon/M as mob, mob/living/carbon/user as mob)
|
||||
/obj/item/gripper/attack(mob/living/carbon/M, mob/living/carbon/user)
|
||||
return
|
||||
|
||||
/obj/item/gripper/afterattack(atom/target as mob|obj|turf|area, mob/living/user as mob|obj, proximity, params)
|
||||
/// Grippers are snowflakey so this is needed to to prevent forceMoving grippers after `if(!user.drop_item())` checks done in certain attackby's.
|
||||
/obj/item/gripper/forceMove(atom/destination)
|
||||
return
|
||||
|
||||
/obj/item/gripper/afterattack(atom/target, mob/living/user, proximity, params)
|
||||
|
||||
if(!target || !proximity) //Target is invalid or we are not adjacent.
|
||||
return
|
||||
return FALSE
|
||||
|
||||
//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
|
||||
if(gripped_item) //Already have an item.
|
||||
|
||||
if(wrapped) //Already have an item.
|
||||
|
||||
//Temporary put wrapped into user so target's attackby() checks pass.
|
||||
wrapped.forceMove(user)
|
||||
|
||||
//Pass the attack on to the target. This might delete/relocate wrapped.
|
||||
if(!target.attackby(wrapped, user, params) && target && wrapped)
|
||||
// If the attackby didn't resolve or delete the target or wrapped, afterattack
|
||||
//Pass the attack on to the target. This might delete/relocate gripped_item.
|
||||
if(!target.attackby(gripped_item, user, params))
|
||||
// If the attackby didn't resolve or delete the target or gripped_item, afterattack
|
||||
// (Certain things, such as mountable frames, rely on afterattack)
|
||||
wrapped.afterattack(target, user, 1, params)
|
||||
gripped_item?.afterattack(target, user, 1, params)
|
||||
|
||||
//If wrapped did neither get deleted nor put into target, put it back into the gripper.
|
||||
if(wrapped && user && (wrapped.loc == user))
|
||||
wrapped.forceMove(src)
|
||||
else
|
||||
wrapped = null
|
||||
return
|
||||
|
||||
else if(istype(target,/obj/item)) //Check that we're not pocketing a mob.
|
||||
|
||||
//...and that the item is not in a container.
|
||||
if(!isturf(target.loc))
|
||||
return
|
||||
//If gripped_item either didn't get deleted, or it failed to be transfered to its target
|
||||
if(!gripped_item && contents.len)
|
||||
gripped_item = contents[1]
|
||||
return FALSE
|
||||
else if(gripped_item && !contents.len)
|
||||
gripped_item = null
|
||||
|
||||
else if(istype(target, /obj/item)) //Check that we're not pocketing a mob.
|
||||
var/obj/item/I = target
|
||||
|
||||
//Check if the item is blacklisted.
|
||||
var/grab = 0
|
||||
if(can_hold.len)
|
||||
if(is_type_in_typecache(I, can_hold))
|
||||
grab = 1
|
||||
|
||||
//We can grab the item, finally.
|
||||
if(grab)
|
||||
to_chat(user, "You collect \the [I].")
|
||||
if(is_type_in_typecache(I, can_hold)) // Make sure the item is something the gripper can hold
|
||||
to_chat(user, "<span class='notice'>You collect [I].</span>")
|
||||
I.forceMove(src)
|
||||
wrapped = I
|
||||
return
|
||||
gripped_item = I
|
||||
else
|
||||
to_chat(user, "<span class='warning'>Your gripper cannot hold \the [target].</span>")
|
||||
to_chat(user, "<span class='warning'>Your gripper cannot hold [target].</span>")
|
||||
return FALSE
|
||||
|
||||
else if(istype(target,/obj/machinery/power/apc))
|
||||
var/obj/machinery/power/apc/A = target
|
||||
if(A.opened)
|
||||
if(A.cell)
|
||||
|
||||
wrapped = A.cell
|
||||
gripped_item = A.cell
|
||||
|
||||
A.cell.add_fingerprint(user)
|
||||
A.cell.update_icon()
|
||||
@@ -173,6 +137,7 @@
|
||||
A.update_icon()
|
||||
|
||||
user.visible_message("<span class='warning'>[user] removes the power cell from [A]!</span>", "You remove the power cell.")
|
||||
return TRUE
|
||||
|
||||
//TODO: Matter decompiler.
|
||||
/obj/item/matter_decompiler
|
||||
|
||||
@@ -115,11 +115,11 @@
|
||||
return 0
|
||||
|
||||
/mob/living/silicon/robot/drop_item()
|
||||
var/obj/item/I = get_active_hand()
|
||||
if(istype(I, /obj/item/gripper))
|
||||
var/obj/item/gripper/G = I
|
||||
G.drop_item_p(silent = 1)
|
||||
return
|
||||
var/obj/item/gripper/G = get_active_hand()
|
||||
if(istype(G))
|
||||
G.drop_gripped_item(silent = TRUE)
|
||||
return TRUE // The gripper is special because it has a normal item inside that we can drop.
|
||||
return FALSE // All robot inventory items have NODROP, so they should return FALSE.
|
||||
|
||||
//Helper procs for cyborg modules on the UI.
|
||||
//These are hackish but they help clean up code elsewhere.
|
||||
|
||||
@@ -328,7 +328,7 @@ GLOBAL_LIST_INIT(robot_verbs_default, list(
|
||||
if("Miner")
|
||||
module = new /obj/item/robot_module/miner(src)
|
||||
module.channels = list("Supply" = 1)
|
||||
if(camera && "Robots" in camera.network)
|
||||
if(camera && ("Robots" in camera.network))
|
||||
camera.network.Add("Mining Outpost")
|
||||
module_sprites["Basic"] = "Miner_old"
|
||||
module_sprites["Advanced Droid"] = "droid-miner"
|
||||
@@ -340,7 +340,7 @@ GLOBAL_LIST_INIT(robot_verbs_default, list(
|
||||
if("Medical")
|
||||
module = new /obj/item/robot_module/medical(src)
|
||||
module.channels = list("Medical" = 1)
|
||||
if(camera && "Robots" in camera.network)
|
||||
if(camera && ("Robots" in camera.network))
|
||||
camera.network.Add("Medical")
|
||||
module_sprites["Basic"] = "Medbot"
|
||||
module_sprites["Surgeon"] = "surgeon"
|
||||
@@ -366,7 +366,7 @@ GLOBAL_LIST_INIT(robot_verbs_default, list(
|
||||
if("Engineering")
|
||||
module = new /obj/item/robot_module/engineering(src)
|
||||
module.channels = list("Engineering" = 1)
|
||||
if(camera && "Robots" in camera.network)
|
||||
if(camera && ("Robots" in camera.network))
|
||||
camera.network.Add("Engineering")
|
||||
module_sprites["Basic"] = "Engineering"
|
||||
module_sprites["Antique"] = "engineerrobot"
|
||||
@@ -1472,3 +1472,12 @@ GLOBAL_LIST_INIT(robot_verbs_default, list(
|
||||
|
||||
SEND_SIGNAL(src, COMSIG_MOB_UPDATE_SIGHT)
|
||||
sync_lighting_plane_alpha()
|
||||
|
||||
/// Used in `robot_bindings.dm` when the user presses "A" if on AZERTY mode, or "Q" on QWERTY mode.
|
||||
/mob/living/silicon/robot/proc/on_drop_hotkey_press()
|
||||
var/obj/item/gripper/G = get_active_hand()
|
||||
if(istype(G) && G.gripped_item)
|
||||
G.drop_gripped_item() // if the active module is a gripper, try to drop its held item.
|
||||
else
|
||||
uneq_active() // else unequip the module and put it back into the robot's inventory.
|
||||
return
|
||||
|
||||
@@ -230,7 +230,7 @@
|
||||
/obj/item/robot_module/engineering/handle_death()
|
||||
var/obj/item/gripper/G = locate(/obj/item/gripper) in modules
|
||||
if(G)
|
||||
G.drop_item()
|
||||
G.drop_gripped_item(silent = TRUE)
|
||||
|
||||
/obj/item/robot_module/security
|
||||
name = "security robot module"
|
||||
@@ -578,7 +578,7 @@
|
||||
/obj/item/robot_module/drone/handle_death()
|
||||
var/obj/item/gripper/G = locate(/obj/item/gripper) in modules
|
||||
if(G)
|
||||
G.drop_item()
|
||||
G.drop_gripped_item(silent = TRUE)
|
||||
|
||||
//checks whether this item is a module of the robot it is located in.
|
||||
/obj/item/proc/is_robot_module()
|
||||
|
||||
@@ -11,7 +11,7 @@
|
||||
response_disarm = "shoves"
|
||||
response_harm = "hits"
|
||||
speed = 0
|
||||
butcher_results = list(/obj/item/reagent_containers/food/snacks/xenomeat = 3, /obj/item/stack/sheet/animalhide/xeno = 1)
|
||||
butcher_results = list(/obj/item/reagent_containers/food/snacks/monstermeat/xenomeat= 3, /obj/item/stack/sheet/animalhide/xeno = 1)
|
||||
maxHealth = 125
|
||||
health = 125
|
||||
harm_intent_damage = 5
|
||||
@@ -83,7 +83,7 @@
|
||||
retreat_distance = 5
|
||||
minimum_distance = 5
|
||||
move_to_delay = 4
|
||||
butcher_results = list(/obj/item/reagent_containers/food/snacks/xenomeat = 4, /obj/item/stack/sheet/animalhide/xeno = 1)
|
||||
butcher_results = list(/obj/item/reagent_containers/food/snacks/monstermeat/xenomeat= 4, /obj/item/stack/sheet/animalhide/xeno = 1)
|
||||
projectiletype = /obj/item/projectile/neurotox
|
||||
projectilesound = 'sound/weapons/pierce.ogg'
|
||||
status_flags = 0
|
||||
@@ -130,7 +130,7 @@
|
||||
move_to_delay = 4
|
||||
maxHealth = 400
|
||||
health = 400
|
||||
butcher_results = list(/obj/item/reagent_containers/food/snacks/xenomeat = 10, /obj/item/stack/sheet/animalhide/xeno = 2)
|
||||
butcher_results = list(/obj/item/reagent_containers/food/snacks/monstermeat/xenomeat= 10, /obj/item/stack/sheet/animalhide/xeno = 2)
|
||||
mob_size = MOB_SIZE_LARGE
|
||||
gold_core_spawnable = NO_SPAWN
|
||||
|
||||
|
||||
@@ -13,7 +13,7 @@
|
||||
speak_chance = 1
|
||||
turns_per_move = 5
|
||||
see_in_dark = 6
|
||||
butcher_results = list(/obj/item/reagent_containers/food/snacks/bearmeat = 5, /obj/item/clothing/head/bearpelt = 1)
|
||||
butcher_results = list(/obj/item/reagent_containers/food/snacks/monstermeat/bearmeat= 5, /obj/item/clothing/head/bearpelt = 1)
|
||||
response_help = "pets"
|
||||
response_disarm = "gently pushes aside"
|
||||
response_harm = "hits"
|
||||
|
||||
@@ -74,12 +74,11 @@
|
||||
else
|
||||
our_color = pick(carp_colors)
|
||||
add_atom_colour(carp_colors[our_color], FIXED_COLOUR_PRIORITY)
|
||||
add_carp_overlay()
|
||||
regenerate_icons()
|
||||
|
||||
/mob/living/simple_animal/hostile/carp/proc/add_carp_overlay()
|
||||
if(!random_color)
|
||||
return
|
||||
cut_overlays()
|
||||
var/mutable_appearance/base_overlay = mutable_appearance(icon, "base_mouth")
|
||||
base_overlay.appearance_flags = RESET_COLOR
|
||||
add_overlay(base_overlay)
|
||||
@@ -87,7 +86,6 @@
|
||||
/mob/living/simple_animal/hostile/carp/proc/add_dead_carp_overlay()
|
||||
if(!random_color)
|
||||
return
|
||||
cut_overlays()
|
||||
var/mutable_appearance/base_dead_overlay = mutable_appearance(icon, "base_dead_mouth")
|
||||
base_dead_overlay.appearance_flags = RESET_COLOR
|
||||
add_overlay(base_dead_overlay)
|
||||
@@ -103,24 +101,22 @@
|
||||
|
||||
/mob/living/simple_animal/hostile/carp/death(gibbed)
|
||||
. = ..()
|
||||
cut_overlays()
|
||||
if(!random_color || gibbed)
|
||||
return
|
||||
add_dead_carp_overlay()
|
||||
regenerate_icons()
|
||||
|
||||
/mob/living/simple_animal/hostile/carp/revive()
|
||||
..()
|
||||
regenerate_icons()
|
||||
|
||||
/mob/living/simple_animal/hostile/carp/regenerate_icons()
|
||||
cut_overlays()
|
||||
..()
|
||||
if(!random_color)
|
||||
return
|
||||
if(stat != DEAD)
|
||||
add_carp_overlay()
|
||||
else
|
||||
add_dead_carp_overlay()
|
||||
..()
|
||||
|
||||
/mob/living/simple_animal/hostile/carp/holocarp
|
||||
icon_state = "holocarp"
|
||||
|
||||
@@ -285,7 +285,7 @@
|
||||
|
||||
if(prob(6))
|
||||
for(var/turf/simulated/floor/O in range(src, 6))
|
||||
O.MakeSlippery(TURF_WET_WATER, 10)
|
||||
O.MakeSlippery(TURF_WET_WATER, 10 SECONDS)
|
||||
playsound(src, 'sound/effects/clownstep1.ogg', 30, 1)
|
||||
|
||||
if(prob(5))
|
||||
@@ -323,7 +323,7 @@
|
||||
if(!eating)
|
||||
addtimer(CALLBACK(src, /mob/living/simple_animal/hostile/floor_cluwne/.proc/Grab, H), 70)
|
||||
for(var/turf/simulated/floor/O in range(src, 6))
|
||||
O.MakeSlippery(TURF_WET_LUBE, 20)
|
||||
O.MakeSlippery(TURF_WET_LUBE, 20 SECONDS)
|
||||
playsound(src, 'sound/effects/meteorimpact.ogg', 30, 1)
|
||||
|
||||
eating = TRUE
|
||||
|
||||
@@ -18,7 +18,7 @@
|
||||
turns_per_move = 5
|
||||
see_in_dark = 8
|
||||
lighting_alpha = LIGHTING_PLANE_ALPHA_MOSTLY_VISIBLE
|
||||
butcher_results = list(/obj/item/reagent_containers/food/snacks/spidermeat = 2, /obj/item/reagent_containers/food/snacks/spiderleg = 8)
|
||||
butcher_results = list(/obj/item/reagent_containers/food/snacks/monstermeat/spidermeat= 2, /obj/item/reagent_containers/food/snacks/monstermeat/spiderleg= 8)
|
||||
response_help = "pets"
|
||||
response_disarm = "gently pushes aside"
|
||||
response_harm = "hits"
|
||||
@@ -53,7 +53,7 @@
|
||||
icon_state = "nurse"
|
||||
icon_living = "nurse"
|
||||
icon_dead = "nurse_dead"
|
||||
butcher_results = list(/obj/item/reagent_containers/food/snacks/spidermeat = 2, /obj/item/reagent_containers/food/snacks/spiderleg = 8, /obj/item/reagent_containers/food/snacks/spidereggs = 4)
|
||||
butcher_results = list(/obj/item/reagent_containers/food/snacks/monstermeat/spidermeat= 2, /obj/item/reagent_containers/food/snacks/monstermeat/spiderleg= 8, /obj/item/reagent_containers/food/snacks/monstermeat/spidereggs= 4)
|
||||
|
||||
maxHealth = 40
|
||||
health = 40
|
||||
|
||||
@@ -91,7 +91,7 @@
|
||||
else
|
||||
devour(L)
|
||||
|
||||
/mob/living/simple_animal/hostile/megafauna/onShuttleMove()
|
||||
/mob/living/simple_animal/hostile/megafauna/onShuttleMove(turf/oldT, turf/T1, rotation, mob/caller)
|
||||
var/turf/oldloc = loc
|
||||
. = ..()
|
||||
if(!.)
|
||||
@@ -100,7 +100,7 @@
|
||||
message_admins("Megafauna [src] \
|
||||
([ADMIN_FLW(src,"FLW")]) \
|
||||
moved via shuttle from ([oldloc.x], [oldloc.y], [oldloc.z]) to \
|
||||
([newloc.x], [newloc.y], [newloc.z])")
|
||||
([newloc.x], [newloc.y], [newloc.z])[caller ? " called by [ADMIN_LOOKUP(caller)]" : ""]")
|
||||
|
||||
/mob/living/simple_animal/hostile/megafauna/proc/devour(mob/living/L)
|
||||
if(!L)
|
||||
|
||||
@@ -89,7 +89,7 @@
|
||||
throw_message = "does nothing to the tough hide of the"
|
||||
pre_attack_icon = "goliath2"
|
||||
crusher_loot = /obj/item/crusher_trophy/goliath_tentacle
|
||||
butcher_results = list(/obj/item/reagent_containers/food/snacks/goliath = 2, /obj/item/stack/sheet/animalhide/goliath_hide = 1, /obj/item/stack/sheet/bone = 2)
|
||||
butcher_results = list(/obj/item/reagent_containers/food/snacks/monstermeat/goliath= 2, /obj/item/stack/sheet/animalhide/goliath_hide = 1, /obj/item/stack/sheet/bone = 2)
|
||||
loot = list()
|
||||
stat_attack = UNCONSCIOUS
|
||||
robust_searching = TRUE
|
||||
@@ -113,7 +113,7 @@
|
||||
pre_attack_icon = "Goliath_preattack"
|
||||
throw_message = "does nothing to the rocky hide of the"
|
||||
loot = list(/obj/item/stack/sheet/animalhide/goliath_hide) //A throwback to the asteroid days
|
||||
butcher_results = list(/obj/item/reagent_containers/food/snacks/goliath = 2, /obj/item/stack/sheet/bone = 2)
|
||||
butcher_results = list(/obj/item/reagent_containers/food/snacks/monstermeat/goliath= 2, /obj/item/stack/sheet/bone = 2)
|
||||
crusher_drop_mod = 30
|
||||
wander = FALSE
|
||||
var/list/cached_tentacle_turfs
|
||||
|
||||
@@ -50,10 +50,9 @@
|
||||
return ..()
|
||||
|
||||
/mob/living/simple_animal/hostile/asteroid/gutlunch/regenerate_icons()
|
||||
cut_overlays()
|
||||
..()
|
||||
if(udder.reagents.total_volume == udder.reagents.maximum_volume)
|
||||
add_overlay("gl_full")
|
||||
..()
|
||||
|
||||
/mob/living/simple_animal/hostile/asteroid/gutlunch/attackby(obj/item/O, mob/user, params)
|
||||
if(stat == CONSCIOUS && istype(O, /obj/item/reagent_containers/glass))
|
||||
|
||||
@@ -184,7 +184,7 @@
|
||||
if(L == user)
|
||||
continue
|
||||
var/turf/T = get_turf(L.loc)
|
||||
if(T && T in targets)
|
||||
if(T && (T in targets))
|
||||
L.EyeBlind(4)
|
||||
return
|
||||
|
||||
|
||||
@@ -374,11 +374,11 @@
|
||||
return
|
||||
return
|
||||
|
||||
if(parrot_interest && parrot_interest in view(src))
|
||||
if(parrot_interest && (parrot_interest in view(src)))
|
||||
parrot_state = PARROT_SWOOP | PARROT_STEAL
|
||||
return
|
||||
|
||||
if(parrot_perch && parrot_perch in view(src))
|
||||
if(parrot_perch && (parrot_perch in view(src)))
|
||||
parrot_state = PARROT_SWOOP | PARROT_RETURN
|
||||
return
|
||||
|
||||
|
||||
@@ -609,7 +609,7 @@
|
||||
real_name = P.tagname
|
||||
|
||||
/mob/living/simple_animal/regenerate_icons()
|
||||
cut_overlays()
|
||||
if(pcollar && collar_type)
|
||||
cut_overlays()
|
||||
add_overlay("[collar_type]collar")
|
||||
add_overlay("[collar_type]tag")
|
||||
|
||||
@@ -121,7 +121,7 @@
|
||||
set_colour(pick(slime_colours))
|
||||
|
||||
/mob/living/simple_animal/slime/regenerate_icons()
|
||||
cut_overlays()
|
||||
..()
|
||||
var/icon_text = "[colour] [is_adult ? "adult" : "baby"] slime"
|
||||
icon_dead = "[icon_text] dead"
|
||||
if(stat != DEAD)
|
||||
@@ -130,7 +130,6 @@
|
||||
add_overlay("aslime-[mood]")
|
||||
else
|
||||
icon_state = icon_dead
|
||||
..()
|
||||
|
||||
/mob/living/simple_animal/slime/movement_delay()
|
||||
if(bodytemperature >= 330.23) // 135 F or 57.08 C
|
||||
@@ -262,7 +261,7 @@
|
||||
Feedon(Food)
|
||||
return ..()
|
||||
|
||||
/mob/living/simple_animal/slime/unEquip(obj/item/I)
|
||||
/mob/living/simple_animal/slime/unEquip(obj/item/I, force)
|
||||
return
|
||||
|
||||
/mob/living/simple_animal/slime/start_pulling(atom/movable/AM, state, force = move_force, supress_message = FALSE)
|
||||
|
||||
@@ -60,7 +60,6 @@ GLOBAL_VAR_INIT(totaltribbles, 0) //global variable so it updates for all trib
|
||||
|
||||
|
||||
/mob/living/simple_animal/tribble/proc/procreate()
|
||||
..()
|
||||
if(GLOB.totaltribbles <= maxtribbles)
|
||||
for(var/mob/living/simple_animal/tribble/F in src.loc)
|
||||
if(!F || F == src)
|
||||
|
||||
@@ -7,7 +7,7 @@
|
||||
else if(stat == UNCONSCIOUS)
|
||||
return 0
|
||||
create_attack_log("<font color='red'>Fallen unconscious at [atom_loc_line(get_turf(src))]</font>")
|
||||
add_attack_logs(src, null, "Fallen unconscious")
|
||||
add_attack_logs(src, null, "Fallen unconscious", ATKLOG_ALL)
|
||||
log_game("[key_name(src)] fell unconscious at [atom_loc_line(get_turf(src))]")
|
||||
stat = UNCONSCIOUS
|
||||
if(updating)
|
||||
@@ -23,7 +23,7 @@
|
||||
else if(stat == CONSCIOUS)
|
||||
return 0
|
||||
create_attack_log("<font color='red'>Woken up at [atom_loc_line(get_turf(src))]</font>")
|
||||
add_attack_logs(src, null, "Woken up")
|
||||
add_attack_logs(src, null, "Woken up", ATKLOG_ALL)
|
||||
log_game("[key_name(src)] woke up at [atom_loc_line(get_turf(src))]")
|
||||
stat = CONSCIOUS
|
||||
if(updating)
|
||||
@@ -47,7 +47,7 @@
|
||||
if(!can_be_revived())
|
||||
return 0
|
||||
create_attack_log("<font color='red'>Came back to life at [atom_loc_line(get_turf(src))]</font>")
|
||||
add_attack_logs(src, null, "Came back to life")
|
||||
add_attack_logs(src, null, "Came back to life", ATKLOG_ALL)
|
||||
log_game("[key_name(src)] came back to life at [atom_loc_line(get_turf(src))]")
|
||||
stat = CONSCIOUS
|
||||
GLOB.dead_mob_list -= src
|
||||
@@ -76,4 +76,4 @@
|
||||
return 1
|
||||
|
||||
/mob/living/proc/check_death_method()
|
||||
return TRUE
|
||||
return TRUE
|
||||
|
||||
@@ -384,7 +384,7 @@
|
||||
if(GLOB.summon_magic_triggered)
|
||||
give_magic(character)
|
||||
|
||||
if(!thisjob.is_position_available() && thisjob in SSjobs.prioritized_jobs)
|
||||
if(!thisjob.is_position_available() && (thisjob in SSjobs.prioritized_jobs))
|
||||
SSjobs.prioritized_jobs -= thisjob
|
||||
qdel(src)
|
||||
|
||||
|
||||
@@ -42,8 +42,8 @@
|
||||
|
||||
// Show expired polls. Non admins can view admin polls at this stage
|
||||
// (just like tgstation's web interface so don't complain)
|
||||
// (Also why was there no ingame interface tg not having an ingame
|
||||
// interface is retarded because it cucks downstreams)
|
||||
// (Also why was there no ingame interface? tg not having an ingame
|
||||
// interface is a pain in the neck because it means downstreams have to roll their own)
|
||||
select_query = GLOB.dbcon.NewQuery("SELECT id, question FROM [format_table_name("poll_question")] WHERE Now() > endtime ORDER BY id DESC")
|
||||
select_query.Execute()
|
||||
|
||||
|
||||
@@ -200,7 +200,7 @@
|
||||
name = "Emo"
|
||||
icon_state = "emo"
|
||||
|
||||
/datum/sprite_accessory/hair/fag
|
||||
/datum/sprite_accessory/hair/flow
|
||||
name = "Flow Hair"
|
||||
icon_state = "flow"
|
||||
|
||||
|
||||
Reference in New Issue
Block a user