diff --git a/.travis.yml b/.travis.yml
index 10ce658d99..51bb590878 100644
--- a/.travis.yml
+++ b/.travis.yml
@@ -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:
diff --git a/code/__defines/gamemode.dm b/code/__defines/gamemode.dm
index 8115790c50..cd0c9955c1 100644
--- a/code/__defines/gamemode.dm
+++ b/code/__defines/gamemode.dm
@@ -123,4 +123,6 @@ var/list/be_special_flags = list(
//casting costs
#define Sp_RECHARGE "recharge"
#define Sp_CHARGES "charges"
-#define Sp_HOLDVAR "holdervar"
\ No newline at end of file
+#define Sp_HOLDVAR "holdervar"
+
+#define CHANGELING_STASIS_COST 20
\ No newline at end of file
diff --git a/code/__defines/items_clothing.dm b/code/__defines/items_clothing.dm
index eb572aa0e2..0a8598d21f 100644
--- a/code/__defines/items_clothing.dm
+++ b/code/__defines/items_clothing.dm
@@ -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.
diff --git a/code/_helpers/datum_pool.dm b/code/_helpers/datum_pool.dm
deleted file mode 100644
index b5bcea123f..0000000000
--- a/code/_helpers/datum_pool.dm
+++ /dev/null
@@ -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
diff --git a/code/_helpers/game.dm b/code/_helpers/game.dm
index 1531a67d5b..b59857c8f6 100644
--- a/code/_helpers/game.dm
+++ b/code/_helpers/game.dm
@@ -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))
diff --git a/code/_onclick/hud/ability_screen_objects.dm b/code/_onclick/hud/ability_screen_objects.dm
index 1e6844b6ad..2081e011b3 100644
--- a/code/_onclick/hud/ability_screen_objects.dm
+++ b/code/_onclick/hud/ability_screen_objects.dm
@@ -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
diff --git a/code/_onclick/hud/fullscreen.dm b/code/_onclick/hud/fullscreen.dm
index fd226eb70c..a00fa6e10d 100644
--- a/code/_onclick/hud/fullscreen.dm
+++ b/code/_onclick/hud/fullscreen.dm
@@ -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
diff --git a/code/_onclick/hud/movable_screen_objects.dm b/code/_onclick/hud/movable_screen_objects.dm
index 71eff4a392..3602a52481 100644
--- a/code/_onclick/hud/movable_screen_objects.dm
+++ b/code/_onclick/hud/movable_screen_objects.dm
@@ -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()
diff --git a/code/_onclick/hud/spell_screen_objects.dm b/code/_onclick/hud/spell_screen_objects.dm
index 262ece09e4..a599381730 100644
--- a/code/_onclick/hud/spell_screen_objects.dm
+++ b/code/_onclick/hud/spell_screen_objects.dm
@@ -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
diff --git a/code/_onclick/telekinesis.dm b/code/_onclick/telekinesis.dm
index 4c976f4458..f08727abf3 100644
--- a/code/_onclick/telekinesis.dm
+++ b/code/_onclick/telekinesis.dm
@@ -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
diff --git a/code/controllers/Processes/garbage.dm b/code/controllers/Processes/garbage.dm
index 2d56dde1a2..02f0411332 100644
--- a/code/controllers/Processes/garbage.dm
+++ b/code/controllers/Processes/garbage.dm
@@ -152,19 +152,13 @@ world/loop_checks = 0
A.finalize_qdel()
/datum/proc/finalize_qdel()
- if(IsPooled(src))
- PlaceInPool(src)
- else
- del(src)
+ del(src)
/atom/finalize_qdel()
- if(IsPooled(src))
- PlaceInPool(src)
+ if(garbage_collector)
+ garbage_collector.AddTrash(src)
else
- if(garbage_collector)
- garbage_collector.AddTrash(src)
- else
- delayed_garbage |= src
+ delayed_garbage |= src
/icon/finalize_qdel()
del(src)
@@ -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
diff --git a/code/datums/repositories/decls.dm b/code/datums/repositories/decls.dm
new file mode 100644
index 0000000000..e87be74f53
--- /dev/null
+++ b/code/datums/repositories/decls.dm
@@ -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
\ No newline at end of file
diff --git a/code/datums/repositories/repository.dm b/code/datums/repositories/repository.dm
index 6267099c93..04eee50540 100644
--- a/code/datums/repositories/repository.dm
+++ b/code/datums/repositories/repository.dm
@@ -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
\ No newline at end of file
diff --git a/code/datums/supplypacks/contraband.dm b/code/datums/supplypacks/contraband.dm
index d6427f063f..0c7fd3f4ed 100644
--- a/code/datums/supplypacks/contraband.dm
+++ b/code/datums/supplypacks/contraband.dm
@@ -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(
diff --git a/code/datums/supplypacks/security.dm b/code/datums/supplypacks/security.dm
index 1ec25bc28d..e248acc46c 100644
--- a/code/datums/supplypacks/security.dm
+++ b/code/datums/supplypacks/security.dm
@@ -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,
diff --git a/code/datums/underwear/undershirts.dm b/code/datums/underwear/undershirts.dm
index 83cae026ce..59f33be094 100644
--- a/code/datums/underwear/undershirts.dm
+++ b/code/datums/underwear/undershirts.dm
@@ -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"
diff --git a/code/datums/uplink/medical.dm b/code/datums/uplink/medical.dm
index eab9d9cd02..0c616793ca 100644
--- a/code/datums/uplink/medical.dm
+++ b/code/datums/uplink/medical.dm
@@ -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"
diff --git a/code/game/area/Space Station 13 areas.dm b/code/game/area/Space Station 13 areas.dm
index 376ae965cc..be536612b4 100755
--- a/code/game/area/Space Station 13 areas.dm
+++ b/code/game/area/Space Station 13 areas.dm
@@ -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
diff --git a/code/game/area/areas.dm b/code/game/area/areas.dm
index 1e52a4a70c..f6a965dcf7 100644
--- a/code/game/area/areas.dm
+++ b/code/game/area/areas.dm
@@ -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()
diff --git a/code/game/gamemodes/changeling/changeling_powers.dm b/code/game/gamemodes/changeling/changeling_powers.dm
index 2234e0a540..e54eb3c1cd 100644
--- a/code/game/gamemodes/changeling/changeling_powers.dm
+++ b/code/game/gamemodes/changeling/changeling_powers.dm
@@ -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 << "We cannot reach \the [M] with a sting!"
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 << "We cannot find a path to sting \the [M] by!"
return 0
return 1
diff --git a/code/game/gamemodes/changeling/generic_equip_procs.dm b/code/game/gamemodes/changeling/generic_equip_procs.dm
index e8ed12a446..9c73a4e3d2 100644
--- a/code/game/gamemodes/changeling/generic_equip_procs.dm
+++ b/code/game/gamemodes/changeling/generic_equip_procs.dm
@@ -32,7 +32,7 @@
return 1
if(M.head || M.wear_suit) //Make sure our slots aren't full
- src << "We require nothing to be on our head, and we cannot wear any external suits."
+ src << "We require nothing to be on our head, and we cannot wear any external suits, or shoes."
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 = "" )
diff --git a/code/game/gamemodes/changeling/powers/boost_range.dm b/code/game/gamemodes/changeling/powers/boost_range.dm
index fd15d94dae..a22130484c 100644
--- a/code/game/gamemodes/changeling/powers/boost_range.dm
+++ b/code/game/gamemodes/changeling/powers/boost_range.dm
@@ -18,11 +18,11 @@
if(!changeling)
return 0
changeling.chem_charges -= 10
- src << "Your throat adjusts to launch the sting."
+ to_chat(src, "Your throat adjusts to launch the sting.")
var/range = 2
if(src.mind.changeling.recursive_enhancement)
range = range + 3
- src << "We can fire our next sting from five squares away."
+ to_chat(src, "We can fire our next sting from five squares away.")
changeling.sting_range = range
src.verbs -= /mob/proc/changeling_boost_range
spawn(5)
diff --git a/code/game/gamemodes/changeling/powers/fabricate_clothing.dm b/code/game/gamemodes/changeling/powers/fabricate_clothing.dm
index f106d9167f..138cd156e3 100644
--- a/code/game/gamemodes/changeling/powers/fabricate_clothing.dm
+++ b/code/game/gamemodes/changeling/powers/fabricate_clothing.dm
@@ -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.
diff --git a/code/game/gamemodes/changeling/powers/fake_death.dm b/code/game/gamemodes/changeling/powers/fake_death.dm
index dee603fc4a..765dbb51e6 100644
--- a/code/game/gamemodes/changeling/powers/fake_death.dm
+++ b/code/game/gamemodes/changeling/powers/fake_death.dm
@@ -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 << "We are ready to rise. Use the Revive verb when you are ready."
diff --git a/code/game/gamemodes/changeling/powers/respec.dm b/code/game/gamemodes/changeling/powers/respec.dm
index d984083aba..66f13e720f 100644
--- a/code/game/gamemodes/changeling/powers/respec.dm
+++ b/code/game/gamemodes/changeling/powers/respec.dm
@@ -29,6 +29,3 @@
src << "We have removed our evolutions from this form, and are now ready to readapt."
ling_datum.purchased_powers_history.Add("Re-adapt (Reset to [ling_datum.max_geneticpoints])")
-
- //Now to lose the verb, so no unlimited resets.
-
diff --git a/code/game/gamemodes/changeling/powers/revive.dm b/code/game/gamemodes/changeling/powers/revive.dm
index 2f0b9c57e7..c640e35392 100644
--- a/code/game/gamemodes/changeling/powers/revive.dm
+++ b/code/game/gamemodes/changeling/powers/revive.dm
@@ -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 << "We have regenerated."
@@ -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
\ No newline at end of file
diff --git a/code/game/gamemodes/changeling/powers/shriek.dm b/code/game/gamemodes/changeling/powers/shriek.dm
index ded66148fa..37e7f67fe0 100644
--- a/code/game/gamemodes/changeling/powers/shriek.dm
+++ b/code/game/gamemodes/changeling/powers/shriek.dm
@@ -35,6 +35,14 @@
src << "You can't speak!"
return 0
+ if(world.time < (changeling.last_shriek + 10 SECONDS) )
+ to_chat(src, "We are still recovering from our last shriek...")
+ return 0
+
+ if(!isturf(loc))
+ to_chat(src, "Shrieking here would be a bad idea.")
+ 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]) (JMP).")
log_game("[key_name(src)] used Resonant Shriek.")
+ visible_message("[src] appears to shout.")
+
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 << "We are ready to use our resonant shriek once more."
- 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 << "You can't speak!"
return 0
+ if(world.time < (changeling.last_shriek + 10 SECONDS) )
+ to_chat(src, "We are still recovering from our last shriek...")
+ return 0
+
+ if(!isturf(loc))
+ to_chat(src, "Shrieking here would be a bad idea.")
+ 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 << "We are extra loud."
src.mind.changeling.recursive_enhancement = 0
+ visible_message("[src] appears to shout.")
+
src.attack_log += text("\[[time_stamp()]\] Used Dissonant Shriek.")
message_admins("[key_name(src)] used Dissonant Shriek ([src.x],[src.y],[src.z]) (JMP).")
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 << "We are ready to use our dissonant shriek once more."
- 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
\ No newline at end of file
diff --git a/code/game/gamemodes/changeling/powers/transform.dm b/code/game/gamemodes/changeling/powers/transform.dm
index 236af69f5f..37a9945210 100644
--- a/code/game/gamemodes/changeling/powers/transform.dm
+++ b/code/game/gamemodes/changeling/powers/transform.dm
@@ -13,6 +13,10 @@
var/datum/changeling/changeling = changeling_power(5,1,0)
if(!changeling) return
+ if(!isturf(loc))
+ to_chat(src, "Transforming here would be a bad idea.")
+ return 0
+
var/list/names = list()
for(var/datum/absorbed_dna/DNA in changeling.absorbed_dna)
names += "[DNA.name]"
diff --git a/code/game/gamemodes/changeling/powers/visible_camouflage.dm b/code/game/gamemodes/changeling/powers/visible_camouflage.dm
index 00e31cc932..167f6f41b9 100644
--- a/code/game/gamemodes/changeling/powers/visible_camouflage.dm
+++ b/code/game/gamemodes/changeling/powers/visible_camouflage.dm
@@ -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 << "We vanish from sight, and will remain hidden, so long as we move carefully."
- 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 << "We are now truly invisible."
+ must_walk = FALSE
+ to_chat(src, "We may move at our normal speed while hidden.")
+
+ 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)
diff --git a/code/game/gamemodes/events/holidays/Holidays.dm b/code/game/gamemodes/events/holidays/Holidays.dm
index 2adc25d35d..5e3754a872 100644
--- a/code/game/gamemodes/events/holidays/Holidays.dm
+++ b/code/game/gamemodes/events/holidays/Holidays.dm
@@ -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)
diff --git a/code/game/gamemodes/heist/heist.dm b/code/game/gamemodes/heist/heist.dm
index 2d43e67f24..b9418bfea9 100644
--- a/code/game/gamemodes/heist/heist.dm
+++ b/code/game/gamemodes/heist/heist.dm
@@ -7,20 +7,13 @@ 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 \
colony of sizable population and considerable wealth causes it to often be the target of various \
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
+ antag_tags = list(MODE_RAIDER)
\ No newline at end of file
diff --git a/code/game/gamemodes/nuclear/nuclear.dm b/code/game/gamemodes/nuclear/nuclear.dm
index e2f6b8a56c..098f9fd329 100644
--- a/code/game/gamemodes/nuclear/nuclear.dm
+++ b/code/game/gamemodes/nuclear/nuclear.dm
@@ -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
diff --git a/code/game/gamemodes/technomancer/assistance/assistance.dm b/code/game/gamemodes/technomancer/assistance/assistance.dm
index 3cdf7014ad..d5d28bc118 100644
--- a/code/game/gamemodes/technomancer/assistance/assistance.dm
+++ b/code/game/gamemodes/technomancer/assistance/assistance.dm
@@ -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)
diff --git a/code/game/gamemodes/technomancer/devices/hypos.dm b/code/game/gamemodes/technomancer/devices/hypos.dm
index b54ce5e35c..dd0fa4436a 100644
--- a/code/game/gamemodes/technomancer/devices/hypos.dm
+++ b/code/game/gamemodes/technomancer/devices/hypos.dm
@@ -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)
diff --git a/code/game/gamemodes/technomancer/devices/shield_armor.dm b/code/game/gamemodes/technomancer/devices/shield_armor.dm
index bacb2c60ed..0bbb6ef085 100644
--- a/code/game/gamemodes/technomancer/devices/shield_armor.dm
+++ b/code/game/gamemodes/technomancer/devices/shield_armor.dm
@@ -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()
diff --git a/code/game/gamemodes/technomancer/equipment.dm b/code/game/gamemodes/technomancer/equipment.dm
index 5c440d0dcd..8d1fb4c6ad 100644
--- a/code/game/gamemodes/technomancer/equipment.dm
+++ b/code/game/gamemodes/technomancer/equipment.dm
@@ -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)
diff --git a/code/game/gamemodes/technomancer/instability.dm b/code/game/gamemodes/technomancer/instability.dm
index fa9985b1b6..be35adec6e 100644
--- a/code/game/gamemodes/technomancer/instability.dm
+++ b/code/game/gamemodes/technomancer/instability.dm
@@ -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, "The purple glow makes you feel strange...")
H.adjust_instability(outgoing_instability)
- set_light(distance, distance * 2, l_color = "#C26DDE")
+ set_light(distance, distance * 4, l_color = "#C26DDE")
diff --git a/code/game/gamemodes/technomancer/spell_objs.dm b/code/game/gamemodes/technomancer/spell_objs.dm
index fb22001d30..faaf3ee75a 100644
--- a/code/game/gamemodes/technomancer/spell_objs.dm
+++ b/code/game/gamemodes/technomancer/spell_objs.dm
@@ -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.
diff --git a/code/game/gamemodes/technomancer/spells/condensation.dm b/code/game/gamemodes/technomancer/spells/condensation.dm
index c02e1c1ac5..c303c2a5fb 100644
--- a/code/game/gamemodes/technomancer/spells/condensation.dm
+++ b/code/game/gamemodes/technomancer/spells/condensation.dm
@@ -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()
diff --git a/code/game/gamemodes/technomancer/spells/dispel.dm b/code/game/gamemodes/technomancer/spells/dispel.dm
index 87edf6a621..10f258bf58 100644
--- a/code/game/gamemodes/technomancer/spells/dispel.dm
+++ b/code/game/gamemodes/technomancer/spells/dispel.dm
@@ -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)
\ No newline at end of file
diff --git a/code/game/gamemodes/technomancer/spells/illusion.dm b/code/game/gamemodes/technomancer/spells/illusion.dm
index 12f04db48c..50a9bf5da7 100644
--- a/code/game/gamemodes/technomancer/spells/illusion.dm
+++ b/code/game/gamemodes/technomancer/spells/illusion.dm
@@ -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
diff --git a/code/game/gamemodes/technomancer/spells/insert/corona.dm b/code/game/gamemodes/technomancer/spells/insert/corona.dm
deleted file mode 100644
index 0ecd700732..0000000000
--- a/code/game/gamemodes/technomancer/spells/insert/corona.dm
+++ /dev/null
@@ -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("You start to glow very brightly!")
- 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 << "Your glow has ended."
- ..()
\ No newline at end of file
diff --git a/code/game/gamemodes/technomancer/spells/insert/haste.dm b/code/game/gamemodes/technomancer/spells/insert/haste.dm
deleted file mode 100644
index 30422cef3f..0000000000
--- a/code/game/gamemodes/technomancer/spells/insert/haste.dm
+++ /dev/null
@@ -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 << "You suddenly find it much easier to move."
- 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 << "You feel slow again."
- ..()
\ No newline at end of file
diff --git a/code/game/gamemodes/technomancer/spells/insert/repel_missiles.dm b/code/game/gamemodes/technomancer/spells/insert/repel_missiles.dm
deleted file mode 100644
index 38e4ef4720..0000000000
--- a/code/game/gamemodes/technomancer/spells/insert/repel_missiles.dm
+++ /dev/null
@@ -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 << "You have a repulsion field around you, which will attempt to deflect projectiles."
- 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 << "Your repulsion field has expired."
- ..()
\ No newline at end of file
diff --git a/code/game/gamemodes/technomancer/spells/modifier/corona.dm b/code/game/gamemodes/technomancer/spells/modifier/corona.dm
new file mode 100644
index 0000000000..74a06855d9
--- /dev/null
+++ b/code/game/gamemodes/technomancer/spells/modifier/corona.dm
@@ -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 = "You start to glow very brightly!"
+ on_expired_text = "Your glow has ended."
+ evasion = -2
+ stacks = MODIFIER_STACK_EXTEND
+
+/datum/modifier/technomancer/corona/tick()
+ holder.break_cloak()
\ No newline at end of file
diff --git a/code/game/gamemodes/technomancer/spells/modifier/haste.dm b/code/game/gamemodes/technomancer/spells/modifier/haste.dm
new file mode 100644
index 0000000000..7f7c1045b3
--- /dev/null
+++ b/code/game/gamemodes/technomancer/spells/modifier/haste.dm
@@ -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 = "You suddenly find it much easier to move."
+ on_expired_text = "You feel slow again."
+ haste = TRUE
+ stacks = MODIFIER_STACK_EXTEND
\ No newline at end of file
diff --git a/code/game/gamemodes/technomancer/spells/modifier/modifier.dm b/code/game/gamemodes/technomancer/spells/modifier/modifier.dm
new file mode 100644
index 0000000000..b0a5c93747
--- /dev/null
+++ b/code/game/gamemodes/technomancer/spells/modifier/modifier.dm
@@ -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)
\ No newline at end of file
diff --git a/code/game/gamemodes/technomancer/spells/modifier/repel_missiles.dm b/code/game/gamemodes/technomancer/spells/modifier/repel_missiles.dm
new file mode 100644
index 0000000000..d267ecce88
--- /dev/null
+++ b/code/game/gamemodes/technomancer/spells/modifier/repel_missiles.dm
@@ -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 = "You have a repulsion field around you, which will attempt to deflect projectiles."
+ on_expired_text = "Your repulsion field has expired."
+ evasion = 3
+ stacks = MODIFIER_STACK_EXTEND
\ No newline at end of file
diff --git a/code/game/gamemodes/technomancer/spells/passwall.dm b/code/game/gamemodes/technomancer/spells/passwall.dm
index aa16a8a4fc..e786134b4c 100644
--- a/code/game/gamemodes/technomancer/spells/passwall.dm
+++ b/code/game/gamemodes/technomancer/spells/passwall.dm
@@ -39,7 +39,7 @@
visible_message("[user] rests a hand on \the [hit_atom].")
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)
diff --git a/code/game/gamemodes/technomancer/spells/reflect.dm b/code/game/gamemodes/technomancer/spells/reflect.dm
index d841db2acc..60abcee63f 100644
--- a/code/game/gamemodes/technomancer/spells/reflect.dm
+++ b/code/game/gamemodes/technomancer/spells/reflect.dm
@@ -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 << "Your shield will expire in 3 seconds!"
spawn(5 SECONDS)
diff --git a/code/game/gamemodes/technomancer/spells/shield.dm b/code/game/gamemodes/technomancer/spells/shield.dm
index a9514aaa29..291c74f7fa 100644
--- a/code/game/gamemodes/technomancer/spells/shield.dm
+++ b/code/game/gamemodes/technomancer/spells/shield.dm
@@ -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()
diff --git a/code/game/gamemodes/technomancer/spells/spawner/darkness.dm b/code/game/gamemodes/technomancer/spells/spawner/darkness.dm
index eafb167dd4..be978e7ee4 100644
--- a/code/game/gamemodes/technomancer/spells/spawner/darkness.dm
+++ b/code/game/gamemodes/technomancer/spells/spawner/darkness.dm
@@ -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
\ No newline at end of file
+ new_light_power = -20
\ No newline at end of file
diff --git a/code/game/gamemodes/technomancer/spells/warp_strike.dm b/code/game/gamemodes/technomancer/spells/warp_strike.dm
index 94074ffcf0..3f8939e0ba 100644
--- a/code/game/gamemodes/technomancer/spells/warp_strike.dm
+++ b/code/game/gamemodes/technomancer/spells/warp_strike.dm
@@ -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)
diff --git a/code/game/jobs/job/civilian.dm b/code/game/jobs/job/civilian.dm
index e7bb56347e..5d105d6e87 100644
--- a/code/game/jobs/job/civilian.dm
+++ b/code/game/jobs/job/civilian.dm
@@ -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)
diff --git a/code/game/machinery/Sleeper.dm b/code/game/machinery/Sleeper.dm
index 1145265bbb..15bbfdeee5 100644
--- a/code/game/machinery/Sleeper.dm
+++ b/code/game/machinery/Sleeper.dm
@@ -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,18 +100,23 @@
/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)
+ if(beaker.reagents.total_volume < beaker.reagents.maximum_volume)
+ var/pumped = 0
+ for(var/datum/reagent/x in occupant.reagents.reagent_list)
+ occupant.reagents.trans_to_obj(beaker, 3)
+ pumped++
+ if(ishuman(occupant))
+ occupant.vessel.trans_to_obj(beaker, pumped + 1)
+ else
+ toggle_filter()
- if(filtering > 0)
- if(beaker)
- if(beaker.reagents.total_volume < beaker.reagents.maximum_volume)
- var/pumped = 0
- for(var/datum/reagent/x in occupant.reagents.reagent_list)
- occupant.reagents.trans_to_obj(beaker, 3)
- pumped++
- if(ishuman(occupant))
- occupant.vessel.trans_to_obj(beaker, pumped + 1)
- else
- toggle_filter()
/obj/machinery/sleeper/update_icon()
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 << "\The [src] has a beaker already."
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 << "You struggle through the haze to hit the eject button. This will take a couple of minutes..."
+ 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
diff --git a/code/game/machinery/adv_med.dm b/code/game/machinery/adv_med.dm
index c3c16dd8e5..238bb95efc 100644
--- a/code/game/machinery/adv_med.dm
+++ b/code/game/machinery/adv_med.dm
@@ -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 += "Time of scan: [worldtime2stationtime(world.time)]
"
P.info += "[printing_text]"
P.info += "
Notes:
"
- 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)
"
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]
"
+ if(occupant.ingested)
+ for(var/datum/reagent/R in occupant.ingested.reagent_list)
+ dat += "Stomach: [R.name], Amount: [R.volume]
"
+
dat += "
"
dat += ""
dat += "| Organ | "
diff --git a/code/game/machinery/alarm.dm b/code/game/machinery/alarm.dm
index 8041b07324..5746fb179e 100644
--- a/code/game/machinery/alarm.dm
+++ b/code/game/machinery/alarm.dm
@@ -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"])
diff --git a/code/game/machinery/camera/tracking.dm b/code/game/machinery/camera/tracking.dm
index 31c8fe7819..1aadf981c4 100644
--- a/code/game/machinery/camera/tracking.dm
+++ b/code/game/machinery/camera/tracking.dm
@@ -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
diff --git a/code/game/machinery/cryopod.dm b/code/game/machinery/cryopod.dm
index 5677ec9ffc..f30199a66a 100644
--- a/code/game/machinery/cryopod.dm
+++ b/code/game/machinery/cryopod.dm
@@ -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
diff --git a/code/game/machinery/deployable.dm b/code/game/machinery/deployable.dm
index fa4b601e91..76eb2da2d5 100644
--- a/code/game/machinery/deployable.dm
+++ b/code/game/machinery/deployable.dm
@@ -61,7 +61,7 @@ for reference:
var/health = 100
var/maxhealth = 100
var/material/material
-
+
/obj/structure/barricade/New(var/newloc, var/material_name)
..(newloc)
if(!material_name)
@@ -74,7 +74,7 @@ for reference:
desc = "This space is blocked off by a barricade made of [material.display_name]."
color = material.icon_colour
maxhealth = material.integrity
- health = maxhealth
+ health = maxhealth
/obj/structure/barricade/get_material()
return material
@@ -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)
diff --git a/code/game/machinery/doors/airlock.dm b/code/game/machinery/doors/airlock.dm
index b76a7b71cc..f3a0fd68f0 100644
--- a/code/game/machinery/doors/airlock.dm
+++ b/code/game/machinery/doors/airlock.dm
@@ -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,"You removed the airlock electronics!")
@@ -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)
diff --git a/code/game/machinery/doors/door.dm b/code/game/machinery/doors/door.dm
index 569395cd2c..20356c1a5f 100644
--- a/code/game/machinery/doors/door.dm
+++ b/code/game/machinery/doors/door.dm
@@ -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)
diff --git a/code/game/machinery/doors/firedoor.dm b/code/game/machinery/doors/firedoor.dm
index cbdcfb9f2f..1162264dd7 100644
--- a/code/game/machinery/doors/firedoor.dm
+++ b/code/game/machinery/doors/firedoor.dm
@@ -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
diff --git a/code/game/machinery/kitchen/cooking_machines/_cooker.dm b/code/game/machinery/kitchen/cooking_machines/_cooker.dm
index a6af0f13f2..552e05d95a 100644
--- a/code/game/machinery/kitchen/cooking_machines/_cooker.dm
+++ b/code/game/machinery/kitchen/cooking_machines/_cooker.dm
@@ -170,7 +170,7 @@
cooking_obj = new /obj/item/weapon/reagent_containers/food/snacks/badrecipe(src)
// Produce nasty smoke.
visible_message("\The [src] vomits a gout of rancid smoke!")
- 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()
diff --git a/code/game/machinery/machinery.dm b/code/game/machinery/machinery.dm
index b0946bf347..6e9f31889d 100644
--- a/code/game/machinery/machinery.dm
+++ b/code/game/machinery/machinery.dm
@@ -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"
diff --git a/code/game/machinery/portable_turret.dm b/code/game/machinery/portable_turret.dm
index 595712afd3..6d7a6f82a7 100644
--- a/code/game/machinery/portable_turret.dm
+++ b/code/game/machinery/portable_turret.dm
@@ -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)
diff --git a/code/game/machinery/vending_vr.dm b/code/game/machinery/vending_vr.dm
index d28b426890..e7541bc5b1 100644
--- a/code/game/machinery/vending_vr.dm
+++ b/code/game/machinery/vending_vr.dm
@@ -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
diff --git a/code/game/mecha/equipment/tools/medical_tools.dm b/code/game/mecha/equipment/tools/medical_tools.dm
index ffe30bf3fd..1e10e03f4f 100644
--- a/code/game/mecha/equipment/tools/medical_tools.dm
+++ b/code/game/mecha/equipment/tools/medical_tools.dm
@@ -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)
diff --git a/code/game/mecha/equipment/tools/tools.dm b/code/game/mecha/equipment/tools/tools.dm
index 41f1ba44ef..9b2e0aa26d 100644
--- a/code/game/mecha/equipment/tools/tools.dm
+++ b/code/game/mecha/equipment/tools/tools.dm
@@ -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
diff --git a/code/game/mecha/micro/micro_equipment.dm b/code/game/mecha/micro/micro_equipment.dm
index c1ef53a59d..b7892c32c7 100644
--- a/code/game/mecha/micro/micro_equipment.dm
+++ b/code/game/mecha/micro/micro_equipment.dm
@@ -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, "You are physically incapable of emptying the ore box.")
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, "The ore box is empty")
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, "You empty the ore box")
return
diff --git a/code/game/objects/effects/chem/chemsmoke.dm b/code/game/objects/effects/chem/chemsmoke.dm
index 3f077116e9..45cfcc8348 100644
--- a/code/game/objects/effects/chem/chemsmoke.dm
+++ b/code/game/objects/effects/chem/chemsmoke.dm
@@ -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)
diff --git a/code/game/objects/effects/chem/foam.dm b/code/game/objects/effects/chem/foam.dm
index b29b2440e6..5f29bd6448 100644
--- a/code/game/objects/effects/chem/foam.dm
+++ b/code/game/objects/effects/chem/foam.dm
@@ -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
diff --git a/code/game/objects/effects/decals/Cleanable/humans.dm b/code/game/objects/effects/decals/Cleanable/humans.dm
index fc764efd02..3cdca23fde 100644
--- a/code/game/objects/effects/decals/Cleanable/humans.dm
+++ b/code/game/objects/effects/decals/Cleanable/humans.dm
@@ -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()
diff --git a/code/game/objects/effects/effect_system.dm b/code/game/objects/effects/effect_system.dm
index 485ea6987b..2343871b95 100644
--- a/code/game/objects/effects/effect_system.dm
+++ b/code/game/objects/effects/effect_system.dm
@@ -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()
diff --git a/code/game/objects/effects/gibs.dm b/code/game/objects/effects/gibs.dm
index 9d630113bb..16db09edb6 100644
--- a/code/game/objects/effects/gibs.dm
+++ b/code/game/objects/effects/gibs.dm
@@ -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()
diff --git a/code/game/objects/effects/mines.dm b/code/game/objects/effects/mines.dm
index 27e6d7c74a..52f920775e 100644
--- a/code/game/objects/effects/mines.dm
+++ b/code/game/objects/effects/mines.dm
@@ -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)
diff --git a/code/game/objects/effects/spiders.dm b/code/game/objects/effects/spiders.dm
index 1077d757ae..4396465bc9 100644
--- a/code/game/objects/effects/spiders.dm
+++ b/code/game/objects/effects/spiders.dm
@@ -105,7 +105,7 @@
O = loc
for(var/i=0, i[src] dies!")
- 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()
diff --git a/code/game/objects/empulse.dm b/code/game/objects/empulse.dm
index 3b1a3b54f5..3d97946bd4 100644
--- a/code/game/objects/empulse.dm
+++ b/code/game/objects/empulse.dm
@@ -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"
diff --git a/code/game/objects/explosion.dm b/code/game/objects/explosion.dm
index dd18925da2..0bf146f037 100644
--- a/code/game/objects/explosion.dm
+++ b/code/game/objects/explosion.dm
@@ -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]) (JMP)")
log_game("Explosion with [shaped ? "shaped" : "non-shaped"] size ([devastation_range], [heavy_impact_range], [light_impact_range]) in area [epicenter.loc.name] ")
@@ -80,8 +90,8 @@ proc/explosion(turf/epicenter, devastation_range, heavy_impact_range, light_impa
var/atom/movable/AM = atom_movable
if(AM && AM.simulated) AM.ex_act(dist)
- T.ex_act(dist)
-
+ T.ex_act(dist)
+
var/took = (world.timeofday-start)/10
//You need to press the DebugGame verb to see these now....they were getting annoying and we've collected a fair bit of data. Just -test- changes to explosion code using this please so we can compare
if(Debug2) world.log << "## DEBUG: Explosion([x0],[y0],[z0])(d[devastation_range],h[heavy_impact_range],l[light_impact_range]): Took [took] seconds."
diff --git a/code/game/objects/items.dm b/code/game/objects/items.dm
index 4316da3c49..de91b79d60 100644
--- a/code/game/objects/items.dm
+++ b/code/game/objects/items.dm
@@ -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()
..()
diff --git a/code/game/objects/items/bodybag.dm b/code/game/objects/items/bodybag.dm
index b4ba67e4c2..4d77da4ae9 100644
--- a/code/game/objects/items/bodybag.dm
+++ b/code/game/objects/items/bodybag.dm
@@ -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 << "You peer into \the [src]."
+ if(syringe)
+ user << "It has a syringe added to it."
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,"\The [src] already has an injector! Remove it first.")
+ else
+ var/obj/item/weapon/reagent_containers/syringe/syringe = W
+ to_chat(user,"You insert \the [syringe] into \the [src], and it locks into place.")
+ 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,"The injector cannot be removed now that the stasis bag has been used!")
+ else
+ syringe.forceMove(src.loc)
+ to_chat(user,"You pry \the [syringe] out of \the [src].")
+ syringe = null
+
else
..()
diff --git a/code/game/objects/items/devices/PDA/PDA.dm b/code/game/objects/items/devices/PDA/PDA.dm
index 47642603f7..3b0b74ff01 100644
--- a/code/game/objects/items/devices/PDA/PDA.dm
+++ b/code/game/objects/items/devices/PDA/PDA.dm
@@ -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("PDA Message - [owner] -> [P.owner]: [t]")
if(!conversations.Find("\ref[P]"))
diff --git a/code/game/objects/items/devices/chameleonproj.dm b/code/game/objects/items/devices/chameleonproj.dm
index 4b870481fa..9775d64042 100644
--- a/code/game/objects/items/devices/chameleonproj.dm
+++ b/code/game/objects/items/devices/chameleonproj.dm
@@ -47,7 +47,7 @@
qdel(active_dummy)
active_dummy = null
usr << "You deactivate the [src]."
- 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 << "You activate the [src]."
diff --git a/code/game/objects/items/devices/communicator/communicator.dm b/code/game/objects/items/devices/communicator/communicator.dm
index 805bd25046..ba4256830a 100644
--- a/code/game/objects/items/devices/communicator/communicator.dm
+++ b/code/game/objects/items/devices/communicator/communicator.dm
@@ -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 << "Now viewing video session. To leave camera view: OOC -> Cancel Camera View"
+ to_chat(user,"Now viewing video session. To leave camera view, close the communicator window OR: OOC -> Cancel Camera View")
+ to_chat(user,"To return to an active video session, use the communicator in your hand.")
spawn(0)
while(user.machine == video_source && (Adjacent(user) || loc == user))
var/turf/T = get_turf(video_source)
diff --git a/code/game/objects/items/stacks/medical.dm b/code/game/objects/items/stacks/medical.dm
index 15f3310322..db4e890d60 100644
--- a/code/game/objects/items/stacks/medical.dm
+++ b/code/game/objects/items/stacks/medical.dm
@@ -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)
diff --git a/code/game/objects/items/weapons/dice.dm b/code/game/objects/items/weapons/dice.dm
deleted file mode 100644
index 9099ff3bd1..0000000000
--- a/code/game/objects/items/weapons/dice.dm
+++ /dev/null
@@ -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("[user] has thrown [src]. It lands on [result]. [comment]", \
- "You throw [src]. It lands on a [result]. [comment]", \
- "You hear [src] landing on a [result]. [comment]")
diff --git a/code/game/objects/items/weapons/extinguisher.dm b/code/game/objects/items/weapons/extinguisher.dm
index 3bcb68bcee..eba48464f0 100644
--- a/code/game/objects/items/weapons/extinguisher.dm
+++ b/code/game/objects/items/weapons/extinguisher.dm
@@ -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]
diff --git a/code/game/objects/items/weapons/flamethrower.dm b/code/game/objects/items/weapons/flamethrower.dm
index c3f93a016f..84bee72558 100644
--- a/code/game/objects/items/weapons/flamethrower.dm
+++ b/code/game/objects/items/weapons/flamethrower.dm
@@ -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
diff --git a/code/game/objects/items/weapons/grenades/smokebomb.dm b/code/game/objects/items/weapons/grenades/smokebomb.dm
index d64627fcf3..2c89be0ac7 100644
--- a/code/game/objects/items/weapons/grenades/smokebomb.dm
+++ b/code/game/objects/items/weapons/grenades/smokebomb.dm
@@ -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()
diff --git a/code/game/objects/items/weapons/handcuffs.dm b/code/game/objects/items/weapons/handcuffs.dm
index 1190d7f812..62941c24f0 100644
--- a/code/game/objects/items/weapons/handcuffs.dm
+++ b/code/game/objects/items/weapons/handcuffs.dm
@@ -41,6 +41,8 @@
user << "You need to have a firm grip on [C] before you can put \the [src] on!"
/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
diff --git a/code/game/objects/items/weapons/implants/implantreagent_vr.dm b/code/game/objects/items/weapons/implants/implantreagent_vr.dm
new file mode 100644
index 0000000000..615b74ff49
--- /dev/null
+++ b/code/game/objects/items/weapons/implants/implantreagent_vr.dm
@@ -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, "You implant [source] with \the [src].")
+ 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, "[pick(empty_message)]")
+ else if(reagents.total_volume == reagents.maximum_volume && before_gen < reagents.maximum_volume)
+ to_chat(imp_in, "[pick(full_message)]")
+
+/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,"You need an open container to do this!")
+ 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("[usr] [pick(rimplant.emote_descriptor)] into \the [container_name].",
+ "You [pick(rimplant.self_emote_descriptor)] some [rimplant.generated_reagent] into \the [container_name].")
+ if(prob(5))
+ src.visible_message("[src] [pick(rimplant.random_emote)].") // M-mlem.
+ if(rimplant.reagents.total_volume == rimplant.reagents.maximum_volume * 0.05)
+ to_chat(src, "[pick(rimplant.empty_message)]")
+
diff --git a/code/game/objects/items/weapons/shields.dm b/code/game/objects/items/weapons/shields.dm
index 2c47c8ab9d..5e3c96c8a0 100644
--- a/code/game/objects/items/weapons/shields.dm
+++ b/code/game/objects/items/weapons/shields.dm
@@ -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)
diff --git a/code/game/objects/items/weapons/storage/firstaid.dm b/code/game/objects/items/weapons/storage/firstaid.dm
index 61a9a99f96..3ceb940bbb 100644
--- a/code/game/objects/items/weapons/storage/firstaid.dm
+++ b/code/game/objects/items/weapons/storage/firstaid.dm
@@ -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
/*
diff --git a/code/game/objects/items/weapons/storage/misc.dm b/code/game/objects/items/weapons/storage/misc.dm
index bf4856501a..64952046a5 100644
--- a/code/game/objects/items/weapons/storage/misc.dm
+++ b/code/game/objects/items/weapons/storage/misc.dm
@@ -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
*/
diff --git a/code/game/objects/structures/crates_lockers/closets/job_closets.dm b/code/game/objects/structures/crates_lockers/closets/job_closets.dm
index c93f68a82a..25d0e576ea 100644
--- a/code/game/objects/structures/crates_lockers/closets/job_closets.dm
+++ b/code/game/objects/structures/crates_lockers/closets/job_closets.dm
@@ -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)
\ No newline at end of file
diff --git a/code/game/objects/structures/crates_lockers/closets/secure/security.dm b/code/game/objects/structures/crates_lockers/closets/secure/security.dm
index 2bfbe7fe67..b535454c7c 100644
--- a/code/game/objects/structures/crates_lockers/closets/secure/security.dm
+++ b/code/game/objects/structures/crates_lockers/closets/secure/security.dm
@@ -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
diff --git a/code/game/objects/structures/crates_lockers/closets/wardrobe.dm b/code/game/objects/structures/crates_lockers/closets/wardrobe.dm
index 8b7f981d2e..1fb35bc3cb 100644
--- a/code/game/objects/structures/crates_lockers/closets/wardrobe.dm
+++ b/code/game/objects/structures/crates_lockers/closets/wardrobe.dm
@@ -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
diff --git a/code/game/objects/structures/grille.dm b/code/game/objects/structures/grille.dm
index 0691d3d68e..720d8a92d3 100644
--- a/code/game/objects/structures/grille.dm
+++ b/code/game/objects/structures/grille.dm
@@ -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))
@@ -152,7 +152,7 @@
else if(!(W.flags & CONDUCT) || !shock(user, 70))
user.setClickCooldown(DEFAULT_ATTACK_COOLDOWN)
- user.do_attack_animation(src)
+ user.do_attack_animation(src)
playsound(loc, 'sound/effects/grillehit.ogg', 80, 1)
switch(W.damtype)
if("fire")
@@ -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
diff --git a/code/game/objects/structures/lattice.dm b/code/game/objects/structures/lattice.dm
index cd39971e6e..424c0ec997 100644
--- a/code/game/objects/structures/lattice.dm
+++ b/code/game/objects/structures/lattice.dm
@@ -65,7 +65,7 @@
if(WT.welding == 1)
if(WT.remove_fuel(0, user))
user << "Slicing lattice joints ..."
- PoolOrNew(/obj/item/stack/rods, src.loc)
+ new /obj/item/stack/rods(src.loc)
qdel(src)
return
if (istype(C, /obj/item/stack/rods))
diff --git a/code/game/objects/structures/watercloset.dm b/code/game/objects/structures/watercloset.dm
index a382858c54..94aa30c24d 100644
--- a/code/game/objects/structures/watercloset.dm
+++ b/code/game/objects/structures/watercloset.dm
@@ -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)
diff --git a/code/game/objects/structures/window.dm b/code/game/objects/structures/window.dm
index 15d6e32213..809dd008a4 100644
--- a/code/game/objects/structures/window.dm
+++ b/code/game/objects/structures/window.dm
@@ -92,11 +92,11 @@
index = 0
while(index < 2)
new shardtype(loc) //todo pooling?
- if(reinf) PoolOrNew(/obj/item/stack/rods, loc)
+ if(reinf) new /obj/item/stack/rods(loc)
index++
else
new shardtype(loc) //todo pooling?
- if(reinf) PoolOrNew(/obj/item/stack/rods, loc)
+ if(reinf) new /obj/item/stack/rods(loc)
qdel(src)
return
diff --git a/code/game/objects/structures/window_spawner.dm b/code/game/objects/structures/window_spawner.dm
index 7cdf301f6c..d0db6e7f08 100644
--- a/code/game/objects/structures/window_spawner.dm
+++ b/code/game/objects/structures/window_spawner.dm
@@ -35,7 +35,7 @@
/obj/effect/wingrille_spawn/proc/activate()
if(activated) return
if (!locate(/obj/structure/grille) in get_turf(src))
- var/obj/structure/grille/G = PoolOrNew(/obj/structure/grille, src.loc)
+ var/obj/structure/grille/G = new /obj/structure/grille(src.loc)
handle_grille_spawn(G)
var/list/neighbours = list()
for (var/dir in cardinal)
@@ -49,7 +49,7 @@
found_connection = 1
qdel(W)
if(!found_connection)
- var/obj/structure/window/new_win = PoolOrNew(win_path, src.loc)
+ var/obj/structure/window/new_win = new win_path(src.loc)
new_win.set_dir(dir)
handle_window_spawn(new_win)
else
diff --git a/code/game/turfs/initialization/maintenance.dm b/code/game/turfs/initialization/maintenance.dm
index 16b1d03d21..558f638588 100644
--- a/code/game/turfs/initialization/maintenance.dm
+++ b/code/game/turfs/initialization/maintenance.dm
@@ -15,9 +15,10 @@
T.update_dirt()
if(prob(2))
- PoolOrNew(junk(), T)
+ var/type = junk()
+ new type(T)
if(prob(2))
- PoolOrNew(/obj/effect/decal/cleanable/blood/oil, T)
+ new /obj/effect/decal/cleanable/blood/oil(T)
if(prob(25)) // Keep in mind that only "corners" get any sort of web
attempt_web(T, cardinal_turfs)
@@ -54,7 +55,7 @@ var/global/list/random_junk
var/turf/neighbour = get_step(T, dir)
if(neighbour && neighbour.density)
if(dir == WEST)
- PoolOrNew(/obj/effect/decal/cleanable/cobweb, T)
+ new /obj/effect/decal/cleanable/cobweb(T)
if(dir == EAST)
- PoolOrNew(/obj/effect/decal/cleanable/cobweb2, T)
+ new /obj/effect/decal/cleanable/cobweb2(T)
return
diff --git a/code/game/turfs/turf_flick_animations.dm b/code/game/turfs/turf_flick_animations.dm
index 94f5fec4c5..81b248ec0d 100644
--- a/code/game/turfs/turf_flick_animations.dm
+++ b/code/game/turfs/turf_flick_animations.dm
@@ -5,7 +5,7 @@
location = get_turf(target)
if(location && !target)
target = location
- var/atom/movable/overlay/animation = PoolOrNew(/atom/movable/overlay, location)
+ var/atom/movable/overlay/animation = new /atom/movable/overlay(location)
if(direction)
animation.set_dir(direction)
animation.icon = a_icon
diff --git a/code/modules/busy_space/organizations.dm b/code/modules/busy_space/organizations.dm
index affa55ce10..439e1f1b7f 100644
--- a/code/modules/busy_space/organizations.dm
+++ b/code/modules/busy_space/organizations.dm
@@ -249,7 +249,11 @@
"Anything Legal Considered",
"New Toy",
"Me, I'm Always Counting",
- "Just Five More Minutes"
+ "Just Five More Minutes",
+ "Are You Feeling It",
+ "Great White Snark",
+ "No Shirt No Shoes",
+ "Callsign"
)
diff --git a/code/modules/client/preference_setup/loadout/loadout_general.dm b/code/modules/client/preference_setup/loadout/loadout_general.dm
index a97d5776fc..6f3115fd2f 100644
--- a/code/modules/client/preference_setup/loadout/loadout_general.dm
+++ b/code/modules/client/preference_setup/loadout/loadout_general.dm
@@ -10,6 +10,10 @@
display_name = "dice pack (gaming)"
path = /obj/item/weapon/storage/pill_bottle/dice_nerd
+/datum/gear/dice/cup
+ display_name = "dice cup and dice"
+ path = /obj/item/weapon/storage/dicecup/loaded
+
/datum/gear/cards
display_name = "deck of cards"
path = /obj/item/weapon/deck/cards
diff --git a/code/modules/client/preference_setup/loadout/loadout_uniform.dm b/code/modules/client/preference_setup/loadout/loadout_uniform.dm
index ccc5214b55..881da0b8c8 100644
--- a/code/modules/client/preference_setup/loadout/loadout_uniform.dm
+++ b/code/modules/client/preference_setup/loadout/loadout_uniform.dm
@@ -5,6 +5,10 @@
slot = slot_w_uniform
sort_category = "Uniforms and Casual Dress"
+/datum/gear/uniform/blazerskirt
+ display_name = "blazer, blue with skirt"
+ path = /obj/item/clothing/under/blazer/skirt
+
/datum/gear/uniform/cheongsam
display_name = "cheongsam selection"
@@ -190,26 +194,50 @@
display_name = "suit, shiny-black"
path = /obj/item/clothing/under/lawyer/black
+/datum/gear/uniform/suit/shinyblackskirt
+ display_name = "suit, shiny-black skirt"
+ path = /obj/item/clothing/under/lawyer/black/skirt
+
/datum/gear/uniform/suit/blue
display_name = "suit, blue"
path = /obj/item/clothing/under/lawyer/blue
+/datum/gear/uniform/suit/blueskirt
+ display_name = "suit, blue skirt"
+ path = /obj/item/clothing/under/lawyer/blue/skirt
+
/datum/gear/uniform/suit/burgundy
display_name = "suit, burgundy"
path = /obj/item/clothing/under/suit_jacket/burgundy
+/datum/gear/uniform/suit/burgundyskirt
+ display_name = "suit, burgundy skirt"
+ path = /obj/item/clothing/under/suit_jacket/burgundy/skirt
+
/datum/gear/uniform/suit/checkered
display_name = "suit, checkered"
path = /obj/item/clothing/under/suit_jacket/checkered
+/datum/gear/uniform/suit/checkeredskirt
+ display_name = "suit, checkered skirt"
+ path = /obj/item/clothing/under/suit_jacket/checkered/skirt
+
/datum/gear/uniform/suit/charcoal
display_name = "suit, charcoal"
path = /obj/item/clothing/under/suit_jacket/charcoal
+/datum/gear/uniform/suit/charcoalskirt
+ display_name = "suit, charcoal skirt"
+ path = /obj/item/clothing/under/suit_jacket/charcoal/skirt
+
/datum/gear/uniform/suit/exec
display_name = "suit, executive"
path = /obj/item/clothing/under/suit_jacket/really_black
+/datum/gear/uniform/suit/execskirt
+ display_name = "suit, executive skirt"
+ path = /obj/item/clothing/under/suit_jacket/really_black/skirt
+
/datum/gear/uniform/suit/femaleexec
display_name = "suit, female-executive"
path = /obj/item/clothing/under/suit_jacket/female
@@ -218,18 +246,34 @@
display_name = "suit, gentlemen"
path = /obj/item/clothing/under/gentlesuit
+/datum/gear/uniform/suit/gentleskirt
+ display_name = "suit, lady"
+ path = /obj/item/clothing/under/gentlesuit/skirt
+
/datum/gear/uniform/suit/navy
display_name = "suit, navy"
path = /obj/item/clothing/under/suit_jacket/navy
+/datum/gear/uniform/suit/navyskirt
+ display_name = "suit, navy skirt"
+ path = /obj/item/clothing/under/suit_jacket/navy/skirt
+
/datum/gear/uniform/suit/red
display_name = "suit, red"
path = /obj/item/clothing/under/suit_jacket/red
+/datum/gear/uniform/suit/redskirt
+ display_name = "suit, red skirt"
+ path = /obj/item/clothing/under/suit_jacket/red/skirt
+
/datum/gear/uniform/suit/redlawyer
display_name = "suit, lawyer-red"
path = /obj/item/clothing/under/lawyer/red
+/datum/gear/uniform/suit/redlawyerskirt
+ display_name = "suit, lawyer-red skirt"
+ path = /obj/item/clothing/under/lawyer/red/skirt
+
/datum/gear/uniform/suit/oldman
display_name = "suit, old-man"
path = /obj/item/clothing/under/lawyer/oldman
@@ -238,18 +282,49 @@
display_name = "suit, purple"
path = /obj/item/clothing/under/lawyer/purpsuit
+/datum/gear/uniform/suit/purpleskirt
+ display_name = "suit, purple skirt"
+ path = /obj/item/clothing/under/lawyer/purpsuit/skirt
+
/datum/gear/uniform/suit/tan
display_name = "suit, tan"
path = /obj/item/clothing/under/suit_jacket/tan
+/datum/gear/uniform/suit/tanskirt
+ display_name = "suit, tan skirt"
+ path = /obj/item/clothing/under/suit_jacket/tan/skirt
+
/datum/gear/uniform/suit/white
display_name = "suit, white"
path = /obj/item/clothing/under/scratch
+/datum/gear/uniform/suit/whiteskirt
+ display_name = "suit, white skirt"
+ path = /obj/item/clothing/under/scratch/skirt
+
/datum/gear/uniform/suit/whiteblue
display_name = "suit, white-blue"
path = /obj/item/clothing/under/lawyer/bluesuit
+/datum/gear/uniform/suit/whiteblueskirt
+ display_name = "suit, white-blue skirt"
+ path = /obj/item/clothing/under/lawyer/bluesuit/skirt
+
+/datum/gear/uniform/suit/detectiveskirt
+ display_name = "suit, detective skirt (Detective)"
+ path = /obj/item/clothing/under/det/skirt
+ allowed_roles = list("Detective")
+
+/datum/gear/uniform/suit/iaskirt
+ display_name = "suit, Internal Affairs skirt (Internal Affairs)"
+ path = /obj/item/clothing/under/rank/internalaffairs/skirt
+ allowed_roles = list("Internal Affairs Agent")
+
+/datum/gear/uniform/suit/bartenderskirt
+ display_name = "suit, bartender skirt (Bartender)"
+ path = /obj/item/clothing/under/rank/bartender/skirt
+ allowed_roles = list("Bartender")
+
/datum/gear/uniform/scrubs
display_name = "scrubs, black"
path = /obj/item/clothing/under/rank/medical/black
@@ -271,6 +346,10 @@
display_name = "scrubs, navy blue"
path = /obj/item/clothing/under/rank/medical/navyblue
+/datum/gear/uniform/oldwoman
+ display_name = "old woman attire"
+ path = /obj/item/clothing/under/lawyer/oldwoman
+
/datum/gear/uniform/sundress
display_name = "sundress"
path = /obj/item/clothing/under/sundress
diff --git a/code/modules/client/preference_setup/vore/01_ears.dm b/code/modules/client/preference_setup/vore/01_ears.dm
index f891cf552b..9757e28846 100644
--- a/code/modules/client/preference_setup/vore/01_ears.dm
+++ b/code/modules/client/preference_setup/vore/01_ears.dm
@@ -74,7 +74,7 @@
var/tail_display = "Normal"
if(pref.tail_style && (pref.tail_style in tail_styles_list))
- var/datum/sprite_accessory/ears/instance = tail_styles_list[pref.tail_style]
+ var/datum/sprite_accessory/tail/instance = tail_styles_list[pref.tail_style]
tail_display = instance.name
else if(pref.tail_style)
tail_display = "REQUIRES UPDATE"
@@ -116,7 +116,7 @@
else if(href_list["tail_style"])
// Construct the list of names allowed for this user.
- var/list/pretty_tail_styles = list("Normal")
+ var/list/pretty_tail_styles = list("Normal" = null)
for(var/path in tail_styles_list)
var/datum/sprite_accessory/tail/instance = tail_styles_list[path]
if((!instance.ckeys_allowed) || (user.ckey in instance.ckeys_allowed))
@@ -124,13 +124,8 @@
// Present choice to user
var/selection = input(user, "Pick tails", "Character Preference") as null|anything in pretty_tail_styles
- if(selection && selection != "Normal")
- pref.tail_style = pretty_tail_styles[selection]
- else
- if(pref.tail_style)
- return TOPIC_REFRESH_UPDATE_PREVIEW
- else
- pref.tail_style = null
+ pref.tail_style = pretty_tail_styles[selection]
+
return TOPIC_REFRESH_UPDATE_PREVIEW
else if(href_list["tail_color"])
diff --git a/code/modules/clothing/glasses/glasses.dm b/code/modules/clothing/glasses/glasses.dm
index 9e27f5c73d..4fb748f73a 100644
--- a/code/modules/clothing/glasses/glasses.dm
+++ b/code/modules/clothing/glasses/glasses.dm
@@ -132,7 +132,7 @@ BLIND // can't see anything
eye = !eye
if(eye)
- icon_state = "[icon_state]_r"
+ icon_state = "[icon_state]_1"
else
icon_state = initial(icon_state)
update_clothing_icon()
@@ -395,7 +395,8 @@ BLIND // can't see anything
toggleable = 1
action_button_name = "Toggle Goggles"
vision_flags = SEE_MOBS
- see_invisible = INVISIBILITY_LEVEL_TWO
+ see_invisible = SEE_INVISIBLE_NOLIGHTING
+
emp_act(severity)
if(istype(src.loc, /mob/living/carbon/human))
diff --git a/code/modules/clothing/spacesuits/rig/modules/ninja.dm b/code/modules/clothing/spacesuits/rig/modules/ninja.dm
index da4e8c9da5..075411cd29 100644
--- a/code/modules/clothing/spacesuits/rig/modules/ninja.dm
+++ b/code/modules/clothing/spacesuits/rig/modules/ninja.dm
@@ -183,7 +183,7 @@
/obj/item/rig_module/self_destruct/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/rig_module/self_destruct/Destroy()
diff --git a/code/modules/clothing/suits/armor_vr.dm b/code/modules/clothing/suits/armor_vr.dm
index 49ee283ec1..509b58e546 100644
--- a/code/modules/clothing/suits/armor_vr.dm
+++ b/code/modules/clothing/suits/armor_vr.dm
@@ -33,6 +33,7 @@
H << "You need to have a wolf-taur half to wear this."
return 0
+
/obj/item/clothing/suit/storage/vest/hoscoat
armor = list(melee = 60, bullet = 60, laser = 60, energy = 40, bomb = 40, bio = 0, rad = 0)
diff --git a/code/modules/clothing/suits/miscellaneous.dm b/code/modules/clothing/suits/miscellaneous.dm
index 4394d66195..cd345fc8aa 100644
--- a/code/modules/clothing/suits/miscellaneous.dm
+++ b/code/modules/clothing/suits/miscellaneous.dm
@@ -257,6 +257,14 @@
body_parts_covered = UPPER_TORSO|LOWER_TORSO|LEGS|FEET|ARMS|HANDS
flags_inv = HIDEGLOVES|HIDESHOES|HIDEJUMPSUIT|HIDETAIL|HIDETIE|HIDEHOLSTER
+/obj/item/clothing/suit/straight_jacket/attack_hand(mob/living/user as mob)
+ if(ishuman(user))
+ var/mob/living/carbon/human/H = user
+ if(src == H.wear_suit)
+ to_chat(H, "You need help taking this off!")
+ return
+ ..()
+
/obj/item/clothing/suit/ianshirt
name = "worn shirt"
desc = "A worn out, curiously comfortable t-shirt with a picture of Ian. You wouldn't go so far as to say it feels like being hugged when you wear it but it's pretty close. Good for sleeping in."
diff --git a/code/modules/clothing/under/accessories/holster.dm b/code/modules/clothing/under/accessories/holster.dm
index a68605ff91..5d734c9d95 100644
--- a/code/modules/clothing/under/accessories/holster.dm
+++ b/code/modules/clothing/under/accessories/holster.dm
@@ -107,7 +107,7 @@
if(!H.holstered)
var/obj/item/W = usr.get_active_hand()
if(!istype(W, /obj/item))
- usr << "You need your gun equiped to holster it."
+ usr << "You need your gun equipped to holster it."
return
H.holster(W, usr)
else
diff --git a/code/modules/clothing/under/jobs/civilian.dm b/code/modules/clothing/under/jobs/civilian.dm
index a6b5c15ea3..d14cff333b 100644
--- a/code/modules/clothing/under/jobs/civilian.dm
+++ b/code/modules/clothing/under/jobs/civilian.dm
@@ -6,6 +6,12 @@
icon_state = "ba_suit"
rolled_sleeves = 0
+/obj/item/clothing/under/rank/bartender/skirt
+ desc = "Short and cute."
+ name = "bartender's skirt"
+ icon_state = "ba_suit_skirt"
+ item_state_slots = list(slot_r_hand_str = "ba_suit", slot_l_hand_str = "ba_suit")
+
/obj/item/clothing/under/rank/captain //Alright, technically not a 'civilian' but its better then giving a .dm file for a single define.
desc = "It's a blue jumpsuit with some gold markings denoting the rank of \"Colony Director\"."
name = "colony director's jumpsuit"
@@ -97,6 +103,11 @@
rolled_sleeves = 0
starting_accessories = list(/obj/item/clothing/accessory/black)
+/obj/item/clothing/under/rank/internalaffairs/skirt
+ desc = "The plain, professional attire of an Internal Affairs Agent. The top button is sewn shut."
+ name = "Internal Affairs skirt"
+ icon_state = "internalaffairs_skirt"
+
/obj/item/clothing/under/rank/janitor
desc = "It's the official uniform of the station's janitor. It has minor protection from biohazards."
name = "janitor's jumpsuit"
@@ -112,6 +123,11 @@
name = "black Lawyer suit"
icon_state = "lawyer_black"
+/obj/item/clothing/under/lawyer/black/skirt
+ name = "black Lawyer skirt"
+ icon_state = "lawyer_black_skirt"
+ item_state_slots = list(slot_r_hand_str = "lawyer_black", slot_l_hand_str = "lawyer_black")
+
/obj/item/clothing/under/lawyer/female
name = "black Lawyer suit"
icon_state = "black_suit_fem"
@@ -121,28 +137,52 @@
name = "red Lawyer suit"
icon_state = "lawyer_red"
+/obj/item/clothing/under/lawyer/red/skirt
+ name = "red Lawyer skirt"
+ icon_state = "lawyer_red_skirt"
+ item_state_slots = list(slot_r_hand_str = "lawyer_red", slot_l_hand_str = "lawyer_red")
+
/obj/item/clothing/under/lawyer/blue
name = "blue Lawyer suit"
icon_state = "lawyer_blue"
+/obj/item/clothing/under/lawyer/blue/skirt
+ name = "blue Lawyer skirt"
+ icon_state = "lawyer_blue_skirt"
+ item_state_slots = list(slot_r_hand_str = "lawyer_blue", slot_l_hand_str = "lawyer_blue")
+
/obj/item/clothing/under/lawyer/bluesuit
- name = "Blue Suit"
+ name = "blue suit"
desc = "A classy suit."
icon_state = "bluesuit"
item_state_slots = list(slot_r_hand_str = "lawyer_blue", slot_l_hand_str = "lawyer_blue")
starting_accessories = list(/obj/item/clothing/accessory/red)
+/obj/item/clothing/under/lawyer/bluesuit/skirt
+ name = "blue skirt suit"
+ icon_state = "bluesuit_skirt"
+
/obj/item/clothing/under/lawyer/purpsuit
- name = "Purple Suit"
+ name = "purple Suit"
icon_state = "lawyer_purp"
item_state_slots = list(slot_r_hand_str = "purple", slot_l_hand_str = "purple")
+/obj/item/clothing/under/lawyer/purpsuit/skirt
+ name = "purple skirt suit"
+ icon_state = "lawyer_purp_skirt"
+
/obj/item/clothing/under/lawyer/oldman
name = "Old Man's Suit"
desc = "A classic suit for the older gentleman with built in back support."
icon_state = "oldman"
item_state_slots = list(slot_r_hand_str = "johnny", slot_l_hand_str = "johnny")
+/obj/item/clothing/under/lawyer/oldwoman
+ name = "Old Woman's Attire"
+ desc = "A typical outfit for the older woman, a lovely cardigan and comfortable skirt."
+ icon_state = "oldwoman"
+ item_state_slots = list(slot_r_hand_str = "johnny", slot_l_hand_str = "johnny")
+
/obj/item/clothing/under/librarian
name = "sensible suit"
desc = "It's very... sensible."
diff --git a/code/modules/clothing/under/jobs/security.dm b/code/modules/clothing/under/jobs/security.dm
index c745e7e9b4..02dde0f815 100644
--- a/code/modules/clothing/under/jobs/security.dm
+++ b/code/modules/clothing/under/jobs/security.dm
@@ -113,6 +113,12 @@
desc = "A serious-looking tan dress shirt paired with freshly-pressed black slacks, complete with a red striped tie and waistcoat."
starting_accessories = list(/obj/item/clothing/accessory/red_long, /obj/item/clothing/accessory/wcoat)
+/obj/item/clothing/under/det/skirt
+ name = "detective's skirt"
+ icon_state = "detective_skirt"
+ desc = "A serious-looking white blouse paired with a formal black pencil skirt."
+ item_state_slots = list(slot_r_hand_str = "sl_suit", slot_l_hand_str = "sl_suit")
+
/*
* Head of Security
*/
diff --git a/code/modules/clothing/under/miscellaneous.dm b/code/modules/clothing/under/miscellaneous.dm
index cd7c47fb3d..f58d601d8a 100644
--- a/code/modules/clothing/under/miscellaneous.dm
+++ b/code/modules/clothing/under/miscellaneous.dm
@@ -21,6 +21,11 @@
desc = "A white suit, suitable for an excellent host"
icon_state = "scratch"
+/obj/item/clothing/under/scratch/skirt
+ name = "white skirt suit"
+ icon_state = "scratch_skirt"
+ item_state_slots = list(slot_r_hand_str = "scratch", slot_l_hand_str = "scratch")
+
/obj/item/clothing/under/sl_suit
desc = "It's a very amish looking suit."
name = "amish suit"
@@ -98,6 +103,11 @@
rolled_sleeves = 0
starting_accessories = list(/obj/item/clothing/accessory/darkgreen)
+/obj/item/clothing/under/gov/skirt
+ name = "Green formal skirt uniform"
+ desc = "A neat proper uniform of someone on offical business. The top button is sewn shut."
+ icon_state = "greensuit_skirt"
+
/obj/item/clothing/under/space
name = "\improper NASA jumpsuit"
desc = "It has a NASA logo on it and is made of space-proofed materials."
@@ -147,24 +157,37 @@
/obj/item/clothing/under/gentlesuit
name = "gentlemans suit"
- desc = "A silk black shirt with a white tie and a matching gray vest and slacks. Feels proper."
+ desc = "A silk black shirt with matching gray slacks. Feels proper."
icon_state = "gentlesuit"
item_state_slots = list(slot_r_hand_str = "grey", slot_l_hand_str = "grey")
rolled_sleeves = 0
starting_accessories = list(/obj/item/clothing/accessory/white, /obj/item/clothing/accessory/wcoat/gentleman)
+/obj/item/clothing/under/gentlesuit/skirt
+ name = "lady's suit"
+ desc = "A silk black blouse with a matching gray skirt. Feels proper."
+ icon_state = "gentlesuit_skirt"
+
/obj/item/clothing/under/gimmick/rank/captain/suit
name = "colony director's suit"
desc = "A green suit and yellow necktie. Exemplifies authority."
icon_state = "green_suit"
item_state_slots = list(slot_r_hand_str = "centcom", slot_l_hand_str = "centcom")
+/obj/item/clothing/under/gimmick/rank/captain/suit/skirt
+ name = "colony director's skirt suit"
+ icon_state = "green_suit_skirt"
+
/obj/item/clothing/under/gimmick/rank/head_of_personnel/suit
name = "head of personnel's suit"
desc = "A teal suit and yellow necktie. An authoritative yet tacky ensemble."
icon_state = "teal_suit"
item_state_slots = list(slot_r_hand_str = "green", slot_l_hand_str = "green")
+/obj/item/clothing/under/gimmick/rank/head_of_personnel/suit/skirt
+ name = "head of personnel's skirt suit"
+ icon_state = "teal_suit_skirt"
+
/obj/item/clothing/under/suit_jacket
name = "black suit"
desc = "A black suit and red tie. Very formal."
@@ -177,6 +200,11 @@
icon_state = "really_black_suit"
item_state_slots = list(slot_r_hand_str = "lawyer_black", slot_l_hand_str = "lawyer_black")
+/obj/item/clothing/under/suit_jacket/really_black/skirt
+ name = "executive skirt suit"
+ desc = "A formal black suit and red necktie, intended for the station's finest."
+ icon_state = "really_black_suit_skirt"
+
/obj/item/clothing/under/suit_jacket/female
name = "executive suit"
desc = "A formal trouser suit for women, intended for the station's finest."
@@ -196,6 +224,11 @@
icon_state = "red_suit"
item_state_slots = list(slot_r_hand_str = "lawyer_red", slot_l_hand_str = "lawyer_red")
+/obj/item/clothing/under/suit_jacket/red/skirt
+ name = "red skirt suit"
+ desc = "A red suit and blue necktie. Somewhat formal."
+ icon_state = "red_suit_skirt"
+
/obj/item/clothing/under/schoolgirl
name = "schoolgirl uniform"
desc = "It's just like one of my Japanese animes!"
@@ -421,6 +454,10 @@
item_state_slots = list(slot_r_hand_str = "lawyer_black", slot_l_hand_str = "lawyer_black")
starting_accessories = list(/obj/item/clothing/accessory/navy, /obj/item/clothing/accessory/charcoal_jacket)
+/obj/item/clothing/under/suit_jacket/charcoal/skirt
+ name = "charcoal skirt"
+ icon_state = "charcoal_suit_skirt"
+
/obj/item/clothing/under/suit_jacket/navy
name = "navy suit"
desc = "A navy suit and red tie, intended for the station's finest."
@@ -428,6 +465,10 @@
item_state_slots = list(slot_r_hand_str = "lawyer_blue", slot_l_hand_str = "lawyer_blue")
starting_accessories = list(/obj/item/clothing/accessory/red, /obj/item/clothing/accessory/navy_jacket)
+/obj/item/clothing/under/suit_jacket/navy/skirt
+ name = "navy skirt"
+ icon_state = "navy_suit_skirt"
+
/obj/item/clothing/under/suit_jacket/burgundy
name = "burgundy suit"
desc = "A burgundy suit and black tie. Somewhat formal."
@@ -435,6 +476,10 @@
item_state_slots = list(slot_r_hand_str = "lawyer_red", slot_l_hand_str = "lawyer_red")
starting_accessories = list(/obj/item/clothing/accessory/black, /obj/item/clothing/accessory/burgundy_jacket)
+/obj/item/clothing/under/suit_jacket/burgundy/skirt
+ name = "burgundy skirt"
+ icon_state = "burgundy_suit_skirt"
+
/obj/item/clothing/under/suit_jacket/checkered
name = "checkered suit"
desc = "That's a very nice suit you have there. Shame if something were to happen to it, eh?"
@@ -442,6 +487,10 @@
item_state_slots = list(slot_r_hand_str = "lawyer_black", slot_l_hand_str = "lawyer_black")
starting_accessories = list(/obj/item/clothing/accessory/black, /obj/item/clothing/accessory/checkered_jacket)
+/obj/item/clothing/under/suit_jacket/checkered/skirt
+ name = "checkered skirt"
+ icon_state = "checkered_suit_skirt"
+
/obj/item/clothing/under/suit_jacket/tan
name = "tan suit"
desc = "A tan suit. Smart, but casual."
@@ -449,6 +498,10 @@
item_state_slots = list(slot_r_hand_str = "tan_suit", slot_l_hand_str = "tan_suit")
starting_accessories = list(/obj/item/clothing/accessory/yellow, /obj/item/clothing/accessory/tan_jacket)
+/obj/item/clothing/under/suit_jacket/tan/skirt
+ name = "tan skirt"
+ icon_state = "tan_suit_skirt"
+
/obj/item/clothing/under/serviceoveralls
name = "workman outfit"
desc = "The very image of a working man. Not that you're probably doing work."
@@ -483,6 +536,11 @@
icon_state = "blue_blazer"
item_state_slots = list(slot_r_hand_str = "lawyer_blue", slot_l_hand_str = "lawyer_blue")
+/obj/item/clothing/under/blazer/skirt
+ name = "ladies blue blazer"
+ desc = "A bold but yet conservative outfit, a red pencil skirt and a navy blazer."
+ icon_state = "blue_blazer_skirt"
+
/obj/item/clothing/under/croptop
name = "crop top"
desc = "A shirt that has had the top cropped. This one is NT sponsored."
diff --git a/code/modules/games/dice.dm b/code/modules/games/dice.dm
new file mode 100644
index 0000000000..039631cdb4
--- /dev/null
+++ b/code/modules/games/dice.dm
@@ -0,0 +1,157 @@
+/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
+ var/result = 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
+ result = 4
+
+/obj/item/weapon/dice/d8
+ name = "d8"
+ desc = "A dice with eight sides."
+ icon_state = "d88"
+ sides = 8
+ result = 8
+
+/obj/item/weapon/dice/d10
+ name = "d10"
+ desc = "A dice with ten sides."
+ icon_state = "d1010"
+ sides = 10
+ result = 10
+
+/obj/item/weapon/dice/d12
+ name = "d12"
+ desc = "A dice with twelve sides."
+ icon_state = "d1212"
+ sides = 12
+ result = 12
+
+/obj/item/weapon/dice/d20
+ name = "d20"
+ desc = "A dice with twenty sides."
+ icon_state = "d2020"
+ sides = 20
+ result = 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
+ result = 10
+
+/obj/item/weapon/dice/attack_self(mob/user as mob)
+ rollDice(user, 0)
+
+/obj/item/weapon/dice/proc/rollDice(mob/user as mob, var/silent = 0)
+ result = rand(1, sides)
+ icon_state = "[name][result]"
+
+ if(!silent)
+ var/comment = ""
+ if(sides == 20 && result == 20)
+ comment = "Nat 20!"
+ else if(sides == 20 && result == 1)
+ comment = "Ouch, bad luck."
+
+ user.visible_message("[user] has thrown [src]. It lands on [result]. [comment]", \
+ "You throw [src]. It lands on a [result]. [comment]", \
+ "You hear [src] landing on a [result]. [comment]")
+
+/*
+ * Dice packs
+ */
+
+/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 )
+
+/*
+ *Liar's Dice cup
+ */
+
+/obj/item/weapon/storage/dicecup
+ name = "dice cup"
+ desc = "A cup used to conceal and hold dice."
+ icon = 'icons/obj/dice.dmi'
+ icon_state = "dicecup"
+ w_class = ITEMSIZE_SMALL
+ storage_slots = 5
+ can_hold = list(
+ /obj/item/weapon/dice,
+ )
+
+/obj/item/weapon/storage/dicecup/attack_self(mob/user as mob)
+ user.visible_message("[user] shakes [src].", \
+ "You shake [src].", \
+ "You hear dice rolling.")
+ rollCup(user)
+
+/obj/item/weapon/storage/dicecup/proc/rollCup(mob/user as mob)
+ for(var/obj/item/weapon/dice/I in src.contents)
+ var/obj/item/weapon/dice/D = I
+ D.rollDice(user, 1)
+
+/obj/item/weapon/storage/dicecup/proc/revealDice(var/mob/viewer)
+ for(var/obj/item/weapon/dice/I in src.contents)
+ var/obj/item/weapon/dice/D = I
+ to_chat(viewer, "The [D.name] shows a [D.result].")
+
+/obj/item/weapon/storage/dicecup/verb/peekAtDice()
+ set category = "Object"
+ set name = "Peek at Dice"
+ set desc = "Peek at the dice under your cup."
+
+ revealDice(usr)
+
+/obj/item/weapon/storage/dicecup/verb/revealDiceHand()
+
+ set category = "Object"
+ set name = "Reveal Dice"
+ set desc = "Reveal the dice hidden under your cup."
+
+ for(var/mob/living/player in viewers(3))
+ to_chat(player, "[usr] reveals their dice.")
+ revealDice(player)
+
+
+/obj/item/weapon/storage/dicecup/loaded/New()
+ ..()
+ for(var/i = 1 to 5)
+ new /obj/item/weapon/dice( src )
\ No newline at end of file
diff --git a/code/modules/hydroponics/seed_controller.dm b/code/modules/hydroponics/seed_controller.dm
index 89cb299f5f..82b2f62abd 100644
--- a/code/modules/hydroponics/seed_controller.dm
+++ b/code/modules/hydroponics/seed_controller.dm
@@ -13,11 +13,11 @@
if(!holder) return
if(!plant_controller || !plant_controller.gene_tag_masks)
- usr << "Gene masks not set."
+ to_chat(usr, "Gene masks not set.")
return
for(var/mask in plant_controller.gene_tag_masks)
- usr << "[mask]: [plant_controller.gene_tag_masks[mask]]"
+ to_chat(usr, "[mask]: [plant_controller.gene_tag_masks[mask]]")
var/global/datum/controller/plants/plant_controller // Set in New().
@@ -33,6 +33,8 @@ var/global/datum/controller/plants/plant_controller // Set in New().
var/list/plant_sprites = list() // List of all harvested product sprites.
var/list/plant_product_sprites = list() // List of all growth sprites plus number of growth stages.
var/processing = 0 // Off/on.
+ var/list/gene_masked_list = list() // Stored gene masked list, rather than recreating it when needed.
+ var/list/plant_gene_datums = list() // Stored datum versions of the gene masked list.
/datum/controller/plants/New()
if(plant_controller && plant_controller != src)
@@ -83,6 +85,7 @@ var/global/datum/controller/plants/plant_controller // Set in New().
S.update_seed()
//Might as well mask the gene types while we're at it.
+ var/list/gene_datums = decls_repository.decls_of_subtype(/decl/plantgene)
var/list/used_masks = list()
var/list/plant_traits = ALL_GENES
while(plant_traits && plant_traits.len)
@@ -92,9 +95,18 @@ var/global/datum/controller/plants/plant_controller // Set in New().
while(gene_mask in used_masks)
gene_mask = "[uppertext(num2hex(rand(0,255)))]"
+ var/decl/plantgene/G
+
+ for(var/D in gene_datums)
+ var/decl/plantgene/P = gene_datums[D]
+ if(gene_tag == P.gene_tag)
+ G = P
+ gene_datums -= D
used_masks += gene_mask
plant_traits -= gene_tag
gene_tag_masks[gene_tag] = gene_mask
+ plant_gene_datums[gene_mask] = G
+ gene_masked_list.Add(list(list("tag" = gene_tag, "mask" = gene_mask)))
// Proc for creating a random seed type.
/datum/controller/plants/proc/create_random_seed(var/survive_on_station)
@@ -147,4 +159,4 @@ var/global/datum/controller/plants/plant_controller // Set in New().
plant_queue |= plant
/datum/controller/plants/proc/remove_plant(var/obj/effect/plant/plant)
- plant_queue -= plant
+ plant_queue -= plant
\ No newline at end of file
diff --git a/code/modules/hydroponics/seed_gene_mut.dm b/code/modules/hydroponics/seed_gene_mut.dm
new file mode 100644
index 0000000000..cdb7048957
--- /dev/null
+++ b/code/modules/hydroponics/seed_gene_mut.dm
@@ -0,0 +1,135 @@
+/datum/seed/proc/diverge_mutate_gene(var/decl/plantgene/G, var/turf/T)
+ if(!istype(G))
+ log_debug("Attempted to mutate [src] with a non-plantgene var.")
+ return src
+
+ var/datum/seed/S = diverge() //Let's not modify all of the seeds.
+ T.visible_message("\The [S.display_name] quivers!") //Mimicks the normal mutation.
+ G.mutate(S, T)
+
+ return S
+
+/decl/plantgene
+ var/gene_tag
+
+/decl/plantgene/biochem
+ gene_tag = GENE_BIOCHEMISTRY
+
+/decl/plantgene/hardiness
+ gene_tag = GENE_HARDINESS
+
+/decl/plantgene/environment
+ gene_tag = GENE_ENVIRONMENT
+
+/decl/plantgene/metabolism
+ gene_tag = GENE_METABOLISM
+
+/decl/plantgene/structure
+ gene_tag = GENE_STRUCTURE
+
+/decl/plantgene/diet
+ gene_tag = GENE_DIET
+
+/decl/plantgene/pigment
+ gene_tag = GENE_PIGMENT
+
+/decl/plantgene/output
+ gene_tag = GENE_OUTPUT
+
+/decl/plantgene/atmosphere
+ gene_tag = GENE_ATMOSPHERE
+
+/decl/plantgene/vigour
+ gene_tag = GENE_VIGOUR
+
+/decl/plantgene/fruit
+ gene_tag = GENE_FRUIT
+
+/decl/plantgene/special
+ gene_tag = GENE_SPECIAL
+
+/decl/plantgene/proc/mutate(var/datum/seed/S)
+ return
+
+/decl/plantgene/biochem/mutate(var/datum/seed/S)
+ S.set_trait(TRAIT_POTENCY, S.get_trait(TRAIT_POTENCY)+rand(-20,20),200, 0)
+
+/decl/plantgene/hardiness/mutate(var/datum/seed/S)
+ if(prob(60))
+ S.set_trait(TRAIT_TOXINS_TOLERANCE, S.get_trait(TRAIT_TOXINS_TOLERANCE)+rand(-2,2),10,0)
+ if(prob(60))
+ S.set_trait(TRAIT_PEST_TOLERANCE, S.get_trait(TRAIT_PEST_TOLERANCE)+rand(-2,2),10,0)
+ if(prob(60))
+ S.set_trait(TRAIT_WEED_TOLERANCE, S.get_trait(TRAIT_WEED_TOLERANCE)+rand(-2,2),10,0)
+ if(prob(60))
+ S.set_trait(TRAIT_ENDURANCE, S.get_trait(TRAIT_ENDURANCE)+rand(-5,5),100,0)
+
+/decl/plantgene/environment/mutate(var/datum/seed/S)
+ if(prob(60))
+ S.set_trait(TRAIT_IDEAL_HEAT, S.get_trait(TRAIT_IDEAL_HEAT)+rand(-2,2),10,0)
+ if(prob(60))
+ S.set_trait(TRAIT_IDEAL_LIGHT, S.get_trait(TRAIT_IDEAL_LIGHT)+rand(-2,2),10,0)
+ if(prob(60))
+ S.set_trait(TRAIT_LIGHT_TOLERANCE, S.get_trait(TRAIT_LIGHT_TOLERANCE)+rand(-5,5),100,0)
+
+/decl/plantgene/metabolism/mutate(var/datum/seed/S)
+ if(prob(65))
+ S.set_trait(TRAIT_REQUIRES_NUTRIENTS, S.get_trait(TRAIT_REQUIRES_NUTRIENTS)+rand(-2,2),10,0)
+ if(prob(65))
+ S.set_trait(TRAIT_REQUIRES_WATER, S.get_trait(TRAIT_REQUIRES_WATER)+rand(-2,2),10,0)
+ if(prob(40))
+ S.set_trait(TRAIT_ALTER_TEMP, S.get_trait(TRAIT_ALTER_TEMP)+rand(-5,5),100,0)
+
+/decl/plantgene/diet/mutate(var/datum/seed/S)
+ if(prob(60))
+ S.set_trait(TRAIT_CARNIVOROUS, S.get_trait(TRAIT_CARNIVOROUS)+rand(-1,1),2,0)
+ if(prob(60))
+ S.set_trait(TRAIT_PARASITE, !S.get_trait(TRAIT_PARASITE))
+ if(prob(65))
+ S.set_trait(TRAIT_NUTRIENT_CONSUMPTION, S.get_trait(TRAIT_NUTRIENT_CONSUMPTION)+rand(-0.1,0.1),5,0)
+ if(prob(65))
+ S.set_trait(TRAIT_WATER_CONSUMPTION, S.get_trait(TRAIT_WATER_CONSUMPTION)+rand(-1,1),50,0)
+
+/decl/plantgene/output/mutate(var/datum/seed/S, var/turf/T)
+ if(prob(50))
+ S.set_trait(TRAIT_BIOLUM, !S.get_trait(TRAIT_BIOLUM))
+ if(S.get_trait(TRAIT_BIOLUM))
+ T.visible_message("\The [S.display_name] begins to glow!")
+ if(prob(50))
+ S.set_trait(TRAIT_BIOLUM_COLOUR,get_random_colour(0,75,190))
+ T.visible_message("\The [S.display_name]'s glow changes colour!")
+ else
+ T.visible_message("\The [S.display_name]'s glow dims...")
+ if(prob(60))
+ S.set_trait(TRAIT_PRODUCES_POWER, !S.get_trait(TRAIT_PRODUCES_POWER))
+
+/decl/plantgene/atmosphere/mutate(var/datum/seed/S)
+ if(prob(60))
+ S.set_trait(TRAIT_TOXINS_TOLERANCE, S.get_trait(TRAIT_TOXINS_TOLERANCE)+rand(-2,2),10,0)
+ if(prob(60))
+ S.set_trait(TRAIT_PEST_TOLERANCE, S.get_trait(TRAIT_PEST_TOLERANCE)+rand(-2,2),10,0)
+ if(prob(60))
+ S.set_trait(TRAIT_WEED_TOLERANCE, S.get_trait(TRAIT_WEED_TOLERANCE)+rand(-2,2),10,0)
+ if(prob(60))
+ S.set_trait(TRAIT_ENDURANCE, S.get_trait(TRAIT_ENDURANCE)+rand(-5,5),100,0)
+
+/decl/plantgene/vigour/mutate(var/datum/seed/S, var/turf/T)
+ if(prob(65))
+ S.set_trait(TRAIT_PRODUCTION, S.get_trait(TRAIT_PRODUCTION)+rand(-1,1),10,0)
+ if(prob(65))
+ S.set_trait(TRAIT_MATURATION, S.get_trait(TRAIT_MATURATION)+rand(-1,1),30,0)
+ if(prob(55))
+ S.set_trait(TRAIT_SPREAD, S.get_trait(TRAIT_SPREAD)+rand(-1,1),2,0)
+ T.visible_message("\The [S.display_name] spasms visibly, shifting in the tray.")
+
+/decl/plantgene/fruit/mutate(var/datum/seed/S)
+ if(prob(65))
+ S.set_trait(TRAIT_STINGS, !S.get_trait(TRAIT_STINGS))
+ if(prob(65))
+ S.set_trait(TRAIT_EXPLOSIVE, !S.get_trait(TRAIT_EXPLOSIVE))
+ if(prob(65))
+ S.set_trait(TRAIT_JUICY, !S.get_trait(TRAIT_JUICY))
+
+/decl/plantgene/special/mutate(var/datum/seed/S)
+ if(prob(65))
+ S.set_trait(TRAIT_TELEPORTING, !S.get_trait(TRAIT_TELEPORTING))
diff --git a/code/modules/hydroponics/seed_machines.dm b/code/modules/hydroponics/seed_machines.dm
index 1479ffdc5c..bc96f064c9 100644
--- a/code/modules/hydroponics/seed_machines.dm
+++ b/code/modules/hydroponics/seed_machines.dm
@@ -137,9 +137,7 @@
var/list/data = list()
- var/list/geneMasks[0]
- for(var/gene_tag in plant_controller.gene_tag_masks)
- geneMasks.Add(list(list("tag" = gene_tag, "mask" = plant_controller.gene_tag_masks[gene_tag])))
+ var/list/geneMasks = plant_controller.gene_masked_list
data["geneMasks"] = geneMasks
data["activity"] = active
diff --git a/code/modules/hydroponics/trays/tray.dm b/code/modules/hydroponics/trays/tray.dm
index efdae46db7..e69c3eec8a 100644
--- a/code/modules/hydroponics/trays/tray.dm
+++ b/code/modules/hydroponics/trays/tray.dm
@@ -181,9 +181,14 @@
return
//Override for somatoray projectiles.
- if(istype(Proj ,/obj/item/projectile/energy/floramut) && prob(20))
- mutate(1)
- return
+ if(istype(Proj ,/obj/item/projectile/energy/floramut)&& prob(20))
+ if(istype(Proj, /obj/item/projectile/energy/floramut/gene))
+ var/obj/item/projectile/energy/floramut/gene/G = Proj
+ if(seed)
+ seed = seed.diverge_mutate_gene(G.gene, get_turf(loc)) //get_turf just in case it's not in a turf.
+ else
+ mutate(1)
+ return
else if(istype(Proj ,/obj/item/projectile/energy/florayield) && prob(20))
yield_mod = min(10,yield_mod+rand(1,2))
return
diff --git a/code/modules/integrated_electronics/subtypes/logic.dm b/code/modules/integrated_electronics/subtypes/logic.dm
index 759b1586eb..ee5a36785b 100644
--- a/code/modules/integrated_electronics/subtypes/logic.dm
+++ b/code/modules/integrated_electronics/subtypes/logic.dm
@@ -4,7 +4,7 @@
extended_desc = "Logic circuits will treat a null, 0, and a \"\" string value as FALSE and anything else as TRUE."
complexity = 3
outputs = list("result")
- activators = list("\ compare", "\ on true result", "\ on false result")
+ activators = list("\ compare")
category_text = "Logic"
autopulse = 1
power_draw_per_use = 1
@@ -15,13 +15,10 @@
/obj/item/integrated_circuit/logic/do_work()
push_data()
- if(get_pin_data(IC_INPUT, 1))
- activate_pin(1)
- else
- activate_pin(2)
/obj/item/integrated_circuit/logic/binary
inputs = list("\ A","\ B")
+ activators = list("\ compare", "\ on true result", "\ on false result")
/obj/item/integrated_circuit/logic/binary/do_work()
pull_data()
@@ -29,6 +26,11 @@
var/datum/integrated_io/B = inputs[2]
var/datum/integrated_io/O = outputs[1]
O.data = do_compare(A, B) ? TRUE : FALSE
+
+ if(get_pin_data(IC_OUTPUT, 1))
+ activate_pin(2)
+ else
+ activate_pin(3)
..()
/obj/item/integrated_circuit/logic/binary/proc/do_compare(var/datum/integrated_io/A, var/datum/integrated_io/B)
@@ -36,6 +38,7 @@
/obj/item/integrated_circuit/logic/unary
inputs = list("\ A")
+ activators = list("\ compare", "\ on compare")
/obj/item/integrated_circuit/logic/unary/do_work()
pull_data()
@@ -43,6 +46,7 @@
var/datum/integrated_io/O = outputs[1]
O.data = do_check(A) ? TRUE : FALSE
..()
+ activate_pin(2)
/obj/item/integrated_circuit/logic/unary/proc/do_check(var/datum/integrated_io/A)
return FALSE
@@ -124,6 +128,7 @@
desc = "This gate inverts what's fed into it."
icon_state = "not"
spawn_flags = IC_SPAWN_DEFAULT|IC_SPAWN_RESEARCH
+ activators = list("\ invert", "\ on inverted")
/obj/item/integrated_circuit/logic/unary/not/do_check(var/datum/integrated_io/A)
return !A.data
diff --git a/code/modules/mob/dead/observer/observer.dm b/code/modules/mob/dead/observer/observer.dm
index 013dc6ebad..e19a308c47 100644
--- a/code/modules/mob/dead/observer/observer.dm
+++ b/code/modules/mob/dead/observer/observer.dm
@@ -212,7 +212,7 @@ This is the proc mobs get to turn into a ghost. Forked from ghostize due to comp
set name = "Ghost"
set desc = "Relinquish your life and enter the land of the dead."
- if(stat == DEAD)
+ if(stat == DEAD && !forbid_seeing_deadchat)
announce_ghost_joinleave(ghostize(1))
else
var/response
@@ -223,7 +223,7 @@ This is the proc mobs get to turn into a ghost. Forked from ghostize due to comp
return
src.client.admin_ghost()
else
- response = alert(src, "Are you -sure- you want to ghost?\n(You are alive. Don't abuse ghost unless you are inside a cryopod or equivalent! You can't change your mind so choose wisely!)", "Are you sure you want to ghost?", "Ghost", "Stay in body") // VOREStation edit because we don't make players stay dead for 30 minutes.
+ response = alert(src, "Are you -sure- you want to ghost?\n(You are alive, or otherwise have the potential to become alive. Don't abuse ghost unless you are inside a cryopod or equivalent! You can't change your mind so choose wisely!)", "Are you sure you want to ghost?", "Ghost", "Stay in body") // VOREStation edit because we don't make players stay dead for 30 minutes.
if(response != "Ghost")
return
resting = 1
diff --git a/code/modules/mob/freelook/ai/eye.dm b/code/modules/mob/freelook/ai/eye.dm
index 7b0cbde24e..62f0d93152 100644
--- a/code/modules/mob/freelook/ai/eye.dm
+++ b/code/modules/mob/freelook/ai/eye.dm
@@ -43,7 +43,7 @@
/mob/living/silicon/ai/proc/create_eyeobj(var/newloc)
if(eyeobj) destroy_eyeobj()
if(!newloc) newloc = src.loc
- eyeobj = PoolOrNew(/mob/observer/eye/aiEye, newloc)
+ eyeobj = new /mob/observer/eye/aiEye(newloc)
eyeobj.owner = src
eyeobj.name = "[src.name] (AI Eye)" // Give it a name
if(client) client.eye = eyeobj
diff --git a/code/modules/mob/hear_say.dm b/code/modules/mob/hear_say.dm
index fdb0b012ef..3a451bff44 100644
--- a/code/modules/mob/hear_say.dm
+++ b/code/modules/mob/hear_say.dm
@@ -101,7 +101,7 @@
/mob/living/silicon/ai/special_mentions()
return list("AI") // AI door!
-// Converts specific characters, like *, |, and _ to formatted output.
+// Converts specific characters, like +, |, and _ to formatted output.
/mob/proc/say_emphasis(var/message)
message = encode_html_emphasis(message, "|", "i")
message = encode_html_emphasis(message, "+", "b")
diff --git a/code/modules/mob/language/station.dm b/code/modules/mob/language/station.dm
index b1411f2fae..44e0d00280 100644
--- a/code/modules/mob/language/station.dm
+++ b/code/modules/mob/language/station.dm
@@ -60,7 +60,7 @@
flags = WHITELISTED
syllables = list("mrr","rr","tajr","kir","raj","kii","mir","kra","ahk","nal","vah","khaz","jri","ran","darr",
"mi","jri","dynh","manq","rhe","zar","rrhaz","kal","chur","eech","thaa","dra","jurl","mah","sanu","dra","ii'r",
- "ka","aasi","far","wa","baq","ara","qara","zir","sam","mak","hrar","nja","rir","khan","jun","dar","rik","kah",
+ "ka","aasi","far","wa","baq","ara","qara","zir","saam","mak","hrar","nja","rir","khan","jun","dar","rik","kah",
"hal","ket","jurl","mah","tul","cresh","azu","ragh","mro","mra","mrro","mrra")
/datum/language/tajaran/get_random_name(var/gender)
diff --git a/code/modules/mob/living/bot/floorbot.dm b/code/modules/mob/living/bot/floorbot.dm
index 323d2909fb..a843206e5e 100644
--- a/code/modules/mob/living/bot/floorbot.dm
+++ b/code/modules/mob/living/bot/floorbot.dm
@@ -221,7 +221,7 @@
if(building == 1)
I = new /obj/item/stack/tile/floor(src)
else
- I = PoolOrNew(/obj/item/stack/rods, src)
+ I = new /obj/item/stack/rods(src)
A.attackby(I, src)
target = null
busy = 0
diff --git a/code/modules/mob/living/bot/mulebot.dm b/code/modules/mob/living/bot/mulebot.dm
index 2079f77a35..ead145e388 100644
--- a/code/modules/mob/living/bot/mulebot.dm
+++ b/code/modules/mob/living/bot/mulebot.dm
@@ -268,8 +268,8 @@
var/turf/Tsec = get_turf(src)
new /obj/item/device/assembly/prox_sensor(Tsec)
- PoolOrNew(/obj/item/stack/rods, Tsec)
- PoolOrNew(/obj/item/stack/rods, Tsec)
+ new /obj/item/stack/rods(Tsec)
+ new /obj/item/stack/rods(Tsec)
new /obj/item/stack/cable_coil/cut(Tsec)
var/datum/effect/effect/system/spark_spread/s = new /datum/effect/effect/system/spark_spread
diff --git a/code/modules/mob/living/carbon/human/death.dm b/code/modules/mob/living/carbon/human/death.dm
index ee0c867ffb..b4a47d2e47 100644
--- a/code/modules/mob/living/carbon/human/death.dm
+++ b/code/modules/mob/living/carbon/human/death.dm
@@ -41,6 +41,13 @@
species.handle_death(src)
animate_tail_stop()
+ //Handle snowflake ling stuff.
+ if(mind && mind.changeling)
+ // If the ling is capable of revival, don't allow them to see deadchat.
+ if(mind.changeling.chem_charges >= CHANGELING_STASIS_COST)
+ if(mind.changeling.max_geneticpoints >= 0) // Absorbed lings don't count, as they can't revive.
+ forbid_seeing_deadchat = TRUE
+
//Handle brain slugs.
var/obj/item/organ/external/Hd = get_organ(BP_HEAD)
var/mob/living/simple_animal/borer/B
diff --git a/code/modules/mob/living/carbon/human/human_attackhand.dm b/code/modules/mob/living/carbon/human/human_attackhand.dm
index e193909359..3af1a52bf6 100644
--- a/code/modules/mob/living/carbon/human/human_attackhand.dm
+++ b/code/modules/mob/living/carbon/human/human_attackhand.dm
@@ -220,7 +220,7 @@
miss_type = 1
if(prob(80))
- hit_zone = ran_zone(hit_zone)
+ hit_zone = ran_zone(hit_zone, 70) //70% chance to hit what you're aiming at seems fair?
if(prob(15) && hit_zone != BP_TORSO) // Missed!
if(!src.lying)
attack_message = "[H] attempted to strike [src], but missed!"
@@ -261,13 +261,13 @@
rand_damage *= 2
real_damage = max(1, real_damage)
- var/armour = run_armor_check(affecting, "melee")
- var/soaked = get_armor_soak(affecting, "melee")
+ var/armour = run_armor_check(hit_zone, "melee")
+ var/soaked = get_armor_soak(hit_zone, "melee")
// Apply additional unarmed effects.
attack.apply_effects(H, src, armour, rand_damage, hit_zone)
// Finally, apply damage to target
- apply_damage(real_damage, (attack.deal_halloss ? HALLOSS : BRUTE), affecting, armour, soaked, sharp=attack.sharp, edge=attack.edge)
+ apply_damage(real_damage, (attack.deal_halloss ? HALLOSS : BRUTE), hit_zone, armour, soaked, sharp=attack.sharp, edge=attack.edge)
if(I_DISARM)
M.attack_log += text("\[[time_stamp()]\] Disarmed [src.name] ([src.ckey])")
diff --git a/code/modules/mob/living/carbon/human/human_damage.dm b/code/modules/mob/living/carbon/human/human_damage.dm
index 02d85bbcfa..30ee7c64d6 100644
--- a/code/modules/mob/living/carbon/human/human_damage.dm
+++ b/code/modules/mob/living/carbon/human/human_damage.dm
@@ -185,6 +185,26 @@
wearing_rig.notify_ai("Warning: user consciousness failure. Mobility control passed to integrated intelligence system.")
..()
+/mob/living/carbon/human/proc/Stasis(amount)
+ if((species.flags & NO_SCAN) || isSynthetic())
+ in_stasis = 0
+ else
+ in_stasis = amount
+
+/mob/living/carbon/human/proc/getStasis()
+ if((species.flags & NO_SCAN) || isSynthetic())
+ return 0
+
+ return in_stasis
+
+//This determines if, RIGHT NOW, the life() tick is being skipped due to stasis
+/mob/living/carbon/human/proc/inStasisNow()
+ var/stasisValue = getStasis()
+ if(stasisValue && (life_tick % stasisValue))
+ return 1
+
+ return 0
+
/mob/living/carbon/human/getCloneLoss()
if((species.flags & NO_SCAN) || isSynthetic())
cloneloss = 0
diff --git a/code/modules/mob/living/carbon/human/human_movement.dm b/code/modules/mob/living/carbon/human/human_movement.dm
index 29289d34b6..4cbb691239 100644
--- a/code/modules/mob/living/carbon/human/human_movement.dm
+++ b/code/modules/mob/living/carbon/human/human_movement.dm
@@ -13,9 +13,11 @@
handle_embedded_objects() //Moving with objects stuck in you can cause bad times.
if(force_max_speed)
- return -3 // Returning -1 will actually result in a slowdown for Teshari.
+ return -3
for(var/datum/modifier/M in modifiers)
+ if(!isnull(M.haste) && M.haste == TRUE)
+ return -3 // Returning -1 will actually result in a slowdown for Teshari.
if(!isnull(M.slowdown))
tally += M.slowdown
@@ -90,9 +92,7 @@
if(T && T.movement_cost)
tally += T.movement_cost
- if(species.item_slowdown_halved)
- if(item_tally > 0)
- item_tally *= 0.5
+ item_tally *= species.item_slowdown_mod
tally += item_tally
diff --git a/code/modules/mob/living/carbon/human/life.dm b/code/modules/mob/living/carbon/human/life.dm
index 3ae084dc4f..a0cfc6f0a8 100644
--- a/code/modules/mob/living/carbon/human/life.dm
+++ b/code/modules/mob/living/carbon/human/life.dm
@@ -62,8 +62,12 @@
voice = GetVoice()
+ var/stasis = inStasisNow()
+ if(getStasis() > 2)
+ Sleeping(20)
+
//No need to update all of these procs if the guy is dead.
- if(stat != DEAD && !in_stasis)
+ if(stat != DEAD && !stasis)
//Updates the number of stored chemicals for powers
handle_changeling()
@@ -82,8 +86,6 @@
if(!client)
species.handle_npc(src)
- else //VOREStation Addition - Stasis bags op pls nerf
- if(in_stasis) Sleeping(5)
if(!handle_some_updates())
return //We go ahead and process them 5 times for HUD images and other stuff though.
@@ -98,7 +100,7 @@
return 1
/mob/living/carbon/human/breathe()
- if(!in_stasis)
+ if(!inStasisNow())
..()
// Calculate how vulnerable the human is to under- and overpressure.
@@ -208,7 +210,7 @@
/mob/living/carbon/human/handle_mutations_and_radiation()
- if(in_stasis)
+ if(inStasisNow())
return
if(getFireLoss())
@@ -789,7 +791,7 @@
/mob/living/carbon/human/handle_chemicals_in_body()
- if(in_stasis)
+ if(inStasisNow())
return
if(reagents)
@@ -1345,7 +1347,7 @@
if(!druggy && !seer) see_invisible = SEE_INVISIBLE_LIVING
/mob/living/carbon/human/handle_random_events()
- if(in_stasis)
+ if(inStasisNow())
return
// Puke if toxloss is too high
diff --git a/code/modules/mob/living/carbon/human/species/species.dm b/code/modules/mob/living/carbon/human/species/species.dm
index 8a8650aa9b..f547cba9fc 100644
--- a/code/modules/mob/living/carbon/human/species/species.dm
+++ b/code/modules/mob/living/carbon/human/species/species.dm
@@ -133,7 +133,7 @@
var/appearance_flags = 0 // Appearance/display related features.
var/spawn_flags = 0 // Flags that specify who can spawn as this species
var/slowdown = 0 // Passive movement speed malus (or boost, if negative)
- var/item_slowdown_halved = 0 // If this is on, they're not as affected by item weights for slowdown
+ var/item_slowdown_mod = 1 // How affected by item slowdown the species is.
var/primitive_form // Lesser form, if any (ie. monkey for humans)
var/greater_form // Greater form, if any, ie. human for monkeys.
var/holder_type
diff --git a/code/modules/mob/living/carbon/human/species/station/station.dm b/code/modules/mob/living/carbon/human/species/station/station.dm
index 07876d1985..07c5cefb86 100644
--- a/code/modules/mob/living/carbon/human/species/station/station.dm
+++ b/code/modules/mob/living/carbon/human/species/station/station.dm
@@ -32,23 +32,23 @@
primitive_form = "Stok"
darksight = 3
ambiguous_genders = TRUE
- //gluttonous = 1 //VOREStation Edit - Redundant
+ //gluttonous = 1 //VOREStation Edit - Redundant
slowdown = 0.5
- brute_mod = 0.9
- burn_mod = 0.9
+ brute_mod = 0.85
+ burn_mod = 0.85
metabolic_rate = 0.85
- item_slowdown_halved = 1
+ item_slowdown_mod = 0.5
num_alternate_languages = 3
secondary_langs = list(LANGUAGE_UNATHI)
name_language = LANGUAGE_UNATHI
health_hud_intensity = 2.5
- min_age = 18
- max_age = 60
+ min_age = 32
+ max_age = 260
blurb = "A heavily reptillian species, Unathi (or 'Sinta as they call themselves) hail from the \
- Uuosa-Eso system, which roughly translates to 'burning mother'.
Coming from a harsh, radioactive \
- desert planet, they mostly hold ideals of honesty, virtue, martial combat and bravery above all \
+ Uuosa-Eso system, which roughly translates to 'burning mother'.
Coming from a harsh, inhospitable \
+ planet, they mostly hold ideals of honesty, virtue, proficiency and bravery above all \
else, frequently even their own lives. They prefer warmer temperatures than most species and \
their native tongue is a heavy hissing laungage called Sinta'Unathi."
/* VOREStation Removal
@@ -256,6 +256,7 @@
secondary_langs = list(LANGUAGE_ROOTGLOBAL)
name_language = LANGUAGE_ROOTLOCAL
health_hud_intensity = 2.5
+ item_slowdown_mod = 0.25
min_age = 1
max_age = 300
diff --git a/code/modules/mob/living/carbon/human/update_icons.dm b/code/modules/mob/living/carbon/human/update_icons.dm
index 57daff2b76..25062513bb 100644
--- a/code/modules/mob/living/carbon/human/update_icons.dm
+++ b/code/modules/mob/living/carbon/human/update_icons.dm
@@ -131,10 +131,11 @@ Please contact me on #coderbus IRC. ~Carn x
#define LEGCUFF_LAYER 23
#define L_HAND_LAYER 24
#define R_HAND_LAYER 25
-#define FIRE_LAYER 26 //If you're on fire
-#define WATER_LAYER 27 //If you're submerged in water.
-#define TARGETED_LAYER 28 //BS12: Layer for the target overlay from weapon targeting system
-#define TOTAL_LAYERS 29
+#define MODIFIER_EFFECTS_LAYER 26
+#define FIRE_LAYER 27 //If you're on fire
+#define WATER_LAYER 28 //If you're submerged in water.
+#define TARGETED_LAYER 29 //BS12: Layer for the target overlay from weapon targeting system
+#define TOTAL_LAYERS 30
//////////////////////////////////
/mob/living/carbon/human
@@ -1146,6 +1147,18 @@ var/global/list/damage_icon_parts = list()
if(update_icons) update_icons()
+/mob/living/carbon/human/update_modifier_visuals(var/update_icons=1)
+ overlays_standing[MODIFIER_EFFECTS_LAYER] = null
+ var/image/effects = new()
+ for(var/datum/modifier/M in modifiers)
+ if(M.mob_overlay_state)
+ var/image/I = image("icon" = 'icons/mob/modifier_effects.dmi', "icon_state" = M.mob_overlay_state)
+ effects.overlays += I
+
+ overlays_standing[MODIFIER_EFFECTS_LAYER] = effects
+
+ if(update_icons)
+ update_icons()
/mob/living/carbon/human/update_fire(var/update_icons=1)
overlays_standing[FIRE_LAYER] = null
diff --git a/code/modules/mob/living/living.dm b/code/modules/mob/living/living.dm
index dafeb2d37d..459195f092 100644
--- a/code/modules/mob/living/living.dm
+++ b/code/modules/mob/living/living.dm
@@ -975,6 +975,11 @@ default behaviour is:
update_icons()
return canmove
+// Adds overlays for specific modifiers.
+// You'll have to add your own implementation for non-humans currently, just override this proc.
+/mob/living/proc/update_modifier_visuals()
+ return
+
/mob/living/proc/update_water() // Involves overlays for humans. Maybe we'll get submerged sprites for borgs in the future?
return
diff --git a/code/modules/mob/living/living_defense.dm b/code/modules/mob/living/living_defense.dm
index b60ff078a3..66e1278e22 100644
--- a/code/modules/mob/living/living_defense.dm
+++ b/code/modules/mob/living/living_defense.dm
@@ -439,3 +439,11 @@
hud_used.hide_actions_toggle.screen_loc = hud_used.ButtonNumberToScreenCoords(button_number+1)
//hud_used.SetButtonCoords(hud_used.hide_actions_toggle,button_number+1)
client.screen += hud_used.hide_actions_toggle
+
+// Returns a number to determine if something is harder or easier to hit than normal.
+/mob/living/proc/get_evasion()
+ var/result = evasion // First we get the 'base' evasion. Generally this is zero.
+ for(var/datum/modifier/M in modifiers)
+ if(!isnull(M.evasion))
+ result += M.evasion
+ return result
diff --git a/code/modules/mob/living/say.dm b/code/modules/mob/living/say.dm
index 0b1eb0ccda..4046c55612 100644
--- a/code/modules/mob/living/say.dm
+++ b/code/modules/mob/living/say.dm
@@ -141,7 +141,7 @@ proc/get_radio_key_from_channel(var/channel)
//Redirect to say_dead if talker is dead
if(stat)
- if(stat == DEAD)
+ if(stat == DEAD && !forbid_seeing_deadchat)
return say_dead(message)
return
@@ -324,7 +324,7 @@ proc/get_radio_key_from_channel(var/channel)
if(M && src) //If we still exist, when the spawn processes
var/dst = get_dist(get_turf(M),get_turf(src))
- if(dst <= message_range || M.stat == DEAD) //Inside normal message range, or dead with ears (handled in the view proc)
+ if(dst <= message_range || (M.stat == DEAD && !forbid_seeing_deadchat)) //Inside normal message range, or dead with ears (handled in the view proc)
M << (listening[M] || speech_bubble) // VOREStation Edit - Send the image attached to shadow mob if available
M.hear_say(message, verb, speaking, alt_name, italics, src, speech_sound, sound_vol)
diff --git a/code/modules/mob/living/silicon/robot/drone/drone_manufacturer.dm b/code/modules/mob/living/silicon/robot/drone/drone_manufacturer.dm
index 26e1b264fd..9a5bd4e574 100644
--- a/code/modules/mob/living/silicon/robot/drone/drone_manufacturer.dm
+++ b/code/modules/mob/living/silicon/robot/drone/drone_manufacturer.dm
@@ -80,7 +80,7 @@
time_last_drone = world.time
if(player.mob && player.mob.mind) player.mob.mind.reset()
- var/mob/living/silicon/robot/drone/new_drone = PoolOrNew(drone_type, get_turf(src))
+ var/mob/living/silicon/robot/drone/new_drone = new drone_type(get_turf(src))
new_drone.transfer_personality(player)
new_drone.master_fabricator = src
diff --git a/code/modules/mob/living/simple_animal/aliens/drone.dm b/code/modules/mob/living/simple_animal/aliens/drone.dm
index 06de6b4d14..186afd6ed3 100644
--- a/code/modules/mob/living/simple_animal/aliens/drone.dm
+++ b/code/modules/mob/living/simple_animal/aliens/drone.dm
@@ -176,16 +176,16 @@
step_to(O, get_turf(pick(view(7, src))))
//rods
- O = PoolOrNew(/obj/item/stack/rods, src.loc)
+ O = new /obj/item/stack/rods(src.loc)
step_to(O, get_turf(pick(view(7, src))))
if(prob(75))
- O = PoolOrNew(/obj/item/stack/rods, src.loc)
+ O = new /obj/item/stack/rods(src.loc)
step_to(O, get_turf(pick(view(7, src))))
if(prob(50))
- O = PoolOrNew(/obj/item/stack/rods, src.loc)
+ O = new /obj/item/stack/rods(src.loc)
step_to(O, get_turf(pick(view(7, src))))
if(prob(25))
- O = PoolOrNew(/obj/item/stack/rods, src.loc)
+ O = new /obj/item/stack/rods(src.loc)
step_to(O, get_turf(pick(view(7, src))))
//plasteel
diff --git a/code/modules/mob/living/simple_animal/animals/corgi_vr.dm b/code/modules/mob/living/simple_animal/animals/corgi_vr.dm
index cff3227439..1cf3930452 100644
--- a/code/modules/mob/living/simple_animal/animals/corgi_vr.dm
+++ b/code/modules/mob/living/simple_animal/animals/corgi_vr.dm
@@ -55,7 +55,7 @@
inventory_head = null
regenerate_icons()
else
- usr << "\red There is nothing to remove from its [remove_from]."
+ to_chat(usr, "There is nothing to remove from its [remove_from].")
return
if("back")
if(inventory_back)
@@ -63,7 +63,7 @@
inventory_back = null
regenerate_icons()
else
- usr << "\red There is nothing to remove from its [remove_from]."
+ to_chat(usr, "There is nothing to remove from its [remove_from].")
return
//Adding things to inventory
diff --git a/code/modules/mob/living/simple_animal/animals/giant_spider.dm b/code/modules/mob/living/simple_animal/animals/giant_spider.dm
index acb1d7a1b7..e2c833000e 100644
--- a/code/modules/mob/living/simple_animal/animals/giant_spider.dm
+++ b/code/modules/mob/living/simple_animal/animals/giant_spider.dm
@@ -103,7 +103,7 @@
if(istype(I, /obj/effect/spider/eggcluster))
eggcount ++
if(!eggcount)
- var/eggs = PoolOrNew(/obj/effect/spider/eggcluster/small, list(O, src))
+ var/eggs = new /obj/effect/spider/eggcluster/small(O, src)
O.implants += eggs
H << "The [src] injects something into your [O.name]!"
@@ -172,7 +172,7 @@
if(busy == LAYING_EGGS)
E = locate() in get_turf(src)
if(!E)
- PoolOrNew(/obj/effect/spider/eggcluster, list(loc, src))
+ new /obj/effect/spider/eggcluster(loc, src)
fed--
busy = 0
stop_automated_movement = 0
diff --git a/code/modules/mob/mob_defines.dm b/code/modules/mob/mob_defines.dm
index 51a250046c..d8d4d45c12 100644
--- a/code/modules/mob/mob_defines.dm
+++ b/code/modules/mob/mob_defines.dm
@@ -208,3 +208,4 @@
var/list/active_genes=list()
var/mob_size = MOB_MEDIUM
var/disconnect_time = null //Time of client loss, set by Logout(), for timekeeping
+ var/forbid_seeing_deadchat = FALSE // Used for lings to not see deadchat, and to have ghosting behave as if they were not really dead.
diff --git a/code/modules/mob/mob_helpers.dm b/code/modules/mob/mob_helpers.dm
index 4327840a47..ba5b24dbe7 100644
--- a/code/modules/mob/mob_helpers.dm
+++ b/code/modules/mob/mob_helpers.dm
@@ -390,10 +390,16 @@ proc/is_blind(A)
else
name = realname
+ if(subject && subject.forbid_seeing_deadchat && !subject.client.holder)
+ return // Can't talk in deadchat if you can't see it.
+
for(var/mob/M in player_list)
if(M.client && ((!istype(M, /mob/new_player) && M.stat == DEAD) || (M.client.holder && !is_mentor(M.client))) && M.is_preference_enabled(/datum/client_preference/show_dsay))
var/follow
var/lname
+ if(M.forbid_seeing_deadchat && !M.client.holder)
+ continue
+
if(subject)
if(M.is_key_ignored(subject.client.key)) // If we're ignored, do nothing.
continue
diff --git a/code/modules/mob/mob_movement.dm b/code/modules/mob/mob_movement.dm
index 476a8b6810..a553d4309c 100644
--- a/code/modules/mob/mob_movement.dm
+++ b/code/modules/mob/mob_movement.dm
@@ -199,7 +199,7 @@
if(S.victim == mob)
return
- if(mob.stat==DEAD && isliving(mob))
+ if(mob.stat==DEAD && isliving(mob) && !mob.forbid_seeing_deadchat)
mob.ghostize()
return
diff --git a/code/modules/mob/modifiers.dm b/code/modules/mob/modifiers.dm
index 6ba148916e..8e1f9e2f6f 100644
--- a/code/modules/mob/modifiers.dm
+++ b/code/modules/mob/modifiers.dm
@@ -14,6 +14,11 @@
var/stacks = MODIFIER_STACK_FORBID // If true, attempts to add a second instance of this type will refresh expire_at instead.
var/flags = 0 // Flags for the modifier, see mobs.dm defines for more details.
+ var/light_color = null // If set, the mob possessing the modifier will glow in this color. Not implemented yet.
+ var/light_range = null // How far the light for the above var goes. Not implemented yet.
+ var/light_intensity = null // Ditto. Not implemented yet.
+ var/mob_overlay_state = null // Icon_state for an overlay to apply to a (human) mob while this exists. This is actually implemented.
+
// Now for all the different effects.
// Percentage modifiers are expressed as a multipler. (e.g. +25% damage should be written as 1.25)
var/max_health_flat // Adjusts max health by a flat (e.g. +20) amount. Note this is added to base health.
@@ -29,6 +34,8 @@
var/incoming_healing_percent // Adjusts amount of healing received.
var/outgoing_melee_damage_percent // Adjusts melee damage inflicted by holder by a percentage. Affects attacks by melee weapons and hand-to-hand.
var/slowdown // Negative numbers speed up, positive numbers slow down movement.
+ var/haste // If set to 1, the mob will be 'hasted', which makes it ignore slowdown and go really fast.
+ var/evasion // Positive numbers reduce the odds of being hit by 15% each. Negative numbers increase the odds.
/datum/modifier/New(var/new_holder)
holder = new_holder
@@ -44,12 +51,18 @@
to_chat(holder, on_expired_text)
on_expire()
holder.modifiers.Remove(src)
+ if(mob_overlay_state) // We do this after removing ourselves from the list so that the overlay won't remain.
+ holder.update_modifier_visuals()
qdel(src)
// Override this for special effects when it gets removed.
/datum/modifier/proc/on_expire()
return
+// Called every Life() tick. Override for special behaviour.
+/datum/modifier/proc/tick()
+ return
+
/mob/living
var/list/modifiers = list() // A list of modifier datums, which can adjust certain mob numbers.
@@ -64,13 +77,16 @@
// Get rid of anything we shouldn't have.
for(var/datum/modifier/M in modifiers)
M.check_if_valid()
+ // Remaining modifiers will now receive a tick(). This is in a second loop for safety in order to not tick() an expired modifier.
+ for(var/datum/modifier/M in modifiers)
+ M.tick()
// Call this to add a modifier to a mob. First argument is the modifier type you want, second is how long it should last, in ticks.
// The SECONDS/MINUTES macro is very helpful for this. E.g. M.add_modifier(/datum/modifier/example, 5 MINUTES)
/mob/living/proc/add_modifier(var/modifier_type, var/expire_at = null)
// First, check if the mob already has this modifier.
for(var/datum/modifier/M in modifiers)
- if(ispath(modifier_type, M.type))
+ if(istype(modifier_type, M))
switch(M.stacks)
if(MODIFIER_STACK_FORBID)
return // Stop here.
@@ -89,6 +105,8 @@
if(mod.on_created_text)
to_chat(src, mod.on_created_text)
modifiers.Add(mod)
+ if(mod.mob_overlay_state)
+ update_modifier_visuals()
// Removes a specific instance of modifier
/mob/living/proc/remove_specific_modifier(var/datum/modifier/M, var/silent = FALSE)
@@ -97,10 +115,17 @@
// Removes all modifiers of a type
/mob/living/proc/remove_modifiers_of_type(var/modifier_type, var/silent = FALSE)
for(var/datum/modifier/M in modifiers)
- if(ispath(modifier_type, M.type))
+ if(istype(M, modifier_type))
M.expire(silent)
// Removes all modifiers, useful if the mob's being deleted
/mob/living/proc/remove_all_modifiers(var/silent = FALSE)
for(var/datum/modifier/M in modifiers)
- M.expire(silent)
\ No newline at end of file
+ M.expire(silent)
+
+// Checks if the mob has a modifier type.
+/mob/living/proc/has_modifier_of_type(var/modifier_type)
+ for(var/datum/modifier/M in modifiers)
+ if(istype(M, modifier_type))
+ return TRUE
+ return FALSE
\ No newline at end of file
diff --git a/code/modules/mob/new_player/sprite_accessories.dm b/code/modules/mob/new_player/sprite_accessories.dm
index f6679a6dfe..04e45f93d0 100644
--- a/code/modules/mob/new_player/sprite_accessories.dm
+++ b/code/modules/mob/new_player/sprite_accessories.dm
@@ -206,6 +206,10 @@
icon_state = "hair_bobcut"
species_allowed = list("Human","Unathi")
+ bobcutalt
+ name = "Chin Length Bob"
+ icon_state = "hair_bobcutalt"
+
bun
name = "Bun"
icon_state = "hair_bun"
@@ -361,6 +365,14 @@
name = "Hime Cut"
icon_state = "hair_himecut"
+ shorthime
+ name = "Short Hime Cut"
+ icon_state = "hair_shorthime"
+
+ grandebraid
+ name = "Grande Braid"
+ icon_state = "hair_grande"
+
mbraid
name = "Medium Braid"
icon_state = "hair_shortbraid"
@@ -369,6 +381,10 @@
name = "Long Braid"
icon_state = "hair_hbraid"
+ braid
+ name = "Floorlength Braid"
+ icon_state = "hair_braid"
+
odango
name = "Odango"
icon_state = "hair_odango"
@@ -398,6 +414,10 @@
name = "Drillruru"
icon_state = "hair_drillruru"
+ fringetail
+ name = "Fringetail"
+ icon_state = "hair_fringetail"
+
dandypomp
name = "Dandy Pompadour"
icon_state = "hair_dandypompadour"
@@ -549,7 +569,53 @@
icon_state = "hair_shavedpart"
gender = MALE
+ hightight
+ name = "High and Tight"
+ icon_state = "hair_hightight"
+ rowbun
+ name = "Row Bun"
+ icon_state = "hair_rowbun"
+
+ rowdualbraid
+ name = "Row Dual Braid"
+ icon_state = "hair_rowdualtail"
+
+ rowbraid
+ name = "Row Braid"
+ icon_state = "hair_rowbraid"
+
+ regulationmohawk
+ name = "Regulation Mohawk"
+ icon_state = "hair_shavedmohawk"
+
+ topknot
+ name = "Topknot"
+ icon_state = "hair_topknot"
+
+ ronin
+ name = "Ronin"
+ icon_state = "hair_ronin"
+
+ bowlcut2
+ name = "Bowl2"
+ icon_state = "hair_bowlcut2"
+
+ thinning
+ name = "Thinning"
+ icon_state = "hair_thinning"
+
+ thinningfront
+ name = "Thinning Front"
+ icon_state = "hair_thinningfront"
+
+ thinningback
+ name = "Thinning Back"
+ icon_state = "hair_thinningrear"
+
+ manbun
+ name = "Manbun"
+ icon_state = "hair_manbun"
/*
///////////////////////////////////
/ =---------------------------= /
@@ -674,6 +740,13 @@
name = "Walrus Moustache"
icon_state = "facial_walrus"
+ croppedbeard
+ name = "Full Cropped Beard"
+ icon_state = "facial_croppedfullbeard"
+
+ chinless
+ name = "Chinless Beard"
+ icon_state = "facial_chinlessbeard"
/*
///////////////////////////////////
/ =---------------------------= /
diff --git a/code/modules/mob/new_player/sprite_accessories_vr.dm b/code/modules/mob/new_player/sprite_accessories_vr.dm
index 72a16f2296..a0a6762ac0 100644
--- a/code/modules/mob/new_player/sprite_accessories_vr.dm
+++ b/code/modules/mob/new_player/sprite_accessories_vr.dm
@@ -377,4 +377,9 @@
icon_state = "sergal_full_female"
body_parts = list(BP_L_FOOT,BP_R_FOOT,BP_L_LEG,BP_R_LEG,BP_L_ARM,BP_R_ARM,BP_L_HAND,BP_R_HAND,BP_GROIN,BP_TORSO,BP_HEAD)
species_allowed = list("Sergal")
- gender = FEMALE
\ No newline at end of file
+ gender = FEMALE
+
+ monoeye
+ name = "Monoeye"
+ icon_state = "monoeye"
+ body_parts = list(BP_HEAD)
diff --git a/code/modules/organs/blood.dm b/code/modules/organs/blood.dm
index b7f61f28fa..f87a2db080 100644
--- a/code/modules/organs/blood.dm
+++ b/code/modules/organs/blood.dm
@@ -37,7 +37,7 @@ var/const/CE_STABLE_THRESHOLD = 0.5
// Takes care blood loss and regeneration
/mob/living/carbon/human/handle_blood()
- if(in_stasis)
+ if(inStasisNow())
return
if(!should_have_organ(O_HEART))
diff --git a/code/modules/organs/organ_external.dm b/code/modules/organs/organ_external.dm
index 7a5c42ea41..583b56921d 100644
--- a/code/modules/organs/organ_external.dm
+++ b/code/modules/organs/organ_external.dm
@@ -882,7 +882,7 @@ Note that amputating the affected organ does in fact remove the infection from t
if(!clean)
// Throw limb around.
if(src && istype(loc,/turf))
- throw_at(get_edge_target_turf(src,pick(alldirs)),rand(1,3),30)
+ throw_at(get_edge_target_turf(src,pick(alldirs)),rand(1,3),5)
dir = 2
if(DROPLIMB_BURN)
new /obj/effect/decal/cleanable/ash(get_turf(victim))
@@ -901,19 +901,19 @@ Note that amputating the affected organ does in fact remove the infection from t
gore.basecolor = use_blood_colour
gore.update_icon()
- gore.throw_at(get_edge_target_turf(src,pick(alldirs)),rand(1,3),30)
+ gore.throw_at(get_edge_target_turf(src,pick(alldirs)),rand(1,3),5)
for(var/obj/item/organ/I in internal_organs)
I.removed()
if(istype(loc,/turf))
- I.throw_at(get_edge_target_turf(src,pick(alldirs)),rand(1,3),30)
+ I.throw_at(get_edge_target_turf(src,pick(alldirs)),rand(1,3),5)
for(var/obj/item/I in src)
if(I.w_class <= ITEMSIZE_SMALL)
qdel(I)
continue
I.loc = get_turf(src)
- I.throw_at(get_edge_target_turf(src,pick(alldirs)),rand(1,3),30)
+ I.throw_at(get_edge_target_turf(src,pick(alldirs)),rand(1,3),5)
qdel(src)
diff --git a/code/modules/organs/robolimbs.dm b/code/modules/organs/robolimbs.dm
index 91492d8aab..b1872dd899 100644
--- a/code/modules/organs/robolimbs.dm
+++ b/code/modules/organs/robolimbs.dm
@@ -44,6 +44,14 @@ var/const/standard_monitor_styles = "blank=ipc_blank;\
var/parts = BP_ALL //Defines what parts said brand can replace on a body.
var/health_hud_intensity = 1 // Intensity modifier for the health GUI indicator.
+/datum/robolimb/unbranded_monitor
+ company = "Unbranded Monitor"
+ desc = "A generic unbranded interpretation of a popular prosthetic head model. It looks rudimentary and cheaply constructed."
+ icon = 'icons/mob/human_races/cyberlimbs/unbranded/unbranded_monitor.dmi'
+ parts = list(BP_HEAD)
+ monitor_styles = standard_monitor_styles
+ unavailable_to_build = 1
+
/datum/robolimb/nanotrasen
company = "NanoTrasen"
desc = "A simple but efficient robotic limb, created by NanoTrasen."
diff --git a/code/modules/paperwork/papershredder.dm b/code/modules/paperwork/papershredder.dm
index 3283e67f7d..41f0619187 100644
--- a/code/modules/paperwork/papershredder.dm
+++ b/code/modules/paperwork/papershredder.dm
@@ -123,7 +123,7 @@
if(!paperamount)
return
paperamount--
- return PoolOrNew(/obj/item/weapon/shreddedp, get_turf(src))
+ return new /obj/item/weapon/shreddedp(get_turf(src))
/obj/machinery/papershredder/power_change()
..()
@@ -185,5 +185,5 @@
var/mob/living/M = loc
if(istype(M))
M.drop_from_inventory(src)
- PoolOrNew(/obj/effect/decal/cleanable/ash,get_turf(src))
+ new /obj/effect/decal/cleanable/ash(get_turf(src))
qdel(src)
diff --git a/code/modules/projectiles/gun.dm b/code/modules/projectiles/gun.dm
index f7d963523c..9cb7292baf 100644
--- a/code/modules/projectiles/gun.dm
+++ b/code/modules/projectiles/gun.dm
@@ -182,7 +182,11 @@
if (A == user && user.zone_sel.selecting == O_MOUTH && !mouthshoot)
handle_suicide(user)
else if(user.a_intent == I_HURT) //point blank shooting
- Fire(A, user, pointblank=1)
+ if(user && user.client && user.aiming && user.aiming.active && user.aiming.aiming_at != A && A != user)
+ PreFire(A,user) //They're using the new gun system, locate what they're aiming at.
+ return
+ else
+ Fire(A, user, pointblank=1)
else
return ..() //Pistolwhippin'
@@ -326,6 +330,8 @@
user.setMoveCooldown(move_delay)
next_fire_time = world.time + fire_delay
+ accuracy = initial(accuracy) //Reset the gun's accuracy
+
if(muzzle_flash)
set_light(0)
@@ -396,6 +402,8 @@
//update timing
next_fire_time = world.time + fire_delay
+ accuracy = initial(accuracy) //Reset the gun's accuracy
+
if(muzzle_flash)
set_light(0)
@@ -482,11 +490,11 @@
// Certain statuses make it harder to aim, blindness especially. Same chances as melee, however guns accuracy uses multiples of 15.
if(user.eye_blind)
- accuracy -= 5
+ P.accuracy -= 5
if(user.eye_blurry)
- accuracy -= 2
+ P.accuracy -= 2
if(user.confused)
- accuracy -= 3
+ P.accuracy -= 3
//accuracy bonus from aiming
if (aim_targets && (target in aim_targets))
diff --git a/code/modules/projectiles/guns/energy/laser.dm b/code/modules/projectiles/guns/energy/laser.dm
index 6fd294f928..604c936172 100644
--- a/code/modules/projectiles/guns/energy/laser.dm
+++ b/code/modules/projectiles/guns/energy/laser.dm
@@ -28,6 +28,7 @@
name = "practice laser carbine"
desc = "A modified version of the HI G40E, this one fires less concentrated energy bolts designed for target practice."
projectile_type = /obj/item/projectile/beam/practice
+ charge_cost = 48
cell_type = /obj/item/weapon/cell/device
diff --git a/code/modules/projectiles/guns/energy/particle.dm b/code/modules/projectiles/guns/energy/particle.dm
index dc5a6669c7..5638054647 100644
--- a/code/modules/projectiles/guns/energy/particle.dm
+++ b/code/modules/projectiles/guns/energy/particle.dm
@@ -93,20 +93,20 @@
user.visible_message("\The [user] fires \the [src], but the shot fizzles in the air!", "You fire \the [src], but the shot fizzles in the air!")
power_supply.charge -= charge_cost
playsound(src.loc, fire_sound, 100, 1)
- 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(2, 1, T)
sparks.start()
update_icon()
else if (severity <= 80) //20% chance of shorting out and emptying the cell
user.visible_message("\The [user] pulls the trigger, but \the [src] shorts out!", "You pull the trigger, but \the [src] shorts out!")
power_supply.charge = 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(2, 1, T)
sparks.start()
update_icon()
else if (severity <= 90) //10% chance of breaking the gun
user.visible_message("\The [user] pulls the trigger, but \the [src] erupts in a shower of sparks!", "You pull the trigger, but \the [src] bursts into a shower of sparks!")
- 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(2, 1, T)
sparks.start()
power_supply.charge = 0
diff --git a/code/modules/projectiles/guns/energy/special.dm b/code/modules/projectiles/guns/energy/special.dm
index 8fbfc0e657..46988c9934 100644
--- a/code/modules/projectiles/guns/energy/special.dm
+++ b/code/modules/projectiles/guns/energy/special.dm
@@ -44,10 +44,12 @@
origin_tech = list(TECH_MATERIAL = 2, TECH_BIO = 3, TECH_POWER = 3)
modifystate = "floramut"
self_recharge = 1
+ var/decl/plantgene/gene = null
firemodes = list(
list(mode_name="induce mutations", projectile_type=/obj/item/projectile/energy/floramut, modifystate="floramut"),
list(mode_name="increase yield", projectile_type=/obj/item/projectile/energy/florayield, modifystate="florayield"),
+ list(mode_name="induce specific mutations", projectile_type=/obj/item/projectile/energy/floramut/gene, modifystate="floramut"),
)
/obj/item/weapon/gun/energy/floragun/afterattack(obj/target, mob/user, adjacent_flag)
@@ -58,6 +60,28 @@
return
..()
+/obj/item/weapon/gun/energy/floragun/verb/select_gene()
+ set name = "Select Gene"
+ set category = "Object"
+ set src in view(1)
+
+ var/genemask = input("Choose a gene to modify.") as null|anything in plant_controller.plant_gene_datums
+
+ if(!genemask)
+ return
+
+ gene = plant_controller.plant_gene_datums[genemask]
+
+ to_chat(usr, "You set the [src]'s targeted genetic area to [genemask].")
+
+ return
+
+/obj/item/weapon/gun/energy/floragun/consume_next_projectile()
+ . = ..()
+ var/obj/item/projectile/energy/floramut/gene/G = .
+ if(istype(G))
+ G.gene = gene
+
/obj/item/weapon/gun/energy/meteorgun
name = "meteor gun"
desc = "For the love of god, make sure you're aiming this the right way!"
diff --git a/code/modules/projectiles/projectile.dm b/code/modules/projectiles/projectile.dm
index 750164a260..f5a7460cc3 100644
--- a/code/modules/projectiles/projectile.dm
+++ b/code/modules/projectiles/projectile.dm
@@ -173,7 +173,7 @@
return
//roll to-hit
- miss_modifier = max(15*(distance-2) - round(15*accuracy) + miss_modifier + round(15*target_mob.evasion), 0)
+ miss_modifier = max(15*(distance-2) - round(15*accuracy) + miss_modifier + round(15*target_mob.get_evasion()), 0)
var/hit_zone = get_zone_with_miss_chance(def_zone, target_mob, miss_modifier, ranged_attack=(distance > 1 || original != target_mob)) //if the projectile hits a target we weren't originally aiming at then retain the chance to miss
var/result = PROJECTILE_FORCE_MISS
diff --git a/code/modules/projectiles/projectile/energy.dm b/code/modules/projectiles/projectile/energy.dm
index 033b406510..ebb786c60e 100644
--- a/code/modules/projectiles/projectile/energy.dm
+++ b/code/modules/projectiles/projectile/energy.dm
@@ -38,7 +38,7 @@
playsound(src, 'sound/effects/snap.ogg', 50, 1)
src.visible_message("\The [src] explodes in a bright flash!")
- 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(2, 1, T)
sparks.start()
diff --git a/code/modules/projectiles/projectile/special.dm b/code/modules/projectiles/projectile/special.dm
index dd81d713fe..c8c26f5f39 100644
--- a/code/modules/projectiles/projectile/special.dm
+++ b/code/modules/projectiles/projectile/special.dm
@@ -121,6 +121,15 @@
else
return 1
+/obj/item/projectile/energy/floramut/gene
+ name = "gamma somatoray"
+ icon_state = "energy2"
+ damage = 0
+ damage_type = TOX
+ nodamage = 1
+ check_armour = "energy"
+ var/decl/plantgene/gene = null
+
/obj/item/projectile/energy/florayield
name = "beta somatoray"
icon_state = "energy2"
diff --git a/code/modules/random_map/automata/diona.dm b/code/modules/random_map/automata/diona.dm
index 523f688038..e9e58a03a4 100644
--- a/code/modules/random_map/automata/diona.dm
+++ b/code/modules/random_map/automata/diona.dm
@@ -38,7 +38,7 @@
if(1)
new_growth = 2
var/obj/structure/diona/vines/existing = locate() in T
- if(!istype(existing)) existing = PoolOrNew(/obj/structure/diona/vines, T)
+ if(!istype(existing)) existing = new /obj/structure/diona/vines(T)
if(existing.growth < new_growth)
existing.growth = new_growth
existing.update_icon()
@@ -161,11 +161,11 @@
switch(value)
if(ARTIFACT_CHAR)
- PoolOrNew(/obj/structure/diona/bulb,T)
+ new /obj/structure/diona/bulb(T)
if(MONSTER_CHAR)
spawn_diona_nymph(T)
if(DOOR_CHAR)
- var/obj/structure/diona/vines/V = PoolOrNew(/obj/structure/diona/vines,T)
+ var/obj/structure/diona/vines/V = new /obj/structure/diona/vines(T)
V.growth = 3
V.update_icon()
spawn(1)
diff --git a/code/modules/reagents/Chemistry-Reagents/Chemistry-Reagents-Dispenser.dm b/code/modules/reagents/Chemistry-Reagents/Chemistry-Reagents-Dispenser.dm
index 5909ed906f..d0be0469c1 100644
--- a/code/modules/reagents/Chemistry-Reagents/Chemistry-Reagents-Dispenser.dm
+++ b/code/modules/reagents/Chemistry-Reagents/Chemistry-Reagents-Dispenser.dm
@@ -95,7 +95,7 @@
if(alien == IS_SKRELL)
strength_mod *= 5
if(alien == IS_TAJARA)
- strength_mod *= 1.75
+ strength_mod *= 1.25
if(alien == IS_UNATHI)
strength_mod *= 0.75
if(alien == IS_DIONA)
diff --git a/code/modules/reagents/Chemistry-Reagents/Chemistry-Reagents-Food-Drinks.dm b/code/modules/reagents/Chemistry-Reagents/Chemistry-Reagents-Food-Drinks.dm
index 566f3e20f9..88d059ed96 100644
--- a/code/modules/reagents/Chemistry-Reagents/Chemistry-Reagents-Food-Drinks.dm
+++ b/code/modules/reagents/Chemistry-Reagents/Chemistry-Reagents-Food-Drinks.dm
@@ -1799,6 +1799,7 @@
reagent_state = LIQUID
color = "#7F00FF"
strength = 10
+ druggy = 15
glass_name = "Pan-Galactic Gargle Blaster"
glass_desc = "Does... does this mean that Arthur and Ford are on the station? Oh joy."
@@ -2232,8 +2233,8 @@
glass_name = "special blend whiskey"
glass_desc = "Just when you thought regular station whiskey was good... This silky, amber goodness has to come along and ruin everything."
-/datum/reagent/ethanol/unathiliquor //Needs a better name
- name = "Unathi Liquor"
+/datum/reagent/ethanol/unathiliquor
+ name = "Redeemer's Brew"
id = "unathiliquor"
description = "This barely qualifies as a drink, and could give jetfuel a run for its money. Also known to cause feelings of euphoria and numbness."
taste_description = "spiced numbness"
diff --git a/code/modules/reagents/Chemistry-Reagents/Chemistry-Reagents-Medicine_vr.dm b/code/modules/reagents/Chemistry-Reagents/Chemistry-Reagents-Medicine_vr.dm
new file mode 100644
index 0000000000..ddc0a5a411
--- /dev/null
+++ b/code/modules/reagents/Chemistry-Reagents/Chemistry-Reagents-Medicine_vr.dm
@@ -0,0 +1,18 @@
+/datum/reagent/adranol
+ name = "Adranol"
+ id = "adranol"
+ description = "A mild sedative that calms the nerves and relaxes the patient."
+ taste_description = "milk"
+ reagent_state = SOLID
+ color = "#d5e2e5"
+ overdose = REAGENTS_OVERDOSE
+
+/datum/reagent/adranol/affect_blood(var/mob/living/carbon/M, var/alien, var/removed)
+ if(alien == IS_DIONA)
+ return
+ if(M.confused)
+ M.Confuse(-8*removed)
+ if(M.eye_blurry)
+ M.eye_blurry = max(M.eye_blurry - 8*removed, 0)
+ if(M.jitteriness)
+ M.make_jittery(max(M.jitteriness - 8*removed,0))
\ No newline at end of file
diff --git a/code/modules/reagents/Chemistry-Recipes_vr.dm b/code/modules/reagents/Chemistry-Recipes_vr.dm
index feb29703f8..de7f707ac5 100644
--- a/code/modules/reagents/Chemistry-Recipes_vr.dm
+++ b/code/modules/reagents/Chemistry-Recipes_vr.dm
@@ -64,11 +64,14 @@
required_reagents = list("mutagen" = 3, "lipozine" = 2)
result_amount = 5
-
-
-
-
-
+///////////////////////////////////////////////////////////////////////////////////
+/// Other Drugs
+/datum/chemical_reaction/adranol
+ name = "Adranol"
+ id = "adranol"
+ result = "adranol"
+ required_reagents = list("milk" = 2, "hydrogen" = 1, "potassium" = 1)
+ result_amount = 3
///////////////////////////////
//SLIME CORES BELOW HERE///////
diff --git a/code/modules/reagents/reagent_containers/food/drinks/bottle.dm b/code/modules/reagents/reagent_containers/food/drinks/bottle.dm
index 3300eb91d6..2dcdd12605 100644
--- a/code/modules/reagents/reagent_containers/food/drinks/bottle.dm
+++ b/code/modules/reagents/reagent_containers/food/drinks/bottle.dm
@@ -407,6 +407,16 @@
..()
reagents.add_reagent("pwine", 100)
+/obj/item/weapon/reagent_containers/food/drinks/bottle/redeemersbrew
+ name = "Redeemer's Brew"
+ desc = "Just opening the top of this bottle makes you feel a bit tipsy. Not for the faint of heart."
+ icon_state = "redeemersbrew"
+ center_of_mass = list("x"=16, "y"=3)
+
+/obj/item/weapon/reagent_containers/food/drinks/bottle/redeemersbrew/New()
+ ..()
+ reagents.add_reagent("unathiliquor", 100)
+
//////////////////////////JUICES AND STUFF ///////////////////////
/obj/item/weapon/reagent_containers/food/drinks/bottle/orangejuice
diff --git a/code/modules/reagents/reagent_containers/hypospray.dm b/code/modules/reagents/reagent_containers/hypospray.dm
index e9e3c62dad..427d08d141 100644
--- a/code/modules/reagents/reagent_containers/hypospray.dm
+++ b/code/modules/reagents/reagent_containers/hypospray.dm
@@ -14,11 +14,19 @@
possible_transfer_amounts = null
flags = OPENCONTAINER
slot_flags = SLOT_BELT
+ var/reusable = 1
+ var/used = 0
+ var/filled = 0
+ var/list/filled_reagents = list()
-///obj/item/weapon/reagent_containers/hypospray/New() //comment this to make hypos start off empty
-// ..()
-// reagents.add_reagent("tricordrazine", 30)
-// return
+/obj/item/weapon/reagent_containers/hypospray/New()
+ ..()
+ if(filled)
+ if(filled_reagents)
+ for(var/r in filled_reagents)
+ reagents.add_reagent(r, filled_reagents[r])
+ update_icon()
+ return
/obj/item/weapon/reagent_containers/hypospray/do_surgery(mob/living/carbon/M, mob/living/user)
if(user.a_intent != I_HELP) //in case it is ever used as a surgery tool
@@ -53,6 +61,9 @@
admin_inject_log(user, M, src, contained, trans)
user << "[trans] units injected. [reagents.total_volume] units remaining in \the [src]."
+ if(!reusable && !used)
+ used = !used
+
return
/obj/item/weapon/reagent_containers/hypospray/autoinjector
@@ -62,59 +73,52 @@
item_state = "autoinjector"
amount_per_transfer_from_this = 5
volume = 5
+ reusable = 0
+ filled = 1
+ filled_reagents = list("inaprovaline" = 5)
-/obj/item/weapon/reagent_containers/hypospray/autoinjector/New()
+/obj/item/weapon/reagent_containers/hypospray/autoinjector/on_reagent_change()
..()
- reagents.add_reagent("inaprovaline", 5)
update_icon()
- return
+
+/obj/item/weapon/reagent_containers/hypospray/autoinjector/empty
+ filled = 0
+ filled_reagents = list()
+
+/obj/item/weapon/reagent_containers/hypospray/autoinjector/used
+ used = 1
+ filled_reagents = list()
/obj/item/weapon/reagent_containers/hypospray/autoinjector/attack(mob/M as mob, mob/user as mob)
..()
- if(reagents.total_volume <= 0) //Prevents autoinjectors to be refilled.
+ if(used) //Prevents autoinjectors to be refilled.
flags &= ~OPENCONTAINER
update_icon()
return
/obj/item/weapon/reagent_containers/hypospray/autoinjector/update_icon()
- if(reagents.total_volume > 0)
+ if(!used && reagents.reagent_list.len)
icon_state = "[initial(icon_state)]1"
- else
+ else if(used)
icon_state = "[initial(icon_state)]0"
+ else
+ icon_state = "[initial(icon_state)]2"
/obj/item/weapon/reagent_containers/hypospray/autoinjector/examine(mob/user)
..(user)
if(reagents && reagents.reagent_list.len)
user << "It is currently loaded."
- else
+ else if(used)
user << "It is spent."
+ else
+ user << "It is currently unloaded."
-/obj/item/weapon/reagent_containers/hypospray/autoinjector/clotting
+/obj/item/weapon/reagent_containers/hypospray/autoinjector/biginjector/clotting
name = "clotting agent"
- desc = "A rapid and safe way to administer clotting drugs by untrained or trained personnel."
- icon_state = "autoinjector"
- item_state = "autoinjector"
- amount_per_transfer_from_this = 10
- volume = 10
+ desc = "A refined version of the standard autoinjector, allowing greater capacity. This variant excels at treating bleeding wounds and internal bleeding."
+ filled_reagents = list("inaprovaline" = 5, "myelamine" = 10)
-/obj/item/weapon/reagent_containers/hypospray/autoinjector/clotting/New()
- ..()
- reagents.remove_reagent("inaprovaline", 5)
- reagents.add_reagent("myelamine", 10)
- update_icon()
- return
-
-/obj/item/weapon/reagent_containers/hypospray/autoinjector/bonemed
+/obj/item/weapon/reagent_containers/hypospray/autoinjector/biginjector/bonemed
name = "bone repair injector"
- desc = "A rapid and safe way to administer advanced drugs by untrained or trained personnel."
- icon_state = "autoinjector"
- item_state = "autoinjector"
- amount_per_transfer_from_this = 10
- volume = 10
-
-/obj/item/weapon/reagent_containers/hypospray/autoinjector/bonemed/New()
- ..()
- reagents.remove_reagent("inaprovaline", 5)
- reagents.add_reagent("osteodaxon", 10)
- update_icon()
- return
\ No newline at end of file
+ desc = "A refined version of the standard autoinjector, allowing greater capacity. This one excels at treating damage to bones."
+ filled_reagents = list("inaprovaline" = 5, "osteodaxon" = 10)
diff --git a/code/modules/resleeving/infomorph.dm b/code/modules/resleeving/infomorph.dm
index ec115715f6..4378468ff7 100644
--- a/code/modules/resleeving/infomorph.dm
+++ b/code/modules/resleeving/infomorph.dm
@@ -158,7 +158,7 @@ var/list/infomorph_emotions = list(
if(prob(20))
var/turf/T = get_turf_or_move(src.loc)
for (var/mob/M in viewers(T))
- M.show_message("\red A shower of sparks spray from [src]'s inner workings.", 3, "\red You hear and smell the ozone hiss of electrical sparks being expelled violently.", 2)
+ M.show_message("A shower of sparks spray from \the [src]'s inner workings.", 3, "You hear and smell the ozone hiss of electrical sparks being expelled violently.", 2)
return src.death(0)
/mob/living/silicon/infomorph/death(gibbed,var/message = "beeps once, then goes offline.")
diff --git a/code/modules/spells/spell_projectile.dm b/code/modules/spells/spell_projectile.dm
index c94131b252..07adda0081 100644
--- a/code/modules/spells/spell_projectile.dm
+++ b/code/modules/spells/spell_projectile.dm
@@ -26,7 +26,7 @@
/obj/item/projectile/spell_projectile/before_move()
if(proj_trail && src && src.loc) //pretty trails
- var/obj/effect/overlay/trail = PoolOrNew(/obj/effect/overlay, src.loc)
+ var/obj/effect/overlay/trail = new /obj/effect/overlay(src.loc)
trails += trail
trail.icon = proj_trail_icon
trail.icon_state = proj_trail_icon_state
diff --git a/code/modules/telesci/bscyrstal.dm b/code/modules/telesci/bscyrstal.dm
index 083cf56462..f2ecec39cc 100644
--- a/code/modules/telesci/bscyrstal.dm
+++ b/code/modules/telesci/bscyrstal.dm
@@ -16,7 +16,7 @@
/obj/item/weapon/ore/bluespace_crystal/attack_self(mob/user)
user.visible_message("[user] crushes [src]!", "You crush [src]!")
- 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(5, 1, get_turf(src))
s.start()
blink_mob(user)
@@ -30,7 +30,7 @@
if(!..()) // not caught in mid-air
visible_message("[src] fizzles and disappears upon impact!")
var/turf/T = get_turf(hit_atom)
- 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(5, 1, T)
s.start()
if(isliving(hit_atom))
diff --git a/code/modules/telesci/telesci_computer.dm b/code/modules/telesci/telesci_computer.dm
index c721b7eeb4..6f5706afcf 100644
--- a/code/modules/telesci/telesci_computer.dm
+++ b/code/modules/telesci/telesci_computer.dm
@@ -128,7 +128,7 @@
/obj/machinery/computer/telescience/proc/sparks()
if(telepad)
- 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(5, 1, get_turf(telepad))
s.start()
else
@@ -214,7 +214,7 @@
// use a lot of power
use_power(trueDistance * 10000)
- 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(5, 1, get_turf(telepad))
S.start()
@@ -229,7 +229,7 @@
temp_msg += "Data printed below."
var/sparks = get_turf(target)
- var/datum/effect/effect/system/spark_spread/Y = PoolOrNew(/datum/effect/effect/system/spark_spread)
+ var/datum/effect/effect/system/spark_spread/Y = new /datum/effect/effect/system/spark_spread()
Y.set_up(5, 1, sparks)
Y.start()
diff --git a/code/modules/vehicles/Securitrain_vr.dm b/code/modules/vehicles/Securitrain_vr.dm
index b1aa89d84b..01ff285ada 100644
--- a/code/modules/vehicles/Securitrain_vr.dm
+++ b/code/modules/vehicles/Securitrain_vr.dm
@@ -181,8 +181,8 @@
if(is_train_head() && istype(load, /mob/living/carbon/human))
var/mob/living/carbon/human/D = load
- D << "\red \b You ran over [H]!"
- visible_message("\red \The [src] ran over [H]!")
+ to_chat(D, "You ran over \the [H]!"
+ visible_message("\The [src] ran over \the [H]!")
attack_log += text("\[[time_stamp()]\] ran over [H.name] ([H.ckey]), driven by [D.name] ([D.ckey])")
msg_admin_attack("[D.name] ([D.ckey]) ran over [H.name] ([H.ckey]). (JMP)")
else
diff --git a/code/modules/vehicles/rover_vr.dm b/code/modules/vehicles/rover_vr.dm
index cbeda52eaf..aec7254bf7 100644
--- a/code/modules/vehicles/rover_vr.dm
+++ b/code/modules/vehicles/rover_vr.dm
@@ -180,8 +180,8 @@
if(is_train_head() && istype(load, /mob/living/carbon/human))
var/mob/living/carbon/human/D = load
- D << "\red \b You ran over [H]!"
- visible_message("\red \The [src] ran over [H]!")
+ to_chat(D, "You ran over \the [H]!")
+ visible_message("\The [src] ran over \the [H]!")
attack_log += text("\[[time_stamp()]\] ran over [H.name] ([H.ckey]), driven by [D.name] ([D.ckey])")
msg_admin_attack("[D.name] ([D.ckey]) ran over [H.name] ([H.ckey]). (JMP)")
else
diff --git a/code/modules/vehicles/vehicle.dm b/code/modules/vehicles/vehicle.dm
index 80eb2f1a44..4da307cb91 100644
--- a/code/modules/vehicles/vehicle.dm
+++ b/code/modules/vehicles/vehicle.dm
@@ -139,7 +139,7 @@
/obj/vehicle/emp_act(severity)
var/was_on = on
stat |= EMPED
- 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"
@@ -192,8 +192,8 @@
src.visible_message("\red [src] blows apart!", 1)
var/turf/Tsec = get_turf(src)
- PoolOrNew(/obj/item/stack/rods, Tsec)
- PoolOrNew(/obj/item/stack/rods, Tsec)
+ new /obj/item/stack/rods(Tsec)
+ new /obj/item/stack/rods(Tsec)
new /obj/item/stack/cable_coil/cut(Tsec)
if(cell)
diff --git a/code/modules/vore/appearance/sprite_accessories_vr.dm b/code/modules/vore/appearance/sprite_accessories_vr.dm
index c9bd658e40..a94a563eb8 100644
--- a/code/modules/vore/appearance/sprite_accessories_vr.dm
+++ b/code/modules/vore/appearance/sprite_accessories_vr.dm
@@ -499,6 +499,12 @@
icon_state = "molenar-kitsune"
ckeys_allowed = list("molenar")
+/datum/sprite_accessory/tail/liquidfirefly_gazer
+ name = "gazer eyestalks (Liquidfirefly)"
+ desc = ""
+ icon_state = "liquidfirefly-eyestalks"
+ ckeys_allowed = list("liquidfirefly")
+
/datum/sprite_accessory/tail/miria_fluffdragon
name = "fluffdragon wings+tail (Miria Masters)"
desc = ""
diff --git a/code/modules/vore/eating/bellymodes_vr.dm b/code/modules/vore/eating/bellymodes_vr.dm
index 2d00c07991..0836ef1891 100644
--- a/code/modules/vore/eating/bellymodes_vr.dm
+++ b/code/modules/vore/eating/bellymodes_vr.dm
@@ -330,8 +330,11 @@
P.ear_style = O.ear_style
P.species = O.species
P.custom_species = O.custom_species
+ P.species.create_organs(P) //This is the only way to make it so Unathi TF doesn't result in people dying from organ rejection.
for(var/obj/item/organ/I in P.organs) //This prevents organ rejection
I.species = O.species
+ for(var/obj/item/organ/I in P.internal_organs) //This prevents organ rejection
+ I.species = O.species
for(var/obj/item/organ/external/Z in P.organs)//Just in case.
Z.sync_colour_to_human(P)
P << "You lose sensation of your body, feeling only the warmth of everything around you... "
@@ -399,7 +402,10 @@
P.ear_style = O.ear_style
P.species = O.species
P.custom_species = O.custom_species
- for(var/obj/item/organ/I in P.organs) //This prevents organ rejection
+ P.species.create_organs(P)
+ for(var/obj/item/organ/I in P.organs)
+ I.species = O.species
+ for(var/obj/item/organ/I in P.internal_organs)
I.species = O.species
for(var/obj/item/organ/external/Z in P.organs)
Z.sync_colour_to_human(P)
@@ -429,7 +435,10 @@
P.tail_style = O.tail_style
P.ear_style = O.ear_style
P.species = O.species
- for(var/obj/item/organ/I in P.organs) //This prevents organ rejection
+ P.species.create_organs(P)
+ for(var/obj/item/organ/I in P.organs)
+ I.species = O.species
+ for(var/obj/item/organ/I in P.internal_organs)
I.species = O.species
for(var/obj/item/organ/external/Z in P.organs)
Z.sync_colour_to_human(P)
@@ -527,7 +536,10 @@
P.g_eyes = O.g_eyes
P.b_eyes = O.b_eyes
- for(var/obj/item/organ/I in P.organs) //This prevents organ rejection
+ P.species.create_organs(P)
+ for(var/obj/item/organ/I in P.organs)
+ I.species = O.species
+ for(var/obj/item/organ/I in P.internal_organs)
I.species = O.species
for(var/obj/item/organ/external/Z in P.organs)
Z.sync_colour_to_human(P)
diff --git a/code/modules/vore/fluffstuff/custom_boxes_vr.dm b/code/modules/vore/fluffstuff/custom_boxes_vr.dm
index 9bdfc730a7..a39eaa53d2 100644
--- a/code/modules/vore/fluffstuff/custom_boxes_vr.dm
+++ b/code/modules/vore/fluffstuff/custom_boxes_vr.dm
@@ -176,6 +176,24 @@
new /obj/item/weapon/gun/energy/netgun(src)
new /obj/item/clothing/accessory/holster/leg(src)
+//Aerowing:Sebastian Aji
+/obj/item/weapon/storage/box/fluff/sebastian_aji
+ name = "Sebastian's Lumoco Arms P3 Box"
+
+/obj/item/weapon/storage/box/fluff/sebastian_aji/New()
+ ..()
+ new /obj/item/weapon/gun/projectile/pistol(src)
+ new /obj/item/ammo_magazine/mc9mm/flash(src)
+ new /obj/item/ammo_magazine/mc9mm/flash(src)
+ new /obj/item/fluff/permit/sebastian_aji(src)
+
+/obj/item/weapon/storage/box/fluff/briana_moore
+ name = "Briana's Derringer Box"
+
+/obj/item/weapon/storage/box/fluff/briana_moore/New()
+ ..()
+ new /obj/item/weapon/gun/projectile/derringer(src)
+ new /obj/item/fluff/permit/briana_moore(src)
/*
Swimsuits, for general use, to avoid arriving to work with your swimsuit.
*/
diff --git a/code/modules/vore/fluffstuff/custom_clothes_vr.dm b/code/modules/vore/fluffstuff/custom_clothes_vr.dm
index 6861db164f..254c6204b4 100644
--- a/code/modules/vore/fluffstuff/custom_clothes_vr.dm
+++ b/code/modules/vore/fluffstuff/custom_clothes_vr.dm
@@ -774,6 +774,7 @@
else
return 1
+
/obj/item/clothing/under/rank/internalaffairs/fluff/joan
desc = "The plain, professional attire of a Federation Law Enforcement Detective."
name = "Federation Dress Shirt"
@@ -1218,4 +1219,78 @@ Departamental Swimsuits, for general use
icon = 'icons/vore/custom_clothes_vr.dmi'
icon_override = 'icons/vore/custom_clothes_vr.dmi'
icon_state = "batter"
- item_state = "batter_mob"
\ No newline at end of file
+ item_state = "batter_mob"
+
+
+//samanthafyre:Kateryna Petrovitch
+/obj/item/clothing/suit/armor/vest/wolftaur/kate
+ name = "Kat's Fox Taur Armor"
+ desc = "A set of security armor, light weight and easy to run in for a Taur, this item protects the \
+ entire body."
+ icon = 'icons/mob/taursuits_vr.dmi'
+ icon_override = 'icons/mob/taursuits_vr.dmi'
+ icon_state = "katesuit"
+ item_state_slots = null
+
+ mob_can_equip(var/mob/living/carbon/human/H, slot, disable_warning = 0)
+ if(..())
+ if(istype(H) && istype(H.tail_style, /datum/sprite_accessory/tail/taur/wolf))
+ if(icon_state == "katesuit")
+ return ..()
+ icon_override = 'icons/mob/taursuits_vr.dmi'
+ icon_state = "katesuit"
+ pixel_x = -16
+ return ..()
+ else
+ H << "You need to have a wolf-taur half to wear this."
+ return 0
+
+//samanthafyre:Kateryna Petrovitch
+/obj/item/clothing/suit/space/void/engineering/kate
+ name = "Kat's Navy Engineer voidsuit"
+ desc = "Taur engineering voidsuit. Recolored navy blue and white. Slightly tweaked as well to \
+ get close to having security voidsuit protection as possible with a slight reduction in movement \
+ speed to compensate for custom padding and armor Kateryna made herself."
+ icon = 'icons/mob/taursuits_vr.dmi'
+ icon_override = 'icons/mob/taursuits_vr.dmi'
+ icon_state = "lilithsuit"
+ armor = list(melee = 40, bullet = 20, laser = 20,energy = 5, bomb = 35, bio = 100, rad = 20)
+ mob_can_equip(var/mob/living/carbon/human/H, slot, disable_warning = 0)
+ if(..())
+ if(istype(H) && istype(H.tail_style, /datum/sprite_accessory/tail/taur/wolf))
+ if(icon_state == "lilithsuit")
+ return ..()
+ icon_override = 'icons/mob/taursuits_vr.dmi'
+ icon_state = "lilithsuit"
+ pixel_x = -16
+ return ..()
+ else
+ H << "You need to have a wolf-taur half to wear this."
+ return 0
+
+//samanthafyre:Kateryna Petrovitch
+/obj/item/clothing/head/helmet/space/fluff/kate
+ name = "Kat's Navy Engineer Helmet"
+ desc = "A customized combat space helmet made for Kateryna. It uses a navy design as the base before it\
+ was customized to suit the wearer's personality."
+ icon = 'icons/vore/custom_clothes_vr.dmi'
+ icon_state = "lilithhelmet"
+ icon_override = 'icons/vore/custom_clothes_vr.dmi'
+ item_state = "lilithhelmet"
+ light_overlay = "helmet_light"
+
+ mob_can_equip(var/mob/living/carbon/human/H, slot, disable_warning = 0)
+ if(..())
+ if(H.ckey != "samanthafyre")
+ H << "You try to fit on the helmet, but it doesn't fit."
+ return 0
+ else
+ return 1
+
+//Seiga: Alfonso Oak Telanor
+/obj/item/clothing/glasses/sunglasses/fluff/alfonso
+ name = "cyborg visor"
+ desc = "Eyewear worn by a once famous Thunderdome competitor. Fo' shizzle."
+ icon = 'icons/vore/custom_clothes_vr.dmi'
+ icon_state = "alfonso_visor"
+ icon_override = 'icons/vore/custom_onmob_vr.dmi'
diff --git a/code/modules/vore/fluffstuff/custom_items_vr.dm b/code/modules/vore/fluffstuff/custom_items_vr.dm
index 1baed38a2f..9f06f6b383 100644
--- a/code/modules/vore/fluffstuff/custom_items_vr.dm
+++ b/code/modules/vore/fluffstuff/custom_items_vr.dm
@@ -629,6 +629,30 @@ obj/item/weapon/material/hatchet/tacknife/combatknife/fluff/katarina/handle_shie
taurtype = /datum/sprite_accessory/tail/taur/feline/tempest
no_message = "These saddlebags seem to be fitted for someone else, and keep slipping off!"
+//WickedTempest: Chakat Tempest
+/obj/item/weapon/implant/reagent_generator/tempest
+ generated_reagent = "milk"
+ usable_volume = 1000
+
+ empty_message = list("Your breasts are almost completely drained!")
+ full_message = list("Your teats feel heavy and swollen!")
+ emote_descriptor = list("squeezes milk", "tugs on Tempest's breasts, milking them")
+ self_emote_descriptor = list("squeeze")
+ random_emote = list("moos quietly")
+ assigned_proc = /mob/living/carbon/human/proc/use_reagent_implant_tempest
+
+/obj/item/weapon/implanter/reagent_generator/tempest
+ implant_type = /obj/item/weapon/implant/reagent_generator/tempest
+
+/mob/living/carbon/human/proc/use_reagent_implant_tempest()
+ set name = "Milk"
+ set desc = "Grab Tempest's nipples and milk them into a container! May cause blushing and groaning."
+ set category = "Object"
+ set src in view(1)
+
+ do_reagent_implant(usr)
+
+
//PontifexMinimus: Lucius/Lucia Null
/obj/item/weapon/fluff/dragor_dot
name = "supplemental battery"
@@ -643,6 +667,7 @@ obj/item/weapon/material/hatchet/tacknife/combatknife/fluff/katarina/handle_shie
else
return
+
//The perfect adminboos device?
/obj/item/device/perfect_tele
name = "personal translocator"
diff --git a/code/modules/vore/fluffstuff/custom_permits_vr.dm b/code/modules/vore/fluffstuff/custom_permits_vr.dm
index 017e57a29c..c23b537041 100644
--- a/code/modules/vore/fluffstuff/custom_permits_vr.dm
+++ b/code/modules/vore/fluffstuff/custom_permits_vr.dm
@@ -129,4 +129,26 @@
The individual named above is licensed by the Nanotrasen Department of Civil Protection
to carry one Mateba Model 6 Unica handgun with stun/rubber/flash ammo.
- This license expires on 01/Mar/2562 and must be renewed by CentCom prior to this date."}
\ No newline at end of file
+ This license expires on 01/Mar/2562 and must be renewed by CentCom prior to this date."}
+
+// aerowing:Sebastian Aji
+/obj/item/fluff/permit/sebastian_aji
+ name = "Sebastian Aji's Sidearm Permit"
+ desc = {"
+ NAME: Sebastian Aji | RACE: Panthera Tigris | HOMEWORLD: Ahdomai, Siik'tajr
+ DOB: 19/Dec/2530 | HEIGHT: 198cm | SEX: Male
+
+ The individual named above is licensed by the Nanotrasen Department of Civil Protection
+ to carry one Lumoco Arms P3 Whisper handgun with lethal/flash ammo.
+ This license expires on 17/Apr/2563 and must be renewed by CentCom prior to this date."}
+
+// luminescent_ring:Briana Moore
+/obj/item/fluff/permit/briana_moore
+ name = "Briana Moore's Sidearm Permit"
+ desc = {"
+ NAME: Briana Moore | RACE: Angel | HOMEWORLD: Sanctum
+ DOB: 2538-07-11 | HEIGHT: 155cm | SEX: Female
+
+ The individual named above is licensed by the Nanotrasen Department of Civil Protection
+ to carry one Derringer handgun with lethal ammo.
+ This license expires on 24/Apr/2563 and must be renewed by CentCom prior to this date."}
\ No newline at end of file
diff --git a/code/modules/xenoarcheaology/finds/find_spawning.dm b/code/modules/xenoarcheaology/finds/find_spawning.dm
index 3be0dfbca2..f6a4200654 100644
--- a/code/modules/xenoarcheaology/finds/find_spawning.dm
+++ b/code/modules/xenoarcheaology/finds/find_spawning.dm
@@ -244,7 +244,7 @@
apply_material_decorations = 0
if(23)
apply_prefix = 0
- new_item = PoolOrNew(/obj/item/stack/rods, src.loc)
+ new_item = new /obj/item/stack/rods(src.loc)
apply_image_decorations = 0
apply_material_decorations = 0
if(24)
diff --git a/code/modules/xenobio2/mob/xeno procs.dm b/code/modules/xenobio2/mob/xeno procs.dm
index b72b1567fb..03fde9efc8 100644
--- a/code/modules/xenobio2/mob/xeno procs.dm
+++ b/code/modules/xenobio2/mob/xeno procs.dm
@@ -6,6 +6,7 @@ Proc for metabolism
Proc for mutating
Procs for copying speech, if applicable
Procs for targeting
+Divergence proc, used in mutation to make unique datums.
*/
/mob/living/simple_animal/xeno/proc/ProcessTraits()
if(maleable >= MAX_MALEABLE)
@@ -84,8 +85,14 @@ Procs for targeting
return 1 //Everything worked out okay.
return 0
+
+/mob/living/simple_animal/xeno/proc/diverge()
+ var/datum/xeno/traits/newtraits = new()
+ newtraits.copy_traits(traitdat)
+ return newtraits
/mob/living/simple_animal/xeno/proc/Mutate()
+ traitdat = diverge()
nameVar = "mutated"
if((COLORMUT & mutable))
traitdat.traits[TRAIT_XENO_COLOR] = "#"
diff --git a/config/alienwhitelist.txt b/config/alienwhitelist.txt
index 910e45388f..081bd27416 100644
--- a/config/alienwhitelist.txt
+++ b/config/alienwhitelist.txt
@@ -12,4 +12,10 @@ natje - Daemon
zalvine - Enochian
rikaru19xjenkins - Xenochimera
rikaru19xjenkins - Xenomorph Hybrid
-seiga - Vox
\ No newline at end of file
+seiga - Vox
+benemuel - Enochian
+benemuel - Daemon
+vorrarkul - Enochian
+vorrarkul - Daemon
+pontifexminimus - Enochian
+pontifexminimus - Daemon
diff --git a/config/custom_items.txt b/config/custom_items.txt
index 688d77444b..accfcbd90d 100644
--- a/config/custom_items.txt
+++ b/config/custom_items.txt
@@ -68,6 +68,11 @@ character_name: Aronai Kadigan
item_path: /obj/item/weapon/storage/backpack/satchel/gen/fluff/aronai
}
+{
+ckey: aerowing
+character_name: Sebastian Aji
+item_path: /obj/item/weapon/storage/box/fluff/sebastian_aji
+}
# ######## B CKEYS
{
ckey: benemuel
@@ -179,6 +184,13 @@ item_path: /obj/item/clothing/accessory/medal/bronze_heart
# ######## F CKEYS
# ######## G CKEYS
# ######## H CKEYS
+
+{
+ckey: hottokeeki
+character_name: Belle Day
+item_path: /obj/item/weapon/gun/energy/sizegun
+}
+
# ######## I CKEYS
{
@@ -317,6 +329,12 @@ item_path: /obj/item/device/pda_mod/fluff/kligor
}
# ######## L CKEYS
+{
+ckey: luminescentring
+character_name: Briana Moore
+item_path: /obj/item/weapon/storage/box/fluff/briana_moore
+}
+
# ######## M CKEYS
{
ckey: molenar
@@ -390,6 +408,24 @@ item_path: /obj/item/fluff/permit/archermaximus
}
# ######## S CKEYS
+{
+ckey: samanthafyre
+character_name: Kateryna Petrovitch
+item_path: /obj/item/clothing/suit/space/void/engineering/kate
+}
+
+{
+ckey: samanthafyre
+character_name: Kateryna Petrovitch
+item_path: /obj/item/clothing/head/helmet/space/fluff/kate
+}
+
+{
+ckey: samanthafyre
+character_name: Kateryna Petrovitch
+item_path: /obj/item/clothing/suit/armor/vest/wolftaur/kate
+}
+
{
ckey: sasoperative
character_name: Joseph Skinner
@@ -432,6 +468,12 @@ character_name: Scree
item_path: /obj/item/clothing/glasses/omnihud/eng/meson/fluff/scree
}
+{
+ckey: seiga
+character_name: Alfonso Oak Telanor
+item_path: /obj/item/clothing/glasses/sunglasses/fluff/alfonso
+}
+
{
ckey: silencedmp5a5
character_name: Serdykov Antoz
@@ -561,6 +603,12 @@ character_name: Chakat Tempest
item_path: /obj/item/weapon/storage/backpack/saddlebag/tempest
}
+{
+ckey: wickedtemp
+character_name: Chakat Tempest
+item_path: /obj/item/weapon/implanter/reagent_generator/tempest
+}
+
# ######## X CKEYS
{
diff --git a/html/changelog.html b/html/changelog.html
index f4d1c782d5..92b938a65a 100644
--- a/html/changelog.html
+++ b/html/changelog.html
@@ -53,10 +53,84 @@
-->
-
01 April 2017
+
05 May 2017
Anewbe updated:
- - Wooden circlets can now be worn on the head.
+ - Adds a cup for dice games, in the loadout.
+ - Thermals now let you see in the dark.
+
+
Arokha updated:
+
+ - Sleepers now have a 'stasis' level setting, that will ignore varying numbers of life() ticks on the patient.
+ - Stasis bags and Ody sleepers now use a fixed level of this new stasis system (ignore 2/3 life ticks).
+ - You can escape from being asleep in a sleeper, similar to escaping from a cryotube.
+ - You can now use grabs on sleepers to insert patients, same as scanners.
+
+
Datraen updated:
+
+ - Xenobiological traits are made unique on each mutate, avoiding mutating other mobs with same trait data.
+
+
Leshana updated:
+
+ - Resetting a fire alert will no longer open firedoors if atmos alert is in effect and vice versa
+
+
LorenLuke updated:
+
+ - Unfucks the screen bug on roundstart changelings.
+ - Changeling now display 'alive' status on Medhuds properly.
+ - Refactors changeling ranged stings not passing over tables. Can now pass over tables, any machinery (except doors), machine frames, and past closet subtypes.
+ - You can now view an active video call by using the communicator in hand.
+ - Guns on harm intent in aim mode will target, rather than shoot pointblank on first click.
+ - You can now put handcuffs on yourself.
+
+
+
25 April 2017
+
Anewbe updated:
+
+ - Cultist armor now has better protection from strange energies.
+ - Adds the ion pistol to the uplink.
+ - The ion pistol can now be holstered.
+ - Sprites on the smoking pipes should be fixed.
+
+
Atermonera updated:
+
+ - Brain type (Organic, cyborg, posi, or drone) is now displayed in all records.
+
+
Belsima updated:
+
+ - Changes relaymove() code in bodybags.
+ - Above tweak used to allow exiting bodybag while in closed morgue tray.
+
+
Leshana updated:
+
+ - Implements footstep sound system and adds sounds to various floor types including plating, tiles, wood, and carpet.
+
+
LorenLuke updated:
+
+ - Allows people who are bucked to give/receive items.
+ - Can click-drag people onto chairs/beds from 1 tile away to buckle them.
+ - Allows you to place tape masks/restraints back on the roll (roll is still infinite).
+ - Fixes ventcrawling for spiderbots/implants/etc.
+
+
Neerti updated:
+
+ - Drones will now spawn with an EIO-mandated ID card alongside their NT ID.
+ - Fabricate Clothing for Changelings costs one point instead of two, and is fabricated twice as fast.
+ - Dead changelings can no longer hear deadchat or freely ghost.
+ - Shrieks now share a 10 second cooldown.
+ - Lings cannot transform or shriek inside containers such as closets and pipes.
+ - Regen. Stasis timer adjusted to be between 2 to 4 minutes.
+ - Visible Camo. should end if the user is stunned.
+ - Visible Camo. now blocks AI tracking when active.
+ - Recursive Visible Camo. no longer gives true invis.
+ - Recursive Visible Camo. will allow the changeling to run while cloaked instead.
+ - Ling chemical meter on HUD now has a blinking exclaimation mark if below 20 chemicals, to warn that they cannot revive if they should die while still below 20.
+
+
Yoshax updated:
+
+ - Tape color is different now. Security tape is red rather than yellow, Engineering tape remains yellow and Atmos tape is a lighter cyan rather than blue.
+
+
19 April 2017
Anewbe updated:
- Reagents
+ Blood Reagents
{{if data.occupant.reagents}}
{{for data.occupant.reagents}}
@@ -130,7 +130,20 @@ Used In File(s): \code\game\machinery\adv_med.dm
{{/for}}
{{else}}
- No reagents detected.
+ No blood reagents detected.
+ {{/if}}
+ Stomach Reagents
+ {{if data.occupant.ingested}}
+
+ {{for data.occupant.ingested}}
+
+ | {{:value.name}}: |
+ {{:value.amount}} |
+
+ {{/for}}
+
+ {{else}}
+ No stomach reagents detected.
{{/if}}
External Organs
diff --git a/nano/templates/sleeper.tmpl b/nano/templates/sleeper.tmpl
index 49fb0ae8d7..7ee370e890 100644
--- a/nano/templates/sleeper.tmpl
+++ b/nano/templates/sleeper.tmpl
@@ -88,4 +88,12 @@
{{/if}}
+
+
+ Stasis Level:
+
+
+ {{:helper.link(data.stasis, null, {'change_stasis' : 1})}}
+
+
{{/if}}
diff --git a/vorestation.dme b/vorestation.dme
index cf42c1ae8f..e2604679de 100644
--- a/vorestation.dme
+++ b/vorestation.dme
@@ -53,7 +53,6 @@
#include "code\_compatibility\509\type2type.dm"
#include "code\_helpers\_global_objects.dm"
#include "code\_helpers\atmospherics.dm"
-#include "code\_helpers\datum_pool.dm"
#include "code\_helpers\files.dm"
#include "code\_helpers\game.dm"
#include "code\_helpers\global_lists.dm"
@@ -227,6 +226,7 @@
#include "code\datums\observation\~cleanup.dm"
#include "code\datums\repositories\cameras.dm"
#include "code\datums\repositories\crew.dm"
+#include "code\datums\repositories\decls.dm"
#include "code\datums\repositories\repository.dm"
#include "code\datums\supplypacks\atmospherics.dm"
#include "code\datums\supplypacks\contraband.dm"
@@ -494,8 +494,6 @@
#include "code\game\gamemodes\technomancer\spells\aura\frost_aura.dm"
#include "code\game\gamemodes\technomancer\spells\aura\shock_aura.dm"
#include "code\game\gamemodes\technomancer\spells\aura\unstable_aura.dm"
-#include "code\game\gamemodes\technomancer\spells\insert\corona.dm"
-#include "code\game\gamemodes\technomancer\spells\insert\haste.dm"
#include "code\game\gamemodes\technomancer\spells\insert\insert.dm"
#include "code\game\gamemodes\technomancer\spells\insert\mend_burns.dm"
#include "code\game\gamemodes\technomancer\spells\insert\mend_metal.dm"
@@ -503,7 +501,10 @@
#include "code\game\gamemodes\technomancer\spells\insert\mend_wires.dm"
#include "code\game\gamemodes\technomancer\spells\insert\mend_wounds.dm"
#include "code\game\gamemodes\technomancer\spells\insert\purify.dm"
-#include "code\game\gamemodes\technomancer\spells\insert\repel_missiles.dm"
+#include "code\game\gamemodes\technomancer\spells\modifier\corona.dm"
+#include "code\game\gamemodes\technomancer\spells\modifier\haste.dm"
+#include "code\game\gamemodes\technomancer\spells\modifier\modifier.dm"
+#include "code\game\gamemodes\technomancer\spells\modifier\repel_missiles.dm"
#include "code\game\gamemodes\technomancer\spells\projectile\beam.dm"
#include "code\game\gamemodes\technomancer\spells\projectile\chain_lightning.dm"
#include "code\game\gamemodes\technomancer\spells\projectile\force_missile.dm"
@@ -870,7 +871,6 @@
#include "code\game\objects\items\weapons\cigs_lighters.dm"
#include "code\game\objects\items\weapons\clown_items.dm"
#include "code\game\objects\items\weapons\cosmetics.dm"
-#include "code\game\objects\items\weapons\dice.dm"
#include "code\game\objects\items\weapons\dna_injector.dm"
#include "code\game\objects\items\weapons\explosives.dm"
#include "code\game\objects\items\weapons\extinguisher.dm"
@@ -948,6 +948,7 @@
#include "code\game\objects\items\weapons\implants\implantfreedom.dm"
#include "code\game\objects\items\weapons\implants\implantlanguage.dm"
#include "code\game\objects\items\weapons\implants\implantpad.dm"
+#include "code\game\objects\items\weapons\implants\implantreagent_vr.dm"
#include "code\game\objects\items\weapons\implants\implantuplink.dm"
#include "code\game\objects\items\weapons\material\ashtray.dm"
#include "code\game\objects\items\weapons\material\bats.dm"
@@ -1500,6 +1501,7 @@
#include "code\modules\games\cah_white_cards.dm"
#include "code\modules\games\cardemon.dm"
#include "code\modules\games\cards.dm"
+#include "code\modules\games\dice.dm"
#include "code\modules\games\spaceball_cards.dm"
#include "code\modules\games\tarot.dm"
#include "code\modules\genetics\side_effects.dm"
@@ -1515,6 +1517,7 @@
#include "code\modules\hydroponics\seed_controller.dm"
#include "code\modules\hydroponics\seed_datums.dm"
#include "code\modules\hydroponics\seed_datums_vr.dm"
+#include "code\modules\hydroponics\seed_gene_mut.dm"
#include "code\modules\hydroponics\seed_machines.dm"
#include "code\modules\hydroponics\seed_mobs.dm"
#include "code\modules\hydroponics\seed_packets.dm"
@@ -2118,6 +2121,7 @@
#include "code\modules\reagents\Chemistry-Reagents\Chemistry-Reagents-Food-Drinks.dm"
#include "code\modules\reagents\Chemistry-Reagents\Chemistry-Reagents-Food-Drinks_vr.dm"
#include "code\modules\reagents\Chemistry-Reagents\Chemistry-Reagents-Medicine.dm"
+#include "code\modules\reagents\Chemistry-Reagents\Chemistry-Reagents-Medicine_vr.dm"
#include "code\modules\reagents\Chemistry-Reagents\Chemistry-Reagents-Other.dm"
#include "code\modules\reagents\Chemistry-Reagents\Chemistry-Reagents-Toxins.dm"
#include "code\modules\reagents\Chemistry-Reagents\Chemistry-Reagents-Vore_vr.dm"