Merge branch 'master' into buttbots2

Conflicts:
	code/defines/procs/AStar.dm
	code/modules/mob/living/simple_animal/bot/cleanbot.dm
	code/modules/mob/living/simple_animal/bot/medbot.dm
	paradise.dme
This commit is contained in:
Tastyfish
2016-03-31 13:33:46 -04:00
245 changed files with 6723 additions and 4456 deletions
@@ -2,6 +2,7 @@
name = "alien"
icon_state = "alien_s"
butcher_results = list(/obj/item/weapon/reagent_containers/food/snacks/xenomeat = 5, /obj/item/stack/sheet/animalhide/xeno = 1)
var/obj/item/weapon/r_store = null
var/obj/item/weapon/l_store = null
var/caste = ""
@@ -23,9 +23,10 @@
owner.ear_deaf = 0
/obj/item/organ/internal/brain/xeno
name = "thinkpan"
desc = "It looks kind of like an enormous wad of purple bubblegum."
icon_state = "brain-x-d"
name = "xenomorph brain"
desc = "We barely understand the brains of terrestial animals. Who knows what we may find in the brain of such an advanced species?"
icon_state = "brain-x"
origin_tech = "biotech=7"
/obj/item/organ/internal/brain/New()
..()
+38 -15
View File
@@ -92,6 +92,42 @@
#undef STOMACH_ATTACK_DELAY
/mob/living/carbon/proc/vomit(var/lost_nutrition = 10, var/blood = 0, var/stun = 1, var/distance = 0, var/message = 1)
if(src.is_muzzled())
if(message)
src << "<span class='warning'>The muzzle prevents you from vomiting!</span>"
return 0
if(stun)
Stun(4)
if(nutrition < 100 && !blood)
if(message)
visible_message("<span class='warning'>[src] dry heaves!</span>", \
"<span class='userdanger'>You try to throw up, but there's nothing your stomach!</span>")
if(stun)
Weaken(10)
else
if(message)
visible_message("<span class='danger'>[src] throws up!</span>", \
"<span class='userdanger'>You throw up!</span>")
playsound(get_turf(src), 'sound/effects/splat.ogg', 50, 1)
var/turf/T = get_turf(src)
for(var/i=0 to distance)
if(blood)
if(T)
T.add_blood_floor(src)
if(stun)
adjustBruteLoss(3)
else
if(T)
T.add_vomit_floor(src)
nutrition -= lost_nutrition
if(stun)
adjustToxLoss(-3)
T = get_step(T, dir)
if (is_blocked_turf(T))
break
return 1
/mob/living/carbon/gib()
for(var/obj/item/organ/internal/I in internal_organs)
if(isturf(loc))
@@ -107,19 +143,6 @@
visible_message("<span class='danger'>[M] bursts out of [src]!</span>")
. = ..()
/mob/living/carbon/attack_hand(mob/M as mob)
if(!istype(M, /mob/living/carbon)) return
if (ishuman(M))
var/mob/living/carbon/human/H = M
var/obj/item/organ/external/temp = H.organs_by_name["r_hand"]
if (H.hand)
temp = H.organs_by_name["l_hand"]
if(temp && !temp.is_usable())
H << "\red You can't use your [temp.name]"
return
return
/mob/living/carbon/electrocute_act(shock_damage, obj/source, siemens_coeff = 1, override = 0, tesla_shock = 0)
if(status_flags & GODMODE) //godmode
return 0
@@ -546,12 +569,12 @@ var/list/ventcrawl_machinery = list(/obj/machinery/atmospherics/unary/vent_pump,
/mob/living/carbon/show_inv(mob/user)
user.set_machine(src)
var/dat = {"<table>
<tr><td><B>Left Hand:</B></td><td><A href='?src=\ref[src];item=[slot_l_hand]'>[(l_hand && !(l_hand.flags&ABSTRACT)) ? l_hand : "<font color=grey>Empty</font>"]</A></td></tr>
<tr><td><B>Right Hand:</B></td><td><A href='?src=\ref[src];item=[slot_r_hand]'>[(r_hand && !(r_hand.flags&ABSTRACT)) ? r_hand : "<font color=grey>Empty</font>"]</A></td></tr>
<tr><td>&nbsp;</td></tr>"}
dat += "<tr><td><B>Back:</B></td><td><A href='?src=\ref[src];item=[slot_back]'>[(back && !(back.flags&ABSTRACT)) ? back : "<font color=grey>Empty</font>"]</A>"
if(istype(wear_mask, /obj/item/clothing/mask) && istype(back, /obj/item/weapon/tank))
dat += "&nbsp;<A href='?src=\ref[src];internal=[slot_back]'>[internal ? "Disable Internals" : "Set Internals"]</A>"
@@ -23,4 +23,17 @@
for(var/datum/surgery/S in surgeries)
if(S.next_step(user, src))
return 1
..()
..()
/mob/living/carbon/attack_hand(mob/living/carbon/human/user)
if(!iscarbon(user))
return
for(var/datum/disease/D in viruses)
if(D.IsSpreadByTouch())
user.ContractDisease(D)
for(var/datum/disease/D in user.viruses)
if(D.IsSpreadByTouch())
ContractDisease(D)
return 0
@@ -4,7 +4,6 @@
var/list/stomach_contents = list()
var/list/internal_organs = list()
var/brain_op_stage = 0.0
var/list/datum/disease2/disease/virus2 = list()
var/antibodies = 0
var/last_eating = 0 //Not sure what this does... I found it hidden in food.dm
@@ -789,8 +789,6 @@
for(var/mob/M in range(location,aoe_range))
if (M.internal != null && M.wear_mask && (M.wear_mask.flags & AIRTIGHT))
continue
if(!airborne_can_reach(location,M,aoe_range))
continue
// Now, we don't have this:
//new /obj/effects/fart_cloud(T,L)
// But:
@@ -161,9 +161,6 @@
if(ismob(AM))
var/mob/tmob = AM
if(iscarbon(tmob) && prob(10))
spread_disease_to(tmob, "Contact")
//BubbleWrap - Should stop you pushing a restrained person out of the way
//i still don't get it, is this supposed to be 'bubblewrapping' or was it made by a guy named 'BubbleWrap'
if(ishuman(tmob))
@@ -1242,44 +1239,6 @@
return 0
return 1
/mob/living/carbon/human/proc/vomit(hairball=0)
if(stat==DEAD)return
if(!check_has_mouth())
return
if(!lastpuke)
lastpuke = 1
src << "<spawn class='warning'>You feel nauseous..."
spawn(150) //15 seconds until second warning
src << "<spawn class='warning'>You feel like you are about to throw up!"
spawn(100) //and you have 10 more for mad dash to the bucket
Stun(5)
if(hairball)
src.visible_message("<span class='warning'>[src] hacks up a hairball!</span>","<span class='warning'>You hack up a hairball!</span>")
else
src.visible_message("<span class='warning'>[src] throws up!</span>","<span class='warning'>You throw up!</span>")
playsound(loc, 'sound/effects/splat.ogg', 50, 1)
var/turf/location = loc
if (istype(location, /turf/simulated))
location.add_vomit_floor(src, 1)
var/stomach_len = src.stomach_contents.len
if (stomach_len)
var/content = src.stomach_contents[stomach_len]
if (istype(content, /atom/movable))
var/atom/movable/AM = content
src.stomach_contents.Remove(AM)
AM.loc = location
if(!hairball)
nutrition -= 40
adjustToxLoss(-3)
spawn(350) //wait 35 seconds before next volley
lastpuke = 0
/mob/living/carbon/human/proc/get_visible_gender()
if(wear_suit && wear_suit.flags_inv & HIDEJUMPSUIT && ((head && head.flags_inv & HIDEMASK) || wear_mask))
@@ -1311,12 +1270,6 @@
H.brainmob.mind.transfer_to(src)
qdel(H)
for (var/ID in virus2)
var/datum/disease2/disease/V = virus2[ID]
V.cure(src)
..()
/mob/living/carbon/human/proc/is_lung_ruptured()
@@ -48,10 +48,6 @@
apply_effect(4, WEAKEN, armor_block)
return
else
if(istype(M,/mob/living/carbon))
// log_debug("No gloves, [M] is truing to infect [src]")
M.spread_disease_to(src, "Contact")
var/datum/martial_art/attacker_style = M.martial_art
+29 -82
View File
@@ -64,8 +64,6 @@ var/global/list/brutefireloss_overlays = list("1" = image("icon" = 'icons/mob/sc
update_mutations()
check_mutations=0
handle_virus_updates()
handle_shock()
handle_pain()
handle_heartbeat()
@@ -345,12 +343,6 @@ var/global/list/brutefireloss_overlays = list("1" = image("icon" = 'icons/mob/sc
if(breath)
loc.assume_air(breath)
//spread virus2
if(virus2.len > 0)
if(prob(10) && get_infection_chance(src))
for(var/mob/living/carbon/M in view(1,src))
src.spread_disease_to(M)
// USED IN DEATHWHISPERS
@@ -939,6 +931,9 @@ var/global/list/brutefireloss_overlays = list("1" = image("icon" = 'icons/mob/sc
src << "<span class='alert'>Your psy-connection grows too faint to maintain!</span>"
isRemoteObserve = 0
if(remote_view)
isRemoteObserve = 1
if(!isRemoteObserve && client && !client.adminobs)
remoteview_target = null
reset_view(null)
@@ -952,7 +947,23 @@ var/global/list/brutefireloss_overlays = list("1" = image("icon" = 'icons/mob/sc
// Puke if toxloss is too high
if(!stat)
if (getToxLoss() >= 45 && nutrition > 20)
vomit()
lastpuke ++
if(lastpuke >= 25) // about 25 second delay I guess
Stun(5)
visible_message("<span class='danger'>[src] throws up!</span>", \
"<span class='userdanger'>[src] throws up!</span>")
playsound(loc, 'sound/effects/splat.ogg', 50, 1)
var/turf/location = loc
if (istype(location, /turf/simulated))
location.add_vomit_floor(src, 1)
nutrition -= 20
adjustToxLoss(-3)
// make it so you can only puke so fast
lastpuke = 0
//0.1% chance of playing a scary sound to someone who's in complete darkness
if(isturf(loc) && rand(1,1000) == 1)
@@ -961,69 +972,6 @@ var/global/list/brutefireloss_overlays = list("1" = image("icon" = 'icons/mob/sc
if(L && L.lum_r + L.lum_g + L.lum_b == 0)
playsound_local(src,pick(scarySounds),50, 1, -1)
// Separate proc so we can jump out of it when we've succeeded in spreading disease.
/mob/living/carbon/human/proc/findAirborneVirii()
for(var/obj/effect/decal/cleanable/blood/B in get_turf(src))
if(B.virus2.len)
for (var/ID in B.virus2)
var/datum/disease2/disease/V = B.virus2[ID]
if (infect_virus2(src,V))
return 1
for(var/obj/effect/decal/cleanable/mucus/M in get_turf(src))
if(M.virus2.len)
for (var/ID in M.virus2)
var/datum/disease2/disease/V = M.virus2[ID]
if (infect_virus2(src,V))
return 1
for(var/obj/effect/decal/cleanable/poop/P in get_turf(src))
if(P.virus2.len)
for (var/ID in P.virus2)
var/datum/disease2/disease/V = P.virus2[ID]
if (infect_virus2(src,V))
return 1
return 0
/mob/living/carbon/human/proc/handle_virus_updates()
if(status_flags & GODMODE) return 0 //godmode
if(bodytemperature > 406)
for (var/ID in virus2)
var/datum/disease2/disease/V = virus2[ID]
V.cure(src)
if(mob_master.current_cycle % 3) //don't spam checks over all objects in view every tick.
for(var/obj/effect/decal/cleanable/O in view(1,src))
if(istype(O,/obj/effect/decal/cleanable/blood))
var/obj/effect/decal/cleanable/blood/B = O
if(B.virus2.len)
for (var/ID in B.virus2)
var/datum/disease2/disease/V = B.virus2[ID]
infect_virus2(src,V.getcopy())
else if(istype(O,/obj/effect/decal/cleanable/mucus))
var/obj/effect/decal/cleanable/mucus/M = O
if(M.virus2.len)
for (var/ID in M.virus2)
var/datum/disease2/disease/V = M.virus2[ID]
infect_virus2(src,V.getcopy())
for (var/ID in virus2)
var/datum/disease2/disease/V = virus2[ID]
if(isnull(V)) // Trying to figure out a runtime error that keeps repeating
CRASH("virus2 nulled before calling activate()")
else
V.activate(src)
// activate may have deleted the virus
if(!V) continue
// check if we're immune
if(V.antigen & src.antibodies)
V.dead = 1
return
/mob/living/carbon/human/handle_changeling()
if(mind)
if(mind.changeling)
@@ -1157,16 +1105,15 @@ var/global/list/brutefireloss_overlays = list("1" = image("icon" = 'icons/mob/sc
for(var/mob/living/carbon/human/H in range(decaylevel, src))
if(prob(5))
if(airborne_can_reach(get_turf(src), get_turf(H)))
if(istype(loc,/obj/item/bodybag))
return
var/obj/item/clothing/mask/M = H.wear_mask
if(M && (M.flags & MASKCOVERSMOUTH))
return
if(H.species && H.species.flags & NO_BREATHE)
return //no puking if you can't smell!
H << "<spawn class='warning'>You smell something foul..."
H.fakevomit()
if(istype(loc,/obj/item/bodybag))
return
var/obj/item/clothing/mask/M = H.wear_mask
if(M && (M.flags & MASKCOVERSMOUTH))
return
if(H.species && H.species.flags & NO_BREATHE)
return //no puking if you can't smell!
H << "<spawn class='warning'>You smell something foul..."
H.fakevomit()
/mob/living/carbon/human/proc/handle_heartbeat()
var/client/C = src.client
@@ -29,7 +29,6 @@
//unarmed_types = list(/datum/unarmed_attack/bite, /datum/unarmed_attack/claws)
//inherent_verbs = list(/mob/living/proc/ventcrawl)
meat_type = /obj/item/weapon/reagent_containers/food/snacks/meat/monkey
total_health = 75
brute_mod = 1.5
@@ -75,8 +75,6 @@
var/blood_color = "#A10808" //Red.
var/flesh_color = "#FFC896" //Pink.
var/single_gib_type = /obj/effect/decal/cleanable/blood/gibs
var/meat_type = /obj/item/weapon/reagent_containers/food/snacks/meat/human
var/base_color //Used when setting species.
//Used in icon caching.
@@ -322,6 +320,8 @@
return
/datum/species/proc/handle_post_spawn(var/mob/living/carbon/C) //Handles anything not already covered by basic species assignment.
if(C.get_species() == "Monkey" || C.get_species() == "Farwa" || C.get_species() == "Stok" || C.get_species() == "Wolpin" || C.get_species() == "Neara")
C.butcher_results = list(/obj/item/weapon/reagent_containers/food/snacks/meat/monkey = 5)
grant_abilities(C)
return
@@ -331,6 +331,8 @@
return
/datum/species/proc/handle_pre_change(var/mob/living/carbon/human/H)
if(!H.get_species() == "Monkey" || !H.get_species() == "Farwa" || !H.get_species() == "Stok" || !H.get_species() == "Wolpin" || !H.get_species() == "Neara")
H.butcher_results = null
remove_abilities(H)
return
+1 -6
View File
@@ -84,12 +84,7 @@
if(breath)
loc.assume_air(breath)
//spread virus2
if(virus2.len > 0)
if(prob(10) && get_infection_chance(src))
for(var/mob/living/carbon/M in view(1,src))
src.spread_disease_to(M)
air_update_turf()
//Third link in a breath chain, calls handle_breath_temperature()
/mob/living/carbon/proc/check_breath(datum/gas_mixture/breath)
@@ -66,6 +66,12 @@
coretype = text2path("/obj/item/slime_extract/[sanitizedcolour]")
..()
/mob/living/carbon/slime/Destroy()
for(var/obj/machinery/computer/camera_advanced/xenobio/X in machines)
if(src in X.stored_slimes)
X.stored_slimes -= src
return ..()
/mob/living/carbon/slime/regenerate_icons()
icon_state = "[colour] [is_adult ? "adult" : "baby"] slime"
overlays.len = 0
+1 -1
View File
@@ -212,7 +212,7 @@
if (!( machine.check_eye(src) ))
reset_view(null)
else
if(!client.adminobs)
if(!remote_view && !client.adminobs)
reset_view(null)
/mob/living/proc/update_sight()
+15 -1
View File
@@ -386,6 +386,9 @@
C.handcuffed = initial(C.handcuffed)
C.heart_attack = 0
for(var/datum/disease/D in C.viruses)
D.cure(0)
// restore all of the human's blood and reset their shock stage
if(ishuman(src))
var/mob/living/carbon/human/human_mob = src
@@ -952,4 +955,15 @@
//used in datum/reagents/reaction() proc
/mob/living/proc/get_permeability_protection()
return 0
return 0
/mob/living/proc/harvest(mob/living/user)
if(qdeleted(src))
return
if(butcher_results)
for(var/path in butcher_results)
for(var/i = 1, i <= butcher_results[path], i++)
new path(loc)
butcher_results.Remove(path) //In case you want to have things like simple_animals drop their butcher results on gib, so it won't double up below.
visible_message("<span class='notice'>[user] butchers [src].</span>")
gib()
@@ -52,4 +52,6 @@
var/list/datum/action/actions = list()
var/step_count = 0
var/list/butcher_results = null
var/list/surgeries = list() //a list of surgery datums. generally empty, they're added when the player wants them.
+6 -2
View File
@@ -430,7 +430,9 @@ proc/get_radio_key_from_channel(var/channel)
speech_bubble_recipients.Add(M.client)
spawn(0)
flick_overlay(image('icons/mob/talk.dmi', src, "h[speech_bubble_test]",MOB_LAYER+1), speech_bubble_recipients, 30)
var/image/I = image('icons/mob/talk.dmi', src, "h[speech_bubble_test]", MOB_LAYER + 1)
I.appearance_flags = APPEARANCE_UI_IGNORE_ALPHA
flick_overlay(I, speech_bubble_recipients, 30)
if(watching.len)
var/rendered = "<span class='game say'><span class='name'>[src.name]</span> [not_heard].</span>"
@@ -441,4 +443,6 @@ proc/get_radio_key_from_channel(var/channel)
return 1
/mob/living/speech_bubble(var/bubble_state = "",var/bubble_loc = src, var/list/bubble_recipients = list())
flick_overlay(image('icons/mob/talk.dmi', bubble_loc, bubble_state,MOB_LAYER+1), bubble_recipients, 30)
var/image/I = image('icons/mob/talk.dmi', bubble_loc, bubble_state, MOB_LAYER + 1)
I.appearance_flags = APPEARANCE_UI_IGNORE_ALPHA
flick_overlay(I, bubble_recipients, 30)
+3 -1
View File
@@ -59,7 +59,7 @@
var/screen // Which screen our main window displays
var/subscreen // Which specific function of the main screen is being displayed
var/obj/item/device/pda/ai/pai/pda = null
var/obj/item/device/pda/pai/pda = null
var/secHUD = 0 // Toggles whether the Security HUD is active or not
var/medHUD = 0 // Toggles whether the Medical HUD is active or not
@@ -110,6 +110,8 @@
pda.name = pda.owner + " (" + pda.ownjob + ")"
var/datum/data/pda/app/messenger/M = pda.find_program(/datum/data/pda/app/messenger)
M.toff = 1
var/datum/data/pda/app/chatroom/C = pda.find_program(/datum/data/pda/app/chatroom)
C.toff = 1
..()
/mob/living/silicon/pai/Login()
@@ -222,6 +222,123 @@
M.create_message(P, target, 1)
return 1
/datum/pai_software/chatroom
name = "Digital Chatroom"
ram_cost = 5
id = "chatroom"
toggle = 0
on_ui_interact(mob/living/silicon/pai/user, datum/nanoui/ui=null, force_open=1)
var/data[0]
if(!user.pda)
return
var/datum/data/pda/app/chatroom/M = user.pda.find_program(/datum/data/pda/app/chatroom)
if(!M)
return
data["receiver_off"] = M.toff
data["ringer_off"] = M.notify_silent
var/list/rooms[0]
for(var/datum/chatroom/c in chatrooms)
if((M in c.users) || (M in c.invites) || c.is_public)
rooms += list(list(name = "[c]", ref = "\ref[c]"))
data["rooms"] = rooms
if(M.disconnected || !M.messaging_available(1))
data["disconnected"] = 1
else if(M.current_room)
data["current_room"] = "\ref[M.current_room]"
data["current_room_name"] = M.current_room.name
data["current_room_topic"] = M.current_room.topic
data["messages"] = M.current_room.logs
var/list/users[0]
for(var/U in M.current_room.users)
var/datum/data/pda/app/chatroom/ch = U
users += "<span class='good'>[ch.pda.owner]</span>"
for(var/U in (M.current_room.invites - M.current_room.users))
var/datum/data/pda/app/chatroom/ch = U
users += "<span class='average'>[ch.pda.owner]</span>"
data["users"] = users
ui = nanomanager.try_update_ui(user, user, id, ui, data, force_open)
if(!ui)
// Don't copy-paste this unless you're making a pAI software module!
ui = new(user, user, id, "pai_chatroom.tmpl", "Digital Chatroom", 450, 600)
ui.set_initial_data(data)
ui.open()
ui.set_auto_update(1)
Topic(href, href_list)
var/mob/living/silicon/pai/P = usr
if(!istype(P))
return
if(!isnull(P.pda) && P.pda.can_use())
var/datum/data/pda/app/chatroom/M = P.pda.find_program(/datum/data/pda/app/chatroom)
if(!M)
return
if(href_list["toggler"])
M.toff = href_list["toggler"] != "1"
return 1
else if(href_list["ringer"])
M.notify_silent = href_list["ringer"] != "1"
return 1
else if(href_list["topic"])
if(!M.current_room)
return 1
var/t = input("Enter new topic:", M.current_room, M.current_room.topic) as text|null
spawn()
if(!t || !M.check_messaging_available() || !P.pda.can_use())
return
t = sanitize(copytext(t, 1, MAX_MESSAGE_LEN))
t = readd_quotes(t)
if (!t)
return
M.current_room.topic = t
M.current_room.announce(M, "Topic has been changed to '[t]' by [P.pda.owner].")
return 1
else if(href_list["select"])
var/s = href_list["select"]
if(s == "*NONE*")
M.current_room = null
else
var/datum/chatroom/CR = locate(s)
if(istype(CR))
if(!(M in CR.users))
if(!CR.login(M))
return
M.current_room = CR
return 1
else if(href_list["target"])
if(P.silence_time)
return alert("Communications circuits remain uninitialized.")
var/datum/chatroom/target = locate(href_list["target"])
if(istype(target))
if(!(M in target.users))
if(!target.login(M))
return
var/t = input("Please enter message", target) as text|null
spawn()
if(!t || !M.check_messaging_available())
return
t = sanitize(copytext(t, 1, MAX_MESSAGE_LEN))
t = readd_quotes(t)
if (!t || !P.pda.can_use())
return
target.post(M, t)
return 1
else if(href_list["reconnect"])
spawn()
M.messaging_available()
return 1
/datum/pai_software/med_records
name = "Medical Records"
ram_cost = 15
@@ -15,6 +15,7 @@
req_access = list(access_engine, access_robotics)
local_transmit = 1
ventcrawler = 2
magpulse = 1
// We need to keep track of a few module items so we don't need to do list operations
// every time we need them. These get set in New() after the module is chosen.
@@ -374,4 +374,4 @@
stack = stack_plastic
stack.amount++
decompiler.stored_comms[type]--;
decompiler.stored_comms[type]--
@@ -171,12 +171,12 @@
subsystems = list(/mob/living/silicon/proc/subsystem_power_monitor)
stacktypes = list(
/obj/item/stack/sheet/metal = 50,
/obj/item/stack/sheet/glass = 50,
/obj/item/stack/sheet/rglass = 50,
/obj/item/stack/sheet/metal/cyborg = 50,
/obj/item/stack/sheet/glass/cyborg = 50,
/obj/item/stack/sheet/rglass/cyborg = 50,
/obj/item/stack/cable_coil/cyborg = 50,
/obj/item/stack/rods = 15,
/obj/item/stack/tile/plasteel = 15
/obj/item/stack/rods = 30,
/obj/item/stack/tile/plasteel = 20
)
/obj/item/weapon/robot_module/engineering/New()
@@ -198,29 +198,10 @@
src.emag = new /obj/item/borg/stun(src)
var/obj/item/stack/sheet/metal/cyborg/M = new /obj/item/stack/sheet/metal/cyborg(src)
M.amount = 50
src.modules += M
var/obj/item/stack/sheet/rglass/cyborg/R = new /obj/item/stack/sheet/rglass/cyborg(src)
R.amount = 50
src.modules += R
var/obj/item/stack/sheet/glass/G = new /obj/item/stack/sheet/glass(src)
G.amount = 50
src.modules += G
var/obj/item/stack/cable_coil/cyborg/W = new /obj/item/stack/cable_coil/cyborg(src)
W.amount = 50
src.modules += W
var/obj/item/stack/rods/Q = new /obj/item/stack/rods(src)
Q.amount = 15
src.modules += Q
var/obj/item/stack/tile/plasteel/F = new /obj/item/stack/tile/plasteel(src) //floor tiles not regular plasteel, calm down
F.amount = 15
src.modules += F
for(var/G in stacktypes) //Attempt to unify Engi-Borg material stacks into fewer lines. See Line 492 for example. Variables changed out of paranoia.
var/obj/item/stack/sheet/M = new G(src)
M.amount = stacktypes[G]
src.modules += M
fix_modules()
@@ -479,14 +460,13 @@
name = "drone module"
module_type = "Engineer"
stacktypes = list(
/obj/item/stack/sheet/wood = 1,
/obj/item/stack/sheet/mineral/plastic = 1,
/obj/item/stack/sheet/rglass = 5,
/obj/item/stack/tile/wood = 5,
/obj/item/stack/rods = 15,
/obj/item/stack/tile/plasteel = 15,
/obj/item/stack/sheet/metal = 20,
/obj/item/stack/sheet/glass = 20,
/obj/item/stack/sheet/wood/cyborg = 10,
/obj/item/stack/sheet/rglass/cyborg = 50,
/obj/item/stack/tile/wood = 20,
/obj/item/stack/rods = 30,
/obj/item/stack/tile/plasteel = 20,
/obj/item/stack/sheet/metal/cyborg = 50,
/obj/item/stack/sheet/glass/cyborg = 50,
/obj/item/stack/cable_coil/cyborg = 30
)
@@ -531,4 +511,4 @@
var/mob/living/silicon/robot/R = src.loc
return (src in R.module.modules)
return (src in R.module.modules)
@@ -140,7 +140,6 @@
target_types += /obj/effect/decal/cleanable/blood/oil
target_types += /obj/effect/decal/cleanable/vomit
target_types += /obj/effect/decal/cleanable/poop
target_types += /obj/effect/decal/cleanable/blood/gibs/robot
target_types += /obj/effect/decal/cleanable/crayon
target_types += /obj/effect/decal/cleanable/liquid_fuel
@@ -152,7 +151,6 @@
target_types += /obj/effect/decal/cleanable/ash
target_types += /obj/effect/decal/cleanable/greenglow
target_types += /obj/effect/decal/cleanable/dirt
target_types += /obj/effect/decal/cleanable/mucus
if(blood)
target_types += /obj/effect/decal/cleanable/blood/xeno/
@@ -224,4 +222,4 @@ text("<A href='?src=\ref[src];power=1'>[on ? "On" : "Off"]</A>"))
if(istype(A,/obj/effect/decal/cleanable))
clean(A)
else
..()
..()
@@ -387,10 +387,17 @@
if((C.getToxLoss() >= heal_threshold) && (!C.reagents.has_reagent(treatment_tox)))
return 1
if(treat_virus && C.virus2.len && !C.reagents.has_reagent(treatment_virus))
for (var/ID in C.virus2)
if (ID in virusDB) // If the virus is known, the medbot is aware of it
return 1
if(treat_virus)
for(var/datum/disease/D in C.viruses)
//the medibot can't detect viruses that are undetectable to Health Analyzers or Pandemic machines.
if(D.visibility_flags & HIDDEN_SCANNER || D.visibility_flags & HIDDEN_PANDEMIC)
return 0
if(D.severity == NONTHREAT) // medibot doesn't try to heal truly harmless viruses
return 0
if((D.stage > 1) || (D.spread_flags & AIRBORNE)) // medibot can't detect a virus in its initial stage unless it spreads airborne.
if(!C.reagents.has_reagent(treatment_virus))
return 1 //STOP DISEASE FOREVER
return 0
@@ -434,12 +441,14 @@
else
if(treat_virus)
var/virus = 0
if(C.virus2.len)
for (var/ID in C.virus2)
if (ID in virusDB) // If the virus is known, the medbot is aware of it and will try to cure it
virus = 1
for(var/datum/disease/D in C.viruses)
//detectable virus
if((!(D.visibility_flags & HIDDEN_SCANNER)) || (!(D.visibility_flags & HIDDEN_PANDEMIC)))
if(D.severity != NONTHREAT) //virus is harmful
if((D.stage > 1) || (D.spread_flags & AIRBORNE))
virus = 1
if (!reagent_id && (virus))
if(!reagent_id && (virus))
if(!C.reagents.has_reagent(treatment_virus))
reagent_id = treatment_virus
@@ -566,4 +575,4 @@
req_one_access = list(access_medical, access_robotics)
/obj/machinery/bot_core/medbot/syndicate
req_one_access = list(access_syndicate)
req_one_access = list(access_syndicate)
@@ -17,8 +17,7 @@
density = 0
pass_flags = PASSTABLE | PASSGRILLE | PASSMOB
ventcrawler = 2
meat_type = /obj/item/weapon/reagent_containers/food/snacks/meat
meat_amount = 0
butcher_results = list(/obj/item/weapon/reagent_containers/food/snacks/meat = 0)
/mob/living/simple_animal/butterfly/New()
..()
@@ -16,8 +16,7 @@
see_in_dark = 6
simplespecies = /mob/living/simple_animal/pet/cat
childtype = /mob/living/simple_animal/pet/cat/kitten
meat_type = /obj/item/weapon/reagent_containers/food/snacks/meat
meat_amount = 3
butcher_results = list(/obj/item/weapon/reagent_containers/food/snacks/meat = 3)
response_help = "pets"
response_disarm = "gently pushes aside"
response_harm = "kicks"
@@ -15,8 +15,7 @@
emote_see = list("shakes its head", "shivers")
speak_chance = 1
turns_per_move = 10
meat_type = /obj/item/weapon/reagent_containers/food/snacks/meat/corgi
meat_amount = 3
butcher_results = list(/obj/item/weapon/reagent_containers/food/snacks/meat/corgi = 3)
response_help = "pets"
response_disarm = "bops"
response_harm = "kicks"
@@ -11,8 +11,7 @@
emote_see = list("clacks")
speak_chance = 1
turns_per_move = 5
meat_type = /obj/item/weapon/reagent_containers/food/snacks/meat
meat_amount = 3
butcher_results = list(/obj/item/weapon/reagent_containers/food/snacks/meat = 1)
response_help = "pets the"
response_disarm = "gently pushes aside the"
response_harm = "stomps the"
@@ -10,8 +10,7 @@
speak_chance = 1
turns_per_move = 5
see_in_dark = 0 //I'm so funny
meat_type = /obj/item/weapon/reagent_containers/food/snacks/meat
meat_amount = 3
butcher_results = list(/obj/item/weapon/reagent_containers/food/snacks/meat = 4)
response_help = "pets"
response_disarm = "gently pushes aside"
response_harm = "kicks"
@@ -12,8 +12,7 @@
speak_chance = 1
turns_per_move = 5
see_in_dark = 6
meat_type = /obj/item/weapon/reagent_containers/food/snacks/meat
meat_amount = 4
butcher_results = list(/obj/item/weapon/reagent_containers/food/snacks/meat = 4)
response_help = "pets the"
response_disarm = "gently pushes aside the"
response_harm = "kicks the"
@@ -103,8 +102,7 @@
speak_chance = 1
turns_per_move = 5
see_in_dark = 6
meat_type = /obj/item/weapon/reagent_containers/food/snacks/meat
meat_amount = 6
butcher_results = list(/obj/item/weapon/reagent_containers/food/snacks/meat/slab = 6)
response_help = "pets the"
response_disarm = "gently pushes aside the"
response_harm = "kicks the"
@@ -168,8 +166,7 @@
density = 0
speak_chance = 2
turns_per_move = 2
meat_type = /obj/item/weapon/reagent_containers/food/snacks/meat
meat_amount = 1
butcher_results = list(/obj/item/weapon/reagent_containers/food/snacks/meat = 1)
response_help = "pets the"
response_disarm = "gently pushes aside the"
response_harm = "kicks the"
@@ -211,8 +208,7 @@ var/global/chicken_count = 0
density = 0
speak_chance = 2
turns_per_move = 3
meat_type = /obj/item/weapon/reagent_containers/food/snacks/meat
meat_amount = 2
butcher_results = list(/obj/item/weapon/reagent_containers/food/snacks/meat = 2)
response_help = "pets the"
response_disarm = "gently pushes aside the"
response_harm = "kicks the"
@@ -294,8 +290,7 @@ var/global/chicken_count = 0
speak_chance = 1
turns_per_move = 5
see_in_dark = 6
meat_type = /obj/item/weapon/reagent_containers/food/snacks/meat/ham
meat_amount = 6
butcher_results = list(/obj/item/weapon/reagent_containers/food/snacks/meat/ham = 6)
response_help = "pets the"
response_disarm = "gently pushes aside the"
response_harm = "kicks the"
@@ -316,8 +311,7 @@ var/global/chicken_count = 0
speak_chance = 1
turns_per_move = 5
see_in_dark = 6
meat_type = /obj/item/weapon/reagent_containers/food/snacks/meat //enough to make one turkey
meat_amount = 4
butcher_results = list(/obj/item/weapon/reagent_containers/food/snacks/meat = 4)
response_help = "pets the"
response_disarm = "gently pushes aside the"
response_harm = "kicks the"
@@ -338,8 +332,7 @@ var/global/chicken_count = 0
speak_chance = 1
turns_per_move = 5
see_in_dark = 6
meat_type = /obj/item/weapon/reagent_containers/food/snacks/meat
meat_amount = 6
butcher_results = list(/obj/item/weapon/reagent_containers/food/snacks/meat = 6)
response_help = "pets the"
response_disarm = "gently pushes aside the"
response_harm = "kicks the"
@@ -360,8 +353,7 @@ var/global/chicken_count = 0
speak_chance = 1
turns_per_move = 5
see_in_dark = 6
meat_type = /obj/item/weapon/reagent_containers/food/snacks/meat
meat_amount = 6
butcher_results = list(/obj/item/weapon/reagent_containers/food/snacks/meat = 6)
response_help = "pets the"
response_disarm = "gently pushes aside the"
response_harm = "kicks the"
@@ -382,8 +374,7 @@ var/global/chicken_count = 0
speak_chance = 1
turns_per_move = 5
see_in_dark = 6
meat_type = /obj/item/weapon/reagent_containers/food/snacks/meat
meat_amount = 6
butcher_results = list(/obj/item/weapon/reagent_containers/food/snacks/meat = 6)
response_help = "pets the"
response_disarm = "gently pushes aside the"
response_harm = "kicks the"
@@ -13,8 +13,7 @@
speak_chance = 1
turns_per_move = 5
see_in_dark = 6
meat_type = /obj/item/weapon/reagent_containers/food/snacks/meat
meat_amount = 3
butcher_results = list(/obj/item/weapon/reagent_containers/food/snacks/meat = 3)
response_help = "pets"
response_disarm = "gently pushes aside"
response_harm = "kicks"
@@ -20,6 +20,5 @@
density = 0
pass_flags = PASSTABLE | PASSMOB
can_hide = 1
meat_type = /obj/item/weapon/reagent_containers/food/snacks/meat
meat_amount = 1
butcher_results = list(/obj/item/weapon/reagent_containers/food/snacks/meat = 1)
can_collar = 1
@@ -15,8 +15,7 @@
see_in_dark = 6
maxHealth = 5
health = 5
meat_type = /obj/item/weapon/reagent_containers/food/snacks/meat
meat_amount = 1
butcher_results = list(/obj/item/weapon/reagent_containers/food/snacks/meat = 1)
response_help = "pets the"
response_disarm = "gently pushes aside the"
response_harm = "stamps on the"
@@ -12,8 +12,7 @@
emote_see = list("shakes its head.", "chases its tail.","shivers.")
speak_chance = 1
turns_per_move = 10
meat_type = /obj/item/weapon/reagent_containers/food/snacks/meat/pug
meat_amount = 3
butcher_results = list(/obj/item/weapon/reagent_containers/food/snacks/meat/pug = 3)
response_help = "pets"
response_disarm = "bops"
response_harm = "kicks"
@@ -8,8 +8,7 @@
turns_per_move = 5
maxHealth = 15
health = 15
meat_type = /obj/item/weapon/reagent_containers/food/snacks/tomatomeat
meat_amount = 3
butcher_results = list(/obj/item/weapon/reagent_containers/food/snacks/tomatomeat = 3)
response_help = "prods the"
response_disarm = "pushes aside the"
response_harm = "smacks the"
@@ -10,8 +10,7 @@
response_disarm = "shoves the"
response_harm = "hits the"
speed = 0
meat_type = /obj/item/weapon/reagent_containers/food/snacks/xenomeat
meat_amount = 3
butcher_results = list(/obj/item/weapon/reagent_containers/food/snacks/xenomeat = 3)
maxHealth = 100
health = 100
harm_intent_damage = 5
@@ -140,3 +139,25 @@
dead = 1
visible_message("[src] lets out a waning guttural screech, green blood bubbling from its maw...")
playsound(src, 'sound/voice/hiss6.ogg', 100, 1)
/mob/living/simple_animal/hostile/alien/maid
name = "lusty xenomorph maid"
melee_damage_lower = 0
melee_damage_upper = 0
a_intent = "help"
friendly = "caresses"
environment_smash = 0
icon_state = "maid"
icon_living = "maid"
icon_dead = "maid_dead"
/mob/living/simple_animal/hostile/alien/maid/AttackingTarget()
if(istype(target, /atom/movable))
if(istype(target, /obj/effect/decal/cleanable))
visible_message("<span class='notice'>\The [src] cleans up \the [target].</span>")
qdel(target)
return
var/atom/movable/M = target
M.clean_blood()
visible_message("<span class='notice'>\The [src] polishes \the [target].</span>")
@@ -8,8 +8,7 @@
icon_gib = "bat_dead"
speak_chance = 0
turns_per_move = 3
meat_type = /obj/item/weapon/reagent_containers/food/snacks/meat
meat_amount = 1
butcher_results = list(/obj/item/weapon/reagent_containers/food/snacks/meat = 1)
response_help = "pets the"
response_disarm = "gently pushes aside the"
response_harm = "hits the"
@@ -13,8 +13,7 @@
speak_chance = 1
turns_per_move = 5
see_in_dark = 6
meat_type = /obj/item/weapon/reagent_containers/food/snacks/bearmeat
meat_amount = 5
butcher_results = list(/obj/item/weapon/reagent_containers/food/snacks/bearmeat = 5, /obj/item/clothing/head/bearpelt = 1)
response_help = "pets"
response_disarm = "gently pushes aside"
response_harm = "hits"
@@ -9,8 +9,7 @@
icon_gib = "carp_gib"
speak_chance = 0
turns_per_move = 5
meat_type = /obj/item/weapon/reagent_containers/food/snacks/carpmeat
meat_amount = 2
butcher_results = list(/obj/item/weapon/reagent_containers/food/snacks/carpmeat = 2)
response_help = "pets the"
response_disarm = "gently pushes aside the"
response_harm = "hits the"
@@ -33,8 +33,7 @@
speak_chance = 5
turns_per_move = 5
see_in_dark = 10
meat_type = /obj/item/weapon/reagent_containers/food/snacks/spidermeat
meat_amount = 2
butcher_results = list(/obj/item/weapon/reagent_containers/food/snacks/spidermeat = 2, /obj/item/weapon/reagent_containers/food/snacks/spiderleg = 8)
response_help = "pets"
response_disarm = "gently pushes aside"
response_harm = "hits"
@@ -57,8 +56,8 @@
icon_state = "nurse"
icon_living = "nurse"
icon_dead = "nurse_dead"
meat_type = /obj/item/weapon/reagent_containers/food/snacks/spidereggs
meat_amount = 4
butcher_results = list(/obj/item/weapon/reagent_containers/food/snacks/spidermeat = 2, /obj/item/weapon/reagent_containers/food/snacks/spiderleg = 8, /obj/item/weapon/reagent_containers/food/snacks/spidereggs = 4)
maxHealth = 40
health = 40
melee_damage_lower = 5
@@ -95,19 +94,6 @@
stop_automated_movement = 0
walk(src,0)
// Chops off each leg with a 50/50 chance of harvesting one, until finally calling
// default harvest action
/mob/living/simple_animal/hostile/poison/giant_spider/harvest()
if(butcher_state > 0)
butcher_state--
icon_state = icon_dead + "[butcher_state]"
if(prob(50))
new /obj/item/weapon/reagent_containers/food/snacks/spiderleg(src.loc)
return
else
return ..()
/mob/living/simple_animal/hostile/poison/giant_spider/nurse/proc/GiveUp(var/C)
spawn(100)
if(busy == MOVING_TO_TARGET)
@@ -13,8 +13,7 @@
icon_gib = "panther_dead"
speak_chance = 0
turns_per_move = 3
meat_type = /obj/item/weapon/reagent_containers/food/snacks/meat
meat_amount = 3
butcher_results = list(/obj/item/weapon/reagent_containers/food/snacks/meat = 3)
response_help = "pets the"
response_disarm = "gently pushes aside the"
response_harm = "hits the"
@@ -72,8 +71,7 @@
icon_gib = "snake_dead"
speak_chance = 0
turns_per_move = 1
meat_type = /obj/item/weapon/reagent_containers/food/snacks/meat
meat_amount = 2
butcher_results = list(/obj/item/weapon/reagent_containers/food/snacks/meat = 2)
response_help = "pets the"
response_disarm = "gently pushes aside the"
response_harm = "hits the"
@@ -8,7 +8,7 @@
turns_per_move = 1
maxHealth = 10
health = 10
meat_type = /obj/item/weapon/reagent_containers/food/snacks/hugemushroomslice
butcher_results = list(/obj/item/weapon/reagent_containers/food/snacks/hugemushroomslice = 1)
response_help = "pets"
response_disarm = "gently pushes aside"
response_harm = "whacks"
@@ -8,8 +8,7 @@
icon_gib = "carp_gib"
speak_chance = 0
turns_per_move = 5
meat_type = /obj/item/weapon/reagent_containers/food/snacks/carpmeat
meat_amount = 1
butcher_results = list(/obj/item/weapon/reagent_containers/food/snacks/carpmeat = 1)
response_help = "pets the"
response_disarm = "gently pushes aside the"
response_harm = "hits the"
@@ -163,7 +163,7 @@
src.visible_message("<span class='userdanger'>\the [src] starts to eat \the [noms]!</span>","<span class='notice'>You start to eat \the [noms]. (This will take about [ufnomDelay] seconds.)</span>","<span class='userdanger'>You hear gnashing.</span>") //inform everyone what the fucking worm is doing.
if(do_after(src, nomDelay,5,0, target = noms))
if(do_after(src, nomDelay, 0, target = noms))
if(noms && Adjacent(noms) && (currentlyEating == noms))//It exists, were next to it, and it's still the thing were eating
if(W)
W.ChangeTurf(/turf/simulated/floor/plating)
@@ -59,8 +59,7 @@
icon_state = "reindeer"
icon_living = "reindeer"
icon_dead = "reindeer-dead"
meat_type = /obj/item/weapon/reagent_containers/food/snacks/meat
meat_amount = 3
butcher_results = list(/obj/item/weapon/reagent_containers/food/snacks/meat = 3)
melee_damage_lower = 5
melee_damage_upper = 10
+10 -34
View File
@@ -43,8 +43,7 @@
speak_chance = 1//1% (1 in 100) chance every tick; So about once per 150 seconds, assuming an average tick is 1.5s
turns_per_move = 5
meat_type = /obj/item/weapon/reagent_containers/food/snacks/cracker/
meat_amount = 3
butcher_results = list(/obj/item/weapon/reagent_containers/food/snacks/cracker = 3)
response_help = "pets the"
response_disarm = "gently moves aside the"
@@ -149,7 +148,7 @@
if("ears")
if(ears)
if(available_channels.len)
src.say("[pick(available_channels)] BAWWWWWK LEAVE THE HEADSET BAWKKKKK!")
src.say("[pick(available_channels)]BAWWWWWK LEAVE THE HEADSET BAWKKKKK!")
else
src.say("BAWWWWWK LEAVE THE HEADSET BAWKKKKK!")
ears.loc = src.loc
@@ -329,9 +328,9 @@
useradio = 1
if(copytext(possible_phrase,1,3) in department_radio_keys)
possible_phrase = "[useradio?pick(available_channels):""] [copytext(possible_phrase,3,length(possible_phrase)+1)]" //crop out the channel prefix
possible_phrase = "[useradio?pick(available_channels):""][copytext(possible_phrase,3,length(possible_phrase)+1)]" //crop out the channel prefix
else
possible_phrase = "[useradio?pick(available_channels):""] [possible_phrase]"
possible_phrase = "[useradio?pick(available_channels):""][possible_phrase]"
newspeak.Add(possible_phrase)
@@ -682,40 +681,17 @@
/mob/living/simple_animal/parrot/Poly
name = "Poly"
desc = "Poly the Parrot. An expert on quantum cracker theory."
speak = list("Poly wanna cracker!", ":e Check the singlo, you chucklefucks!",":e Check the tesla, you shits!",":e STOP HOT-WIRING THE ENGINE, FUCKING CHRIST!",":e Wire the solars, you lazy bums!",":e WHO TOOK THE DAMN HARDSUITS?",":e OH GOD ITS FREE CALL THE SHUTTLE")
speak = list("Poly wanna cracker!", ":eCheck the singlo, you chucklefucks!",":eCheck the tesla, you shits!",":eSTOP HOT-WIRING THE ENGINE, FUCKING CHRIST!",":eWire the solars, you lazy bums!",":eWHO TOOK THE DAMN HARDSUITS?",":eOH GOD ITS FREE CALL THE SHUTTLE")
/mob/living/simple_animal/parrot/Poly/New()
ears = new /obj/item/device/radio/headset/headset_eng(src)
available_channels = list(":e")
..()
/mob/living/simple_animal/parrot/say(var/message)
if(stat)
return
var/verb = "says"
if(speak_emote.len)
verb = pick(speak_emote)
var/message_mode = null
if(copytext(message,1,2) == ";")
message_mode = "headset"
message = copytext(message,2)
if(copytext(message,1,2) == ":")
var/channel_prefix = copytext(message, 1 ,3)
message_mode = department_radio_keys[channel_prefix]
var/positioncut = 3
message = trim(copytext(message,positioncut))
message = capitalize(trim_left(message))
if(message_mode)
if(ears && istype(ears,/obj/item/device/radio))
ears.talk_into(src, message, message_mode, verb, null)
..(message)
/mob/living/simple_animal/parrot/handle_message_mode(var/message_mode, var/message, var/verb, var/speaking, var/used_radios, var/alt_name)
if(message_mode && istype(ears))
ears.talk_into(src, message, message_mode, verb, speaking)
used_radios += ears
/mob/living/simple_animal/parrot/hear_say(var/message, var/verb = "says", var/datum/language/language = null, var/alt_name = "",var/italics = 0, var/mob/speaker = null)
if(prob(50))
@@ -726,7 +702,7 @@
/mob/living/simple_animal/parrot/hear_radio(var/message, var/verb="says", var/datum/language/language=null, var/part_a, var/part_b, var/mob/speaker = null, var/hard_to_hear = 0, var/atom/follow_target)
if(prob(50))
parrot_hear("[pick(available_channels)] [message]")
parrot_hear("[pick(available_channels)][message]")
..()
@@ -24,8 +24,6 @@
var/turns_per_move = 1
var/turns_since_move = 0
universal_speak = 0
var/meat_amount = 0
var/meat_type
var/stop_automated_movement = 0 //Use this to temporarely stop random movement or to if you write special movement code for animals.
var/wander = 1 // Does the mob wander around when idle?
var/stop_automated_movement_when_pulled = 1 //When set to 1 this stops the animal from moving when someone is pulling it.
@@ -269,9 +267,10 @@
/mob/living/simple_animal/gib()
if(icon_gib)
flick(icon_gib, src)
if(meat_amount && meat_type)
for(var/i = 0; i < meat_amount; i++)
new meat_type(src.loc)
if(butcher_results)
for(var/path in butcher_results)
for(var/i = 1; i <= butcher_results[path];i++)
new path(src.loc)
..()
@@ -444,9 +443,6 @@
name = C.tagname
real_name = C.tagname
return
else if(meat_type && (stat == DEAD)) //if the animal has a meat, and if it is dead.
if(istype(O, /obj/item/weapon/kitchen/knife))
harvest()
else
user.changeNext_move(CLICK_CD_MELEE)
user.do_attack_animation(src)
@@ -467,6 +463,7 @@
user.visible_message("<span class='warning'>[user] gently taps [src] with [O].</span>",\
"<span class='warning'>This weapon is ineffective, it does no damage.</span>")
adjustBruteLoss(damage)
..()
/mob/living/simple_animal/movement_delay()
@@ -614,12 +611,6 @@
if(alone && partner && children < 3)
new childtype(loc)
// Harvest an animal's delicious byproducts
/mob/living/simple_animal/proc/harvest()
gib()
return
/mob/living/simple_animal/say_quote(var/message)
var/verb = "says"
@@ -704,4 +695,4 @@
. |= collar.GetAccess()
/mob/living/simple_animal/proc/sentience_act() //Called when a simple animal gains sentience via gold slime potion
return
return
@@ -16,8 +16,7 @@ var/global/totaltribbles = 0 //global variable so it updates for all tribbles,
turns_per_move = 5
maxHealth = 10
health = 10
meat_type = /obj/item/stack/sheet/fur
meat_amount = 1
butcher_results = list(/obj/item/stack/sheet/fur = 1)
response_help = "pets"
response_disarm = "gently pushes aside"
response_harm = "whacks"
+6 -10
View File
@@ -6,6 +6,8 @@
hud_used = null
if(mind && mind.current == src)
spellremove(src)
for(var/infection in viruses)
qdel(infection)
ghostize()
for(var/mob/dead/observer/M in following_mobs)
M.following = null
@@ -174,6 +176,10 @@
equip_to_slot_if_possible(C, slot)
else
equip_to_slot_if_possible(W, slot)
else
W = get_item_by_slot(slot)
if(W)
W.attack_hand(src)
if(ishuman(src) && W == src:head)
src:update_hair()
@@ -1373,16 +1379,6 @@ mob/proc/yank_out_object()
location.add_vomit_floor(src, 1)
playsound(location, 'sound/effects/splat.ogg', 50, 1)
/mob/proc/fakepoop() //for aesthetic craps. Whyyyyy -Fox
if(stat==DEAD)
return
var/turf/location = loc
if (istype(location, /turf/simulated))
src.visible_message("<span class='warning'>[src] has explosive diarrhea all over the floor!</span>","<span class='warning'>You have explosive diarrhea all over the floor!</span>")
location.add_poop_floor()
playsound(location, 'sound/effects/splat.ogg', 50, 1)
/mob/proc/adjustEarDamage()
return
+4 -2
View File
@@ -195,8 +195,8 @@
//List of active diseases
var/viruses = list() // replaces var/datum/disease/virus
var/list/viruses = list() // replaces var/datum/disease/virus
var/list/resistances = list()
mouse_drag_pointer = MOUSE_ACTIVE_POINTER
@@ -212,6 +212,8 @@
var/atom/movable/remote_control //Calls relaymove() to whatever it is
var/remote_view = 0 // Set to 1 to prevent view resets on Life
var/obj/control_object //Used by admins to possess objects. All mobs should have this var
var/datum/visibility_interface/visibility_interface = null // used by the visibility system to provide an interface for the visibility networks
+2 -1
View File
@@ -10,7 +10,8 @@ var/global/image/typing_indicator
/mob/proc/set_typing_indicator(var/state)
if(!typing_indicator)
typing_indicator = image('icons/mob/talk.dmi',null,"typing")
typing_indicator = image('icons/mob/talk.dmi', null, "typing", MOB_LAYER + 1)
typing_indicator.appearance_flags = APPEARANCE_UI_IGNORE_ALPHA
if(ishuman(src))
var/mob/living/carbon/human/H = src