mirror of
https://github.com/ParadiseSS13/Paradise.git
synced 2026-08-21 11:07:12 +01:00
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:
@@ -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()
|
||||
..()
|
||||
|
||||
@@ -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> </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 += " <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
|
||||
|
||||
|
||||
@@ -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
|
||||
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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()
|
||||
|
||||
@@ -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.
|
||||
@@ -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)
|
||||
@@ -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
|
||||
|
||||
@@ -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
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
|
||||
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user