mirror of
https://github.com/CHOMPStation2/CHOMPStation2.git
synced 2025-12-11 18:53:06 +00:00
Merge branch 'master' into aro-tether-wip
# Conflicts: # code/ZAS/_docs.dm # code/game/area/areas.dm # code/game/objects/explosion.dm # code/modules/holodeck/HolodeckControl.dm # code/modules/mob/living/say.dm
This commit is contained in:
@@ -3,9 +3,9 @@ language: c
|
||||
sudo: false
|
||||
|
||||
env:
|
||||
BYOND_MAJOR="510"
|
||||
BYOND_MINOR="1346"
|
||||
MACRO_COUNT=986
|
||||
BYOND_MAJOR="511"
|
||||
BYOND_MINOR="1381"
|
||||
MACRO_COUNT=875
|
||||
|
||||
cache:
|
||||
directories:
|
||||
|
||||
@@ -124,3 +124,5 @@ var/list/be_special_flags = list(
|
||||
#define Sp_RECHARGE "recharge"
|
||||
#define Sp_CHARGES "charges"
|
||||
#define Sp_HOLDVAR "holdervar"
|
||||
|
||||
#define CHANGELING_STASIS_COST 20
|
||||
@@ -33,7 +33,7 @@
|
||||
#define PROXMOVE 0x80 // Does this object require proximity checking in Enter()?
|
||||
|
||||
//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 AIRTIGHT 0x4 // Functions with internals.
|
||||
#define NOSLIP 0x8 // Prevents from slipping on wet floors, in space, etc.
|
||||
|
||||
@@ -1,110 +0,0 @@
|
||||
|
||||
/*
|
||||
/tg/station13 /atom/movable Pool:
|
||||
---------------------------------
|
||||
By RemieRichards
|
||||
|
||||
Creation/Deletion is laggy, so let's reduce reuse and recycle!
|
||||
|
||||
*/
|
||||
#define ATOM_POOL_COUNT 100
|
||||
// "define DEBUG_ATOM_POOL 1
|
||||
var/global/list/GlobalPool = list()
|
||||
|
||||
//You'll be using this proc 90% of the time.
|
||||
//It grabs a type from the pool if it can
|
||||
//And if it can't, it creates one
|
||||
//The pool is flexible and will expand to fit
|
||||
//The new created atom when it eventually
|
||||
//Goes into the pool
|
||||
|
||||
//Second argument can be a new location, if the type is /atom/movable
|
||||
//Or a list of arguments
|
||||
//Either way it gets passed to new
|
||||
|
||||
/proc/PoolOrNew(var/get_type,var/second_arg)
|
||||
var/datum/D
|
||||
D = GetFromPool(get_type,second_arg)
|
||||
|
||||
if(!D)
|
||||
// So the GC knows we're pooling this type.
|
||||
if(!GlobalPool[get_type])
|
||||
GlobalPool[get_type] = list()
|
||||
if(islist(second_arg))
|
||||
return new get_type (arglist(second_arg))
|
||||
else
|
||||
return new get_type (second_arg)
|
||||
return D
|
||||
|
||||
/proc/GetFromPool(var/get_type,var/second_arg)
|
||||
if(isnull(GlobalPool[get_type]))
|
||||
return 0
|
||||
|
||||
if(length(GlobalPool[get_type]) == 0)
|
||||
return 0
|
||||
|
||||
var/datum/D = pick_n_take(GlobalPool[get_type])
|
||||
if(D)
|
||||
D.ResetVars()
|
||||
D.Prepare(second_arg)
|
||||
return D
|
||||
return 0
|
||||
|
||||
/proc/PlaceInPool(var/datum/D)
|
||||
if(!istype(D))
|
||||
return
|
||||
|
||||
if(length(GlobalPool[D.type]) > ATOM_POOL_COUNT)
|
||||
#ifdef DEBUG_ATOM_POOL
|
||||
world << text("DEBUG_DATUM_POOL: PlaceInPool([]) exceeds []. Discarding.", D.type, ATOM_POOL_COUNT)
|
||||
#endif
|
||||
if(garbage_collector)
|
||||
garbage_collector.AddTrash(D)
|
||||
else
|
||||
del(D)
|
||||
return
|
||||
|
||||
if(D in GlobalPool[D.type])
|
||||
return
|
||||
|
||||
if(!GlobalPool[D.type])
|
||||
GlobalPool[D.type] = list()
|
||||
|
||||
GlobalPool[D.type] += D
|
||||
|
||||
D.Destroy()
|
||||
D.ResetVars()
|
||||
|
||||
/proc/IsPooled(var/datum/D)
|
||||
if(isnull(GlobalPool[D.type]))
|
||||
return 0
|
||||
return 1
|
||||
|
||||
/datum/proc/Prepare(args)
|
||||
if(islist(args))
|
||||
New(arglist(args))
|
||||
else
|
||||
New(args)
|
||||
|
||||
/atom/movable/Prepare(args)
|
||||
var/list/args_list = args
|
||||
if(istype(args_list) && args_list.len)
|
||||
loc = args[1]
|
||||
else
|
||||
loc = args
|
||||
..()
|
||||
|
||||
/datum/proc/ResetVars(var/list/exlude = list())
|
||||
var/list/excluded = list("animate_movement", "loc", "locs", "parent_type", "vars", "verbs", "type") + exlude
|
||||
|
||||
for(var/V in vars)
|
||||
if(V in excluded)
|
||||
continue
|
||||
|
||||
vars[V] = initial(vars[V])
|
||||
|
||||
/atom/movable/ResetVars()
|
||||
..()
|
||||
vars["loc"] = null
|
||||
|
||||
#undef ATOM_POOL_COUNT
|
||||
@@ -284,7 +284,7 @@
|
||||
if(M.loc && M.locs[1] in hearturfs)
|
||||
mobs |= M
|
||||
|
||||
else if(M.stat == DEAD)
|
||||
else if(M.stat == DEAD && !M.forbid_seeing_deadchat)
|
||||
switch(type)
|
||||
if(1) //Audio messages use ghost_ears
|
||||
if(M.is_preference_enabled(/datum/client_preference/ghost_ears))
|
||||
|
||||
@@ -32,11 +32,6 @@
|
||||
my_mob.client.screen -= src
|
||||
my_mob = null
|
||||
|
||||
/obj/screen/movable/ability_master/ResetVars()
|
||||
..("ability_objects", args)
|
||||
remove_all_abilities()
|
||||
// ability_objects = list()
|
||||
|
||||
/obj/screen/movable/ability_master/MouseDrop()
|
||||
if(showing)
|
||||
return
|
||||
|
||||
@@ -20,7 +20,7 @@
|
||||
return null
|
||||
|
||||
if(!screen)
|
||||
screen = PoolOrNew(type)
|
||||
screen = new type()
|
||||
|
||||
screen.icon_state = "[initial(screen.icon_state)][severity]"
|
||||
screen.severity = severity
|
||||
|
||||
@@ -45,49 +45,61 @@
|
||||
screen_loc = "[screen_loc_X[1]]:[pix_X],[screen_loc_Y[1]]:[pix_Y]"
|
||||
|
||||
/obj/screen/movable/proc/encode_screen_X(X)
|
||||
if(X > usr.client.view+1)
|
||||
. = "EAST-[usr.client.view*2 + 1-X]"
|
||||
else if(X < usr.client.view+1)
|
||||
var/view_dist = world.view
|
||||
if(view_dist)
|
||||
view_dist = view_dist
|
||||
if(X > view_dist+1)
|
||||
. = "EAST-[view_dist *2 + 1-X]"
|
||||
else if(X < view_dist +1)
|
||||
. = "WEST+[X-1]"
|
||||
else
|
||||
. = "CENTER"
|
||||
|
||||
/obj/screen/movable/proc/decode_screen_X(X)
|
||||
var/view_dist = world.view
|
||||
if(view_dist)
|
||||
view_dist = view_dist
|
||||
//Find EAST/WEST implementations
|
||||
if(findtext(X,"EAST-"))
|
||||
var/num = text2num(copytext(X,6)) //Trim EAST-
|
||||
if(!num)
|
||||
num = 0
|
||||
. = usr.client.view*2 + 1 - num
|
||||
. = view_dist*2 + 1 - num
|
||||
else if(findtext(X,"WEST+"))
|
||||
var/num = text2num(copytext(X,6)) //Trim WEST+
|
||||
if(!num)
|
||||
num = 0
|
||||
. = num+1
|
||||
else if(findtext(X,"CENTER"))
|
||||
. = usr.client.view+1
|
||||
. = view_dist+1
|
||||
|
||||
/obj/screen/movable/proc/encode_screen_Y(Y)
|
||||
if(Y > usr.client.view+1)
|
||||
. = "NORTH-[usr.client.view*2 + 1-Y]"
|
||||
else if(Y < usr.client.view+1)
|
||||
var/view_dist = world.view
|
||||
if(view_dist)
|
||||
view_dist = view_dist
|
||||
if(Y > view_dist+1)
|
||||
. = "NORTH-[view_dist*2 + 1-Y]"
|
||||
else if(Y < view_dist+1)
|
||||
. = "SOUTH+[Y-1]"
|
||||
else
|
||||
. = "CENTER"
|
||||
|
||||
/obj/screen/movable/proc/decode_screen_Y(Y)
|
||||
var/view_dist = world.view
|
||||
if(view_dist)
|
||||
view_dist = view_dist
|
||||
if(findtext(Y,"NORTH-"))
|
||||
var/num = text2num(copytext(Y,7)) //Trim NORTH-
|
||||
if(!num)
|
||||
num = 0
|
||||
. = usr.client.view*2 + 1 - num
|
||||
. = view_dist*2 + 1 - num
|
||||
else if(findtext(Y,"SOUTH+"))
|
||||
var/num = text2num(copytext(Y,7)) //Time SOUTH+
|
||||
if(!num)
|
||||
num = 0
|
||||
. = num+1
|
||||
else if(findtext(Y,"CENTER"))
|
||||
. = usr.client.view+1
|
||||
. = view_dist+1
|
||||
|
||||
//Debug procs
|
||||
/client/proc/test_movable_UI()
|
||||
|
||||
@@ -23,10 +23,6 @@
|
||||
spell_holder.client.screen -= src
|
||||
spell_holder = null
|
||||
|
||||
/obj/screen/movable/spell_master/ResetVars()
|
||||
..("spell_objects", args)
|
||||
spell_objects = list()
|
||||
|
||||
/obj/screen/movable/spell_master/MouseDrop()
|
||||
if(showing)
|
||||
return
|
||||
@@ -93,7 +89,7 @@
|
||||
if(spell.spell_flags & NO_BUTTON) //no button to add if we don't get one
|
||||
return
|
||||
|
||||
var/obj/screen/spell/newscreen = PoolOrNew(/obj/screen/spell)
|
||||
var/obj/screen/spell/newscreen = new /obj/screen/spell()
|
||||
newscreen.spellmaster = src
|
||||
newscreen.spell = spell
|
||||
|
||||
|
||||
@@ -149,7 +149,7 @@ var/const/tk_maxrange = 15
|
||||
|
||||
/obj/item/tk_grab/proc/apply_focus_overlay()
|
||||
if(!focus) return
|
||||
var/obj/effect/overlay/O = PoolOrNew(/obj/effect/overlay, locate(focus.x,focus.y,focus.z))
|
||||
var/obj/effect/overlay/O = new /obj/effect/overlay(locate(focus.x,focus.y,focus.z))
|
||||
O.name = "sparkles"
|
||||
O.anchored = 1
|
||||
O.density = 0
|
||||
|
||||
@@ -152,15 +152,9 @@ world/loop_checks = 0
|
||||
A.finalize_qdel()
|
||||
|
||||
/datum/proc/finalize_qdel()
|
||||
if(IsPooled(src))
|
||||
PlaceInPool(src)
|
||||
else
|
||||
del(src)
|
||||
|
||||
/atom/finalize_qdel()
|
||||
if(IsPooled(src))
|
||||
PlaceInPool(src)
|
||||
else
|
||||
if(garbage_collector)
|
||||
garbage_collector.AddTrash(src)
|
||||
else
|
||||
@@ -180,7 +174,7 @@ world/loop_checks = 0
|
||||
|
||||
// Default implementation of clean-up code.
|
||||
// This should be overridden to remove all references pointing to the object being destroyed.
|
||||
// Return true if the the GC controller should allow the object to continue existing. (Useful if pooling objects.)
|
||||
// Return true if the the GC controller should allow the object to continue existing.
|
||||
/datum/proc/Destroy()
|
||||
nanomanager.close_uis(src)
|
||||
tag = null
|
||||
|
||||
39
code/datums/repositories/decls.dm
Normal file
39
code/datums/repositories/decls.dm
Normal file
@@ -0,0 +1,39 @@
|
||||
/var/repository/decls/decls_repository = new()
|
||||
|
||||
/repository/decls
|
||||
var/list/fetched_decls
|
||||
var/list/fetched_decl_types
|
||||
var/list/fetched_decl_subtypes
|
||||
|
||||
/repository/decls/New()
|
||||
..()
|
||||
fetched_decls = list()
|
||||
fetched_decl_types = list()
|
||||
fetched_decl_subtypes = list()
|
||||
|
||||
/repository/decls/proc/decls_of_type(var/decl_prototype)
|
||||
. = fetched_decl_types[decl_prototype]
|
||||
if(!.)
|
||||
. = get_decls(typesof(decl_prototype))
|
||||
fetched_decl_types[decl_prototype] = .
|
||||
|
||||
/repository/decls/proc/decls_of_subtype(var/decl_prototype)
|
||||
. = fetched_decl_subtypes[decl_prototype]
|
||||
if(!.)
|
||||
. = get_decls(subtypesof(decl_prototype))
|
||||
fetched_decl_subtypes[decl_prototype] = .
|
||||
|
||||
/repository/decls/proc/get_decl(var/decl_type)
|
||||
. = fetched_decls[decl_type]
|
||||
if(!.)
|
||||
. = new decl_type()
|
||||
fetched_decls[decl_type] = .
|
||||
|
||||
/repository/decls/proc/get_decls(var/list/decl_types)
|
||||
. = list()
|
||||
for(var/decl_type in decl_types)
|
||||
.[decl_type] = get_decl(decl_type)
|
||||
|
||||
/decls/Destroy()
|
||||
crash_with("Prevented attempt to delete a decl instance: [log_info_line(src)]")
|
||||
return 1 // Prevents Decl destruction
|
||||
@@ -1,4 +1,19 @@
|
||||
/repository/New()
|
||||
return
|
||||
|
||||
/datum/cache_entry
|
||||
var/timestamp
|
||||
var/data
|
||||
|
||||
/datum/cache_entry/New()
|
||||
timestamp = world.time
|
||||
|
||||
/datum/cache_entry/proc/is_valid()
|
||||
return FALSE
|
||||
|
||||
/datum/cache_entry/valid_until/New(var/valid_duration)
|
||||
..()
|
||||
timestamp += valid_duration
|
||||
|
||||
/datum/cache_entry/valid_until/is_valid()
|
||||
return world.time < timestamp
|
||||
@@ -32,6 +32,17 @@
|
||||
containername = "Special Ops crate"
|
||||
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
|
||||
name = "Surplus militia rifles"
|
||||
contains = list(
|
||||
|
||||
@@ -200,6 +200,7 @@
|
||||
/obj/item/clothing/under/det/black = 2,
|
||||
/obj/item/clothing/under/det/grey = 2,
|
||||
/obj/item/clothing/head/det/grey = 2,
|
||||
/obj/item/clothing/under/det/skirt = 2,
|
||||
/obj/item/clothing/under/det = 2,
|
||||
/obj/item/clothing/head/det = 2,
|
||||
/obj/item/clothing/suit/storage/det_trench,
|
||||
|
||||
@@ -8,11 +8,6 @@
|
||||
icon_state = "undershirt"
|
||||
has_color = TRUE
|
||||
|
||||
/datum/category_item/underwear/undershirt/shirt_long
|
||||
name = "Long Shirt"
|
||||
icon_state = "undershirt_long"
|
||||
has_color = TRUE
|
||||
|
||||
/datum/category_item/underwear/undershirt/shirt_fem
|
||||
name = "Babydoll shirt"
|
||||
icon_state = "undershirt_fem"
|
||||
@@ -23,11 +18,22 @@
|
||||
icon_state = "undershirt_long"
|
||||
has_color = TRUE
|
||||
|
||||
/datum/category_item/underwear/undershirt/shirt_long_s
|
||||
name = "Shirt, button-down"
|
||||
icon_state = "shirt_long_s"
|
||||
has_color = TRUE
|
||||
|
||||
/datum/category_item/underwear/undershirt/shirt_long_fem
|
||||
name = "Longsleeve Shirt, feminine"
|
||||
icon_state = "undershirt_long_fem"
|
||||
has_color = TRUE
|
||||
|
||||
/datum/category_item/underwear/undershirt/shirt_long_female_s
|
||||
name = "Button-down Shirt, feminine"
|
||||
icon_state = "shirt_long_female_s"
|
||||
has_color = TRUE
|
||||
|
||||
|
||||
/datum/category_item/underwear/undershirt/tank_top
|
||||
name = "Tank top"
|
||||
icon_state = "tanktop"
|
||||
|
||||
@@ -22,12 +22,12 @@
|
||||
/datum/uplink_item/item/medical/clotting
|
||||
name = "Clotting Medicine injector"
|
||||
item_cost = 10
|
||||
path = /obj/item/weapon/reagent_containers/hypospray/autoinjector/clotting
|
||||
path = /obj/item/weapon/reagent_containers/hypospray/autoinjector/biginjector/clotting
|
||||
|
||||
/datum/uplink_item/item/medical/bonemeds
|
||||
name = "Bone Repair injector"
|
||||
item_cost = 10
|
||||
path = /obj/item/weapon/reagent_containers/hypospray/autoinjector/bonemed
|
||||
path = /obj/item/weapon/reagent_containers/hypospray/autoinjector/biginjector/bonemed
|
||||
|
||||
/datum/uplink_item/item/medical/ambrosiadeusseeds
|
||||
name = "Box of 7x ambrosia deus seed packets"
|
||||
|
||||
@@ -49,7 +49,7 @@ NOTE: there are two lists of areas in the end of this file: centcom and station
|
||||
var/no_air = null
|
||||
// var/list/lights // list of all lights on this area
|
||||
var/list/all_doors = list() //Added by Strumpetplaya - Alarm Change - Contains a list of doors adjacent to this area
|
||||
var/air_doors_activated = 0
|
||||
var/firedoors_closed = 0
|
||||
var/list/ambience = list('sound/ambience/ambigen1.ogg','sound/ambience/ambigen3.ogg','sound/ambience/ambigen4.ogg','sound/ambience/ambigen5.ogg','sound/ambience/ambigen6.ogg','sound/ambience/ambigen7.ogg','sound/ambience/ambigen8.ogg','sound/ambience/ambigen9.ogg','sound/ambience/ambigen10.ogg','sound/ambience/ambigen11.ogg','sound/ambience/ambigen12.ogg','sound/ambience/ambigen14.ogg')
|
||||
var/list/forced_ambience = null
|
||||
var/sound_env = STANDARD_STATION
|
||||
|
||||
@@ -53,26 +53,40 @@
|
||||
danger_level = max(danger_level, AA.danger_level)
|
||||
|
||||
if(danger_level != atmosalm)
|
||||
if (danger_level < 1 && atmosalm >= 1)
|
||||
//closing the doors on red and opening on green provides a bit of hysteresis that will hopefully prevent fire doors from opening and closing repeatedly due to noise
|
||||
air_doors_open()
|
||||
for(var/obj/machinery/light/L in src)
|
||||
L.reset_alert()
|
||||
else if (danger_level >= 2 && atmosalm < 2)
|
||||
air_doors_close()
|
||||
for(var/obj/machinery/light/L in src)
|
||||
L.set_alert_atmos()
|
||||
|
||||
atmosalm = danger_level
|
||||
//closing the doors on red and opening on green provides a bit of hysteresis that will hopefully prevent fire doors from opening and closing repeatedly due to noise
|
||||
if (danger_level < 1 || danger_level >= 2)
|
||||
firedoors_update()
|
||||
|
||||
for (var/obj/machinery/alarm/AA in src)
|
||||
AA.update_icon()
|
||||
|
||||
return 1
|
||||
return 0
|
||||
|
||||
/area/proc/air_doors_close()
|
||||
if(!air_doors_activated)
|
||||
air_doors_activated = 1
|
||||
// Either close or open firedoors depending on current alert statuses
|
||||
/area/proc/firedoors_update()
|
||||
if(fire || party || atmosalm)
|
||||
firedoors_close()
|
||||
// VOREStation Edit - Make the lights colored!
|
||||
if(fire)
|
||||
for(var/obj/machinery/light/L in src)
|
||||
L.set_alert_fire()
|
||||
else if(atmosalm)
|
||||
for(var/obj/machinery/light/L in src)
|
||||
L.set_alert_atmos()
|
||||
// VOREStation Edit End
|
||||
else
|
||||
firedoors_open()
|
||||
// VOREStation Edit - Put the lights back!
|
||||
for(var/obj/machinery/light/L in src)
|
||||
L.reset_alert()
|
||||
// VOREStation Edit End
|
||||
|
||||
// Close all firedoors in the area
|
||||
/area/proc/firedoors_close()
|
||||
if(!firedoors_closed)
|
||||
firedoors_closed = TRUE
|
||||
for(var/obj/machinery/door/firedoor/E in all_doors)
|
||||
if(!E.blocked)
|
||||
if(E.operating)
|
||||
@@ -81,9 +95,10 @@
|
||||
spawn(0)
|
||||
E.close()
|
||||
|
||||
/area/proc/air_doors_open()
|
||||
if(air_doors_activated)
|
||||
air_doors_activated = 0
|
||||
// Open all firedoors in the area
|
||||
/area/proc/firedoors_open()
|
||||
if(firedoors_closed)
|
||||
firedoors_closed = FALSE
|
||||
for(var/obj/machinery/door/firedoor/E in all_doors)
|
||||
if(!E.blocked)
|
||||
if(E.operating)
|
||||
@@ -97,31 +112,13 @@
|
||||
if(!fire)
|
||||
fire = 1 //used for firedoor checks
|
||||
updateicon()
|
||||
mouse_opacity = 0
|
||||
for(var/obj/machinery/door/firedoor/D in all_doors)
|
||||
if(!D.blocked)
|
||||
if(D.operating)
|
||||
D.nextstate = FIREDOOR_CLOSED
|
||||
else if(!D.density)
|
||||
spawn()
|
||||
D.close()
|
||||
for(var/obj/machinery/light/L in src)
|
||||
L.set_alert_fire()
|
||||
firedoors_update()
|
||||
|
||||
/area/proc/fire_reset()
|
||||
if (fire)
|
||||
fire = 0 //used for firedoor checks
|
||||
updateicon()
|
||||
mouse_opacity = 0
|
||||
for(var/obj/machinery/door/firedoor/D in all_doors)
|
||||
if(!D.blocked)
|
||||
if(D.operating)
|
||||
D.nextstate = FIREDOOR_OPEN
|
||||
else if(D.density)
|
||||
spawn(0)
|
||||
D.open()
|
||||
for(var/obj/machinery/light/L in src)
|
||||
L.reset_alert()
|
||||
firedoors_update()
|
||||
|
||||
/area/proc/readyalert()
|
||||
if(!eject)
|
||||
@@ -139,21 +136,14 @@
|
||||
if (!( party ))
|
||||
party = 1
|
||||
updateicon()
|
||||
mouse_opacity = 0
|
||||
firedoors_update()
|
||||
return
|
||||
|
||||
/area/proc/partyreset()
|
||||
if (party)
|
||||
party = 0
|
||||
mouse_opacity = 0
|
||||
updateicon()
|
||||
for(var/obj/machinery/door/firedoor/D in src)
|
||||
if(!D.blocked)
|
||||
if(D.operating)
|
||||
D.nextstate = FIREDOOR_OPEN
|
||||
else if(D.density)
|
||||
spawn(0)
|
||||
D.open()
|
||||
firedoors_update()
|
||||
return
|
||||
|
||||
/area/proc/updateicon()
|
||||
|
||||
@@ -21,6 +21,7 @@ var/global/list/possible_changeling_IDs = list("Alpha","Beta","Gamma","Delta","E
|
||||
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/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)
|
||||
..()
|
||||
@@ -156,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 ;_;
|
||||
//////////
|
||||
|
||||
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)
|
||||
if(M.loc == src.loc)
|
||||
return 1 //target and source are in the same thing
|
||||
@@ -163,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>"
|
||||
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
|
||||
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>"
|
||||
return 0
|
||||
return 1
|
||||
|
||||
@@ -32,7 +32,7 @@
|
||||
return 1
|
||||
|
||||
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
|
||||
|
||||
var/obj/item/clothing/suit/A = new armor_type(src)
|
||||
@@ -140,7 +140,7 @@
|
||||
playsound(src, 'sound/effects/blobattack.ogg', 30, 1)
|
||||
M.update_icons()
|
||||
success = 1
|
||||
sleep(20)
|
||||
sleep(1 SECOND)
|
||||
|
||||
t = stuff_to_equip["w_uniform"]
|
||||
if(!M.w_uniform && t)
|
||||
@@ -150,7 +150,7 @@
|
||||
playsound(src, 'sound/effects/blobattack.ogg', 30, 1)
|
||||
M.update_icons()
|
||||
success = 1
|
||||
sleep(20)
|
||||
sleep(1 SECOND)
|
||||
|
||||
t = stuff_to_equip["gloves"]
|
||||
if(!M.gloves && t)
|
||||
@@ -160,7 +160,7 @@
|
||||
playsound(src, 'sound/effects/splat.ogg', 30, 1)
|
||||
M.update_icons()
|
||||
success = 1
|
||||
sleep(20)
|
||||
sleep(1 SECOND)
|
||||
|
||||
t = stuff_to_equip["shoes"]
|
||||
if(!M.shoes && t)
|
||||
@@ -170,7 +170,7 @@
|
||||
playsound(src, 'sound/effects/splat.ogg', 30, 1)
|
||||
M.update_icons()
|
||||
success = 1
|
||||
sleep(20)
|
||||
sleep(1 SECOND)
|
||||
|
||||
t = stuff_to_equip["belt"]
|
||||
if(!M.belt && t)
|
||||
@@ -180,7 +180,7 @@
|
||||
playsound(src, 'sound/effects/splat.ogg', 30, 1)
|
||||
M.update_icons()
|
||||
success = 1
|
||||
sleep(20)
|
||||
sleep(1 SECOND)
|
||||
|
||||
t = stuff_to_equip["glasses"]
|
||||
if(!M.glasses && t)
|
||||
@@ -190,7 +190,7 @@
|
||||
playsound(src, 'sound/effects/splat.ogg', 30, 1)
|
||||
M.update_icons()
|
||||
success = 1
|
||||
sleep(20)
|
||||
sleep(1 SECOND)
|
||||
|
||||
t = stuff_to_equip["wear_mask"]
|
||||
if(!M.wear_mask && t)
|
||||
@@ -200,7 +200,7 @@
|
||||
playsound(src, 'sound/effects/splat.ogg', 30, 1)
|
||||
M.update_icons()
|
||||
success = 1
|
||||
sleep(20)
|
||||
sleep(1 SECOND)
|
||||
|
||||
t = stuff_to_equip["back"]
|
||||
if(!M.back && t)
|
||||
@@ -210,7 +210,7 @@
|
||||
playsound(src, 'sound/effects/blobattack.ogg', 30, 1)
|
||||
M.update_icons()
|
||||
success = 1
|
||||
sleep(20)
|
||||
sleep(1 SECOND)
|
||||
|
||||
t = stuff_to_equip["wear_suit"]
|
||||
if(!M.wear_suit && t)
|
||||
@@ -220,7 +220,7 @@
|
||||
playsound(src, 'sound/effects/blobattack.ogg', 30, 1)
|
||||
M.update_icons()
|
||||
success = 1
|
||||
sleep(20)
|
||||
sleep(1 SECOND)
|
||||
|
||||
t = stuff_to_equip["wear_id"]
|
||||
if(!M.wear_id && t)
|
||||
@@ -230,7 +230,7 @@
|
||||
playsound(src, 'sound/effects/splat.ogg', 30, 1)
|
||||
M.update_icons()
|
||||
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 = "" )
|
||||
|
||||
|
||||
@@ -18,11 +18,11 @@
|
||||
if(!changeling)
|
||||
return 0
|
||||
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
|
||||
if(src.mind.changeling.recursive_enhancement)
|
||||
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
|
||||
src.verbs -= /mob/proc/changeling_boost_range
|
||||
spawn(5)
|
||||
|
||||
@@ -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. \
|
||||
To remove our new fabricated clothing, use this ability again."
|
||||
ability_icon_state = "ling_fabricate_clothing"
|
||||
genomecost = 2
|
||||
genomecost = 1
|
||||
verbpath = /mob/proc/changeling_fabricate_clothing
|
||||
|
||||
//Grows biological versions of chameleon clothes.
|
||||
|
||||
@@ -12,7 +12,7 @@
|
||||
set category = "Changeling"
|
||||
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)
|
||||
return
|
||||
|
||||
@@ -28,6 +28,7 @@
|
||||
|
||||
C.update_canmove()
|
||||
C.remove_changeling_powers()
|
||||
changeling.chem_charges -= CHANGELING_STASIS_COST
|
||||
|
||||
if(C.suiciding)
|
||||
C.suiciding = 0
|
||||
@@ -35,7 +36,9 @@
|
||||
if(C.stat != DEAD)
|
||||
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
|
||||
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>"
|
||||
|
||||
@@ -29,6 +29,3 @@
|
||||
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])")
|
||||
|
||||
//Now to lose the verb, so no unlimited resets.
|
||||
|
||||
|
||||
@@ -41,6 +41,10 @@
|
||||
current_limb.undislocate()
|
||||
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.shock_stage = 0 //Pain
|
||||
C << "<span class='notice'>We have regenerated.</span>"
|
||||
@@ -48,8 +52,12 @@
|
||||
C.mind.changeling.purchased_powers -= C
|
||||
feedback_add_details("changeling_powers","CR")
|
||||
C.stat = CONSCIOUS
|
||||
C.forbid_seeing_deadchat = FALSE
|
||||
C.timeofdeath = null
|
||||
src.verbs -= /mob/proc/changeling_revive
|
||||
// re-add our changeling powers
|
||||
C.make_changeling()
|
||||
|
||||
|
||||
|
||||
return 1
|
||||
@@ -35,6 +35,14 @@
|
||||
src << "<span class='danger'>You can't speak!</span>"
|
||||
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
|
||||
|
||||
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>).")
|
||||
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))
|
||||
if(iscarbon(M))
|
||||
if(!M.mind || !M.mind.changeling)
|
||||
@@ -73,11 +83,7 @@
|
||||
L.on = 1
|
||||
L.broken()
|
||||
|
||||
/* src.verbs -= /mob/proc/changeling_resonant_shriek
|
||||
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 */
|
||||
changeling.last_shriek = world.time
|
||||
|
||||
feedback_add_details("changeling_powers","RS")
|
||||
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>"
|
||||
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
|
||||
|
||||
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.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>")
|
||||
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.")
|
||||
@@ -126,9 +142,6 @@ Ability Cooldowns don't work properly right now, need to redo this when they are
|
||||
L.broken()
|
||||
empulse(get_turf(src), range_heavy, range_light, 1)
|
||||
|
||||
/* src.verbs -= /mob/proc/changeling_dissonant_shriek
|
||||
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 */
|
||||
changeling.last_shriek = world.time
|
||||
|
||||
return 1
|
||||
@@ -13,6 +13,10 @@
|
||||
var/datum/changeling/changeling = changeling_power(5,1,0)
|
||||
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()
|
||||
for(var/datum/absorbed_dna/DNA in changeling.absorbed_dna)
|
||||
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. \
|
||||
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."
|
||||
enhancedtext = "True invisiblity while cloaked."
|
||||
enhancedtext = "Can run while hidden."
|
||||
ability_icon_state = "ling_camoflage"
|
||||
genomecost = 3
|
||||
verbpath = /mob/proc/changeling_visible_camouflage
|
||||
@@ -31,20 +31,35 @@
|
||||
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.set_m_intent("walk")
|
||||
H.mind.changeling.cloaked = 1
|
||||
H.mind.changeling.chem_recharge_rate = 0
|
||||
animate(src,alpha = 255, alpha = 10, time = 10)
|
||||
|
||||
var/must_walk = TRUE
|
||||
if(src.mind.changeling.recursive_enhancement)
|
||||
H.invisibility = INVISIBILITY_OBSERVER
|
||||
src << "<span class='notice'>We are now truly invisible.</span>"
|
||||
must_walk = FALSE
|
||||
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.
|
||||
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.
|
||||
sleep(10)
|
||||
|
||||
|
||||
|
||||
H.invisibility = initial(invisibility)
|
||||
|
||||
@@ -59,7 +59,7 @@ var/global/list/Holiday = list() //Holidays are lists now, so we can have more t
|
||||
if(14)
|
||||
Holiday["Pi Day"] = "An unoffical holiday celebrating the mathematical constant Pi. It is celebrated on \
|
||||
March 14th, as the digits form 3 14, the first three significant digits of Pi. Observance of Pi Day generally \
|
||||
imvolve eating (or throwing) pie, due to a pun. Pies also tend to be round, and thus relatable to Pi."
|
||||
involve eating (or throwing) pie, due to a pun. Pies also tend to be round, and thus relatable to Pi."
|
||||
if(17)
|
||||
Holiday["St. Patrick's Day"] = "An old holiday originating from Earth, Sol, celebrating the color green, \
|
||||
shamrocks, attending parades, and drinking alcohol."
|
||||
@@ -93,6 +93,12 @@ var/global/list/Holiday = list() //Holidays are lists now, so we can have more t
|
||||
switch(DD)
|
||||
if(1)
|
||||
Holiday["Interstellar Workers' Day"] = "This holiday celebrates the work of laborers and the working class."
|
||||
if(18)
|
||||
Holiday["Remembrance Day"] = "Remembrance Day (or, as it is more informally known, Armistice Day) is a confederation-wide holiday \
|
||||
mostly observed by its member states since late 2520. Officially, it is a day of remembering the men and women who died in various armed conflicts \
|
||||
throughout human history. Unofficially, however, it is commonly treated as a holiday honoring the victims of the Human-Unathi war. \
|
||||
Observance of this day varies throughout human space, but most common traditions are the act of bringing flowers to graves,\
|
||||
attending parades, and the wearing of poppies (either paper or real) in one's clothing."
|
||||
if(28)
|
||||
Holiday["Jiql-tes"] = "A Skrellian holiday that translates to 'Day of Celebration', Skrell communities \
|
||||
gather for a grand feast and give gifts to friends and close relatives."
|
||||
@@ -105,6 +111,9 @@ var/global/list/Holiday = list() //Holidays are lists now, so we can have more t
|
||||
if(14)
|
||||
Holiday["Blood Donor Day"] = "This holiday was created to raise awareness of the need for safe blood and blood products, \
|
||||
and to thank blood donors for their voluntary, life-saving gifts of blood."
|
||||
if(20)
|
||||
Holiday["Civil Servant's Day"] = "Civil Servant's Day is a holiday observed in SCG member states that honors civil servants everywhere,\
|
||||
+ (especially those who are members of the armed forces and the emergency services), or have been or have been civil servants in the past."
|
||||
|
||||
if(7) //Jul
|
||||
switch(DD)
|
||||
|
||||
@@ -7,9 +7,9 @@ var/global/list/obj/cortical_stacks = list() //Stacks for 'leave nobody behind'
|
||||
/datum/game_mode/heist
|
||||
name = "Heist"
|
||||
config_tag = "heist"
|
||||
required_players = 8
|
||||
required_players_secret = 8
|
||||
required_enemies = 3
|
||||
required_players = 15
|
||||
required_players_secret = 15
|
||||
required_enemies = 4
|
||||
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 \
|
||||
station to be a highly valuable target for many competing organizations and individuals. Being a \
|
||||
@@ -17,10 +17,3 @@ var/global/list/obj/cortical_stacks = list() //Stacks for 'leave nobody behind'
|
||||
attempts of robbery, fraud and other malicious actions."
|
||||
end_on_antag_death = 0
|
||||
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 \
|
||||
attempts of robbery, fraud and other malicious actions."
|
||||
config_tag = "mercenary"
|
||||
required_players = 8
|
||||
required_players_secret = 8
|
||||
required_enemies = 3
|
||||
required_players = 15
|
||||
required_players_secret = 15
|
||||
required_enemies = 4
|
||||
end_on_antag_death = 0
|
||||
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
|
||||
|
||||
@@ -30,7 +30,7 @@
|
||||
|
||||
/obj/item/weapon/antag_spawner/technomancer_apprentice/New()
|
||||
..()
|
||||
sparks = PoolOrNew(/datum/effect/effect/system/spark_spread)
|
||||
sparks = new /datum/effect/effect/system/spark_spread()
|
||||
sparks.set_up(5, 0, src)
|
||||
sparks.attach(loc)
|
||||
|
||||
|
||||
@@ -5,12 +5,11 @@
|
||||
amount_per_transfer_from_this = 15
|
||||
volume = 15
|
||||
origin_tech = list(TECH_BIO = 4)
|
||||
filled_reagents = list("inaprovaline" = 15)
|
||||
|
||||
/obj/item/weapon/reagent_containers/hypospray/autoinjector/biginjector/New()
|
||||
..()
|
||||
reagents.remove_reagent("inaprovaline", 5)
|
||||
update_icon()
|
||||
return
|
||||
|
||||
|
||||
/datum/technomancer/consumable/hypo_brute
|
||||
name = "Trauma Hypo"
|
||||
@@ -66,127 +65,44 @@
|
||||
name = "trauma hypo"
|
||||
desc = "A refined version of the standard autoinjector, allowing greater capacity. This one is made to be used on victims of \
|
||||
moderate blunt trauma."
|
||||
icon_state = "autoinjector"
|
||||
amount_per_transfer_from_this = 15
|
||||
volume = 15
|
||||
origin_tech = list(TECH_BIO = 4)
|
||||
|
||||
/obj/item/weapon/reagent_containers/hypospray/autoinjector/biginjector/brute/New()
|
||||
..()
|
||||
reagents.add_reagent("bicaridine", 15)
|
||||
update_icon()
|
||||
return
|
||||
filled_reagents = list("bicaridine" = 15)
|
||||
|
||||
/obj/item/weapon/reagent_containers/hypospray/autoinjector/biginjector/burn
|
||||
name = "burn hypo"
|
||||
desc = "A refined version of the standard autoinjector, allowing greater capacity. This one is made to be used on burn victims, \
|
||||
featuring an optimized chemical mixture to allow for rapid healing."
|
||||
icon_state = "autoinjector"
|
||||
amount_per_transfer_from_this = 15
|
||||
volume = 15
|
||||
origin_tech = list(TECH_BIO = 4)
|
||||
|
||||
/obj/item/weapon/reagent_containers/hypospray/autoinjector/biginjector/burn/New()
|
||||
..()
|
||||
reagents.add_reagent("kelotane", 7.5)
|
||||
reagents.add_reagent("dermaline", 7.5)
|
||||
update_icon()
|
||||
return
|
||||
filled_reagents = list("kelotane" = 7.5, "dermaline" = 7.5)
|
||||
|
||||
/obj/item/weapon/reagent_containers/hypospray/autoinjector/biginjector/toxin
|
||||
name = "toxin hypo"
|
||||
desc = "A refined version of the standard autoinjector, allowing greater capacity. This one is made to counteract toxins."
|
||||
icon_state = "autoinjector"
|
||||
amount_per_transfer_from_this = 15
|
||||
volume = 15
|
||||
origin_tech = list(TECH_BIO = 4)
|
||||
|
||||
/obj/item/weapon/reagent_containers/hypospray/autoinjector/biginjector/toxin/New()
|
||||
..()
|
||||
reagents.add_reagent("anti_toxin", 15)
|
||||
update_icon()
|
||||
return
|
||||
filled_reagents = list("anti_toxin" = 15)
|
||||
|
||||
/obj/item/weapon/reagent_containers/hypospray/autoinjector/biginjector/oxy
|
||||
name = "oxy hypo"
|
||||
desc = "A refined version of the standard autoinjector, allowing greater capacity. This one is made to counteract oxygen \
|
||||
deprivation."
|
||||
icon_state = "autoinjector"
|
||||
amount_per_transfer_from_this = 15
|
||||
volume = 15
|
||||
origin_tech = list(TECH_BIO = 4)
|
||||
|
||||
/obj/item/weapon/reagent_containers/hypospray/autoinjector/biginjector/oxy/New()
|
||||
..()
|
||||
reagents.add_reagent("dexalinp", 10)
|
||||
reagents.add_reagent("tricordrazine", 5) //Dex+ ODs above 10, so we add tricord to pad it out somewhat.
|
||||
update_icon()
|
||||
return
|
||||
filled_reagents = list("dexalinp" = 10, "tricordrazine" = 5)
|
||||
|
||||
/obj/item/weapon/reagent_containers/hypospray/autoinjector/biginjector/purity
|
||||
name = "purity hypo"
|
||||
desc = "A refined version of the standard autoinjector, allowing greater capacity. This varient excels at \
|
||||
resolving viruses, infections, radiation, and genetic maladies."
|
||||
icon_state = "autoinjector"
|
||||
amount_per_transfer_from_this = 15
|
||||
volume = 15
|
||||
origin_tech = list(TECH_BIO = 4)
|
||||
|
||||
/obj/item/weapon/reagent_containers/hypospray/autoinjector/biginjector/purity/New()
|
||||
..()
|
||||
reagents.add_reagent("spaceacillin", 9)
|
||||
reagents.add_reagent("arithrazine", 5)
|
||||
reagents.add_reagent("ryetalyn", 1)
|
||||
update_icon()
|
||||
return
|
||||
filled_reagents = list("spaceacillin" = 9, "arithrazine" = 5, "ryetalyn" = 1)
|
||||
|
||||
/obj/item/weapon/reagent_containers/hypospray/autoinjector/biginjector/pain
|
||||
name = "pain hypo"
|
||||
desc = "A refined version of the standard autoinjector, allowing greater capacity. This one contains potent painkillers."
|
||||
icon_state = "autoinjector"
|
||||
amount_per_transfer_from_this = 15
|
||||
volume = 15
|
||||
origin_tech = list(TECH_BIO = 4)
|
||||
|
||||
/obj/item/weapon/reagent_containers/hypospray/autoinjector/biginjector/pain/New()
|
||||
..()
|
||||
reagents.add_reagent("tramadol", 15)
|
||||
update_icon()
|
||||
return
|
||||
filled_reagents = list("tramadol" = 15)
|
||||
|
||||
/obj/item/weapon/reagent_containers/hypospray/autoinjector/biginjector/organ
|
||||
name = "organ hypo"
|
||||
desc = "A refined version of the standard autoinjector, allowing greater capacity. Organ damage is resolved by this varient."
|
||||
icon_state = "autoinjector"
|
||||
amount_per_transfer_from_this = 15
|
||||
volume = 15
|
||||
origin_tech = list(TECH_BIO = 4)
|
||||
|
||||
/obj/item/weapon/reagent_containers/hypospray/autoinjector/biginjector/organ/New()
|
||||
..()
|
||||
reagents.add_reagent("alkysine", 1)
|
||||
reagents.add_reagent("imidazoline", 1)
|
||||
reagents.add_reagent("peridaxon", 13)
|
||||
update_icon()
|
||||
return
|
||||
filled_reagents = list("alkysine" = 1, "imidazoline" = 1, "peridaxon" = 13)
|
||||
|
||||
/obj/item/weapon/reagent_containers/hypospray/autoinjector/biginjector/combat
|
||||
name = "combat hypo"
|
||||
desc = "A refined version of the standard autoinjector, allowing greater capacity. This is a more dangerous and potentially \
|
||||
addictive hypo compared to others, as it contains a potent cocktail of various chemicals to optimize the recipient's combat \
|
||||
ability."
|
||||
icon_state = "autoinjector"
|
||||
amount_per_transfer_from_this = 15
|
||||
volume = 15
|
||||
origin_tech = list(TECH_BIO = 4)
|
||||
|
||||
/obj/item/weapon/reagent_containers/hypospray/autoinjector/biginjector/combat/New()
|
||||
..()
|
||||
reagents.add_reagent("bicaridine", 3)
|
||||
reagents.add_reagent("kelotane", 1.5)
|
||||
reagents.add_reagent("dermaline", 1.5)
|
||||
reagents.add_reagent("oxycodone", 3)
|
||||
reagents.add_reagent("hyperzine", 3)
|
||||
reagents.add_reagent("tricordrazine", 3)
|
||||
update_icon()
|
||||
return
|
||||
filled_reagents = list("bicaridine" = 3, "kelotane" = 1.5, "dermaline" = 1.5, "oxycodone" = 3, "hyperzine" = 3, "tricordrazine" = 3)
|
||||
|
||||
@@ -26,7 +26,7 @@
|
||||
|
||||
/obj/item/clothing/suit/armor/shield/New()
|
||||
..()
|
||||
spark_system = PoolOrNew(/datum/effect/effect/system/spark_spread)
|
||||
spark_system = new /datum/effect/effect/system/spark_spread()
|
||||
spark_system.set_up(5, 0, src)
|
||||
|
||||
/obj/item/clothing/suit/armor/shield/Destroy()
|
||||
|
||||
@@ -191,6 +191,7 @@
|
||||
icon_state = "scepter"
|
||||
force = 15
|
||||
slot_flags = SLOT_BELT
|
||||
attack_verb = list("beaten", "smashed", "struck", "whacked")
|
||||
|
||||
/obj/item/weapon/scepter/attack_self(mob/living/carbon/human/user)
|
||||
var/obj/item/item_to_test = user.get_other_hand(src)
|
||||
|
||||
@@ -102,7 +102,7 @@
|
||||
rng = rand(0,1)
|
||||
switch(rng)
|
||||
if(0)
|
||||
var/datum/effect/effect/system/spark_spread/sparks = PoolOrNew(/datum/effect/effect/system/spark_spread)
|
||||
var/datum/effect/effect/system/spark_spread/sparks = new /datum/effect/effect/system/spark_spread()
|
||||
sparks.set_up(5, 0, src)
|
||||
sparks.attach(loc)
|
||||
sparks.start()
|
||||
@@ -167,10 +167,10 @@
|
||||
rng = rand(0,1)
|
||||
switch(rng)
|
||||
if(0)
|
||||
var/datum/effect/effect/system/spark_spread/sparks = PoolOrNew(/datum/effect/effect/system/spark_spread)
|
||||
var/datum/effect/effect/system/spark_spread/sparks = new /datum/effect/effect/system/spark_spread()
|
||||
sparks.set_up(5, 0, src)
|
||||
sparks.attach(loc)
|
||||
// var/datum/effect/effect/system/spark_spread/spark_system = PoolOrNew(/datum/effect/effect/system/spark_spread)
|
||||
// var/datum/effect/effect/system/spark_spread/spark_system = new /datum/effect/effect/system/spark_spread()
|
||||
// spark_system.set_up(5, 0, get_turf(src))
|
||||
// spark_system.attach(src)
|
||||
sparks.start()
|
||||
@@ -285,4 +285,4 @@
|
||||
to_chat(H, "<span class='warning'>The purple glow makes you feel strange...</span>")
|
||||
H.adjust_instability(outgoing_instability)
|
||||
|
||||
set_light(distance, distance * 2, l_color = "#C26DDE")
|
||||
set_light(distance, distance * 4, l_color = "#C26DDE")
|
||||
|
||||
@@ -247,7 +247,7 @@
|
||||
if(!path || !ispath(path))
|
||||
return 0
|
||||
|
||||
//var/obj/item/weapon/spell/S = PoolOrNew(path, src)
|
||||
//var/obj/item/weapon/spell/S = new path(src)
|
||||
var/obj/item/weapon/spell/S = new path(src)
|
||||
|
||||
//No hands needed for innate casts.
|
||||
|
||||
@@ -24,7 +24,7 @@
|
||||
spawn(1)
|
||||
var/turf/desired_turf = get_step(T,direction)
|
||||
if(desired_turf) // This shouldn't fail but...
|
||||
var/obj/effect/effect/water/W = PoolOrNew(/obj/effect/effect/water, get_turf(T))
|
||||
var/obj/effect/effect/water/W = new /obj/effect/effect/water(get_turf(T))
|
||||
W.create_reagents(60)
|
||||
W.reagents.add_reagent(id = "water", amount = 60, data = null, safety = 0)
|
||||
W.set_color()
|
||||
|
||||
@@ -21,5 +21,6 @@
|
||||
for(var/obj/item/weapon/inserted_spell/I in target)
|
||||
I.on_expire(dispelled = 1)
|
||||
log_and_message_admins("dispelled [I] on [target].")
|
||||
target.remove_modifiers_of_type(/datum/modifier/technomancer)
|
||||
user.adjust_instability(10)
|
||||
qdel(src)
|
||||
@@ -93,6 +93,9 @@
|
||||
var/walking = 0
|
||||
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)
|
||||
if(!thing_to_copy)
|
||||
return 0
|
||||
|
||||
@@ -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
|
||||
@@ -39,7 +39,7 @@
|
||||
visible_message("<span class='info'>[user] rests a hand on \the [hit_atom].</span>")
|
||||
busy = 1
|
||||
|
||||
var/datum/effect/effect/system/spark_spread/spark_system = PoolOrNew(/datum/effect/effect/system/spark_spread)
|
||||
var/datum/effect/effect/system/spark_spread/spark_system = new /datum/effect/effect/system/spark_spread()
|
||||
spark_system.set_up(5, 0, our_turf)
|
||||
|
||||
while(i)
|
||||
|
||||
@@ -19,7 +19,7 @@
|
||||
/obj/item/weapon/spell/reflect/New()
|
||||
..()
|
||||
set_light(3, 2, l_color = "#006AFF")
|
||||
spark_system = PoolOrNew(/datum/effect/effect/system/spark_spread)
|
||||
spark_system = new /datum/effect/effect/system/spark_spread()
|
||||
spark_system.set_up(5, 0, src)
|
||||
owner << "<span class='notice'>Your shield will expire in 3 seconds!</span>"
|
||||
spawn(5 SECONDS)
|
||||
|
||||
@@ -21,7 +21,7 @@
|
||||
/obj/item/weapon/spell/shield/New()
|
||||
..()
|
||||
set_light(3, 2, l_color = "#006AFF")
|
||||
spark_system = PoolOrNew(/datum/effect/effect/system/spark_spread)
|
||||
spark_system = new /datum/effect/effect/system/spark_spread()
|
||||
spark_system.set_up(5, 0, src)
|
||||
|
||||
/obj/item/weapon/spell/shield/Destroy()
|
||||
|
||||
@@ -20,10 +20,10 @@
|
||||
|
||||
/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
|
||||
name = "darkness"
|
||||
time_to_die = 2 MINUTES
|
||||
new_light_range = 6
|
||||
new_light_power = -5
|
||||
new_light_power = -20
|
||||
@@ -16,7 +16,7 @@
|
||||
|
||||
/obj/item/weapon/spell/warp_strike/New()
|
||||
..()
|
||||
sparks = PoolOrNew(/datum/effect/effect/system/spark_spread)
|
||||
sparks = new /datum/effect/effect/system/spark_spread()
|
||||
sparks.set_up(5, 0, src)
|
||||
sparks.attach(loc)
|
||||
|
||||
|
||||
@@ -266,6 +266,7 @@
|
||||
economic_modifier = 7
|
||||
access = list(access_lawyer, access_sec_doors, access_maint_tunnels, access_heads)
|
||||
minimal_access = list(access_lawyer, access_sec_doors, access_heads)
|
||||
minimal_player_age = 7
|
||||
|
||||
|
||||
/datum/job/lawyer/equip(var/mob/living/carbon/human/H, var/alt_title)
|
||||
|
||||
@@ -68,10 +68,12 @@
|
||||
anchored = 1
|
||||
circuit = /obj/item/weapon/circuitboard/sleeper
|
||||
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/filtering = 0
|
||||
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
|
||||
idle_power_usage = 15
|
||||
@@ -98,6 +100,10 @@
|
||||
/obj/machinery/sleeper/process()
|
||||
if(stat & (NOPOWER|BROKEN))
|
||||
return
|
||||
if(occupant)
|
||||
occupant.Stasis(stasis_level)
|
||||
if(stasis_level >= 100 && occupant.timeofdeath)
|
||||
occupant.timeofdeath += 1 SECOND
|
||||
|
||||
if(filtering > 0)
|
||||
if(beaker)
|
||||
@@ -111,6 +117,7 @@
|
||||
else
|
||||
toggle_filter()
|
||||
|
||||
|
||||
/obj/machinery/sleeper/update_icon()
|
||||
icon_state = "sleeper_[occupant ? "1" : "0"]"
|
||||
|
||||
@@ -154,6 +161,13 @@
|
||||
data["beaker"] = -1
|
||||
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)
|
||||
if(!ui)
|
||||
ui = new(user, src, ui_key, "sleeper.tmpl", "Sleeper UI", 600, 600, state = state)
|
||||
@@ -182,12 +196,20 @@
|
||||
if(occupant && occupant.stat != DEAD)
|
||||
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"]))
|
||||
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
|
||||
|
||||
/obj/machinery/sleeper/attackby(var/obj/item/I, var/mob/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
|
||||
else if(default_deconstruction_crowbar(user, I))
|
||||
return
|
||||
@@ -201,6 +223,28 @@
|
||||
user << "<span class='warning'>\The [src] has a beaker already.</span>"
|
||||
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)
|
||||
if(user.stat || user.lying || !Adjacent(user) || !target.Adjacent(user)|| !ishuman(target))
|
||||
return
|
||||
@@ -261,6 +305,7 @@
|
||||
if(occupant.client)
|
||||
occupant.client.eye = occupant.client.mob
|
||||
occupant.client.perspective = MOB_PERSPECTIVE
|
||||
occupant.Stasis(0)
|
||||
occupant.loc = src.loc
|
||||
occupant = null
|
||||
for(var/atom/movable/A in src) // In case an object was dropped inside or something
|
||||
|
||||
@@ -305,6 +305,15 @@
|
||||
|
||||
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]
|
||||
for(var/obj/item/organ/external/E in H.organs)
|
||||
var/organData[0]
|
||||
@@ -398,7 +407,7 @@
|
||||
P.info += "<b>Time of scan:</b> [worldtime2stationtime(world.time)]<br><br>"
|
||||
P.info += "[printing_text]"
|
||||
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_text = null
|
||||
|
||||
@@ -461,9 +470,13 @@
|
||||
dat += "[extra_font]\tBlood Level %: [blood_percent] ([blood_volume] units)</font><br>"
|
||||
|
||||
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>"
|
||||
|
||||
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 += "<tr>"
|
||||
dat += "<th>Organ</th>"
|
||||
|
||||
@@ -720,9 +720,9 @@
|
||||
if(href_list["atmos_unlock"])
|
||||
switch(href_list["atmos_unlock"])
|
||||
if("0")
|
||||
alarm_area.air_doors_close()
|
||||
alarm_area.firedoors_close()
|
||||
if("1")
|
||||
alarm_area.air_doors_open()
|
||||
alarm_area.firedoors_open()
|
||||
return 1
|
||||
|
||||
if(href_list["atmos_alarm"])
|
||||
|
||||
@@ -232,6 +232,8 @@ mob/living/proc/near_camera()
|
||||
return TRACKING_TERMINATE
|
||||
if(digitalcamo)
|
||||
return TRACKING_TERMINATE
|
||||
if(alpha < 127) // For lings and possible future alpha-based cloaks.
|
||||
return TRACKING_TERMINATE
|
||||
if(istype(loc,/obj/effect/dummy))
|
||||
return TRACKING_TERMINATE
|
||||
|
||||
|
||||
@@ -548,7 +548,7 @@
|
||||
time_entered = world.time
|
||||
if(ishuman(M) && applies_stasis)
|
||||
var/mob/living/carbon/human/H = M
|
||||
H.in_stasis = 1
|
||||
H.Stasis(1000)
|
||||
|
||||
// Book keeping!
|
||||
var/turf/location = get_turf(src)
|
||||
@@ -616,7 +616,7 @@
|
||||
set_occupant(usr)
|
||||
if(ishuman(usr) && applies_stasis)
|
||||
var/mob/living/carbon/human/H = occupant
|
||||
H.in_stasis = 1
|
||||
H.Stasis(1000)
|
||||
|
||||
icon_state = occupied_icon_state
|
||||
|
||||
@@ -652,7 +652,7 @@
|
||||
occupant.forceMove(get_turf(src))
|
||||
if(ishuman(occupant) && applies_stasis)
|
||||
var/mob/living/carbon/human/H = occupant
|
||||
H.in_stasis = 0
|
||||
H.Stasis(0)
|
||||
set_occupant(null)
|
||||
|
||||
icon_state = base_icon_state
|
||||
|
||||
@@ -237,7 +237,7 @@ for reference:
|
||||
var/turf/Tsec = get_turf(src)
|
||||
|
||||
/* var/obj/item/stack/rods/ =*/
|
||||
PoolOrNew(/obj/item/stack/rods, Tsec)
|
||||
new /obj/item/stack/rods(Tsec)
|
||||
|
||||
var/datum/effect/effect/system/spark_spread/s = new /datum/effect/effect/system/spark_spread
|
||||
s.set_up(3, 1, src)
|
||||
|
||||
@@ -839,7 +839,7 @@ About the new airlock wires panel:
|
||||
src.welded = 1
|
||||
else
|
||||
src.welded = null
|
||||
playsound(src, 'sound/items/Welder.ogg', 100, 1)
|
||||
playsound(src, 'sound/items/Welder.ogg', 75, 1)
|
||||
src.update_icon()
|
||||
return
|
||||
else
|
||||
@@ -864,7 +864,7 @@ About the new airlock wires panel:
|
||||
cable.plugin(src, user)
|
||||
else if(!repairing && istype(C, /obj/item/weapon/crowbar))
|
||||
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.")
|
||||
if(do_after(user,40))
|
||||
to_chat(user,"<span class='notice'>You removed the airlock electronics!</span>")
|
||||
@@ -957,9 +957,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(arePowerSystemsOn())
|
||||
playsound(src.loc, open_sound_powered, 100, 1)
|
||||
playsound(src.loc, open_sound_powered, 75, 1)
|
||||
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)
|
||||
src.closeOther.close()
|
||||
@@ -1054,9 +1054,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
|
||||
has_beeped = 0
|
||||
if(arePowerSystemsOn())
|
||||
playsound(src.loc, open_sound_powered, 100, 1)
|
||||
playsound(src.loc, open_sound_powered, 75, 1)
|
||||
else
|
||||
playsound(src.loc, open_sound_unpowered, 100, 1)
|
||||
playsound(src.loc, open_sound_unpowered, 75, 1)
|
||||
for(var/turf/turf in locs)
|
||||
var/obj/structure/window/killthis = (locate(/obj/structure/window) in turf)
|
||||
if(killthis)
|
||||
|
||||
@@ -164,7 +164,7 @@
|
||||
switch (Proj.damage_type)
|
||||
if(BRUTE)
|
||||
new /obj/item/stack/material/steel(src.loc, 2)
|
||||
PoolOrNew(/obj/item/stack/rods, list(src.loc, 3))
|
||||
new /obj/item/stack/rods(src.loc, 3)
|
||||
if(BURN)
|
||||
new /obj/effect/decal/cleanable/ash(src.loc) // Turn it to ashes!
|
||||
qdel(src)
|
||||
|
||||
@@ -141,7 +141,7 @@
|
||||
|
||||
var/alarmed = lockdown
|
||||
for(var/area/A in areas_added) //Checks if there are fire alarms in any areas associated with that firedoor
|
||||
if(A.fire || A.air_doors_activated)
|
||||
if(A.firedoors_closed)
|
||||
alarmed = 1
|
||||
|
||||
var/answer = alert(user, "Would you like to [density ? "open" : "close"] this [src.name]?[ alarmed && density ? "\nNote that by doing so, you acknowledge any damages from opening this\n[src.name] as being your own fault, and you will be held accountable under the law." : ""]",\
|
||||
@@ -179,7 +179,7 @@
|
||||
spawn(50)
|
||||
alarmed = 0
|
||||
for(var/area/A in areas_added) //Just in case a fire alarm is turned off while the firedoor is going through an autoclose cycle
|
||||
if(A.fire || A.air_doors_activated)
|
||||
if(A.firedoors_closed)
|
||||
alarmed = 1
|
||||
if(alarmed)
|
||||
nextstate = FIREDOOR_CLOSED
|
||||
|
||||
@@ -170,7 +170,7 @@
|
||||
cooking_obj = new /obj/item/weapon/reagent_containers/food/snacks/badrecipe(src)
|
||||
// Produce nasty smoke.
|
||||
visible_message("<span class='danger'>\The [src] vomits a gout of rancid smoke!</span>")
|
||||
var/datum/effect/effect/system/smoke_spread/bad/smoke = PoolOrNew(/datum/effect/effect/system/smoke_spread/bad)
|
||||
var/datum/effect/effect/system/smoke_spread/bad/smoke = new /datum/effect/effect/system/smoke_spread/bad()
|
||||
smoke.attach(src)
|
||||
smoke.set_up(10, 0, usr.loc)
|
||||
smoke.start()
|
||||
|
||||
@@ -155,7 +155,7 @@ Class Procs:
|
||||
if(use_power && stat == 0)
|
||||
use_power(7500/severity)
|
||||
|
||||
var/obj/effect/overlay/pulse2 = PoolOrNew(/obj/effect/overlay, src.loc)
|
||||
var/obj/effect/overlay/pulse2 = new /obj/effect/overlay(src.loc)
|
||||
pulse2.icon = 'icons/effects/effects.dmi'
|
||||
pulse2.icon_state = "empdisable"
|
||||
pulse2.name = "emp sparks"
|
||||
|
||||
@@ -567,7 +567,7 @@ var/list/turret_icons
|
||||
set_raised_raising(raised, 1)
|
||||
update_icon()
|
||||
|
||||
var/atom/flick_holder = PoolOrNew(/atom/movable/porta_turret_cover, loc)
|
||||
var/atom/flick_holder = new /atom/movable/porta_turret_cover(loc)
|
||||
flick_holder.layer = layer + 0.1
|
||||
flick("popup", flick_holder)
|
||||
sleep(10)
|
||||
@@ -588,7 +588,7 @@ var/list/turret_icons
|
||||
set_raised_raising(raised, 1)
|
||||
update_icon()
|
||||
|
||||
var/atom/flick_holder = PoolOrNew(/atom/movable/porta_turret_cover, loc)
|
||||
var/atom/flick_holder = new /atom/movable/porta_turret_cover(loc)
|
||||
flick_holder.layer = layer + 0.1
|
||||
flick("popdown", flick_holder)
|
||||
sleep(10)
|
||||
|
||||
@@ -7,7 +7,7 @@
|
||||
products += list(/obj/item/weapon/gun/energy/taser = 8,/obj/item/weapon/gun/energy/stunrevolver = 4,
|
||||
/obj/item/weapon/reagent_containers/spray/pepper = 6,/obj/item/taperoll/police = 6,
|
||||
/obj/item/weapon/gun/projectile/sec/flash = 4, /obj/item/ammo_magazine/c45m/flash = 8,
|
||||
/obj/item/clothing/glasses/omnihud/sec = 4)
|
||||
/obj/item/clothing/glasses/omnihud/sec = 6)
|
||||
..()
|
||||
|
||||
/obj/machinery/vending/tool/New()
|
||||
@@ -15,12 +15,12 @@
|
||||
..()
|
||||
|
||||
/obj/machinery/vending/engivend/New()
|
||||
products += list(/obj/item/clothing/glasses/omnihud/eng = 4)
|
||||
products += list(/obj/item/clothing/glasses/omnihud/eng = 6)
|
||||
..()
|
||||
|
||||
/obj/machinery/vending/medical/New()
|
||||
products += list(/obj/item/weapon/storage/box/khcrystal = 4,/obj/item/weapon/backup_implanter = 3,
|
||||
/obj/item/clothing/glasses/omnihud/med = 2, /obj/item/device/glasses_kit = 1)
|
||||
/obj/item/clothing/glasses/omnihud/med = 4, /obj/item/device/glasses_kit = 1)
|
||||
..()
|
||||
|
||||
//Custom vendors
|
||||
|
||||
@@ -7,7 +7,7 @@
|
||||
energy_drain = 20
|
||||
range = MELEE
|
||||
equip_cooldown = 50
|
||||
var/mob/living/carbon/occupant = null
|
||||
var/mob/living/carbon/human/occupant = null
|
||||
var/datum/global_iterator/pr_mech_sleeper
|
||||
var/inject_amount = 10
|
||||
required_type = /obj/mecha/medical
|
||||
@@ -28,7 +28,7 @@
|
||||
Exit(atom/movable/O)
|
||||
return 0
|
||||
|
||||
action(var/mob/living/carbon/target)
|
||||
action(var/mob/living/carbon/human/target)
|
||||
if(!action_checks(target))
|
||||
return
|
||||
if(!istype(target))
|
||||
@@ -56,6 +56,7 @@
|
||||
target.forceMove(src)
|
||||
occupant = target
|
||||
target.reset_view(src)
|
||||
occupant.Stasis(3)
|
||||
/*
|
||||
if(target.client)
|
||||
target.client.perspective = EYE_PERSPECTIVE
|
||||
@@ -80,6 +81,7 @@
|
||||
occupant.client.eye = occupant.client.mob
|
||||
occupant.client.perspective = MOB_PERSPECTIVE
|
||||
*/
|
||||
occupant.Stasis(0)
|
||||
occupant = null
|
||||
pr_mech_sleeper.stop()
|
||||
set_ready_state(1)
|
||||
|
||||
@@ -208,7 +208,7 @@
|
||||
|
||||
for(var/a = 1 to 5)
|
||||
spawn(0)
|
||||
var/obj/effect/effect/water/W = PoolOrNew(/obj/effect/effect/water, get_turf(chassis))
|
||||
var/obj/effect/effect/water/W = new /obj/effect/effect/water(get_turf(chassis))
|
||||
var/turf/my_target
|
||||
if(a == 1)
|
||||
my_target = T
|
||||
|
||||
@@ -197,25 +197,25 @@
|
||||
set src in view(1)
|
||||
|
||||
if(!istype(usr, /mob/living/carbon/human)) //Only living, intelligent creatures with hands can empty ore boxes.
|
||||
usr << "\red You are physically incapable of emptying the ore box."
|
||||
to_chat(usr, "<span class='warning'>You are physically incapable of emptying the ore box.</span>")
|
||||
return
|
||||
|
||||
if( usr.stat || usr.restrained() )
|
||||
return
|
||||
|
||||
if(!Adjacent(usr)) //You can only empty the box if you can physically reach it
|
||||
usr << "You cannot reach the ore box."
|
||||
to_chat(usr, "You cannot reach the ore box.")
|
||||
return
|
||||
|
||||
add_fingerprint(usr)
|
||||
|
||||
if(contents.len < 1)
|
||||
usr << "\red The ore box is empty"
|
||||
to_chat(usr, "<span class='warning'>The ore box is empty</span>")
|
||||
return
|
||||
|
||||
for (var/obj/item/weapon/ore/O in contents)
|
||||
contents -= O
|
||||
O.loc = src.loc
|
||||
usr << "\blue You empty the ore box"
|
||||
to_chat(usr, "<span class='info'>You empty the ore box</span>")
|
||||
|
||||
return
|
||||
|
||||
@@ -152,7 +152,7 @@
|
||||
if(passed_smoke)
|
||||
smoke = passed_smoke
|
||||
else
|
||||
smoke = PoolOrNew(/obj/effect/effect/smoke/chem, location)
|
||||
smoke = new /obj/effect/effect/smoke/chem(location)
|
||||
|
||||
if(chemholder.reagents.reagent_list.len)
|
||||
chemholder.reagents.trans_to_obj(smoke, chemholder.reagents.total_volume / dist, copy = 1) //copy reagents to the smoke so mob/breathe() can handle inhaling the reagents
|
||||
@@ -169,7 +169,7 @@
|
||||
qdel(src)
|
||||
|
||||
/datum/effect/effect/system/smoke_spread/chem/spores/spawnSmoke(var/turf/T, var/icon/I, var/dist = 1)
|
||||
var/obj/effect/effect/smoke/chem/spores = PoolOrNew(/obj/effect/effect/smoke/chem, location)
|
||||
var/obj/effect/effect/smoke/chem/spores = new /obj/effect/effect/smoke/chem(location)
|
||||
spores.name = "cloud of [seed.seed_name] [seed.seed_noun]"
|
||||
..(T, I, dist, spores)
|
||||
|
||||
|
||||
@@ -108,7 +108,7 @@
|
||||
F.amount += amount
|
||||
return
|
||||
|
||||
F = PoolOrNew(/obj/effect/effect/foam, list(location, metal))
|
||||
F = new /obj/effect/effect/foam(location, metal)
|
||||
F.amount = amount
|
||||
|
||||
if(!metal) // don't carry other chemicals if a metal foam
|
||||
|
||||
@@ -222,7 +222,7 @@ var/global/list/image/splatter_cache=list()
|
||||
for (var/i = 0, i < pick(1, 200; 2, 150; 3, 50; 4), i++)
|
||||
sleep(3)
|
||||
if (i > 0)
|
||||
var/obj/effect/decal/cleanable/blood/b = PoolOrNew(/obj/effect/decal/cleanable/blood/splatter, src.loc)
|
||||
var/obj/effect/decal/cleanable/blood/b = new /obj/effect/decal/cleanable/blood/splatter(src.loc)
|
||||
b.basecolor = src.basecolor
|
||||
b.update_icon()
|
||||
|
||||
|
||||
@@ -75,7 +75,7 @@ steam.start() -- spawns the effect
|
||||
spawn(0)
|
||||
if(holder)
|
||||
src.location = get_turf(holder)
|
||||
var/obj/effect/effect/steam/steam = PoolOrNew(/obj/effect/effect/steam, src.location)
|
||||
var/obj/effect/effect/steam/steam = new /obj/effect/effect/steam(src.location)
|
||||
var/direction
|
||||
if(src.cardinals)
|
||||
direction = pick(cardinal)
|
||||
@@ -146,7 +146,7 @@ steam.start() -- spawns the effect
|
||||
spawn(0)
|
||||
if(holder)
|
||||
src.location = get_turf(holder)
|
||||
var/obj/effect/effect/sparks/sparks = PoolOrNew(/obj/effect/effect/sparks, src.location)
|
||||
var/obj/effect/effect/sparks/sparks = new /obj/effect/effect/sparks(src.location)
|
||||
src.total_sparks++
|
||||
var/direction
|
||||
if(src.cardinals)
|
||||
@@ -283,7 +283,7 @@ steam.start() -- spawns the effect
|
||||
spawn(0)
|
||||
if(holder)
|
||||
src.location = get_turf(holder)
|
||||
var/obj/effect/effect/smoke/smoke = PoolOrNew(smoke_type, src.location)
|
||||
var/obj/effect/effect/smoke/smoke = new smoke_type(src.location)
|
||||
src.total_smoke++
|
||||
smoke.color = I
|
||||
var/direction = src.direction
|
||||
@@ -334,7 +334,7 @@ steam.start() -- spawns the effect
|
||||
var/turf/T = get_turf(src.holder)
|
||||
if(T != src.oldposition)
|
||||
if(isturf(T))
|
||||
var/obj/effect/effect/ion_trails/I = PoolOrNew(/obj/effect/effect/ion_trails, src.oldposition)
|
||||
var/obj/effect/effect/ion_trails/I = new /obj/effect/effect/ion_trails(src.oldposition)
|
||||
src.oldposition = T
|
||||
I.set_dir(src.holder.dir)
|
||||
flick("ion_fade", I)
|
||||
@@ -380,7 +380,7 @@ steam.start() -- spawns the effect
|
||||
src.processing = 0
|
||||
spawn(0)
|
||||
if(src.number < 3)
|
||||
var/obj/effect/effect/steam/I = PoolOrNew(/obj/effect/effect/steam, src.oldposition)
|
||||
var/obj/effect/effect/steam/I = new /obj/effect/effect/steam(src.oldposition)
|
||||
src.number++
|
||||
src.oldposition = get_turf(holder)
|
||||
I.set_dir(src.holder.dir)
|
||||
@@ -420,7 +420,7 @@ steam.start() -- spawns the effect
|
||||
|
||||
start()
|
||||
if (amount <= 2)
|
||||
var/datum/effect/effect/system/spark_spread/s = PoolOrNew(/datum/effect/effect/system/spark_spread)
|
||||
var/datum/effect/effect/system/spark_spread/s = new /datum/effect/effect/system/spark_spread()
|
||||
s.set_up(2, 1, location)
|
||||
s.start()
|
||||
|
||||
|
||||
@@ -24,7 +24,7 @@
|
||||
var/obj/effect/decal/cleanable/blood/gibs/gib = null
|
||||
|
||||
if(sparks)
|
||||
var/datum/effect/effect/system/spark_spread/s = PoolOrNew(/datum/effect/effect/system/spark_spread)
|
||||
var/datum/effect/effect/system/spark_spread/s = new /datum/effect/effect/system/spark_spread()
|
||||
s.set_up(2, 1, get_turf(location)) // Not sure if it's safe to pass an arbitrary object to set_up, todo
|
||||
s.start()
|
||||
|
||||
|
||||
@@ -26,7 +26,7 @@
|
||||
call(src,triggerproc)(M)
|
||||
|
||||
/obj/effect/mine/proc/triggerrad(obj)
|
||||
var/datum/effect/effect/system/spark_spread/s = PoolOrNew(/datum/effect/effect/system/spark_spread)
|
||||
var/datum/effect/effect/system/spark_spread/s = new /datum/effect/effect/system/spark_spread()
|
||||
s.set_up(3, 1, src)
|
||||
s.start()
|
||||
obj:radiation += 50
|
||||
@@ -39,7 +39,7 @@
|
||||
if(ismob(obj))
|
||||
var/mob/M = obj
|
||||
M.Stun(30)
|
||||
var/datum/effect/effect/system/spark_spread/s = PoolOrNew(/datum/effect/effect/system/spark_spread)
|
||||
var/datum/effect/effect/system/spark_spread/s = new /datum/effect/effect/system/spark_spread()
|
||||
s.set_up(3, 1, src)
|
||||
s.start()
|
||||
spawn(0)
|
||||
@@ -67,7 +67,7 @@
|
||||
qdel(src)
|
||||
|
||||
/obj/effect/mine/proc/triggerkick(obj)
|
||||
var/datum/effect/effect/system/spark_spread/s = PoolOrNew(/datum/effect/effect/system/spark_spread)
|
||||
var/datum/effect/effect/system/spark_spread/s = new /datum/effect/effect/system/spark_spread()
|
||||
s.set_up(3, 1, src)
|
||||
s.start()
|
||||
qdel(obj:client)
|
||||
|
||||
@@ -105,7 +105,7 @@
|
||||
O = loc
|
||||
|
||||
for(var/i=0, i<num, i++)
|
||||
var/spiderling = PoolOrNew(/obj/effect/spider/spiderling, list(src.loc, src))
|
||||
var/spiderling = new /obj/effect/spider/spiderling(src.loc, src)
|
||||
if(O)
|
||||
O.implants += spiderling
|
||||
qdel(src)
|
||||
@@ -148,7 +148,7 @@
|
||||
|
||||
/obj/effect/spider/spiderling/proc/die()
|
||||
visible_message("<span class='alert'>[src] dies!</span>")
|
||||
PoolOrNew(/obj/effect/decal/cleanable/spiderling_remains, src.loc)
|
||||
new /obj/effect/decal/cleanable/spiderling_remains(src.loc)
|
||||
qdel(src)
|
||||
|
||||
/obj/effect/spider/spiderling/healthcheck()
|
||||
|
||||
@@ -15,7 +15,7 @@ proc/empulse(turf/epicenter, first_range, second_range, third_range, fourth_rang
|
||||
log_game("EMP with size ([first_range], [second_range], [third_range], [fourth_range]) in area [epicenter.loc.name] ")
|
||||
|
||||
if(first_range > 1)
|
||||
var/obj/effect/overlay/pulse = PoolOrNew(/obj/effect/overlay, epicenter)
|
||||
var/obj/effect/overlay/pulse = new /obj/effect/overlay(epicenter)
|
||||
pulse.icon = 'icons/effects/effects.dmi'
|
||||
pulse.icon_state = "emppulse"
|
||||
pulse.name = "emp pulse"
|
||||
|
||||
@@ -44,6 +44,16 @@ proc/explosion(turf/epicenter, devastation_range, heavy_impact_range, light_impa
|
||||
far_volume += (dist <= far_dist * 0.5 ? 50 : 0) // add 50 volume if the mob is pretty close to the explosion
|
||||
M.playsound_local(epicenter, 'sound/effects/explosionfar.ogg', far_volume, 1, frequency, falloff = 5)
|
||||
|
||||
var/close = range(world.view+round(devastation_range,1), epicenter)
|
||||
// to all distanced mobs play a different sound
|
||||
for(var/mob/M in world)
|
||||
if(M.z == epicenter.z)
|
||||
if(!(M in close))
|
||||
// check if the mob can hear
|
||||
if(M.ear_deaf <= 0 || !M.ear_deaf)
|
||||
if(!istype(M.loc,/turf/space))
|
||||
M << 'sound/effects/explosionfar.ogg'
|
||||
|
||||
if(adminlog)
|
||||
message_admins("Explosion with [shaped ? "shaped" : "non-shaped"] size ([devastation_range], [heavy_impact_range], [light_impact_range]) in area [epicenter.loc.name] ([epicenter.x],[epicenter.y],[epicenter.z]) (<A HREF='?_src_=holder;adminplayerobservecoodjump=1;X=[epicenter.x];Y=[epicenter.y];Z=[epicenter.z]'>JMP</a>)")
|
||||
log_game("Explosion with [shaped ? "shaped" : "non-shaped"] size ([devastation_range], [heavy_impact_range], [light_impact_range]) in area [epicenter.loc.name] ")
|
||||
|
||||
@@ -50,7 +50,7 @@
|
||||
var/zoomdevicename = null //name used for message when binoculars/scope is used
|
||||
var/zoom = 0 //1 if item is actively being used to zoom. For scoped guns and binoculars.
|
||||
|
||||
var/embed_chance = -1 //-1 makes it calculate embed chance, 0 won't embed, and 100 will always embed
|
||||
var/embed_chance = -1 //0 won't embed, and 100 will always embed
|
||||
|
||||
var/icon_override = null //Used to override hardcoded clothing dmis in human clothing proc.
|
||||
|
||||
@@ -79,12 +79,12 @@
|
||||
var/list/sprite_sheets_obj = list()
|
||||
|
||||
/obj/item/New()
|
||||
if(embed_chance == -1)
|
||||
if(sharp)
|
||||
embed_chance = force/w_class
|
||||
else
|
||||
embed_chance = force/(w_class*3)
|
||||
..()
|
||||
if(embed_chance < 0)
|
||||
if(sharp)
|
||||
embed_chance = max(5, round(force/w_class))
|
||||
else
|
||||
embed_chance = max(5, round(force/(w_class*3)))
|
||||
|
||||
/obj/item/equipped()
|
||||
..()
|
||||
|
||||
@@ -77,14 +77,14 @@
|
||||
/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(!ishuman(usr)) return
|
||||
if(!ishuman(usr)) return 0
|
||||
if(opened) return 0
|
||||
if(contents.len) return 0
|
||||
visible_message("[usr] folds up the [src.name]")
|
||||
new item_path(get_turf(src))
|
||||
var/folded = new item_path(get_turf(src))
|
||||
spawn(0)
|
||||
qdel(src)
|
||||
return
|
||||
return folded
|
||||
|
||||
/obj/structure/closet/body_bag/relaymove(mob/user,direction)
|
||||
if(src.loc != get_turf(src))
|
||||
@@ -115,34 +115,43 @@
|
||||
|
||||
/obj/item/bodybag/cryobag
|
||||
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 \
|
||||
a hostile enviroment."
|
||||
desc = "A non-reusable plastic bag designed to slow down bodily functions such as circulation and breathing, \
|
||||
especially useful if short on time or in a hostile enviroment."
|
||||
icon = 'icons/obj/cryobag.dmi'
|
||||
icon_state = "bodybag_folded"
|
||||
item_state = "bodybag_cryo_folded"
|
||||
origin_tech = list(TECH_BIO = 4)
|
||||
var/obj/item/weapon/reagent_containers/syringe/syringe
|
||||
|
||||
/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)
|
||||
R.add_fingerprint(user)
|
||||
if(syringe)
|
||||
R.syringe = syringe
|
||||
syringe = null
|
||||
qdel(src)
|
||||
|
||||
/obj/structure/closet/body_bag/cryobag
|
||||
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 \
|
||||
a hostile enviroment."
|
||||
desc = "A non-reusable plastic bag designed to slow down bodily functions such as circulation and breathing, \
|
||||
especially useful if short on time or in a hostile enviroment."
|
||||
icon = 'icons/obj/cryobag.dmi'
|
||||
item_path = /obj/item/bodybag/cryobag
|
||||
store_misc = 0
|
||||
store_items = 0
|
||||
var/used = 0
|
||||
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()
|
||||
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()
|
||||
if(syringe)
|
||||
qdel(syringe)
|
||||
syringe = null
|
||||
qdel(tank)
|
||||
tank = null
|
||||
..()
|
||||
@@ -157,11 +166,19 @@
|
||||
O.desc = "Pretty useless now.."
|
||||
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)
|
||||
if(ishuman(AM))
|
||||
var/mob/living/carbon/human/H = AM
|
||||
H.in_stasis = 1
|
||||
H.Stasis(stasis_level)
|
||||
src.used = 1
|
||||
inject_occupant(H)
|
||||
|
||||
if(istype(AM, /obj/item/organ))
|
||||
var/obj/item/organ/O = AM
|
||||
@@ -173,7 +190,7 @@
|
||||
/obj/structure/closet/body_bag/cryobag/Exited(atom/movable/AM)
|
||||
if(ishuman(AM))
|
||||
var/mob/living/carbon/human/H = AM
|
||||
H.in_stasis = 0
|
||||
H.Stasis(0)
|
||||
|
||||
if(istype(AM, /obj/item/organ))
|
||||
var/obj/item/organ/O = AM
|
||||
@@ -187,10 +204,19 @@
|
||||
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)
|
||||
..()
|
||||
if(Adjacent(user)) //The bag's rather thick and opaque from a distance.
|
||||
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)
|
||||
L.examine(user)
|
||||
|
||||
@@ -202,5 +228,28 @@
|
||||
var/obj/item/device/healthanalyzer/analyzer = W
|
||||
for(var/mob/living/L in contents)
|
||||
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
|
||||
..()
|
||||
|
||||
@@ -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(istype(M, /mob/new_player))
|
||||
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>")
|
||||
|
||||
if(!conversations.Find("\ref[P]"))
|
||||
|
||||
@@ -47,7 +47,7 @@
|
||||
qdel(active_dummy)
|
||||
active_dummy = null
|
||||
usr << "<span class='notice'>You deactivate the [src].</span>"
|
||||
var/obj/effect/overlay/T = PoolOrNew(/obj/effect/overlay, get_turf(src))
|
||||
var/obj/effect/overlay/T = new /obj/effect/overlay(get_turf(src))
|
||||
T.icon = 'icons/effects/effects.dmi'
|
||||
flick("emppulse",T)
|
||||
spawn(8) qdel(T)
|
||||
@@ -55,7 +55,7 @@
|
||||
playsound(get_turf(src), 'sound/effects/pop.ogg', 100, 1, -6)
|
||||
var/obj/O = new saved_item(src)
|
||||
if(!O) return
|
||||
var/obj/effect/dummy/chameleon/C = PoolOrNew(/obj/effect/dummy/chameleon, usr.loc)
|
||||
var/obj/effect/dummy/chameleon/C = new /obj/effect/dummy/chameleon(usr.loc)
|
||||
C.activate(O, usr, saved_icon, saved_icon_state, saved_overlays, src)
|
||||
qdel(O)
|
||||
usr << "<span class='notice'>You activate the [src].</span>"
|
||||
|
||||
@@ -212,6 +212,8 @@ var/global/list/obj/item/device/communicator/all_communicators = list()
|
||||
alert_called = 0
|
||||
update_icon()
|
||||
ui_interact(user)
|
||||
if(video_source)
|
||||
watch_video(user)
|
||||
|
||||
// Proc: MouseDrop()
|
||||
//Same thing PDAs do
|
||||
@@ -1041,7 +1043,8 @@ var/global/list/obj/item/device/communicator/all_communicators = list()
|
||||
if(!Adjacent(user) || !video_source) return
|
||||
user.set_machine(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)
|
||||
while(user.machine == video_source && (Adjacent(user) || loc == user))
|
||||
var/turf/T = get_turf(video_source)
|
||||
|
||||
@@ -155,7 +155,7 @@
|
||||
singular_name = "advanced trauma kit"
|
||||
desc = "An advanced trauma kit for severe injuries."
|
||||
icon_state = "traumakit"
|
||||
heal_brute = 0
|
||||
heal_brute = 5
|
||||
origin_tech = list(TECH_BIO = 1)
|
||||
|
||||
/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"
|
||||
desc = "An advanced treatment kit for severe burns."
|
||||
icon_state = "burnkit"
|
||||
heal_burn = 0
|
||||
heal_burn = 5
|
||||
origin_tech = list(TECH_BIO = 1)
|
||||
|
||||
|
||||
|
||||
@@ -1,59 +0,0 @@
|
||||
/obj/item/weapon/dice
|
||||
name = "d6"
|
||||
desc = "A dice with six sides."
|
||||
icon = 'icons/obj/dice.dmi'
|
||||
icon_state = "d66"
|
||||
w_class = ITEMSIZE_TINY
|
||||
var/sides = 6
|
||||
attack_verb = list("diced")
|
||||
|
||||
/obj/item/weapon/dice/New()
|
||||
icon_state = "[name][rand(1,sides)]"
|
||||
|
||||
/obj/item/weapon/dice/d4
|
||||
name = "d4"
|
||||
desc = "A dice with four sides."
|
||||
icon_state = "d44"
|
||||
sides = 4
|
||||
|
||||
/obj/item/weapon/dice/d8
|
||||
name = "d8"
|
||||
desc = "A dice with eight sides."
|
||||
icon_state = "d88"
|
||||
sides = 8
|
||||
|
||||
/obj/item/weapon/dice/d10
|
||||
name = "d10"
|
||||
desc = "A dice with ten sides."
|
||||
icon_state = "d1010"
|
||||
sides = 10
|
||||
|
||||
/obj/item/weapon/dice/d12
|
||||
name = "d12"
|
||||
desc = "A dice with twelve sides."
|
||||
icon_state = "d1212"
|
||||
sides = 12
|
||||
|
||||
/obj/item/weapon/dice/d20
|
||||
name = "d20"
|
||||
desc = "A dice with twenty sides."
|
||||
icon_state = "d2020"
|
||||
sides = 20
|
||||
|
||||
/obj/item/weapon/dice/d100
|
||||
name = "d100"
|
||||
desc = "A dice with ten sides. This one is for the tens digit."
|
||||
icon_state = "d10010"
|
||||
sides = 10
|
||||
|
||||
/obj/item/weapon/dice/attack_self(mob/user as mob)
|
||||
var/result = rand(1, sides)
|
||||
var/comment = ""
|
||||
if(sides == 20 && result == 20)
|
||||
comment = "Nat 20!"
|
||||
else if(sides == 20 && result == 1)
|
||||
comment = "Ouch, bad luck."
|
||||
icon_state = "[name][result]"
|
||||
user.visible_message("<span class='notice'>[user] has thrown [src]. It lands on [result]. [comment]</span>", \
|
||||
"<span class='notice'>You throw [src]. It lands on a [result]. [comment]</span>", \
|
||||
"<span class='notice'>You hear [src] landing on a [result]. [comment]</span>")
|
||||
@@ -107,7 +107,7 @@
|
||||
spawn(0)
|
||||
if(!src || !reagents.total_volume) return
|
||||
|
||||
var/obj/effect/effect/water/W = PoolOrNew(/obj/effect/effect/water, get_turf(src))
|
||||
var/obj/effect/effect/water/W = new /obj/effect/effect/water(get_turf(src))
|
||||
var/turf/my_target
|
||||
if(a <= the_targets.len)
|
||||
my_target = the_targets[a]
|
||||
|
||||
@@ -86,7 +86,7 @@
|
||||
if(ptank)
|
||||
ptank.loc = T
|
||||
ptank = null
|
||||
PoolOrNew(/obj/item/stack/rods, T)
|
||||
new /obj/item/stack/rods(T)
|
||||
qdel(src)
|
||||
return
|
||||
|
||||
|
||||
@@ -12,7 +12,7 @@
|
||||
|
||||
/obj/item/weapon/grenade/smokebomb/New()
|
||||
..()
|
||||
src.smoke = PoolOrNew(/datum/effect/effect/system/smoke_spread/bad)
|
||||
src.smoke = new /datum/effect/effect/system/smoke_spread/bad()
|
||||
src.smoke.attach(src)
|
||||
|
||||
/obj/item/weapon/grenade/smokebomb/Destroy()
|
||||
|
||||
@@ -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>"
|
||||
|
||||
/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(user.Adjacent(target))
|
||||
return 1
|
||||
|
||||
@@ -0,0 +1,96 @@
|
||||
/obj/item/weapon/implant/reagent_generator
|
||||
name = "reagent generator implant"
|
||||
desc = "This is an implant that has attached storage and generates a reagent."
|
||||
implant_color = "r"
|
||||
var/datum/reagent/generated_reagent = null
|
||||
var/gen_amount = 2 //amount of reagent generated per process tick
|
||||
var/gen_cost = 0.5 //amount of nutrient taken from the host per process tick
|
||||
var/transfer_amount = 30 //amount transferred when using verb
|
||||
var/usable_volume = 120
|
||||
|
||||
var/list/empty_message = list("You feel as though your internal reagent implant is almost empty.")
|
||||
var/list/full_message = "You feel as though your internal reagent implant is full."
|
||||
var/list/emote_descriptor = list("tranfers something") //In format of [x] [emote_descriptor] into [container]
|
||||
var/list/self_emote_descriptor = list("transfer") //In format of You [self_emote_descriptor] some [generated_reagent] into [container]
|
||||
var/list/random_emote = list() //An emote the person with the implant may be forced to perform after a prob check, such as [X] meows.
|
||||
var/assigned_proc = /mob/living/carbon/human/proc/use_reagent_implant
|
||||
|
||||
/obj/item/weapon/implant/reagent_generator/New()
|
||||
..()
|
||||
create_reagents(usable_volume)
|
||||
|
||||
/obj/item/weapon/implanter/reagent_generator
|
||||
var/implant_type = /obj/item/weapon/implant/reagent_generator
|
||||
|
||||
/obj/item/weapon/implanter/reagent_generator/New()
|
||||
..()
|
||||
imp = new implant_type(src)
|
||||
update()
|
||||
return
|
||||
|
||||
/obj/item/weapon/implant/reagent_generator/implanted(mob/living/carbon/source)
|
||||
processing_objects += src
|
||||
to_chat(source, "<span class='notice'>You implant [source] with \the [src].</span>")
|
||||
source.verbs |= assigned_proc
|
||||
return 1
|
||||
|
||||
/obj/item/weapon/implant/reagent_generator/process()
|
||||
var/before_gen
|
||||
if(imp_in && generated_reagent)
|
||||
before_gen = reagents.total_volume
|
||||
if(reagents.total_volume < reagents.maximum_volume)
|
||||
if(imp_in.nutrition >= gen_cost)
|
||||
do_generation()
|
||||
else
|
||||
return
|
||||
else
|
||||
imp_in.verbs -= assigned_proc
|
||||
return
|
||||
|
||||
if(reagents)
|
||||
if(reagents.total_volume == reagents.maximum_volume * 0.05)
|
||||
to_chat(imp_in, "<span class='notice'>[pick(empty_message)]</span>")
|
||||
else if(reagents.total_volume == reagents.maximum_volume && before_gen < reagents.maximum_volume)
|
||||
to_chat(imp_in, "<span class='warning'>[pick(full_message)]</span>")
|
||||
|
||||
/obj/item/weapon/implant/reagent_generator/proc/do_generation()
|
||||
imp_in.nutrition -= gen_cost
|
||||
reagents.add_reagent(generated_reagent, gen_amount)
|
||||
|
||||
/mob/living/carbon/human/proc/use_reagent_implant()
|
||||
set name = "Transfer From Reagent Implant"
|
||||
set desc = "Remove reagents from am internal reagent into a container."
|
||||
set category = "Object"
|
||||
set src in view(1)
|
||||
|
||||
do_reagent_implant(usr)
|
||||
|
||||
/mob/living/carbon/human/proc/do_reagent_implant(var/mob/living/carbon/human/user = usr)
|
||||
if(!isliving(user) || !user.canClick())
|
||||
return
|
||||
|
||||
if(user.incapacitated() || user.stat > CONSCIOUS)
|
||||
return
|
||||
|
||||
var/obj/item/weapon/reagent_containers/container = user.get_active_hand()
|
||||
if(!container)
|
||||
to_chat(user,"<span class='notice'>You need an open container to do this!</span>")
|
||||
return
|
||||
|
||||
|
||||
var/obj/item/weapon/implant/reagent_generator/rimplant
|
||||
for(var/I in src.contents)
|
||||
if(istype(I, /obj/item/weapon/implant/reagent_generator))
|
||||
rimplant = I
|
||||
break
|
||||
if(rimplant)
|
||||
if(container.reagents.total_volume < container.volume)
|
||||
var/container_name = container.name
|
||||
if(rimplant.reagents.trans_to(container, amount = rimplant.transfer_amount))
|
||||
user.visible_message("<span class='notice'>[usr] [pick(rimplant.emote_descriptor)] into \the [container_name].</span>",
|
||||
"<span class='notice'>You [pick(rimplant.self_emote_descriptor)] some [rimplant.generated_reagent] into \the [container_name].</span>")
|
||||
if(prob(5))
|
||||
src.visible_message("<span class='notice'>[src] [pick(rimplant.random_emote)].</span>") // M-mlem.
|
||||
if(rimplant.reagents.total_volume == rimplant.reagents.maximum_volume * 0.05)
|
||||
to_chat(src, "<span class='notice'>[pick(rimplant.empty_message)]</span>")
|
||||
|
||||
@@ -130,7 +130,7 @@
|
||||
. = ..()
|
||||
|
||||
if(.)
|
||||
var/datum/effect/effect/system/spark_spread/spark_system = PoolOrNew(/datum/effect/effect/system/spark_spread)
|
||||
var/datum/effect/effect/system/spark_spread/spark_system = new /datum/effect/effect/system/spark_spread()
|
||||
spark_system.set_up(5, 0, user.loc)
|
||||
spark_system.start()
|
||||
playsound(user.loc, 'sound/weapons/blade1.ogg', 50, 1)
|
||||
|
||||
@@ -126,7 +126,7 @@
|
||||
new /obj/item/weapon/storage/pill_bottle/dylovene(src)
|
||||
new /obj/item/weapon/storage/pill_bottle/tramadol(src)
|
||||
new /obj/item/weapon/storage/pill_bottle/spaceacillin(src)
|
||||
new /obj/item/weapon/reagent_containers/hypospray/autoinjector/clotting(src)
|
||||
new /obj/item/weapon/reagent_containers/hypospray/autoinjector/biginjector/clotting(src)
|
||||
new /obj/item/stack/medical/splint(src)
|
||||
return
|
||||
|
||||
@@ -161,7 +161,7 @@
|
||||
if (empty)
|
||||
return
|
||||
for(var/i = 1 to 8)
|
||||
new /obj/item/weapon/reagent_containers/hypospray/autoinjector/clotting(src)
|
||||
new /obj/item/weapon/reagent_containers/hypospray/autoinjector/biginjector/clotting(src)
|
||||
return
|
||||
|
||||
/*
|
||||
|
||||
@@ -1,30 +1,3 @@
|
||||
/obj/item/weapon/storage/pill_bottle/dice //7d6
|
||||
name = "bag of dice"
|
||||
desc = "It's a small bag with dice inside."
|
||||
icon = 'icons/obj/dice.dmi'
|
||||
icon_state = "dicebag"
|
||||
|
||||
/obj/item/weapon/storage/pill_bottle/dice/New()
|
||||
..()
|
||||
for(var/i = 1 to 7)
|
||||
new /obj/item/weapon/dice( src )
|
||||
|
||||
/obj/item/weapon/storage/pill_bottle/dice_nerd //DnD dice
|
||||
name = "bag of gaming dice"
|
||||
desc = "It's a small bag with gaming dice inside."
|
||||
icon = 'icons/obj/dice.dmi'
|
||||
icon_state = "magicdicebag"
|
||||
|
||||
/obj/item/weapon/storage/pill_bottle/dice_nerd/New()
|
||||
..()
|
||||
new /obj/item/weapon/dice/d4( src )
|
||||
new /obj/item/weapon/dice( src )
|
||||
new /obj/item/weapon/dice/d8( src )
|
||||
new /obj/item/weapon/dice/d10( src )
|
||||
new /obj/item/weapon/dice/d12( src )
|
||||
new /obj/item/weapon/dice/d20( src )
|
||||
new /obj/item/weapon/dice/d100( src )
|
||||
|
||||
/*
|
||||
* Donut Box
|
||||
*/
|
||||
|
||||
@@ -28,6 +28,7 @@
|
||||
new /obj/item/clothing/under/sl_suit(src)
|
||||
new /obj/item/clothing/under/rank/bartender(src)
|
||||
new /obj/item/clothing/under/rank/bartender(src)
|
||||
new /obj/item/clothing/under/rank/bartender/skirt(src)
|
||||
new /obj/item/clothing/under/dress/dress_saloon(src)
|
||||
new /obj/item/clothing/accessory/wcoat(src)
|
||||
new /obj/item/clothing/accessory/wcoat(src)
|
||||
@@ -97,16 +98,24 @@
|
||||
new /obj/item/clothing/under/lawyer/female(src)
|
||||
new /obj/item/clothing/under/lawyer/black(src)
|
||||
new /obj/item/clothing/under/lawyer/black(src)
|
||||
new /obj/item/clothing/under/lawyer/black/skirt(src)
|
||||
new /obj/item/clothing/under/lawyer/black/skirt(src)
|
||||
new /obj/item/clothing/under/lawyer/red(src)
|
||||
new /obj/item/clothing/under/lawyer/red(src)
|
||||
new /obj/item/clothing/under/lawyer/red/skirt(src)
|
||||
new /obj/item/clothing/under/lawyer/red/skirt(src)
|
||||
new /obj/item/clothing/suit/storage/toggle/internalaffairs(src)
|
||||
new /obj/item/clothing/suit/storage/toggle/internalaffairs(src)
|
||||
new /obj/item/clothing/under/lawyer/bluesuit(src)
|
||||
new /obj/item/clothing/under/lawyer/bluesuit(src)
|
||||
new /obj/item/clothing/under/lawyer/bluesuit/skirt(src)
|
||||
new /obj/item/clothing/under/lawyer/bluesuit/skirt(src)
|
||||
new /obj/item/clothing/suit/storage/toggle/lawyer/bluejacket(src)
|
||||
new /obj/item/clothing/suit/storage/toggle/lawyer/bluejacket(src)
|
||||
new /obj/item/clothing/under/lawyer/purpsuit(src)
|
||||
new /obj/item/clothing/under/lawyer/purpsuit(src)
|
||||
new /obj/item/clothing/under/lawyer/purpsuit/skirt(src)
|
||||
new /obj/item/clothing/under/lawyer/purpsuit/skirt(src)
|
||||
new /obj/item/clothing/suit/storage/toggle/lawyer/purpjacket(src)
|
||||
new /obj/item/clothing/suit/storage/toggle/lawyer/purpjacket(src)
|
||||
new /obj/item/clothing/shoes/brown(src)
|
||||
@@ -119,5 +128,7 @@
|
||||
new /obj/item/clothing/glasses/sunglasses/big(src)
|
||||
new /obj/item/clothing/under/lawyer/blue(src)
|
||||
new /obj/item/clothing/under/lawyer/blue(src)
|
||||
new /obj/item/clothing/under/lawyer/blue/skirt(src)
|
||||
new /obj/item/clothing/under/lawyer/blue/skirt(src)
|
||||
new /obj/item/device/tape/random(src)
|
||||
new /obj/item/device/tape/random(src)
|
||||
@@ -65,7 +65,9 @@
|
||||
new /obj/item/clothing/under/dress/dress_hr(src)
|
||||
new /obj/item/clothing/under/lawyer/female(src)
|
||||
new /obj/item/clothing/under/lawyer/black(src)
|
||||
new /obj/item/clothing/under/lawyer/black/skirt(src)
|
||||
new /obj/item/clothing/under/lawyer/red(src)
|
||||
new /obj/item/clothing/under/lawyer/red/skirt(src)
|
||||
new /obj/item/clothing/under/lawyer/oldman(src)
|
||||
new /obj/item/clothing/shoes/brown(src)
|
||||
new /obj/item/clothing/shoes/black(src)
|
||||
@@ -74,6 +76,7 @@
|
||||
new /obj/item/clothing/under/rank/head_of_personnel_whimsy(src)
|
||||
new /obj/item/clothing/head/caphat/hop(src)
|
||||
new /obj/item/clothing/under/gimmick/rank/head_of_personnel/suit(src)
|
||||
new /obj/item/clothing/under/gimmick/rank/head_of_personnel/suit/skirt(src)
|
||||
new /obj/item/clothing/glasses/sunglasses(src)
|
||||
return
|
||||
|
||||
|
||||
@@ -82,6 +82,7 @@
|
||||
new /obj/item/clothing/under/det/grey/waistcoat(src)
|
||||
new /obj/item/clothing/under/det/black(src)
|
||||
new /obj/item/clothing/under/det/black(src)
|
||||
new /obj/item/clothing/under/det/skirt(src)
|
||||
new /obj/item/clothing/under/det/corporate(src)
|
||||
new /obj/item/clothing/under/det/corporate(src)
|
||||
new /obj/item/clothing/suit/storage/det_trench(src)
|
||||
@@ -600,17 +601,25 @@
|
||||
..()
|
||||
new /obj/item/clothing/under/assistantformal(src)
|
||||
new /obj/item/clothing/under/suit_jacket/charcoal(src)
|
||||
new /obj/item/clothing/under/suit_jacket/charcoal/skirt(src)
|
||||
new /obj/item/clothing/under/suit_jacket/navy(src)
|
||||
new /obj/item/clothing/under/suit_jacket/navy/skirt(src)
|
||||
new /obj/item/clothing/under/suit_jacket/burgundy(src)
|
||||
new /obj/item/clothing/under/suit_jacket/burgundy/skirt(src)
|
||||
new /obj/item/clothing/under/suit_jacket/checkered(src)
|
||||
new /obj/item/clothing/under/suit_jacket/checkered/skirt(src)
|
||||
new /obj/item/clothing/under/suit_jacket/tan(src)
|
||||
new /obj/item/clothing/under/suit_jacket/tan/skirt(src)
|
||||
new /obj/item/clothing/under/sl_suit(src)
|
||||
new /obj/item/clothing/under/suit_jacket(src)
|
||||
new /obj/item/clothing/under/suit_jacket/female(src)
|
||||
new /obj/item/clothing/under/suit_jacket/female/skirt(src)
|
||||
new /obj/item/clothing/under/suit_jacket/really_black(src)
|
||||
new /obj/item/clothing/under/suit_jacket/really_black/skirt(src)
|
||||
new /obj/item/clothing/under/suit_jacket/red(src)
|
||||
new /obj/item/clothing/under/suit_jacket/red/skirt(src)
|
||||
new /obj/item/clothing/under/scratch(src)
|
||||
new /obj/item/clothing/under/scratch/skirt(src)
|
||||
new /obj/item/weapon/storage/backpack/satchel(src)
|
||||
new /obj/item/weapon/storage/backpack/satchel(src)
|
||||
return
|
||||
@@ -637,5 +646,6 @@
|
||||
new /obj/item/clothing/suit/storage/hooded/wintercoat/captain(src)
|
||||
new /obj/item/clothing/head/beret/centcom/captain(src)
|
||||
new /obj/item/clothing/under/gimmick/rank/captain/suit(src)
|
||||
new /obj/item/clothing/under/gimmick/rank/captain/suit/skirt(src)
|
||||
new /obj/item/clothing/glasses/sunglasses(src)
|
||||
return
|
||||
|
||||
@@ -97,7 +97,7 @@
|
||||
if(iswirecutter(W))
|
||||
if(!shock(user, 100))
|
||||
playsound(loc, 'sound/items/Wirecutter.ogg', 100, 1)
|
||||
PoolOrNew(/obj/item/stack/rods, list(get_turf(src), destroyed ? 1 : 2))
|
||||
new /obj/item/stack/rods(get_turf(src), destroyed ? 1 : 2)
|
||||
qdel(src)
|
||||
else if((isscrewdriver(W)) && (istype(loc, /turf/simulated) || anchored))
|
||||
if(!shock(user, 90))
|
||||
@@ -170,11 +170,11 @@
|
||||
density = 0
|
||||
destroyed = 1
|
||||
update_icon()
|
||||
PoolOrNew(/obj/item/stack/rods, get_turf(src))
|
||||
new /obj/item/stack/rods(get_turf(src))
|
||||
|
||||
else
|
||||
if(health <= -6)
|
||||
PoolOrNew(/obj/item/stack/rods, get_turf(src))
|
||||
new /obj/item/stack/rods(get_turf(src))
|
||||
qdel(src)
|
||||
return
|
||||
return
|
||||
|
||||
@@ -65,7 +65,7 @@
|
||||
if(WT.welding == 1)
|
||||
if(WT.remove_fuel(0, user))
|
||||
user << "<span class='notice'>Slicing lattice joints ...</span>"
|
||||
PoolOrNew(/obj/item/stack/rods, src.loc)
|
||||
new /obj/item/stack/rods(src.loc)
|
||||
qdel(src)
|
||||
return
|
||||
if (istype(C, /obj/item/stack/rods))
|
||||
|
||||
@@ -182,13 +182,13 @@
|
||||
spawn(50)
|
||||
if(src && on)
|
||||
ismist = 1
|
||||
mymist = PoolOrNew(/obj/effect/mist,loc)
|
||||
mymist = new /obj/effect/mist(loc)
|
||||
else
|
||||
ismist = 1
|
||||
mymist = PoolOrNew(/obj/effect/mist,loc)
|
||||
mymist = new /obj/effect/mist(loc)
|
||||
else if(ismist)
|
||||
ismist = 1
|
||||
mymist = PoolOrNew(/obj/effect/mist,loc)
|
||||
mymist = new /obj/effect/mist(loc)
|
||||
spawn(250)
|
||||
if(src && !on)
|
||||
qdel(mymist)
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user