mirror of
https://github.com/ParadiseSS13/Paradise.git
synced 2026-08-27 14:07:51 +01:00
Merge remote-tracking branch 'upstream/master' into wires-tgui
This commit is contained in:
@@ -53,7 +53,6 @@ GLOBAL_VAR_INIT(observer_default_invisibility, INVISIBILITY_OBSERVER)
|
||||
if(ismob(body))
|
||||
T = get_turf(body) //Where is the body located?
|
||||
attack_log_old = body.attack_log_old //preserve our attack logs by copying them to our ghost
|
||||
logs = body.logs.Copy()
|
||||
|
||||
var/mutable_appearance/MA = copy_appearance(body)
|
||||
if(body.mind && body.mind.name)
|
||||
|
||||
@@ -47,7 +47,7 @@
|
||||
. = trim(. + trim(msg))
|
||||
. += "\""
|
||||
|
||||
/mob/proc/hear_say(list/message_pieces, verb = "says", italics = 0, mob/speaker = null, sound/speech_sound, sound_vol, sound_frequency)
|
||||
/mob/proc/hear_say(list/message_pieces, verb = "says", italics = 0, mob/speaker = null, sound/speech_sound, sound_vol, sound_frequency, use_voice = TRUE)
|
||||
if(!client)
|
||||
return 0
|
||||
|
||||
@@ -74,7 +74,7 @@
|
||||
return 0
|
||||
|
||||
var/speaker_name = speaker.name
|
||||
if(ishuman(speaker))
|
||||
if(use_voice && ishuman(speaker))
|
||||
var/mob/living/carbon/human/H = speaker
|
||||
speaker_name = H.GetVoice()
|
||||
|
||||
@@ -99,9 +99,9 @@
|
||||
if(speaker == src)
|
||||
to_chat(src, "<span class='warning'>You cannot hear yourself speak!</span>")
|
||||
else
|
||||
to_chat(src, "<span class='name'>[speaker_name]</span>[speaker.GetAltName()] talks but you cannot hear [speaker.p_them()].")
|
||||
to_chat(src, "<span class='name'>[speaker.name]</span> talks but you cannot hear [speaker.p_them()].")
|
||||
else
|
||||
to_chat(src, "<span class='game say'><span class='name'>[speaker_name]</span>[speaker.GetAltName()] [track][message]</span>")
|
||||
to_chat(src, "<span class='game say'><span class='name'>[speaker_name]</span>[use_voice ? speaker.GetAltName() : ""] [track][message]</span>")
|
||||
if(speech_sound && (get_dist(speaker, src) <= world.view && src.z == speaker.z))
|
||||
var/turf/source = speaker? get_turf(speaker) : get_turf(src)
|
||||
playsound_local(source, speech_sound, sound_vol, 1, sound_frequency)
|
||||
|
||||
@@ -81,7 +81,7 @@
|
||||
/mob/living/carbon/alien/larva/show_inv(mob/user as mob)
|
||||
return
|
||||
|
||||
/mob/living/carbon/alien/larva/start_pulling(atom/movable/AM, state, force = move_force, supress_message = FALSE)
|
||||
/mob/living/carbon/alien/larva/start_pulling(atom/movable/AM, state, force = pull_force, show_message = FALSE)
|
||||
return FALSE
|
||||
|
||||
/* Commented out because it's duplicated in life.dm
|
||||
|
||||
@@ -70,7 +70,7 @@
|
||||
return
|
||||
polling = 1
|
||||
spawn()
|
||||
var/list/candidates = pollCandidates("Do you want to play as an alien?", ROLE_ALIEN, 0)
|
||||
var/list/candidates = SSghost_spawns.poll_candidates("Do you want to play as an alien?", ROLE_ALIEN, FALSE, source = /mob/living/carbon/alien/larva)
|
||||
var/mob/C = null
|
||||
|
||||
// To stop clientless larva, we will check that our host has a client
|
||||
|
||||
@@ -1447,12 +1447,13 @@
|
||||
var/obj/item/organ/internal/eyes/eyes = get_int_organ(/obj/item/organ/internal/eyes)
|
||||
var/obj/item/organ/internal/cyberimp/eyes/eye_implant = get_int_organ(/obj/item/organ/internal/cyberimp/eyes)
|
||||
if(istype(dna.species) && dna.species.eyes)
|
||||
var/icon/eyes_icon = new /icon('icons/mob/human_face.dmi', dna.species.eyes)
|
||||
var/icon/eyes_icon
|
||||
if(eye_implant) //Eye implants override native DNA eye colo(u)r
|
||||
eyes_icon = eye_implant.generate_icon()
|
||||
else if(eyes)
|
||||
eyes_icon = eyes.generate_icon()
|
||||
else //Error 404: Eyes not found!
|
||||
eyes_icon = new('icons/mob/human_face.dmi', dna.species.eyes)
|
||||
eyes_icon.Blend("#800000", ICON_ADD)
|
||||
|
||||
return eyes_icon
|
||||
|
||||
@@ -273,11 +273,6 @@ GLOBAL_LIST_EMPTY(damage_icon_parts)
|
||||
overlays_standing[UNDERWEAR_LAYER] = mutable_appearance(underwear_standing, layer = -UNDERWEAR_LAYER)
|
||||
apply_overlay(UNDERWEAR_LAYER)
|
||||
|
||||
if(lip_style && (LIPS in dna.species.species_traits))
|
||||
var/mutable_appearance/lips = mutable_appearance('icons/mob/human_face.dmi', "lips_[lip_style]_s")
|
||||
lips.color = lip_color
|
||||
standing += lips
|
||||
|
||||
overlays_standing[BODY_LAYER] = standing
|
||||
apply_overlay(BODY_LAYER)
|
||||
//tail
|
||||
@@ -1303,6 +1298,11 @@ GLOBAL_LIST_EMPTY(damage_icon_parts)
|
||||
else
|
||||
. += "#000000"
|
||||
|
||||
if(lip_color && (LIPS in dna.species.species_traits))
|
||||
. += "[lip_color]"
|
||||
else
|
||||
. += "#000000"
|
||||
|
||||
for(var/organ_tag in dna.species.has_limbs)
|
||||
var/obj/item/organ/external/part = bodyparts_by_name[organ_tag]
|
||||
if(isnull(part))
|
||||
|
||||
@@ -3,8 +3,29 @@
|
||||
var/datum/atom_hud/data/human/medical/advanced/medhud = GLOB.huds[DATA_HUD_MEDICAL_ADVANCED]
|
||||
medhud.add_to_hud(src)
|
||||
faction += "\ref[src]"
|
||||
determine_move_and_pull_forces()
|
||||
GLOB.mob_living_list += src
|
||||
|
||||
// Used to determine the forces dependend on the mob size
|
||||
// Will only change the force if the force was not set in the mob type itself
|
||||
/mob/living/proc/determine_move_and_pull_forces()
|
||||
var/value
|
||||
switch(mob_size)
|
||||
if(MOB_SIZE_TINY)
|
||||
value = MOVE_FORCE_EXTREMELY_WEAK
|
||||
if(MOB_SIZE_SMALL)
|
||||
value = MOVE_FORCE_WEAK
|
||||
if(MOB_SIZE_HUMAN)
|
||||
value = MOVE_FORCE_NORMAL
|
||||
if(MOB_SIZE_LARGE)
|
||||
value = MOVE_FORCE_NORMAL // For now
|
||||
if(!move_force)
|
||||
move_force = value
|
||||
if(!pull_force)
|
||||
pull_force = value
|
||||
if(!move_resist)
|
||||
move_resist = value
|
||||
|
||||
/mob/living/prepare_huds()
|
||||
..()
|
||||
prepare_data_huds()
|
||||
@@ -203,7 +224,7 @@
|
||||
set category = "Object"
|
||||
|
||||
if(istype(AM) && Adjacent(AM))
|
||||
start_pulling(AM)
|
||||
start_pulling(AM, show_message = TRUE)
|
||||
else
|
||||
stop_pulling()
|
||||
|
||||
@@ -921,10 +942,10 @@
|
||||
return 0
|
||||
return 1
|
||||
|
||||
/mob/living/start_pulling(atom/movable/AM, state, force = pull_force, supress_message = FALSE)
|
||||
/mob/living/start_pulling(atom/movable/AM, state, force = pull_force, show_message = FALSE)
|
||||
if(!AM || !src)
|
||||
return FALSE
|
||||
if(!(AM.can_be_pulled(src, state, force)))
|
||||
if(!(AM.can_be_pulled(src, state, force, show_message)))
|
||||
return FALSE
|
||||
if(incapacitated())
|
||||
return
|
||||
|
||||
@@ -219,7 +219,7 @@
|
||||
fire_stacks += L.fire_stacks
|
||||
IgniteMob()
|
||||
|
||||
/mob/living/can_be_pulled(user, grab_state, force)
|
||||
/mob/living/can_be_pulled(user, grab_state, force, show_message = FALSE)
|
||||
return ..() && !(buckled && buckled.buckle_prevents_pull)
|
||||
|
||||
/mob/living/water_act(volume, temperature, source, method = REAGENT_TOUCH)
|
||||
|
||||
@@ -2,6 +2,11 @@
|
||||
see_invisible = SEE_INVISIBLE_LIVING
|
||||
pressure_resistance = 10
|
||||
|
||||
// Will be determined based on mob size if left null. Done in living/proc/determine_move_and_pull_forces()
|
||||
move_resist = null
|
||||
move_force = null
|
||||
pull_force = null
|
||||
|
||||
//Health and life related vars
|
||||
var/maxHealth = 100 //Maximum health that should be possible.
|
||||
var/health = 100 //A mob's health
|
||||
|
||||
@@ -451,14 +451,14 @@ proc/get_radio_key_from_channel(var/channel)
|
||||
var/speech_bubble_test = say_test(message)
|
||||
|
||||
for(var/mob/M in listening)
|
||||
M.hear_say(message_pieces, verb, italics, src)
|
||||
M.hear_say(message_pieces, verb, italics, src, use_voice = FALSE)
|
||||
if(M.client)
|
||||
speech_bubble_recipients.Add(M.client)
|
||||
|
||||
if(eavesdropping.len)
|
||||
stars_all(message_pieces) //hopefully passing the message twice through stars() won't hurt... I guess if you already don't understand the language, when they speak it too quietly to hear normally you would be able to catch even less.
|
||||
for(var/mob/M in eavesdropping)
|
||||
M.hear_say(message_pieces, verb, italics, src)
|
||||
M.hear_say(message_pieces, verb, italics, src, use_voice = FALSE)
|
||||
if(M.client)
|
||||
speech_bubble_recipients.Add(M.client)
|
||||
|
||||
|
||||
@@ -142,7 +142,7 @@
|
||||
acceleration = !acceleration
|
||||
to_chat(usr, "Camera acceleration has been toggled [acceleration ? "on" : "off"].")
|
||||
|
||||
/mob/camera/aiEye/hear_say(list/message_pieces, verb = "says", italics = 0, mob/speaker = null, sound/speech_sound, sound_vol, sound_frequency)
|
||||
/mob/camera/aiEye/hear_say(list/message_pieces, verb = "says", italics = 0, mob/speaker = null, sound/speech_sound, sound_vol, sound_frequency, use_voice = TRUE)
|
||||
if(relay_speech)
|
||||
if(istype(ai))
|
||||
ai.relay_speech(speaker, message_pieces, verb)
|
||||
|
||||
@@ -80,17 +80,26 @@ GLOBAL_VAR_INIT(announcing_vox, 0) // Stores the time of the last announcement
|
||||
<LI>Do not use punctuation as you would normally, if you want a pause you can use the full stop and comma characters by separating them with spaces, like so: 'Alpha . Test , Bravo'.</LI></UL>\
|
||||
<font class='bad'>WARNING:</font><BR>Misuse of the announcement system will get you job banned.<HR>"
|
||||
|
||||
var/index = 0
|
||||
for(var/word in GLOB.vox_sounds)
|
||||
index++
|
||||
dat += "<A href='?src=[UID()];say_word=[word]'>[capitalize(word)]</A>"
|
||||
if(index != GLOB.vox_sounds.len)
|
||||
dat += " / "
|
||||
// Show alert and voice sounds separately
|
||||
var/vox_words = GLOB.vox_sounds - GLOB.vox_alerts
|
||||
dat = help_format(GLOB.vox_alerts, dat)
|
||||
dat = help_format(vox_words, dat)
|
||||
|
||||
var/datum/browser/popup = new(src, "announce_help", "Announcement Help", 500, 400)
|
||||
popup.set_content(dat)
|
||||
popup.open()
|
||||
|
||||
/mob/living/silicon/ai/proc/help_format(word_list, dat)
|
||||
var/index = 0
|
||||
for(var/word in word_list)
|
||||
index++
|
||||
dat += "<A href='?src=[UID()];say_word=[word]'>[capitalize(word)]</A>"
|
||||
if(index != length(word_list))
|
||||
dat += " / "
|
||||
else
|
||||
dat += "<HR>"
|
||||
return dat
|
||||
|
||||
/mob/living/silicon/ai/proc/ai_announcement()
|
||||
if(check_unable(AI_CHECK_WIRELESS | AI_CHECK_RADIO))
|
||||
return
|
||||
|
||||
@@ -517,7 +517,7 @@
|
||||
/mob/living/silicon/pai/Bumped()
|
||||
return
|
||||
|
||||
/mob/living/silicon/pai/start_pulling(atom/movable/AM, state, force = move_force, supress_message = FALSE)
|
||||
/mob/living/silicon/pai/start_pulling(atom/movable/AM, state, force = pull_force, show_message = FALSE)
|
||||
return FALSE
|
||||
|
||||
/mob/living/silicon/pai/update_canmove(delay_action_updates = 0)
|
||||
|
||||
@@ -19,6 +19,7 @@
|
||||
ventcrawler = 2
|
||||
magpulse = 1
|
||||
mob_size = MOB_SIZE_SMALL
|
||||
pull_force = MOVE_FORCE_VERY_WEAK // Can only drag small items
|
||||
|
||||
modules_break = FALSE
|
||||
|
||||
@@ -35,6 +36,14 @@
|
||||
var/reboot_cooldown = 60 // one minute
|
||||
var/last_reboot
|
||||
var/emagged_time
|
||||
var/list/pullable_drone_items = list(
|
||||
/obj/item/pipe,
|
||||
/obj/structure/disposalconstruct,
|
||||
/obj/item/stack/cable_coil,
|
||||
/obj/item/stack/rods,
|
||||
/obj/item/stack/sheet,
|
||||
/obj/item/stack/tile
|
||||
)
|
||||
|
||||
holder_type = /obj/item/holder/drone
|
||||
// var/sprite[0]
|
||||
@@ -69,6 +78,10 @@
|
||||
verbs -= /mob/living/silicon/robot/verb/Namepick
|
||||
module = new /obj/item/robot_module/drone(src)
|
||||
|
||||
//Allows Drones to hear the Engineering channel.
|
||||
module.channels = list("Engineering" = 1)
|
||||
radio.recalculateChannels()
|
||||
|
||||
//Grab stacks.
|
||||
stack_metal = locate(/obj/item/stack/sheet/metal/cyborg) in src.module
|
||||
stack_wood = locate(/obj/item/stack/sheet/wood) in src.module
|
||||
@@ -154,15 +167,17 @@
|
||||
return
|
||||
|
||||
else
|
||||
user.visible_message("<span class='warning'>\the [user] swipes [user.p_their()] ID card through [src], attempting to shut it down.</span>", "<span class='warning'>You swipe your ID card through \the [src], attempting to shut it down.</span>")
|
||||
var/confirm = alert("Using your ID on a Maintenance Drone will shut it down, are you sure you want to do this?", "Disable Drone", "Yes", "No")
|
||||
if(confirm == ("Yes") && (user in range(3, src)))
|
||||
user.visible_message("<span class='warning'>\the [user] swipes [user.p_their()] ID card through [src], attempting to shut it down.</span>", "<span class='warning'>You swipe your ID card through \the [src], attempting to shut it down.</span>")
|
||||
|
||||
if(emagged)
|
||||
return
|
||||
if(emagged)
|
||||
return
|
||||
|
||||
if(allowed(W))
|
||||
shut_down()
|
||||
else
|
||||
to_chat(user, "<span class='warning'>Access denied.</span>")
|
||||
if(allowed(W))
|
||||
shut_down()
|
||||
else
|
||||
to_chat(user, "<span class='warning'>Access denied.</span>")
|
||||
|
||||
return
|
||||
|
||||
@@ -321,20 +336,22 @@
|
||||
/mob/living/silicon/robot/drone/Bumped(atom/movable/AM)
|
||||
return
|
||||
|
||||
/mob/living/silicon/robot/drone/start_pulling(var/atom/movable/AM)
|
||||
/mob/living/silicon/robot/drone/start_pulling(atom/movable/AM, state, force = pull_force, show_message = FALSE)
|
||||
|
||||
if(is_type_in_list(AM, pullable_drone_items))
|
||||
..(AM, force = INFINITY) // Drone power! Makes them able to drag pipes and such
|
||||
|
||||
if(istype(AM,/obj/item/pipe) || istype(AM,/obj/structure/disposalconstruct))
|
||||
..()
|
||||
else if(istype(AM,/obj/item))
|
||||
var/obj/item/O = AM
|
||||
if(O.w_class > WEIGHT_CLASS_SMALL)
|
||||
to_chat(src, "<span class='warning'>You are too small to pull that.</span>")
|
||||
if(show_message)
|
||||
to_chat(src, "<span class='warning'>You are too small to pull that.</span>")
|
||||
return
|
||||
else
|
||||
..()
|
||||
else
|
||||
to_chat(src, "<span class='warning'>You are too small to pull that.</span>")
|
||||
return
|
||||
if(show_message)
|
||||
to_chat(src, "<span class='warning'>You are too small to pull that.</span>")
|
||||
|
||||
/mob/living/silicon/robot/drone/add_robot_verbs()
|
||||
src.verbs |= silicon_subsystems
|
||||
|
||||
@@ -8,7 +8,6 @@
|
||||
|
||||
//Has a list of items that it can hold.
|
||||
var/list/can_hold = list(
|
||||
/obj/item/stock_parts/cell,
|
||||
/obj/item/firealarm_electronics,
|
||||
/obj/item/airalarm_electronics,
|
||||
/obj/item/airlock_electronics,
|
||||
@@ -24,6 +23,8 @@
|
||||
/obj/item/mounted/frame/firealarm,
|
||||
/obj/item/mounted/frame/newscaster_frame,
|
||||
/obj/item/mounted/frame/intercom,
|
||||
/obj/item/mounted/frame/extinguisher,
|
||||
/obj/item/mounted/frame/light_switch,
|
||||
/obj/item/rack_parts,
|
||||
/obj/item/camera_assembly,
|
||||
/obj/item/tank,
|
||||
|
||||
@@ -1438,7 +1438,9 @@ GLOBAL_LIST_INIT(robot_verbs_default, list(
|
||||
default_cell_type = /obj/item/stock_parts/cell/bluespace
|
||||
|
||||
/mob/living/silicon/robot/destroyer/init(alien = FALSE, mob/living/silicon/ai/ai_to_sync_to = null)
|
||||
..()
|
||||
aiCamera = new/obj/item/camera/siliconcam/robot_camera(src)
|
||||
additional_law_channels["Binary"] = ":b "
|
||||
laws = new /datum/ai_laws/deathsquad
|
||||
module = new /obj/item/robot_module/destroyer(src)
|
||||
module.add_languages(src)
|
||||
module.add_subsystems_and_actions(src)
|
||||
@@ -1447,6 +1449,7 @@ GLOBAL_LIST_INIT(robot_verbs_default, list(
|
||||
qdel(radio)
|
||||
radio = new /obj/item/radio/borg/ert/specops(src)
|
||||
radio.recalculateChannels()
|
||||
playsound(loc, 'sound/mecha/nominalsyndi.ogg', 75, 0)
|
||||
|
||||
/mob/living/silicon/robot/destroyer/borg_icons()
|
||||
if(base_icon == "")
|
||||
|
||||
@@ -126,6 +126,7 @@
|
||||
gold_core_spawnable = FRIENDLY_SPAWN
|
||||
blood_volume = BLOOD_VOLUME_NORMAL
|
||||
var/obj/item/udder/udder = null
|
||||
gender = FEMALE
|
||||
|
||||
/mob/living/simple_animal/cow/Initialize()
|
||||
udder = new()
|
||||
|
||||
@@ -85,8 +85,11 @@
|
||||
get_scooped(M)
|
||||
..()
|
||||
|
||||
/mob/living/simple_animal/mouse/start_pulling(var/atom/movable/AM)//Prevents mouse from pulling things
|
||||
to_chat(src, "<span class='warning'>You are too small to pull anything.</span>")
|
||||
/mob/living/simple_animal/mouse/start_pulling(atom/movable/AM, state, force = pull_force, show_message = FALSE)//Prevents mouse from pulling things
|
||||
if(istype(AM, /obj/item/reagent_containers/food/snacks/cheesewedge))
|
||||
return ..() // Get dem
|
||||
if(show_message)
|
||||
to_chat(src, "<span class='warning'>You are too small to pull anything except cheese.</span>")
|
||||
return
|
||||
|
||||
/mob/living/simple_animal/mouse/Crossed(AM as mob|obj, oldloc)
|
||||
|
||||
@@ -26,21 +26,34 @@
|
||||
flying = 1
|
||||
|
||||
var/carp_color = "carp" //holder for icon set
|
||||
var/list/icon_sets = list("carp", "blue", "yellow", "grape", "rust", "teal", "purple")
|
||||
var/static/list/carp_colors = list(\
|
||||
"lightpurple" = "#c3b9f1", \
|
||||
"lightpink" = "#da77a8", \
|
||||
"green" = "#70ff25", \
|
||||
"grape" = "#df0afb", \
|
||||
"swamp" = "#e5e75a", \
|
||||
"turquoise" = "#04e1ed", \
|
||||
"brown" = "#ca805a", \
|
||||
"teal" = "#20e28e", \
|
||||
"lightblue" = "#4d88cc", \
|
||||
"rusty" = "#dd5f34", \
|
||||
"beige" = "#bbaeaf", \
|
||||
"yellow" = "#f3ca4a", \
|
||||
"blue" = "#09bae1", \
|
||||
"palegreen" = "#7ef099", \
|
||||
)
|
||||
|
||||
/mob/living/simple_animal/hostile/retaliate/carp/Initialize(mapload)
|
||||
. = ..()
|
||||
carp_randomify()
|
||||
update_icons()
|
||||
|
||||
/mob/living/simple_animal/hostile/retaliate/carp/proc/carp_randomify()
|
||||
if(prob(1))
|
||||
carp_color = pick("white", "black")
|
||||
else
|
||||
carp_color = pick(icon_sets)
|
||||
icon_state = "[carp_color]"
|
||||
icon_living = "[carp_color]"
|
||||
icon_dead = "[carp_color]_dead"
|
||||
/mob/living/simple_animal/hostile/retaliate/carp/proc/carp_randomify(rarechance)
|
||||
// Simplified version of: /mob/living/simple_animal/hostile/carp/proc/carp_randomify(rarechance)
|
||||
var/our_color
|
||||
our_color = pick(carp_colors)
|
||||
add_atom_colour(carp_colors[our_color], FIXED_COLOUR_PRIORITY)
|
||||
regenerate_icons()
|
||||
|
||||
/mob/living/simple_animal/hostile/retaliate/carp/koi
|
||||
name = "space koi"
|
||||
@@ -61,13 +74,15 @@
|
||||
maxbodytemp = 1500
|
||||
|
||||
gold_core_spawnable = HOSTILE_SPAWN
|
||||
var/randomize_icon = TRUE
|
||||
|
||||
/mob/living/simple_animal/hostile/retaliate/carp/koi/Initialize(mapload)
|
||||
. = ..()
|
||||
var/koinum = rand(1, 4)
|
||||
icon_state = "koi[koinum]"
|
||||
icon_living = "koi[koinum]"
|
||||
icon_dead = "koi[koinum]-dead"
|
||||
if(randomize_icon)
|
||||
var/koinum = rand(1, 4)
|
||||
icon_state = "koi[koinum]"
|
||||
icon_living = "koi[koinum]"
|
||||
icon_dead = "koi[koinum]-dead"
|
||||
|
||||
/mob/living/simple_animal/hostile/retaliate/carp/koi/Process_Spacemove(var/movement_dir)
|
||||
return TRUE
|
||||
@@ -76,3 +91,4 @@
|
||||
icon_state = "koi5"
|
||||
icon_living = "koi5"
|
||||
icon_dead = "koi5-dead"
|
||||
randomize_icon = FALSE
|
||||
|
||||
@@ -51,6 +51,10 @@
|
||||
if(!(eggtype in eggtypes))
|
||||
to_chat(src, "<span class='danger'>Unrecognized egg type.</span>")
|
||||
return 0
|
||||
if(fed < feedings_to_lay)
|
||||
// We have to check this again after the popup, to account for people spam-clicking the button, then doing all the popups at once.
|
||||
to_chat(src, "<span class='warning'>You must wrap more humanoid prey before you can do this!</span>")
|
||||
return
|
||||
visible_message("<span class='notice'>[src] lays a cluster of eggs.</span>")
|
||||
if(eggtype == TS_DESC_RED)
|
||||
DoLayTerrorEggs(/mob/living/simple_animal/hostile/poison/terror_spider/red, 1)
|
||||
|
||||
@@ -287,6 +287,10 @@
|
||||
if(eggtype == null || numlings == null)
|
||||
to_chat(src, "<span class='danger'>Cancelled.</span>")
|
||||
return
|
||||
if(canlay < numlings)
|
||||
// We have to check this again after the popups, to account for people spam-clicking the button, then doing all the popups at once.
|
||||
to_chat(src, "<span class='warning'>Too soon to do this again!</span>")
|
||||
return
|
||||
canlay -= numlings
|
||||
eggslaid += numlings
|
||||
if(eggtype == TS_DESC_RED)
|
||||
|
||||
@@ -710,7 +710,7 @@
|
||||
ears.talk_into(src, message_pieces, message_mode, verb)
|
||||
used_radios += ears
|
||||
|
||||
/mob/living/simple_animal/parrot/hear_say(list/message_pieces, verb = "says", italics = 0, mob/speaker = null, sound/speech_sound, sound_vol, sound_frequency)
|
||||
/mob/living/simple_animal/parrot/hear_say(list/message_pieces, verb = "says", italics = 0, mob/speaker = null, sound/speech_sound, sound_vol, sound_frequency, use_voice = TRUE)
|
||||
if(speaker != src && prob(50))
|
||||
parrot_hear(html_decode(multilingual_to_message(message_pieces)))
|
||||
..()
|
||||
|
||||
@@ -32,8 +32,9 @@
|
||||
animate_ghostly_presence(src, -1, 20, 1) // Restart the floating animation after the attack animation, as it will be cancelled.
|
||||
|
||||
|
||||
/mob/living/simple_animal/possessed_object/start_pulling(var/atom/movable/AM) // Silly motherfuckers think they can pull things.
|
||||
to_chat(src, "<span class='warning'>You are unable to pull [AM]!</span>")
|
||||
/mob/living/simple_animal/possessed_object/start_pulling(atom/movable/AM, state, force = pull_force, show_message = FALSE) // Silly motherfuckers think they can pull things.
|
||||
if(show_message)
|
||||
to_chat(src, "<span class='warning'>You are unable to pull [AM]!</span>")
|
||||
|
||||
|
||||
/mob/living/simple_animal/possessed_object/ghost() // Ghosting will return the object to normal, and will not disqualify the ghoster from various mid-round antag positions.
|
||||
|
||||
@@ -9,7 +9,7 @@
|
||||
|
||||
return verb
|
||||
|
||||
/mob/living/simple_animal/slime/hear_say(list/message_pieces, verb = "says", italics = 0, mob/speaker = null, sound/speech_sound, sound_vol, sound_frequency)
|
||||
/mob/living/simple_animal/slime/hear_say(list/message_pieces, verb = "says", italics = 0, mob/speaker = null, sound/speech_sound, sound_vol, sound_frequency, use_voice = TRUE)
|
||||
if(speaker != src && !stat)
|
||||
if(speaker in Friends)
|
||||
speech_buffer = list()
|
||||
|
||||
@@ -265,7 +265,7 @@
|
||||
/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)
|
||||
/mob/living/simple_animal/slime/start_pulling(atom/movable/AM, state, force = pull_force, show_message = FALSE)
|
||||
return
|
||||
|
||||
/mob/living/simple_animal/slime/attack_ui(slot)
|
||||
|
||||
@@ -28,6 +28,7 @@
|
||||
|
||||
/mob/Login()
|
||||
GLOB.player_list |= src
|
||||
last_known_ckey = ckey
|
||||
update_Login_details()
|
||||
world.update_status()
|
||||
|
||||
|
||||
@@ -19,7 +19,6 @@
|
||||
for(var/datum/alternate_appearance/AA in viewing_alternate_appearances)
|
||||
AA.viewers -= src
|
||||
viewing_alternate_appearances = null
|
||||
logs.Cut()
|
||||
LAssailant = null
|
||||
return ..()
|
||||
|
||||
@@ -578,6 +577,8 @@ GLOBAL_LIST_INIT(slot_equipment_priority, list( \
|
||||
changeNext_move(CLICK_CD_POINT)
|
||||
var/obj/P = new /obj/effect/temp_visual/point(tile)
|
||||
P.invisibility = invisibility
|
||||
P.pixel_x = A.pixel_x
|
||||
P.pixel_y = A.pixel_y
|
||||
return 1
|
||||
|
||||
/mob/proc/ret_grab(obj/effect/list_container/mobl/L as obj, flag)
|
||||
@@ -1238,10 +1239,13 @@ GLOBAL_LIST_INIT(slot_equipment_priority, list( \
|
||||
create_log_in_list(debug_log, text, collapse, world.timeofday)
|
||||
|
||||
/mob/proc/create_log(log_type, what, target = null, turf/where = get_turf(src))
|
||||
LAZYINITLIST(logs[log_type])
|
||||
var/list/log_list = logs[log_type]
|
||||
if(!ckey)
|
||||
return
|
||||
var/real_ckey = ckey
|
||||
if(ckey[1] == "@") // Admin aghosting will do this
|
||||
real_ckey = copytext(ckey, 2)
|
||||
var/datum/log_record/record = new(log_type, src, what, target, where, world.time)
|
||||
log_list.Add(record)
|
||||
GLOB.logging.add_log(real_ckey, record)
|
||||
|
||||
/proc/create_log_in_list(list/target, text, collapse = TRUE, last_log)//forgive me code gods for this shitcode proc
|
||||
//this proc enables lovely stuff like an attack log that looks like this: "[18:20:29-18:20:45]21x John Smith attacked Andrew Jackson with a crowbar."
|
||||
|
||||
@@ -36,7 +36,7 @@
|
||||
var/list/attack_log_old = list( )
|
||||
var/list/debug_log = null
|
||||
|
||||
var/list/logs = list() // Logs for each log type defined in __DEFINES/logs.dm
|
||||
var/last_known_ckey = null // Used in logging
|
||||
|
||||
var/last_log = 0
|
||||
var/obj/machinery/machine = null
|
||||
|
||||
@@ -113,7 +113,7 @@
|
||||
var/question = "Do you want to play as [M.real_name ? M.real_name : M.name][M.job ? " ([M.job])" : ""]"
|
||||
if(alert("Do you want to show the antag status?","Show antag status","Yes","No") == "Yes")
|
||||
question += ", [M.mind?.special_role ? M.mind?.special_role : "No special role"]"
|
||||
var/list/mob/dead/observer/candidates = pollCandidates("[question]?", poll_time = 100, min_hours = minhours)
|
||||
var/list/mob/dead/observer/candidates = SSghost_spawns.poll_candidates("[question]?", poll_time = 10 SECONDS, min_hours = minhours, source = M)
|
||||
var/mob/dead/observer/theghost = null
|
||||
|
||||
if(LAZYLEN(candidates))
|
||||
|
||||
@@ -55,6 +55,7 @@
|
||||
return
|
||||
|
||||
say_dead_direct("[pick("complains", "moans", "whines", "laments", "blubbers", "salts")], <span class='message'>\"[message]\"</span>", src)
|
||||
create_log(DEADCHAT_LOG, message)
|
||||
|
||||
/mob/proc/say_understands(var/mob/other, var/datum/language/speaking = null)
|
||||
if(stat == DEAD)
|
||||
|
||||
Reference in New Issue
Block a user