Fixes merge conflict in admin_verbs.dm

This commit is contained in:
Kyep
2016-10-01 13:26:24 -07:00
1099 changed files with 20987 additions and 61369 deletions
+4
View File
@@ -3,5 +3,9 @@
if(ghostimage)
ghostimage.icon_state = src.icon_state
updateghostimages()
if(non_respawnable_keys[ckey])
can_reenter_corpse = 0
respawnable_list -= src
update_interface()
+32 -21
View File
@@ -16,7 +16,6 @@ var/list/image/ghost_darkness_images = list() //this is a list of images for thi
anchored = 1 // don't get pushed around
invisibility = INVISIBILITY_OBSERVER
var/can_reenter_corpse
var/datum/hud/living/carbon/hud = null // hud
var/bootime = 0
var/started_as_observer //This variable is set to 1 when you enter the game as an observer.
//If you died in the game and are a ghsot - this will remain as null.
@@ -129,11 +128,15 @@ Works together with spawning an observer, noted above.
/mob/proc/ghostize(var/flags = GHOST_CAN_REENTER)
if(key)
if(non_respawnable_keys[ckey])
flags &= ~GHOST_CAN_REENTER
var/mob/dead/observer/ghost = new(src, flags) //Transfer safety to observer spawning proc.
ghost.timeofdeath = src.timeofdeath //BS12 EDIT
respawnable_list -= src
if(ghost.can_reenter_corpse)
respawnable_list += ghost
else
non_respawnable_keys[ckey] = 1
ghost.key = key
if(!(ghost.client && ghost.client.holder) && !config.antag_hud_allowed) // For new ghosts we remove the verb from even showing up if it's not allowed.
ghost.verbs -= /mob/dead/observer/verb/toggle_antagHUD // Poor guys, don't know what they are missing!
@@ -148,12 +151,28 @@ This is the proc mobs get to turn into a ghost. Forked from ghostize due to comp
set desc = "Relinquish your life and enter the land of the dead."
var/mob/M = src
var/warningmsg = null
var/obj/machinery/cryopod/P = istype(loc, /obj/machinery/cryopod) && loc
if(stat == DEAD)
if(P)
if(TOO_EARLY_TO_GHOST)
warningmsg = "It's too early in the shift to enter cryo"
// If it's not too early, we'll skip straight to ghosting out without penalty
else if(suiciding && TOO_EARLY_TO_GHOST)
warningmsg = "You have committed suicide too early in the round"
else if(stat != DEAD)
warningmsg = "You are alive"
else if(non_respawnable_keys[ckey])
warningmsg = "You have lost your right to respawn"
if(!warningmsg)
ghostize(1)
else
var/response = alert(src, "Are you -sure- you want to ghost?\n(You are alive. If you ghost now, you probably won't be able to rejoin the round! You can't change your mind, so choose wisely!)","Are you sure you want to ghost?","Ghost","Stay in body")
if(response != "Ghost") return //didn't want to ghost after-all
var/response
var/alertmsg = "Are you -sure- you want to ghost?\n([warningmsg]. If you ghost now, you probably won't be able to rejoin the round! You can't change your mind, so choose wisely!)"
response = alert(src, alertmsg,"Are you sure you want to ghost?","Ghost","Stay in body")
if(response != "Ghost")
return //didn't want to ghost after-all
resting = 1
var/mob/dead/observer/ghost = ghostize(0) //0 parameter is so we can never re-enter our body, "Charlie, you can never come baaaack~" :3
ghost.timeofdeath = world.time // Because the living mob won't have a time of death and we want the respawn timer to work properly.
@@ -162,8 +181,7 @@ This is the proc mobs get to turn into a ghost. Forked from ghostize due to comp
Morgue = M.loc
if(Morgue)
Morgue.update()
if(istype(M.loc, /obj/machinery/cryopod))
var/obj/machinery/cryopod/P = M.loc
if(P)
if(!P.control_computer)
P.find_control_computer(urgent=1)
if(P.control_computer)
@@ -207,13 +225,6 @@ This is the proc mobs get to turn into a ghost. Forked from ghostize due to comp
statpanel("Status")
if(client.statpanel == "Status")
show_stat_station_time()
if(ticker)
if(ticker.mode)
// to_chat(world, "DEBUG: ticker not null")
if(ticker.mode.name == "AI malfunction")
// to_chat(world, "DEBUG: malf mode ticker test")
if(ticker.mode:malf_mode_declared)
stat(null, "Time left: [max(ticker.mode:AI_win_timeleft/(ticker.mode:apcs/3), 0)]")
show_stat_emergency_shuttle_eta()
/mob/dead/observer/verb/reenter_corpse()
@@ -266,7 +277,7 @@ This is the proc mobs get to turn into a ghost. Forked from ghostize due to comp
source.layer = FLOAT_LAYER
A.overlays += source
source.layer = old_layer
to_chat(src, "<span class='ghostalert'><a href=?src=\ref[src];reenter=1>(Click to re-enter)</a></span>")
to_chat(src, "<span class='ghostalert'><a href=?src=[UID()];reenter=1>(Click to re-enter)</a></span>")
if(sound)
src << sound(sound)
@@ -311,7 +322,7 @@ This is the proc mobs get to turn into a ghost. Forked from ghostize due to comp
return
var/mob/dead/observer/M = src
if(jobban_isbanned(M, "AntagHUD"))
to_chat(src, "\red <B>You have been banned from using this feature</B>")
to_chat(src, "<span class='danger'>You have been banned from using this feature</span>")
return
if(config.antag_hud_restricted && !M.has_enabled_antagHUD && !check_rights(R_ADMIN|R_MOD,0))
var/response = alert(src, "If you turn this on, you will not be able to take any part in the round.","Are you sure you want to turn this feature on?","Yes","No")
@@ -480,7 +491,7 @@ This is the proc mobs get to turn into a ghost. Forked from ghostize due to comp
var/pressure = environment.return_pressure()
var/total_moles = environment.total_moles()
to_chat(src, "\blue <B>Results:</B>")
to_chat(src, "<span class='boldnotice'>Results:</span>")
if(abs(pressure - ONE_ATMOSPHERE) < 10)
to_chat(src, "\blue Pressure: [round(pressure,0.1)] kPa")
else
@@ -539,18 +550,18 @@ This is the proc mobs get to turn into a ghost. Forked from ghostize due to comp
if((!target) || (!ghost)) return
if(isAI(target)) // AI core/eye follow links
var/mob/living/silicon/ai/A = target
. = "<a href='byond://?src=\ref[ghost];follow=\ref[A]'>core</a>"
. = "<a href='byond://?src=[ghost.UID()];follow=\ref[A]'>core</a>"
if(A.client && A.eyeobj) // No point following clientless AI eyes
. += "|<a href='byond://?src=\ref[ghost];follow=\ref[A.eyeobj]'>eye</a>"
. += "|<a href='byond://?src=[ghost.UID()];follow=\ref[A.eyeobj]'>eye</a>"
return
else if(istype(target, /mob/dead/observer))
var/mob/dead/observer/O = target
. = "<a href='byond://?src=\ref[ghost];follow=\ref[target]'>follow</a>"
. = "<a href='byond://?src=[ghost.UID()];follow=\ref[target]'>follow</a>"
if(O.mind && O.mind.current)
. += "|<a href='byond://?src=\ref[ghost];follow=\ref[O.mind.current]'>body</a>"
. += "|<a href='byond://?src=[ghost.UID()];follow=\ref[O.mind.current]'>body</a>"
return
else
return "<a href='byond://?src=\ref[ghost];follow=\ref[target]'>follow</a>"
return "<a href='byond://?src=[ghost.UID()];follow=\ref[target]'>follow</a>"
//BEGIN TELEPORT HREF CODE
/mob/dead/observer/Topic(href, href_list)
+3 -3
View File
@@ -163,14 +163,14 @@
if(changed_voice)
if(impersonating)
track = "<a href='byond://?src=\ref[src];track=\ref[impersonating]'>[speaker_name] ([jobname])</a>"
track = "<a href='byond://?src=[UID()];track=\ref[impersonating]'>[speaker_name] ([jobname])</a>"
else
track = "[speaker_name] ([jobname])"
else
if(istype(follow_target, /mob/living/simple_animal/bot))
track = "<a href='byond://?src=\ref[src];trackbot=\ref[follow_target]'>[speaker_name] ([jobname])</a>"
track = "<a href='byond://?src=[UID()];trackbot=\ref[follow_target]'>[speaker_name] ([jobname])</a>"
else
track = "<a href='byond://?src=\ref[src];track=\ref[speaker]'>[speaker_name] ([jobname])</a>"
track = "<a href='byond://?src=[UID()];track=\ref[speaker]'>[speaker_name] ([jobname])</a>"
if(isobserver(src))
if(speaker && (speaker_name != speaker.real_name) && !isAI(speaker)) //Announce computer and various stuff that broadcasts doesn't use it's real name but AI's can't pretend to be other mobs.
+35
View File
@@ -161,6 +161,41 @@
return items
/obj/item/proc/equip_to_best_slot(mob/M)
if(src != M.get_active_hand())
to_chat(M, "<span class='warning'>You are not holding anything to equip!</span>")
return 0
if(M.equip_to_appropriate_slot(src))
if(M.hand)
M.update_inv_l_hand(0)
else
M.update_inv_r_hand(0)
return 1
if(M.s_active && M.s_active.can_be_inserted(src, 1)) //if storage active insert there
M.s_active.handle_item_insertion(src)
return 1
var/obj/item/weapon/storage/S = M.get_inactive_hand()
if(istype(S) && S.can_be_inserted(src, 1)) //see if we have box in other hand
S.handle_item_insertion(src)
return 1
S = M.get_item_by_slot(slot_belt)
if(istype(S) && S.can_be_inserted(src, 1)) //else we put in belt
S.handle_item_insertion(src)
return 1
S = M.get_item_by_slot(slot_back) //else we put in backpack
if(istype(S) && S.can_be_inserted(src, 1))
S.handle_item_insertion(src)
playsound(loc, "rustle", 50, 1, -5)
return 1
to_chat(M, "<span class='warning'>You are unable to equip that!</span>")
return 0
/mob/proc/get_all_slots()
return list(wear_mask, back, l_hand, r_hand)
+4 -4
View File
@@ -534,7 +534,7 @@
if(drone_only && !istype(S,/mob/living/silicon/robot/drone))
continue
else if(istype(S , /mob/living/silicon/ai))
message_start = "<i><span class='game say'>[name], <a href='byond://?src=\ref[S];track=\ref[speaker]'><span class='name'>[speaker.name]</span></a>"
message_start = "<i><span class='game say'>[name], <a href='byond://?src=[S.UID()];track=\ref[speaker]'><span class='name'>[speaker.name]</span></a>"
else if(!S.binarycheck())
continue
@@ -617,14 +617,14 @@
var/dat = "<b><font size = 5>Known Languages</font></b><br/><br/>"
if(default_language)
dat += "Current default language: [default_language] - <a href='byond://?src=\ref[src];default_lang=reset'>reset</a><br/><br/>"
dat += "Current default language: [default_language] - <a href='byond://?src=[UID()];default_lang=reset'>reset</a><br/><br/>"
for(var/datum/language/L in languages)
if(!(L.flags & NONGLOBAL))
if(L == default_language)
dat += "<b>[L.name] (:[L.key])</b> - default - <a href='byond://?src=\ref[src];default_lang=reset'>reset</a><br/>[L.desc]<br/><br/>"
dat += "<b>[L.name] (:[L.key])</b> - default - <a href='byond://?src=[UID()];default_lang=reset'>reset</a><br/>[L.desc]<br/><br/>"
else
dat += "<b>[L.name] (:[L.key])</b> - <a href=\"byond://?src=\ref[src];default_lang=[L]\">set default</a><br/>[L.desc]<br/><br/>"
dat += "<b>[L.name] (:[L.key])</b> - <a href=\"byond://?src=[UID()];default_lang=[L]\">set default</a><br/>[L.desc]<br/><br/>"
src << browse(dat, "window=checklanguage")
+1 -1
View File
@@ -4,7 +4,7 @@
#define HEAT_DAMAGE_LEVEL_1 2 //Amount of damage applied when your body temperature just passes the 360.15k safety point
#define HEAT_DAMAGE_LEVEL_2 3 //Amount of damage applied when your body temperature passes the 400K point
#define HEAT_DAMAGE_LEVEL_3 8 //Amount of damage applied when your body temperature passes the 1000K point
#define HEAT_DAMAGE_LEVEL_3 10 //Amount of damage applied when your body temperature passes the 1000K point
#define COLD_DAMAGE_LEVEL_1 0.5 //Amount of damage applied when your body temperature just passes the 260.15k safety point
#define COLD_DAMAGE_LEVEL_2 1.5 //Amount of damage applied when your body temperature passes the 200K point
@@ -29,7 +29,7 @@
ventcrawler = 2
/mob/living/carbon/alien/New()
verbs += /mob/living/carbon/verb/mob_sleep
verbs += /mob/living/verb/mob_sleep
verbs += /mob/living/verb/lay_down
internal_organs += new /obj/item/organ/internal/brain/xeno
internal_organs += new /obj/item/organ/internal/xenos/hivenode
@@ -35,7 +35,7 @@ In all, this is a lot like the monkey code. /N
visible_message("<span class='danger'>[M.name] bites [src]!</span>", \
"<span class='userdanger'>[M.name] bites [src]!</span>")
adjustBruteLoss(damage)
add_logs(src, M, "attacked", admin=0)
add_logs(M, src, "attacked", admin=0)
updatehealth()
else
to_chat(M, "<span class='warning'>[name] is too injured for that.</span>")
@@ -79,4 +79,4 @@ In all, this is a lot like the monkey code. /N
adjustCloneLoss(damage)
if(STAMINA)
adjustStaminaLoss(damage)
updatehealth()
updatehealth()
@@ -54,7 +54,7 @@
update_canmove()
update_icons()
timeofdeath = worldtime2text()
if(mind) mind.store_memory("Time of death: [timeofdeath]", 0)
timeofdeath = world.time
if(mind) mind.store_memory("Time of death: [worldtime2text(timeofdeath)]", 0)
return ..(gibbed)
@@ -96,7 +96,7 @@
var/blocked = 0
if(ishuman(A))
var/mob/living/carbon/human/H = A
if(H.check_shields(90, "the [name]", src, attack_type = THROWN_PROJECTILE_ATTACK))
if(H.check_shields(0, "the [name]", src, attack_type = LEAP_ATTACK))
blocked = 1
if(!blocked)
L.visible_message("<span class ='danger'>[src] pounces on [L]!</span>", "<span class ='userdanger'>[src] pounces on you!</span>")
@@ -107,6 +107,8 @@
L.Weaken(5)
sleep(2)//Runtime prevention (infinite bump() calls on hulks)
step_towards(src,L)
else
weakened = 2
toggle_leap(0)
pounce_cooldown = !pounce_cooldown
@@ -168,4 +170,4 @@
src.throwing = 0
return 1
return 1
@@ -5,6 +5,7 @@
health = 700
icon_state = "alienq_s"
status_flags = CANPARALYSE
mob_size = MOB_SIZE_LARGE
move_delay_add = 3
large = 1
ventcrawler = 0
@@ -319,19 +319,19 @@ In all, this is a lot like the monkey code. /N
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><B>Left Hand:</B></td><td><A href='?src=[UID()];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=[UID()];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>Head:</B></td><td><A href='?src=\ref[src];item=[slot_head]'>[(head && !(head.flags&ABSTRACT)) ? head : "<font color=grey>Empty</font>"]</A></td></tr>"
dat += "<tr><td><B>Head:</B></td><td><A href='?src=[UID()];item=[slot_head]'>[(head && !(head.flags&ABSTRACT)) ? head : "<font color=grey>Empty</font>"]</A></td></tr>"
dat += "<tr><td>&nbsp;</td></tr>"
dat += "<tr><td><B>Exosuit:</B></td><td><A href='?src=\ref[src];item=[slot_wear_suit]'>[(wear_suit && !(wear_suit.flags&ABSTRACT)) ? wear_suit : "<font color=grey>Empty</font>"]</A></td></tr>"
dat += "<tr><td><B>Pouches:</B></td><td><A href='?src=\ref[src];item=pockets'>[((l_store && !(l_store.flags&ABSTRACT)) || (r_store && !(r_store.flags&ABSTRACT))) ? "Full" : "<font color=grey>Empty</font>"]</A>"
dat += "<tr><td><B>Exosuit:</B></td><td><A href='?src=[UID()];item=[slot_wear_suit]'>[(wear_suit && !(wear_suit.flags&ABSTRACT)) ? wear_suit : "<font color=grey>Empty</font>"]</A></td></tr>"
dat += "<tr><td><B>Pouches:</B></td><td><A href='?src=[UID()];item=pockets'>[((l_store && !(l_store.flags&ABSTRACT)) || (r_store && !(r_store.flags&ABSTRACT))) ? "Full" : "<font color=grey>Empty</font>"]</A>"
dat += {"</table>
<A href='?src=\ref[user];mach_close=mob\ref[src]'>Close</A>
<A href='?src=[user.UID()];mach_close=mob\ref[src]'>Close</A>
"}
var/datum/browser/popup = new(user, "mob\ref[src]", "[src]", 440, 500)
@@ -8,8 +8,8 @@
visible_message("<span class='name'>[src]</span> lets out a waning high-pitched cry.")
update_canmove()
timeofdeath = worldtime2text()
if(mind) mind.store_memory("Time of death: [timeofdeath]", 0)
timeofdeath = world.time
if(mind) mind.store_memory("Time of death: [worldtime2text(timeofdeath)]", 0)
living_mob_list -= src
return ..(gibbed)
@@ -3,6 +3,7 @@
real_name = "alien larva"
icon_state = "larva0"
pass_flags = PASSTABLE | PASSMOB
mob_size = MOB_SIZE_SMALL
maxHealth = 30
health = 30
@@ -38,7 +39,7 @@
var/mob/tmob = AM
if(istype(tmob, /mob/living/carbon/human) && (FAT in tmob.mutations))
if(prob(70))
to_chat(src, "\red <B>You fail to push [tmob]'s fat ass out of the way.</B>")
to_chat(src, "<span class='danger'>You fail to push [tmob]'s fat ass out of the way.</span>")
now_pushing = 0
return
if(!(tmob.status_flags & CANPUSH))
@@ -115,7 +116,7 @@
"<span class='userdanger'>[M] [M.attacktext] [src]!</span>")
var/damage = rand(M.melee_damage_lower, M.melee_damage_upper)
adjustBruteLoss(damage)
add_logs(src, M, "attacked", admin=0)
add_logs(M, src, "attacked", admin=0)
updatehealth()
@@ -244,4 +245,4 @@
else
var/mob/living/carbon/alien/humanoid/A = new(loc)
A.key = key
qdel(src) */
qdel(src) */
@@ -33,7 +33,7 @@
if(amount_grown >= max_grown) //TODO ~Carn
//green is impossible to read, so i made these blue and changed the formatting slightly
to_chat(src, "\blue <b>You are growing into a beautiful alien! It is time to choose a caste.</b>")
to_chat(src, "<span class='boldnotice'>You are growing into a beautiful alien! It is time to choose a caste.</span>")
to_chat(src, "\blue There are three to choose from:")
to_chat(src, "<B>Hunters</B> \blue are strong and agile, able to hunt away from the hive and rapidly move through ventilation shafts. Hunters generate plasma slowly and have low reserves.")
to_chat(src, "<B>Sentinels</B> \blue are tasked with protecting the hive and are deadly up close and at a range. They are not as physically imposing nor fast as the hunters.")
@@ -97,7 +97,7 @@
ticker.mode.xenos += new_xeno.mind
new_xeno.mind.name = new_xeno.name
new_xeno.mind.assigned_role = "MODE"
new_xeno.mind.special_role = "Alien"
new_xeno.mind.special_role = SPECIAL_ROLE_XENOMORPH
new_xeno << sound('sound/voice/hiss5.ogg',0,0,0,100)//To get the player's attention
if(gib_on_success)
+25 -3
View File
@@ -28,7 +28,7 @@
return
if(held_brain)
to_chat(user, "<span class='userdanger'>Somehow, this MMI still has a brain in it. Report this to the bug tracker.</span>")
log_to_dd("[user] tried to stick a [O] into [src] in [get_area(src)], but the held brain variable wasn't cleared")
log_runtime(EXCEPTION("[user] tried to stick a [O] into [src] in [get_area(src)], but the held brain variable wasn't cleared"), src)
return
for(var/mob/V in viewers(src, null))
V.show_message("<span class='notice'>[user] sticks \a [O] into \the [src].</span>")
@@ -101,7 +101,7 @@
//problem i was having with alien/nonalien brain drops.
/obj/item/device/mmi/proc/dropbrain(var/turf/dropspot)
if(isnull(held_brain))
log_to_dd("[src] at [loc] attempted to drop brain without a contained brain in [get_area(src)].")
log_runtime(EXCEPTION("[src] at [loc] attempted to drop brain without a contained brain in [get_area(src)]."), src)
to_chat(brainmob, "<span class='userdanger'>Your MMI did not contain a brain! We'll make a new one for you, but you'd best report this to the bugtracker!</span>")
held_brain = new(dropspot) // Let's not ruin someone's round because of something dumb -- Crazylemon
held_brain.dna = brainmob.dna.Clone()
@@ -178,4 +178,26 @@
/obj/item/device/mmi/syndie
name = "Syndicate Man-Machine Interface"
desc = "Syndicate's own brand of MMI. It enforces laws designed to help Syndicate agents achieve their goals upon cyborgs created with it, but doesn't fit in Nanotrasen AI cores."
syndiemmi = 1
syndiemmi = 1
/obj/item/device/mmi/attempt_become_organ(obj/item/organ/external/parent,mob/living/carbon/human/H)
if(!brainmob)
return 0
if(!parent)
log_debug("Attempting to insert into a null parent!")
return 0
if(H.get_int_organ(/obj/item/organ/internal/brain))
// one brain at a time
return 0
var/obj/item/organ/internal/brain/mmi_holder/holder = new()
holder.parent_organ = parent.limb_name
forceMove(holder)
holder.stored_mmi = src
holder.update_from_mmi()
if(istype(src, /obj/item/device/mmi/posibrain))
holder.robotize()
if(brainmob && brainmob.mind)
brainmob.mind.transfer_to(H)
holder.insert(H)
return 1
@@ -4,7 +4,6 @@
var/obj/item/container = null
var/timeofhostdeath = 0
var/emp_damage = 0//Handles a type of MMI damage
var/alert = null
use_me = 0 //Can't use the me verb, it's a freaking immobile brain
icon = 'icons/obj/surgery.dmi'
icon_state = "brain1"
@@ -40,7 +40,7 @@
/obj/item/organ/internal/brain/proc/transfer_identity(var/mob/living/carbon/H)
brainmob = new(src)
if(isnull(dna)) // someone didn't set this right...
log_to_dd("[src] at [loc] did not contain a dna datum at time of removal.")
log_runtime(EXCEPTION("[src] at [loc] did not contain a dna datum at time of removal."), src)
dna = H.dna.Clone()
name = "\the [dna.real_name]'s [initial(src.name)]"
brainmob.dna = dna.Clone() // Silly baycode, what you do
@@ -79,7 +79,7 @@
if(istype(owner,/mob/living/carbon/human))
var/mob/living/carbon/human/H = owner
H.update_hair(1)
..()
. = ..()
/obj/item/organ/internal/brain/insert(var/mob/living/target,special = 0)
@@ -100,7 +100,9 @@
brainmob.mind.transfer_to(target)
else
target.key = brainmob.key
..(target, special = special, dont_remove_slot = brain_already_exists)
else
log_debug("Multibrain shenanigans at ([target.x],[target.y],[target.z]), mob '[target]'")
..(target, special = special)
/obj/item/organ/internal/brain/prepare_eat()
return // Too important to eat.
@@ -113,7 +115,7 @@
mmi_icon_state = "slime_mmi"
// parent_organ = "chest" Hello I am from the ministry of rubber forehead aliens how are you
/obj/item/organ/brain/slime/take_damage(var/amount, var/silent = 1)
/obj/item/organ/internal/brain/slime/take_damage(var/amount, var/silent = 1)
//Slimes are 150% more vulnerable to brain damage
damage = between(0, src.damage + (1.5*amount), max_damage) //Since they take the damage twice, this is +150%
return ..()
@@ -2,7 +2,7 @@
if(stat == DEAD) return
if(!gibbed && container && istype(container, /obj/item/device/mmi))//If not gibbed but in a container.
for(var/mob/O in viewers(container, null))
O.show_message(text("\red <B>[]'s MMI flatlines!</B>", src), 1, "\red You hear something flatline.", 2)
O.show_message(text("<span class='danger'>[]'s MMI flatlines!</span>", src), 1, "\red You hear something flatline.", 2)
container.icon_state = "mmi_dead"
stat = DEAD
@@ -10,8 +10,8 @@
see_in_dark = 8
see_invisible = SEE_INVISIBLE_LEVEL_TWO
timeofdeath = worldtime2text()
if(mind) mind.store_memory("Time of death: [timeofdeath]", 0) //mind. ?
timeofdeath = world.time
if(mind) mind.store_memory("Time of death: [worldtime2text(timeofdeath)]", 0) //mind. ?
return ..(gibbed)
@@ -39,4 +39,4 @@
qdel(loc)//Gets rid of the brain item
spawn(15)
if(animation) qdel(animation)
if(src) qdel(src)
if(src) qdel(src)
@@ -13,6 +13,7 @@
req_access = list(access_robotics)
mecha = null//This does not appear to be used outside of reference in mecha.dm.
var/silenced = 0 //if set to 1, they can't talk.
var/next_ping_at = 0
/obj/item/device/mmi/posibrain/attack_self(mob/user as mob)
@@ -46,13 +47,15 @@
/obj/item/device/mmi/posibrain/proc/request_player()
for(var/mob/dead/observer/O in player_list)
if(check_observer(O))
to_chat(O, "<span class='boldnotice'>\A [src] has been activated. (<a href='?src=\ref[O];jump=\ref[src]'>Teleport</a> | <a href='?src=\ref[src];signup=\ref[O]'>Sign Up</a>)</span>")
to_chat(O, "<span class='boldnotice'>\A [src] has been activated. (<a href='?src=[O.UID()];jump=\ref[src]'>Teleport</a> | <a href='?src=[UID()];signup=\ref[O]'>Sign Up</a>)</span>")
/obj/item/device/mmi/posibrain/proc/check_observer(var/mob/dead/observer/O)
if(O.has_enabled_antagHUD == 1 && config.antag_hud_restricted)
return 0
if(jobban_isbanned(O, "Cyborg") || jobban_isbanned(O,"nonhumandept"))
return 0
if(!O.can_reenter_corpse)
return 0
if(O.client)
return 1
return 0
@@ -69,7 +72,7 @@
// This should not ever happen, but let's be safe
/obj/item/device/mmi/posibrain/dropbrain(var/turf/dropspot)
log_to_dd("[src] at [loc] attempted to drop brain without a contained brain.")
log_runtime(EXCEPTION("[src] at [loc] attempted to drop brain without a contained brain."), src)
return
/obj/item/device/mmi/posibrain/transfer_identity(var/mob/living/carbon/H)
@@ -190,7 +193,12 @@
/obj/item/device/mmi/posibrain/attack_ghost(var/mob/dead/observer/O)
if(searching)
volunteer(O)
else
return
if(brainmob && brainmob.key)
return // No point pinging a posibrain with a player already inside
if(check_observer(O) && (world.time >= next_ping_at))
next_ping_at = world.time + (20 SECONDS)
playsound(get_turf(src), 'sound/items/posiping.ogg', 80, 0)
var/turf/T = get_turf_or_move(src.loc)
for(var/mob/M in viewers(T))
M.show_message("\blue The positronic brain pings softly.")
+11 -16
View File
@@ -541,7 +541,7 @@ var/list/ventcrawl_machinery = list(/obj/machinery/atmospherics/unary/vent_pump,
var/start_T_descriptor = "<font color='#6b5d00'>tile at [start_T.x], [start_T.y], [start_T.z] in area [get_area(start_T)]</font>"
var/end_T_descriptor = "<font color='#6b4400'>tile at [end_T.x], [end_T.y], [end_T.z] in area [get_area(end_T)]</font>"
add_logs(throwable_mob, src, "thrown", addition="from [start_T_descriptor] with the target [end_T_descriptor]")
add_logs(src, throwable_mob, "thrown", addition="from [start_T_descriptor] with the target [end_T_descriptor]")
else if(!(I.flags & ABSTRACT)) //can't throw abstract items
thrown_thing = I
@@ -551,12 +551,7 @@ var/list/ventcrawl_machinery = list(/obj/machinery/atmospherics/unary/vent_pump,
visible_message("<span class='danger'>[src] has thrown [thrown_thing].</span>")
newtonian_move(get_dir(target, src))
thrown_thing.throw_at(target, thrown_thing.throw_range, thrown_thing.throw_speed, src)
/*
/mob/living/carbon/fire_act(datum/gas_mixture/air, exposed_temperature, exposed_volume)
..()
src.IgniteMob()
bodytemperature = max(bodytemperature, BODYTEMP_HEAT_DAMAGE_LIMIT+10)
*/
/mob/living/carbon/can_use_hands()
if(handcuffed)
return 0
@@ -596,27 +591,27 @@ var/list/ventcrawl_machinery = list(/obj/machinery/atmospherics/unary/vent_pump,
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><B>Left Hand:</B></td><td><A href='?src=[UID()];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=[UID()];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>"
dat += "<tr><td><B>Back:</B></td><td><A href='?src=[UID()];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>"
dat += "&nbsp;<A href='?src=[UID()];internal=[slot_back]'>[internal ? "Disable Internals" : "Set Internals"]</A>"
dat += "</td></tr><tr><td>&nbsp;</td></tr>"
dat += "<tr><td><B>Head:</B></td><td><A href='?src=\ref[src];item=[slot_head]'>[(head && !(head.flags&ABSTRACT)) ? head : "<font color=grey>Empty</font>"]</A></td></tr>"
dat += "<tr><td><B>Head:</B></td><td><A href='?src=[UID()];item=[slot_head]'>[(head && !(head.flags&ABSTRACT)) ? head : "<font color=grey>Empty</font>"]</A></td></tr>"
dat += "<tr><td><B>Mask:</B></td><td><A href='?src=\ref[src];item=[slot_wear_mask]'>[(wear_mask && !(wear_mask.flags&ABSTRACT)) ? wear_mask : "<font color=grey>Empty</font>"]</A></td></tr>"
dat += "<tr><td><B>Mask:</B></td><td><A href='?src=[UID()];item=[slot_wear_mask]'>[(wear_mask && !(wear_mask.flags&ABSTRACT)) ? wear_mask : "<font color=grey>Empty</font>"]</A></td></tr>"
if(handcuffed)
dat += "<tr><td><B>Handcuffed:</B> <A href='?src=\ref[src];item=[slot_handcuffed]'>Remove</A></td></tr>"
dat += "<tr><td><B>Handcuffed:</B> <A href='?src=[UID()];item=[slot_handcuffed]'>Remove</A></td></tr>"
if(legcuffed)
dat += "<tr><td><A href='?src=\ref[src];item=[slot_legcuffed]'>Legcuffed</A></td></tr>"
dat += "<tr><td><A href='?src=[UID()];item=[slot_legcuffed]'>Legcuffed</A></td></tr>"
dat += {"</table>
<A href='?src=\ref[user];mach_close=mob\ref[src]'>Close</A>
<A href='?src=[user.UID()];mach_close=mob\ref[src]'>Close</A>
"}
var/datum/browser/popup = new(user, "mob\ref[src]", "[src]", 440, 500)
@@ -170,14 +170,25 @@
H.ha_style = "None"
update_head_accessory()
/mob/living/carbon/human/proc/change_eye_color(var/red, var/green, var/blue)
if(red == r_eyes && green == g_eyes && blue == b_eyes)
return
/mob/living/carbon/human/proc/change_eye_color(var/red, var/green, var/blue, update_dna = 1)
// Update the main DNA datum, then sync the change across the organs
var/obj/item/organ/internal/eyes/eyes_organ = get_int_organ(/obj/item/organ/internal/eyes)
if(eyes_organ)
var/eyes_red = eyes_organ.eye_colour[1]
var/eyes_green = eyes_organ.eye_colour[2]
var/eyes_blue = eyes_organ.eye_colour[3]
if(red == eyes_red && green == eyes_green && blue == eyes_blue)
return
r_eyes = red
g_eyes = green
b_eyes = blue
eyes_organ.eye_colour[1] = red
eyes_organ.eye_colour[2] = green
eyes_organ.eye_colour[3] = blue
dna.eye_color_to_dna(eyes_organ)
eyes_organ.set_dna(dna)
if(update_dna)
update_dna()
sync_organ_dna(assimilate=0)
update_eyes()
update_body()
return 1
+16 -7
View File
@@ -12,13 +12,15 @@
animation.master = src
playsound(src.loc, 'sound/goonstation/effects/gib.ogg', 50, 1)
else
playsound(src.loc, 'sound/goonstation/effects/robogib.ogg', 50, 1)
for(var/obj/item/organ/internal/I in internal_organs)
if(isturf(loc))
I.remove(src)
I.forceMove(get_turf(src))
var/atom/movable/thing = I.remove(src)
thing.forceMove(get_turf(src))
spawn()
I.throw_at(get_edge_target_turf(src,pick(alldirs)),rand(1,3),5)
thing.throw_at(get_edge_target_turf(src,pick(alldirs)),rand(1,3),5)
for(var/obj/item/organ/external/E in src.organs)
if(istype(E, /obj/item/organ/external/chest))
@@ -38,7 +40,7 @@
flick("gibbed-h", animation)
hgibs(loc, viruses, dna)
else
new /obj/effect/decal/cleanable/blood/gibs/robot(src.loc)
new /obj/effect/decal/cleanable/blood/gibs/robot(loc)
var/datum/effect/system/spark_spread/s = new /datum/effect/system/spark_spread
s.set_up(3, 1, src)
s.start()
@@ -61,7 +63,7 @@
animation.master = src
flick("dust-h", animation)
new /obj/effect/decal/remains/human(loc)
new species.remains_type(get_turf(src))
spawn(15)
if(animation) qdel(animation)
@@ -126,10 +128,10 @@
if(!gibbed)
update_canmove()
timeofdeath = worldtime2text()
timeofdeath = world.time
med_hud_set_health()
med_hud_set_status()
if(mind) mind.store_memory("Time of death: [timeofdeath]", 0)
if(mind) mind.store_memory("Time of death: [worldtime2text(timeofdeath)]", 0)
if(ticker && ticker.mode)
// log_to_dd("k")
sql_report_death(src)
@@ -140,6 +142,13 @@
return ..(gibbed)
/mob/living/carbon/human/update_revive()
..()
// Update healthdoll
if(healthdoll)
// We're alive again, so re-build the entire healthdoll
healthdoll.cached_healthdoll_overlays.Cut()
/mob/living/carbon/human/proc/makeSkeleton()
var/obj/item/organ/external/head/H = get_organ("head")
if(SKELETON in src.mutations) return
@@ -756,10 +756,10 @@
M = A
break
if(M)
message = "\red <B>[src]</B> slaps [M] across the face. Ouch!"
message = "<span class='danger'>[src] slaps [M] across the face. Ouch!</span>"
playsound(src.loc, 'sound/effects/snap.ogg', 50, 1)
else
message = "\red <B>[src]</B> slaps \himself!"
message = "<span class='danger'>[src] slaps \himself!</span>"
playsound(src.loc, 'sound/effects/snap.ogg', 50, 1)
src.adjustFireLoss(4)
@@ -819,6 +819,9 @@
src.gib()
else if(TOXIC_FARTS in mutations)
message = "<b>[src]</b> unleashes a [pick("horrible","terrible","foul","disgusting","awful")] fart."
else if(SUPER_FART in mutations)
message = "<b>[src]</b> unleashes a [pick("loud","deafening")] fart."
newtonian_move(dir)
else
message = "<b>[src]</b> [pick("passes wind","farts")]."
m_type = 2
@@ -468,8 +468,8 @@
if(R.fields["id"] == E.fields["id"])
criminal = R.fields["criminal"]
msg += "<span class = 'deptradio'>Criminal status:</span> <a href='?src=\ref[src];criminal=1'>\[[criminal]\]</a>\n"
msg += "<span class = 'deptradio'>Security records:</span> <a href='?src=\ref[src];secrecord=`'>\[View\]</a> <a href='?src=\ref[src];secrecordadd=`'>\[Add comment\]</a>\n"
msg += "<span class = 'deptradio'>Criminal status:</span> <a href='?src=[UID()];criminal=1'>\[[criminal]\]</a>\n"
msg += "<span class = 'deptradio'>Security records:</span> <a href='?src=[UID()];secrecord=`'>\[View\]</a> <a href='?src=[UID()];secrecordadd=`'>\[Add comment\]</a>\n"
if(hasHUD(user,"medical"))
var/perpname = "wot"
@@ -490,8 +490,8 @@
if(R.fields["id"] == E.fields["id"])
medical = R.fields["p_stat"]
msg += "<span class = 'deptradio'>Physical status:</span> <a href='?src=\ref[src];medical=1'>\[[medical]\]</a>\n"
msg += "<span class = 'deptradio'>Medical records:</span> <a href='?src=\ref[src];medrecord=`'>\[View\]</a> <a href='?src=\ref[src];medrecordadd=`'>\[Add comment\]</a>\n"
msg += "<span class = 'deptradio'>Physical status:</span> <a href='?src=[UID()];medical=1'>\[[medical]\]</a>\n"
msg += "<span class = 'deptradio'>Medical records:</span> <a href='?src=[UID()];medrecord=`'>\[View\]</a> <a href='?src=[UID()];medrecordadd=`'>\[Add comment\]</a>\n"
if(print_flavor_text()) msg += "[print_flavor_text()]\n"
+147 -51
View File
@@ -8,10 +8,11 @@
//why are these here and not in human_defines.dm
//var/list/hud_list[10]
var/datum/species/species //Contains icon generation and language information, set during New().
var/embedded_flag //To check if we've need to roll for damage on movement while an item is imbedded in us.
var/embedded_flag //To check if we've need to roll for damage on movement while an item is imbedded in us.
var/obj/item/weapon/rig/wearing_rig // This is very not good, but it's much much better than calling get_rig() every update_canmove() call.
/mob/living/carbon/human/New(var/new_loc, var/new_species = null, var/delay_ready_dna = 0)
if(!dna)
dna = new /datum/dna(null)
// Species name is handled by set_species()
@@ -22,6 +23,8 @@
else
set_species(delay_icon_update = 1)
..()
if(species)
real_name = species.get_random_name(gender)
name = real_name
@@ -32,8 +35,6 @@
reagents = R
R.my_atom = src
..()
prev_gender = gender // Debug for plural genders
make_blood()
@@ -249,10 +250,6 @@
show_stat_station_time()
if(ticker && ticker.mode && ticker.mode.name == "AI malfunction")
if(ticker.mode:malf_mode_declared)
stat(null, "Time left: [max(ticker.mode:AI_win_timeleft/(ticker.mode:apcs/3), 0)]")
show_stat_emergency_shuttle_eta()
if(client.statpanel == "Status")
@@ -408,13 +405,12 @@
if(M.melee_damage_upper == 0)
M.custom_emote(1, "[M.friendly] [src]")
else
M.do_attack_animation(src)
if(M.attack_sound)
playsound(loc, M.attack_sound, 50, 1, 1)
for(var/mob/O in viewers(src, null))
O.show_message("\red <B>[M]</B> [M.attacktext] [src]!", 1)
M.attack_log += text("\[[time_stamp()]\] <font color='red'>attacked [src.name] ([src.ckey])</font>")
src.attack_log += text("\[[time_stamp()]\] <font color='orange'>was attacked by [M.name] ([M.ckey])</font>")
M.do_attack_animation(src)
visible_message("<span class='danger'>[M] [M.attacktext] [src]!</span>", \
"<span class='userdanger'>[M] [M.attacktext] [src]!</span>")
add_logs(M, src, "attacked")
var/damage = rand(M.melee_damage_lower, M.melee_damage_upper)
if(check_shields(damage, "the [M.name]", null, MELEE_ATTACK, M.armour_penetration))
return 0
@@ -482,8 +478,8 @@
if(3 to 4) stunprob = 30
if(5 to 6) stunprob = 40
if(7 to 8) stunprob = 60
if(9) stunprob = 70
if(10) stunprob = 95
if(9) stunprob = 70
if(10) stunprob = 95
if(prob(stunprob))
M.powerlevel -= 3
@@ -492,7 +488,7 @@
for(var/mob/O in viewers(src, null))
if((O.client && !( O.blinded )))
O.show_message(text("\red <B>The [M.name] has shocked []!</B>", src), 1)
O.show_message(text("<span class='danger'>The [M.name] has shocked []!</span>", src), 1)
Weaken(power)
if(stuttering < power)
@@ -529,46 +525,46 @@
var/list/obscured = check_obscured_slots()
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><B>Left Hand:</B></td><td><A href='?src=[UID()];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=[UID()];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>"
dat += "<tr><td><B>Back:</B></td><td><A href='?src=[UID()];item=[slot_back]'>[(back && !(back.flags&ABSTRACT)) ? back : "<font color=grey>Empty</font>"]</A>"
if(has_breathable_mask && istype(back, /obj/item/weapon/tank))
dat += "&nbsp;<A href='?src=\ref[src];internal=[slot_back]'>[internal ? "Disable Internals" : "Set Internals"]</A>"
dat += "&nbsp;<A href='?src=[UID()];internal=[slot_back]'>[internal ? "Disable Internals" : "Set Internals"]</A>"
dat += "</td></tr><tr><td>&nbsp;</td></tr>"
dat += "<tr><td><B>Head:</B></td><td><A href='?src=\ref[src];item=[slot_head]'>[(head && !(head.flags&ABSTRACT)) ? head : "<font color=grey>Empty</font>"]</A></td></tr>"
dat += "<tr><td><B>Head:</B></td><td><A href='?src=[UID()];item=[slot_head]'>[(head && !(head.flags&ABSTRACT)) ? head : "<font color=grey>Empty</font>"]</A></td></tr>"
if(slot_wear_mask in obscured)
dat += "<tr><td><font color=grey><B>Mask:</B></font></td><td><font color=grey>Obscured</font></td></tr>"
else
dat += "<tr><td><B>Mask:</B></td><td><A href='?src=\ref[src];item=[slot_wear_mask]'>[(wear_mask && !(wear_mask.flags&ABSTRACT)) ? wear_mask : "<font color=grey>Empty</font>"]</A></td></tr>"
dat += "<tr><td><B>Mask:</B></td><td><A href='?src=[UID()];item=[slot_wear_mask]'>[(wear_mask && !(wear_mask.flags&ABSTRACT)) ? wear_mask : "<font color=grey>Empty</font>"]</A></td></tr>"
if(!issmall(src))
if(slot_glasses in obscured)
dat += "<tr><td><font color=grey><B>Eyes:</B></font></td><td><font color=grey>Obscured</font></td></tr>"
else
dat += "<tr><td><B>Eyes:</B></td><td><A href='?src=\ref[src];item=[slot_glasses]'>[(glasses && !(glasses.flags&ABSTRACT)) ? glasses : "<font color=grey>Empty</font>"]</A></td></tr>"
dat += "<tr><td><B>Eyes:</B></td><td><A href='?src=[UID()];item=[slot_glasses]'>[(glasses && !(glasses.flags&ABSTRACT)) ? glasses : "<font color=grey>Empty</font>"]</A></td></tr>"
if(slot_l_ear in obscured)
dat += "<tr><td><font color=grey><B>Left Ear:</B></font></td><td><font color=grey>Obscured</font></td></tr>"
else
dat += "<tr><td><B>Left Ear:</B></td><td><A href='?src=\ref[src];item=[slot_l_ear]'>[(l_ear && !(l_ear.flags&ABSTRACT)) ? l_ear : "<font color=grey>Empty</font>"]</A></td></tr>"
dat += "<tr><td><B>Left Ear:</B></td><td><A href='?src=[UID()];item=[slot_l_ear]'>[(l_ear && !(l_ear.flags&ABSTRACT)) ? l_ear : "<font color=grey>Empty</font>"]</A></td></tr>"
if(slot_r_ear in obscured)
dat += "<tr><td><font color=grey><B>Right Ear:</B></font></td><td><font color=grey>Obscured</font></td></tr>"
else
dat += "<tr><td><B>Right Ear:</B></td><td><A href='?src=\ref[src];item=[slot_r_ear]'>[(r_ear && !(r_ear.flags&ABSTRACT)) ? r_ear : "<font color=grey>Empty</font>"]</A></td></tr>"
dat += "<tr><td><B>Right Ear:</B></td><td><A href='?src=[UID()];item=[slot_r_ear]'>[(r_ear && !(r_ear.flags&ABSTRACT)) ? r_ear : "<font color=grey>Empty</font>"]</A></td></tr>"
dat += "<tr><td>&nbsp;</td></tr>"
dat += "<tr><td><B>Exosuit:</B></td><td><A href='?src=\ref[src];item=[slot_wear_suit]'>[(wear_suit && !(wear_suit.flags&ABSTRACT)) ? wear_suit : "<font color=grey>Empty</font>"]</A></td></tr>"
dat += "<tr><td><B>Exosuit:</B></td><td><A href='?src=[UID()];item=[slot_wear_suit]'>[(wear_suit && !(wear_suit.flags&ABSTRACT)) ? wear_suit : "<font color=grey>Empty</font>"]</A></td></tr>"
if(wear_suit)
dat += "<tr><td>&nbsp;&#8627;<B>Suit Storage:</B></td><td><A href='?src=\ref[src];item=[slot_s_store]'>[(s_store && !(s_store.flags&ABSTRACT)) ? s_store : "<font color=grey>Empty</font>"]</A>"
dat += "<tr><td>&nbsp;&#8627;<B>Suit Storage:</B></td><td><A href='?src=[UID()];item=[slot_s_store]'>[(s_store && !(s_store.flags&ABSTRACT)) ? s_store : "<font color=grey>Empty</font>"]</A>"
if(has_breathable_mask && istype(s_store, /obj/item/weapon/tank))
dat += "&nbsp;<A href='?src=\ref[src];internal=[slot_s_store]'>[internal ? "Disable Internals" : "Set Internals"]</A>"
dat += "&nbsp;<A href='?src=[UID()];internal=[slot_s_store]'>[internal ? "Disable Internals" : "Set Internals"]</A>"
dat += "</td></tr>"
else
dat += "<tr><td><font color=grey>&nbsp;&#8627;<B>Suit Storage:</B></font></td></tr>"
@@ -576,17 +572,17 @@
if(slot_shoes in obscured)
dat += "<tr><td><font color=grey><B>Shoes:</B></font></td><td><font color=grey>Obscured</font></td></tr>"
else
dat += "<tr><td><B>Shoes:</B></td><td><A href='?src=\ref[src];item=[slot_shoes]'>[(shoes && !(shoes.flags&ABSTRACT)) ? shoes : "<font color=grey>Empty</font>"]</A></td></tr>"
dat += "<tr><td><B>Shoes:</B></td><td><A href='?src=[UID()];item=[slot_shoes]'>[(shoes && !(shoes.flags&ABSTRACT)) ? shoes : "<font color=grey>Empty</font>"]</A></td></tr>"
if(slot_gloves in obscured)
dat += "<tr><td><font color=grey><B>Gloves:</B></font></td><td><font color=grey>Obscured</font></td></tr>"
else
dat += "<tr><td><B>Gloves:</B></td><td><A href='?src=\ref[src];item=[slot_gloves]'>[(gloves && !(gloves.flags&ABSTRACT)) ? gloves : "<font color=grey>Empty</font>"]</A></td></tr>"
dat += "<tr><td><B>Gloves:</B></td><td><A href='?src=[UID()];item=[slot_gloves]'>[(gloves && !(gloves.flags&ABSTRACT)) ? gloves : "<font color=grey>Empty</font>"]</A></td></tr>"
if(slot_w_uniform in obscured)
dat += "<tr><td><font color=grey><B>Uniform:</B></font></td><td><font color=grey>Obscured</font></td></tr>"
else
dat += "<tr><td><B>Uniform:</B></td><td><A href='?src=\ref[src];item=[slot_w_uniform]'>[(w_uniform && !(w_uniform.flags&ABSTRACT)) ? w_uniform : "<font color=grey>Empty</font>"]</A></td></tr>"
dat += "<tr><td><B>Uniform:</B></td><td><A href='?src=[UID()];item=[slot_w_uniform]'>[(w_uniform && !(w_uniform.flags&ABSTRACT)) ? w_uniform : "<font color=grey>Empty</font>"]</A></td></tr>"
if(w_uniform == null || (slot_w_uniform in obscured))
dat += "<tr><td><font color=grey>&nbsp;&#8627;<B>Pockets:</B></font></td></tr>"
@@ -595,30 +591,30 @@
dat += "<tr><td><font color=grey>&nbsp;&#8627;<B>Suit Sensors:</B></font></td></tr>"
dat += "<tr><td><font color=grey>&nbsp;&#8627;<B>PDA:</B></font></td></tr>"
else
dat += "<tr><td>&nbsp;&#8627;<B>Belt:</B></td><td><A href='?src=\ref[src];item=[slot_belt]'>[(belt && !(belt.flags&ABSTRACT)) ? belt : "<font color=grey>Empty</font>"]</A>"
dat += "<tr><td>&nbsp;&#8627;<B>Belt:</B></td><td><A href='?src=[UID()];item=[slot_belt]'>[(belt && !(belt.flags&ABSTRACT)) ? belt : "<font color=grey>Empty</font>"]</A>"
if(has_breathable_mask && istype(belt, /obj/item/weapon/tank))
dat += "&nbsp;<A href='?src=\ref[src];internal=[slot_belt]'>[internal ? "Disable Internals" : "Set Internals"]</A>"
dat += "&nbsp;<A href='?src=[UID()];internal=[slot_belt]'>[internal ? "Disable Internals" : "Set Internals"]</A>"
dat += "</td></tr>"
dat += "<tr><td>&nbsp;&#8627;<B>Pockets:</B></td><td><A href='?src=\ref[src];pockets=left'>[(l_store && !(l_store.flags&ABSTRACT)) ? "Left (Full)" : "<font color=grey>Left (Empty)</font>"]</A>"
dat += "&nbsp;<A href='?src=\ref[src];pockets=right'>[(r_store && !(r_store.flags&ABSTRACT)) ? "Right (Full)" : "<font color=grey>Right (Empty)</font>"]</A></td></tr>"
dat += "<tr><td>&nbsp;&#8627;<B>ID:</B></td><td><A href='?src=\ref[src];item=[slot_wear_id]'>[(wear_id && !(wear_id.flags&ABSTRACT)) ? wear_id : "<font color=grey>Empty</font>"]</A></td></tr>"
dat += "<tr><td>&nbsp;&#8627;<B>PDA:</B></td><td><A href='?src=\ref[src];item=[slot_wear_pda]'>[(wear_pda && !(wear_pda.flags&ABSTRACT)) ? wear_pda : "<font color=grey>Empty</font>"]</A></td></tr>"
dat += "<tr><td>&nbsp;&#8627;<B>Pockets:</B></td><td><A href='?src=[UID()];pockets=left'>[(l_store && !(l_store.flags&ABSTRACT)) ? "Left (Full)" : "<font color=grey>Left (Empty)</font>"]</A>"
dat += "&nbsp;<A href='?src=[UID()];pockets=right'>[(r_store && !(r_store.flags&ABSTRACT)) ? "Right (Full)" : "<font color=grey>Right (Empty)</font>"]</A></td></tr>"
dat += "<tr><td>&nbsp;&#8627;<B>ID:</B></td><td><A href='?src=[UID()];item=[slot_wear_id]'>[(wear_id && !(wear_id.flags&ABSTRACT)) ? wear_id : "<font color=grey>Empty</font>"]</A></td></tr>"
dat += "<tr><td>&nbsp;&#8627;<B>PDA:</B></td><td><A href='?src=[UID()];item=[slot_wear_pda]'>[(wear_pda && !(wear_pda.flags&ABSTRACT)) ? wear_pda : "<font color=grey>Empty</font>"]</A></td></tr>"
if(istype(w_uniform, /obj/item/clothing/under))
var/obj/item/clothing/under/U = w_uniform
dat += "<tr><td>&nbsp;&#8627;<B>Suit Sensors:</b></td><td><A href='?src=\ref[src];set_sensor=1'>[U.has_sensor >= 2 ? "</a><font color=grey>--SENSORS LOCKED--</font>" : "Set Sensors</a>"]</td></tr>"
dat += "<tr><td>&nbsp;&#8627;<B>Suit Sensors:</b></td><td><A href='?src=[UID()];set_sensor=1'>[U.has_sensor >= 2 ? "</a><font color=grey>--SENSORS LOCKED--</font>" : "Set Sensors</a>"]</td></tr>"
if(U.accessories.len)
dat += "<tr><td>&nbsp;&#8627;<A href='?src=\ref[src];strip_accessory=1'>Remove Accessory</a></td></tr>"
dat += "<tr><td>&nbsp;&#8627;<A href='?src=[UID()];strip_accessory=1'>Remove Accessory</a></td></tr>"
if(handcuffed)
dat += "<tr><td><B>Handcuffed:</B> <A href='?src=\ref[src];item=[slot_handcuffed]'>Remove</A></td></tr>"
dat += "<tr><td><B>Handcuffed:</B> <A href='?src=[UID()];item=[slot_handcuffed]'>Remove</A></td></tr>"
if(legcuffed)
dat += "<tr><td><A href='?src=\ref[src];item=[slot_legcuffed]'>Legcuffed</A></td></tr>"
dat += "<tr><td><A href='?src=[UID()];item=[slot_legcuffed]'>Legcuffed</A></td></tr>"
dat += {"</table>
<A href='?src=\ref[user];mach_close=mob\ref[src]'>Close</A>
<A href='?src=[user.UID()];mach_close=mob\ref[src]'>Close</A>
"}
var/datum/browser/popup = new(user, "mob\ref[src]", "[src]", 440, 540)
@@ -892,7 +888,7 @@
to_chat(usr, "<b>Major Crimes:</b> [R.fields["ma_crim"]]")
to_chat(usr, "<b>Details:</b> [R.fields["ma_crim_d"]]")
to_chat(usr, "<b>Notes:</b> [R.fields["notes"]]")
to_chat(usr, "<a href='?src=\ref[src];secrecordComment=`'>\[View Comment Log\]</a>")
to_chat(usr, "<a href='?src=[UID()];secrecordComment=`'>\[View Comment Log\]</a>")
read = 1
if(!read)
@@ -923,7 +919,7 @@
counter++
if(counter == 1)
to_chat(usr, "No comment found")
to_chat(usr, "<a href='?src=\ref[src];secrecordadd=`'>\[Add comment\]</a>")
to_chat(usr, "<a href='?src=[UID()];secrecordadd=`'>\[Add comment\]</a>")
if(!read)
to_chat(usr, "\red Unable to locate a data core entry for this person.")
@@ -944,7 +940,7 @@
for(var/datum/data/record/R in data_core.security)
if(R.fields["id"] == E.fields["id"])
if(hasHUD(usr,"security"))
var/t1 = sanitize(copytext(input("Add Comment:", "Sec. records", null, null) as message,1,MAX_MESSAGE_LEN))
var/t1 = sanitize(copytext(input("Add Comment:", "Sec. records", null, null) as message,1,MAX_MESSAGE_LEN))
if( !(t1) || usr.stat || usr.restrained() || !(hasHUD(usr,"security")) )
return
var/counter = 1
@@ -1023,7 +1019,7 @@
to_chat(usr, "<b>Major Disabilities:</b> [R.fields["ma_dis"]]")
to_chat(usr, "<b>Details:</b> [R.fields["ma_dis_d"]]")
to_chat(usr, "<b>Notes:</b> [R.fields["notes"]]")
to_chat(usr, "<a href='?src=\ref[src];medrecordComment=`'>\[View Comment Log\]</a>")
to_chat(usr, "<a href='?src=[UID()];medrecordComment=`'>\[View Comment Log\]</a>")
read = 1
if(!read)
@@ -1054,7 +1050,7 @@
counter++
if(counter == 1)
to_chat(usr, "No comment found")
to_chat(usr, "<a href='?src=\ref[src];medrecordadd=`'>\[Add comment\]</a>")
to_chat(usr, "<a href='?src=[UID()];medrecordadd=`'>\[Add comment\]</a>")
if(!read)
to_chat(usr, "\red Unable to locate a data core entry for this person.")
@@ -1075,7 +1071,7 @@
for(var/datum/data/record/R in data_core.medical)
if(R.fields["id"] == E.fields["id"])
if(hasHUD(usr,"medical"))
var/t1 = sanitize(copytext(input("Add Comment:", "Med. records", null, null) as message,1,MAX_MESSAGE_LEN))
var/t1 = sanitize(copytext(input("Add Comment:", "Med. records", null, null) as message,1,MAX_MESSAGE_LEN))
if( !(t1) || usr.stat || usr.restrained() || !(hasHUD(usr,"medical")) )
return
var/counter = 1
@@ -1285,8 +1281,8 @@
var/limb_path = organ_data["path"]
var/obj/item/organ/external/O = new limb_path(temp_holder)
if(H.get_limb_by_name(O.name)) //Check to see if the user already has an limb with the same name as the 'missing limb'. If they do, skip regrowth.
continue //In an example, this will prevent duplication of the mob's right arm if the mob is a Human and they have a Diona right arm, since,
//while the limb with the name 'right_arm' the mob has may not be listed in their species' bodyparts definition, it is still viable and has the appropriate limb name.
continue //In an example, this will prevent duplication of the mob's right arm if the mob is a Human and they have a Diona right arm, since,
//while the limb with the name 'right_arm' the mob has may not be listed in their species' bodyparts definition, it is still viable and has the appropriate limb name.
else
O = new limb_path(H) //Create the limb on the player.
O.owner = H
@@ -1704,7 +1700,7 @@
if((head_organ.species.name in tmp_hair.species_allowed) && (robohead.company in tmp_hair.models_allowed)) //Populate the list of available monitor styles only with styles that the monitor-head is allowed to use.
hair += i
var/new_style = input(src, "Select a monitor display", "Monitor Display", head_organ.h_style) as null|anything in hair
var/new_style = input(src, "Select a monitor display", "Monitor Display", head_organ.h_style) as null|anything in hair
if(incapacitated())
to_chat(src, "<span class='warning'>You were interrupted while changing your monitor display.</span>")
return
@@ -1909,7 +1905,7 @@
if(current_size >= STAGE_THREE)
var/list/handlist = list(l_hand, r_hand)
for(var/obj/item/hand in handlist)
if(prob(current_size * 5) && hand.w_class >= ((11-current_size)/2) && unEquip(hand))
if(prob(current_size * 5) && hand.w_class >= ((11-current_size)/2) && unEquip(hand))
step_towards(hand, src)
to_chat(src, "<span class='warning'>\The [S] pulls \the [hand] from your grip!</span>")
apply_effect(current_size * 3, IRRADIATE)
@@ -2031,3 +2027,103 @@
return 0
return .
/mob/living/carbon/human/serialize()
// Currently: Limbs/organs only
var/list/data = ..()
var/list/limbs_list = list()
var/list/organs_list = list()
var/list/equip_list = list()
data["limbs"] = limbs_list
data["iorgans"] = organs_list
data["equip"] = equip_list
data["dna"] = dna.serialize()
data["age"] = age
// No being naked
data["ushirt"] = undershirt
data["socks"] = socks
data["uwear"] = underwear
// Limbs
for(var/limb in organs_by_name)
var/obj/item/organ/O = organs_by_name[limb]
if(!O)
limbs_list[limb] = "missing"
continue
limbs_list[limb] = O.serialize()
// Internal organs/augments
for(var/organ in internal_organs)
var/obj/item/organ/O = organ
organs_list[O.name] = O.serialize()
// Equipment
equip_list.len = slots_amt
for(var/i = 1, i < slots_amt, i++)
var/obj/item/thing = get_item_by_slot(i)
if(thing != null)
equip_list[i] = thing.serialize()
return data
/mob/living/carbon/human/deserialize(list/data)
var/list/limbs_list = data["limbs"]
var/list/organs_list = data["iorgans"]
var/list/equip_list = data["equip"]
var/turf/T = get_turf(src)
if(!islist(data["limbs"]))
throw EXCEPTION("Expected a limbs list, but found none")
if(islist(data["dna"]))
dna.deserialize(data["dna"])
real_name = dna.real_name
name = real_name
set_species(dna.species)
age = data["age"]
undershirt = data["ushirt"]
underwear = data["uwear"]
socks = data["socks"]
for(var/obj/item/organ/internal/iorgan in internal_organs)
qdel(iorgan)
for(var/obj/item/organ/external/organ in organs)
qdel(organ)
for(var/limb in limbs_list)
// Missing means skip this part - it's missing
if(limbs_list[limb] == "missing")
continue
// "New" code handles insertion and DNA sync'ing
var/obj/item/organ/external/E = list_to_object(limbs_list[limb], src)
E.sync_colour_to_dna()
for(var/organ in organs_list)
// As above, "New" code handles insertion, DNA sync
list_to_object(organs_list[organ], src)
UpdateAppearance()
// De-serialize equipment
// #1: Jumpsuit
// #2: Outer suit
// #3+: Everything else
if(islist(equip_list[slot_w_uniform]))
var/obj/item/clothing/C = list_to_object(equip_list[slot_w_uniform], T)
equip_to_slot_if_possible(C, slot_w_uniform)
if(islist(equip_list[slot_wear_suit]))
var/obj/item/clothing/C = list_to_object(equip_list[slot_wear_suit], T)
equip_to_slot_if_possible(C, slot_wear_suit)
for(var/i = 1, i < slots_amt, i++)
if(i == slot_w_uniform || i == slot_wear_suit)
continue
if(islist(equip_list[i]))
var/obj/item/clothing/C = list_to_object(equip_list[i], T)
equip_to_slot_if_possible(C, i)
update_icons()
..()
@@ -13,13 +13,13 @@
if(H.hand)
temp = H.organs_by_name["l_hand"]
if(!temp || !temp.is_usable())
to_chat(H, "\red You can't use your hand.")
to_chat(H, "<span class='warning'>You can't use your hand.</span>")
return
..()
if((M != src) && M.a_intent != "help" && check_shields(0, M.name, attack_type = UNARMED_ATTACK))
add_logs(src, M, "attempted to touch")
add_logs(M, src, "attempted to touch")
visible_message("<span class='warning'>[M] attempted to touch [src]!</span>")
return 0
@@ -28,7 +28,7 @@
var/damage = rand(0, 9)
if(!damage)
playsound(loc, 'sound/weapons/punchmiss.ogg', 25, 1, -1)
visible_message("\red <B>[M] has attempted to punch [src]!</B>")
visible_message("<span class='danger'>[M] has attempted to punch [src]!</span>")
return 0
var/obj/item/organ/external/affecting = get_organ(ran_zone(M.zone_sel.selecting))
var/armor_block = run_armor_check(affecting, "melee")
@@ -39,11 +39,11 @@
playsound(loc, "punch", 25, 1, -1)
visible_message("\red <B>[M] has punched [src]!</B>")
visible_message("<span class='danger'>[M] has punched [src]!</span>")
apply_damage(damage, STAMINA, affecting, armor_block)
if(damage >= 9)
visible_message("\red <B>[M] has weakened [src]!</B>")
visible_message("<span class='danger'>[M] has weakened [src]!</span>")
apply_effect(4, WEAKEN, armor_block)
return
@@ -62,13 +62,12 @@
for(var/datum/surgery/S in src.surgeries)
if(S.next_step(M, src))
return 1
else
help_shake_act(M)
add_logs(src, M, "shaked")
return 1
help_shake_act(M)
add_logs(M, src, "shaked")
return 1
if(health >= config.health_threshold_crit)
help_shake_act(M)
add_logs(src, M, "shaked")
add_logs(M, src, "shaked")
return 1
if(!H.check_has_mouth())
to_chat(H, "<span class='danger'>You don't have a mouth, you cannot perform CPR!</span>")
@@ -95,7 +94,7 @@
to_chat(src, "<span class='notice'>You feel a breath of fresh air enter your lungs. It feels good.</span>")
to_chat(M, "<span class='alert'>Repeat at least every 7 seconds.")
add_logs(src, M, "CPRed")
add_logs(M, src, "CPRed")
return 1
else
to_chat(M, "<span class='danger'>You need to stay still while performing CPR!</span>")
@@ -110,11 +109,8 @@
if(I_HARM)
//Vampire code
if(M.mind && M.mind.vampire && (M.mind in ticker.mode.vampires) && !M.mind.vampire.draining && M.zone_sel && M.zone_sel.selecting == "head" && src != M)
if((head && (head.flags & HEADCOVERSMOUTH)) || (wear_mask && (wear_mask.flags & MASKCOVERSMOUTH)))
to_chat(M, "<span class='warning'>Remove their mask!</span>")
return
if((M.head && (M.head.flags & HEADCOVERSMOUTH)) || (M.wear_mask && (M.wear_mask.flags & MASKCOVERSMOUTH)))
to_chat(M, "<span class='warning'>Remove your mask!</span>")
if(species && species.flags & NO_BLOOD)//why this hell were we never checkinf for this?
to_chat(M, "<span class='warning'>They have no blood!</span>")
return
if(mind && mind.vampire && (mind in ticker.mode.vampires))
to_chat(M, "<span class='warning'>Your fangs fail to pierce [src.name]'s cold flesh</span>")
@@ -127,7 +123,7 @@
return
//we're good to suck the blood, blaah
M.mind.vampire.handle_bloodsucking(src)
add_logs(src, M, "vampirebit")
add_logs(M, src, "vampirebit")
msg_admin_attack("[key_name_admin(M)] vampirebit [key_name_admin(src)]")
return
//end vampire codes
@@ -137,7 +133,7 @@
var/datum/unarmed_attack/attack = M.species.unarmed
M.do_attack_animation(src)
add_logs(src, M, "[pick(attack.attack_verb)]ed")
add_logs(M, src, "[pick(attack.attack_verb)]ed")
if(!iscarbon(M))
LAssailant = null
@@ -148,7 +144,7 @@
damage += attack.damage
if(!damage)
playsound(loc, attack.miss_sound, 25, 1, -1)
visible_message("\red <B>[M] tried to [pick(attack.attack_verb)] [src]!</B>")
visible_message("<span class='danger'>[M] tried to [pick(attack.attack_verb)] [src]!</span>")
return 0
@@ -160,7 +156,7 @@
playsound(loc, attack.attack_sound, 25, 1, -1)
visible_message("\red <B>[M] [pick(attack.attack_verb)]ed [src]!</B>")
visible_message("<span class='danger'>[M] [pick(attack.attack_verb)]ed [src]!</span>")
apply_damage(damage, BRUTE, affecting, armor_block, sharp=attack.sharp, edge=attack.edge) //moving this back here means Armalis are going to knock you down 70% of the time, but they're pure adminbus anyway.
if((stat != DEAD) && damage >= M.species.punchstunthreshold)
@@ -176,7 +172,7 @@
if(attacker_style && attacker_style.disarm_act(H, src))
return 1
else
add_logs(src, M, "disarmed")
add_logs(M, src, "disarmed")
if(w_uniform)
w_uniform.add_fingerprint(M)
@@ -185,7 +181,7 @@
if(randn <= 25)
apply_effect(2, WEAKEN, run_armor_check(affecting, "melee"))
playsound(loc, 'sound/weapons/thudswoosh.ogg', 50, 1, -1)
visible_message("\red <B>[M] has pushed [src]!</B>")
visible_message("<span class='danger'>[M] has pushed [src]!</span>")
M.attack_log += text("\[[time_stamp()]\] <font color='red'>Pushed [src.name] ([src.ckey])</font>")
src.attack_log += text("\[[time_stamp()]\] <font color='orange'>Has been pushed by [M.name] ([M.ckey])</font>")
if(!iscarbon(M))
@@ -201,7 +197,7 @@
if(randn <= 60)
//BubbleWrap: Disarming breaks a pull
if(pulling)
visible_message("\red <b>[M] has broken [src]'s grip on [pulling]!</B>")
visible_message("<span class='danger'>[M] has broken [src]'s grip on [pulling]!</span>")
talked = 1
stop_pulling()
@@ -209,14 +205,14 @@
if(istype(l_hand, /obj/item/weapon/grab))
var/obj/item/weapon/grab/lgrab = l_hand
if(lgrab.affecting)
visible_message("\red <b>[M] has broken [src]'s grip on [lgrab.affecting]!</B>")
visible_message("<span class='danger'>[M] has broken [src]'s grip on [lgrab.affecting]!</span>")
talked = 1
spawn(1)
qdel(lgrab)
if(istype(r_hand, /obj/item/weapon/grab))
var/obj/item/weapon/grab/rgrab = r_hand
if(rgrab.affecting)
visible_message("\red <b>[M] has broken [src]'s grip on [rgrab.affecting]!</B>")
visible_message("<span class='danger'>[M] has broken [src]'s grip on [rgrab.affecting]!</span>")
talked = 1
spawn(1)
qdel(rgrab)
@@ -224,14 +220,14 @@
if(!talked) //BubbleWrap
if(drop_item())
visible_message("\red <B>[M] has disarmed [src]!</B>")
visible_message("<span class='danger'>[M] has disarmed [src]!</span>")
playsound(loc, 'sound/weapons/thudswoosh.ogg', 50, 1, -1)
return
playsound(loc, 'sound/weapons/punchmiss.ogg', 25, 1, -1)
visible_message("\red <B>[M] attempted to disarm [src]!</B>")
visible_message("<span class='danger'>[M] attempted to disarm [src]!</span>")
return
/mob/living/carbon/human/proc/afterattack(atom/target as mob|obj|turf|area, mob/living/user as mob|obj, inrange, params)
return
return
@@ -213,9 +213,9 @@ emp_act
if(! I.discrete)
if(I.attack_verb.len)
visible_message("\red <B>[src] has been [pick(I.attack_verb)] in the [hit_area] with [I.name] by [user]!</B>")
visible_message("<span class='danger'>[src] has been [pick(I.attack_verb)] in the [hit_area] with [I.name] by [user]!</span>")
else
visible_message("\red <B>[src] has been attacked in the [hit_area] with [I.name] by [user]!</B>")
visible_message("<span class='danger'>[src] has been attacked in the [hit_area] with [I.name] by [user]!</span>")
var/armor = run_armor_check(affecting, "melee", "Your armor has protected your [hit_area].", "Your armor has softened hit to your [hit_area].", armour_penetration = I.armour_penetration)
var/weapon_sharp = is_sharp(I)
@@ -9,11 +9,6 @@ var/global/default_martial_art = new/datum/martial_art
var/b_markings = 0
var/m_style = "None"
//Eye colour
var/r_eyes = 0
var/g_eyes = 0
var/b_eyes = 0
var/s_tone = 0 //Skin tone
//Skin colour
@@ -58,7 +53,6 @@ var/global/default_martial_art = new/datum/martial_art
var/datum/martial_art/martial_art = null
var/special_voice = "" // For changing our voice. Used by a symptom.
var/said_last_words=0
var/last_dam = -1 //Used for determining if we need to process all organs or just some or even none.
var/list/bad_external_organs = list()// organs we check until they are good.
@@ -73,12 +67,9 @@ var/global/default_martial_art = new/datum/martial_art
var/meatleft = 3 //For chef item
var/decaylevel = 0 // For rotting bodies
var/max_blood = BLOOD_VOLUME_NORMAL // For stuff in the vessel
var/slime_color = "blue" //For slime people this defines their color, it's blue by default to pay tribute to the old icons
var/check_mutations=0 // Check mutations on next life tick
var/lastFart = 0 // Toxic fart cooldown.
var/fire_dmi = 'icons/mob/OnFire.dmi'
var/fire_sprite = "Standing"
@@ -2,7 +2,7 @@
var/obj/item/organ/internal/eyes/eyes = get_int_organ(/obj/item/organ/internal/eyes)
if(eyes)
eyes.update_colour()
regenerate_icons()
update_body()
/mob/living/carbon/human/var/list/organs = list()
/mob/living/carbon/human/var/list/organs_by_name = list() // map organ names to organs
@@ -78,9 +78,9 @@
// Canes and crutches help you stand (if the latter is ever added)
// One cane mitigates a broken leg+foot, or a missing foot.
// Two canes are needed for a lost leg. If you are missing both legs, canes aren't gonna help you.
if(l_hand && istype(l_hand, /obj/item/weapon/cane))
if(l_hand && l_hand.is_crutch())
stance_damage -= 2
if(r_hand && istype(r_hand, /obj/item/weapon/cane))
if(r_hand && r_hand.is_crutch())
stance_damage -= 2
if(stance_damage < 0)
@@ -137,6 +137,36 @@
spawn(10)
qdel(spark_system)
/mob/living/carbon/human/proc/becomeSlim()
to_chat(src, "<span class='notice'>You feel fit again!</span>")
var/obj/item/organ/external/chest/C = get_organ("chest")
if(istype(C))
C.makeSlim(0)
else
to_chat(src, "Err, well, you *would*, but you don't have a torso. Yell at a coder.")
log_debug("[src] at ([x],[y],[z]) doesn't have a torso.")
mutations.Remove(FAT)
update_mutantrace(0)
update_mutations(0)
update_body(0)
update_inv_w_uniform(0)
update_inv_wear_suit()
/mob/living/carbon/human/proc/becomeFat()
to_chat(src, "<span class='alert'>You suddenly feel blubbery!</span>")
var/obj/item/organ/external/chest/C = get_organ("chest")
if(istype(C))
C.makeFat()
else
to_chat(src, "Err, well, you *would*, but you don't have a torso. Yell at a coder.")
log_debug("[src] at ([x],[y],[z]) doesn't have a torso.")
mutations.Add(FAT)
update_mutantrace(0)
update_mutations(0)
update_body(0)
update_inv_w_uniform(0)
update_inv_wear_suit()
//Handles chem traces
/mob/living/carbon/human/proc/handle_trace_chems()
//New are added for reagents to random organs.
@@ -166,4 +196,4 @@ I use this to standardize shadowling dethrall code
if(!get_int_organ(organ_name))
return null
var/obj/item/organ/internal/O = get_int_organ(organ_name)
return O.parent_organ
return O.parent_organ
@@ -364,7 +364,7 @@
traitorType = inPers
ticker.mode.traitors += mind
mind.special_role = "traitor"
mind.special_role = SPECIAL_ROLE_TRAITOR
var/datum/mindslaves/slaved = new()
slaved.masters += mind
mind.som = slaved
@@ -2,41 +2,9 @@
set name = "quick-equip"
set hidden = 1
if(ishuman(src))
var/mob/living/carbon/human/H = src
var/obj/item/I = H.get_active_hand()
var/obj/item/weapon/storage/S = H.get_inactive_hand()
if(!I)
to_chat(H, "<span class='notice'>You are not holding anything to equip.</span>")
return
if(istype(I, /obj/item/clothing/head/helmet/space/rig)) // If the item to be equipped is a rigid suit helmet
var/obj/item/clothing/head/helmet/space/rig/C = I
if(C.rig_restrict_helmet)
to_chat(src, "\red You must fasten the helmet to a hardsuit first. (Target the head and use on a hardsuit)")// Stop eva helms equipping.
return 0
if(H.equip_to_appropriate_slot(I))
if(hand)
update_inv_l_hand(0)
else
update_inv_r_hand(0)
else if(s_active && s_active.can_be_inserted(I,1)) //if storage active insert there
s_active.handle_item_insertion(I)
else if(istype(S, /obj/item/weapon/storage) && S.can_be_inserted(I,1)) //see if we have box in other hand
S.handle_item_insertion(I)
else
S = H.get_item_by_slot(slot_belt)
if(istype(S, /obj/item/weapon/storage) && S.can_be_inserted(I,1)) //else we put in belt
S.handle_item_insertion(I)
else
S = H.get_item_by_slot(slot_back) //else we put in backpack
if(istype(S, /obj/item/weapon/storage) && S.can_be_inserted(I,1))
S.handle_item_insertion(I)
else
to_chat(H, "\red You are unable to equip that.")
var/obj/item/I = get_active_hand()
if(I)
I.equip_to_best_slot(src)
/mob/living/carbon/human/proc/equip_in_one_of_slots(obj/item/W, list/slots, del_on_fail = 1)
for(var/slot in slots)
@@ -233,7 +201,8 @@
update_hair(redraw_mob) //rebuild hair
update_fhair(redraw_mob)
update_head_accessory(redraw_mob)
sec_hud_set_ID()
if(hud_list.len)
sec_hud_set_ID()
update_inv_wear_mask(redraw_mob)
if(slot_handcuffed)
handcuffed = W
@@ -252,7 +221,8 @@
update_inv_belt(redraw_mob)
if(slot_wear_id)
wear_id = W
sec_hud_set_ID()
if(hud_list.len)
sec_hud_set_ID()
update_inv_wear_id(redraw_mob)
if(slot_wear_pda)
wear_pda = W
+28 -34
View File
@@ -176,22 +176,22 @@
if(gene.is_active(src))
speech_problem_flag = 1
gene.OnMobLife(src)
if(gene_stability < 85)
if(gene_stability < GENETIC_DAMAGE_STAGE_1)
var/instability = DEFAULT_GENE_STABILITY - gene_stability
if(prob(instability / 10))
adjustFireLoss(min(6, instability / 12))
if(prob(instability * 0.1))
adjustFireLoss(min(5, instability * 0.67))
to_chat(src, "<span class='danger'>You feel like your skin is burning and bubbling off!</span>")
if(gene_stability < 70)
if(prob(instability / 12))
adjustCloneLoss(min(5, instability / 15))
if(gene_stability < GENETIC_DAMAGE_STAGE_2)
if(prob(instability * 0.83))
adjustCloneLoss(min(4, instability * 0.05))
to_chat(src, "<span class='danger'>You feel as if your body is warping.</span>")
if(prob(instability / 10))
adjustToxLoss(min(6, instability / 12))
if(prob(instability * 0.1))
adjustToxLoss(min(5, instability * 0.67))
to_chat(src, "<span class='danger'>You feel weak and nauseous.</span>")
if(gene_stability < 40 && prob(1))
if(gene_stability < GENETIC_DAMAGE_STAGE_3 && prob(1))
to_chat(src, "<span class='biggerdanger'>You feel incredibly sick... Something isn't right!</span>")
spawn(300)
if(gene_stability < 40)
if(gene_stability < GENETIC_DAMAGE_STAGE_3)
gib()
if(!(species.flags & RADIMMUNE))
@@ -487,14 +487,15 @@
return
if(RESIST_HEAT in mutations)
return
var/thermal_protection = get_thermal_protection()
if(on_fire)
var/thermal_protection = get_thermal_protection()
if(thermal_protection >= FIRE_IMMUNITY_SUIT_MAX_TEMP_PROTECT)
return
if(thermal_protection >= FIRE_SUIT_MAX_TEMP_PROTECT)
bodytemperature += 11
else
bodytemperature += BODYTEMP_HEATING_MAX
if(thermal_protection >= FIRE_IMMUNITY_SUIT_MAX_TEMP_PROTECT)
return
if(thermal_protection >= FIRE_SUIT_MAX_TEMP_PROTECT)
bodytemperature += 11
else
bodytemperature += (BODYTEMP_HEATING_MAX + (fire_stacks * 12))
/mob/living/carbon/human/proc/get_thermal_protection()
var/thermal_protection = 0 //Simple check to estimate how protected we are against multiple temperatures
@@ -674,20 +675,10 @@
if(species.flags & CAN_BE_FAT)
if(FAT in mutations)
if(overeatduration < 100)
to_chat(src, "<span class='notice'>You feel fit again!</span>")
mutations.Remove(FAT)
update_mutantrace(0)
update_mutations(0)
update_inv_w_uniform(0)
update_inv_wear_suit()
becomeSlim()
else
if(overeatduration > 500)
to_chat(src, "<span class='alert'>You suddenly feel blubbery!</span>")
mutations.Add(FAT)
update_mutantrace(0)
update_mutations(0)
update_inv_w_uniform(0)
update_inv_wear_suit()
becomeFat()
// nutrition decrease
if(nutrition > 0 && stat != 2)
@@ -812,10 +803,6 @@
if(REGEN in mutations)
heal_overall_damage(0.1, 0.1)
if(!in_stasis)
handle_organs()
handle_blood()
if(paralysis)
blinded = 1
stat = UNCONSCIOUS
@@ -902,6 +889,10 @@
if(gloves && germ_level > gloves.germ_level && prob(10))
gloves.germ_level += 1
if(!in_stasis)
handle_organs()
handle_blood()
else //dead
blinded = 1
@@ -1104,7 +1095,7 @@
for(var/mob/living/carbon/human/H in range(decaylevel, src))
if(prob(5))
if(prob(2))
if(istype(loc,/obj/item/bodybag))
return
var/obj/item/clothing/mask/M = H.wear_mask
@@ -1112,6 +1103,9 @@
return
if(H.species && H.species.flags & NO_BREATHE)
return //no puking if you can't smell!
// Humans can lack a mind datum, y'know
if(H.mind && H.mind.assigned_role == "Detective")
return //too cool for puke
to_chat(H, "<spawn class='warning'>You smell something foul...")
H.fakevomit()
@@ -1,100 +0,0 @@
/datum/species/drask
name = "Drask"
name_plural = "Drask"
icobase = 'icons/mob/human_races/r_drask.dmi'
deform = 'icons/mob/human_races/r_drask.dmi'
path = /mob/living/carbon/human/drask
default_language = "Galactic Common"
language = "Orluum"
unarmed_type = /datum/unarmed_attack/punch
eyes = "drask_eyes_s"
darksight = 5
speech_sounds = list('sound/voice/DraskTalk.ogg')
speech_chance = 20
male_scream_sound = 'sound/voice/DraskTalk2.ogg'
female_scream_sound = 'sound/voice/DraskTalk2.ogg'
burn_mod = 2
//exotic_blood = "cryoxadone"
body_temperature = 273
blurb = "Hailing from Hoorlm, planet outside what is usually considered a habitable \
orbit, the Drask evolved to live in extreme cold. Their strange bodies seem \
to operate better the colder their surroundings are, and can regenerate rapidly \
when breathing supercooled gas. <br/><br/> On their homeworld, the Drask live long lives \
in their labyrinthine settlements, carved out beneath Hoorlm's icy surface, where the air \
is of breathable density."
suicide_messages = list(
"is self-warming with friction!",
"is jamming fingers through their big eyes!",
"is sucking in warm air!",
"is holding their breath!")
flags = IS_WHITELISTED | HAS_LIPS
clothing_flags = HAS_UNDERWEAR | HAS_UNDERSHIRT
bodyflags = FEET_CLAWS | HAS_SKIN_TONE
dietflags = DIET_OMNI
cold_level_1 = -1 //Default 260 - Lower is better
cold_level_2 = -1 //Default 200
cold_level_3 = -1 //Default 120
cold_env_multiplier = -1
heat_level_1 = 300 //Default 360 - Higher is better
heat_level_2 = 340 //Default 400
heat_level_3 = 400 //Default 460
heat_level_3_breathe = 600 //Default 1000
hot_env_multiplier = 2
flesh_color = "#a3d4eb"
reagent_tag = PROCESS_ORG
base_color = "#a3d4eb"
blood_color = "#a3d4eb"
butt_sprite = "drask"
has_organ = list(
"heart" = /obj/item/organ/internal/heart/drask,
"lungs" = /obj/item/organ/internal/lungs/drask,
"metabolic strainer" = /obj/item/organ/internal/liver/drask,
"eyes" = /obj/item/organ/internal/eyes/drask,
"brain" = /obj/item/organ/internal/brain/drask
)
/datum/species/drask/handle_temperature(datum/gas_mixture/breath, var/mob/living/carbon/human/H)
if( abs(310.15 - breath.temperature) > 50)
if(H.status_flags & GODMODE) return 1 //godmode
if(breath.temperature < 260)
if(prob(20))
to_chat(H, "<span class='notice'> You feel an invigorating coldness in your lungs!</span>")
if(breath.temperature > heat_level_1)
if(prob(20))
to_chat(H, "<span class='warning'>You feel your face burning and a searing heat in your lungs!</span>")
switch(breath.temperature)
if(-INFINITY to 60)
H.adjustFireLoss(cold_env_multiplier*COLD_GAS_DAMAGE_LEVEL_3*0.5) //3 points healed, applied every 4 ticks
H.adjustBruteLoss(cold_env_multiplier*COLD_GAS_DAMAGE_LEVEL_3)
H.throw_alert("temp", /obj/screen/alert/cold/drask, 3)
if(61 to 200)
H.adjustFireLoss(cold_env_multiplier*COLD_GAS_DAMAGE_LEVEL_2*0.5) //1.5 healed every 4 ticks
H.adjustBruteLoss(cold_env_multiplier*COLD_GAS_DAMAGE_LEVEL_2)
H.throw_alert("temp", /obj/screen/alert/cold/drask, 2)
if(201 to 260)
H.adjustFireLoss(cold_env_multiplier*COLD_GAS_DAMAGE_LEVEL_1*0.5) //0.5 healed every 4 ticks
H.adjustBruteLoss(cold_env_multiplier*COLD_GAS_DAMAGE_LEVEL_1)
H.throw_alert("temp", /obj/screen/alert/cold/drask, 1)
if(heat_level_1 to heat_level_2)
H.apply_damage(hot_env_multiplier*HEAT_GAS_DAMAGE_LEVEL_1, BURN, "head", used_weapon = "Excessive Heat")
if(heat_level_2 to heat_level_3_breathe)
H.apply_damage(hot_env_multiplier*HEAT_GAS_DAMAGE_LEVEL_2, BURN, "head", used_weapon = "Excessive Heat")
if(heat_level_3_breathe to INFINITY)
H.apply_damage(hot_env_multiplier*HEAT_GAS_DAMAGE_LEVEL_3, BURN, "head", used_weapon = "Excessive Heat")
@@ -45,7 +45,7 @@
/datum/species/golem/handle_post_spawn(var/mob/living/carbon/human/H)
if(H.mind)
H.mind.assigned_role = "Golem"
H.mind.special_role = "Golem"
H.mind.special_role = SPECIAL_ROLE_GOLEM
H.real_name = "adamantine golem ([rand(1, 1000)])"
H.name = H.real_name
H.equip_to_slot_or_del(new /obj/item/clothing/under/golem(H), slot_w_uniform)
@@ -99,4 +99,4 @@
desc = "strong adamantine hands"
icon_state = "golem"
item_state = null
flags = ABSTRACT | NODROP
flags = ABSTRACT | NODROP
@@ -236,4 +236,4 @@
H.adjust_fire_stacks(0.5)
H.IgniteMob()
return 1
return 1
@@ -90,6 +90,7 @@
var/blood_color = "#A10808" //Red.
var/flesh_color = "#FFC896" //Pink.
var/single_gib_type = /obj/effect/decal/cleanable/blood/gibs
var/remains_type = /obj/effect/decal/remains/human //What sort of remains is left behind when the species dusts
var/base_color //Used when setting species.
//Used in icon caching.
@@ -192,10 +193,8 @@
for(var/index in has_organ)
var/organ = has_organ[index]
H.internal_organs |= new organ(H)
for(var/obj/item/organ/internal/I in H.internal_organs)
I.insert(H)
// organ new code calls `insert` on its own
new organ(H)
for(var/name in H.organs_by_name)
H.organs |= H.organs_by_name[name]
@@ -614,6 +613,8 @@
H.clear_alert("high")
/datum/species/proc/handle_hud_icons(mob/living/carbon/human/H)
if(!H.client)
return
if(H.healths)
if(H.stat == DEAD)
H.healths.icon_state = "health7"
@@ -633,11 +634,15 @@
else H.healths.icon_state = "health6"
if(H.healthdoll)
H.healthdoll.overlays.Cut()
if(H.stat == DEAD)
H.healthdoll.icon_state = "healthdoll_DEAD"
if(H.healthdoll.overlays.len)
H.healthdoll.overlays.Cut()
else
H.healthdoll.icon_state = "healthdoll_OVERLAY"
var/list/new_overlays = list()
var/list/cached_overlays = H.healthdoll.cached_healthdoll_overlays
// Use the dead health doll as the base, since we have proper "healthy" overlays now
H.healthdoll.icon_state = "healthdoll_DEAD"
for(var/obj/item/organ/external/O in H.organs)
var/damage = O.burn_dam + O.brute_dam
var/comparison = (O.max_damage/5)
@@ -652,8 +657,10 @@
icon_num = 4
if(damage > (comparison*4))
icon_num = 5
if(icon_num)
H.healthdoll.overlays += image('icons/mob/screen_gen.dmi',"[O.limb_name][icon_num]")
new_overlays += "[O.limb_name][icon_num]"
H.healthdoll.overlays += (new_overlays - cached_overlays)
H.healthdoll.overlays -= (cached_overlays - new_overlays)
H.healthdoll.cached_healthdoll_overlays = new_overlays
switch(H.nutrition)
if(NUTRITION_LEVEL_FULL to INFINITY)
@@ -500,6 +500,7 @@
deform = 'icons/mob/human_races/r_slime.dmi'
path = /mob/living/carbon/human/slime
unarmed_type = /datum/unarmed_attack/punch
remains_type = /obj/effect/decal/remains/slime
// More sensitive to the cold
cold_level_1 = 280
@@ -730,6 +731,7 @@
unarmed_type = /datum/unarmed_attack/diona
//primitive_form = "Nymph"
slowdown = 5
remains_type = /obj/effect/decal/cleanable/ash
warning_low_pressure = 50
hazard_low_pressure = -1
@@ -844,6 +846,7 @@
default_language = "Galactic Common"
language = "Trinary"
unarmed_type = /datum/unarmed_attack/punch
remains_type = /obj/effect/decal/remains/robot
eyes = "blank_eyes"
brute_mod = 2.5 // 100% * 2.5 * 0.6 (robolimbs) ~= 150%
@@ -906,3 +909,103 @@
if(H)
H.update_hair()
H.update_fhair()
/datum/species/drask
name = "Drask"
name_plural = "Drask"
icobase = 'icons/mob/human_races/r_drask.dmi'
deform = 'icons/mob/human_races/r_drask.dmi'
path = /mob/living/carbon/human/drask
default_language = "Galactic Common"
language = "Orluum"
unarmed_type = /datum/unarmed_attack/punch
eyes = "drask_eyes_s"
darksight = 5
speech_sounds = list('sound/voice/DraskTalk.ogg')
speech_chance = 20
male_scream_sound = 'sound/voice/DraskTalk2.ogg'
female_scream_sound = 'sound/voice/DraskTalk2.ogg'
burn_mod = 2
//exotic_blood = "cryoxadone"
body_temperature = 273
blurb = "Hailing from Hoorlm, planet outside what is usually considered a habitable \
orbit, the Drask evolved to live in extreme cold. Their strange bodies seem \
to operate better the colder their surroundings are, and can regenerate rapidly \
when breathing supercooled gas. <br/><br/> On their homeworld, the Drask live long lives \
in their labyrinthine settlements, carved out beneath Hoorlm's icy surface, where the air \
is of breathable density."
suicide_messages = list(
"is self-warming with friction!",
"is jamming fingers through their big eyes!",
"is sucking in warm air!",
"is holding their breath!")
flags = IS_WHITELISTED | HAS_LIPS
clothing_flags = HAS_UNDERWEAR | HAS_UNDERSHIRT
bodyflags = FEET_CLAWS | HAS_SKIN_TONE
dietflags = DIET_OMNI
cold_level_1 = -1 //Default 260 - Lower is better
cold_level_2 = -1 //Default 200
cold_level_3 = -1 //Default 120
cold_env_multiplier = -1
heat_level_1 = 300 //Default 360 - Higher is better
heat_level_2 = 340 //Default 400
heat_level_3 = 400 //Default 460
heat_level_3_breathe = 600 //Default 1000
hot_env_multiplier = 2
flesh_color = "#a3d4eb"
reagent_tag = PROCESS_ORG
base_color = "#a3d4eb"
blood_color = "#a3d4eb"
butt_sprite = "drask"
has_organ = list(
"heart" = /obj/item/organ/internal/heart/drask,
"lungs" = /obj/item/organ/internal/lungs/drask,
"metabolic strainer" = /obj/item/organ/internal/liver/drask,
"eyes" = /obj/item/organ/internal/eyes/drask,
"brain" = /obj/item/organ/internal/brain/drask
)
/datum/species/drask/handle_temperature(datum/gas_mixture/breath, var/mob/living/carbon/human/H)
if( abs(310.15 - breath.temperature) > 50)
if(H.status_flags & GODMODE) return 1 //godmode
if(breath.temperature < 260)
if(prob(20))
to_chat(H, "<span class='notice'> You feel an invigorating coldness in your lungs!</span>")
if(breath.temperature > heat_level_1)
if(prob(20))
to_chat(H, "<span class='warning'>You feel your face burning and a searing heat in your lungs!</span>")
switch(breath.temperature)
if(-INFINITY to 60)
H.adjustFireLoss(cold_env_multiplier*COLD_GAS_DAMAGE_LEVEL_3*0.5) //3 points healed, applied every 4 ticks
H.adjustBruteLoss(cold_env_multiplier*COLD_GAS_DAMAGE_LEVEL_3)
H.throw_alert("temp", /obj/screen/alert/cold/drask, 3)
if(61 to 200)
H.adjustFireLoss(cold_env_multiplier*COLD_GAS_DAMAGE_LEVEL_2*0.5) //1.5 healed every 4 ticks
H.adjustBruteLoss(cold_env_multiplier*COLD_GAS_DAMAGE_LEVEL_2)
H.throw_alert("temp", /obj/screen/alert/cold/drask, 2)
if(201 to 260)
H.adjustFireLoss(cold_env_multiplier*COLD_GAS_DAMAGE_LEVEL_1*0.5) //0.5 healed every 4 ticks
H.adjustBruteLoss(cold_env_multiplier*COLD_GAS_DAMAGE_LEVEL_1)
H.throw_alert("temp", /obj/screen/alert/cold/drask, 1)
if(heat_level_1 to heat_level_2)
H.apply_damage(hot_env_multiplier*HEAT_GAS_DAMAGE_LEVEL_1, BURN, "head", used_weapon = "Excessive Heat")
if(heat_level_2 to heat_level_3_breathe)
H.apply_damage(hot_env_multiplier*HEAT_GAS_DAMAGE_LEVEL_2, BURN, "head", used_weapon = "Excessive Heat")
if(heat_level_3_breathe to INFINITY)
H.apply_damage(hot_env_multiplier*HEAT_GAS_DAMAGE_LEVEL_3, BURN, "head", used_weapon = "Excessive Heat")
@@ -107,17 +107,7 @@ Please contact me on #coderbus IRC. ~Carn x
var/list/overlays_standing[TOTAL_LAYERS]
var/previous_damage_appearance // store what the body last looked like, so we only have to update it if something changed
var/icon/skeleton
/mob/living/carbon/human/proc/apply_overlay(cache_index)
var/image/I = overlays_standing[cache_index]
if(I)
overlays += I
/mob/living/carbon/human/proc/remove_overlay(cache_index)
if(overlays_standing[cache_index])
overlays -= overlays_standing[cache_index]
overlays_standing[cache_index] = null
var/list/cached_standing_overlays = list() // List of everything currently in a human's actual overlays
//UPDATES OVERLAYS FROM OVERLAYS_LYING/OVERLAYS_STANDING
//this proc is messy as I was forced to include some old laggy cloaking code to it so that I don't break cloakers
@@ -125,6 +115,7 @@ Please contact me on #coderbus IRC. ~Carn x
/mob/living/carbon/human/update_icons()
var/stealth = 0
var/obj/item/clothing/suit/armor/abductor/vest/V // Begin the most snowflakey bullshit code I've ever written. I'm so sorry, but there was no other way.
for(V in list(wear_suit))
if(V.stealth_active)
stealth = 1
@@ -133,6 +124,7 @@ Please contact me on #coderbus IRC. ~Carn x
if(stealth)
icon = V.disguise.icon //if the suit is active, reference the suit's current loaded icon and overlays; this does not include hand overlays
overlays.Cut()
cached_standing_overlays.Cut() // Make sure the cache gets rebuilt once the disguise is gone
for(var/thing in V.disguise.overlays)
if(thing)
@@ -146,10 +138,28 @@ Please contact me on #coderbus IRC. ~Carn x
overlays += I
else
icon = stand_icon
overlays.Cut()
var/list/new_overlays = list()
var/list/old_overlays = cached_standing_overlays
for(var/thing in overlays_standing)
if(thing) overlays += thing
// Totally regenerate if something touched our overlays
if(overlays.len != old_overlays.len)
overlays.Cut()
old_overlays.Cut()
for(var/i in 1 to TOTAL_LAYERS)
var/image/I = overlays_standing[i]
if(I)
if(istype(I))
// Since we avoid full overlay rebuilds, we have to reorganize the layers manually
I.layer = (-2 - (TOTAL_LAYERS - i)) // Highest layer gets -2, each prior layer is 1 lower
new_overlays += I
if(frozen) // Admin freeze overlay
new_overlays += frozen
overlays += (new_overlays - old_overlays)
overlays -= (old_overlays - new_overlays)
cached_standing_overlays = new_overlays
update_transform()
@@ -538,12 +548,13 @@ var/global/list/damage_icon_parts = list()
/mob/living/carbon/human/update_fire()
remove_overlay(FIRE_LAYER)
if(on_fire)
overlays_standing[FIRE_LAYER] = image("icon"=fire_dmi, "icon_state"=fire_sprite, "layer"=-FIRE_LAYER)
if(!overlays_standing[FIRE_LAYER])
overlays_standing[FIRE_LAYER] = image("icon"=fire_dmi, "icon_state"=fire_sprite)
update_icons()
else
overlays_standing[FIRE_LAYER] = null
apply_overlay(FIRE_LAYER)
update_icons()
/* --------------------------------------- */
//For legacy support.
@@ -574,11 +585,12 @@ var/global/list/damage_icon_parts = list()
update_inv_legcuffed(0)
update_inv_pockets(0)
update_inv_wear_pda(0)
UpdateDamageIcon()
update_icons()
update_fire()
UpdateDamageIcon(0)
force_update_limbs()
update_tail_layer(0)
overlays.Cut() // Force all overlays to regenerate
update_fire()
update_icons()
/* --------------------------------------- */
//vvvvvv UPDATE_INV PROCS vvvvvv
@@ -1289,43 +1301,6 @@ var/global/list/damage_icon_parts = list()
if(update_icons) update_icons()
// Used mostly for creating head items
/mob/living/carbon/human/proc/generate_head_icon()
//gender no longer matters for the mouth, although there should probably be seperate base head icons.
// var/g = "m"
// if(gender == FEMALE) g = "f"
var/obj/item/organ/external/head/H = get_organ("head")
//base icons
var/icon/face_lying = new /icon('icons/mob/human_face.dmi',"bald_l")
if(H.f_style)
var/datum/sprite_accessory/facial_hair_style = facial_hair_styles_list[H.f_style]
if(facial_hair_style)
var/icon/facial_l = new/icon("icon" = facial_hair_style.icon, "icon_state" = "[facial_hair_style.icon_state]_l")
facial_l.Blend(rgb(H.r_facial, H.g_facial, H.b_facial), ICON_ADD)
face_lying.Blend(facial_l, ICON_OVERLAY)
if(H.h_style)
var/datum/sprite_accessory/hair_style = hair_styles_list[H.h_style]
if(hair_style)
var/icon/hair_l = new/icon("icon" = hair_style.icon, "icon_state" = "[hair_style.icon_state]_l")
hair_l.Blend(rgb(H.r_hair, H.g_hair, H.b_hair), ICON_ADD)
face_lying.Blend(hair_l, ICON_OVERLAY)
//Eyes
// Note: These used to be in update_face(), and the fact they're here will make it difficult to create a disembodied head
var/icon/eyes_l = new/icon('icons/mob/human_face.dmi', "eyes_l")
eyes_l.Blend(rgb(r_eyes, g_eyes, b_eyes), ICON_ADD)
face_lying.Blend(eyes_l, ICON_OVERLAY)
if(lip_style)
face_lying.Blend(new/icon('icons/mob/human_face.dmi', "lips_[lip_style]_l"), ICON_OVERLAY)
var/image/face_lying_image = new /image(icon = face_lying)
return face_lying_image
/mob/living/carbon/human/proc/force_update_limbs()
for(var/obj/item/organ/external/O in organs)
O.sync_colour_to_human(src)
@@ -28,7 +28,7 @@
to_chat(src, "<i>The [met.name] is already feeding on this subject...</i>")
return
to_chat(src, "\blue <i>I have latched onto the subject and begun feeding...</i>")
to_chat(M, "\red <b>The [src.name] has latched onto your head!</b>")
to_chat(M, "<span class='danger'>The [src.name] has latched onto your head!</span>")
Feedon(M)
else
+9 -11
View File
@@ -66,9 +66,9 @@
..()
H.equip_to_slot_or_del(new /obj/item/clothing/shoes/black/greytide(H), slot_shoes)
H.equip_to_slot_or_del(new /obj/item/clothing/under/owl(H), slot_w_uniform)
H.equip_to_slot_or_del(new /obj/item/clothing/suit/toggle/owlwings(H), slot_wear_suit)
H.equip_to_slot_or_del(new /obj/item/clothing/mask/gas/owl_mask(H), slot_wear_mask)
H.equip_to_slot_or_del(new /obj/item/clothing/under/owl/super_hero(H), slot_w_uniform)
H.equip_to_slot_or_del(new /obj/item/clothing/suit/toggle/owlwings/super_hero(H), slot_wear_suit)
H.equip_to_slot_or_del(new /obj/item/clothing/mask/gas/owl_mask/super_hero(H), slot_wear_mask)
H.equip_to_slot_or_del(new /obj/item/weapon/storage/belt/bluespace/owlman(H), slot_belt)
H.equip_to_slot_or_del(new /obj/item/clothing/glasses/night(H), slot_glasses)
@@ -84,10 +84,10 @@
/datum/superheroes/griffin/equip(var/mob/living/carbon/human/H)
..()
H.equip_to_slot_or_del(new /obj/item/clothing/shoes/griffin(H), slot_shoes)
H.equip_to_slot_or_del(new /obj/item/clothing/under/griffin(H), slot_w_uniform)
H.equip_to_slot_or_del(new /obj/item/clothing/suit/toggle/owlwings/griffinwings(H), slot_wear_suit)
H.equip_to_slot_or_del(new /obj/item/clothing/head/griffin(H), slot_head)
H.equip_to_slot_or_del(new /obj/item/clothing/shoes/griffin/super_hero(H), slot_shoes)
H.equip_to_slot_or_del(new /obj/item/clothing/under/griffin/super_hero(H), slot_w_uniform)
H.equip_to_slot_or_del(new /obj/item/clothing/suit/toggle/owlwings/griffinwings/super_hero(H), slot_wear_suit)
H.equip_to_slot_or_del(new /obj/item/clothing/head/griffin/super_hero(H), slot_head)
var/obj/item/weapon/implant/freedom/L = new/obj/item/weapon/implant/freedom(H)
L.imp_in = H
@@ -215,9 +215,8 @@
head_organ.h_style = "Bald"
head_organ.f_style = "Shaved"
target.s_tone = 35
target.r_eyes = 1
target.b_eyes = 1
target.g_eyes = 1
// No `update_dna=0` here because the character is being over-written
target.change_eye_color(1,1,1)
for(var/obj/item/W in target)
if(istype(W,/obj/item/organ)) continue
target.unEquip(W)
@@ -233,4 +232,3 @@
target.equip_to_slot_or_del(W, slot_wear_id)
target.equip_to_slot_or_del(new /obj/item/device/radio/headset(target), slot_l_ear)
target.regenerate_icons()
+3 -21
View File
@@ -18,9 +18,7 @@
var/turf/T = get_turf(src)
if(!T)
return 0
if(T.z == ZLEVEL_CENTCOMM) //dont detect mobs on centcomm
return 0
if(T.z >= MAX_Z)
if(!is_level_reachable(T.z))
return 0
if(user != null && src == user)
return 0
@@ -91,22 +89,6 @@
/mob/living/proc/calculate_affecting_pressure(var/pressure)
return 0
//sort of a legacy burn method for /electrocute, /shock, and the e_chair
/mob/living/proc/burn_skin(burn_amount)
if(istype(src, /mob/living/carbon/human))
var/mob/living/carbon/human/H = src //make this damage method divide the damage to be done among all the body parts, then burn each body part for that much damage. will have better effect then just randomly picking a body part
var/divided_damage = (burn_amount)/(H.organs.len)
var/extradam = 0 //added to when organ is at max dam
for(var/obj/item/organ/external/affecting in H.organs)
if(!affecting) continue
if(affecting.take_damage(0, divided_damage+extradam)) //TODO: fix the extradam stuff. Or, ebtter yet...rewrite this entire proc ~Carn
H.UpdateDamageIcon()
H.updatehealth()
return 1
else if(istype(src, /mob/living/silicon/ai))
return 0
/mob/living/proc/adjustBodyTemp(actual, desired, incrementboost)
var/temperature = actual
var/difference = abs(actual-desired) //get difference
@@ -669,7 +651,7 @@
who.unEquip(what)
if(silent)
put_in_hands(what)
add_logs(who, src, "stripped", addition="of [what]")
add_logs(src, who, "stripped", addition="of [what]")
// The src mob is trying to place an item on someone
// Override if a certain mob should be behave differently when placing items (can't, for example)
@@ -688,7 +670,7 @@
if(what && Adjacent(who))
unEquip(what)
who.equip_to_slot_if_possible(what, where, 0, 1)
add_logs(who, src, "equipped", what)
add_logs(src, who, "equipped", what)
/mob/living/singularity_act()
+16 -6
View File
@@ -151,9 +151,13 @@
/mob/living/proc/IgniteMob()
if(fire_stacks > 0 && !on_fire)
on_fire = 1
visible_message("<span class='warning'>[src] catches fire!</span>", \
"<span class='userdanger'>You're set on fire!</span>")
set_light(light_range + 3,l_color = "#ED9200")
throw_alert("fire", /obj/screen/alert/fire)
update_fire()
return 1
return 0
/mob/living/proc/ExtinguishMob()
if(on_fire)
@@ -167,14 +171,20 @@
return
/mob/living/proc/adjust_fire_stacks(add_fire_stacks) //Adjusting the amount of fire_stacks we have on person
fire_stacks = Clamp(fire_stacks + add_fire_stacks, -20, 20)
fire_stacks = Clamp(fire_stacks + add_fire_stacks, -20, 20)
if(on_fire && fire_stacks <= 0)
ExtinguishMob()
/mob/living/proc/handle_fire()
if(fire_stacks < 0)
fire_stacks++ //If we've doused ourselves in water to avoid fire, dry off slowly
fire_stacks = min(0, fire_stacks)//So we dry ourselves back to default, nonflammable.
if(fire_stacks < 0) //If we've doused ourselves in water to avoid fire, dry off slowly
fire_stacks = min(0, fire_stacks + 1)//So we dry ourselves back to default, nonflammable.
if(!on_fire)
return 1
if(fire_stacks > 0)
adjust_fire_stacks(-0.1) //the fire is slowly consumed
else
ExtinguishMob()
return
var/datum/gas_mixture/G = loc.return_air() // Check if we're standing in an oxygenless environment
if(G.oxygen < 1)
ExtinguishMob() //If there's no oxygen in the tile we're on, put out the fire
@@ -183,7 +193,7 @@
location.hotspot_expose(700, 50, 1)
/mob/living/fire_act()
adjust_fire_stacks(0.5)
adjust_fire_stacks(3)
IgniteMob()
//Mobs on Fire end
@@ -225,7 +235,7 @@
to_chat(user, "<span class='notice'>You already grabbed [src].</span>")
return
add_logs(src, user, "grabbed", addition="passively")
add_logs(user, src, "grabbed", addition="passively")
var/obj/item/weapon/grab/G = new /obj/item/weapon/grab(user, src)
if(buckled)
@@ -34,6 +34,7 @@
var/implanting = 0 //Used for the mind-slave implant
var/silent = 0 //Can't talk. Value goes down every life proc. //NOTE TO FUTURE CODERS: DO NOT INITIALIZE NUMERICAL VARS AS NULL OR I WILL MURDER YOU.
var/floating = 0
var/mob_size = MOB_SIZE_HUMAN
var/nightvision = 0
var/bloodcrawl = 0 //0 No blood crawling, 1 blood crawling, 2 blood crawling+mob devour
+2 -1
View File
@@ -29,7 +29,8 @@ var/list/department_radio_keys = list(
":U" = "Supply", "#U" = "Supply", ".U" = "Supply",
":Z" = "Service", "#Z" = "Service", ".Z" = "Service",
":P" = "AI Private", "#P" = "AI Private", ".P" = "AI Private",
":-" = "Special Ops", "#-" = "Special Ops", ".-" = "Special Ops"
":-" = "Special Ops", "#-" = "Special Ops", ".-" = "Special Ops",
":_" = "SyndTeam", "#_" = "SyndTeam", "._" = "SyndTeam"
)
+167 -64
View File
@@ -41,6 +41,7 @@ var/list/ai_verbs_default = list(
anchored = 1 // -- TLE
density = 1
status_flags = CANSTUN|CANPARALYSE|CANPUSH
mob_size = MOB_SIZE_LARGE
can_strip = 0
var/list/network = list("SS13","Telecomms","Research Outpost","Mining Outpost")
var/obj/machinery/camera/current = null
@@ -60,10 +61,10 @@ var/list/ai_verbs_default = list(
//MALFUNCTION
var/datum/module_picker/malf_picker
var/processing_time = 100
var/list/datum/AI_Module/current_modules = list()
var/fire_res_on_core = 0
var/can_dominate_mechs = 0
var/shunted = 0 //1 if the AI is currently shunted. Used to differentiate between shunted and ghosted/braindead
var/control_disabled = 0 // Set to 1 to stop AI from interacting via Click() -- TLE
var/malfhacking = 0 // More or less a copy of the above var, so that malf AIs can hack and still get new cyborgs -- NeoFite
var/malf_cooldown = 0 //Cooldown var for malf modules
@@ -71,7 +72,6 @@ var/list/ai_verbs_default = list(
var/obj/machinery/power/apc/malfhack = null
var/explosive = 0 //does the AI explode when it dies?
var/mob/living/silicon/ai/parent = null
var/camera_light_on = 0
var/list/obj/machinery/camera/lit_cameras = list()
@@ -85,6 +85,8 @@ var/list/ai_verbs_default = list(
var/mob/living/simple_animal/bot/Bot
var/turf/waypoint //Holds the turf of the currently selected waypoint.
var/waypoint_mode = 0 //Waypoint mode is for selecting a turf via clicking.
var/nuking = 0
var/obj/machinery/doomsday_device/doomsday_device
var/obj/machinery/hologram/holopad/holo = null
var/mob/camera/aiEye/eyeobj = new()
@@ -220,9 +222,8 @@ var/list/ai_verbs_default = list(
to_chat(src, radio_text)
if(!(ticker && ticker.mode && (mind in ticker.mode.malf_ai)))
show_laws()
to_chat(src, "<b>These laws may be changed by other players, or by you being the traitor.</b>")
show_laws()
to_chat(src, "<b>These laws may be changed by other players, or by you being the traitor.</b>")
job = "AI"
@@ -247,6 +248,7 @@ var/list/ai_verbs_default = list(
shuttle_caller_list -= src
shuttle_master.autoEvac()
qdel(eyeobj) // No AI, no Eye
malfhack = null
return ..()
@@ -337,16 +339,6 @@ var/list/ai_verbs_default = list(
// to_chat(usr, "You can only change your display once!")
//return
// displays the malf_ai information if the AI is the malf
/mob/living/silicon/ai/show_malf_ai()
if(ticker.mode.name == "AI malfunction")
var/datum/game_mode/malfunction/malf = ticker.mode
for(var/datum/mind/malfai in malf.malf_ai)
if(mind == malfai) // are we the evil one?
if(malf.apcs >= 3)
stat(null, "Time until station control secured: [max(malf.AI_win_timeleft/(malf.apcs/3), 0)] seconds")
// this verb lets the ai see the stations manifest
/mob/living/silicon/ai/proc/ai_roster()
set name = "Show Crew Manifest"
@@ -640,21 +632,20 @@ var/list/ai_verbs_default = list(
if(check_unable(AI_CHECK_WIRELESS | AI_CHECK_RADIO))
return
var/ai_allowed_Zlevel = list(1,3,5)
var/d
var/area/bot_area
d += "<A HREF=?src=\ref[src];botrefresh=\ref[Bot]>Query network status</A><br>"
d += "<A HREF=?src=[UID()];botrefresh=\ref[Bot]>Query network status</A><br>"
d += "<table width='100%'><tr><td width='40%'><h3>Name</h3></td><td width='20%'><h3>Status</h3></td><td width='30%'><h3>Location</h3></td><td width='10%'><h3>Control</h3></td></tr>"
for(var/mob/living/simple_animal/bot/Bot in simple_animal_list)
if((Bot.z in ai_allowed_Zlevel) && !Bot.remote_disabled) //Only non-emagged bots on the allowed Z-level are detected!
if(is_ai_allowed(Bot.z) && !Bot.remote_disabled) //Only non-emagged bots on the allowed Z-level are detected!
bot_area = get_area(Bot)
d += "<tr><td width='30%'>[Bot.hacked ? "<span class='bad'>(!) </span>[Bot.name]" : Bot.name] ([Bot.model])</td>"
//If the bot is on, it will display the bot's current mode status. If the bot is not mode, it will just report "Idle". "Inactive if it is not on at all.
d += "<td width='20%'>[Bot.on ? "[Bot.mode ? "<span class='average'>[ Bot.mode_name[Bot.mode] ]</span>": "<span class='good'>Idle</span>"]" : "<span class='bad'>Inactive</span>"]</td>"
d += "<td width='30%'>[bot_area.name]</td>"
d += "<td width='10%'><A HREF=?src=\ref[src];interface=\ref[Bot]>Interface</A></td>"
d += "<td width='10%'><A HREF=?src=\ref[src];callbot=\ref[Bot]>Call</A></td>"
d += "<td width='10%'><A HREF=?src=[UID()];interface=\ref[Bot]>Interface</A></td>"
d += "<td width='10%'><A HREF=?src=[UID()];callbot=\ref[Bot]>Call</A></td>"
d += "</tr>"
d = format_text(d)
@@ -811,49 +802,118 @@ var/list/ai_verbs_default = list(
custom_hologram = 1 // option is given in hologram menu
var/input
if(alert("Would you like to select a hologram based on a crew member or switch to unique avatar?",,"Crew Member","Unique")=="Crew Member")
switch(alert("Would you like to select a hologram based on a crew member, an animal, or switch to a unique avatar?",,"Crew Member","Unique","Animal"))
if("Crew Member")
var/personnel_list[] = list()
var/personnel_list[] = list()
for(var/datum/data/record/t in data_core.locked)//Look in data core locked.
personnel_list["[t.fields["name"]]: [t.fields["rank"]]"] = t.fields["image"]//Pull names, rank, and image.
for(var/datum/data/record/t in data_core.locked)//Look in data core locked.
personnel_list["[t.fields["name"]]: [t.fields["rank"]]"] = t.fields["image"]//Pull names, rank, and image.
if(personnel_list.len)
input = input("Select a crew member:") as null|anything in personnel_list
var/icon/character_icon = personnel_list[input]
if(character_icon)
qdel(holo_icon)//Clear old icon so we're not storing it in memory.
holo_icon = getHologramIcon(icon(character_icon))
else
alert("No suitable records found. Aborting.")
if("Animal")
var/icon_list[] = list(
"Bear",
"Carp",
"Chicken",
"Corgi",
"Cow",
"Crab",
"Deer",
"Fox",
"Goat",
"Goose",
"Kitten",
"Kitten2",
"Pig",
"Poly",
"Pug",
"Seal",
"Spider",
"Turkey"
)
input = input("Please select a hologram:") as null|anything in icon_list
if(input)
qdel(holo_icon)
switch(input)
if("Bear")
holo_icon = getHologramIcon(icon('icons/mob/animal.dmi',"bear"))
if("Carp")
holo_icon = getHologramIcon(icon('icons/mob/animal.dmi',"carp"))
if("Chicken")
holo_icon = getHologramIcon(icon('icons/mob/animal.dmi',"chicken_brown"))
if("Corgi")
holo_icon = getHologramIcon(icon('icons/mob/animal.dmi',"corgi"))
if("Cow")
holo_icon = getHologramIcon(icon('icons/mob/animal.dmi',"cow"))
if("Crab")
holo_icon = getHologramIcon(icon('icons/mob/animal.dmi',"crab"))
if("Deer")
holo_icon = getHologramIcon(icon('icons/mob/animal.dmi',"deer"))
if("Fox")
holo_icon = getHologramIcon(icon('icons/mob/pets.dmi',"fox"))
if("Goat")
holo_icon = getHologramIcon(icon('icons/mob/animal.dmi',"goat"))
if("Goose")
holo_icon = getHologramIcon(icon('icons/mob/animal.dmi',"goose"))
if("Kitten")
holo_icon = getHologramIcon(icon('icons/mob/pets.dmi',"cat"))
if("Kitten2")
holo_icon = getHologramIcon(icon('icons/mob/pets.dmi',"cat2"))
if("Pig")
holo_icon = getHologramIcon(icon('icons/mob/animal.dmi',"pig"))
if("Poly")
holo_icon = getHologramIcon(icon('icons/mob/animal.dmi',"parrot_fly"))
if("Pug")
holo_icon = getHologramIcon(icon('icons/mob/pets.dmi',"pug"))
if("Seal")
holo_icon = getHologramIcon(icon('icons/mob/animal.dmi',"seal"))
if("Spider")
holo_icon = getHologramIcon(icon('icons/mob/animal.dmi',"guard"))
if("Turkey")
holo_icon = getHologramIcon(icon('icons/mob/animal.dmi',"turkey"))
if(personnel_list.len)
input = input("Select a crew member:") as null|anything in personnel_list
var/icon/character_icon = personnel_list[input]
if(character_icon)
qdel(holo_icon)//Clear old icon so we're not storing it in memory.
holo_icon = getHologramIcon(icon(character_icon))
else
alert("No suitable records found. Aborting.")
var/icon_list[] = list(
"default",
"floating face",
"xeno queen",
"eldritch",
"ancient machine"
)
if(custom_hologram) //insert custom hologram
icon_list.Add("custom")
else
var/icon_list[] = list(
"default",
"floating face",
"xeno queen",
"eldritch",
"ancient machine"
)
if(custom_hologram) //insert custom hologram
icon_list.Add("custom")
input = input("Please select a hologram:") as null|anything in icon_list
if(input)
qdel(holo_icon)
switch(input)
if("default")
holo_icon = getHologramIcon(icon('icons/mob/AI.dmi',"holo1"))
if("floating face")
holo_icon = getHologramIcon(icon('icons/mob/AI.dmi',"holo2"))
if("xeno queen")
holo_icon = getHologramIcon(icon('icons/mob/AI.dmi',"holo3"))
if("eldritch")
holo_icon = getHologramIcon(icon('icons/mob/AI.dmi',"holo4"))
if("ancient machine")
holo_icon = getHologramIcon(icon('icons/mob/ancient_machine.dmi', "ancient_machine"))
if("custom")
if("[ckey]-ai-holo" in icon_states('icons/mob/custom-synthetic.dmi'))
holo_icon = getHologramIcon(icon('icons/mob/custom-synthetic.dmi', "[ckey]-ai-holo"))
else if("[ckey]-ai-holo" in icon_states('icons/mob/custom-synthetic64.dmi'))
holo_icon = getHologramIcon(icon('icons/mob/custom-synthetic64.dmi', "[ckey]-ai-holo"))
else
holo_icon = getHologramIcon(icon('icons/mob/AI.dmi',"holo1"))
input = input("Please select a hologram:") as null|anything in icon_list
if(input)
qdel(holo_icon)
switch(input)
if("default")
holo_icon = getHologramIcon(icon('icons/mob/AI.dmi',"holo1"))
if("floating face")
holo_icon = getHologramIcon(icon('icons/mob/AI.dmi',"holo2"))
if("xeno queen")
holo_icon = getHologramIcon(icon('icons/mob/AI.dmi',"holo3"))
if("eldritch")
holo_icon = getHologramIcon(icon('icons/mob/AI.dmi',"holo4"))
if("ancient machine")
holo_icon = getHologramIcon(icon('icons/mob/ancient_machine.dmi', "ancient_machine"))
if("custom")
holo_icon = getHologramIcon(icon('icons/mob/custom-synthetic.dmi', "[ckey]-ai-holo"))
return
/mob/living/silicon/ai/proc/corereturn()
@@ -890,6 +950,10 @@ var/list/ai_verbs_default = list(
to_chat(src, "Camera lights activated.")
/mob/living/silicon/ai/proc/set_syndie_radio()
if(aiRadio)
aiRadio.make_syndie()
/mob/living/silicon/ai/proc/sensor_mode()
set name = "Set Sensor Augmentation"
set desc = "Augment visual feed with internal sensor overlays."
@@ -999,7 +1063,7 @@ var/list/ai_verbs_default = list(
if(tobeopened)
switch(alert(src, "Do you want to open \the [tobeopened] for [target]?","Doorknob_v2a.exe","Yes","No"))
if("Yes")
var/nhref = "src=\ref[tobeopened];aiEnable=7"
var/nhref = "src=[tobeopened.UID()];aiEnable=7"
tobeopened.Topic(nhref, params2list(nhref), tobeopened, 1)
to_chat(src, "\blue You've opened \the [tobeopened] for [target].")
if("No")
@@ -1035,11 +1099,6 @@ var/list/ai_verbs_default = list(
if(interaction == AI_TRANS_TO_CARD)//The only possible interaction. Upload AI mob to a card.
if(!mind)
to_chat(user, "<span class='warning'>No intelligence patterns detected.</span>")//No more magical carding of empty cores, AI RETURN TO BODY!!!11
return
if(mind.special_role == "malfunction") //AI MALF!!
to_chat(user, "<span class='boldannounce'>ERROR</span>: Remote transfer interface disabled.")//Do ho ho ho~
return
new /obj/structure/AIcore/deactivated(loc)//Spawns a deactivated terminal at AI location.
aiRestorePowerRoutine = 0//So the AI initially has power.
@@ -1066,3 +1125,47 @@ var/list/ai_verbs_default = list(
eyeobj.setLoc(get_turf(C))
client.eye = eyeobj
return 1
/mob/living/silicon/ai/proc/relay_speech(mob/living/M, text, verb, datum/language/speaking)
if(!say_understands(M, speaking))//The AI will be able to understand most mobs talking through the holopad.
if(speaking)
text = speaking.scramble(text)
else
text = stars(text)
var/name_used = M.GetVoice()
//This communication is imperfect because the holopad "filters" voices and is only designed to connect to the master only.
var/rendered
if(speaking)
rendered = "<i><span class='game say'>Relayed Speech: <span class='name'>[name_used]</span> [speaking.format_message(text, verb)]</span></i>"
else
rendered = "<i><span class='game say'>Relayed Speech: <span class='name'>[name_used]</span> [verb], <span class='message'>\"[text]\"</span></span></i>"
show_message(rendered, 2)
/mob/living/silicon/ai/proc/malfhacked(obj/machinery/power/apc/apc)
malfhack = null
malfhacking = 0
clear_alert("hackingapc")
if(!istype(apc) || qdeleted(apc) || apc.stat & BROKEN)
to_chat(src, "<span class='danger'>Hack aborted. The designated APC no longer exists on the power network.</span>")
playsound(get_turf(src), 'sound/machines/buzz-two.ogg', 50, 1)
else if(apc.aidisabled)
to_chat(src, "<span class='danger'>Hack aborted. [apc] is no longer responding to our systems.</span>")
playsound(get_turf(src), 'sound/machines/buzz-sigh.ogg', 50, 1)
else
malf_picker.processing_time += 10
apc.malfai = parent || src
apc.malfhack = TRUE
apc.locked = TRUE
playsound(get_turf(src), 'sound/machines/ding.ogg', 50, 1)
to_chat(src, "Hack complete. [apc] is now under your exclusive control.")
apc.update_icon()
/mob/living/silicon/ai/proc/add_malf_picker()
to_chat(src, "In the top right corner of the screen you will find the Malfunctions tab, where you can purchase various abilities, from upgraded surveillance to station ending doomsday devices.")
to_chat(src, "You are also capable of hacking APCs, which grants you more points to spend on your Malfunction powers. The drawback is that a hacked APC will give you away if spotted by the crew. Hacking an APC takes 60 seconds.")
view_core() //A BYOND bug requires you to be viewing your core before your verbs update
verbs += /mob/living/silicon/ai/proc/choose_modules
malf_picker = new /datum/module_picker
+17 -2
View File
@@ -14,6 +14,21 @@
shuttle_caller_list -= src
shuttle_master.autoEvac()
if(nuking)
set_security_level("red")
nuking = 0
for(var/obj/item/weapon/pinpointer/point in pinpointer_list)
point.the_disk = null //Point back to the disk.
if(doomsday_device)
doomsday_device.timing = 0
shuttle_master.emergencyNoEscape = 0
if(shuttle_master.emergency.mode == SHUTTLE_STRANDED)
shuttle_master.emergency.mode = SHUTTLE_DOCKED
shuttle_master.emergency.timer = world.time
priority_announcement.Announce("Hostile environment resolved. You have 3 minutes to board the Emergency Shuttle.", "Priority Announcement", 'sound/AI/shuttledock.ogg')
qdel(doomsday_device)
if(explosive)
spawn(10)
explosion(src.loc, 3, 6, 12, 15)
@@ -24,7 +39,7 @@
if(istype(loc, /obj/item/device/aicard))
loc.icon_state = "aicard-404"
timeofdeath = worldtime2text()
if(mind) mind.store_memory("Time of death: [timeofdeath]", 0)
timeofdeath = world.time
if(mind) mind.store_memory("Time of death: [worldtime2text(timeofdeath)]", 0)
return ..(gibbed)
@@ -19,9 +19,10 @@
msg += "It looks slightly charred.\n"
else
msg += "<B>Its casing is melted and heat-warped!</B>\n"
if(src.stat == UNCONSCIOUS)
msg += "It is non-responsive and displaying the text: \"RUNTIME: Sensory Overload, stack 26/3\".\n"
if(!shunted && !client)
msg += "[src]Core.exe has stopped responding! NTOS is searching for a solution to the problem...\n"
msg += "</span>"
msg += "*---------*</span>"
@@ -116,3 +116,7 @@
return //won't work if dead
acceleration = !acceleration
to_chat(usr, "Camera acceleration has been toggled [acceleration ? "on" : "off"].")
/mob/camera/aiEye/hear_say(var/message, var/verb = "says", var/datum/language/language = null, var/alt_name = "", var/italics = 0, var/mob/speaker = null, var/sound/speech_sound, var/sound_vol)
if(relay_speech)
ai.relay_speech(speaker, message, verb, language)
+41 -6
View File
@@ -15,10 +15,6 @@ var/global/list/empty_playable_ai_cores = list()
set category = "OOC"
set desc = "Wipe your core. This is functionally equivalent to cryo or robotic storage, freeing up your job slot."
if(ticker && ticker.mode && ticker.mode.name == "AI malfunction")
to_chat(usr, "<span class='danger'>You cannot use this verb in malfunction. If you need to leave, please adminhelp.</span>")
return
// Guard against misclicks, this isn't the sort of thing we want happening accidentally
if(alert("WARNING: This will immediately wipe your core and ghost you, removing your character from the round permanently (similar to cryo and robotic storage). Are you entirely sure you want to do this?",
"Wipe Core", "No", "No", "Yes") != "Yes")
@@ -34,11 +30,50 @@ var/global/list/empty_playable_ai_cores = list()
job_master.FreeRole(job)
if(mind.objectives.len)
qdel(mind.objectives)
mind.objectives.Cut()
mind.special_role = null
else
if(ticker.mode.name == "AutoTraitor")
var/datum/game_mode/traitor/autotraitor/current_mode = ticker.mode
current_mode.possible_traitors.Remove(src)
qdel(src)
qdel(src)
// TODO: Move away from the insane name-based landmark system
/mob/living/silicon/ai/proc/moveToAILandmark()
var/obj/loc_landmark
for(var/obj/effect/landmark/start/sloc in landmarks_list)
if(sloc.name != "AI")
continue
if(locate(/mob/living) in sloc.loc)
continue
loc_landmark = sloc
if(!loc_landmark)
for(var/obj/effect/landmark/tripai in landmarks_list)
if(tripai.name == "tripai")
if(locate(/mob/living) in tripai.loc)
continue
loc_landmark = tripai
if(!loc_landmark)
to_chat(src, "Oh god sorry we can't find an unoccupied AI spawn location, so we're spawning you on top of someone.")
for(var/obj/effect/landmark/start/sloc in landmarks_list)
if(sloc.name == "AI")
loc_landmark = sloc
forceMove(loc_landmark.loc)
view_core()
// Before calling this, make sure an empty core exists, or this will no-op
/mob/living/silicon/ai/proc/moveToEmptyCore()
if(!empty_playable_ai_cores.len)
log_runtime(EXCEPTION("moveToEmptyCore called without any available cores"), src)
return
// IsJobAvailable for AI checks that there is an empty core available in this list
var/obj/structure/AIcore/deactivated/C = empty_playable_ai_cores[1]
empty_playable_ai_cores -= C
forceMove(C.loc)
view_core()
qdel(C)
+1 -4
View File
@@ -152,10 +152,7 @@
health = 100
stat = CONSCIOUS
else
if(fire_res_on_core)
health = 100 - getOxyLoss() - getToxLoss() - getBruteLoss()
else
health = 100 - getOxyLoss() - getToxLoss() - getFireLoss() - getBruteLoss()
health = 100 - getOxyLoss() - getToxLoss() - getFireLoss() - getBruteLoss()
diag_hud_set_status()
diag_hud_set_health()
+1 -1
View File
@@ -17,7 +17,7 @@ var/const/VOX_PATH = "sound/vox_fem/"
var/index = 0
for(var/word in vox_sounds)
index++
dat += "<A href='?src=\ref[src];say_word=[word]'>[capitalize(word)]</A>"
dat += "<A href='?src=[UID()];say_word=[word]'>[capitalize(word)]</A>"
if(index != vox_sounds.len)
dat += " / "
+7 -4
View File
@@ -5,7 +5,7 @@
robot_talk_understand = 0
emote_type = 2 // pAIs emotes are heard, not seen, so they can be seen through a container (eg. person)
small = 1
mob_size = MOB_SIZE_TINY
pass_flags = PASSTABLE
density = 0
holder_type = /obj/item/weapon/holder/pai
@@ -215,7 +215,7 @@
if(M.attack_sound)
playsound(loc, M.attack_sound, 50, 1, 1)
for(var/mob/O in viewers(src, null))
O.show_message("\red <B>[M]</B> [M.attacktext] [src]!", 1)
O.show_message("<span class='danger'>[M]</span> [M.attacktext] [src]!", 1)
M.attack_log += text("\[[time_stamp()]\] <font color='red'>attacked [src.name] ([src.ckey])</font>")
src.attack_log += text("\[[time_stamp()]\] <font color='orange'>was attacked by [M.name] ([M.ckey])</font>")
var/damage = rand(M.melee_damage_lower, M.melee_damage_upper)
@@ -245,7 +245,7 @@
playsound(src.loc, 'sound/weapons/slash.ogg', 25, 1, -1)
for(var/mob/O in viewers(src, null))
if((O.client && !( O.blinded )))
O.show_message(text("\red <B>[] has slashed at []!</B>", M, src), 1)
O.show_message(text("<span class='danger'>[] has slashed at []!</span>", M, src), 1)
if(prob(8))
flash_eyes(affect_silicon = 1)
src.adjustBruteLoss(damage)
@@ -254,7 +254,7 @@
playsound(src.loc, 'sound/weapons/slashmiss.ogg', 25, 1, -1)
for(var/mob/O in viewers(src, null))
if((O.client && !( O.blinded )))
O.show_message(text("\red <B>[] took a swipe at []!</B>", M, src), 1)
O.show_message(text("<span class='danger'>[] took a swipe at []!</span>", M, src), 1)
return
/mob/living/silicon/pai/proc/switchCamera(var/obj/machinery/camera/C)
@@ -566,6 +566,9 @@
var/obj/item/weapon/holder/H = ..()
if(!istype(H))
return
if(resting)
icon_state = "[chassis]"
resting = 0
H.icon_state = "pai-[icon_state]"
H.item_state = "pai-[icon_state]"
grabber.put_in_active_hand(H)//for some reason unless i call this it dosen't work
@@ -17,10 +17,10 @@
var/savefile/F = new /savefile(src.savefile_path(user))
to_chat(F["name"], src.name)
to_chat(F["description"], src.description)
to_chat(F["role"], src.role)
to_chat(F["comments"], src.comments)
F["name"] << src.name
F["description"] << src.description
F["role"] << src.role
F["comments"] << src.comments
F["version"] << 1
@@ -180,28 +180,28 @@ var/datum/paiController/paiController // Global handler for pAI candidates
<table>
<tr class="d0">
<th rowspan="2"><a href='byond://?src=\ref[src];option=name;new=1;candidate=\ref[candidate]'>Name</a>:</th>
<th rowspan="2"><a href='byond://?src=[UID()];option=name;new=1;candidate=\ref[candidate]'>Name</a>:</th>
<td class="desc">[candidate.name]&nbsp;</td>
</tr>
<tr class="d1">
<td>What you plan to call yourself. Suggestions: Any character name you would choose for a station character OR an AI.</td>
</tr>
<tr class="d0">
<th rowspan="2"><a href='byond://?src=\ref[src];option=desc;new=1;candidate=\ref[candidate]'>Description</a>:</th>
<th rowspan="2"><a href='byond://?src=[UID()];option=desc;new=1;candidate=\ref[candidate]'>Description</a>:</th>
<td class="desc">[candidate.description]&nbsp;</td>
</tr>
<tr class="d1">
<td>What sort of pAI you typically play; your mannerisms, your quirks, etc. This can be as sparse or as detailed as you like.</td>
</tr>
<tr class="d0">
<th rowspan="2"><a href='byond://?src=\ref[src];option=role;new=1;candidate=\ref[candidate]'>Preferred Role</a>:</th>
<th rowspan="2"><a href='byond://?src=[UID()];option=role;new=1;candidate=\ref[candidate]'>Preferred Role</a>:</th>
<td class="desc">[candidate.role]&nbsp;</td>
</tr>
<tr class="d1">
<td>Do you like to partner with sneaky social ninjas? Like to help security hunt down thugs? Enjoy watching an engineer's back while he saves the station yet again? This doesn't have to be limited to just station jobs. Pretty much any general descriptor for what you'd like to be doing works here.</td>
</tr>
<tr class="d0">
<th rowspan="2"><a href='byond://?src=\ref[src];option=ooc;new=1;candidate=\ref[candidate]'>OOC Comments</a>:</th>
<th rowspan="2"><a href='byond://?src=[UID()];option=ooc;new=1;candidate=\ref[candidate]'>OOC Comments</a>:</th>
<td class="desc">[candidate.comments]&nbsp;</td>
</tr>
<tr class="d1">
@@ -212,17 +212,17 @@ var/datum/paiController/paiController // Global handler for pAI candidates
<table>
<tr>
<td class="button">
<a href='byond://?src=\ref[src];option=save;new=1;candidate=\ref[candidate]' class="button">Save Personality</a>
<a href='byond://?src=[UID()];option=save;new=1;candidate=\ref[candidate]' class="button">Save Personality</a>
</td>
</tr>
<tr>
<td class="button">
<a href='byond://?src=\ref[src];option=load;new=1;candidate=\ref[candidate]' class="button">Load Personality</a>
<a href='byond://?src=[UID()];option=load;new=1;candidate=\ref[candidate]' class="button">Load Personality</a>
</td>
</tr>
</table><br>
<table>
<td class="button"><a href='byond://?src=\ref[src];option=submit;new=1;candidate=\ref[candidate]' class="button"><b><font size="4px">Submit Personality</font></b></a></td>
<td class="button"><a href='byond://?src=[UID()];option=submit;new=1;candidate=\ref[candidate]' class="button"><b><font size="4px">Submit Personality</font></b></a></td>
</table><br>
<body>
@@ -333,7 +333,7 @@ var/datum/paiController/paiController // Global handler for pAI candidates
</tr>
</table>
<table class="download">
<td class="download"><a href='byond://?src=\ref[src];download=1;candidate=\ref[c];device=\ref[p]' class="button"><b>Download [c.name]</b></a>
<td class="download"><a href='byond://?src=[UID()];download=1;candidate=\ref[c];device=\ref[p]' class="button"><b>Download [c.name]</b></a>
</td>
</table>
<br>
@@ -351,7 +351,7 @@ var/datum/paiController/paiController // Global handler for pAI candidates
if(O.client && (ROLE_PAI in O.client.prefs.be_special))
if(player_old_enough_antag(O.client,ROLE_PAI))
if(check_recruit(O))
to_chat(O, "\blue <b>A pAI card activated by [user.real_name] is looking for personalities. (<a href='?src=\ref[O];jump=\ref[P]'>Teleport</a> | <a href='?src=\ref[src];signup=\ref[O]'>Sign Up</a>)</b>")
to_chat(O, "<span class='boldnotice'>A pAI card activated by [user.real_name] is looking for personalities. (<a href='?src=[O.UID()];jump=\ref[P]'>Teleport</a> | <a href='?src=[UID()];signup=\ref[O]'>Sign Up</a>)</span>")
//question(O.client)
proc/check_recruit(var/mob/dead/observer/O)
@@ -56,7 +56,7 @@
while(!istype(M, /mob/living))
if(!M || !M.loc || count > 6)
//For a runtime where M ends up in nullspace (similar to bluespace but less colourful)
to_chat(src, "You are not being carried by anyone!")
to_chat(P, "You are not being carried by anyone!")
return 0
M = M.loc
count++
@@ -123,6 +123,7 @@
on_ui_interact(mob/living/silicon/pai/user, datum/nanoui/ui=null, force_open=1)
var/data[0]
data_core.get_manifest_json()
data["manifest"] = PDA_Manifest
ui = nanomanager.try_update_ui(user, user, id, ui, data, force_open)
@@ -499,7 +500,7 @@
/mob/living/silicon/pai/proc/hackloop()
var/turf/T = get_turf_or_move(src.loc)
for(var/mob/living/silicon/ai/AI in player_list)
if(!T || !(T.z in config.contact_levels))
if(!T || !is_station_contact(T.z))
break
if(T.loc)
to_chat(AI, "<font color = red><b>Network Alert: Brute-force encryption crack in progress in [T.loc].</b></font>")
@@ -704,7 +705,7 @@
while(!isliving(held))
if(!held || !held.loc || count > 6)
//For a runtime where M ends up in nullspace (similar to bluespace but less colourful)
to_chat(src, "You are not being carried by anyone!")
to_chat(user, "You are not being carried by anyone!")
return 0
held = held.loc
count++
@@ -204,7 +204,7 @@
to_chat(user, "\t Key: <font color='#FFA500'>Electronics</font>/<font color='red'>Brute</font>")
to_chat(user, "\t Damage Specifics: <font color='#FFA500'>[BU]</font> - <font color='red'>[BR]</font>")
if(M.timeofdeath && M.stat == DEAD)
to_chat(user, "<span class='notice'>Time of Disable: [M.timeofdeath]</span>")
to_chat(user, "<span class='notice'>Time of Disable: [worldtime2text(M.timeofdeath)]</span>")
var/mob/living/silicon/robot/H = M
var/list/damaged = H.get_damaged_components(1,1,1)
to_chat(user, "<span class='notice'>Localized Damage:</span>")
@@ -63,9 +63,9 @@
see_in_dark = 8
see_invisible = SEE_INVISIBLE_LEVEL_TWO
update_icons()
timeofdeath = worldtime2text()
if(mind) mind.store_memory("Time of death: [timeofdeath]", 0)
timeofdeath = world.time
if(mind) mind.store_memory("Time of death: [worldtime2text(timeofdeath)]", 0)
sql_report_cyborg_death(src)
return ..(gibbed)
return ..(gibbed)
@@ -38,12 +38,12 @@
dat += "<BR>[D.real_name] ([D.stat == 2 ? "<font color='red'>INACTIVE" : "<font color='green'>ACTIVE"]</FONT>)"
dat += "<font dize = 9><BR>Cell charge: [D.cell.charge]/[D.cell.maxcharge]."
dat += "<BR>Currently located in: [get_area(D)]."
dat += "<BR><A href='?src=\ref[src];resync=\ref[D]'>Resync</A> | <A href='?src=\ref[src];shutdown=\ref[D]'>Shutdown</A></font>"
dat += "<BR><A href='?src=[UID()];resync=\ref[D]'>Resync</A> | <A href='?src=[UID()];shutdown=\ref[D]'>Shutdown</A></font>"
dat += "<BR><BR><B>Request drone presence in area:</B> <A href='?src=\ref[src];setarea=1'>[drone_call_area]</A> (<A href='?src=\ref[src];ping=1'>Send ping</A>)"
dat += "<BR><BR><B>Request drone presence in area:</B> <A href='?src=[UID()];setarea=1'>[drone_call_area]</A> (<A href='?src=[UID()];ping=1'>Send ping</A>)"
dat += "<BR><BR><B>Drone fabricator</B>: "
dat += "[dronefab ? "<A href='?src=\ref[src];toggle_fab=1'>[(dronefab.produce_drones && !(dronefab.stat & NOPOWER)) ? "ACTIVE" : "INACTIVE"]</A>" : "<font color='red'><b>FABRICATOR NOT DETECTED.</b></font> (<A href='?src=\ref[src];search_fab=1'>search</a>)"]"
dat += "[dronefab ? "<A href='?src=[UID()];toggle_fab=1'>[(dronefab.produce_drones && !(dronefab.stat & NOPOWER)) ? "ACTIVE" : "INACTIVE"]</A>" : "<font color='red'><b>FABRICATOR NOT DETECTED.</b></font> (<A href='?src=[UID()];search_fab=1'>search</a>)"]"
user << browse(dat, "window=computer;size=400x500")
onclose(user, "computer")
return
@@ -295,14 +295,14 @@
module = new /obj/item/weapon/robot_module/drone(src)
var/dat = "<HEAD><TITLE>Drone modules</TITLE><META HTTP-EQUIV='Refresh' CONTENT='10'></HEAD><BODY>\n"
dat += {"<A HREF='?src=\ref[src];mach_close=robotmod'>Close</A>
dat += {"<A HREF='?src=[UID()];mach_close=robotmod'>Close</A>
<BR>
<BR>
<B>Activated Modules</B>
<BR>
Module 1: [module_state_1 ? "<A HREF=?src=\ref[src];mod=\ref[module_state_1]>[module_state_1]<A>" : "No Module"]<BR>
Module 2: [module_state_2 ? "<A HREF=?src=\ref[src];mod=\ref[module_state_2]>[module_state_2]<A>" : "No Module"]<BR>
Module 3: [module_state_3 ? "<A HREF=?src=\ref[src];mod=\ref[module_state_3]>[module_state_3]<A>" : "No Module"]<BR>
Module 1: [module_state_1 ? "<A HREF=?src=[UID()];mod=\ref[module_state_1]>[module_state_1]<A>" : "No Module"]<BR>
Module 2: [module_state_2 ? "<A HREF=?src=[UID()];mod=\ref[module_state_2]>[module_state_2]<A>" : "No Module"]<BR>
Module 3: [module_state_3 ? "<A HREF=?src=[UID()];mod=\ref[module_state_3]>[module_state_3]<A>" : "No Module"]<BR>
<BR>
<B>Installed Modules</B><BR><BR>"}
@@ -319,7 +319,7 @@
else if(activated(O))
module_string += text("[O]: <B>Activated</B><BR>")
else
module_string += text("[O]: <A HREF=?src=\ref[src];act=\ref[O]>Activate</A><BR>")
module_string += text("[O]: <A HREF=?src=[UID()];act=\ref[O]>Activate</A><BR>")
if((istype(O,/obj/item/weapon) || istype(O,/obj/item/device)) && !(istype(O,/obj/item/stack/cable_coil)))
tools += module_string
@@ -334,7 +334,7 @@
else if(activated(module.emag))
dat += text("[module.emag]: <B>Activated</B><BR>")
else
dat += text("[module.emag]: <A HREF=?src=\ref[src];act=\ref[module.emag]>Activate</A><BR>")
dat += text("[module.emag]: <A HREF=?src=[UID()];act=\ref[module.emag]>Activate</A><BR>")
dat += resources
@@ -113,7 +113,7 @@
if(istype(src,/mob/dead/observer))
var/mob/dead/observer/G = src
if(G.has_enabled_antagHUD == 1 && config.antag_hud_restricted)
to_chat(usr, "\blue <B>Upon using the antagHUD you forfeited the ability to join the round.</B>")
to_chat(usr, "<span class='warning'>Upon using the antagHUD you forfeited the ability to join the round.</span>")
return
if(G.started_as_observer == 1)
joinedasobserver = 1
@@ -133,6 +133,9 @@
to_chat(usr, "<span class='warning'>You must wait 10 minutes to respawn as a drone!</span>")
return
if(alert("Are you sure you want to respawn as a drone?", "Are you sure?", "Yes", "No") != "Yes")
return
for(var/obj/machinery/drone_fabricator/DF in world)
if(DF.stat & NOPOWER || !DF.produce_drones)
continue
@@ -21,7 +21,7 @@
photosync()
to_chat(src, "<b>Laws synced with AI, be sure to note any changes.</b>")
// TODO: Update to new antagonist system.
if(mind && mind.special_role == "traitor" && mind.original == src)
if(mind && mind.special_role == SPECIAL_ROLE_TRAITOR && mind.original == src)
to_chat(src, "<b>Remember, your AI does NOT share or know about your law 0.")
else
to_chat(src, "<b>No AI selected to sync laws with, disabling lawsync protocol.</b>")
@@ -30,7 +30,7 @@
to_chat(who, "<b>Obey these laws:</b>")
laws.show_laws(who)
// TODO: Update to new antagonist system.
if(mind && (mind.special_role == "traitor" && mind.original == src) && connected_ai)
if(mind && (mind.special_role == SPECIAL_ROLE_TRAITOR && mind.original == src) && connected_ai)
to_chat(who, "<b>Remember, [connected_ai.name] is technically your master, but your objective comes first.</b>")
else if(connected_ai)
to_chat(who, "<b>Remember, [connected_ai.name] is your master, other AIs can be ignored.</b>")
+11 -28
View File
@@ -507,20 +507,6 @@ var/list/robot_verbs_default = list(
return 1
return 0
// this function shows information about the malf_ai gameplay type in the status screen
/mob/living/silicon/robot/show_malf_ai()
..()
if(ticker && ticker.mode.name == "AI malfunction")
var/datum/game_mode/malfunction/malf = ticker.mode
for(var/datum/mind/malfai in malf.malf_ai)
if(connected_ai)
if(connected_ai.mind == malfai)
if(malf.apcs >= 3)
stat(null, "Time until station control secured: [max(malf.AI_win_timeleft/(malf.apcs/3), 0)] seconds")
else if(ticker.mode:malf_mode_declared)
stat(null, "Time left: [max(ticker.mode:AI_win_timeleft/(ticker.mode:apcs/3), 0)]")
return 0
// this function displays the cyborgs current cell charge in the stat panel
/mob/living/silicon/robot/proc/show_cell_power()
if(cell)
@@ -571,7 +557,7 @@ var/list/robot_verbs_default = list(
var/mob/tmob = AM
if(istype(tmob, /mob/living/carbon/human) && (FAT in tmob.mutations))
if(prob(20))
to_chat(usr, "\red <B>You fail to push [tmob]'s fat ass out of the way.</B>")
to_chat(usr, "<span class='danger'>You fail to push [tmob]'s fat ass out of the way.</span>")
now_pushing = 0
return
if(!(tmob.status_flags & CANPUSH))
@@ -669,9 +655,6 @@ var/list/robot_verbs_default = list(
C.r_arm = new/obj/item/robot_parts/r_arm(C)
C.updateicon()
new/obj/item/robot_parts/chest(loc)
// This doesn't work. Don't use it.
//src.Destroy()
// del() because it's infrequent and mobs act weird in qdel.
qdel(src)
else
// Okay we're not removing the cell or an MMI, but maybe something else?
@@ -1047,15 +1030,15 @@ var/list/robot_verbs_default = list(
if(!module)
pick_module()
return
var/dat = {"<A HREF='?src=\ref[src];mach_close=robotmod'>Close</A>
var/dat = {"<A HREF='?src=[UID()];mach_close=robotmod'>Close</A>
<BR>
<BR>
<B>Activated Modules</B>
<BR>
<table border='0'>
<tr><td>Module 1:</td><td>[module_state_1 ? "<A HREF=?src=\ref[src];mod=\ref[module_state_1]>[module_state_1]<A>" : "No Module"]</td></tr>
<tr><td>Module 2:</td><td>[module_state_2 ? "<A HREF=?src=\ref[src];mod=\ref[module_state_2]>[module_state_2]<A>" : "No Module"]</td></tr>
<tr><td>Module 3:</td><td>[module_state_3 ? "<A HREF=?src=\ref[src];mod=\ref[module_state_3]>[module_state_3]<A>" : "No Module"]</td></tr>
<tr><td>Module 1:</td><td>[module_state_1 ? "<A HREF=?src=[UID()];mod=\ref[module_state_1]>[module_state_1]<A>" : "No Module"]</td></tr>
<tr><td>Module 2:</td><td>[module_state_2 ? "<A HREF=?src=[UID()];mod=\ref[module_state_2]>[module_state_2]<A>" : "No Module"]</td></tr>
<tr><td>Module 3:</td><td>[module_state_3 ? "<A HREF=?src=[UID()];mod=\ref[module_state_3]>[module_state_3]<A>" : "No Module"]</td></tr>
</table><BR>
<B>Installed Modules</B><BR><BR>
@@ -1066,18 +1049,18 @@ var/list/robot_verbs_default = list(
else if(activated(obj))
dat += text("<tr><td>[obj]</td><td><B>Activated</B></td></tr>")
else
dat += text("<tr><td>[obj]</td><td><A HREF=?src=\ref[src];act=\ref[obj]>Activate</A></td></tr>")
dat += text("<tr><td>[obj]</td><td><A HREF=?src=[UID()];act=\ref[obj]>Activate</A></td></tr>")
if(emagged)
if(activated(module.emag))
dat += text("<tr><td>[module.emag]</td><td><B>Activated</B></td></tr>")
else
dat += text("<tr><td>[module.emag]</td><td><A HREF=?src=\ref[src];act=\ref[module.emag]>Activate</A></td></tr>")
dat += text("<tr><td>[module.emag]</td><td><A HREF=?src=[UID()];act=\ref[module.emag]>Activate</A></td></tr>")
dat += "</table>"
/*
if(activated(obj))
dat += text("[obj]: \[<B>Activated</B> | <A HREF=?src=\ref[src];deact=\ref[obj]>Deactivate</A>\]<BR>")
dat += text("[obj]: \[<B>Activated</B> | <A HREF=?src=[UID()];deact=\ref[obj]>Deactivate</A>\]<BR>")
else
dat += text("[obj]: \[<A HREF=?src=\ref[src];act=\ref[obj]>Activate</A> | <B>Deactivated</B>\]<BR>")
dat += text("[obj]: \[<A HREF=?src=[UID()];act=\ref[obj]>Activate</A> | <B>Deactivated</B>\]<BR>")
*/
var/datum/browser/popup = new(src, "robotmod", "Modules")
popup.set_content(dat)
@@ -1318,7 +1301,7 @@ var/list/robot_verbs_default = list(
return
switch(notifytype)
if(1) //New Cyborg
to_chat(connected_ai, "<br><br><span class='notice'>NOTICE - New cyborg connection detected: <a href='byond://?src=\ref[connected_ai];track2=\ref[connected_ai];track=\ref[src]'>[name]</a></span><br>")
to_chat(connected_ai, "<br><br><span class='notice'>NOTICE - New cyborg connection detected: <a href='byond://?src=[connected_ai.UID()];track2=\ref[connected_ai];track=\ref[src]'>[name]</a></span><br>")
if(2) //New Module
to_chat(connected_ai, "<br><br><span class='notice'>NOTICE - Cyborg module change detected: [name] has loaded the [designation] module.</span><br>")
if(3) //New Name
@@ -1383,7 +1366,7 @@ var/list/robot_verbs_default = list(
var/mob/M = pick(borg_candidates)
M.mind.transfer_to(src)
M.mind.assigned_role = "MODE"
M.mind.special_role = "Death Commando"
M.mind.special_role = SPECIAL_ROLE_DEATHSQUAD
ticker.mode.traitors |= M.mind // Adds them to current traitor list. Which is really the extra antagonist list.
key = M.key
else
@@ -23,14 +23,12 @@
if(emag)
emag.emp_act(severity)
..()
return
/obj/item/weapon/robot_module/New()
src.modules += new /obj/item/device/flashlight(src)
src.modules += new /obj/item/device/flash/cyborg(src)
src.emag = new /obj/item/toy/sword(src)
src.emag.name = "Placeholder Emag Item"
modules += new /obj/item/device/flash/cyborg(src)
emag = new /obj/item/toy/sword(src)
emag.name = "Placeholder Emag Item"
/obj/item/weapon/robot_module/Destroy()
for(var/module in modules)
@@ -48,18 +46,19 @@
emag.flags |= NODROP
emag.mouse_opacity = 2
/obj/item/weapon/robot_module/proc/respawn_consumable(var/mob/living/silicon/robot/R)
if(!stacktypes || !stacktypes.len) return
/obj/item/weapon/robot_module/proc/respawn_consumable(mob/living/silicon/robot/R)
if(!stacktypes || !stacktypes.len)
return
var/stack_respawned = 0
for(var/T in stacktypes)
var/O = locate(T) in src.modules
var/O = locate(T) in modules
var/obj/item/stack/S = O
if(!S)
src.modules -= null
modules -= null
S = new T(src)
src.modules += S
modules += S
S.amount = 1
stack_respawned = 1
@@ -75,7 +74,7 @@
if(O)
modules += O
/obj/item/weapon/robot_module/proc/add_languages(var/mob/living/silicon/robot/R)
/obj/item/weapon/robot_module/proc/add_languages(mob/living/silicon/robot/R)
//full set of languages
R.add_language("Galactic Common", 1)
R.add_language("Sol Common", 1)
@@ -93,10 +92,10 @@
R.add_language("Orluum", 0)
R.add_language("Clownish",0)
/obj/item/weapon/robot_module/proc/add_subsystems(var/mob/living/silicon/robot/R)
/obj/item/weapon/robot_module/proc/add_subsystems(mob/living/silicon/robot/R)
R.verbs |= subsystems
/obj/item/weapon/robot_module/proc/remove_subsystems(var/mob/living/silicon/robot/R)
/obj/item/weapon/robot_module/proc/remove_subsystems(mob/living/silicon/robot/R)
R.verbs -= subsystems
/obj/item/weapon/robot_module/standard
@@ -104,13 +103,13 @@
module_type = "Standard"
/obj/item/weapon/robot_module/standard/New()
src.modules += new /obj/item/device/flash/cyborg(src)
src.modules += new /obj/item/weapon/melee/baton/loaded(src)
src.modules += new /obj/item/weapon/extinguisher(src)
src.modules += new /obj/item/weapon/wrench(src)
src.modules += new /obj/item/weapon/crowbar(src)
src.modules += new /obj/item/device/healthanalyzer(src)
src.emag = new /obj/item/weapon/melee/energy/sword/cyborg(src)
..()
modules += new /obj/item/weapon/melee/baton/loaded(src)
modules += new /obj/item/weapon/extinguisher(src)
modules += new /obj/item/weapon/wrench(src)
modules += new /obj/item/weapon/crowbar(src)
modules += new /obj/item/device/healthanalyzer(src)
emag = new /obj/item/weapon/melee/energy/sword/cyborg(src)
fix_modules()
@@ -126,40 +125,40 @@
)
/obj/item/weapon/robot_module/medical/New()
src.modules += new /obj/item/device/flash/cyborg(src)
src.modules += new /obj/item/device/healthanalyzer/advanced(src)
src.modules += new /obj/item/device/reagent_scanner/adv(src)
src.modules += new /obj/item/weapon/borg_defib(src)
src.modules += new /obj/item/roller_holder(src)
src.modules += new /obj/item/weapon/reagent_containers/borghypo(src)
src.modules += new /obj/item/weapon/reagent_containers/glass/beaker/large(src)
src.modules += new /obj/item/weapon/reagent_containers/dropper(src)
src.modules += new /obj/item/weapon/reagent_containers/syringe(src)
src.modules += new /obj/item/weapon/extinguisher/mini(src)
src.modules += new /obj/item/stack/medical/bruise_pack/advanced(src)
src.modules += new /obj/item/stack/medical/ointment/advanced(src)
src.modules += new /obj/item/stack/medical/splint(src)
src.modules += new /obj/item/stack/nanopaste(src)
src.modules += new /obj/item/weapon/scalpel(src)
src.modules += new /obj/item/weapon/hemostat(src)
src.modules += new /obj/item/weapon/retractor(src)
src.modules += new /obj/item/weapon/cautery(src)
src.modules += new /obj/item/weapon/bonegel(src)
src.modules += new /obj/item/weapon/FixOVein(src)
src.modules += new /obj/item/weapon/bonesetter(src)
src.modules += new /obj/item/weapon/circular_saw(src)
src.modules += new /obj/item/weapon/surgicaldrill(src)
..()
modules += new /obj/item/device/healthanalyzer/advanced(src)
modules += new /obj/item/device/reagent_scanner/adv(src)
modules += new /obj/item/weapon/borg_defib(src)
modules += new /obj/item/roller_holder(src)
modules += new /obj/item/weapon/reagent_containers/borghypo(src)
modules += new /obj/item/weapon/reagent_containers/glass/beaker/large(src)
modules += new /obj/item/weapon/reagent_containers/dropper(src)
modules += new /obj/item/weapon/reagent_containers/syringe(src)
modules += new /obj/item/weapon/extinguisher/mini(src)
modules += new /obj/item/stack/medical/bruise_pack/advanced(src)
modules += new /obj/item/stack/medical/ointment/advanced(src)
modules += new /obj/item/stack/medical/splint(src)
modules += new /obj/item/stack/nanopaste(src)
modules += new /obj/item/weapon/scalpel(src)
modules += new /obj/item/weapon/hemostat(src)
modules += new /obj/item/weapon/retractor(src)
modules += new /obj/item/weapon/cautery(src)
modules += new /obj/item/weapon/bonegel(src)
modules += new /obj/item/weapon/FixOVein(src)
modules += new /obj/item/weapon/bonesetter(src)
modules += new /obj/item/weapon/circular_saw(src)
modules += new /obj/item/weapon/surgicaldrill(src)
src.emag = new /obj/item/weapon/reagent_containers/spray(src)
emag = new /obj/item/weapon/reagent_containers/spray(src)
src.emag.reagents.add_reagent("facid", 250)
src.emag.name = "Polyacid spray"
emag.reagents.add_reagent("facid", 250)
emag.name = "Polyacid spray"
fix_modules()
/obj/item/weapon/robot_module/medical/respawn_consumable(var/mob/living/silicon/robot/R)
if(src.emag)
var/obj/item/weapon/reagent_containers/spray/PS = src.emag
/obj/item/weapon/robot_module/medical/respawn_consumable(mob/living/silicon/robot/R)
if(emag)
var/obj/item/weapon/reagent_containers/spray/PS = emag
PS.reagents.add_reagent("facid", 2)
..()
@@ -178,28 +177,29 @@
)
/obj/item/weapon/robot_module/engineering/New()
src.modules += new /obj/item/device/flash/cyborg(src)
src.modules += new /obj/item/borg/sight/meson(src)
src.modules += new /obj/item/weapon/rcd/borg(src)
src.modules += new /obj/item/weapon/extinguisher(src)
src.modules += new /obj/item/weapon/weldingtool/largetank/cyborg(src)
src.modules += new /obj/item/weapon/screwdriver(src)
src.modules += new /obj/item/weapon/wrench(src)
src.modules += new /obj/item/weapon/crowbar(src)
src.modules += new /obj/item/weapon/wirecutters(src)
src.modules += new /obj/item/device/multitool(src)
src.modules += new /obj/item/device/t_scanner(src)
src.modules += new /obj/item/device/analyzer(src)
src.modules += new /obj/item/taperoll/engineering(src)
src.modules += new /obj/item/weapon/gripper(src)
src.modules += new /obj/item/weapon/matter_decompiler(src)
..()
modules += new /obj/item/borg/sight/meson(src)
modules += new /obj/item/weapon/rcd/borg(src)
modules += new /obj/item/weapon/extinguisher(src)
modules += new /obj/item/weapon/weldingtool/largetank/cyborg(src)
modules += new /obj/item/weapon/screwdriver(src)
modules += new /obj/item/weapon/wrench(src)
modules += new /obj/item/weapon/crowbar(src)
modules += new /obj/item/weapon/wirecutters(src)
modules += new /obj/item/device/multitool(src)
modules += new /obj/item/device/t_scanner(src)
modules += new /obj/item/device/analyzer(src)
modules += new /obj/item/taperoll/engineering(src)
modules += new /obj/item/weapon/gripper(src)
modules += new /obj/item/weapon/matter_decompiler(src)
modules += new /obj/item/device/floor_painter(src)
src.emag = new /obj/item/borg/stun(src)
emag = new /obj/item/borg/stun(src)
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
modules += M
fix_modules()
@@ -209,13 +209,13 @@
subsystems = list(/mob/living/silicon/proc/subsystem_crew_monitor)
/obj/item/weapon/robot_module/security/New()
src.modules += new /obj/item/device/flash/cyborg(src)
src.modules += new /obj/item/weapon/restraints/handcuffs/cable/zipties/cyborg(src)
src.modules += new /obj/item/weapon/melee/baton/loaded/robot(src)
src.modules += new /obj/item/weapon/gun/energy/disabler/cyborg(src)
src.modules += new /obj/item/taperoll/police(src)
src.modules += new /obj/item/clothing/mask/gas/sechailer/cyborg(src)
src.emag = new /obj/item/weapon/gun/energy/laser/cyborg(src)
..()
modules += new /obj/item/weapon/restraints/handcuffs/cable/zipties/cyborg(src)
modules += new /obj/item/weapon/melee/baton/loaded/robot(src)
modules += new /obj/item/weapon/gun/energy/disabler/cyborg(src)
modules += new /obj/item/taperoll/police(src)
modules += new /obj/item/clothing/mask/gas/sechailer/cyborg(src)
emag = new /obj/item/weapon/gun/energy/laser/cyborg(src)
fix_modules()
@@ -224,16 +224,16 @@
module_type = "Janitor"
/obj/item/weapon/robot_module/janitor/New()
src.modules += new /obj/item/device/flash/cyborg(src)
src.modules += new /obj/item/weapon/soap/nanotrasen(src)
src.modules += new /obj/item/weapon/storage/bag/trash/cyborg(src)
src.modules += new /obj/item/weapon/mop/advanced/cyborg(src)
src.modules += new /obj/item/device/lightreplacer(src)
src.modules += new /obj/item/weapon/holosign_creator(src)
src.emag = new /obj/item/weapon/reagent_containers/spray(src)
..()
modules += new /obj/item/weapon/soap/nanotrasen(src)
modules += new /obj/item/weapon/storage/bag/trash/cyborg(src)
modules += new /obj/item/weapon/mop/advanced/cyborg(src)
modules += new /obj/item/device/lightreplacer(src)
modules += new /obj/item/weapon/holosign_creator(src)
emag = new /obj/item/weapon/reagent_containers/spray(src)
src.emag.reagents.add_reagent("lube", 250)
src.emag.name = "Lube spray"
emag.reagents.add_reagent("lube", 250)
emag.name = "Lube spray"
fix_modules()
@@ -242,37 +242,37 @@
module_type = "Service"
/obj/item/weapon/robot_module/butler/New()
src.modules += new /obj/item/device/flash/cyborg(src)
src.modules += new /obj/item/weapon/reagent_containers/food/drinks/cans/beer(src)
src.modules += new /obj/item/weapon/reagent_containers/food/condiment/enzyme(src)
src.modules += new /obj/item/weapon/pen(src)
src.modules += new /obj/item/weapon/razor(src)
src.modules += new /obj/item/device/violin(src)
src.modules += new /obj/item/device/guitar(src)
..()
modules += new /obj/item/weapon/reagent_containers/food/drinks/cans/beer(src)
modules += new /obj/item/weapon/reagent_containers/food/condiment/enzyme(src)
modules += new /obj/item/weapon/pen(src)
modules += new /obj/item/weapon/razor(src)
modules += new /obj/item/device/violin(src)
modules += new /obj/item/device/guitar(src)
var/obj/item/weapon/rsf/M = new /obj/item/weapon/rsf(src)
M.matter = 30
src.modules += M
modules += M
src.modules += new /obj/item/weapon/reagent_containers/dropper/cyborg(src)
src.modules += new /obj/item/weapon/lighter/zippo(src)
src.modules += new /obj/item/weapon/storage/bag/tray/cyborg(src)
src.modules += new /obj/item/weapon/reagent_containers/food/drinks/shaker(src)
src.emag = new /obj/item/weapon/reagent_containers/food/drinks/cans/beer(src)
modules += new /obj/item/weapon/reagent_containers/dropper/cyborg(src)
modules += new /obj/item/weapon/lighter/zippo(src)
modules += new /obj/item/weapon/storage/bag/tray/cyborg(src)
modules += new /obj/item/weapon/reagent_containers/food/drinks/shaker(src)
emag = new /obj/item/weapon/reagent_containers/food/drinks/cans/beer(src)
var/datum/reagents/R = new/datum/reagents(50)
src.emag.reagents = R
R.my_atom = src.emag
emag.reagents = R
R.my_atom = emag
R.add_reagent("beer2", 50)
src.emag.name = "Mickey Finn's Special Brew"
emag.name = "Mickey Finn's Special Brew"
fix_modules()
/obj/item/weapon/robot_module/butler/respawn_consumable(var/mob/living/silicon/robot/R)
var/obj/item/weapon/reagent_containers/food/condiment/enzyme/E = locate() in src.modules
var/obj/item/weapon/reagent_containers/food/condiment/enzyme/E = locate() in modules
E.reagents.add_reagent("enzyme", 2)
if(src.emag)
var/obj/item/weapon/reagent_containers/food/drinks/cans/beer/B = src.emag
if(emag)
var/obj/item/weapon/reagent_containers/food/drinks/cans/beer/B = emag
B.reagents.add_reagent("beer2", 2)
..()
@@ -293,27 +293,13 @@
R.add_language("Bubblish", 1)
R.add_language("Clownish",1)
/*
/obj/item/weapon/robot_module/clerical //Whyyyyy?
name = "clerical robot module"
New()
src.modules += new /obj/item/device/flashlight(src)
src.modules += new /obj/item/device/flash/cyborg(src)
src.modules += new /obj/item/weapon/pen/multi/robopen(src)
src.modules += new /obj/item/weapon/form_printer(src)
src.modules += new /obj/item/device/taperecorder(src)
src.modules += new /obj/item/weapon/gripper/paperwork(src)
src.emag = new /obj/item/weapon/stamp/denied(src)
*/
/obj/item/weapon/robot_module/miner
name = "miner robot module"
module_type = "Miner"
/obj/item/weapon/robot_module/miner/New()
modules += new /obj/item/device/flash/cyborg(src)
..()
modules += new /obj/item/borg/sight/meson(src)
modules += new /obj/item/weapon/storage/bag/ore/cyborg(src)
modules += new /obj/item/weapon/pickaxe/drill/cyborg(src)
@@ -333,12 +319,12 @@
module_type = "Malf"
/obj/item/weapon/robot_module/deathsquad/New()
src.modules += new /obj/item/device/flash/cyborg(src)
src.modules += new /obj/item/borg/sight/thermal(src)
src.modules += new /obj/item/weapon/melee/energy/sword/cyborg(src)
src.modules += new /obj/item/weapon/gun/energy/pulse/cyborg(src)
src.modules += new /obj/item/weapon/crowbar(src)
src.emag = null
..()
modules += new /obj/item/borg/sight/thermal(src)
modules += new /obj/item/weapon/melee/energy/sword/cyborg(src)
modules += new /obj/item/weapon/gun/energy/pulse/cyborg(src)
modules += new /obj/item/weapon/crowbar(src)
emag = null
fix_modules()
@@ -347,14 +333,14 @@
module_type = "Malf" // cuz it looks cool
/obj/item/weapon/robot_module/syndicate/New()
src.modules += new /obj/item/device/flash/cyborg(src)
src.modules += new /obj/item/weapon/melee/energy/sword/cyborg(src)
src.modules += new /obj/item/weapon/gun/energy/printer(src)
src.modules += new /obj/item/weapon/gun/projectile/revolver/grenadelauncher/multi/cyborg(src)
src.modules += new /obj/item/weapon/card/emag(src)
src.modules += new /obj/item/weapon/crowbar(src)
src.modules += new /obj/item/weapon/pinpointer/operative(src)
src.emag = null
..()
modules += new /obj/item/weapon/melee/energy/sword/cyborg(src)
modules += new /obj/item/weapon/gun/energy/printer(src)
modules += new /obj/item/weapon/gun/projectile/revolver/grenadelauncher/multi/cyborg(src)
modules += new /obj/item/weapon/card/emag(src)
modules += new /obj/item/weapon/crowbar(src)
modules += new /obj/item/weapon/pinpointer/operative(src)
emag = null
fix_modules()
@@ -369,30 +355,30 @@
)
/obj/item/weapon/robot_module/syndicate_medical/New()
src.modules += new /obj/item/device/flash/cyborg(src)
src.modules += new /obj/item/device/healthanalyzer/advanced(src)
src.modules += new /obj/item/device/reagent_scanner/adv(src)
src.modules += new /obj/item/weapon/borg_defib(src)
src.modules += new /obj/item/roller_holder(src)
src.modules += new /obj/item/weapon/reagent_containers/borghypo/syndicate(src)
src.modules += new /obj/item/weapon/extinguisher/mini(src)
src.modules += new /obj/item/stack/medical/bruise_pack/advanced(src)
src.modules += new /obj/item/stack/medical/ointment/advanced(src)
src.modules += new /obj/item/stack/medical/splint(src)
src.modules += new /obj/item/stack/nanopaste(src)
src.modules += new /obj/item/weapon/scalpel(src)
src.modules += new /obj/item/weapon/hemostat(src)
src.modules += new /obj/item/weapon/retractor(src)
src.modules += new /obj/item/weapon/cautery(src)
src.modules += new /obj/item/weapon/bonegel(src)
src.modules += new /obj/item/weapon/FixOVein(src)
src.modules += new /obj/item/weapon/bonesetter(src)
src.modules += new /obj/item/weapon/surgicaldrill(src)
src.modules += new /obj/item/weapon/melee/energy/sword/cyborg/saw(src) //Energy saw -- primary weapon
src.modules += new /obj/item/weapon/card/emag(src)
src.modules += new /obj/item/weapon/crowbar(src)
src.modules += new /obj/item/weapon/pinpointer/operative(src)
src.emag = null
..()
modules += new /obj/item/device/healthanalyzer/advanced(src)
modules += new /obj/item/device/reagent_scanner/adv(src)
modules += new /obj/item/weapon/borg_defib(src)
modules += new /obj/item/roller_holder(src)
modules += new /obj/item/weapon/reagent_containers/borghypo/syndicate(src)
modules += new /obj/item/weapon/extinguisher/mini(src)
modules += new /obj/item/stack/medical/bruise_pack/advanced(src)
modules += new /obj/item/stack/medical/ointment/advanced(src)
modules += new /obj/item/stack/medical/splint(src)
modules += new /obj/item/stack/nanopaste(src)
modules += new /obj/item/weapon/scalpel(src)
modules += new /obj/item/weapon/hemostat(src)
modules += new /obj/item/weapon/retractor(src)
modules += new /obj/item/weapon/cautery(src)
modules += new /obj/item/weapon/bonegel(src)
modules += new /obj/item/weapon/FixOVein(src)
modules += new /obj/item/weapon/bonesetter(src)
modules += new /obj/item/weapon/surgicaldrill(src)
modules += new /obj/item/weapon/melee/energy/sword/cyborg/saw(src) //Energy saw -- primary weapon
modules += new /obj/item/weapon/card/emag(src)
modules += new /obj/item/weapon/crowbar(src)
modules += new /obj/item/weapon/pinpointer/operative(src)
emag = null
fix_modules()
@@ -401,15 +387,15 @@
module_type = "Malf"
/obj/item/weapon/robot_module/combat/New()
src.modules += new /obj/item/device/flash/cyborg(src)
src.modules += new /obj/item/weapon/restraints/handcuffs/cable/zipties/cyborg(src)
src.modules += new /obj/item/borg/sight/thermal(src)
src.modules += new /obj/item/weapon/gun/energy/gun/cyborg(src)
src.modules += new /obj/item/weapon/pickaxe/drill/jackhammer(src)
src.modules += new /obj/item/borg/combat/shield(src)
src.modules += new /obj/item/borg/combat/mobility(src)
src.modules += new /obj/item/weapon/wrench(src)
src.emag = new /obj/item/weapon/gun/energy/lasercannon/cyborg(src)
..()
modules += new /obj/item/weapon/restraints/handcuffs/cable/zipties/cyborg(src)
modules += new /obj/item/borg/sight/thermal(src)
modules += new /obj/item/weapon/gun/energy/gun/cyborg(src)
modules += new /obj/item/weapon/pickaxe/drill/jackhammer(src)
modules += new /obj/item/borg/combat/shield(src)
modules += new /obj/item/borg/combat/mobility(src)
modules += new /obj/item/weapon/wrench(src)
emag = new /obj/item/weapon/gun/energy/lasercannon/cyborg(src)
fix_modules()
@@ -418,14 +404,14 @@
module_type = "Malf"
/obj/item/weapon/robot_module/peacekeeper/New()
src.modules += new /obj/item/device/flash/cyborg(src)
src.modules += new /obj/item/weapon/restraints/handcuffs/cable/zipties/cyborg(src)
src.modules += new /obj/item/weapon/gun/energy/gun/cyborg(src)
src.modules += new /obj/item/weapon/pickaxe/drill/jackhammer(src)
src.modules += new /obj/item/borg/combat/shield(src)
src.modules += new /obj/item/borg/combat/mobility(src)
src.modules += new /obj/item/weapon/wrench(src)
src.emag = new /obj/item/weapon/gun/energy/lasercannon/cyborg(src)
..()
modules += new /obj/item/weapon/restraints/handcuffs/cable/zipties/cyborg(src)
modules += new /obj/item/weapon/gun/energy/gun/cyborg(src)
modules += new /obj/item/weapon/pickaxe/drill/jackhammer(src)
modules += new /obj/item/borg/combat/shield(src)
modules += new /obj/item/borg/combat/mobility(src)
modules += new /obj/item/weapon/wrench(src)
emag = new /obj/item/weapon/gun/energy/lasercannon/cyborg(src)
fix_modules()
@@ -434,18 +420,18 @@
module_type = "Standard"
/obj/item/weapon/robot_module/alien/hunter/New()
src.modules += new /obj/item/weapon/melee/energy/alien/claws(src)
src.modules += new /obj/item/device/flash/cyborg/alien(src)
src.modules += new /obj/item/borg/sight/thermal/alien(src)
modules += new /obj/item/weapon/melee/energy/alien/claws(src)
modules += new /obj/item/device/flash/cyborg/alien(src)
modules += new /obj/item/borg/sight/thermal/alien(src)
var/obj/item/weapon/reagent_containers/spray/alien/stun/S = new /obj/item/weapon/reagent_containers/spray/alien/stun(src)
S.reagents.add_reagent("ether",250) //nerfed to sleeptoxin to make it less instant drop.
src.modules += S
modules += S
var/obj/item/weapon/reagent_containers/spray/alien/smoke/A = new /obj/item/weapon/reagent_containers/spray/alien/smoke(src)
S.reagents.add_reagent("water",50) //Water is used as a dummy reagent for the smoke bombs. More of an ammo counter.
src.modules += A
src.emag = new /obj/item/weapon/reagent_containers/spray/alien/acid(src)
src.emag.reagents.add_reagent("facid", 125)
src.emag.reagents.add_reagent("sacid", 125)
modules += A
emag = new /obj/item/weapon/reagent_containers/spray/alien/acid(src)
emag.reagents.add_reagent("facid", 125)
emag.reagents.add_reagent("sacid", 125)
fix_modules()
@@ -468,44 +454,42 @@
)
/obj/item/weapon/robot_module/drone/New()
src.modules += new /obj/item/weapon/weldingtool/largetank/cyborg(src)
src.modules += new /obj/item/weapon/screwdriver(src)
src.modules += new /obj/item/weapon/wrench(src)
src.modules += new /obj/item/weapon/crowbar(src)
src.modules += new /obj/item/weapon/wirecutters(src)
src.modules += new /obj/item/device/multitool(src)
src.modules += new /obj/item/device/lightreplacer(src)
src.modules += new /obj/item/weapon/gripper(src)
src.modules += new /obj/item/weapon/matter_decompiler(src)
src.modules += new /obj/item/weapon/reagent_containers/spray/cleaner/drone(src)
src.modules += new /obj/item/weapon/soap(src)
src.modules += new /obj/item/device/t_scanner(src)
modules += new /obj/item/weapon/weldingtool/largetank/cyborg(src)
modules += new /obj/item/weapon/screwdriver(src)
modules += new /obj/item/weapon/wrench(src)
modules += new /obj/item/weapon/crowbar(src)
modules += new /obj/item/weapon/wirecutters(src)
modules += new /obj/item/device/multitool(src)
modules += new /obj/item/device/lightreplacer(src)
modules += new /obj/item/weapon/gripper(src)
modules += new /obj/item/weapon/matter_decompiler(src)
modules += new /obj/item/weapon/reagent_containers/spray/cleaner/drone(src)
modules += new /obj/item/weapon/soap(src)
modules += new /obj/item/device/t_scanner(src)
src.emag = new /obj/item/weapon/pickaxe/drill/cyborg/diamond(src)
emag = new /obj/item/weapon/pickaxe/drill/cyborg/diamond(src)
for(var/T in stacktypes)
var/obj/item/stack/sheet/W = new T(src)
W.amount = stacktypes[T]
src.modules += W
modules += W
fix_modules()
/obj/item/weapon/robot_module/drone/respawn_consumable(var/mob/living/silicon/robot/R)
var/obj/item/weapon/reagent_containers/spray/cleaner/C = locate() in src.modules
/obj/item/weapon/robot_module/drone/respawn_consumable(mob/living/silicon/robot/R)
var/obj/item/weapon/reagent_containers/spray/cleaner/C = locate() in modules
C.reagents.add_reagent("cleaner", 3)
var/obj/item/device/lightreplacer/LR = locate() in src.modules
var/obj/item/device/lightreplacer/LR = locate() in modules
LR.Charge(R)
..()
return
//checks whether this item is a module of the robot it is located in.
/obj/item/proc/is_robot_module()
if(!istype(src.loc, /mob/living/silicon/robot))
if(!istype(loc, /mob/living/silicon/robot))
return 0
var/mob/living/silicon/robot/R = src.loc
var/mob/living/silicon/robot/R = loc
return (src in R.module.modules)
+7 -13
View File
@@ -75,7 +75,7 @@
src.take_organ_damage(10)
Stun(3)
flash_eyes(affect_silicon = 1)
to_chat(src, "\red <B>*BZZZT*</B>")
to_chat(src, "<span class='danger'>*BZZZT*</span>")
to_chat(src, "\red Warning: Electromagnetic pulse detected.")
..()
@@ -143,18 +143,12 @@
stat(null, text("Systems nonfunctional"))
// This is a pure virtual function, it should be overwritten by all subclasses
/mob/living/silicon/proc/show_malf_ai()
return 0
// This adds the basic clock, shuttle recall timer, and malf_ai info to all silicon lifeforms
/mob/living/silicon/Stat()
if(statpanel("Status"))
show_stat_station_time()
show_stat_emergency_shuttle_eta()
show_system_integrity()
show_malf_ai()
..()
//Silicon mob language procs
@@ -182,15 +176,15 @@
var/dat = "<b><font size = 5>Known Languages</font></b><br/><br/>"
if(default_language)
dat += "Current default language: [default_language] - <a href='byond://?src=\ref[src];default_lang=reset'>reset</a><br/><br/>"
dat += "Current default language: [default_language] - <a href='byond://?src=[UID()];default_lang=reset'>reset</a><br/><br/>"
for(var/datum/language/L in languages)
if(!(L.flags & NONGLOBAL))
var/default_str
if(L == default_language)
default_str = " - default - <a href='byond://?src=\ref[src];default_lang=reset'>reset</a>"
default_str = " - default - <a href='byond://?src=[UID()];default_lang=reset'>reset</a>"
else
default_str = " - <a href='byond://?src=\ref[src];default_lang=[L]'>set default</a>"
default_str = " - <a href='byond://?src=[UID()];default_lang=[L]'>set default</a>"
var/synth = (L in speech_synthesizer_langs)
dat += "<b>[L.name] (:[L.key])</b>[synth ? default_str : null]<br/>Speech Synthesizer: <i>[synth ? "YES" : "NOT SUPPORTED"]</i><br/>[L.desc]<br/><br/>"
@@ -248,7 +242,7 @@
set desc = "Sets an extended description of your character's features."
set category = "IC"
flavor_text = sanitize(input(usr, "Please enter your new flavour text.", "Flavour text", null) as text)
update_flavor_text()
/mob/living/silicon/binarycheck()
return 1
@@ -332,7 +326,7 @@
to_chat(src, "\The [A.alarm_name()].")
if(alarm_raised)
to_chat(src, "<A HREF=?src=\ref[src];showalerts=1>\[Show Alerts\]</A>")
to_chat(src, "<A HREF=?src=[UID()];showalerts=1>\[Show Alerts\]</A>")
for(var/datum/alarm_handler/AH in queued_alarms)
var/list/alarms = queued_alarms[AH]
@@ -344,7 +338,7 @@
/mob/living/silicon/ai/raised_alarm(var/datum/alarm/A)
var/cameratext = ""
for(var/obj/machinery/camera/C in A.cameras())
cameratext += "[(cameratext == "")? "" : "|"]<A HREF=?src=\ref[src];switchcamera=\ref[C]>[C.c_tag]</A>"
cameratext += "[(cameratext == "")? "" : "|"]<A HREF=?src=[UID()];switchcamera=\ref[C]>[C.c_tag]</A>"
to_chat(src, "[A.alarm_name()]! ([(cameratext)? cameratext : "No Camera"])")
/mob/living/silicon/adjustToxLoss(var/amount)
@@ -132,7 +132,6 @@
..()
icon_living = icon_state
icon_dead = icon_state
icon_resting = icon_state
access_card = new /obj/item/weapon/card/id(src)
//This access is so bots can be immediately set to patrol and leave Robotics, instead of having to be let out first.
access_card.access += access_robotics
@@ -852,8 +851,6 @@ Pass a positive integer as an argument to override a bot's default speed.
ejectpai(usr)
update_controls()
/mob/living/simple_animal/bot/handle_state_icons()
/mob/living/simple_animal/bot/proc/update_icon()
icon_state = "[initial(icon_state)][on]"
@@ -883,9 +880,9 @@ Pass a positive integer as an argument to override a bot's default speed.
var/hack
if(issilicon(user) || check_rights(R_ADMIN, 0, user)) //Allows silicons or admins to toggle the emag status of a bot.
hack += "[emagged == 2 ? "Software compromised! Unit may exhibit dangerous or erratic behavior." : "Unit operating normally. Release safety lock?"]<BR>"
hack += "Harm Prevention Safety System: <A href='?src=\ref[src];operation=hack'>[emagged ? "<span class='bad'>DANGER</span>" : "Engaged"]</A><BR>"
hack += "Harm Prevention Safety System: <A href='?src=[UID()];operation=hack'>[emagged ? "<span class='bad'>DANGER</span>" : "Engaged"]</A><BR>"
else if(!locked) //Humans with access can use this option to hide a bot from the AI's remote control panel and PDA control.
hack += "Remote network control radio: <A href='?src=\ref[src];operation=remote'>[remote_disabled ? "Disconnected" : "Connected"]</A><BR>"
hack += "Remote network control radio: <A href='?src=[UID()];operation=remote'>[remote_disabled ? "Disconnected" : "Connected"]</A><BR>"
return hack
/mob/living/simple_animal/bot/proc/showpai(mob/user)
@@ -895,9 +892,9 @@ Pass a positive integer as an argument to override a bot's default speed.
eject += "Personality card status: "
if(paicard)
if(client)
eject += "<A href='?src=\ref[src];operation=ejectpai'>Active</A>"
eject += "<A href='?src=[UID()];operation=ejectpai'>Active</A>"
else
eject += "<A href='?src=\ref[src];operation=ejectpai'>Inactive</A>"
eject += "<A href='?src=[UID()];operation=ejectpai'>Inactive</A>"
else if(!allow_pai || key)
eject += "Unavailable"
else
@@ -203,10 +203,10 @@
Status: []<BR>
Behaviour controls are [locked ? "locked" : "unlocked"]<BR>
Maintenance panel panel is [open ? "opened" : "closed"]"},
text("<A href='?src=\ref[src];power=1'>[on ? "On" : "Off"]</A>"))
text("<A href='?src=[UID()];power=1'>[on ? "On" : "Off"]</A>"))
if(!locked || issilicon(user) || check_rights(R_ADMIN, 0, user))
dat += text({"<BR>Cleans Blood: []<BR>"}, text("<A href='?src=\ref[src];operation=blood'>[blood ? "Yes" : "No"]</A>"))
dat += text({"<BR>Patrol station: []<BR>"}, text("<A href='?src=\ref[src];operation=patrol'>[auto_patrol ? "Yes" : "No"]</A>"))
dat += text({"<BR>Cleans Blood: []<BR>"}, text("<A href='?src=[UID()];operation=blood'>[blood ? "Yes" : "No"]</A>"))
dat += text({"<BR>Patrol station: []<BR>"}, text("<A href='?src=[UID()];operation=patrol'>[auto_patrol ? "Yes" : "No"]</A>"))
return dat
/mob/living/simple_animal/bot/cleanbot/Topic(href, href_list)
@@ -10,6 +10,7 @@
damage_coeff = list(BRUTE = 0.5, BURN = 0.7, TOX = 0, CLONE = 0, STAMINA = 0, OXY = 0)
environment_smash = 2 //Walls can't stop THE LAW
mob_size = MOB_SIZE_LARGE
radio_channel = "Security"
bot_type = SEC_BOT
@@ -103,7 +104,7 @@ Status: []<BR>
Behaviour controls are [locked ? "locked" : "unlocked"]<BR>
Maintenance panel panel is [open ? "opened" : "closed"]<BR>"},
"<A href='?src=\ref[src];power=1'>[on ? "On" : "Off"]</A>" )
"<A href='?src=[UID()];power=1'>[on ? "On" : "Off"]</A>" )
if(!locked || issilicon(user) || check_rights(R_ADMIN, 0, user))
if(!lasercolor)
@@ -116,12 +117,12 @@ Operating Mode: []<BR>
Report Arrests[]<BR>
Auto Patrol[]"},
"<A href='?src=\ref[src];operation=idcheck'>[idcheck ? "Yes" : "No"]</A>",
"<A href='?src=\ref[src];operation=weaponscheck'>[weaponscheck ? "Yes" : "No"]</A>",
"<A href='?src=\ref[src];operation=ignorerec'>[check_records ? "Yes" : "No"]</A>",
"<A href='?src=\ref[src];operation=switchmode'>[arrest_type ? "Detain" : "Arrest"]</A>",
"<A href='?src=\ref[src];operation=declarearrests'>[declare_arrests ? "Yes" : "No"]</A>",
"<A href='?src=\ref[src];operation=patrol'>[auto_patrol ? "On" : "Off"]</A>" )
"<A href='?src=[UID()];operation=idcheck'>[idcheck ? "Yes" : "No"]</A>",
"<A href='?src=[UID()];operation=weaponscheck'>[weaponscheck ? "Yes" : "No"]</A>",
"<A href='?src=[UID()];operation=ignorerec'>[check_records ? "Yes" : "No"]</A>",
"<A href='?src=[UID()];operation=switchmode'>[arrest_type ? "Detain" : "Arrest"]</A>",
"<A href='?src=[UID()];operation=declarearrests'>[declare_arrests ? "Yes" : "No"]</A>",
"<A href='?src=[UID()];operation=patrol'>[auto_patrol ? "On" : "Off"]</A>" )
return dat
@@ -547,7 +548,7 @@ Auto Patrol[]"},
C.Weaken(5)
C.stuttering = 5
C.Stun(5)
add_logs(src,C,"stunned")
add_logs(src, C, "stunned")
if(declare_arrests)
var/area/location = get_area(src)
speak("[arrest_type ? "Detaining" : "Arresting"] level [threat] scumbag <b>[C]</b> in [location].", radio_channel)
@@ -65,25 +65,25 @@
dat += hack(user)
dat += showpai(user)
dat += "<TT><B>Floor Repairer Controls v1.1</B></TT><BR><BR>"
dat += "Status: <A href='?src=\ref[src];power=1'>[on ? "On" : "Off"]</A><BR>"
dat += "Status: <A href='?src=[UID()];power=1'>[on ? "On" : "Off"]</A><BR>"
dat += "Maintenance panel panel is [open ? "opened" : "closed"]<BR>"
dat += "Tiles left: [amount]<BR>"
dat += "Behvaiour controls are [locked ? "locked" : "unlocked"]<BR>"
if(!locked || issilicon(user) || check_rights(R_ADMIN, 0, user))
dat += "Add tiles to new hull plating: <A href='?src=\ref[src];operation=autotile'>[autotile ? "Yes" : "No"]</A><BR>"
dat += "Replace floor tiles: <A href='?src=\ref[src];operation=replace'>[replacetiles ? "Yes" : "No"]</A><BR>"
dat += "Finds tiles: <A href='?src=\ref[src];operation=tiles'>[eattiles ? "Yes" : "No"]</A><BR>"
dat += "Make pieces of metal into tiles when empty: <A href='?src=\ref[src];operation=make'>[maketiles ? "Yes" : "No"]</A><BR>"
dat += "Transmit notice when empty: <A href='?src=\ref[src];operation=emptynag'>[nag_on_empty ? "Yes" : "No"]</A><BR>"
dat += "Repair damaged tiles and platings: <A href='?src=\ref[src];operation=fix'>[fixfloors ? "Yes" : "No"]</A><BR>"
dat += "Traction Magnets: <A href='?src=\ref[src];operation=anchor'>[anchored ? "Engaged" : "Disengaged"]</A><BR>"
dat += "Patrol Station: <A href='?src=\ref[src];operation=patrol'>[auto_patrol ? "Yes" : "No"]</A><BR>"
dat += "Add tiles to new hull plating: <A href='?src=[UID()];operation=autotile'>[autotile ? "Yes" : "No"]</A><BR>"
dat += "Replace floor tiles: <A href='?src=[UID()];operation=replace'>[replacetiles ? "Yes" : "No"]</A><BR>"
dat += "Finds tiles: <A href='?src=[UID()];operation=tiles'>[eattiles ? "Yes" : "No"]</A><BR>"
dat += "Make pieces of metal into tiles when empty: <A href='?src=[UID()];operation=make'>[maketiles ? "Yes" : "No"]</A><BR>"
dat += "Transmit notice when empty: <A href='?src=[UID()];operation=emptynag'>[nag_on_empty ? "Yes" : "No"]</A><BR>"
dat += "Repair damaged tiles and platings: <A href='?src=[UID()];operation=fix'>[fixfloors ? "Yes" : "No"]</A><BR>"
dat += "Traction Magnets: <A href='?src=[UID()];operation=anchor'>[anchored ? "Engaged" : "Disengaged"]</A><BR>"
dat += "Patrol Station: <A href='?src=[UID()];operation=patrol'>[auto_patrol ? "Yes" : "No"]</A><BR>"
var/bmode
if(targetdirection)
bmode = dir2text(targetdirection)
else
bmode = "disabled"
dat += "Bridge Mode : <A href='?src=\ref[src];operation=bridgemode'>[bmode]</A><BR>"
dat += "Bridge Mode : <A href='?src=[UID()];operation=bridgemode'>[bmode]</A><BR>"
return dat
@@ -140,37 +140,37 @@
dat += hack(user)
dat += showpai(user)
dat += "<TT><B>Medical Unit Controls v1.1</B></TT><BR><BR>"
dat += "Status: <A href='?src=\ref[src];power=1'>[on ? "On" : "Off"]</A><BR>"
dat += "Status: <A href='?src=[UID()];power=1'>[on ? "On" : "Off"]</A><BR>"
dat += "Maintenance panel panel is [open ? "opened" : "closed"]<BR>"
dat += "Beaker: "
if(reagent_glass)
dat += "<A href='?src=\ref[src];eject=1'>Loaded \[[reagent_glass.reagents.total_volume]/[reagent_glass.reagents.maximum_volume]\]</a>"
dat += "<A href='?src=[UID()];eject=1'>Loaded \[[reagent_glass.reagents.total_volume]/[reagent_glass.reagents.maximum_volume]\]</a>"
else
dat += "None Loaded"
dat += "<br>Behaviour controls are [locked ? "locked" : "unlocked"]<hr>"
if(!locked || issilicon(user) || check_rights(R_ADMIN, 0, user))
dat += "<TT>Healing Threshold: "
dat += "<a href='?src=\ref[src];adj_threshold=-10'>--</a> "
dat += "<a href='?src=\ref[src];adj_threshold=-5'>-</a> "
dat += "<a href='?src=[UID()];adj_threshold=-10'>--</a> "
dat += "<a href='?src=[UID()];adj_threshold=-5'>-</a> "
dat += "[heal_threshold] "
dat += "<a href='?src=\ref[src];adj_threshold=5'>+</a> "
dat += "<a href='?src=\ref[src];adj_threshold=10'>++</a>"
dat += "<a href='?src=[UID()];adj_threshold=5'>+</a> "
dat += "<a href='?src=[UID()];adj_threshold=10'>++</a>"
dat += "</TT><br>"
dat += "<TT>Injection Level: "
dat += "<a href='?src=\ref[src];adj_inject=-5'>-</a> "
dat += "<a href='?src=[UID()];adj_inject=-5'>-</a> "
dat += "[injection_amount] "
dat += "<a href='?src=\ref[src];adj_inject=5'>+</a> "
dat += "<a href='?src=[UID()];adj_inject=5'>+</a> "
dat += "</TT><br>"
dat += "Reagent Source: "
dat += "<a href='?src=\ref[src];use_beaker=1'>[use_beaker ? "Loaded Beaker (When available)" : "Internal Synthesizer"]</a><br>"
dat += "<a href='?src=[UID()];use_beaker=1'>[use_beaker ? "Loaded Beaker (When available)" : "Internal Synthesizer"]</a><br>"
dat += "Treat Viral Infections: <a href='?src=\ref[src];virus=1'>[treat_virus ? "Yes" : "No"]</a><br>"
dat += "The speaker switch is [shut_up ? "off" : "on"]. <a href='?src=\ref[src];togglevoice=[1]'>Toggle</a><br>"
dat += "Critical Patient Alerts: <a href='?src=\ref[src];critalerts=1'>[declare_crit ? "Yes" : "No"]</a><br>"
dat += "Patrol Station: <a href='?src=\ref[src];operation=patrol'>[auto_patrol ? "Yes" : "No"]</a><br>"
dat += "Stationary Mode: <a href='?src=\ref[src];stationary=1'>[stationary_mode ? "Yes" : "No"]</a><br>"
dat += "Treat Viral Infections: <a href='?src=[UID()];virus=1'>[treat_virus ? "Yes" : "No"]</a><br>"
dat += "The speaker switch is [shut_up ? "off" : "on"]. <a href='?src=[UID()];togglevoice=[1]'>Toggle</a><br>"
dat += "Critical Patient Alerts: <a href='?src=[UID()];critalerts=1'>[declare_crit ? "Yes" : "No"]</a><br>"
dat += "Patrol Station: <a href='?src=[UID()];operation=patrol'>[auto_patrol ? "Yes" : "No"]</a><br>"
dat += "Stationary Mode: <a href='?src=[UID()];stationary=1'>[stationary_mode ? "Yes" : "No"]</a><br>"
return dat
@@ -20,7 +20,7 @@
damage_coeff = list(BRUTE = 0.5, BURN = 0.7, TOX = 0, CLONE = 0, STAMINA = 0, OXY = 0)
a_intent = "harm" //No swapping
buckle_lying = 0
mob_size = MOB_SIZE_LARGE
radio_channel = "Supply"
bot_type = MULE_BOT
@@ -285,31 +285,31 @@
dat += "<b>Power level:</b> [cell ? cell.percent() : 0]%"
if(locked && !ai && !check_rights(R_ADMIN, 0, user))
dat += "&nbsp;<br /><div class='notice'>Controls are locked</div><A href='?src=\ref[src];op=unlock'>Unlock Controls</A>"
dat += "&nbsp;<br /><div class='notice'>Controls are locked</div><A href='?src=[UID()];op=unlock'>Unlock Controls</A>"
else
dat += "&nbsp;<br /><div class='notice'>Controls are unlocked</div><A href='?src=\ref[src];op=lock'>Lock Controls</A><BR><BR>"
dat += "&nbsp;<br /><div class='notice'>Controls are unlocked</div><A href='?src=[UID()];op=lock'>Lock Controls</A><BR><BR>"
dat += "<A href='?src=\ref[src];op=power'>Toggle Power</A><BR>"
dat += "<A href='?src=\ref[src];op=stop'>Stop</A><BR>"
dat += "<A href='?src=\ref[src];op=go'>Proceed</A><BR>"
dat += "<A href='?src=\ref[src];op=home'>Return to Home</A><BR>"
dat += "<A href='?src=\ref[src];op=destination'>Set Destination</A><BR>"
dat += "<A href='?src=\ref[src];op=setid'>Set Bot ID</A><BR>"
dat += "<A href='?src=\ref[src];op=sethome'>Set Home</A><BR>"
dat += "<A href='?src=\ref[src];op=autoret'>Toggle Auto Return Home</A> ([auto_return ? "On":"Off"])<BR>"
dat += "<A href='?src=\ref[src];op=autopick'>Toggle Auto Pickup Crate</A> ([auto_pickup ? "On":"Off"])<BR>"
dat += "<A href='?src=\ref[src];op=report'>Toggle Delivery Reporting</A> ([report_delivery ? "On" : "Off"])<BR>"
dat += "<A href='?src=[UID()];op=power'>Toggle Power</A><BR>"
dat += "<A href='?src=[UID()];op=stop'>Stop</A><BR>"
dat += "<A href='?src=[UID()];op=go'>Proceed</A><BR>"
dat += "<A href='?src=[UID()];op=home'>Return to Home</A><BR>"
dat += "<A href='?src=[UID()];op=destination'>Set Destination</A><BR>"
dat += "<A href='?src=[UID()];op=setid'>Set Bot ID</A><BR>"
dat += "<A href='?src=[UID()];op=sethome'>Set Home</A><BR>"
dat += "<A href='?src=[UID()];op=autoret'>Toggle Auto Return Home</A> ([auto_return ? "On":"Off"])<BR>"
dat += "<A href='?src=[UID()];op=autopick'>Toggle Auto Pickup Crate</A> ([auto_pickup ? "On":"Off"])<BR>"
dat += "<A href='?src=[UID()];op=report'>Toggle Delivery Reporting</A> ([report_delivery ? "On" : "Off"])<BR>"
if(load)
dat += "<A href='?src=\ref[src];op=unload'>Unload Now</A><BR>"
dat += "<A href='?src=[UID()];op=unload'>Unload Now</A><BR>"
dat += "<div class='notice'>The maintenance hatch is closed.</div>"
else
if(!ai)
dat += "<div class='notice'>The maintenance hatch is open.</div><BR>"
dat += "<b>Power cell:</b> "
if(cell)
dat += "<A href='?src=\ref[src];op=cellremove'>Installed</A><BR>"
dat += "<A href='?src=[UID()];op=cellremove'>Installed</A><BR>"
else
dat += "<A href='?src=\ref[src];op=cellinsert'>Removed</A><BR>"
dat += "<A href='?src=[UID()];op=cellinsert'>Removed</A><BR>"
dat += wires.GetInteractWindow()
else
@@ -117,7 +117,7 @@ Status: []<BR>
Behaviour controls are [locked ? "locked" : "unlocked"]<BR>
Maintenance panel panel is [open ? "opened" : "closed"]"},
"<A href='?src=\ref[src];power=1'>[on ? "On" : "Off"]</A>" )
"<A href='?src=[UID()];power=1'>[on ? "On" : "Off"]</A>" )
if(!locked || issilicon(user) || check_rights(R_ADMIN, 0, user))
dat += text({"<BR>
@@ -128,12 +128,12 @@ Operating Mode: []<BR>
Report Arrests[]<BR>
Auto Patrol: []"},
"<A href='?src=\ref[src];operation=idcheck'>[idcheck ? "Yes" : "No"]</A>",
"<A href='?src=\ref[src];operation=weaponscheck'>[weaponscheck ? "Yes" : "No"]</A>",
"<A href='?src=\ref[src];operation=ignorerec'>[check_records ? "Yes" : "No"]</A>",
"<A href='?src=\ref[src];operation=switchmode'>[arrest_type ? "Detain" : "Arrest"]</A>",
"<A href='?src=\ref[src];operation=declarearrests'>[declare_arrests ? "Yes" : "No"]</A>",
"<A href='?src=\ref[src];operation=patrol'>[auto_patrol ? "On" : "Off"]</A>" )
"<A href='?src=[UID()];operation=idcheck'>[idcheck ? "Yes" : "No"]</A>",
"<A href='?src=[UID()];operation=weaponscheck'>[weaponscheck ? "Yes" : "No"]</A>",
"<A href='?src=[UID()];operation=ignorerec'>[check_records ? "Yes" : "No"]</A>",
"<A href='?src=[UID()];operation=switchmode'>[arrest_type ? "Detain" : "Arrest"]</A>",
"<A href='?src=[UID()];operation=declarearrests'>[declare_arrests ? "Yes" : "No"]</A>",
"<A href='?src=[UID()];operation=patrol'>[auto_patrol ? "On" : "Off"]</A>" )
return dat
@@ -251,7 +251,7 @@ Auto Patrol: []"},
C.Weaken(5)
C.stuttering = 5
C.Stun(5)
add_logs(src,C,"stunned")
add_logs(src, C, "stunned")
if(declare_arrests)
var/area/location = get_area(src)
speak("[arrest_type ? "Detaining" : "Arresting"] level [threat] scumbag <b>[C]</b> in [location].", radio_channel)
@@ -91,6 +91,7 @@
environment_smash = 2
attack_sound = 'sound/weapons/punch3.ogg'
status_flags = 0
mob_size = MOB_SIZE_LARGE
construct_spells = list(/obj/effect/proc_holder/spell/aoe_turf/conjure/lesserforcewall)
force_threshold = 11
@@ -17,6 +17,7 @@
density = 0
pass_flags = PASSTABLE | PASSGRILLE | PASSMOB
ventcrawler = 2
mob_size = MOB_SIZE_TINY
butcher_results = list(/obj/item/weapon/reagent_containers/food/snacks/meat = 0)
gold_core_spawnable = CHEM_MOB_SPAWN_FRIENDLY
@@ -14,6 +14,7 @@
speak_chance = 1
turns_per_move = 5
see_in_dark = 6
mob_size = MOB_SIZE_SMALL
simplespecies = /mob/living/simple_animal/pet/cat
childtype = /mob/living/simple_animal/pet/cat/kitten
butcher_results = list(/obj/item/weapon/reagent_containers/food/snacks/meat = 3)
@@ -6,7 +6,7 @@
icon_state = "corgi"
icon_living = "corgi"
icon_dead = "corgi_dead"
gender = MALE
gender = NEUTER
health = 30
maxHealth = 30
speak = list("YAP", "Woof!", "Bark!", "AUUUUUU")
@@ -33,6 +33,8 @@
..()
default_atmos_requirements = src.atmos_requirements
regenerate_icons()
if(gender == NEUTER)
gender = pick(MALE, FEMALE)
/mob/living/simple_animal/pet/corgi/Life()
. = ..()
@@ -52,14 +54,14 @@
var/dat = {"<table>"}
dat += "<tr><td><B>Head:</B></td><td><A href='?src=\ref[src];[inventory_head?"remove_inv":"add_inv"]=head'>[(inventory_head && !(inventory_head.flags&ABSTRACT)) ? inventory_head : "<font color=grey>Empty</font>"]</A></td></tr>"
dat += "<tr><td><B>Back:</B></td><td><A href='?src=\ref[src];[inventory_back?"remove_inv":"add_inv"]=back'>[(inventory_back && !(inventory_back.flags&ABSTRACT)) ? inventory_back : "<font color=grey>Empty</font>"]</A></td></tr>"
dat += "<tr><td><B>Head:</B></td><td><A href='?src=[UID()];[inventory_head?"remove_inv":"add_inv"]=head'>[(inventory_head && !(inventory_head.flags&ABSTRACT)) ? inventory_head : "<font color=grey>Empty</font>"]</A></td></tr>"
dat += "<tr><td><B>Back:</B></td><td><A href='?src=[UID()];[inventory_back?"remove_inv":"add_inv"]=back'>[(inventory_back && !(inventory_back.flags&ABSTRACT)) ? inventory_back : "<font color=grey>Empty</font>"]</A></td></tr>"
if(can_collar)
dat += "<tr><td>&nbsp;</td></tr>"
dat += "<tr><td><B>Collar:</B></td><td><A href='?src=\ref[src];[collar?"remove_inv":"add_inv"]=collar'>[(collar && !(collar.flags&ABSTRACT)) ? collar : "<font color=grey>Empty</font>"]</A></td></tr>"
dat += "<tr><td><B>Collar:</B></td><td><A href='?src=[UID()];[collar?"remove_inv":"add_inv"]=collar'>[(collar && !(collar.flags&ABSTRACT)) ? collar : "<font color=grey>Empty</font>"]</A></td></tr>"
dat += {"</table>
<A href='?src=\ref[user];mach_close=mob\ref[src]'>Close</A>
<A href='?src=[user.UID()];mach_close=mob\ref[src]'>Close</A>
"}
var/datum/browser/popup = new(user, "mob\ref[src]", "[src]", 440, 500)
@@ -478,7 +480,7 @@
var/mob/tmob = AM
if(istype(tmob, /mob/living/carbon/human) && (FAT in tmob.mutations))
if(prob(70))
to_chat(src, "\red <B>You fail to push [tmob]'s fat ass out of the way.</B>")
to_chat(src, "<span class='danger'>You fail to push [tmob]'s fat ass out of the way.</span>")
now_pushing = 0
return
if(!(tmob.status_flags & CANPUSH))
@@ -540,6 +542,7 @@
shaved = 0
density = 0
pass_flags = PASSMOB
mob_size = MOB_SIZE_SMALL
//puppies cannot wear anything.
/mob/living/simple_animal/pet/corgi/puppy/Topic(href, href_list)
@@ -5,7 +5,6 @@
icon_state = "crab"
icon_living = "crab"
icon_dead = "crab_dead"
small = 1
speak_emote = list("clicks")
emote_hear = list("clicks")
emote_see = list("clacks")
@@ -11,7 +11,7 @@
icon_dead = "nymph_dead"
icon_resting = "nymph_sleep"
pass_flags = PASSTABLE | PASSMOB
small = 1
mob_size = MOB_SIZE_SMALL
ventcrawler = 2
maxHealth = 50
@@ -179,7 +179,7 @@
ventcrawler = 2
var/amount_grown = 0
pass_flags = PASSTABLE | PASSGRILLE | PASSMOB
small = 1
mob_size = MOB_SIZE_TINY
can_hide = 1
can_collar = 1
gold_core_spawnable = CHEM_MOB_SPAWN_FRIENDLY
@@ -225,7 +225,7 @@ var/global/chicken_count = 0
var/eggsleft = 0
var/chicken_color
pass_flags = PASSTABLE | PASSMOB
small = 1
mob_size = MOB_SIZE_SMALL
can_hide = 1
can_collar = 1
gold_core_spawnable = CHEM_MOB_SPAWN_FRIENDLY
@@ -5,7 +5,6 @@
icon_state = "lizard"
icon_living = "lizard"
icon_dead = "lizard-dead"
small = 1
speak_emote = list("hisses")
health = 5
maxHealth = 5
@@ -19,6 +18,7 @@
ventcrawler = 2
density = 0
pass_flags = PASSTABLE | PASSMOB
mob_size = MOB_SIZE_SMALL
can_hide = 1
butcher_results = list(/obj/item/weapon/reagent_containers/food/snacks/meat = 1)
can_collar = 1
@@ -9,7 +9,6 @@
speak_emote = list("squeeks","squeeks","squiks")
emote_hear = list("squeeks","squeaks","squiks")
emote_see = list("runs in a circle", "shakes", "scritches at something")
small = 1
speak_chance = 1
turns_per_move = 5
see_in_dark = 6
@@ -22,6 +21,7 @@
density = 0
ventcrawler = 2
pass_flags = PASSTABLE | PASSGRILLE | PASSMOB
mob_size = MOB_SIZE_TINY
var/mouse_color //brown, gray and white, leave blank for random
layer = MOB_LAYER
atmos_requirements = list("min_oxy" = 16, "max_oxy" = 0, "min_tox" = 0, "max_tox" = 1, "min_co2" = 0, "max_co2" = 5, "min_n2" = 0, "max_n2" = 0)
@@ -1,6 +1,7 @@
/mob/living/simple_animal/pet
icon = 'icons/mob/pets.dmi'
can_collar = 1
mob_size = MOB_SIZE_SMALL
/mob/living/simple_animal/pet/attackby(var/obj/item/O as obj, var/mob/user as mob, params)
if(istype(O, /obj/item/weapon/newspaper))
@@ -25,7 +25,7 @@
var/mob/tmob = AM
if(istype(tmob, /mob/living/carbon/human) && (FAT in tmob.mutations))
if(prob(70))
to_chat(src, "\red <B>You fail to push [tmob]'s fat ass out of the way.</B>")
to_chat(src, "<span class='danger'>You fail to push [tmob]'s fat ass out of the way.</span>")
now_pushing = 0
return
if(!(tmob.status_flags & CANPUSH))
@@ -36,7 +36,7 @@
var/syndie = 0 //IS WE SYNDICAT? (currently unused)
speed = -1 //Spiderbots gotta go fast.
//pass_flags = PASSTABLE //Maybe griefy?
small = 1
mob_size = MOB_SIZE_SMALL
speak_emote = list("beeps","clicks","chirps")
can_hide = 1
ventcrawler = 2
@@ -129,6 +129,7 @@
move_to_delay = 4
maxHealth = 400
health = 400
mob_size = MOB_SIZE_LARGE
gold_core_spawnable = CHEM_MOB_SPAWN_INVALID
/obj/item/projectile/neurotox
@@ -15,7 +15,7 @@
speed = 4
maxHealth = 20
health = 20
mob_size = MOB_SIZE_TINY
harm_intent_damage = 8
melee_damage_lower = 10
melee_damage_upper = 10
@@ -34,7 +34,7 @@
flying = 1
search_objects = 1 //have to find those plant trays!
density = 0
small = 1
mob_size = MOB_SIZE_TINY
//Spaceborn beings don't get hurt by space
atmos_requirements = list("min_oxy" = 0, "max_oxy" = 0, "min_tox" = 0, "max_tox" = 0, "min_co2" = 0, "max_co2" = 0, "min_n2" = 0, "max_n2" = 0)
@@ -69,6 +69,7 @@
maxHealth = 65
health = 65
pixel_x = -16
mob_size = MOB_SIZE_LARGE
melee_damage_lower = 20
melee_damage_upper = 20
@@ -78,7 +78,7 @@
var/datum/effect/system/harmless_smoke_spread/smoke = new /datum/effect/system/harmless_smoke_spread()
smoke.set_up(5, 0, src.loc)
smoke.start()
visible_message("\red <B>The [src] warps in!</B>")
visible_message("<span class='danger'>The [src] warps in!</span>")
playsound(src.loc, 'sound/effects/EMPulse.ogg', 25, 1)
/mob/living/simple_animal/hostile/hivebot/tele/warpbots()
@@ -53,6 +53,7 @@
return
var/mob/living/simple_animal/hostile/illusion/M = new(loc)
M.faction = faction.Copy()
M.attack_sound = attack_sound
M.Copy_Parent(parent_mob, 80, health/2, melee_damage_upper, multiply_chance/2)
M.GiveTarget(L)
@@ -127,11 +127,12 @@ var/global/list/protected_objects = list(/obj/structure/table, /obj/structure/ca
/mob/living/simple_animal/hostile/mimic/copy/Life()
..()
if(!target && !ckey) //Objects eventually revert to normal if no one is around to terrorize
adjustBruteLoss(1)
for(var/mob/living/M in contents) //a fix for animated statues from the flesh to stone spell
death()
/mob/living/simple_animal/hostile/mimic/copy/death(gibbed)
for(var/atom/movable/M in src)
M.loc = get_turf(src)
..()
@@ -186,7 +187,6 @@ var/global/list/protected_objects = list(/obj/structure/table, /obj/structure/ca
if(destroy_original)
qdel(O)
return 1
return
/mob/living/simple_animal/hostile/mimic/copy/DestroySurroundings()
if(destroy_objects)
@@ -3,6 +3,7 @@
atmos_requirements = list("min_oxy" = 0, "max_oxy" = 0, "min_tox" = 0, "max_tox" = 0, "min_co2" = 0, "max_co2" = 0, "min_n2" = 0, "max_n2" = 0)
unsuitable_atmos_damage = 15
faction = list("mining")
weather_immunities = list("lava","ash")
environment_smash = 2
minbodytemp = 0
heat_damage_per_tick = 20
@@ -15,6 +16,7 @@
var/icon_aggro = null // for swapping to when we get aggressive
see_in_dark = 8
see_invisible = SEE_INVISIBLE_MINIMUM
mob_size = MOB_SIZE_LARGE
/mob/living/simple_animal/hostile/asteroid/Aggro()
..()
@@ -61,7 +61,7 @@
if((Proj.damage_type == BRUTE || Proj.damage_type == BURN))
adjustHealth(Proj.damage)
else
visible_message("\red <B>[src] blocks [Proj] with its shield!</B>")
visible_message("<span class='danger'>[src] blocks [Proj] with its shield!</span>")
return 0
@@ -118,6 +118,7 @@
faction = list("syndicate")
atmos_requirements = list("min_oxy" = 0, "max_oxy" = 0, "min_tox" = 0, "max_tox" = 0, "min_co2" = 0, "max_co2" = 0, "min_n2" = 0, "max_n2" = 0)
minbodytemp = 0
mob_size = MOB_SIZE_TINY
flying = 1
gold_core_spawnable = CHEM_MOB_SPAWN_HOSTILE
del_on_death = 1
@@ -14,6 +14,7 @@
speed = 1
maxHealth = 250
health = 250
mob_size = MOB_SIZE_LARGE
pixel_x = -16
@@ -33,7 +33,6 @@
icon_living = "parrot_fly"
icon_dead = "parrot_dead"
pass_flags = PASSTABLE
small = 1
can_collar = 1
var/list/clean_speak = list(
@@ -54,6 +53,7 @@
response_harm = "swats the"
stop_automated_movement = 1
universal_speak = 1
mob_size = MOB_SIZE_SMALL
var/parrot_state = PARROT_WANDER //Hunt for a perch when created
var/parrot_sleep_max = 25 //The time the parrot sits while perched before looking around. Mosly a way to avoid the parrot's AI in process_ai() being run every single tick.
@@ -131,13 +131,13 @@
var/dat = {"<table>"}
dat += "<tr><td><B>Headset:</B></td><td><A href='?src=\ref[src];[ears?"remove_inv":"add_inv"]=ears'>[(ears && !(ears.flags&ABSTRACT)) ? ears : "<font color=grey>Empty</font>"]</A></td></tr>"
dat += "<tr><td><B>Headset:</B></td><td><A href='?src=[UID()];[ears?"remove_inv":"add_inv"]=ears'>[(ears && !(ears.flags&ABSTRACT)) ? ears : "<font color=grey>Empty</font>"]</A></td></tr>"
if(can_collar)
dat += "<tr><td>&nbsp;</td></tr>"
dat += "<tr><td><B>Collar:</B></td><td><A href='?src=\ref[src];[collar?"remove_inv":"add_inv"]=collar'>[(collar && !(collar.flags&ABSTRACT)) ? collar : "<font color=grey>Empty</font>"]</A></td></tr>"
dat += "<tr><td><B>Collar:</B></td><td><A href='?src=[UID()];[collar?"remove_inv":"add_inv"]=collar'>[(collar && !(collar.flags&ABSTRACT)) ? collar : "<font color=grey>Empty</font>"]</A></td></tr>"
dat += {"</table>
<A href='?src=\ref[user];mach_close=mob\ref[src]'>Close</A>
<A href='?src=[user.UID()];mach_close=mob\ref[src]'>Close</A>
"}
var/datum/browser/popup = new(user, "mob\ref[src]", "[src]", 440, 500)
@@ -79,14 +79,14 @@
if(!istype(loc, /obj/item)) // Some silly motherfucker spawned us directly via the game panel.
message_admins("<span class='adminnotice'>Posessed object improperly spawned, deleting.</span>") // So silly admins with debug off will see the message too and not spam these things.
log_debug("[src] spawned manually, no object to assign attributes to.")
qdel()
log_runtime(EXCEPTION("[src] spawned manually, no object to assign attributes to."), src)
qdel(src)
var/turf/possessed_loc = get_turf(loc)
if(!istype(possessed_loc)) // Will this ever happen? Who goddamn knows.
message_admins("<span class='adminnotice'>Posessed object could not find turf, deleting.</span>") // So silly admins with debug off will see the message too and not spam these things.
log_debug("[src] attempted to find a turf to spawn on, and could not.")
qdel()
log_runtime(EXCEPTION("[src] attempted to find a turf to spawn on, and could not."), src)
qdel(src)
possessed_item = loc
forceMove(possessed_loc)
@@ -151,4 +151,4 @@
dir = possessed_item.dir
color = possessed_item.color
overlays = possessed_item.overlays
opacity = possessed_item.opacity
opacity = possessed_item.opacity
@@ -47,3 +47,7 @@
if((M.client && !( M.blinded )))
M.show_message("\red [user] gently taps [src] with the [O]. ")
return
/mob/living/simple_animal/shade/sword
universal_speak = 1
faction = list("neutral")
@@ -122,20 +122,21 @@
if(1 to 5) healths.icon_state = "health6"
if(0) healths.icon_state = "health7"
/mob/living/simple_animal/Life()
. = ..()
handle_state_icons()
/mob/living/simple_animal/proc/process_ai()
handle_automated_movement()
handle_automated_action()
handle_automated_speech()
/mob/living/simple_animal/proc/handle_state_icons()
if(resting && icon_resting && stat != DEAD)
icon_state = icon_resting
else if(stat != DEAD)
icon_state = icon_living
/mob/living/simple_animal/lay_down()
..()
handle_resting_state_icons()
/mob/living/simple_animal/proc/handle_resting_state_icons()
if(icon_resting)
if(resting && stat != DEAD)
icon_state = icon_resting
else if(stat != DEAD)
icon_state = icon_living
/mob/living/simple_animal/handle_regular_status_updates()
if(..()) //alive
@@ -407,26 +408,7 @@
return
/mob/living/simple_animal/attackby(var/obj/item/O as obj, var/mob/living/user as mob) //Marker -Agouri
if(istype(O, /obj/item/stack/medical) && healable)
if(stat != DEAD)
var/obj/item/stack/medical/MED = O
if(health < maxHealth)
if(MED.amount >= 1)
if(MED.heal_brute >= 1)
heal_organ_damage((MED.heal_brute * 1.66), (MED.heal_burn * 1.66))
MED.use(1)
visible_message("<span class='notice'>[user] applies [MED] on [src]</span>")
return
else
to_chat(user, "<span class='notice'>[MED] won't help at all.</span>")
return
else
to_chat(user, "<span class='notice'>[src] is at full health.</span>")
return
else
to_chat(user, "<span class='notice'>[src] is dead, medical items won't bring it back to life.</span>")
return
else if(can_collar && !collar && istype(O, /obj/item/clothing/accessory/petcollar))
if(can_collar && !collar && istype(O, /obj/item/clothing/accessory/petcollar))
var/obj/item/clothing/accessory/petcollar/C = O
user.drop_item()
C.forceMove(src)
@@ -560,16 +542,24 @@
return 0
return 1
/mob/living/simple_animal/handle_fire()
return
/mob/living/simple_animal/update_fire()
return
/mob/living/simple_animal/IgniteMob()
return 0
/mob/living/simple_animal/ExtinguishMob()
return
/mob/living/simple_animal/proc/attack_threshold_check(damage, damagetype = BRUTE)
if(damage <= force_threshold || !damage_coeff[damagetype])
visible_message("<span class='warning'>[src] looks unharmed from the damage.</span>")
else
apply_damage(damage, damagetype)
/mob/living/simple_animal/update_fire()
return
/mob/living/simple_animal/update_transform()
var/matrix/ntransform = matrix(transform) //aka transform.Copy()
var/changed = 0
@@ -592,13 +582,13 @@
/mob/living/simple_animal/show_inv(mob/user as mob)
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><B>Left Hand:</B></td><td><A href='?src=[UID()];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=[UID()];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>"}
if(can_collar)
dat += "<tr><td><B>Collar:</B></td><td><A href='?src=\ref[src];[collar?"remove_inv":"add_inv"]=collar'>[(collar && !(collar.flags&ABSTRACT)) ? collar : "<font color=grey>Empty</font>"]</A></td></tr>"
dat += "<tr><td><B>Collar:</B></td><td><A href='?src=[UID()];[collar?"remove_inv":"add_inv"]=collar'>[(collar && !(collar.flags&ABSTRACT)) ? collar : "<font color=grey>Empty</font>"]</A></td></tr>"
dat += {"</table>
<A href='?src=\ref[user];mach_close=mob\ref[src]'>Close</A>
<A href='?src=[user.UID()];mach_close=mob\ref[src]'>Close</A>
"}
var/datum/browser/popup = new(user, "mob\ref[src]", "[src]", 440, 250)
+10 -9
View File
@@ -18,10 +18,10 @@
spawn() alert("You have logged in already with another key this round, please log out of this one NOW or risk being banned!")
if(matches)
if(M.client)
message_admins("<font color='red'><B>Notice: </B><font color='blue'><A href='?src=\ref[usr];priv_msg=\ref[src]'>[key_name_admin(src)]</A> has the same [matches] as <A href='?src=\ref[usr];priv_msg=\ref[M]'>[key_name_admin(M)]</A>.</font>", 1)
message_admins("<font color='red'><B>Notice: </B><font color='blue'><A href='?src=[usr.UID()];priv_msg=\ref[src]'>[key_name_admin(src)]</A> has the same [matches] as <A href='?src=[usr.UID()];priv_msg=\ref[M]'>[key_name_admin(M)]</A>.</font>", 1)
log_access("Notice: [key_name(src)] has the same [matches] as [key_name(M)].")
else
message_admins("<font color='red'><B>Notice: </B><font color='blue'><A href='?src=\ref[usr];priv_msg=\ref[src]'>[key_name_admin(src)]</A> has the same [matches] as [key_name_admin(M)] (no longer logged in). </font>", 1)
message_admins("<font color='red'><B>Notice: </B><font color='blue'><A href='?src=[usr.UID()];priv_msg=\ref[src]'>[key_name_admin(src)]</A> has the same [matches] as [key_name_admin(M)] (no longer logged in). </font>", 1)
log_access("Notice: [key_name(src)] has the same [matches] as [key_name(M)] (no longer logged in).")
/mob/Login()
@@ -82,11 +82,12 @@
// Calling update_interface() in /mob/Login() causes the Cyborg to immediately be ghosted; because of winget().
// Calling it in the overriden Login, such as /mob/living/Login() doesn't cause this.
/mob/proc/update_interface()
if(client)
if(winget(src, "mainwindow.hotkey_toggle", "is-checked") == "true")
update_hotkey_mode()
else
update_normal_mode()
spawn() // Spawn off so winget/winset don't delay callers.
if(client)
if(winget(src, "mainwindow.hotkey_toggle", "is-checked") == "true")
update_hotkey_mode()
else
update_normal_mode()
/mob/proc/update_hotkey_mode()
var/hotkeyname = "hotkeymode"
@@ -94,7 +95,7 @@
var/hotkeys = client.hotkeylist[client.hotkeytype]
hotkeyname = hotkeys[client.hotkeyon ? "on" : "off"]
client.hotkeyon = 1
winset(src, null, "mainwindow.macro=[hotkeyname] hotkey_toggle.is-checked=true mapwindow.map.focus=true input.background-color=#F0F0F0")
winset(src, null, "mainwindow.macro=[hotkeyname] hotkey_toggle.is-checked=true mapwindow.map.focus=true input.background-color=#F0F0F0")
/mob/proc/update_normal_mode()
var/hotkeyname = "macro"
@@ -102,4 +103,4 @@
var/hotkeys = client.hotkeylist[client.hotkeytype]//get the list containing the hotkey names
hotkeyname = hotkeys[client.hotkeyon ? "on" : "off"]//get the name of the hotkey, to not clutter winset() to much
client.hotkeyon = 0
winset(src, null, "mainwindow.macro=[hotkeyname] hotkey_toggle.is-checked=false input.focus=true input.background-color=#D3B5B5")
winset(src, null, "mainwindow.macro=[hotkeyname] hotkey_toggle.is-checked=false input.focus=true input.background-color=#D3B5B5")

Some files were not shown because too many files have changed in this diff Show More