Merge branch 'master' into runtime-fix-2

This commit is contained in:
farie82
2020-04-19 00:01:37 +02:00
committed by GitHub
234 changed files with 789 additions and 656 deletions
@@ -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
+1 -1
View File
@@ -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())
+7 -2
View File
@@ -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
..()
+1 -6
View File
@@ -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))
+2 -2
View File
@@ -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)
+1
View File
@@ -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
-1
View File
@@ -9,7 +9,6 @@
prepare_data_huds()
/mob/living/proc/prepare_data_huds()
..()
med_hud_set_health()
med_hud_set_status()
+6 -4
View File
@@ -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.
+12 -3
View File
@@ -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)
+4 -4
View File
@@ -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
+1 -1
View File
@@ -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)
+2 -2
View File
@@ -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"