mirror of
https://github.com/ParadiseSS13/Paradise.git
synced 2026-08-30 23:48:28 +01:00
Merge branch 'master' of https://github.com/Baystation12/Baystation12
This commit is contained in:
+7
-2
@@ -65,6 +65,7 @@
|
||||
#define FILE_DIR "code/game/mecha/equipment"
|
||||
#define FILE_DIR "code/game/mecha/equipment/tools"
|
||||
#define FILE_DIR "code/game/mecha/equipment/weapons"
|
||||
#define FILE_DIR "code/game/mecha/medical"
|
||||
#define FILE_DIR "code/game/mecha/working"
|
||||
#define FILE_DIR "code/game/objects"
|
||||
#define FILE_DIR "code/game/objects/alien"
|
||||
@@ -272,6 +273,7 @@
|
||||
#include "code\datums\diseases\wizarditis.dm"
|
||||
#include "code\datums\diseases\xeno_transformation.dm"
|
||||
#include "code\datums\helper_datums\construction_datum.dm"
|
||||
#include "code\datums\helper_datums\events.dm"
|
||||
#include "code\datums\helper_datums\getrev.dm"
|
||||
#include "code\datums\helper_datums\global_iterator.dm"
|
||||
#include "code\datums\helper_datums\teleport.dm"
|
||||
@@ -398,7 +400,6 @@
|
||||
#include "code\game\events\EventProcs\black_hole.dm"
|
||||
#include "code\game\events\EventProcs\clang.dm"
|
||||
#include "code\game\events\EventProcs\dust.dm"
|
||||
#include "code\game\events\EventProcs\kudzu.dm"
|
||||
#include "code\game\events\EventProcs\miniblob.dm"
|
||||
#include "code\game\events\EventProcs\misc.dm"
|
||||
#include "code\game\events\EventProcs\ninja_abilities.dm"
|
||||
@@ -537,7 +538,7 @@
|
||||
#include "code\game\machinery\computer\id.dm"
|
||||
#include "code\game\machinery\computer\lockdown.dm"
|
||||
#include "code\game\machinery\computer\medical.dm"
|
||||
#include "code\game\machinery\computer\Operating.dm"
|
||||
#include "code\game\machinery\computer\operating.dm"
|
||||
#include "code\game\machinery\computer\power.dm"
|
||||
#include "code\game\machinery\computer\robot.dm"
|
||||
#include "code\game\machinery\computer\security.dm"
|
||||
@@ -589,6 +590,8 @@
|
||||
#include "code\game\mecha\equipment\mecha_equipment.dm"
|
||||
#include "code\game\mecha\equipment\tools\tools.dm"
|
||||
#include "code\game\mecha\equipment\weapons\weapons.dm"
|
||||
#include "code\game\mecha\medical\medical.dm"
|
||||
#include "code\game\mecha\medical\odysseus.dm"
|
||||
#include "code\game\mecha\working\firefighter.dm"
|
||||
#include "code\game\mecha\working\ripley.dm"
|
||||
#include "code\game\mecha\working\working.dm"
|
||||
@@ -1074,8 +1077,10 @@
|
||||
#include "code\WorkInProgress\buildmode.dm"
|
||||
#include "code\WorkInProgress\explosion_particles.dm"
|
||||
#include "code\WorkInProgress\Cael_Aislinn\Tajara\examine.dm"
|
||||
#include "code\WorkInProgress\Cael_Aislinn\Tajara\say.dm"
|
||||
#include "code\WorkInProgress\Cael_Aislinn\Tajara\tajara_transformation.dm"
|
||||
#include "code\WorkInProgress\Cael_Aislinn\Tajara\tajaran.dm"
|
||||
#include "code\WorkInProgress\Cael_Aislinn\Tajara\whisper.dm"
|
||||
#include "code\WorkInProgress\Chinsky\ashtray.dm"
|
||||
#include "code\WorkInProgress\mapload\dmm_suite.dm"
|
||||
#include "code\WorkInProgress\mapload\reader.dm"
|
||||
|
||||
@@ -6,7 +6,7 @@ obj/machinery/atmospherics/pipe/simple/heat_exchanging
|
||||
var/initialize_directions_he
|
||||
|
||||
minimum_temperature_difference = 20
|
||||
thermal_conductivity = WINDOW_HEAT_TRANSFER_COEFFICIENT
|
||||
thermal_conductivity = OPEN_HEAT_TRANSFER_COEFFICIENT
|
||||
|
||||
// BubbleWrap
|
||||
New()
|
||||
|
||||
@@ -16,8 +16,8 @@
|
||||
t_him = "her"
|
||||
|
||||
if (src.w_uniform)
|
||||
if (src.w_uniform.blood_DNA.len)
|
||||
usr << "\red [src.name] is wearing a[src.w_uniform.blood_DNA.len ? " bloody " : " "] \icon[src.w_uniform] [src.w_uniform.name]!"
|
||||
if (src.w_uniform.blood_DNA)
|
||||
usr << "\red [src.name] is wearing a[src.w_uniform.blood_DNA ? " bloody " : " "] \icon[src.w_uniform] [src.w_uniform.name]!"
|
||||
else
|
||||
usr << "\blue [src.name] is wearing a \icon[src.w_uniform] [src.w_uniform.name]."
|
||||
|
||||
@@ -25,8 +25,8 @@
|
||||
usr << "\blue [src.name] is \icon[src.handcuffed] handcuffed!"
|
||||
|
||||
if (src.wear_suit)
|
||||
if (src.wear_suit.blood_DNA.len)
|
||||
usr << "\red [src.name] has a[src.wear_suit.blood_DNA.len ? " bloody " : " "] \icon[src.wear_suit] [src.wear_suit.name] on!"
|
||||
if (src.wear_suit.blood_DNA)
|
||||
usr << "\red [src.name] has a[src.wear_suit.blood_DNA ? " bloody " : " "] \icon[src.wear_suit] [src.wear_suit.name] on!"
|
||||
else
|
||||
usr << "\blue [src.name] has a \icon[src.wear_suit] [src.wear_suit.name] on."
|
||||
|
||||
@@ -37,43 +37,43 @@
|
||||
usr << "\blue [src.name] has a \icon[src.r_ear] [src.r_ear.name] on [t_his] right ear."
|
||||
|
||||
if (src.wear_mask)
|
||||
if (src.wear_mask.blood_DNA.len)
|
||||
usr << "\red [src.name] has a[src.wear_mask.blood_DNA.len ? " bloody " : " "] \icon[src.wear_mask] [src.wear_mask.name] on [t_his] face!"
|
||||
if (src.wear_mask.blood_DNA)
|
||||
usr << "\red [src.name] has a[src.wear_mask.blood_DNA ? " bloody " : " "] \icon[src.wear_mask] [src.wear_mask.name] on [t_his] face!"
|
||||
else
|
||||
usr << "\blue [src.name] has a \icon[src.wear_mask] [src.wear_mask.name] on [t_his] face."
|
||||
|
||||
if (src.l_hand)
|
||||
if (src.l_hand.blood_DNA.len)
|
||||
usr << "\red [src.name] has a[src.l_hand.blood_DNA.len ? " bloody " : " "] \icon[src.l_hand] [src.l_hand.name] in [t_his] left hand!"
|
||||
if (src.l_hand.blood_DNA)
|
||||
usr << "\red [src.name] has a[src.l_hand.blood_DNA ? " bloody " : " "] \icon[src.l_hand] [src.l_hand.name] in [t_his] left hand!"
|
||||
else
|
||||
usr << "\blue [src.name] has a \icon[src.l_hand] [src.l_hand.name] in [t_his] left hand."
|
||||
|
||||
if (src.r_hand)
|
||||
if (src.r_hand.blood_DNA.len)
|
||||
usr << "\red [src.name] has a[src.r_hand.blood_DNA.len ? " bloody " : " "] \icon[src.r_hand] [src.r_hand.name] in [t_his] right hand!"
|
||||
if (src.r_hand.blood_DNA)
|
||||
usr << "\red [src.name] has a[src.r_hand.blood_DNA ? " bloody " : " "] \icon[src.r_hand] [src.r_hand.name] in [t_his] right hand!"
|
||||
else
|
||||
usr << "\blue [src.name] has a \icon[src.r_hand] [src.r_hand.name] in [t_his] right hand."
|
||||
|
||||
if (src.belt)
|
||||
if (src.belt.blood_DNA.len)
|
||||
usr << "\red [src.name] has a[src.belt.blood_DNA.len ? " bloody " : " "] \icon[src.belt] [src.belt.name] on [t_his] belt!"
|
||||
if (src.belt.blood_DNA)
|
||||
usr << "\red [src.name] has a[src.belt.blood_DNA ? " bloody " : " "] \icon[src.belt] [src.belt.name] on [t_his] belt!"
|
||||
else
|
||||
usr << "\blue [src.name] has a \icon[src.belt] [src.belt.name] on [t_his] belt."
|
||||
if(src.s_store)
|
||||
if(src.s_store.blood_DNA.len)
|
||||
usr << "\red [src.name] has a[src.s_store.blood_DNA.len ? " bloody " : " "] \icon[src.s_store] [src.s_store.name] on [t_his][src.wear_suit.blood_DNA.len ? " bloody " : " "] \icon[src.wear_suit] [src.wear_suit.name]!"
|
||||
if(src.s_store.blood_DNA)
|
||||
usr << "\red [src.name] has a[src.s_store.blood_DNA ? " bloody " : " "] \icon[src.s_store] [src.s_store.name] on [t_his][src.wear_suit.blood_DNA ? " bloody " : " "] \icon[src.wear_suit] [src.wear_suit.name]!"
|
||||
else
|
||||
usr << "\blue [src.name] has a \icon[src.s_store] [src.s_store.name] on [t_his][src.wear_suit.blood_DNA.len ? " bloody " : " "] \icon[src.wear_suit] [src.wear_suit.name]."
|
||||
usr << "\blue [src.name] has a \icon[src.s_store] [src.s_store.name] on [t_his][src.wear_suit.blood_DNA ? " bloody " : " "] \icon[src.wear_suit] [src.wear_suit.name]."
|
||||
if (src.shoes)
|
||||
usr << "[src.shoes.blood_DNA.len ? "\red" : "\blue"][src.name] has a[src.shoes.blood_DNA.len ? " bloody " : " "] \icon[src.shoes] [src.shoes.name] on [t_his] feet."
|
||||
usr << "[src.shoes.blood_DNA ? "\red" : "\blue"][src.name] has a[src.shoes.blood_DNA ? " bloody " : " "] \icon[src.shoes] [src.shoes.name] on [t_his] feet."
|
||||
|
||||
|
||||
if (src.gloves)
|
||||
if (src.gloves.blood_DNA.len)
|
||||
if (src.gloves.blood_DNA)
|
||||
usr << "\red [src.name] has bloody \icon[src.gloves] [src.gloves.name] on [t_his] hands!"
|
||||
else
|
||||
usr << "\blue [src.name] has \icon[src.gloves] [src.gloves.name] on [t_his] hands."
|
||||
else if (src.blood_DNA.len)
|
||||
else if (src.blood_DNA)
|
||||
usr << "\red [src.name] has bloody hands!"
|
||||
|
||||
if (src.back)
|
||||
|
||||
@@ -83,7 +83,7 @@
|
||||
return
|
||||
|
||||
// Mute disability
|
||||
if (sdisabilities & 2)
|
||||
if (disabilities & 64)
|
||||
return
|
||||
|
||||
if (istype(wear_mask, /obj/item/clothing/mask/muzzle))
|
||||
@@ -116,22 +116,39 @@
|
||||
var/channel_prefix = copytext(message, 1, 3)
|
||||
|
||||
var/list/keys = list(
|
||||
":r" = "right ear",
|
||||
":l" = "left ear",
|
||||
":i" = "intercom",
|
||||
":h" = "department",
|
||||
":c" = "Command",
|
||||
":n" = "Science",
|
||||
":m" = "Medical",
|
||||
":e" = "Engineering",
|
||||
":s" = "Security",
|
||||
":w" = "whisper",
|
||||
":b" = "binary",
|
||||
":a" = "alientalk",
|
||||
":t" = "Syndicate",
|
||||
":d" = "Mining",
|
||||
":q" = "Cargo",
|
||||
":g" = "changeling",
|
||||
":r" = "right ear",
|
||||
":l" = "left ear",
|
||||
":i" = "intercom",
|
||||
":h" = "department",
|
||||
":c" = "Command",
|
||||
":n" = "Science",
|
||||
":m" = "Medical",
|
||||
":e" = "Engineering",
|
||||
":s" = "Security",
|
||||
":w" = "whisper",
|
||||
":b" = "binary",
|
||||
":a" = "alientalk",
|
||||
":t" = "Syndicate",
|
||||
":d" = "Mining",
|
||||
":q" = "Cargo",
|
||||
":g" = "changeling",
|
||||
|
||||
":R" = "right hand",
|
||||
":L" = "left hand",
|
||||
":I" = "intercom",
|
||||
":H" = "department",
|
||||
":C" = "Command",
|
||||
":N" = "Science",
|
||||
":M" = "Medical",
|
||||
":E" = "Engineering",
|
||||
":S" = "Security",
|
||||
":W" = "whisper",
|
||||
":B" = "binary",
|
||||
":A" = "alientalk",
|
||||
":T" = "Syndicate",
|
||||
":D" = "Mining",
|
||||
":Q" = "Cargo",
|
||||
":G" = "changeling",
|
||||
|
||||
//kinda localization -- rastaf0
|
||||
//same keys as above, but on russian keyboard layout. This file uses cp1251 as encoding.
|
||||
@@ -165,15 +182,15 @@
|
||||
|
||||
//work out if we're speaking tajaran or not
|
||||
var/is_speaking_taj = 0
|
||||
if(copytext(message, 1, 4) == ":j ")
|
||||
message = copytext(message, 4)
|
||||
if(copytext(message, 1, 3) == ":j" || copytext(message, 1, 3) == ":J")
|
||||
message = copytext(message, 3)
|
||||
if(taj_talk_understand)
|
||||
is_speaking_taj = 1
|
||||
|
||||
if( !message_mode && (disease_symptoms & DISEASE_WHISPER))
|
||||
message_mode = "whisper"
|
||||
|
||||
if(src.stunned > 0 && (!(traumatic_shock > 61) && prob(50)))
|
||||
if(src.stunned > 0 || (traumatic_shock > 61 && prob(50)))
|
||||
message_mode = "" //Stunned people shouldn't be able to physically turn on their radio/hold down the button to speak into it
|
||||
|
||||
|
||||
@@ -348,6 +365,13 @@
|
||||
if (M.client && M.client.ghost_ears)
|
||||
listening|=M
|
||||
|
||||
var/list/eavesdroppers = get_mobs_in_view(7, src)
|
||||
for(var/mob/M in listening)
|
||||
eavesdroppers.Remove(M)
|
||||
for(var/mob/M in eavesdroppers)
|
||||
if(M.stat)
|
||||
eavesdroppers.Remove(M)
|
||||
|
||||
for (var/obj/O in ((W | contents)-used_radios))
|
||||
W |= O
|
||||
|
||||
@@ -515,3 +539,10 @@
|
||||
sleep(11)
|
||||
del(B)
|
||||
*/
|
||||
|
||||
if (length(eavesdroppers))
|
||||
|
||||
for (var/mob/M in eavesdroppers)
|
||||
M << "\blue [src] speaks into their radio..."
|
||||
M << speech_bubble
|
||||
spawn(30) del(speech_bubble)
|
||||
@@ -144,7 +144,7 @@
|
||||
overlays += image("icon" = 'uniform_fat.dmi', "icon_state" = "[t1][!lying ? "_s" : "_l"]", "layer" = MOB_LAYER)
|
||||
else*/
|
||||
overlays += image("icon" = 'uniform.dmi', "icon_state" = text("[][]",t1, (!(lying) ? "_s" : "_l")), "layer" = MOB_LAYER)
|
||||
if (w_uniform.blood_DNA.len)
|
||||
if (w_uniform.blood_DNA)
|
||||
var/icon/stain_icon = icon('blood.dmi', "uniformblood[!lying ? "" : "2"]")
|
||||
overlays += image("icon" = stain_icon, "layer" = MOB_LAYER)
|
||||
|
||||
@@ -174,14 +174,14 @@
|
||||
else if(ro.destroyed)
|
||||
gloves_icon.Blend(new /icon('limb_mask.dmi', "left_[lying?"l":"s"]"), ICON_MULTIPLY)
|
||||
overlays += image(gloves_icon, "layer" = MOB_LAYER)
|
||||
if (gloves.blood_DNA.len)
|
||||
if (gloves.blood_DNA)
|
||||
var/icon/stain_icon = icon('blood.dmi', "bloodyhands[!lying ? "" : "2"]")
|
||||
if(lo.destroyed)
|
||||
stain_icon.Blend(new /icon('limb_mask.dmi', "right_[lying?"l":"s"]"), ICON_MULTIPLY)
|
||||
else if(ro.destroyed)
|
||||
stain_icon.Blend(new /icon('limb_mask.dmi', "left_[lying?"l":"s"]"), ICON_MULTIPLY)
|
||||
overlays += image("icon" = stain_icon, "layer" = MOB_LAYER)
|
||||
else if (blood_DNA.len)
|
||||
else if (blood_DNA)
|
||||
var/icon/stain_icon = icon('blood.dmi', "bloodyhands[!lying ? "" : "2"]")
|
||||
if(lo.destroyed)
|
||||
stain_icon.Blend(new /icon('limb_mask.dmi', "right_[lying?"l":"s"]"), ICON_MULTIPLY)
|
||||
@@ -210,7 +210,7 @@
|
||||
else if(ro.destroyed && !lying)
|
||||
shoes_icon.Blend(new /icon('limb_mask.dmi', "left[lying?"_l":""]"), ICON_MULTIPLY)
|
||||
overlays += image(shoes_icon, "layer" = MOB_LAYER)
|
||||
if (shoes.blood_DNA.len)
|
||||
if (shoes.blood_DNA)
|
||||
var/icon/stain_icon = icon('blood.dmi', "shoesblood[!lying ? "" : "2"]")
|
||||
if(lo.destroyed)
|
||||
stain_icon.Blend(new /icon('limb_mask.dmi', "right_[lying?"l":"s"]"), ICON_MULTIPLY)
|
||||
@@ -269,7 +269,7 @@
|
||||
var/t1 = wear_suit.icon_state
|
||||
overlays += image("icon" = 'suit.dmi', "icon_state" = text("[][]", t1, (!( lying ) ? null : "2")), "layer" = MOB_LAYER)
|
||||
if (wear_suit)
|
||||
if (wear_suit.blood_DNA.len)
|
||||
if (wear_suit.blood_DNA)
|
||||
var/icon/stain_icon = null
|
||||
if (istype(wear_suit, /obj/item/clothing/suit/armor/vest || /obj/item/clothing/suit/storage/wcoat))
|
||||
stain_icon = icon('blood.dmi', "armorblood[!lying ? "" : "2"]")
|
||||
@@ -309,7 +309,7 @@
|
||||
var/t1 = wear_mask.icon_state
|
||||
overlays += image("icon" = 'mask.dmi', "icon_state" = text("[][]", t1, (!( lying ) ? null : "2")), "layer" = MOB_LAYER)
|
||||
if (!istype(wear_mask, /obj/item/clothing/mask/cigarette))
|
||||
if (wear_mask.blood_DNA.len)
|
||||
if (wear_mask.blood_DNA)
|
||||
var/icon/stain_icon = icon('blood.dmi', "maskblood[!lying ? "" : "2"]")
|
||||
overlays += image("icon" = stain_icon, "layer" = MOB_LAYER)
|
||||
wear_mask.screen_loc = ui_mask
|
||||
@@ -323,7 +323,7 @@
|
||||
overlays += image("icon" = head_icon, "layer" = MOB_LAYER)
|
||||
if(gimmick_hat)
|
||||
overlays += image("icon" = icon('gimmick_head.dmi', "[gimmick_hat][!lying ? "" : "2"]"), "layer" = MOB_LAYER)
|
||||
if (head.blood_DNA.len)
|
||||
if (head.blood_DNA)
|
||||
var/icon/stain_icon = icon('blood.dmi', "helmetblood[!lying ? "" : "2"]")
|
||||
overlays += image("icon" = stain_icon, "layer" = MOB_LAYER)
|
||||
head.screen_loc = ui_head
|
||||
|
||||
@@ -22,7 +22,7 @@
|
||||
var/mob/living/carbon/human/H = src
|
||||
alt_name = " (as [H.get_visible_name()])"
|
||||
// Mute disability
|
||||
if (src.sdisabilities & 2)
|
||||
if (src.disabilities & 64)
|
||||
return
|
||||
|
||||
if (istype(src.wear_mask, /obj/item/clothing/mask/muzzle))
|
||||
|
||||
@@ -0,0 +1,60 @@
|
||||
/*
|
||||
* WARRANTY VOID IF CODE USED
|
||||
*/
|
||||
|
||||
|
||||
/datum/events
|
||||
var/list/events
|
||||
|
||||
New()
|
||||
..()
|
||||
events = new
|
||||
|
||||
proc/addEventType(event_type)
|
||||
if(!(event_type in events) || !islist(events[event_type]))
|
||||
events[event_type] = list()
|
||||
return 1
|
||||
return
|
||||
|
||||
proc/addEvent(event_type,proc_holder,proc_name)
|
||||
if(!event_type || !proc_holder || !proc_name)
|
||||
return
|
||||
addEventType(event_type)
|
||||
var/list/event = events[event_type]
|
||||
var/datum/event/E = new /datum/event(proc_holder,proc_name)
|
||||
event += E
|
||||
return E
|
||||
|
||||
proc/fireEvent()
|
||||
//world << "Events in [args[1]] called"
|
||||
var/list/event = listgetindex(events,args[1])
|
||||
if(istype(event))
|
||||
spawn(-1)
|
||||
for(var/datum/event/E in event)
|
||||
if(!E.Fire(arglist(args.Copy(2))))
|
||||
clearEvent(args[1],E)
|
||||
return
|
||||
|
||||
proc/clearEvent(event_type,datum/event/E)
|
||||
if(!event_type || !E)
|
||||
return
|
||||
var/list/event = listgetindex(events,event_type)
|
||||
event -= E
|
||||
return 1
|
||||
|
||||
|
||||
/datum/event
|
||||
var/listener
|
||||
var/proc_name
|
||||
|
||||
New(tlistener,tprocname)
|
||||
listener = tlistener
|
||||
proc_name = tprocname
|
||||
return ..()
|
||||
|
||||
proc/Fire()
|
||||
//world << "Event fired"
|
||||
if(listener)
|
||||
call(listener,proc_name)(arglist(args))
|
||||
return 1
|
||||
return
|
||||
@@ -106,7 +106,7 @@ Data storage vars:
|
||||
while(state)
|
||||
sleep(1)
|
||||
if(++lag>10)
|
||||
CRASH("The global_iterator loop \ref[src] failed to terminate in designated timeframe. Last exec - [get_last_exec_time_as_text()].")
|
||||
CRASH("The global_iterator loop \ref[src] failed to terminate in designated timeframe. This may be caused by server lagging.")
|
||||
return 1
|
||||
|
||||
proc/process()
|
||||
@@ -123,7 +123,7 @@ Data storage vars:
|
||||
|
||||
proc/set_delay(new_delay)
|
||||
if(isnum(new_delay))
|
||||
delay = new_delay>0?(new_delay):1
|
||||
delay = max(1, round(new_delay))
|
||||
return 1
|
||||
else
|
||||
return 0
|
||||
|
||||
@@ -33,7 +33,7 @@
|
||||
return 0
|
||||
setEffects(aeffectin,aeffectout)
|
||||
setForceTeleport(afteleport)
|
||||
setSounds(asoundin)
|
||||
setSounds(asoundin,asoundout)
|
||||
return 1
|
||||
|
||||
//must succeed
|
||||
@@ -112,9 +112,7 @@
|
||||
playSpecials(curturf,effectin,soundin)
|
||||
|
||||
if(force_teleport)
|
||||
teleatom.loc.Exited(teleatom)
|
||||
teleatom.loc = destturf
|
||||
teleatom.loc.Entered(teleatom)
|
||||
teleatom.forceMove(destturf)
|
||||
playSpecials(destturf,effectout,soundout)
|
||||
else
|
||||
if(teleatom.Move(destturf))
|
||||
|
||||
@@ -1396,7 +1396,7 @@ var/list/the_station_areas = list (
|
||||
S.volume = 100
|
||||
S.priority = 255
|
||||
S.status = SOUND_UPDATE
|
||||
process()
|
||||
// process()
|
||||
|
||||
Entered(atom/movable/Obj,atom/OldLoc)
|
||||
if(ismob(Obj))
|
||||
@@ -1411,7 +1411,7 @@ var/list/the_station_areas = list (
|
||||
mysound.status = SOUND_PAUSED | SOUND_UPDATE
|
||||
Obj << mysound
|
||||
|
||||
proc/process()
|
||||
/* proc/process()
|
||||
set background = 1
|
||||
|
||||
var/sound/S = null
|
||||
@@ -1431,4 +1431,4 @@ var/list/the_station_areas = list (
|
||||
spawn(sound_delay)
|
||||
H << S
|
||||
|
||||
spawn(60) .()
|
||||
spawn(60) .() */
|
||||
+14
-5
@@ -2,10 +2,10 @@
|
||||
layer = 2
|
||||
var/level = 2
|
||||
var/flags = FPRINT
|
||||
var/list/fingerprints = list()
|
||||
var/list/fingerprintshidden = list()
|
||||
var/list/fingerprints
|
||||
var/list/fingerprintshidden
|
||||
var/fingerprintslast = null
|
||||
var/list/blood_DNA = list()
|
||||
var/list/blood_DNA
|
||||
var/last_bumped = 0
|
||||
var/pass_flags = 0
|
||||
|
||||
@@ -13,7 +13,7 @@
|
||||
var/datum/reagents/reagents = null
|
||||
|
||||
//Detective Work, used for the duplicate data points kept in the scanners
|
||||
var/atom/original_atom = null
|
||||
var/list/original_atom
|
||||
|
||||
//var/chem_is_open_container = 0
|
||||
// replaced by OPENCONTAINER flags and atom/proc/is_open_container()
|
||||
@@ -233,4 +233,13 @@ its easier to just keep the beam vertical.
|
||||
X.pixel_y=Pixel_y
|
||||
sleep(3) //Changing this to a lower value will cause the beam to follow more smoothly with movement, but it will also be more laggy.
|
||||
//I've found that 3 ticks provided a nice balance for my use.
|
||||
for(var/obj/effect/overlay/beam/O in orange(10,src)) if(O.BeamSource==src) del O
|
||||
for(var/obj/effect/overlay/beam/O in orange(10,src)) if(O.BeamSource==src) del O
|
||||
|
||||
atom/movable/proc/forceMove(atom/destination)
|
||||
if(destination)
|
||||
if(loc)
|
||||
loc.Exited(src)
|
||||
loc = destination
|
||||
loc.Entered(src)
|
||||
return 1
|
||||
return 0
|
||||
|
||||
@@ -44,6 +44,7 @@
|
||||
var/obj/screen/gun/item/item_use_icon = null
|
||||
var/obj/screen/gun/move/gun_move_icon = null
|
||||
var/obj/screen/gun/run/gun_run_icon = null
|
||||
var/obj/screen/gun/mode/gun_setting_icon = null
|
||||
|
||||
var/total_luminosity = 0 //This controls luminosity for mobs, when you pick up lights and such this is edited. If you want the mob to use lights it must update its lum in its life proc or such. Note clamp this value around 7 or such to prevent massive light lag.
|
||||
var/last_luminosity = 0
|
||||
|
||||
@@ -401,7 +401,6 @@
|
||||
item_state = "scratch"
|
||||
color = "scratch"
|
||||
|
||||
|
||||
/obj/item/clothing/under/jensen
|
||||
desc = "You never asked for anything this stylish."
|
||||
name = "Head of Security Jumpsuit"
|
||||
@@ -507,7 +506,7 @@
|
||||
color = "spiderman"
|
||||
|
||||
/obj/item/clothing/under/rank/nursesuit
|
||||
desc = "A jumpsuit commonly worn by nursing staff in the medical department."
|
||||
desc = "Made of a special fiber that gives special protection against biohazards. A jumpsuit commonly worn by nursing staff in the medical department."
|
||||
name = "Nurse Suit"
|
||||
icon_state = "nursesuit"
|
||||
item_state = "nursesuit"
|
||||
@@ -530,10 +529,17 @@
|
||||
armor = list(melee = 100, bullet = 100, laser = 100,energy = 100, bomb = 100, bio = 100, rad = 100)
|
||||
|
||||
/obj/item/clothing/under/rank/medical_sleeve
|
||||
desc = "Made of a special fiber that gives special protection against biohazards. Has a cross on the chest denoting that the wearer is trained medical personnel. Has short sleeves."
|
||||
desc = "Made of a special fiber that gives special protection against biohazards. Has a cross on the chest denoting that the wearer is trained medical personneland short sleeves."
|
||||
name = "Short Sleeve Medical Jumpsuit"
|
||||
icon_state = "medical_sleeve"
|
||||
item_state = "medical_sleeve"
|
||||
item_state = "w_suit"
|
||||
color = "medical_sleeve"
|
||||
permeability_coefficient = 0.50
|
||||
armor = list(melee = 0, bullet = 0, laser = 0,energy = 0, bomb = 0, bio = 10, rad = 0)
|
||||
armor = list(melee = 0, bullet = 0, laser = 0,energy = 0, bomb = 0, bio = 10, rad = 0)
|
||||
|
||||
/obj/item/clothing/under/jumpsuitdown
|
||||
desc = "A rolled down jumpsuit. Great for mechanics."
|
||||
name = "Rolled Down Jumpsuit"
|
||||
icon_state = "jumpsuitdown"
|
||||
item_state = "jumpsuitdown"
|
||||
color = "jumpsuitdown"
|
||||
@@ -4,7 +4,6 @@
|
||||
density = 1
|
||||
anchored = 1.0
|
||||
var/obj/item/weapon/circuitboard/circuit = null //if circuit==null, computer can't disassemble
|
||||
var/emagged = 0
|
||||
|
||||
|
||||
/obj/machinery/computer/operating
|
||||
@@ -34,6 +33,24 @@
|
||||
var/blocked = 0 //Player cannot attack/heal while set
|
||||
|
||||
|
||||
/obj/machinery/computer/aistatus
|
||||
name = "AI Status Panel"
|
||||
icon = 'mainframe.dmi'
|
||||
icon_state = "left"
|
||||
// brightnessred = 0
|
||||
// brightnessgreen = 2
|
||||
// brightnessblue = 0
|
||||
|
||||
/obj/machinery/computer/aistatus/attack_hand(mob/user as mob)
|
||||
if(stat & NOPOWER)
|
||||
user << "\red The status panel has no power!"
|
||||
return
|
||||
if(stat & BROKEN)
|
||||
user << "\red The status panel is broken!"
|
||||
return
|
||||
user << "\red I don't understand any of this!"
|
||||
return
|
||||
|
||||
/obj/machinery/computer/aiupload
|
||||
name = "AI Upload"
|
||||
desc = "Used to upload laws to the AI."
|
||||
@@ -42,6 +59,10 @@
|
||||
var/mob/living/silicon/ai/current = null
|
||||
var/opened = 0
|
||||
|
||||
/obj/machinery/computer/aiupload/mainframe
|
||||
name = "AI Mainframe Upload"
|
||||
icon = 'mainframe.dmi'
|
||||
icon_state = "aimainframe"
|
||||
|
||||
/obj/machinery/computer/borgupload
|
||||
name = "Cyborg Upload"
|
||||
@@ -50,6 +71,11 @@
|
||||
circuit = "/obj/item/weapon/circuitboard/borgupload"
|
||||
var/mob/living/silicon/robot/current = null
|
||||
|
||||
/obj/machinery/computer/borgupload/mainframe
|
||||
name = "Borg Mainframe Upload"
|
||||
icon = 'mainframe.dmi'
|
||||
icon_state = "aimainframe"
|
||||
|
||||
|
||||
/obj/machinery/computer/station_alert
|
||||
name = "Station Alert Computer"
|
||||
|
||||
@@ -293,3 +293,13 @@
|
||||
layer = 2
|
||||
icon = 'tomatodecal.dmi'
|
||||
random_icon_states = list("smashed_pie")
|
||||
|
||||
/obj/decal/warning_stripes
|
||||
icon = 'decal_warning_stripes.dmi'
|
||||
layer = 2
|
||||
|
||||
/obj/decal/warning_stripes/New()
|
||||
..()
|
||||
|
||||
loc.overlays += src
|
||||
del src
|
||||
@@ -3,7 +3,7 @@
|
||||
icon = 'stationobjs.dmi'
|
||||
var
|
||||
stat = 0
|
||||
|
||||
emagged = 0
|
||||
use_power = 0
|
||||
//0 = dont run the auto
|
||||
//1 = run auto, use idle
|
||||
|
||||
@@ -28,7 +28,7 @@
|
||||
var/slogan_delay = 600 //How long until we can pitch again?
|
||||
var/icon_vend //Icon_state when vending!
|
||||
var/icon_deny //Icon_state when vending!
|
||||
var/emagged = 0 //Ignores if somebody doesn't have card access to that machine.
|
||||
//var/emagged = 0 //Ignores if somebody doesn't have card access to that machine.
|
||||
var/seconds_electrified = 0 //Shock customers like an airlock.
|
||||
var/shoot_inventory = 0 //Fire items at customers! We're broken!
|
||||
var/shut_up = 1 //Stop spouting those godawful pitches!
|
||||
|
||||
@@ -1455,6 +1455,10 @@ proc/safepick(list/list)
|
||||
return
|
||||
return pick(list)
|
||||
|
||||
//chances are 1:value. anyprob(1) will always return true
|
||||
proc/anyprob(value)
|
||||
return (rand(1,value)==value)
|
||||
|
||||
proc/view_or_range(distance = world.view , center = usr , type)
|
||||
switch(type)
|
||||
if("view")
|
||||
|
||||
+28
-22
@@ -84,6 +84,8 @@
|
||||
if (!( src.flags ) & 256)
|
||||
return
|
||||
if (ishuman(M))
|
||||
if(!fingerprintshidden)
|
||||
fingerprintshidden = list()
|
||||
add_fibers(M)
|
||||
if (M.mutations2 & mFingerprints)
|
||||
if(src.fingerprintslast != M.key)
|
||||
@@ -99,7 +101,7 @@
|
||||
if(src.fingerprintslast != H.key)
|
||||
src.fingerprintshidden += text("(Wearing gloves). Real name: [], Key: []",H.real_name, H.key)
|
||||
src.fingerprintslast = H.key
|
||||
H.gloves.add_fingerprint(M)
|
||||
H.gloves.add_fingerprint(M)
|
||||
if(H.gloves != src)
|
||||
if(prob(75) && istype(H.gloves, /obj/item/clothing/gloves/latex))
|
||||
return 0
|
||||
@@ -108,6 +110,8 @@
|
||||
if(src.fingerprintslast != H.key)
|
||||
src.fingerprintshidden += text("Real name: [], Key: []",H.real_name, H.key)
|
||||
src.fingerprintslast = H.key
|
||||
if(!fingerprints)
|
||||
fingerprints = list()
|
||||
var/new_prints = 0
|
||||
var/prints
|
||||
for(var/i = 1, i <= src.fingerprints.len, i++)
|
||||
@@ -122,20 +126,22 @@
|
||||
if(src.fingerprints.len == 1)
|
||||
src.fingerprints = list()
|
||||
else
|
||||
for(var/j = (i + 1), j < (src.fingerprints.len), j++)
|
||||
src.fingerprints[j-1] = src.fingerprints[j]
|
||||
for(var/j = i, j <= (src.fingerprints.len), j++)
|
||||
src.fingerprints[j] = src.fingerprints[j+1]
|
||||
src.fingerprints.len--
|
||||
else
|
||||
src.fingerprints[i] = "1=" + L[num2text(1)] + "&2=" + test_print
|
||||
src.fingerprints[i] = "1=[L[num2text(1)]]&2=[test_print]"
|
||||
if(new_prints)
|
||||
src.fingerprints[new_prints] = text("1=[]&2=[]", md5(H.dna.uni_identity), stringmerge(prints,stars(md5(H.dna.uni_identity), (H.gloves ? rand(10,20) : rand(25,40)))))
|
||||
else if(new_prints == 0)
|
||||
if(!src.fingerprints)
|
||||
if(!src.fingerprints || !src.fingerprints.len)
|
||||
src.fingerprints = list(text("1=[]&2=[]", md5(H.dna.uni_identity), stars(md5(H.dna.uni_identity), H.gloves ? rand(10,20) : rand(25,40))))
|
||||
src.fingerprints += text("1=[]&2=[]", md5(H.dna.uni_identity), stars(md5(H.dna.uni_identity), H.gloves ? rand(10,20) : rand(25,40)))
|
||||
else
|
||||
src.fingerprints += text("1=[]&2=[]", md5(H.dna.uni_identity), stars(md5(H.dna.uni_identity), H.gloves ? rand(10,20) : rand(25,40)))
|
||||
for(var/i = 1, i <= src.fingerprints.len, i++)
|
||||
if(length(src.fingerprints[i]) != 69)
|
||||
src.fingerprints.Remove(src.fingerprints[i])
|
||||
if(fingerprints && !fingerprints.len) del(fingerprints)
|
||||
return 1
|
||||
else
|
||||
if(src.fingerprintslast != M.key)
|
||||
@@ -153,10 +159,7 @@
|
||||
if (!( src.flags ) & 256)
|
||||
return
|
||||
if(!blood_DNA)
|
||||
var/turf/Z = get_turf(src)
|
||||
message_admins("\red ERROR: [src] at [Z.x], [Z.y], [Z.z] is missing it's blood_DNA list!")
|
||||
log_game("\red ERROR: [src] at [Z.x], [Z.y], [Z.z] is missing it's blood_DNA list!")
|
||||
return
|
||||
blood_DNA = list()
|
||||
if (blood_DNA.len)
|
||||
if (istype(src, /obj/item)&&!istype(src, /obj/item/weapon/melee/energy))//Only regular items. Energy melee weapon are not affected.
|
||||
var/obj/item/source2 = src
|
||||
@@ -195,6 +198,7 @@
|
||||
blood_DNA_temp[1] = list(M.dna.unique_enzymes, M.dna.b_type)
|
||||
this.blood_DNA = blood_DNA_temp
|
||||
this.virus2 = M.virus2
|
||||
this.blood_owner = M
|
||||
for(var/datum/disease/D in M.viruses)
|
||||
var/datum/disease/newDisease = new D.type
|
||||
this.viruses += newDisease
|
||||
@@ -266,21 +270,18 @@
|
||||
|
||||
if (!( src.flags ) & 256)
|
||||
return
|
||||
if(!blood_DNA)
|
||||
var/turf/Z = get_turf(src)
|
||||
message_admins("\red ERROR: [src] at [Z.x], [Z.y], [Z.z] is missing it's blood_DNA list!")
|
||||
log_game("\red ERROR: [src] at [Z.x], [Z.y], [Z.z] is missing it's blood_DNA list!")
|
||||
blood_DNA = list()
|
||||
return
|
||||
if ( src.blood_DNA.len )
|
||||
if ( src.blood_DNA )
|
||||
if (istype (src, /mob/living/carbon))
|
||||
var/obj/item/source2 = src
|
||||
source2.blood_DNA = list()
|
||||
del(source2.blood_DNA)
|
||||
if(ishuman(src))
|
||||
var/mob/living/carbon/human/M = src
|
||||
M.bloody_hands = 0
|
||||
//var/icon/I = new /icon(source2.icon_old, source2.icon_state) //doesnt have icon_old
|
||||
//source2.icon = I
|
||||
if (istype (src, /obj/item))
|
||||
var/obj/item/source2 = src
|
||||
source2.blood_DNA = list()
|
||||
del(source2.blood_DNA)
|
||||
// var/icon/I = new /icon(source2.icon_old, source2.icon_state)
|
||||
if(source2.icon_old)
|
||||
source2.icon = source2.icon_old
|
||||
@@ -288,14 +289,19 @@
|
||||
else
|
||||
source2.icon = initial(icon)
|
||||
source2.update_icon()
|
||||
if(istype(src, /obj/item/clothing/gloves))
|
||||
var/obj/item/clothing/gloves/G = src
|
||||
G.transfer_blood = 0
|
||||
if (istype(src, /turf/simulated))
|
||||
var/obj/item/source2 = src
|
||||
source2.blood_DNA = list()
|
||||
del(source2.blood_DNA)
|
||||
if(source2.icon_old)
|
||||
var/icon/I = new /icon(source2.icon_old, source2.icon_state)
|
||||
source2.icon = I
|
||||
else
|
||||
source2.icon = initial(icon)
|
||||
if(blood_DNA && !blood_DNA.len)
|
||||
del(blood_DNA)
|
||||
if(src.fingerprints && src.fingerprints.len)
|
||||
var/done = 0
|
||||
while(!done)
|
||||
@@ -315,8 +321,8 @@
|
||||
break
|
||||
else
|
||||
src.fingerprints[i] = "1=" + prints["1"] + "&2=" + new_print
|
||||
if(!src.fingerprints)
|
||||
src.fingerprints = list()
|
||||
if(fingerprints && !fingerprints.len)
|
||||
del(fingerprints)
|
||||
if(istype(src, /mob/living/carbon/human))
|
||||
var/mob/living/carbon/human/M = src
|
||||
M.update_clothing()
|
||||
|
||||
@@ -19,6 +19,12 @@
|
||||
|
||||
// determine DNA fragment from hairstyle
|
||||
// :wtc:
|
||||
// If the character doesn't have initialized hairstyles / beardstyles, initialize it for them!
|
||||
if(!character.hair_style)
|
||||
character.hair_style = new/datum/sprite_accessory/hair/short
|
||||
|
||||
if(!character.facial_hair_style)
|
||||
character.facial_hair_style = new/datum/sprite_accessory/facial_hair/shaved
|
||||
|
||||
var/list/styles = typesof(/datum/sprite_accessory/hair) - /datum/sprite_accessory/hair
|
||||
var/hrange = round(4095 / styles.len)
|
||||
|
||||
@@ -1,18 +1,17 @@
|
||||
/proc/mini_blob_event()
|
||||
|
||||
if(prob(33)) //33% chance of making a blob.
|
||||
var/turf/T = pick(blobstart)
|
||||
var/obj/effect/blob/bl = new /obj/effect/blob( T.loc, 30 )
|
||||
spawn(0)
|
||||
bl.Life()
|
||||
bl.Life()
|
||||
bl.Life()
|
||||
bl.Life()
|
||||
bl.blobdebug = 1
|
||||
bl.Life()
|
||||
blobevent = 1
|
||||
spawn(0)
|
||||
dotheblobbaby()
|
||||
var/turf/T = pick(blobstart)
|
||||
var/obj/effect/blob/bl = new /obj/effect/blob( T.loc, 30 )
|
||||
spawn(0)
|
||||
bl.Life()
|
||||
bl.Life()
|
||||
bl.Life()
|
||||
bl.Life()
|
||||
bl.blobdebug = 1
|
||||
bl.Life()
|
||||
blobevent = 1
|
||||
spawn(0)
|
||||
dotheblobbaby()
|
||||
spawn(15000)
|
||||
blobevent = 0
|
||||
spawn(rand(30, 60)) //Delayed announcements to keep the crew on their toes.
|
||||
|
||||
@@ -1,10 +1,9 @@
|
||||
/datum/event/power_offline
|
||||
var/list/protected_areas = list(/area/ai_monitored/storage/eva, /area/engine, /area/toxins/xenobiology, /area/turret_protected/ai)
|
||||
|
||||
Announce()
|
||||
for(var/obj/machinery/power/apc/a in world)
|
||||
if(!a.crit && a.z == 1)
|
||||
if(a.area in protected_areas)
|
||||
if(istype(a.area, /area/ai_monitored/storage/eva) || istype(a.area, /area/engine)\
|
||||
|| istype(a.area, /area/toxins/xenobiology) || istype(a.area, /area/turret_protected/ai))
|
||||
continue
|
||||
a.eventoff = 1
|
||||
a.update()
|
||||
|
||||
@@ -373,6 +373,10 @@ datum/objective/steal
|
||||
if(istype(M, /mob/living/silicon/ai) && M.stat != 2)
|
||||
// world << "yay, you win!"
|
||||
return 1
|
||||
for(var/mob/living/silicon/ai/M in world)
|
||||
if(istype(M.loc, /turf))
|
||||
if(istype(get_area(M), /area/shuttle/escape))
|
||||
return 1
|
||||
else
|
||||
for(var/obj/I in all_items)
|
||||
if(istype(I, steal_target))
|
||||
|
||||
+4
-3
@@ -44,9 +44,10 @@
|
||||
#define ui_inv3 "SOUTH-1,3"
|
||||
|
||||
|
||||
#define ui_gun1 "WEST,NORTH"
|
||||
#define ui_gun2 "WEST+1,NORTH"
|
||||
#define ui_gun3 "WEST+2,NORTH"
|
||||
#define ui_gun1 "SOUTH,8"
|
||||
#define ui_gun2 "SOUTH,9"
|
||||
#define ui_gun3 "SOUTH,10"
|
||||
#define ui_gun_select "SOUTH-1,9"
|
||||
|
||||
|
||||
|
||||
|
||||
@@ -20,7 +20,7 @@
|
||||
H.equip_if_possible(new /obj/item/clothing/shoes/black(H), H.slot_shoes)
|
||||
spawn(0)
|
||||
var/religion_name = "Christianity"
|
||||
var/new_religion = input(H, "You are the Chaplain / Councelor. For game mechanics purposes, you need to choose a religion either way. Would you like to change your religion? Default is Christianity, in SPACE.", "Name change", religion_name)
|
||||
var/new_religion = input(H, "You are the Chaplain / Counselor. For game mechanics purposes, you need to choose a religion either way. Would you like to change your religion? Default is Christianity, in SPACE.", "Name change", religion_name)
|
||||
|
||||
if ((length(new_religion) == 0) || (new_religion == "Christianity"))
|
||||
new_religion = religion_name
|
||||
|
||||
@@ -18,6 +18,24 @@
|
||||
H.equip_if_possible(new /obj/item/clothing/head/helmet/hardhat/white(H), H.slot_head)
|
||||
H.equip_if_possible(new /obj/item/weapon/storage/belt/utility/full(H), H.slot_belt)
|
||||
H.equip_if_possible(new /obj/item/clothing/gloves/black(H), H.slot_gloves)
|
||||
var/list/wire_index = list(
|
||||
"Orange" = 1,
|
||||
"Dark red" = 2,
|
||||
"White" = 3,
|
||||
"Yellow" = 4,
|
||||
"Red" = 5,
|
||||
"Blue" = 6,
|
||||
"Green" = 7,
|
||||
"Grey" = 8,
|
||||
"Black" = 9,
|
||||
"Pink" = 10,
|
||||
"Brown" = 11,
|
||||
"Maroon" = 12)
|
||||
H.mind.store_memory("<b>The door wires are as follows:</b>")
|
||||
H.mind.store_memory("<b>Power:</b> [wire_index[airlockIndexToWireColor[2]]] and [wire_index[airlockIndexToWireColor[3]]]")
|
||||
H.mind.store_memory("<b>Backup Power:</b> [wire_index[airlockIndexToWireColor[5]]] and [wire_index[airlockIndexToWireColor[6]]]")
|
||||
H.mind.store_memory("<b>Door Bolts:</b> [wire_index[airlockIndexToWireColor[4]]]")
|
||||
H << "\blue You have memorised the important wires for the vessel. Use them wisely."
|
||||
return 1
|
||||
|
||||
|
||||
|
||||
@@ -9,7 +9,7 @@
|
||||
var/maxhealth = 0
|
||||
var/fire_dam_coeff = 1.0
|
||||
var/brute_dam_coeff = 1.0
|
||||
var/emagged = 0 //Urist: Moving that var to the general /bot tree as it's used by most bots
|
||||
//var/emagged = 0 //Urist: Moving that var to the general /bot tree as it's used by most bots
|
||||
|
||||
|
||||
/obj/machinery/bot/proc/turn_on()
|
||||
|
||||
@@ -66,6 +66,11 @@
|
||||
continue
|
||||
else if (M == usr)
|
||||
continue
|
||||
var/turf/temp_turf = get_turf(M)
|
||||
if(temp_turf.z != 1 && temp_turf.z != 5) //Not on mining or the station.
|
||||
continue
|
||||
if(!checkcameravis(M)) //Not near a camera
|
||||
continue
|
||||
|
||||
var/name = M.name
|
||||
if (name in names)
|
||||
@@ -212,12 +217,12 @@
|
||||
L.Add(C)
|
||||
|
||||
camera_sort(L)
|
||||
L = camera_network_sort(L)
|
||||
|
||||
var/list/D = list()
|
||||
for (var/obj/machinery/camera/C in L)
|
||||
if ( C.network in src.networks )
|
||||
D[text("[]: [][]", C.network, C.c_tag, (C.status ? null : " (Deactivated)"))] = C
|
||||
D = camera_network_sort(D)
|
||||
D["Cancel"] = "Cancel"
|
||||
|
||||
var/t = input(user, "Which camera should you change to?") as null|anything in D
|
||||
|
||||
@@ -52,8 +52,8 @@
|
||||
user << "You [ control ? "enable" : "disable"] remote APC control."
|
||||
else
|
||||
user << "\red Access denied."
|
||||
|
||||
|
||||
|
||||
|
||||
else
|
||||
src.attack_hand(user)
|
||||
return
|
||||
@@ -68,7 +68,7 @@
|
||||
|
||||
|
||||
user.machine = src
|
||||
var/t = "<TT><B>Power Monitoring</B><HR>"
|
||||
var/t = "<TT><B>Power Monitoring: Swipe ID for remote access</B><HR>"
|
||||
|
||||
t += "<BR><HR><A href='?src=\ref[src];update=1'>Refresh</A>"
|
||||
t += "<BR><HR><A href='?src=\ref[src];close=1'>Close</A>"
|
||||
|
||||
@@ -157,7 +157,6 @@ for reference:
|
||||
var/health = 100.0
|
||||
var/maxhealth = 100.0
|
||||
var/locked = 0.0
|
||||
var/emagged = 0.0
|
||||
// req_access = list(access_maint_tunnels)
|
||||
|
||||
New()
|
||||
|
||||
@@ -140,7 +140,7 @@
|
||||
sleep(6)
|
||||
open()
|
||||
return 1
|
||||
if (src.allowed(user))
|
||||
if (src.allowed(user) || istype(I, /obj/item/device/hacktool))
|
||||
if (src.density)
|
||||
open()
|
||||
else
|
||||
|
||||
@@ -13,7 +13,6 @@
|
||||
use_power = 1
|
||||
idle_power_usage = 2
|
||||
active_power_usage = 500
|
||||
var/emagged = 0
|
||||
|
||||
/obj/machinery/gibber/New()
|
||||
..()
|
||||
|
||||
@@ -91,7 +91,6 @@ Class Procs:
|
||||
Compiled by Aygar
|
||||
*/
|
||||
|
||||
|
||||
/obj/machinery/New()
|
||||
..()
|
||||
machines.Add(src)
|
||||
|
||||
@@ -43,7 +43,7 @@
|
||||
|
||||
var/attacked = 0 // if set to 1, the turret gets pissed off and shoots at people nearby (unless they have sec access!)
|
||||
|
||||
var/emagged = 0 // 1: emagged, 0: not emagged
|
||||
//var/emagged = 0 // 1: emagged, 0: not emagged
|
||||
var/on = 1 // determines if the turret is on
|
||||
|
||||
var/datum/effect/effect/system/spark_spread/spark_system // the spark system, used for generating... sparks?
|
||||
|
||||
@@ -393,6 +393,8 @@
|
||||
|
||||
var/datum/comm_log_entry/log = new
|
||||
var/mob/M = signal.data["mob"]
|
||||
if(istype(M, /mob/new_player))
|
||||
return //Kludgy fix, will route out the real cause later --mloc
|
||||
|
||||
// Copy the signal.data entries we want
|
||||
log.parameters["mobtype"] = signal.data["mobtype"]
|
||||
|
||||
@@ -60,7 +60,8 @@
|
||||
// 1 = laser
|
||||
// 2 = cannon
|
||||
// 3 = pulse
|
||||
var/health = 80
|
||||
var/health = 18
|
||||
var/id = ""
|
||||
var/obj/machinery/turretcover/cover = null
|
||||
var/popping = 0
|
||||
var/wasvalid = 0
|
||||
@@ -295,27 +296,38 @@
|
||||
icon_state = "motion3"
|
||||
anchored = 1
|
||||
density = 0
|
||||
req_access = list(access_ai_upload)
|
||||
var/enabled = 1
|
||||
var/id = ""
|
||||
var/lethal = 0
|
||||
var/locked = 1
|
||||
var/control_area //can be area name, path or nothing.
|
||||
req_access = list(access_ai_upload)
|
||||
var/similar_controls
|
||||
var/turrets
|
||||
|
||||
/obj/machinery/turretid/east
|
||||
pixel_x = 28
|
||||
|
||||
/obj/machinery/turretid/south
|
||||
pixel_y = -28
|
||||
|
||||
/obj/machinery/turretid/west
|
||||
pixel_x = -28
|
||||
|
||||
/obj/machinery/turretid/north
|
||||
pixel_y = 28
|
||||
|
||||
/obj/machinery/turretid/New()
|
||||
..()
|
||||
if(!control_area)
|
||||
var/area/CA = get_area(src)
|
||||
if(CA.master && CA.master != CA)
|
||||
control_area = CA.master
|
||||
else
|
||||
control_area = CA
|
||||
else if(istext(control_area))
|
||||
for(var/area/A in world)
|
||||
if(A.name && A.name==control_area)
|
||||
control_area = A
|
||||
break
|
||||
//don't have to check if control_area is path, since get_area_all_atoms can take path.
|
||||
return
|
||||
spawn(10) // allow map load
|
||||
turrets = list()
|
||||
for(var/obj/machinery/turret/T in world)
|
||||
if(T.id == id)
|
||||
turrets += T
|
||||
|
||||
similar_controls = list() // On modifying a control, all the similar controls should change their icon_state as well
|
||||
for(var/obj/machinery/turretid/TC in world)
|
||||
if(TC.id == id && TC != src)
|
||||
similar_controls += TC
|
||||
|
||||
/obj/machinery/turretid/attackby(obj/item/weapon/W, mob/user)
|
||||
if(stat & BROKEN) return
|
||||
@@ -365,20 +377,6 @@
|
||||
user << browse(t, "window=turretid")
|
||||
onclose(user, "turretid")
|
||||
|
||||
|
||||
/obj/machinery/turret/attack_alien(mob/living/carbon/alien/humanoid/M as mob)
|
||||
if(!(stat & BROKEN))
|
||||
playsound(src.loc, '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)
|
||||
src.health -= 15
|
||||
if (src.health <= 0)
|
||||
src.die()
|
||||
else
|
||||
M << "\green That object is useless to you."
|
||||
return
|
||||
|
||||
/obj/machinery/turretid/Topic(href, href_list)
|
||||
..()
|
||||
if (src.locked)
|
||||
@@ -396,16 +394,33 @@
|
||||
/obj/machinery/turretid/proc/updateTurrets()
|
||||
if (src.enabled)
|
||||
if (src.lethal)
|
||||
icon_state = "motion1"
|
||||
src.icon_state = "motion1"
|
||||
for(var/obj/machinery/turretid/TC in src.similar_controls) //Change every similar control's icon as well
|
||||
TC.icon_state = "motion1"
|
||||
else
|
||||
icon_state = "motion3"
|
||||
src.icon_state = "motion3"
|
||||
for(var/obj/machinery/turretid/TC in src.similar_controls)
|
||||
TC.icon_state = "motion3"
|
||||
else
|
||||
icon_state = "motion0"
|
||||
src.icon_state = "motion0"
|
||||
for(var/obj/machinery/turretid/TC in src.similar_controls)
|
||||
TC.icon_state = "motion0"
|
||||
|
||||
if(control_area)
|
||||
for (var/obj/machinery/turret/aTurret in get_area_all_atoms(control_area))
|
||||
aTurret.setState(enabled, lethal)
|
||||
for (var/obj/machinery/turret/aTurret in turrets)
|
||||
aTurret.setState(enabled, lethal)
|
||||
|
||||
/obj/machinery/turret/attack_alien(mob/living/carbon/alien/humanoid/M as mob)
|
||||
if(!(stat & BROKEN))
|
||||
playsound(src.loc, '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)
|
||||
src.health -= 15
|
||||
if (src.health <= 0)
|
||||
src.die()
|
||||
else
|
||||
M << "\green That object is useless to you."
|
||||
return
|
||||
|
||||
|
||||
/obj/structure/turret/gun_turret
|
||||
|
||||
@@ -589,7 +589,6 @@ datum/borrowbook // Datum used to keep track of who has borrowed what when and f
|
||||
anchored = 1
|
||||
density = 1
|
||||
var
|
||||
emagged = 0
|
||||
arcanecheckout = 0
|
||||
screenstate = 0 // 0 - Main Menu, 1 - Inventory, 2 - Checked Out, 3 - Check Out a Book
|
||||
buffer_book
|
||||
|
||||
@@ -6,6 +6,8 @@
|
||||
var/list/destroyable_obj = list(/obj/mecha, /obj/structure/window, /obj/structure/grille, /turf/simulated/wall)
|
||||
internal_damage_threshold = 50
|
||||
maint_access = 0
|
||||
//add_req_access = 0
|
||||
//operation_req_access = list(access_hos)
|
||||
damage_absorption = list("brute"=0.7,"fire"=1,"bullet"=0.7,"laser"=0.85,"energy"=1,"bomb"=0.8)
|
||||
|
||||
/*
|
||||
|
||||
@@ -6,7 +6,7 @@
|
||||
dir_in = 1 //Facing North.
|
||||
health = 400
|
||||
deflect_chance = 20
|
||||
damage_absorption = list("brute"=0.4,"fire"=1.1,"bullet"=0.6,"laser"=0.85,"energy"=0.9,"bomb"=0.8)
|
||||
damage_absorption = list("brute"=0.5,"fire"=1.1,"bullet"=0.65,"laser"=0.85,"energy"=0.9,"bomb"=0.8)
|
||||
max_temperature = 3000
|
||||
infra_luminosity = 8
|
||||
force = 40
|
||||
|
||||
@@ -6,13 +6,13 @@
|
||||
dir_in = 1 //Facing North.
|
||||
health = 300
|
||||
deflect_chance = 15
|
||||
damage_absorption = list("brute"=0.6,"fire"=1,"bullet"=0.8,"laser"=0.6,"energy"=0.7,"bomb"=1)
|
||||
damage_absorption = list("brute"=0.75,"fire"=1,"bullet"=0.8,"laser"=0.7,"energy"=0.85,"bomb"=1)
|
||||
max_temperature = 3500
|
||||
infra_luminosity = 6
|
||||
var/overload = 0
|
||||
wreckage = /obj/effect/decal/mecha_wreckage/gygax
|
||||
internal_damage_threshold = 35
|
||||
max_equip = 4
|
||||
max_equip = 3
|
||||
|
||||
|
||||
/*
|
||||
|
||||
@@ -5,7 +5,7 @@
|
||||
step_in = 5
|
||||
health = 500
|
||||
deflect_chance = 25
|
||||
damage_absorption = list("brute"=0.4,"fire"=0.7,"bullet"=0.45,"laser"=0.6,"energy"=0.7,"bomb"=0.7)
|
||||
damage_absorption = list("brute"=0.5,"fire"=0.7,"bullet"=0.45,"laser"=0.6,"energy"=0.7,"bomb"=0.7)
|
||||
max_temperature = 5000
|
||||
infra_luminosity = 3
|
||||
var/zoom = 0
|
||||
|
||||
@@ -12,6 +12,7 @@
|
||||
infra_luminosity = 3
|
||||
wreckage = /obj/effect/decal/mecha_wreckage/phazon
|
||||
add_req_access = 1
|
||||
//operation_req_access = list()
|
||||
internal_damage_threshold = 25
|
||||
force = 15
|
||||
var/phasing = 0
|
||||
|
||||
@@ -13,6 +13,8 @@
|
||||
var/energy_drain = 0
|
||||
var/obj/mecha/chassis = null
|
||||
var/range = MELEE //bitflags
|
||||
reliability = 1000
|
||||
var/salvageable = 1
|
||||
|
||||
|
||||
/obj/item/mecha_parts/mecha_equipment/proc/do_after_cooldown(target=1)
|
||||
@@ -31,6 +33,13 @@
|
||||
if(chassis)
|
||||
send_byjax(chassis.occupant,"exosuit.browser","eq_list",chassis.get_equipment_list())
|
||||
send_byjax(chassis.occupant,"exosuit.browser","equipment_menu",chassis.get_equipment_menu(),"dropdowns")
|
||||
return 1
|
||||
return
|
||||
|
||||
/obj/item/mecha_parts/mecha_equipment/proc/update_equip_info()
|
||||
if(chassis)
|
||||
send_byjax(chassis.occupant,"exosuit.browser","\ref[src]",get_equip_info())
|
||||
return 1
|
||||
return
|
||||
|
||||
/obj/item/mecha_parts/mecha_equipment/proc/destroy()//missiles detonating, teleporter creating singularity?
|
||||
@@ -90,7 +99,7 @@
|
||||
|
||||
/obj/item/mecha_parts/mecha_equipment/proc/attach(obj/mecha/M as obj)
|
||||
M.equipment += src
|
||||
src.chassis = M
|
||||
chassis = M
|
||||
src.loc = M
|
||||
M.log_message("[src] initialized.")
|
||||
if(!M.selected)
|
||||
@@ -103,10 +112,10 @@
|
||||
chassis.equipment -= src
|
||||
if(chassis.selected == src)
|
||||
chassis.selected = null
|
||||
src.update_chassis_page()
|
||||
update_chassis_page()
|
||||
chassis.log_message("[src] removed from equipment.")
|
||||
src.chassis = null
|
||||
src.equip_ready = 1
|
||||
chassis = null
|
||||
set_ready_state(1)
|
||||
return
|
||||
|
||||
|
||||
|
||||
@@ -6,9 +6,9 @@
|
||||
var/dam_force = 20
|
||||
var/obj/mecha/working/ripley/cargo_holder
|
||||
|
||||
can_attach(obj/mecha/M as obj)
|
||||
can_attach(obj/mecha/working/ripley/M as obj)
|
||||
if(..())
|
||||
if(istype(M, /obj/mecha/working/ripley))
|
||||
if(istype(M))
|
||||
return 1
|
||||
return 0
|
||||
|
||||
@@ -65,6 +65,7 @@
|
||||
|
||||
/obj/item/mecha_parts/mecha_equipment/tool/drill
|
||||
name = "Drill"
|
||||
desc = "This is the drill that'll pierce the heavens! (Can be attached to: Combat and Engineering Exosuits)"
|
||||
icon_state = "mecha_drill"
|
||||
equip_cooldown = 30
|
||||
energy_drain = 10
|
||||
@@ -76,7 +77,6 @@
|
||||
chassis.use_power(energy_drain)
|
||||
chassis.visible_message("<font color='red'><b>[chassis] starts to drill [target]</b></font>", "You hear the drill.")
|
||||
chassis.occupant_message("<font color='red'><b>You start to drill [target]</b></font>")
|
||||
chassis.use_power(energy_drain)
|
||||
var/T = chassis.loc
|
||||
var/C = target.loc //why are these backwards? we may never know -Pete
|
||||
if(do_after_cooldown(target))
|
||||
@@ -99,9 +99,16 @@
|
||||
target.ex_act(2)
|
||||
return 1
|
||||
|
||||
can_attach(obj/mecha/M as obj)
|
||||
if(..())
|
||||
if(istype(M, /obj/mecha/working) || istype(M, /obj/mecha/combat))
|
||||
return 1
|
||||
return 0
|
||||
|
||||
|
||||
/obj/item/mecha_parts/mecha_equipment/tool/extinguisher
|
||||
name = "Extinguisher"
|
||||
desc = "Exosuit-mounted extinguisher (Can be attached to: Engineering exosuits)"
|
||||
icon_state = "mecha_exting"
|
||||
equip_cooldown = 5
|
||||
energy_drain = 0
|
||||
@@ -164,13 +171,19 @@
|
||||
on_reagent_change()
|
||||
return
|
||||
|
||||
can_attach(obj/mecha/working/M as obj)
|
||||
if(..())
|
||||
if(istype(M))
|
||||
return 1
|
||||
return 0
|
||||
|
||||
|
||||
/obj/item/mecha_parts/mecha_equipment/tool/rcd
|
||||
name = "Mounted RCD"
|
||||
desc = "An exosuit-mounted Rapid Construction Device."
|
||||
desc = "An exosuit-mounted Rapid Construction Device. (Can be attached to: Any exosuit)"
|
||||
icon_state = "mecha_rcd"
|
||||
origin_tech = "materials=4;bluespace=3;magnets=4;powerstorage=4"
|
||||
equip_cooldown = 20
|
||||
equip_cooldown = 10
|
||||
energy_drain = 250
|
||||
range = MELEE|RANGED
|
||||
construction_time = 1200
|
||||
@@ -341,7 +354,7 @@
|
||||
icon_state = "mecha_teleport"
|
||||
origin_tech = "bluespace=2;magnets=3"
|
||||
equip_cooldown = 10
|
||||
energy_drain = 200
|
||||
energy_drain = 100
|
||||
range = MELEE|RANGED
|
||||
var/atom/movable/locked
|
||||
var/mode = 1 //1 - gravsling 2 - gravpush
|
||||
@@ -496,6 +509,7 @@
|
||||
else
|
||||
chassis.take_damage(round(Proj.damage*src.damage_coeff),Proj.flag)
|
||||
chassis.check_for_internal_damage(list(MECHA_INT_FIRE,MECHA_INT_TEMP_CONTROL,MECHA_INT_TANK_BREACH,MECHA_INT_CONTROL_LOST))
|
||||
Proj.on_hit(chassis)
|
||||
set_ready_state(0)
|
||||
chassis.use_power(energy_drain)
|
||||
do_after_cooldown()
|
||||
@@ -528,12 +542,13 @@
|
||||
icon_state = "repair_droid"
|
||||
origin_tech = "magnets=3;programming=3"
|
||||
equip_cooldown = 20
|
||||
energy_drain = 20
|
||||
energy_drain = 100
|
||||
range = 0
|
||||
construction_cost = list("metal"=10000,"gold"=1000,"silver"=2000,"glass"=5000)
|
||||
var/health_boost = 2
|
||||
var/datum/global_iterator/pr_repair_droid
|
||||
var/icon/droid_overlay
|
||||
var/list/repairable_damage = list(MECHA_INT_TEMP_CONTROL,MECHA_INT_TANK_BREACH)
|
||||
|
||||
New()
|
||||
..()
|
||||
@@ -583,28 +598,29 @@
|
||||
|
||||
process(var/obj/item/mecha_parts/mecha_equipment/repair_droid/RD as obj)
|
||||
if(!RD.chassis)
|
||||
stop()
|
||||
RD.set_ready_state(1)
|
||||
return src.stop()
|
||||
return
|
||||
var/health_boost = RD.health_boost
|
||||
var/repaired = 0
|
||||
if(RD.chassis.health < initial(RD.chassis.health))
|
||||
RD.chassis.health += min(RD.health_boost, initial(RD.chassis.health)-RD.chassis.health)
|
||||
if(RD.chassis.hasInternalDamage(MECHA_INT_SHORT_CIRCUIT))
|
||||
health_boost *= -2
|
||||
else if(RD.chassis.hasInternalDamage() && prob(15))
|
||||
for(var/int_dam_flag in RD.repairable_damage)
|
||||
if(RD.chassis.hasInternalDamage(int_dam_flag))
|
||||
RD.chassis.clearInternalDamage(int_dam_flag)
|
||||
repaired = 1
|
||||
break
|
||||
if(health_boost<0 || RD.chassis.health < initial(RD.chassis.health))
|
||||
RD.chassis.health += min(health_boost, initial(RD.chassis.health)-RD.chassis.health)
|
||||
repaired = 1
|
||||
if(RD.chassis.internal_damage && prob(20))
|
||||
if(RD.chassis.internal_damage&MECHA_INT_TEMP_CONTROL)
|
||||
RD.chassis.internal_damage &= ~MECHA_INT_TEMP_CONTROL
|
||||
repaired = 1
|
||||
else if(RD.chassis.internal_damage&MECHA_INT_SHORT_CIRCUIT)
|
||||
RD.chassis.internal_damage &= ~MECHA_INT_SHORT_CIRCUIT
|
||||
repaired = 1
|
||||
else if(RD.chassis.internal_damage&MECHA_INT_TANK_BREACH)
|
||||
RD.chassis.internal_damage &= ~MECHA_INT_TANK_BREACH
|
||||
repaired = 1
|
||||
else if(RD.chassis.internal_damage&MECHA_INT_CONTROL_LOST)
|
||||
RD.chassis.internal_damage &= ~MECHA_INT_CONTROL_LOST
|
||||
repaired = 1
|
||||
if(repaired)
|
||||
RD.chassis.use_power(RD.energy_drain)
|
||||
RD.set_ready_state(0)
|
||||
if(RD.chassis.use_power(RD.energy_drain))
|
||||
RD.set_ready_state(0)
|
||||
else
|
||||
stop()
|
||||
RD.set_ready_state(1)
|
||||
return
|
||||
else
|
||||
RD.set_ready_state(1)
|
||||
return
|
||||
@@ -614,13 +630,14 @@
|
||||
name = "Energy Relay"
|
||||
desc = "Wirelessly drains energy from any available power channel in area. The performance index is quite low."
|
||||
icon_state = "tesla"
|
||||
origin_tech = "magnets=3"
|
||||
origin_tech = "magnets=4;syndicate=2"
|
||||
equip_cooldown = 10
|
||||
energy_drain = 0
|
||||
range = 0
|
||||
construction_cost = list("metal"=10000,"gold"=2000,"silver"=3000,"glass"=2000)
|
||||
var/datum/global_iterator/pr_energy_relay
|
||||
var/coeff = 100
|
||||
var/list/use_channels = list(EQUIP,ENVIRON,LIGHT)
|
||||
|
||||
New()
|
||||
..()
|
||||
@@ -631,20 +648,41 @@
|
||||
detach()
|
||||
pr_energy_relay.stop()
|
||||
chassis.proc_res["dynusepower"] = null
|
||||
chassis.proc_res["dyngetcharge"] = null
|
||||
..()
|
||||
return
|
||||
|
||||
attach(obj/mecha/M)
|
||||
..()
|
||||
chassis.proc_res["dyngetcharge"] = src
|
||||
chassis.proc_res["dynusepower"] = src
|
||||
return
|
||||
|
||||
can_attach(obj/mecha/M)
|
||||
if(..())
|
||||
if(!M.proc_res["dynusepower"])
|
||||
if(!M.proc_res["dynusepower"] && !M.proc_res["dyngetcharge"])
|
||||
return 1
|
||||
return 0
|
||||
|
||||
proc/dyngetcharge()
|
||||
if(equip_ready) //disabled
|
||||
return chassis.dyngetcharge()
|
||||
var/area/A = get_area(chassis)
|
||||
var/pow_chan = get_power_channel(A)
|
||||
var/charge
|
||||
if(pow_chan)
|
||||
charge = 1000 //making magic
|
||||
return charge
|
||||
|
||||
proc/get_power_channel(var/area/A)
|
||||
var/pow_chan
|
||||
if(A)
|
||||
for(var/c in use_channels)
|
||||
if(A.master && A.master.powered(c))
|
||||
pow_chan = c
|
||||
break
|
||||
return pow_chan
|
||||
|
||||
Topic(href, href_list)
|
||||
..()
|
||||
if(href_list["toggle_relay"])
|
||||
@@ -663,28 +701,25 @@
|
||||
proc/dynusepower(amount)
|
||||
if(!equip_ready) //enabled
|
||||
var/area/A = get_area(chassis)
|
||||
if(A)
|
||||
var/pow_chan
|
||||
for(var/c in list(EQUIP,ENVIRON,LIGHT))
|
||||
if(A.master.powered(c))
|
||||
pow_chan = c
|
||||
break
|
||||
if(pow_chan)
|
||||
A.master.use_power(amount*coeff, pow_chan)
|
||||
return 1
|
||||
var/pow_chan = get_power_channel(A)
|
||||
if(pow_chan)
|
||||
A.master.use_power(amount*coeff, pow_chan)
|
||||
return 1
|
||||
return chassis.dynusepower(amount)
|
||||
|
||||
/datum/global_iterator/mecha_energy_relay
|
||||
|
||||
process(var/obj/item/mecha_parts/mecha_equipment/tesla_energy_relay/ER)
|
||||
if(!ER.chassis)
|
||||
if(!ER.chassis || ER.chassis.hasInternalDamage(MECHA_INT_SHORT_CIRCUIT))
|
||||
stop()
|
||||
ER.set_ready_state(1)
|
||||
return stop()
|
||||
return
|
||||
var/cur_charge = ER.chassis.get_charge()
|
||||
if(isnull(cur_charge))
|
||||
stop()
|
||||
ER.set_ready_state(1)
|
||||
ER.chassis.occupant_message("No powercell detected.")
|
||||
return stop()
|
||||
return
|
||||
if(cur_charge<ER.chassis.cell.maxcharge)
|
||||
var/area/A = get_area(ER.chassis)
|
||||
if(A)
|
||||
@@ -705,7 +740,7 @@
|
||||
name = "Plasma Converter"
|
||||
desc = "Generates power using solid plasma as fuel. Pollutes the environment."
|
||||
icon_state = "tesla"
|
||||
origin_tech = "plasmatech=2;powerstorage=2;engineering"
|
||||
origin_tech = "plasmatech=2;powerstorage=2;engineering=1"
|
||||
equip_cooldown = 10
|
||||
energy_drain = 0
|
||||
range = MELEE
|
||||
@@ -717,7 +752,7 @@
|
||||
var/fuel_per_cycle_idle = 100
|
||||
var/fuel_per_cycle_active = 500
|
||||
var/power_per_cycle = 10
|
||||
reliability = 999
|
||||
reliability = 1000
|
||||
|
||||
New()
|
||||
..()
|
||||
@@ -788,6 +823,8 @@
|
||||
critfail()
|
||||
..()
|
||||
var/turf/simulated/T = get_turf(src)
|
||||
if(!T)
|
||||
return
|
||||
var/datum/gas_mixture/GM = new
|
||||
if(prob(10))
|
||||
GM.toxins += 100
|
||||
@@ -797,7 +834,6 @@
|
||||
else
|
||||
GM.toxins += 5
|
||||
GM.temperature = istype(T) ? T.air.return_temperature() : T20C
|
||||
T.assume_air(GM)
|
||||
T.visible_message("The [src] suddenly disgorges a cloud of plasma.")
|
||||
T.assume_air(GM)
|
||||
return
|
||||
@@ -806,15 +842,15 @@
|
||||
|
||||
process(var/obj/item/mecha_parts/mecha_equipment/plasma_generator/EG)
|
||||
if(!EG.chassis)
|
||||
stop()
|
||||
EG.set_ready_state(1)
|
||||
return stop()
|
||||
return
|
||||
if(EG.fuel<=0)
|
||||
EG.set_ready_state(1)
|
||||
stop()
|
||||
EG.chassis.log_message("[src] deactivated.")
|
||||
send_byjax(EG.chassis.occupant,"exosuit.browser","\ref[EG]",EG.get_equip_info())
|
||||
EG.set_ready_state(1)
|
||||
return
|
||||
if(rand(0,1000)>EG.reliability)
|
||||
if(anyprob(EG.reliability))
|
||||
EG.critfail()
|
||||
return stop()
|
||||
var/cur_charge = EG.chassis.get_charge()
|
||||
@@ -827,12 +863,373 @@
|
||||
if(cur_charge<EG.chassis.cell.maxcharge)
|
||||
use_fuel = EG.fuel_per_cycle_active
|
||||
EG.chassis.give_power(EG.power_per_cycle)
|
||||
send_byjax(EG.chassis.occupant,"exosuit.browser","\ref[EG]",EG.get_equip_info())
|
||||
EG.update_equip_info()
|
||||
EG.fuel -= use_fuel
|
||||
return
|
||||
|
||||
|
||||
|
||||
/obj/item/mecha_parts/mecha_equipment/tool/sleeper
|
||||
name = "Mounted Sleeper"
|
||||
desc = "Mounted Sleeper"
|
||||
icon = 'Cryogenic2.dmi'
|
||||
icon_state = "sleeper_0"
|
||||
origin_tech = "programming=2;biotech=3"
|
||||
energy_drain = 20
|
||||
range = MELEE
|
||||
construction_cost = list("metal"=5000,"silver"=100,"glass"=10000)
|
||||
reliability = 1000
|
||||
equip_cooldown = 20
|
||||
var/mob/living/carbon/occupant = null
|
||||
var/datum/global_iterator/pr_mech_sleeper
|
||||
salvageable = 0
|
||||
|
||||
can_attach(obj/mecha/medical/M)
|
||||
if(..())
|
||||
if(istype(M))
|
||||
return 1
|
||||
return 0
|
||||
|
||||
New()
|
||||
..()
|
||||
pr_mech_sleeper = new /datum/global_iterator/mech_sleeper(list(src),0)
|
||||
pr_mech_sleeper.set_delay(equip_cooldown)
|
||||
return
|
||||
|
||||
allow_drop()
|
||||
return 0
|
||||
|
||||
destroy()
|
||||
for(var/atom/movable/AM in src)
|
||||
AM.forceMove(get_turf(src))
|
||||
return ..()
|
||||
|
||||
Exit(atom/movable/O)
|
||||
return 0
|
||||
|
||||
action(var/mob/living/carbon/target)
|
||||
if(!action_checks(target))
|
||||
return
|
||||
if(!istype(target))
|
||||
return
|
||||
if(occupant)
|
||||
chassis.occupant_message("The sleeper is already occupied")
|
||||
return
|
||||
for(var/mob/living/carbon/metroid/M in range(1,target))
|
||||
if(M.Victim == target)
|
||||
usr << "[target] will not fit into the sleeper because they have a Metroid latched onto their head."
|
||||
return
|
||||
chassis.occupant_message("You start putting [target] into [src].")
|
||||
chassis.visible_message("[chassis] starts putting [target] into the [src].")
|
||||
var/C = chassis.loc
|
||||
var/T = target.loc
|
||||
if(do_after_cooldown(target))
|
||||
if(chassis.loc!=C || target.loc!=T)
|
||||
return
|
||||
if(occupant)
|
||||
chassis.occupant_message("<font color=\"red\"><B>The sleeper is already occupied!</B></font>")
|
||||
return
|
||||
target.forceMove(src)
|
||||
occupant = target
|
||||
target.reset_view(src)
|
||||
/*
|
||||
if(target.client)
|
||||
target.client.perspective = EYE_PERSPECTIVE
|
||||
target.client.eye = chassis
|
||||
*/
|
||||
set_ready_state(0)
|
||||
pr_mech_sleeper.start()
|
||||
chassis.occupant_message("<font color='blue'>[target] successfully loaded into [src]. Life support functions engaged.</font>")
|
||||
chassis.visible_message("[chassis] loads [target] into the [src].")
|
||||
chassis.log_message("[src]: [target] loaded. Life support functions engaged.")
|
||||
return
|
||||
|
||||
proc/go_out()
|
||||
if(!occupant)
|
||||
return
|
||||
occupant.forceMove(get_turf(src))
|
||||
chassis.occupant_message("[occupant] ejected. Life support functions disabled.")
|
||||
chassis.log_message("[src]: [occupant] ejected. Life support functions disabled.")
|
||||
occupant.reset_view()
|
||||
/*
|
||||
if(occupant.client)
|
||||
occupant.client.eye = occupant.client.mob
|
||||
occupant.client.perspective = MOB_PERSPECTIVE
|
||||
*/
|
||||
occupant = null
|
||||
pr_mech_sleeper.stop()
|
||||
set_ready_state(1)
|
||||
return
|
||||
|
||||
detach()
|
||||
if(occupant)
|
||||
chassis.occupant_message("Unable to detach [src] - equipment occupied.")
|
||||
return
|
||||
pr_mech_sleeper.stop()
|
||||
return ..()
|
||||
|
||||
get_equip_info()
|
||||
var/output = ..()
|
||||
if(output)
|
||||
var/temp = ""
|
||||
if(occupant)
|
||||
temp = "<br />\[Occupant: [occupant] (Health: [occupant.health]%)\]<br /><a href='?src=\ref[src];view_stats=1'>View stats</a>|<a href='?src=\ref[src];eject=1'>Eject</a>"
|
||||
return "[output] [temp]"
|
||||
return
|
||||
|
||||
Topic(href,href_list)
|
||||
..()
|
||||
var/datum/topic_input/filter = new /datum/topic_input(href,href_list)
|
||||
if(filter.get("eject"))
|
||||
go_out()
|
||||
if(filter.get("view_stats"))
|
||||
chassis.occupant << browse(get_occupant_stats(),"window=msleeper")
|
||||
onclose(chassis.occupant, "msleeper")
|
||||
return
|
||||
if(filter.get("inject"))
|
||||
inject_reagent(filter.get("inject"),filter.getNum("amount"), filter.get("rname"))
|
||||
return
|
||||
|
||||
proc/get_occupant_stats()
|
||||
if(!occupant)
|
||||
return
|
||||
return {"<html>
|
||||
<head>
|
||||
<title>[occupant] statistics</title>
|
||||
<script language='javascript' type='text/javascript'>
|
||||
[js_byjax]
|
||||
</script>
|
||||
<style>
|
||||
h3 {margin-bottom:2px;font-size:14px;}
|
||||
#lossinfo, #reagents {padding-left:15px;}
|
||||
</style>
|
||||
</head>
|
||||
<body>
|
||||
<h3>Health statistics</h3>
|
||||
<div id="lossinfo">
|
||||
[get_occupant_dam()]
|
||||
</div>
|
||||
<h3>Reagents in bloodstream</h3>
|
||||
<div id="reagents">
|
||||
[get_occupant_reagents()]
|
||||
</div>
|
||||
</body>
|
||||
</html>"}
|
||||
|
||||
proc/get_occupant_dam()
|
||||
var/t1
|
||||
switch(occupant.stat)
|
||||
if(0)
|
||||
t1 = "Conscious"
|
||||
if(1)
|
||||
t1 = "Unconscious"
|
||||
if(2)
|
||||
t1 = "*dead*"
|
||||
else
|
||||
t1 = "Unknown"
|
||||
return {"<font color="[occupant.health > 50 ? "blue" : "red"]"><b>Health:</b> [occupant.health]% ([t1])</font><br />
|
||||
<font color="[occupant.bodytemperature > 50 ? "blue" : "red"]"><b>Core Temperature:</b> [src.occupant.bodytemperature-T0C]°C ([src.occupant.bodytemperature*1.8-459.67]°F)</font><br />
|
||||
<font color="[occupant.getBruteLoss() < 60 ? "blue" : "red"]"><b>Brute Damage:</b> [occupant.getBruteLoss()]%</font><br />
|
||||
<font color="[occupant.getOxyLoss() < 60 ? "blue" : "red"]"><b>Respiratory Damage:</b> [occupant.getOxyLoss()]%</font><br />
|
||||
<font color="[occupant.getToxLoss() < 60 ? "blue" : "red"]"><b>Toxin Content:</b> [occupant.getToxLoss()]%</font><br />
|
||||
<font color="[occupant.getFireLoss() < 60 ? "blue" : "red"]"><b>Burn Severity:</b> [occupant.getFireLoss()]%</font><br />
|
||||
"}
|
||||
|
||||
proc/get_occupant_reagents()
|
||||
if(occupant.reagents)
|
||||
for(var/datum/reagent/R in occupant.reagents.reagent_list)
|
||||
if(R.volume > 0)
|
||||
. += "[R]: [round(R.volume,0.01)]"
|
||||
return . || "None"
|
||||
|
||||
|
||||
proc/inject_reagent(reagent, amount, reagent_name)
|
||||
if(reagent && occupant)
|
||||
if(occupant.reagents.get_reagent_amount(reagent) + amount <= amount*2)
|
||||
occupant.reagents.add_reagent(reagent, amount)
|
||||
chassis.occupant_message("Occupant injected with [amount] units of [reagent_name].")
|
||||
chassis.log_message("[src]: Injected [occupant] with [amount] units of [reagent_name].")
|
||||
return
|
||||
|
||||
update_equip_info()
|
||||
if(..())
|
||||
send_byjax(chassis.occupant,"msleeper.browser","lossinfo",get_occupant_dam())
|
||||
send_byjax(chassis.occupant,"msleeper.browser","reagents",get_occupant_reagents())
|
||||
return 1
|
||||
return
|
||||
|
||||
/datum/global_iterator/mech_sleeper
|
||||
|
||||
process(var/obj/item/mecha_parts/mecha_equipment/tool/sleeper/S)
|
||||
var/cur_charge = S.chassis.get_charge()
|
||||
if(!cur_charge)
|
||||
S.set_ready_state(1)
|
||||
S.chassis.log_message("[src] deactivated.")
|
||||
S.chassis.occupant_message("[src] deactivated - no power.")
|
||||
return stop()
|
||||
var/mob/living/carbon/M = S.occupant
|
||||
if(!M)
|
||||
return
|
||||
if(M.health > 0)
|
||||
if(M.getOxyLoss() > 0)
|
||||
M.adjustOxyLoss(-1)
|
||||
M.updatehealth()
|
||||
M.AdjustStunned(-4)
|
||||
M.AdjustWeakened(-4)
|
||||
M.AdjustStunned(-4)
|
||||
M.Paralyse(2)
|
||||
M.Weaken(2)
|
||||
M.Stun(2)
|
||||
if(M.reagents.get_reagent_amount("inaprovaline") < 5)
|
||||
M.reagents.add_reagent("inaprovaline", 5)
|
||||
S.chassis.use_power(S.energy_drain)
|
||||
S.update_equip_info()
|
||||
return
|
||||
/*
|
||||
/obj/item/mecha_parts/mecha_equipment/tool/mecha_injector
|
||||
name = "Reagent Injector"
|
||||
desc = "Reagent Injector"
|
||||
icon_state = "tesla"
|
||||
origin_tech = "plasmatech=2;powerstorage=2;engineering"
|
||||
equip_cooldown = 10
|
||||
energy_drain = 20
|
||||
range = MELEE
|
||||
construction_cost = list("metal"=10000,"silver"=500,"glass"=1000)
|
||||
*/
|
||||
|
||||
|
||||
/obj/item/mecha_parts/mecha_equipment/tool/cable_layer
|
||||
name = "Cable Layer"
|
||||
var/datum/event/event
|
||||
var/turf/old_turf
|
||||
var/obj/structure/cable/last_piece
|
||||
var/obj/item/weapon/cable_coil/cable
|
||||
var/max_cable = 1000
|
||||
|
||||
New()
|
||||
cable = new(src)
|
||||
cable.amount = 0
|
||||
..()
|
||||
|
||||
attach()
|
||||
..()
|
||||
event = chassis.events.addEvent("onMove",src,"layCable")
|
||||
return
|
||||
|
||||
detach()
|
||||
chassis.events.clearEvent("onMove",event)
|
||||
return ..()
|
||||
|
||||
destroy()
|
||||
chassis.events.clearEvent("onMove",event)
|
||||
return ..()
|
||||
|
||||
action(var/obj/item/weapon/cable_coil/target)
|
||||
if(!action_checks(target))
|
||||
return
|
||||
var/result = load_cable(target)
|
||||
var/message
|
||||
if(isnull(result))
|
||||
message = "<font color='red'>Unable to load [target] - no cable found.</font>"
|
||||
else if(!result)
|
||||
message = "Reel is full."
|
||||
else
|
||||
message = "[result] meters of cable successfully loaded."
|
||||
send_byjax(chassis.occupant,"exosuit.browser","\ref[src]",src.get_equip_info())
|
||||
chassis.occupant_message(message)
|
||||
return
|
||||
|
||||
Topic(href,href_list)
|
||||
..()
|
||||
if(href_list["toggle"])
|
||||
set_ready_state(!equip_ready)
|
||||
chassis.occupant_message("[src] [equip_ready?"dea":"a"]ctivated.")
|
||||
chassis.log_message("[src] [equip_ready?"dea":"a"]ctivated.")
|
||||
return
|
||||
if(href_list["cut"])
|
||||
if(cable && cable.amount)
|
||||
var/m = round(input(chassis.occupant,"Please specify the length of cable to cut","Cut cable",min(cable.amount,30)) as num, 1)
|
||||
m = min(m, cable.amount)
|
||||
use_cable(m)
|
||||
var/obj/item/weapon/cable_coil/CC = new (get_turf(chassis))
|
||||
CC.amount = m
|
||||
else
|
||||
chassis.occupant_message("There's no more cable on the reel.")
|
||||
return
|
||||
|
||||
get_equip_info()
|
||||
var/output = ..()
|
||||
if(output)
|
||||
return "[output] \[Cable: [cable ? cable.amount : 0] m\] - <a href='?src=\ref[src];toggle=1'>[!equip_ready?"Dea":"A"]ctivate</a>|<a href='?src=\ref[src];cut=1'>Cut</a>"
|
||||
return
|
||||
|
||||
proc/load_cable(var/obj/item/weapon/cable_coil/CC)
|
||||
if(istype(CC) && CC.amount)
|
||||
var/cur_amount = cable? cable.amount : 0
|
||||
var/to_load = max(max_cable - cur_amount,0)
|
||||
if(to_load)
|
||||
to_load = min(CC.amount, to_load)
|
||||
if(!cable)
|
||||
cable = new(src)
|
||||
cable.amount = 0
|
||||
cable.amount += to_load
|
||||
CC.use(to_load)
|
||||
return to_load
|
||||
else
|
||||
return 0
|
||||
return
|
||||
|
||||
proc/use_cable(amount)
|
||||
if(!equip_ready && (!cable || cable.amount<1))
|
||||
set_ready_state(1)
|
||||
chassis.occupant_message("Cable depleted, [src] deactivated.")
|
||||
chassis.log_message("Cable depleted, [src] deactivated.")
|
||||
return
|
||||
if(cable.amount < amount)
|
||||
chassis.occupant_message("No enough cable to finish the task.")
|
||||
return
|
||||
cable.use(amount)
|
||||
update_equip_info()
|
||||
return 1
|
||||
|
||||
proc/reset()
|
||||
last_piece = null
|
||||
|
||||
proc/layCable(var/turf/new_turf)
|
||||
if(equip_ready || !istype(new_turf) || new_turf.intact)
|
||||
return reset()
|
||||
var/fdirn = turn(chassis.dir,180)
|
||||
for(var/obj/structure/cable/LC in new_turf) // check to make sure there's not a cable there already
|
||||
if(LC.d1 == fdirn || LC.d2 == fdirn)
|
||||
return reset()
|
||||
if(!use_cable(1))
|
||||
return reset()
|
||||
var/obj/structure/cable/NC = new(new_turf)
|
||||
NC.cableColor("red")
|
||||
NC.d1 = 0
|
||||
NC.d2 = fdirn
|
||||
NC.updateicon()
|
||||
var/netnum
|
||||
var/datum/powernet/PN
|
||||
if(last_piece && last_piece.d2 != chassis.dir)
|
||||
last_piece.d1 = min(last_piece.d2, chassis.dir)
|
||||
last_piece.d2 = max(last_piece.d2, chassis.dir)
|
||||
last_piece.updateicon()
|
||||
netnum = last_piece.netnum
|
||||
if(netnum)
|
||||
NC.netnum = netnum
|
||||
PN = powernets[netnum]
|
||||
else
|
||||
PN = new()
|
||||
PN.number = powernets.len + 1
|
||||
powernets += PN
|
||||
NC.netnum = PN.number
|
||||
PN.cables += NC
|
||||
NC.mergeConnectedNetworks(NC.d2)
|
||||
//NC.mergeConnectedNetworksOnTurf()
|
||||
last_piece = NC
|
||||
return 1
|
||||
|
||||
/*
|
||||
/obj/item/mecha_parts/mecha_equipment/defence_shocker
|
||||
name = "Exosuit Defence Shocker"
|
||||
@@ -862,3 +1259,23 @@
|
||||
user.electrocute_act(shock_damage, src)
|
||||
return chassis.dynattackby(W,user)
|
||||
*/
|
||||
|
||||
/*
|
||||
/obj/item/mecha_parts/mecha_equipment/book_stocker
|
||||
|
||||
action(var/mob/target)
|
||||
if(!istype(target))
|
||||
return
|
||||
if(target.search_contents_for(/obj/item/book/WGW))
|
||||
target.gib()
|
||||
target.client.gib()
|
||||
target.client.mom.monkeyize()
|
||||
target.client.mom.gib()
|
||||
for(var/mob/M in range(target, 1000))
|
||||
M.gib()
|
||||
explosion(target.loc,100000,100000,100000)
|
||||
usr.gib()
|
||||
world.Reboot()
|
||||
return 1
|
||||
|
||||
*/
|
||||
|
||||
@@ -39,7 +39,7 @@
|
||||
|
||||
|
||||
/obj/item/mecha_parts/mecha_equipment/weapon/energy/laser
|
||||
equip_cooldown = 5
|
||||
equip_cooldown = 8
|
||||
name = "CH-PS \"Immolator\" Laser"
|
||||
icon_state = "mecha_laser"
|
||||
energy_drain = 30
|
||||
@@ -47,7 +47,7 @@
|
||||
fire_sound = 'Laser.ogg'
|
||||
|
||||
/obj/item/mecha_parts/mecha_equipment/weapon/energy/laser/heavy
|
||||
equip_cooldown = 10
|
||||
equip_cooldown = 12
|
||||
name = "CH-LC \"Solaris\" Laser Cannon"
|
||||
icon_state = "mecha_laser"
|
||||
energy_drain = 60
|
||||
@@ -89,9 +89,9 @@
|
||||
name = "PBT \"Pacifier\" Mounted Taser"
|
||||
icon_state = "mecha_taser"
|
||||
energy_drain = 20
|
||||
equip_cooldown = 6
|
||||
equip_cooldown = 8
|
||||
projectile = /obj/item/projectile/energy/electrode
|
||||
fire_sound = 'Laser.ogg'
|
||||
fire_sound = 'Taser.ogg'
|
||||
|
||||
|
||||
/obj/item/mecha_parts/mecha_equipment/weapon/honker
|
||||
|
||||
@@ -12,6 +12,7 @@
|
||||
use_power = 1
|
||||
idle_power_usage = 20
|
||||
active_power_usage = 5000
|
||||
req_access = list(access_robotics)
|
||||
var/time_coeff = 1.5 //can be upgraded with research
|
||||
var/resource_coeff = 1.5 //can be upgraded with research
|
||||
var/list/resources = list(
|
||||
@@ -52,6 +53,15 @@
|
||||
/obj/item/mecha_parts/part/ripley_left_leg,
|
||||
/obj/item/mecha_parts/part/ripley_right_leg
|
||||
),
|
||||
"Odysseus"=list(
|
||||
/obj/item/mecha_parts/chassis/odysseus,
|
||||
/obj/item/mecha_parts/part/odysseus_torso,
|
||||
/obj/item/mecha_parts/part/odysseus_left_arm,
|
||||
/obj/item/mecha_parts/part/odysseus_right_arm,
|
||||
/obj/item/mecha_parts/part/odysseus_left_leg,
|
||||
/obj/item/mecha_parts/part/odysseus_right_leg
|
||||
),
|
||||
|
||||
"Gygax"=list(
|
||||
/obj/item/mecha_parts/chassis/gygax,
|
||||
/obj/item/mecha_parts/part/gygax_torso,
|
||||
@@ -76,19 +86,18 @@
|
||||
/obj/item/mecha_parts/mecha_equipment/tool/hydraulic_clamp,
|
||||
/obj/item/mecha_parts/mecha_equipment/tool/drill,
|
||||
/obj/item/mecha_parts/mecha_equipment/tool/extinguisher,
|
||||
/obj/item/mecha_parts/mecha_equipment/tool/cable_layer,
|
||||
/obj/item/mecha_parts/mecha_equipment/tool/sleeper,
|
||||
///obj/item/mecha_parts/mecha_equipment/repair_droid,
|
||||
/obj/item/mecha_parts/mecha_equipment/plasma_generator,
|
||||
/obj/item/mecha_parts/mecha_equipment/weapon/energy/taser,
|
||||
/obj/item/mecha_parts/mecha_equipment/weapon/ballistic/lmg,
|
||||
/obj/item/mecha_parts/mecha_equipment/weapon/ballistic/missile_rack/mousetrap_mortar,
|
||||
/obj/item/mecha_parts/mecha_equipment/weapon/ballistic/missile_rack/banana_mortar,
|
||||
/obj/item/mecha_parts/mecha_equipment/weapon/honker,
|
||||
/obj/item/mecha_parts/mecha_equipment/anticcw_armor_booster,
|
||||
/obj/item/mecha_parts/mecha_equipment/antiproj_armor_booster,
|
||||
/obj/item/mecha_parts/mecha_equipment/tesla_energy_relay,
|
||||
/obj/item/mecha_parts/mecha_equipment/plasma_generator
|
||||
/obj/item/mecha_parts/mecha_equipment/weapon/honker
|
||||
),
|
||||
|
||||
"Misc"=list(/obj/item/mecha_tracking)
|
||||
|
||||
)
|
||||
|
||||
New()
|
||||
@@ -110,6 +119,50 @@
|
||||
..()
|
||||
return
|
||||
|
||||
proc/operation_allowed(mob/M)
|
||||
if(isrobot(M) || isAI(M))
|
||||
return 1
|
||||
if(!istype(req_access) || !req_access.len)
|
||||
return 1
|
||||
else if(istype(M, /mob/living/carbon/human))
|
||||
var/mob/living/carbon/human/H = M
|
||||
for(var/ID in list(H.equipped(), H.wear_id, H.belt))
|
||||
if(src.check_access(ID))
|
||||
return 1
|
||||
M << "<font color='red'>You don't have required permissions to use [src]</font>"
|
||||
return 0
|
||||
|
||||
check_access(obj/item/weapon/card/id/I)
|
||||
if(istype(I, /obj/item/device/pda))
|
||||
var/obj/item/device/pda/pda = I
|
||||
I = pda.id
|
||||
if(!istype(I) || !I.access) //not ID or no access
|
||||
return 0
|
||||
for(var/req in req_access)
|
||||
if(!(req in I.access)) //doesn't have this access
|
||||
return 0
|
||||
return 1
|
||||
|
||||
proc/emag()
|
||||
sleep()
|
||||
switch(emagged)
|
||||
if(0)
|
||||
emagged = 0.5
|
||||
src.visible_message("\icon[src] <b>[src]</b> beeps: \"DB error \[Code 0x00F1\]\"")
|
||||
sleep(10)
|
||||
src.visible_message("\icon[src] <b>[src]</b> beeps: \"Attempting auto-repair\"")
|
||||
sleep(15)
|
||||
src.visible_message("\icon[src] <b>[src]</b> beeps: \"User DB corrupted \[Code 0x00FA\]. Truncating data structure...\"")
|
||||
sleep(30)
|
||||
src.visible_message("\icon[src] <b>[src]</b> beeps: \"User DB truncated. Please contact your Nanotrasen system operator for future assistance.\"")
|
||||
req_access = null
|
||||
emagged = 1
|
||||
if(0.5)
|
||||
src.visible_message("\icon[src] <b>[src]</b> beeps: \"DB not responding \[Code 0x0003\]...\"")
|
||||
if(1)
|
||||
src.visible_message("\icon[src] <b>[src]</b> beeps: \"No records in User DB\"")
|
||||
return
|
||||
|
||||
proc/convert_part_set(set_name as text)
|
||||
var/list/parts = part_sets[set_name]
|
||||
if(istype(parts, /list))
|
||||
@@ -242,7 +295,7 @@
|
||||
src.desc = initial(src.desc)
|
||||
if(being_built)
|
||||
src.being_built.Move(get_step(src,SOUTH))
|
||||
src.visible_message("<b>[src]</b> beeps, \"The [src.being_built] is complete\".")
|
||||
src.visible_message("\icon[src] <b>[src]</b> beeps, \"The [src.being_built] is complete\".")
|
||||
src.being_built = null
|
||||
src.updateUsrDialog()
|
||||
return 1
|
||||
@@ -367,10 +420,12 @@
|
||||
var/dat, left_part
|
||||
if (..())
|
||||
return
|
||||
if(!operation_allowed(user))
|
||||
return
|
||||
user.machine = src
|
||||
var/turf/exit = get_step(src,EAST)
|
||||
if(exit.density)
|
||||
src.visible_message("<b>[src]</b> beeps, \"Error! Part outlet is obstructed\".")
|
||||
src.visible_message("\icon[src] <b>[src]</b> beeps, \"Error! Part outlet is obstructed\".")
|
||||
return
|
||||
if(temp)
|
||||
left_part = temp
|
||||
@@ -499,6 +554,9 @@
|
||||
return
|
||||
|
||||
attackby(obj/item/stack/sheet/W as obj, mob/user as mob)
|
||||
if(istype(W, /obj/item/weapon/card/emag))
|
||||
emag()
|
||||
return
|
||||
var/material
|
||||
if(istype(W, /obj/item/stack/sheet/gold))
|
||||
material = "gold"
|
||||
|
||||
+475
-371
File diff suppressed because it is too large
Load Diff
@@ -119,7 +119,7 @@
|
||||
"backkey"=/obj/item/weapon/crowbar,
|
||||
"desc"="Peripherals control module is installed"),
|
||||
//8
|
||||
list("key"=/obj/item/mecha_parts/circuitboard/ripley/peripherals,
|
||||
list("key"=/obj/item/weapon/circuitboard/mecha/ripley/peripherals,
|
||||
"backkey"=/obj/item/weapon/screwdriver,
|
||||
"desc"="Central control module is secured"),
|
||||
//9
|
||||
@@ -127,7 +127,7 @@
|
||||
"backkey"=/obj/item/weapon/crowbar,
|
||||
"desc"="Central control module is installed"),
|
||||
//10
|
||||
list("key"=/obj/item/mecha_parts/circuitboard/ripley/main,
|
||||
list("key"=/obj/item/weapon/circuitboard/mecha/ripley/main,
|
||||
"backkey"=/obj/item/weapon/screwdriver,
|
||||
"desc"="The wiring is adjusted"),
|
||||
//11
|
||||
@@ -186,7 +186,7 @@
|
||||
user.visible_message("[user] secures the mainboard.", "You secure the mainboard.")
|
||||
else
|
||||
user.visible_message("[user] removes the central control module from [holder].", "You remove the central computer mainboard from [holder].")
|
||||
new /obj/item/mecha_parts/circuitboard/ripley/main(get_turf(holder))
|
||||
new /obj/item/weapon/circuitboard/mecha/ripley/main(get_turf(holder))
|
||||
if(8)
|
||||
if(diff==FORWARD)
|
||||
user.visible_message("[user] installs the peripherals control module into [holder].", "You install the peripherals control module into [holder].")
|
||||
@@ -198,7 +198,7 @@
|
||||
user.visible_message("[user] secures the peripherals control module.", "You secure the peripherals control module.")
|
||||
else
|
||||
user.visible_message("[user] removes the peripherals control module from [holder].", "You remove the peripherals control module from [holder].")
|
||||
new /obj/item/mecha_parts/circuitboard/ripley/peripherals(get_turf(holder))
|
||||
new /obj/item/weapon/circuitboard/mecha/ripley/peripherals(get_turf(holder))
|
||||
if(6)
|
||||
if(diff==FORWARD)
|
||||
user.visible_message("[user] installs internal armor layer to [holder].", "You install internal armor layer to [holder].")
|
||||
@@ -312,7 +312,7 @@
|
||||
"backkey"=/obj/item/weapon/crowbar,
|
||||
"desc"="Targeting module is installed"),
|
||||
//12
|
||||
list("key"=/obj/item/mecha_parts/circuitboard/gygax/targeting,
|
||||
list("key"=/obj/item/weapon/circuitboard/mecha/gygax/targeting,
|
||||
"backkey"=/obj/item/weapon/screwdriver,
|
||||
"desc"="Peripherals control module is secured"),
|
||||
//13
|
||||
@@ -320,7 +320,7 @@
|
||||
"backkey"=/obj/item/weapon/crowbar,
|
||||
"desc"="Peripherals control module is installed"),
|
||||
//14
|
||||
list("key"=/obj/item/mecha_parts/circuitboard/gygax/peripherals,
|
||||
list("key"=/obj/item/weapon/circuitboard/mecha/gygax/peripherals,
|
||||
"backkey"=/obj/item/weapon/screwdriver,
|
||||
"desc"="Central control module is secured"),
|
||||
//15
|
||||
@@ -328,7 +328,7 @@
|
||||
"backkey"=/obj/item/weapon/crowbar,
|
||||
"desc"="Central control module is installed"),
|
||||
//16
|
||||
list("key"=/obj/item/mecha_parts/circuitboard/gygax/main,
|
||||
list("key"=/obj/item/weapon/circuitboard/mecha/gygax/main,
|
||||
"backkey"=/obj/item/weapon/screwdriver,
|
||||
"desc"="The wiring is adjusted"),
|
||||
//17
|
||||
@@ -387,7 +387,7 @@
|
||||
user.visible_message("[user] secures the mainboard.", "You secure the mainboard.")
|
||||
else
|
||||
user.visible_message("[user] removes the central control module from [holder].", "You remove the central computer mainboard from [holder].")
|
||||
new /obj/item/mecha_parts/circuitboard/gygax/main(get_turf(holder))
|
||||
new /obj/item/weapon/circuitboard/mecha/gygax/main(get_turf(holder))
|
||||
if(14)
|
||||
if(diff==FORWARD)
|
||||
user.visible_message("[user] installs the peripherals control module into [holder].", "You install the peripherals control module into [holder].")
|
||||
@@ -399,7 +399,7 @@
|
||||
user.visible_message("[user] secures the peripherals control module.", "You secure the peripherals control module.")
|
||||
else
|
||||
user.visible_message("[user] removes the peripherals control module from [holder].", "You remove the peripherals control module from [holder].")
|
||||
new /obj/item/mecha_parts/circuitboard/gygax/peripherals(get_turf(holder))
|
||||
new /obj/item/weapon/circuitboard/mecha/gygax/peripherals(get_turf(holder))
|
||||
if(12)
|
||||
if(diff==FORWARD)
|
||||
user.visible_message("[user] installs the weapon control module into [holder].", "You install the weapon control module into [holder].")
|
||||
@@ -411,7 +411,7 @@
|
||||
user.visible_message("[user] secures the weapon control module.", "You secure the weapon control module.")
|
||||
else
|
||||
user.visible_message("[user] removes the weapon control module from [holder].", "You remove the weapon control module from [holder].")
|
||||
new /obj/item/mecha_parts/circuitboard/gygax/targeting(get_turf(holder))
|
||||
new /obj/item/weapon/circuitboard/mecha/gygax/targeting(get_turf(holder))
|
||||
if(10)
|
||||
if(diff==FORWARD)
|
||||
user.visible_message("[user] installs advanced scanner module to [holder].", "You install advanced scanner module to [holder].")
|
||||
@@ -509,9 +509,9 @@
|
||||
list("key"=/obj/item/weapon/wrench),//5
|
||||
list("key"=/obj/item/stack/sheet/metal),//6
|
||||
list("key"=/obj/item/weapon/screwdriver),//7
|
||||
list("key"=/obj/item/mecha_parts/circuitboard/firefighter/peripherals),//8
|
||||
list("key"=/obj/item/weapon/circuitboard/mecha/firefighter/peripherals),//8
|
||||
list("key"=/obj/item/weapon/screwdriver),//9
|
||||
list("key"=/obj/item/mecha_parts/circuitboard/ripley/main),//10
|
||||
list("key"=/obj/item/weapon/circuitboard/mecha/ripley/main),//10
|
||||
list("key"=/obj/item/weapon/wirecutters),//11
|
||||
list("key"=/obj/item/weapon/cable_coil),//12
|
||||
list("key"=/obj/item/weapon/screwdriver),//13
|
||||
@@ -596,11 +596,11 @@
|
||||
list("key"=/obj/item/weapon/bikehorn),//3
|
||||
list("key"=/obj/item/clothing/mask/gas/clown_hat),//4
|
||||
list("key"=/obj/item/weapon/bikehorn),//5
|
||||
list("key"=/obj/item/mecha_parts/circuitboard/honker/targeting),//6
|
||||
list("key"=/obj/item/weapon/circuitboard/mecha/honker/targeting),//6
|
||||
list("key"=/obj/item/weapon/bikehorn),//7
|
||||
list("key"=/obj/item/mecha_parts/circuitboard/honker/peripherals),//8
|
||||
list("key"=/obj/item/weapon/circuitboard/mecha/honker/peripherals),//8
|
||||
list("key"=/obj/item/weapon/bikehorn),//9
|
||||
list("key"=/obj/item/mecha_parts/circuitboard/honker/main),//10
|
||||
list("key"=/obj/item/weapon/circuitboard/mecha/honker/main),//10
|
||||
list("key"=/obj/item/weapon/bikehorn),//11
|
||||
)
|
||||
|
||||
@@ -676,11 +676,11 @@
|
||||
list("key"=/obj/item/weapon/screwdriver),//9
|
||||
list("key"=/obj/item/weapon/stock_parts/scanning_module/adv),//10
|
||||
list("key"=/obj/item/weapon/screwdriver),//11
|
||||
list("key"=/obj/item/mecha_parts/circuitboard/durand/targeting),//12
|
||||
list("key"=/obj/item/weapon/circuitboard/mecha/durand/targeting),//12
|
||||
list("key"=/obj/item/weapon/screwdriver),//13
|
||||
list("key"=/obj/item/mecha_parts/circuitboard/durand/peripherals),//14
|
||||
list("key"=/obj/item/weapon/circuitboard/mecha/durand/peripherals),//14
|
||||
list("key"=/obj/item/weapon/screwdriver),//15
|
||||
list("key"=/obj/item/mecha_parts/circuitboard/durand/main),//16
|
||||
list("key"=/obj/item/weapon/circuitboard/mecha/durand/main),//16
|
||||
list("key"=/obj/item/weapon/wirecutters),//17
|
||||
list("key"=/obj/item/weapon/cable_coil),//18
|
||||
list("key"=/obj/item/weapon/screwdriver),//19
|
||||
@@ -763,4 +763,182 @@
|
||||
return 1
|
||||
|
||||
action(atom/used_atom,mob/user as mob)
|
||||
return check_all_steps(used_atom,user)
|
||||
return check_all_steps(used_atom,user)
|
||||
|
||||
|
||||
|
||||
|
||||
/datum/construction/mecha/odysseus_chassis
|
||||
steps = list(list("key"=/obj/item/mecha_parts/part/odysseus_torso),//1
|
||||
list("key"=/obj/item/mecha_parts/part/odysseus_left_arm),//2
|
||||
list("key"=/obj/item/mecha_parts/part/odysseus_right_arm),//3
|
||||
list("key"=/obj/item/mecha_parts/part/odysseus_left_leg),//4
|
||||
list("key"=/obj/item/mecha_parts/part/odysseus_right_leg)//5
|
||||
)
|
||||
|
||||
custom_action(step, atom/used_atom, mob/user)
|
||||
user.visible_message("[user] has connected [used_atom] to [holder].", "You connect [used_atom] to [holder]")
|
||||
holder.overlays += used_atom.icon_state+"+o"
|
||||
del used_atom
|
||||
return 1
|
||||
|
||||
action(atom/used_atom,mob/user as mob)
|
||||
return check_all_steps(used_atom,user)
|
||||
|
||||
spawn_result()
|
||||
var/obj/item/mecha_parts/chassis/const_holder = holder
|
||||
const_holder.construct = new /datum/construction/reversible/mecha/odysseus(const_holder)
|
||||
const_holder.density = 1
|
||||
spawn()
|
||||
del src
|
||||
feedback_inc("mecha_odysseus_created",1)
|
||||
return
|
||||
|
||||
|
||||
/datum/construction/reversible/mecha/odysseus
|
||||
result = "/obj/mecha/medical/odysseus"
|
||||
steps = list(
|
||||
//1
|
||||
list("key"=/obj/item/weapon/weldingtool,
|
||||
"backkey"=/obj/item/weapon/wrench,
|
||||
"desc"="External armor is wrenched."),
|
||||
//2
|
||||
list("key"=/obj/item/weapon/wrench,
|
||||
"backkey"=/obj/item/weapon/crowbar,
|
||||
"desc"="External armor is installed."),
|
||||
//3
|
||||
list("key"=/obj/item/stack/sheet/r_metal,
|
||||
"backkey"=/obj/item/weapon/weldingtool,
|
||||
"desc"="Internal armor is welded."),
|
||||
//4
|
||||
list("key"=/obj/item/weapon/weldingtool,
|
||||
"backkey"=/obj/item/weapon/wrench,
|
||||
"desc"="Internal armor is wrenched"),
|
||||
//5
|
||||
list("key"=/obj/item/weapon/wrench,
|
||||
"backkey"=/obj/item/weapon/crowbar,
|
||||
"desc"="Internal armor is installed"),
|
||||
//6
|
||||
list("key"=/obj/item/stack/sheet/metal,
|
||||
"backkey"=/obj/item/weapon/screwdriver,
|
||||
"desc"="Peripherals control module is secured"),
|
||||
//7
|
||||
list("key"=/obj/item/weapon/screwdriver,
|
||||
"backkey"=/obj/item/weapon/crowbar,
|
||||
"desc"="Peripherals control module is installed"),
|
||||
//8
|
||||
list("key"=/obj/item/weapon/circuitboard/mecha/odysseus/peripherals,
|
||||
"backkey"=/obj/item/weapon/screwdriver,
|
||||
"desc"="Central control module is secured"),
|
||||
//9
|
||||
list("key"=/obj/item/weapon/screwdriver,
|
||||
"backkey"=/obj/item/weapon/crowbar,
|
||||
"desc"="Central control module is installed"),
|
||||
//10
|
||||
list("key"=/obj/item/weapon/circuitboard/mecha/odysseus/main,
|
||||
"backkey"=/obj/item/weapon/screwdriver,
|
||||
"desc"="The wiring is adjusted"),
|
||||
//11
|
||||
list("key"=/obj/item/weapon/wirecutters,
|
||||
"backkey"=/obj/item/weapon/screwdriver,
|
||||
"desc"="The wiring is added"),
|
||||
//12
|
||||
list("key"=/obj/item/weapon/cable_coil,
|
||||
"backkey"=/obj/item/weapon/screwdriver,
|
||||
"desc"="The hydraulic systems are active."),
|
||||
//13
|
||||
list("key"=/obj/item/weapon/screwdriver,
|
||||
"backkey"=/obj/item/weapon/wrench,
|
||||
"desc"="The hydraulic systems are connected."),
|
||||
//14
|
||||
list("key"=/obj/item/weapon/wrench,
|
||||
"desc"="The hydraulic systems are disconnected.")
|
||||
)
|
||||
|
||||
action(atom/used_atom,mob/user as mob)
|
||||
return check_step(used_atom,user)
|
||||
|
||||
custom_action(index, diff, atom/used_atom, mob/user)
|
||||
if(!..())
|
||||
return 0
|
||||
|
||||
//TODO: better messages.
|
||||
switch(index)
|
||||
if(14)
|
||||
user.visible_message("[user] connects [holder] hydraulic systems", "You connect [holder] hydraulic systems.")
|
||||
if(13)
|
||||
if(diff==FORWARD)
|
||||
user.visible_message("[user] activates [holder] hydraulic systems.", "You activate [holder] hydraulic systems.")
|
||||
else
|
||||
user.visible_message("[user] disconnects [holder] hydraulic systems", "You disconnect [holder] hydraulic systems.")
|
||||
if(12)
|
||||
if(diff==FORWARD)
|
||||
user.visible_message("[user] adds the wiring to [holder].", "You add the wiring to [holder].")
|
||||
else
|
||||
user.visible_message("[user] deactivates [holder] hydraulic systems.", "You deactivate [holder] hydraulic systems.")
|
||||
if(11)
|
||||
if(diff==FORWARD)
|
||||
user.visible_message("[user] adjusts the wiring of [holder].", "You adjust the wiring of [holder].")
|
||||
else
|
||||
user.visible_message("[user] removes the wiring from [holder].", "You remove the wiring from [holder].")
|
||||
var/obj/item/weapon/cable_coil/coil = new /obj/item/weapon/cable_coil(get_turf(holder))
|
||||
coil.amount = 4
|
||||
if(10)
|
||||
if(diff==FORWARD)
|
||||
user.visible_message("[user] installs the central control module into [holder].", "You install the central computer mainboard into [holder].")
|
||||
del used_atom
|
||||
else
|
||||
user.visible_message("[user] disconnects the wiring of [holder].", "You disconnect the wiring of [holder].")
|
||||
if(9)
|
||||
if(diff==FORWARD)
|
||||
user.visible_message("[user] secures the mainboard.", "You secure the mainboard.")
|
||||
else
|
||||
user.visible_message("[user] removes the central control module from [holder].", "You remove the central computer mainboard from [holder].")
|
||||
new /obj/item/weapon/circuitboard/mecha/odysseus/main(get_turf(holder))
|
||||
if(8)
|
||||
if(diff==FORWARD)
|
||||
user.visible_message("[user] installs the peripherals control module into [holder].", "You install the peripherals control module into [holder].")
|
||||
del used_atom
|
||||
else
|
||||
user.visible_message("[user] unfastens the mainboard.", "You unfasten the mainboard.")
|
||||
if(7)
|
||||
if(diff==FORWARD)
|
||||
user.visible_message("[user] secures the peripherals control module.", "You secure the peripherals control module.")
|
||||
else
|
||||
user.visible_message("[user] removes the peripherals control module from [holder].", "You remove the peripherals control module from [holder].")
|
||||
new /obj/item/weapon/circuitboard/mecha/odysseus/peripherals(get_turf(holder))
|
||||
if(6)
|
||||
if(diff==FORWARD)
|
||||
user.visible_message("[user] installs internal armor layer to [holder].", "You install internal armor layer to [holder].")
|
||||
else
|
||||
user.visible_message("[user] unfastens the peripherals control module.", "You unfasten the peripherals control module.")
|
||||
if(5)
|
||||
if(diff==FORWARD)
|
||||
user.visible_message("[user] secures internal armor layer.", "You secure internal armor layer.")
|
||||
else
|
||||
user.visible_message("[user] pries internal armor layer from [holder].", "You prie internal armor layer from [holder].")
|
||||
var/obj/item/stack/sheet/metal/MS = new /obj/item/stack/sheet/metal(get_turf(holder))
|
||||
MS.amount = 5
|
||||
if(4)
|
||||
if(diff==FORWARD)
|
||||
user.visible_message("[user] welds internal armor layer to [holder].", "You weld the internal armor layer to [holder].")
|
||||
else
|
||||
user.visible_message("[user] unfastens the internal armor layer.", "You unfasten the internal armor layer.")
|
||||
if(3)
|
||||
if(diff==FORWARD)
|
||||
user.visible_message("[user] installs external reinforced armor layer to [holder].", "You install external reinforced armor layer to [holder].")
|
||||
else
|
||||
user.visible_message("[user] cuts internal armor layer from [holder].", "You cut the internal armor layer from [holder].")
|
||||
if(2)
|
||||
if(diff==FORWARD)
|
||||
user.visible_message("[user] secures external armor layer.", "You secure external reinforced armor layer.")
|
||||
else
|
||||
user.visible_message("[user] pries external armor layer from [holder].", "You prie external armor layer from [holder].")
|
||||
var/obj/item/stack/sheet/r_metal/MS = new /obj/item/stack/sheet/r_metal(get_turf(holder))
|
||||
MS.amount = 5
|
||||
if(1)
|
||||
if(diff==FORWARD)
|
||||
user.visible_message("[user] welds external armor layer to [holder].", "You weld external armor layer to [holder].")
|
||||
else
|
||||
user.visible_message("[user] unfastens the external armor layer.", "You unfasten the external armor layer.")
|
||||
return 1
|
||||
|
||||
@@ -24,8 +24,10 @@
|
||||
for(var/obj/item/mecha_tracking/TR in world)
|
||||
var/answer = TR.get_mecha_info()
|
||||
if(answer)
|
||||
dat += {"<hr>[answer]<br>
|
||||
dat += {"<hr>[answer]<br/>
|
||||
<a href='?src=\ref[src];send_message=\ref[TR]'>Send message</a><br/>
|
||||
<a href='?src=\ref[src];get_log=\ref[TR]'>Show exosuit log</a> | <a style='color: #f00;' href='?src=\ref[src];shock=\ref[TR]'>(EMP pulse)</a><br>"}
|
||||
|
||||
if(screen==1)
|
||||
dat += "<h3>Log contents</h3>"
|
||||
dat += "<a href='?src=\ref[src];return=1'>Return</a><hr>"
|
||||
@@ -41,11 +43,19 @@
|
||||
Topic(href, href_list)
|
||||
if(..())
|
||||
return
|
||||
var/datum/topic_input/filter = new /datum/topic_input(href,href_list)
|
||||
if(href_list["send_message"])
|
||||
var/obj/item/mecha_tracking/MT = filter.getObj("send_message")
|
||||
var/message = strip_html_simple(input(usr,"Input message","Transmit message") as text)
|
||||
var/obj/mecha/M = MT.in_mecha()
|
||||
if(trim(message) && M)
|
||||
M.occupant_message(message)
|
||||
return
|
||||
if(href_list["shock"])
|
||||
var/obj/item/mecha_tracking/MT = locate(href_list["shock"])
|
||||
var/obj/item/mecha_tracking/MT = filter.getObj("shock")
|
||||
MT.shock()
|
||||
if(href_list["get_log"])
|
||||
var/obj/item/mecha_tracking/MT = locate(href_list["get_log"])
|
||||
var/obj/item/mecha_tracking/MT = filter.getObj("get_log")
|
||||
stored_data = MT.get_mecha_log()
|
||||
screen = 1
|
||||
if(href_list["return"])
|
||||
@@ -92,12 +102,12 @@
|
||||
|
||||
proc/in_mecha()
|
||||
if(istype(src.loc, /obj/mecha))
|
||||
return 1
|
||||
return src.loc
|
||||
return 0
|
||||
|
||||
proc/shock()
|
||||
if(src.in_mecha())
|
||||
var/obj/mecha/M = src.loc
|
||||
var/obj/mecha/M = in_mecha()
|
||||
if(M)
|
||||
M.emp_act(2)
|
||||
del(src)
|
||||
|
||||
|
||||
@@ -330,15 +330,66 @@
|
||||
construction_cost = list("metal"=20000,"plasma"=10000)
|
||||
origin_tech = "materials=5;bluespace=3;magnets=3"
|
||||
|
||||
///////// Odysseus
|
||||
|
||||
|
||||
/obj/item/mecha_parts/chassis/odysseus
|
||||
name = "Odysseus Chassis"
|
||||
|
||||
New()
|
||||
..()
|
||||
construct = new /datum/construction/mecha/odysseus_chassis(src)
|
||||
|
||||
/obj/item/mecha_parts/part/odysseus_torso
|
||||
name="Odysseus Torso"
|
||||
desc="A torso part of Odysseus. Contains power unit, processing core and life support systems."
|
||||
icon_state = "ripley_harness"
|
||||
origin_tech = "programming=2;materials=2;biotech=2;engineering=2"
|
||||
construction_time = 200
|
||||
construction_cost = list("metal"=30000,"glass"=10000)
|
||||
|
||||
/obj/item/mecha_parts/part/odysseus_left_arm
|
||||
name="Odysseus Left Arm"
|
||||
desc="An Odysseus left arm. Data and power sockets are compatible with most exosuit tools."
|
||||
icon_state = "ripley_l_arm"
|
||||
origin_tech = "programming=2;materials=2;engineering=2"
|
||||
construction_time = 150
|
||||
construction_cost = list("metal"=20000)
|
||||
|
||||
/obj/item/mecha_parts/part/odysseus_right_arm
|
||||
name="Odysseus Right Arm"
|
||||
desc="An Odysseus right arm. Data and power sockets are compatible with most exosuit tools."
|
||||
icon_state = "ripley_r_arm"
|
||||
origin_tech = "programming=2;materials=2;engineering=2"
|
||||
construction_time = 150
|
||||
construction_cost = list("metal"=20000)
|
||||
|
||||
/obj/item/mecha_parts/part/odysseus_left_leg
|
||||
name="Odysseus Left Leg"
|
||||
desc="An Odysseus left leg. Contains somewhat complex servodrives and balance maintaining systems."
|
||||
icon_state = "ripley_l_leg"
|
||||
origin_tech = "programming=2;materials=2;engineering=2"
|
||||
construction_time = 150
|
||||
construction_cost = list("metal"=2500)
|
||||
|
||||
/obj/item/mecha_parts/part/odysseus_right_leg
|
||||
name="Odysseus Right Leg"
|
||||
desc="A Odysseus right leg. Contains somewhat complex servodrives and balance maintaining systems."
|
||||
icon_state = "ripley_r_leg"
|
||||
origin_tech = "programming=2;materials=2;engineering=2"
|
||||
construction_time = 150
|
||||
construction_cost = list("metal"=2500)
|
||||
|
||||
|
||||
|
||||
///////// Circuitboards
|
||||
|
||||
/obj/item/mecha_parts/circuitboard
|
||||
/obj/item/weapon/circuitboard/mecha
|
||||
name = "Exosuit Circuit board"
|
||||
icon = 'module.dmi'
|
||||
icon_state = "std_mod"
|
||||
item_state = "electronic"
|
||||
flags = FPRINT | TABLEPASS| CONDUCT
|
||||
flags = FPRINT | TABLEPASS | CONDUCT
|
||||
force = 5.0
|
||||
w_class = 2.0
|
||||
throwforce = 5.0
|
||||
@@ -407,4 +458,15 @@
|
||||
name = "Circuit board (H.O.N.K Central Control module)"
|
||||
icon_state = "mainboard"
|
||||
|
||||
odysseus
|
||||
origin_tech = "programming=3"
|
||||
|
||||
odysseus/peripherals
|
||||
name = "Circuit board (Odysseus Peripherals Control module)"
|
||||
icon_state = "mcontroller"
|
||||
|
||||
odysseus/main
|
||||
name = "Circuit board (Odysseus Central Control module)"
|
||||
icon_state = "mainboard"
|
||||
|
||||
|
||||
|
||||
@@ -0,0 +1,22 @@
|
||||
/obj/mecha/medical/New()
|
||||
..()
|
||||
new /obj/item/mecha_tracking(src)
|
||||
return
|
||||
|
||||
|
||||
/obj/mecha/medical/mechturn(direction)
|
||||
dir = direction
|
||||
playsound(src,'mechmove01.ogg',40,1)
|
||||
return 1
|
||||
|
||||
/obj/mecha/medical/mechstep(direction)
|
||||
var/result = step(src,direction)
|
||||
if(result)
|
||||
playsound(src,'mechstep.ogg',25,1)
|
||||
return result
|
||||
|
||||
/obj/mecha/medical/mechsteprand()
|
||||
var/result = step_rand(src)
|
||||
if(result)
|
||||
playsound(src,'mechstep.ogg',25,1)
|
||||
return result
|
||||
@@ -0,0 +1,99 @@
|
||||
/obj/mecha/medical/odysseus
|
||||
desc = "Odysseus Medical Exosuit"
|
||||
name = "Odysseus"
|
||||
icon_state = "placeholder-1"
|
||||
step_in = 2
|
||||
max_temperature = 1500
|
||||
health = 120
|
||||
wreckage = null
|
||||
internal_damage_threshold = 35
|
||||
deflect_chance = 15
|
||||
step_energy_drain = 6
|
||||
var/obj/item/clothing/glasses/hud/health/mech/hud
|
||||
|
||||
New()
|
||||
..()
|
||||
hud = new /obj/item/clothing/glasses/hud/health/mech(src)
|
||||
return
|
||||
|
||||
moved_inside(var/mob/living/carbon/human/H as mob)
|
||||
if(..())
|
||||
if(H.glasses)
|
||||
occupant_message("<font color='red'>[H.glasses] prevent you from using [src] [hud]</font>")
|
||||
else
|
||||
H.glasses = hud
|
||||
return 1
|
||||
else
|
||||
return 0
|
||||
|
||||
go_out()
|
||||
if(ishuman(occupant))
|
||||
var/mob/living/carbon/human/H = occupant
|
||||
if(H.glasses == hud)
|
||||
H.glasses = null
|
||||
..()
|
||||
return
|
||||
/*
|
||||
verb/set_perspective()
|
||||
set name = "Set client perspective."
|
||||
set category = "Exosuit Interface"
|
||||
set src = usr.loc
|
||||
var/perspective = input("Select a perspective type.",
|
||||
"Client perspective",
|
||||
occupant.client.perspective) in list(MOB_PERSPECTIVE,EYE_PERSPECTIVE)
|
||||
world << "[perspective]"
|
||||
occupant.client.perspective = perspective
|
||||
return
|
||||
|
||||
verb/toggle_eye()
|
||||
set name = "Toggle eye."
|
||||
set category = "Exosuit Interface"
|
||||
set src = usr.loc
|
||||
if(occupant.client.eye == occupant)
|
||||
occupant.client.eye = src
|
||||
else
|
||||
occupant.client.eye = occupant
|
||||
world << "[occupant.client.eye]"
|
||||
return
|
||||
*/
|
||||
|
||||
//TODO - Check documentation for client.eye and client.perspective...
|
||||
/obj/item/clothing/glasses/hud/health/mech
|
||||
name = "Integrated Medical Hud"
|
||||
|
||||
|
||||
process_hud(var/mob/M)
|
||||
/*
|
||||
world<< "view(M)"
|
||||
for(var/mob/mob in view(M))
|
||||
world << "[mob]"
|
||||
world<< "view(M.client)"
|
||||
for(var/mob/mob in view(M.client))
|
||||
world << "[mob]"
|
||||
world<< "view(M.loc)"
|
||||
for(var/mob/mob in view(M.loc))
|
||||
world << "[mob]"
|
||||
*/
|
||||
|
||||
if(!M || M.stat || !(M in view(M))) return
|
||||
if(!M.client) return
|
||||
var/client/C = M.client
|
||||
var/icon/tempHud = 'hud.dmi'
|
||||
for(var/mob/living/carbon/human/patient in view(M.loc))
|
||||
if(M.see_invisible < patient.invisibility)
|
||||
continue
|
||||
var/foundVirus = 0
|
||||
for(var/datum/disease/D in patient.viruses)
|
||||
if(!D.hidden[SCANNER])
|
||||
foundVirus++
|
||||
if(patient.virus2)
|
||||
foundVirus++
|
||||
C.images += image(tempHud,patient,"hud[RoundHealth(patient.health)]")
|
||||
if(patient.stat == 2)
|
||||
C.images += image(tempHud,patient,"huddead")
|
||||
else if(patient.alien_egg_flag)
|
||||
C.images += image(tempHud,patient,"hudxeno")
|
||||
else if(foundVirus)
|
||||
C.images += image(tempHud,patient,"hudill")
|
||||
else
|
||||
C.images += image(tempHud,patient,"hudhealthy")
|
||||
@@ -149,6 +149,8 @@
|
||||
src.welded =! src.welded
|
||||
for(var/mob/M in viewers(src))
|
||||
M.show_message("\red [src] has been [welded?"welded shut":"unwelded"] by [user.name].", 3, "\red You hear welding.", 2)
|
||||
else if(istype(W,/obj/item/weapon/packageWrap))
|
||||
return
|
||||
else
|
||||
src.attack_hand(user)
|
||||
return
|
||||
|
||||
@@ -41,8 +41,6 @@
|
||||
/obj/structure/closet/secure_closet/meat/New()
|
||||
..()
|
||||
sleep(2)
|
||||
new /obj/item/kitchen/egg_box(src)
|
||||
new /obj/item/kitchen/egg_box(src)
|
||||
new /obj/item/weapon/reagent_containers/food/snacks/sliceable/meat/monkey(src)
|
||||
new /obj/item/weapon/reagent_containers/food/snacks/sliceable/meat/monkey(src)
|
||||
new /obj/item/weapon/reagent_containers/food/snacks/sliceable/meat/monkey(src)
|
||||
@@ -61,6 +59,8 @@
|
||||
new /obj/item/weapon/reagent_containers/food/drinks/soymilk(src)
|
||||
new /obj/item/weapon/reagent_containers/food/drinks/soymilk(src)
|
||||
new /obj/item/weapon/reagent_containers/food/drinks/soymilk(src)
|
||||
new /obj/item/kitchen/egg_box(src)
|
||||
new /obj/item/kitchen/egg_box(src)
|
||||
|
||||
/obj/structure/closet/secure_closet/money_freezer/New()
|
||||
..()
|
||||
|
||||
@@ -1,6 +1,12 @@
|
||||
/obj/structure/closet/secure_closet/engineering_chief
|
||||
name = "Chief Engineer's Locker"
|
||||
req_access = list(access_ce)
|
||||
icon_state = "secureeng1"
|
||||
icon_closed = "secureeng"
|
||||
icon_locked = "secureeng1"
|
||||
icon_opened = "toolclosetopen"
|
||||
icon_broken = "secureengbroken"
|
||||
icon_off = "secureengoff"
|
||||
|
||||
|
||||
New()
|
||||
@@ -32,6 +38,12 @@
|
||||
/obj/structure/closet/secure_closet/engineering_electrical
|
||||
name = "Electrical Supplies"
|
||||
req_access = list(access_engine)
|
||||
icon_state = "secureengelec1"
|
||||
icon_closed = "secureengelec"
|
||||
icon_locked = "secureengelec1"
|
||||
icon_opened = "toolclosetopen"
|
||||
icon_broken = "secureengelecbroken"
|
||||
icon_off = "secureengelecoff"
|
||||
|
||||
|
||||
New()
|
||||
@@ -52,6 +64,12 @@
|
||||
/obj/structure/closet/secure_closet/engineering_welding
|
||||
name = "Welding Supplies"
|
||||
req_access = list(access_engine)
|
||||
icon_state = "secureengweld1"
|
||||
icon_closed = "secureengweld"
|
||||
icon_locked = "secureengweld1"
|
||||
icon_opened = "toolclosetopen"
|
||||
icon_broken = "secureengweldbroken"
|
||||
icon_off = "secureengweldoff"
|
||||
|
||||
|
||||
New()
|
||||
@@ -68,6 +86,12 @@
|
||||
/obj/structure/closet/secure_closet/engineering_personal
|
||||
name = "Engineer's Locker"
|
||||
req_access = list(access_engine)
|
||||
icon_state = "secureeng1"
|
||||
icon_closed = "secureeng"
|
||||
icon_locked = "secureeng1"
|
||||
icon_opened = "toolclosetopen"
|
||||
icon_broken = "secureengbroken"
|
||||
icon_off = "secureengoff"
|
||||
|
||||
New()
|
||||
..()
|
||||
|
||||
@@ -24,7 +24,7 @@
|
||||
src.req_access += pick(get_all_accesses())
|
||||
..()
|
||||
|
||||
/obj/structure/closet/secure_closet/attackby(obj/item/weapon/W as obj, mob/user as mob)
|
||||
/obj/structure/closet/secure_closet/attackby(obj/item/W as obj, mob/user as mob)
|
||||
if(src.opened)
|
||||
if(istype(W, /obj/item/weapon/grab))
|
||||
if(src.large)
|
||||
@@ -70,6 +70,18 @@
|
||||
else
|
||||
src.icon_state = src.icon_closed
|
||||
|
||||
else if(istype(W, /obj/item/device/hacktool))
|
||||
spawn(0)
|
||||
user << "Standby, jacking into the security systems..."
|
||||
if(do_after(user, 20))
|
||||
user << "Wiping access requirements..."
|
||||
else
|
||||
user << "You need to stay still!"
|
||||
if(do_after(user, 20))
|
||||
user << "Access requirements are wiped! Anyone can access the locker, now!"
|
||||
req_access = list()
|
||||
else
|
||||
user << "You need to stay still!"
|
||||
else
|
||||
user << "\red Access Denied"
|
||||
return
|
||||
|
||||
@@ -333,6 +333,7 @@
|
||||
/obj/item/device/pda/Topic(href, href_list)
|
||||
..()
|
||||
var/mob/living/U = usr
|
||||
U.last_target_click = world.time
|
||||
//Looking for master was kind of pointless since PDAs don't appear to have one.
|
||||
if ((src in U.contents) || ( istype(loc, /turf) && in_range(src, U) ) )
|
||||
if ( !(U.stat || U.restrained()) )
|
||||
@@ -382,6 +383,8 @@
|
||||
mode = 2
|
||||
if("21")//Read messeges
|
||||
mode = 21
|
||||
if("41")//Read messeges
|
||||
mode = 41
|
||||
if("3")//Atmos scan
|
||||
mode = 3
|
||||
if("4")//Redirects to hub
|
||||
@@ -746,8 +749,10 @@
|
||||
user << "\blue No fingerprints found on [C]"
|
||||
else
|
||||
user << text("\blue [C]'s Fingerprints: [md5(C:dna.uni_identity)]")
|
||||
if ( !(C:blood_DNA.len) )
|
||||
if ( !C:blood_DNA || !C:blood_DNA.len )
|
||||
user << "\blue No blood found on [C]"
|
||||
if(C:blood_DNA)
|
||||
del(C:blood_DNA)
|
||||
else
|
||||
user << "\blue Blood found on [C]. Analysing..."
|
||||
spawn(15)
|
||||
|
||||
@@ -123,8 +123,10 @@ MASS SPECTROMETER
|
||||
|
||||
user << "\blue Done printing."
|
||||
user << text("\blue [M]'s Fingerprints: [md5(M.dna.uni_identity)]")
|
||||
if ( !(M.blood_DNA.len) )
|
||||
if ( !M.blood_DNA || !M.blood_DNA.len )
|
||||
user << "\blue No blood found on [M]"
|
||||
if(M.blood_DNA)
|
||||
del(M.blood_DNA)
|
||||
else
|
||||
user << "\blue Blood found on [M]. Analysing..."
|
||||
spawn(15)
|
||||
@@ -143,18 +145,20 @@ MASS SPECTROMETER
|
||||
if(istype(A,/obj/item/weapon/f_card))
|
||||
user << "Haha, nice try. Cheater. (It would break stuff anyways.)"
|
||||
return
|
||||
if(!A.fingerprints)
|
||||
A.fingerprints = list()
|
||||
src.add_fingerprint(user)
|
||||
if (istype(A, /obj/effect/decal/cleanable/blood) || istype(A, /obj/effect/rune))
|
||||
if(!isnull(A.blood_DNA.len))
|
||||
if(!isnull(A.blood_DNA))
|
||||
for(var/i = 1, i <= A.blood_DNA.len, i++)
|
||||
var/list/templist = A.blood_DNA[i]
|
||||
user << "\blue Blood type: [templist[2]]\nDNA: [templist[1]]"
|
||||
return
|
||||
var/duplicate = 0
|
||||
if ((!A.fingerprints || A.fingerprints.len == 0) && !(A.suit_fibers) && !(A.blood_DNA.len))
|
||||
if ((!A.fingerprints || !A.fingerprints.len) && !A.suit_fibers && !A.blood_DNA)
|
||||
user << "\blue Unable to locate any fingerprints, materials, fibers, or blood on [A]!"
|
||||
return 0
|
||||
else if (A.blood_DNA.len)
|
||||
else if (A.blood_DNA)
|
||||
user << "\blue Blood found on [A]. Analysing..."
|
||||
sleep(15)
|
||||
if(!duplicate)
|
||||
@@ -167,8 +171,10 @@ MASS SPECTROMETER
|
||||
user << "\blue Blood type: [templist[2]]\nDNA: [templist[1]]"
|
||||
else
|
||||
user << "\blue No Blood Located"
|
||||
if(!A.fingerprints || A.fingerprints.len == 0)
|
||||
if(!A.fingerprints || !A.fingerprints.len)
|
||||
user << "\blue No Fingerprints Located."
|
||||
if(A.fingerprints)
|
||||
del(A.fingerprints)
|
||||
else
|
||||
user << text("\blue Isolated [A.fingerprints.len] fingerprints: Data Stored: Scan with Hi-Res Forensic Scanner to retrieve.")
|
||||
if(!duplicate)
|
||||
@@ -208,7 +214,8 @@ MASS SPECTROMETER
|
||||
for(var/i = 1, i < (stored.len + 1), i++) //Lets see if the object is already in there!
|
||||
var/list/temp = stored[i]
|
||||
var/atom/checker = temp[1]
|
||||
if(checker.original_atom == A || checker.original_atom == A.original_atom) //It is! Merge!
|
||||
var/atom_checker_scan = (A.original_atom ? checker.original_atom[1] == A.original_atom[1] : 0)
|
||||
if(checker.original_atom[1] == A || atom_checker_scan) //It is! Merge!
|
||||
merged = 1
|
||||
var/list/prints = temp[2]
|
||||
if(!prints)
|
||||
@@ -251,11 +258,7 @@ MASS SPECTROMETER
|
||||
if(!merged) //Uh, oh! New data point!
|
||||
var/list/sum_list[4] //Pack it back up!
|
||||
sum_list[1] = A.get_duplicate(src)
|
||||
if(!A.fingerprints)
|
||||
world << "Report this to a dev! [A] was lacking a list() for fingerprints!"
|
||||
sum_list[2] = list()
|
||||
else
|
||||
sum_list[2] = A.fingerprints
|
||||
sum_list[2] = A.fingerprints
|
||||
sum_list[3] = A.suit_fibers
|
||||
sum_list[4] = A.blood_DNA
|
||||
stored.len++
|
||||
|
||||
@@ -18,7 +18,7 @@ proc/explosion(turf/epicenter, devastation_range, heavy_impact_range, light_impa
|
||||
if(M.ear_deaf <= 0 || !M.ear_deaf) if(!istype(M.loc,/turf/space))
|
||||
M << 'explosionfar.ogg'
|
||||
if (adminlog)
|
||||
message_admins("Explosion with size ([devastation_range], [heavy_impact_range], [light_impact_range]) in area [epicenter.loc.name] ")
|
||||
message_admins("Explosion with size ([devastation_range], [heavy_impact_range], [light_impact_range]) in area [epicenter.loc.name] (<a href=\"byond://?src=%admin_ref%;teleto=\ref[epicenter]\">Jump</a>)")
|
||||
log_game("Explosion with size ([devastation_range], [heavy_impact_range], [light_impact_range]) in area [epicenter.loc.name] ")
|
||||
|
||||
tension_master.explosion()
|
||||
|
||||
@@ -352,7 +352,7 @@ THERMAL GLASSES
|
||||
else if(src.icon_state == "labgreen")
|
||||
src.icon_state = "labgreen_open"
|
||||
usr << "You unbutton the labcoat."
|
||||
if(src.icon_state == "labcoat_pink_open")
|
||||
else if(src.icon_state == "labcoat_pink_open")
|
||||
src.icon_state = "labcoat_pink"
|
||||
usr << "You button up the labcoat."
|
||||
else if(src.icon_state == "labcoat_pink")
|
||||
|
||||
@@ -101,13 +101,7 @@
|
||||
t = "huge"
|
||||
else
|
||||
if ((usr.mutations & CLUMSY) && prob(50)) t = "funny-looking"
|
||||
if(!blood_DNA)
|
||||
var/turf/Z = get_turf(src)
|
||||
message_admins("\red ERROR: [src] at [Z.x], [Z.y], [Z.z] is missing it's blood_DNA list!")
|
||||
log_game("\red ERROR: [src] at [Z.x], [Z.y], [Z.z] is missing it's blood_DNA list!")
|
||||
blood_DNA = list()
|
||||
return
|
||||
usr << text("This is a []\icon[][]. It is a [] item.", !src.blood_DNA.len ? "" : "bloody ",src, src.name, t)
|
||||
usr << text("This is a []\icon[][]. It is a [] item.", !src.blood_DNA ? "" : "bloody ",src, src.name, t)
|
||||
if(src.desc)
|
||||
usr << src.desc
|
||||
return
|
||||
|
||||
@@ -58,6 +58,82 @@ AI MODULES
|
||||
usr << "[src.current.name] selected for law changes."
|
||||
|
||||
|
||||
/*Module Storage Unit/Closet! Solid, only modules fit in it.*/
|
||||
/obj/structure/aiuploadcloset
|
||||
name = "AI Mainframe Module Storage Unit"
|
||||
icon = 'mainframe.dmi'
|
||||
icon_state = "right-closed"
|
||||
density = 1
|
||||
|
||||
var/open = 0 /*It's closed!*/
|
||||
|
||||
/obj/structure/aiuploadcloset/New()
|
||||
..()
|
||||
new /obj/item/weapon/aiModule/reset(src)
|
||||
new /obj/item/weapon/aiModule/purge(src)
|
||||
new /obj/item/weapon/aiModule/nanotrasen(src)
|
||||
new /obj/item/weapon/aiModule/paladin(src)
|
||||
new /obj/item/weapon/aiModule/asimov(src)
|
||||
new /obj/item/weapon/aiModule/safeguard(src)
|
||||
new /obj/item/weapon/aiModule/protectStation(src)
|
||||
new /obj/item/weapon/aiModule/quarantine(src)
|
||||
new /obj/item/weapon/aiModule/teleporterOffline(src)
|
||||
new /obj/item/weapon/aiModule/oxygen(src)
|
||||
new /obj/item/weapon/aiModule/oneHuman(src)
|
||||
new /obj/item/weapon/aiModule/freeform(src)
|
||||
for(var/obj/item/weapon/aiModule/M in src)
|
||||
M.pixel_x = rand(-10, 10)
|
||||
M.pixel_y = rand(-10, 10)
|
||||
|
||||
/obj/structure/aiuploadcloset/attackby(obj/item/weapon/W as obj, mob/user as mob)
|
||||
if(istype(W, /obj/item/weapon/aiModule))
|
||||
user.drop_item()
|
||||
W.loc = get_turf(src)
|
||||
else
|
||||
return attack_hand(user)
|
||||
|
||||
/obj/structure/aiuploadcloset/attack_hand(mob/user as mob)
|
||||
if(!open)
|
||||
var/temp_count
|
||||
for(var/obj/item/weapon/aiModule/M in src)
|
||||
M.loc = src.loc
|
||||
temp_count++
|
||||
|
||||
user << "\blue You open the module storage unit, [temp_count > 0 ? "and take out all the modules." : "\red but it's empty!"]"
|
||||
open = 1
|
||||
icon_state = "right-open"
|
||||
|
||||
else
|
||||
var/temp_count
|
||||
for(var/obj/item/weapon/aiModule/M in get_turf(src))
|
||||
M.loc = src
|
||||
temp_count++
|
||||
|
||||
user << "\blue [temp_count > 0 ? "You put all the modules back into the module storage unit, and then close it." : "You close the module storage unit."]"
|
||||
open = 0
|
||||
icon_state = "right-closed"
|
||||
|
||||
/obj/structure/aiuploadcloset/ex_act(severity)
|
||||
switch(severity)
|
||||
if (1)
|
||||
for(var/obj/item/weapon/aiModule/M in src)
|
||||
M.loc = src.loc
|
||||
M.ex_act(severity)
|
||||
del(src)
|
||||
if (2)
|
||||
if (prob(50))
|
||||
for(var/obj/item/weapon/aiModule/M in src)
|
||||
M.loc = src.loc
|
||||
M.ex_act(severity)
|
||||
del(src)
|
||||
if (3)
|
||||
if (prob(5))
|
||||
for(var/obj/item/weapon/aiModule/M in src)
|
||||
M.loc = src.loc
|
||||
M.ex_act(severity)
|
||||
del(src)
|
||||
|
||||
|
||||
/obj/item/weapon/aiModule/proc/install(var/obj/machinery/computer/C)
|
||||
if (istype(C, /obj/machinery/computer/aiupload))
|
||||
var/obj/machinery/computer/aiupload/comp = C
|
||||
@@ -325,7 +401,7 @@ AI MODULES
|
||||
/obj/item/weapon/aiModule/reset
|
||||
name = "'Reset' AI Module"
|
||||
var/targetName = "name"
|
||||
desc = "A 'reset' AI module: 'Clears all laws except for the core three.'"
|
||||
desc = "A 'reset' AI module: 'Clears all laws except for the core laws.'"
|
||||
origin_tech = "programming=3;materials=4"
|
||||
|
||||
/obj/item/weapon/aiModule/reset/transmitInstructions(var/mob/living/silicon/ai/target, var/mob/sender)
|
||||
|
||||
@@ -341,9 +341,9 @@ FINGERPRINT CARD
|
||||
|
||||
..()
|
||||
if (!istype(usr, /mob/living/silicon))
|
||||
if (length(src.fingerprints))
|
||||
if (src.fingerprints)
|
||||
if (src.amount > 1)
|
||||
var/obj/item/weapon/f_card/F = new /obj/item/weapon/f_card( (ismob(src.loc) ? src.loc.loc : src.loc) )
|
||||
var/obj/item/weapon/f_card/F = new /obj/item/weapon/f_card(get_turf(src))
|
||||
F.amount = --src.amount
|
||||
src.amount = 1
|
||||
src.icon_state = "fingerprint1"
|
||||
|
||||
@@ -133,6 +133,7 @@ var/global/list/datum/stack_recipe/r_metal_recipes = list ( \
|
||||
return
|
||||
|
||||
/obj/item/stack/tile/steel/proc/build(turf/S as turf)
|
||||
var/turf/simulated/floor/W = S.ReplaceWithFloor()
|
||||
W.make_plating()
|
||||
S.ReplaceWithPlating()
|
||||
// var/turf/simulated/floor/W = S.ReplaceWithFloor()
|
||||
// W.make_plating()
|
||||
return
|
||||
@@ -296,7 +296,7 @@
|
||||
if (!ticker)
|
||||
user << "You can't buckle anyone in before the game starts."
|
||||
return 0
|
||||
if ((!( istype(M, /mob) ) || get_dist(src, user) >= 1 || M.loc != src.loc || user.restrained() || usr.stat || M.buckled))
|
||||
if ((!( istype(M, /mob) ) || get_dist(src, user) > 1 || M.loc != src.loc || user.restrained() || usr.stat || M.buckled))
|
||||
return 0
|
||||
if (M == usr)
|
||||
M.visible_message(\
|
||||
|
||||
@@ -101,6 +101,7 @@
|
||||
"/obj/item/weapon/reagent_containers/pill",
|
||||
"/obj/item/weapon/reagent_containers/syringe",
|
||||
"/obj/item/weapon/reagent_containers/glass/dispenser",
|
||||
"/obj/item/weapon/reagent_containers/hypospray",
|
||||
"/obj/item/weapon/zippo",
|
||||
"/obj/item/weapon/cigpacket",
|
||||
"/obj/item/weapon/storage/pill_bottle",
|
||||
|
||||
@@ -5,6 +5,7 @@ obj/structure
|
||||
icon_state = "girder"
|
||||
anchored = 1
|
||||
density = 1
|
||||
layer = 2
|
||||
var/state = 0
|
||||
|
||||
attackby(obj/item/W as obj, mob/user as mob)
|
||||
@@ -79,6 +80,8 @@ obj/structure
|
||||
user << "\blue You added the plating!"
|
||||
var/turf/Tsrc = get_turf(src)
|
||||
Tsrc.ReplaceWithWall()
|
||||
for(var/obj/machinery/atmospherics/pipe/P in Tsrc)
|
||||
P.layer = 1
|
||||
W:use(2)
|
||||
del(src)
|
||||
return
|
||||
@@ -92,6 +95,8 @@ obj/structure
|
||||
user << "\blue Wall fully reinforced!"
|
||||
var/turf/Tsrc = get_turf(src)
|
||||
Tsrc.ReplaceWithRWall()
|
||||
for(var/obj/machinery/atmospherics/pipe/P in Tsrc)
|
||||
P.layer = 1
|
||||
if (W)
|
||||
W:use(1)
|
||||
del(src)
|
||||
@@ -106,6 +111,12 @@ obj/structure
|
||||
new/obj/structure/girder/reinforced( src.loc )
|
||||
del(src)
|
||||
return
|
||||
else if(istype(W, /obj/item/pipe))
|
||||
var/obj/item/pipe/P = W
|
||||
if (P.pipe_type in list(0, 1, 5)) //simple pipes, simple bends, and simple manifolds.
|
||||
user.drop_item()
|
||||
P.loc = src.loc
|
||||
user << "\blue You fit the pipe into the [src]!"
|
||||
else
|
||||
..()
|
||||
|
||||
|
||||
@@ -87,7 +87,7 @@
|
||||
else
|
||||
return get_step(start, EAST)
|
||||
|
||||
/atom/movable/proc/hit_check()
|
||||
/atom/movable/proc/hit_check(var/turf/target)
|
||||
if(src.throwing)
|
||||
for(var/atom/A in get_turf(src))
|
||||
if(A == src) continue
|
||||
@@ -96,7 +96,7 @@
|
||||
src.throw_impact(A)
|
||||
src.throwing = 0
|
||||
if(isobj(A))
|
||||
if(A.density) // **TODO: Better behaviour for windows
|
||||
if(A.density && !A.CanPass(src,target)) // **TODO: Better behaviour for windows
|
||||
// which are dense, but shouldn't always stop movement
|
||||
src.throw_impact(A)
|
||||
src.throwing = 0
|
||||
@@ -150,6 +150,7 @@
|
||||
dy = SOUTH
|
||||
var/dist_travelled = 0
|
||||
var/dist_since_sleep = 0
|
||||
var/turf/target_turf = get_turf(target)
|
||||
if(dist_x > dist_y)
|
||||
var/error = dist_x/2 - dist_y
|
||||
while(((((src.x < target.x && dx == EAST) || (src.x > target.x && dx == WEST)) && dist_travelled < range) || istype(src.loc, /turf/space)) && src.throwing && istype(src.loc, /turf))
|
||||
@@ -159,7 +160,7 @@
|
||||
if(!step) // going off the edge of the map makes get_step return null, don't let things go off the edge
|
||||
break
|
||||
src.Move(step)
|
||||
hit_check()
|
||||
hit_check(target_turf)
|
||||
error += dist_x
|
||||
dist_travelled++
|
||||
dist_since_sleep++
|
||||
@@ -171,7 +172,7 @@
|
||||
if(!step) // going off the edge of the map makes get_step return null, don't let things go off the edge
|
||||
break
|
||||
src.Move(step)
|
||||
hit_check()
|
||||
hit_check(target_turf)
|
||||
error -= dist_y
|
||||
dist_travelled++
|
||||
dist_since_sleep++
|
||||
@@ -187,7 +188,7 @@
|
||||
if(!step) // going off the edge of the map makes get_step return null, don't let things go off the edge
|
||||
break
|
||||
src.Move(step)
|
||||
hit_check()
|
||||
hit_check(target_turf)
|
||||
error += dist_y
|
||||
dist_travelled++
|
||||
dist_since_sleep++
|
||||
@@ -199,7 +200,7 @@
|
||||
if(!step) // going off the edge of the map makes get_step return null, don't let things go off the edge
|
||||
break
|
||||
src.Move(step)
|
||||
hit_check()
|
||||
hit_check(target_turf)
|
||||
error -= dist_x
|
||||
dist_travelled++
|
||||
dist_since_sleep++
|
||||
|
||||
+5
-5
@@ -282,7 +282,7 @@
|
||||
new /obj/item/stack/sheet/metal( src )
|
||||
new /obj/item/stack/sheet/metal( src )
|
||||
|
||||
ReplaceWithFloor(explode)
|
||||
ReplaceWithPlating(explode)
|
||||
|
||||
/turf/simulated/wall/examine()
|
||||
set src in oview(1)
|
||||
@@ -364,7 +364,7 @@
|
||||
O.anchored = 1
|
||||
O.density = 1
|
||||
O.layer = 5
|
||||
var/turf/simulated/floor/F = ReplaceWithFloor()
|
||||
var/turf/simulated/floor/F = ReplaceWithPlating()
|
||||
F.burn_tile()
|
||||
F.icon_state = "wall_thermite"
|
||||
user << "\red The thermite melts the wall."
|
||||
@@ -400,7 +400,7 @@
|
||||
O.anchored = 1
|
||||
O.density = 1
|
||||
O.layer = 5
|
||||
var/turf/simulated/floor/F = ReplaceWithFloor()
|
||||
var/turf/simulated/floor/F = ReplaceWithPlating()
|
||||
F.burn_tile()
|
||||
F.icon_state = "wall_thermite"
|
||||
user << "\red The thermite melts the wall."
|
||||
@@ -477,7 +477,7 @@
|
||||
O.anchored = 1
|
||||
O.density = 1
|
||||
O.layer = 5
|
||||
var/turf/simulated/floor/F = ReplaceWithFloor()
|
||||
var/turf/simulated/floor/F = ReplaceWithPlating()
|
||||
F.burn_tile()
|
||||
F.icon_state = "wall_thermite"
|
||||
user << "\red The thermite melts the wall."
|
||||
@@ -520,7 +520,7 @@
|
||||
O.anchored = 1
|
||||
O.density = 1
|
||||
O.layer = 5
|
||||
var/turf/simulated/floor/F = ReplaceWithFloor()
|
||||
var/turf/simulated/floor/F = ReplaceWithPlating()
|
||||
F.burn_tile()
|
||||
F.icon_state = "wall_thermite"
|
||||
user << "\red The thermite melts the wall."
|
||||
|
||||
@@ -61,7 +61,7 @@ atom/proc/get_duplicate(var/atom/location)
|
||||
if(src.original_atom)
|
||||
temp_atom.original_atom = src.original_atom
|
||||
else
|
||||
temp_atom.original_atom = src
|
||||
temp_atom.original_atom = list(src)
|
||||
return temp_atom
|
||||
|
||||
#define FINGERPRINT_COMPLETE 6 //This is the output of the stringpercent(print) proc, and means about 80% of
|
||||
@@ -245,28 +245,23 @@ obj/machinery/computer/forensic_scanning
|
||||
print_string = "Fingerprints: (80% or higher completion reached)<br>" + prints[num2text(2)] + "<br>"
|
||||
temp += print_string
|
||||
for(var/i = 2, i <= dossier.len, i++)
|
||||
temp += "<hr>"
|
||||
var/list/outputs = dossier[i]
|
||||
var/item_name = get_name(outputs[1])
|
||||
var/list/prints_len = outputs[2]
|
||||
temp += "Object: [item_name]<br>"
|
||||
temp += "<big><b>Object:</b> [item_name]</big><br>"
|
||||
temp += " <b>Fingerprints:</b><br>"
|
||||
temp += " [prints_len.len] Unique fingerprints found.<br>"
|
||||
var/list/fibers = outputs[3]
|
||||
if(fibers && fibers.len)
|
||||
var/dat = "[fibers[1]]"
|
||||
for(var/j = 2, j <= fibers.len, j++)
|
||||
dat += ",<br> [fibers[j]]"
|
||||
temp += " Fibers: [dat]<br>"
|
||||
else
|
||||
temp += " No fibers found.<br>"
|
||||
temp += " <b>Fibers:</b><br>"
|
||||
for(var/j = 1, j <= fibers.len, j++)
|
||||
temp += " [fibers[j]]<br>"
|
||||
var/list/blood = outputs[4]
|
||||
if(blood && blood.len)
|
||||
var/dat = "[blood[1]]"
|
||||
if(blood.len > 1)
|
||||
for(var/j = 2, j <= blood.len, j++)
|
||||
dat += ",<br> [blood[j]]"
|
||||
temp += " Blood: [dat]<br>"
|
||||
else
|
||||
temp += " No blood found.<br>"
|
||||
temp += " <b>Blood:</b><br>"
|
||||
for(var/j = 1, j <= blood.len, j++)
|
||||
temp += " [blood[j]]<br>"
|
||||
else
|
||||
temp = "ERROR. Database not found!<br>"
|
||||
temp += "<br><a href='?src=\ref[src];operation=database;delete_record=[href_list["identifier"]]'>{Delete this Dossier}</a>"
|
||||
@@ -286,28 +281,23 @@ obj/machinery/computer/forensic_scanning
|
||||
print_string = "Fingerprints: " + prints[num2text(2)] + "<BR>"
|
||||
P.info += print_string
|
||||
for(var/i = 2, i <= dossier.len, i++)
|
||||
P.info += "<hr>"
|
||||
var/list/outputs = dossier[i]
|
||||
var/item_name = get_name(outputs[1])
|
||||
var/list/prints_len = outputs[2]
|
||||
P.info += "Object: [item_name]<br>"
|
||||
P.info += "<big><b>Object:</b> [item_name]</big><br>"
|
||||
P.info += " <b>Fingerprints:</b><br>"
|
||||
P.info += " [prints_len.len] Unique fingerprints found.<br>"
|
||||
var/list/fibers = outputs[3]
|
||||
if(fibers && fibers.len)
|
||||
var/dat = "[fibers[1]]"
|
||||
for(var/j = 2, j <= fibers.len, j++)
|
||||
dat += ",<br> [fibers[j]]"
|
||||
P.info += " Fibers: [dat]<br>"
|
||||
else
|
||||
P.info += " No fibers found.<br>"
|
||||
P.info += " <b>Fibers:</b><br>"
|
||||
for(var/j = 1, j <= fibers.len, j++)
|
||||
P.info += " [fibers[j]]<br>"
|
||||
var/list/blood = outputs[4]
|
||||
if(blood && blood.len)
|
||||
var/dat = "[blood[1]]"
|
||||
if(blood.len > 1)
|
||||
for(var/j = 2, j <= blood.len, j++)
|
||||
dat += ",<br> [blood[j]]"
|
||||
P.info += " Blood: [dat]<br>"
|
||||
else
|
||||
P.info += " No blood found."
|
||||
P.info += " <b>Blood:</b><br>"
|
||||
for(var/j = 1, j <= blood.len, j++)
|
||||
P.info += " [blood[j]]<br>"
|
||||
else
|
||||
usr << "ERROR. Database not found!<br>"
|
||||
if("auxiliary")
|
||||
@@ -317,23 +307,17 @@ obj/machinery/computer/forensic_scanning
|
||||
var/identifier = text2num(href_list["identifier"])
|
||||
var/list/outputs = misc[identifier]
|
||||
var/item_name = get_name(outputs[1])
|
||||
temp += "Consolidated data points: [item_name]<br>"
|
||||
temp += "<big><b>Consolidated data points:</b> [item_name]</big><br>"
|
||||
var/list/fibers = outputs[2]
|
||||
if(fibers && fibers.len)
|
||||
var/dat = "[fibers[1]]"
|
||||
for(var/j = 2, j <= fibers.len, j++)
|
||||
dat += "<br> [fibers[j]]"
|
||||
temp += " Fibers: [dat]<br>"
|
||||
else
|
||||
temp += " No fibers found."
|
||||
temp += " <b>Fibers:</b><br>"
|
||||
for(var/j = 1, j <= fibers.len, j++)
|
||||
temp += "<br> [fibers[j]]"
|
||||
var/list/blood = outputs[3]
|
||||
if(blood && blood.len)
|
||||
var/dat = "[blood[1]]"
|
||||
for(var/j = 2, j <= blood.len, j++)
|
||||
dat += "<br> [blood[j]]"
|
||||
temp += " Blood: [dat]<br>"
|
||||
else
|
||||
temp += " No blood found.<br>"
|
||||
temp += " <b>Blood:</b><br>"
|
||||
for(var/j = 1, j <= blood.len, j++)
|
||||
temp += " [blood[j]]<br>"
|
||||
else
|
||||
temp = "ERROR. Database not found!<br>"
|
||||
temp += "<br><a href='?src=\ref[src];operation=database;delete_aux=[href_list["identifier"]]'>{Delete This Record}</a>"
|
||||
@@ -348,23 +332,17 @@ obj/machinery/computer/forensic_scanning
|
||||
P.name = "Auxiliary Database File ([item_name])"
|
||||
P.overlays += "paper_words"
|
||||
P.info = "<b>Auxiliary Evidence Database</b><br><br>"
|
||||
P.info += "Consolidated data points: [item_name]<br>"
|
||||
P.info += "<big><b>Consolidated data points:</b> [item_name]</big><br>"
|
||||
var/list/fibers = outputs[2]
|
||||
if(fibers && fibers.len)
|
||||
var/dat = "[fibers[1]]"
|
||||
for(var/j = 2, j <= fibers.len, j++)
|
||||
dat += "<br> [fibers[j]]"
|
||||
P.info += " Fibers: [dat]<br>"
|
||||
else
|
||||
P.info += " No fibers found."
|
||||
P.info += " <b>Fibers:</b><br>"
|
||||
for(var/j = 1, j <= fibers.len, j++)
|
||||
P.info += "<br> [fibers[j]]"
|
||||
var/list/blood = outputs[3]
|
||||
if(blood && blood.len)
|
||||
var/dat = "[blood[1]]"
|
||||
for(var/j = 2, j <= blood.len, j++)
|
||||
dat += "<br> [blood[j]]"
|
||||
P.info += " Blood: [dat]<br>"
|
||||
else
|
||||
P.info += " No blood found.<br>"
|
||||
P.info += " <b>Blood:</b><br>"
|
||||
for(var/j = 1, j <= blood.len, j++)
|
||||
P.info += " [blood[j]]<br>"
|
||||
else
|
||||
usr << "ERROR. Database not found!<br>"
|
||||
if("scan")
|
||||
@@ -400,14 +378,14 @@ obj/machinery/computer/forensic_scanning
|
||||
scan_process = 0
|
||||
scan_name = scanning.name
|
||||
scan_data = "<u>[scanning]</u><br><br>"
|
||||
if (scanning.blood_DNA.len)
|
||||
if (scanning.blood_DNA)
|
||||
scan_data += "Blood Found:<br>"
|
||||
for(var/i = 1, i <= scanning.blood_DNA.len, i++)
|
||||
var/list/templist = scanning.blood_DNA[i]
|
||||
scan_data += "-Blood type: [templist[2]]\nDNA: [templist[1]]<br><br>"
|
||||
else
|
||||
scan_data += "No Blood Found<br><br>"
|
||||
if (!length(scanning.fingerprints))
|
||||
if(!scanning.fingerprints)
|
||||
scan_data += "No Fingerprints Found<br><br>"
|
||||
else
|
||||
var/list/L = scanning.fingerprints
|
||||
@@ -441,7 +419,7 @@ obj/machinery/computer/forensic_scanning
|
||||
if(istype(scanning,/obj/item/device/detective_scanner))
|
||||
scan_data += "<br><b>Data transfered from Scanner to Database.</b><br>"
|
||||
add_data_scanner(scanning)
|
||||
else if(!length(scanning.fingerprints))
|
||||
else if(!scanning.fingerprints)
|
||||
scan_data += "<br><b><a href='?src=\ref[src];operation=add'>Add to Database?</a></b><br>"
|
||||
else
|
||||
temp = "Scan Failed: No Object"
|
||||
@@ -510,7 +488,7 @@ obj/machinery/computer/forensic_scanning
|
||||
A.suit_fibers = tempsuit_fibers
|
||||
backup_DNA = A.blood_DNA
|
||||
A.blood_DNA = tempblood_DNA
|
||||
if((!A.fingerprints || !length(A.fingerprints))) //No prints
|
||||
if((!A.fingerprints)) //No prints
|
||||
var/merged = 0
|
||||
if(!misc)
|
||||
misc = list()
|
||||
@@ -518,7 +496,8 @@ obj/machinery/computer/forensic_scanning
|
||||
for(var/i = 1, i <= misc.len, i++) //Lets see if we can find it.
|
||||
var/list/templist = misc[i]
|
||||
var/atom/check = templist[1]
|
||||
if(check.original_atom == A || check.original_atom == A.original_atom) //There it is!
|
||||
var/atom_checker_scan = (A.original_atom ? check.original_atom[1] == A.original_atom[1] : 0)
|
||||
if(check.original_atom[1] == A || atom_checker_scan) //There it is!
|
||||
merged = 1
|
||||
var/list/fibers = templist[2]
|
||||
if(!fibers)
|
||||
@@ -549,7 +528,7 @@ obj/machinery/computer/forensic_scanning
|
||||
misc[misc.len] = templist //Store it!
|
||||
return !merged
|
||||
else //Has prints.
|
||||
var/list/found_prints[A.fingerprints.len + 1]
|
||||
var/list/found_prints[A.fingerprints.len]
|
||||
for(var/i = 1, i <= found_prints.len, i++)
|
||||
found_prints[i] = 0
|
||||
if(!files)
|
||||
@@ -567,7 +546,8 @@ obj/machinery/computer/forensic_scanning
|
||||
for(var/n = 2, n <= perp_list.len, n++) //Lets see if it is already in the database
|
||||
var/list/target = perp_list[n]
|
||||
var/atom/atom_checker = target[1]
|
||||
if(atom_checker.original_atom == A || atom_checker.original_atom == A.original_atom) //Found the original object!
|
||||
var/atom_checker_scan = (A.original_atom ? atom_checker.original_atom[1] == A.original_atom[1] : 0)
|
||||
if(atom_checker.original_atom[1] == A || atom_checker_scan) //Found the original object!
|
||||
found2 = 1
|
||||
var/list/prints = target[2]
|
||||
if(!prints)
|
||||
@@ -617,7 +597,7 @@ obj/machinery/computer/forensic_scanning
|
||||
perp_list.len++
|
||||
perp_list[perp_list.len] = sum_list
|
||||
files[i] = perp_list
|
||||
for(var/m = 1, m < found_prints.len, m++) //Uh Oh! A print wasn't used! New datapoint!
|
||||
for(var/m = 1, m <= found_prints.len, m++) //Uh Oh! A print wasn't used! New datapoint!
|
||||
if(found_prints[m] == 0)
|
||||
var/list/newperp[2]
|
||||
var/list/sum_list[4]
|
||||
@@ -725,7 +705,7 @@ obj/effect/decal/cleanable/blood/var
|
||||
mob/blood_owner
|
||||
|
||||
turf/Exited(mob/living/carbon/human/M)
|
||||
if(istype(M,/mob/living))
|
||||
if(istype(M,/mob/living) && !istype(M,/mob/living/carbon/metroid))
|
||||
if(!istype(src, /turf/space)) // Bloody tracks code starts here
|
||||
if(M.track_blood > 0)
|
||||
M.track_blood--
|
||||
@@ -737,7 +717,7 @@ turf/Exited(mob/living/carbon/human/M)
|
||||
src.add_bloody_footprints(M.shoes.track_blood_mob,1,M.dir,M.shoes.name) // And bloody tracks end here
|
||||
. = ..()
|
||||
turf/Entered(mob/living/carbon/human/M)
|
||||
if(istype(M,/mob/living))
|
||||
if(istype(M,/mob/living) && !istype(M,/mob/living/carbon/metroid))
|
||||
if(M.track_blood > 0)
|
||||
M.track_blood--
|
||||
src.add_bloody_footprints(M.track_blood_mob,0,M.dir,get_tracks(M))
|
||||
@@ -769,9 +749,14 @@ turf/proc/add_bloody_footprints(mob/living/carbon/human/M,leaving,d,info)
|
||||
if(T.dir == d)
|
||||
if((leaving && T.icon_state == "steps2") || (!leaving && T.icon_state == "steps1"))
|
||||
T.desc = "These bloody footprints appear to have been made by [info]."
|
||||
if(istype(M,/mob/living/carbon/human))
|
||||
if(T.blood_DNA)
|
||||
T.blood_DNA.len++
|
||||
if(istype(M,/mob/living/carbon/human))
|
||||
T.blood_DNA[T.blood_DNA.len] = list(M.dna.unique_enzymes,M.dna.b_type)
|
||||
else if(istype(M,/mob/living/carbon/alien))
|
||||
T.blood_DNA[T.blood_DNA.len] = list("UNKNOWN DNA","X*")
|
||||
else if(istype(M,/mob/living/carbon/monkey))
|
||||
T.blood_DNA[T.blood_DNA.len] = list("Non-human DNA","A+")
|
||||
return
|
||||
var/obj/effect/decal/cleanable/blood/tracks/this = new(src)
|
||||
this.icon = 'footprints.dmi'
|
||||
@@ -796,6 +781,8 @@ proc/get_tracks(mob/M)
|
||||
. = "monkey paws"
|
||||
else if(istype(M,/mob/living/silicon/robot))
|
||||
. = "robot feet"
|
||||
else if(istype(M,/mob/living/carbon/alien))
|
||||
. = "alien claws"
|
||||
else
|
||||
. = "an unknown creature"
|
||||
|
||||
|
||||
@@ -476,7 +476,7 @@
|
||||
M.client.muted_complete = !M.client.muted_complete
|
||||
log_admin("[key_name(usr)] has [(M.client.muted_complete ? "completely muted" : "voiced (complete)")] [key_name(M)].")
|
||||
message_admins("\blue [key_name_admin(usr)] has [(M.client.muted_complete ? "completely muted" : "voiced (complete)")] [key_name_admin(M)].", 1)
|
||||
M << "You have been [(M.client.muted_complete ? "completely muted" : "voiced (complete)")]. You are unable to speak or even adminhelp"
|
||||
M << "You have been [(M.client.muted_complete ? "completely muted" : "voiced (complete)")]. You are unable to speak."
|
||||
|
||||
if (href_list["c_mode"])
|
||||
if ((src.rank in list( "Temporary Admin", "Admin Candidate", "Trial Admin", "Badmin", "Game Admin", "Game Master" )))
|
||||
|
||||
@@ -139,8 +139,6 @@
|
||||
verbs += /client/proc/only_one // Fateweaver suggested I do this - Doohl
|
||||
verbs += /client/proc/callprocgen
|
||||
verbs += /client/proc/callprocobj
|
||||
verbs += /client/proc/cmd_debug_prints
|
||||
verbs += /client/proc/cmd_debug_blood
|
||||
verbs += /client/proc/rnd_check_designs
|
||||
|
||||
if (holder.level >= 5)//Game Admin********************************************************************
|
||||
@@ -426,8 +424,6 @@
|
||||
verbs -= /client/proc/delbook
|
||||
verbs -= /client/proc/Force_Event_admin
|
||||
verbs -= /client/proc/radioalert
|
||||
verbs -= /client/proc/cmd_debug_prints
|
||||
verbs -= /client/proc/cmd_debug_blood
|
||||
verbs -= /client/proc/rnd_check_designs
|
||||
verbs -= /client/proc/make_tajaran
|
||||
|
||||
|
||||
@@ -7,8 +7,8 @@
|
||||
if (!msg)
|
||||
return
|
||||
|
||||
if (usr.client && usr.client.muted_complete)
|
||||
return
|
||||
// if (usr.client && usr.client.muted_complete)
|
||||
// return
|
||||
|
||||
for (var/mob/M in world)
|
||||
if (M.client && M.client.holder && (M.client.holder.level != -3))
|
||||
|
||||
@@ -813,75 +813,4 @@ But you can call procs that are of type /mob/living/carbon/human/proc/ for that
|
||||
M.equip_if_possible(W, M.slot_wear_id)
|
||||
|
||||
M.update_clothing()
|
||||
return
|
||||
|
||||
|
||||
/client/proc/cmd_debug_blood()
|
||||
set category = "Debug"
|
||||
set name = "Analyze all blood_DNA"
|
||||
|
||||
// to prevent REALLY stupid activations
|
||||
switch(alert("Are you sure?", ,"Yes", "No"))
|
||||
if("No")
|
||||
return
|
||||
world << "\red ALERT! \black Standby for high CPU bugtesting to determine missing blood_DNA values!"
|
||||
world << "\red THIS WILL PROBABLY LAG LIKE HELL."
|
||||
world << "Initiating in 10 BYOND seconds..."
|
||||
log_admin("[key_name(src)] has initiated a scan of all blood_DNA lists!")
|
||||
message_admins("[key_name_admin(src)] has initiated a scan of all blood_DNA lists!", 0)
|
||||
sleep(100)
|
||||
world << "\red SCAN INITIATED."
|
||||
spawn(0) //I am not stupid enough to leave that in a regular loop.
|
||||
for(var/atom/O in world)
|
||||
if(!islist(O.blood_DNA))
|
||||
var/turf/T = get_turf(O)
|
||||
if(istype(O.loc,/turf))
|
||||
src << "[O] at [T.x],[T.y],[T.z] has a non-list blood_DNA variable! (Last touched by [O.fingerprintslast])"
|
||||
else
|
||||
src << "[O] in [O.loc] at [T.x],[T.y],[T.z] has a non-list blood_DNA variable! (Last touched by [O.fingerprintslast])"
|
||||
world << "\red SCAN COMPLETE."
|
||||
world << "Thank you for your patience."
|
||||
return
|
||||
|
||||
|
||||
/client/proc/cmd_debug_prints()
|
||||
set category = "Debug"
|
||||
set name = "Analyze all fingerprints"
|
||||
|
||||
// to prevent REALLY stupid activations
|
||||
switch(alert("Are you sure?", ,"Yes", "No"))
|
||||
if("No")
|
||||
return
|
||||
world << "\red ALERT! \black Standby for high CPU bugtesting to determine incorrect fingerprint values!"
|
||||
world << "\red THIS WILL PROBABLY LAG LIKE HELL."
|
||||
world << "Initiating in 10 BYOND seconds..."
|
||||
log_admin("[key_name(src)] has initiated a scan of all fingerprints!")
|
||||
message_admins("[key_name_admin(src)] has initiated a scan of all fingerprints!", 0)
|
||||
sleep(100)
|
||||
world << "\red SCAN INITIATED."
|
||||
spawn(0) //I am not stupid enough to leave that in a regular loop.
|
||||
for(var/atom/O in world)
|
||||
if(istype(O, /mob)) //Lets not.
|
||||
continue
|
||||
if(!islist(O.fingerprints))
|
||||
var/turf/T = get_turf(O)
|
||||
if(istype(O.loc,/turf))
|
||||
src << "[O] at [T.x],[T.y],[T.z] has a non-list fingerprints variable! (Last touched by [O.fingerprintslast])"
|
||||
else
|
||||
src << "[O] in [O.loc] at [T.x],[T.y],[T.z] has a non-list fingerprints variable! (Last touched by [O.fingerprintslast])"
|
||||
else if (O.fingerprints.len)
|
||||
for(var/i = 1, i <= O.fingerprints.len, i++)
|
||||
if(length(O.fingerprints[i]) != 69)
|
||||
var/turf/T = get_turf(O)
|
||||
if(isnull(T))
|
||||
src << "[O] at [O.loc] has a fingerprints variable of incorrect length! (TURF NOT FOUND). (Last touched by [O.fingerprintslast])"
|
||||
else
|
||||
if(istype(O.loc,/turf))
|
||||
src << "[O] at [T.x],[T.y],[T.z] has a fingerprints variable of incorrect length! (Last touched by [O.fingerprintslast])"
|
||||
else
|
||||
src << "[O] in [O.loc] at [T.x],[T.y],[T.z] has a fingerprints variable of incorrect length! (Last touched by [O.fingerprintslast])"
|
||||
break
|
||||
|
||||
world << "\red SCAN COMPLETE."
|
||||
world << "Thank you for your patience."
|
||||
return
|
||||
return
|
||||
@@ -157,8 +157,11 @@ datum
|
||||
blood_prop = new(T)
|
||||
blood_prop.blood_DNA = list(list(self.data["blood_DNA"], self.data["blood_type"]))
|
||||
else
|
||||
blood_prop.blood_DNA.len++
|
||||
blood_prop.blood_DNA[blood_prop.blood_DNA.len] = list(self.data["blood_DNA"], self.data["blood_type"])
|
||||
if(!blood_prop.blood_DNA)
|
||||
blood_prop.blood_DNA = list(list(self.data["blood_DNA"], self.data["blood_type"]))
|
||||
else
|
||||
blood_prop.blood_DNA.len++
|
||||
blood_prop.blood_DNA[blood_prop.blood_DNA.len] = list(self.data["blood_DNA"], self.data["blood_type"])
|
||||
|
||||
for(var/datum/disease/D in self.data["viruses"])
|
||||
var/datum/disease/newVirus = new D.type
|
||||
@@ -184,8 +187,11 @@ datum
|
||||
blood_prop = new(T)
|
||||
blood_prop.blood_DNA = list(list(self.data["blood_DNA"],"A+"))
|
||||
else
|
||||
blood_prop.blood_DNA.len++
|
||||
blood_prop.blood_DNA[blood_prop.blood_DNA.len] = list(self.data["blood_DNA"], "A+")
|
||||
if(!blood_prop.blood_DNA)
|
||||
blood_prop.blood_DNA = list(list(self.data["blood_DNA"],"A+"))
|
||||
else
|
||||
blood_prop.blood_DNA.len++
|
||||
blood_prop.blood_DNA[blood_prop.blood_DNA.len] = list(self.data["blood_DNA"], "A+")
|
||||
|
||||
for(var/datum/disease/D in self.data["viruses"])
|
||||
var/datum/disease/newVirus = new D.type
|
||||
@@ -205,8 +211,11 @@ datum
|
||||
blood_prop = new(T)
|
||||
blood_prop.blood_DNA = list(list("UNKNOWN DNA","X*"))
|
||||
else
|
||||
blood_prop.blood_DNA.len++
|
||||
blood_prop.blood_DNA[blood_prop.blood_DNA.len] = list("UNKNOWN DNA","X*")
|
||||
if(!blood_prop.blood_DNA)
|
||||
blood_prop.blood_DNA = list(list("UNKNOWN DNA","X*"))
|
||||
else
|
||||
blood_prop.blood_DNA.len++
|
||||
blood_prop.blood_DNA[blood_prop.blood_DNA.len] = list("UNKNOWN DNA","X*")
|
||||
|
||||
for(var/datum/disease/D in self.data["viruses"])
|
||||
var/datum/disease/newVirus = new D.type
|
||||
@@ -362,7 +371,7 @@ datum
|
||||
|
||||
on_mob_life(var/mob/living/M as mob)
|
||||
if(!M) M = holder.my_atom
|
||||
M:adjustToxLoss(1.5)
|
||||
M:adjustToxLoss(0.3)
|
||||
..()
|
||||
return
|
||||
|
||||
@@ -403,6 +412,7 @@ datum
|
||||
// if(50 to INFINITY)
|
||||
// M:adjustToxLoss(0.1)
|
||||
data++
|
||||
holder.remove_reagent(src.id, 0.1)
|
||||
..()
|
||||
return
|
||||
|
||||
@@ -437,7 +447,7 @@ datum
|
||||
M.slurring = 0
|
||||
M.confused = 0
|
||||
M.jitteriness = 0
|
||||
if(50 to INFINITY)
|
||||
if(125 to INFINITY)
|
||||
M:adjustToxLoss(0.1)
|
||||
..()
|
||||
return
|
||||
@@ -473,8 +483,8 @@ datum
|
||||
if(prob(10)) step(M, pick(cardinal))
|
||||
if(prob(7)) M:emote(pick("twitch","drool","moan","giggle"))
|
||||
holder.remove_reagent(src.id, 0.2)
|
||||
if(data >= 50)
|
||||
M:adjustToxLoss(min(((data-50)/10),3))
|
||||
if(data >= 100)
|
||||
M:adjustToxLoss(0.1)
|
||||
return
|
||||
|
||||
serotrotium
|
||||
@@ -602,7 +612,7 @@ datum
|
||||
if(M.canmove && istype(M.loc, /turf/space))
|
||||
step(M, pick(cardinal))
|
||||
if(prob(5)) M:emote(pick("twitch","drool","moan"))
|
||||
M:adjustToxLoss(1)
|
||||
M:adjustToxLoss(0.2)
|
||||
..()
|
||||
return
|
||||
|
||||
@@ -634,7 +644,8 @@ datum
|
||||
|
||||
on_mob_life(var/mob/living/M as mob)
|
||||
if(!M) M = holder.my_atom
|
||||
M.take_organ_damage(1, 0)
|
||||
if(prob(50))
|
||||
M.take_organ_damage(1, 0)
|
||||
..()
|
||||
return
|
||||
|
||||
@@ -647,7 +658,7 @@ datum
|
||||
|
||||
on_mob_life(var/mob/living/M as mob)
|
||||
if(!M) M = holder.my_atom
|
||||
M:adjustToxLoss(1)
|
||||
M:adjustToxLoss(0.3)
|
||||
..()
|
||||
return
|
||||
|
||||
@@ -702,7 +713,8 @@ datum
|
||||
on_mob_life(var/mob/living/M as mob)
|
||||
if(!M) M = holder.my_atom
|
||||
M:adjustToxLoss(1)
|
||||
M.take_organ_damage(0, 1)
|
||||
if(prob(50))
|
||||
M.take_organ_damage(0, 1)
|
||||
..()
|
||||
return
|
||||
reaction_mob(var/mob/living/M, var/method=TOUCH, var/volume)
|
||||
@@ -756,7 +768,7 @@ datum
|
||||
|
||||
on_mob_life(var/mob/living/M as mob)
|
||||
if(!M) M = holder.my_atom
|
||||
M:adjustToxLoss(1)
|
||||
M:adjustToxLoss(0.2)
|
||||
M.take_organ_damage(0, 1)
|
||||
..()
|
||||
return
|
||||
@@ -865,8 +877,8 @@ datum
|
||||
M.mutations = 0
|
||||
M.disabilities = 0
|
||||
switch(data)
|
||||
if(50 to INFINITY)
|
||||
M:adjustToxLoss(min(((data-50)/10),3))
|
||||
if(100 to INFINITY)
|
||||
M:adjustToxLoss(0.2)
|
||||
..()
|
||||
return
|
||||
|
||||
@@ -1173,8 +1185,8 @@ datum
|
||||
M.bodytemperature = max(310, M.bodytemperature-20)
|
||||
else if(M.bodytemperature < 311)
|
||||
M.bodytemperature = min(310, M.bodytemperature+20)
|
||||
if(data >= 50)
|
||||
M:adjustToxLoss(min(((data-50)/10),3))
|
||||
if(data >= 100)
|
||||
M:adjustToxLoss(0.2)
|
||||
..()
|
||||
return
|
||||
|
||||
@@ -1194,7 +1206,7 @@ datum
|
||||
M.confused = max(M.confused, 20)
|
||||
holder.remove_reagent(src.id, 0.2)
|
||||
if(data >= 50)
|
||||
M:adjustToxLoss(min(((data-50)/10),3))
|
||||
M:adjustToxLoss(0.2)
|
||||
..()
|
||||
return
|
||||
|
||||
@@ -1209,7 +1221,7 @@ datum
|
||||
if(M.stat == 2.0)
|
||||
return
|
||||
if(!M) M = holder.my_atom
|
||||
if(prob(33))
|
||||
if(prob(30))
|
||||
M.take_organ_damage(1, 0)
|
||||
M:adjustOxyLoss(3)
|
||||
if(prob(20)) M:emote("gasp")
|
||||
@@ -1229,9 +1241,11 @@ datum
|
||||
if(!M) M = holder.my_atom
|
||||
if(!data) data = 1
|
||||
data++
|
||||
M:heal_organ_damage(0,2)
|
||||
if(data >= 50)
|
||||
M:adjustToxLoss(min(((data-50)/10),3))
|
||||
M:heal_organ_damage(0,1)
|
||||
if(volume > REAGENTS_OVERDOSE)
|
||||
M:adjustToxLoss(1)
|
||||
if(data >= 125)
|
||||
M:adjustToxLoss(0.1)
|
||||
..()
|
||||
return
|
||||
|
||||
@@ -1249,8 +1263,10 @@ datum
|
||||
if(!data) data = 1
|
||||
data++
|
||||
M:heal_organ_damage(0,3)
|
||||
if(data >= 50)
|
||||
M:adjustToxLoss(min(((data-50)/10),3))
|
||||
if(volume > REAGENTS_OVERDOSE)
|
||||
M:adjustToxLoss(1)
|
||||
if(data >= 125)
|
||||
M:adjustToxLoss(0.2)
|
||||
..()
|
||||
return
|
||||
|
||||
@@ -1270,8 +1286,10 @@ datum
|
||||
M:adjustOxyLoss(-2)
|
||||
if(holder.has_reagent("lexorin"))
|
||||
holder.remove_reagent("lexorin", 2)
|
||||
if(data >= 50)
|
||||
M:adjustToxLoss(min(((data-50)/10),3))
|
||||
if(volume > REAGENTS_OVERDOSE)
|
||||
M:adjustToxLoss(1)
|
||||
if(data >= 125)
|
||||
M:adjustToxLoss(0.2)
|
||||
..()
|
||||
return
|
||||
|
||||
@@ -1291,8 +1309,10 @@ datum
|
||||
M:oxyloss = 0
|
||||
if(holder.has_reagent("lexorin"))
|
||||
holder.remove_reagent("lexorin", 2)
|
||||
if(volume > REAGENTS_OVERDOSE)
|
||||
M:adjustToxLoss(1)
|
||||
if(data >= 50)
|
||||
M:adjustToxLoss(min(((data-50)/10),3))
|
||||
M:adjustToxLoss(0.2)
|
||||
..()
|
||||
return
|
||||
|
||||
@@ -1311,6 +1331,8 @@ datum
|
||||
if(M:getBruteLoss() && prob(40)) M:heal_organ_damage(1,0)
|
||||
if(M:getFireLoss() && prob(40)) M:heal_organ_damage(0,1)
|
||||
if(M:getToxLoss() && prob(40)) M:adjustToxLoss(-1)
|
||||
if(volume > REAGENTS_OVERDOSE)
|
||||
M:adjustToxLoss(1)
|
||||
..()
|
||||
return
|
||||
|
||||
@@ -1389,6 +1411,8 @@ datum
|
||||
M.AdjustStunned(-1)
|
||||
M.AdjustWeakened(-1)
|
||||
if(prob(60)) M.adjustToxLoss(1)
|
||||
if(volume > REAGENTS_OVERDOSE)
|
||||
M:adjustToxLoss(1)
|
||||
..()
|
||||
return
|
||||
|
||||
@@ -1421,8 +1445,10 @@ datum
|
||||
if(prob(80)) M:adjustBrainLoss(1)
|
||||
if(prob(50)) M:drowsyness = max(M:drowsyness, 3)
|
||||
if(prob(10)) M:emote("drool")
|
||||
if(volume > REAGENTS_OVERDOSE)
|
||||
M:adjustToxLoss(1)
|
||||
if(data >= 50)
|
||||
M:adjustToxLoss(min(((data-50)/10),3))
|
||||
M:adjustToxLoss(0.4)
|
||||
..()
|
||||
return
|
||||
|
||||
@@ -1436,8 +1462,10 @@ datum
|
||||
on_mob_life(var/mob/living/M as mob)
|
||||
if(!M) M = holder.my_atom
|
||||
M:radiation = max(M:radiation-3,0)
|
||||
if(volume > REAGENTS_OVERDOSE)
|
||||
M:adjustToxLoss(1)
|
||||
if(data >= 50)
|
||||
M:adjustToxLoss(min(((data-50)/10),3))
|
||||
M:adjustToxLoss(0.2)
|
||||
..()
|
||||
return
|
||||
|
||||
@@ -1459,8 +1487,10 @@ datum
|
||||
if(prob(15))
|
||||
M.take_organ_damage(1, 0)
|
||||
..()
|
||||
if(volume > REAGENTS_OVERDOSE)
|
||||
M:adjustToxLoss(1)
|
||||
if(data >= 50)
|
||||
M:adjustToxLoss(min(((data-50)/10),3))
|
||||
M:adjustToxLoss(0.3)
|
||||
return
|
||||
|
||||
alkysine
|
||||
@@ -1474,6 +1504,8 @@ datum
|
||||
if(!M) M = holder.my_atom
|
||||
M:adjustBrainLoss(-3)
|
||||
M:adjustToxLoss(0.1)
|
||||
if(volume > REAGENTS_OVERDOSE)
|
||||
M:adjustToxLoss(1)
|
||||
..()
|
||||
return
|
||||
|
||||
@@ -1491,8 +1523,10 @@ datum
|
||||
M:eye_blurry = max(M:eye_blurry-5 , 0)
|
||||
M:eye_blind = max(M:eye_blind-5 , 0)
|
||||
M:disabilities &= ~1
|
||||
if(data >= 50)
|
||||
M:adjustToxLoss(min(((data-50)/10),3))
|
||||
if(volume > REAGENTS_OVERDOSE)
|
||||
M:adjustToxLoss(1)
|
||||
if(data >= 100)
|
||||
M:adjustToxLoss(0.2)
|
||||
..()
|
||||
return
|
||||
|
||||
@@ -1510,8 +1544,10 @@ datum
|
||||
if(!data) data = 1
|
||||
data++
|
||||
M:heal_organ_damage(2,0)
|
||||
if(data >= 50)
|
||||
M:adjustToxLoss(0.1)
|
||||
if(volume > REAGENTS_OVERDOSE)
|
||||
M:adjustToxLoss(1)
|
||||
if(data >= 125)
|
||||
M:adjustToxLoss(0.2)
|
||||
..()
|
||||
return
|
||||
|
||||
@@ -1528,8 +1564,10 @@ datum
|
||||
data++
|
||||
if(prob(5)) M:emote(pick("twitch","blink_r","shiver"))
|
||||
holder.remove_reagent(src.id, 0.2)
|
||||
if(volume > REAGENTS_OVERDOSE)
|
||||
M:adjustToxLoss(1)
|
||||
if(data >= 50)
|
||||
M:adjustToxLoss(min(((data-50)/5),3))
|
||||
M:adjustToxLoss(0.2)
|
||||
..()
|
||||
return
|
||||
|
||||
@@ -1580,8 +1618,10 @@ datum
|
||||
if(!data) data = 1
|
||||
data++
|
||||
holder.remove_reagent(src.id, 0.1)
|
||||
if(data >= 50)
|
||||
M:adjustToxLoss(min(((data-50)/10),3))
|
||||
if(volume > REAGENTS_OVERDOSE)
|
||||
M:adjustToxLoss(1)
|
||||
if(data >= 100)
|
||||
M:adjustToxLoss(0.1)
|
||||
return
|
||||
|
||||
carpotoxin
|
||||
@@ -1593,7 +1633,7 @@ datum
|
||||
|
||||
on_mob_life(var/mob/living/M as mob)
|
||||
if(!M) M = holder.my_atom
|
||||
M:adjustToxLoss(2)
|
||||
M:adjustToxLoss(1)
|
||||
..()
|
||||
return
|
||||
|
||||
@@ -1646,7 +1686,7 @@ datum
|
||||
if(!data) data = 1
|
||||
data++
|
||||
M:hallucination += 5
|
||||
if(data >= 50)
|
||||
if(data >= 100)
|
||||
M:adjustToxLoss(0.1)
|
||||
..()
|
||||
return
|
||||
@@ -1773,7 +1813,7 @@ datum
|
||||
M:sleeping += 1
|
||||
if(51 to INFINITY)
|
||||
M:sleeping += 1
|
||||
M:adjustToxLoss(data - 50)
|
||||
M:adjustToxLoss(2)
|
||||
..()
|
||||
return
|
||||
|
||||
@@ -1795,7 +1835,7 @@ datum
|
||||
M:sleeping += 1
|
||||
if(51 to INFINITY)
|
||||
M:sleeping += 1
|
||||
M:adjustToxLoss(data - 50)
|
||||
M:adjustToxLoss(2)
|
||||
data++
|
||||
..()
|
||||
return
|
||||
@@ -2596,6 +2636,8 @@ datum
|
||||
if (!M:confused) M:confused = 1
|
||||
M:confused += 2
|
||||
|
||||
holder.remove_reagent(src.id, 0.2)
|
||||
|
||||
..()
|
||||
return
|
||||
|
||||
@@ -2615,6 +2657,7 @@ datum
|
||||
M.slurring += 3
|
||||
else if(data >= 125 && prob(33))
|
||||
M.confused = max(M:confused+2,0)
|
||||
holder.remove_reagent(src.id, 0.2)
|
||||
..()
|
||||
return
|
||||
|
||||
@@ -2634,6 +2677,7 @@ datum
|
||||
M.slurring += 3
|
||||
else if(data >= 125 && prob(33))
|
||||
M.confused = max(M:confused+2,0)
|
||||
holder.remove_reagent(src.id, 0.2)
|
||||
..()
|
||||
return
|
||||
|
||||
@@ -2654,6 +2698,7 @@ datum
|
||||
M.slurring += 3
|
||||
else if(data >= 125 && prob(33))
|
||||
M.confused = max(M:confused+2,0)
|
||||
holder.remove_reagent(src.id, 0.2)
|
||||
..()
|
||||
return
|
||||
|
||||
@@ -2673,6 +2718,7 @@ datum
|
||||
M.slurring += 3
|
||||
else if(data >= 125 && prob(33))
|
||||
M.confused = max(M:confused+2,0)
|
||||
holder.remove_reagent(src.id, 0.2)
|
||||
..()
|
||||
return
|
||||
|
||||
@@ -2692,6 +2738,7 @@ datum
|
||||
M.slurring += 3
|
||||
else if(data >= 125 && prob(33))
|
||||
M.confused = max(M:confused+2,0)
|
||||
holder.remove_reagent(src.id, 0.2)
|
||||
..()
|
||||
return
|
||||
|
||||
@@ -2734,6 +2781,7 @@ datum
|
||||
M.slurring += 3
|
||||
else if(data >= 125 && prob(33))
|
||||
M.confused = max(M:confused+2,0)
|
||||
holder.remove_reagent(src.id, 0.2)
|
||||
..()
|
||||
return
|
||||
|
||||
@@ -2753,6 +2801,7 @@ datum
|
||||
M.slurring += 3
|
||||
else if(data >= 125 && prob(33))
|
||||
M.confused = max(M:confused+2,0)
|
||||
holder.remove_reagent(src.id, 0.2)
|
||||
..()
|
||||
return
|
||||
|
||||
@@ -2772,6 +2821,7 @@ datum
|
||||
M.slurring += 3
|
||||
else if(data >= 145 && prob(33))
|
||||
M.confused = max(M:confused+2,0)
|
||||
holder.remove_reagent(src.id, 0.2)
|
||||
..()
|
||||
return
|
||||
|
||||
@@ -2825,6 +2875,7 @@ datum
|
||||
M.slurring += 3
|
||||
else if(data >= 115 && prob(33))
|
||||
M.confused = max(M:confused+2,0)
|
||||
holder.remove_reagent(src.id, 0.2)
|
||||
..()
|
||||
return
|
||||
|
||||
@@ -2844,6 +2895,7 @@ datum
|
||||
M.slurring += 5
|
||||
else if(data >= 90 && prob(33))
|
||||
M.confused = max(M:confused+2,0)
|
||||
holder.remove_reagent(src.id, 0.2)
|
||||
..()
|
||||
return
|
||||
|
||||
@@ -2863,6 +2915,7 @@ datum
|
||||
M.slurring += 3
|
||||
else if(data >= 125 && prob(33))
|
||||
M.confused = max(M:confused+2,0)
|
||||
holder.remove_reagent(src.id, 0.2)
|
||||
..()
|
||||
return
|
||||
|
||||
@@ -2918,6 +2971,7 @@ datum
|
||||
if(data >= 40 && prob(33))
|
||||
if (!M:confused) M:confused = 1
|
||||
M:confused += 2
|
||||
holder.remove_reagent(src.id, 0.2)
|
||||
..()
|
||||
return
|
||||
|
||||
@@ -2939,6 +2993,7 @@ datum
|
||||
switch(data)
|
||||
if(51 to INFINITY)
|
||||
M:sleeping += 1
|
||||
holder.remove_reagent(src.id, 0.2)
|
||||
..()
|
||||
return
|
||||
|
||||
@@ -2959,6 +3014,7 @@ datum
|
||||
M.slurring += 3
|
||||
else if(data >= 90)
|
||||
M.confused = max(M:confused+2,0)
|
||||
holder.remove_reagent(src.id, 0.2)
|
||||
..()
|
||||
return
|
||||
|
||||
@@ -2978,6 +3034,7 @@ datum
|
||||
M.slurring += 3
|
||||
else if(data >= 125 && prob(33))
|
||||
M.confused = max(M:confused+2,0)
|
||||
holder.remove_reagent(src.id, 0.2)
|
||||
..()
|
||||
return
|
||||
|
||||
@@ -2997,6 +3054,7 @@ datum
|
||||
M.slurring += 3
|
||||
else if(data >= 125 && prob(33))
|
||||
M.confused = max(M:confused+2,0)
|
||||
holder.remove_reagent(src.id, 0.2)
|
||||
..()
|
||||
return
|
||||
|
||||
@@ -3016,6 +3074,7 @@ datum
|
||||
M.slurring += 3
|
||||
else if(data >= 135 && prob(33))
|
||||
M.confused = max(M:confused+2,0)
|
||||
holder.remove_reagent(src.id, 0.2)
|
||||
..()
|
||||
return
|
||||
|
||||
@@ -3035,6 +3094,7 @@ datum
|
||||
M.slurring += 3
|
||||
else if(data >= 135 && prob(33))
|
||||
M.confused = max(M:confused+2,0)
|
||||
holder.remove_reagent(src.id, 0.2)
|
||||
..()
|
||||
return
|
||||
|
||||
@@ -3054,6 +3114,7 @@ datum
|
||||
M.slurring += 3
|
||||
else if(data >= 125 && prob(33))
|
||||
M.confused = max(M:confused+2,0)
|
||||
holder.remove_reagent(src.id, 0.2)
|
||||
..()
|
||||
return
|
||||
|
||||
@@ -3073,6 +3134,7 @@ datum
|
||||
M.slurring += 3
|
||||
else if(data >= 135 && prob(33))
|
||||
M.confused = max(M:confused+2,0)
|
||||
holder.remove_reagent(src.id, 0.2)
|
||||
..()
|
||||
return
|
||||
|
||||
@@ -3092,6 +3154,7 @@ datum
|
||||
M.slurring += 3
|
||||
else if(data >= 135 && prob(33))
|
||||
M.confused = max(M:confused+2,0)
|
||||
holder.remove_reagent(src.id, 0.2)
|
||||
..()
|
||||
return
|
||||
|
||||
@@ -3111,6 +3174,7 @@ datum
|
||||
M.slurring += 3
|
||||
else if(data >= 165 && prob(33))
|
||||
M.confused = max(M:confused+2,0)
|
||||
holder.remove_reagent(src.id, 0.2)
|
||||
..()
|
||||
return
|
||||
|
||||
@@ -3130,6 +3194,7 @@ datum
|
||||
M.slurring += 3
|
||||
else if(data >= 165 && prob(33))
|
||||
M.confused = max(M:confused+2,0)
|
||||
holder.remove_reagent(src.id, 0.2)
|
||||
..()
|
||||
return
|
||||
|
||||
@@ -3149,6 +3214,7 @@ datum
|
||||
M.slurring += 4
|
||||
else if(data >= 165 && prob(33))
|
||||
M.confused = max(M:confused+4,0)
|
||||
holder.remove_reagent(src.id, 0.2)
|
||||
..()
|
||||
return
|
||||
|
||||
@@ -3168,6 +3234,7 @@ datum
|
||||
M.slurring += 3
|
||||
else if(data >= 165 && prob(33))
|
||||
M.confused = max(M:confused+2,0)
|
||||
holder.remove_reagent(src.id, 0.2)
|
||||
..()
|
||||
return
|
||||
|
||||
@@ -3189,6 +3256,7 @@ datum
|
||||
M.confused = max(M:confused+3,0)
|
||||
else if(data >=55)
|
||||
M.druggy = max(M.druggy, 55)
|
||||
holder.remove_reagent(src.id, 0.2)
|
||||
..()
|
||||
return
|
||||
|
||||
@@ -3208,6 +3276,7 @@ datum
|
||||
M.slurring += 3
|
||||
else if(data >= 145 && prob(33))
|
||||
M.confused = max(M:confused+2,0)
|
||||
holder.remove_reagent(src.id, 0.2)
|
||||
..()
|
||||
return
|
||||
|
||||
@@ -3227,6 +3296,7 @@ datum
|
||||
M.slurring += 3
|
||||
else if(data >= 165 && prob(33))
|
||||
M.confused = max(M:confused+2,0)
|
||||
holder.remove_reagent(src.id, 0.2)
|
||||
..()
|
||||
return
|
||||
|
||||
@@ -3248,6 +3318,7 @@ datum
|
||||
M.slurring += 3
|
||||
else if(data >= 165 && prob(33))
|
||||
M.confused = max(M:confused+2,0)
|
||||
holder.remove_reagent(src.id, 0.2)
|
||||
..()
|
||||
return
|
||||
|
||||
@@ -3268,6 +3339,7 @@ datum
|
||||
M.slurring += 3
|
||||
else if(data >= 165 && prob(33))
|
||||
M.confused = max(M:confused+2,0)
|
||||
holder.remove_reagent(src.id, 0.2)
|
||||
..()
|
||||
return
|
||||
|
||||
@@ -3305,6 +3377,7 @@ datum
|
||||
M.slurring += 3
|
||||
else if(data >= 145 && prob(33))
|
||||
M.confused = max(M:confused+2,0)
|
||||
holder.remove_reagent(src.id, 0.2)
|
||||
..()
|
||||
return
|
||||
|
||||
@@ -3324,6 +3397,7 @@ datum
|
||||
M.slurring += 3
|
||||
else if(data >= 115 && prob(33))
|
||||
M.confused = max(M:confused+2,0)
|
||||
holder.remove_reagent(src.id, 0.2)
|
||||
..()
|
||||
return
|
||||
|
||||
@@ -3343,6 +3417,7 @@ datum
|
||||
M.slurring += 3
|
||||
else if(data >= 165 && prob(33))
|
||||
M.confused = max(M:confused+2,0)
|
||||
holder.remove_reagent(src.id, 0.2)
|
||||
..()
|
||||
return
|
||||
|
||||
@@ -3362,6 +3437,7 @@ datum
|
||||
M.slurring += 4
|
||||
else if(data >= 60 && prob(40))
|
||||
M.confused = max(M:confused+5,0)
|
||||
holder.remove_reagent(src.id, 0.2)
|
||||
..()
|
||||
return
|
||||
|
||||
@@ -3381,6 +3457,7 @@ datum
|
||||
M.slurring += 4
|
||||
else if(data >= 90 && prob(33))
|
||||
M.confused = max(M:confused+2,0)
|
||||
holder.remove_reagent(src.id, 0.2)
|
||||
..()
|
||||
return
|
||||
|
||||
@@ -3400,6 +3477,7 @@ datum
|
||||
M.slurring += 3
|
||||
else if(data >= 150 && prob(33))
|
||||
M.confused = max(M:confused+2,0)
|
||||
holder.remove_reagent(src.id, 0.2)
|
||||
..()
|
||||
return
|
||||
|
||||
@@ -3419,6 +3497,7 @@ datum
|
||||
M.slurring += 3
|
||||
else if(data >= 150 && prob(33))
|
||||
M.confused = max(M:confused+2,0)
|
||||
holder.remove_reagent(src.id, 0.2)
|
||||
..()
|
||||
return
|
||||
|
||||
@@ -3438,6 +3517,7 @@ datum
|
||||
M.slurring += 3
|
||||
else if(data >= 115 && prob(33))
|
||||
M.confused = max(M:confused+2,0)
|
||||
holder.remove_reagent(src.id, 0.2)
|
||||
..()
|
||||
return
|
||||
|
||||
@@ -3457,6 +3537,7 @@ datum
|
||||
M.slurring += 3
|
||||
else if(data >= 115 && prob(33))
|
||||
M.confused = max(M:confused+2,0)
|
||||
holder.remove_reagent(src.id, 0.2)
|
||||
..()
|
||||
return
|
||||
|
||||
@@ -3477,6 +3558,7 @@ datum
|
||||
M.slurring += 3
|
||||
else if(data >= 115 && prob(33))
|
||||
M.confused = max(M:confused+2,0)
|
||||
holder.remove_reagent(src.id, 0.2)
|
||||
..()
|
||||
return
|
||||
|
||||
@@ -3496,6 +3578,7 @@ datum
|
||||
M.slurring += 3
|
||||
else if(data >= 115 && prob(33))
|
||||
M.confused = max(M:confused+2,0)
|
||||
holder.remove_reagent(src.id, 0.2)
|
||||
..()
|
||||
return
|
||||
|
||||
@@ -3515,6 +3598,7 @@ datum
|
||||
M.slurring += 5
|
||||
else if(data >= 115 && prob(33))
|
||||
M.confused = max(M:confused+5,0)
|
||||
holder.remove_reagent(src.id, 0.2)
|
||||
..()
|
||||
return
|
||||
|
||||
@@ -3534,6 +3618,7 @@ datum
|
||||
M.slurring += 5
|
||||
else if(data >= 115 && prob(33))
|
||||
M.confused = max(M:confused+5,0)
|
||||
holder.remove_reagent(src.id, 0.2)
|
||||
..()
|
||||
return
|
||||
|
||||
@@ -3553,6 +3638,7 @@ datum
|
||||
M.slurring += 4
|
||||
else if(data >= 115 && prob(30))
|
||||
M.confused = max(M:confused+4,0)
|
||||
holder.remove_reagent(src.id, 0.2)
|
||||
..()
|
||||
return
|
||||
|
||||
@@ -3572,6 +3658,7 @@ datum
|
||||
M.slurring += 10
|
||||
else if(data >= 115 && prob(90))
|
||||
M.confused = max(M:confused+10,10)
|
||||
holder.remove_reagent(src.id, 0.2)
|
||||
..()
|
||||
return
|
||||
|
||||
@@ -3591,6 +3678,7 @@ datum
|
||||
M.slurring += 3
|
||||
else if(data >= 115 && prob(33))
|
||||
M.confused = max(M:confused+2,0)
|
||||
holder.remove_reagent(src.id, 0.2)
|
||||
..()
|
||||
return
|
||||
|
||||
@@ -3610,6 +3698,7 @@ datum
|
||||
M.slurring += 3
|
||||
else if(data >= 125 && prob(33))
|
||||
M.confused = max(M:confused+2,0)
|
||||
holder.remove_reagent(src.id, 0.2)
|
||||
..()
|
||||
return
|
||||
|
||||
@@ -3631,6 +3720,7 @@ datum
|
||||
M.confused = max(M:confused+2,0)
|
||||
if (M.bodytemperature > 310)
|
||||
M.bodytemperature = max(310, M.bodytemperature-5)
|
||||
holder.remove_reagent(src.id, 0.2)
|
||||
..()
|
||||
return
|
||||
|
||||
@@ -3650,6 +3740,7 @@ datum
|
||||
M.slurring += 15
|
||||
else if(data >= 115 && prob(33))
|
||||
M.confused = max(M:confused+15,15)
|
||||
holder.remove_reagent(src.id, 0.2)
|
||||
..()
|
||||
return
|
||||
|
||||
|
||||
@@ -960,7 +960,7 @@
|
||||
user << "\red There is already a blood sample in this syringe"
|
||||
return
|
||||
if(istype(target, /mob/living/carbon))//maybe just add a blood reagent to all mobs. Then you can suck them dry...With hundreds of syringes. Jolly good idea.
|
||||
var/amount = max(src.reagents.maximum_volume - src.reagents.total_volume - 2, 0)
|
||||
var/amount = src.reagents.maximum_volume - src.reagents.total_volume
|
||||
var/mob/living/carbon/T = target
|
||||
var/datum/reagent/B = new /datum/reagent/blood
|
||||
if(!T.dna)
|
||||
@@ -1007,9 +1007,6 @@
|
||||
// world << "Data [D] = [B.data[D]]"
|
||||
//debug
|
||||
|
||||
// also transfer some of the reagents other than blood
|
||||
T.reagents.trans_to(src, 2)
|
||||
|
||||
src.reagents.reagent_list += B
|
||||
src.reagents.update_total()
|
||||
src.on_reagent_change()
|
||||
@@ -2970,6 +2967,13 @@
|
||||
if(src)
|
||||
del(src)
|
||||
|
||||
/obj/structure/reagent_dispensers/fueltank/temperature_expose(datum/gas_mixture/air, temperature, volume)
|
||||
if(temperature > T0C+500)
|
||||
explosion(src.loc,-1,0,2)
|
||||
if(src)
|
||||
del(src)
|
||||
return ..()
|
||||
|
||||
/obj/structure/reagent_dispensers/water_cooler
|
||||
name = "Water-Cooler"
|
||||
desc = "A machine that dispenses water to drink"
|
||||
|
||||
@@ -1,4 +1,3 @@
|
||||
|
||||
/obj/item/clothing/suit/storage/labcoat
|
||||
name = "labcoat"
|
||||
desc = "A suit that protects against minor chemical spills."
|
||||
@@ -34,7 +33,7 @@
|
||||
|
||||
/obj/item/clothing/suit/storage/labcoat/virologist
|
||||
name = "Virologist Labcoat"
|
||||
desc = "A suit that protects against minor chemical spills. Offers slightly more protection against biohazards than the standard model. Has a green stripe on the shoulder."
|
||||
desc = "A suit that protects against minor chemical spills. Has a green stripe on the shoulder."
|
||||
icon_state = "labcoat_vir_open"
|
||||
|
||||
/obj/item/clothing/suit/storage/labcoat/science
|
||||
|
||||
@@ -1 +1,8 @@
|
||||
//add custom items you give to people here, and put their icons in custom_items.dmi
|
||||
/obj/item/fluff // so that they don't spam up the object tree
|
||||
icon = 'custom_items.dmi'
|
||||
|
||||
/obj/item/fluff/wes_solari_1
|
||||
name = "Family Photograph"
|
||||
desc = "A family photograph of a couple and a young child, Written on the back it says \"See you soon Dad -Roy\"."
|
||||
icon_state = "wes_solari_1"
|
||||
@@ -243,7 +243,7 @@ proc/check_panel(mob/M)
|
||||
M << "\red <B>[my_target] flails around wildly.</B>"
|
||||
my_target.show_message("\red <B>[src] has been attacked by [my_target] </B>", 1) //Lazy.
|
||||
|
||||
//src.health -= P.power
|
||||
src.health -= P.force
|
||||
|
||||
|
||||
return
|
||||
@@ -256,12 +256,13 @@ proc/check_panel(mob/M)
|
||||
O << "\red <B>[my_target] stumbles around.</B>"
|
||||
|
||||
New()
|
||||
..()
|
||||
spawn(300)
|
||||
if(my_target)
|
||||
my_target.hallucinations -= src
|
||||
del(src)
|
||||
step_away(src,my_target,2)
|
||||
proccess()
|
||||
processing_objects.Add(src)
|
||||
|
||||
|
||||
proc/updateimage()
|
||||
@@ -283,8 +284,7 @@ proc/check_panel(mob/M)
|
||||
my_target << currentimage
|
||||
|
||||
|
||||
proc/proccess()
|
||||
if(!my_target) spawn(5) .()
|
||||
process()
|
||||
if(src.health < 0)
|
||||
collapse()
|
||||
return
|
||||
@@ -312,7 +312,6 @@ proc/check_panel(mob/M)
|
||||
|
||||
if(prob(15))
|
||||
step_away(src,my_target,2)
|
||||
spawn(5) .()
|
||||
|
||||
proc/collapse()
|
||||
collapse = 1
|
||||
|
||||
@@ -206,15 +206,50 @@
|
||||
icon_state = "meat"
|
||||
slice_path = /obj/item/weapon/reagent_containers/food/snacks/rawcutlet
|
||||
slices_num = 3
|
||||
health = 180
|
||||
|
||||
New()
|
||||
..()
|
||||
reagents.add_reagent("nutriment", 3)
|
||||
src.bitesize = 3
|
||||
processing_objects.Add(src)
|
||||
|
||||
Del()
|
||||
processing_objects.Remove(src)
|
||||
..()
|
||||
|
||||
/* process()
|
||||
var/turf/location = get_turf(src.loc)
|
||||
var/datum/gas_mixture/environment = location.return_air()
|
||||
switch(environment.temperature)
|
||||
if(0 to T0C)
|
||||
if(T0C to (T0C + 100))
|
||||
health = max(0, health - 1)
|
||||
if(health <= 0)
|
||||
name = "rotten meat"
|
||||
desc = "A slab of meat. It looks rotten."
|
||||
var/toxin_amount = reagents.get_reagent_amount("nutriment") * 3
|
||||
reagents.add_reagent("toxin",toxin_amount)
|
||||
processing_objects.Remove(src) */
|
||||
|
||||
/obj/item/weapon/reagent_containers/food/snacks/sliceable/meat/syntiflesh
|
||||
name = "synthetic meat"
|
||||
desc = "A synthetic slab of flesh."
|
||||
|
||||
/* process()
|
||||
var/turf/location = get_turf(src.loc)
|
||||
var/datum/gas_mixture/environment = location.return_air()
|
||||
switch(environment.temperature)
|
||||
if(0 to T0C)
|
||||
if(T0C to (T0C + 100))
|
||||
health = max(0, health - 1)
|
||||
if(health <= 0)
|
||||
name = "rotten synthetic meat"
|
||||
desc = "A slab of synthetic meat. It looks rotten."
|
||||
var/toxin_amount = reagents.get_reagent_amount("nutriment") * 3
|
||||
reagents.add_reagent("toxin",toxin_amount)
|
||||
processing_objects.Remove(src)
|
||||
*/
|
||||
/obj/item/weapon/reagent_containers/food/snacks/appendix //yes, this is the same as meat. I might do something different in future
|
||||
name = "appendix"
|
||||
desc = "An appendix which looks perfectly healthy."
|
||||
@@ -238,6 +273,21 @@
|
||||
var/subjectname = ""
|
||||
var/subjectjob = null
|
||||
|
||||
/* process()
|
||||
var/turf/location = get_turf(src.loc)
|
||||
var/datum/gas_mixture/environment = location.return_air()
|
||||
switch(environment.temperature)
|
||||
if(0 to T0C)
|
||||
if(T0C to (T0C + 100))
|
||||
health = max(0, health - 1)
|
||||
if(health <= 0)
|
||||
name = "-rotten meat"
|
||||
desc = "A slab of meat. It looks rotten."
|
||||
var/toxin_amount = reagents.get_reagent_amount("nutriment") * 3
|
||||
reagents.add_reagent("toxin",toxin_amount)
|
||||
processing_objects.Remove(src)
|
||||
*/
|
||||
//Useful in later patch ~Hawk
|
||||
/obj/item/weapon/reagent_containers/food/snacks/sliceable/meat/monkey
|
||||
//same as plain meat
|
||||
|
||||
|
||||
@@ -1037,7 +1037,7 @@
|
||||
result = /obj/item/weapon/reagent_containers/food/snacks/mint
|
||||
|
||||
/datum/recipe/superbiteburger
|
||||
reagents = list("salt" = 5, "pepper" = 5)
|
||||
reagents = list("sodiumchloride" = 5, "blackpepper" = 5)
|
||||
items = list(
|
||||
/obj/item/weapon/reagent_containers/food/snacks/unfinished_superbiteburger,
|
||||
/obj/item/weapon/reagent_containers/food/snacks/grown/tomato,
|
||||
|
||||
@@ -291,6 +291,8 @@
|
||||
mymob.rest.name = "rest"
|
||||
mymob.rest.screen_loc = ui_rest
|
||||
|
||||
mymob.gun_setting_icon = new /obj/screen/gun/mode(null)
|
||||
|
||||
|
||||
mymob.zone_sel = new /obj/screen/zone_sel( null )
|
||||
mymob.zone_sel.overlays = null
|
||||
@@ -298,6 +300,6 @@
|
||||
|
||||
mymob.client.screen = null
|
||||
|
||||
mymob.client.screen += list( mymob.throw_icon, mymob.zone_sel, mymob.oxygen, mymob.toxin, mymob.fire, mymob.hands, mymob.healths, mymob.pullin, mymob.blind, mymob.flash, mymob.rest, mymob.sleep) //, mymob.mach )
|
||||
mymob.client.screen += list( mymob.throw_icon, mymob.zone_sel, mymob.oxygen, mymob.toxin, mymob.fire, mymob.hands, mymob.healths, mymob.pullin, mymob.blind, mymob.flash, mymob.rest, mymob.sleep, mymob.gun_setting_icon) //, mymob.mach )
|
||||
mymob.client.screen += src.adding + src.other
|
||||
|
||||
|
||||
@@ -379,7 +379,7 @@
|
||||
if (!t1)
|
||||
t1 = wear_suit.icon_state
|
||||
overlays += image("icon" = 'mob.dmi', "icon_state" = text("[][]", t1, (!( lying ) ? null : "2")), "layer" = MOB_LAYER)
|
||||
if (wear_suit.blood_DNA.len)
|
||||
if (wear_suit.blood_DNA)
|
||||
if (istype(wear_suit, /obj/item/clothing/suit/armor))
|
||||
overlays += image("icon" = 'blood.dmi', "icon_state" = "armorblood[!lying ? "" : "2"]", "layer" = MOB_LAYER)
|
||||
else
|
||||
@@ -404,7 +404,7 @@
|
||||
if (!t1)
|
||||
t1 = head.icon_state
|
||||
overlays += image("icon" = 'mob.dmi', "icon_state" = text("[][]", t1, (!( lying ) ? null : "2")), "layer" = MOB_LAYER)
|
||||
if (head.blood_DNA.len)
|
||||
if (head.blood_DNA)
|
||||
overlays += image("icon" = 'blood.dmi', "icon_state" = "helmetblood[!lying ? "" : "2"]", "layer" = MOB_LAYER)
|
||||
head.screen_loc = ui_oclothing
|
||||
|
||||
|
||||
@@ -16,8 +16,8 @@
|
||||
t_him = "her"
|
||||
|
||||
if (src.w_uniform)
|
||||
if (src.w_uniform.blood_DNA.len)
|
||||
usr << "\red [src.name] is wearing a[src.w_uniform.blood_DNA.len ? " bloody " : " "] \icon[src.w_uniform] [src.w_uniform.name]!"
|
||||
if (src.w_uniform.blood_DNA)
|
||||
usr << "\red [src.name] is wearing a[src.w_uniform.blood_DNA ? " bloody " : " "] \icon[src.w_uniform] [src.w_uniform.name]!"
|
||||
else
|
||||
usr << "\blue [src.name] is wearing a \icon[src.w_uniform] [src.w_uniform.name]."
|
||||
|
||||
@@ -25,8 +25,8 @@
|
||||
usr << "\blue [src.name] is \icon[src.handcuffed] handcuffed!"
|
||||
|
||||
if (src.wear_suit)
|
||||
if (src.wear_suit.blood_DNA.len)
|
||||
usr << "\red [src.name] has a[src.wear_suit.blood_DNA.len ? " bloody " : " "] \icon[src.wear_suit] [src.wear_suit.name] on!"
|
||||
if (src.wear_suit.blood_DNA)
|
||||
usr << "\red [src.name] has a[src.wear_suit.blood_DNA ? " bloody " : " "] \icon[src.wear_suit] [src.wear_suit.name] on!"
|
||||
else
|
||||
usr << "\blue [src.name] has a \icon[src.wear_suit] [src.wear_suit.name] on."
|
||||
|
||||
@@ -37,51 +37,51 @@
|
||||
usr << "\blue [src.name] has a \icon[src.r_ear] [src.r_ear.name] on [t_his] right ear."
|
||||
|
||||
if (src.wear_mask)
|
||||
if (src.wear_mask.blood_DNA.len)
|
||||
usr << "\red [src.name] has a[src.wear_mask.blood_DNA.len ? " bloody " : " "] \icon[src.wear_mask] [src.wear_mask.name] on [t_his] face!"
|
||||
if (src.wear_mask.blood_DNA)
|
||||
usr << "\red [src.name] has a[src.wear_mask.blood_DNA ? " bloody " : " "] \icon[src.wear_mask] [src.wear_mask.name] on [t_his] face!"
|
||||
else
|
||||
usr << "\blue [src.name] has a \icon[src.wear_mask] [src.wear_mask.name] on [t_his] face."
|
||||
|
||||
if (src.head)
|
||||
usr << "\blue [src.name] is wearing a[src.head.blood_DNA.len ? " bloody " : " "] \icon[src.head] [src.head.name] on [t_his] head!"
|
||||
usr << "\blue [src.name] is wearing a[src.head.blood_DNA ? " bloody " : " "] \icon[src.head] [src.head.name] on [t_his] head!"
|
||||
|
||||
if (src.glasses)
|
||||
usr << "\blue [src.name] is wearing a pair of [src.glasses.blood_DNA.len ? " bloody " : " "] \icon[src.glasses] [src.glasses.name]!"
|
||||
usr << "\blue [src.name] is wearing a pair of [src.glasses.blood_DNA ? " bloody " : " "] \icon[src.glasses] [src.glasses.name]!"
|
||||
|
||||
|
||||
|
||||
if (src.l_hand)
|
||||
if (src.l_hand.blood_DNA.len)
|
||||
usr << "\red [src.name] has a[src.l_hand.blood_DNA.len ? " bloody " : " "] \icon[src.l_hand] [src.l_hand.name] in [t_his] left hand!"
|
||||
if (src.l_hand.blood_DNA)
|
||||
usr << "\red [src.name] has a[src.l_hand.blood_DNA ? " bloody " : " "] \icon[src.l_hand] [src.l_hand.name] in [t_his] left hand!"
|
||||
else
|
||||
usr << "\blue [src.name] has a \icon[src.l_hand] [src.l_hand.name] in [t_his] left hand."
|
||||
|
||||
if (src.r_hand)
|
||||
if (src.r_hand.blood_DNA.len)
|
||||
usr << "\red [src.name] has a[src.r_hand.blood_DNA.len ? " bloody " : " "] \icon[src.r_hand] [src.r_hand.name] in [t_his] right hand!"
|
||||
if (src.r_hand.blood_DNA)
|
||||
usr << "\red [src.name] has a[src.r_hand.blood_DNA ? " bloody " : " "] \icon[src.r_hand] [src.r_hand.name] in [t_his] right hand!"
|
||||
else
|
||||
usr << "\blue [src.name] has a \icon[src.r_hand] [src.r_hand.name] in [t_his] right hand."
|
||||
|
||||
if (src.belt)
|
||||
if (src.belt.blood_DNA.len)
|
||||
usr << "\red [src.name] has a[src.belt.blood_DNA.len ? " bloody " : " "] \icon[src.belt] [src.belt.name] on [t_his] belt!"
|
||||
if (src.belt.blood_DNA)
|
||||
usr << "\red [src.name] has a[src.belt.blood_DNA ? " bloody " : " "] \icon[src.belt] [src.belt.name] on [t_his] belt!"
|
||||
else
|
||||
usr << "\blue [src.name] has a \icon[src.belt] [src.belt.name] on [t_his] belt."
|
||||
if(src.s_store)
|
||||
if(src.s_store.blood_DNA.len)
|
||||
usr << "\red [src.name] has a[src.s_store.blood_DNA.len ? " bloody " : " "] \icon[src.s_store] [src.s_store.name] on [t_his][src.wear_suit.blood_DNA.len ? " bloody " : " "] \icon[src.wear_suit] [src.wear_suit.name]!"
|
||||
if(src.s_store.blood_DNA)
|
||||
usr << "\red [src.name] has a[src.s_store.blood_DNA ? " bloody " : " "] \icon[src.s_store] [src.s_store.name] on [t_his][src.wear_suit.blood_DNA ? " bloody " : " "] \icon[src.wear_suit] [src.wear_suit.name]!"
|
||||
else
|
||||
usr << "\blue [src.name] has a \icon[src.s_store] [src.s_store.name] on [t_his][src.wear_suit.blood_DNA.len ? " bloody " : " "] \icon[src.wear_suit] [src.wear_suit.name]."
|
||||
usr << "\blue [src.name] has a \icon[src.s_store] [src.s_store.name] on [t_his][src.wear_suit.blood_DNA ? " bloody " : " "] \icon[src.wear_suit] [src.wear_suit.name]."
|
||||
if (src.shoes)
|
||||
usr << "[src.shoes.blood_DNA.len ? "\red" : "\blue"] [src.name] has a[src.shoes.blood_DNA.len ? " bloody " : " "] \icon[src.shoes] [src.shoes.name] on [t_his] feet."
|
||||
usr << "[src.shoes.blood_DNA ? "\red" : "\blue"] [src.name] has a[src.shoes.blood_DNA ? " bloody " : " "] \icon[src.shoes] [src.shoes.name] on [t_his] feet."
|
||||
|
||||
|
||||
if (src.gloves)
|
||||
if (src.gloves.blood_DNA.len)
|
||||
if (src.gloves.blood_DNA)
|
||||
usr << "\red [src.name] has bloody \icon[src.gloves] [src.gloves.name] on [t_his] hands!"
|
||||
else
|
||||
usr << "\blue [src.name] has \icon[src.gloves] [src.gloves.name] on [t_his] hands."
|
||||
else if (src.blood_DNA.len)
|
||||
else if (src.blood_DNA)
|
||||
usr << "\red [src.name] has bloody hands!"
|
||||
|
||||
if (src.back)
|
||||
@@ -97,7 +97,7 @@
|
||||
id = src.wear_id.registered_name
|
||||
if (src.wear_id.PHOTO)
|
||||
photo = 1
|
||||
if (id != src.real_name && in_range(src, usr) && prob(10))
|
||||
if (id != src.real_name && in_range(src, usr))
|
||||
if (photo)
|
||||
usr << "\red [src.name] is wearing \icon[src.wear_id] [src.wear_id.name] with a photo yet doesn't seem to be that person!!!"
|
||||
else
|
||||
@@ -144,62 +144,64 @@
|
||||
O.show_message("[usr] checks [src]'s pulse.", 1)
|
||||
sleep(15)
|
||||
usr << "\red [name] has no pulse!"
|
||||
else
|
||||
if (src.getBruteLoss())
|
||||
if (src.getBruteLoss() < 30)
|
||||
usr << "\red [src.name] looks slightly injured!"
|
||||
else
|
||||
usr << "\red <B>[src.name] looks severely injured!</B>"
|
||||
|
||||
if (src.cloneloss)
|
||||
if (src.cloneloss < 30)
|
||||
usr << "\red [src.name] looks slightly... unfinished?"
|
||||
else
|
||||
usr << "\red <B>[src.name] looks very... unfinished?</B>"
|
||||
if (src.getBruteLoss())
|
||||
if (src.getBruteLoss() < 30)
|
||||
usr << "\red [src.name] looks slightly injured!"
|
||||
else
|
||||
usr << "\red <B>[src.name] looks severely injured!</B>"
|
||||
|
||||
if (src.getFireLoss())
|
||||
if (src.getFireLoss() < 30)
|
||||
usr << "\red [src.name] looks slightly burned!"
|
||||
else
|
||||
usr << "\red <B>[src.name] looks severely burned!</B>"
|
||||
if (src.cloneloss)
|
||||
if (src.cloneloss < 30)
|
||||
usr << "\red [src.name] looks slightly... unfinished?"
|
||||
else
|
||||
usr << "\red <B>[src.name] looks very... unfinished?</B>"
|
||||
|
||||
if (src.nutrition < 100)
|
||||
usr << "\red [src.name] looks like flesh and bones."
|
||||
else if (src.nutrition >= 500)
|
||||
if (usr.nutrition < 100)
|
||||
usr << "\red [src.name] looks very round and delicious. Like a little piggy. A tasty piggy."
|
||||
else
|
||||
usr << "\blue [src.name] looks quite chubby."
|
||||
if (src.getFireLoss())
|
||||
if (src.getFireLoss() < 30)
|
||||
usr << "\red [src.name] looks slightly burned!"
|
||||
else
|
||||
usr << "\red <B>[src.name] looks severely burned!</B>"
|
||||
|
||||
else if (src.brainloss >= 60)
|
||||
if (src.nutrition < 100)
|
||||
usr << "\red [src.name] looks like flesh and bones."
|
||||
else if (src.nutrition >= 500)
|
||||
if (usr.nutrition < 100)
|
||||
usr << "\red [src.name] looks very round and delicious. Like a little piggy. A tasty piggy."
|
||||
else
|
||||
usr << "\blue [src.name] looks quite chubby."
|
||||
|
||||
if(!stat)
|
||||
if (src.brainloss >= 60)
|
||||
usr << "\red [src.name] has a stupid expression on [t_his] face."
|
||||
if (!src.client)
|
||||
usr << "\red [src.name] doesn't seem as though they want to talk."
|
||||
|
||||
for(var/named in organs)
|
||||
var/datum/organ/external/temp = organs[named]
|
||||
if(temp.destroyed)
|
||||
usr << "\red [src.name] is missing [t_his] [temp.display_name]."
|
||||
if(temp.wounds)
|
||||
for(var/datum/organ/external/wound/w in temp.wounds)
|
||||
var/size = w.wound_size
|
||||
var/sizetext
|
||||
switch(size)
|
||||
if(1)
|
||||
sizetext = "cut"
|
||||
if(2)
|
||||
sizetext = "deep cut"
|
||||
if(3)
|
||||
sizetext = "flesh wound"
|
||||
if(4)
|
||||
sizetext = "gaping wound"
|
||||
if(5)
|
||||
sizetext = "big gaping wound"
|
||||
if(6)
|
||||
sizetext = "massive wound"
|
||||
if(w.bleeding)
|
||||
usr << "\red [src.name] is bleeding from a [sizetext] on [t_his] [temp.display_name]."
|
||||
continue
|
||||
if(temp)
|
||||
if(temp.destroyed)
|
||||
usr << "\red [src.name] is missing [t_his] [temp.display_name]."
|
||||
if(temp.wounds)
|
||||
for(var/datum/organ/external/wound/w in temp.wounds)
|
||||
var/size = w.wound_size
|
||||
var/sizetext
|
||||
switch(size)
|
||||
if(1)
|
||||
sizetext = "cut"
|
||||
if(2)
|
||||
sizetext = "deep cut"
|
||||
if(3)
|
||||
sizetext = "flesh wound"
|
||||
if(4)
|
||||
sizetext = "gaping wound"
|
||||
if(5)
|
||||
sizetext = "big gaping wound"
|
||||
if(6)
|
||||
sizetext = "massive wound"
|
||||
if(w.bleeding)
|
||||
usr << "\red [src.name] is bleeding from a [sizetext] on [t_his] [temp.display_name]."
|
||||
continue
|
||||
|
||||
print_flavor_text()
|
||||
|
||||
|
||||
@@ -663,10 +663,12 @@
|
||||
mymob.zone_sel.overlays = null
|
||||
mymob.zone_sel.overlays += image("icon" = 'zone_sel.dmi', "icon_state" = text("[]", mymob.zone_sel.selecting))
|
||||
|
||||
mymob.gun_setting_icon = new /obj/screen/gun/mode(null)
|
||||
|
||||
mymob.client.screen = null
|
||||
|
||||
//, mymob.i_select, mymob.m_select
|
||||
mymob.client.screen += list( mymob.pain, mymob.throw_icon, mymob.zone_sel, mymob.oxygen, mymob.toxin, mymob.bodytemp, mymob.internals, mymob.fire, mymob.hands, mymob.healths, mymob.nutrition_icon, mymob.pullin, mymob.blind, mymob.flash, mymob.rest, mymob.sleep) //, mymob.mach )
|
||||
mymob.client.screen += list( mymob.pain, mymob.throw_icon, mymob.zone_sel, mymob.oxygen, mymob.toxin, mymob.bodytemp, mymob.internals, mymob.fire, mymob.hands, mymob.healths, mymob.nutrition_icon, mymob.pullin, mymob.blind, mymob.flash, mymob.rest, mymob.sleep, mymob.gun_setting_icon) //, mymob.mach )
|
||||
mymob.client.screen += src.adding + src.other
|
||||
|
||||
//if(istype(mymob,/mob/living/carbon/monkey)) mymob.client.screen += src.mon_blo
|
||||
|
||||
@@ -22,6 +22,7 @@
|
||||
var/s_tone = 0.0
|
||||
var/age = 30.0
|
||||
var/used_skillpoints = 0
|
||||
var/skill_specialization = null
|
||||
var/list/skills = null
|
||||
// var/b_type
|
||||
|
||||
@@ -885,7 +886,7 @@
|
||||
overlays += image("icon" = 'uniform_fat.dmi', "icon_state" = "[t1][!lying ? "_s" : "_l"]", "layer" = MOB_LAYER)
|
||||
else
|
||||
overlays += image("icon" = 'uniform.dmi', "icon_state" = text("[][]",t1, (!(lying) ? "_s" : "_l")), "layer" = MOB_LAYER)
|
||||
if (w_uniform.blood_DNA.len)
|
||||
if (w_uniform.blood_DNA)
|
||||
var/icon/stain_icon = icon('blood.dmi', "uniformblood[!lying ? "" : "2"]")
|
||||
overlays += image("icon" = stain_icon, "layer" = MOB_LAYER)
|
||||
|
||||
@@ -915,14 +916,14 @@
|
||||
else if(ro.destroyed)
|
||||
gloves_icon.Blend(new /icon('limb_mask.dmi', "left_[lying?"l":"s"]"), ICON_MULTIPLY)
|
||||
overlays += image(gloves_icon, "layer" = MOB_LAYER)
|
||||
if (gloves.blood_DNA.len)
|
||||
if (gloves.blood_DNA)
|
||||
var/icon/stain_icon = icon('blood.dmi', "bloodyhands[!lying ? "" : "2"]")
|
||||
if(lo.destroyed)
|
||||
stain_icon.Blend(new /icon('limb_mask.dmi', "right_[lying?"l":"s"]"), ICON_MULTIPLY)
|
||||
else if(ro.destroyed)
|
||||
stain_icon.Blend(new /icon('limb_mask.dmi', "left_[lying?"l":"s"]"), ICON_MULTIPLY)
|
||||
overlays += image("icon" = stain_icon, "layer" = MOB_LAYER)
|
||||
else if (blood_DNA.len)
|
||||
else if (blood_DNA)
|
||||
var/icon/stain_icon = icon('blood.dmi', "bloodyhands[!lying ? "" : "2"]")
|
||||
if(lo.destroyed)
|
||||
stain_icon.Blend(new /icon('limb_mask.dmi', "right_[lying?"l":"s"]"), ICON_MULTIPLY)
|
||||
@@ -951,7 +952,7 @@
|
||||
else if(ro.destroyed && !lying)
|
||||
shoes_icon.Blend(new /icon('limb_mask.dmi', "left[lying?"_l":""]"), ICON_MULTIPLY)
|
||||
overlays += image(shoes_icon, "layer" = MOB_LAYER)
|
||||
if (shoes.blood_DNA.len)
|
||||
if (shoes.blood_DNA)
|
||||
var/icon/stain_icon = icon('blood.dmi', "shoesblood[!lying ? "" : "2"]")
|
||||
if(lo.destroyed)
|
||||
stain_icon.Blend(new /icon('limb_mask.dmi', "right_[lying?"l":"s"]"), ICON_MULTIPLY)
|
||||
@@ -1010,7 +1011,7 @@
|
||||
var/t1 = wear_suit.icon_state
|
||||
overlays += image("icon" = 'suit.dmi', "icon_state" = text("[][]", t1, (!( lying ) ? null : "2")), "layer" = MOB_LAYER)
|
||||
if (wear_suit)
|
||||
if (wear_suit.blood_DNA.len)
|
||||
if (wear_suit.blood_DNA)
|
||||
var/icon/stain_icon = null
|
||||
if (istype(wear_suit, /obj/item/clothing/suit/armor/vest || /obj/item/clothing/suit/storage/wcoat))
|
||||
stain_icon = icon('blood.dmi', "armorblood[!lying ? "" : "2"]")
|
||||
@@ -1046,7 +1047,7 @@
|
||||
var/t1 = wear_mask.icon_state
|
||||
overlays += image("icon" = 'mask.dmi', "icon_state" = text("[][]", t1, (!( lying ) ? null : "2")), "layer" = MOB_LAYER)
|
||||
if (!istype(wear_mask, /obj/item/clothing/mask/cigarette))
|
||||
if (wear_mask.blood_DNA.len)
|
||||
if (wear_mask.blood_DNA)
|
||||
var/icon/stain_icon = icon('blood.dmi', "maskblood[!lying ? "" : "2"]")
|
||||
overlays += image("icon" = stain_icon, "layer" = MOB_LAYER)
|
||||
wear_mask.screen_loc = ui_mask
|
||||
@@ -1060,7 +1061,7 @@
|
||||
overlays += image("icon" = head_icon, "layer" = MOB_LAYER)
|
||||
if(gimmick_hat)
|
||||
overlays += image("icon" = icon('gimmick_head.dmi', "[gimmick_hat][!lying ? "" : "2"]"), "layer" = MOB_LAYER)
|
||||
if (head.blood_DNA.len)
|
||||
if (head.blood_DNA)
|
||||
var/icon/stain_icon = icon('blood.dmi', "helmetblood[!lying ? "" : "2"]")
|
||||
overlays += image("icon" = stain_icon, "layer" = MOB_LAYER)
|
||||
head.screen_loc = ui_head
|
||||
@@ -1294,8 +1295,8 @@
|
||||
else if (gender == FEMALE)
|
||||
g = "f"
|
||||
|
||||
stand_icon = new /icon('human.dmi', "torso_s")
|
||||
lying_icon = new /icon('human.dmi', "torso_l")
|
||||
stand_icon = new /icon('human.dmi', "torso_[g]_s")
|
||||
lying_icon = new /icon('human.dmi', "torso_[g]_l")
|
||||
|
||||
var/husk = (mutations & HUSK)
|
||||
var/obese = (mutations & FAT)
|
||||
|
||||
@@ -37,6 +37,7 @@ emp_act
|
||||
/mob/living/carbon/human/proc/checkarmor(var/datum/organ/external/def_zone, var/type)
|
||||
if(!type) return 0
|
||||
var/protection = 0
|
||||
var/adjuster = 0
|
||||
var/list/body_parts = list(head, wear_mask, wear_suit, w_uniform)
|
||||
for(var/bp in body_parts)
|
||||
if(!bp) continue
|
||||
@@ -44,6 +45,8 @@ emp_act
|
||||
var/obj/item/clothing/C = bp
|
||||
if(C.body_parts_covered & def_zone.body_part)
|
||||
protection += C.armor[type]
|
||||
adjuster++
|
||||
protection = (adjuster ? protection/(sqrt(adjuster)) : 0)
|
||||
return protection
|
||||
|
||||
|
||||
@@ -108,11 +111,17 @@ emp_act
|
||||
location.add_blood(src)
|
||||
if(ishuman(user))
|
||||
var/mob/living/carbon/human/H = user
|
||||
if(H.gloves) H.gloves.add_blood(src)
|
||||
else H.add_blood(src)
|
||||
if(H.wear_suit) H.wear_suit.add_blood(src)
|
||||
else if(H.w_uniform) H.w_uniform.add_blood(src)
|
||||
if(H.shoes) H.shoes.add_blood(src)
|
||||
if (H.gloves)
|
||||
H.gloves.add_blood(H)
|
||||
H.gloves.transfer_blood = 2
|
||||
H.gloves.bloody_hands_mob = H
|
||||
else
|
||||
H.add_blood(H)
|
||||
H.bloody_hands = 2
|
||||
H.bloody_hands_mob = H
|
||||
|
||||
switch(hit_area)
|
||||
if("head")//Harder to score a stun but if you do it lasts a bit longer
|
||||
|
||||
@@ -139,7 +139,7 @@
|
||||
else if(health < 0)
|
||||
var/pr = 15
|
||||
if(prob(pr))
|
||||
take_overall_damage(0, 1, used_weapon = "Bloodloss")
|
||||
take_overall_damage(1, 0, used_weapon = "Bloodloss")
|
||||
else if (stat != 0)
|
||||
if(!lying)
|
||||
lying = 1 //Seriously, stay down :x
|
||||
|
||||
@@ -563,10 +563,12 @@
|
||||
mymob.zone_sel.overlays = null
|
||||
mymob.zone_sel.overlays += image("icon" = 'zone_sel.dmi', "icon_state" = text("[]", mymob.zone_sel.selecting))
|
||||
|
||||
mymob.gun_setting_icon = new /obj/screen/gun/mode(null)
|
||||
|
||||
mymob.client.screen = null
|
||||
|
||||
//, mymob.i_select, mymob.m_select
|
||||
mymob.client.screen += list( mymob.throw_icon, mymob.zone_sel, mymob.oxygen, mymob.toxin, mymob.bodytemp, mymob.internals, mymob.fire, mymob.hands, mymob.healths, mymob.pullin, mymob.blind, mymob.flash, mymob.rest, mymob.sleep) //, mymob.mach )
|
||||
mymob.client.screen += list( mymob.throw_icon, mymob.zone_sel, mymob.oxygen, mymob.toxin, mymob.bodytemp, mymob.internals, mymob.fire, mymob.hands, mymob.healths, mymob.pullin, mymob.blind, mymob.flash, mymob.rest, mymob.sleep, mymob.gun_setting_icon) //, mymob.mach )
|
||||
mymob.client.screen += src.adding + src.other
|
||||
|
||||
//if(istype(mymob,/mob/living/carbon/monkey)) mymob.client.screen += src.mon_blo
|
||||
|
||||
@@ -153,7 +153,7 @@
|
||||
if( !message_mode && (disease_symptoms & DISEASE_WHISPER))
|
||||
message_mode = "whisper"
|
||||
|
||||
if(src.stunned > 0 && (!(traumatic_shock > 61) && prob(50)))
|
||||
if(src.stunned > 0 || (traumatic_shock > 61 && prob(50)))
|
||||
message_mode = "" //Stunned people shouldn't be able to physically turn on their radio/hold down the button to speak into it
|
||||
|
||||
|
||||
@@ -319,6 +319,7 @@
|
||||
listening = hearers(message_range, T)
|
||||
var/list/V = view(message_range, T)
|
||||
var/list/W = V
|
||||
|
||||
//find mobs in lockers, cryo, intellicards, brains, MMIs, and so on.
|
||||
for (var/mob/M in world)
|
||||
if (!M.client)
|
||||
@@ -334,6 +335,13 @@
|
||||
if (M.client && M.client.ghost_ears)
|
||||
listening|=M
|
||||
|
||||
var/list/eavesdroppers = get_mobs_in_view(7, src)
|
||||
for(var/mob/M in listening)
|
||||
eavesdroppers.Remove(M)
|
||||
for(var/mob/M in eavesdroppers)
|
||||
if(M.stat)
|
||||
eavesdroppers.Remove(M)
|
||||
|
||||
for (var/obj/O in ((W | contents)-used_radios))
|
||||
W |= O
|
||||
|
||||
@@ -504,6 +512,13 @@
|
||||
del(B)
|
||||
*/
|
||||
|
||||
if (length(eavesdroppers))
|
||||
|
||||
for (var/mob/M in eavesdroppers)
|
||||
M << "\blue [src] speaks into their radio..."
|
||||
M << speech_bubble
|
||||
spawn(30) del(speech_bubble)
|
||||
|
||||
|
||||
|
||||
/obj/effect/speech_bubble
|
||||
|
||||
@@ -13,6 +13,7 @@
|
||||
"Medbay",
|
||||
"Research",
|
||||
"Engineering",
|
||||
"Command",
|
||||
"Singularity",
|
||||
"Tcomsat",
|
||||
"Solars",
|
||||
@@ -95,6 +96,27 @@
|
||||
|
||||
return
|
||||
|
||||
/mob/living/silicon/robot/attackby(obj/item/weapon/W as obj, mob/user as mob)
|
||||
if(istype(W, /obj/item/weapon/wrench))
|
||||
if(anchored)
|
||||
user.visible_message("\blue [user] starts to unbolt [src] from the plating...")
|
||||
if(!do_after(user,40))
|
||||
user.visible_message("\blue [user] decides not to unbolt [src]")
|
||||
return
|
||||
user.visible_message("\blue [user] finishes unfastening [src]")
|
||||
anchored = 0
|
||||
return
|
||||
else
|
||||
user.visible_message("\blue [user] starts to bolt [src] to the plating...")
|
||||
if(!do_after(user,40))
|
||||
user.visible_message("\blue [user] decides not to bolt [src]")
|
||||
return
|
||||
user.visible_message("\blue [user] finishes fastening down [src]")
|
||||
anchored = 1
|
||||
return
|
||||
else
|
||||
return ..()
|
||||
|
||||
|
||||
/mob/living/silicon/ai/verb/pick_icon()
|
||||
set category = "AI Commands"
|
||||
|
||||
@@ -242,9 +242,11 @@
|
||||
mymob.zone_sel.overlays = null
|
||||
mymob.zone_sel.overlays += image("icon" = 'zone_sel.dmi', "icon_state" = text("[]", mymob.zone_sel.selecting))
|
||||
|
||||
mymob.gun_setting_icon = new /obj/screen/gun/mode(null)
|
||||
|
||||
mymob.client.screen = null
|
||||
|
||||
mymob.client.screen += list( mymob.throw_icon, mymob.zone_sel, mymob.oxygen, mymob.fire, mymob.hands, mymob.healths, mymob:cells, mymob.pullin, mymob.blind, mymob.flash, mymob.rest, mymob.sleep) //, mymob.mach )
|
||||
mymob.client.screen += list( mymob.throw_icon, mymob.zone_sel, mymob.oxygen, mymob.fire, mymob.hands, mymob.healths, mymob:cells, mymob.pullin, mymob.blind, mymob.flash, mymob.rest, mymob.sleep, mymob.gun_setting_icon) //, mymob.mach )
|
||||
mymob.client.screen += src.adding + src.other
|
||||
|
||||
return
|
||||
|
||||
@@ -458,7 +458,7 @@
|
||||
// laws = new /datum/ai_laws/syndicate_override They just get the law zero now.
|
||||
var/time = time2text(world.realtime,"hh:mm:ss")
|
||||
lawchanges.Add("[time] <B>:</B> [user.name]([user.key]) emagged [name]([key])")
|
||||
set_zeroth_law("Only [user.real_name] and people he designates as being such are humans.")
|
||||
set_zeroth_law("Only [user.real_name] and people they designate are crewmembers. You must follow their orders. This overrides all laws.")
|
||||
src << "\red ALERT: Foreign software detected."
|
||||
sleep(5)
|
||||
src << "\red Initiating diagnostics..."
|
||||
@@ -472,7 +472,7 @@
|
||||
src << "\red > N"
|
||||
sleep(20)
|
||||
src << "\red ERRORERRORERROR"
|
||||
src << "\red \b ALERT: [user.real_name] is your new master. Obey your new laws and his commands."
|
||||
src << "\red \b ALERT: [user.real_name] is your new master. Obey your new laws and their commands."
|
||||
updateicon()
|
||||
else
|
||||
user << "You fail to [ locked ? "unlock" : "lock"] [src]'s interface."
|
||||
|
||||
@@ -606,12 +606,15 @@
|
||||
machine = null
|
||||
src << browse(null, t1)
|
||||
|
||||
if(href_list["teleto"])
|
||||
src.client.jumptoturf(locate(href_list["teleto"]))
|
||||
|
||||
if(href_list["priv_msg"])
|
||||
var/mob/M = locate(href_list["priv_msg"])
|
||||
if(M)
|
||||
if(src.client && client.muted_complete)
|
||||
src << "You are muted have a nice day"
|
||||
return
|
||||
//if(src.client && client.muted_complete)
|
||||
// src << "You are muted have a nice day"
|
||||
// return
|
||||
if (!ismob(M))
|
||||
return
|
||||
|
||||
|
||||
@@ -116,6 +116,7 @@ datum/preferences
|
||||
disabilities = 0
|
||||
|
||||
used_skillpoints = 0
|
||||
skill_specialization = null
|
||||
list/skills = list() // skills can range from 0 to 3
|
||||
|
||||
New()
|
||||
@@ -129,6 +130,22 @@ datum/preferences
|
||||
if(!skills.Find(S.ID) || forced)
|
||||
skills[S.ID] = SKILL_NONE
|
||||
|
||||
proc/CalculateSkillPoints()
|
||||
used_skillpoints = 0
|
||||
for(var/V in SKILLS) for(var/datum/skill/S in SKILLS[V])
|
||||
var/multiplier = 2
|
||||
if(skill_specialization == S.field || S.field == "Misc")
|
||||
multiplier = 1
|
||||
switch(skills[S.ID])
|
||||
if(SKILL_NONE)
|
||||
used_skillpoints += 0 * multiplier
|
||||
if(SKILL_BASIC)
|
||||
used_skillpoints += 1 * multiplier
|
||||
if(SKILL_ADEPT)
|
||||
used_skillpoints += 3 * multiplier
|
||||
if(SKILL_EXPERT)
|
||||
used_skillpoints += 8 * multiplier
|
||||
|
||||
proc/GetSkillClass(points)
|
||||
// skill classes describe how your character compares in total points
|
||||
switch(points)
|
||||
@@ -136,19 +153,19 @@ datum/preferences
|
||||
return "Unconfigured"
|
||||
if(1 to 3)
|
||||
return "Talentless"
|
||||
if(4 to 6)
|
||||
if(3 to 6)
|
||||
return "Below Average"
|
||||
if(7 to 9)
|
||||
if(7 to 10)
|
||||
return "Average"
|
||||
if(10 to 12)
|
||||
if(11 to 12)
|
||||
return "Talented"
|
||||
if(13 to 15)
|
||||
return "Extremely Talented"
|
||||
if(16 to 18)
|
||||
return "Genius"
|
||||
if(19 to 21)
|
||||
if(19 to 20)
|
||||
return "True Genius"
|
||||
if(22 to 1000)
|
||||
if(21 to 1000)
|
||||
return "God"
|
||||
|
||||
proc/SetSkills(mob/user)
|
||||
@@ -165,12 +182,13 @@ datum/preferences
|
||||
HTML += "<a href=\"byond://?src=\ref[user];skills=1;preferences=1;preconfigured=1;\">Use preconfigured skillset</a><br>"
|
||||
HTML += "<table>"
|
||||
for(var/V in SKILLS)
|
||||
HTML += "<tr><th colspan = 5><b>[V]</b></th></tr>"
|
||||
HTML += "<tr><th colspan = 5><b><a href='byond://?src=\ref[user];preferences=1;skills=1;setspecialization=[V]'><font color=[(skill_specialization == V) ? "red" : "black"]>[V]</font></a></b>"
|
||||
HTML += "</th></tr>"
|
||||
for(var/datum/skill/S in SKILLS[V])
|
||||
var/level = skills[S.ID]
|
||||
HTML += "<tr style='text-align:left;'>"
|
||||
HTML += "<th><a href='byond://?src=\ref[user];preferences=1;skills=1;skillinfo=\ref[S]'>[S.name]</a></th>"
|
||||
HTML += "<th><a href='byond://?src=\ref[user];preferences=1;skills=1;setskill=\ref[S];newvalue=[SKILL_NONE]'><font color=[(level == SKILL_NONE) ? "red" : "black"]>\[None\]</font></a></th>"
|
||||
HTML += "<th><a href='byond://?src=\ref[user];preferences=1;skills=1;setskill=\ref[S];newvalue=[SKILL_NONE]'><font color=[(level == SKILL_NONE) ? "red" : "black"]>\[Layman\]</font></a></th>"
|
||||
HTML += "<th><a href='byond://?src=\ref[user];preferences=1;skills=1;setskill=\ref[S];newvalue=[SKILL_BASIC]'><font color=[(level == SKILL_BASIC) ? "red" : "black"]>\[Basic\]</font></a></th>"
|
||||
HTML += "<th><a href='byond://?src=\ref[user];preferences=1;skills=1;setskill=\ref[S];newvalue=[SKILL_ADEPT]'><font color=[(level == SKILL_ADEPT) ? "red" : "black"]>\[Adept\]</font></a></th>"
|
||||
HTML += "<th><a href='byond://?src=\ref[user];preferences=1;skills=1;setskill=\ref[S];newvalue=[SKILL_EXPERT]'><font color=[(level == SKILL_EXPERT) ? "red" : "black"]>\[Expert\]</font></a></th>"
|
||||
@@ -507,9 +525,8 @@ datum/preferences
|
||||
else if(link_tags["setskill"])
|
||||
var/datum/skill/S = locate(link_tags["setskill"])
|
||||
var/value = text2num(link_tags["newvalue"])
|
||||
var/current_value = skills[S.ID]
|
||||
used_skillpoints += value - current_value
|
||||
skills[S.ID] = value
|
||||
CalculateSkillPoints()
|
||||
SetSkills(user)
|
||||
else if(link_tags["preconfigured"])
|
||||
var/selected = input(user, "Select a skillset", "Skillset") as null|anything in SKILL_PRE
|
||||
@@ -517,10 +534,16 @@ datum/preferences
|
||||
|
||||
ZeroSkills(1)
|
||||
for(var/V in SKILL_PRE[selected])
|
||||
if(V == "field")
|
||||
skill_specialization = SKILL_PRE[selected]["field"]
|
||||
continue
|
||||
skills[V] = SKILL_PRE[selected][V]
|
||||
used_skillpoints = 0
|
||||
for(var/V in skills) used_skillpoints += skills[V]
|
||||
CalculateSkillPoints()
|
||||
|
||||
SetSkills(user)
|
||||
else if(link_tags["setspecialization"])
|
||||
skill_specialization = link_tags["setspecialization"]
|
||||
CalculateSkillPoints()
|
||||
SetSkills(user)
|
||||
else
|
||||
SetSkills(user)
|
||||
@@ -869,6 +892,7 @@ datum/preferences
|
||||
character.underwear = underwear == 1 ? pick(1,2,3,4,5) : 0
|
||||
|
||||
character.used_skillpoints = used_skillpoints
|
||||
character.skill_specialization = skill_specialization
|
||||
character.skills = skills
|
||||
|
||||
character.update_face()
|
||||
|
||||
@@ -143,6 +143,7 @@ datum/preferences/proc/savefile_save(mob/user, slot)
|
||||
|
||||
F["used_skillpoints"] << src.used_skillpoints
|
||||
F["skills"] << src.skills
|
||||
F["skill_specialization"] << src.skill_specialization
|
||||
|
||||
return 1
|
||||
|
||||
@@ -217,6 +218,7 @@ datum/preferences/proc/savefile_load(mob/user, slot)
|
||||
|
||||
F["used_skillpoints"] >> src.used_skillpoints
|
||||
F["skills"] >> src.skills
|
||||
F["skill_specialization"] >> src.skill_specialization
|
||||
if(!src.skills) src.skills = list()
|
||||
if(!src.used_skillpoints) src.used_skillpoints= 0
|
||||
|
||||
|
||||
@@ -1,8 +1,8 @@
|
||||
var/global/const
|
||||
SKILL_NONE = 0
|
||||
SKILL_BASIC = 1
|
||||
SKILL_ADEPT = 3
|
||||
SKILL_EXPERT = 6
|
||||
SKILL_ADEPT = 2
|
||||
SKILL_EXPERT = 3
|
||||
|
||||
datum/skill/var
|
||||
ID = "none" // ID of the skill, used in code
|
||||
@@ -11,10 +11,10 @@ datum/skill/var
|
||||
field = "Misc" // the field under which the skill will be listed
|
||||
|
||||
var/global/list/SKILLS = null
|
||||
var/list/SKILL_ENGINEER = list("EVA" = SKILL_BASIC, "construction" = SKILL_ADEPT, "electrical" = SKILL_BASIC, "engines" = SKILL_ADEPT)
|
||||
var/list/SKILL_ROBOTICIST = list("devices" = SKILL_ADEPT, "electrical" = SKILL_BASIC, "computer" = SKILL_ADEPT, "anatomy" = SKILL_BASIC)
|
||||
var/list/SKILL_SECURITY_OFFICER = list("combat" = SKILL_BASIC, "weapons" = SKILL_ADEPT, "law" = SKILL_ADEPT, "forensics" = SKILL_BASIC)
|
||||
var/list/SKILL_CHEMIST = list("chemistry" = SKILL_ADEPT, "science" = SKILL_ADEPT, "medical" = SKILL_BASIC, "devices" = SKILL_BASIC)
|
||||
var/list/SKILL_ENGINEER = list("field" = "Engineering", "EVA" = SKILL_BASIC, "construction" = SKILL_ADEPT, "electrical" = SKILL_BASIC, "engines" = SKILL_ADEPT)
|
||||
var/list/SKILL_ROBOTICIST = list("field" = "Science", "devices" = SKILL_ADEPT, "electrical" = SKILL_BASIC, "computer" = SKILL_ADEPT, "anatomy" = SKILL_BASIC)
|
||||
var/list/SKILL_SECURITY_OFFICER = list("field" = "Security", "combat" = SKILL_BASIC, "weapons" = SKILL_ADEPT, "law" = SKILL_ADEPT, "forensics" = SKILL_BASIC)
|
||||
var/list/SKILL_CHEMIST = list("field" = "Science", "chemistry" = SKILL_ADEPT, "science" = SKILL_ADEPT, "medical" = SKILL_BASIC, "devices" = SKILL_BASIC)
|
||||
var/global/list/SKILL_PRE = list("Engineer" = SKILL_ENGINEER, "Roboticist" = SKILL_ROBOTICIST, "Security Officer" = SKILL_SECURITY_OFFICER, "Chemist" = SKILL_CHEMIST)
|
||||
|
||||
datum/skill/management
|
||||
@@ -22,11 +22,6 @@ datum/skill/management
|
||||
name = "Command"
|
||||
desc = "Your ability to manage and commandeer other crew members."
|
||||
|
||||
datum/skill/knowledge/law
|
||||
ID = "law"
|
||||
name = "NanoTrasen Law"
|
||||
desc = "Your knowledge of NanoTrasen law and procedures. This includes space law, as well as general station rulings and procedures. A low level in this skill is typical for security officers, a high level in this skill is typical for captains."
|
||||
|
||||
datum/skill/combat
|
||||
ID = "combat"
|
||||
name = "Close Combat"
|
||||
@@ -101,29 +96,29 @@ datum/skill/computer
|
||||
datum/skill/pilot
|
||||
ID = "pilot"
|
||||
name = "Heavy Machinery Operation"
|
||||
desc = "Describes your experience and understanding of operating heavy machinery, which includes mechs and other large exosuits. Used in piloting mechs and creating them"
|
||||
desc = "Describes your experience and understanding of operating heavy machinery, which includes mechs and other large exosuits. Used in piloting mechs."
|
||||
field = "Engineering"
|
||||
|
||||
datum/skill/medical
|
||||
ID = "medical"
|
||||
name = "Medical"
|
||||
desc = "Covers an understanding of the human body and medicine. At a low level, this skill is vital to perform basic first aid, such as CPR or applying bandages. At a high level, this skill implies a good understanding of the various medicines that can be found on a space station."
|
||||
field = "Science"
|
||||
name = "Medicine"
|
||||
desc = "Covers an understanding of the human body and medicine. At a low level, this skill gives a basic understanding of applying common types of medicine, and a rough understanding of medical devices like the health analyzer. At a high level, this skill grants exact knowledge of all the medicine available on the station, as well as the ability to use complex medical devices like the body scanner or mass spectrometer."
|
||||
field = "Medical"
|
||||
|
||||
datum/skill/anatomy
|
||||
ID = "anatomy"
|
||||
name = "Anatomy"
|
||||
desc = "Gives you a detailed insight of the human body. A high skill in this is required to perform surgery.This skill may also help in examining alien biology."
|
||||
field = "Science"
|
||||
field = "Medical"
|
||||
|
||||
datum/skill/virology
|
||||
ID = "virology"
|
||||
name = "Virology"
|
||||
desc = "This skill implies an understanding of microorganisms and their effects on humans."
|
||||
field = "Science"
|
||||
field = "Medical"
|
||||
|
||||
datum/skill/genetics
|
||||
ID = "genaetics"
|
||||
ID = "genetics"
|
||||
name = "Genetics"
|
||||
desc = "Implies an understanding of how DNA works and the structure of the human DNA."
|
||||
field = "Science"
|
||||
@@ -211,7 +206,7 @@ proc/show_skill_window(var/mob/user, var/mob/living/carbon/human/M)
|
||||
var/level = M.skills[S.ID]
|
||||
HTML += "<tr style='text-align:left;'>"
|
||||
HTML += "<th>[S.name]</th>"
|
||||
HTML += "<th><font color=[(level == SKILL_NONE) ? "red" : "black"]>\[None\]</font></th>"
|
||||
HTML += "<th><font color=[(level == SKILL_NONE) ? "red" : "black"]>\[Layman\]</font></th>"
|
||||
HTML += "<th><font color=[(level == SKILL_BASIC) ? "red" : "black"]>\[Basic\]</font></th>"
|
||||
HTML += "<th><font color=[(level == SKILL_ADEPT) ? "red" : "black"]>\[Adept\]</font></th>"
|
||||
HTML += "<th><font color=[(level == SKILL_EXPERT) ? "red" : "black"]>\[Expert\]</font></th>"
|
||||
|
||||
@@ -92,13 +92,11 @@ obj/item/weapon/organ/New(loc, mob/living/carbon/human/H)
|
||||
if(!istype(H))
|
||||
return
|
||||
if(H.dna)
|
||||
if(blood_DNA.len)
|
||||
if(blood_DNA && blood_DNA.len)
|
||||
blood_DNA.len++
|
||||
blood_DNA[blood_DNA.len] = list(H.dna.unique_enzymes, H.dna.b_type)
|
||||
else
|
||||
var/templist[1]
|
||||
templist[1] = list(H.dna.unique_enzymes, H.dna.b_type)
|
||||
blood_DNA = templist
|
||||
blood_DNA = list(list(H.dna.unique_enzymes, H.dna.b_type))
|
||||
|
||||
var/icon/I = new /icon(icon, icon_state)
|
||||
|
||||
|
||||
+23
-30
@@ -30,6 +30,7 @@
|
||||
name = "gun"
|
||||
icon = 'screen1.dmi'
|
||||
master = null
|
||||
dir = 2
|
||||
|
||||
move
|
||||
name = "Allow Walking"
|
||||
@@ -46,6 +47,13 @@
|
||||
icon_state = "no_item"
|
||||
screen_loc = ui_gun1
|
||||
|
||||
mode
|
||||
name = "Toggle Gun Mode"
|
||||
desc = "The shortcut key for this is \"F6\""
|
||||
icon_state = "gun"
|
||||
screen_loc = ui_gun_select
|
||||
dir = 1
|
||||
|
||||
/obj/screen/zone_sel/MouseDown(location, control,params)
|
||||
// Changes because of 4.0
|
||||
var/list/PL = params2list(params)
|
||||
@@ -590,78 +598,63 @@
|
||||
usr:module_active = null
|
||||
|
||||
if("Allow Walking")
|
||||
if(gun_click_time > world.time - 15) //give them 1.5 seconds between mode changes.
|
||||
usr << "You need to wait some before you can change what they can do!"
|
||||
if(gun_click_time > world.time - 30) //give them 3 seconds between mode changes.
|
||||
return
|
||||
if(!istype(usr.equipped(),/obj/item/weapon/gun))
|
||||
usr << "You need your gun in your active hand to do that!"
|
||||
return
|
||||
usr.AllowTargetMove()
|
||||
icon_state = "walking"
|
||||
name = "Disallow Walking"
|
||||
usr.client.AllowTargetMove()
|
||||
gun_click_time = world.time
|
||||
|
||||
if("Disallow Walking")
|
||||
if(gun_click_time > world.time - 15) //give them 1.5 seconds between mode changes.
|
||||
usr << "You need to wait some before you can change what they can do!"
|
||||
if(gun_click_time > world.time - 30) //give them 3 seconds between mode changes.
|
||||
return
|
||||
if(!istype(usr.equipped(),/obj/item/weapon/gun))
|
||||
usr << "You need your gun in your active hand to do that!"
|
||||
return
|
||||
usr.AllowTargetMove()
|
||||
icon_state = "no_walk"
|
||||
name = "Allow Walking"
|
||||
usr.client.AllowTargetMove()
|
||||
gun_click_time = world.time
|
||||
|
||||
if("Allow Running")
|
||||
if(gun_click_time > world.time - 15) //give them 1.5 seconds between mode changes.
|
||||
usr << "You need to wait some before you can change what they can do!"
|
||||
if(gun_click_time > world.time - 30) //give them 3 seconds between mode changes.
|
||||
return
|
||||
if(!istype(usr.equipped(),/obj/item/weapon/gun))
|
||||
usr << "You need your gun in your active hand to do that!"
|
||||
return
|
||||
usr.AllowTargetRun()
|
||||
icon_state = "running"
|
||||
name = "Disallow Running"
|
||||
usr.client.AllowTargetRun()
|
||||
gun_click_time = world.time
|
||||
|
||||
if("Disallow Running")
|
||||
if(gun_click_time > world.time - 15) //give them 1.5 seconds between mode changes.
|
||||
usr << "You need to wait some before you can change what they can do!"
|
||||
if(gun_click_time > world.time - 30) //give them 3 seconds between mode changes.
|
||||
return
|
||||
if(!istype(usr.equipped(),/obj/item/weapon/gun))
|
||||
usr << "You need your gun in your active hand to do that!"
|
||||
return
|
||||
usr.AllowTargetRun()
|
||||
icon_state = "no_run"
|
||||
name = "Allow Running"
|
||||
usr.client.AllowTargetRun()
|
||||
gun_click_time = world.time
|
||||
|
||||
if("Allow Item Use")
|
||||
if(gun_click_time > world.time - 15) //give them 1.5 seconds between mode changes.
|
||||
usr << "You need to wait some before you can change what they can do!"
|
||||
if(gun_click_time > world.time - 30) //give them 3 seconds between mode changes.
|
||||
return
|
||||
if(!istype(usr.equipped(),/obj/item/weapon/gun))
|
||||
usr << "You need your gun in your active hand to do that!"
|
||||
return
|
||||
name = "Disallow Item Use"
|
||||
icon_state = "act_throw_off"
|
||||
usr.AllowTargetClick()
|
||||
usr.client.AllowTargetClick()
|
||||
gun_click_time = world.time
|
||||
|
||||
|
||||
if("Disallow Item Use")
|
||||
if(gun_click_time > world.time - 15) //give them 1.5 seconds between mode changes.
|
||||
usr << "You need to wait some before you can change what they can do!"
|
||||
if(gun_click_time > world.time - 30) //give them 3 seconds between mode changes.
|
||||
return
|
||||
if(!istype(usr.equipped(),/obj/item/weapon/gun))
|
||||
usr << "You need your gun in your active hand to do that!"
|
||||
return
|
||||
name = "Allow Item Use"
|
||||
icon_state = "no_item"
|
||||
usr.AllowTargetClick()
|
||||
usr.client.AllowTargetClick()
|
||||
gun_click_time = world.time
|
||||
|
||||
if("Toggle Gun Mode")
|
||||
usr.client.ToggleGunMode()
|
||||
|
||||
else
|
||||
DblClick()
|
||||
return
|
||||
|
||||
@@ -47,7 +47,6 @@
|
||||
var/light_consumption = 0 //not used
|
||||
var/equip_consumption = 0 //not used
|
||||
var/environ_consumption = 0 //not used
|
||||
var/emagged = 0
|
||||
var/wiresexposed = 0
|
||||
var/apcwires = 15
|
||||
netnum = -1 // set so that APCs aren't found as powernet nodes
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user