mirror of
https://github.com/CHOMPStation2/CHOMPStation2.git
synced 2025-12-13 03:33:21 +00:00
Merge branch 'master' of https://github.com/PolarisSS13/Polaris into dice_thing
This commit is contained in:
@@ -3,9 +3,9 @@ language: c
|
|||||||
sudo: false
|
sudo: false
|
||||||
|
|
||||||
env:
|
env:
|
||||||
BYOND_MAJOR="510"
|
BYOND_MAJOR="511"
|
||||||
BYOND_MINOR="1346"
|
BYOND_MINOR="1381"
|
||||||
MACRO_COUNT=986
|
MACRO_COUNT=875
|
||||||
|
|
||||||
cache:
|
cache:
|
||||||
directories:
|
directories:
|
||||||
|
|||||||
@@ -132,7 +132,7 @@ obj/var/phoronproof = 0
|
|||||||
eye_blurry = min(eye_blurry+1.5,50)
|
eye_blurry = min(eye_blurry+1.5,50)
|
||||||
if (prob(max(0,E.damage - 15) + 1) &&!eye_blind)
|
if (prob(max(0,E.damage - 15) + 1) &&!eye_blind)
|
||||||
src << "<span class='danger'>You are blinded!</span>"
|
src << "<span class='danger'>You are blinded!</span>"
|
||||||
eye_blind += 20
|
Blind(20)
|
||||||
|
|
||||||
/mob/living/carbon/human/proc/pl_head_protected()
|
/mob/living/carbon/human/proc/pl_head_protected()
|
||||||
//Checks if the head is adequately sealed.
|
//Checks if the head is adequately sealed.
|
||||||
|
|||||||
@@ -123,4 +123,6 @@ var/list/be_special_flags = list(
|
|||||||
//casting costs
|
//casting costs
|
||||||
#define Sp_RECHARGE "recharge"
|
#define Sp_RECHARGE "recharge"
|
||||||
#define Sp_CHARGES "charges"
|
#define Sp_CHARGES "charges"
|
||||||
#define Sp_HOLDVAR "holdervar"
|
#define Sp_HOLDVAR "holdervar"
|
||||||
|
|
||||||
|
#define CHANGELING_STASIS_COST 20
|
||||||
@@ -33,7 +33,7 @@
|
|||||||
#define PROXMOVE 0x80 // Does this object require proximity checking in Enter()?
|
#define PROXMOVE 0x80 // Does this object require proximity checking in Enter()?
|
||||||
|
|
||||||
//Flags for items (equipment)
|
//Flags for items (equipment)
|
||||||
#define THICKMATERIAL 0x1 // Prevents syringes, parapens and hyposprays if equiped to slot_suit or slot_head.
|
#define THICKMATERIAL 0x1 // Prevents syringes, parapens and hyposprays if equipped to slot_suit or slot_head.
|
||||||
#define STOPPRESSUREDAMAGE 0x2 // Counts towards pressure protection. Note that like temperature protection, body_parts_covered is considered here as well.
|
#define STOPPRESSUREDAMAGE 0x2 // Counts towards pressure protection. Note that like temperature protection, body_parts_covered is considered here as well.
|
||||||
#define AIRTIGHT 0x4 // Functions with internals.
|
#define AIRTIGHT 0x4 // Functions with internals.
|
||||||
#define NOSLIP 0x8 // Prevents from slipping on wet floors, in space, etc.
|
#define NOSLIP 0x8 // Prevents from slipping on wet floors, in space, etc.
|
||||||
|
|||||||
@@ -69,6 +69,11 @@
|
|||||||
#define COLOR_PALE_RED_GRAY "#CC9090"
|
#define COLOR_PALE_RED_GRAY "#CC9090"
|
||||||
#define COLOR_PALE_PURPLE_GRAY "#BDA2BA"
|
#define COLOR_PALE_PURPLE_GRAY "#BDA2BA"
|
||||||
#define COLOR_PURPLE_GRAY "#A2819E"
|
#define COLOR_PURPLE_GRAY "#A2819E"
|
||||||
|
#define COLOR_RED_LIGHT "#FF3333"
|
||||||
|
#define COLOR_DEEP_SKY_BLUE "#00e1ff"
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
// Shuttles.
|
// Shuttles.
|
||||||
|
|
||||||
|
|||||||
@@ -148,6 +148,12 @@
|
|||||||
#define INCAPACITATION_DISABLED (INCAPACITATION_KNOCKDOWN|INCAPACITATION_STUNNED)
|
#define INCAPACITATION_DISABLED (INCAPACITATION_KNOCKDOWN|INCAPACITATION_STUNNED)
|
||||||
#define INCAPACITATION_ALL (~INCAPACITATION_NONE)
|
#define INCAPACITATION_ALL (~INCAPACITATION_NONE)
|
||||||
|
|
||||||
|
#define MODIFIER_STACK_FORBID 1 // Disallows stacking entirely.
|
||||||
|
#define MODIFIER_STACK_EXTEND 2 // Disallows a second instance, but will extend the first instance if possible.
|
||||||
|
#define MODIFIER_STACK_ALLOWED 3 // Multiple instances are allowed.
|
||||||
|
|
||||||
|
#define MODIFIER_GENETIC 0 // Modifiers with this flag will be copied to mobs who get cloned.
|
||||||
|
|
||||||
// Bodyparts and organs.
|
// Bodyparts and organs.
|
||||||
#define O_MOUTH "mouth"
|
#define O_MOUTH "mouth"
|
||||||
#define O_EYES "eyes"
|
#define O_EYES "eyes"
|
||||||
@@ -200,4 +206,10 @@
|
|||||||
#define TASTE_SENSITIVE 2 //anything below 7%
|
#define TASTE_SENSITIVE 2 //anything below 7%
|
||||||
#define TASTE_NORMAL 1 //anything below 15%
|
#define TASTE_NORMAL 1 //anything below 15%
|
||||||
#define TASTE_DULL 0.5 //anything below 30%
|
#define TASTE_DULL 0.5 //anything below 30%
|
||||||
#define TASTE_NUMB 0.1 //anything below 150%
|
#define TASTE_NUMB 0.1 //anything below 150%
|
||||||
|
|
||||||
|
// If they're in an FBP, what braintype.
|
||||||
|
#define FBP_NONE ""
|
||||||
|
#define FBP_CYBORG "Cyborg"
|
||||||
|
#define FBP_POSI "Positronic"
|
||||||
|
#define FBP_DRONE "Drone"
|
||||||
15
code/__defines/planets.dm
Normal file
15
code/__defines/planets.dm
Normal file
@@ -0,0 +1,15 @@
|
|||||||
|
#define WEATHER_CLEAR "clear"
|
||||||
|
#define WEATHER_OVERCAST "overcast"
|
||||||
|
#define WEATHER_LIGHT_SNOW "light snow"
|
||||||
|
#define WEATHER_SNOW "snow"
|
||||||
|
#define WEATHER_BLIZZARD "blizzard"
|
||||||
|
#define WEATHER_RAIN "rain"
|
||||||
|
#define WEATHER_STORM "storm"
|
||||||
|
#define WEATHER_HAIL "hail"
|
||||||
|
#define WEATHER_WINDY "windy"
|
||||||
|
#define WEATHER_HOT "hot"
|
||||||
|
#define WEATHER_BLOOD_MOON "blood moon" // For admin fun or cult later on.
|
||||||
|
|
||||||
|
#define PLANET_PROCESS_WEATHER 0x1
|
||||||
|
#define PLANET_PROCESS_SUN 0x2
|
||||||
|
#define PLANET_PROCESS_TEMP 0x4
|
||||||
@@ -284,7 +284,7 @@
|
|||||||
if(M.loc && M.locs[1] in hearturfs)
|
if(M.loc && M.locs[1] in hearturfs)
|
||||||
mobs |= M
|
mobs |= M
|
||||||
|
|
||||||
else if(M.stat == DEAD)
|
else if(M.stat == DEAD && !M.forbid_seeing_deadchat)
|
||||||
switch(type)
|
switch(type)
|
||||||
if(1) //Audio messages use ghost_ears
|
if(1) //Audio messages use ghost_ears
|
||||||
if(M.is_preference_enabled(/datum/client_preference/ghost_ears))
|
if(M.is_preference_enabled(/datum/client_preference/ghost_ears))
|
||||||
|
|||||||
@@ -42,6 +42,8 @@
|
|||||||
|
|
||||||
#define isxeno(A) istype(A, /mob/living/simple_animal/xeno)
|
#define isxeno(A) istype(A, /mob/living/simple_animal/xeno)
|
||||||
|
|
||||||
|
#define isopenspace(A) istype(A, /turf/simulated/open)
|
||||||
|
|
||||||
#define isweakref(A) istype(A, /weakref)
|
#define isweakref(A) istype(A, /weakref)
|
||||||
|
|
||||||
#define RANDOM_BLOOD_TYPE pick(4;"O-", 36;"O+", 3;"A-", 28;"A+", 1;"B-", 20;"B+", 1;"AB-", 5;"AB+")
|
#define RANDOM_BLOOD_TYPE pick(4;"O-", 36;"O+", 3;"A-", 28;"A+", 1;"B-", 20;"B+", 1;"AB-", 5;"AB+")
|
||||||
|
|||||||
@@ -45,49 +45,61 @@
|
|||||||
screen_loc = "[screen_loc_X[1]]:[pix_X],[screen_loc_Y[1]]:[pix_Y]"
|
screen_loc = "[screen_loc_X[1]]:[pix_X],[screen_loc_Y[1]]:[pix_Y]"
|
||||||
|
|
||||||
/obj/screen/movable/proc/encode_screen_X(X)
|
/obj/screen/movable/proc/encode_screen_X(X)
|
||||||
if(X > usr.client.view+1)
|
var/view_dist = world.view
|
||||||
. = "EAST-[usr.client.view*2 + 1-X]"
|
if(view_dist)
|
||||||
else if(X < usr.client.view+1)
|
view_dist = view_dist
|
||||||
|
if(X > view_dist+1)
|
||||||
|
. = "EAST-[view_dist *2 + 1-X]"
|
||||||
|
else if(X < view_dist +1)
|
||||||
. = "WEST+[X-1]"
|
. = "WEST+[X-1]"
|
||||||
else
|
else
|
||||||
. = "CENTER"
|
. = "CENTER"
|
||||||
|
|
||||||
/obj/screen/movable/proc/decode_screen_X(X)
|
/obj/screen/movable/proc/decode_screen_X(X)
|
||||||
|
var/view_dist = world.view
|
||||||
|
if(view_dist)
|
||||||
|
view_dist = view_dist
|
||||||
//Find EAST/WEST implementations
|
//Find EAST/WEST implementations
|
||||||
if(findtext(X,"EAST-"))
|
if(findtext(X,"EAST-"))
|
||||||
var/num = text2num(copytext(X,6)) //Trim EAST-
|
var/num = text2num(copytext(X,6)) //Trim EAST-
|
||||||
if(!num)
|
if(!num)
|
||||||
num = 0
|
num = 0
|
||||||
. = usr.client.view*2 + 1 - num
|
. = view_dist*2 + 1 - num
|
||||||
else if(findtext(X,"WEST+"))
|
else if(findtext(X,"WEST+"))
|
||||||
var/num = text2num(copytext(X,6)) //Trim WEST+
|
var/num = text2num(copytext(X,6)) //Trim WEST+
|
||||||
if(!num)
|
if(!num)
|
||||||
num = 0
|
num = 0
|
||||||
. = num+1
|
. = num+1
|
||||||
else if(findtext(X,"CENTER"))
|
else if(findtext(X,"CENTER"))
|
||||||
. = usr.client.view+1
|
. = view_dist+1
|
||||||
|
|
||||||
/obj/screen/movable/proc/encode_screen_Y(Y)
|
/obj/screen/movable/proc/encode_screen_Y(Y)
|
||||||
if(Y > usr.client.view+1)
|
var/view_dist = world.view
|
||||||
. = "NORTH-[usr.client.view*2 + 1-Y]"
|
if(view_dist)
|
||||||
else if(Y < usr.client.view+1)
|
view_dist = view_dist
|
||||||
|
if(Y > view_dist+1)
|
||||||
|
. = "NORTH-[view_dist*2 + 1-Y]"
|
||||||
|
else if(Y < view_dist+1)
|
||||||
. = "SOUTH+[Y-1]"
|
. = "SOUTH+[Y-1]"
|
||||||
else
|
else
|
||||||
. = "CENTER"
|
. = "CENTER"
|
||||||
|
|
||||||
/obj/screen/movable/proc/decode_screen_Y(Y)
|
/obj/screen/movable/proc/decode_screen_Y(Y)
|
||||||
|
var/view_dist = world.view
|
||||||
|
if(view_dist)
|
||||||
|
view_dist = view_dist
|
||||||
if(findtext(Y,"NORTH-"))
|
if(findtext(Y,"NORTH-"))
|
||||||
var/num = text2num(copytext(Y,7)) //Trim NORTH-
|
var/num = text2num(copytext(Y,7)) //Trim NORTH-
|
||||||
if(!num)
|
if(!num)
|
||||||
num = 0
|
num = 0
|
||||||
. = usr.client.view*2 + 1 - num
|
. = view_dist*2 + 1 - num
|
||||||
else if(findtext(Y,"SOUTH+"))
|
else if(findtext(Y,"SOUTH+"))
|
||||||
var/num = text2num(copytext(Y,7)) //Time SOUTH+
|
var/num = text2num(copytext(Y,7)) //Time SOUTH+
|
||||||
if(!num)
|
if(!num)
|
||||||
num = 0
|
num = 0
|
||||||
. = num+1
|
. = num+1
|
||||||
else if(findtext(Y,"CENTER"))
|
else if(findtext(Y,"CENTER"))
|
||||||
. = usr.client.view+1
|
. = view_dist+1
|
||||||
|
|
||||||
//Debug procs
|
//Debug procs
|
||||||
/client/proc/test_movable_UI()
|
/client/proc/test_movable_UI()
|
||||||
|
|||||||
@@ -84,6 +84,9 @@ avoid code duplication. This includes items that may sometimes act as a standard
|
|||||||
playsound(loc, hitsound, 50, 1, -1)
|
playsound(loc, hitsound, 50, 1, -1)
|
||||||
|
|
||||||
var/power = force
|
var/power = force
|
||||||
|
for(var/datum/modifier/M in user.modifiers)
|
||||||
|
if(!isnull(M.outgoing_melee_damage_percent))
|
||||||
|
power *= M.outgoing_melee_damage_percent
|
||||||
if(HULK in user.mutations)
|
if(HULK in user.mutations)
|
||||||
power *= 2
|
power *= 2
|
||||||
return target.hit_with_weapon(src, user, power, hit_zone)
|
return target.hit_with_weapon(src, user, power, hit_zone)
|
||||||
|
|||||||
@@ -2,16 +2,77 @@ var/datum/controller/process/planet/planet_controller = null
|
|||||||
|
|
||||||
/datum/controller/process/planet
|
/datum/controller/process/planet
|
||||||
var/list/planets = list()
|
var/list/planets = list()
|
||||||
|
var/list/z_to_planet = list()
|
||||||
|
|
||||||
/datum/controller/process/planet/setup()
|
/datum/controller/process/planet/setup()
|
||||||
name = "planet"
|
name = "planet controller"
|
||||||
planet_controller = src
|
planet_controller = src
|
||||||
schedule_interval = 600 // every minute
|
schedule_interval = 1 MINUTE
|
||||||
|
|
||||||
var/list/planet_datums = typesof(/datum/planet) - /datum/planet
|
var/list/planet_datums = typesof(/datum/planet) - /datum/planet
|
||||||
for(var/P in planet_datums)
|
for(var/P in planet_datums)
|
||||||
var/datum/planet/NP = new P()
|
var/datum/planet/NP = new P()
|
||||||
planets.Add(NP)
|
planets.Add(NP)
|
||||||
|
|
||||||
|
allocateTurfs()
|
||||||
|
|
||||||
|
/datum/controller/process/planet/proc/allocateTurfs()
|
||||||
|
for(var/turf/simulated/OT in outdoor_turfs)
|
||||||
|
for(var/datum/planet/P in planets)
|
||||||
|
if(OT.z in P.expected_z_levels)
|
||||||
|
P.planet_floors += OT
|
||||||
|
break
|
||||||
|
outdoor_turfs.Cut() //Why were you in there INCORRECTLY?
|
||||||
|
|
||||||
|
for(var/turf/unsimulated/wall/planetary/PW in planetary_walls)
|
||||||
|
for(var/datum/planet/P in planets)
|
||||||
|
if(PW.type == P.planetary_wall_type)
|
||||||
|
P.planet_walls += PW
|
||||||
|
break
|
||||||
|
planetary_walls.Cut()
|
||||||
|
|
||||||
|
/datum/controller/process/planet/proc/unallocateTurf(var/turf/T)
|
||||||
|
for(var/planet in planets)
|
||||||
|
var/datum/planet/P = planet
|
||||||
|
if(T.z in P.expected_z_levels)
|
||||||
|
P.planet_floors -= T
|
||||||
|
|
||||||
/datum/controller/process/planet/doWork()
|
/datum/controller/process/planet/doWork()
|
||||||
|
if(outdoor_turfs.len || planetary_walls.len)
|
||||||
|
allocateTurfs()
|
||||||
|
|
||||||
for(var/datum/planet/P in planets)
|
for(var/datum/planet/P in planets)
|
||||||
P.process(schedule_interval / 10)
|
P.process(schedule_interval / 10)
|
||||||
|
SCHECK //Your process() really shouldn't take this long...
|
||||||
|
//Weather style needs redrawing
|
||||||
|
if(P.needs_work & PLANET_PROCESS_WEATHER)
|
||||||
|
P.needs_work &= ~PLANET_PROCESS_WEATHER
|
||||||
|
var/image/new_overlay = image(icon = P.weather_holder.current_weather.icon, icon_state = P.weather_holder.current_weather.icon_state, layer = LIGHTING_LAYER - 1)
|
||||||
|
//Redraw weather icons
|
||||||
|
for(var/T in P.planet_floors)
|
||||||
|
var/turf/simulated/turf = T
|
||||||
|
turf.overlays -= turf.weather_overlay
|
||||||
|
turf.weather_overlay = new_overlay
|
||||||
|
turf.overlays += turf.weather_overlay
|
||||||
|
SCHECK
|
||||||
|
|
||||||
|
//Sun light needs changing
|
||||||
|
if(P.needs_work & PLANET_PROCESS_SUN)
|
||||||
|
P.needs_work &= ~PLANET_PROCESS_SUN
|
||||||
|
//Redraw sun overlay
|
||||||
|
var/new_range = P.sun["range"]
|
||||||
|
var/new_brightness = P.sun["brightness"]
|
||||||
|
var/new_color = P.sun["color"]
|
||||||
|
for(var/T in P.planet_floors)
|
||||||
|
var/turf/simulated/turf = T
|
||||||
|
turf.set_light(new_range, new_brightness, new_color)
|
||||||
|
SCHECK
|
||||||
|
|
||||||
|
//Temperature needs updating
|
||||||
|
if(P.needs_work & PLANET_PROCESS_TEMP)
|
||||||
|
P.needs_work &= ~PLANET_PROCESS_TEMP
|
||||||
|
//Set new temperatures
|
||||||
|
for(var/W in P.planet_walls)
|
||||||
|
var/turf/unsimulated/wall/planetary/wall = W
|
||||||
|
wall.set_temperature(P.weather_holder.temperature)
|
||||||
|
SCHECK
|
||||||
|
|||||||
@@ -156,6 +156,8 @@ var/list/gamemode_cache = list()
|
|||||||
var/slime_delay = 0
|
var/slime_delay = 0
|
||||||
var/animal_delay = 0
|
var/animal_delay = 0
|
||||||
|
|
||||||
|
var/footstep_volume = 0
|
||||||
|
|
||||||
var/admin_legacy_system = 0 //Defines whether the server uses the legacy admin system with admins.txt or the SQL system. Config option in config.txt
|
var/admin_legacy_system = 0 //Defines whether the server uses the legacy admin system with admins.txt or the SQL system. Config option in config.txt
|
||||||
var/ban_legacy_system = 0 //Defines whether the server uses the legacy banning system with the files in /data or the SQL system. Config option in config.txt
|
var/ban_legacy_system = 0 //Defines whether the server uses the legacy banning system with the files in /data or the SQL system. Config option in config.txt
|
||||||
var/use_age_restriction_for_jobs = 0 //Do jobs use account age restrictions? --requires database
|
var/use_age_restriction_for_jobs = 0 //Do jobs use account age restrictions? --requires database
|
||||||
@@ -768,6 +770,8 @@ var/list/gamemode_cache = list()
|
|||||||
if("animal_delay")
|
if("animal_delay")
|
||||||
config.animal_delay = value
|
config.animal_delay = value
|
||||||
|
|
||||||
|
if("footstep_volume")
|
||||||
|
config.footstep_volume = text2num(value)
|
||||||
|
|
||||||
if("use_loyalty_implants")
|
if("use_loyalty_implants")
|
||||||
config.use_loyalty_implants = 1
|
config.use_loyalty_implants = 1
|
||||||
|
|||||||
@@ -25,7 +25,7 @@
|
|||||||
usr.client.debug_variables(antag)
|
usr.client.debug_variables(antag)
|
||||||
message_admins("Admin [key_name_admin(usr)] is debugging the [antag.role_text] template.")
|
message_admins("Admin [key_name_admin(usr)] is debugging the [antag.role_text] template.")
|
||||||
|
|
||||||
/client/proc/debug_controller(controller in list("Master","Ticker","Ticker Process","Air","Jobs","Sun","Radio","Supply","Shuttles","Emergency Shuttle","Configuration","pAI", "Cameras", "Transfer Controller", "Gas Data","Event","Plants","Alarm","Nano","Chemistry","Vote","Xenobio"))
|
/client/proc/debug_controller(controller in list("Master","Ticker","Ticker Process","Air","Jobs","Sun","Radio","Supply","Shuttles","Emergency Shuttle","Configuration","pAI", "Cameras", "Transfer Controller", "Gas Data","Event","Plants","Alarm","Nano","Chemistry","Vote","Xenobio","Planets"))
|
||||||
set category = "Debug"
|
set category = "Debug"
|
||||||
set name = "Debug Controller"
|
set name = "Debug Controller"
|
||||||
set desc = "Debug the various periodic loop controllers for the game (be careful!)"
|
set desc = "Debug the various periodic loop controllers for the game (be careful!)"
|
||||||
@@ -98,5 +98,8 @@
|
|||||||
if("Xenobio")
|
if("Xenobio")
|
||||||
debug_variables(xenobio_controller)
|
debug_variables(xenobio_controller)
|
||||||
feedback_add_details("admin_verb", "DXenobio")
|
feedback_add_details("admin_verb", "DXenobio")
|
||||||
|
if("Planets")
|
||||||
|
debug_variables(planet_controller)
|
||||||
|
feedback_add_details("admin_verb", "DPlanets")
|
||||||
message_admins("Admin [key_name_admin(usr)] is debugging the [controller] controller.")
|
message_admins("Admin [key_name_admin(usr)] is debugging the [controller] controller.")
|
||||||
return
|
return
|
||||||
|
|||||||
@@ -184,6 +184,10 @@
|
|||||||
G.fields["real_rank"] = H.mind.assigned_role
|
G.fields["real_rank"] = H.mind.assigned_role
|
||||||
G.fields["rank"] = assignment
|
G.fields["rank"] = assignment
|
||||||
G.fields["age"] = H.age
|
G.fields["age"] = H.age
|
||||||
|
if(H.get_FBP_type())
|
||||||
|
G.fields["brain_type"] = H.get_FBP_type()
|
||||||
|
else
|
||||||
|
G.fields["brain_type"] = "Organic"
|
||||||
G.fields["fingerprint"] = md5(H.dna.uni_identity)
|
G.fields["fingerprint"] = md5(H.dna.uni_identity)
|
||||||
G.fields["p_stat"] = "Active"
|
G.fields["p_stat"] = "Active"
|
||||||
G.fields["m_stat"] = "Stable"
|
G.fields["m_stat"] = "Stable"
|
||||||
@@ -201,11 +205,19 @@
|
|||||||
M.fields["b_type"] = H.b_type
|
M.fields["b_type"] = H.b_type
|
||||||
M.fields["b_dna"] = H.dna.unique_enzymes
|
M.fields["b_dna"] = H.dna.unique_enzymes
|
||||||
M.fields["id_gender"] = gender2text(H.identifying_gender)
|
M.fields["id_gender"] = gender2text(H.identifying_gender)
|
||||||
|
if(H.get_FBP_type())
|
||||||
|
M.fields["brain_type"] = H.get_FBP_type()
|
||||||
|
else
|
||||||
|
M.fields["brain_type"] = "Organic"
|
||||||
if(H.med_record && !jobban_isbanned(H, "Records"))
|
if(H.med_record && !jobban_isbanned(H, "Records"))
|
||||||
M.fields["notes"] = H.med_record
|
M.fields["notes"] = H.med_record
|
||||||
|
|
||||||
//Security Record
|
//Security Record
|
||||||
var/datum/data/record/S = CreateSecurityRecord(H.real_name, id)
|
var/datum/data/record/S = CreateSecurityRecord(H.real_name, id)
|
||||||
|
if(H.get_FBP_type())
|
||||||
|
S.fields["brain_type"] = H.get_FBP_type()
|
||||||
|
else
|
||||||
|
S.fields["brain_type"] = "Organic"
|
||||||
if(H.sec_record && !jobban_isbanned(H, "Records"))
|
if(H.sec_record && !jobban_isbanned(H, "Records"))
|
||||||
S.fields["notes"] = H.sec_record
|
S.fields["notes"] = H.sec_record
|
||||||
|
|
||||||
@@ -218,6 +230,10 @@
|
|||||||
L.fields["fingerprint"] = md5(H.dna.uni_identity)
|
L.fields["fingerprint"] = md5(H.dna.uni_identity)
|
||||||
L.fields["sex"] = gender2text(H.gender)
|
L.fields["sex"] = gender2text(H.gender)
|
||||||
L.fields["id_gender"] = gender2text(H.identifying_gender)
|
L.fields["id_gender"] = gender2text(H.identifying_gender)
|
||||||
|
if(H.get_FBP_type())
|
||||||
|
L.fields["brain_type"] = H.get_FBP_type()
|
||||||
|
else
|
||||||
|
L.fields["brain_type"] = "Organic"
|
||||||
L.fields["b_type"] = H.b_type
|
L.fields["b_type"] = H.b_type
|
||||||
L.fields["b_dna"] = H.dna.unique_enzymes
|
L.fields["b_dna"] = H.dna.unique_enzymes
|
||||||
L.fields["enzymes"] = H.dna.SE // Used in respawning
|
L.fields["enzymes"] = H.dna.SE // Used in respawning
|
||||||
@@ -426,6 +442,7 @@
|
|||||||
G.fields["real_rank"] = "Unassigned"
|
G.fields["real_rank"] = "Unassigned"
|
||||||
G.fields["sex"] = "Unknown"
|
G.fields["sex"] = "Unknown"
|
||||||
G.fields["age"] = "Unknown"
|
G.fields["age"] = "Unknown"
|
||||||
|
G.fields["brain_type"] = "Unknown"
|
||||||
G.fields["fingerprint"] = "Unknown"
|
G.fields["fingerprint"] = "Unknown"
|
||||||
G.fields["p_stat"] = "Active"
|
G.fields["p_stat"] = "Active"
|
||||||
G.fields["m_stat"] = "Stable"
|
G.fields["m_stat"] = "Stable"
|
||||||
@@ -447,6 +464,7 @@
|
|||||||
R.name = "Security Record #[id]"
|
R.name = "Security Record #[id]"
|
||||||
R.fields["name"] = name
|
R.fields["name"] = name
|
||||||
R.fields["id"] = id
|
R.fields["id"] = id
|
||||||
|
R.fields["brain_type"] = "Unknown"
|
||||||
R.fields["criminal"] = "None"
|
R.fields["criminal"] = "None"
|
||||||
R.fields["mi_crim"] = "None"
|
R.fields["mi_crim"] = "None"
|
||||||
R.fields["mi_crim_d"] = "No minor crime convictions."
|
R.fields["mi_crim_d"] = "No minor crime convictions."
|
||||||
@@ -467,6 +485,7 @@
|
|||||||
M.fields["b_type"] = "AB+"
|
M.fields["b_type"] = "AB+"
|
||||||
M.fields["b_dna"] = md5(name)
|
M.fields["b_dna"] = md5(name)
|
||||||
M.fields["id_gender"] = "Unknown"
|
M.fields["id_gender"] = "Unknown"
|
||||||
|
M.fields["brain_type"] = "Unknown"
|
||||||
M.fields["mi_dis"] = "None"
|
M.fields["mi_dis"] = "None"
|
||||||
M.fields["mi_dis_d"] = "No minor disabilities have been declared."
|
M.fields["mi_dis_d"] = "No minor disabilities have been declared."
|
||||||
M.fields["ma_dis"] = "None"
|
M.fields["ma_dis"] = "None"
|
||||||
|
|||||||
@@ -32,6 +32,17 @@
|
|||||||
containername = "Special Ops crate"
|
containername = "Special Ops crate"
|
||||||
contraband = 1
|
contraband = 1
|
||||||
|
|
||||||
|
/datum/supply_packs/supply/moghes
|
||||||
|
name = "Moghes imports"
|
||||||
|
contains = list(
|
||||||
|
/obj/item/weapon/reagent_containers/food/drinks/bottle/redeemersbrew = 2,
|
||||||
|
/obj/item/weapon/reagent_containers/food/snacks/unajerky = 4
|
||||||
|
)
|
||||||
|
cost = 25
|
||||||
|
containertype = /obj/structure/closet/crate
|
||||||
|
containername = "Moghes imports crate"
|
||||||
|
contraband = 1
|
||||||
|
|
||||||
/datum/supply_packs/security/bolt_rifles_mosin
|
/datum/supply_packs/security/bolt_rifles_mosin
|
||||||
name = "Surplus militia rifles"
|
name = "Surplus militia rifles"
|
||||||
contains = list(
|
contains = list(
|
||||||
|
|||||||
@@ -100,6 +100,11 @@
|
|||||||
item_cost = 40
|
item_cost = 40
|
||||||
path = /obj/item/weapon/gun/energy/ionrifle
|
path = /obj/item/weapon/gun/energy/ionrifle
|
||||||
|
|
||||||
|
/datum/uplink_item/item/visible_weapons/ionpistol
|
||||||
|
name = "Ion Pistol"
|
||||||
|
item_cost = 25
|
||||||
|
path = /obj/item/weapon/gun/energy/ionrifle/pistol
|
||||||
|
|
||||||
/datum/uplink_item/item/visible_weapons/xray
|
/datum/uplink_item/item/visible_weapons/xray
|
||||||
name = "Xray Gun"
|
name = "Xray Gun"
|
||||||
item_cost = 85
|
item_cost = 85
|
||||||
|
|||||||
@@ -115,12 +115,7 @@
|
|||||||
else if(isturf(hit_atom))
|
else if(isturf(hit_atom))
|
||||||
src.throwing = 0
|
src.throwing = 0
|
||||||
var/turf/T = hit_atom
|
var/turf/T = hit_atom
|
||||||
if(T.density)
|
T.hitby(src,speed)
|
||||||
spawn(2)
|
|
||||||
step(src, turn(src.last_move, 180))
|
|
||||||
if(istype(src,/mob/living))
|
|
||||||
var/mob/living/M = src
|
|
||||||
M.turf_collision(T, speed)
|
|
||||||
|
|
||||||
//decided whether a movable atom being thrown can pass through the turf it is in.
|
//decided whether a movable atom being thrown can pass through the turf it is in.
|
||||||
/atom/movable/proc/hit_check(var/speed)
|
/atom/movable/proc/hit_check(var/speed)
|
||||||
|
|||||||
@@ -210,7 +210,6 @@
|
|||||||
/obj/machinery/computer/scan_consolenew
|
/obj/machinery/computer/scan_consolenew
|
||||||
name = "DNA Modifier Access Console"
|
name = "DNA Modifier Access Console"
|
||||||
desc = "Scan DNA."
|
desc = "Scan DNA."
|
||||||
icon = 'icons/obj/computer.dmi'
|
|
||||||
icon_keyboard = "med_key"
|
icon_keyboard = "med_key"
|
||||||
icon_screen = "dna"
|
icon_screen = "dna"
|
||||||
density = 1
|
density = 1
|
||||||
|
|||||||
@@ -13,12 +13,15 @@ var/global/list/possible_changeling_IDs = list("Alpha","Beta","Gamma","Delta","E
|
|||||||
var/isabsorbing = 0
|
var/isabsorbing = 0
|
||||||
var/geneticpoints = 5
|
var/geneticpoints = 5
|
||||||
var/max_geneticpoints = 5
|
var/max_geneticpoints = 5
|
||||||
|
var/readapts = 1
|
||||||
|
var/max_readapts = 2
|
||||||
var/list/purchased_powers = list()
|
var/list/purchased_powers = list()
|
||||||
var/mimicing = ""
|
var/mimicing = ""
|
||||||
var/cloaked = 0
|
var/cloaked = 0
|
||||||
var/armor_deployed = 0 //This is only used for changeling_generic_equip_all_slots() at the moment.
|
var/armor_deployed = 0 //This is only used for changeling_generic_equip_all_slots() at the moment.
|
||||||
var/recursive_enhancement = 0 //Used to power up other abilities from the ling power with the same name.
|
var/recursive_enhancement = 0 //Used to power up other abilities from the ling power with the same name.
|
||||||
var/list/purchased_powers_history = list() //Used for round-end report, includes respec uses too.
|
var/list/purchased_powers_history = list() //Used for round-end report, includes respec uses too.
|
||||||
|
var/last_shriek = null // world.time when the ling last used a shriek.
|
||||||
|
|
||||||
/datum/changeling/New(var/gender=FEMALE)
|
/datum/changeling/New(var/gender=FEMALE)
|
||||||
..()
|
..()
|
||||||
@@ -60,6 +63,7 @@ var/global/list/possible_changeling_IDs = list("Alpha","Beta","Gamma","Delta","E
|
|||||||
if(!mind.changeling) mind.changeling = new /datum/changeling(gender)
|
if(!mind.changeling) mind.changeling = new /datum/changeling(gender)
|
||||||
|
|
||||||
verbs += /datum/changeling/proc/EvolutionMenu
|
verbs += /datum/changeling/proc/EvolutionMenu
|
||||||
|
verbs += /mob/proc/changeling_respec
|
||||||
add_language("Changeling")
|
add_language("Changeling")
|
||||||
|
|
||||||
var/lesser_form = !ishuman(src)
|
var/lesser_form = !ishuman(src)
|
||||||
@@ -153,6 +157,46 @@ var/global/list/possible_changeling_IDs = list("Alpha","Beta","Gamma","Delta","E
|
|||||||
//STINGS// //They get a pretty header because there's just so fucking many of them ;_;
|
//STINGS// //They get a pretty header because there's just so fucking many of them ;_;
|
||||||
//////////
|
//////////
|
||||||
|
|
||||||
|
turf/proc/AdjacentTurfsRangedSting()
|
||||||
|
//Yes this is snowflakey, but I couldn't get it to work any other way.. -Luke
|
||||||
|
var/list/allowed = list(
|
||||||
|
/obj/structure/table,
|
||||||
|
/obj/structure/closet,
|
||||||
|
/obj/structure/frame,
|
||||||
|
/obj/structure/target_stake,
|
||||||
|
/obj/structure/cable,
|
||||||
|
/obj/structure/disposalpipe,
|
||||||
|
/obj/machinery/
|
||||||
|
)
|
||||||
|
|
||||||
|
var/L[] = new()
|
||||||
|
for(var/turf/simulated/t in oview(src,1))
|
||||||
|
var/add = 1
|
||||||
|
if(t.density)
|
||||||
|
add = 0
|
||||||
|
if(add && LinkBlocked(src,t))
|
||||||
|
add = 0
|
||||||
|
if(add && TurfBlockedNonWindow(t))
|
||||||
|
add = 0
|
||||||
|
for(var/obj/O in t)
|
||||||
|
if(!O.density)
|
||||||
|
add = 1
|
||||||
|
break
|
||||||
|
if(istype(O, /obj/machinery/door))
|
||||||
|
//not sure why this doesn't fire on LinkBlocked()
|
||||||
|
add = 0
|
||||||
|
break
|
||||||
|
for(var/type in allowed)
|
||||||
|
if (istype(O, type))
|
||||||
|
add = 1
|
||||||
|
break
|
||||||
|
if(!add)
|
||||||
|
break
|
||||||
|
if(add)
|
||||||
|
L.Add(t)
|
||||||
|
return L
|
||||||
|
|
||||||
|
|
||||||
/mob/proc/sting_can_reach(mob/M as mob, sting_range = 1)
|
/mob/proc/sting_can_reach(mob/M as mob, sting_range = 1)
|
||||||
if(M.loc == src.loc)
|
if(M.loc == src.loc)
|
||||||
return 1 //target and source are in the same thing
|
return 1 //target and source are in the same thing
|
||||||
@@ -160,7 +204,7 @@ var/global/list/possible_changeling_IDs = list("Alpha","Beta","Gamma","Delta","E
|
|||||||
src << "<span class='warning'>We cannot reach \the [M] with a sting!</span>"
|
src << "<span class='warning'>We cannot reach \the [M] with a sting!</span>"
|
||||||
return 0 //One is inside, the other is outside something.
|
return 0 //One is inside, the other is outside something.
|
||||||
// Maximum queued turfs set to 25; I don't *think* anything raises sting_range above 2, but if it does the 25 may need raising
|
// Maximum queued turfs set to 25; I don't *think* anything raises sting_range above 2, but if it does the 25 may need raising
|
||||||
if(!AStar(src.loc, M.loc, /turf/proc/AdjacentTurfs, /turf/proc/Distance, max_nodes=25, max_node_depth=sting_range)) //If we can't find a path, fail
|
if(!AStar(src.loc, M.loc, /turf/proc/AdjacentTurfsRangedSting, /turf/proc/Distance, max_nodes=25, max_node_depth=sting_range)) //If we can't find a path, fail
|
||||||
src << "<span class='warning'>We cannot find a path to sting \the [M] by!</span>"
|
src << "<span class='warning'>We cannot find a path to sting \the [M] by!</span>"
|
||||||
return 0
|
return 0
|
||||||
return 1
|
return 1
|
||||||
|
|||||||
@@ -32,7 +32,7 @@
|
|||||||
return 1
|
return 1
|
||||||
|
|
||||||
if(M.head || M.wear_suit) //Make sure our slots aren't full
|
if(M.head || M.wear_suit) //Make sure our slots aren't full
|
||||||
src << "<span class='warning'>We require nothing to be on our head, and we cannot wear any external suits.</span>"
|
src << "<span class='warning'>We require nothing to be on our head, and we cannot wear any external suits, or shoes.</span>"
|
||||||
return 0
|
return 0
|
||||||
|
|
||||||
var/obj/item/clothing/suit/A = new armor_type(src)
|
var/obj/item/clothing/suit/A = new armor_type(src)
|
||||||
@@ -140,7 +140,7 @@
|
|||||||
playsound(src, 'sound/effects/blobattack.ogg', 30, 1)
|
playsound(src, 'sound/effects/blobattack.ogg', 30, 1)
|
||||||
M.update_icons()
|
M.update_icons()
|
||||||
success = 1
|
success = 1
|
||||||
sleep(20)
|
sleep(1 SECOND)
|
||||||
|
|
||||||
t = stuff_to_equip["w_uniform"]
|
t = stuff_to_equip["w_uniform"]
|
||||||
if(!M.w_uniform && t)
|
if(!M.w_uniform && t)
|
||||||
@@ -150,7 +150,7 @@
|
|||||||
playsound(src, 'sound/effects/blobattack.ogg', 30, 1)
|
playsound(src, 'sound/effects/blobattack.ogg', 30, 1)
|
||||||
M.update_icons()
|
M.update_icons()
|
||||||
success = 1
|
success = 1
|
||||||
sleep(20)
|
sleep(1 SECOND)
|
||||||
|
|
||||||
t = stuff_to_equip["gloves"]
|
t = stuff_to_equip["gloves"]
|
||||||
if(!M.gloves && t)
|
if(!M.gloves && t)
|
||||||
@@ -160,7 +160,7 @@
|
|||||||
playsound(src, 'sound/effects/splat.ogg', 30, 1)
|
playsound(src, 'sound/effects/splat.ogg', 30, 1)
|
||||||
M.update_icons()
|
M.update_icons()
|
||||||
success = 1
|
success = 1
|
||||||
sleep(20)
|
sleep(1 SECOND)
|
||||||
|
|
||||||
t = stuff_to_equip["shoes"]
|
t = stuff_to_equip["shoes"]
|
||||||
if(!M.shoes && t)
|
if(!M.shoes && t)
|
||||||
@@ -170,7 +170,7 @@
|
|||||||
playsound(src, 'sound/effects/splat.ogg', 30, 1)
|
playsound(src, 'sound/effects/splat.ogg', 30, 1)
|
||||||
M.update_icons()
|
M.update_icons()
|
||||||
success = 1
|
success = 1
|
||||||
sleep(20)
|
sleep(1 SECOND)
|
||||||
|
|
||||||
t = stuff_to_equip["belt"]
|
t = stuff_to_equip["belt"]
|
||||||
if(!M.belt && t)
|
if(!M.belt && t)
|
||||||
@@ -180,7 +180,7 @@
|
|||||||
playsound(src, 'sound/effects/splat.ogg', 30, 1)
|
playsound(src, 'sound/effects/splat.ogg', 30, 1)
|
||||||
M.update_icons()
|
M.update_icons()
|
||||||
success = 1
|
success = 1
|
||||||
sleep(20)
|
sleep(1 SECOND)
|
||||||
|
|
||||||
t = stuff_to_equip["glasses"]
|
t = stuff_to_equip["glasses"]
|
||||||
if(!M.glasses && t)
|
if(!M.glasses && t)
|
||||||
@@ -190,7 +190,7 @@
|
|||||||
playsound(src, 'sound/effects/splat.ogg', 30, 1)
|
playsound(src, 'sound/effects/splat.ogg', 30, 1)
|
||||||
M.update_icons()
|
M.update_icons()
|
||||||
success = 1
|
success = 1
|
||||||
sleep(20)
|
sleep(1 SECOND)
|
||||||
|
|
||||||
t = stuff_to_equip["wear_mask"]
|
t = stuff_to_equip["wear_mask"]
|
||||||
if(!M.wear_mask && t)
|
if(!M.wear_mask && t)
|
||||||
@@ -200,7 +200,7 @@
|
|||||||
playsound(src, 'sound/effects/splat.ogg', 30, 1)
|
playsound(src, 'sound/effects/splat.ogg', 30, 1)
|
||||||
M.update_icons()
|
M.update_icons()
|
||||||
success = 1
|
success = 1
|
||||||
sleep(20)
|
sleep(1 SECOND)
|
||||||
|
|
||||||
t = stuff_to_equip["back"]
|
t = stuff_to_equip["back"]
|
||||||
if(!M.back && t)
|
if(!M.back && t)
|
||||||
@@ -210,7 +210,7 @@
|
|||||||
playsound(src, 'sound/effects/blobattack.ogg', 30, 1)
|
playsound(src, 'sound/effects/blobattack.ogg', 30, 1)
|
||||||
M.update_icons()
|
M.update_icons()
|
||||||
success = 1
|
success = 1
|
||||||
sleep(20)
|
sleep(1 SECOND)
|
||||||
|
|
||||||
t = stuff_to_equip["wear_suit"]
|
t = stuff_to_equip["wear_suit"]
|
||||||
if(!M.wear_suit && t)
|
if(!M.wear_suit && t)
|
||||||
@@ -220,7 +220,7 @@
|
|||||||
playsound(src, 'sound/effects/blobattack.ogg', 30, 1)
|
playsound(src, 'sound/effects/blobattack.ogg', 30, 1)
|
||||||
M.update_icons()
|
M.update_icons()
|
||||||
success = 1
|
success = 1
|
||||||
sleep(20)
|
sleep(1 SECOND)
|
||||||
|
|
||||||
t = stuff_to_equip["wear_id"]
|
t = stuff_to_equip["wear_id"]
|
||||||
if(!M.wear_id && t)
|
if(!M.wear_id && t)
|
||||||
@@ -230,7 +230,7 @@
|
|||||||
playsound(src, 'sound/effects/splat.ogg', 30, 1)
|
playsound(src, 'sound/effects/splat.ogg', 30, 1)
|
||||||
M.update_icons()
|
M.update_icons()
|
||||||
success = 1
|
success = 1
|
||||||
sleep(20)
|
sleep(1 SECOND)
|
||||||
|
|
||||||
var/feedback = english_list(grown_items_list, nothing_text = "nothing", and_text = " and ", comma_text = ", ", final_comma_text = "" )
|
var/feedback = english_list(grown_items_list, nothing_text = "nothing", and_text = " and ", comma_text = ", ", final_comma_text = "" )
|
||||||
|
|
||||||
|
|||||||
@@ -72,7 +72,12 @@
|
|||||||
if(src.nutrition < 400)
|
if(src.nutrition < 400)
|
||||||
src.nutrition = min((src.nutrition + T.nutrition), 400)
|
src.nutrition = min((src.nutrition + T.nutrition), 400)
|
||||||
changeling.chem_charges += 10
|
changeling.chem_charges += 10
|
||||||
src.verbs += /mob/proc/changeling_respec
|
if(changeling.readapts <= 0)
|
||||||
|
changeling.readapts = 0 //SANITYYYYYY
|
||||||
|
changeling.readapts++
|
||||||
|
if(changeling.readapts > changeling.max_readapts)
|
||||||
|
changeling.readapts = changeling.max_readapts
|
||||||
|
|
||||||
src << "<span class='notice'>We can now re-adapt, reverting our evolution so that we may start anew, if needed.</span>"
|
src << "<span class='notice'>We can now re-adapt, reverting our evolution so that we may start anew, if needed.</span>"
|
||||||
|
|
||||||
var/datum/absorbed_dna/newDNA = new(T.real_name, T.dna, T.species.name, T.languages, T.identifying_gender, T.flavor_texts)
|
var/datum/absorbed_dna/newDNA = new(T.real_name, T.dna, T.species.name, T.languages, T.identifying_gender, T.flavor_texts)
|
||||||
|
|||||||
@@ -24,7 +24,7 @@
|
|||||||
|
|
||||||
if(held_item == null)
|
if(held_item == null)
|
||||||
if(src.mind.changeling.recursive_enhancement)
|
if(src.mind.changeling.recursive_enhancement)
|
||||||
if(changeling_generic_weapon(/obj/item/weapon/electric_hand/efficent))
|
if(changeling_generic_weapon(/obj/item/weapon/electric_hand/efficent,0))
|
||||||
src << "<span class='notice'>We will shock others more efficently.</span>"
|
src << "<span class='notice'>We will shock others more efficently.</span>"
|
||||||
return 1
|
return 1
|
||||||
else
|
else
|
||||||
|
|||||||
@@ -26,7 +26,7 @@
|
|||||||
src << "<span class='notice'>They will be deprived of sight for longer.</span>"
|
src << "<span class='notice'>They will be deprived of sight for longer.</span>"
|
||||||
spawn(duration)
|
spawn(duration)
|
||||||
T.disabilities &= ~NEARSIGHTED
|
T.disabilities &= ~NEARSIGHTED
|
||||||
T.eye_blind = 10
|
T.Blind(10)
|
||||||
T.eye_blurry = 20
|
T.eye_blurry = 20
|
||||||
feedback_add_details("changeling_powers","BS")
|
feedback_add_details("changeling_powers","BS")
|
||||||
return 1
|
return 1
|
||||||
@@ -18,11 +18,11 @@
|
|||||||
if(!changeling)
|
if(!changeling)
|
||||||
return 0
|
return 0
|
||||||
changeling.chem_charges -= 10
|
changeling.chem_charges -= 10
|
||||||
src << "<span class='notice'>Your throat adjusts to launch the sting.</span>"
|
to_chat(src, "<span class='notice'>Your throat adjusts to launch the sting.</span>")
|
||||||
var/range = 2
|
var/range = 2
|
||||||
if(src.mind.changeling.recursive_enhancement)
|
if(src.mind.changeling.recursive_enhancement)
|
||||||
range = range + 3
|
range = range + 3
|
||||||
src << "<span class='notice'>We can fire our next sting from five squares away.</span>"
|
to_chat(src, "<span class='notice'>We can fire our next sting from five squares away.</span>")
|
||||||
changeling.sting_range = range
|
changeling.sting_range = range
|
||||||
src.verbs -= /mob/proc/changeling_boost_range
|
src.verbs -= /mob/proc/changeling_boost_range
|
||||||
spawn(5)
|
spawn(5)
|
||||||
|
|||||||
@@ -2,12 +2,24 @@
|
|||||||
name = "Delayed Toxic Sting"
|
name = "Delayed Toxic Sting"
|
||||||
desc = "We silently sting a biological, causing a significant amount of toxins after a few minutes, allowing us to not \
|
desc = "We silently sting a biological, causing a significant amount of toxins after a few minutes, allowing us to not \
|
||||||
implicate ourselves."
|
implicate ourselves."
|
||||||
helptext = "The toxin takes effect in about two minutes. The sting has a three minute cooldown between uses."
|
helptext = "The toxin takes effect in about two minutes. Multiple applications within the two minutes will not cause increased toxicity."
|
||||||
enhancedtext = "The toxic damage is doubled."
|
enhancedtext = "The toxic damage is doubled."
|
||||||
ability_icon_state = "ling_sting_del_toxin"
|
ability_icon_state = "ling_sting_del_toxin"
|
||||||
genomecost = 1
|
genomecost = 1
|
||||||
verbpath = /mob/proc/changeling_delayed_toxic_sting
|
verbpath = /mob/proc/changeling_delayed_toxic_sting
|
||||||
|
|
||||||
|
/datum/modifier/delayed_toxin_sting
|
||||||
|
name = "delayed toxin injection"
|
||||||
|
hidden = TRUE
|
||||||
|
stacks = MODIFIER_STACK_FORBID
|
||||||
|
on_expired_text = "<span class='danger'>You feel a burning sensation flowing through your veins!</span>"
|
||||||
|
|
||||||
|
/datum/modifier/delayed_toxin_sting/on_expire()
|
||||||
|
holder.adjustToxLoss(rand(20, 30))
|
||||||
|
|
||||||
|
/datum/modifier/delayed_toxin_sting/strong/on_expire()
|
||||||
|
holder.adjustToxLoss(rand(40, 60))
|
||||||
|
|
||||||
/mob/proc/changeling_delayed_toxic_sting()
|
/mob/proc/changeling_delayed_toxic_sting()
|
||||||
set category = "Changeling"
|
set category = "Changeling"
|
||||||
set name = "Delayed Toxic Sting (20)"
|
set name = "Delayed Toxic Sting (20)"
|
||||||
@@ -19,21 +31,13 @@
|
|||||||
T.attack_log += text("\[[time_stamp()]\] <font color='red'>Was delayed toxic stung by [key_name(src)]</font>")
|
T.attack_log += text("\[[time_stamp()]\] <font color='red'>Was delayed toxic stung by [key_name(src)]</font>")
|
||||||
src.attack_log += text("\[[time_stamp()]\] <font color='orange'> Used delayed toxic sting on [key_name(T)]</font>")
|
src.attack_log += text("\[[time_stamp()]\] <font color='orange'> Used delayed toxic sting on [key_name(T)]</font>")
|
||||||
msg_admin_attack("[key_name(T)] was delayed toxic stung by [key_name(src)]")
|
msg_admin_attack("[key_name(T)] was delayed toxic stung by [key_name(src)]")
|
||||||
var/i = rand(20,30)
|
|
||||||
|
var/type_to_give = /datum/modifier/delayed_toxin_sting
|
||||||
if(src.mind.changeling.recursive_enhancement)
|
if(src.mind.changeling.recursive_enhancement)
|
||||||
i = i * 2
|
type_to_give = /datum/modifier/delayed_toxin_sting/strong
|
||||||
src << "<span class='notice'>Our toxin will be extra potent, when it strikes.</span>"
|
src << "<span class='notice'>Our toxin will be extra potent, when it strikes.</span>"
|
||||||
spawn(2 MINUTES)
|
|
||||||
if(T) //We might not exist in two minutes, for whatever reason.
|
T.add_modifier(type_to_give, 2 MINUTES)
|
||||||
T << "<span class='danger'>You feel a burning sensation flowing through your veins!</span>"
|
|
||||||
while(i)
|
|
||||||
T.adjustToxLoss(1)
|
|
||||||
i--
|
|
||||||
sleep(2 SECONDS)
|
|
||||||
src.verbs -= /mob/proc/changeling_delayed_toxic_sting
|
|
||||||
spawn(3 MINUTES)
|
|
||||||
src << "<span class='notice'>We are ready to use our delayed toxic string once more.</span>"
|
|
||||||
src.verbs |= /mob/proc/changeling_delayed_toxic_sting
|
|
||||||
|
|
||||||
|
|
||||||
feedback_add_details("changeling_powers","DTS")
|
feedback_add_details("changeling_powers","DTS")
|
||||||
|
|||||||
@@ -6,9 +6,18 @@
|
|||||||
isVerb = 0
|
isVerb = 0
|
||||||
verbpath = /mob/proc/changeling_endoarmor
|
verbpath = /mob/proc/changeling_endoarmor
|
||||||
|
|
||||||
|
/datum/modifier/endoarmor
|
||||||
|
name = "endoarmor"
|
||||||
|
desc = "We have hard plating underneath our skin, making us more durable."
|
||||||
|
|
||||||
|
on_created_text = "<span class='notice'>We feel protective plating form underneath our skin.</span>"
|
||||||
|
on_expired_text = "<span class='notice'>Our protective armor underneath our skin fades as we absorb it.</span>"
|
||||||
|
max_health_flat = 50
|
||||||
|
|
||||||
//Increases macimum chemical storage
|
//Increases macimum chemical storage
|
||||||
/mob/proc/changeling_endoarmor()
|
/mob/proc/changeling_endoarmor()
|
||||||
if(ishuman(src))
|
if(ishuman(src))
|
||||||
var/mob/living/carbon/human/H = src
|
var/mob/living/carbon/human/H = src
|
||||||
H.maxHealth += 50
|
H.add_modifier(/datum/modifier/endoarmor)
|
||||||
|
// H.maxHealth += 50
|
||||||
return 1
|
return 1
|
||||||
@@ -1,13 +1,29 @@
|
|||||||
/datum/power/changeling/enfeebling_string
|
/datum/power/changeling/enfeebling_string
|
||||||
name = "Enfeebling String"
|
name = "Enfeebling String"
|
||||||
desc = "We sting a biological with a potent toxin that will greatly weaken them for a short period of time."
|
desc = "We sting a biological with a potent toxin that will greatly weaken them for a short period of time."
|
||||||
helptext = "Lowers the maximum health of the victim for a few minutes. This sting will also warn them of this. Has a \
|
helptext = "Lowers the maximum health of the victim for a few minutes, as well as making them more frail and weak. This sting will also warn them of this."
|
||||||
five minute coodown between uses."
|
enhancedtext = "Maximum health and outgoing melee damage is lowered further. Incoming damage is increased."
|
||||||
enhancedtext = "Maximum health is lowered further."
|
|
||||||
ability_icon_state = "ling_sting_enfeeble"
|
ability_icon_state = "ling_sting_enfeeble"
|
||||||
genomecost = 1
|
genomecost = 1
|
||||||
verbpath = /mob/proc/changeling_enfeebling_string
|
verbpath = /mob/proc/changeling_enfeebling_string
|
||||||
|
|
||||||
|
/datum/modifier/enfeeble
|
||||||
|
name = "enfeebled"
|
||||||
|
desc = "You feel really weak and frail for some reason."
|
||||||
|
|
||||||
|
stacks = MODIFIER_STACK_EXTEND
|
||||||
|
max_health_percent = 0.7
|
||||||
|
outgoing_melee_damage_percent = 0.75
|
||||||
|
incoming_damage_percent = 1.1
|
||||||
|
on_created_text = "<span class='danger'>You feel a small prick and you feel extremly weak!</span>"
|
||||||
|
on_expired_text = "<span class='notice'>You no longer feel extremly weak.</span>"
|
||||||
|
|
||||||
|
// Now YOU'RE the Teshari!
|
||||||
|
/datum/modifier/enfeeble/strong
|
||||||
|
max_health_percent = 0.5
|
||||||
|
outgoing_melee_damage_percent = 0.5
|
||||||
|
incoming_damage_percent = 1.35
|
||||||
|
|
||||||
/mob/proc/changeling_enfeebling_string()
|
/mob/proc/changeling_enfeebling_string()
|
||||||
set category = "Changeling"
|
set category = "Changeling"
|
||||||
set name = "Enfeebling Sting (30)"
|
set name = "Enfeebling Sting (30)"
|
||||||
@@ -23,22 +39,10 @@
|
|||||||
src.attack_log += text("\[[time_stamp()]\] <font color='orange'> Used enfeebling sting on [key_name(T)]</font>")
|
src.attack_log += text("\[[time_stamp()]\] <font color='orange'> Used enfeebling sting on [key_name(T)]</font>")
|
||||||
msg_admin_attack("[key_name(T)] was enfeebling stung by [key_name(src)]")
|
msg_admin_attack("[key_name(T)] was enfeebling stung by [key_name(src)]")
|
||||||
|
|
||||||
|
var/type_to_give = /datum/modifier/enfeeble
|
||||||
var/effect = 30 //percent
|
|
||||||
if(src.mind.changeling.recursive_enhancement)
|
if(src.mind.changeling.recursive_enhancement)
|
||||||
effect = effect + 20
|
type_to_give = /datum/modifier/enfeeble/strong
|
||||||
src << "<span class='notice'>We make them extremely weak.</span>"
|
src << "<span class='notice'>We make them extremely weak.</span>"
|
||||||
var/health_to_take_away = H.maxHealth * (effect / 100)
|
H.add_modifier(type_to_give, 2 MINUTES)
|
||||||
|
|
||||||
H.maxHealth -= health_to_take_away
|
|
||||||
H << "<span class='danger'>You feel a small prick and you feel extremly weak!</span>"
|
|
||||||
src.verbs -= /mob/proc/changeling_enfeebling_string
|
|
||||||
spawn(5 MINUTES)
|
|
||||||
src.verbs |= /mob/proc/changeling_enfeebling_string
|
|
||||||
src << "<span class='notice'>Our enfeebling string is ready to be used once more.</span>"
|
|
||||||
if(H) //Just incase we stop existing in five minutes for whatever reason.
|
|
||||||
H.maxHealth += health_to_take_away
|
|
||||||
if(!H.stat) //It'd be weird to no longer feel weak when you're dead.
|
|
||||||
H << "<span class='notice'>You no longer feel extremly weak.</span>"
|
|
||||||
feedback_add_details("changeling_powers","ES")
|
feedback_add_details("changeling_powers","ES")
|
||||||
return 1
|
return 1
|
||||||
@@ -2,11 +2,20 @@
|
|||||||
name = "Epinephrine Overdose"
|
name = "Epinephrine Overdose"
|
||||||
desc = "We evolve additional sacs of adrenaline throughout our body."
|
desc = "We evolve additional sacs of adrenaline throughout our body."
|
||||||
helptext = "We can instantly recover from stuns and reduce the effect of future stuns, but we will suffer toxicity in the long term. Can be used while unconscious."
|
helptext = "We can instantly recover from stuns and reduce the effect of future stuns, but we will suffer toxicity in the long term. Can be used while unconscious."
|
||||||
enhancedtext = "Constant recovery from stuns for thirty seconds."
|
enhancedtext = "Immunity from most disabling effects for 30 seconds."
|
||||||
ability_icon_state = "ling_epinepherine_overdose"
|
ability_icon_state = "ling_epinepherine_overdose"
|
||||||
genomecost = 2
|
genomecost = 2
|
||||||
verbpath = /mob/proc/changeling_epinephrine_overdose
|
verbpath = /mob/proc/changeling_epinephrine_overdose
|
||||||
|
|
||||||
|
/datum/modifier/unstoppable
|
||||||
|
name = "unstoppable"
|
||||||
|
desc = "We feel limitless amounts of energy surge in our veins. Nothing can stop us!"
|
||||||
|
|
||||||
|
stacks = MODIFIER_STACK_EXTEND
|
||||||
|
on_created_text = "<span class='notice'>We feel unstoppable!</span>"
|
||||||
|
on_expired_text = "<span class='warning'>We feel our newfound energy fade...</span>"
|
||||||
|
disable_duration_percent = 0
|
||||||
|
|
||||||
//Recover from stuns.
|
//Recover from stuns.
|
||||||
/mob/proc/changeling_epinephrine_overdose()
|
/mob/proc/changeling_epinephrine_overdose()
|
||||||
set category = "Changeling"
|
set category = "Changeling"
|
||||||
@@ -30,18 +39,7 @@
|
|||||||
C.reagents.add_reagent("epinephrine", 20)
|
C.reagents.add_reagent("epinephrine", 20)
|
||||||
|
|
||||||
if(src.mind.changeling.recursive_enhancement)
|
if(src.mind.changeling.recursive_enhancement)
|
||||||
src << "<span class='notice'>We feel unstoppable.</span>"
|
C.add_modifier(/datum/modifier/unstoppable, 30 SECONDS)
|
||||||
spawn(1)
|
|
||||||
var/i = 30
|
|
||||||
while(i)
|
|
||||||
C.SetParalysis(0)
|
|
||||||
C.SetStunned(0)
|
|
||||||
C.SetWeakened(0)
|
|
||||||
C.lying = 0
|
|
||||||
C.update_canmove()
|
|
||||||
i--
|
|
||||||
sleep(10)
|
|
||||||
src << "<span class='notice'>We feel our newfound energy fade.</span>"
|
|
||||||
|
|
||||||
feedback_add_details("changeling_powers","UNS")
|
feedback_add_details("changeling_powers","UNS")
|
||||||
return 1
|
return 1
|
||||||
|
|||||||
@@ -18,7 +18,7 @@ var/global/list/changeling_fabricated_clothing = list(
|
|||||||
helptext = "The disguise we create offers no defensive ability. Each equipment slot that is empty will be filled with fabricated equipment. \
|
helptext = "The disguise we create offers no defensive ability. Each equipment slot that is empty will be filled with fabricated equipment. \
|
||||||
To remove our new fabricated clothing, use this ability again."
|
To remove our new fabricated clothing, use this ability again."
|
||||||
ability_icon_state = "ling_fabricate_clothing"
|
ability_icon_state = "ling_fabricate_clothing"
|
||||||
genomecost = 2
|
genomecost = 1
|
||||||
verbpath = /mob/proc/changeling_fabricate_clothing
|
verbpath = /mob/proc/changeling_fabricate_clothing
|
||||||
|
|
||||||
//Grows biological versions of chameleon clothes.
|
//Grows biological versions of chameleon clothes.
|
||||||
|
|||||||
@@ -12,7 +12,7 @@
|
|||||||
set category = "Changeling"
|
set category = "Changeling"
|
||||||
set name = "Regenerative Stasis (20)"
|
set name = "Regenerative Stasis (20)"
|
||||||
|
|
||||||
var/datum/changeling/changeling = changeling_power(20,1,100,DEAD)
|
var/datum/changeling/changeling = changeling_power(CHANGELING_STASIS_COST,1,100,DEAD)
|
||||||
if(!changeling)
|
if(!changeling)
|
||||||
return
|
return
|
||||||
|
|
||||||
@@ -28,6 +28,7 @@
|
|||||||
|
|
||||||
C.update_canmove()
|
C.update_canmove()
|
||||||
C.remove_changeling_powers()
|
C.remove_changeling_powers()
|
||||||
|
changeling.chem_charges -= CHANGELING_STASIS_COST
|
||||||
|
|
||||||
if(C.suiciding)
|
if(C.suiciding)
|
||||||
C.suiciding = 0
|
C.suiciding = 0
|
||||||
@@ -35,7 +36,9 @@
|
|||||||
if(C.stat != DEAD)
|
if(C.stat != DEAD)
|
||||||
C.adjustOxyLoss(C.maxHealth * 2)
|
C.adjustOxyLoss(C.maxHealth * 2)
|
||||||
|
|
||||||
spawn(rand(800,2000))
|
C.forbid_seeing_deadchat = TRUE
|
||||||
|
|
||||||
|
spawn(rand(2 MINUTES, 4 MINUTES))
|
||||||
//The ling will now be able to choose when to revive
|
//The ling will now be able to choose when to revive
|
||||||
src.verbs += /mob/proc/changeling_revive
|
src.verbs += /mob/proc/changeling_revive
|
||||||
src << "<span class='notice'><font size='5'>We are ready to rise. Use the <b>Revive</b> verb when you are ready.</font></span>"
|
src << "<span class='notice'><font size='5'>We are ready to rise. Use the <b>Revive</b> verb when you are ready.</font></span>"
|
||||||
|
|||||||
@@ -35,7 +35,7 @@
|
|||||||
C.species.create_organs(C)
|
C.species.create_organs(C)
|
||||||
C.restore_all_organs()
|
C.restore_all_organs()
|
||||||
C.blinded = 0
|
C.blinded = 0
|
||||||
C.eye_blind = 0
|
C.SetBlinded(0)
|
||||||
C.eye_blurry = 0
|
C.eye_blurry = 0
|
||||||
C.ear_deaf = 0
|
C.ear_deaf = 0
|
||||||
C.ear_damage = 0
|
C.ear_damage = 0
|
||||||
|
|||||||
@@ -6,9 +6,14 @@
|
|||||||
var/datum/changeling/changeling = changeling_power(0,0,100)
|
var/datum/changeling/changeling = changeling_power(0,0,100)
|
||||||
if(!changeling)
|
if(!changeling)
|
||||||
return
|
return
|
||||||
|
if(src.mind.changeling.readapts <= 0)
|
||||||
|
to_chat(src, "<span class='warning'>We must first absorb another compatable creature!</span>")
|
||||||
|
src.mind.changeling.readapts = 0
|
||||||
|
return
|
||||||
|
|
||||||
src.remove_changeling_powers() //First, remove the verbs.
|
src.remove_changeling_powers() //First, remove the verbs.
|
||||||
var/datum/changeling/ling_datum = src.mind.changeling
|
var/datum/changeling/ling_datum = src.mind.changeling
|
||||||
|
ling_datum.readapts--
|
||||||
ling_datum.purchased_powers = list() //Then wipe all the powers we bought.
|
ling_datum.purchased_powers = list() //Then wipe all the powers we bought.
|
||||||
ling_datum.geneticpoints = ling_datum.max_geneticpoints //Now refund our points to the maximum.
|
ling_datum.geneticpoints = ling_datum.max_geneticpoints //Now refund our points to the maximum.
|
||||||
ling_datum.chem_recharge_rate = 0.5 //If glands were bought, revert that upgrade.
|
ling_datum.chem_recharge_rate = 0.5 //If glands were bought, revert that upgrade.
|
||||||
@@ -17,13 +22,10 @@
|
|||||||
ling_datum.chem_storage = 50
|
ling_datum.chem_storage = 50
|
||||||
if(ishuman(src))
|
if(ishuman(src))
|
||||||
var/mob/living/carbon/human/H = src
|
var/mob/living/carbon/human/H = src
|
||||||
H.does_not_breathe = 0 //If self respiration was bought, revert that too.
|
// H.does_not_breathe = 0 //If self respiration was bought, revert that too.
|
||||||
H.maxHealth = initial(H.maxHealth) //Revert endoarmor too.
|
H.remove_modifiers_of_type(/datum/modifier/endoarmor) //Revert endoarmor too.
|
||||||
src.make_changeling() //And give back our freebies.
|
src.make_changeling() //And give back our freebies.
|
||||||
|
|
||||||
src << "<span class='notice'>We have removed our evolutions from this form, and are now ready to readapt.</span>"
|
src << "<span class='notice'>We have removed our evolutions from this form, and are now ready to readapt.</span>"
|
||||||
|
|
||||||
ling_datum.purchased_powers_history.Add("Re-adapt (Reset to [ling_datum.max_geneticpoints])")
|
ling_datum.purchased_powers_history.Add("Re-adapt (Reset to [ling_datum.max_geneticpoints])")
|
||||||
|
|
||||||
//Now to lose the verb, so no unlimited resets.
|
|
||||||
src.verbs -= /mob/proc/changeling_respec
|
|
||||||
@@ -41,6 +41,10 @@
|
|||||||
current_limb.undislocate()
|
current_limb.undislocate()
|
||||||
current_limb.open = 0
|
current_limb.open = 0
|
||||||
|
|
||||||
|
BITSET(H.hud_updateflag, HEALTH_HUD)
|
||||||
|
BITSET(H.hud_updateflag, STATUS_HUD)
|
||||||
|
BITSET(H.hud_updateflag, LIFE_HUD)
|
||||||
|
|
||||||
C.halloss = 0
|
C.halloss = 0
|
||||||
C.shock_stage = 0 //Pain
|
C.shock_stage = 0 //Pain
|
||||||
C << "<span class='notice'>We have regenerated.</span>"
|
C << "<span class='notice'>We have regenerated.</span>"
|
||||||
@@ -48,8 +52,12 @@
|
|||||||
C.mind.changeling.purchased_powers -= C
|
C.mind.changeling.purchased_powers -= C
|
||||||
feedback_add_details("changeling_powers","CR")
|
feedback_add_details("changeling_powers","CR")
|
||||||
C.stat = CONSCIOUS
|
C.stat = CONSCIOUS
|
||||||
|
C.forbid_seeing_deadchat = FALSE
|
||||||
C.timeofdeath = null
|
C.timeofdeath = null
|
||||||
src.verbs -= /mob/proc/changeling_revive
|
src.verbs -= /mob/proc/changeling_revive
|
||||||
// re-add our changeling powers
|
// re-add our changeling powers
|
||||||
C.make_changeling()
|
C.make_changeling()
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
return 1
|
return 1
|
||||||
@@ -35,6 +35,14 @@
|
|||||||
src << "<span class='danger'>You can't speak!</span>"
|
src << "<span class='danger'>You can't speak!</span>"
|
||||||
return 0
|
return 0
|
||||||
|
|
||||||
|
if(world.time < (changeling.last_shriek + 10 SECONDS) )
|
||||||
|
to_chat(src, "<span class='warning'>We are still recovering from our last shriek...</span>")
|
||||||
|
return 0
|
||||||
|
|
||||||
|
if(!isturf(loc))
|
||||||
|
to_chat(src, "<span class='warning'>Shrieking here would be a bad idea.</span>")
|
||||||
|
return 0
|
||||||
|
|
||||||
src.break_cloak() //No more invisible shrieking
|
src.break_cloak() //No more invisible shrieking
|
||||||
|
|
||||||
changeling.chem_charges -= 20
|
changeling.chem_charges -= 20
|
||||||
@@ -47,6 +55,8 @@
|
|||||||
message_admins("[key_name(src)] used Resonant Shriek ([src.x],[src.y],[src.z]) (<A HREF='?_src_=holder;adminplayerobservecoodjump=1;X=[src.x];Y=[src.y];Z=[src.z]'>JMP</a>).")
|
message_admins("[key_name(src)] used Resonant Shriek ([src.x],[src.y],[src.z]) (<A HREF='?_src_=holder;adminplayerobservecoodjump=1;X=[src.x];Y=[src.y];Z=[src.z]'>JMP</a>).")
|
||||||
log_game("[key_name(src)] used Resonant Shriek.")
|
log_game("[key_name(src)] used Resonant Shriek.")
|
||||||
|
|
||||||
|
visible_message("<span class='notice'>[src] appears to shout.</span>")
|
||||||
|
|
||||||
for(var/mob/living/M in range(range, src))
|
for(var/mob/living/M in range(range, src))
|
||||||
if(iscarbon(M))
|
if(iscarbon(M))
|
||||||
if(!M.mind || !M.mind.changeling)
|
if(!M.mind || !M.mind.changeling)
|
||||||
@@ -55,7 +65,7 @@
|
|||||||
M << "<span class='danger'>You hear an extremely loud screeching sound! It \
|
M << "<span class='danger'>You hear an extremely loud screeching sound! It \
|
||||||
[pick("confuses","confounds","perturbs","befuddles","dazes","unsettles","disorients")] you.</span>"
|
[pick("confuses","confounds","perturbs","befuddles","dazes","unsettles","disorients")] you.</span>"
|
||||||
M.adjustEarDamage(0,30)
|
M.adjustEarDamage(0,30)
|
||||||
M.confused += 20
|
M.Confuse(20)
|
||||||
M << sound('sound/effects/screech.ogg')
|
M << sound('sound/effects/screech.ogg')
|
||||||
M.attack_log += text("\[[time_stamp()]\] <font color='orange'>Was affected by [key_name(src)]'s Resonant Shriek.</font>")
|
M.attack_log += text("\[[time_stamp()]\] <font color='orange'>Was affected by [key_name(src)]'s Resonant Shriek.</font>")
|
||||||
else
|
else
|
||||||
@@ -73,11 +83,7 @@
|
|||||||
L.on = 1
|
L.on = 1
|
||||||
L.broken()
|
L.broken()
|
||||||
|
|
||||||
/* src.verbs -= /mob/proc/changeling_resonant_shriek
|
changeling.last_shriek = world.time
|
||||||
spawn(30 SECONDS)
|
|
||||||
src << "<span class='notice'>We are ready to use our resonant shriek once more.</span>"
|
|
||||||
src.verbs |= /mob/proc/changeling_resonant_shriek
|
|
||||||
Ability Cooldowns don't work properly right now, need to redo this when they are */
|
|
||||||
|
|
||||||
feedback_add_details("changeling_powers","RS")
|
feedback_add_details("changeling_powers","RS")
|
||||||
return 1
|
return 1
|
||||||
@@ -101,6 +107,14 @@ Ability Cooldowns don't work properly right now, need to redo this when they are
|
|||||||
src << "<span class='danger'>You can't speak!</span>"
|
src << "<span class='danger'>You can't speak!</span>"
|
||||||
return 0
|
return 0
|
||||||
|
|
||||||
|
if(world.time < (changeling.last_shriek + 10 SECONDS) )
|
||||||
|
to_chat(src, "<span class='warning'>We are still recovering from our last shriek...</span>")
|
||||||
|
return 0
|
||||||
|
|
||||||
|
if(!isturf(loc))
|
||||||
|
to_chat(src, "<span class='warning'>Shrieking here would be a bad idea.</span>")
|
||||||
|
return 0
|
||||||
|
|
||||||
src.break_cloak() //No more invisible shrieking
|
src.break_cloak() //No more invisible shrieking
|
||||||
|
|
||||||
changeling.chem_charges -= 20
|
changeling.chem_charges -= 20
|
||||||
@@ -117,6 +131,8 @@ Ability Cooldowns don't work properly right now, need to redo this when they are
|
|||||||
src << "<span class='notice'>We are extra loud.</span>"
|
src << "<span class='notice'>We are extra loud.</span>"
|
||||||
src.mind.changeling.recursive_enhancement = 0
|
src.mind.changeling.recursive_enhancement = 0
|
||||||
|
|
||||||
|
visible_message("<span class='notice'>[src] appears to shout.</span>")
|
||||||
|
|
||||||
src.attack_log += text("\[[time_stamp()]\] <font color='red'>Used Dissonant Shriek.</font>")
|
src.attack_log += text("\[[time_stamp()]\] <font color='red'>Used Dissonant Shriek.</font>")
|
||||||
message_admins("[key_name(src)] used Dissonant Shriek ([src.x],[src.y],[src.z]) (<A HREF='?_src_=holder;adminplayerobservecoodjump=1;X=[src.x];Y=[src.y];Z=[src.z]'>JMP</a>).")
|
message_admins("[key_name(src)] used Dissonant Shriek ([src.x],[src.y],[src.z]) (<A HREF='?_src_=holder;adminplayerobservecoodjump=1;X=[src.x];Y=[src.y];Z=[src.z]'>JMP</a>).")
|
||||||
log_game("[key_name(src)] used Dissonant Shriek.")
|
log_game("[key_name(src)] used Dissonant Shriek.")
|
||||||
@@ -126,9 +142,6 @@ Ability Cooldowns don't work properly right now, need to redo this when they are
|
|||||||
L.broken()
|
L.broken()
|
||||||
empulse(get_turf(src), range_heavy, range_light, 1)
|
empulse(get_turf(src), range_heavy, range_light, 1)
|
||||||
|
|
||||||
/* src.verbs -= /mob/proc/changeling_dissonant_shriek
|
changeling.last_shriek = world.time
|
||||||
spawn(30 SECONDS)
|
|
||||||
src << "<span class='notice'>We are ready to use our dissonant shriek once more.</span>"
|
|
||||||
src.verbs |= /mob/proc/changeling_dissonant_shriek
|
|
||||||
Ability Cooldowns don't work properly right now, need to redo this when they are */
|
|
||||||
return 1
|
return 1
|
||||||
@@ -13,6 +13,10 @@
|
|||||||
var/datum/changeling/changeling = changeling_power(5,1,0)
|
var/datum/changeling/changeling = changeling_power(5,1,0)
|
||||||
if(!changeling) return
|
if(!changeling) return
|
||||||
|
|
||||||
|
if(!isturf(loc))
|
||||||
|
to_chat(src, "<span class='warning'>Transforming here would be a bad idea.</span>")
|
||||||
|
return 0
|
||||||
|
|
||||||
var/list/names = list()
|
var/list/names = list()
|
||||||
for(var/datum/absorbed_dna/DNA in changeling.absorbed_dna)
|
for(var/datum/absorbed_dna/DNA in changeling.absorbed_dna)
|
||||||
names += "[DNA.name]"
|
names += "[DNA.name]"
|
||||||
|
|||||||
@@ -3,7 +3,7 @@
|
|||||||
desc = "We rapidly shape the color of our skin and secrete easily reversible dye on our clothes, to blend in with our surroundings. \
|
desc = "We rapidly shape the color of our skin and secrete easily reversible dye on our clothes, to blend in with our surroundings. \
|
||||||
We are undetectable, so long as we move slowly.(Toggle)"
|
We are undetectable, so long as we move slowly.(Toggle)"
|
||||||
helptext = "Running, and performing most acts will reveal us. Our chemical regeneration is halted while we are hidden."
|
helptext = "Running, and performing most acts will reveal us. Our chemical regeneration is halted while we are hidden."
|
||||||
enhancedtext = "True invisiblity while cloaked."
|
enhancedtext = "Can run while hidden."
|
||||||
ability_icon_state = "ling_camoflage"
|
ability_icon_state = "ling_camoflage"
|
||||||
genomecost = 3
|
genomecost = 3
|
||||||
verbpath = /mob/proc/changeling_visible_camouflage
|
verbpath = /mob/proc/changeling_visible_camouflage
|
||||||
@@ -31,20 +31,35 @@
|
|||||||
var/old_regen_rate = H.mind.changeling.chem_recharge_rate
|
var/old_regen_rate = H.mind.changeling.chem_recharge_rate
|
||||||
|
|
||||||
H << "<span class='notice'>We vanish from sight, and will remain hidden, so long as we move carefully.</span>"
|
H << "<span class='notice'>We vanish from sight, and will remain hidden, so long as we move carefully.</span>"
|
||||||
H.set_m_intent("walk")
|
|
||||||
H.mind.changeling.cloaked = 1
|
H.mind.changeling.cloaked = 1
|
||||||
H.mind.changeling.chem_recharge_rate = 0
|
H.mind.changeling.chem_recharge_rate = 0
|
||||||
animate(src,alpha = 255, alpha = 10, time = 10)
|
animate(src,alpha = 255, alpha = 10, time = 10)
|
||||||
|
|
||||||
|
var/must_walk = TRUE
|
||||||
if(src.mind.changeling.recursive_enhancement)
|
if(src.mind.changeling.recursive_enhancement)
|
||||||
H.invisibility = INVISIBILITY_OBSERVER
|
must_walk = FALSE
|
||||||
src << "<span class='notice'>We are now truly invisible.</span>"
|
to_chat(src, "<span class='notice'>We may move at our normal speed while hidden.</span>")
|
||||||
|
|
||||||
|
if(must_walk)
|
||||||
|
H.set_m_intent("walk")
|
||||||
|
|
||||||
|
var/remain_cloaked = TRUE
|
||||||
|
while(remain_cloaked) //This loop will keep going until the player uncloaks.
|
||||||
|
sleep(1 SECOND) // Sleep at the start so that if something invalidates a cloak, it will drop immediately after the check and not in one second.
|
||||||
|
|
||||||
|
if(H.m_intent != "walk" && must_walk) // Moving too fast uncloaks you.
|
||||||
|
remain_cloaked = 0
|
||||||
|
if(!H.mind.changeling.cloaked)
|
||||||
|
remain_cloaked = 0
|
||||||
|
if(H.stat) // Dead or unconscious lings can't stay cloaked.
|
||||||
|
remain_cloaked = 0
|
||||||
|
if(H.incapacitated(INCAPACITATION_DISABLED)) // Stunned lings also can't stay cloaked.
|
||||||
|
remain_cloaked = 0
|
||||||
|
|
||||||
while(H.m_intent == "walk" && H.mind.changeling.cloaked && !H.stat) //This loop will keep going until the player uncloaks.
|
|
||||||
if(mind.changeling.chem_recharge_rate != 0) //Without this, there is an exploit that can be done, if one buys engorged chem sacks while cloaked.
|
if(mind.changeling.chem_recharge_rate != 0) //Without this, there is an exploit that can be done, if one buys engorged chem sacks while cloaked.
|
||||||
old_regen_rate += mind.changeling.chem_recharge_rate //Unfortunately, it has to occupy this part of the proc. This fixes it while at the same time
|
old_regen_rate += mind.changeling.chem_recharge_rate //Unfortunately, it has to occupy this part of the proc. This fixes it while at the same time
|
||||||
mind.changeling.chem_recharge_rate = 0 //making sure nobody loses out on their bonus regeneration after they're done hiding.
|
mind.changeling.chem_recharge_rate = 0 //making sure nobody loses out on their bonus regeneration after they're done hiding.
|
||||||
sleep(10)
|
|
||||||
|
|
||||||
|
|
||||||
H.invisibility = initial(invisibility)
|
H.invisibility = initial(invisibility)
|
||||||
|
|||||||
@@ -49,7 +49,7 @@
|
|||||||
desc = "A hood worn by the followers of Nar-Sie."
|
desc = "A hood worn by the followers of Nar-Sie."
|
||||||
flags_inv = HIDEFACE
|
flags_inv = HIDEFACE
|
||||||
body_parts_covered = HEAD
|
body_parts_covered = HEAD
|
||||||
armor = list(melee = 50, bullet = 30, laser = 50, energy = 20, bomb = 25, bio = 10, rad = 0)
|
armor = list(melee = 50, bullet = 30, laser = 50, energy = 80, bomb = 25, bio = 10, rad = 0)
|
||||||
cold_protection = HEAD
|
cold_protection = HEAD
|
||||||
min_cold_protection_temperature = SPACE_HELMET_MIN_COLD_PROTECTION_TEMPERATURE
|
min_cold_protection_temperature = SPACE_HELMET_MIN_COLD_PROTECTION_TEMPERATURE
|
||||||
siemens_coefficient = 0
|
siemens_coefficient = 0
|
||||||
@@ -73,7 +73,7 @@
|
|||||||
icon_state = "cultrobes"
|
icon_state = "cultrobes"
|
||||||
body_parts_covered = UPPER_TORSO|LOWER_TORSO|LEGS|ARMS
|
body_parts_covered = UPPER_TORSO|LOWER_TORSO|LEGS|ARMS
|
||||||
allowed = list(/obj/item/weapon/book/tome,/obj/item/weapon/melee/cultblade)
|
allowed = list(/obj/item/weapon/book/tome,/obj/item/weapon/melee/cultblade)
|
||||||
armor = list(melee = 50, bullet = 30, laser = 50, energy = 20, bomb = 25, bio = 10, rad = 0)
|
armor = list(melee = 50, bullet = 30, laser = 50, energy = 80, bomb = 25, bio = 10, rad = 0)
|
||||||
flags_inv = HIDEJUMPSUIT
|
flags_inv = HIDEJUMPSUIT
|
||||||
siemens_coefficient = 0
|
siemens_coefficient = 0
|
||||||
|
|
||||||
@@ -95,7 +95,7 @@
|
|||||||
name = "cult helmet"
|
name = "cult helmet"
|
||||||
desc = "A space worthy helmet used by the followers of Nar-Sie."
|
desc = "A space worthy helmet used by the followers of Nar-Sie."
|
||||||
icon_state = "cult_helmet"
|
icon_state = "cult_helmet"
|
||||||
armor = list(melee = 60, bullet = 50, laser = 30, energy = 15, bomb = 30, bio = 30, rad = 30)
|
armor = list(melee = 60, bullet = 50, laser = 30, energy = 80, bomb = 30, bio = 30, rad = 30)
|
||||||
siemens_coefficient = 0
|
siemens_coefficient = 0
|
||||||
|
|
||||||
/obj/item/clothing/head/helmet/space/cult/cultify()
|
/obj/item/clothing/head/helmet/space/cult/cultify()
|
||||||
@@ -108,7 +108,7 @@
|
|||||||
w_class = ITEMSIZE_NORMAL
|
w_class = ITEMSIZE_NORMAL
|
||||||
allowed = list(/obj/item/weapon/book/tome,/obj/item/weapon/melee/cultblade,/obj/item/weapon/tank/emergency/oxygen,/obj/item/device/suit_cooling_unit)
|
allowed = list(/obj/item/weapon/book/tome,/obj/item/weapon/melee/cultblade,/obj/item/weapon/tank/emergency/oxygen,/obj/item/device/suit_cooling_unit)
|
||||||
slowdown = 1
|
slowdown = 1
|
||||||
armor = list(melee = 60, bullet = 50, laser = 30, energy = 15, bomb = 30, bio = 30, rad = 30)
|
armor = list(melee = 60, bullet = 50, laser = 30, energy = 80, bomb = 30, bio = 30, rad = 30)
|
||||||
siemens_coefficient = 0
|
siemens_coefficient = 0
|
||||||
flags_inv = HIDEGLOVES|HIDEJUMPSUIT|HIDETAIL|HIDETIE|HIDEHOLSTER
|
flags_inv = HIDEGLOVES|HIDEJUMPSUIT|HIDETAIL|HIDETIE|HIDEHOLSTER
|
||||||
body_parts_covered = UPPER_TORSO|LOWER_TORSO|LEGS|ARMS|HANDS
|
body_parts_covered = UPPER_TORSO|LOWER_TORSO|LEGS|ARMS|HANDS
|
||||||
|
|||||||
@@ -958,7 +958,7 @@ var/list/sacrificed = list()
|
|||||||
if(N)
|
if(N)
|
||||||
continue
|
continue
|
||||||
C.eye_blurry += 50
|
C.eye_blurry += 50
|
||||||
C.eye_blind += 20
|
C.Blind(20)
|
||||||
if(prob(5))
|
if(prob(5))
|
||||||
C.disabilities |= NEARSIGHTED
|
C.disabilities |= NEARSIGHTED
|
||||||
if(prob(10))
|
if(prob(10))
|
||||||
@@ -981,7 +981,7 @@ var/list/sacrificed = list()
|
|||||||
if(N)
|
if(N)
|
||||||
continue
|
continue
|
||||||
C.eye_blurry += 30
|
C.eye_blurry += 30
|
||||||
C.eye_blind += 10
|
C.Blind(10)
|
||||||
//talismans is weaker.
|
//talismans is weaker.
|
||||||
affected += C
|
affected += C
|
||||||
C.show_message("<span class='warning'>You feel a sharp pain in your eyes, and the world disappears into darkness..</span>", 3)
|
C.show_message("<span class='warning'>You feel a sharp pain in your eyes, and the world disappears into darkness..</span>", 3)
|
||||||
|
|||||||
@@ -7,20 +7,13 @@ var/global/list/obj/cortical_stacks = list() //Stacks for 'leave nobody behind'
|
|||||||
/datum/game_mode/heist
|
/datum/game_mode/heist
|
||||||
name = "Heist"
|
name = "Heist"
|
||||||
config_tag = "heist"
|
config_tag = "heist"
|
||||||
required_players = 8
|
required_players = 15
|
||||||
required_players_secret = 8
|
required_players_secret = 15
|
||||||
required_enemies = 3
|
required_enemies = 4
|
||||||
round_description = "An unidentified bluespace signature is approaching the station!"
|
round_description = "An unidentified bluespace signature is approaching the station!"
|
||||||
extended_round_description = "The Company's majority control of phoron in the system has marked the \
|
extended_round_description = "The Company's majority control of phoron in the system has marked the \
|
||||||
station to be a highly valuable target for many competing organizations and individuals. Being a \
|
station to be a highly valuable target for many competing organizations and individuals. Being a \
|
||||||
colony of sizable population and considerable wealth causes it to often be the target of various \
|
colony of sizable population and considerable wealth causes it to often be the target of various \
|
||||||
attempts of robbery, fraud and other malicious actions."
|
attempts of robbery, fraud and other malicious actions."
|
||||||
end_on_antag_death = 0
|
end_on_antag_death = 0
|
||||||
antag_tags = list(MODE_RAIDER)
|
antag_tags = list(MODE_RAIDER)
|
||||||
|
|
||||||
/datum/game_mode/heist/check_finished()
|
|
||||||
if(!..())
|
|
||||||
var/datum/shuttle/multi_shuttle/skipjack = shuttle_controller.shuttles["Skipjack"]
|
|
||||||
if (skipjack && skipjack.returned_home)
|
|
||||||
return 1
|
|
||||||
return 0
|
|
||||||
@@ -12,9 +12,9 @@ var/list/nuke_disks = list()
|
|||||||
colony of sizable population and considerable wealth causes it to often be the target of various \
|
colony of sizable population and considerable wealth causes it to often be the target of various \
|
||||||
attempts of robbery, fraud and other malicious actions."
|
attempts of robbery, fraud and other malicious actions."
|
||||||
config_tag = "mercenary"
|
config_tag = "mercenary"
|
||||||
required_players = 8
|
required_players = 15
|
||||||
required_players_secret = 8
|
required_players_secret = 15
|
||||||
required_enemies = 3
|
required_enemies = 4
|
||||||
end_on_antag_death = 0
|
end_on_antag_death = 0
|
||||||
var/nuke_off_station = 0 //Used for tracking if the syndies actually haul the nuke to the station
|
var/nuke_off_station = 0 //Used for tracking if the syndies actually haul the nuke to the station
|
||||||
var/syndies_didnt_escape = 0 //Used for tracking if the syndies got the shuttle off of the z-level
|
var/syndies_didnt_escape = 0 //Used for tracking if the syndies got the shuttle off of the z-level
|
||||||
|
|||||||
@@ -191,6 +191,7 @@
|
|||||||
icon_state = "scepter"
|
icon_state = "scepter"
|
||||||
force = 15
|
force = 15
|
||||||
slot_flags = SLOT_BELT
|
slot_flags = SLOT_BELT
|
||||||
|
attack_verb = list("beaten", "smashed", "struck", "whacked")
|
||||||
|
|
||||||
/obj/item/weapon/scepter/attack_self(mob/living/carbon/human/user)
|
/obj/item/weapon/scepter/attack_self(mob/living/carbon/human/user)
|
||||||
var/obj/item/item_to_test = user.get_other_hand(src)
|
var/obj/item/item_to_test = user.get_other_hand(src)
|
||||||
|
|||||||
@@ -285,4 +285,4 @@
|
|||||||
to_chat(H, "<span class='warning'>The purple glow makes you feel strange...</span>")
|
to_chat(H, "<span class='warning'>The purple glow makes you feel strange...</span>")
|
||||||
H.adjust_instability(outgoing_instability)
|
H.adjust_instability(outgoing_instability)
|
||||||
|
|
||||||
set_light(distance, distance * 2, l_color = "#C26DDE")
|
set_light(distance, distance * 4, l_color = "#C26DDE")
|
||||||
|
|||||||
@@ -25,7 +25,7 @@
|
|||||||
if(is_ally(L))
|
if(is_ally(L))
|
||||||
continue
|
continue
|
||||||
|
|
||||||
var/damage_to_inflict = max(L.health / L.maxHealth, 0) // Otherwise, those in crit would actually be healed.
|
var/damage_to_inflict = max(L.health / L.getMaxHealth(), 0) // Otherwise, those in crit would actually be healed.
|
||||||
|
|
||||||
var/armor_factor = abs(L.getarmor(null, "energy") - 100)
|
var/armor_factor = abs(L.getarmor(null, "energy") - 100)
|
||||||
armor_factor = armor_factor / 100
|
armor_factor = armor_factor / 100
|
||||||
|
|||||||
@@ -21,5 +21,6 @@
|
|||||||
for(var/obj/item/weapon/inserted_spell/I in target)
|
for(var/obj/item/weapon/inserted_spell/I in target)
|
||||||
I.on_expire(dispelled = 1)
|
I.on_expire(dispelled = 1)
|
||||||
log_and_message_admins("dispelled [I] on [target].")
|
log_and_message_admins("dispelled [I] on [target].")
|
||||||
|
target.remove_modifiers_of_type(/datum/modifier/technomancer)
|
||||||
user.adjust_instability(10)
|
user.adjust_instability(10)
|
||||||
qdel(src)
|
qdel(src)
|
||||||
@@ -93,6 +93,9 @@
|
|||||||
var/walking = 0
|
var/walking = 0
|
||||||
var/step_delay = 10
|
var/step_delay = 10
|
||||||
|
|
||||||
|
/mob/living/simple_animal/illusion/update_icon() // We don't want the appearance changing AT ALL unless by copy_appearance().
|
||||||
|
return
|
||||||
|
|
||||||
/mob/living/simple_animal/illusion/proc/copy_appearance(var/atom/movable/thing_to_copy)
|
/mob/living/simple_animal/illusion/proc/copy_appearance(var/atom/movable/thing_to_copy)
|
||||||
if(!thing_to_copy)
|
if(!thing_to_copy)
|
||||||
return 0
|
return 0
|
||||||
|
|||||||
@@ -32,7 +32,7 @@
|
|||||||
warned_victim = predict_crit(pulses, H, 0)
|
warned_victim = predict_crit(pulses, H, 0)
|
||||||
sleep(4 SECONDS)
|
sleep(4 SECONDS)
|
||||||
H.adjustOxyLoss(5)
|
H.adjustOxyLoss(5)
|
||||||
var/health_lost = H.maxHealth - H.getOxyLoss() + H.getToxLoss() + H.getFireLoss() + H.getBruteLoss() + H.getCloneLoss()
|
var/health_lost = H.getMaxHealth() - H.getOxyLoss() + H.getToxLoss() + H.getFireLoss() + H.getBruteLoss() + H.getCloneLoss()
|
||||||
H.adjustOxyLoss(round(abs(health_lost * 0.25)))
|
H.adjustOxyLoss(round(abs(health_lost * 0.25)))
|
||||||
//world << "Inflicted [round(abs(health_lost * 0.25))] damage!"
|
//world << "Inflicted [round(abs(health_lost * 0.25))] damage!"
|
||||||
pulses--
|
pulses--
|
||||||
@@ -62,7 +62,7 @@
|
|||||||
pulses_remaining--
|
pulses_remaining--
|
||||||
return .(pulses_remaining, victim, previous_damage)
|
return .(pulses_remaining, victim, previous_damage)
|
||||||
// Now check if our damage predictions are going to cause the victim to go into crit if no healing occurs.
|
// Now check if our damage predictions are going to cause the victim to go into crit if no healing occurs.
|
||||||
if(previous_damage + health_lost >= victim.maxHealth) // We're probably going to hardcrit
|
if(previous_damage + health_lost >= victim.getMaxHealth()) // We're probably going to hardcrit
|
||||||
victim << "<span class='danger'><font size='3'>A feeling of immense dread starts to overcome you as everything starts \
|
victim << "<span class='danger'><font size='3'>A feeling of immense dread starts to overcome you as everything starts \
|
||||||
to fade to black...</font></span>"
|
to fade to black...</font></span>"
|
||||||
//world << "Predicted hardcrit."
|
//world << "Predicted hardcrit."
|
||||||
|
|||||||
@@ -1,42 +0,0 @@
|
|||||||
/datum/technomancer/spell/corona
|
|
||||||
name = "Corona"
|
|
||||||
desc = "Causes the victim to glow very brightly, which while harmless in itself, makes it easier for them to be hit. The \
|
|
||||||
bright glow also makes it very difficult to be stealthy. The effect lasts for one minute."
|
|
||||||
spell_power_desc = "Enemies become even easier to hit."
|
|
||||||
cost = 50
|
|
||||||
obj_path = /obj/item/weapon/spell/insert/corona
|
|
||||||
ability_icon_state = "tech_corona"
|
|
||||||
category = SUPPORT_SPELLS
|
|
||||||
|
|
||||||
/obj/item/weapon/spell/insert/corona
|
|
||||||
name = "corona"
|
|
||||||
desc = "How brillient!"
|
|
||||||
icon_state = "radiance"
|
|
||||||
cast_methods = CAST_RANGED
|
|
||||||
aspect = ASPECT_LIGHT
|
|
||||||
light_color = "#D9D900"
|
|
||||||
spell_light_intensity = 5
|
|
||||||
spell_light_range = 3
|
|
||||||
inserting = /obj/item/weapon/inserted_spell/corona
|
|
||||||
|
|
||||||
|
|
||||||
/obj/item/weapon/inserted_spell/corona
|
|
||||||
var/evasion_reduction = 2 // We store this here because spell power may change when the spell expires.
|
|
||||||
|
|
||||||
/obj/item/weapon/inserted_spell/corona/on_insert()
|
|
||||||
spawn(1)
|
|
||||||
if(isliving(host))
|
|
||||||
var/mob/living/L = host
|
|
||||||
evasion_reduction = round(2 * spell_power_at_creation, 1)
|
|
||||||
L.evasion -= evasion_reduction
|
|
||||||
L.visible_message("<span class='warning'>You start to glow very brightly!</span>")
|
|
||||||
spawn(1 MINUTE)
|
|
||||||
if(src)
|
|
||||||
on_expire()
|
|
||||||
|
|
||||||
/obj/item/weapon/inserted_spell/corona/on_expire()
|
|
||||||
if(isliving(host))
|
|
||||||
var/mob/living/L = host
|
|
||||||
L.evasion += evasion_reduction
|
|
||||||
L << "<span class='notice'>Your glow has ended.</span>"
|
|
||||||
..()
|
|
||||||
@@ -1,36 +0,0 @@
|
|||||||
/datum/technomancer/spell/haste
|
|
||||||
name = "Haste"
|
|
||||||
desc = "Allows the target to run at speeds that should not be possible for an ordinary being. For five seconds, the target \
|
|
||||||
runs extremly fast, and cannot be slowed by any means."
|
|
||||||
spell_power_desc = "Duration is scaled up."
|
|
||||||
cost = 100
|
|
||||||
obj_path = /obj/item/weapon/spell/insert/haste
|
|
||||||
ability_icon_state = "tech_haste"
|
|
||||||
category = SUPPORT_SPELLS
|
|
||||||
|
|
||||||
/obj/item/weapon/spell/insert/haste
|
|
||||||
name = "haste"
|
|
||||||
desc = "Now you can outrun a Teshari!"
|
|
||||||
icon_state = "haste"
|
|
||||||
cast_methods = CAST_RANGED
|
|
||||||
aspect = ASPECT_FORCE
|
|
||||||
light_color = "#FF5C5C"
|
|
||||||
inserting = /obj/item/weapon/inserted_spell/haste
|
|
||||||
|
|
||||||
/obj/item/weapon/inserted_spell/haste/on_insert()
|
|
||||||
spawn(1)
|
|
||||||
if(isliving(host))
|
|
||||||
var/mob/living/L = host
|
|
||||||
L.force_max_speed = 1
|
|
||||||
L << "<span class='notice'>You suddenly find it much easier to move.</span>"
|
|
||||||
L.adjust_instability(10)
|
|
||||||
spawn(round(5 SECONDS * spell_power_at_creation, 1))
|
|
||||||
if(src)
|
|
||||||
on_expire()
|
|
||||||
|
|
||||||
/obj/item/weapon/inserted_spell/haste/on_expire()
|
|
||||||
if(isliving(host))
|
|
||||||
var/mob/living/L = host
|
|
||||||
L.force_max_speed = 0
|
|
||||||
L << "<span class='warning'>You feel slow again.</span>"
|
|
||||||
..()
|
|
||||||
@@ -1,39 +0,0 @@
|
|||||||
/datum/technomancer/spell/repel_missiles
|
|
||||||
name = "Repel Missiles"
|
|
||||||
desc = "Places a repulsion field around you, which attempts to deflect incoming bullets and lasers, making them 30% less likely \
|
|
||||||
to hit you. The field lasts for five minutes and can be granted to yourself or an ally."
|
|
||||||
spell_power_desc = "Projectiles will be more likely to be deflected."
|
|
||||||
cost = 25
|
|
||||||
obj_path = /obj/item/weapon/spell/insert/repel_missiles
|
|
||||||
ability_icon_state = "tech_repelmissiles"
|
|
||||||
category = SUPPORT_SPELLS
|
|
||||||
|
|
||||||
/obj/item/weapon/spell/insert/repel_missiles
|
|
||||||
name = "repel missiles"
|
|
||||||
desc = "Use it before they start shooting at you!"
|
|
||||||
icon_state = "generic"
|
|
||||||
cast_methods = CAST_RANGED
|
|
||||||
aspect = ASPECT_FORCE
|
|
||||||
light_color = "#FF5C5C"
|
|
||||||
inserting = /obj/item/weapon/inserted_spell/repel_missiles
|
|
||||||
|
|
||||||
/obj/item/weapon/inserted_spell/repel_missiles
|
|
||||||
var/evasion_increased = 2 // We store this here because spell power may change when the spell expires.
|
|
||||||
|
|
||||||
/obj/item/weapon/inserted_spell/repel_missiles/on_insert()
|
|
||||||
spawn(1)
|
|
||||||
if(isliving(host))
|
|
||||||
var/mob/living/L = host
|
|
||||||
evasion_increased = round(2 * spell_power_at_creation, 1)
|
|
||||||
L.evasion += evasion_increased
|
|
||||||
L << "<span class='notice'>You have a repulsion field around you, which will attempt to deflect projectiles.</span>"
|
|
||||||
spawn(5 MINUTES)
|
|
||||||
if(src)
|
|
||||||
on_expire()
|
|
||||||
|
|
||||||
/obj/item/weapon/inserted_spell/repel_missiles/on_expire()
|
|
||||||
if(isliving(host))
|
|
||||||
var/mob/living/L = host
|
|
||||||
L.evasion -= evasion_increased
|
|
||||||
L << "<span class='warning'>Your repulsion field has expired.</span>"
|
|
||||||
..()
|
|
||||||
33
code/game/gamemodes/technomancer/spells/modifier/corona.dm
Normal file
33
code/game/gamemodes/technomancer/spells/modifier/corona.dm
Normal file
@@ -0,0 +1,33 @@
|
|||||||
|
/datum/technomancer/spell/corona
|
||||||
|
name = "Corona"
|
||||||
|
desc = "Causes the victim to glow very brightly, which while harmless in itself, makes it easier for them to be hit. The \
|
||||||
|
bright glow also makes it very difficult to be stealthy. The effect lasts for one minute."
|
||||||
|
cost = 50
|
||||||
|
obj_path = /obj/item/weapon/spell/modifier/corona
|
||||||
|
ability_icon_state = "tech_corona"
|
||||||
|
category = SUPPORT_SPELLS
|
||||||
|
|
||||||
|
/obj/item/weapon/spell/modifier/corona
|
||||||
|
name = "corona"
|
||||||
|
desc = "How brillient!"
|
||||||
|
icon_state = "radiance"
|
||||||
|
cast_methods = CAST_RANGED
|
||||||
|
aspect = ASPECT_LIGHT
|
||||||
|
light_color = "#D9D900"
|
||||||
|
spell_light_intensity = 5
|
||||||
|
spell_light_range = 3
|
||||||
|
modifier_type = /datum/modifier/technomancer/corona
|
||||||
|
modifier_duration = 1 MINUTE
|
||||||
|
|
||||||
|
/datum/modifier/technomancer/corona
|
||||||
|
name = "corona"
|
||||||
|
desc = "You appear to be glowing really bright. It doesn't seem to hurt, however hiding will be impossible."
|
||||||
|
mob_overlay_state = "corona"
|
||||||
|
|
||||||
|
on_created_text = "<span class='warning'>You start to glow very brightly!</span>"
|
||||||
|
on_expired_text = "<span class='notice'>Your glow has ended.</span>"
|
||||||
|
evasion = -2
|
||||||
|
stacks = MODIFIER_STACK_EXTEND
|
||||||
|
|
||||||
|
/datum/modifier/technomancer/corona/tick()
|
||||||
|
holder.break_cloak()
|
||||||
28
code/game/gamemodes/technomancer/spells/modifier/haste.dm
Normal file
28
code/game/gamemodes/technomancer/spells/modifier/haste.dm
Normal file
@@ -0,0 +1,28 @@
|
|||||||
|
/datum/technomancer/spell/haste
|
||||||
|
name = "Haste"
|
||||||
|
desc = "Allows the target to run at speeds that should not be possible for an ordinary being. For five seconds, the target \
|
||||||
|
runs extremly fast, and cannot be slowed by any means."
|
||||||
|
cost = 100
|
||||||
|
obj_path = /obj/item/weapon/spell/modifier/haste
|
||||||
|
ability_icon_state = "tech_haste"
|
||||||
|
category = SUPPORT_SPELLS
|
||||||
|
|
||||||
|
/obj/item/weapon/spell/modifier/haste
|
||||||
|
name = "haste"
|
||||||
|
desc = "Now you can outrun a Teshari!"
|
||||||
|
icon_state = "haste"
|
||||||
|
cast_methods = CAST_RANGED
|
||||||
|
aspect = ASPECT_FORCE
|
||||||
|
light_color = "#FF5C5C"
|
||||||
|
modifier_type = /datum/modifier/technomancer/haste
|
||||||
|
modifier_duration = 5 SECONDS
|
||||||
|
|
||||||
|
/datum/modifier/technomancer/haste
|
||||||
|
name = "haste"
|
||||||
|
desc = "Moving is almost effortless!"
|
||||||
|
mob_overlay_state = "haste"
|
||||||
|
|
||||||
|
on_created_text = "<span class='notice'>You suddenly find it much easier to move.</span>"
|
||||||
|
on_expired_text = "<span class='warning'>You feel slow again.</span>"
|
||||||
|
haste = TRUE
|
||||||
|
stacks = MODIFIER_STACK_EXTEND
|
||||||
31
code/game/gamemodes/technomancer/spells/modifier/modifier.dm
Normal file
31
code/game/gamemodes/technomancer/spells/modifier/modifier.dm
Normal file
@@ -0,0 +1,31 @@
|
|||||||
|
/obj/item/weapon/spell/modifier
|
||||||
|
name = "modifier template"
|
||||||
|
desc = "Tell a coder if you can read this in-game."
|
||||||
|
icon_state = "purify"
|
||||||
|
cast_methods = CAST_MELEE
|
||||||
|
var/modifier_type = null
|
||||||
|
var/modifier_duration = null // Will last forever by default. Final duration may differ due to 'spell power'
|
||||||
|
// var/spell_color = "#03A728"
|
||||||
|
var/spell_light_intensity = 2
|
||||||
|
var/spell_light_range = 3
|
||||||
|
|
||||||
|
/obj/item/weapon/spell/modifier/New()
|
||||||
|
..()
|
||||||
|
set_light(spell_light_range, spell_light_intensity, l_color = light_color)
|
||||||
|
|
||||||
|
/obj/item/weapon/spell/modifier/on_melee_cast(atom/hit_atom, mob/user)
|
||||||
|
if(istype(hit_atom, /mob/living))
|
||||||
|
on_add_modifier(hit_atom)
|
||||||
|
|
||||||
|
/obj/item/weapon/spell/modifier/on_ranged_cast(atom/hit_atom, mob/user)
|
||||||
|
if(istype(hit_atom, /mob/living))
|
||||||
|
on_add_modifier(hit_atom)
|
||||||
|
|
||||||
|
|
||||||
|
/obj/item/weapon/spell/modifier/proc/on_add_modifier(var/mob/living/L)
|
||||||
|
var/duration = modifier_duration
|
||||||
|
if(duration)
|
||||||
|
duration = round(duration * calculate_spell_power(1.0), 1)
|
||||||
|
L.add_modifier(modifier_type, duration)
|
||||||
|
log_and_message_admins("has casted [src] on [L].")
|
||||||
|
qdel(src)
|
||||||
@@ -0,0 +1,28 @@
|
|||||||
|
/datum/technomancer/spell/repel_missiles
|
||||||
|
name = "Repel Missiles"
|
||||||
|
desc = "Places a repulsion field around you, which attempts to deflect incoming bullets and lasers, making them 30% less likely \
|
||||||
|
to hit you. The field lasts for 10 minutes and can be granted to yourself or an ally."
|
||||||
|
cost = 25
|
||||||
|
obj_path = /obj/item/weapon/spell/modifier/repel_missiles
|
||||||
|
ability_icon_state = "tech_repelmissiles"
|
||||||
|
category = SUPPORT_SPELLS
|
||||||
|
|
||||||
|
/obj/item/weapon/spell/modifier/repel_missiles
|
||||||
|
name = "repel missiles"
|
||||||
|
desc = "Use it before they start shooting at you!"
|
||||||
|
icon_state = "generic"
|
||||||
|
cast_methods = CAST_RANGED
|
||||||
|
aspect = ASPECT_FORCE
|
||||||
|
light_color = "#FF5C5C"
|
||||||
|
modifier_type = /datum/modifier/technomancer/repel_missiles
|
||||||
|
modifier_duration = 10 MINUTES
|
||||||
|
|
||||||
|
/datum/modifier/technomancer/repel_missiles
|
||||||
|
name = "repel_missiles"
|
||||||
|
desc = "A repulsion field can always be useful to have."
|
||||||
|
mob_overlay_state = "repel_missiles"
|
||||||
|
|
||||||
|
on_created_text = "<span class='notice'>You have a repulsion field around you, which will attempt to deflect projectiles.</span>"
|
||||||
|
on_expired_text = "<span class='warning'>Your repulsion field has expired.</span>"
|
||||||
|
evasion = 3
|
||||||
|
stacks = MODIFIER_STACK_EXTEND
|
||||||
@@ -32,7 +32,7 @@
|
|||||||
user << "<span class='notice'>You stab \the [L] with a hidden integrated hypo, attempting to bring them back...</span>"
|
user << "<span class='notice'>You stab \the [L] with a hidden integrated hypo, attempting to bring them back...</span>"
|
||||||
if(istype(L, /mob/living/simple_animal))
|
if(istype(L, /mob/living/simple_animal))
|
||||||
var/mob/living/simple_animal/SM = L
|
var/mob/living/simple_animal/SM = L
|
||||||
SM.health = SM.maxHealth / 3
|
SM.health = SM.getMaxHealth() / 3
|
||||||
SM.stat = CONSCIOUS
|
SM.stat = CONSCIOUS
|
||||||
dead_mob_list -= SM
|
dead_mob_list -= SM
|
||||||
living_mob_list += SM
|
living_mob_list += SM
|
||||||
|
|||||||
@@ -20,10 +20,10 @@
|
|||||||
|
|
||||||
/obj/item/weapon/spell/spawner/darkness/New()
|
/obj/item/weapon/spell/spawner/darkness/New()
|
||||||
..()
|
..()
|
||||||
set_light(6, -5, l_color = "#FFFFFF")
|
set_light(6, -20, l_color = "#FFFFFF")
|
||||||
|
|
||||||
/obj/effect/temporary_effect/darkness
|
/obj/effect/temporary_effect/darkness
|
||||||
name = "darkness"
|
name = "darkness"
|
||||||
time_to_die = 2 MINUTES
|
time_to_die = 2 MINUTES
|
||||||
new_light_range = 6
|
new_light_range = 6
|
||||||
new_light_power = -5
|
new_light_power = -20
|
||||||
@@ -62,4 +62,4 @@
|
|||||||
|
|
||||||
|
|
||||||
// Now we hurt their new pal, because being forcefully abducted by teleportation can't be healthy.
|
// Now we hurt their new pal, because being forcefully abducted by teleportation can't be healthy.
|
||||||
summoned.health = round(summoned.maxHealth * 0.7)
|
summoned.health = round(summoned.getMaxHealth() * 0.7)
|
||||||
@@ -27,11 +27,13 @@
|
|||||||
H.equip_to_slot_or_del(new /obj/item/clothing/under/rank/bartender(H), slot_w_uniform)
|
H.equip_to_slot_or_del(new /obj/item/clothing/under/rank/bartender(H), slot_w_uniform)
|
||||||
H.equip_to_slot_or_del(new /obj/item/device/pda/bar(H), slot_belt)
|
H.equip_to_slot_or_del(new /obj/item/device/pda/bar(H), slot_belt)
|
||||||
if(has_alt_title(H, alt_title,"Bartender"))
|
if(has_alt_title(H, alt_title,"Bartender"))
|
||||||
|
var/obj/item/weapon/permit/gun/bar/permit = new(H)
|
||||||
if(H.backbag == 1)
|
if(H.backbag == 1)
|
||||||
H.equip_to_slot_or_del(new /obj/item/weapon/permit/gun/bar(H), slot_l_hand)
|
H.equip_to_slot_or_del(permit, slot_l_hand)
|
||||||
else
|
else
|
||||||
H.equip_to_slot_or_del(new /obj/item/weapon/permit/gun/bar(H.back), slot_in_backpack)
|
H.equip_to_slot_or_del(permit, slot_in_backpack)
|
||||||
return 1
|
permit.set_name(H.real_name)
|
||||||
|
return 1
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -375,6 +375,7 @@ var/global/datum/controller/occupations/job_master
|
|||||||
job.equip_backpack(H)
|
job.equip_backpack(H)
|
||||||
job.equip_survival(H)
|
job.equip_survival(H)
|
||||||
job.apply_fingerprints(H)
|
job.apply_fingerprints(H)
|
||||||
|
H.equip_post_job()
|
||||||
|
|
||||||
//If some custom items could not be equipped before, try again now.
|
//If some custom items could not be equipped before, try again now.
|
||||||
for(var/thing in custom_equip_leftovers)
|
for(var/thing in custom_equip_leftovers)
|
||||||
|
|||||||
@@ -68,10 +68,12 @@
|
|||||||
anchored = 1
|
anchored = 1
|
||||||
circuit = /obj/item/weapon/circuitboard/sleeper
|
circuit = /obj/item/weapon/circuitboard/sleeper
|
||||||
var/mob/living/carbon/human/occupant = null
|
var/mob/living/carbon/human/occupant = null
|
||||||
var/list/available_chemicals = list("inaprovaline" = "Inaprovaline", "stoxin" = "Soporific", "paracetamol" = "Paracetamol", "anti_toxin" = "Dylovene", "dexalin" = "Dexalin")
|
var/list/available_chemicals = list("inaprovaline" = "Inaprovaline", "paracetamol" = "Paracetamol", "anti_toxin" = "Dylovene", "dexalin" = "Dexalin")
|
||||||
var/obj/item/weapon/reagent_containers/glass/beaker = null
|
var/obj/item/weapon/reagent_containers/glass/beaker = null
|
||||||
var/filtering = 0
|
var/filtering = 0
|
||||||
var/obj/machinery/sleep_console/console
|
var/obj/machinery/sleep_console/console
|
||||||
|
var/stasis_level = 0 //Every 'this' life ticks are applied to the mob (when life_ticks%stasis_level == 1)
|
||||||
|
var/stasis_choices = list("Complete (1%)" = 100, "Deep (10%)" = 10, "Moderate (20%)" = 5, "Light (50%)" = 2, "None (100%)" = 0)
|
||||||
|
|
||||||
use_power = 1
|
use_power = 1
|
||||||
idle_power_usage = 15
|
idle_power_usage = 15
|
||||||
@@ -98,18 +100,23 @@
|
|||||||
/obj/machinery/sleeper/process()
|
/obj/machinery/sleeper/process()
|
||||||
if(stat & (NOPOWER|BROKEN))
|
if(stat & (NOPOWER|BROKEN))
|
||||||
return
|
return
|
||||||
|
if(occupant)
|
||||||
|
occupant.Stasis(stasis_level)
|
||||||
|
if(stasis_level >= 100 && occupant.timeofdeath)
|
||||||
|
occupant.timeofdeath += 1 SECOND
|
||||||
|
|
||||||
|
if(filtering > 0)
|
||||||
|
if(beaker)
|
||||||
|
if(beaker.reagents.total_volume < beaker.reagents.maximum_volume)
|
||||||
|
var/pumped = 0
|
||||||
|
for(var/datum/reagent/x in occupant.reagents.reagent_list)
|
||||||
|
occupant.reagents.trans_to_obj(beaker, 3)
|
||||||
|
pumped++
|
||||||
|
if(ishuman(occupant))
|
||||||
|
occupant.vessel.trans_to_obj(beaker, pumped + 1)
|
||||||
|
else
|
||||||
|
toggle_filter()
|
||||||
|
|
||||||
if(filtering > 0)
|
|
||||||
if(beaker)
|
|
||||||
if(beaker.reagents.total_volume < beaker.reagents.maximum_volume)
|
|
||||||
var/pumped = 0
|
|
||||||
for(var/datum/reagent/x in occupant.reagents.reagent_list)
|
|
||||||
occupant.reagents.trans_to_obj(beaker, 3)
|
|
||||||
pumped++
|
|
||||||
if(ishuman(occupant))
|
|
||||||
occupant.vessel.trans_to_obj(beaker, pumped + 1)
|
|
||||||
else
|
|
||||||
toggle_filter()
|
|
||||||
|
|
||||||
/obj/machinery/sleeper/update_icon()
|
/obj/machinery/sleeper/update_icon()
|
||||||
icon_state = "sleeper_[occupant ? "1" : "0"]"
|
icon_state = "sleeper_[occupant ? "1" : "0"]"
|
||||||
@@ -154,6 +161,13 @@
|
|||||||
data["beaker"] = -1
|
data["beaker"] = -1
|
||||||
data["filtering"] = filtering
|
data["filtering"] = filtering
|
||||||
|
|
||||||
|
var/stasis_level_name = "Error!"
|
||||||
|
for(var/N in stasis_choices)
|
||||||
|
if(stasis_choices[N] == stasis_level)
|
||||||
|
stasis_level_name = N
|
||||||
|
break
|
||||||
|
data["stasis"] = stasis_level_name
|
||||||
|
|
||||||
ui = nanomanager.try_update_ui(user, src, ui_key, ui, data, force_open)
|
ui = nanomanager.try_update_ui(user, src, ui_key, ui, data, force_open)
|
||||||
if(!ui)
|
if(!ui)
|
||||||
ui = new(user, src, ui_key, "sleeper.tmpl", "Sleeper UI", 600, 600, state = state)
|
ui = new(user, src, ui_key, "sleeper.tmpl", "Sleeper UI", 600, 600, state = state)
|
||||||
@@ -182,12 +196,20 @@
|
|||||||
if(occupant && occupant.stat != DEAD)
|
if(occupant && occupant.stat != DEAD)
|
||||||
if(href_list["chemical"] in available_chemicals) // Your hacks are bad and you should feel bad
|
if(href_list["chemical"] in available_chemicals) // Your hacks are bad and you should feel bad
|
||||||
inject_chemical(usr, href_list["chemical"], text2num(href_list["amount"]))
|
inject_chemical(usr, href_list["chemical"], text2num(href_list["amount"]))
|
||||||
|
if(href_list["change_stasis"])
|
||||||
|
var/new_stasis = input("Levels deeper than 50% stasis level will render the patient unconscious.","Stasis Level") as null|anything in stasis_choices
|
||||||
|
if(new_stasis && CanUseTopic(usr, default_state) == STATUS_INTERACTIVE)
|
||||||
|
stasis_level = stasis_choices[new_stasis]
|
||||||
|
|
||||||
return 1
|
return 1
|
||||||
|
|
||||||
/obj/machinery/sleeper/attackby(var/obj/item/I, var/mob/user)
|
/obj/machinery/sleeper/attackby(var/obj/item/I, var/mob/user)
|
||||||
add_fingerprint(user)
|
add_fingerprint(user)
|
||||||
if(default_deconstruction_screwdriver(user, I))
|
if(istype(I, /obj/item/weapon/grab))
|
||||||
|
var/obj/item/weapon/grab/G = I
|
||||||
|
if(G.affecting)
|
||||||
|
go_in(G.affecting, user)
|
||||||
|
else if(default_deconstruction_screwdriver(user, I))
|
||||||
return
|
return
|
||||||
else if(default_deconstruction_crowbar(user, I))
|
else if(default_deconstruction_crowbar(user, I))
|
||||||
return
|
return
|
||||||
@@ -201,6 +223,28 @@
|
|||||||
user << "<span class='warning'>\The [src] has a beaker already.</span>"
|
user << "<span class='warning'>\The [src] has a beaker already.</span>"
|
||||||
return
|
return
|
||||||
|
|
||||||
|
/obj/machinery/sleeper/verb/move_eject()
|
||||||
|
set name = "Eject occupant"
|
||||||
|
set category = "Object"
|
||||||
|
set src in oview(1)
|
||||||
|
if(usr == occupant)
|
||||||
|
switch(usr.stat)
|
||||||
|
if(DEAD)
|
||||||
|
return
|
||||||
|
if(UNCONSCIOUS)
|
||||||
|
usr << "<span class='notice'>You struggle through the haze to hit the eject button. This will take a couple of minutes...</span>"
|
||||||
|
sleep(2 MINUTES)
|
||||||
|
if(!src || !usr || !occupant || (occupant != usr)) //Check if someone's released/replaced/bombed him already
|
||||||
|
return
|
||||||
|
go_out()
|
||||||
|
if(CONSCIOUS)
|
||||||
|
go_out()
|
||||||
|
else
|
||||||
|
if(usr.stat != 0)
|
||||||
|
return
|
||||||
|
go_out()
|
||||||
|
add_fingerprint(usr)
|
||||||
|
|
||||||
/obj/machinery/sleeper/MouseDrop_T(var/mob/target, var/mob/user)
|
/obj/machinery/sleeper/MouseDrop_T(var/mob/target, var/mob/user)
|
||||||
if(user.stat || user.lying || !Adjacent(user) || !target.Adjacent(user)|| !ishuman(target))
|
if(user.stat || user.lying || !Adjacent(user) || !target.Adjacent(user)|| !ishuman(target))
|
||||||
return
|
return
|
||||||
@@ -261,6 +305,7 @@
|
|||||||
if(occupant.client)
|
if(occupant.client)
|
||||||
occupant.client.eye = occupant.client.mob
|
occupant.client.eye = occupant.client.mob
|
||||||
occupant.client.perspective = MOB_PERSPECTIVE
|
occupant.client.perspective = MOB_PERSPECTIVE
|
||||||
|
occupant.Stasis(0)
|
||||||
occupant.loc = src.loc
|
occupant.loc = src.loc
|
||||||
occupant = null
|
occupant = null
|
||||||
for(var/atom/movable/A in src) // In case an object was dropped inside or something
|
for(var/atom/movable/A in src) // In case an object was dropped inside or something
|
||||||
|
|||||||
@@ -301,6 +301,15 @@
|
|||||||
|
|
||||||
occupantData["reagents"] = reagentData
|
occupantData["reagents"] = reagentData
|
||||||
|
|
||||||
|
var/ingestedData[0]
|
||||||
|
if(H.ingested.reagent_list.len >= 1)
|
||||||
|
for(var/datum/reagent/R in H.ingested.reagent_list)
|
||||||
|
ingestedData[++ingestedData.len] = list("name" = R.name, "amount" = R.volume)
|
||||||
|
else
|
||||||
|
ingestedData = null
|
||||||
|
|
||||||
|
occupantData["ingested"] = ingestedData
|
||||||
|
|
||||||
var/extOrganData[0]
|
var/extOrganData[0]
|
||||||
for(var/obj/item/organ/external/E in H.organs)
|
for(var/obj/item/organ/external/E in H.organs)
|
||||||
var/organData[0]
|
var/organData[0]
|
||||||
@@ -394,7 +403,7 @@
|
|||||||
P.info += "<b>Time of scan:</b> [worldtime2stationtime(world.time)]<br><br>"
|
P.info += "<b>Time of scan:</b> [worldtime2stationtime(world.time)]<br><br>"
|
||||||
P.info += "[printing_text]"
|
P.info += "[printing_text]"
|
||||||
P.info += "<br><br><b>Notes:</b><br>"
|
P.info += "<br><br><b>Notes:</b><br>"
|
||||||
P.name = "Body Scan - [href_list["name"]]"
|
P.name = "Body Scan - [href_list["name"]] ([worldtime2stationtime(world.time)])"
|
||||||
printing = null
|
printing = null
|
||||||
printing_text = null
|
printing_text = null
|
||||||
|
|
||||||
@@ -457,9 +466,13 @@
|
|||||||
dat += "[extra_font]\tBlood Level %: [blood_percent] ([blood_volume] units)</font><br>"
|
dat += "[extra_font]\tBlood Level %: [blood_percent] ([blood_volume] units)</font><br>"
|
||||||
|
|
||||||
if(occupant.reagents)
|
if(occupant.reagents)
|
||||||
for(var/datum/reagent/R in occupant.reagents)
|
for(var/datum/reagent/R in occupant.reagents.reagent_list)
|
||||||
dat += "Reagent: [R.name], Amount: [R.volume]<br>"
|
dat += "Reagent: [R.name], Amount: [R.volume]<br>"
|
||||||
|
|
||||||
|
if(occupant.ingested)
|
||||||
|
for(var/datum/reagent/R in occupant.ingested.reagent_list)
|
||||||
|
dat += "Stomach: [R.name], Amount: [R.volume]<br>"
|
||||||
|
|
||||||
dat += "<hr><table border='1'>"
|
dat += "<hr><table border='1'>"
|
||||||
dat += "<tr>"
|
dat += "<tr>"
|
||||||
dat += "<th>Organ</th>"
|
dat += "<th>Organ</th>"
|
||||||
|
|||||||
@@ -72,7 +72,6 @@ obj/machinery/air_sensor/Destroy()
|
|||||||
..()
|
..()
|
||||||
|
|
||||||
/obj/machinery/computer/general_air_control
|
/obj/machinery/computer/general_air_control
|
||||||
icon = 'icons/obj/computer.dmi'
|
|
||||||
icon_keyboard = "atmos_key"
|
icon_keyboard = "atmos_key"
|
||||||
icon_screen = "tank"
|
icon_screen = "tank"
|
||||||
name = "Computer"
|
name = "Computer"
|
||||||
|
|||||||
@@ -232,6 +232,8 @@ mob/living/proc/near_camera()
|
|||||||
return TRACKING_TERMINATE
|
return TRACKING_TERMINATE
|
||||||
if(digitalcamo)
|
if(digitalcamo)
|
||||||
return TRACKING_TERMINATE
|
return TRACKING_TERMINATE
|
||||||
|
if(alpha < 127) // For lings and possible future alpha-based cloaks.
|
||||||
|
return TRACKING_TERMINATE
|
||||||
if(istype(loc,/obj/effect/dummy))
|
if(istype(loc,/obj/effect/dummy))
|
||||||
return TRACKING_TERMINATE
|
return TRACKING_TERMINATE
|
||||||
|
|
||||||
|
|||||||
@@ -1,6 +1,5 @@
|
|||||||
/obj/machinery/computer/aifixer
|
/obj/machinery/computer/aifixer
|
||||||
name = "\improper AI system integrity restorer"
|
name = "\improper AI system integrity restorer"
|
||||||
icon = 'icons/obj/computer.dmi'
|
|
||||||
icon_keyboard = "rd_key"
|
icon_keyboard = "rd_key"
|
||||||
icon_screen = "ai-fixer"
|
icon_screen = "ai-fixer"
|
||||||
light_color = "#a97faa"
|
light_color = "#a97faa"
|
||||||
@@ -102,7 +101,7 @@
|
|||||||
return 1
|
return 1
|
||||||
if (href_list["fix"])
|
if (href_list["fix"])
|
||||||
src.active = 1
|
src.active = 1
|
||||||
src.overlays += image('icons/obj/computer.dmi', "ai-fixer-on")
|
src.overlays += image(icon, "ai-fixer-on")
|
||||||
while (src.occupant.health < 100)
|
while (src.occupant.health < 100)
|
||||||
src.occupant.adjustOxyLoss(-1)
|
src.occupant.adjustOxyLoss(-1)
|
||||||
src.occupant.adjustFireLoss(-1)
|
src.occupant.adjustFireLoss(-1)
|
||||||
@@ -114,13 +113,13 @@
|
|||||||
src.occupant.lying = 0
|
src.occupant.lying = 0
|
||||||
dead_mob_list -= src.occupant
|
dead_mob_list -= src.occupant
|
||||||
living_mob_list += src.occupant
|
living_mob_list += src.occupant
|
||||||
src.overlays -= image('icons/obj/computer.dmi', "ai-fixer-404")
|
src.overlays -= image(icon, "ai-fixer-404")
|
||||||
src.overlays += image('icons/obj/computer.dmi', "ai-fixer-full")
|
src.overlays += image(icon, "ai-fixer-full")
|
||||||
src.occupant.add_ai_verbs()
|
src.occupant.add_ai_verbs()
|
||||||
src.updateUsrDialog()
|
src.updateUsrDialog()
|
||||||
sleep(10)
|
sleep(10)
|
||||||
src.active = 0
|
src.active = 0
|
||||||
src.overlays -= image('icons/obj/computer.dmi', "ai-fixer-on")
|
src.overlays -= image(icon, "ai-fixer-on")
|
||||||
|
|
||||||
|
|
||||||
src.add_fingerprint(usr)
|
src.add_fingerprint(usr)
|
||||||
@@ -135,8 +134,8 @@
|
|||||||
|
|
||||||
if(occupant)
|
if(occupant)
|
||||||
if(occupant.stat)
|
if(occupant.stat)
|
||||||
overlays += image('icons/obj/computer.dmi', "ai-fixer-404", overlay_layer)
|
overlays += image(icon, "ai-fixer-404", overlay_layer)
|
||||||
else
|
else
|
||||||
overlays += image('icons/obj/computer.dmi', "ai-fixer-full", overlay_layer)
|
overlays += image(icon, "ai-fixer-full", overlay_layer)
|
||||||
else
|
else
|
||||||
overlays += image('icons/obj/computer.dmi', "ai-fixer-empty", overlay_layer)
|
overlays += image(icon, "ai-fixer-empty", overlay_layer)
|
||||||
|
|||||||
@@ -4,7 +4,6 @@
|
|||||||
|
|
||||||
/obj/machinery/computer/atmoscontrol
|
/obj/machinery/computer/atmoscontrol
|
||||||
name = "\improper Central Atmospherics Computer"
|
name = "\improper Central Atmospherics Computer"
|
||||||
icon = 'icons/obj/computer.dmi'
|
|
||||||
icon_keyboard = "generic_key"
|
icon_keyboard = "generic_key"
|
||||||
icon_screen = "comm_logs"
|
icon_screen = "comm_logs"
|
||||||
light_color = "#00b000"
|
light_color = "#00b000"
|
||||||
|
|||||||
@@ -1,6 +1,5 @@
|
|||||||
/obj/machinery/computer/cloning
|
/obj/machinery/computer/cloning
|
||||||
name = "cloning control console"
|
name = "cloning control console"
|
||||||
icon = 'icons/obj/computer.dmi'
|
|
||||||
icon_keyboard = "med_key"
|
icon_keyboard = "med_key"
|
||||||
icon_screen = "dna"
|
icon_screen = "dna"
|
||||||
light_color = "#315ab4"
|
light_color = "#315ab4"
|
||||||
|
|||||||
@@ -85,6 +85,7 @@
|
|||||||
if ((istype(src.active1, /datum/data/record) && data_core.general.Find(src.active1)))
|
if ((istype(src.active1, /datum/data/record) && data_core.general.Find(src.active1)))
|
||||||
dat += "<table><tr><td>Name: [active1.fields["name"]] \
|
dat += "<table><tr><td>Name: [active1.fields["name"]] \
|
||||||
ID: [active1.fields["id"]]<BR>\n \
|
ID: [active1.fields["id"]]<BR>\n \
|
||||||
|
Entity Classification: <A href='?src=\ref[src];field=brain_type'>[active1.fields["brain_type"]]</A><BR>\n \
|
||||||
Sex: <A href='?src=\ref[src];field=sex'>[active1.fields["sex"]]</A><BR>\n"
|
Sex: <A href='?src=\ref[src];field=sex'>[active1.fields["sex"]]</A><BR>\n"
|
||||||
if ((istype(src.active2, /datum/data/record) && data_core.medical.Find(src.active2)))
|
if ((istype(src.active2, /datum/data/record) && data_core.medical.Find(src.active2)))
|
||||||
dat += "Gender identity: <A href='?src=\ref[src];field=id_gender'>[active2.fields["id_gender"]]</A><BR>"
|
dat += "Gender identity: <A href='?src=\ref[src];field=id_gender'>[active2.fields["id_gender"]]</A><BR>"
|
||||||
|
|||||||
@@ -2,7 +2,6 @@
|
|||||||
|
|
||||||
/obj/machinery/computer/prisoner
|
/obj/machinery/computer/prisoner
|
||||||
name = "prisoner management console"
|
name = "prisoner management console"
|
||||||
icon = 'icons/obj/computer.dmi'
|
|
||||||
icon_keyboard = "security_key"
|
icon_keyboard = "security_key"
|
||||||
icon_screen = "explosive"
|
icon_screen = "explosive"
|
||||||
light_color = "#a91515"
|
light_color = "#a91515"
|
||||||
|
|||||||
@@ -12,7 +12,6 @@ var/prison_shuttle_timeleft = 0
|
|||||||
|
|
||||||
/obj/machinery/computer/prison_shuttle
|
/obj/machinery/computer/prison_shuttle
|
||||||
name = "prison shuttle control console"
|
name = "prison shuttle control console"
|
||||||
icon = 'icons/obj/computer.dmi'
|
|
||||||
icon_keyboard = "security_key"
|
icon_keyboard = "security_key"
|
||||||
icon_screen = "syndishuttle"
|
icon_screen = "syndishuttle"
|
||||||
light_color = "#00ffff"
|
light_color = "#00ffff"
|
||||||
|
|||||||
@@ -1,7 +1,6 @@
|
|||||||
/obj/machinery/computer/robotics
|
/obj/machinery/computer/robotics
|
||||||
name = "robotics control console"
|
name = "robotics control console"
|
||||||
desc = "Used to remotely lockdown or detonate linked cyborgs."
|
desc = "Used to remotely lockdown or detonate linked cyborgs."
|
||||||
icon = 'icons/obj/computer.dmi'
|
|
||||||
icon_keyboard = "tech_key"
|
icon_keyboard = "tech_key"
|
||||||
icon_screen = "robot"
|
icon_screen = "robot"
|
||||||
light_color = "#a97faa"
|
light_color = "#a97faa"
|
||||||
|
|||||||
@@ -127,6 +127,7 @@
|
|||||||
dat += text("<table><tr><td> \
|
dat += text("<table><tr><td> \
|
||||||
Name: <A href='?src=\ref[src];choice=Edit Field;field=name'>[active1.fields["name"]]</A><BR> \
|
Name: <A href='?src=\ref[src];choice=Edit Field;field=name'>[active1.fields["name"]]</A><BR> \
|
||||||
ID: <A href='?src=\ref[src];choice=Edit Field;field=id'>[active1.fields["id"]]</A><BR>\n \
|
ID: <A href='?src=\ref[src];choice=Edit Field;field=id'>[active1.fields["id"]]</A><BR>\n \
|
||||||
|
Entity Classification: <A href='?src=\ref[src];field=brain_type'>[active1.fields["brain_type"]]</A><BR>\n \
|
||||||
Sex: <A href='?src=\ref[src];choice=Edit Field;field=sex'>[active1.fields["sex"]]</A><BR>\n \
|
Sex: <A href='?src=\ref[src];choice=Edit Field;field=sex'>[active1.fields["sex"]]</A><BR>\n \
|
||||||
Age: <A href='?src=\ref[src];choice=Edit Field;field=age'>[active1.fields["age"]]</A><BR>\n \
|
Age: <A href='?src=\ref[src];choice=Edit Field;field=age'>[active1.fields["age"]]</A><BR>\n \
|
||||||
Rank: <A href='?src=\ref[src];choice=Edit Field;field=rank'>[active1.fields["rank"]]</A><BR>\n \
|
Rank: <A href='?src=\ref[src];choice=Edit Field;field=rank'>[active1.fields["rank"]]</A><BR>\n \
|
||||||
@@ -612,5 +613,4 @@ What a mess.*/
|
|||||||
..(severity)
|
..(severity)
|
||||||
|
|
||||||
/obj/machinery/computer/secure_data/detective_computer
|
/obj/machinery/computer/secure_data/detective_computer
|
||||||
icon = 'icons/obj/computer.dmi'
|
|
||||||
icon_state = "messyfiles"
|
icon_state = "messyfiles"
|
||||||
|
|||||||
@@ -93,6 +93,7 @@
|
|||||||
dat += text("<table><tr><td> \
|
dat += text("<table><tr><td> \
|
||||||
Name: <A href='?src=\ref[src];choice=Edit Field;field=name'>[active1.fields["name"]]</A><BR> \
|
Name: <A href='?src=\ref[src];choice=Edit Field;field=name'>[active1.fields["name"]]</A><BR> \
|
||||||
ID: <A href='?src=\ref[src];choice=Edit Field;field=id'>[active1.fields["id"]]</A><BR>\n \
|
ID: <A href='?src=\ref[src];choice=Edit Field;field=id'>[active1.fields["id"]]</A><BR>\n \
|
||||||
|
Entity Classification: <A href='?src=\ref[src];field=brain_type'>[active1.fields["brain_type"]]</A><BR>\n \
|
||||||
Sex: <A href='?src=\ref[src];choice=Edit Field;field=sex'>[active1.fields["sex"]]</A><BR>\n \
|
Sex: <A href='?src=\ref[src];choice=Edit Field;field=sex'>[active1.fields["sex"]]</A><BR>\n \
|
||||||
Age: <A href='?src=\ref[src];choice=Edit Field;field=age'>[active1.fields["age"]]</A><BR>\n \
|
Age: <A href='?src=\ref[src];choice=Edit Field;field=age'>[active1.fields["age"]]</A><BR>\n \
|
||||||
Rank: <A href='?src=\ref[src];choice=Edit Field;field=rank'>[active1.fields["rank"]]</A><BR>\n \
|
Rank: <A href='?src=\ref[src];choice=Edit Field;field=rank'>[active1.fields["rank"]]</A><BR>\n \
|
||||||
|
|||||||
@@ -13,7 +13,6 @@ var/specops_shuttle_timeleft = 0
|
|||||||
|
|
||||||
/obj/machinery/computer/specops_shuttle
|
/obj/machinery/computer/specops_shuttle
|
||||||
name = "special operations shuttle control console"
|
name = "special operations shuttle control console"
|
||||||
icon = 'icons/obj/computer.dmi'
|
|
||||||
icon_keyboard = "security_key"
|
icon_keyboard = "security_key"
|
||||||
icon_screen = "syndishuttle"
|
icon_screen = "syndishuttle"
|
||||||
light_color = "#00ffff"
|
light_color = "#00ffff"
|
||||||
|
|||||||
@@ -1,6 +1,5 @@
|
|||||||
/obj/machinery/computer/supplycomp
|
/obj/machinery/computer/supplycomp
|
||||||
name = "supply control console"
|
name = "supply control console"
|
||||||
icon = 'icons/obj/computer.dmi'
|
|
||||||
icon_keyboard = "tech_key"
|
icon_keyboard = "tech_key"
|
||||||
icon_screen = "supply"
|
icon_screen = "supply"
|
||||||
light_color = "#b88b2e"
|
light_color = "#b88b2e"
|
||||||
@@ -13,7 +12,6 @@
|
|||||||
|
|
||||||
/obj/machinery/computer/ordercomp
|
/obj/machinery/computer/ordercomp
|
||||||
name = "supply ordering console"
|
name = "supply ordering console"
|
||||||
icon = 'icons/obj/computer.dmi'
|
|
||||||
icon_screen = "request"
|
icon_screen = "request"
|
||||||
circuit = /obj/item/weapon/circuitboard/ordercomp
|
circuit = /obj/item/weapon/circuitboard/ordercomp
|
||||||
var/temp = null
|
var/temp = null
|
||||||
|
|||||||
@@ -12,7 +12,6 @@ var/syndicate_elite_shuttle_timeleft = 0
|
|||||||
|
|
||||||
/obj/machinery/computer/syndicate_elite_shuttle
|
/obj/machinery/computer/syndicate_elite_shuttle
|
||||||
name = "elite syndicate squad shuttle control console"
|
name = "elite syndicate squad shuttle control console"
|
||||||
icon = 'icons/obj/computer.dmi'
|
|
||||||
icon_keyboard = "syndie_key"
|
icon_keyboard = "syndie_key"
|
||||||
icon_screen = "syndishuttle"
|
icon_screen = "syndishuttle"
|
||||||
light_color = "#00ffff"
|
light_color = "#00ffff"
|
||||||
|
|||||||
@@ -95,6 +95,7 @@
|
|||||||
|
|
||||||
dat += "<table><tr><td>Name: [active1.fields["name"]] \
|
dat += "<table><tr><td>Name: [active1.fields["name"]] \
|
||||||
ID: [active1.fields["id"]]<BR>\n \
|
ID: [active1.fields["id"]]<BR>\n \
|
||||||
|
Entity Classification: <A href='?src=\ref[src];field=brain_type'>[active1.fields["brain_type"]]</A><BR>\n \
|
||||||
Sex: <A href='?src=\ref[src];field=sex'>[active1.fields["sex"]]</A><BR>\n \
|
Sex: <A href='?src=\ref[src];field=sex'>[active1.fields["sex"]]</A><BR>\n \
|
||||||
Age: <A href='?src=\ref[src];field=age'>[active1.fields["age"]]</A><BR>\n \
|
Age: <A href='?src=\ref[src];field=age'>[active1.fields["age"]]</A><BR>\n \
|
||||||
Fingerprint: <A href='?src=\ref[src];field=fingerprint'>[active1.fields["fingerprint"]]</A><BR>\n \
|
Fingerprint: <A href='?src=\ref[src];field=fingerprint'>[active1.fields["fingerprint"]]</A><BR>\n \
|
||||||
|
|||||||
@@ -134,6 +134,7 @@
|
|||||||
dat += text("<table><tr><td> \
|
dat += text("<table><tr><td> \
|
||||||
Name: <A href='?src=\ref[src];choice=Edit Field;field=name'>[active1.fields["name"]]</A><BR> \
|
Name: <A href='?src=\ref[src];choice=Edit Field;field=name'>[active1.fields["name"]]</A><BR> \
|
||||||
ID: <A href='?src=\ref[src];choice=Edit Field;field=id'>[active1.fields["id"]]</A><BR>\n \
|
ID: <A href='?src=\ref[src];choice=Edit Field;field=id'>[active1.fields["id"]]</A><BR>\n \
|
||||||
|
Entity Classification: <A href='?src=\ref[src];field=brain_type'>[active1.fields["brain_type"]]</A><BR>\n \
|
||||||
Sex: <A href='?src=\ref[src];choice=Edit Field;field=sex'>[active1.fields["sex"]]</A><BR>\n \
|
Sex: <A href='?src=\ref[src];choice=Edit Field;field=sex'>[active1.fields["sex"]]</A><BR>\n \
|
||||||
Age: <A href='?src=\ref[src];choice=Edit Field;field=age'>[active1.fields["age"]]</A><BR>\n \
|
Age: <A href='?src=\ref[src];choice=Edit Field;field=age'>[active1.fields["age"]]</A><BR>\n \
|
||||||
Rank: <A href='?src=\ref[src];choice=Edit Field;field=rank'>[active1.fields["rank"]]</A><BR>\n \
|
Rank: <A href='?src=\ref[src];choice=Edit Field;field=rank'>[active1.fields["rank"]]</A><BR>\n \
|
||||||
|
|||||||
@@ -96,7 +96,7 @@
|
|||||||
occupantData["name"] = occupant.name
|
occupantData["name"] = occupant.name
|
||||||
occupantData["stat"] = occupant.stat
|
occupantData["stat"] = occupant.stat
|
||||||
occupantData["health"] = occupant.health
|
occupantData["health"] = occupant.health
|
||||||
occupantData["maxHealth"] = occupant.maxHealth
|
occupantData["maxHealth"] = occupant.getMaxHealth()
|
||||||
occupantData["minHealth"] = config.health_threshold_dead
|
occupantData["minHealth"] = config.health_threshold_dead
|
||||||
occupantData["bruteLoss"] = occupant.getBruteLoss()
|
occupantData["bruteLoss"] = occupant.getBruteLoss()
|
||||||
occupantData["oxyLoss"] = occupant.getOxyLoss()
|
occupantData["oxyLoss"] = occupant.getOxyLoss()
|
||||||
|
|||||||
@@ -534,7 +534,7 @@
|
|||||||
time_entered = world.time
|
time_entered = world.time
|
||||||
if(ishuman(M) && applies_stasis)
|
if(ishuman(M) && applies_stasis)
|
||||||
var/mob/living/carbon/human/H = M
|
var/mob/living/carbon/human/H = M
|
||||||
H.in_stasis = 1
|
H.Stasis(1000)
|
||||||
|
|
||||||
// Book keeping!
|
// Book keeping!
|
||||||
var/turf/location = get_turf(src)
|
var/turf/location = get_turf(src)
|
||||||
@@ -602,7 +602,7 @@
|
|||||||
set_occupant(usr)
|
set_occupant(usr)
|
||||||
if(ishuman(usr) && applies_stasis)
|
if(ishuman(usr) && applies_stasis)
|
||||||
var/mob/living/carbon/human/H = occupant
|
var/mob/living/carbon/human/H = occupant
|
||||||
H.in_stasis = 1
|
H.Stasis(1000)
|
||||||
|
|
||||||
icon_state = occupied_icon_state
|
icon_state = occupied_icon_state
|
||||||
|
|
||||||
@@ -638,7 +638,7 @@
|
|||||||
occupant.forceMove(get_turf(src))
|
occupant.forceMove(get_turf(src))
|
||||||
if(ishuman(occupant) && applies_stasis)
|
if(ishuman(occupant) && applies_stasis)
|
||||||
var/mob/living/carbon/human/H = occupant
|
var/mob/living/carbon/human/H = occupant
|
||||||
H.in_stasis = 0
|
H.Stasis(0)
|
||||||
set_occupant(null)
|
set_occupant(null)
|
||||||
|
|
||||||
icon_state = base_icon_state
|
icon_state = base_icon_state
|
||||||
|
|||||||
@@ -777,7 +777,7 @@ About the new airlock wires panel:
|
|||||||
src.welded = 1
|
src.welded = 1
|
||||||
else
|
else
|
||||||
src.welded = null
|
src.welded = null
|
||||||
playsound(src, 'sound/items/Welder.ogg', 100, 1)
|
playsound(src, 'sound/items/Welder.ogg', 75, 1)
|
||||||
src.update_icon()
|
src.update_icon()
|
||||||
return
|
return
|
||||||
else
|
else
|
||||||
@@ -802,7 +802,7 @@ About the new airlock wires panel:
|
|||||||
cable.plugin(src, user)
|
cable.plugin(src, user)
|
||||||
else if(!repairing && istype(C, /obj/item/weapon/crowbar))
|
else if(!repairing && istype(C, /obj/item/weapon/crowbar))
|
||||||
if(src.p_open && (operating < 0 || (!operating && welded && !src.arePowerSystemsOn() && density && (!src.locked || (stat & BROKEN)))) )
|
if(src.p_open && (operating < 0 || (!operating && welded && !src.arePowerSystemsOn() && density && (!src.locked || (stat & BROKEN)))) )
|
||||||
playsound(src.loc, 'sound/items/Crowbar.ogg', 100, 1)
|
playsound(src.loc, 'sound/items/Crowbar.ogg', 75, 1)
|
||||||
user.visible_message("[user] removes the electronics from the airlock assembly.", "You start to remove electronics from the airlock assembly.")
|
user.visible_message("[user] removes the electronics from the airlock assembly.", "You start to remove electronics from the airlock assembly.")
|
||||||
if(do_after(user,40))
|
if(do_after(user,40))
|
||||||
to_chat(user,"<span class='notice'>You removed the airlock electronics!</span>")
|
to_chat(user,"<span class='notice'>You removed the airlock electronics!</span>")
|
||||||
@@ -895,9 +895,9 @@ About the new airlock wires panel:
|
|||||||
|
|
||||||
//if the door is unpowered then it doesn't make sense to hear the woosh of a pneumatic actuator
|
//if the door is unpowered then it doesn't make sense to hear the woosh of a pneumatic actuator
|
||||||
if(arePowerSystemsOn())
|
if(arePowerSystemsOn())
|
||||||
playsound(src.loc, open_sound_powered, 100, 1)
|
playsound(src.loc, open_sound_powered, 75, 1)
|
||||||
else
|
else
|
||||||
playsound(src.loc, open_sound_unpowered, 100, 1)
|
playsound(src.loc, open_sound_unpowered, 75, 1)
|
||||||
|
|
||||||
if(src.closeOther != null && istype(src.closeOther, /obj/machinery/door/airlock/) && !src.closeOther.density)
|
if(src.closeOther != null && istype(src.closeOther, /obj/machinery/door/airlock/) && !src.closeOther.density)
|
||||||
src.closeOther.close()
|
src.closeOther.close()
|
||||||
@@ -992,9 +992,9 @@ About the new airlock wires panel:
|
|||||||
use_power(360) //360 W seems much more appropriate for an actuator moving an industrial door capable of crushing people
|
use_power(360) //360 W seems much more appropriate for an actuator moving an industrial door capable of crushing people
|
||||||
has_beeped = 0
|
has_beeped = 0
|
||||||
if(arePowerSystemsOn())
|
if(arePowerSystemsOn())
|
||||||
playsound(src.loc, open_sound_powered, 100, 1)
|
playsound(src.loc, open_sound_powered, 75, 1)
|
||||||
else
|
else
|
||||||
playsound(src.loc, open_sound_unpowered, 100, 1)
|
playsound(src.loc, open_sound_unpowered, 75, 1)
|
||||||
for(var/turf/turf in locs)
|
for(var/turf/turf in locs)
|
||||||
var/obj/structure/window/killthis = (locate(/obj/structure/window) in turf)
|
var/obj/structure/window/killthis = (locate(/obj/structure/window) in turf)
|
||||||
if(killthis)
|
if(killthis)
|
||||||
|
|||||||
@@ -12,6 +12,7 @@
|
|||||||
desc = "That looks like it doesn't open easily."
|
desc = "That looks like it doesn't open easily."
|
||||||
icon = 'icons/obj/doors/rapid_pdoor.dmi'
|
icon = 'icons/obj/doors/rapid_pdoor.dmi'
|
||||||
icon_state = null
|
icon_state = null
|
||||||
|
min_force = 20 //minimum amount of force needed to damage the door with a melee weapon
|
||||||
|
|
||||||
// Icon states for different shutter types. Simply change this instead of rewriting the update_icon proc.
|
// Icon states for different shutter types. Simply change this instead of rewriting the update_icon proc.
|
||||||
var/icon_state_open = null
|
var/icon_state_open = null
|
||||||
@@ -78,7 +79,10 @@
|
|||||||
// Proc: force_toggle()
|
// Proc: force_toggle()
|
||||||
// Parameters: None
|
// Parameters: None
|
||||||
// Description: Opens or closes the door, depending on current state. No checks are done inside this proc.
|
// Description: Opens or closes the door, depending on current state. No checks are done inside this proc.
|
||||||
/obj/machinery/door/blast/proc/force_toggle()
|
/obj/machinery/door/blast/proc/force_toggle(var/forced = 0, mob/user as mob)
|
||||||
|
if (forced)
|
||||||
|
playsound(src.loc, 'sound/machines/airlock_creaking.ogg', 100, 1)
|
||||||
|
|
||||||
if(src.density)
|
if(src.density)
|
||||||
src.force_open()
|
src.force_open()
|
||||||
else
|
else
|
||||||
@@ -91,7 +95,7 @@
|
|||||||
/obj/machinery/door/blast/attackby(obj/item/weapon/C as obj, mob/user as mob)
|
/obj/machinery/door/blast/attackby(obj/item/weapon/C as obj, mob/user as mob)
|
||||||
src.add_fingerprint(user)
|
src.add_fingerprint(user)
|
||||||
if(istype(C, /obj/item/weapon)) // For reasons unknown, sometimes C is actually not what it is advertised as, like a mob.
|
if(istype(C, /obj/item/weapon)) // For reasons unknown, sometimes C is actually not what it is advertised as, like a mob.
|
||||||
if(C.pry == 1) // Can we pry it open with something, like a crowbar/fireaxe/lingblade?
|
if(C.pry == 1 && (user.a_intent != I_HURT || (stat & BROKEN))) // Can we pry it open with something, like a crowbar/fireaxe/lingblade?
|
||||||
if(istype(C,/obj/item/weapon/material/twohanded/fireaxe)) // Fireaxes need to be in both hands to pry.
|
if(istype(C,/obj/item/weapon/material/twohanded/fireaxe)) // Fireaxes need to be in both hands to pry.
|
||||||
var/obj/item/weapon/material/twohanded/fireaxe/F = C
|
var/obj/item/weapon/material/twohanded/fireaxe/F = C
|
||||||
if(!F.wielded)
|
if(!F.wielded)
|
||||||
@@ -100,7 +104,8 @@
|
|||||||
|
|
||||||
// If we're at this point, it's a fireaxe in both hands or something else that doesn't care for twohanding.
|
// If we're at this point, it's a fireaxe in both hands or something else that doesn't care for twohanding.
|
||||||
if(((stat & NOPOWER) || (stat & BROKEN)) && !( src.operating ))
|
if(((stat & NOPOWER) || (stat & BROKEN)) && !( src.operating ))
|
||||||
force_toggle()
|
force_toggle(1, user)
|
||||||
|
|
||||||
else
|
else
|
||||||
usr << "<span class='notice'>[src]'s motors resist your effort.</span>"
|
usr << "<span class='notice'>[src]'s motors resist your effort.</span>"
|
||||||
return
|
return
|
||||||
@@ -123,15 +128,33 @@
|
|||||||
usr << "<span class='warning'>You don't have enough sheets to repair this! You need at least [amt] sheets.</span>"
|
usr << "<span class='warning'>You don't have enough sheets to repair this! You need at least [amt] sheets.</span>"
|
||||||
|
|
||||||
|
|
||||||
|
else if(src.density)
|
||||||
|
var/obj/item/weapon/W = C
|
||||||
|
user.setClickCooldown(DEFAULT_ATTACK_COOLDOWN)
|
||||||
|
if(W.damtype == BRUTE || W.damtype == BURN)
|
||||||
|
user.do_attack_animation(src)
|
||||||
|
if(W.force < min_force)
|
||||||
|
user.visible_message("<span class='danger'>\The [user] hits \the [src] with \the [W] with no visible effect.</span>")
|
||||||
|
else
|
||||||
|
user.visible_message("<span class='danger'>\The [user] forcefully strikes \the [src] with \the [W]!</span>")
|
||||||
|
playsound(src.loc, hitsound, 100, 1)
|
||||||
|
take_damage(W.force*0.35) //it's a blast door, it should take a while. -Luke
|
||||||
|
return
|
||||||
|
|
||||||
|
|
||||||
// Proc: open()
|
// Proc: open()
|
||||||
// Parameters: None
|
// Parameters: None
|
||||||
// Description: Opens the door. Does necessary checks. Automatically closes if autoclose is true
|
// Description: Opens the door. Does necessary checks. Automatically closes if autoclose is true
|
||||||
/obj/machinery/door/blast/open()
|
/obj/machinery/door/blast/open(var/forced = 0)
|
||||||
if (src.operating || (stat & BROKEN || stat & NOPOWER))
|
if(forced)
|
||||||
return
|
force_open()
|
||||||
force_open()
|
return 1
|
||||||
if(autoclose)
|
else
|
||||||
|
if (src.operating || (stat & BROKEN || stat & NOPOWER))
|
||||||
|
return 1
|
||||||
|
force_open()
|
||||||
|
|
||||||
|
if(autoclose && src.operating && !(stat & BROKEN || stat & NOPOWER))
|
||||||
spawn(150)
|
spawn(150)
|
||||||
close()
|
close()
|
||||||
return 1
|
return 1
|
||||||
|
|||||||
@@ -312,6 +312,8 @@
|
|||||||
|
|
||||||
/obj/machinery/door/examine(mob/user)
|
/obj/machinery/door/examine(mob/user)
|
||||||
. = ..()
|
. = ..()
|
||||||
|
if(src.health <= 0)
|
||||||
|
user << "\The [src] is broken!"
|
||||||
if(src.health < src.maxhealth / 4)
|
if(src.health < src.maxhealth / 4)
|
||||||
user << "\The [src] looks like it's about to break!"
|
user << "\The [src] looks like it's about to break!"
|
||||||
else if(src.health < src.maxhealth / 2)
|
else if(src.health < src.maxhealth / 2)
|
||||||
|
|||||||
@@ -78,7 +78,7 @@
|
|||||||
C.traits = new()
|
C.traits = new()
|
||||||
C.nameVar = "grey"
|
C.nameVar = "grey"
|
||||||
I.add_product(C)
|
I.add_product(C)
|
||||||
|
|
||||||
|
|
||||||
/obj/machinery/smartfridge/secure/medbay
|
/obj/machinery/smartfridge/secure/medbay
|
||||||
name = "\improper Refrigerated Medicine Storage"
|
name = "\improper Refrigerated Medicine Storage"
|
||||||
@@ -139,6 +139,7 @@
|
|||||||
icon_state = "drying_rack"
|
icon_state = "drying_rack"
|
||||||
icon_on = "drying_rack_on"
|
icon_on = "drying_rack_on"
|
||||||
icon_off = "drying_rack"
|
icon_off = "drying_rack"
|
||||||
|
icon_panel = "drying_rack-panel"
|
||||||
|
|
||||||
/obj/machinery/smartfridge/drying_rack/accept_check(var/obj/item/O as obj)
|
/obj/machinery/smartfridge/drying_rack/accept_check(var/obj/item/O as obj)
|
||||||
if(istype(O, /obj/item/weapon/reagent_containers/food/snacks/))
|
if(istype(O, /obj/item/weapon/reagent_containers/food/snacks/))
|
||||||
@@ -260,7 +261,7 @@
|
|||||||
locked = -1
|
locked = -1
|
||||||
user << "You short out the product lock on [src]."
|
user << "You short out the product lock on [src]."
|
||||||
return 1
|
return 1
|
||||||
|
|
||||||
/obj/machinery/smartfridge/proc/stock(obj/item/O)
|
/obj/machinery/smartfridge/proc/stock(obj/item/O)
|
||||||
var/hasRecord = FALSE //Check to see if this passes or not.
|
var/hasRecord = FALSE //Check to see if this passes or not.
|
||||||
for(var/datum/stored_item/I in item_records)
|
for(var/datum/stored_item/I in item_records)
|
||||||
@@ -273,7 +274,7 @@
|
|||||||
item.add_product(O)
|
item.add_product(O)
|
||||||
item_records.Add(item)
|
item_records.Add(item)
|
||||||
nanomanager.update_uis(src)
|
nanomanager.update_uis(src)
|
||||||
|
|
||||||
/obj/machinery/smartfridge/proc/vend(datum/stored_item/I)
|
/obj/machinery/smartfridge/proc/vend(datum/stored_item/I)
|
||||||
I.get_product(get_turf(src))
|
I.get_product(get_turf(src))
|
||||||
nanomanager.update_uis(src)
|
nanomanager.update_uis(src)
|
||||||
@@ -357,7 +358,7 @@
|
|||||||
if (!throw_item)
|
if (!throw_item)
|
||||||
continue
|
continue
|
||||||
break
|
break
|
||||||
|
|
||||||
if(!throw_item)
|
if(!throw_item)
|
||||||
return 0
|
return 0
|
||||||
spawn(0)
|
spawn(0)
|
||||||
|
|||||||
@@ -7,7 +7,7 @@
|
|||||||
energy_drain = 20
|
energy_drain = 20
|
||||||
range = MELEE
|
range = MELEE
|
||||||
equip_cooldown = 50
|
equip_cooldown = 50
|
||||||
var/mob/living/carbon/occupant = null
|
var/mob/living/carbon/human/occupant = null
|
||||||
var/datum/global_iterator/pr_mech_sleeper
|
var/datum/global_iterator/pr_mech_sleeper
|
||||||
var/inject_amount = 10
|
var/inject_amount = 10
|
||||||
required_type = /obj/mecha/medical
|
required_type = /obj/mecha/medical
|
||||||
@@ -28,7 +28,7 @@
|
|||||||
Exit(atom/movable/O)
|
Exit(atom/movable/O)
|
||||||
return 0
|
return 0
|
||||||
|
|
||||||
action(var/mob/living/carbon/target)
|
action(var/mob/living/carbon/human/target)
|
||||||
if(!action_checks(target))
|
if(!action_checks(target))
|
||||||
return
|
return
|
||||||
if(!istype(target))
|
if(!istype(target))
|
||||||
@@ -56,6 +56,7 @@
|
|||||||
target.forceMove(src)
|
target.forceMove(src)
|
||||||
occupant = target
|
occupant = target
|
||||||
target.reset_view(src)
|
target.reset_view(src)
|
||||||
|
occupant.Stasis(3)
|
||||||
/*
|
/*
|
||||||
if(target.client)
|
if(target.client)
|
||||||
target.client.perspective = EYE_PERSPECTIVE
|
target.client.perspective = EYE_PERSPECTIVE
|
||||||
@@ -80,6 +81,7 @@
|
|||||||
occupant.client.eye = occupant.client.mob
|
occupant.client.eye = occupant.client.mob
|
||||||
occupant.client.perspective = MOB_PERSPECTIVE
|
occupant.client.perspective = MOB_PERSPECTIVE
|
||||||
*/
|
*/
|
||||||
|
occupant.Stasis(0)
|
||||||
occupant = null
|
occupant = null
|
||||||
pr_mech_sleeper.stop()
|
pr_mech_sleeper.stop()
|
||||||
set_ready_state(1)
|
set_ready_state(1)
|
||||||
|
|||||||
@@ -1,6 +1,5 @@
|
|||||||
/obj/machinery/computer/mecha
|
/obj/machinery/computer/mecha
|
||||||
name = "Exosuit Control"
|
name = "Exosuit Control"
|
||||||
icon = 'icons/obj/computer.dmi'
|
|
||||||
icon_keyboard = "rd_key"
|
icon_keyboard = "rd_key"
|
||||||
icon_screen = "mecha"
|
icon_screen = "mecha"
|
||||||
light_color = "#a97faa"
|
light_color = "#a97faa"
|
||||||
|
|||||||
@@ -95,7 +95,7 @@
|
|||||||
holder.icon_state = "hudhealth-100"
|
holder.icon_state = "hudhealth-100"
|
||||||
C.images += holder
|
C.images += holder
|
||||||
else
|
else
|
||||||
holder.icon_state = RoundHealth((patient.health-config.health_threshold_crit)/(patient.maxHealth-config.health_threshold_crit)*100)
|
holder.icon_state = RoundHealth((patient.health-config.health_threshold_crit)/(patient.getMaxHealth()-config.health_threshold_crit)*100)
|
||||||
C.images += holder
|
C.images += holder
|
||||||
|
|
||||||
holder = patient.hud_list[STATUS_HUD]
|
holder = patient.hud_list[STATUS_HUD]
|
||||||
|
|||||||
@@ -74,7 +74,12 @@
|
|||||||
add_fingerprint(user)
|
add_fingerprint(user)
|
||||||
unbuckle_mob()
|
unbuckle_mob()
|
||||||
|
|
||||||
if(buckle_mob(M))
|
//can't buckle unless you share locs so try to move M to the obj.
|
||||||
|
if(M.loc != src.loc)
|
||||||
|
step_towards(M, src)
|
||||||
|
|
||||||
|
. = buckle_mob(M)
|
||||||
|
if(.)
|
||||||
if(M == user)
|
if(M == user)
|
||||||
M.visible_message(\
|
M.visible_message(\
|
||||||
"<span class='notice'>[M.name] buckles themselves to [src].</span>",\
|
"<span class='notice'>[M.name] buckles themselves to [src].</span>",\
|
||||||
|
|||||||
@@ -77,14 +77,20 @@
|
|||||||
/obj/structure/closet/body_bag/MouseDrop(over_object, src_location, over_location)
|
/obj/structure/closet/body_bag/MouseDrop(over_object, src_location, over_location)
|
||||||
..()
|
..()
|
||||||
if((over_object == usr && (in_range(src, usr) || usr.contents.Find(src))))
|
if((over_object == usr && (in_range(src, usr) || usr.contents.Find(src))))
|
||||||
if(!ishuman(usr)) return
|
if(!ishuman(usr)) return 0
|
||||||
if(opened) return 0
|
if(opened) return 0
|
||||||
if(contents.len) return 0
|
if(contents.len) return 0
|
||||||
visible_message("[usr] folds up the [src.name]")
|
visible_message("[usr] folds up the [src.name]")
|
||||||
new item_path(get_turf(src))
|
var/folded = new item_path(get_turf(src))
|
||||||
spawn(0)
|
spawn(0)
|
||||||
qdel(src)
|
qdel(src)
|
||||||
return
|
return folded
|
||||||
|
|
||||||
|
/obj/structure/closet/body_bag/relaymove(mob/user,direction)
|
||||||
|
if(src.loc != get_turf(src))
|
||||||
|
src.loc.relaymove(user,direction)
|
||||||
|
else
|
||||||
|
..()
|
||||||
|
|
||||||
/obj/structure/closet/body_bag/proc/get_occupants()
|
/obj/structure/closet/body_bag/proc/get_occupants()
|
||||||
var/list/occupants = list()
|
var/list/occupants = list()
|
||||||
@@ -109,34 +115,43 @@
|
|||||||
|
|
||||||
/obj/item/bodybag/cryobag
|
/obj/item/bodybag/cryobag
|
||||||
name = "stasis bag"
|
name = "stasis bag"
|
||||||
desc = "A folded, non-reusable bag designed to prevent additional damage to an occupant, especially useful if short on time or in \
|
desc = "A non-reusable plastic bag designed to slow down bodily functions such as circulation and breathing, \
|
||||||
a hostile enviroment."
|
especially useful if short on time or in a hostile enviroment."
|
||||||
icon = 'icons/obj/cryobag.dmi'
|
icon = 'icons/obj/cryobag.dmi'
|
||||||
icon_state = "bodybag_folded"
|
icon_state = "bodybag_folded"
|
||||||
item_state = "bodybag_cryo_folded"
|
item_state = "bodybag_cryo_folded"
|
||||||
origin_tech = list(TECH_BIO = 4)
|
origin_tech = list(TECH_BIO = 4)
|
||||||
|
var/obj/item/weapon/reagent_containers/syringe/syringe
|
||||||
|
|
||||||
/obj/item/bodybag/cryobag/attack_self(mob/user)
|
/obj/item/bodybag/cryobag/attack_self(mob/user)
|
||||||
var/obj/structure/closet/body_bag/cryobag/R = new /obj/structure/closet/body_bag/cryobag(user.loc)
|
var/obj/structure/closet/body_bag/cryobag/R = new /obj/structure/closet/body_bag/cryobag(user.loc)
|
||||||
R.add_fingerprint(user)
|
R.add_fingerprint(user)
|
||||||
|
if(syringe)
|
||||||
|
R.syringe = syringe
|
||||||
|
syringe = null
|
||||||
qdel(src)
|
qdel(src)
|
||||||
|
|
||||||
/obj/structure/closet/body_bag/cryobag
|
/obj/structure/closet/body_bag/cryobag
|
||||||
name = "stasis bag"
|
name = "stasis bag"
|
||||||
desc = "A non-reusable plastic bag designed to prevent additional damage to an occupant, especially useful if short on time or in \
|
desc = "A non-reusable plastic bag designed to slow down bodily functions such as circulation and breathing, \
|
||||||
a hostile enviroment."
|
especially useful if short on time or in a hostile enviroment."
|
||||||
icon = 'icons/obj/cryobag.dmi'
|
icon = 'icons/obj/cryobag.dmi'
|
||||||
item_path = /obj/item/bodybag/cryobag
|
item_path = /obj/item/bodybag/cryobag
|
||||||
store_misc = 0
|
store_misc = 0
|
||||||
store_items = 0
|
store_items = 0
|
||||||
var/used = 0
|
var/used = 0
|
||||||
var/obj/item/weapon/tank/tank = null
|
var/obj/item/weapon/tank/tank = null
|
||||||
|
var/stasis_level = 3 //Every 'this' life ticks are applied to the mob (when life_ticks%stasis_level == 1)
|
||||||
|
var/obj/item/weapon/reagent_containers/syringe/syringe
|
||||||
|
|
||||||
/obj/structure/closet/body_bag/cryobag/New()
|
/obj/structure/closet/body_bag/cryobag/New()
|
||||||
tank = new /obj/item/weapon/tank/emergency/oxygen(null) //It's in nullspace to prevent ejection when the bag is opened.
|
tank = new /obj/item/weapon/tank/emergency/oxygen(null) //It's in nullspace to prevent ejection when the bag is opened.
|
||||||
..()
|
..()
|
||||||
|
|
||||||
/obj/structure/closet/body_bag/cryobag/Destroy()
|
/obj/structure/closet/body_bag/cryobag/Destroy()
|
||||||
|
if(syringe)
|
||||||
|
qdel(syringe)
|
||||||
|
syringe = null
|
||||||
qdel(tank)
|
qdel(tank)
|
||||||
tank = null
|
tank = null
|
||||||
..()
|
..()
|
||||||
@@ -151,11 +166,19 @@
|
|||||||
O.desc = "Pretty useless now.."
|
O.desc = "Pretty useless now.."
|
||||||
qdel(src)
|
qdel(src)
|
||||||
|
|
||||||
|
/obj/structure/closet/body_bag/cryobag/MouseDrop(over_object, src_location, over_location)
|
||||||
|
. = ..()
|
||||||
|
if(. && syringe)
|
||||||
|
var/obj/item/bodybag/cryobag/folded = .
|
||||||
|
folded.syringe = syringe
|
||||||
|
syringe = null
|
||||||
|
|
||||||
/obj/structure/closet/body_bag/cryobag/Entered(atom/movable/AM)
|
/obj/structure/closet/body_bag/cryobag/Entered(atom/movable/AM)
|
||||||
if(ishuman(AM))
|
if(ishuman(AM))
|
||||||
var/mob/living/carbon/human/H = AM
|
var/mob/living/carbon/human/H = AM
|
||||||
H.in_stasis = 1
|
H.Stasis(stasis_level)
|
||||||
src.used = 1
|
src.used = 1
|
||||||
|
inject_occupant(H)
|
||||||
|
|
||||||
if(istype(AM, /obj/item/organ))
|
if(istype(AM, /obj/item/organ))
|
||||||
var/obj/item/organ/O = AM
|
var/obj/item/organ/O = AM
|
||||||
@@ -167,7 +190,7 @@
|
|||||||
/obj/structure/closet/body_bag/cryobag/Exited(atom/movable/AM)
|
/obj/structure/closet/body_bag/cryobag/Exited(atom/movable/AM)
|
||||||
if(ishuman(AM))
|
if(ishuman(AM))
|
||||||
var/mob/living/carbon/human/H = AM
|
var/mob/living/carbon/human/H = AM
|
||||||
H.in_stasis = 0
|
H.Stasis(0)
|
||||||
|
|
||||||
if(istype(AM, /obj/item/organ))
|
if(istype(AM, /obj/item/organ))
|
||||||
var/obj/item/organ/O = AM
|
var/obj/item/organ/O = AM
|
||||||
@@ -181,10 +204,19 @@
|
|||||||
return tank.air_contents
|
return tank.air_contents
|
||||||
..()
|
..()
|
||||||
|
|
||||||
|
/obj/structure/closet/body_bag/cryobag/proc/inject_occupant(var/mob/living/carbon/human/H)
|
||||||
|
if(!syringe)
|
||||||
|
return
|
||||||
|
|
||||||
|
if(H.reagents)
|
||||||
|
syringe.reagents.trans_to_mob(H, 30, CHEM_BLOOD)
|
||||||
|
|
||||||
/obj/structure/closet/body_bag/cryobag/examine(mob/user)
|
/obj/structure/closet/body_bag/cryobag/examine(mob/user)
|
||||||
..()
|
..()
|
||||||
if(Adjacent(user)) //The bag's rather thick and opaque from a distance.
|
if(Adjacent(user)) //The bag's rather thick and opaque from a distance.
|
||||||
user << "<span class='info'>You peer into \the [src].</span>"
|
user << "<span class='info'>You peer into \the [src].</span>"
|
||||||
|
if(syringe)
|
||||||
|
user << "<span class='info'>It has a syringe added to it.</span>"
|
||||||
for(var/mob/living/L in contents)
|
for(var/mob/living/L in contents)
|
||||||
L.examine(user)
|
L.examine(user)
|
||||||
|
|
||||||
@@ -196,5 +228,28 @@
|
|||||||
var/obj/item/device/healthanalyzer/analyzer = W
|
var/obj/item/device/healthanalyzer/analyzer = W
|
||||||
for(var/mob/living/L in contents)
|
for(var/mob/living/L in contents)
|
||||||
analyzer.attack(L,user)
|
analyzer.attack(L,user)
|
||||||
|
|
||||||
|
else if(istype(W,/obj/item/weapon/reagent_containers/syringe))
|
||||||
|
if(syringe)
|
||||||
|
to_chat(user,"<span class='warning'>\The [src] already has an injector! Remove it first.</span>")
|
||||||
|
else
|
||||||
|
var/obj/item/weapon/reagent_containers/syringe/syringe = W
|
||||||
|
to_chat(user,"<span class='info'>You insert \the [syringe] into \the [src], and it locks into place.</span>")
|
||||||
|
user.unEquip(syringe)
|
||||||
|
src.syringe = syringe
|
||||||
|
syringe.loc = null
|
||||||
|
for(var/mob/living/carbon/human/H in contents)
|
||||||
|
inject_occupant(H)
|
||||||
|
break
|
||||||
|
|
||||||
|
else if(istype(W,/obj/item/weapon/screwdriver))
|
||||||
|
if(syringe)
|
||||||
|
if(used)
|
||||||
|
to_chat(user,"<span class='warning'>The injector cannot be removed now that the stasis bag has been used!</span>")
|
||||||
|
else
|
||||||
|
syringe.forceMove(src.loc)
|
||||||
|
to_chat(user,"<span class='info'>You pry \the [syringe] out of \the [src].</span>")
|
||||||
|
syringe = null
|
||||||
|
|
||||||
else
|
else
|
||||||
..()
|
..()
|
||||||
|
|||||||
@@ -1105,6 +1105,8 @@ var/global/list/obj/item/device/pda/PDAs = list()
|
|||||||
if(M.stat == DEAD && M.client && (M.is_preference_enabled(/datum/client_preference/ghost_ears))) // src.client is so that ghosts don't have to listen to mice
|
if(M.stat == DEAD && M.client && (M.is_preference_enabled(/datum/client_preference/ghost_ears))) // src.client is so that ghosts don't have to listen to mice
|
||||||
if(istype(M, /mob/new_player))
|
if(istype(M, /mob/new_player))
|
||||||
continue
|
continue
|
||||||
|
if(M.forbid_seeing_deadchat)
|
||||||
|
continue
|
||||||
M.show_message("<span class='game say'>PDA Message - <span class='name'>[owner]</span> -> <span class='name'>[P.owner]</span>: <span class='message'>[t]</span></span>")
|
M.show_message("<span class='game say'>PDA Message - <span class='name'>[owner]</span> -> <span class='name'>[P.owner]</span>: <span class='message'>[t]</span></span>")
|
||||||
|
|
||||||
if(!conversations.Find("\ref[P]"))
|
if(!conversations.Find("\ref[P]"))
|
||||||
|
|||||||
@@ -212,6 +212,8 @@ var/global/list/obj/item/device/communicator/all_communicators = list()
|
|||||||
alert_called = 0
|
alert_called = 0
|
||||||
update_icon()
|
update_icon()
|
||||||
ui_interact(user)
|
ui_interact(user)
|
||||||
|
if(video_source)
|
||||||
|
watch_video(user)
|
||||||
|
|
||||||
// Proc: MouseDrop()
|
// Proc: MouseDrop()
|
||||||
//Same thing PDAs do
|
//Same thing PDAs do
|
||||||
@@ -1032,7 +1034,8 @@ var/global/list/obj/item/device/communicator/all_communicators = list()
|
|||||||
if(!Adjacent(user) || !video_source) return
|
if(!Adjacent(user) || !video_source) return
|
||||||
user.set_machine(video_source)
|
user.set_machine(video_source)
|
||||||
user.reset_view(video_source)
|
user.reset_view(video_source)
|
||||||
user << "<span class='notice'>Now viewing video session. To leave camera view: OOC -> Cancel Camera View</span>"
|
to_chat(user,"<span class='notice'>Now viewing video session. To leave camera view, close the communicator window OR: OOC -> Cancel Camera View</span>")
|
||||||
|
to_chat(user,"<span class='notice'>To return to an active video session, use the communicator in your hand.</span>")
|
||||||
spawn(0)
|
spawn(0)
|
||||||
while(user.machine == video_source && Adjacent(user))
|
while(user.machine == video_source && Adjacent(user))
|
||||||
var/turf/T = get_turf(video_source)
|
var/turf/T = get_turf(video_source)
|
||||||
|
|||||||
@@ -92,8 +92,8 @@
|
|||||||
flash_strength *= H.species.flash_mod
|
flash_strength *= H.species.flash_mod
|
||||||
|
|
||||||
if(flash_strength > 0)
|
if(flash_strength > 0)
|
||||||
H.confused = max(H.confused, flash_strength + 5)
|
H.Confuse(flash_strength + 5)
|
||||||
H.eye_blind = max(H.eye_blind, flash_strength)
|
H.Blind(flash_strength)
|
||||||
H.eye_blurry = max(H.eye_blurry, flash_strength + 5)
|
H.eye_blurry = max(H.eye_blurry, flash_strength + 5)
|
||||||
H.flash_eyes()
|
H.flash_eyes()
|
||||||
H.adjustHalLoss(halloss_per_flash * (flash_strength / 5)) // Should take four flashes to stun.
|
H.adjustHalLoss(halloss_per_flash * (flash_strength / 5)) // Should take four flashes to stun.
|
||||||
|
|||||||
@@ -65,10 +65,12 @@ var/global/list/default_medbay_channels = list(
|
|||||||
..()
|
..()
|
||||||
wires = new(src)
|
wires = new(src)
|
||||||
internal_channels = default_internal_channels.Copy()
|
internal_channels = default_internal_channels.Copy()
|
||||||
|
listening_objects += src
|
||||||
|
|
||||||
/obj/item/device/radio/Destroy()
|
/obj/item/device/radio/Destroy()
|
||||||
qdel(wires)
|
qdel(wires)
|
||||||
wires = null
|
wires = null
|
||||||
|
listening_objects -= src
|
||||||
if(radio_controller)
|
if(radio_controller)
|
||||||
radio_controller.remove_object(src, frequency)
|
radio_controller.remove_object(src, frequency)
|
||||||
for (var/ch_name in channels)
|
for (var/ch_name in channels)
|
||||||
@@ -474,7 +476,6 @@ var/global/list/default_medbay_channels = list(
|
|||||||
|
|
||||||
|
|
||||||
/obj/item/device/radio/hear_talk(mob/M as mob, msg, var/verb = "says", var/datum/language/speaking = null)
|
/obj/item/device/radio/hear_talk(mob/M as mob, msg, var/verb = "says", var/datum/language/speaking = null)
|
||||||
|
|
||||||
if (broadcasting)
|
if (broadcasting)
|
||||||
if(get_dist(src, M) <= canhear_range)
|
if(get_dist(src, M) <= canhear_range)
|
||||||
talk_into(M, msg,null,verb,speaking)
|
talk_into(M, msg,null,verb,speaking)
|
||||||
|
|||||||
@@ -69,7 +69,7 @@ REAGENT SCANNER
|
|||||||
user.show_message("<span class='notice'>Analyzing Results for [M]:</span>")
|
user.show_message("<span class='notice'>Analyzing Results for [M]:</span>")
|
||||||
user.show_message("<span class='notice'>Overall Status: dead</span>")
|
user.show_message("<span class='notice'>Overall Status: dead</span>")
|
||||||
else
|
else
|
||||||
user.show_message("<span class='notice'>Analyzing Results for [M]:\n\t Overall Status: [M.stat > 1 ? "dead" : "[round((M.health/M.maxHealth)*100) ]% healthy"]</span>")
|
user.show_message("<span class='notice'>Analyzing Results for [M]:\n\t Overall Status: [M.stat > 1 ? "dead" : "[round((M.health/M.getMaxHealth())*100) ]% healthy"]</span>")
|
||||||
user.show_message("<span class='notice'> Key: <font color='cyan'>Suffocation</font>/<font color='green'>Toxin</font>/<font color='#FFA500'>Burns</font>/<font color='red'>Brute</font></span>", 1)
|
user.show_message("<span class='notice'> Key: <font color='cyan'>Suffocation</font>/<font color='green'>Toxin</font>/<font color='#FFA500'>Burns</font>/<font color='red'>Brute</font></span>", 1)
|
||||||
user.show_message("<span class='notice'> Damage Specifics: <font color='cyan'>[OX]</font> - <font color='green'>[TX]</font> - <font color='#FFA500'>[BU]</font> - <font color='red'>[BR]</font></span>")
|
user.show_message("<span class='notice'> Damage Specifics: <font color='cyan'>[OX]</font> - <font color='green'>[TX]</font> - <font color='#FFA500'>[BU]</font> - <font color='red'>[BR]</font></span>")
|
||||||
user.show_message("<span class='notice'>Body Temperature: [M.bodytemperature-T0C]°C ([M.bodytemperature*1.8-459.67]°F)</span>", 1)
|
user.show_message("<span class='notice'>Body Temperature: [M.bodytemperature-T0C]°C ([M.bodytemperature*1.8-459.67]°F)</span>", 1)
|
||||||
|
|||||||
@@ -47,6 +47,9 @@
|
|||||||
|
|
||||||
var/mob/living/L = loc
|
var/mob/living/L = loc
|
||||||
|
|
||||||
|
if(!language)
|
||||||
|
return //Borgs were causing runtimes when passing language=null
|
||||||
|
|
||||||
if (language && (language.flags & NONVERBAL))
|
if (language && (language.flags & NONVERBAL))
|
||||||
return //Not gonna translate sign language
|
return //Not gonna translate sign language
|
||||||
|
|
||||||
|
|||||||
@@ -155,7 +155,7 @@
|
|||||||
singular_name = "advanced trauma kit"
|
singular_name = "advanced trauma kit"
|
||||||
desc = "An advanced trauma kit for severe injuries."
|
desc = "An advanced trauma kit for severe injuries."
|
||||||
icon_state = "traumakit"
|
icon_state = "traumakit"
|
||||||
heal_brute = 0
|
heal_brute = 5
|
||||||
origin_tech = list(TECH_BIO = 1)
|
origin_tech = list(TECH_BIO = 1)
|
||||||
|
|
||||||
/obj/item/stack/medical/advanced/bruise_pack/attack(mob/living/carbon/M as mob, mob/user as mob)
|
/obj/item/stack/medical/advanced/bruise_pack/attack(mob/living/carbon/M as mob, mob/user as mob)
|
||||||
@@ -213,7 +213,7 @@
|
|||||||
singular_name = "advanced burn kit"
|
singular_name = "advanced burn kit"
|
||||||
desc = "An advanced treatment kit for severe burns."
|
desc = "An advanced treatment kit for severe burns."
|
||||||
icon_state = "burnkit"
|
icon_state = "burnkit"
|
||||||
heal_burn = 0
|
heal_burn = 5
|
||||||
origin_tech = list(TECH_BIO = 1)
|
origin_tech = list(TECH_BIO = 1)
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -39,7 +39,7 @@ RSF
|
|||||||
playsound(src.loc, 'sound/effects/pop.ogg', 50, 0)
|
playsound(src.loc, 'sound/effects/pop.ogg', 50, 0)
|
||||||
if (mode == 1)
|
if (mode == 1)
|
||||||
mode = 2
|
mode = 2
|
||||||
user << "Changed dispensing mode to 'Drinking Glass'"
|
user << "Changed dispensing mode to 'Drinking Glass:Pint'"
|
||||||
return
|
return
|
||||||
if (mode == 2)
|
if (mode == 2)
|
||||||
mode = 3
|
mode = 3
|
||||||
@@ -82,7 +82,7 @@ RSF
|
|||||||
product = new /obj/item/clothing/mask/smokable/cigarette()
|
product = new /obj/item/clothing/mask/smokable/cigarette()
|
||||||
used_energy = 10
|
used_energy = 10
|
||||||
if(2)
|
if(2)
|
||||||
product = new /obj/item/weapon/reagent_containers/food/drinks/glass2()
|
product = new /obj/item/weapon/reagent_containers/food/drinks/glass2/pint()
|
||||||
used_energy = 50
|
used_energy = 50
|
||||||
if(3)
|
if(3)
|
||||||
product = new /obj/item/weapon/paper()
|
product = new /obj/item/weapon/paper()
|
||||||
|
|||||||
@@ -399,21 +399,6 @@ CIGARETTE PACKETS ARE IN FANCY.DM
|
|||||||
..()
|
..()
|
||||||
name = "empty [initial(name)]"
|
name = "empty [initial(name)]"
|
||||||
|
|
||||||
/obj/item/clothing/mask/smokable/pipe/light(var/flavor_text = "[usr] lights the [name].")
|
|
||||||
if(!src.lit && src.smoketime)
|
|
||||||
src.lit = 1
|
|
||||||
damtype = "fire"
|
|
||||||
icon_state = icon_on
|
|
||||||
item_state = icon_on
|
|
||||||
var/turf/T = get_turf(src)
|
|
||||||
T.visible_message(flavor_text)
|
|
||||||
processing_objects.Add(src)
|
|
||||||
if(ismob(loc))
|
|
||||||
var/mob/living/M = loc
|
|
||||||
M.update_inv_wear_mask(0)
|
|
||||||
M.update_inv_l_hand(0)
|
|
||||||
M.update_inv_r_hand(1)
|
|
||||||
|
|
||||||
/obj/item/clothing/mask/smokable/pipe/attack_self(mob/user as mob)
|
/obj/item/clothing/mask/smokable/pipe/attack_self(mob/user as mob)
|
||||||
if(lit == 1)
|
if(lit == 1)
|
||||||
if(user.a_intent == I_HURT)
|
if(user.a_intent == I_HURT)
|
||||||
|
|||||||
@@ -41,6 +41,8 @@
|
|||||||
user << "<span class='danger'>You need to have a firm grip on [C] before you can put \the [src] on!</span>"
|
user << "<span class='danger'>You need to have a firm grip on [C] before you can put \the [src] on!</span>"
|
||||||
|
|
||||||
/obj/item/weapon/handcuffs/proc/can_place(var/mob/target, var/mob/user)
|
/obj/item/weapon/handcuffs/proc/can_place(var/mob/target, var/mob/user)
|
||||||
|
if(user == target)
|
||||||
|
return 1
|
||||||
if(istype(user, /mob/living/silicon/robot))
|
if(istype(user, /mob/living/silicon/robot))
|
||||||
if(user.Adjacent(target))
|
if(user.Adjacent(target))
|
||||||
return 1
|
return 1
|
||||||
|
|||||||
@@ -38,7 +38,10 @@
|
|||||||
IC.examine(user)
|
IC.examine(user)
|
||||||
|
|
||||||
/obj/item/weapon/implant/integrated_circuit/attackby(var/obj/item/O, var/mob/user)
|
/obj/item/weapon/implant/integrated_circuit/attackby(var/obj/item/O, var/mob/user)
|
||||||
if(istype(O, /obj/item/weapon/crowbar) || istype(O, /obj/item/device/integrated_electronics) || istype(O, /obj/item/integrated_circuit) || istype(O, /obj/item/weapon/screwdriver) )
|
if(istype(O, /obj/item/weapon/crowbar) || istype(O, /obj/item/device/integrated_electronics) || istype(O, /obj/item/integrated_circuit) || istype(O, /obj/item/weapon/screwdriver) || istype(O, /obj/item/weapon/cell/device) )
|
||||||
IC.attackby(O, user)
|
IC.attackby(O, user)
|
||||||
else
|
else
|
||||||
..()
|
..()
|
||||||
|
|
||||||
|
/obj/item/weapon/implant/integrated_circuit/attack_self(mob/user)
|
||||||
|
IC.attack_self(user)
|
||||||
@@ -7,7 +7,7 @@
|
|||||||
/obj/item/weapon/material/kitchen/utensil
|
/obj/item/weapon/material/kitchen/utensil
|
||||||
w_class = ITEMSIZE_TINY
|
w_class = ITEMSIZE_TINY
|
||||||
thrown_force_divisor = 1
|
thrown_force_divisor = 1
|
||||||
origin_tech = "materials=1"
|
origin_tech = list(TECH_MATERIAL = 1)
|
||||||
attack_verb = list("attacked", "stabbed", "poked")
|
attack_verb = list("attacked", "stabbed", "poked")
|
||||||
sharp = 1
|
sharp = 1
|
||||||
edge = 1
|
edge = 1
|
||||||
|
|||||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user