42 Commits

Author SHA1 Message Date
NanoMap Generation
4eba170940 NanoMap Auto-Update (Mon Dec 1 11:01:28 UTC 2025) 2025-12-01 11:01:28 +00:00
chompstation-ci[bot]
bb9e724bd2 Automatic changelog for PR #12061 [ci skip] 2025-12-01 10:56:16 +00:00
chompstation-ci[bot]
26d30d3ad7 Automatic changelog for PR #12060 [ci skip] 2025-12-01 10:55:54 +00:00
Victor Zisthus
3c2c33eafe POI tweaks (#12061) 2025-12-01 11:55:39 +01:00
chompstation-ci[bot]
ec176ca8f8 Automatic changelog for PR #12045 [ci skip] 2025-12-01 10:55:34 +00:00
chompstation-ci[bot]
ca6fd0a199 Automatic changelog for PR #12046 [ci skip] 2025-12-01 10:55:25 +00:00
Guti
e8ba2fc63d Fixes not being able to scoop up snow (#12060) 2025-12-01 11:55:07 +01:00
CHOMPStation2StaffMirrorBot
683448fd50 [MIRROR] Hotfix for species whitelist command (#12046)
Co-authored-by: Selis <12716288+ItsSelis@users.noreply.github.com>
2025-12-01 11:54:48 +01:00
FluffMedic
e8ba2765ac Tyr Update (#12045) 2025-12-01 11:54:31 +01:00
chompstation-ci[bot]
101dd347e0 Automatic changelog compile [ci skip] 2025-12-01 01:45:00 +00:00
chompstation-ci[bot]
6b4ea59565 Automatic changelog for PR #12062 [ci skip] 2025-11-30 05:05:57 +00:00
CHOMPStation2StaffMirrorBot
ad5a944c8a [MIRROR] Mech construction fix and unittest (#12062)
Co-authored-by: Will <7099514+Willburd@users.noreply.github.com>
Co-authored-by: C.L. <killer65311@gmail.com>
2025-11-30 00:05:21 -05:00
chompstation-ci[bot]
7e9ad48982 Automatic changelog compile [ci skip] 2025-11-29 01:19:04 +00:00
chompstation-ci[bot]
5d08cae5ab Automatic changelog for PR #12059 [ci skip] 2025-11-28 09:32:43 +00:00
CHOMPStation2StaffMirrorBot
648fcd8162 [MIRROR] Catslug Tail Cosmetic (#12059)
Co-authored-by: Will <7099514+Willburd@users.noreply.github.com>
2025-11-28 04:32:05 -05:00
chompstation-ci[bot]
49aa0c138e Automatic changelog for PR #12058 [ci skip] 2025-11-28 05:24:18 +00:00
CHOMPStation2StaffMirrorBot
0b87f2b24c [MIRROR] Hemostat bleeeding clamp (#12058)
Co-authored-by: Cameron Lennox <killer65311@gmail.com>
2025-11-28 00:23:39 -05:00
chompstation-ci[bot]
bdc17c81fe Automatic changelog for PR #12054 [ci skip] 2025-11-28 05:08:06 +00:00
CHOMPStation2StaffMirrorBot
f72988f992 [MIRROR] More surgery tweaks and fixes (#12054)
Co-authored-by: Cameron Lennox <killer65311@gmail.com>
2025-11-28 00:07:28 -05:00
chompstation-ci[bot]
77ec7cd6e4 Automatic changelog for PR #12053 [ci skip] 2025-11-28 05:05:20 +00:00
chompstation-ci[bot]
1a19f01c47 Automatic changelog for PR #12056 [ci skip] 2025-11-28 05:05:09 +00:00
CHOMPStation2StaffMirrorBot
a649749ea0 [MIRROR] Ports "Fixes SS_KEEP_TIMING causing RUNLEVEL_LOBBY subsystems to fire with 75% their set wait" from /TG/ (#12053)
Co-authored-by: Cameron Lennox <killer65311@gmail.com>
2025-11-28 00:04:42 -05:00
chompstation-ci[bot]
cb9fe98463 Automatic changelog for PR #12057 [ci skip] 2025-11-28 05:04:34 +00:00
CHOMPStation2StaffMirrorBot
07d47cbe4d [MIRROR] Fixes appreciating absorbed species (#12056)
Co-authored-by: Cameron Lennox <killer65311@gmail.com>
2025-11-28 00:04:30 -05:00
CHOMPStation2StaffMirrorBot
0b084ecf97 [MIRROR] Fixes a bug with reagent splashing (#12057)
Co-authored-by: Cameron Lennox <killer65311@gmail.com>
2025-11-28 00:03:56 -05:00
chompstation-ci[bot]
38b2114ffa Automatic changelog for PR #12055 [ci skip] 2025-11-28 04:59:21 +00:00
CHOMPStation2StaffMirrorBot
ffd8660d76 [MIRROR] a buncha sprites (#12055)
Co-authored-by: Olive <49600480+zeskorion@users.noreply.github.com>
Co-authored-by: Kashargul <144968721+Kashargul@users.noreply.github.com>
2025-11-27 23:58:45 -05:00
chompstation-ci[bot]
8655a9a8a4 Automatic changelog for PR #12052 [ci skip] 2025-11-28 04:29:53 +00:00
CHOMPStation2StaffMirrorBot
78ff349c8f [MIRROR] Makes ambulant blood not a genetrait [GBP IGNORE] (#12052)
Co-authored-by: Cameron Lennox <killer65311@gmail.com>
2025-11-27 23:29:17 -05:00
chompstation-ci[bot]
b94c6c09cf Automatic changelog for PR #12051 [ci skip] 2025-11-28 03:38:07 +00:00
CHOMPStation2StaffMirrorBot
408eeaa5d1 [MIRROR] Many new global signals from downstream (#12051)
Co-authored-by: Will <7099514+Willburd@users.noreply.github.com>
2025-11-27 22:37:30 -05:00
chompstation-ci[bot]
9c25b75d6c Automatic changelog for PR #12050 [ci skip] 2025-11-28 03:13:50 +00:00
chompstation-ci[bot]
846a3dc43e Automatic changelog for PR #12049 [ci skip] 2025-11-28 03:13:26 +00:00
CHOMPStation2StaffMirrorBot
425baec2ba [MIRROR] Chemical engineer alt-title (#12050)
Co-authored-by: Will <7099514+Willburd@users.noreply.github.com>
2025-11-27 22:13:09 -05:00
CHOMPStation2StaffMirrorBot
4540ee5b1b [MIRROR] Woodstravaganza (#12049)
Co-authored-by: Killian <49700375+KillianKirilenko@users.noreply.github.com>
Co-authored-by: Cameron Lennox <killer65311@gmail.com>
2025-11-27 22:12:45 -05:00
chompstation-ci[bot]
fdac7a69ed Automatic changelog for PR #12048 [ci skip] 2025-11-28 02:17:07 +00:00
CHOMPStation2StaffMirrorBot
a7bac7c918 [MIRROR] Chemical Refinery Splitter Machine (#12048)
Co-authored-by: Will <7099514+Willburd@users.noreply.github.com>
2025-11-27 21:16:28 -05:00
chompstation-ci[bot]
dfee7007cc Automatic changelog for PR #12044 [ci skip] 2025-11-28 01:59:25 +00:00
CHOMPStation2StaffMirrorBot
f10636966f [MIRROR] Add AFK pred/prey and contaminate worn items preferences (#12044)
Co-authored-by: TheGreatKitsune <88862343+TheGreatKitsune@users.noreply.github.com>
2025-11-27 20:58:46 -05:00
chompstation-ci[bot]
2465e088c7 Automatic changelog for PR #12043 [ci skip] 2025-11-28 01:53:03 +00:00
CHOMPStation2StaffMirrorBot
bc3d47cd46 [MIRROR] Gives Vox a Voice Box (#12043)
Co-authored-by: Cameron Lennox <killer65311@gmail.com>
2025-11-27 20:52:18 -05:00
chompstation-ci[bot]
e317669e61 Automatic changelog for PR #12041 [ci skip] 2025-11-27 10:31:39 +00:00
184 changed files with 9564 additions and 7123 deletions

View File

@@ -42,7 +42,7 @@
// Reads L or an empty list if L is not a list. Note: Does NOT assign, L may be an expression.
#define SANITIZE_LIST(L) ( islist(L) ? L : list() )
#define reverseList(L) reverseRange(L.Copy())
#define reverseList(L) reverse_range(L.Copy())
#define islist(L) istype(L, /list)

View File

@@ -29,7 +29,7 @@
#define COMSIG_GLOB_BUTTON_PRESSED "!button_pressed"
/// Supply shuttle selling, before all items are sold, called by /datum/controller/subsystem/supply/proc/sell() : (/list/area/supply_shuttle_areas)
#define COMSIG_GLOB_SUPPLY_SHUTTLE_DEPART "!sell_supply_shuttle"
/// Supply shuttle selling, for each item sold, called by /datum/controller/subsystem/supply/proc/sell() : (atom/movable/sold_item, sold_successfully, datum/exported_crate/export_data, area/shuttle_subarea)
/// Supply shuttle selling, for each item sold, called by /datum/controller/subsystem/supply/proc/sell() : (atom/movable/sold_item, list/things_sold_successfully, datum/exported_crate/export_data, area/shuttle_subarea)
#define COMSIG_GLOB_SUPPLY_SHUTTLE_SELL_ITEM "!supply_shuttle_sell_item"
/// Mind inserted into body: (mob/new_owner, /datum/mind/assigned_mind)
#define COMSIG_GLOB_RESLEEVED_MIND "!resleeved_mind_into_body"
@@ -45,6 +45,26 @@
#define COMSIG_GLOB_BORGIFY "!borgify_mob"
/// brain removed from body, called by /obj/item/organ/internal/brain/proc/transfer_identity() : (mob/living/carbon/brain/brainmob)
#define COMSIG_GLOB_BRAIN_REMOVED "!brain_removed_from_mob"
// base /decl/emote/proc/do_emote() : (mob/user, extra_params)
#define COMSIG_GLOB_EMOTE_PERFORMED "!emote_performed"
// base /proc/say_dead_direct() : (message)
#define COMSIG_GLOB_DEAD_SAY "!dead_say"
// base /turf/wash() : ()
#define COMSIG_GLOB_WASHED_FLOOR "!washed_floor"
// base /obj/machinery/artifact_harvester/proc/harvest() : (obj/item/anobattery/inserted_battery, mob/user)
#define COMSIG_GLOB_HARVEST_ARTIFACT "!harvest_artifact"
// upon harvesting a slime's extract : (obj/item/slime_extract/newly_made_core)
#define COMSIG_GLOB_HARVEST_SLIME_CORE "!harvest_slime_core"
// base /datum/recipe/proc/make_food() : (obj/container, list/results)
#define COMSIG_GLOB_FOOD_PREPARED "!recipe_food_completed"
// base /datum/construction/proc/spawn_result() : (/obj/mecha/result_mech)
#define COMSIG_GLOB_MECH_CONSTRUCTED "!mecha_constructed"
// when trashpiles are successfully searched : (mob/living/user, list/searched_by)
#define COMSIG_GLOB_TRASHPILE_SEARCHED "!trash_pile_searched"
// base /obj/item/autopsy_scanner/do_surgery() : (mob/user, mob/target)
#define COMSIG_GLOB_AUTOPSY_PERFORMED "!performed_autopsy"
// upon forensics swap or sample kit forensics collection : (atom/target, mob/user)
#define COMSIG_GLOB_FORENSICS_COLLECTED "!performed_forensics_collection"
/// signals from globally accessible objects
@@ -813,6 +833,11 @@
///from base of /obj/effect/decal/cleanable/blood/gibs/streak(): (list/directions, list/diseases)
#define COMSIG_GIBS_STREAK "gibs_streak"
//Autopsy
//from base of /obj/item/autopsy_scanner/do_surgery() : (mob/user, mob/target)
#define COMSIG_AUTOPSY_PERFORMED "performed_autopsy"
//Mood
///called when you send a mood event from anywhere in the code.

View File

@@ -208,6 +208,7 @@
#define JOB_ALT_ELECTRICIAN "Electrician"
#define JOB_ALT_CONSTRUCTION_ENGINEER "Construction Engineer"
#define JOB_ALT_ENGINEERING_CONTRACTOR "Engineering Contractor"
#define JOB_ALT_CHEMENGINEER "Chemical Engineer"
#define JOB_ALT_COMPUTER_TECHNICIAN "Computer Technician"
#define JOB_ALT_SALVAGE_TECHNICIAN "Salvage Technician"
#define JOB_ALT_DAMAGE_CONTROL_SPECIALIST "Damage Control Specialist"

View File

@@ -1,19 +1,35 @@
//metals
#define MAT_IRON "iron"
#define MAT_MARBLE "marble"
#define MAT_STEEL "steel"
#define MAT_PLASTIC "plastic"
#define MAT_GLASS "glass"
#define MAT_RGLASS "rglass"
#define MAT_PGLASS "borosilicate glass"
#define MAT_RPGLASS "reinforced borosilicate glass"
#define MAT_STEELHULL "steel hull"
#define MAT_SILVER "silver"
#define MAT_GOLD "gold"
#define MAT_URANIUM "uranium"
#define MAT_TITANIUM "titanium"
#define MAT_PHORON "phoron"
#define MAT_DIAMOND "diamond"
#define MAT_SNOW "snow"
#define MAT_SNOWBRICK "packed snow"
#define MAT_PLASTEEL "plasteel"
#define MAT_PLASTEELHULL "plasteel hull"
#define MAT_DURASTEEL "durasteel"
#define MAT_DURASTEELHULL "durasteel hull"
#define MAT_TITANIUMHULL "titanium hull"
#define MAT_LEAD "lead"
#define MAT_METALHYDROGEN "mhydrogen"
#define MAT_COPPER "copper"
#define MAT_ALUMINIUM "aluminium"
#define MAT_BRONZE "bronze"
#define MAT_PLATINUM "platinum"
#define MAT_OSMIUM "osmium"
#define MAT_MORPHIUM "morphium"
#define MAT_MORPHIUMHULL "morphium hull"
#define MAT_TIN "tin"
//stone
#define MAT_MARBLE "marble"
#define MAT_GRAPHITE "graphite"
#define MAT_SANDSTONE "sandstone"
#define MAT_FLINT "flint"
#define MAT_CONCRETE "concrete"
//wood
#define MAT_WOOD "wood"
#define MAT_LOG "log"
#define MAT_SIFWOOD "alien wood"
@@ -21,38 +37,34 @@
#define MAT_HARDWOOD "hardwood"
#define MAT_HARDLOG "hardwood log"
#define MAT_WOODEN_STICK "wooden stick"
#define MAT_STEELHULL "steel hull"
#define MAT_PLASTEEL "plasteel"
#define MAT_PLASTEELHULL "plasteel hull"
#define MAT_DURASTEEL "durasteel"
#define MAT_DURASTEELHULL "durasteel hull"
#define MAT_TITANIUMHULL "titanium hull"
#define MAT_BIRCHWOOD "birch"
#define MAT_PINEWOOD "pine"
#define MAT_OAKWOOD "oak"
#define MAT_ACACIAWOOD "acacia"
#define MAT_REDWOOD "redwood"
//other
#define MAT_PLASTIC "plastic"
#define MAT_GLASS "glass"
#define MAT_RGLASS "rglass"
#define MAT_PGLASS "borosilicate glass"
#define MAT_RPGLASS "reinforced borosilicate glass"
#define MAT_PHORON "phoron"
#define MAT_DIAMOND "diamond"
#define MAT_SNOW "snow"
#define MAT_SNOWBRICK "packed snow"
#define MAT_VERDANTIUM "verdantium"
#define MAT_MORPHIUM "morphium"
#define MAT_MORPHIUMHULL "morphium hull"
#define MAT_VALHOLLIDE "valhollide"
#define MAT_LEAD "lead"
#define MAT_SUPERMATTER "supermatter"
#define MAT_METALHYDROGEN "mhydrogen"
#define MAT_OSMIUM "osmium"
#define MAT_GRAPHITE "graphite"
#define MAT_CHITIN "chitin"
#define MAT_ALIENCHITIN "alien chitin"
#define MAT_ALIENCLAW "alien claw"
#define MAT_FUR "fur"
#define MAT_COPPER "copper"
#define MAT_QUARTZ "quartz"
#define MAT_TIN "tin"
#define MAT_VOPAL "void opal"
#define MAT_ALUMINIUM "aluminium"
#define MAT_BRONZE "bronze"
#define MAT_PAINITE "painite"
#define MAT_SANDSTONE "sandstone"
#define MAT_FLINT "flint"
#define MAT_PLATINUM "platinum"
#define MAT_TRITIUM "tritium"
#define MAT_DEUTERIUM "deuterium"
#define MAT_CONCRETE "concrete"
#define MAT_PLASTEELREBAR "plasteel rebar"
#define MAT_GRASS "grass"
#define MAT_RESIN "resin"
@@ -60,7 +72,6 @@
#define MAT_BIOMASS "biomass"
#define MAT_WEEDEXTRACT "weed extract"
#define MAT_CARDBOARD "cardboard"
#define MAT_COTTON "cotton"
#define MAT_GLAMOUR "stable glamour"
#define MAT_DARKGLASS "darkglass"
#define MAT_FLESH "flesh"
@@ -88,6 +99,8 @@
#define MAT_CLOTH "cloth"
#define MAT_SYNCLOTH "syncloth"
// # define MAT_CARPET "carpet" // CHOMPRemove
#define MAT_COTTON "cotton"
// colours
#define MAT_CLOTH_TEAL "teal"
#define MAT_CLOTH_BLACK "black"

View File

@@ -15,6 +15,7 @@
#define REFINERY_TUTORIAL_NOOUTPUT (1 << 5)
#define REFINERY_TUTORIAL_ALLIN (1 << 6)
#define REFINERY_TUTORIAL_SINGLEOUTPUT (1 << 7)
#define REFINERY_TUTORIAL_SPLITTEROUTPUT (1 << 8)
#define REAGENT_VAT_VOLUME 500
#define CARGOTANKER_VOLUME 3000

View File

@@ -0,0 +1,5 @@
//Defines for when surgery steps are performed. These are used to track progress through surgeries and how 'open' we are.
#define INCISION_MADE 1
#define FLESH_RETRACTED 2
#define BONE_CUT 2.5
#define BONE_RETRACTED 3

View File

@@ -20,6 +20,8 @@
\
target.can_be_drop_prey = source.can_be_drop_prey; \
target.can_be_drop_pred = source.can_be_drop_pred; \
target.can_be_afk_prey = source.can_be_afk_prey; \
target.can_be_afk_pred = source.can_be_afk_pred; \
target.throw_vore = source.throw_vore; \
target.food_vore = source.food_vore; \
target.drop_vore = source.drop_vore; \
@@ -56,6 +58,7 @@
\
target.autotransferable = source.autotransferable; \
target.strip_pref = source.strip_pref; \
target.contaminate_pref = source.contaminate_pref; \
target.vore_sprite_multiply = source.vore_sprite_multiply; \
target.vore_sprite_color = source.vore_sprite_color; \
target.belly_rub_target = source.belly_rub_target; \

View File

@@ -849,20 +849,20 @@ Checks if a list has the same entries and values as an element of big.
L.Cut(fromIndex, fromIndex+1)
//replaces reverseList ~Carnie
/proc/reverseRange(list/L, start=1, end=0)
if(L.len)
start = start % L.len
end = end % (L.len+1)
/proc/reverse_range(list/inserted_list, start = 1, end = 0)
if(inserted_list.len)
start = start % inserted_list.len
end = end % (inserted_list.len + 1)
if(start <= 0)
start += L.len
start += inserted_list.len
if(end <= 0)
end += L.len + 1
end += inserted_list.len + 1
--end
while(start < end)
L.Swap(start++,end--)
inserted_list.Swap(start++, end--)
return L
return inserted_list
//Copies a list, and all lists inside it recusively
//Does not copy any other reference type

View File

@@ -173,7 +173,7 @@ GLOBAL_DATUM_INIT(sortInstance, /datum/sort_instance, new())
if(call(cmp)(current, last) >= 0)
break
++runHi
reverseRange(L, lo, runHi)
reverse_range(L, lo, runHi)
else
while(runHi < hi)
last = current

View File

@@ -17,6 +17,10 @@
return FALSE
if(!pred.vore_selected)
return FALSE
if(!pred.can_be_afk_pred && (!pred.client || pred.away_from_keyboard))
return FALSE
if(!prey.can_be_afk_prey && (!prey.client || prey.away_from_keyboard))
return FALSE
return TRUE
/// Basic spont vore check.

View File

@@ -137,7 +137,7 @@ GLOBAL_REAL(Master, /datum/controller/master)
/datum/controller/master/Shutdown()
processing = FALSE
sortTim(subsystems, GLOBAL_PROC_REF(cmp_subsystem_init))
reverseRange(subsystems)
reverse_range(subsystems)
for(var/datum/controller/subsystem/ss in subsystems)
log_world("Shutting down [ss.name] subsystem...")
if (ss.slept_count > 0)
@@ -195,7 +195,7 @@ ADMIN_VERB(cmd_controller_view_ui, R_SERVER|R_DEBUG, "Controller Overview", "Vie
"cost_ms" = subsystem.cost,
"tick_usage" = subsystem.tick_usage,
"usage_per_tick" = average,
"tick_overrun" = subsystem.tick_overrun,
"overtime" = subsystem.tick_overrun,
"initialized" = subsystem.initialized,
"initialization_failure_message" = subsystem.initialization_failure_message,
))
@@ -224,6 +224,12 @@ ADMIN_VERB(cmd_controller_view_ui, R_SERVER|R_DEBUG, "Controller Overview", "Vie
return TRUE
if("view_variables")
if(!check_rights_for(ui.user.client, R_DEBUG))
message_admins(
"[key_name(ui.user)] tried to view master controller variables while having improper rights, \
this is potentially a malicious exploit and worth noting."
)
var/datum/controller/subsystem/subsystem = locate(params["ref"]) in subsystems
if(isnull(subsystem))
to_chat(ui.user, span_warning("Failed to locate subsystem."))
@@ -339,7 +345,7 @@ ADMIN_VERB(cmd_controller_view_ui, R_SERVER|R_DEBUG, "Controller Overview", "Vie
// Allows subsystems to declare other subsystems that must initialize after them.
for(var/datum/controller/subsystem/subsystem as anything in subsystems)
for(var/dependent_type as anything in subsystem.dependents)
for(var/dependent_type in subsystem.dependents)
if(!ispath(dependent_type, /datum/controller/subsystem))
stack_trace("ERROR: MC: subsystem `[subsystem.type]` has an invalid dependent: `[dependent_type]`. Skipping")
continue
@@ -349,7 +355,7 @@ ADMIN_VERB(cmd_controller_view_ui, R_SERVER|R_DEBUG, "Controller Overview", "Vie
// Constructs a reverse-dependency graph.
for(var/datum/controller/subsystem/subsystem as anything in subsystems)
for(var/dependency_type as anything in subsystem.dependencies)
for(var/dependency_type in subsystem.dependencies)
if(!ispath(dependency_type, /datum/controller/subsystem))
stack_trace("ERROR: MC: subsystem `[subsystem.type]` has an invalid dependency: `[dependency_type]`. Skipping")
continue
@@ -383,11 +389,11 @@ ADMIN_VERB(cmd_controller_view_ui, R_SERVER|R_DEBUG, "Controller Overview", "Vie
// Topological sorting algorithm end
if(length(subsystems) != length(sorted_subsystems))
var/list/circular_dependency = subsystems.Copy() - sorted_subsystems
var/list/circular_dependency = subsystems - sorted_subsystems
var/list/debug_msg = list()
var/list/usr_msg = list()
for(var/datum/controller/subsystem/subsystem as anything in circular_dependency)
usr_msg += "[subsystem.name]"
usr_msg += subsystem.name
var/list/datum/controller/subsystem/nodes = list(circular_dependency[1])
var/list/loop = list()
@@ -604,10 +610,19 @@ ADMIN_VERB(cmd_controller_view_ui, R_SERVER|R_DEBUG, "Controller Overview", "Vie
if ((SS.flags & (SS_TICKER|SS_BACKGROUND)) == SS_TICKER)
tickersubsystems += SS
// Timer subsystems aren't allowed to bunch up, so we offset them a bit
timer += world.tick_lag * rand(0, 1)
timer += TICKS2DS(rand(0, 1))
SS.next_fire = timer
continue
// Now, we have to set starting next_fires for all our new non ticker kids
if(SS.init_stage == init_stage - 1 && (SS.runlevels & current_runlevel))
// Give em a random offset so things don't clump up too bad
var/delay = SS.wait
if(SS.flags & SS_TICKER)
delay = TICKS2DS(delay)
// Gotta convert to ticks cause rand needs integers
SS.next_fire = world.time + TICKS2DS(rand(0, DS2TICKS(min(delay, 2 SECONDS))))
var/ss_runlevels = SS.runlevels
var/added_to_any = FALSE
for(var/I in 1 to GLOB.bitflags.len)
@@ -703,7 +718,11 @@ ADMIN_VERB(cmd_controller_view_ui, R_SERVER|R_DEBUG, "Controller Overview", "Vie
//we only want to offset it if it's new and also behind
if(SS.next_fire > world.time || (SS in old_subsystems))
continue
SS.next_fire = world.time + world.tick_lag * rand(0, DS2TICKS(min(SS.wait, 2 SECONDS)))
// If they're new, give em a random offset so things don't clump up too bad
var/delay = SS.wait
if(SS.flags & SS_TICKER)
delay = TICKS2DS(delay)
SS.next_fire = world.time + TICKS2DS(rand(0, DS2TICKS(min(delay, 2 SECONDS))))
subsystems_to_check = current_runlevel_subsystems
else
@@ -798,6 +817,8 @@ ADMIN_VERB(cmd_controller_view_ui, R_SERVER|R_DEBUG, "Controller Overview", "Vie
if (SS_flags & SS_NO_FIRE)
subsystemstocheck -= SS
continue
// If we're keeping timing and running behind,
// fire at most 25% faster then normal to try and make up the gap without spamming
if ((SS_flags & (SS_TICKER|SS_KEEP_TIMING)) == SS_KEEP_TIMING && SS.last_fire + (SS.wait * 0.75) > world.time)
continue
if (SS.postponed_fires >= 1)

View File

@@ -75,10 +75,15 @@ SUBSYSTEM_DEF(appreciation)
return
var/mob/living/carbon/human/H = pick(human_list)
if(!istype(H))
appreciated = pick(loremaster.appreciation_targets)
return
if(H.absorbed)
appreciated = pick(loremaster.appreciation_targets)
return
if(H.custom_species)
appreciated = H.custom_species
return

View File

@@ -80,7 +80,7 @@ SUBSYSTEM_DEF(supply)
var/base_value = 0
// Most items must be in a crate!
var/sold_successfully = FALSE
var/list/things_sold_successfully = list()
if(istype(MA,/obj/structure/closet/crate))
var/obj/structure/closet/crate/CR = MA
@@ -90,12 +90,14 @@ SUBSYSTEM_DEF(supply)
// For each thing in the crate, get the value and quantity
for(var/atom/A in CR)
sold_successfully = SEND_SIGNAL(A,COMSIG_ITEM_SOLD,EC,TRUE)
if(SEND_SIGNAL(A,COMSIG_ITEM_SOLD,EC,TRUE))
things_sold_successfully += A
else
// Selling things that are not in crates.
// Usually it just makes a log that it wasn't shipped properly, and so isn't worth anything
sold_successfully = SEND_SIGNAL(MA,COMSIG_ITEM_SOLD,EC,FALSE)
SEND_GLOBAL_SIGNAL(COMSIG_GLOB_SUPPLY_SHUTTLE_SELL_ITEM, MA, sold_successfully, EC, subarea)
if(SEND_SIGNAL(MA,COMSIG_ITEM_SOLD,EC,FALSE))
things_sold_successfully += MA
SEND_GLOBAL_SIGNAL(COMSIG_GLOB_SUPPLY_SHUTTLE_SELL_ITEM, MA, things_sold_successfully, EC, subarea)
exported_crates += EC
points += EC.value

View File

@@ -55,7 +55,7 @@
return
if(owner.client && (owner.client.prefs.muted & MUTE_IC))
return
if(owner.paralysis <= 1 && (H.pulse == PULSE_NORM ? (prob(1)) : (prob(50))))
if(owner.paralysis <= 1 && (H.pulse <= PULSE_NORM ? (prob(1)) : (prob(50))))
owner.make_jittery(30 + rand(10, 30))
owner.emote(pick(motor_tics))

View File

@@ -74,7 +74,8 @@
/datum/construction/proc/spawn_result()
if(result)
new result(get_turf(holder))
var/atom/spawned_construct = new result(get_turf(holder))
SEND_GLOBAL_SIGNAL(COMSIG_GLOB_MECH_CONSTRUCTED, spawned_construct)
spawn()
qdel(holder)
return

View File

@@ -39,3 +39,13 @@
belt = /obj/item/storage/belt/utility/atmostech
id_type = /obj/item/card/id/engineering/atmos
pda_type = /obj/item/pda/atmos
/decl/hierarchy/outfit/job/engineering/chems
name = OUTFIT_JOB_NAME(JOB_ALT_CHEMENGINEER)
head = /obj/item/clothing/head/hardhat
uniform = /obj/item/clothing/under/rank/engineer
belt = /obj/item/storage/belt/utility/chemtech
id_type = /obj/item/card/id/engineering/chemical
pda_type = /obj/item/pda
r_pocket = null // no tray
suit = /obj/item/clothing/suit/storage/toggle/labcoat/yellow

View File

@@ -29,6 +29,27 @@
containertype = /obj/structure/closet/crate/grayson
containername = "Wooden planks crate"
/datum/supply_pack/materials/birch50
name = "50 birch planks"
contains = list(/obj/fiftyspawner/birchwood)
cost = 10
containertype = /obj/structure/closet/crate/grayson
containername = "Birch planks crate"
/datum/supply_pack/materials/oak50
name = "50 oak planks"
contains = list(/obj/fiftyspawner/oakwood)
cost = 10
containertype = /obj/structure/closet/crate/grayson
containername = "Oak planks crate"
/datum/supply_pack/materials/pine50
name = "50 pine planks"
contains = list(/obj/fiftyspawner/pinewood)
cost = 10
containertype = /obj/structure/closet/crate/grayson
containername = "Pine planks crate"
/datum/supply_pack/materials/alienwood50
name = "50 alien wood planks"
contains = list(/obj/fiftyspawner/sifwood)
@@ -36,6 +57,13 @@
containertype = /obj/structure/closet/crate/grayson
containername = "Alien wood planks crate"
/datum/supply_pack/materials/acacia50
name = "50 acacia planks"
contains = list(/obj/fiftyspawner/acaciawood)
cost = 35
containertype = /obj/structure/closet/crate/gilthari
containername = "Acacia planks crate"
/datum/supply_pack/materials/hardwood50
name = "50 hardwood planks"
contains = list(/obj/fiftyspawner/hardwood)
@@ -43,6 +71,13 @@
containertype = /obj/structure/closet/crate/gilthari
containername = "Hardwood planks crate"
/datum/supply_pack/materials/redwood50
name = "50 redwood planks"
contains = list(/obj/fiftyspawner/redwood)
cost = 50
containertype = /obj/structure/closet/crate/gilthari
containername = "Redwood planks crate"
/datum/supply_pack/materials/plastic50
name = "50 plastic sheets"
contains = list(/obj/fiftyspawner/plastic)

View File

@@ -80,7 +80,7 @@
access = list(ACCESS_EVA, ACCESS_ENGINE, ACCESS_ENGINE_EQUIP, ACCESS_TECH_STORAGE, ACCESS_MAINT_TUNNELS, ACCESS_EXTERNAL_AIRLOCKS, ACCESS_CONSTRUCTION, ACCESS_ATMOSPHERICS)
minimal_access = list(ACCESS_EVA, ACCESS_ENGINE, ACCESS_ENGINE_EQUIP, ACCESS_TECH_STORAGE, ACCESS_MAINT_TUNNELS, ACCESS_EXTERNAL_AIRLOCKS, ACCESS_CONSTRUCTION)
alt_titles = list(JOB_ALT_MAINTENANCE_TECHNICIAN = /datum/alt_title/maint_tech, JOB_ALT_ENGINE_TECHNICIAN = /datum/alt_title/engine_tech,
JOB_ALT_ELECTRICIAN = /datum/alt_title/electrician, JOB_ALT_CONSTRUCTION_ENGINEER = /datum/alt_title/construction_engi, JOB_ALT_ENGINEERING_CONTRACTOR = /datum/alt_title/engineering_contractor, JOB_ALT_COMPUTER_TECHNICIAN = /datum/alt_title/computer_tech, JOB_ALT_SALVAGE_TECHNICIAN = /datum/alt_title/salvage_tech, JOB_ALT_DAMAGE_CONTROL_SPECIALIST = /datum/alt_title/damage_control_specialist)
JOB_ALT_ELECTRICIAN = /datum/alt_title/electrician, JOB_ALT_CONSTRUCTION_ENGINEER = /datum/alt_title/construction_engi, JOB_ALT_ENGINEERING_CONTRACTOR = /datum/alt_title/engineering_contractor, JOB_ALT_COMPUTER_TECHNICIAN = /datum/alt_title/computer_tech, JOB_ALT_SALVAGE_TECHNICIAN = /datum/alt_title/salvage_tech, JOB_ALT_DAMAGE_CONTROL_SPECIALIST = /datum/alt_title/damage_control_specialist, JOB_ALT_CHEMENGINEER = /datum/alt_title/chem_tech)
minimal_player_age = 3
min_age_by_species = list(SPECIES_PROMETHEAN = 2)
@@ -135,6 +135,11 @@
title = JOB_ALT_DAMAGE_CONTROL_SPECIALIST
title_blurb = "A " + JOB_ALT_DAMAGE_CONTROL_SPECIALIST + " is the Engineering Department's answer to first responders like the " + JOB_PARAMEDIC + ", being responsible for stabilizing situations and evacuating personnel, then conducting repairs."
/datum/alt_title/chem_tech
title = JOB_ALT_CHEMENGINEER
title_blurb = "A " + JOB_ALT_CHEMENGINEER + " specializes in industrial scale chemical production. They are responsible for planning the construction of and operating chemical refinery machines."
title_outfit = /decl/hierarchy/outfit/job/engineering/chems
//////////////////////////////////
// Atmos Tech
//////////////////////////////////

View File

@@ -247,6 +247,11 @@ GLOBAL_LIST(construction_frame_floor)
icon_override = 'icons/obj/stock_parts_refinery.dmi'
frame_class = FRAME_CLASS_MACHINE
/datum/frame/frame_types/industrial_reagent_splitter
name = "Industrial Chemical Splitter"
icon_override = 'icons/obj/stock_parts_refinery.dmi'
frame_class = FRAME_CLASS_MACHINE
/datum/frame/frame_types/industrial_reagent_waste_processor
name = "Industrial Chemical Waste Processor"
icon_override = 'icons/obj/stock_parts_refinery.dmi'

View File

@@ -99,7 +99,7 @@
/datum/construction/reversible/mecha/ripley
result = "/obj/mecha/working/ripley"
result = /obj/mecha/working/ripley
steps = list(
//1
list("key"=IS_WELDER,
@@ -307,7 +307,7 @@
/datum/construction/reversible/mecha/gygax
result = "/obj/mecha/combat/gygax"
result = /obj/mecha/combat/gygax
steps = list(
//1
list("key"=IS_WELDER,
@@ -589,7 +589,7 @@
/datum/construction/reversible/mecha/serenity
result = "/obj/mecha/combat/gygax/serenity"
result = /obj/mecha/combat/gygax/serenity
steps = list(
//1
list("key"=IS_WELDER,
@@ -872,7 +872,7 @@
/datum/construction/reversible/mecha/firefighter
result = "/obj/mecha/working/ripley/firefighter"
result = /obj/mecha/working/ripley/firefighter
steps = list(
//1
list("key"=IS_WELDER,
@@ -1092,7 +1092,7 @@
/datum/construction/reversible/mecha/durand
result = "/obj/mecha/combat/durand"
result = /obj/mecha/combat/durand
steps = list(
//1
list("key"=IS_WELDER,
@@ -1374,7 +1374,7 @@
/datum/construction/reversible/mecha/odysseus
result = "/obj/mecha/medical/odysseus"
result = /obj/mecha/medical/odysseus
steps = list(
//1
list("key"=IS_WELDER,
@@ -1554,7 +1554,7 @@
// Phazon
//////////////////////
/datum/construction/mecha/phazon_chassis
result = "/obj/mecha/combat/phazon"
result = /obj/mecha/combat/phazon
steps = list(list("key"=/obj/item/mecha_parts/part/phazon_torso),//1
list("key"=/obj/item/mecha_parts/part/phazon_left_arm),//2
list("key"=/obj/item/mecha_parts/part/phazon_right_arm),//3
@@ -1583,7 +1583,7 @@
return
/datum/construction/reversible/mecha/phazon
result = "/obj/mecha/combat/phazon"
result = /obj/mecha/combat/phazon
steps = list(
//1
list("key"=IS_WELDER,
@@ -1833,7 +1833,7 @@
// Janus
//////////////////////
/datum/construction/mecha/janus_chassis
result = "/obj/mecha/combat/phazon/janus"
result = /obj/mecha/combat/phazon/janus
steps = list(list("key"=/obj/item/mecha_parts/part/janus_torso),//1
list("key"=/obj/item/mecha_parts/part/janus_left_arm),//2
list("key"=/obj/item/mecha_parts/part/janus_right_arm),//3
@@ -1862,7 +1862,7 @@
return
/datum/construction/reversible/mecha/janus
result = "/obj/mecha/combat/phazon/janus"
result = /obj/mecha/combat/phazon/janus
steps = list(
//1
list("key"=IS_WELDER,
@@ -2138,7 +2138,7 @@
// Pinnace
//////////////////////
/datum/construction/mecha/fighter/pinnace_chassis
result = "/obj/mecha/combat/fighter/pinnace"
result = /obj/mecha/combat/fighter/pinnace
steps = list(list("key"=/obj/item/mecha_parts/fighter/part/pinnace_core),//1
list("key"=/obj/item/mecha_parts/fighter/part/pinnace_cockpit),//2
list("key"=/obj/item/mecha_parts/fighter/part/pinnace_main_engine),//3
@@ -2168,7 +2168,7 @@
return
/datum/construction/reversible/mecha/fighter/pinnace
result = "/obj/mecha/combat/fighter/pinnace"
result = /obj/mecha/combat/fighter/pinnace
steps = list(
//1
list("key"=IS_WELDER,
@@ -2421,7 +2421,7 @@
// Baron
//////////////////////
/datum/construction/mecha/fighter/baron_chassis
result = "/obj/mecha/combat/fighter/baron"
result = /obj/mecha/combat/fighter/baron
steps = list(list("key"=/obj/item/mecha_parts/fighter/part/baron_core),//1
list("key"=/obj/item/mecha_parts/fighter/part/baron_cockpit),//2
list("key"=/obj/item/mecha_parts/fighter/part/baron_main_engine),//3
@@ -2451,7 +2451,7 @@
return
/datum/construction/reversible/mecha/fighter/baron
result = "/obj/mecha/combat/fighter/baron"
result = /obj/mecha/combat/fighter/baron
steps = list(
//1
list("key"=IS_WELDER,

View File

@@ -28,7 +28,7 @@
/datum/construction/reversible/mecha/scarab
result = "/obj/mecha/combat/scarab"
result = /obj/mecha/combat/scarab
steps = list(
//1
list("key"=IS_WELDER,

View File

@@ -29,7 +29,7 @@
/datum/construction/reversible/mecha/polecat
result = "/obj/mecha/micro/sec/polecat"
result = /obj/mecha/micro/sec/polecat
steps = list(
//1
list("key"=IS_WELDER,
@@ -308,7 +308,7 @@
/datum/construction/reversible/mecha/gopher
result = "/obj/mecha/micro/utility/gopher"
result = /obj/mecha/micro/utility/gopher
steps = list(
//1
list("key"=IS_WELDER,
@@ -514,7 +514,7 @@
/datum/construction/reversible/mecha/weasel
result = "/obj/mecha/micro/sec/weasel"
result = /obj/mecha/micro/sec/weasel
steps = list(
//1
list("key"=IS_WELDER,

View File

@@ -121,31 +121,272 @@
drop_sound = 'sound/items/drop/wooden.ogg'
pickup_sound = 'sound/items/pickup/wooden.ogg'
/obj/item/stack/tile/wood/sif
name = "alien wood tile"
singular_name = "alien wood tile"
desc = "An easy to fit wooden floor tile. It's blue!"
icon_state = "tile-sifwood"
/obj/item/stack/tile/wood/alt
name = "wood floor tile"
singular_name = "wood floor tile"
icon_state = "tile-wood_tile"
icon = 'icons/obj/stacks_vr.dmi'
icon_state = "tile-wood-gs"
color = "#593c1c"
/obj/item/stack/tile/wood/parquet
name = "parquet wood floor tile"
singular_name = "parquet wood floor tile"
icon_state = "tile-wood_parquet"
icon = 'icons/obj/stacks_vr.dmi'
icon_state = "tile-wood-gs_parquet"
color = "#593c1c"
/obj/item/stack/tile/wood/panel
name = "large wood floor tile"
singular_name = "large wood floor tile"
icon_state = "tile-wood_large"
icon = 'icons/obj/stacks_vr.dmi'
icon_state = "tile-wood-gs_large"
color = "#593c1c"
/obj/item/stack/tile/wood/tile
name = "tiled wood floor tile"
singular_name = "tiled wood floor tile"
icon_state = "tile-wood_tile"
icon = 'icons/obj/stacks_vr.dmi'
icon_state = "tile-wood-gs_tile"
color = "#593c1c"
/obj/item/stack/tile/wood/vert
name = "vertical wood floor tile"
singular_name = "vertical wood floor tile"
icon = 'icons/obj/stacks_vr.dmi'
icon_state = "tile-wood-vert-gs"
color = "#593c1c"
/obj/item/stack/tile/wood/vert_panel
name = "large vertical wood floor tile"
singular_name = "large vertical wood floor tile"
icon = 'icons/obj/stacks_vr.dmi'
icon_state = "tile-wood-vert-gs_large"
color = "#593c1c"
/obj/item/stack/tile/wood/sif
name = "alien wood tile"
singular_name = "alien wood tile"
desc = "An easy to fit wooden floor tile. It's blue!"
icon = 'icons/obj/stacks_vr.dmi'
icon_state = "tile-wood-gs"
color = "#293c50"
/obj/item/stack/tile/wood/sif/parquet
name = "alien wood parquet tile"
singular_name = "alien wood parquet tile"
icon_state = "tile-wood-gs_parquet"
/obj/item/stack/tile/wood/sif/panel
name = "large alien wood tile"
singular_name = "large alien wood tile"
icon_state = "tile-wood-gs_large"
/obj/item/stack/tile/wood/sif/tile
name = "tiled alien wood tile"
singular_name = "tiled alien wood tile"
icon_state = "tile-wood-gs_tile"
/obj/item/stack/tile/wood/sif/vert
name = "vertical alien wood floor tile"
singular_name = "vertical alien wood floor tile"
icon_state = "tile-wood-vert-gs"
/obj/item/stack/tile/wood/sif/vert_panel
name = "large vertical alien wood floor tile"
singular_name = "large vertical alien wood floor tile"
icon_state = "tile-wood-vert-gs_large"
/obj/item/stack/tile/wood/acacia
name = "acacia wood floor tile"
singular_name = "wood floor tile"
icon = 'icons/obj/stacks_vr.dmi'
icon_state = "tile-wood-gs"
color = "#b75e12"
/obj/item/stack/tile/wood/acacia/parquet
name = "acacia parquet floor tile"
singular_name = "parquet wood floor tile"
icon_state = "tile-wood-gs_parquet"
/obj/item/stack/tile/wood/acacia/panel
name = "large acacia floor tile"
singular_name = "large wood floor tile"
icon_state = "tile-wood-gs_large"
/obj/item/stack/tile/wood/acacia/tile
name = "tiled acacia floor tile"
singular_name = "tiled wood floor tile"
icon_state = "tile-wood-gs_tile"
/obj/item/stack/tile/wood/acacia/vert
name = "vertical acacia wood floor tile"
singular_name = "vertical acacia wood floor tile"
icon_state = "tile-wood-vert-gs"
/obj/item/stack/tile/wood/acacia/vert_panel
name = "large vertical acacia wood floor tile"
singular_name = "large vertical acacia wood floor tile"
icon_state = "tile-wood-vert-gs_large"
/obj/item/stack/tile/wood/birch
name = "birch wood floor tile"
singular_name = "wood floor tile"
icon = 'icons/obj/stacks_vr.dmi'
icon_state = "tile-wood-gs"
color = "#f6dec0"
/obj/item/stack/tile/wood/birch/parquet
name = "birch parquet floor tile"
singular_name = "parquet wood floor tile"
icon_state = "tile-wood-gs_parquet"
/obj/item/stack/tile/wood/birch/panel
name = "large birch floor tile"
singular_name = "large wood floor tile"
icon_state = "tile-wood-gs_large"
/obj/item/stack/tile/wood/birch/tile
name = "tiled birch floor tile"
singular_name = "tiled wood floor tile"
icon_state = "tile-wood-gs_tile"
/obj/item/stack/tile/wood/birch/vert
name = "vertical birch wood floor tile"
singular_name = "vertical birch wood floor tile"
icon_state = "tile-wood-vert-gs"
/obj/item/stack/tile/wood/birch/vert_panel
name = "large vertical birch wood floor tile"
singular_name = "large vertical birch wood floor tile"
icon_state = "tile-wood-vert-gs_large"
/obj/item/stack/tile/wood/hardwood
name = "hardwood wood floor tile"
singular_name = "wood floor tile"
icon = 'icons/obj/stacks_vr.dmi'
icon_state = "tile-wood-gs"
color = "#42291a"
/obj/item/stack/tile/wood/hardwood/parquet
name = "hardwood parquet floor tile"
singular_name = "parquet wood floor tile"
icon_state = "tile-wood-gs_parquet"
/obj/item/stack/tile/wood/hardwood/panel
name = "large hardwood floor tile"
singular_name = "large wood floor tile"
icon_state = "tile-wood-gs_large"
/obj/item/stack/tile/wood/hardwood/tile
name = "tiled hardwood floor tile"
singular_name = "tiled wood floor tile"
icon_state = "tile-wood-gs_tile"
/obj/item/stack/tile/wood/hardwood/vert
name = "vertical hardwood wood floor tile"
singular_name = "vertical hardwood wood floor tile"
icon_state = "tile-wood-vert-gs"
/obj/item/stack/tile/wood/hardwood/vert_panel
name = "large vertical hardwood wood floor tile"
singular_name = "large vertical hardwood wood floor tile"
icon_state = "tile-wood-vert-gs_large"
/obj/item/stack/tile/wood/pine
name = "pine wood floor tile"
singular_name = "wood floor tile"
icon = 'icons/obj/stacks_vr.dmi'
icon_state = "tile-wood-gs"
color = "#cd9d6f"
/obj/item/stack/tile/wood/pine/parquet
name = "pine parquet floor tile"
singular_name = "parquet wood floor tile"
icon_state = "tile-wood-gs_parquet"
/obj/item/stack/tile/wood/pine/panel
name = "large pine floor tile"
singular_name = "large wood floor tile"
icon_state = "tile-wood-gs_large"
/obj/item/stack/tile/wood/pine/tile
name = "tiled pine floor tile"
singular_name = "tiled wood floor tile"
icon_state = "tile-wood-gs_tile"
/obj/item/stack/tile/wood/pine/vert
name = "vertical pine wood floor tile"
singular_name = "vertical pine wood floor tile"
icon_state = "tile-wood-vert-gs"
/obj/item/stack/tile/wood/pine/vert_panel
name = "large vertical pine wood floor tile"
singular_name = "large vertical pine wood floor tile"
icon_state = "tile-wood-vert-gs_large"
/obj/item/stack/tile/wood/oak
name = "oak wood floor tile"
singular_name = "wood floor tile"
icon = 'icons/obj/stacks_vr.dmi'
icon_state = "tile-wood-gs"
color = "#674928"
/obj/item/stack/tile/wood/oak/parquet
name = "oak parquet floor tile"
singular_name = "parquet wood floor tile"
icon_state = "tile-wood-gs_parquet"
/obj/item/stack/tile/wood/oak/panel
name = "large oak floor tile"
singular_name = "large wood floor tile"
icon_state = "tile-wood-gs_large"
/obj/item/stack/tile/wood/oak/tile
name = "tiled oak floor tile"
singular_name = "tiled wood floor tile"
icon_state = "tile-wood-gs_tile"
/obj/item/stack/tile/wood/oak/vert
name = "vertical oak wood floor tile"
singular_name = "vertical oak wood floor tile"
icon_state = "tile-wood-vert-gs"
/obj/item/stack/tile/wood/oak/vert_panel
name = "large vertical oak wood floor tile"
singular_name = "large vertical oak wood floor tile"
icon_state = "tile-wood-vert-gs_large"
/obj/item/stack/tile/wood/redwood
name = "redwood floor tile"
singular_name = "redwood floor tile"
icon = 'icons/obj/stacks_vr.dmi'
icon_state = "tile-wood-gs"
color = "#a45a52"
/obj/item/stack/tile/wood/redwood/parquet
name = "redwood parquet floor tile"
singular_name = "parquet redwood floor tile"
icon_state = "tile-wood-gs_parquet"
/obj/item/stack/tile/wood/redwood/panel
name = "large redwood floor tile"
singular_name = "large redwood floor tile"
icon_state = "tile-wood-gs_large"
/obj/item/stack/tile/wood/redwood/tile
name = "tiled redwood floor tile"
singular_name = "tiled redwood floor tile"
icon_state = "tile-wood-gs_tile"
/obj/item/stack/tile/wood/redwood/vert
name = "vertical redwood wood floor tile"
singular_name = "vertical redwood wood floor tile"
icon_state = "tile-wood-vert-gs"
/obj/item/stack/tile/wood/redwood/vert_panel
name = "large vertical redwood wood floor tile"
singular_name = "large vertical redwood wood floor tile"
icon_state = "tile-wood-vert-gs_large"
/obj/item/stack/tile/wood/cyborg
name = "wood floor tile synthesizer"

View File

@@ -180,5 +180,7 @@
M.visible_message(span_infoplain(span_bold("\The [user]") + " scans the wounds on [M]'s [S.name] with [src]"))
src.add_data(S)
SEND_SIGNAL(src,COMSIG_AUTOPSY_PERFORMED, user, M)
SEND_GLOBAL_SIGNAL(COMSIG_GLOB_AUTOPSY_PERFORMED, user, M)
return 1

View File

@@ -352,6 +352,14 @@
board_type = new /datum/frame/frame_types/industrial_reagent_pipe
req_components = list( /obj/item/stack/material/glass/reinforced = 1)
/obj/item/circuitboard/industrial_reagent_splitter
name = T_BOARD("industrial chemical splitter")
build_path = /obj/machinery/reagent_refinery/splitter
board_type = new /datum/frame/frame_types/industrial_reagent_splitter
req_components = list(
/obj/item/stack/material/glass/reinforced = 1,
/obj/item/stock_parts/motor = 1)
/obj/item/circuitboard/industrial_reagent_waste_processor
name = T_BOARD("industrial chemical waste processor")
build_path = /obj/machinery/reagent_refinery/waste_processor

View File

@@ -157,6 +157,11 @@
initial_sprite_stack = list("base-stamp-silver", "top-orange", "stamp-n", "pips-gold")
rank = JOB_CHIEF_ENGINEER
/obj/item/card/id/engineering/chemical
name = JOB_ALT_CHEMENGINEER + "'s ID"
initial_sprite_stack = list("base-stamp", "top-orange", "stamp-n", "pips-medblu", "stripe-white")
rank = JOB_ENGINEER
//Science
/obj/item/card/id/science

View File

@@ -84,7 +84,9 @@
/obj/item/integrated_electronics/debugger,
/obj/item/shovel/spade,
/obj/item/stack/nanopaste,
/obj/item/geiger
/obj/item/geiger,
/obj/item/reagent_scanner,
/obj/item/lightpainter
)
/obj/item/storage/belt/utility/full
@@ -108,6 +110,16 @@
/obj/item/multitool
)
/obj/item/storage/belt/utility/chemtech
starts_with = list(
/obj/item/tool/screwdriver,
/obj/item/tool/wrench,
/obj/item/weldingtool,
/obj/item/tool/crowbar,
/obj/item/tool/wirecutters,
/obj/item/reagent_scanner
)
/obj/item/storage/belt/utility/atmostech
starts_with = list(
/obj/item/tool/screwdriver,
@@ -220,7 +232,9 @@
/obj/item/stack/material/glass,
/obj/item/lightreplacer,
/obj/item/pickaxe/plasmacutter,
/obj/item/holosign_creator/combifan
/obj/item/holosign_creator/combifan,
/obj/item/reagent_scanner,
/obj/item/lightpainter
)

View File

@@ -47,6 +47,7 @@ Loot piles can be depleted, if loot_depleted is turned on. Note that players wh
busy = TRUE
if(do_after(user, rand(4 SECONDS,6 SECONDS), target = src))
SEND_SIGNAL(src,COMSIG_LOOT_REWARD,L,searchedby)
SEND_GLOBAL_SIGNAL(COMSIG_GLOB_TRASHPILE_SEARCHED,L,searchedby)
busy = FALSE
else
return ..()

View File

@@ -271,9 +271,31 @@
/obj/structure/simple_door/hardwood/Initialize(mapload,var/material_name)
. = ..(mapload, material_name || MAT_HARDWOOD)
knock_sound = 'sound/machines/door/knock_wood.wav'
/obj/structure/simple_door/sifwood/Initialize(mapload,var/material_name)
. = ..(mapload, material_name || MAT_SIFWOOD)
knock_sound = 'sound/machines/door/knock_wood.wav'
/obj/structure/simple_door/birchwood/Initialize(mapload,var/material_name)
. = ..(mapload, material_name || MAT_BIRCHWOOD)
knock_sound = 'sound/machines/door/knock_wood.wav'
/obj/structure/simple_door/pinewood/Initialize(mapload,var/material_name)
. = ..(mapload, material_name || MAT_PINEWOOD)
knock_sound = 'sound/machines/door/knock_wood.wav'
/obj/structure/simple_door/oakwood/Initialize(mapload,var/material_name)
. = ..(mapload, material_name || MAT_OAKWOOD)
knock_sound = 'sound/machines/door/knock_wood.wav'
/obj/structure/simple_door/acaciawood/Initialize(mapload,var/material_name)
. = ..(mapload, material_name || MAT_ACACIAWOOD)
knock_sound = 'sound/machines/door/knock_wood.wav'
/obj/structure/simple_door/redwood/Initialize(mapload,var/material_name)
. = ..(mapload, material_name || MAT_REDWOOD)
knock_sound = 'sound/machines/door/knock_wood.wav'
/obj/structure/simple_door/resin/Initialize(mapload,var/material_name)
. = ..(mapload, material_name || MAT_RESIN)

View File

@@ -129,6 +129,7 @@
to_chat(user,span_danger("Some sort of creature leaps out of \the [src]!"))
else
SEND_SIGNAL(src,COMSIG_LOOT_REWARD,user,searchedby, 5)
SEND_GLOBAL_SIGNAL(COMSIG_GLOB_TRASHPILE_SEARCHED,user,searchedby)
busy = FALSE
else
return ..()

View File

@@ -393,7 +393,7 @@ var/list/flooring_types
/decl/flooring/linoleum
name = "linoleum"
desc = "It's like the 2390's all over again."
desc = "It's like the 2390's all over again." //CHOMPEDIT - Age
icon = 'icons/turf/flooring/linoleum.dmi'
icon_base = "lino"
can_paint = 1
@@ -493,10 +493,30 @@ var/list/flooring_types
/decl/flooring/wood/sif
desc = "Polished wood planks made from sivian wood."
icon = 'icons/turf/flooring/wood.dmi'
icon_base = "sifwood"
icon = 'icons/turf/flooring/wood_greyscale.dmi'
icon_base = "wood"
build_type = /obj/item/stack/tile/wood/sif
/decl/flooring/wood/sif/panel
icon_base = "sif_panel"
build_type = /obj/item/stack/tile/wood/sif/panel
/decl/flooring/wood/sif/parquet
icon_base = "wood_parquet"
build_type = /obj/item/stack/tile/wood/sif/parquet
/decl/flooring/wood/sif/tile
icon_base = "wood_tile"
build_type = /obj/item/stack/tile/wood/sif/tile
/decl/flooring/wood/sif/vert
icon_base = "wood_vert"
build_type = /obj/item/stack/tile/wood/sif/vert
/decl/flooring/wood/sif/vert_panel
icon_base = "wood_vert_panel"
build_type = /obj/item/stack/tile/wood/sif/vert_panel
/decl/flooring/wood/alt
icon = 'icons/turf/flooring/wood.dmi'
icon_base = "wood"
@@ -504,24 +524,303 @@ var/list/flooring_types
/decl/flooring/wood/alt/panel
desc = "Polished wooden panels."
icon = 'icons/turf/flooring/wood.dmi'
icon = 'icons/turf/flooring/wood_greyscale.dmi'
icon_base = "wood_panel"
has_damage_range = 2
build_type = /obj/item/stack/tile/wood/panel
/decl/flooring/wood/alt/parquet
desc = "Polished wooden tiles."
icon = 'icons/turf/flooring/wood.dmi'
icon = 'icons/turf/flooring/wood_greyscale.dmi'
icon_base = "wood_parquet"
build_type = /obj/item/stack/tile/wood/parquet
/decl/flooring/wood/alt/vert
desc = "Polished wooden planks."
icon = 'icons/turf/flooring/wood_greyscale.dmi'
icon_base = "wood_vert"
build_type = /obj/item/stack/tile/wood/vert
/decl/flooring/wood/alt/vert_panel
desc = "Polished wooden panels."
icon = 'icons/turf/flooring/wood_greyscale.dmi'
icon_base = "wood_vert_panel"
build_type = /obj/item/stack/tile/wood/vert_panel
/decl/flooring/wood/alt/tile
desc = "Polished wooden tiles."
icon = 'icons/turf/flooring/wood.dmi'
icon = 'icons/turf/flooring/wood_greyscale.dmi'
icon_base = "wood_tile"
has_damage_range = 2
build_type = /obj/item/stack/tile/wood/tile
//New Wood
/decl/flooring/wood/acacia
name = "wooden floor"
desc = "Polished acacia planks."
icon = 'icons/turf/flooring/wood_greyscale.dmi'
icon_base = "wood"
has_damage_range = 6
damage_temperature = T0C+200
descriptor = "planks"
build_type = /obj/item/stack/tile/wood/acacia
flags = TURF_CAN_BREAK | TURF_REMOVE_CROWBAR | TURF_REMOVE_SCREWDRIVER
/decl/flooring/wood/acacia/panel
desc = "Polished acacia panels."
icon = 'icons/turf/flooring/wood_greyscale.dmi'
icon_base = "wood_panel"
has_damage_range = 2
build_type = /obj/item/stack/tile/wood/acacia/panel
/decl/flooring/wood/acacia/parquet
desc = "Polished acacia parquet."
icon = 'icons/turf/flooring/wood_greyscale.dmi'
icon_base = "wood_parquet"
build_type = /obj/item/stack/tile/wood/acacia/parquet
/decl/flooring/wood/acacia/tile
desc = "Polished acacia tiles."
icon = 'icons/turf/flooring/wood_greyscale.dmi'
icon_base = "wood_tile"
has_damage_range = 2
build_type = /obj/item/stack/tile/wood/acacia/tile
/decl/flooring/wood/acacia/vert
desc = "Polished acacia planks."
icon = 'icons/turf/flooring/wood_greyscale.dmi'
icon_base = "wood_vert"
build_type = /obj/item/stack/tile/wood/acacia/vert
/decl/flooring/wood/acacia/vert_panel
desc = "Polished acacia panels."
icon = 'icons/turf/flooring/wood_greyscale.dmi'
icon_base = "wood_vert_panel"
has_damage_range = 2
build_type = /obj/item/stack/tile/wood/acacia/vert_panel
/decl/flooring/wood/birch
name = "wooden floor"
desc = "Polished birch planks."
icon = 'icons/turf/flooring/wood_greyscale.dmi'
icon_base = "wood"
has_damage_range = 6
damage_temperature = T0C+200
descriptor = "planks"
build_type = /obj/item/stack/tile/wood/birch
flags = TURF_CAN_BREAK | TURF_REMOVE_CROWBAR | TURF_REMOVE_SCREWDRIVER
/decl/flooring/wood/birch/panel
desc = "Polished birch panels."
icon = 'icons/turf/flooring/wood_greyscale.dmi'
icon_base = "wood_panel"
has_damage_range = 2
build_type = /obj/item/stack/tile/wood/birch/panel
/decl/flooring/wood/birch/parquet
desc = "Polished birch tiles."
icon = 'icons/turf/flooring/wood_greyscale.dmi'
icon_base = "wood_parquet"
build_type = /obj/item/stack/tile/wood/birch/parquet
/decl/flooring/wood/birch/tile
desc = "Polished birch tiles."
icon = 'icons/turf/flooring/wood_greyscale.dmi'
icon_base = "wood_tile"
has_damage_range = 2
build_type = /obj/item/stack/tile/wood/birch/tile
/decl/flooring/wood/birch/vert
desc = "Polished birch planks."
icon = 'icons/turf/flooring/wood_greyscale.dmi'
icon_base = "wood_vert"
build_type = /obj/item/stack/tile/wood/birch/vert
/decl/flooring/wood/birch/vert_panel
desc = "Polished birch panels."
icon = 'icons/turf/flooring/wood_greyscale.dmi'
icon_base = "wood_vert_panel"
has_damage_range = 2
build_type = /obj/item/stack/tile/wood/birch/vert_panel
/decl/flooring/wood/hardwood
name = "wooden floor"
desc = "Polished hardwood planks."
icon = 'icons/turf/flooring/wood_greyscale.dmi'
icon_base = "wood"
has_damage_range = 6
damage_temperature = T0C+200
descriptor = "planks"
build_type = /obj/item/stack/tile/wood/hardwood
flags = TURF_CAN_BREAK | TURF_REMOVE_CROWBAR | TURF_REMOVE_SCREWDRIVER
/decl/flooring/wood/hardwood/panel
desc = "Polished hardwood panels."
icon = 'icons/turf/flooring/wood_greyscale.dmi'
icon_base = "wood_panel"
has_damage_range = 2
build_type = /obj/item/stack/tile/wood/hardwood/panel
/decl/flooring/wood/hardwood/parquet
desc = "Polished hardwood tiles."
icon = 'icons/turf/flooring/wood_greyscale.dmi'
icon_base = "wood_parquet"
build_type = /obj/item/stack/tile/wood/hardwood/parquet
/decl/flooring/wood/hardwood/tile
desc = "Polished hardwood tiles."
icon = 'icons/turf/flooring/wood_greyscale.dmi'
icon_base = "wood_tile"
has_damage_range = 2
build_type = /obj/item/stack/tile/wood/hardwood/tile
/decl/flooring/wood/hardwood/vert
desc = "Polished hardwood planks."
icon = 'icons/turf/flooring/wood_greyscale.dmi'
icon_base = "wood_vert"
build_type = /obj/item/stack/tile/wood/hardwood/vert
/decl/flooring/wood/hardwood/vert_panel
desc = "Polished hardwood panels."
icon = 'icons/turf/flooring/wood_greyscale.dmi'
icon_base = "wood_vert_panel"
has_damage_range = 2
build_type = /obj/item/stack/tile/wood/hardwood/vert_panel
/decl/flooring/wood/oak
name = "wooden floor"
desc = "Polished oak planks."
icon = 'icons/turf/flooring/wood_greyscale.dmi'
icon_base = "wood"
has_damage_range = 6
damage_temperature = T0C+200
descriptor = "planks"
build_type = /obj/item/stack/tile/wood/oak
flags = TURF_CAN_BREAK | TURF_REMOVE_CROWBAR | TURF_REMOVE_SCREWDRIVER
/decl/flooring/wood/oak/panel
desc = "Polished oak panels."
icon = 'icons/turf/flooring/wood_greyscale.dmi'
icon_base = "wood_panel"
has_damage_range = 2
build_type = /obj/item/stack/tile/wood/oak/panel
/decl/flooring/wood/oak/parquet
desc = "Polished oak tiles."
icon = 'icons/turf/flooring/wood_greyscale.dmi'
icon_base = "wood_parquet"
build_type = /obj/item/stack/tile/wood/oak/parquet
/decl/flooring/wood/oak/tile
desc = "Polished oak tiles."
icon = 'icons/turf/flooring/wood_greyscale.dmi'
icon_base = "wood_tile"
has_damage_range = 2
build_type = /obj/item/stack/tile/wood/oak/tile
/decl/flooring/wood/oak/vert
desc = "Polished oak planks."
icon = 'icons/turf/flooring/wood_greyscale.dmi'
icon_base = "wood_vert"
build_type = /obj/item/stack/tile/wood/oak/vert
/decl/flooring/wood/oak/vert_panel
desc = "Polished oak panels."
icon = 'icons/turf/flooring/wood_greyscale.dmi'
icon_base = "wood_vert_panel"
has_damage_range = 2
build_type = /obj/item/stack/tile/wood/oak/vert_panel
/decl/flooring/wood/pine
name = "wooden floor"
desc = "Polished pine planks."
icon = 'icons/turf/flooring/wood_greyscale.dmi'
icon_base = "wood"
has_damage_range = 6
damage_temperature = T0C+200
descriptor = "planks"
build_type = /obj/item/stack/tile/wood/pine
flags = TURF_CAN_BREAK | TURF_REMOVE_CROWBAR | TURF_REMOVE_SCREWDRIVER
/decl/flooring/wood/pine/panel
desc = "Polished pine panels."
icon = 'icons/turf/flooring/wood_greyscale.dmi'
icon_base = "wood_panel"
has_damage_range = 2
build_type = /obj/item/stack/tile/wood/pine/panel
/decl/flooring/wood/pine/parquet
desc = "Polished pine tiles."
icon = 'icons/turf/flooring/wood_greyscale.dmi'
icon_base = "wood_parquet"
build_type = /obj/item/stack/tile/wood/pine/parquet
/decl/flooring/wood/pine/tile
desc = "Polished pine tiles."
icon = 'icons/turf/flooring/wood_greyscale.dmi'
icon_base = "wood_tile"
has_damage_range = 2
build_type = /obj/item/stack/tile/wood/pine/tile
/decl/flooring/wood/pine/vert
desc = "Polished pine planks."
icon = 'icons/turf/flooring/wood_greyscale.dmi'
icon_base = "wood_vert"
build_type = /obj/item/stack/tile/wood/pine/vert
/decl/flooring/wood/pine/vert_panel
desc = "Polished pine panels."
icon = 'icons/turf/flooring/wood_greyscale.dmi'
icon_base = "wood_vert_panel"
has_damage_range = 2
build_type = /obj/item/stack/tile/wood/pine/vert_panel
/decl/flooring/wood/redwood
name = "wooden floor"
desc = "Polished redwood planks."
icon = 'icons/turf/flooring/wood_greyscale.dmi'
icon_base = "wood"
has_damage_range = 6
damage_temperature = T0C+200
descriptor = "planks"
build_type = /obj/item/stack/tile/wood/redwood
flags = TURF_CAN_BREAK | TURF_REMOVE_CROWBAR | TURF_REMOVE_SCREWDRIVER
/decl/flooring/wood/redwood/panel
desc = "Polished redwood panels."
icon = 'icons/turf/flooring/wood_greyscale.dmi'
icon_base = "wood_panel"
has_damage_range = 2
build_type = /obj/item/stack/tile/wood/redwood/panel
/decl/flooring/wood/redwood/parquet
desc = "Polished redwood tiles."
icon = 'icons/turf/flooring/wood_greyscale.dmi'
icon_base = "wood_parquet"
build_type = /obj/item/stack/tile/wood/redwood/parquet
/decl/flooring/wood/redwood/tile
desc = "Polished redwood tiles."
icon = 'icons/turf/flooring/wood_greyscale.dmi'
icon_base = "wood_tile"
has_damage_range = 2
build_type = /obj/item/stack/tile/wood/redwood/tile
/decl/flooring/wood/redwood/vert
desc = "Polished redwood planks."
icon = 'icons/turf/flooring/wood_greyscale.dmi'
icon_base = "wood_vert"
build_type = /obj/item/stack/tile/wood/redwood/vert
/decl/flooring/wood/redwood/vert_panel
desc = "Polished redwood panels."
icon = 'icons/turf/flooring/wood_greyscale.dmi'
icon_base = "wood_vert_panel"
has_damage_range = 2
build_type = /obj/item/stack/tile/wood/redwood/vert_panel
// no more wood
/decl/flooring/reinforced
name = "reinforced floor"
desc = "Heavily reinforced with steel rods."

View File

@@ -127,8 +127,10 @@
/turf/simulated/floor/wood/sif
name = "alien wooden floor"
icon_state = "sifwood"
icon = 'icons/turf/flooring/wood_greyscale.dmi'
icon_state = "wood"
initial_flooring = /decl/flooring/wood/sif
color = "#293c50"
/turf/simulated/floor/wood/sif/broken
icon_state = "sifwood-broken0" // This gets changed when spawned.
@@ -137,9 +139,30 @@
. = ..()
break_tile()
/turf/simulated/floor/wood/sif/tile
icon_state = "wood_tile"
initial_flooring = /decl/flooring/wood/sif/tile
/turf/simulated/floor/wood/sif/panel
icon_state = "wood_panel"
initial_flooring = /decl/flooring/wood/sif/panel
/turf/simulated/floor/wood/sif/parquet
icon_state = "wood_parquet"
initial_flooring = /decl/flooring/wood/sif/parquet
/turf/simulated/floor/wood/sif/vert
icon_state = "wood_vert"
initial_flooring = /decl/flooring/wood/sif/vert
/turf/simulated/floor/wood/sif/vert_panel
icon_state = "wood_vert_panel"
initial_flooring = /decl/flooring/wood/sif/vert_panel
/turf/simulated/floor/wood/alt
icon = 'icons/turf/flooring/wood.dmi'
icon = 'icons/turf/flooring/wood_greyscale.dmi'
initial_flooring = /decl/flooring/wood/alt
color = "#593c1c"
/turf/simulated/floor/wood/alt/broken
icon_state = "wood-broken0" // This gets changed when spawned.
@@ -181,6 +204,14 @@
. = ..()
break_tile()
/turf/simulated/floor/wood/alt/vert
icon_state = "wood_vert"
initial_flooring = /decl/flooring/wood/alt/vert
/turf/simulated/floor/wood/alt/vert_panel
icon_state = "wood_vert_panel"
initial_flooring = /decl/flooring/wood/alt/vert_panel
/turf/simulated/floor/grass
name = "grass patch"
icon = 'icons/turf/flooring/grass.dmi'
@@ -555,3 +586,197 @@
icon = 'icons/turf/concrete.dmi'
icon_state = "concrete"
initial_flooring = /decl/flooring/concrete
//New Wood
/turf/simulated/floor/wood/acacia
name = "acacia wood floor"
icon = 'icons/turf/flooring/wood_greyscale.dmi'
color = "#b75e12"
icon_state = "wood"
initial_flooring = /decl/flooring/wood/acacia
/turf/simulated/floor/wood/acacia/tile
icon = 'icons/turf/flooring/wood_greyscale.dmi'
icon_state = "wood_tile"
initial_flooring = /decl/flooring/wood/acacia/tile
/turf/simulated/floor/wood/acacia/panel
icon = 'icons/turf/flooring/wood_greyscale.dmi'
icon_state = "wood_panel"
initial_flooring = /decl/flooring/wood/acacia/panel
/turf/simulated/floor/wood/acacia/parquet
icon = 'icons/turf/flooring/wood_greyscale.dmi'
icon_state = "wood_parquet"
initial_flooring = /decl/flooring/wood/acacia/parquet
/turf/simulated/floor/wood/acacia/vert
icon = 'icons/turf/flooring/wood_greyscale.dmi'
icon_state = "wood_vert"
initial_flooring = /decl/flooring/wood/acacia/vert
/turf/simulated/floor/wood/acacia/vert_panel
icon = 'icons/turf/flooring/wood_greyscale.dmi'
icon_state = "wood_vert_panel"
initial_flooring = /decl/flooring/wood/acacia/vert_panel
/turf/simulated/floor/wood/birch
name = "birch wood floor"
icon = 'icons/turf/flooring/wood_greyscale.dmi'
color = "#f6dec0"
icon_state = "wood"
initial_flooring = /decl/flooring/wood/birch
/turf/simulated/floor/wood/birch/tile
icon = 'icons/turf/flooring/wood_greyscale.dmi'
icon_state = "wood_tile"
initial_flooring = /decl/flooring/wood/birch/tile
/turf/simulated/floor/wood/birch/panel
icon = 'icons/turf/flooring/wood_greyscale.dmi'
icon_state = "wood_panel"
initial_flooring = /decl/flooring/wood/birch/panel
/turf/simulated/floor/wood/birch/parquet
icon = 'icons/turf/flooring/wood_greyscale.dmi'
icon_state = "wood_parquet"
initial_flooring = /decl/flooring/wood/birch/parquet
/turf/simulated/floor/wood/birch/vert
icon = 'icons/turf/flooring/wood_greyscale.dmi'
icon_state = "wood_vert"
initial_flooring = /decl/flooring/wood/birch/vert
/turf/simulated/floor/wood/birch/vert_panel
icon = 'icons/turf/flooring/wood_greyscale.dmi'
icon_state = "wood_vert_panel"
initial_flooring = /decl/flooring/wood/birch/vert_panel
/turf/simulated/floor/wood/hardwood
name = "hardwood wood floor"
icon = 'icons/turf/flooring/wood_greyscale.dmi'
color = "#42291a"
icon_state = "wood"
initial_flooring = /decl/flooring/wood/hardwood
/turf/simulated/floor/wood/hardwood/tile
icon = 'icons/turf/flooring/wood_greyscale.dmi'
icon_state = "wood_tile"
initial_flooring = /decl/flooring/wood/hardwood/tile
/turf/simulated/floor/wood/hardwood/panel
icon = 'icons/turf/flooring/wood_greyscale.dmi'
icon_state = "wood_panel"
initial_flooring = /decl/flooring/wood/hardwood/panel
/turf/simulated/floor/wood/hardwood/parquet
icon = 'icons/turf/flooring/wood_greyscale.dmi'
icon_state = "wood_parquet"
initial_flooring = /decl/flooring/wood/hardwood/parquet
/turf/simulated/floor/wood/hardwood/vert
icon = 'icons/turf/flooring/wood_greyscale.dmi'
icon_state = "wood_vert"
initial_flooring = /decl/flooring/wood/hardwood/vert
/turf/simulated/floor/wood/hardwood/vert_panel
icon = 'icons/turf/flooring/wood_greyscale.dmi'
icon_state = "wood_vert_panel"
initial_flooring = /decl/flooring/wood/hardwood/vert_panel
/turf/simulated/floor/wood/oak
name = "oak wood floor"
icon = 'icons/turf/flooring/wood_greyscale.dmi'
color = "#674928"
icon_state = "wood"
initial_flooring = /decl/flooring/wood/oak
/turf/simulated/floor/wood/oak/tile
icon = 'icons/turf/flooring/wood_greyscale.dmi'
icon_state = "wood_tile"
initial_flooring = /decl/flooring/wood/oak/tile
/turf/simulated/floor/wood/oak/panel
icon = 'icons/turf/flooring/wood_greyscale.dmi'
icon_state = "wood_panel"
initial_flooring = /decl/flooring/wood/oak/panel
/turf/simulated/floor/wood/oak/parquet
icon = 'icons/turf/flooring/wood_greyscale.dmi'
icon_state = "wood_parquet"
initial_flooring = /decl/flooring/wood/oak/parquet
/turf/simulated/floor/wood/oak/vert
icon = 'icons/turf/flooring/wood_greyscale.dmi'
icon_state = "wood_vert"
initial_flooring = /decl/flooring/wood/oak/vert
/turf/simulated/floor/wood/oak/vert_panel
icon = 'icons/turf/flooring/wood_greyscale.dmi'
icon_state = "wood_vert_panel"
initial_flooring = /decl/flooring/wood/oak/vert_panel
/turf/simulated/floor/wood/pine
name = "pine wood floor"
icon = 'icons/turf/flooring/wood_greyscale.dmi'
color = "#cd9d6f"
icon_state = "wood"
initial_flooring = /decl/flooring/wood/pine
/turf/simulated/floor/wood/pine/tile
icon = 'icons/turf/flooring/wood_greyscale.dmi'
icon_state = "wood_tile"
initial_flooring = /decl/flooring/wood/pine/tile
/turf/simulated/floor/wood/pine/panel
icon = 'icons/turf/flooring/wood_greyscale.dmi'
icon_state = "wood_panel"
initial_flooring = /decl/flooring/wood/pine/panel
/turf/simulated/floor/wood/pine/parquet
icon = 'icons/turf/flooring/wood_greyscale.dmi'
icon_state = "wood_parquet"
initial_flooring = /decl/flooring/wood/pine/parquet
/turf/simulated/floor/wood/pine/vert
icon = 'icons/turf/flooring/wood_greyscale.dmi'
icon_state = "wood_vert"
initial_flooring = /decl/flooring/wood/pine/vert
/turf/simulated/floor/wood/pine/vert_panel
icon = 'icons/turf/flooring/wood_greyscale.dmi'
icon_state = "wood_vert_panel"
initial_flooring = /decl/flooring/wood/pine/vert_panel
/turf/simulated/floor/wood/redwood
name = "redwood wood floor"
icon = 'icons/turf/flooring/wood_greyscale.dmi'
color = "#a45a52"
icon_state = "wood"
initial_flooring = /decl/flooring/wood/redwood
/turf/simulated/floor/wood/redwood/tile
icon = 'icons/turf/flooring/wood_greyscale.dmi'
icon_state = "wood_tile"
initial_flooring = /decl/flooring/wood/redwood/tile
/turf/simulated/floor/wood/redwood/panel
icon = 'icons/turf/flooring/wood_greyscale.dmi'
icon_state = "wood_panel"
initial_flooring = /decl/flooring/wood/redwood/panel
/turf/simulated/floor/wood/redwood/parquet
icon = 'icons/turf/flooring/wood_greyscale.dmi'
icon_state = "wood_parquet"
initial_flooring = /decl/flooring/wood/redwood/parquet
/turf/simulated/floor/wood/redwood/vert
icon = 'icons/turf/flooring/wood_greyscale.dmi'
icon_state = "wood_vert"
initial_flooring = /decl/flooring/wood/redwood/vert
/turf/simulated/floor/wood/redwood/vert_panel
icon = 'icons/turf/flooring/wood_greyscale.dmi'
icon_state = "wood_vert_panel"
initial_flooring = /decl/flooring/wood/redwood/vert_panel

View File

@@ -71,6 +71,7 @@
desc = base_desc
icon = base_icon
icon_state = base_icon_state
color = null
if(!is_plating()) // Flooring -> Plating
swap_decals()

View File

@@ -77,6 +77,8 @@
S.use(1)
playsound(src, 'sound/weapons/genhit.ogg', 50, 1)
ChangeTurf(/turf/simulated/floor, preserve_outdoors = TRUE)
if(S.color)
color = S.color
return
else if(istype(C, /obj/item))
try_deconstruct_tile(C, user)
@@ -119,6 +121,8 @@
return
if(S.use(use_flooring.build_cost))
set_flooring(use_flooring)
if(S.color)
color = S.color
playsound(src, 'sound/items/Deconstruct.ogg', 80, 1)
return
// Plating repairs and removal

View File

@@ -65,7 +65,7 @@
/turf/simulated/floor/outdoors/snow/sif/planetuse/attackby(var/obj/item/W, var/mob/user)
if(istype(W, /obj/item/shovel))
to_chat(user, span_notice("You begin to remove \the [src] with your [W]."))
if(do_after(user, 4 SECONDS * W.toolspeed))
if(do_after(user, 4 SECONDS * W.toolspeed, src))
to_chat(user, span_notice("\The [src] has been dug up, and now lies in a pile nearby."))
new /obj/item/stack/material/snow(src)
demote()
@@ -76,7 +76,7 @@
/turf/simulated/floor/outdoors/snow/sif/planetuse/attack_hand(mob/user as mob)
visible_message("[user] starts scooping up some snow.", "You start scooping up some snow.")
if(do_after(user, 1 SECOND))
if(do_after(user, 1 SECOND, src))
var/obj/S = new /obj/item/stack/material/snow(user.loc)
user.put_in_hands(S)
visible_message("[user] scoops up a pile of snow.", "You scoop up a pile of snow.")

View File

@@ -123,6 +123,21 @@
. = ..(mapload, MAT_SIFWOOD, MAT_SIFWOOD, MAT_SIFWOOD)
// CHOMPEdit End
/turf/simulated/wall/birchwood/Initialize(mapload)
. = ..(mapload, MAT_BIRCHWOOD)
/turf/simulated/wall/pinewood/Initialize(mapload)
. = ..(mapload, MAT_PINEWOOD)
/turf/simulated/wall/oakwood/Initialize(mapload)
. = ..(mapload, MAT_OAKWOOD)
/turf/simulated/wall/acaciawood/Initialize(mapload)
. = ..(mapload, MAT_ACACIAWOOD)
/turf/simulated/wall/redwood/Initialize(mapload)
. = ..(mapload, MAT_REDWOOD)
/turf/simulated/wall/log/Initialize(mapload)
. = ..(mapload, MAT_LOG)

View File

@@ -230,6 +230,30 @@ var/list/flesh_overlay_cache = list()
icon_state = "wood"
icon = 'icons/turf/wall_masks_vr.dmi'
/turf/simulated/wall/acaciawood
icon_state = "acaciawood"
icon = 'icons/turf/wall_masks_vr.dmi'
/turf/simulated/wall/birchwood
icon_state = "birchwood"
icon = 'icons/turf/wall_masks_vr.dmi'
/turf/simulated/wall/hardwood
icon_state = "hardwood"
icon = 'icons/turf/wall_masks_vr.dmi'
/turf/simulated/wall/oakwood
icon_state = "oakwood"
icon = 'icons/turf/wall_masks_vr.dmi'
/turf/simulated/wall/pinewood
icon_state = "pinewood"
icon = 'icons/turf/wall_masks_vr.dmi'
/turf/simulated/wall/redwood
icon_state = "redwood"
icon = 'icons/turf/wall_masks_vr.dmi'
/turf/simulated/wall/stonebricks
icon_state = "stonebrick"
icon = 'icons/turf/wall_masks_vr.dmi'

View File

@@ -520,6 +520,8 @@
if(istype(src, /turf/simulated))
var/turf/simulated/T = src
if(T.dirt > 0)
SEND_GLOBAL_SIGNAL(COMSIG_GLOB_WASHED_FLOOR)
T.dirt = 0
for(var/am in src)

View File

@@ -137,6 +137,7 @@
/obj/item/forensics/sample_kit/proc/take_sample(var/mob/user, var/atom/supplied)
var/obj/item/sample/S = new evidence_path(get_turf(user), supplied)
to_chat(user, span_notice("You transfer [S.evidence.len] [S.evidence.len > 1 ? "[evidence_type]s" : "[evidence_type]"] to \the [S]."))
SEND_GLOBAL_SIGNAL(COMSIG_GLOB_FORENSICS_COLLECTED, supplied, user)
/obj/item/forensics/sample_kit/afterattack(var/atom/A, var/mob/user, var/proximity)
if(!proximity)

View File

@@ -114,6 +114,7 @@
if(sample_type)
user.visible_message("\The [user] swabs \the [A] for a sample.", "You swab \the [A] for a sample.")
set_used(sample_type, A)
SEND_GLOBAL_SIGNAL(COMSIG_GLOB_FORENSICS_COLLECTED, A, user)
/obj/item/forensics/swab/proc/set_used(var/sample_str, var/atom/source)
name = "[initial(name)] ([sample_str] - [source])"

View File

@@ -147,6 +147,7 @@
do_extra(user, target)
do_sound(user)
SEND_GLOBAL_SIGNAL(COMSIG_GLOB_EMOTE_PERFORMED, user, extra_params)
/decl/emote/proc/replace_target_tokens(var/msg, var/atom/target)
. = msg

View File

@@ -284,7 +284,7 @@
return 0
for(var/datum/medical_issue/MI in affected.medical_issues)
if(MI.cure_surgery == "bone reinforcement")
return affected && (affected.robotic < ORGAN_ROBOT) && affected.open >= 2
return affected && (affected.robotic < ORGAN_ROBOT) && affected.open >= FLESH_RETRACTED
return 0
/datum/surgery_step/medical_issue/strengthen_bone/begin_step(mob/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
@@ -325,7 +325,7 @@
return 0
for(var/datum/medical_issue/MI in affected.medical_issues)
if(MI.cure_surgery == "remove growths")
return affected && (affected.robotic < ORGAN_ROBOT) && affected.open >= 2
return affected && (affected.robotic < ORGAN_ROBOT) && affected.open >= FLESH_RETRACTED
return 0
/datum/surgery_step/medical_issue/remove_growth/begin_step(mob/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
@@ -366,7 +366,7 @@
return 0
for(var/datum/medical_issue/MI in affected.medical_issues)
if(MI.cure_surgery == "redirect blood vessels")
return affected && (affected.robotic < ORGAN_ROBOT) && affected.open >= 2
return affected && (affected.robotic < ORGAN_ROBOT) && affected.open >= FLESH_RETRACTED
return 0
/datum/surgery_step/medical_issue/redirect_vessels/begin_step(mob/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
@@ -407,7 +407,7 @@
return 0
for(var/datum/medical_issue/MI in affected.medical_issues)
if(MI.cure_surgery == "extract object")
return affected && (affected.robotic < ORGAN_ROBOT) && affected.open >= 2
return affected && (affected.robotic < ORGAN_ROBOT) && affected.open >= FLESH_RETRACTED
return 0
/datum/surgery_step/medical_issue/extract_object/begin_step(mob/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
@@ -448,7 +448,7 @@
return 0
for(var/datum/medical_issue/MI in affected.medical_issues)
if(MI.cure_surgery == "flesh graft")
return affected && (affected.robotic < ORGAN_ROBOT) && affected.open >= 2
return affected && (affected.robotic < ORGAN_ROBOT) && affected.open >= FLESH_RETRACTED
return 0
/datum/surgery_step/medical_issue/flesh_graft/begin_step(mob/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
@@ -492,7 +492,7 @@
for(var/obj/item/organ/internal/I in affected.internal_organs)
for(var/datum/medical_issue/MI in I.medical_issues)
if(MI.cure_surgery == "remove growths")
return affected && (affected.robotic < ORGAN_ROBOT) && affected.open >= 2
return affected && (affected.robotic < ORGAN_ROBOT) && affected.open >= FLESH_RETRACTED
return 0
/datum/surgery_step/medical_issue/remove_growth_internal/begin_step(mob/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
@@ -535,7 +535,7 @@
for(var/obj/item/organ/internal/I in affected.internal_organs)
for(var/datum/medical_issue/MI in I.medical_issues)
if(MI.cure_surgery == "redirect blood vessels")
return affected && (affected.robotic < ORGAN_ROBOT) && affected.open >= 2
return affected && (affected.robotic < ORGAN_ROBOT) && affected.open >= FLESH_RETRACTED
return 0
/datum/surgery_step/medical_issue/redirect_vessels_internal/begin_step(mob/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
@@ -578,7 +578,7 @@
for(var/obj/item/organ/internal/I in affected.internal_organs)
for(var/datum/medical_issue/MI in I.medical_issues)
if(MI.cure_surgery == "close holes")
return affected && (affected.robotic < ORGAN_ROBOT) && affected.open >= 2
return affected && (affected.robotic < ORGAN_ROBOT) && affected.open >= FLESH_RETRACTED
return 0
/datum/surgery_step/medical_issue/close_holes/begin_step(mob/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
@@ -621,7 +621,7 @@
for(var/obj/item/organ/internal/I in affected.internal_organs)
for(var/datum/medical_issue/MI in I.medical_issues)
if(MI.cure_surgery == "ultrasound")
return affected && (affected.robotic < ORGAN_ROBOT) && affected.open >= 2
return affected && (affected.robotic < ORGAN_ROBOT) && affected.open >= FLESH_RETRACTED
return 0
/datum/surgery_step/medical_issue/ultrasound/begin_step(mob/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
@@ -664,7 +664,7 @@
for(var/obj/item/organ/internal/I in affected.internal_organs)
for(var/datum/medical_issue/MI in I.medical_issues)
if(MI.cure_surgery == "reoxygenate tissue")
return affected && (affected.robotic < ORGAN_ROBOT) && affected.open >= 2
return affected && (affected.robotic < ORGAN_ROBOT) && affected.open >= FLESH_RETRACTED
return 0
/datum/surgery_step/medical_issue/reoxygenate_tissue/begin_step(mob/user, mob/living/carbon/human/target, target_zone, obj/item/tool)

View File

@@ -270,6 +270,8 @@
result_obj.reagents.trans_to(holder, result_obj.reagents.total_volume)
tally++
if(results.len)
SEND_GLOBAL_SIGNAL(COMSIG_GLOB_FOOD_PREPARED, container, results)
switch(reagent_mix)
if (RECIPE_REAGENT_REPLACE)

View File

@@ -9,6 +9,17 @@
per_round_cap = 3 //limited supply!
vendor_category = MAINTVENDOR_CONSTRUCTION
/datum/maint_recycler_vendor_entry/DIY_SifWood
name = "SIF WOOD???"
desc = "Seeing this stuff for the first time BLUE our minds, but not your wallets!!"
object_type_to_spawn = /obj/item/stack/material/wood/sif{amount = 20}
item_cost = 15 //not too pricy
tagline = "the trees are speaking 👽"
ad_message = "SIF! WOOD! WIF! WOOD!"
per_person_cap = 1
per_round_cap = 3 //limited supply!
vendor_category = MAINTVENDOR_CONSTRUCTION
/datum/maint_recycler_vendor_entry/DIY_HardWood //this one writes itself
name = "Hard... Knotty Wood... "
desc = "Seriously! this tree sucked! unsuitable for professional construction due to how hard the knots are, the savings (and various aches and pains) are passed onto YOU!!!"
@@ -20,6 +31,55 @@
per_round_cap = 3 //limited supply!
object_type_to_spawn = /obj/item/stack/material/wood/hard{amount = 20}
/datum/maint_recycler_vendor_entry/DIY_AcaciaWood //this one writes itself
name = "Acacia? I 'ardly Know 'er!"
desc = "Seriously! this tree sucked! unsuitable for professional construction due to how hard the knots are, the savings (and various aches and pains) are passed onto YOU!!!"
tagline = "Tree for the price of one!!!"
ad_message = "owo"
vendor_category = MAINTVENDOR_CONSTRUCTION
per_person_cap = 1
per_round_cap = 3 //limited supply!
object_type_to_spawn = /obj/item/stack/material/wood/acacia{amount = 20}
/datum/maint_recycler_vendor_entry/DIY_BirchWood //this one writes itself
name = "Hot Birches In Your Area!!"
desc = "99 Problems But A Birch Ain't One!"
tagline = "BIRCHES! IN! HEAT!"
ad_message = "🤤"
vendor_category = MAINTVENDOR_CONSTRUCTION
per_person_cap = 1
per_round_cap = 3 //limited supply!
object_type_to_spawn = /obj/item/stack/material/wood/birch{amount = 20}
/datum/maint_recycler_vendor_entry/DIY_OakWood
name = "Oak-y, Pal"
desc = "No ACORN-y jokes here, just gen-u-ine oak wood! That's it. Promise."
tagline = "Sure thing bud"
ad_message = "🤤"
vendor_category = MAINTVENDOR_CONSTRUCTION
per_person_cap = 1
per_round_cap = 3 //limited supply!
object_type_to_spawn = /obj/item/stack/material/wood/oak{amount = 20}
/datum/maint_recycler_vendor_entry/DIY_PineWood
name = "Pine For The Fjords..."
desc = "Smells like home. And also those little air freshener thingies you put in your car. Do people still have cars?"
tagline = "Enjoy the needles"
ad_message = "🌲"
vendor_category = MAINTVENDOR_CONSTRUCTION
per_person_cap = 1
per_round_cap = 3 //limited supply!
object_type_to_spawn = /obj/item/stack/material/wood/pine{amount = 20}
/datum/maint_recycler_vendor_entry/DIY_RedWood //this one writes itself
name = "REDWOOD? I SURE HAVE!"
desc = "This stuff is way too expensive to be in here, but we won't tell anyone if you don't!"
tagline = "REDRUM! Wait, no, don't."
ad_message = "waow"
vendor_category = MAINTVENDOR_CONSTRUCTION
per_person_cap = 1
per_round_cap = 3 //limited supply!
object_type_to_spawn = /obj/item/stack/material/wood/redwood{amount = 20}
/datum/maint_recycler_vendor_entry/cardboard
vendor_category = MAINTVENDOR_CONSTRUCTION

View File

@@ -104,6 +104,26 @@
name = "stack of hardwood"
type_to_spawn = /obj/item/stack/material/wood/hard
/obj/fiftyspawner/birchwood
name = "stack of birchwood"
type_to_spawn = /obj/item/stack/material/wood/birch
/obj/fiftyspawner/pinewood
name = "stack of pinewood"
type_to_spawn = /obj/item/stack/material/wood/pine
/obj/fiftyspawner/oakwood
name = "stack of oakwood"
type_to_spawn = /obj/item/stack/material/wood/oak
/obj/fiftyspawner/acaciawood
name = "stack of acaciawood"
type_to_spawn = /obj/item/stack/material/wood/acacia
/obj/fiftyspawner/redwood
name = "stack of redwood"
type_to_spawn = /obj/item/stack/material/wood/redwood
/obj/fiftyspawner/log
name = "stack of logs"
type_to_spawn = /obj/item/stack/material/log
@@ -152,7 +172,26 @@
name = "stack of stable glamour"
type_to_spawn = /obj/item/stack/material/glamour
//R-UST port
/obj/fiftyspawner/deuterium
name = "stack of deuterium"
type_to_spawn = /obj/item/stack/material/deuterium
/obj/fiftyspawner/titanium
name = "stack of titanium"
type_to_spawn = /obj/item/stack/material/titanium
/obj/fiftyspawner/titanium_glass
name = "stack of ti-glass"
type_to_spawn = /obj/item/stack/material/glass/titanium
/obj/fiftyspawner/plastitanium
name = "stack of plastitanium"
type_to_spawn = /obj/item/stack/material/plastitanium
/obj/fiftyspawner/plastitanium_hull
name = "stack of plastitanium"
type_to_spawn = /obj/item/stack/material/plastitanium/hull
/obj/fiftyspawner/plastitanium_glass
name = "stack of plastitanium glass"
type_to_spawn = /obj/item/stack/material/glass/plastitanium

View File

@@ -1,19 +0,0 @@
/obj/fiftyspawner/titanium
name = "stack of titanium"
type_to_spawn = /obj/item/stack/material/titanium
/obj/fiftyspawner/titanium_glass
name = "stack of ti-glass"
type_to_spawn = /obj/item/stack/material/glass/titanium
/obj/fiftyspawner/plastitanium
name = "stack of plastitanium"
type_to_spawn = /obj/item/stack/material/plastitanium
/obj/fiftyspawner/plastitanium_hull
name = "stack of plastitanium"
type_to_spawn = /obj/item/stack/material/plastitanium/hull
/obj/fiftyspawner/plastitanium_glass
name = "stack of plastitanium glass"
type_to_spawn = /obj/item/stack/material/glass/plastitanium

View File

@@ -30,7 +30,12 @@
new /datum/stack_recipe("wooden sandals", /obj/item/clothing/shoes/sandal, 1, pass_stack_color = TRUE, recycle_material = "[name]"),
new /datum/stack_recipe("wood circlet", /obj/item/clothing/head/woodcirclet, 1, pass_stack_color = TRUE, recycle_material = "[name]"),
new /datum/stack_recipe("clipboard", /obj/item/clipboard, 1, pass_stack_color = TRUE, recycle_material = "[name]"),
new /datum/stack_recipe("wood floor tile", /obj/item/stack/tile/wood, 1, 4, 20, pass_stack_color = TRUE, recycle_material = "[name]"),
new /datum/stack_recipe("wood floor tile", /obj/item/stack/tile/wood, 1, 4, 20, pass_stack_color = FALSE, recycle_material = "[name]"),
new /datum/stack_recipe("large wood floor tile", /obj/item/stack/tile/wood/panel, 1, 4, 20, pass_stack_color = FALSE, recycle_material = "[name]"),
new /datum/stack_recipe("parquet wood floor tile", /obj/item/stack/tile/wood/parquet, 1, 4, 20, pass_stack_color = FALSE, recycle_material = "[name]"),
new /datum/stack_recipe("tiled wood floor tile", /obj/item/stack/tile/wood/tile, 1, 4, 20, pass_stack_color = FALSE, recycle_material = "[name]"),
new /datum/stack_recipe("vertical wood floor tile", /obj/item/stack/tile/wood/vert, 1, 4, 20, pass_stack_color = FALSE, recycle_material = "[name]"),
new /datum/stack_recipe("vertical large wood floor tile", /obj/item/stack/tile/wood/vert_panel, 1, 4, 20, pass_stack_color = FALSE, recycle_material = "[name]"),
new /datum/stack_recipe("wooden chair", /obj/structure/bed/chair/wood, 3, time = 10, one_per_turf = 1, on_floor = 1, pass_stack_color = TRUE, recycle_material = "[name]"),
new /datum/stack_recipe("crossbow frame", /obj/item/crossbowframe, 5, time = 25, one_per_turf = 0, on_floor = 0, pass_stack_color = TRUE, recycle_material = "[name]"),
new /datum/stack_recipe("coffin", /obj/structure/closet/coffin, 5, time = 15, one_per_turf = 1, on_floor = 1, pass_stack_color = TRUE, recycle_material = "[name]"),
@@ -58,11 +63,31 @@
/datum/material/wood/sif/generate_recipes()
..()
recipes += new /datum/stack_recipe("alien wood floor tile", /obj/item/stack/tile/wood/sif, 1, 4, 20, pass_stack_color = TRUE)
recipes += new /datum/stack_recipe("alien wood floor tile", /obj/item/stack/tile/wood/sif, 1, 4, 20, pass_stack_color = FALSE)
recipes += new /datum/stack_recipe("large alien wood floor tile", /obj/item/stack/tile/wood/sif/panel, 1, 4, 20, pass_stack_color = FALSE)
recipes += new /datum/stack_recipe("alien wood parquet tile", /obj/item/stack/tile/wood/sif/parquet, 1, 4, 20, pass_stack_color = FALSE)
recipes += new /datum/stack_recipe("tiled alien wood floor tile", /obj/item/stack/tile/wood/sif/tile, 1, 4, 20, pass_stack_color = FALSE)
recipes += new /datum/stack_recipe("vertical alien wood floor tile", /obj/item/stack/tile/wood/sif/vert, 1, 4, 20, pass_stack_color = FALSE)
recipes += new /datum/stack_recipe("vertical large alien wood floor tile", /obj/item/stack/tile/wood/sif/vert_panel, 1, 4, 20, pass_stack_color = FALSE)
for(var/datum/stack_recipe/r_recipe in recipes)
if(r_recipe.title == "wood floor tile")
recipes -= r_recipe
continue
if(r_recipe.title == "large wood floor tile")
recipes -= r_recipe
continue
if(r_recipe.title == "parquet wood floor tile")
recipes -= r_recipe
continue
if(r_recipe.title == "tiled wood floor tile")
recipes -= r_recipe
continue
if(r_recipe.title == "vertical wood floor tile")
recipes -= r_recipe
continue
if(r_recipe.title == "vertical large wood floor tile")
recipes -= r_recipe
continue
if(r_recipe.title == "wooden chair")
recipes -= r_recipe
continue
@@ -80,11 +105,31 @@
/datum/material/wood/hardwood/generate_recipes()
..()
recipes += new /datum/stack_recipe("parquet wood floor tile", /obj/item/stack/tile/wood/parquet, 1, 4, 20, pass_stack_color = FALSE)
recipes += new /datum/stack_recipe("hardwood floor tile", /obj/item/stack/tile/wood/hardwood, 1, 4, 20, pass_stack_color = FALSE, recycle_material = "[name]")
recipes += new /datum/stack_recipe("large hardwood floor tile", /obj/item/stack/tile/wood/hardwood/panel, 1, 4, 20, pass_stack_color = FALSE, recycle_material = "[name]")
recipes += new /datum/stack_recipe("parquet hardwood floor tile", /obj/item/stack/tile/wood/hardwood/parquet, 1, 4, 20, pass_stack_color = FALSE, recycle_material = "[name]")
recipes += new /datum/stack_recipe("tiled hardwood floor tile", /obj/item/stack/tile/wood/hardwood/tile, 1, 4, 20, pass_stack_color = FALSE, recycle_material = "[name]")
recipes += new /datum/stack_recipe("vertical hardwood floor tile", /obj/item/stack/tile/wood/hardwood/vert, 1, 4, 20, pass_stack_color = FALSE)
recipes += new /datum/stack_recipe("vertical large hardwood floor tile", /obj/item/stack/tile/wood/hardwood/vert_panel, 1, 4, 20, pass_stack_color = FALSE)
for(var/datum/stack_recipe/r_recipe in recipes)
if(r_recipe.title == "wood floor tile")
recipes -= r_recipe
continue
if(r_recipe.title == "large wood floor tile")
recipes -= r_recipe
continue
if(r_recipe.title == "parquet wood floor tile")
recipes -= r_recipe
continue
if(r_recipe.title == "tiled wood floor tile")
recipes -= r_recipe
continue
if(r_recipe.title == "vertical wood floor tile")
recipes -= r_recipe
continue
if(r_recipe.title == "vertical large wood floor tile")
recipes -= r_recipe
continue
if(r_recipe.title == "wooden chair")
recipes -= r_recipe
continue
@@ -121,7 +166,6 @@
icon_colour = "#6f432a"
stack_type = /obj/item/stack/material/log/hard
//VOREStation Addition Start
/datum/material/wood/stick
name = "wooden stick"
icon_colour = "#824B28"
@@ -136,4 +180,224 @@
/datum/material/wood/stick/generate_recipes()
return
//VOREStation Addition End
/datum/material/wood/birch
name = MAT_BIRCHWOOD
stack_type = /obj/item/stack/material/wood/birch
icon_colour = "#f6dec0"
icon_base = "wood"
icon_reinf = "reinf_stone"
integrity = 65
hardness = 20
weight = 20
/datum/material/wood/birch/generate_recipes()
..()
recipes += new /datum/stack_recipe("birch floor tile", /obj/item/stack/tile/wood/birch, 1, 4, 20, pass_stack_color = FALSE, recycle_material = "[name]")
recipes += new /datum/stack_recipe("large birch floor tile", /obj/item/stack/tile/wood/birch/panel, 1, 4, 20, pass_stack_color = FALSE, recycle_material = "[name]")
recipes += new /datum/stack_recipe("parquet birch floor tile", /obj/item/stack/tile/wood/birch/parquet, 1, 4, 20, pass_stack_color = FALSE, recycle_material = "[name]")
recipes += new /datum/stack_recipe("tiled birch floor tile", /obj/item/stack/tile/wood/birch/tile, 1, 4, 20, pass_stack_color = FALSE, recycle_material = "[name]")
recipes += new /datum/stack_recipe("vertical birch floor tile", /obj/item/stack/tile/wood/birch/vert, 1, 4, 20, pass_stack_color = FALSE)
recipes += new /datum/stack_recipe("vertical large birch floor tile", /obj/item/stack/tile/wood/birch/vert_panel, 1, 4, 20, pass_stack_color = FALSE)
for(var/datum/stack_recipe/r_recipe in recipes)
if(r_recipe.title == "wood floor tile")
recipes -= r_recipe
continue
if(r_recipe.title == "large wood floor tile")
recipes -= r_recipe
continue
if(r_recipe.title == "parquet wood floor tile")
recipes -= r_recipe
continue
if(r_recipe.title == "tiled wood floor tile")
recipes -= r_recipe
continue
if(r_recipe.title == "vertical wood floor tile")
recipes -= r_recipe
continue
if(r_recipe.title == "vertical large wood floor tile")
recipes -= r_recipe
continue
if(r_recipe.title == "wooden chair")
recipes -= r_recipe
continue
if(r_recipe.title == "wooden standup figure")
recipes -= r_recipe
continue
/datum/material/wood/pine
name = MAT_PINEWOOD
stack_type = /obj/item/stack/material/wood/pine
icon_colour = "#cd9d6f"
icon_base = "wood"
icon_reinf = "reinf_stone"
integrity = 65
hardness = 20
weight = 20
/datum/material/wood/pine/generate_recipes()
..()
recipes += new /datum/stack_recipe("pine floor tile", /obj/item/stack/tile/wood/pine, 1, 4, 20, pass_stack_color = FALSE, recycle_material = "[name]")
recipes += new /datum/stack_recipe("large pine floor tile", /obj/item/stack/tile/wood/pine/panel, 1, 4, 20, pass_stack_color = FALSE, recycle_material = "[name]")
recipes += new /datum/stack_recipe("parquet pine floor tile", /obj/item/stack/tile/wood/pine/parquet, 1, 4, 20, pass_stack_color = FALSE, recycle_material = "[name]")
recipes += new /datum/stack_recipe("tiled pine floor tile", /obj/item/stack/tile/wood/pine/tile, 1, 4, 20, pass_stack_color = FALSE, recycle_material = "[name]")
recipes += new /datum/stack_recipe("vertical pine floor tile", /obj/item/stack/tile/wood/pine/vert, 1, 4, 20, pass_stack_color = FALSE)
recipes += new /datum/stack_recipe("vertical large pine floor tile", /obj/item/stack/tile/wood/pine/vert_panel, 1, 4, 20, pass_stack_color = FALSE)
for(var/datum/stack_recipe/r_recipe in recipes)
if(r_recipe.title == "wood floor tile")
recipes -= r_recipe
continue
if(r_recipe.title == "large wood floor tile")
recipes -= r_recipe
continue
if(r_recipe.title == "parquet wood floor tile")
recipes -= r_recipe
continue
if(r_recipe.title == "tiled wood floor tile")
recipes -= r_recipe
continue
if(r_recipe.title == "vertical wood floor tile")
recipes -= r_recipe
continue
if(r_recipe.title == "vertical large wood floor tile")
recipes -= r_recipe
continue
if(r_recipe.title == "wooden chair")
recipes -= r_recipe
continue
if(r_recipe.title == "wooden standup figure")
recipes -= r_recipe
continue
/datum/material/wood/oak
name = MAT_OAKWOOD
stack_type = /obj/item/stack/material/wood/oak
icon_colour = "#674928"
icon_base = "wood"
icon_reinf = "reinf_stone"
integrity = 65
hardness = 20
weight = 20
/datum/material/wood/oak/generate_recipes()
..()
recipes += new /datum/stack_recipe("oak floor tile", /obj/item/stack/tile/wood/oak, 1, 4, 20, pass_stack_color = FALSE, recycle_material = "[name]")
recipes += new /datum/stack_recipe("large oak floor tile", /obj/item/stack/tile/wood/oak/panel, 1, 4, 20, pass_stack_color = FALSE, recycle_material = "[name]")
recipes += new /datum/stack_recipe("parquet oak floor tile", /obj/item/stack/tile/wood/oak/parquet, 1, 4, 20, pass_stack_color = FALSE, recycle_material = "[name]")
recipes += new /datum/stack_recipe("tiled oak floor tile", /obj/item/stack/tile/wood/oak/tile, 1, 4, 20, pass_stack_color = FALSE, recycle_material = "[name]")
recipes += new /datum/stack_recipe("vertical oak floor tile", /obj/item/stack/tile/wood/oak/vert, 1, 4, 20, pass_stack_color = FALSE)
recipes += new /datum/stack_recipe("vertical large oak floor tile", /obj/item/stack/tile/wood/oak/vert_panel, 1, 4, 20, pass_stack_color = FALSE)
for(var/datum/stack_recipe/r_recipe in recipes)
if(r_recipe.title == "wood floor tile")
recipes -= r_recipe
continue
if(r_recipe.title == "large wood floor tile")
recipes -= r_recipe
continue
if(r_recipe.title == "parquet wood floor tile")
recipes -= r_recipe
continue
if(r_recipe.title == "tiled wood floor tile")
recipes -= r_recipe
continue
if(r_recipe.title == "vertical wood floor tile")
recipes -= r_recipe
continue
if(r_recipe.title == "vertical large wood floor tile")
recipes -= r_recipe
continue
if(r_recipe.title == "wooden chair")
recipes -= r_recipe
continue
if(r_recipe.title == "wooden standup figure")
recipes -= r_recipe
continue
/datum/material/wood/acacia
name = MAT_ACACIAWOOD
stack_type = /obj/item/stack/material/wood/acacia
icon_colour = "#b75e12"
icon_base = "wood"
icon_reinf = "reinf_stone"
integrity = 65
hardness = 20
weight = 20
/datum/material/wood/acacia/generate_recipes()
..()
recipes += new /datum/stack_recipe("acacia floor tile", /obj/item/stack/tile/wood/acacia, 1, 4, 20, pass_stack_color = FALSE, recycle_material = "[name]")
recipes += new /datum/stack_recipe("large acacia floor tile", /obj/item/stack/tile/wood/acacia/panel, 1, 4, 20, pass_stack_color = FALSE, recycle_material = "[name]")
recipes += new /datum/stack_recipe("parquet acacia floor tile", /obj/item/stack/tile/wood/acacia/parquet, 1, 4, 20, pass_stack_color = FALSE, recycle_material = "[name]")
recipes += new /datum/stack_recipe("tiled acacia floor tile", /obj/item/stack/tile/wood/acacia/tile, 1, 4, 20, pass_stack_color = FALSE, recycle_material = "[name]")
recipes += new /datum/stack_recipe("vertical acacia floor tile", /obj/item/stack/tile/wood/acacia/vert, 1, 4, 20, pass_stack_color = FALSE)
recipes += new /datum/stack_recipe("vertical large acacia floor tile", /obj/item/stack/tile/wood/acacia/vert_panel, 1, 4, 20, pass_stack_color = FALSE)
for(var/datum/stack_recipe/r_recipe in recipes)
if(r_recipe.title == "wood floor tile")
recipes -= r_recipe
continue
if(r_recipe.title == "large wood floor tile")
recipes -= r_recipe
continue
if(r_recipe.title == "parquet wood floor tile")
recipes -= r_recipe
continue
if(r_recipe.title == "tiled wood floor tile")
recipes -= r_recipe
continue
if(r_recipe.title == "vertical wood floor tile")
recipes -= r_recipe
continue
if(r_recipe.title == "vertical large wood floor tile")
recipes -= r_recipe
continue
if(r_recipe.title == "wooden chair")
recipes -= r_recipe
continue
if(r_recipe.title == "wooden standup figure")
recipes -= r_recipe
continue
/datum/material/wood/redwood
name = MAT_REDWOOD
stack_type = /obj/item/stack/material/wood/redwood
icon_colour = "#a45a52"
icon_base = "wood"
table_icon_base = "stone"
icon_reinf = "reinf_stone"
integrity = 65
hardness = 20
weight = 20
/datum/material/wood/redwood/generate_recipes()
..()
recipes += new /datum/stack_recipe("redwood floor tile", /obj/item/stack/tile/wood/redwood, 1, 4, 20, pass_stack_color = FALSE, recycle_material = "[name]")
recipes += new /datum/stack_recipe("large redwood floor tile", /obj/item/stack/tile/wood/redwood/panel, 1, 4, 20, pass_stack_color = FALSE, recycle_material = "[name]")
recipes += new /datum/stack_recipe("parquet redwood floor tile", /obj/item/stack/tile/wood/redwood/parquet, 1, 4, 20, pass_stack_color = FALSE, recycle_material = "[name]")
recipes += new /datum/stack_recipe("tiled redwood floor tile", /obj/item/stack/tile/wood/redwood/tile, 1, 4, 20, pass_stack_color = FALSE, recycle_material = "[name]")
recipes += new /datum/stack_recipe("vertical redwood floor tile", /obj/item/stack/tile/wood/redwood/vert, 1, 4, 20, pass_stack_color = FALSE)
recipes += new /datum/stack_recipe("vertical large redwood floor tile", /obj/item/stack/tile/wood/redwood/vert_panel, 1, 4, 20, pass_stack_color = FALSE)
for(var/datum/stack_recipe/r_recipe in recipes)
if(r_recipe.title == "wood floor tile")
recipes -= r_recipe
continue
if(r_recipe.title == "large wood floor tile")
recipes -= r_recipe
continue
if(r_recipe.title == "parquet wood floor tile")
recipes -= r_recipe
continue
if(r_recipe.title == "tiled wood floor tile")
recipes -= r_recipe
continue
if(r_recipe.title == "vertical wood floor tile")
recipes -= r_recipe
continue
if(r_recipe.title == "vertical large wood floor tile")
recipes -= r_recipe
continue
if(r_recipe.title == "wooden chair")
recipes -= r_recipe
continue
if(r_recipe.title == "wooden standup figure")
recipes -= r_recipe
continue

View File

@@ -1,5 +1,5 @@
/obj/item/stack/material/wood
name = "wooden plank"
name = MAT_WOOD + " plank"
icon_state = "sheet-wood"
default_type = MAT_WOOD
strict_color_stacking = TRUE
@@ -9,16 +9,46 @@
no_variants = FALSE
/obj/item/stack/material/wood/sif
name = "alien wooden plank"
name = MAT_SIFWOOD + " plank"
color = "#0099cc"
default_type = MAT_SIFWOOD
/obj/item/stack/material/wood/hard
name = "hardwood plank"
name = MAT_HARDWOOD + " plank"
color = "#42291a"
default_type = MAT_HARDWOOD
description_info = "Rich, lustrous hardwood, imported from offworld at moderate expense. Mostly used for luxurious furniture, and not very good for weapons or other structures."
/obj/item/stack/material/wood/birch
name = MAT_BIRCHWOOD + " plank"
color = "#f6dec0"
default_type = MAT_BIRCHWOOD
description_info = "Sturdy hardwood, birch makes for beautiful furniture but also has many secondary applications. It's also an exceptionally good choice for firewood."
/obj/item/stack/material/wood/pine
name = MAT_PINEWOOD + " plank"
color = "#cd9d6f"
default_type = MAT_PINEWOOD
description_info = "Planks from tall, fast-growing coniferous pine trees, dense and mostly used for construction or furnishings."
/obj/item/stack/material/wood/oak
name = MAT_OAKWOOD + " plank"
color = "#674928"
default_type = MAT_OAKWOOD
description_info = "A sturdy, fairly common hardwood. A good choice for furnishings and structures. Oak barrels can be used to age alcohol, whilst oakwood chips are often used for smoking meats and cheeses."
/obj/item/stack/material/wood/acacia
name = MAT_ACACIAWOOD + " plank"
color = "#b75e12"
default_type = MAT_ACACIAWOOD
description_info = "Vibrant reddish-orange acacia makes a striking statement wherever it's used, and the bark of some acacia species is useful for tanning leather."
/obj/item/stack/material/wood/redwood
name = MAT_REDWOOD + " plank"
color = "#a45a52"
default_type = MAT_REDWOOD
description_info = "Blazing orange-red redwood planks. The trees used to make this can grow for centuries, and are often protected. This wood has been sustainably harvested from special tree nurseries, rather than chopping down ancient giants."
/obj/item/stack/material/log
name = MAT_LOG
icon_state = "sheet-log"

View File

@@ -79,7 +79,6 @@
outgoing_melee_damage_percent = 0.9 // 10% less melee damage.
disable_duration_percent = 1.25 // Stuns last 25% longer.
incoming_healing_percent = 0.9 // -10% to all healing
slowdown = 0.5 // Slower, by a smidge.
evasion = -5 // 5% easier to hit.
accuracy_dispersion = 1 // Inaccurate trait level of tile dispersion.
@@ -93,16 +92,6 @@
return ..()
/datum/modifier/franken_sickness/tick()
if(holder.stat != DEAD)
if(ishuman(holder))
var/mob/living/carbon/human/F = holder
if(F.can_defib)
F.can_defib = 0
/datum/modifier/franken_sickness/on_expire() //Not permanent, but its child is.
holder.add_modifier(/datum/modifier/franken_recovery, 0)
/datum/modifier/franken_recovery //When Franken_Sickness expires, this will be permanently applied in its place.
name = "neural recovery"
desc = "You feel out of touch, as your central nervous system is still recovering from being repaired."

View File

@@ -1216,7 +1216,7 @@
if(src.pulse)
to_chat(usr, span_notice("[self ? "You have a" : "[src] has a"] pulse! Counting..."))
else
to_chat(usr, span_danger("[src] has no pulse!")) //it is REALLY UNLIKELY that a dead person would check his own pulse
to_chat(usr, span_danger("[src] has no pulse!"))
return
to_chat(usr, span_filter_notice("You must[self ? "" : " both"] remain still until counting is finished."))

View File

@@ -75,13 +75,13 @@
has_organ = list(
O_HEART = /obj/item/organ/internal/heart/vox,
O_LUNGS = /obj/item/organ/internal/lungs/vox,
O_VOICE = /obj/item/organ/internal/voicebox,
O_LIVER = /obj/item/organ/internal/liver/vox,
O_KIDNEYS = /obj/item/organ/internal/kidneys/vox,
O_BRAIN = /obj/item/organ/internal/brain/vox,
O_EYES = /obj/item/organ/internal/eyes,
O_HEART = /obj/item/organ/internal/heart/vox,
O_LUNGS = /obj/item/organ/internal/lungs/vox,
O_VOICE = /obj/item/organ/internal/voicebox/vox,
O_LIVER = /obj/item/organ/internal/liver/vox,
O_KIDNEYS = /obj/item/organ/internal/kidneys/vox,
O_BRAIN = /obj/item/organ/internal/brain/vox,
O_EYES = /obj/item/organ/internal/eyes,
)
genders = list(NEUTER)

View File

@@ -205,7 +205,7 @@
cost = -1 //CHOMPEdit - Keep original value
can_take = ORGANICS
is_genetrait = TRUE
is_genetrait = FALSE
hidden = FALSE
activity_bounds = DNA_HARDER_BOUNDS // Shouldn't be easy for genetics to find this

View File

@@ -32,6 +32,8 @@
feeding = client.prefs_vr.feeding
can_be_drop_prey = client.prefs_vr.can_be_drop_prey
can_be_drop_pred = client.prefs_vr.can_be_drop_pred
can_be_afk_prey = client.prefs_vr.can_be_afk_prey
can_be_afk_pred = client.prefs_vr.can_be_afk_pred
throw_vore = client.prefs_vr.throw_vore
food_vore = client.prefs_vr.food_vore
consume_liquid_belly = client.prefs_vr.consume_liquid_belly
@@ -65,6 +67,7 @@
autotransferable = client.prefs_vr.autotransferable
noisy_full = client.prefs_vr.noisy_full
strip_pref = client.prefs_vr.strip_pref
contaminate_pref = client.prefs_vr.contaminate_pref
vore_sprite_color = client.prefs_vr.vore_sprite_color
vore_sprite_multiply = client.prefs_vr.vore_sprite_multiply
no_latejoin_vore_warning = client.prefs_vr.no_latejoin_vore_warning

View File

@@ -470,6 +470,8 @@ It's fairly easy to fix if dealing with single letters but not so much with comp
if(subject && subject.forbid_seeing_deadchat && !check_rights_for(subject.client, R_HOLDER))
return // Can't talk in deadchat if you can't see it.
if(ismob(subject))
SEND_GLOBAL_SIGNAL(COMSIG_GLOB_DEAD_SAY, subject, message)
for(var/mob/M in GLOB.player_list)
if(M.client && ((!isnewplayer(M) && M.stat == DEAD) || (check_rights_for(M.client, R_HOLDER) && M.client?.prefs?.read_preference(/datum/preference/toggle/holder/show_staff_dsay))) && M.client?.prefs?.read_preference(/datum/preference/toggle/show_dsay))

View File

@@ -1204,6 +1204,22 @@
do_colouration = 1
color_blend_mode = ICON_MULTIPLY
/datum/sprite_accessory/ears/swepthornstricorn
name = "Horns, swept back, Tricorn"
desc = ""
icon_state = "swept_horns_tricorn"
do_colouration = 1
color_blend_mode = ICON_MULTIPLY
/datum/sprite_accessory/ears/fourlowears
name = "Four Horizontal Ears with Frills"
desc = ""
icon_state = "fourlowears"
extra_overlay = "fourlowears_inner"
extra_overlay2 = "fourlowears_frills"
do_colouration = 1
color_blend_mode = ICON_MULTIPLY
//Dino frills
/datum/sprite_accessory/ears/dino_frills
name = "triceratops frills"

View File

@@ -2852,6 +2852,18 @@ includes scars and tattoos
color_blend_mode = ICON_MULTIPLY
body_parts = list(BP_HEAD)
/datum/sprite_accessory/marking/sharpsnout
name = "Sharp Snout"
icon_state = "sharpsnout"
color_blend_mode = ICON_MULTIPLY
body_parts = list(BP_HEAD)
/datum/sprite_accessory/marking/sharpsnoutlower
name = "Sharp Snout(lower)"
icon_state = "lowersharpsnout"
color_blend_mode = ICON_MULTIPLY
body_parts = list(BP_HEAD)
/datum/sprite_accessory/marking/longsnout
name = "Long, Sharp Snout"
icon_state = "longsharpsnout"
@@ -2876,6 +2888,36 @@ includes scars and tattoos
color_blend_mode = ICON_MULTIPLY
body_parts = list(BP_HEAD)
/datum/sprite_accessory/marking/snouttop
name = "Top of Snout"
icon_state = "topofsnout"
color_blend_mode = ICON_MULTIPLY
body_parts = list(BP_HEAD)
/datum/sprite_accessory/marking/nosering
name = "Snout Ring (Use with Sharp Snout)"
icon_state = "nosering"
color_blend_mode = ICON_MULTIPLY
body_parts = list(BP_HEAD)
/datum/sprite_accessory/marking/bigsoftbelly
name = "Big Soft Belly"
icon_state = "bigsoftbelly"
color_blend_mode = ICON_MULTIPLY
body_parts = list(BP_TORSO,BP_GROIN)
/datum/sprite_accessory/marking/fluffruff
name = "Fluffy Neck Ruff"
icon_state = "fluffruff"
color_blend_mode = ICON_MULTIPLY
body_parts = list(BP_TORSO)
/datum/sprite_accessory/marking/gauntlets
name = "Clawed Gauntlets"
icon_state = "gauntlets"
color_blend_mode = ICON_MULTIPLY
body_parts = list(BP_L_ARM,BP_R_ARM,BP_L_HAND,BP_R_HAND)
/datum/sprite_accessory/marking/boneplates
name = "Bony Leg Plates"
icon_state = "bonyplatesplantigrade"

View File

@@ -1685,6 +1685,28 @@
name = "Anteater tail"
icon_state = "anteater_tail"
/datum/sprite_accessory/tail/longtail/brush
name = "Snake Tail with Brush"
icon_state = "bigsnaketailbrush"
extra_overlay = "bigsnaketailbrush_brush"
/datum/sprite_accessory/tail/longtail/brushscutes
name = "Snake Tail with Brush and Scutes"
icon_state = "bigsnaketailbrushunder"
extra_overlay = "bigsnaketailbrushunder_scutes"
extra_overlay2 = "bigsnaketailbrush_brush"
/datum/sprite_accessory/tail/longtail/clawscutes
name = "Snake Tail with Claw and Scutes"
icon_state = "bigsnaketailbrushunder"
extra_overlay = "bigsnaketailbrushunder_scutes"
extra_overlay2 = "bigsnaketailclaw_claw"
/datum/sprite_accessory/tail/longtail/claw
name = "Snake Tail with Claw"
icon_state = "bigsnaketailbrush"
extra_overlay = "bigsnaketailclaw_claw"
/datum/sprite_accessory/tail/small_bugbum
name = "Bug Abdomen, Alt, Small (Dual-Color)"

View File

@@ -1436,3 +1436,11 @@
name = "Tree Roots (Oak)"
icon_state = "tree_oak_roots"
can_ride = 0
/datum/sprite_accessory/tail/longtail/scug // Wawa
name = "Catslug Tail"
icon_state = "scug"
/datum/sprite_accessory/tail/longtail/scug/dots
name = "Catslug Tail Dotted"
extra_overlay = "scug_markings"

View File

@@ -468,6 +468,14 @@
color_blend_mode = ICON_MULTIPLY
extra_overlay = "cloakmoth_eyes"
/datum/sprite_accessory/wing/cybertendrils
name = "Cyber Tendrils"
desc = ""
icon_state = "cybertendrils"
do_colouration = 1
color_blend_mode = ICON_MULTIPLY
extra_overlay = "cybertendrils_plugs"
/datum/sprite_accessory/wing/jet_wing
name = "Aeromorph Jet Wings (Colorable)"
desc = ""

View File

@@ -186,20 +186,23 @@ BLOOD_VOLUME_SURVIVE = 40
///Second, we process internal bleeding.
for(var/datum/wound/internal_bleeding/W in temp.wounds)
blood_loss_divisor = blood_loss_divisor+10 //IB is slower bloodloss than normal.
var/bicardose = reagents.get_reagent_amount(REAGENT_ID_BICARIDINE)
var/inaprovaline = reagents.get_reagent_amount(REAGENT_ID_INAPROVALINE)
var/bicardose
if(reagents.get_reagent_amount(REAGENT_ID_BICARIDINE) || reagents.get_reagent_amount(REAGENT_ID_BICARIDAZE))
bicardose = TRUE
var/inaprovaline
if(reagents.get_reagent_amount(REAGENT_ID_INAPROVALINE) || reagents.get_reagent_amount(REAGENT_ID_INAPROVALAZE))
inaprovaline = TRUE
var/myeldose = reagents.get_reagent_amount(REAGENT_ID_MYELAMINE)
if(!(W.can_autoheal() || (bicardose && inaprovaline) || myeldose)) //bicaridine and inaprovaline stop internal wounds from growing bigger with time, unless it is so small that it is already healing
W.open_wound(0.1)
if(prob(1))
custom_pain("You feel a stabbing pain in your [temp.name]!", 50)
if(CE_STABLE in chem_effects)
if((CE_STABLE in chem_effects) || myeldose)
blood_loss_divisor = max(blood_loss_divisor + 30, 1) //Inaprovaline is great on internal wounds.
if(temp.applied_pressure) //Putting pressure on the afflicted wound helps stop the arterial bleeding.
if(ishuman(temp.applied_pressure))
var/mob/living/carbon/human/H = temp.applied_pressure
H.bloody_hands(src, 0)
blood_loss_divisor += 30 //If you're putting pressure on that limb due to there being an external bleed there, you apply some pressure to the internal bleed as well.
blood_loss_divisor += 30
if(W.clamped)
blood_loss_divisor = blood_loss_divisor * 10 //We hemostatted the internal bleeding. Bloodloss is 10 times slower.
remove_blood(W.damage/blood_loss_divisor) //line should possibly be moved to handle_blood, so all the bleeding stuff is in one place. //Hi. 2025 here. Just did that. ~Diana
///Thirdly, we check to see if the limb is bleeding EXTERNALLY

View File

@@ -6,7 +6,7 @@ GLOBAL_LIST_BOILERPLATE(all_brain_organs, /obj/item/organ/internal/brain)
desc = "A piece of juicy meat found in a person's head."
organ_tag = O_BRAIN
parent_organ = BP_HEAD
vital = 1
vital = TRUE
icon_state = "brain2"
force = 1.0
w_class = ITEMSIZE_SMALL
@@ -177,7 +177,6 @@ GLOBAL_LIST_BOILERPLATE(all_brain_organs, /obj/item/organ/internal/brain)
parent_organ = BP_HEAD
icon = 'icons/mob/alien.dmi'
icon_state = "chitin"
vital = 1
can_assist = FALSE
/obj/item/organ/internal/brain/xeno

View File

@@ -48,14 +48,7 @@
parent_organ = BP_HEAD
icon_state = "brain_prosthetic"
organ_tag = "stack"
vital = 1
var/backup_time = 0
var/datum/mind/backup
/obj/item/organ/internal/stack/process()
if(owner && owner.stat != DEAD && !is_broken())
backup_time = world.time
if(owner.mind) backup = owner.mind
vital = TRUE
/obj/item/organ/internal/stack/vox/stack
name = "vox cortical stack"

View File

@@ -140,7 +140,7 @@ var/list/organ_cache = list()
STOP_PROCESSING(SSobj, src)
handle_organ_mod_special(TRUE)
if(owner && vital)
owner.can_defib = 0
owner.can_defib = FALSE
owner.death()
/obj/item/organ/proc/adjust_germ_level(var/amount) // Unless you're setting germ level directly to 0, use this proc instead

View File

@@ -736,13 +736,15 @@ Note that amputating the affected organ does in fact remove the infection from t
handle_germ_effects()
/obj/item/organ/external/proc/handle_germ_sync()
if(owner && isbelly(owner.loc)) //If we're in a belly, just skip infection spreading. This leads to extended vore scenes killing via infection.
return
var/antibiotics = owner.chem_effects[CE_ANTIBIOTIC]
for(var/datum/wound/W in wounds)
//Open wounds can become infected
if (owner.germ_level > W.germ_level && W.infection_check())
if(owner.germ_level > W.germ_level && W.infection_check())
W.germ_level++
if (antibiotics < ANTIBIO_NORM)
if(!antibiotics)
for(var/datum/wound/W in wounds)
//Infected wounds raise the organ's germ level
if (W.germ_level > germ_level)

View File

@@ -32,8 +32,8 @@
min_broken_damage = 50
w_class = ITEMSIZE_HUGE
body_part = UPPER_TORSO
vital = 1
cannot_amputate = 1
vital = TRUE
cannot_amputate = TRUE
parent_organ = null
gendered_icon = 1
@@ -242,5 +242,5 @@
amputation_point = "branch"
joint = "structural ligament"
dislocated = -1
vital = 0
vital = FALSE
slot_flags = SLOT_BELT

View File

@@ -4,7 +4,7 @@
icon_state = "scell"
organ_tag = O_CELL
parent_organ = BP_TORSO
vital = 1
vital = TRUE
var/defib_timer = 1 // This sits in the brain organ slot, but is not a brain.
/obj/item/organ/internal/cell/Initialize(mapload, internal)
@@ -34,7 +34,7 @@
name = "brain interface"
organ_tag = O_BRAIN
parent_organ = BP_HEAD
vital = 1
vital = TRUE
var/brain_type = /obj/item/mmi
var/obj/item/mmi/stored_mmi
robotic = ORGAN_ASSISTED

View File

@@ -51,10 +51,10 @@
/obj/item/organ/external/head/unbreakable/slime //They don't need this anymore.
nonsolid = 1
cannot_gib = 0
vital = 0
cannot_gib = FALSE
vital = FALSE
max_damage = 45 //ChompEdit matching our changes to broken bones for less squishy people.
encased = 0
encased = FALSE
spread_dam = 1
/*

View File

@@ -12,7 +12,7 @@
min_broken_damage = 60 // CHOMPEdit: Increase all min_broken_damage (Ribs should take more force to break)
w_class = ITEMSIZE_HUGE
body_part = UPPER_TORSO
vital = 1
vital = TRUE
amputation_point = "spine"
joint = "neck"
dislocated = -1
@@ -62,7 +62,7 @@
min_broken_damage = 50 // CHOMPEdit: Increase all min_broken_damage
w_class = ITEMSIZE_LARGE
body_part = LOWER_TORSO
vital = 1
vital = TRUE
parent_organ = BP_TORSO
amputation_point = "lumbar"
joint = "hip"
@@ -275,7 +275,7 @@
min_broken_damage = 50 // CHOMPEdit: Increase all min_broken_damage
w_class = ITEMSIZE_NORMAL
body_part = HEAD
vital = 1
vital = TRUE
parent_organ = BP_TORSO
joint = "jaw"
amputation_point = "neck"

View File

@@ -26,5 +26,9 @@
parent_organ = BP_TORSO
color = "#0033cc"
/obj/item/organ/internal/voicebox/vox
color = "#3c5b7b"
will_assist_languages = list(LANGUAGE_VOX) //Fixes them from knowing galcommon off the rip.
/obj/item/organ/external/groin/vox //vox have an extended ribcage for extra protection.
encased = "lower ribcage"

View File

@@ -114,7 +114,7 @@
update_icon()
/obj/machinery/reagent_refinery/filter/handle_transfer(var/atom/origin_machine, var/datum/reagents/RT, var/source_forward_dir, var/transfer_rate, var/filter_id = "")
// pumps, furnaces and filters can only be FED in a straight line
// pumps, furnaces, splitters and filters can only be FED in a straight line
if(source_forward_dir != dir)
return 0
. = ..(origin_machine, RT, source_forward_dir, transfer_rate, filter_id)

View File

@@ -193,7 +193,7 @@
update_icon()
/obj/machinery/reagent_refinery/furnace/handle_transfer(var/atom/origin_machine, var/datum/reagents/RT, var/source_forward_dir, var/transfer_rate, var/filter_id = "")
// pumps, furnaces and filters can only be FED in a straight line
// pumps, furnaces, splitters and filters can only be FED in a straight line
if(source_forward_dir != dir)
return 0
. = ..(origin_machine, RT, source_forward_dir, transfer_rate, filter_id)

View File

@@ -41,7 +41,10 @@
var/obj/machinery/other = locate(/obj/machinery/reagent_refinery) in T
var/intake = FALSE
if(other && other.anchored)// Waste processors do not connect to anything as outgoing
if(!istype(other,/obj/machinery/reagent_refinery/waste_processor))
if(istype(other,/obj/machinery/reagent_refinery/splitter))
if(GLOB.reverse_dir[dir] in list(turn(other.dir,90),turn(other.dir,-90)))
intake = TRUE
else if(!istype(other,/obj/machinery/reagent_refinery/waste_processor))
// weird handling for side connections... Otherwise, anything pointing into use gets connected back!
if(istype(other,/obj/machinery/reagent_refinery/filter))
var/obj/machinery/reagent_refinery/filter/filt = other

View File

@@ -99,7 +99,7 @@
return 0
if(active_power_usage > 0 && !can_use_power_oneoff(active_power_usage))
return 0
if(!istype(target,/obj/machinery/reagent_refinery)) // cannot transfer into grinders anyway, so it's fine to do it this way.
if(!istype(target,/obj/machinery/reagent_refinery) || istype(target,/obj/machinery/reagent_refinery/grinder)) // Grinders don't allow input
return 0
var/transfered = target.handle_transfer(src,RT,source_forward_dir, amount_per_transfer_from_this, filter_id)
if(transfered > 0 && active_power_usage > 0)
@@ -153,3 +153,40 @@
// No power needed
if(flags & REFINERY_TUTORIAL_NOPOWER)
examine_list += "Does not require power. "
/// Checks neighbouring machines for if we should connect visually to them
/obj/machinery/reagent_refinery/proc/update_input_connection_overlays(overlay_state)
for(var/direction in GLOB.cardinal)
var/turf/T = get_step(get_turf(src),direction)
var/obj/machinery/reagent_refinery/other = locate() in T
if(!other?.anchored)
continue
// Waste processors do not connect to anything as outgoing
if(istype(other,/obj/machinery/reagent_refinery/waste_processor))
continue
// Filter allows side connection
if(istype(other,/obj/machinery/reagent_refinery/filter))
var/obj/machinery/reagent_refinery/filter/filt = other
var/check_dir = 0
if(filt.get_filter_side() == 1)
check_dir = turn(filt.dir, 270)
else
check_dir = turn(filt.dir, 90)
if(check_dir == GLOB.reverse_dir[direction])
var/image/intake = image(icon, icon_state = overlay_state, dir = direction)
add_overlay(intake)
continue
// Splitter only allows side connections
if(istype(other,/obj/machinery/reagent_refinery/splitter))
if(GLOB.reverse_dir[direction] in list(turn(other.dir,90),turn(other.dir,-90)))
var/image/intake = image(icon, icon_state = overlay_state, dir = direction)
add_overlay(intake)
continue
// Standard connection
if(other.dir == GLOB.reverse_dir[direction] && (dir != direction || istype(src,/obj/machinery/reagent_refinery/waste_processor)))
var/image/intake = image(icon, icon_state = overlay_state, dir = direction)
add_overlay(intake)

View File

@@ -72,28 +72,7 @@
if(!(stat & (NOPOWER|BROKEN)))
var/image/dot = image(icon, icon_state = "mixer_dot_[ got_input ? "on" : "off" ]")
add_overlay(dot)
for(var/direction in GLOB.cardinal)
var/turf/T = get_step(get_turf(src),direction)
var/obj/machinery/other = locate(/obj/machinery/reagent_refinery) in T
if(other && other.anchored)
// Waste processors do not connect to anything as outgoing
if(istype(other,/obj/machinery/reagent_refinery/waste_processor))
continue
// weird handling for side connections... Otherwise, anything pointing into use gets connected back!
if(istype(other,/obj/machinery/reagent_refinery/filter))
var/obj/machinery/reagent_refinery/filter/filt = other
var/check_dir = 0
if(filt.get_filter_side() == 1)
check_dir = turn(filt.dir, 270)
else
check_dir = turn(filt.dir, 90)
if(check_dir == GLOB.reverse_dir[direction] && dir != direction)
var/image/intake = image(icon, icon_state = "mixer_intakes", dir = direction)
add_overlay(intake)
continue
if(other.dir == GLOB.reverse_dir[direction] && dir != direction)
var/image/intake = image(icon, icon_state = "mixer_intakes", dir = direction)
add_overlay(intake)
update_input_connection_overlays("mixer_intakes")
// Get mixer overlay
var/image/arm = image(icon, icon_state = "mixer_arm", dir = angle2dir(mixer_angle))
add_overlay(arm)

View File

@@ -1,6 +1,6 @@
/obj/machinery/reagent_refinery/pipe
name = "Industrial Chemical Pipe"
desc = "A large pipe made for transporting industrial chemicals. It has a low-power passive pump. The red marks show where the flow is coming from. Does not require power."
desc = "A large pipe made for transporting industrial chemicals."
icon_state = "pipe"
density = TRUE
anchored = TRUE
@@ -32,28 +32,7 @@
/obj/machinery/reagent_refinery/pipe/update_icon()
cut_overlays()
if(anchored)
for(var/direction in GLOB.cardinal)
var/turf/T = get_step(get_turf(src),direction)
var/obj/machinery/other = locate(/obj/machinery/reagent_refinery) in T
if(other && other.anchored)
// Waste processors do not connect to anything as outgoing
if(istype(other,/obj/machinery/reagent_refinery/waste_processor))
continue
// weird handling for side connections... Otherwise, anything pointing into use gets connected back!
if(istype(other,/obj/machinery/reagent_refinery/filter))
var/obj/machinery/reagent_refinery/filter/filt = other
var/check_dir = 0
if(filt.get_filter_side() == 1)
check_dir = turn(filt.dir, 270)
else
check_dir = turn(filt.dir, 90)
if(check_dir == GLOB.reverse_dir[direction] && dir != direction)
var/image/intake = image(icon, icon_state = "pipe_intakes", dir = direction)
add_overlay(intake)
continue
if(other.dir == GLOB.reverse_dir[direction] && dir != direction)
var/image/intake = image(icon, icon_state = "pipe_intakes", dir = direction)
add_overlay(intake)
update_input_connection_overlays("pipe_intakes")
/obj/machinery/reagent_refinery/pipe/handle_transfer(var/atom/origin_machine, var/datum/reagents/RT, var/source_forward_dir, var/transfer_rate, var/filter_id = "")
// no back/forth, filters don't use just their forward, they send the side too!

View File

@@ -52,7 +52,7 @@
set_APTFT()
/obj/machinery/reagent_refinery/pump/handle_transfer(var/atom/origin_machine, var/datum/reagents/RT, var/source_forward_dir, var/transfer_rate, var/filter_id = "")
// pumps, furnaces and filters can only be FED in a straight line
// pumps, furnaces, splitters and filters can only be FED in a straight line
if(source_forward_dir != dir)
return 0
. = ..(origin_machine, RT, source_forward_dir, transfer_rate, filter_id)

View File

@@ -75,28 +75,7 @@
if(!(stat & (NOPOWER|BROKEN)))
var/image/dot = image(icon, icon_state = "vat_dot_[ toggle_mode > REACTOR_MODE_INTAKE ? "on" : "off" ]") // Show refinery output mode
add_overlay(dot)
for(var/direction in GLOB.cardinal)
var/turf/T = get_step(get_turf(src),direction)
var/obj/machinery/other = locate(/obj/machinery/reagent_refinery) in T
if(other && other.anchored)
// Waste processors do not connect to anything as outgoing
if(istype(other,/obj/machinery/reagent_refinery/waste_processor))
continue
// weird handling for side connections... Otherwise, anything pointing into use gets connected back!
if(istype(other,/obj/machinery/reagent_refinery/filter))
var/obj/machinery/reagent_refinery/filter/filt = other
var/check_dir = 0
if(filt.get_filter_side() == 1)
check_dir = turn(filt.dir, 270)
else
check_dir = turn(filt.dir, 90)
if(check_dir == GLOB.reverse_dir[direction] && dir != direction)
var/image/intake = image(icon, icon_state = "reactor_intakes", dir = direction)
add_overlay(intake)
continue
if(other.dir == GLOB.reverse_dir[direction] && dir != direction)
var/image/intake = image(icon, icon_state = "reactor_intakes", dir = direction)
add_overlay(intake)
update_input_connection_overlays("reactor_intakes")
/obj/machinery/reagent_refinery/reactor/handle_transfer(var/atom/origin_machine, var/datum/reagents/RT, var/source_forward_dir, var/transfer_rate, var/filter_id = "")
// no back/forth, filters don't use just their forward, they send the side too!

View File

@@ -0,0 +1,71 @@
/obj/machinery/reagent_refinery/splitter
name = "Industrial Chemical Splitter"
desc = "A large machine made for transfering industrial chemicals to multiple machines equally."
icon_state = "splitter"
density = TRUE
anchored = TRUE
idle_power_usage = 0
active_power_usage = 0
circuit = /obj/item/circuitboard/industrial_reagent_splitter
default_max_vol = 60 // smoll
/obj/machinery/reagent_refinery/splitter/Initialize(mapload)
. = ..()
default_apply_parts()
// Can't be set on these
src.verbs -= /obj/machinery/reagent_refinery/verb/set_APTFT
// Update neighbours and self for state
update_neighbours()
update_icon()
AddElement(/datum/element/climbable)
/obj/machinery/reagent_refinery/splitter/process()
if(!anchored)
return
if(stat & (BROKEN))
return
splitter_transfer()
/obj/machinery/reagent_refinery/proc/splitter_transfer()
if(amount_per_transfer_from_this <= 0 || reagents.total_volume <= 0)
return 0
var/list/target_list = list()
var/list/dir_list = list()
var/list/possible_dirs = list(turn(dir, 90), turn(dir, -90))
if(prob(50)) // So neither side has priority
possible_dirs = list(turn(dir, -90), turn(dir, 90))
for(var/dir_check in possible_dirs)
var/obj/machinery/reagent_refinery/target = locate() in get_step(get_turf(src),dir_check)
if(!target)
continue
target_list += list(target)
dir_list += list(dir_check)
if(!target_list.len)
return 0
// Dynamically set by reagent amount, we always want half
amount_per_transfer_from_this = reagents.total_volume / target_list.len
if(amount_per_transfer_from_this < 0.5)
return 0
var/total_transfered = 0
for(var/i = 1 to target_list.len)
var/scan_dir = dir_list[i]
var/scan_targ = target_list[i]
if(reagents.total_volume >= minimum_reagents_for_transfer(scan_targ))
total_transfered += transfer_tank(reagents, scan_targ, scan_dir)
return total_transfered
/obj/machinery/reagent_refinery/splitter/handle_transfer(var/atom/origin_machine, var/datum/reagents/RT, var/source_forward_dir, var/transfer_rate, var/filter_id = "")
// pumps, furnaces, splitters and filters can only be FED in a straight line
if(source_forward_dir != dir)
return 0
. = ..(origin_machine, RT, source_forward_dir, transfer_rate, filter_id)
/obj/machinery/reagent_refinery/splitter/examine(mob/user, infix, suffix)
. = ..()
. += "The meter shows [reagents.total_volume]u / [reagents.maximum_volume]u."
tutorial(REFINERY_TUTORIAL_SPLITTEROUTPUT|REFINERY_TUTORIAL_INPUT, .)

View File

@@ -54,28 +54,7 @@
if(!(stat & (NOPOWER|BROKEN)))
var/image/dot = image(icon, icon_state = "vat_dot_[ amount_per_transfer_from_this > 0 ? "on" : "off" ]")
add_overlay(dot)
for(var/direction in GLOB.cardinal)
var/turf/T = get_step(get_turf(src),direction)
var/obj/machinery/other = locate(/obj/machinery/reagent_refinery) in T
if(other && other.anchored)
// Waste processors do not connect to anything as outgoing
if(istype(other,/obj/machinery/reagent_refinery/waste_processor))
continue
// weird handling for side connections... Otherwise, anything pointing into use gets connected back!
if(istype(other,/obj/machinery/reagent_refinery/filter))
var/obj/machinery/reagent_refinery/filter/filt = other
var/check_dir = 0
if(filt.get_filter_side() == 1)
check_dir = turn(filt.dir, 270)
else
check_dir = turn(filt.dir, 90)
if(check_dir == GLOB.reverse_dir[direction] && dir != direction)
var/image/intake = image(icon, icon_state = "vat_intakes", dir = direction)
add_overlay(intake)
continue
if(other.dir == GLOB.reverse_dir[direction] && dir != direction)
var/image/intake = image(icon, icon_state = "vat_intakes", dir = direction)
add_overlay(intake)
update_input_connection_overlays("vat_intakes")
/obj/machinery/reagent_refinery/vat/examine(mob/user, infix, suffix)
. = ..()

View File

@@ -36,28 +36,7 @@
/obj/machinery/reagent_refinery/waste_processor/update_icon()
cut_overlays()
if(anchored)
for(var/direction in GLOB.cardinal)
var/turf/T = get_step(get_turf(src),direction)
var/obj/machinery/other = locate(/obj/machinery/reagent_refinery) in T
if(other && other.anchored)
// Waste processors do not connect to anything as outgoing
if(istype(other,/obj/machinery/reagent_refinery/waste_processor))
continue
// weird handling for side connections... Otherwise, anything pointing into use gets connected back!
if(istype(other,/obj/machinery/reagent_refinery/filter))
var/obj/machinery/reagent_refinery/filter/filt = other
var/check_dir = 0
if(filt.get_filter_side() == 1)
check_dir = turn(filt.dir, 270)
else
check_dir = turn(filt.dir, 90)
if(check_dir == GLOB.reverse_dir[direction])
var/image/intake = image(icon, icon_state = "waste_intakes", dir = direction)
add_overlay(intake)
continue
if(other.dir == GLOB.reverse_dir[direction])
var/image/intake = image(icon, icon_state = "waste_intakes", dir = direction)
add_overlay(intake)
update_input_connection_overlays("waste_intakes")
/obj/machinery/reagent_refinery/waste_processor/examine(mob/user, infix, suffix)
. = ..()

View File

@@ -98,6 +98,16 @@
)
departmental_flags = DEPARTMENT_BITFLAG_ENGINEERING | DEPARTMENT_BITFLAG_SCIENCE
/datum/design_techweb/board/industrial_reagent_splitter
name = "Industrial Reagent Splitter"
id = "industrial_reagent_splitter"
// req_tech = list(TECH_DATA = 1)
build_path = /obj/item/circuitboard/industrial_reagent_splitter
category = list(
RND_CATEGORY_MACHINE + RND_SUBCATEGORY_MACHINE_ENGINEERING
)
departmental_flags = DEPARTMENT_BITFLAG_ENGINEERING | DEPARTMENT_BITFLAG_SCIENCE
/datum/design_techweb/board/pump_relay
name = "Pump Relay"
id = "pump_relay"

View File

@@ -340,6 +340,7 @@
"industrial_reagent_reactor",
"industrial_reagent_vat",
"industrial_reagent_mixer",
"industrial_reagent_splitter",
"industrial_reagent_waste_processor",
"pump_relay",
"fluid_pump"

View File

@@ -3,11 +3,27 @@
// BONE SURGERY //
//////////////////////////////////////////////////////////////////
/datum/surgery_step/bones
/datum/surgery_step/bones/can_use(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
if(!ishuman(target))
return FALSE
var/obj/item/organ/external/affected = target.get_organ(target_zone)
if(!(affected.status & ORGAN_BROKEN))
return FALSE
if(coverage_check(user, target, affected, tool))
return FALSE
if(affected.cannot_break && !affected.encased)
return FALSE
if(affected.robotic >= ORGAN_ROBOT)
return FALSE
return TRUE
///////////////////////////////////////////////////////////////
// Bone Glue Surgery
///////////////////////////////////////////////////////////////
/datum/surgery_step/glue_bone
/datum/surgery_step/bones/glue_bone
surgery_name = "Glue Bone"
allowed_tools = list(
/obj/item/surgical/bonegel = 100
@@ -21,15 +37,11 @@
min_duration = 30 //CHOMPedit
max_duration = 40 //CHOMPedit
/datum/surgery_step/glue_bone/can_use(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
if(!ishuman(target))
return 0
/datum/surgery_step/bones/glue_bone/can_use(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
var/obj/item/organ/external/affected = target.get_organ(target_zone)
if(coverage_check(user, target, affected, tool))
return 0
return affected && (affected.robotic < ORGAN_ROBOT) && affected.open >= 2 && affected.stage == 0
return ..() && affected.open >= FLESH_RETRACTED && affected.stage == 0
/datum/surgery_step/glue_bone/begin_step(mob/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
/datum/surgery_step/bones/glue_bone/begin_step(mob/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
var/obj/item/organ/external/affected = target.get_organ(target_zone)
if (affected.stage == 0)
user.visible_message(span_notice("[user] starts applying medication to the damaged bones in [target]'s [affected.name] with \the [tool].") , \
@@ -38,14 +50,14 @@
target.custom_pain("Something in your [affected.name] is causing you a lot of pain!", 50)
..()
/datum/surgery_step/glue_bone/end_step(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
/datum/surgery_step/bones/glue_bone/end_step(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
var/obj/item/organ/external/affected = target.get_organ(target_zone)
user.visible_message(span_notice("[user] applies some [tool] to [target]'s bone in [affected.name]"), \
span_notice("You apply some [tool] to [target]'s bone in [affected.name] with \the [tool]."))
user.balloon_alert_visible("applies [tool] to [target]'s bone.", "applying [tool] to [target]'s bone.")
affected.stage = 1
/datum/surgery_step/glue_bone/fail_step(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
/datum/surgery_step/bones/glue_bone/fail_step(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
var/obj/item/organ/external/affected = target.get_organ(target_zone)
user.visible_message(span_danger("[user]'s hand slips, smearing [tool] in the incision in [target]'s [affected.name]!") , \
span_danger("Your hand slips, smearing [tool] in the incision in [target]'s [affected.name]!"))
@@ -55,7 +67,7 @@
// Bone Setting Surgery
///////////////////////////////////////////////////////////////
/datum/surgery_step/set_bone
/datum/surgery_step/bones/set_bone
surgery_name = "Set Bone"
allowed_tools = list(
/obj/item/surgical/bonesetter = 100
@@ -66,15 +78,11 @@
min_duration = 30 //CHOMPedit
max_duration = 45 //CHOMPedit
/datum/surgery_step/set_bone/can_use(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
if(!ishuman(target))
return 0
/datum/surgery_step/bones/set_bone/can_use(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
var/obj/item/organ/external/affected = target.get_organ(target_zone)
if(coverage_check(user, target, affected, tool))
return 0
return affected && affected.organ_tag != BP_HEAD && !(affected.robotic >= ORGAN_ROBOT) && affected.open >= 2 && affected.stage == 1
return ..() && affected.organ_tag != BP_HEAD && affected.open >= FLESH_RETRACTED && affected.stage == 1
/datum/surgery_step/set_bone/begin_step(mob/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
/datum/surgery_step/bones/set_bone/begin_step(mob/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
var/obj/item/organ/external/affected = target.get_organ(target_zone)
user.visible_message(span_notice("[user] is beginning to set the bone in [target]'s [affected.name] in place with \the [tool].") , \
span_notice("You are beginning to set the bone in [target]'s [affected.name] in place with \the [tool]."))
@@ -82,20 +90,14 @@
target.custom_pain("The pain in your [affected.name] is going to make you pass out!", 50)
..()
/datum/surgery_step/set_bone/end_step(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
/datum/surgery_step/bones/set_bone/end_step(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
var/obj/item/organ/external/affected = target.get_organ(target_zone)
if (affected.status & ORGAN_BROKEN)
user.visible_message(span_notice("[user] sets the bone in [target]'s [affected.name] in place with \the [tool]."), \
span_notice("You set the bone in [target]'s [affected.name] in place with \the [tool]."))
user.balloon_alert_visible("sets the bone in place.", "bone set in place.")
affected.stage = 2
else
user.visible_message("[user] sets the bone in [target]'s [affected.name] " + span_danger("in the WRONG place with \the [tool]."), \
"You set the bone in [target]'s [affected.name] " + span_danger("in the WRONG place with \the [tool]."))
user.balloon_alert_visible("sets the bone in the WRONG place.", "bone set in the WRONG place.")
affected.fracture()
user.visible_message(span_notice("[user] sets the bone in [target]'s [affected.name] in place with \the [tool]."), \
span_notice("You set the bone in [target]'s [affected.name] in place with \the [tool]."))
user.balloon_alert_visible("sets the bone in place.", "bone set in place.")
affected.stage = 2
/datum/surgery_step/set_bone/fail_step(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
/datum/surgery_step/bones/set_bone/fail_step(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
var/obj/item/organ/external/affected = target.get_organ(target_zone)
user.visible_message(span_danger("[user]'s hand slips, damaging the bone in [target]'s [affected.name] with \the [tool]!") , \
span_danger("Your hand slips, damaging the bone in [target]'s [affected.name] with \the [tool]!"))
@@ -106,7 +108,7 @@
// Skull Mending Surgery
///////////////////////////////////////////////////////////////
/datum/surgery_step/mend_skull
/datum/surgery_step/bones/mend_skull
surgery_name = "Mend Skull"
allowed_tools = list(
/obj/item/surgical/bonesetter = 100
@@ -117,41 +119,37 @@
min_duration = 40 //CHOMPedit
max_duration = 50 //CHOMPedit
/datum/surgery_step/mend_skull/can_use(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
if(!ishuman(target))
return 0
/datum/surgery_step/bones/mend_skull/can_use(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
var/obj/item/organ/external/affected = target.get_organ(target_zone)
if(coverage_check(user, target, affected, tool))
return 0
return affected && affected.organ_tag == BP_HEAD && (affected.robotic < ORGAN_ROBOT) && affected.open >= 2 && affected.stage == 1
return ..() && affected.organ_tag == BP_HEAD && affected.open >= FLESH_RETRACTED && affected.stage == 1
/datum/surgery_step/mend_skull/begin_step(mob/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
/datum/surgery_step/bones/mend_skull/begin_step(mob/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
user.visible_message(span_notice("[user] is beginning to piece together [target]'s skull with \the [tool].") , \
span_notice("You are beginning to piece together [target]'s skull with \the [tool]."))
user.balloon_alert_visible("pieces the skull together", "piecing skull together.")
..()
/datum/surgery_step/mend_skull/end_step(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
/datum/surgery_step/bones/mend_skull/end_step(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
var/obj/item/organ/external/affected = target.get_organ(target_zone)
user.visible_message(span_notice("[user] sets [target]'s skull with \the [tool].") , \
span_notice("You set [target]'s skull with \the [tool]."))
user.balloon_alert_visible("sets the skull back.", "skull set back.")
affected.stage = 2
/datum/surgery_step/mend_skull/fail_step(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
/datum/surgery_step/bones/mend_skull/fail_step(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
var/obj/item/organ/external/affected = target.get_organ(target_zone)
user.visible_message(span_danger("[user]'s hand slips, damaging [target]'s face with \the [tool]!") , \
span_danger("Your hand slips, damaging [target]'s face with \the [tool]!"))
user.balloon_alert_visible("slips, damaging [target]'s face", "your hand slips, damaging [target]'s face")
var/obj/item/organ/external/head/h = affected
h.createwound(BRUISE, 10)
h.disfigured = 1
h.disfigure()
///////////////////////////////////////////////////////////////
// Bone Fixing Surgery
///////////////////////////////////////////////////////////////
/datum/surgery_step/finish_bone
/datum/surgery_step/bones/finish_bone
surgery_name = "Finish Mending Bone"
allowed_tools = list(
/obj/item/surgical/bonegel = 100
@@ -165,22 +163,18 @@
min_duration = 30 //CHOMPedit
max_duration = 30 //CHOMPedit
/datum/surgery_step/finish_bone/can_use(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
if(!ishuman(target))
return 0
/datum/surgery_step/bones/finish_bone/can_use(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
var/obj/item/organ/external/affected = target.get_organ(target_zone)
if(coverage_check(user, target, affected, tool))
return 0
return affected && affected.open >= 2 && !(affected.robotic >= ORGAN_ROBOT) && affected.stage == 2
return ..() && affected.open >= FLESH_RETRACTED && affected.stage == 2
/datum/surgery_step/finish_bone/begin_step(mob/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
/datum/surgery_step/bones/finish_bone/begin_step(mob/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
var/obj/item/organ/external/affected = target.get_organ(target_zone)
user.visible_message(span_notice("[user] starts to finish mending the damaged bones in [target]'s [affected.name] with \the [tool]."), \
span_notice("You start to finish mending the damaged bones in [target]'s [affected.name] with \the [tool]."))
user.balloon_alert_visible("begins mending damaged bones.", "mending damaged bones.")
..()
/datum/surgery_step/finish_bone/end_step(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
/datum/surgery_step/bones/finish_bone/end_step(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
var/obj/item/organ/external/affected = target.get_organ(target_zone)
user.visible_message(span_notice("[user] has mended the damaged bones in [target]'s [affected.name] with \the [tool].") , \
span_notice("You have mended the damaged bones in [target]'s [affected.name] with \the [tool].") )
@@ -188,7 +182,7 @@
affected.status &= ~ORGAN_BROKEN
affected.stage = 0
/datum/surgery_step/finish_bone/fail_step(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
/datum/surgery_step/bones/finish_bone/fail_step(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
var/obj/item/organ/external/affected = target.get_organ(target_zone)
user.visible_message(span_danger("[user]'s hand slips, smearing [tool] in the incision in [target]'s [affected.name]!") , \
span_danger("Your hand slips, smearing [tool] in the incision in [target]'s [affected.name]!"))
@@ -198,7 +192,7 @@
// Bone Clamp Surgery
///////////////////////////////////////////////////////////////
/datum/surgery_step/clamp_bone
/datum/surgery_step/bones/clamp_bone
surgery_name = "Clamp Bone"
allowed_tools = list(
/obj/item/surgical/bone_clamp = 100
@@ -210,15 +204,11 @@
min_duration = 45 //CHOMPedit
max_duration = 55 //CHOMPedit
/datum/surgery_step/clamp_bone/can_use(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
if(!ishuman(target))
return 0
/datum/surgery_step/bones/clamp_bone/can_use(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
var/obj/item/organ/external/affected = target.get_organ(target_zone)
if(coverage_check(user, target, affected, tool))
return 0
return affected && (affected.status & ORGAN_BROKEN) && (affected.robotic < ORGAN_ROBOT) && affected.open >= 2 && affected.stage == 0
return ..() && affected.open >= FLESH_RETRACTED && affected.stage == 0
/datum/surgery_step/clamp_bone/begin_step(mob/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
/datum/surgery_step/bones/clamp_bone/begin_step(mob/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
var/obj/item/organ/external/affected = target.get_organ(target_zone)
if (affected.stage == 0)
user.visible_message(span_notice("[user] starts repairing the damaged bones in [target]'s [affected.name] with \the [tool].") , \
@@ -227,14 +217,14 @@
target.custom_pain("Something in your [affected.name] is causing you a lot of pain!", 50)
..()
/datum/surgery_step/clamp_bone/end_step(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
/datum/surgery_step/bones/clamp_bone/end_step(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
var/obj/item/organ/external/affected = target.get_organ(target_zone)
user.visible_message(span_notice("[user] sets the bone in [target]'s [affected.name] with \the [tool]."), \
span_notice("You sets [target]'s bone in [affected.name] with \the [tool]."))
user.balloon_alert_visible("sets the bone back in.", "bone set in.")
affected.status &= ~ORGAN_BROKEN
/datum/surgery_step/clamp_bone/fail_step(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
/datum/surgery_step/bones/clamp_bone/fail_step(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
var/obj/item/organ/external/affected = target.get_organ(target_zone)
user.visible_message(span_danger("[user]'s hand slips, damaging the bone in [target]'s [affected.name] with \the [tool]!") , \
span_danger("Your hand slips, damaging the bone in [target]'s [affected.name] with \the [tool]!"))

View File

@@ -15,7 +15,7 @@
var/obj/item/organ/external/affected = target.get_organ(target_zone)
if(coverage_check(user, target, affected, tool))
return 0
return affected && !(affected.robotic >= ORGAN_ROBOT) && affected.encased && affected.open >= 2
return affected && !(affected.robotic >= ORGAN_ROBOT) && affected.encased && affected.open >= FLESH_RETRACTED
///////////////////////////////////////////////////////////////
// Rib Sawing Surgery
@@ -148,7 +148,7 @@
if(!ishuman(target))
return
var/obj/item/organ/external/affected = target.get_organ(target_zone)
return (..() && affected && affected.open == 3)
return (..() && affected && affected.open == BONE_RETRACTED)
/datum/surgery_step/open_encased/close/begin_step(mob/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
if(!ishuman(target))
@@ -255,7 +255,7 @@
if(!ishuman(target))
return
var/obj/item/organ/external/affected = target.get_organ(target_zone)
return ..() && affected && affected.open >= 2 && affected.open < 3
return ..() && affected && affected.open >= FLESH_RETRACTED && affected.open < BONE_RETRACTED
/datum/surgery_step/open_encased/advancedsaw_open/begin_step(mob/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
if(!ishuman(target))
@@ -308,7 +308,7 @@
if(!ishuman(target))
return
var/obj/item/organ/external/affected = target.get_organ(target_zone)
return (..() && affected && affected.open == 3)
return (..() && affected && affected.open == BONE_RETRACTED)
/datum/surgery_step/open_encased/advancedsaw_mend/begin_step(mob/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
if(!ishuman(target))

View File

@@ -3,7 +3,7 @@
// COMMON STEPS //
//////////////////////////////////////////////////////////////////
/datum/surgery_step/generic/
/datum/surgery_step/generic
can_infect = 1
/datum/surgery_step/generic/can_use(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
@@ -43,7 +43,7 @@
/datum/surgery_step/generic/cut_open/can_use(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
if(..())
var/obj/item/organ/external/affected = target.get_organ(target_zone)
return affected && affected.open == 0 && target_zone != O_MOUTH
return affected && !affected.open && target_zone != O_MOUTH
/datum/surgery_step/generic/cut_open/begin_step(mob/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
var/obj/item/organ/external/affected = target.get_organ(target_zone)
@@ -58,7 +58,7 @@
user.visible_message(span_notice("[user] has made an incision on [target]'s [affected.name] with \the [tool]."), \
span_notice("You have made an incision on [target]'s [affected.name] with \the [tool]."),)
user.balloon_alert_visible("opens an incision on [target]'s [affected.name]", "incision open on \the [affected.name]")
affected.open = 1
affected.open = INCISION_MADE
if(istype(target) && target.should_have_organ(O_HEART))
affected.status |= ORGAN_BLEEDING
@@ -93,7 +93,7 @@
/datum/surgery_step/generic/cut_with_laser/can_use(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
if(..())
var/obj/item/organ/external/affected = target.get_organ(target_zone)
return affected && affected.open == 0 && target_zone != O_MOUTH
return affected && !affected.open && target_zone != O_MOUTH
/datum/surgery_step/generic/cut_with_laser/begin_step(mob/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
var/obj/item/organ/external/affected = target.get_organ(target_zone)
@@ -105,7 +105,7 @@
/datum/surgery_step/generic/cut_with_laser/end_step(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
var/obj/item/organ/external/affected = target.get_organ(target_zone)
affected.open = 1
affected.open = INCISION_MADE
affected.createwound(CUT, 1)
var/clamp_chance = 0
@@ -121,9 +121,6 @@
user.visible_message(span_notice("[user] has made an incision on [target]'s [affected.name] with \the [tool], but blood is still escaping from the wound."), \
span_notice("You have made an incision on [target]'s [affected.name] with \the [tool], but blood is still coming from the wound.."),)
user.balloon_alert_visible("opens an incision on [target]'s [affected.name], blood still flowing", "incision open on \the [affected.name], but blood still flows")
//Could be cleaner ...
spread_germs_to_organ(affected, user)
/datum/surgery_step/generic/cut_with_laser/fail_step(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
var/obj/item/organ/external/affected = target.get_organ(target_zone)
@@ -152,7 +149,7 @@
/datum/surgery_step/generic/incision_manager/can_use(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
if(..())
var/obj/item/organ/external/affected = target.get_organ(target_zone)
return affected && affected.open == 0 && target_zone != O_MOUTH
return affected && !affected.open && target_zone != O_MOUTH
/datum/surgery_step/generic/incision_manager/begin_step(mob/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
var/obj/item/organ/external/affected = target.get_organ(target_zone)
@@ -167,14 +164,14 @@
user.visible_message(span_notice("[user] has constructed a prepared incision on and within [target]'s [affected.name] with \the [tool]."), \
span_notice("You have constructed a prepared incision on and within [target]'s [affected.name] with \the [tool]."),)
user.balloon_alert_visible("constructs a prepared incision", "constructed prepared incision")
affected.open = 1
affected.open = INCISION_MADE
if(istype(target) && target.should_have_organ(O_HEART))
affected.status |= ORGAN_BLEEDING
affected.createwound(CUT, 1)
affected.organ_clamp()
affected.open = 2
affected.open = FLESH_RETRACTED
/datum/surgery_step/generic/incision_manager/fail_step(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
var/obj/item/organ/external/affected = target.get_organ(target_zone)
@@ -202,7 +199,15 @@
/datum/surgery_step/generic/clamp_bleeders/can_use(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
if(..())
var/obj/item/organ/external/affected = target.get_organ(target_zone)
return affected && affected.open && (affected.status & ORGAN_BLEEDING)
if(!affected)
return FALSE
var/internally_bleeding = FALSE
for(var/datum/wound/internal_bleeding/W in affected.wounds)
if(W.clamped)
continue
internally_bleeding = TRUE
break
return affected && affected.open && ((affected.status & ORGAN_BLEEDING) || internally_bleeding)
/datum/surgery_step/generic/clamp_bleeders/begin_step(mob/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
var/obj/item/organ/external/affected = target.get_organ(target_zone)
@@ -218,7 +223,8 @@
span_notice("You clamp bleeders in [target]'s [affected.name] with \the [tool]."))
user.balloon_alert_visible("clamps bleeders", "clamped bleeders")
affected.organ_clamp()
spread_germs_to_organ(affected, user)
for(var/datum/wound/internal_bleeding/W in affected.wounds) //Normal organ clamp does NOT clamp internal bleeds. Using hemostats directly does.
W.clamped = TRUE
/datum/surgery_step/generic/clamp_bleeders/fail_step(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
var/obj/item/organ/external/affected = target.get_organ(target_zone)
@@ -241,12 +247,12 @@
allowed_procs = list(IS_CROWBAR = 75)
min_duration = 30
max_duration = 30 //CHOMPedit
max_duration = 30
/datum/surgery_step/generic/retract_skin/can_use(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
if(..())
var/obj/item/organ/external/affected = target.get_organ(target_zone)
return affected && affected.open == 1 //&& !(affected.status & ORGAN_BLEEDING)
return affected && affected.open == INCISION_MADE
/datum/surgery_step/generic/retract_skin/begin_step(mob/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
var/obj/item/organ/external/affected = target.get_organ(target_zone)
@@ -286,7 +292,7 @@
self_msgBall = "keeping the incision open on the lower abdomen."
user.visible_message(msg, self_msg)
user.balloon_alert_visible(msgBall, self_msgBall)
affected.open = 2
affected.open = FLESH_RETRACTED
/datum/surgery_step/generic/retract_skin/fail_step(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
var/obj/item/organ/external/affected = target.get_organ(target_zone)

View File

@@ -11,13 +11,24 @@
/datum/surgery_step/brainstem/can_use(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
if(!ishuman(target))
return 0
return FALSE
var/obj/item/organ/external/affected = target.get_organ(target_zone)
if (!affected || (affected.robotic >= ORGAN_ROBOT) || !(affected.open >= 3))
return 0
if(!affected || (affected.robotic >= ORGAN_ROBOT))
return FALSE
//If our organ is encased (has a bone) the bone must be cut. If the organ is NOT encased (boneless) we can only get to encased == 2
if(affected.open != (affected.encased ? 3 : 2))
return FALSE
if(coverage_check(user, target, affected, tool))
return 0
return target_zone == BP_HEAD
return FALSE
//Gets where our brain is located and allows us to do frankensurgery in the right location.
var/obj/item/organ/internal/brain/sponge = locate(/obj/item/organ/internal/brain) in affected.internal_organs
if(!sponge)
return FALSE
if(target_zone != sponge.parent_organ)
return FALSE
if((target.can_defib && !(sponge.status & ORGAN_DEAD)) && !target.op_stage.brainstem == 5) //Final step can be done after our can_defib step is set.
return FALSE
return target_zone == sponge.parent_organ
/////////////////////////////
// Blood Vessel Mending
@@ -35,7 +46,7 @@
max_duration = 100
/datum/surgery_step/brainstem/mend_vessels/can_use(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
return ..() && target_zone == BP_HEAD && target.op_stage.brainstem == 0
return ..() && target.op_stage.brainstem == 0
/datum/surgery_step/brainstem/mend_vessels/begin_step(mob/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
user.visible_message(span_filter_notice("[user] starts to mend the blood vessels on [target]'s brainstem with \the [tool]."), \
@@ -73,10 +84,10 @@
allowed_procs = list(IS_SCREWDRIVER = 75)
min_duration = 200 //Very. Very. Carefully.
max_duration = 200 //CHOMPedit
max_duration = 200
/datum/surgery_step/brainstem/drill_vertebrae/can_use(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
return ..() && target_zone == BP_HEAD && target.op_stage.brainstem == 1
return ..() && target.op_stage.brainstem == 1
/datum/surgery_step/brainstem/drill_vertebrae/begin_step(mob/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
user.visible_message(span_filter_notice("[user] starts to drill around [target]'s brainstem with \the [tool]."), \
@@ -100,9 +111,8 @@
user.balloon_alert_visible("slips, shredding [target]'s brainstem", "your hand slips, shredding the brainstem.")
affected.createwound(PIERCE, 10)
target.AdjustParalysis(15)
spawn()
for(var/obj/item/organ/internal/brain/O in affected.internal_organs)
O.take_damage(rand(5,10))
for(var/obj/item/organ/internal/brain/O in affected.internal_organs)
O.take_damage(rand(5,10))
/////////////////////////////
// Bone Cleaning
@@ -117,11 +127,11 @@
allowed_procs = list(IS_WIRECUTTER = 60)
min_duration = 90
max_duration = 120
min_duration = 100
max_duration = 100
/datum/surgery_step/brainstem/clean_chips/can_use(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
return ..() && target_zone == BP_HEAD && target.op_stage.brainstem == 2
return ..() && target.op_stage.brainstem == 2
/datum/surgery_step/brainstem/clean_chips/begin_step(mob/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
user.visible_message(span_filter_notice("[user] starts to pick around [target]'s brainstem for bone chips with \the [tool]."), \
@@ -143,9 +153,8 @@
user.balloon_alert_visible("slips, gouging [target]'s brainstem", "your hand slips, gouging the brainstem")
affected.createwound(CUT, 5)
target.AdjustParalysis(10)
spawn()
for(var/obj/item/organ/internal/brain/O in affected.internal_organs) //If there's more than one...
O.take_damage(rand(1,10))
for(var/obj/item/organ/internal/brain/O in affected.internal_organs) //If there's more than one...
O.take_damage(rand(1,10))
/////////////////////////////
// Spinal Cord Repair
@@ -164,7 +173,7 @@
max_duration = 100 //CHOMPedit
/datum/surgery_step/brainstem/mend_cord/can_use(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
return ..() && target_zone == BP_HEAD && target.op_stage.brainstem == 3
return ..() && target.op_stage.brainstem == 3
/datum/surgery_step/brainstem/mend_cord/begin_step(mob/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
user.visible_message(span_filter_notice("[user] starts to fuse [target]'s spinal cord with \the [tool]."), \
@@ -174,11 +183,10 @@
/datum/surgery_step/brainstem/mend_cord/end_step(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
user.visible_message(span_notice("[user] has fused [target]'s spinal cord with \the [tool].") , \
span_notice(" You have fused [target]'s spinal cord with \the [tool]."),)
span_notice("You have fused [target]'s spinal cord with \the [tool]."),)
user.balloon_alert_visible("fused [target]'s spinal cord", "fused the spinal cord")
target.op_stage.brainstem = 4
target.AdjustParalysis(5)
target.add_modifier(/datum/modifier/franken_sickness, 20 MINUTES)
/datum/surgery_step/brainstem/mend_cord/fail_step(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
var/obj/item/organ/external/affected = target.get_organ(target_zone)
@@ -187,9 +195,8 @@
user.balloon_alert_visible("slips, tearing [target]'s spinal cord", "your hand slips, tearing at the spinal cord")
affected.createwound(PIERCE, 5)
target.AdjustParalysis(20)
spawn()
for(var/obj/item/organ/internal/brain/O in affected.internal_organs)
O.take_damage(rand(5,15)) //Down to the wire. Or rather, the cord.
for(var/obj/item/organ/internal/brain/O in affected.internal_organs)
O.take_damage(rand(5,15)) //Down to the wire. Or rather, the cord.
/////////////////////////////
// Vertebrae repair
@@ -204,10 +211,10 @@
/obj/item/tape_roll = 50)
min_duration = 100
max_duration = 100 //CHOMPedit
max_duration = 100
/datum/surgery_step/brainstem/mend_vertebrae/can_use(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
return ..() && target_zone == BP_HEAD && target.op_stage.brainstem == 4
return ..() && target.op_stage.brainstem == 4
/datum/surgery_step/brainstem/mend_vertebrae/begin_step(mob/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
user.visible_message(span_filter_notice("[user] starts to mend [target]'s opened vertebrae with \the [tool]."), \
@@ -237,6 +244,7 @@
// Realign tissues
/////////////////////////////
///This step isn't essential BUT does heal brain loss and heals a dead brain.
/datum/surgery_step/brainstem/realign_tissue
surgery_name = "Realign Tissue"
priority = 3 //Do this instead of searching for objects in the skull.
@@ -246,11 +254,11 @@
allowed_procs = list(IS_WIRECUTTER = 60)
min_duration = 90
max_duration = 120
min_duration = 100
max_duration = 100
/datum/surgery_step/brainstem/realign_tissue/can_use(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
return ..() && target_zone == BP_HEAD && target.op_stage.brainstem == 5
return ..() && target.op_stage.brainstem == 5
/datum/surgery_step/brainstem/realign_tissue/begin_step(mob/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
user.visible_message(span_filter_notice("[user] starts to realign the tissues in [target]'s skull with \the [tool]."), \
@@ -260,10 +268,13 @@
/datum/surgery_step/brainstem/realign_tissue/end_step(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
user.visible_message(span_notice("[user] has realigned the tissues in [target]'s skull back into place with \the [tool].") , \
span_notice(" You have realigned the tissues in [target]'s skull back into place with \the [tool]."),)
span_notice("You have realigned the tissues in [target]'s skull back into place with \the [tool]."),)
user.balloon_alert_visible("realigned the tissues in [target]'s skull back in place", "realigned the tissues in the skull back into place")
target.AdjustParalysis(5) //I n v a s i v e
target.op_stage.brainstem = 0 //The cycle begins anew.
target.brainloss = 0 //The cycle begins anew.
for(var/obj/item/organ/internal/brain/sponge in target.internal_organs) //in case they have multiple brains. weirdo.
sponge.status = 0
/datum/surgery_step/brainstem/realign_tissue/fail_step(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
var/obj/item/organ/external/affected = target.get_organ(target_zone)
@@ -272,6 +283,5 @@
user.balloon_alert_visible("slips, gounging at [target]'s brainstem", "your hand slips, gouging at the brainstem")
affected.createwound(CUT, 5)
target.AdjustParalysis(30)
spawn()
for(var/obj/item/organ/internal/brain/O in affected.internal_organs)
O.take_damage(rand(1,10))
for(var/obj/item/organ/internal/brain/O in affected.internal_organs)
O.take_damage(rand(1,10))

View File

@@ -92,7 +92,7 @@
if(coverage_check(user, target, affected, tool))
return 0
return affected && affected.open >= 2 && (affected.status & ORGAN_DEAD)
return affected && affected.open >= FLESH_RETRACTED && (affected.status & ORGAN_DEAD)
/datum/surgery_step/necrotic/fix_dead_tissue //Debridement
surgery_name = "Remove Dead Tissue"
@@ -154,7 +154,7 @@
/datum/surgery_step/necrotic/treat_necrosis/can_use(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
var/obj/item/organ/external/affected = target.get_organ(target_zone)
return ..() && affected.open >= 3 && affected.remove_necrosis >= 1
return ..() && affected.open >= BONE_RETRACTED && affected.remove_necrosis >= 1
/datum/surgery_step/necrotic/treat_necrosis/begin_step(mob/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
var/obj/item/organ/external/affected = target.get_organ(target_zone)
@@ -213,7 +213,7 @@
/datum/surgery_step/necrotic/rejuvenate_dead_tissue/can_use(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
var/obj/item/organ/external/affected = target.get_organ(target_zone)
return ..() && affected.open >= 3 && affected.remove_necrosis == 1
return ..() && affected.open >= BONE_RETRACTED && affected.remove_necrosis == 1
/datum/surgery_step/necrotic/rejuvenate_dead_tissue/begin_step(mob/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
var/obj/item/organ/external/affected = target.get_organ(target_zone)
@@ -253,7 +253,7 @@
/datum/surgery_step/necrotic/rearrange_dead_tissue/can_use(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
var/obj/item/organ/external/affected = target.get_organ(target_zone)
return ..() && affected.open >= 3 && affected.remove_necrosis == 2
return ..() && affected.open >= BONE_RETRACTED && affected.remove_necrosis == 2
/datum/surgery_step/necrotic/rearrange_dead_tissue/begin_step(mob/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
var/obj/item/organ/external/affected = target.get_organ(target_zone)
@@ -294,7 +294,7 @@
/datum/surgery_step/necrotic/fix_necrotic_vessel/can_use(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
var/obj/item/organ/external/affected = target.get_organ(target_zone)
return ..() && affected.open >= 3 && affected.remove_necrosis == 3
return ..() && affected.open >= BONE_RETRACTED && affected.remove_necrosis == 3
/datum/surgery_step/necrotic/fix_necrotic_vessel/begin_step(mob/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
var/obj/item/organ/external/affected = target.get_organ(target_zone)

View File

@@ -46,7 +46,7 @@
/datum/surgery_step/robotics/unscrew_hatch/can_use(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
if(..())
var/obj/item/organ/external/affected = target.get_organ(target_zone)
return affected && affected.open == 0 && target_zone != O_MOUTH
return affected && !affected.open && target_zone != O_MOUTH
/datum/surgery_step/robotics/unscrew_hatch/begin_step(mob/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
var/obj/item/organ/external/affected = target.get_organ(target_zone)
@@ -60,7 +60,7 @@
user.visible_message(span_notice("[user] has opened the maintenance hatch on [target]'s [affected.name] with \the [tool]."), \
span_notice("You have opened the maintenance hatch on [target]'s [affected.name] with \the [tool]."),)
user.balloon_alert_visible("opens the maintenance hatch on [target]'s [affected.name]", "maintenance hatch opened on \the [affected.name]")
affected.open = 1
affected.open = INCISION_MADE
/datum/surgery_step/robotics/unscrew_hatch/fail_step(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
var/obj/item/organ/external/affected = target.get_organ(target_zone)
@@ -213,7 +213,7 @@
else
if(!welder.isOn() || !welder.remove_fuel(1,user))
return 0
return affected && affected.open == 3 && (affected.disfigured || affected.brute_dam > 0) && target_zone != O_MOUTH // CHOMPEdit End.
return affected && affected.open == BONE_RETRACTED && (affected.disfigured || affected.brute_dam > 0) && target_zone != O_MOUTH // CHOMPEdit End.
/datum/surgery_step/robotics/repair_brute/begin_step(mob/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
var/obj/item/organ/external/affected = target.get_organ(target_zone)
@@ -267,7 +267,7 @@
else
C.use(5)
return affected && affected.open == 3 && (affected.disfigured || affected.burn_dam > 0) && target_zone != O_MOUTH
return affected && affected.open == BONE_RETRACTED && (affected.disfigured || affected.burn_dam > 0) && target_zone != O_MOUTH
/datum/surgery_step/robotics/repair_burn/begin_step(mob/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
var/obj/item/organ/external/affected = target.get_organ(target_zone)
@@ -319,7 +319,7 @@
if(I.damage > 0 && (I.robotic >= ORGAN_ROBOT))
is_organ_damaged = 1
break
return affected.open == 3 && is_organ_damaged
return affected.open == BONE_RETRACTED && is_organ_damaged
/datum/surgery_step/robotics/fix_organ_robotic/begin_step(mob/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
if(!ishuman(target))
@@ -518,7 +518,7 @@
var/obj/item/mmi/M = tool
var/obj/item/organ/external/affected = target.get_organ(target_zone)
if(!(affected && affected.open == 3))
if(!(affected && affected.open == BONE_RETRACTED))
return 0
if(!istype(M))
@@ -621,7 +621,7 @@
var/obj/item/holder/diona/N = tool
var/obj/item/organ/external/affected = target.get_organ(target_zone)
if(!(affected && affected.open == 3))
if(!(affected && affected.open == BONE_RETRACTED))
return 0
if(!istype(N))

View File

@@ -60,7 +60,7 @@
/obj/structure/table/sifwoodentable
icon_state = "plain_preview"
color = "#824B28"
color = "#0099cc"
/obj/structure/table/sifwoodentable/Initialize(mapload)
material = get_material_by_name(MAT_SIFWOOD)
@@ -204,7 +204,7 @@
/obj/structure/table/bench/sifwooden
icon_state = "plain_preview"
color = "#824B28"
color = "#0099cc"
/obj/structure/table/bench/sifwooden/Initialize(mapload)
material = get_material_by_name(MAT_SIFWOOD)
@@ -255,3 +255,44 @@
/obj/structure/table/bench/glamour/Initialize(mapload)
material = get_material_by_name(MAT_GLAMOUR)
. = ..()
//new wood types
/obj/structure/table/birch
icon_state = "plain_preview"
color = "#f6dec0"
/obj/structure/table/birch/Initialize(mapload)
material = get_material_by_name(MAT_BIRCHWOOD)
. = ..()
/obj/structure/table/pine
icon_state = "plain_preview"
color = "#cd9d6f"
/obj/structure/table/pine/Initialize(mapload)
material = get_material_by_name(MAT_PINEWOOD)
. = ..()
/obj/structure/table/oak
icon_state = "plain_preview"
color = "#674928"
/obj/structure/table/oak/Initialize(mapload)
material = get_material_by_name(MAT_OAKWOOD)
. = ..()
/obj/structure/table/acacia
icon_state = "plain_preview"
color = "#b75e12"
/obj/structure/table/acacia/Initialize(mapload)
material = get_material_by_name(MAT_ACACIAWOOD)
. = ..()
/obj/structure/table/redwood
icon_state = "stone_preview"
color = "#a45a52"
/obj/structure/table/redwood/Initialize(mapload)
material = get_material_by_name(MAT_REDWOOD)
. = ..()

View File

@@ -455,7 +455,7 @@ GLOBAL_LIST_EMPTY(pending_discord_registrations)
message.text = "Error, job \"[role]\" is not a whitelist job."
return message
if(kind == "species")
if(role in GLOB.playable_species)
if(!(role in GLOB.playable_species))
message.text = "Error, invalid species entered. Check spelling and capitalization."
return message
if(!(role in GLOB.whitelisted_species))

View File

@@ -91,6 +91,7 @@
#include "autowiki.dm"
//#include "clothing_tests.dm" // FIXME
#include "component_tests.dm"
#include "construction_tests.dm"
#include "cosmetic_tests.dm"
#include "dcs_check_list_arguments.dm"
#include "dcs_get_id_from_elements.dm"

View File

@@ -0,0 +1,11 @@
/datum/unit_test/mech_construction/Run()
var/failed = FALSE
for(var/datum/construction/C as anything in subtypesof(/datum/construction))
// We check for null, as null is legal here... For now... Mech construction needs a full refactor to make them unittest-able in a not ugly way.
if(!C.result)
continue
if(!ispath(C.result))
TEST_NOTICE(src, "[C.type]: Mech Construction - Had invalid result \"[C.result]\", must be a path.")
failed = TRUE
if(failed)
TEST_FAIL("Mech Construction - A construction datum had incorrect data.")

View File

@@ -30,10 +30,10 @@
if(!L.permit_healbelly && is_beneficial) // Healing reagents turned off in preferences!
continue
if(reagents.total_volume)
reagents.trans_to(L, affecting_amt, 1, FALSE)
reagents.splash_mob(L, affecting_amt, FALSE)
if(L.permit_healbelly && digest_mode == DM_HEAL)
if(is_beneficial && reagents.total_volume)
reagents.trans_to(L, affecting_amt, 1, FALSE)
reagents.splash_mob(L, affecting_amt, FALSE)
for(var/obj/item/I in touchable_atoms)
if(is_type_in_list(I, GLOB.item_digestion_blacklist))
continue

View File

@@ -572,10 +572,10 @@
var/obj/item/I = thing
startfx.Add(get_belly_surrounding(I.contents))
for(var/mob/living/M in startfx) // End of indirect vorefx changes
M.updateVRPanel()
for(var/mob/living/living_mob in startfx) // End of indirect vorefx changes
living_mob.updateVRPanel()
var/raw_desc //Let's use this to avoid needing to write the reformat code twice
if(absorbed_desc && M.absorbed)
if(absorbed_desc && living_mob.absorbed)
raw_desc = absorbed_desc
else if(desc)
raw_desc = desc
@@ -583,21 +583,21 @@
//Was there a description text? If so, it's time to format it!
if(raw_desc)
//Replace placeholder vars
to_chat(M, span_vnotice(span_bold("[belly_format_string(raw_desc, M)]")))
to_chat(living_mob, span_vnotice(span_bold("[belly_format_string(raw_desc, living_mob)]")))
var/taste
if(can_taste && M.loc == src && (taste = M.get_taste_message(FALSE))) // Prevent indirect tasting
to_chat(owner, span_vnotice("[M] tastes of [taste]."))
vore_fx(M, TRUE)
if(can_taste && living_mob.loc == src && (taste = living_mob.get_taste_message(FALSE))) // Prevent indirect tasting
to_chat(owner, span_vnotice("[living_mob] tastes of [taste]."))
vore_fx(living_mob, TRUE)
if(owner.previewing_belly == src)
vore_fx(owner, TRUE)
//Stop AI processing in bellies
if(M.ai_holder)
M.ai_holder.go_sleep()
if(living_mob.ai_holder)
living_mob.ai_holder.go_sleep()
if(reagents.total_volume >= 5)
if(digest_mode == DM_DIGEST && M.digestable)
reagents.trans_to(M, reagents.total_volume * 0.1, 1 / max(LAZYLEN(contents), 1), FALSE)
to_chat(M, span_vwarning(span_bold("You splash into a pool of [reagent_name]!")))
if(digest_mode == DM_DIGEST && living_mob.digestable)
reagents.splash_mob(living_mob, reagents.total_volume * 0.1, FALSE)
to_chat(living_mob, span_vwarning(span_bold("You splash into a pool of [reagent_name]!")))
if(!isliving(thing) && count_items_for_sprite) // If this is enabled also update fullness for non-living things
owner.handle_belly_update() // This is run whenever a belly's contents are changed.

View File

@@ -210,7 +210,7 @@
H.forced_psay = FALSE
//Worn items flag
if(mode_flags & DM_FLAG_AFFECTWORN)
if((mode_flags & DM_FLAG_AFFECTWORN) && H.contaminate_pref)
for(var/slot in slots)
var/obj/item/I = H.get_equipped_item(slot = slot)
if(I && I.canremove)

View File

@@ -1059,10 +1059,13 @@
dat += span_bold("Affected by temperature:") + " [allowtemp ? span_green("Enabled") : span_red("Disabled")]<br>"
dat += span_bold("Autotransferable:") + " [autotransferable ? span_green("Enabled") : span_red("Disabled")]<br>"
dat += span_bold("Can be stripped:") + " [strip_pref ? span_green("Allowed") : span_red("Disallowed")]<br>"
dat += span_bold("Worn items can be contaminated:") + " [contaminate_pref ? span_green("Allowed") : span_red("Disallowed")]<br>"
dat += span_bold("Applying reagents:") + " [apply_reagents ? span_green("Allowed") : span_red("Disallowed")]<br>"
dat += span_bold("Leaves Remains:") + " [digest_leave_remains ? span_green("Enabled") : span_red("Disabled")]<br>"
dat += span_bold("Spontaneous vore prey:") + " [can_be_drop_prey ? span_green("Enabled") : span_red("Disabled")]<br>"
dat += span_bold("Spontaneous vore prey:") + " [can_be_drop_prey ? span_green("Enabled") : span_red("Disabled")]<br>"
dat += span_bold("AFK/Disconnected vore prey:") + " [can_be_afk_prey ? span_green("Enabled") : span_red("Disabled")]<br>"
dat += span_bold("Spontaneous vore pred:") + " [can_be_drop_pred ? span_green("Enabled") : span_red("Disabled")]<br>"
dat += span_bold("AFK/Disconnected vore pred:") + " [can_be_afk_pred ? span_green("Enabled") : span_red("Disabled")]<br>"
if(can_be_drop_prey || can_be_drop_pred)
dat += span_bold("Drop Vore:") + " [drop_vore ? span_green("Enabled") : span_red("Disabled")]<br>"
dat += span_bold("Slip Vore:") + " [slip_vore ? span_green("Enabled") : span_red("Disabled")]<br>"

View File

@@ -23,6 +23,8 @@
var/digest_pain = TRUE
var/can_be_drop_prey = FALSE
var/can_be_drop_pred = FALSE
var/can_be_afk_prey = TRUE
var/can_be_afk_pred = TRUE
var/allow_spontaneous_tf = FALSE // Obviously.
var/show_vore_fx = TRUE // Show belly fullscreens
var/selective_preference = DM_DEFAULT // Preference for selective bellymode
@@ -80,6 +82,7 @@
var/noisy_full = FALSE //Enables belching when a mob has overeaten
var/phase_vore = TRUE //Enabled by default since you have to enable drop pred/prey to do this anyway
var/strip_pref = TRUE //Enables the ability for worn items to be stripped
var/contaminate_pref = TRUE //Enables the ability for worn items to be digested/contaminated.
var/no_latejoin_vore_warning = FALSE //Auto accepts pred spwan notifications (roundbased / saveable)
var/no_latejoin_prey_warning = FALSE //Auto accepts prey spawn notifications (roundbased / saveable)
var/no_latejoin_vore_warning_time = 15 //Time until accepting prey

View File

@@ -12,6 +12,8 @@
"show_vore_fx" = owner.show_vore_fx,
"can_be_drop_prey" = owner.can_be_drop_prey,
"can_be_drop_pred" = owner.can_be_drop_pred,
"can_be_afk_prey" = owner.can_be_afk_prey,
"can_be_afk_pred" = owner.can_be_afk_pred,
"latejoin_vore" = owner.latejoin_vore,
"latejoin_prey" = owner.latejoin_prey,
"no_spawnpred_warning" = owner.no_latejoin_vore_warning,
@@ -24,6 +26,7 @@
"step_mechanics_active" = owner.step_mechanics_pref,
"pickup_mechanics_active" = owner.pickup_pref,
"strip_mechanics_active" = owner.strip_pref,
"contaminate_worn_items" = owner.contaminate_pref,
"noisy" = owner.noisy,
//liquid belly prefs
"liq_rec" = owner.receive_reagents,

View File

@@ -186,4 +186,16 @@
if(prey.absorbed || pred.absorbed)
to_chat(user, span_vwarning("They aren't aren't in a state to be devoured."))
return FALSE
if(!pred.can_be_afk_pred && (!pred.client || pred.away_from_keyboard))
if(user == pred)
to_chat(user, span_vwarning("You aren't set as being able to pred while AFK"))
return FALSE
to_chat(user, span_vnotice("The predator prefers not to be fed while AFK"))
return FALSE
if(!prey.can_be_afk_prey && (!prey.client || prey.away_from_keyboard))
if(user == prey)
to_chat(user, span_vwarning("You aren't set as being able to prey while AFK"))
return FALSE
to_chat(user, span_vnotice("The prey prefers not to be eaten while AFK"))
return FALSE
return TRUE

View File

@@ -41,6 +41,8 @@
var/feeding = TRUE
var/can_be_drop_prey = FALSE
var/can_be_drop_pred = FALSE
var/can_be_afk_prey = FALSE
var/can_be_afk_pred = FALSE
var/allow_spontaneous_tf = FALSE
var/digest_leave_remains = FALSE
var/allowmobvore = TRUE
@@ -78,6 +80,7 @@
var/latejoin_prey = FALSE
var/autotransferable = TRUE
var/strip_pref = FALSE
var/contaminate_pref = TRUE
var/no_latejoin_vore_warning = FALSE // Only load, when... no_latejoin_vore_warning_persists
var/no_latejoin_prey_warning = FALSE // Only load, when... no_latejoin_vore_warning_persists
var/no_latejoin_vore_warning_time = 15 // Only load, when... no_latejoin_vore_warning_persists
@@ -203,6 +206,8 @@
show_vore_fx = json_from_file["show_vore_fx"]
can_be_drop_prey = json_from_file["can_be_drop_prey"]
can_be_drop_pred = json_from_file["can_be_drop_pred"]
can_be_afk_prey = json_from_file["can_be_afk_prey"]
can_be_afk_pred = json_from_file["can_be_afk_pred"]
allow_spontaneous_tf = json_from_file["allow_spontaneous_tf"]
step_mechanics_pref = json_from_file["step_mechanics_pref"]
pickup_pref = json_from_file["pickup_pref"]
@@ -234,6 +239,7 @@
autotransferable = json_from_file["autotransferable"]
vore_sprite_multiply = json_from_file["vore_sprite_multiply"]
strip_pref = json_from_file["strip_pref"]
contaminate_pref = json_from_file["contaminate_pref"]
no_latejoin_vore_warning_persists = json_from_file["no_latejoin_vore_warning_persists"]
if(no_latejoin_vore_warning_persists)
@@ -278,6 +284,10 @@
can_be_drop_prey = FALSE
if(isnull(can_be_drop_pred))
can_be_drop_pred = FALSE
if(isnull(can_be_afk_prey))
can_be_afk_prey = FALSE
if(isnull(can_be_afk_pred))
can_be_afk_pred = FALSE
if(isnull(allow_spontaneous_tf))
allow_spontaneous_tf = FALSE
if(isnull(step_mechanics_pref))
@@ -363,6 +373,8 @@
vore_sprite_multiply = list("stomach" = FALSE, "taur belly" = FALSE)
if(isnull(strip_pref))
strip_pref = TRUE
if(isnull(contaminate_pref))
contaminate_pref = TRUE
if(isnull(no_latejoin_vore_warning))
no_latejoin_vore_warning = FALSE
if(isnull(no_latejoin_prey_warning))
@@ -410,6 +422,8 @@
"show_vore_fx" = show_vore_fx,
"can_be_drop_prey" = can_be_drop_prey,
"can_be_drop_pred" = can_be_drop_pred,
"can_be_afk_prey" = can_be_afk_prey,
"can_be_afk_pred" = can_be_afk_pred,
"latejoin_vore" = latejoin_vore,
"latejoin_prey" = latejoin_prey,
"allow_spontaneous_tf" = allow_spontaneous_tf,
@@ -437,6 +451,7 @@
"allow_mimicry" = allow_mimicry,
"vore_sprite_multiply" = vore_sprite_multiply,
"strip_pref" = strip_pref,
"contaminate_pref" = contaminate_pref,
"no_latejoin_vore_warning" = no_latejoin_vore_warning,
"no_latejoin_prey_warning" = no_latejoin_prey_warning,
"no_latejoin_vore_warning_time" = no_latejoin_vore_warning_time,

Some files were not shown because too many files have changed in this diff Show More