This commit is contained in:
comma
2012-03-08 02:39:48 +02:00
133 changed files with 8842 additions and 7327 deletions
+7 -2
View File
@@ -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"
+1 -1
View File
@@ -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)
+51 -20
View File
@@ -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))
+60
View File
@@ -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
+2 -2
View File
@@ -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
+2 -4
View File
@@ -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))
+3 -3
View File
@@ -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
View File
@@ -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
+1
View File
@@ -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
+11 -5
View File
@@ -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"
+27 -1
View File
@@ -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"
+10
View File
@@ -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
+1 -1
View File
@@ -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
+1 -1
View File
@@ -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!
+4
View File
@@ -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
View File
@@ -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()
+6
View File
@@ -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)
+12 -13
View File
@@ -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.
+2 -3
View File
@@ -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()
+4
View File
@@ -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
View File
@@ -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"
+1 -1
View File
@@ -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
View File
@@ -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
+1 -1
View File
@@ -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()
+6 -1
View File
@@ -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
+3 -3
View File
@@ -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>"
-1
View File
@@ -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()
+1 -1
View File
@@ -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
-1
View File
@@ -13,7 +13,6 @@
use_power = 1
idle_power_usage = 2
active_power_usage = 500
var/emagged = 0
/obj/machinery/gibber/New()
..()
-1
View File
@@ -91,7 +91,6 @@ Class Procs:
Compiled by Aygar
*/
/obj/machinery/New()
..()
machines.Add(src)
+1 -1
View File
@@ -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"]
+51 -36
View File
@@ -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
-1
View File
@@ -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
+2
View File
@@ -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)
/*
+1 -1
View File
@@ -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
+2 -2
View File
@@ -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
/*
+1 -1
View File
@@ -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
+1
View File
@@ -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 -4
View File
@@ -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
+464 -47
View File
@@ -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]&deg;C ([src.occupant.bodytemperature*1.8-459.67]&deg;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
*/
+4 -4
View File
@@ -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
+66 -8
View File
@@ -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
View File
File diff suppressed because it is too large Load Diff
+197 -19
View File
@@ -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
+16 -6
View File
@@ -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)
+64 -2
View File
@@ -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"
+22
View File
@@ -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
+99
View File
@@ -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")
+2
View File
@@ -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
+2 -2
View File
@@ -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
+6 -1
View File
@@ -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)
+14 -11
View File
@@ -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++
+1 -1
View File
@@ -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()
+1 -1
View File
@@ -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")
+1 -7
View File
@@ -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
+77 -1
View File
@@ -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)
+2 -2
View File
@@ -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"
+3 -2
View File
@@ -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
+1 -1
View File
@@ -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(\
+1
View File
@@ -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",
+11
View File
@@ -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
..()
+7 -6
View File
@@ -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
View File
@@ -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."
+53 -66
View File
@@ -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 += "&nbsp<b>Fingerprints:</b><br>"
temp += "&nbsp;&nbsp;&nbsp;&nbsp;[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>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;[fibers[j]]"
temp += "&nbsp;&nbsp;&nbsp;&nbsp;Fibers: [dat]<br>"
else
temp += "&nbsp;&nbsp;&nbsp;&nbsp;No fibers found.<br>"
temp += "&nbsp<b>Fibers:</b><br>"
for(var/j = 1, j <= fibers.len, j++)
temp += "&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;[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>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;[blood[j]]"
temp += "&nbsp;&nbsp;&nbsp;&nbsp;Blood: [dat]<br>"
else
temp += "&nbsp;&nbsp;&nbsp;&nbsp;No blood found.<br>"
temp += "&nbsp<b>Blood:</b><br>"
for(var/j = 1, j <= blood.len, j++)
temp += "&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;[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 += "&nbsp<b>Fingerprints:</b><br>"
P.info += "&nbsp;&nbsp;&nbsp;&nbsp;[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>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;[fibers[j]]"
P.info += "&nbsp;&nbsp;&nbsp;&nbsp;Fibers: [dat]<br>"
else
P.info += "&nbsp;&nbsp;&nbsp;&nbsp;No fibers found.<br>"
P.info += "&nbsp<b>Fibers:</b><br>"
for(var/j = 1, j <= fibers.len, j++)
P.info += "&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;[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>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;[blood[j]]"
P.info += "&nbsp;&nbsp;&nbsp;&nbsp;Blood: [dat]<br>"
else
P.info += "&nbsp;&nbsp;&nbsp;&nbsp;No blood found."
P.info += "&nbsp<b>Blood:</b><br>"
for(var/j = 1, j <= blood.len, j++)
P.info += "&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;[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>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;[fibers[j]]"
temp += "&nbsp;&nbsp;&nbsp;&nbsp;Fibers: [dat]<br>"
else
temp += "&nbsp;&nbsp;&nbsp;&nbsp;No fibers found."
temp += "&nbsp<b>Fibers:</b><br>"
for(var/j = 1, j <= fibers.len, j++)
temp += "<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;[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>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;[blood[j]]"
temp += "&nbsp;&nbsp;&nbsp;&nbsp;Blood: [dat]<br>"
else
temp += "&nbsp;&nbsp;&nbsp;&nbsp;No blood found.<br>"
temp += "&nbsp<b>Blood:</b><br>"
for(var/j = 1, j <= blood.len, j++)
temp += "&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;[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>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;[fibers[j]]"
P.info += "&nbsp;&nbsp;&nbsp;&nbsp;Fibers: [dat]<br>"
else
P.info += "&nbsp;&nbsp;&nbsp;&nbsp;No fibers found."
P.info += "&nbsp<b>Fibers:</b><br>"
for(var/j = 1, j <= fibers.len, j++)
P.info += "<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;[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>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;[blood[j]]"
P.info += "&nbsp;&nbsp;&nbsp;&nbsp;Blood: [dat]<br>"
else
P.info += "&nbsp;&nbsp;&nbsp;&nbsp;No blood found.<br>"
P.info += "&nbsp<b>Blood:</b><br>"
for(var/j = 1, j <= blood.len, j++)
P.info += "&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;[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"
+1 -1
View File
@@ -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" )))
-4
View File
@@ -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
+2 -2
View File
@@ -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))
+1 -72
View File
@@ -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
+134 -43
View File
@@ -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
+8 -4
View File
@@ -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 -2
View File
@@ -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
+7
View File
@@ -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"
+4 -5
View File
@@ -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
+50
View File
@@ -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
+1 -1
View File
@@ -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
+69 -67
View File
@@ -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()
+3 -1
View File
@@ -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
+10 -9
View File
@@ -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
+1 -1
View File
@@ -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
+3 -1
View File
@@ -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
+16 -1
View File
@@ -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
+22
View File
@@ -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"
+3 -1
View File
@@ -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."
+6 -3
View File
@@ -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
+35 -11
View File
@@ -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()
+2
View File
@@ -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
+14 -19
View File
@@ -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>"
+2 -4
View File
@@ -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
View File
@@ -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
-1
View File
@@ -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