Merge branch 'master' of https://github.com/Citadel-Station-13/Citadel-Station-13 into Ghommie-cit265
This commit is contained in:
@@ -37308,7 +37308,6 @@
|
||||
/obj/item/clothing/accessory/armband/deputy,
|
||||
/obj/item/clothing/accessory/armband/deputy,
|
||||
/obj/item/clothing/accessory/armband/deputy,
|
||||
/obj/item/reagent_containers/food/snacks/donut/jelly/cherryjelly,
|
||||
/obj/effect/turf_decal/tile/red{
|
||||
dir = 1
|
||||
},
|
||||
|
||||
@@ -12,6 +12,7 @@
|
||||
#define APPRENTICE_BLUESPACE "bluespace"
|
||||
#define APPRENTICE_ROBELESS "robeless"
|
||||
#define APPRENTICE_HEALING "healing"
|
||||
#define APPRENTICE_MARTIAL "martial"
|
||||
|
||||
|
||||
//ERT Types
|
||||
|
||||
@@ -11,6 +11,7 @@
|
||||
#define GROSS (1<<10)
|
||||
#define TOXIC (1<<11)
|
||||
#define PINEAPPLE (1<<12)
|
||||
#define BREAKFAST (1<<13)
|
||||
|
||||
#define DRINK_NICE 1
|
||||
#define DRINK_GOOD 2
|
||||
|
||||
@@ -118,6 +118,8 @@ GLOBAL_LIST_INIT(turfs_without_ground, typecacheof(list(
|
||||
|
||||
#define ismouse(A) (istype(A, /mob/living/simple_animal/mouse))
|
||||
|
||||
#define iscow(A) (istype(A, /mob/living/simple_animal/cow))
|
||||
|
||||
#define isslime(A) (istype(A, /mob/living/simple_animal/slime))
|
||||
|
||||
#define isdrone(A) (istype(A, /mob/living/simple_animal/drone))
|
||||
|
||||
@@ -59,11 +59,13 @@
|
||||
#define LIGHT_RANGE_FIRE 3 //How many tiles standard fires glow.
|
||||
|
||||
#define LIGHTING_PLANE_ALPHA_VISIBLE 255
|
||||
#define LIGHTING_PLANE_ALPHA_NV_TRAIT 250
|
||||
#define LIGHTING_PLANE_ALPHA_NV_TRAIT 223
|
||||
#define LIGHTING_PLANE_ALPHA_MOSTLY_VISIBLE 192
|
||||
#define LIGHTING_PLANE_ALPHA_MOSTLY_INVISIBLE 128 //For lighting alpha, small amounts lead to big changes. even at 128 its hard to figure out what is dark and what is light, at 64 you almost can't even tell.
|
||||
#define LIGHTING_PLANE_ALPHA_INVISIBLE 0
|
||||
|
||||
#define NIGHT_VISION_DARKSIGHT_RANGE 3
|
||||
|
||||
//lighting area defines
|
||||
#define DYNAMIC_LIGHTING_DISABLED 0 //dynamic lighting disabled (area stays at full brightness)
|
||||
#define DYNAMIC_LIGHTING_ENABLED 1 //dynamic lighting enabled
|
||||
@@ -80,4 +82,4 @@
|
||||
|
||||
#define FLASH_LIGHT_DURATION 2
|
||||
#define FLASH_LIGHT_POWER 3
|
||||
#define FLASH_LIGHT_RANGE 3.8
|
||||
#define FLASH_LIGHT_RANGE 3.8
|
||||
|
||||
@@ -57,6 +57,7 @@
|
||||
|
||||
#define MOVESPEED_ID_PRONE_DRAGGING "PRONE_DRAG"
|
||||
#define MOVESPEED_ID_HUMAN_CARRYING "HUMAN_CARRY"
|
||||
#define MOVESPEED_ID_SHRINK_RAY "SHRUNKEN_SPEED_MODIFIER"
|
||||
|
||||
#define MOVESPEED_ID_TASED_STATUS "TASED"
|
||||
|
||||
|
||||
@@ -118,6 +118,7 @@
|
||||
#define TRAIT_PARALYSIS_R_ARM "para-r-arm"
|
||||
#define TRAIT_PARALYSIS_L_LEG "para-l-leg"
|
||||
#define TRAIT_PARALYSIS_R_LEG "para-r-leg"
|
||||
#define TRAIT_DISK_VERIFIER "disk-verifier"
|
||||
#define TRAIT_UNINTELLIGIBLE_SPEECH "unintelligible-speech"
|
||||
#define TRAIT_SOOTHED_THROAT "soothed-throat"
|
||||
#define TRAIT_LAW_ENFORCEMENT_METABOLISM "law-enforcement-metabolism"
|
||||
@@ -227,3 +228,5 @@
|
||||
#define SLEEPING_CARP_TRAIT "sleeping_carp"
|
||||
#define ABDUCTOR_ANTAGONIST "abductor-antagonist"
|
||||
#define MADE_UNCLONEABLE "made-uncloneable"
|
||||
#define NUKEOP_TRAIT "nuke-op"
|
||||
#define DEATHSQUAD_TRAIT "deathsquad"
|
||||
|
||||
@@ -320,6 +320,8 @@
|
||||
parts += "[FOURSPACES][FOURSPACES][str]"
|
||||
for(var/entry in mode.threat_tallies)
|
||||
parts += "[FOURSPACES][FOURSPACES][entry] added [mode.threat_tallies[entry]]"
|
||||
SSblackbox.record_feedback("tally","dynamic_threat",mode.threat_level,"Final threat level")
|
||||
SSblackbox.record_feedback("tally","dynamic_threat",mode.threat,"Threat left")
|
||||
return parts.Join("<br>")
|
||||
|
||||
/client/proc/roundend_report_file()
|
||||
|
||||
+475
-475
File diff suppressed because it is too large
Load Diff
@@ -213,6 +213,16 @@ or something covering your eyes."
|
||||
desc = "Whoa man, you're tripping balls! Careful you don't get addicted... if you aren't already."
|
||||
icon_state = "high"
|
||||
|
||||
/obj/screen/alert/mind_control
|
||||
name = "Mind Control"
|
||||
desc = "Your mind has been hijacked! Click to view the mind control command."
|
||||
icon_state = "mind_control"
|
||||
var/command
|
||||
|
||||
/obj/screen/alert/mind_control/Click()
|
||||
var/mob/living/L = usr
|
||||
to_chat(L, "<span class='mind_control'>[command]</span>")
|
||||
|
||||
/obj/screen/alert/hypnosis
|
||||
name = "Hypnosis"
|
||||
desc = "Something's hypnotizing you, but you're not really sure about what."
|
||||
|
||||
@@ -379,3 +379,10 @@
|
||||
/datum/config_entry/number/auto_transfer_delay
|
||||
config_entry_value = 72000
|
||||
min_val = 0
|
||||
|
||||
/datum/config_entry/number/marauder_delay_non_reebe
|
||||
config_entry_value = 1800
|
||||
min_val = 0
|
||||
|
||||
/datum/config_entry/flag/allow_clockwork_marauder_on_station
|
||||
config_entry_value = TRUE
|
||||
|
||||
@@ -12,6 +12,7 @@ SUBSYSTEM_DEF(persistence)
|
||||
var/list/obj/structure/chisel_message/chisel_messages = list()
|
||||
var/list/saved_messages = list()
|
||||
var/list/saved_modes = list(1,2,3)
|
||||
var/list/saved_dynamic_rules = list(list(),list(),list())
|
||||
var/list/saved_threat_levels = list(1,1,1)
|
||||
var/list/saved_maps
|
||||
var/list/saved_trophies = list()
|
||||
@@ -227,7 +228,10 @@ SUBSYSTEM_DEF(persistence)
|
||||
CollectSecretSatchels()
|
||||
CollectTrophies()
|
||||
CollectRoundtype()
|
||||
CollectThreatLevel()
|
||||
if(istype(SSticker.mode, /datum/game_mode/dynamic))
|
||||
var/datum/game_mode/dynamic/mode = SSticker.mode
|
||||
CollectThreatLevel(mode)
|
||||
CollectRulesets(mode)
|
||||
RecordMaps()
|
||||
SavePhotoPersistence() //THIS IS PERSISTENCE, NOT THE LOGGING PORTION.
|
||||
if(CONFIG_GET(flag/use_antag_rep))
|
||||
@@ -384,17 +388,27 @@ SUBSYSTEM_DEF(persistence)
|
||||
fdel(json_file)
|
||||
WRITE_FILE(json_file, json_encode(file_data))
|
||||
|
||||
/datum/controller/subsystem/persistence/proc/CollectThreatLevel()
|
||||
if(istype(SSticker.mode, /datum/game_mode/dynamic))
|
||||
var/datum/game_mode/dynamic/mode = SSticker.mode
|
||||
saved_threat_levels[3] = saved_threat_levels[2]
|
||||
saved_threat_levels[2] = saved_threat_levels [1]
|
||||
saved_threat_levels[1] = mode.threat_level
|
||||
var/json_file = file("data/RecentThreatLevels.json")
|
||||
var/list/file_data = list()
|
||||
file_data["data"] = saved_threat_levels
|
||||
fdel(json_file)
|
||||
WRITE_FILE(json_file, json_encode(file_data))
|
||||
/datum/controller/subsystem/persistence/proc/CollectThreatLevel(var/datum/game_mode/dynamic/mode)
|
||||
saved_threat_levels[3] = saved_threat_levels[2]
|
||||
saved_threat_levels[2] = saved_threat_levels [1]
|
||||
saved_threat_levels[1] = mode.threat_level
|
||||
var/json_file = file("data/RecentThreatLevels.json")
|
||||
var/list/file_data = list()
|
||||
file_data["data"] = saved_threat_levels
|
||||
fdel(json_file)
|
||||
WRITE_FILE(json_file, json_encode(file_data))
|
||||
|
||||
/datum/controller/subsystem/persistence/proc/CollectRulesets(var/datum/game_mode/dynamic/mode)
|
||||
saved_dynamic_rules[3] = saved_dynamic_rules[2]
|
||||
saved_dynamic_rules[2] = saved_dynamic_rules[1]
|
||||
saved_dynamic_rules[1] = list()
|
||||
for(var/datum/dynamic_ruleset/ruleset in mode.executed_rules)
|
||||
saved_dynamic_rules[1] += ruleset.config_tag
|
||||
var/json_file = file("data/RecentRulesets.json")
|
||||
var/list/file_data = list()
|
||||
file_data["data"] = saved_dynamic_rules
|
||||
fdel(json_file)
|
||||
WRITE_FILE(json_file, json_encode(file_data))
|
||||
|
||||
/datum/controller/subsystem/persistence/proc/RecordMaps()
|
||||
saved_maps = saved_maps?.len ? list("[SSmapping.config.map_name]") | saved_maps : list("[SSmapping.config.map_name]")
|
||||
|
||||
@@ -93,7 +93,7 @@ SUBSYSTEM_DEF(traumas)
|
||||
/obj/item/clothing/under/rank/head_of_security/grey, /obj/item/clothing/under/rank/head_of_security/alt,
|
||||
/obj/item/clothing/under/rank/research_director/alt, /obj/item/clothing/under/rank/research_director/turtleneck,
|
||||
/obj/item/clothing/under/captainparade, /obj/item/clothing/under/hosparademale, /obj/item/clothing/under/hosparadefem,
|
||||
/obj/item/clothing/head/helmet/abductor, /obj/item/clothing/suit/armor/abductor/vest, /obj/item/abductor_baton,
|
||||
/obj/item/clothing/head/helmet/abductor, /obj/item/clothing/suit/armor/abductor/vest, /obj/item/abductor/baton,
|
||||
/obj/item/storage/belt/military/abductor, /obj/item/gun/energy/alien, /obj/item/abductor/silencer,
|
||||
/obj/item/abductor/gizmo, /obj/item/clothing/under/rank/centcom_officer,
|
||||
/obj/item/clothing/suit/space/hardsuit/ert, /obj/item/clothing/suit/space/hardsuit/ert/sec,
|
||||
@@ -136,7 +136,7 @@ SUBSYSTEM_DEF(traumas)
|
||||
"aliens" = typecacheof(list(/obj/item/clothing/mask/facehugger, /obj/item/organ/body_egg/alien_embryo,
|
||||
/obj/structure/alien, /obj/item/toy/toy_xeno,
|
||||
/obj/item/clothing/suit/armor/abductor, /obj/item/abductor, /obj/item/gun/energy/alien,
|
||||
/obj/item/abductor_baton, /obj/item/radio/headset/abductor, /obj/item/scalpel/alien, /obj/item/hemostat/alien,
|
||||
/obj/item/abductor/baton, /obj/item/radio/headset/abductor, /obj/item/scalpel/alien, /obj/item/hemostat/alien,
|
||||
/obj/item/retractor/alien, /obj/item/circular_saw/alien, /obj/item/surgicaldrill/alien, /obj/item/cautery/alien,
|
||||
/obj/item/clothing/head/helmet/abductor, /obj/structure/bed/abductor, /obj/structure/table_frame/abductor,
|
||||
/obj/structure/table/abductor, /obj/structure/table/optable/abductor, /obj/structure/closet/abductor, /obj/item/organ/heart/gland,
|
||||
|
||||
@@ -0,0 +1,42 @@
|
||||
/datum/component/shrink
|
||||
var/olddens
|
||||
var/oldopac
|
||||
dupe_mode = COMPONENT_DUPE_HIGHLANDER
|
||||
|
||||
/datum/component/shrink/Initialize(shrink_time)
|
||||
if(!isatom(parent))
|
||||
return COMPONENT_INCOMPATIBLE
|
||||
var/atom/parent_atom = parent
|
||||
parent_atom.transform = parent_atom.transform.Scale(0.5,0.5)
|
||||
olddens = parent_atom.density
|
||||
oldopac = parent_atom.opacity
|
||||
parent_atom.density = 0
|
||||
parent_atom.opacity = 0
|
||||
if(isliving(parent_atom))
|
||||
var/mob/living/L = parent_atom
|
||||
L.add_movespeed_modifier(MOVESPEED_ID_SHRINK_RAY, update=TRUE, priority=100, multiplicative_slowdown=4)
|
||||
if(iscarbon(L))
|
||||
var/mob/living/carbon/C = L
|
||||
C.unequip_everything()
|
||||
C.visible_message("<span class='warning'>[C]'s belongings fall off of [C.p_them()] as they shrink down!</span>",
|
||||
"<span class='userdanger'>Your belongings fall away as everything grows bigger!</span>")
|
||||
if(ishuman(C))
|
||||
var/mob/living/carbon/human/H = C
|
||||
H.physiology.damage_resistance -= 100//carbons take double damage while shrunk
|
||||
parent_atom.visible_message("<span class='warning'>[parent_atom] shrinks down to a tiny size!</span>",
|
||||
"<span class='userdanger'>Everything grows bigger!</span>")
|
||||
QDEL_IN(src, shrink_time)
|
||||
|
||||
|
||||
/datum/component/shrink/Destroy()
|
||||
var/atom/parent_atom = parent
|
||||
parent_atom.transform = parent_atom.transform.Scale(2,2)
|
||||
parent_atom.density = olddens
|
||||
parent_atom.opacity = oldopac
|
||||
if(isliving(parent_atom))
|
||||
var/mob/living/L = parent_atom
|
||||
L.remove_movespeed_modifier(MOVESPEED_ID_SHRINK_RAY)
|
||||
if(ishuman(L))
|
||||
var/mob/living/carbon/human/H = L
|
||||
H.physiology.damage_resistance += 100
|
||||
..()
|
||||
@@ -0,0 +1,25 @@
|
||||
/datum/component/sizzle
|
||||
var/mutable_appearance/sizzling
|
||||
var/sizzlealpha = 0
|
||||
dupe_mode = COMPONENT_DUPE_UNIQUE_PASSARGS
|
||||
|
||||
/datum/component/sizzle/Initialize()
|
||||
if(!isatom(parent))
|
||||
return COMPONENT_INCOMPATIBLE
|
||||
setup_sizzle()
|
||||
|
||||
/datum/component/sizzle/InheritComponent(datum/component/C, i_am_original)
|
||||
var/atom/food = parent
|
||||
sizzlealpha += 5
|
||||
sizzling.alpha = sizzlealpha
|
||||
food.cut_overlay(sizzling)
|
||||
food.add_overlay(sizzling)
|
||||
|
||||
/datum/component/sizzle/proc/setup_sizzle()
|
||||
var/atom/food = parent
|
||||
var/icon/grill_marks = icon(initial(food.icon), initial(food.icon_state)) //we only want to apply grill marks to the initial icon_state for each object
|
||||
grill_marks.Blend("#fff", ICON_ADD) //fills the icon_state with white (except where it's transparent)
|
||||
grill_marks.Blend(icon('icons/obj/kitchen.dmi', "grillmarks"), ICON_MULTIPLY) //adds grill marks and the remaining white areas become transparent
|
||||
sizzling = new(grill_marks)
|
||||
sizzling.alpha = sizzlealpha
|
||||
food.add_overlay(sizzling)
|
||||
@@ -4,7 +4,7 @@
|
||||
mid_sounds = list('sound/machines/shower/shower_mid1.ogg'=1,'sound/machines/shower/shower_mid2.ogg'=1,'sound/machines/shower/shower_mid3.ogg'=1)
|
||||
mid_length = 10
|
||||
end_sound = 'sound/machines/shower/shower_end.ogg'
|
||||
volume = 20
|
||||
volume = 10
|
||||
|
||||
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
@@ -32,7 +32,7 @@
|
||||
mid_sounds = list('sound/machines/fryer/deep_fryer_1.ogg' = 1, 'sound/machines/fryer/deep_fryer_2.ogg' = 1)
|
||||
mid_length = 2
|
||||
end_sound = 'sound/machines/fryer/deep_fryer_emerge.ogg'
|
||||
volume = 15
|
||||
volume = 5
|
||||
|
||||
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
@@ -43,3 +43,12 @@
|
||||
mid_length = 10
|
||||
end_sound = 'sound/machines/microwave/microwave-end.ogg'
|
||||
volume = 90
|
||||
|
||||
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
/datum/looping_sound/grill
|
||||
mid_length = 2
|
||||
mid_sounds = list('sound/machines/fryer/deep_fryer_1.ogg' = 1, 'sound/machines/fryer/deep_fryer_2.ogg' = 1)
|
||||
volume = 10
|
||||
|
||||
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
||||
@@ -134,6 +134,12 @@
|
||||
mood_change = 3
|
||||
timeout = 3000
|
||||
|
||||
/datum/mood_event/breakfast
|
||||
description = "<span class='nicegreen'>Nothing like a hearty breakfast to start the shift.</span>\n"
|
||||
mood_change = 2
|
||||
timeout = 15 MINUTES
|
||||
|
||||
//Power gamer stuff below
|
||||
/datum/mood_event/drankblood
|
||||
description = "<span class='nicegreen'>I have fed greedly from that which nourishes me.</span>\n"
|
||||
mood_change = 10
|
||||
@@ -143,6 +149,7 @@
|
||||
description = "<span class='nicegreen'>I slept in a coffin during the day. I feel whole again.</span>\n"
|
||||
mood_change = 8
|
||||
timeout = 1200
|
||||
|
||||
//Cursed stuff below.
|
||||
|
||||
/datum/mood_event/orgasm
|
||||
|
||||
@@ -208,3 +208,15 @@
|
||||
/datum/quirk/bloodpressure/remove()
|
||||
var/mob/living/M = quirk_holder
|
||||
M.blood_ratio = 1
|
||||
|
||||
/datum/quirk/night_vision
|
||||
name = "Night Vision"
|
||||
desc = "You can see slightly more clearly in full darkness than most people."
|
||||
value = 1
|
||||
mob_trait = TRAIT_NIGHT_VISION
|
||||
gain_text = "<span class='notice'>The shadows seem a little less dark.</span>"
|
||||
lose_text = "<span class='danger'>Everything seems a little darker.</span>"
|
||||
|
||||
/datum/quirk/night_vision/on_spawn()
|
||||
var/mob/living/carbon/human/H = quirk_holder
|
||||
H.update_sight()
|
||||
|
||||
@@ -300,6 +300,7 @@ GLOBAL_VAR_INIT(dynamic_forced_threat_level, -1)
|
||||
|
||||
/datum/game_mode/dynamic/proc/log_threat(var/log_str,var/verbose = FALSE)
|
||||
threat_log_verbose += ("[worldtime2text()]: "+log_str)
|
||||
SSblackbox.record_feedback("tally","dynamic_threat_log",1,log_str)
|
||||
if(!verbose)
|
||||
threat_log += log_str
|
||||
|
||||
@@ -329,6 +330,10 @@ GLOBAL_VAR_INIT(dynamic_forced_threat_level, -1)
|
||||
peaceful_percentage = round(LORENTZ_CUMULATIVE_DISTRIBUTION(relative_threat, GLOB.dynamic_curve_centre, GLOB.dynamic_curve_width), 0.01)*100
|
||||
|
||||
threat = threat_level
|
||||
SSblackbox.record_feedback("tally","dynamic_threat",threat_level,"Initial threat level")
|
||||
SSblackbox.record_feedback("tally","dynamic_threat",GLOB.dynamic_curve_centre,"Curve centre")
|
||||
SSblackbox.record_feedback("tally","dynamic_threat",GLOB.dynamic_curve_width,"Curve width")
|
||||
SSblackbox.record_feedback("tally","dynamic_threat",peaceful_percentage,"Percent of same-vote rounds that are more peaceful")
|
||||
|
||||
/datum/game_mode/dynamic/can_start()
|
||||
message_admins("Dynamic mode parameters for the round:")
|
||||
@@ -340,6 +345,7 @@ GLOBAL_VAR_INIT(dynamic_forced_threat_level, -1)
|
||||
if(GLOB.dynamic_forced_threat_level >= 0)
|
||||
threat_level = round(GLOB.dynamic_forced_threat_level, 0.1)
|
||||
threat = threat_level
|
||||
SSblackbox.record_feedback("tally","dynamic_threat",threat_level,"Threat level (forced by admins)")
|
||||
else
|
||||
generate_threat()
|
||||
|
||||
@@ -384,7 +390,8 @@ GLOBAL_VAR_INIT(dynamic_forced_threat_level, -1)
|
||||
if (roundstart_rules.len <= 0)
|
||||
log_game("DYNAMIC: [roundstart_rules.len] rules.")
|
||||
return TRUE
|
||||
|
||||
SSblackbox.record_feedback("tally","dynamic",roundstart_rules.len,"Roundstart rules considered")
|
||||
SSblackbox.record_feedback("tally","dynamic",roundstart_rules.len,"Players readied up")
|
||||
if(GLOB.dynamic_forced_roundstart_ruleset.len > 0)
|
||||
rigged_roundstart()
|
||||
else
|
||||
@@ -537,6 +544,7 @@ GLOBAL_VAR_INIT(dynamic_forced_threat_level, -1)
|
||||
if(rule.execute())
|
||||
if(rule.persistent)
|
||||
current_rules += rule
|
||||
SSblackbox.record_feedback("associative","dynamic_rulesets",1,rule.get_blackbox_info())
|
||||
return TRUE
|
||||
rule.clean_up() // Refund threat, delete teams and so on.
|
||||
executed_rules -= rule
|
||||
@@ -615,6 +623,7 @@ GLOBAL_VAR_INIT(dynamic_forced_threat_level, -1)
|
||||
else if(new_rule.flags & ONLY_RULESET)
|
||||
only_ruleset_executed = TRUE
|
||||
log_game("DYNAMIC: Making a call to a specific ruleset...[new_rule.name]!")
|
||||
SSblackbox.record_feedback("associative","dynamic_rulesets",1,new_rule.get_blackbox_info())
|
||||
executed_rules += new_rule
|
||||
if (new_rule.persistent)
|
||||
current_rules += new_rule
|
||||
@@ -639,6 +648,7 @@ GLOBAL_VAR_INIT(dynamic_forced_threat_level, -1)
|
||||
message_admins("[key_name(M)] joined the station, and was selected by the [rule.name] ruleset.")
|
||||
log_game("DYNAMIC: [key_name(M)] joined the station, and was selected by the [rule.name] ruleset.")
|
||||
executed_rules += rule
|
||||
SSblackbox.record_feedback("associative","dynamic_rulesets",1,rule.get_blackbox_info())
|
||||
rule.candidates.Cut()
|
||||
if (rule.persistent)
|
||||
current_rules += rule
|
||||
@@ -655,6 +665,8 @@ GLOBAL_VAR_INIT(dynamic_forced_threat_level, -1)
|
||||
for (var/datum/dynamic_ruleset/rule in current_rules)
|
||||
if(rule.rule_process() == RULESET_STOP_PROCESSING) // If rule_process() returns 1 (RULESET_STOP_PROCESSING), stop processing.
|
||||
current_rules -= rule
|
||||
SSblackbox.record_feedback("tally","dynamic",1,"Rulesets finished")
|
||||
SSblackbox.record_feedback("associative","dynamic_rulesets_finished",1,rule.get_blackbox_info())
|
||||
|
||||
if (midround_injection_cooldown < world.time)
|
||||
if (GLOB.dynamic_forced_extended)
|
||||
@@ -673,6 +685,7 @@ GLOBAL_VAR_INIT(dynamic_forced_threat_level, -1)
|
||||
|
||||
update_playercounts()
|
||||
if (get_injection_chance())
|
||||
SSblackbox.record_feedback("tally","dynamic",1,"Attempted midround injections")
|
||||
var/cur_threat_frac = threat/threat_level
|
||||
var/list/drafted_rules = list()
|
||||
var/antag_num = current_players[CURRENT_LIVING_ANTAGS].len
|
||||
@@ -688,12 +701,16 @@ GLOBAL_VAR_INIT(dynamic_forced_threat_level, -1)
|
||||
drafted_rules[rule] = round(rule.get_weight() + (rule.cost * cur_threat_frac))
|
||||
else
|
||||
drafted_rules[rule] = rule.get_weight()
|
||||
else if(threat < rule.cost)
|
||||
SSblackbox.record_feedback("tally","dynamic",1,"Times rulesets rejected due to not enough threat to spend")
|
||||
if (drafted_rules.len > 0)
|
||||
SSblackbox.record_feedback("tally","dynamic",1,"Successful midround injections")
|
||||
picking_midround_latejoin_rule(drafted_rules)
|
||||
else
|
||||
midround_injection_cooldown = (midround_injection_cooldown + world.time)/2
|
||||
|
||||
if(event_injection_cooldown < world.time)
|
||||
SSblackbox.record_feedback("tally","dynamic",1,"Attempted event injections")
|
||||
var/event_injection_cooldown_middle = 0.5*(GLOB.dynamic_event_delay_max + GLOB.dynamic_event_delay_min)
|
||||
event_injection_cooldown = (round(CLAMP(EXP_DISTRIBUTION(event_injection_cooldown_middle), GLOB.dynamic_event_delay_min, GLOB.dynamic_event_delay_max)) + world.time)
|
||||
message_admins("DYNAMIC: Doing event injection.")
|
||||
@@ -704,7 +721,10 @@ GLOBAL_VAR_INIT(dynamic_forced_threat_level, -1)
|
||||
if(rule.acceptable(current_players[CURRENT_LIVING_PLAYERS].len, threat_level) && threat >= rule.cost)
|
||||
if(rule.ready())
|
||||
drafted_rules[rule] = rule.get_weight()
|
||||
else if(threat < rule.cost)
|
||||
SSblackbox.record_feedback("tally","dynamic",1,"Times rulesets rejected due to not enough threat to spend")
|
||||
if(drafted_rules.len > 0)
|
||||
SSblackbox.record_feedback("tally","dynamic",1,"Successful event injections")
|
||||
picking_midround_latejoin_rule(drafted_rules)
|
||||
|
||||
/// Updates current_players.
|
||||
@@ -795,6 +815,7 @@ GLOBAL_VAR_INIT(dynamic_forced_threat_level, -1)
|
||||
forced_latejoin_rule = null
|
||||
|
||||
else if (latejoin_injection_cooldown < world.time && prob(get_injection_chance()))
|
||||
SSblackbox.record_feedback("tally","dynamic",1,"Attempted latejoin injections")
|
||||
var/list/drafted_rules = list()
|
||||
for (var/datum/dynamic_ruleset/latejoin/rule in latejoin_rules)
|
||||
if (rule.acceptable(current_players[CURRENT_LIVING_PLAYERS].len, threat_level) && threat >= rule.cost)
|
||||
@@ -812,12 +833,14 @@ GLOBAL_VAR_INIT(dynamic_forced_threat_level, -1)
|
||||
drafted_rules[rule] = rule.get_weight()
|
||||
|
||||
if (drafted_rules.len > 0 && picking_midround_latejoin_rule(drafted_rules))
|
||||
SSblackbox.record_feedback("tally","dynamic",1,"Successful latejoin injections")
|
||||
var/latejoin_injection_cooldown_middle = 0.5*(GLOB.dynamic_latejoin_delay_max + GLOB.dynamic_latejoin_delay_min)
|
||||
latejoin_injection_cooldown = round(CLAMP(EXP_DISTRIBUTION(latejoin_injection_cooldown_middle), GLOB.dynamic_latejoin_delay_min, GLOB.dynamic_latejoin_delay_max)) + world.time
|
||||
|
||||
/// Refund threat, but no more than threat_level.
|
||||
/datum/game_mode/dynamic/proc/refund_threat(regain)
|
||||
threat = min(threat_level,threat+regain)
|
||||
SSblackbox.record_feedback("tally","dynamic_threat",regain,"Refunded threat")
|
||||
log_threat("[regain] refunded. Threat is now [threat].", verbose = TRUE)
|
||||
|
||||
/// Generate threat and increase the threat_level if it goes beyond, capped at 100
|
||||
@@ -825,11 +848,13 @@ GLOBAL_VAR_INIT(dynamic_forced_threat_level, -1)
|
||||
threat = min(100, threat+gain)
|
||||
if(threat > threat_level)
|
||||
threat_level = threat
|
||||
SSblackbox.record_feedback("tally","dynamic_threat",gain,"Created threat")
|
||||
log_threat("[gain] created. Threat is now [threat] and threat level is now [threat_level].", verbose = TRUE)
|
||||
|
||||
/// Expend threat, can't fall under 0.
|
||||
/datum/game_mode/dynamic/proc/spend_threat(cost)
|
||||
threat = max(threat-cost,0)
|
||||
SSblackbox.record_feedback("tally","dynamic_threat",cost,"Threat spent")
|
||||
log_threat("[cost] spent. Threat is now [threat].", verbose = TRUE)
|
||||
|
||||
/// Turns the value generated by lorentz distribution to threat value between 0 and 100.
|
||||
|
||||
@@ -80,6 +80,9 @@
|
||||
/// Delay for when execute will get called from the time of post_setup (roundstart) or process (midround/latejoin).
|
||||
/// Make sure your ruleset works with execute being called during the game when using this, and that the clean_up proc reverts it properly in case of faliure.
|
||||
var/delay = 0
|
||||
/// Whether or not recent-round weight values are taken into account for this ruleset.
|
||||
/// Weight reduction uses the same values as secret's recent-round mode weight reduction.
|
||||
var/always_max_weight = FALSE
|
||||
|
||||
/datum/dynamic_ruleset/New()
|
||||
..()
|
||||
@@ -91,8 +94,15 @@
|
||||
var/costs = CONFIG_GET(keyed_list/dynamic_cost)
|
||||
var/requirementses = CONFIG_GET(keyed_list/dynamic_requirements) // can't damn well use requirements
|
||||
var/high_population_requirements = CONFIG_GET(keyed_list/dynamic_high_population_requirement)
|
||||
var/list/repeated_mode_adjust = CONFIG_GET(number_list/repeated_mode_adjust)
|
||||
if(config_tag in weights)
|
||||
weight = weights[config_tag]
|
||||
var/weight_mult = 1
|
||||
if(!always_max_weight && SSpersistence.saved_dynamic_rules.len == 3 && repeated_mode_adjust.len == 3)
|
||||
var/saved_dynamic_rules = SSpersistence.saved_dynamic_rules
|
||||
for(var/i in 1 to 3)
|
||||
if(config_tag in saved_dynamic_rules[i])
|
||||
weight_mult -= (repeated_mode_adjust[i]/100)
|
||||
weight = weights[config_tag] * weight_mult
|
||||
if(config_tag in costs)
|
||||
cost = costs[config_tag]
|
||||
if(config_tag in requirementses)
|
||||
@@ -115,12 +125,15 @@
|
||||
/// If your rule has extra checks, such as counting security officers, do that in ready() instead
|
||||
/datum/dynamic_ruleset/proc/acceptable(population = 0, threat_level = 0)
|
||||
if(minimum_players > population)
|
||||
SSblackbox.record_feedback("tally","dynamic",1,"Times rulesets rejected due to low pop")
|
||||
return FALSE
|
||||
if(maximum_players > 0 && population > maximum_players)
|
||||
SSblackbox.record_feedback("tally","dynamic",1,"Times rulesets rejected due to high pop")
|
||||
return FALSE
|
||||
if (population >= GLOB.dynamic_high_pop_limit)
|
||||
indice_pop = 10
|
||||
if(threat_level < high_population_requirement)
|
||||
SSblackbox.record_feedback("tally","dynamic",1,"Times rulesets rejected due to not enough threat level")
|
||||
log_game("DYNAMIC: [name] did not reach threat level threshold: [threat_level]/[high_population_requirement]")
|
||||
return FALSE
|
||||
else
|
||||
@@ -132,6 +145,7 @@
|
||||
log_game("DYNAMIC: requirements and antag_cap lists have different lengths in ruleset [name]. Likely config issue, report this.")
|
||||
indice_pop = min(requirements.len,round(population/pop_per_requirement)+1)
|
||||
if(threat_level < requirements[indice_pop])
|
||||
SSblackbox.record_feedback("tally","dynamic",1,"Times rulesets rejected due to not enough threat level")
|
||||
log_game("DYNAMIC: [name] did not reach threat level threshold: [threat_level]/[requirements[indice_pop]]")
|
||||
return FALSE
|
||||
else
|
||||
@@ -178,6 +192,7 @@
|
||||
/// IMPORTANT: If ready() returns TRUE, that means pre_execute() or execute() should never fail!
|
||||
/datum/dynamic_ruleset/proc/ready(forced = 0)
|
||||
if (required_candidates > candidates.len)
|
||||
SSblackbox.record_feedback("tally","dynamic",1,"Times rulesets rejected due to not enough candidates")
|
||||
return FALSE
|
||||
return TRUE
|
||||
|
||||
@@ -212,6 +227,24 @@
|
||||
/datum/dynamic_ruleset/proc/check_finished()
|
||||
return FALSE
|
||||
|
||||
/// Returns a list to be displayed on statbus.
|
||||
/datum/dynamic_ruleset/proc/get_blackbox_info()
|
||||
var/list/ruleset_data = list()
|
||||
ruleset_data["name"] = name
|
||||
ruleset_data["rule_type"] = ruletype
|
||||
ruleset_data["cost"] = total_cost
|
||||
ruleset_data["weight"] = weight
|
||||
ruleset_data["scaled_times"] = scaled_times
|
||||
ruleset_data["antagonist_type"] = antag_datum
|
||||
ruleset_data["population_tier"] = indice_pop
|
||||
ruleset_data["assigned"] = list()
|
||||
for (var/datum/mind/M in assigned)
|
||||
var/assigned_data = list()
|
||||
assigned_data["key"] = M.key
|
||||
assigned_data["name"] = M.name
|
||||
ruleset_data["assigned"] += list(assigned_data)
|
||||
return ruleset_data
|
||||
|
||||
//////////////////////////////////////////////
|
||||
// //
|
||||
// ROUNDSTART RULESETS //
|
||||
|
||||
@@ -3,6 +3,17 @@
|
||||
var/typepath // typepath of the event
|
||||
var/triggering
|
||||
|
||||
/datum/dynamic_ruleset/event/get_blackbox_info()
|
||||
var/list/ruleset_data = list()
|
||||
ruleset_data["name"] = name
|
||||
ruleset_data["rule_type"] = ruletype
|
||||
ruleset_data["cost"] = total_cost
|
||||
ruleset_data["weight"] = weight
|
||||
ruleset_data["scaled_times"] = scaled_times
|
||||
ruleset_data["event_type"] = typepath
|
||||
ruleset_data["population_tier"] = indice_pop
|
||||
return ruleset_data
|
||||
|
||||
/datum/dynamic_ruleset/event/execute()
|
||||
var/datum/round_event/E = new typepath()
|
||||
E.current_players = get_active_player_count(alive_check = 1, afk_check = 1, human_check = 1)
|
||||
@@ -26,6 +37,7 @@
|
||||
|
||||
var/threat = round(mode.threat_level/10)
|
||||
if (job_check < required_enemies[threat])
|
||||
SSblackbox.record_feedback("tally","dynamic",1,"Times rulesets rejected due to not enough enemy roles")
|
||||
return FALSE
|
||||
return TRUE
|
||||
|
||||
@@ -125,6 +137,7 @@
|
||||
requirements = list(5,5,5,5,5,5,5,5,5,5)
|
||||
high_population_requirement = 5
|
||||
repeatable = TRUE
|
||||
always_max_weight = TRUE
|
||||
|
||||
//////////////////////////////////////////////
|
||||
// //
|
||||
@@ -146,12 +159,15 @@
|
||||
|
||||
/datum/dynamic_ruleset/event/meteor_wave/ready()
|
||||
if(mode.threat_level > 40 && mode.threat >= 25 && prob(20))
|
||||
name = "Meteor Wave: Threatening"
|
||||
cost = 25
|
||||
typepath = /datum/round_event/meteor_wave/threatening
|
||||
else if(mode.threat_level > 50 && mode.threat >= 40 && prob(30))
|
||||
name = "Meteor Wave: Catastrophic"
|
||||
cost = 40
|
||||
typepath = /datum/round_event/meteor_wave/catastrophic
|
||||
else
|
||||
name = "Meteor Wave: Normal"
|
||||
cost = 15
|
||||
typepath = /datum/round_event/meteor_wave
|
||||
return ..()
|
||||
@@ -280,6 +296,7 @@
|
||||
requirements = list(5,5,5,5,5,5,5,5,5,5)
|
||||
high_population_requirement = 5
|
||||
repeatable = TRUE
|
||||
always_max_weight = TRUE
|
||||
|
||||
/datum/dynamic_ruleset/event/space_dust
|
||||
name = "Minor Space Dust"
|
||||
@@ -293,6 +310,7 @@
|
||||
requirements = list(5,5,5,5,5,5,5,5,5,5)
|
||||
high_population_requirement = 5
|
||||
repeatable = TRUE
|
||||
always_max_weight = TRUE
|
||||
|
||||
/datum/dynamic_ruleset/event/major_dust
|
||||
name = "Major Space Dust"
|
||||
@@ -332,6 +350,7 @@
|
||||
requirements = list(101,101,101,5,5,5,5,5,5,5)
|
||||
high_population_requirement = 5
|
||||
repeatable = TRUE
|
||||
always_max_weight = TRUE
|
||||
|
||||
/datum/dynamic_ruleset/event/radiation_storm
|
||||
name = "Radiation Storm"
|
||||
|
||||
@@ -36,9 +36,9 @@
|
||||
continue // Dead players cannot count as opponents
|
||||
if (M.mind && M.mind.assigned_role && (M.mind.assigned_role in enemy_roles) && (!(M in candidates) || (M.mind.assigned_role in restricted_roles)))
|
||||
job_check++ // Checking for "enemies" (such as sec officers). To be counters, they must either not be candidates to that rule, or have a job that restricts them from it
|
||||
|
||||
var/threat = round(mode.threat_level/10)
|
||||
if (job_check < required_enemies[threat])
|
||||
SSblackbox.record_feedback("tally","dynamic",1,"Times rulesets rejected due to not enough enemy roles")
|
||||
return FALSE
|
||||
return ..()
|
||||
|
||||
@@ -69,6 +69,7 @@
|
||||
high_population_requirement = 15
|
||||
repeatable = TRUE
|
||||
flags = TRAITOR_RULESET
|
||||
always_max_weight = TRUE
|
||||
|
||||
//////////////////////////////////////////////
|
||||
// //
|
||||
|
||||
@@ -87,6 +87,7 @@
|
||||
|
||||
var/threat = round(mode.threat_level/10)
|
||||
if (job_check < required_enemies[threat])
|
||||
SSblackbox.record_feedback("tally","dynamic",1,"Times rulesets rejected due to not enough enemy roles")
|
||||
return FALSE
|
||||
return TRUE
|
||||
|
||||
@@ -179,6 +180,7 @@
|
||||
repeatable = TRUE
|
||||
high_population_requirement = 15
|
||||
flags = TRAITOR_RULESET
|
||||
always_max_weight = TRUE
|
||||
|
||||
/datum/dynamic_ruleset/midround/autotraitor/acceptable(population = 0, threat = 0)
|
||||
var/player_count = mode.current_players[CURRENT_LIVING_PLAYERS].len
|
||||
@@ -291,6 +293,7 @@
|
||||
|
||||
/datum/dynamic_ruleset/midround/from_ghosts/wizard/ready(forced = FALSE)
|
||||
if (required_candidates > (dead_players.len + list_observers.len))
|
||||
SSblackbox.record_feedback("tally","dynamic",1,"Times rulesets rejected due to not enough ghosts")
|
||||
return FALSE
|
||||
if(GLOB.wizardstart.len == 0)
|
||||
log_admin("Cannot accept Wizard ruleset. Couldn't find any wizard spawn points.")
|
||||
@@ -353,6 +356,7 @@
|
||||
|
||||
/datum/dynamic_ruleset/midround/from_ghosts/nuclear/ready(forced = FALSE)
|
||||
if (required_candidates > (dead_players.len + list_observers.len))
|
||||
SSblackbox.record_feedback("tally","dynamic",1,"Times rulesets rejected due to not enough ghosts")
|
||||
return FALSE
|
||||
return ..()
|
||||
|
||||
@@ -389,6 +393,7 @@
|
||||
|
||||
/datum/dynamic_ruleset/midround/from_ghosts/blob/ready(forced = FALSE)
|
||||
if (required_candidates > (dead_players.len + list_observers.len))
|
||||
SSblackbox.record_feedback("tally","dynamic",1,"Times rulesets rejected due to not enough ghosts")
|
||||
return FALSE
|
||||
return ..()
|
||||
|
||||
@@ -420,6 +425,7 @@
|
||||
|
||||
/datum/dynamic_ruleset/midround/from_ghosts/xenomorph/ready(forced = FALSE)
|
||||
if (required_candidates > (dead_players.len + list_observers.len))
|
||||
SSblackbox.record_feedback("tally","dynamic",1,"Times rulesets rejected due to not enough ghosts")
|
||||
return FALSE
|
||||
return ..()
|
||||
|
||||
@@ -519,6 +525,7 @@
|
||||
|
||||
/datum/dynamic_ruleset/midround/from_ghosts/sentient_disease/ready(forced = FALSE)
|
||||
if (required_candidates > (dead_players.len + list_observers.len))
|
||||
SSblackbox.record_feedback("tally","dynamic",1,"Times rulesets rejected due to not enough ghosts")
|
||||
return FALSE
|
||||
return ..()
|
||||
|
||||
@@ -557,6 +564,7 @@
|
||||
if(deadMobs < REVENANT_SPAWN_THRESHOLD)
|
||||
return FALSE
|
||||
if(required_candidates > (dead_players.len + list_observers.len))
|
||||
SSblackbox.record_feedback("tally","dynamic",1,"Times rulesets rejected due to not enough ghosts")
|
||||
return FALSE
|
||||
for(var/mob/living/L in GLOB.dead_mob_list) //look for any dead bodies
|
||||
var/turf/T = get_turf(L)
|
||||
@@ -604,6 +612,7 @@
|
||||
|
||||
/datum/dynamic_ruleset/midround/from_ghosts/slaughter_demon/ready(forced = FALSE)
|
||||
if(required_candidates > (dead_players.len + list_observers.len))
|
||||
SSblackbox.record_feedback("tally","dynamic",1,"Times rulesets rejected due to not enough ghosts")
|
||||
return FALSE
|
||||
for(var/obj/effect/landmark/carpspawn/L in GLOB.landmarks_list)
|
||||
if(isturf(L.loc))
|
||||
@@ -655,6 +664,7 @@
|
||||
|
||||
/datum/dynamic_ruleset/midround/from_ghosts/abductors/ready(forced = FALSE)
|
||||
if(required_candidates > (dead_players.len + list_observers.len))
|
||||
SSblackbox.record_feedback("tally","dynamic",1,"Times rulesets rejected due to not enough ghosts")
|
||||
return FALSE
|
||||
team = new /datum/team/abductor_team
|
||||
if(team.team_number > ABDUCTOR_MAX_TEAMS)
|
||||
@@ -694,6 +704,7 @@
|
||||
|
||||
/datum/dynamic_ruleset/midround/from_ghosts/ninja/ready(forced = FALSE)
|
||||
if(required_candidates > (dead_players.len + list_observers.len))
|
||||
SSblackbox.record_feedback("tally","dynamic",1,"Times rulesets rejected due to not enough ghosts")
|
||||
return FALSE
|
||||
if(!spawn_loc)
|
||||
var/list/spawn_locs = list()
|
||||
|
||||
@@ -21,6 +21,7 @@
|
||||
requirements = list(50,50,50,50,50,50,50,50,50,50)
|
||||
high_population_requirement = 40
|
||||
antag_cap = list(1,1,1,1,2,2,2,2,3,3)
|
||||
always_max_weight = TRUE
|
||||
var/autotraitor_cooldown = 450 // 15 minutes (ticks once per 2 sec)
|
||||
|
||||
/datum/dynamic_ruleset/roundstart/traitor/pre_execute()
|
||||
|
||||
@@ -70,7 +70,7 @@
|
||||
if(check_access(I))
|
||||
authenticated = 1
|
||||
auth_id = "[I.registered_name] ([I.assignment])"
|
||||
if((20 in I.access))
|
||||
if((ACCESS_CAPTAIN in I.access))
|
||||
authenticated = 2
|
||||
playsound(src, 'sound/machines/terminal_on.ogg', 50, 0)
|
||||
if(obj_flags & EMAGGED)
|
||||
@@ -279,7 +279,7 @@
|
||||
|
||||
// OMG CENTCOM LETTERHEAD
|
||||
if("MessageCentCom")
|
||||
if(authenticated==2)
|
||||
if(authenticated)
|
||||
if(!checkCCcooldown())
|
||||
to_chat(usr, "<span class='warning'>Arrays recycling. Please stand by.</span>")
|
||||
return
|
||||
|
||||
@@ -326,6 +326,9 @@
|
||||
|
||||
/obj/machinery/suit_storage_unit/attackby(obj/item/I, mob/user, params)
|
||||
if(state_open && is_operational())
|
||||
if(istype(I, /obj/item/clothing/head/mob_holder))
|
||||
to_chat(user, "<span class='warning'>You can't quite fit that in while you hold it!</span>")
|
||||
return
|
||||
if(istype(I, /obj/item/clothing/suit))
|
||||
if(suit)
|
||||
to_chat(user, "<span class='warning'>The unit already contains a suit!.</span>")
|
||||
@@ -437,4 +440,4 @@
|
||||
if(I)
|
||||
I.forceMove(loc)
|
||||
. = TRUE
|
||||
update_icon()
|
||||
update_icon()
|
||||
|
||||
@@ -219,6 +219,10 @@
|
||||
update_icon()
|
||||
return
|
||||
|
||||
if(istype(W, /obj/item/clothing/head/mob_holder))
|
||||
to_chat(user, "<span class='warning'>It's too unwieldly to put in this way.</span>")
|
||||
return 1
|
||||
|
||||
else if(user.a_intent != INTENT_HARM)
|
||||
|
||||
if (!state_open)
|
||||
|
||||
@@ -72,6 +72,11 @@
|
||||
desc = "It's still good. Four second rule!"
|
||||
icon_state = "flour"
|
||||
|
||||
/obj/effect/decal/cleanable/greenglow/ecto
|
||||
name = "ectoplasmic puddle"
|
||||
desc = "You know who to call."
|
||||
light_power = 2
|
||||
|
||||
/obj/effect/decal/cleanable/greenglow
|
||||
name = "glowing goo"
|
||||
desc = "Jeez. I hope that's not for lunch."
|
||||
|
||||
@@ -165,7 +165,7 @@
|
||||
/obj/item/organ/heart/gland/chem = 5,
|
||||
/obj/item/organ/heart/gland/mindshock = 5,
|
||||
/obj/item/organ/heart/gland/plasma = 7,
|
||||
/obj/item/organ/heart/gland/pop = 5,
|
||||
/obj/item/organ/heart/gland/transform = 5,
|
||||
/obj/item/organ/heart/gland/slime = 4,
|
||||
/obj/item/organ/heart/gland/spiderman = 5,
|
||||
/obj/item/organ/heart/gland/ventcrawling = 1,
|
||||
|
||||
@@ -349,6 +349,10 @@
|
||||
icon_state = "impact_laser_purple"
|
||||
duration = 4
|
||||
|
||||
/obj/effect/temp_visual/impact_effect/shrink
|
||||
icon_state = "m_shield"
|
||||
duration = 10
|
||||
|
||||
/obj/effect/temp_visual/impact_effect/ion
|
||||
icon_state = "shieldsparkles"
|
||||
duration = 6
|
||||
|
||||
@@ -665,6 +665,13 @@
|
||||
name = "Booze Dispenser (Machine Board)"
|
||||
build_path = /obj/machinery/chem_dispenser/drinks/beer
|
||||
|
||||
/obj/item/circuitboard/machine/chem_dispenser/abductor
|
||||
name = "Reagent Synthetizer (Abductor Machine Board)"
|
||||
icon_state = "abductor_mod"
|
||||
build_path = /obj/machinery/chem_dispenser/abductor
|
||||
def_components = list(/obj/item/stock_parts/cell = /obj/item/stock_parts/cell/high)
|
||||
needs_anchored = FALSE
|
||||
|
||||
/obj/item/circuitboard/machine/smoke_machine
|
||||
name = "Smoke Machine (Machine Board)"
|
||||
build_path = /obj/machinery/smoke_machine
|
||||
|
||||
@@ -76,7 +76,7 @@ GLOBAL_LIST_EMPTY(possible_gifts)
|
||||
/obj/item/clothing/suit/poncho/red,
|
||||
/obj/item/clothing/suit/snowman,
|
||||
/obj/item/clothing/head/snowman,
|
||||
/obj/item/trash/coal)
|
||||
/obj/item/stack/sheet/mineral/coal)
|
||||
|
||||
gift_type_list += subtypesof(/obj/item/clothing/head/collectable)
|
||||
gift_type_list += subtypesof(/obj/item/toy) - (((typesof(/obj/item/toy/cards) - /obj/item/toy/cards/deck) + /obj/item/toy/figure + /obj/item/toy/ammo)) //All toys, except for abstract types and syndicate cards.
|
||||
|
||||
@@ -11,95 +11,42 @@
|
||||
resistance_flags = FLAMMABLE
|
||||
max_integrity = 40
|
||||
novariants = FALSE
|
||||
var/heal_brute = 0
|
||||
var/heal_burn = 0
|
||||
var/stop_bleeding = 0
|
||||
item_flags = NOBLUDGEON
|
||||
var/self_delay = 50
|
||||
|
||||
/obj/item/stack/medical/attack(mob/living/M, mob/user)
|
||||
if(M.stat == DEAD && !stop_bleeding)
|
||||
var/t_him = "it"
|
||||
if(M.gender == MALE)
|
||||
t_him = "him"
|
||||
else if(M.gender == FEMALE)
|
||||
t_him = "her"
|
||||
to_chat(user, "<span class='danger'>\The [M] is dead, you cannot help [t_him]!</span>")
|
||||
. = ..()
|
||||
if(!M.can_inject(user, TRUE))
|
||||
return
|
||||
|
||||
if(!iscarbon(M) && !isanimal(M))
|
||||
to_chat(user, "<span class='danger'>You don't know how to apply \the [src] to [M]!</span>")
|
||||
return 1
|
||||
|
||||
var/obj/item/bodypart/affecting
|
||||
if(iscarbon(M))
|
||||
var/mob/living/carbon/C = M
|
||||
affecting = C.get_bodypart(check_zone(user.zone_selected))
|
||||
if(!affecting) //Missing limb?
|
||||
to_chat(user, "<span class='warning'>[C] doesn't have \a [parse_zone(user.zone_selected)]!</span>")
|
||||
if(M == user)
|
||||
user.visible_message("<span class='notice'>[user] starts to apply \the [src] on [user.p_them()]self...</span>", "<span class='notice'>You begin applying \the [src] on yourself...</span>")
|
||||
if(!do_mob(user, M, self_delay, extra_checks=CALLBACK(M, /mob/living/proc/can_inject, user, TRUE)))
|
||||
return
|
||||
if(ishuman(C))
|
||||
var/mob/living/carbon/human/H = C
|
||||
if(stop_bleeding)
|
||||
if(H.bleedsuppress)
|
||||
to_chat(user, "<span class='warning'>[H]'s bleeding is already bandaged!</span>")
|
||||
return
|
||||
else if(!H.bleed_rate)
|
||||
to_chat(user, "<span class='warning'>[H] isn't bleeding!</span>")
|
||||
return
|
||||
if(heal(M, user))
|
||||
log_combat(user, M, "healed", src.name)
|
||||
use(1)
|
||||
|
||||
|
||||
if(isliving(M))
|
||||
if(!M.can_inject(user, 1))
|
||||
return
|
||||
/obj/item/stack/medical/proc/heal(mob/living/M, mob/user)
|
||||
return
|
||||
|
||||
if(user)
|
||||
if (M != user)
|
||||
if (isanimal(M))
|
||||
var/mob/living/simple_animal/critter = M
|
||||
if (!(critter.healable))
|
||||
to_chat(user, "<span class='notice'> You cannot use [src] on [M]!</span>")
|
||||
return
|
||||
else if (critter.health == critter.maxHealth)
|
||||
to_chat(user, "<span class='notice'> [M] is at full health.</span>")
|
||||
return
|
||||
else if(src.heal_brute < 1)
|
||||
to_chat(user, "<span class='notice'> [src] won't help [M] at all.</span>")
|
||||
return
|
||||
user.visible_message("<span class='green'>[user] applies [src] on [M].</span>", "<span class='green'>You apply [src] on [M].</span>")
|
||||
else
|
||||
var/t_himself = "itself"
|
||||
if(user.gender == MALE)
|
||||
t_himself = "himself"
|
||||
else if(user.gender == FEMALE)
|
||||
t_himself = "herself"
|
||||
user.visible_message("<span class='notice'>[user] starts to apply [src] on [t_himself]...</span>", "<span class='notice'>You begin applying [src] on yourself...</span>")
|
||||
if(!do_mob(user, M, self_delay, extra_checks=CALLBACK(M, /mob/living/proc/can_inject,user,1)))
|
||||
return
|
||||
user.visible_message("<span class='green'>[user] applies [src] on [t_himself].</span>", "<span class='green'>You apply [src] on yourself.</span>")
|
||||
|
||||
|
||||
if(iscarbon(M))
|
||||
var/mob/living/carbon/C = M
|
||||
affecting = C.get_bodypart(check_zone(user.zone_selected))
|
||||
if(!affecting) //Missing limb?
|
||||
to_chat(user, "<span class='warning'>[C] doesn't have \a [parse_zone(user.zone_selected)]!</span>")
|
||||
return
|
||||
if(ishuman(C))
|
||||
var/mob/living/carbon/human/H = C
|
||||
if(stop_bleeding)
|
||||
if(!H.bleedsuppress) //so you can't stack bleed suppression
|
||||
H.suppress_bloodloss(stop_bleeding)
|
||||
if(affecting.status == BODYPART_ORGANIC) //Limb must be organic to be healed - RR
|
||||
if(affecting.heal_damage(heal_brute, heal_burn))
|
||||
/obj/item/stack/medical/proc/heal_carbon(mob/living/carbon/C, mob/user, brute, burn)
|
||||
var/obj/item/bodypart/affecting = C.get_bodypart(check_zone(user.zone_selected))
|
||||
if(!affecting) //Missing limb?
|
||||
to_chat(user, "<span class='warning'>[C] doesn't have \a [parse_zone(user.zone_selected)]!</span>")
|
||||
return
|
||||
if(affecting.status == BODYPART_ORGANIC) //Limb must be organic to be healed - RR
|
||||
if(affecting.brute_dam && brute || affecting.burn_dam && burn)
|
||||
user.visible_message("<span class='green'>[user] applies \the [src] on [C]'s [affecting.name].</span>", "<span class='green'>You apply \the [src] on [C]'s [affecting.name].</span>")
|
||||
if(affecting.heal_damage(brute, burn))
|
||||
C.update_damage_overlays()
|
||||
else
|
||||
to_chat(user, "<span class='notice'>Medicine won't work on a robotic limb!</span>")
|
||||
else
|
||||
M.heal_bodypart_damage((src.heal_brute/2), (src.heal_burn/2))
|
||||
|
||||
use(1)
|
||||
|
||||
return TRUE
|
||||
to_chat(user, "<span class='notice'>[C]'s [affecting.name] can not be healed with \the [src].</span>")
|
||||
return
|
||||
to_chat(user, "<span class='notice'>\The [src] won't work on a robotic limb!</span>")
|
||||
|
||||
/obj/item/stack/medical/get_belt_overlay()
|
||||
return mutable_appearance('icons/obj/clothing/belt_overlays.dmi', "pouch")
|
||||
|
||||
/obj/item/stack/medical/bruise_pack
|
||||
name = "bruise pack"
|
||||
@@ -108,27 +55,56 @@
|
||||
icon_state = "brutepack"
|
||||
lefthand_file = 'icons/mob/inhands/equipment/medical_lefthand.dmi'
|
||||
righthand_file = 'icons/mob/inhands/equipment/medical_righthand.dmi'
|
||||
heal_brute = 40
|
||||
var/heal_brute = 25
|
||||
self_delay = 20
|
||||
max_amount = 12
|
||||
grind_results = list("styptic_powder" = 10)
|
||||
|
||||
/obj/item/stack/medical/bruise_pack/heal(mob/living/M, mob/user)
|
||||
if(M.stat == DEAD)
|
||||
to_chat(user, "<span class='notice'> [M] is dead. You can not help [M.p_them()]!</span>")
|
||||
return
|
||||
if(isanimal(M))
|
||||
var/mob/living/simple_animal/critter = M
|
||||
if (!(critter.healable))
|
||||
to_chat(user, "<span class='notice'> You cannot use \the [src] on [M]!</span>")
|
||||
return FALSE
|
||||
else if (critter.health == critter.maxHealth)
|
||||
to_chat(user, "<span class='notice'> [M] is at full health.</span>")
|
||||
return FALSE
|
||||
user.visible_message("<span class='green'>[user] applies \the [src] on [M].</span>", "<span class='green'>You apply \the [src] on [M].</span>")
|
||||
M.heal_bodypart_damage((heal_brute/2))
|
||||
return TRUE
|
||||
if(iscarbon(M))
|
||||
return heal_carbon(M, user, heal_brute, 0)
|
||||
to_chat(user, "<span class='notice'>You can't heal [M] with the \the [src]!</span>")
|
||||
|
||||
/obj/item/stack/medical/bruise_pack/suicide_act(mob/user)
|
||||
user.visible_message("<span class='suicide'>[user] is bludgeoning [user.p_them()]self with [src]! It looks like [user.p_theyre()] trying to commit suicide!</span>")
|
||||
return (BRUTELOSS)
|
||||
|
||||
/obj/item/stack/medical/gauze
|
||||
name = "medical gauze"
|
||||
desc = "A roll of elastic cloth that is extremely effective at stopping bleeding, but does not heal wounds."
|
||||
desc = "A roll of elastic cloth that is extremely effective at stopping bleeding, heals minor wounds."
|
||||
gender = PLURAL
|
||||
singular_name = "medical gauze"
|
||||
icon_state = "gauze"
|
||||
stop_bleeding = 1800
|
||||
self_delay = 20
|
||||
var/stop_bleeding = 1800
|
||||
var/heal_brute = 5
|
||||
self_delay = 10
|
||||
max_amount = 12
|
||||
|
||||
/obj/item/stack/medical/gauze/heal(mob/living/M, mob/user)
|
||||
if(ishuman(M))
|
||||
var/mob/living/carbon/human/H = M
|
||||
if(!H.bleedsuppress && H.bleed_rate) //so you can't stack bleed suppression
|
||||
H.suppress_bloodloss(stop_bleeding)
|
||||
to_chat(user, "<span class='notice'>You stop the bleeding of [M]!</span>")
|
||||
return TRUE
|
||||
to_chat(user, "<span class='notice'>You can not use \the [src] on [M]!</span>")
|
||||
|
||||
/obj/item/stack/medical/gauze/attackby(obj/item/I, mob/user, params)
|
||||
if(istype(I, /obj/item/wirecutters) || I.get_sharpness())
|
||||
if(I.tool_behaviour == TOOL_WIRECUTTER || I.get_sharpness())
|
||||
if(get_amount() < 2)
|
||||
to_chat(user, "<span class='warning'>You need at least two gauzes to do this!</span>")
|
||||
return
|
||||
@@ -163,13 +139,19 @@
|
||||
icon_state = "ointment"
|
||||
lefthand_file = 'icons/mob/inhands/equipment/medical_lefthand.dmi'
|
||||
righthand_file = 'icons/mob/inhands/equipment/medical_righthand.dmi'
|
||||
heal_burn = 40
|
||||
var/heal_burn = 25
|
||||
self_delay = 20
|
||||
max_amount = 12
|
||||
grind_results = list("silver_sulfadiazine" = 10)
|
||||
|
||||
/obj/item/stack/medical/ointment/heal(mob/living/M, mob/user)
|
||||
if(M.stat == DEAD)
|
||||
to_chat(user, "<span class='notice'> [M] is dead. You can not help [M.p_them()]!</span>")
|
||||
return
|
||||
if(iscarbon(M))
|
||||
return heal_carbon(M, user, 0, heal_burn)
|
||||
to_chat(user, "<span class='notice'>You can't heal [M] with the \the [src]!</span>")
|
||||
|
||||
/obj/item/stack/medical/ointment/suicide_act(mob/living/user)
|
||||
user.visible_message("<span class='suicide'>[user] is squeezing \the [src] into [user.p_their()] mouth! [user.p_do(TRUE)]n't [user.p_they()] know that stuff is toxic?</span>")
|
||||
return TOXLOSS
|
||||
|
||||
/obj/item/stack/medical/get_belt_overlay()
|
||||
return mutable_appearance('icons/obj/clothing/belt_overlays.dmi', "pouch")
|
||||
|
||||
@@ -4,7 +4,6 @@ Mineral Sheets
|
||||
- Sandstone
|
||||
- Sandbags
|
||||
- Diamond
|
||||
- Snow
|
||||
- Uranium
|
||||
- Plasma
|
||||
- Gold
|
||||
@@ -15,8 +14,9 @@ Mineral Sheets
|
||||
Others:
|
||||
- Adamantine
|
||||
- Mythril
|
||||
- Enriched Uranium
|
||||
- Snow
|
||||
- Abductor
|
||||
- Coal
|
||||
*/
|
||||
|
||||
/obj/item/stack/sheet/mineral/Initialize(mapload)
|
||||
@@ -410,3 +410,36 @@ GLOBAL_LIST_INIT(abductor_recipes, list ( \
|
||||
/obj/item/stack/sheet/mineral/abductor/Initialize(mapload, new_amount, merge = TRUE)
|
||||
recipes = GLOB.abductor_recipes
|
||||
. = ..()
|
||||
|
||||
/*
|
||||
* Coal
|
||||
*/
|
||||
|
||||
/obj/item/stack/sheet/mineral/coal
|
||||
name = "coal"
|
||||
desc = "Someone's gotten on the naughty list."
|
||||
icon = 'icons/obj/mining.dmi'
|
||||
icon_state = "slag"
|
||||
singular_name = "coal lump"
|
||||
merge_type = /obj/item/stack/sheet/mineral/coal
|
||||
grind_results = list("carbon" = 20)
|
||||
|
||||
/obj/item/stack/sheet/mineral/coal/attackby(obj/item/W, mob/user, params)
|
||||
if(W.get_temperature() > 300)//If the temperature of the object is over 300, then ignite
|
||||
var/turf/T = get_turf(src)
|
||||
message_admins("Coal ignited by [ADMIN_LOOKUPFLW(user)] in [ADMIN_VERBOSEJMP(T)]")
|
||||
log_game("Coal ignited by [key_name(user)] in [AREACOORD(T)]")
|
||||
fire_act(W.get_temperature())
|
||||
return TRUE
|
||||
else
|
||||
return ..()
|
||||
|
||||
/obj/item/stack/sheet/mineral/coal/fire_act(exposed_temperature, exposed_volume)
|
||||
atmos_spawn_air("co2=[amount*10];TEMP=[exposed_temperature]")
|
||||
qdel(src)
|
||||
|
||||
/obj/item/stack/sheet/mineral/coal/five
|
||||
amount = 5
|
||||
|
||||
/obj/item/stack/sheet/mineral/coal/ten
|
||||
amount = 10
|
||||
@@ -72,17 +72,10 @@
|
||||
resistance_flags = NONE
|
||||
grind_results = list("aluminium" = 10)
|
||||
|
||||
/obj/item/trash/boritos
|
||||
name = "boritos bag"
|
||||
icon_state = "boritos"
|
||||
grind_results = list("aluminium" = 1) //from the mylar bag
|
||||
|
||||
/obj/item/trash/attack(mob/M, mob/living/user)
|
||||
return
|
||||
|
||||
/obj/item/trash/coal
|
||||
name = "lump of coal"
|
||||
icon = 'icons/obj/mining.dmi'
|
||||
icon_state = "slag"
|
||||
desc = "Someone's gotten on the naughty list."
|
||||
grind_results = list("carbon" = 20)
|
||||
|
||||
/obj/item/trash/coal/burn()
|
||||
visible_message("[src] fuses into a diamond! Someone wasn't so naughty after all...")
|
||||
new /obj/item/stack/ore/diamond(loc)
|
||||
qdel(src)
|
||||
|
||||
@@ -37,6 +37,8 @@
|
||||
dat += "<I>Your apprentice is training to cast spells that will aid your survival. They know Forcewall and Charge and come with a Staff of Healing.</I><BR>"
|
||||
dat += "<A href='byond://?src=[REF(src)];school=[APPRENTICE_ROBELESS]'>Robeless</A><BR>"
|
||||
dat += "<I>Your apprentice is training to cast spells without their robes. They know Knock and Mindswap.</I><BR>"
|
||||
dat += "<A href='byond://?src=[REF(src)];school=[APPRENTICE_MARTIAL]'>Martial Artist</a><BR>"
|
||||
dat += "<I>Your apprentice is training in ancient martial arts. They know the Plasmafist and Nuclear Fist.</I><BR>"
|
||||
user << browse(dat, "window=radio")
|
||||
onclose(user, "radio")
|
||||
return
|
||||
|
||||
@@ -65,6 +65,8 @@
|
||||
//Equip
|
||||
var/mob/living/carbon/human/H = owner.current
|
||||
H.set_species(/datum/species/abductor)
|
||||
var/obj/item/organ/tongue/abductor/T = H.getorganslot(ORGAN_SLOT_TONGUE)
|
||||
T.mothership = "[team.name]"
|
||||
|
||||
H.real_name = "[team.name] [sub_role]"
|
||||
H.equipOutfit(outfit)
|
||||
|
||||
@@ -17,7 +17,7 @@
|
||||
actions_types = list(/datum/action/item_action/hands_free/activate)
|
||||
allowed = list(
|
||||
/obj/item/abductor,
|
||||
/obj/item/abductor_baton,
|
||||
/obj/item/abductor/baton,
|
||||
/obj/item/melee/baton,
|
||||
/obj/item/gun/energy,
|
||||
/obj/item/restraints/handcuffs
|
||||
@@ -57,7 +57,7 @@
|
||||
|
||||
/obj/item/clothing/suit/armor/abductor/vest/item_action_slot_check(slot, mob/user, datum/action/A)
|
||||
if(slot == SLOT_WEAR_SUIT) //we only give the mob the ability to activate the vest if he's actually wearing it.
|
||||
return 1
|
||||
return TRUE
|
||||
|
||||
/obj/item/clothing/suit/armor/abductor/vest/proc/SetDisguise(datum/icon_snapshot/entry)
|
||||
disguise = entry
|
||||
@@ -89,11 +89,9 @@
|
||||
|
||||
/obj/item/clothing/suit/armor/abductor/vest/hit_reaction(mob/living/carbon/human/owner, atom/movable/hitby, attack_text = "the attack", final_block_chance = 0, damage = 0, attack_type = MELEE_ATTACK)
|
||||
DeactivateStealth()
|
||||
return 0
|
||||
|
||||
/obj/item/clothing/suit/armor/abductor/vest/IsReflect()
|
||||
DeactivateStealth()
|
||||
return 0
|
||||
|
||||
/obj/item/clothing/suit/armor/abductor/vest/ui_action_click()
|
||||
switch(mode)
|
||||
@@ -111,7 +109,10 @@
|
||||
to_chat(loc, "<span class='warning'>Combat injection is still recharging.</span>")
|
||||
return
|
||||
var/mob/living/carbon/human/M = loc
|
||||
M.do_adrenaline(150, FALSE, 0, 0, TRUE, list("inaprovaline" = 3, "synaptizine" = 10, "omnizine" = 10), "<span class='boldnotice'>You feel a sudden surge of energy!</span>")
|
||||
M.adjustStaminaLoss(-75)
|
||||
M.SetUnconscious(0)
|
||||
M.SetStun(0)
|
||||
M.SetKnockdown(0)
|
||||
combat_cooldown = 0
|
||||
START_PROCESSING(SSobj, src)
|
||||
|
||||
@@ -131,9 +132,11 @@
|
||||
|
||||
/obj/item/abductor
|
||||
icon = 'icons/obj/abductor.dmi'
|
||||
lefthand_file = 'icons/mob/inhands/antag/abductor_lefthand.dmi'
|
||||
righthand_file = 'icons/mob/inhands/antag/abductor_righthand.dmi'
|
||||
|
||||
/obj/item/abductor/proc/AbductorCheck(mob/user)
|
||||
if(HAS_TRAIT(user, TRAIT_ABDUCTOR_TRAINING))
|
||||
if (HAS_TRAIT(user, TRAIT_ABDUCTOR_TRAINING))
|
||||
return TRUE
|
||||
if (istype(user) && user.mind && HAS_TRAIT(user.mind, TRAIT_ABDUCTOR_TRAINING))
|
||||
return TRUE
|
||||
@@ -158,8 +161,6 @@
|
||||
desc = "A dual-mode tool for retrieving specimens and scanning appearances. Scanning can be done through cameras."
|
||||
icon_state = "gizmo_scan"
|
||||
item_state = "silencer"
|
||||
lefthand_file = 'icons/mob/inhands/antag/abductor_lefthand.dmi'
|
||||
righthand_file = 'icons/mob/inhands/antag/abductor_righthand.dmi'
|
||||
var/mode = GIZMO_SCAN
|
||||
var/mob/living/marked = null
|
||||
var/obj/machinery/abductor/console/console
|
||||
@@ -218,12 +219,9 @@
|
||||
if(marked == target)
|
||||
to_chat(user, "<span class='warning'>This specimen is already marked!</span>")
|
||||
return
|
||||
if(ishuman(target))
|
||||
if(isabductor(target))
|
||||
marked = target
|
||||
to_chat(user, "<span class='notice'>You mark [target] for future retrieval.</span>")
|
||||
else
|
||||
prepare(target,user)
|
||||
if(isabductor(target) || iscow(target))
|
||||
marked = target
|
||||
to_chat(user, "<span class='notice'>You mark [target] for future retrieval.</span>")
|
||||
else
|
||||
prepare(target,user)
|
||||
|
||||
@@ -247,8 +245,6 @@
|
||||
desc = "A compact device used to shut down communications equipment."
|
||||
icon_state = "silencer"
|
||||
item_state = "gizmo"
|
||||
lefthand_file = 'icons/mob/inhands/antag/abductor_lefthand.dmi'
|
||||
righthand_file = 'icons/mob/inhands/antag/abductor_righthand.dmi'
|
||||
|
||||
/obj/item/abductor/silencer/attack(mob/living/M, mob/user)
|
||||
if(!AbductorCheck(user))
|
||||
@@ -292,8 +288,6 @@
|
||||
or to send a command to a test subject with a charged gland."
|
||||
icon_state = "mind_device_message"
|
||||
item_state = "silencer"
|
||||
lefthand_file = 'icons/mob/inhands/antag/abductor_lefthand.dmi'
|
||||
righthand_file = 'icons/mob/inhands/antag/abductor_righthand.dmi'
|
||||
var/mode = MIND_DEVICE_MESSAGE
|
||||
|
||||
/obj/item/abductor/mind_device/attack_self(mob/user)
|
||||
@@ -389,6 +383,17 @@
|
||||
item_state = "alienpistol"
|
||||
trigger_guard = TRIGGER_GUARD_ALLOW_ALL
|
||||
|
||||
/obj/item/gun/energy/shrink_ray
|
||||
name = "shrink ray blaster"
|
||||
desc = "This is a piece of frightening alien tech that enhances the magnetic pull of atoms in a localized space to temporarily make an object shrink. \
|
||||
That or it's just space magic. Either way, it shrinks stuff."
|
||||
ammo_type = list(/obj/item/ammo_casing/energy/shrink)
|
||||
item_state = "shrink_ray"
|
||||
icon_state = "shrink_ray"
|
||||
fire_delay = 30
|
||||
selfcharge = 1//shot costs 200 energy, has a max capacity of 1000 for 5 shots. self charge returns 25 energy every couple ticks, so about 1 shot charged every 12~ seconds
|
||||
trigger_guard = TRIGGER_GUARD_ALLOW_ALL// variable-size trigger, get it? (abductors need this to be set so the gun is usable for them)
|
||||
|
||||
/obj/item/paper/guides/antag/abductor
|
||||
name = "Dissection Guide"
|
||||
icon_state = "alienpaper_words"
|
||||
@@ -422,21 +427,18 @@
|
||||
#define BATON_PROBE 3
|
||||
#define BATON_MODES 4
|
||||
|
||||
/obj/item/abductor_baton
|
||||
/obj/item/abductor/baton
|
||||
name = "advanced baton"
|
||||
desc = "A quad-mode baton used for incapacitation and restraining of specimens."
|
||||
var/mode = BATON_STUN
|
||||
icon = 'icons/obj/abductor.dmi'
|
||||
icon_state = "wonderprodStun"
|
||||
item_state = "wonderprod"
|
||||
lefthand_file = 'icons/mob/inhands/antag/abductor_lefthand.dmi'
|
||||
righthand_file = 'icons/mob/inhands/antag/abductor_righthand.dmi'
|
||||
slot_flags = ITEM_SLOT_BELT
|
||||
force = 7
|
||||
w_class = WEIGHT_CLASS_NORMAL
|
||||
actions_types = list(/datum/action/item_action/toggle_mode)
|
||||
|
||||
/obj/item/abductor_baton/proc/toggle(mob/living/user=usr)
|
||||
/obj/item/abductor/baton/proc/toggle(mob/living/user=usr)
|
||||
mode = (mode+1)%BATON_MODES
|
||||
var/txt
|
||||
switch(mode)
|
||||
@@ -452,7 +454,7 @@
|
||||
to_chat(usr, "<span class='notice'>You switch the baton to [txt] mode.</span>")
|
||||
update_icon()
|
||||
|
||||
/obj/item/abductor_baton/update_icon()
|
||||
/obj/item/abductor/baton/update_icon()
|
||||
switch(mode)
|
||||
if(BATON_STUN)
|
||||
icon_state = "wonderprodStun"
|
||||
@@ -467,8 +469,8 @@
|
||||
icon_state = "wonderprodProbe"
|
||||
item_state = "wonderprodProbe"
|
||||
|
||||
/obj/item/abductor_baton/attack(mob/target, mob/living/user)
|
||||
if(!isabductor(user))
|
||||
/obj/item/abductor/baton/attack(mob/target, mob/living/user)
|
||||
if(!AbductorCheck(user))
|
||||
return
|
||||
|
||||
if(iscyborg(target))
|
||||
@@ -485,8 +487,8 @@
|
||||
if(ishuman(L))
|
||||
var/mob/living/carbon/human/H = L
|
||||
if(H.check_shields(src, 0, "[user]'s [name]", MELEE_ATTACK))
|
||||
playsound(L, 'sound/weapons/genhit.ogg', 50, 1)
|
||||
return 0
|
||||
playsound(H, 'sound/weapons/genhit.ogg', 50, TRUE)
|
||||
return FALSE
|
||||
|
||||
switch (mode)
|
||||
if(BATON_STUN)
|
||||
@@ -498,10 +500,10 @@
|
||||
if(BATON_PROBE)
|
||||
ProbeAttack(L,user)
|
||||
|
||||
/obj/item/abductor_baton/attack_self(mob/living/user)
|
||||
/obj/item/abductor/baton/attack_self(mob/living/user)
|
||||
toggle(user)
|
||||
|
||||
/obj/item/abductor_baton/proc/StunAttack(mob/living/L,mob/living/user)
|
||||
/obj/item/abductor/baton/proc/StunAttack(mob/living/L,mob/living/user)
|
||||
|
||||
L.lastattacker = user.real_name
|
||||
L.lastattackerckey = user.ckey
|
||||
@@ -513,7 +515,7 @@
|
||||
|
||||
L.visible_message("<span class='danger'>[user] has stunned [L] with [src]!</span>", \
|
||||
"<span class='userdanger'>[user] has stunned you with [src]!</span>")
|
||||
playsound(loc, 'sound/weapons/egloves.ogg', 50, 1, -1)
|
||||
playsound(src, 'sound/weapons/egloves.ogg', 50, TRUE, -1)
|
||||
|
||||
if(ishuman(L))
|
||||
var/mob/living/carbon/human/H = L
|
||||
@@ -521,7 +523,7 @@
|
||||
|
||||
log_combat(user, L, "stunned")
|
||||
|
||||
/obj/item/abductor_baton/proc/SleepAttack(mob/living/L,mob/living/user)
|
||||
/obj/item/abductor/baton/proc/SleepAttack(mob/living/L,mob/living/user)
|
||||
if(L.incapacitated(TRUE, TRUE))
|
||||
if(L.anti_magic_check(FALSE, FALSE, TRUE, 0))
|
||||
to_chat(user, "<span class='warning'>The specimen's tinfoil protection is interfering with the sleep inducement!</span>")
|
||||
@@ -531,7 +533,7 @@
|
||||
return
|
||||
L.visible_message("<span class='danger'>[user] has induced sleep in [L] with [src]!</span>", \
|
||||
"<span class='userdanger'>You suddenly feel very drowsy!</span>")
|
||||
playsound(loc, 'sound/weapons/egloves.ogg', 50, 1, -1)
|
||||
playsound(src, 'sound/weapons/egloves.ogg', 50, TRUE, -1)
|
||||
L.Sleeping(1200)
|
||||
log_combat(user, L, "put to sleep")
|
||||
else
|
||||
@@ -545,13 +547,13 @@
|
||||
L.visible_message("<span class='danger'>[user] tried to induce sleep in [L] with [src]!</span>", \
|
||||
"<span class='userdanger'>You suddenly feel drowsy!</span>")
|
||||
|
||||
/obj/item/abductor_baton/proc/CuffAttack(mob/living/L,mob/living/user)
|
||||
/obj/item/abductor/baton/proc/CuffAttack(mob/living/L,mob/living/user)
|
||||
if(!iscarbon(L))
|
||||
return
|
||||
var/mob/living/carbon/C = L
|
||||
if(!C.handcuffed)
|
||||
if(C.get_num_arms(FALSE) >= 2 || C.get_arm_ignore())
|
||||
playsound(loc, 'sound/weapons/cablecuff.ogg', 30, 1, -2)
|
||||
playsound(src, 'sound/weapons/cablecuff.ogg', 30, TRUE, -2)
|
||||
C.visible_message("<span class='danger'>[user] begins restraining [C] with [src]!</span>", \
|
||||
"<span class='userdanger'>[user] begins shaping an energy field around your hands!</span>")
|
||||
if(do_mob(user, C, 30) && (C.get_num_arms(FALSE) >= 2 || C.get_arm_ignore()))
|
||||
@@ -565,7 +567,7 @@
|
||||
else
|
||||
to_chat(user, "<span class='warning'>[C] doesn't have two hands...</span>")
|
||||
|
||||
/obj/item/abductor_baton/proc/ProbeAttack(mob/living/L,mob/living/user)
|
||||
/obj/item/abductor/baton/proc/ProbeAttack(mob/living/L,mob/living/user)
|
||||
L.visible_message("<span class='danger'>[user] probes [L] with [src]!</span>", \
|
||||
"<span class='userdanger'>[user] probes you!</span>")
|
||||
|
||||
@@ -610,7 +612,7 @@
|
||||
S.start()
|
||||
. = ..()
|
||||
|
||||
/obj/item/abductor_baton/examine(mob/user)
|
||||
/obj/item/abductor/baton/examine(mob/user)
|
||||
. = ..()
|
||||
switch(mode)
|
||||
if(BATON_STUN)
|
||||
@@ -639,10 +641,44 @@
|
||||
AddComponent(/datum/component/wearertargeting/earprotection, list(SLOT_EARS))
|
||||
|
||||
/obj/item/radio/headset/abductor/attackby(obj/item/W, mob/user, params)
|
||||
if(istype(W, /obj/item/screwdriver))
|
||||
if(W.tool_behaviour == TOOL_SCREWDRIVER)
|
||||
return // Stops humans from disassembling abductor headsets.
|
||||
return ..()
|
||||
|
||||
/obj/item/abductor_machine_beacon
|
||||
name = "machine beacon"
|
||||
desc = "A beacon designed to instantly tele-construct abductor machinery."
|
||||
icon = 'icons/obj/abductor.dmi'
|
||||
icon_state = "beacon"
|
||||
w_class = WEIGHT_CLASS_TINY
|
||||
var/obj/machinery/spawned_machine
|
||||
|
||||
/obj/item/abductor_machine_beacon/attack_self(mob/user)
|
||||
..()
|
||||
user.visible_message("<span class='notice'>[user] places down [src] and activates it.</span>", "<span class='notice'>You place down [src] and activate it.</span>")
|
||||
user.dropItemToGround(src)
|
||||
playsound(src, 'sound/machines/terminal_alert.ogg', 50)
|
||||
addtimer(CALLBACK(src, .proc/try_spawn_machine), 30)
|
||||
|
||||
/obj/item/abductor_machine_beacon/proc/try_spawn_machine()
|
||||
var/viable = FALSE
|
||||
if(isfloorturf(loc))
|
||||
var/turf/T = loc
|
||||
viable = TRUE
|
||||
for(var/obj/thing in T.contents)
|
||||
if(thing.density || ismachinery(thing) || isstructure(thing))
|
||||
viable = FALSE
|
||||
if(viable)
|
||||
playsound(src, 'sound/effects/phasein.ogg', 50, TRUE)
|
||||
var/new_machine = new spawned_machine(loc)
|
||||
visible_message("<span class='notice'>[new_machine] warps on top of the beacon!</span>")
|
||||
qdel(src)
|
||||
else
|
||||
playsound(src, 'sound/machines/buzz-two.ogg', 50)
|
||||
|
||||
/obj/item/abductor_machine_beacon/chem_dispenser
|
||||
name = "beacon - Reagent Synthesizer"
|
||||
spawned_machine = /obj/machinery/chem_dispenser/abductor
|
||||
|
||||
/obj/item/scalpel/alien
|
||||
name = "alien scalpel"
|
||||
@@ -706,11 +742,11 @@
|
||||
framestackamount = 1
|
||||
|
||||
/obj/structure/table_frame/abductor/attackby(obj/item/I, mob/user, params)
|
||||
if(istype(I, /obj/item/wrench))
|
||||
if(I.tool_behaviour == TOOL_WRENCH)
|
||||
to_chat(user, "<span class='notice'>You start disassembling [src]...</span>")
|
||||
I.play_tool_sound(src)
|
||||
if(I.use_tool(src, user, 30))
|
||||
playsound(src.loc, 'sound/items/deconstruct.ogg', 50, 1)
|
||||
playsound(src, 'sound/items/deconstruct.ogg', 50, TRUE)
|
||||
for(var/i = 1, i <= framestackamount, i++)
|
||||
new framestack(get_turf(src))
|
||||
qdel(src)
|
||||
@@ -760,7 +796,6 @@
|
||||
icon = 'icons/obj/abductor.dmi'
|
||||
icon_state = "bed"
|
||||
can_buckle = 1
|
||||
buckle_lying = 1
|
||||
|
||||
var/static/list/injected_reagents = list("corazone")
|
||||
|
||||
@@ -798,3 +833,11 @@
|
||||
airlock_type = /obj/machinery/door/airlock/abductor
|
||||
material_type = /obj/item/stack/sheet/mineral/abductor
|
||||
noglass = TRUE
|
||||
|
||||
/obj/item/clothing/under/abductor
|
||||
desc = "The most advanced form of jumpsuit known to reality, looks uncomfortable."
|
||||
name = "alien jumpsuit"
|
||||
icon_state = "abductor"
|
||||
item_state = "bl_suit"
|
||||
armor = list(melee = 0, bullet = 0, laser = 0, energy = 0, bomb = 10, bio = 10, rad = 0, fire = 0, acid = 0)
|
||||
can_adjust = 0
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
/datum/outfit/abductor
|
||||
name = "Abductor Basic"
|
||||
uniform = /obj/item/clothing/under/color/grey //they're greys gettit
|
||||
uniform = /obj/item/clothing/under/abductor
|
||||
shoes = /obj/item/clothing/shoes/combat
|
||||
back = /obj/item/storage/backpack
|
||||
ears = /obj/item/radio/headset/abductor
|
||||
@@ -34,7 +34,7 @@
|
||||
name = "Abductor Agent"
|
||||
head = /obj/item/clothing/head/helmet/abductor
|
||||
suit = /obj/item/clothing/suit/armor/abductor/vest
|
||||
suit_store = /obj/item/abductor_baton
|
||||
suit_store = /obj/item/abductor/baton
|
||||
belt = /obj/item/storage/belt/military/abductor/full
|
||||
|
||||
backpack_contents = list(
|
||||
|
||||
@@ -5,18 +5,23 @@
|
||||
icon_state = "gland"
|
||||
status = ORGAN_ROBOTIC
|
||||
beating = TRUE
|
||||
organ_flags = ORGAN_NO_SPOIL
|
||||
var/true_name = "baseline placebo referencer"
|
||||
var/cooldown_low = 300
|
||||
var/cooldown_high = 300
|
||||
var/next_activation = 0
|
||||
var/uses // -1 For infinite
|
||||
var/human_only = 0
|
||||
var/active = 0
|
||||
var/human_only = FALSE
|
||||
var/active = FALSE
|
||||
|
||||
var/mind_control_uses = 1
|
||||
var/mind_control_duration = 1800
|
||||
var/active_mind_control = FALSE
|
||||
|
||||
/obj/item/organ/heart/gland/Initialize()
|
||||
. = ..()
|
||||
icon_state = pick(list("health", "spider", "slime", "emp", "species", "egg", "vent", "mindshock", "viral"))
|
||||
|
||||
/obj/item/organ/heart/gland/examine(mob/user)
|
||||
. = ..()
|
||||
if((user.mind && HAS_TRAIT(user.mind, TRAIT_ABDUCTOR_SCIENTIST_TRAINING)) || isobserver(user))
|
||||
@@ -55,14 +60,18 @@
|
||||
active_mind_control = TRUE
|
||||
message_admins("[key_name(user)] sent an abductor mind control message to [key_name(owner)]: [command]")
|
||||
update_gland_hud()
|
||||
|
||||
var/obj/screen/alert/mind_control/mind_alert = owner.throw_alert("mind_control", /obj/screen/alert/mind_control)
|
||||
mind_alert.command = command
|
||||
addtimer(CALLBACK(src, .proc/clear_mind_control), mind_control_duration)
|
||||
return TRUE
|
||||
|
||||
/obj/item/organ/heart/gland/proc/clear_mind_control()
|
||||
if(!ownerCheck() || !active_mind_control)
|
||||
return FALSE
|
||||
to_chat(owner, "<span class='userdanger'>You feel the compulsion fade, and you completely forget about your previous orders.</span>")
|
||||
to_chat(owner, "<span class='userdanger'>You feel the compulsion fade, and you <i>completely forget</i> about your previous orders.</span>")
|
||||
owner.clear_alert("mind_control")
|
||||
active_mind_control = FALSE
|
||||
return TRUE
|
||||
|
||||
/obj/item/organ/heart/gland/Remove(mob/living/carbon/M, special = 0)
|
||||
active = 0
|
||||
@@ -98,257 +107,4 @@
|
||||
active = 0
|
||||
|
||||
/obj/item/organ/heart/gland/proc/activate()
|
||||
return
|
||||
|
||||
/obj/item/organ/heart/gland/heals
|
||||
true_name = "coherency harmonizer"
|
||||
cooldown_low = 200
|
||||
cooldown_high = 400
|
||||
uses = -1
|
||||
icon_state = "health"
|
||||
mind_control_uses = 3
|
||||
mind_control_duration = 3000
|
||||
|
||||
/obj/item/organ/heart/gland/heals/activate()
|
||||
to_chat(owner, "<span class='notice'>You feel curiously revitalized.</span>")
|
||||
owner.adjustToxLoss(-20, FALSE, TRUE)
|
||||
owner.heal_bodypart_damage(20, 20, 0, TRUE)
|
||||
owner.adjustOxyLoss(-20)
|
||||
|
||||
/obj/item/organ/heart/gland/slime
|
||||
true_name = "gastric animation galvanizer"
|
||||
cooldown_low = 600
|
||||
cooldown_high = 1200
|
||||
uses = -1
|
||||
icon_state = "slime"
|
||||
mind_control_uses = 1
|
||||
mind_control_duration = 2400
|
||||
|
||||
/obj/item/organ/heart/gland/slime/Insert(mob/living/carbon/M, special = 0, drop_if_replaced = TRUE)
|
||||
..()
|
||||
owner.faction |= "slime"
|
||||
owner.grant_language(/datum/language/slime)
|
||||
|
||||
/obj/item/organ/heart/gland/slime/activate()
|
||||
to_chat(owner, "<span class='warning'>You feel nauseated!</span>")
|
||||
owner.vomit(20)
|
||||
|
||||
var/mob/living/simple_animal/slime/Slime = new(get_turf(owner), "grey")
|
||||
Slime.Friends = list(owner)
|
||||
Slime.Leader = owner
|
||||
|
||||
/obj/item/organ/heart/gland/mindshock
|
||||
true_name = "neural crosstalk uninhibitor"
|
||||
cooldown_low = 400
|
||||
cooldown_high = 700
|
||||
uses = -1
|
||||
icon_state = "mindshock"
|
||||
mind_control_uses = 1
|
||||
mind_control_duration = 6000
|
||||
|
||||
/obj/item/organ/heart/gland/mindshock/activate()
|
||||
to_chat(owner, "<span class='notice'>You get a headache.</span>")
|
||||
|
||||
var/turf/T = get_turf(owner)
|
||||
for(var/mob/living/carbon/H in orange(4,T))
|
||||
if(H == owner)
|
||||
continue
|
||||
switch(pick(1,3))
|
||||
if(1)
|
||||
to_chat(H, "<span class='userdanger'>You hear a loud buzz in your head, silencing your thoughts!</span>")
|
||||
H.Stun(50)
|
||||
if(2)
|
||||
to_chat(H, "<span class='warning'>You hear an annoying buzz in your head.</span>")
|
||||
H.confused += 15
|
||||
H.adjustOrganLoss(ORGAN_SLOT_BRAIN, 10, 160)
|
||||
if(3)
|
||||
H.hallucination += 60
|
||||
|
||||
/obj/item/organ/heart/gland/pop
|
||||
true_name = "anthropmorphic translocator"
|
||||
cooldown_low = 900
|
||||
cooldown_high = 1800
|
||||
uses = -1
|
||||
human_only = TRUE
|
||||
icon_state = "species"
|
||||
mind_control_uses = 5
|
||||
mind_control_duration = 300
|
||||
|
||||
/obj/item/organ/heart/gland/pop/activate()
|
||||
to_chat(owner, "<span class='notice'>You feel unlike yourself.</span>")
|
||||
randomize_human(owner)
|
||||
var/species = pick(list(/datum/species/human, /datum/species/lizard, /datum/species/insect, /datum/species/fly))
|
||||
owner.set_species(species)
|
||||
|
||||
/obj/item/organ/heart/gland/ventcrawling
|
||||
true_name = "pliant cartilage enabler"
|
||||
cooldown_low = 1800
|
||||
cooldown_high = 2400
|
||||
uses = 1
|
||||
icon_state = "vent"
|
||||
mind_control_uses = 4
|
||||
mind_control_duration = 1800
|
||||
|
||||
/obj/item/organ/heart/gland/ventcrawling/activate()
|
||||
to_chat(owner, "<span class='notice'>You feel very stretchy.</span>")
|
||||
owner.ventcrawler = VENTCRAWLER_ALWAYS
|
||||
|
||||
/obj/item/organ/heart/gland/viral
|
||||
true_name = "contamination incubator"
|
||||
cooldown_low = 1800
|
||||
cooldown_high = 2400
|
||||
uses = 1
|
||||
icon_state = "viral"
|
||||
mind_control_uses = 1
|
||||
mind_control_duration = 1800
|
||||
|
||||
/obj/item/organ/heart/gland/viral/activate()
|
||||
to_chat(owner, "<span class='warning'>You feel sick.</span>")
|
||||
var/datum/disease/advance/A = random_virus(pick(2,6),6)
|
||||
A.carrier = TRUE
|
||||
owner.ForceContractDisease(A, FALSE, TRUE)
|
||||
|
||||
/obj/item/organ/heart/gland/viral/proc/random_virus(max_symptoms, max_level)
|
||||
if(max_symptoms > VIRUS_SYMPTOM_LIMIT)
|
||||
max_symptoms = VIRUS_SYMPTOM_LIMIT
|
||||
var/datum/disease/advance/A = new /datum/disease/advance()
|
||||
var/list/datum/symptom/possible_symptoms = list()
|
||||
for(var/symptom in subtypesof(/datum/symptom))
|
||||
var/datum/symptom/S = symptom
|
||||
if(initial(S.level) > max_level)
|
||||
continue
|
||||
if(initial(S.level) <= 0) //unobtainable symptoms
|
||||
continue
|
||||
possible_symptoms += S
|
||||
for(var/i in 1 to max_symptoms)
|
||||
var/datum/symptom/chosen_symptom = pick_n_take(possible_symptoms)
|
||||
if(chosen_symptom)
|
||||
var/datum/symptom/S = new chosen_symptom
|
||||
A.symptoms += S
|
||||
A.Refresh() //just in case someone already made and named the same disease
|
||||
return A
|
||||
|
||||
/obj/item/organ/heart/gland/trauma
|
||||
true_name = "white matter randomiser"
|
||||
cooldown_low = 800
|
||||
cooldown_high = 1200
|
||||
uses = 5
|
||||
icon_state = "emp"
|
||||
mind_control_uses = 3
|
||||
mind_control_duration = 1800
|
||||
|
||||
/obj/item/organ/heart/gland/trauma/activate()
|
||||
to_chat(owner, "<span class='warning'>You feel a spike of pain in your head.</span>")
|
||||
if(prob(33))
|
||||
owner.gain_trauma_type(BRAIN_TRAUMA_SPECIAL, rand(TRAUMA_RESILIENCE_BASIC, TRAUMA_RESILIENCE_LOBOTOMY))
|
||||
else
|
||||
if(prob(20))
|
||||
owner.gain_trauma_type(BRAIN_TRAUMA_SEVERE, rand(TRAUMA_RESILIENCE_BASIC, TRAUMA_RESILIENCE_LOBOTOMY))
|
||||
else
|
||||
owner.gain_trauma_type(BRAIN_TRAUMA_MILD, rand(TRAUMA_RESILIENCE_BASIC, TRAUMA_RESILIENCE_LOBOTOMY))
|
||||
|
||||
/obj/item/organ/heart/gland/spiderman
|
||||
true_name = "araneae cloister accelerator"
|
||||
cooldown_low = 450
|
||||
cooldown_high = 900
|
||||
uses = -1
|
||||
icon_state = "spider"
|
||||
mind_control_uses = 2
|
||||
mind_control_duration = 2400
|
||||
|
||||
/obj/item/organ/heart/gland/spiderman/activate()
|
||||
to_chat(owner, "<span class='warning'>You feel something crawling in your skin.</span>")
|
||||
owner.faction |= "spiders"
|
||||
var/obj/structure/spider/spiderling/S = new(owner.drop_location())
|
||||
S.directive = "Protect your nest inside [owner.real_name]."
|
||||
|
||||
/obj/item/organ/heart/gland/egg
|
||||
true_name = "roe/enzymatic synthesizer"
|
||||
cooldown_low = 300
|
||||
cooldown_high = 400
|
||||
uses = -1
|
||||
icon_state = "egg"
|
||||
lefthand_file = 'icons/mob/inhands/misc/food_lefthand.dmi'
|
||||
righthand_file = 'icons/mob/inhands/misc/food_righthand.dmi'
|
||||
mind_control_uses = 2
|
||||
mind_control_duration = 1800
|
||||
|
||||
/obj/item/organ/heart/gland/egg/activate()
|
||||
owner.visible_message("<span class='alertalien'>[owner] [pick(EGG_LAYING_MESSAGES)]</span>")
|
||||
var/turf/T = owner.drop_location()
|
||||
new /obj/item/reagent_containers/food/snacks/egg/gland(T)
|
||||
|
||||
/obj/item/organ/heart/gland/electric
|
||||
true_name = "electron accumulator/discharger"
|
||||
cooldown_low = 800
|
||||
cooldown_high = 1200
|
||||
uses = -1
|
||||
mind_control_uses = 2
|
||||
mind_control_duration = 900
|
||||
|
||||
/obj/item/organ/heart/gland/electric/Insert(mob/living/carbon/M, special = 0, drop_if_replaced = TRUE)
|
||||
..()
|
||||
ADD_TRAIT(owner, TRAIT_SHOCKIMMUNE, ORGAN_TRAIT)
|
||||
|
||||
/obj/item/organ/heart/gland/electric/Remove(mob/living/carbon/M, special = 0)
|
||||
REMOVE_TRAIT(owner, TRAIT_SHOCKIMMUNE, ORGAN_TRAIT)
|
||||
..()
|
||||
|
||||
/obj/item/organ/heart/gland/electric/activate()
|
||||
owner.visible_message("<span class='danger'>[owner]'s skin starts emitting electric arcs!</span>",\
|
||||
"<span class='warning'>You feel electric energy building up inside you!</span>")
|
||||
playsound(get_turf(owner), "sparks", 100, 1, -1)
|
||||
addtimer(CALLBACK(src, .proc/zap), rand(30, 100))
|
||||
|
||||
/obj/item/organ/heart/gland/electric/proc/zap()
|
||||
tesla_zap(owner, 4, 8000, TESLA_MOB_DAMAGE | TESLA_OBJ_DAMAGE | TESLA_MOB_STUN)
|
||||
playsound(get_turf(owner), 'sound/magic/lightningshock.ogg', 50, 1)
|
||||
|
||||
/obj/item/organ/heart/gland/chem
|
||||
true_name = "intrinsic pharma-provider"
|
||||
cooldown_low = 50
|
||||
cooldown_high = 50
|
||||
uses = -1
|
||||
mind_control_uses = 3
|
||||
mind_control_duration = 1200
|
||||
var/list/possible_reagents = list()
|
||||
|
||||
/obj/item/organ/heart/gland/chem/Initialize()
|
||||
..()
|
||||
for(var/X in subtypesof(/datum/reagent/drug))
|
||||
var/datum/reagent/R = X
|
||||
possible_reagents += initial(R.id)
|
||||
for(var/X in subtypesof(/datum/reagent/medicine))
|
||||
var/datum/reagent/R = X
|
||||
possible_reagents += initial(R.id)
|
||||
for(var/X in typesof(/datum/reagent/toxin))
|
||||
var/datum/reagent/R = X
|
||||
possible_reagents += initial(R.id)
|
||||
|
||||
/obj/item/organ/heart/gland/chem/activate()
|
||||
var/chem_to_add = pick(possible_reagents)
|
||||
owner.reagents.add_reagent(chem_to_add, 2)
|
||||
owner.adjustToxLoss(-2, TRUE, TRUE)
|
||||
..()
|
||||
|
||||
/obj/item/organ/heart/gland/plasma
|
||||
true_name = "effluvium sanguine-synonym emitter"
|
||||
cooldown_low = 1200
|
||||
cooldown_high = 1800
|
||||
uses = -1
|
||||
mind_control_uses = 1
|
||||
mind_control_duration = 800
|
||||
|
||||
/obj/item/organ/heart/gland/plasma/activate()
|
||||
to_chat(owner, "<span class='warning'>You feel bloated.</span>")
|
||||
addtimer(CALLBACK(GLOBAL_PROC, .proc/to_chat, owner, "<span class='userdanger'>A massive stomachache overcomes you.</span>"), 150)
|
||||
addtimer(CALLBACK(src, .proc/vomit_plasma), 200)
|
||||
|
||||
/obj/item/organ/heart/gland/plasma/proc/vomit_plasma()
|
||||
if(!owner)
|
||||
return
|
||||
owner.visible_message("<span class='danger'>[owner] vomits a cloud of plasma!</span>")
|
||||
var/turf/open/T = get_turf(owner)
|
||||
if(istype(T))
|
||||
T.atmos_spawn_air("plasma=50;TEMP=[T20C]")
|
||||
owner.vomit()
|
||||
return
|
||||
@@ -0,0 +1,19 @@
|
||||
/obj/item/organ/heart/gland/access
|
||||
true_name = "anagraphic electro-scrambler"
|
||||
cooldown_low = 600
|
||||
cooldown_high = 1200
|
||||
uses = 1
|
||||
icon_state = "mindshock"
|
||||
mind_control_uses = 3
|
||||
mind_control_duration = 900
|
||||
|
||||
/obj/item/organ/heart/gland/access/activate()
|
||||
to_chat(owner, "<span class='notice'>You feel like a VIP for some reason.</span>")
|
||||
RegisterSignal(owner, COMSIG_MOB_ALLOWED, .proc/free_access)
|
||||
|
||||
/obj/item/organ/heart/gland/access/proc/free_access(datum/source, obj/O)
|
||||
return TRUE
|
||||
|
||||
/obj/item/organ/heart/gland/access/Remove(mob/living/carbon/M, special = 0)
|
||||
UnregisterSignal(owner, COMSIG_MOB_ALLOWED)
|
||||
..()
|
||||
@@ -0,0 +1,18 @@
|
||||
/obj/item/organ/heart/gland/blood
|
||||
true_name = "pseudonuclear hemo-destabilizer"
|
||||
cooldown_low = 1200
|
||||
cooldown_high = 1800
|
||||
uses = -1
|
||||
icon_state = "egg"
|
||||
lefthand_file = 'icons/mob/inhands/misc/food_lefthand.dmi'
|
||||
righthand_file = 'icons/mob/inhands/misc/food_righthand.dmi'
|
||||
mind_control_uses = 3
|
||||
mind_control_duration = 1500
|
||||
|
||||
/obj/item/organ/heart/gland/blood/activate()
|
||||
if(!ishuman(owner) || !owner.dna.species)
|
||||
return
|
||||
var/mob/living/carbon/human/H = owner
|
||||
var/datum/species/species = H.dna.species
|
||||
to_chat(H, "<span class='warning'>You feel your blood heat up for a moment.</span>")
|
||||
species.exotic_blood = get_random_reagent_id()
|
||||
@@ -0,0 +1,20 @@
|
||||
/obj/item/organ/heart/gland/chem
|
||||
true_name = "intrinsic pharma-provider"
|
||||
cooldown_low = 50
|
||||
cooldown_high = 50
|
||||
uses = -1
|
||||
icon_state = "viral"
|
||||
mind_control_uses = 3
|
||||
mind_control_duration = 1200
|
||||
var/list/possible_reagents = list()
|
||||
|
||||
/obj/item/organ/heart/gland/chem/Initialize()
|
||||
. = ..()
|
||||
for(var/R in subtypesof(/datum/reagent/drug) + subtypesof(/datum/reagent/medicine) + typesof(/datum/reagent/toxin))
|
||||
possible_reagents += R
|
||||
|
||||
/obj/item/organ/heart/gland/chem/activate()
|
||||
var/chem_to_add = pick(possible_reagents)
|
||||
owner.reagents.add_reagent(chem_to_add, 2)
|
||||
owner.adjustToxLoss(-5, TRUE, TRUE)
|
||||
..()
|
||||
@@ -0,0 +1,15 @@
|
||||
/obj/item/organ/heart/gland/egg
|
||||
true_name = "roe/enzymatic synthesizer"
|
||||
cooldown_low = 300
|
||||
cooldown_high = 400
|
||||
uses = -1
|
||||
icon_state = "egg"
|
||||
lefthand_file = 'icons/mob/inhands/misc/food_lefthand.dmi'
|
||||
righthand_file = 'icons/mob/inhands/misc/food_righthand.dmi'
|
||||
mind_control_uses = 2
|
||||
mind_control_duration = 1800
|
||||
|
||||
/obj/item/organ/heart/gland/egg/activate()
|
||||
owner.visible_message("<span class='alertalien'>[owner] [pick(EGG_LAYING_MESSAGES)]</span>")
|
||||
var/turf/T = owner.drop_location()
|
||||
new /obj/item/reagent_containers/food/snacks/egg/gland(T)
|
||||
@@ -0,0 +1,26 @@
|
||||
/obj/item/organ/heart/gland/electric
|
||||
true_name = "electron accumulator/discharger"
|
||||
cooldown_low = 800
|
||||
cooldown_high = 1200
|
||||
icon_state = "species"
|
||||
uses = -1
|
||||
mind_control_uses = 2
|
||||
mind_control_duration = 900
|
||||
|
||||
/obj/item/organ/heart/gland/electric/Insert(mob/living/carbon/M, special = 0, drop_if_replaced = TRUE)
|
||||
..()
|
||||
ADD_TRAIT(owner, TRAIT_SHOCKIMMUNE, "abductor_gland")
|
||||
|
||||
/obj/item/organ/heart/gland/electric/Remove(mob/living/carbon/M, special = 0)
|
||||
REMOVE_TRAIT(owner, TRAIT_SHOCKIMMUNE, "abductor_gland")
|
||||
..()
|
||||
|
||||
/obj/item/organ/heart/gland/electric/activate()
|
||||
owner.visible_message("<span class='danger'>[owner]'s skin starts emitting electric arcs!</span>",\
|
||||
"<span class='warning'>You feel electric energy building up inside you!</span>")
|
||||
playsound(get_turf(owner), "sparks", 100, TRUE, -1)
|
||||
addtimer(CALLBACK(src, .proc/zap), rand(30, 100))
|
||||
|
||||
/obj/item/organ/heart/gland/electric/proc/zap()
|
||||
tesla_zap(owner, 4, 8000, TESLA_MOB_DAMAGE | TESLA_OBJ_DAMAGE | TESLA_MOB_STUN)
|
||||
playsound(get_turf(owner), 'sound/magic/lightningshock.ogg', 50, TRUE)
|
||||
@@ -0,0 +1,178 @@
|
||||
/obj/item/organ/heart/gland/heal
|
||||
true_name = "organic replicator"
|
||||
cooldown_low = 200
|
||||
cooldown_high = 400
|
||||
uses = -1
|
||||
human_only = TRUE
|
||||
icon_state = "health"
|
||||
mind_control_uses = 3
|
||||
mind_control_duration = 3000
|
||||
|
||||
/obj/item/organ/heart/gland/heal/activate()
|
||||
if(!(owner.mob_biotypes & MOB_ORGANIC))
|
||||
return
|
||||
|
||||
for(var/organ in owner.internal_organs)
|
||||
if(istype(organ, /obj/item/organ/cyberimp))
|
||||
reject_implant(organ)
|
||||
return
|
||||
|
||||
var/obj/item/organ/liver/liver = owner.getorganslot(ORGAN_SLOT_LIVER)
|
||||
if((!liver/* && !HAS_TRAIT(owner, TRAIT_NOMETABOLISM)*/) || (liver && ((liver.damage > (liver.maxHealth / 2)) || (istype(liver, /obj/item/organ/liver/cybernetic)))))
|
||||
replace_liver(liver)
|
||||
return
|
||||
|
||||
var/obj/item/organ/lungs/lungs = owner.getorganslot(ORGAN_SLOT_LUNGS)
|
||||
if((!lungs && !HAS_TRAIT(owner, TRAIT_NOBREATH)) || (lungs && (istype(lungs, /obj/item/organ/lungs/cybernetic))))
|
||||
replace_lungs(lungs)
|
||||
return
|
||||
|
||||
var/obj/item/organ/eyes/eyes = owner.getorganslot(ORGAN_SLOT_EYES)
|
||||
if(!eyes || (eyes && ((HAS_TRAIT_FROM(owner, TRAIT_NEARSIGHT, EYE_DAMAGE)) || (HAS_TRAIT_FROM(owner, TRAIT_BLIND, EYE_DAMAGE)) || (istype(eyes, /obj/item/organ/eyes/robotic)))))
|
||||
replace_eyes(eyes)
|
||||
return
|
||||
|
||||
var/obj/item/bodypart/limb
|
||||
var/list/limb_list = list(BODY_ZONE_L_ARM, BODY_ZONE_R_ARM, BODY_ZONE_L_LEG, BODY_ZONE_R_LEG)
|
||||
for(var/zone in limb_list)
|
||||
limb = owner.get_bodypart(zone)
|
||||
if(!limb)
|
||||
replace_limb(zone)
|
||||
return
|
||||
if((limb.get_damage() >= (limb.max_damage / 2)) || (limb.status == BODYPART_ROBOTIC))
|
||||
replace_limb(zone, limb)
|
||||
return
|
||||
|
||||
if(owner.getToxLoss() > 40)
|
||||
replace_blood()
|
||||
return
|
||||
var/tox_amount = 0
|
||||
for(var/datum/reagent/toxin/T in owner.reagents.reagent_list)
|
||||
tox_amount += owner.reagents.get_reagent_amount(T.type)
|
||||
if(tox_amount > 10)
|
||||
replace_blood()
|
||||
return
|
||||
if(owner.blood_volume < BLOOD_VOLUME_OKAY)
|
||||
owner.blood_volume = BLOOD_VOLUME_NORMAL
|
||||
to_chat(owner, "<span class='warning'>You feel your blood pulsing within you.</span>")
|
||||
return
|
||||
|
||||
var/obj/item/bodypart/chest/chest = owner.get_bodypart(BODY_ZONE_CHEST)
|
||||
if((chest.get_damage() >= (chest.max_damage / 4)) || (chest.status == BODYPART_ROBOTIC))
|
||||
replace_chest(chest)
|
||||
return
|
||||
|
||||
/obj/item/organ/heart/gland/heal/proc/reject_implant(obj/item/organ/cyberimp/implant)
|
||||
owner.visible_message("<span class='warning'>[owner] vomits up his [implant.name]!</span>", "<span class='userdanger'>You suddenly vomit up your [implant.name]!</span>")
|
||||
owner.vomit(0, TRUE, TRUE, 1, FALSE, FALSE, FALSE, TRUE)
|
||||
implant.Remove(owner)
|
||||
implant.forceMove(owner.drop_location())
|
||||
|
||||
/obj/item/organ/heart/gland/heal/proc/replace_liver(obj/item/organ/liver/liver)
|
||||
if(liver)
|
||||
owner.visible_message("<span class='warning'>[owner] vomits up his [liver.name]!</span>", "<span class='userdanger'>You suddenly vomit up your [liver.name]!</span>")
|
||||
owner.vomit(0, TRUE, TRUE, 1, FALSE, FALSE, FALSE, TRUE)
|
||||
liver.Remove(owner)
|
||||
liver.forceMove(owner.drop_location())
|
||||
else
|
||||
to_chat(owner, "<span class='warning'>You feel a weird rumble in your bowels...</span>")
|
||||
|
||||
var/liver_type = /obj/item/organ/liver
|
||||
if(owner?.dna?.species?.mutantliver)
|
||||
liver_type = owner.dna.species.mutantliver
|
||||
var/obj/item/organ/liver/new_liver = new liver_type()
|
||||
new_liver.Insert(owner)
|
||||
|
||||
/obj/item/organ/heart/gland/heal/proc/replace_lungs(obj/item/organ/lungs/lungs)
|
||||
if(lungs)
|
||||
owner.visible_message("<span class='warning'>[owner] vomits up his [lungs.name]!</span>", "<span class='userdanger'>You suddenly vomit up your [lungs.name]!</span>")
|
||||
owner.vomit(0, TRUE, TRUE, 1, FALSE, FALSE, FALSE, TRUE)
|
||||
lungs.Remove(owner)
|
||||
lungs.forceMove(owner.drop_location())
|
||||
else
|
||||
to_chat(owner, "<span class='warning'>You feel a weird rumble inside your chest...</span>")
|
||||
|
||||
var/lung_type = /obj/item/organ/lungs
|
||||
if(owner.dna.species && owner.dna.species.mutantlungs)
|
||||
lung_type = owner.dna.species.mutantlungs
|
||||
var/obj/item/organ/lungs/new_lungs = new lung_type()
|
||||
new_lungs.Insert(owner)
|
||||
|
||||
/obj/item/organ/heart/gland/heal/proc/replace_eyes(obj/item/organ/eyes/eyes)
|
||||
if(eyes)
|
||||
owner.visible_message("<span class='warning'>[owner]'s [eyes.name] fall out of their sockets!</span>", "<span class='userdanger'>Your [eyes.name] fall out of their sockets!</span>")
|
||||
playsound(owner, 'sound/effects/splat.ogg', 50, TRUE)
|
||||
eyes.Remove(owner)
|
||||
eyes.forceMove(owner.drop_location())
|
||||
else
|
||||
to_chat(owner, "<span class='warning'>You feel a weird rumble behind your eye sockets...</span>")
|
||||
|
||||
addtimer(CALLBACK(src, .proc/finish_replace_eyes), rand(100, 200))
|
||||
|
||||
/obj/item/organ/heart/gland/heal/proc/finish_replace_eyes()
|
||||
var/eye_type = /obj/item/organ/eyes
|
||||
if(owner.dna.species && owner.dna.species.mutanteyes)
|
||||
eye_type = owner.dna.species.mutanteyes
|
||||
var/obj/item/organ/eyes/new_eyes = new eye_type()
|
||||
new_eyes.Insert(owner)
|
||||
owner.visible_message("<span class='warning'>A pair of new eyes suddenly inflates into [owner]'s eye sockets!</span>", "<span class='userdanger'>A pair of new eyes suddenly inflates into your eye sockets!</span>")
|
||||
|
||||
/obj/item/organ/heart/gland/heal/proc/replace_limb(body_zone, obj/item/bodypart/limb)
|
||||
if(limb)
|
||||
owner.visible_message("<span class='warning'>[owner]'s [limb.name] suddenly detaches from [owner.p_their()] body!</span>", "<span class='userdanger'>Your [limb.name] suddenly detaches from your body!</span>")
|
||||
playsound(owner, "desceration", 50, TRUE, -1)
|
||||
limb.drop_limb()
|
||||
else
|
||||
to_chat(owner, "<span class='warning'>You feel a weird tingle in your [parse_zone(body_zone)]... even if you don't have one.</span>")
|
||||
|
||||
addtimer(CALLBACK(src, .proc/finish_replace_limb, body_zone), rand(150, 300))
|
||||
|
||||
/obj/item/organ/heart/gland/heal/proc/finish_replace_limb(body_zone)
|
||||
owner.visible_message("<span class='warning'>With a loud snap, [owner]'s [parse_zone(body_zone)] rapidly grows back from [owner.p_their()] body!</span>",
|
||||
"<span class='userdanger'>With a loud snap, your [parse_zone(body_zone)] rapidly grows back from your body!</span>",
|
||||
"<span class='warning'>Your hear a loud snap.</span>")
|
||||
playsound(owner, 'sound/magic/demon_consume.ogg', 50, TRUE)
|
||||
owner.regenerate_limb(body_zone)
|
||||
|
||||
/obj/item/organ/heart/gland/heal/proc/replace_blood()
|
||||
owner.visible_message("<span class='warning'>[owner] starts vomiting huge amounts of blood!</span>", "<span class='userdanger'>You suddenly start vomiting huge amounts of blood!</span>")
|
||||
keep_replacing_blood()
|
||||
|
||||
/obj/item/organ/heart/gland/heal/proc/keep_replacing_blood()
|
||||
var/keep_going = FALSE
|
||||
owner.vomit(0, TRUE, FALSE, 3, FALSE, FALSE, FALSE, TRUE)
|
||||
owner.Stun(15)
|
||||
owner.adjustToxLoss(-15, TRUE, TRUE)
|
||||
|
||||
owner.blood_volume = min(BLOOD_VOLUME_NORMAL, owner.blood_volume + 20)
|
||||
if(owner.blood_volume < BLOOD_VOLUME_NORMAL)
|
||||
keep_going = TRUE
|
||||
|
||||
if(owner.getToxLoss())
|
||||
keep_going = TRUE
|
||||
for(var/datum/reagent/toxin/R in owner.reagents.reagent_list)
|
||||
owner.reagents.remove_reagent(R.type, 4)
|
||||
if(owner.reagents.has_reagent(R.type))
|
||||
keep_going = TRUE
|
||||
if(keep_going)
|
||||
addtimer(CALLBACK(src, .proc/keep_replacing_blood), 30)
|
||||
|
||||
/obj/item/organ/heart/gland/heal/proc/replace_chest(obj/item/bodypart/chest/chest)
|
||||
if(chest.status == BODYPART_ROBOTIC)
|
||||
owner.visible_message("<span class='warning'>[owner]'s [chest.name] rapidly expels its mechanical components, replacing them with flesh!</span>", "<span class='userdanger'>Your [chest.name] rapidly expels its mechanical components, replacing them with flesh!</span>")
|
||||
playsound(owner, 'sound/magic/clockwork/anima_fragment_attack.ogg', 50, TRUE)
|
||||
var/list/dirs = GLOB.alldirs.Copy()
|
||||
for(var/i in 1 to 3)
|
||||
var/obj/effect/decal/cleanable/robot_debris/debris = new(get_turf(owner))
|
||||
debris.streak(dirs)
|
||||
else
|
||||
owner.visible_message("<span class='warning'>[owner]'s [chest.name] sheds off its damaged flesh, rapidly replacing it!</span>", "<span class='warning'>Your [chest.name] sheds off its damaged flesh, rapidly replacing it!</span>")
|
||||
playsound(owner, 'sound/effects/splat.ogg', 50, TRUE)
|
||||
var/list/dirs = GLOB.alldirs.Copy()
|
||||
for(var/i in 1 to 3)
|
||||
var/obj/effect/decal/cleanable/blood/gibs/gibs = new(get_turf(owner))
|
||||
gibs.streak(dirs)
|
||||
|
||||
var/obj/item/bodypart/chest/new_chest = new(null)
|
||||
new_chest.replace_limb(owner, TRUE)
|
||||
qdel(chest)
|
||||
@@ -0,0 +1,64 @@
|
||||
/obj/item/organ/heart/gland/mindshock
|
||||
true_name = "neural crosstalk uninhibitor"
|
||||
cooldown_low = 400
|
||||
cooldown_high = 700
|
||||
uses = -1
|
||||
icon_state = "mindshock"
|
||||
mind_control_uses = 1
|
||||
mind_control_duration = 6000
|
||||
var/list/mob/living/carbon/human/broadcasted_mobs = list()
|
||||
|
||||
/obj/item/organ/heart/gland/mindshock/activate()
|
||||
to_chat(owner, "<span class='notice'>You get a headache.</span>")
|
||||
|
||||
var/turf/T = get_turf(owner)
|
||||
for(var/mob/living/carbon/H in orange(4,T))
|
||||
if(H == owner)
|
||||
continue
|
||||
switch(pick(1,3))
|
||||
if(1)
|
||||
to_chat(H, "<span class='userdanger'>You hear a loud buzz in your head, silencing your thoughts!</span>")
|
||||
H.Stun(50)
|
||||
if(2)
|
||||
to_chat(H, "<span class='warning'>You hear an annoying buzz in your head.</span>")
|
||||
H.confused += 15
|
||||
H.adjustOrganLoss(ORGAN_SLOT_BRAIN, 10, 160)
|
||||
if(3)
|
||||
H.hallucination += 60
|
||||
|
||||
/obj/item/organ/heart/gland/mindshock/mind_control(command, mob/living/user)
|
||||
if(!ownerCheck() || !mind_control_uses || active_mind_control)
|
||||
return FALSE
|
||||
mind_control_uses--
|
||||
for(var/mob/M in oview(7, owner))
|
||||
if(!ishuman(M))
|
||||
continue
|
||||
var/mob/living/carbon/human/H = M
|
||||
if(H.stat)
|
||||
continue
|
||||
|
||||
broadcasted_mobs += H
|
||||
to_chat(H, "<span class='userdanger'>You suddenly feel an irresistible compulsion to follow an order...</span>")
|
||||
to_chat(H, "<span class='mind_control'>[command]</span>")
|
||||
|
||||
message_admins("[key_name(user)] broadcasted an abductor mind control message from [key_name(owner)] to [key_name(H)]: [command]")
|
||||
|
||||
var/obj/screen/alert/mind_control/mind_alert = H.throw_alert("mind_control", /obj/screen/alert/mind_control)
|
||||
mind_alert.command = command
|
||||
|
||||
if(LAZYLEN(broadcasted_mobs))
|
||||
active_mind_control = TRUE
|
||||
addtimer(CALLBACK(src, .proc/clear_mind_control), mind_control_duration)
|
||||
|
||||
update_gland_hud()
|
||||
return TRUE
|
||||
|
||||
/obj/item/organ/heart/gland/mindshock/clear_mind_control()
|
||||
if(!active_mind_control || !LAZYLEN(broadcasted_mobs))
|
||||
return FALSE
|
||||
for(var/M in broadcasted_mobs)
|
||||
var/mob/living/carbon/human/H = M
|
||||
to_chat(H, "<span class='userdanger'>You feel the compulsion fade, and you <i>completely forget</i> about your previous orders.</span>")
|
||||
H.clear_alert("mind_control")
|
||||
active_mind_control = FALSE
|
||||
return TRUE
|
||||
@@ -0,0 +1,22 @@
|
||||
/obj/item/organ/heart/gland/plasma
|
||||
true_name = "effluvium sanguine-synonym emitter"
|
||||
cooldown_low = 1200
|
||||
cooldown_high = 1800
|
||||
icon_state = "slime"
|
||||
uses = -1
|
||||
mind_control_uses = 1
|
||||
mind_control_duration = 800
|
||||
|
||||
/obj/item/organ/heart/gland/plasma/activate()
|
||||
to_chat(owner, "<span class='warning'>You feel bloated.</span>")
|
||||
addtimer(CALLBACK(GLOBAL_PROC, .proc/to_chat, owner, "<span class='userdanger'>A massive stomachache overcomes you.</span>"), 150)
|
||||
addtimer(CALLBACK(src, .proc/vomit_plasma), 200)
|
||||
|
||||
/obj/item/organ/heart/gland/plasma/proc/vomit_plasma()
|
||||
if(!owner)
|
||||
return
|
||||
owner.visible_message("<span class='danger'>[owner] vomits a cloud of plasma!</span>")
|
||||
var/turf/open/T = get_turf(owner)
|
||||
if(istype(T))
|
||||
T.atmos_spawn_air("plasma=50;TEMP=[T20C]")
|
||||
owner.vomit()
|
||||
@@ -0,0 +1,47 @@
|
||||
/obj/item/organ/heart/gland/quantum
|
||||
true_name = "quantic de-observation matrix"
|
||||
cooldown_low = 150
|
||||
cooldown_high = 150
|
||||
uses = -1
|
||||
icon_state = "emp"
|
||||
mind_control_uses = 2
|
||||
mind_control_duration = 1200
|
||||
var/mob/living/carbon/entangled_mob
|
||||
|
||||
/obj/item/organ/heart/gland/quantum/activate()
|
||||
if(entangled_mob)
|
||||
return
|
||||
for(var/mob/M in oview(owner, 7))
|
||||
if(!iscarbon(M))
|
||||
continue
|
||||
entangled_mob = M
|
||||
addtimer(CALLBACK(src, .proc/quantum_swap), rand(600, 2400))
|
||||
return
|
||||
|
||||
/obj/item/organ/heart/gland/quantum/proc/quantum_swap()
|
||||
if(QDELETED(entangled_mob))
|
||||
entangled_mob = null
|
||||
return
|
||||
var/turf/T = get_turf(owner)
|
||||
do_teleport(owner, get_turf(entangled_mob),null,TRUE,channel = TELEPORT_CHANNEL_QUANTUM)
|
||||
do_teleport(entangled_mob, T,null,TRUE,channel = TELEPORT_CHANNEL_QUANTUM)
|
||||
to_chat(owner, "<span class='warning'>You suddenly find yourself somewhere else!</span>")
|
||||
to_chat(entangled_mob, "<span class='warning'>You suddenly find yourself somewhere else!</span>")
|
||||
if(!active_mind_control) //Do not reset entangled mob while mind control is active
|
||||
entangled_mob = null
|
||||
|
||||
/obj/item/organ/heart/gland/quantum/mind_control(command, mob/living/user)
|
||||
if(..())
|
||||
if(entangled_mob && ishuman(entangled_mob) && (entangled_mob.stat < DEAD))
|
||||
to_chat(entangled_mob, "<span class='userdanger'>You suddenly feel an irresistible compulsion to follow an order...</span>")
|
||||
to_chat(entangled_mob, "<span class='mind_control'>[command]</span>")
|
||||
var/obj/screen/alert/mind_control/mind_alert = entangled_mob.throw_alert("mind_control", /obj/screen/alert/mind_control)
|
||||
mind_alert.command = command
|
||||
message_admins("[key_name(owner)] mirrored an abductor mind control message to [key_name(entangled_mob)]: [command]")
|
||||
update_gland_hud()
|
||||
|
||||
/obj/item/organ/heart/gland/quantum/clear_mind_control()
|
||||
if(active_mind_control)
|
||||
to_chat(entangled_mob, "<span class='userdanger'>You feel the compulsion fade, and you completely forget about your previous orders.</span>")
|
||||
entangled_mob.clear_alert("mind_control")
|
||||
..()
|
||||
@@ -0,0 +1,21 @@
|
||||
/obj/item/organ/heart/gland/slime
|
||||
true_name = "gastric animation galvanizer"
|
||||
cooldown_low = 600
|
||||
cooldown_high = 1200
|
||||
uses = -1
|
||||
icon_state = "slime"
|
||||
mind_control_uses = 1
|
||||
mind_control_duration = 2400
|
||||
|
||||
/obj/item/organ/heart/gland/slime/Insert(mob/living/carbon/M, special = 0, drop_if_replaced = TRUE)
|
||||
..()
|
||||
owner.faction |= "slime"
|
||||
owner.grant_language(/datum/language/slime)
|
||||
|
||||
/obj/item/organ/heart/gland/slime/activate()
|
||||
to_chat(owner, "<span class='warning'>You feel nauseated!</span>")
|
||||
owner.vomit(20)
|
||||
|
||||
var/mob/living/simple_animal/slime/Slime = new(get_turf(owner), "grey")
|
||||
Slime.Friends = list(owner)
|
||||
Slime.Leader = owner
|
||||
@@ -0,0 +1,14 @@
|
||||
/obj/item/organ/heart/gland/spiderman
|
||||
true_name = "araneae cloister accelerator"
|
||||
cooldown_low = 450
|
||||
cooldown_high = 900
|
||||
uses = -1
|
||||
icon_state = "spider"
|
||||
mind_control_uses = 2
|
||||
mind_control_duration = 2400
|
||||
|
||||
/obj/item/organ/heart/gland/spiderman/activate()
|
||||
to_chat(owner, "<span class='warning'>You feel something crawling in your skin.</span>")
|
||||
owner.faction |= "spiders"
|
||||
var/obj/structure/spider/spiderling/S = new(owner.drop_location())
|
||||
S.directive = "Protect your nest inside [owner.real_name]."
|
||||
@@ -0,0 +1,15 @@
|
||||
/obj/item/organ/heart/gland/transform
|
||||
true_name = "anthropmorphic transmorphosizer"
|
||||
cooldown_low = 900
|
||||
cooldown_high = 1800
|
||||
uses = -1
|
||||
human_only = TRUE
|
||||
icon_state = "species"
|
||||
mind_control_uses = 7
|
||||
mind_control_duration = 300
|
||||
|
||||
/obj/item/organ/heart/gland/transform/activate()
|
||||
to_chat(owner, "<span class='notice'>You feel unlike yourself.</span>")
|
||||
randomize_human(owner)
|
||||
var/species = pick(list(/datum/species/human, /datum/species/lizard, /datum/species/insect, /datum/species/fly))
|
||||
owner.set_species(species)
|
||||
@@ -0,0 +1,18 @@
|
||||
/obj/item/organ/heart/gland/trauma
|
||||
true_name = "white matter randomiser"
|
||||
cooldown_low = 800
|
||||
cooldown_high = 1200
|
||||
uses = 5
|
||||
icon_state = "emp"
|
||||
mind_control_uses = 3
|
||||
mind_control_duration = 1800
|
||||
|
||||
/obj/item/organ/heart/gland/trauma/activate()
|
||||
to_chat(owner, "<span class='warning'>You feel a spike of pain in your head.</span>")
|
||||
if(prob(33))
|
||||
owner.gain_trauma_type(BRAIN_TRAUMA_SPECIAL, rand(TRAUMA_RESILIENCE_BASIC, TRAUMA_RESILIENCE_LOBOTOMY))
|
||||
else
|
||||
if(prob(20))
|
||||
owner.gain_trauma_type(BRAIN_TRAUMA_SEVERE, rand(TRAUMA_RESILIENCE_BASIC, TRAUMA_RESILIENCE_LOBOTOMY))
|
||||
else
|
||||
owner.gain_trauma_type(BRAIN_TRAUMA_MILD, rand(TRAUMA_RESILIENCE_BASIC, TRAUMA_RESILIENCE_LOBOTOMY))
|
||||
@@ -0,0 +1,12 @@
|
||||
/obj/item/organ/heart/gland/ventcrawling
|
||||
true_name = "pliant cartilage enabler"
|
||||
cooldown_low = 1800
|
||||
cooldown_high = 2400
|
||||
uses = 1
|
||||
icon_state = "vent"
|
||||
mind_control_uses = 4
|
||||
mind_control_duration = 1800
|
||||
|
||||
/obj/item/organ/heart/gland/ventcrawling/activate()
|
||||
to_chat(owner, "<span class='notice'>You feel very stretchy.</span>")
|
||||
owner.ventcrawler = VENTCRAWLER_ALWAYS
|
||||
@@ -0,0 +1,34 @@
|
||||
/obj/item/organ/heart/gland/viral
|
||||
true_name = "contamination incubator"
|
||||
cooldown_low = 1800
|
||||
cooldown_high = 2400
|
||||
uses = 1
|
||||
icon_state = "viral"
|
||||
mind_control_uses = 1
|
||||
mind_control_duration = 1800
|
||||
|
||||
/obj/item/organ/heart/gland/viral/activate()
|
||||
to_chat(owner, "<span class='warning'>You feel sick.</span>")
|
||||
var/datum/disease/advance/A = random_virus(pick(2,6),6)
|
||||
A.carrier = TRUE
|
||||
owner.ForceContractDisease(A, FALSE, TRUE)
|
||||
|
||||
/obj/item/organ/heart/gland/viral/proc/random_virus(max_symptoms, max_level)
|
||||
if(max_symptoms > VIRUS_SYMPTOM_LIMIT)
|
||||
max_symptoms = VIRUS_SYMPTOM_LIMIT
|
||||
var/datum/disease/advance/A = new /datum/disease/advance()
|
||||
var/list/datum/symptom/possible_symptoms = list()
|
||||
for(var/symptom in subtypesof(/datum/symptom))
|
||||
var/datum/symptom/S = symptom
|
||||
if(initial(S.level) > max_level)
|
||||
continue
|
||||
if(initial(S.level) <= 0) //unobtainable symptoms
|
||||
continue
|
||||
possible_symptoms += S
|
||||
for(var/i in 1 to max_symptoms)
|
||||
var/datum/symptom/chosen_symptom = pick_n_take(possible_symptoms)
|
||||
if(chosen_symptom)
|
||||
var/datum/symptom/S = new chosen_symptom
|
||||
A.symptoms += S
|
||||
A.Refresh() //just in case someone already made and named the same disease
|
||||
return A
|
||||
@@ -43,12 +43,15 @@
|
||||
dat += "Collected Samples : [points] <br>"
|
||||
dat += "Gear Credits: [credits] <br>"
|
||||
dat += "<b>Transfer data in exchange for supplies:</b><br>"
|
||||
dat += "<a href='?src=[REF(src)];dispense=baton'>Advanced Baton</A><br>"
|
||||
dat += "<a href='?src=[REF(src)];dispense=helmet'>Agent Helmet</A><br>"
|
||||
dat += "<a href='?src=[REF(src)];dispense=vest'>Agent Vest</A><br>"
|
||||
dat += "<a href='?src=[REF(src)];dispense=silencer'>Radio Silencer</A><br>"
|
||||
dat += "<a href='?src=[REF(src)];dispense=tool'>Science Tool</A><br>"
|
||||
dat += "<a href='?src=[REF(src)];dispense=mind_device'>Mental Interface Device</A><br>"
|
||||
dat += "<a href='?src=[REF(src)];dispense=baton'>Advanced Baton (2 Credits)</A><br>"
|
||||
dat += "<a href='?src=[REF(src)];dispense=mind_device'>Mental Interface Device (2 Credits)</A><br>"
|
||||
dat += "<a href='?src=[REF(src)];dispense=chem_dispenser'>Reagent Synthesizer (2 Credits)</A><br>"
|
||||
dat += "<a href='?src=[REF(src)];dispense=shrink_ray'>Shrink Ray Blaster (2 Credits)</a><br>"
|
||||
dat += "<a href='?src=[REF(src)];dispense=helmet'>Agent Helmet (1 Credit)</A><br>"
|
||||
dat += "<a href='?src=[REF(src)];dispense=vest'>Agent Vest (1 Credit)</A><br>"
|
||||
dat += "<a href='?src=[REF(src)];dispense=silencer'>Radio Silencer (1 Credit)</A><br>"
|
||||
dat += "<a href='?src=[REF(src)];dispense=tool'>Science Tool (1 Credit)</A><br>"
|
||||
dat += "<a href='?src=[REF(src)];dispense=tongue'>Superlingual Matrix (1 Credit)</a><br>"
|
||||
else
|
||||
dat += "<span class='bad'>NO EXPERIMENT MACHINE DETECTED</span> <br>"
|
||||
|
||||
@@ -101,7 +104,7 @@
|
||||
else if(href_list["dispense"])
|
||||
switch(href_list["dispense"])
|
||||
if("baton")
|
||||
Dispense(/obj/item/abductor_baton,cost=2)
|
||||
Dispense(/obj/item/abductor/baton,cost=2)
|
||||
if("helmet")
|
||||
Dispense(/obj/item/clothing/head/helmet/abductor)
|
||||
if("silencer")
|
||||
@@ -112,6 +115,12 @@
|
||||
Dispense(/obj/item/clothing/suit/armor/abductor/vest)
|
||||
if("mind_device")
|
||||
Dispense(/obj/item/abductor/mind_device,cost=2)
|
||||
if("chem_dispenser")
|
||||
Dispense(/obj/item/abductor_machine_beacon/chem_dispenser,cost=2)
|
||||
if("tongue")
|
||||
Dispense(/obj/item/organ/tongue/abductor)
|
||||
if("shrink_ray")
|
||||
Dispense(/obj/item/gun/energy/shrink_ray,cost=2)
|
||||
updateUsrDialog()
|
||||
|
||||
/obj/machinery/abductor/console/proc/TeleporterRetrieve()
|
||||
@@ -136,9 +145,9 @@
|
||||
|
||||
var/entry_name
|
||||
if(remote)
|
||||
entry_name = show_radial_menu(usr, camera.eyeobj, disguises2)
|
||||
entry_name = show_radial_menu(usr, camera.eyeobj, disguises2, tooltips = TRUE)
|
||||
else
|
||||
entry_name = show_radial_menu(usr, src, disguises2)
|
||||
entry_name = show_radial_menu(usr, src, disguises2, require_near = TRUE, tooltips = TRUE)
|
||||
|
||||
var/datum/icon_snapshot/chosen = disguises[entry_name]
|
||||
if(chosen && vest && (remote || in_range(usr,src)))
|
||||
@@ -236,4 +245,4 @@
|
||||
new item(drop_location)
|
||||
|
||||
else
|
||||
say("Insufficent data!")
|
||||
say("Insufficent data!")
|
||||
@@ -77,13 +77,16 @@
|
||||
for(var/mob/living/M in viewers(5, src))
|
||||
if(!is_servant_of_ratvar(M) && M != L)
|
||||
M.flash_act()
|
||||
if(iscultist(L))
|
||||
if(iscultist(L)) //No longer stuns cultists, instead sets them on fire and burns them
|
||||
to_chat(L, "<span class='heavy_brass'>\"Watch your step, wretch.\"</span>")
|
||||
L.adjustBruteLoss(10)
|
||||
L.Knockdown(80, FALSE)
|
||||
L.adjustFireLoss(10)
|
||||
L.Knockdown(20, FALSE)
|
||||
L.adjust_fire_stacks(5) //Burn!
|
||||
L.IgniteMob()
|
||||
else
|
||||
L.Stun(40)
|
||||
L.visible_message("<span class='warning'>[src] appears around [L] in a burst of light!</span>", \
|
||||
"<span class='userdanger'>[target_flashed ? "An unseen force":"The glowing sigil around you"] holds you in place!</span>")
|
||||
L.Stun(40)
|
||||
"<span class='userdanger'>[target_flashed ? "An unseen force":"The glowing sigil around you"] [iscultist(L) ? "painfully bursts into flames!" : "holds you in place!"]</span>")
|
||||
L.apply_status_effect(STATUS_EFFECT_BELLIGERENT)
|
||||
new /obj/effect/temp_visual/ratvar/sigil/transgression(get_turf(src))
|
||||
qdel(src)
|
||||
|
||||
@@ -193,15 +193,26 @@
|
||||
L.visible_message("<span class='warning'>[L]'s eyes flare with dim light!</span>")
|
||||
playsound(L, 'sound/weapons/sear.ogg', 50, TRUE)
|
||||
else
|
||||
L.visible_message("<span class='warning'>[L]'s eyes blaze with brilliant light!</span>", \
|
||||
"<span class='userdanger'>Your vision suddenly screams with white-hot light!</span>")
|
||||
L.Knockdown(15, TRUE, FALSE, 15)
|
||||
L.apply_status_effect(STATUS_EFFECT_KINDLE)
|
||||
L.flash_act(1, 1)
|
||||
if(issilicon(target))
|
||||
var/mob/living/silicon/S = L
|
||||
S.emp_act(EMP_HEAVY)
|
||||
if(iscultist(L))
|
||||
if(!iscultist(L))
|
||||
L.visible_message("<span class='warning'>[L]'s eyes blaze with brilliant light!</span>", \
|
||||
"<span class='userdanger'>Your vision suddenly screams with white-hot light!</span>")
|
||||
L.Knockdown(15, TRUE, FALSE, 15)
|
||||
L.apply_status_effect(STATUS_EFFECT_KINDLE)
|
||||
L.flash_act(1, 1)
|
||||
if(issilicon(target))
|
||||
var/mob/living/silicon/S = L
|
||||
S.emp_act(EMP_HEAVY)
|
||||
else //for Nar'sian weaklings
|
||||
to_chat(L, "<span class='heavy_brass'>\"How does it feel to see the light, dog?\"</span>")
|
||||
L.visible_message("<span class='warning'>[L]'s eyes flare with burning light!</span>", \
|
||||
"<span class='userdanger'>Your vision suddenly screams with a flash of burning hot light!</span>") //Debuffs Narsian cultists hard + deals some burn instead of just hardstunning them; Only the confusion part can stack
|
||||
L.flash_act(1,1)
|
||||
if(iscarbon(target))
|
||||
var/mob/living/carbon/C = L
|
||||
C.stuttering = max(8, C.stuttering)
|
||||
C.drowsyness = max(8, C.drowsyness)
|
||||
C.confused += CLAMP(16 - C.confused, 0, 8)
|
||||
C.apply_status_effect(STATUS_EFFECT_BELLIGERENT)
|
||||
L.adjustFireLoss(15)
|
||||
..()
|
||||
|
||||
|
||||
@@ -56,8 +56,14 @@
|
||||
L.visible_message("<span class='warning'>[src] bounces off of [L], as if repelled by an unseen force!</span>")
|
||||
else if(!..())
|
||||
if(!L.anti_magic_check())
|
||||
if(issilicon(L) || iscultist(L))
|
||||
if(issilicon(L))
|
||||
L.Knockdown(100)
|
||||
else if(iscultist(L))
|
||||
L.confused += CLAMP(10 - L.confused, 0, 5) // Spearthrow now confuses enemy cultists + just deals extra damage / sets on fire instead of hardstunning + damage
|
||||
to_chat(L, "<span class ='userdanger'>[src] crashes into you with burning force, sending you reeling!</span>")
|
||||
L.adjust_fire_stacks(2)
|
||||
L.Knockdown(1)
|
||||
L.IgniteMob()
|
||||
else
|
||||
L.Knockdown(40)
|
||||
GLOB.clockwork_vitality += L.adjustFireLoss(bonus_burn * 3) //normally a total of 40 damage, 70 with ratvar
|
||||
|
||||
@@ -1,5 +1,7 @@
|
||||
#define MARAUDER_SLOWDOWN_PERCENTAGE 0.40 //Below this percentage of health, marauders will become slower
|
||||
#define MARAUDER_SHIELD_REGEN_TIME 200 //In deciseconds, how long it takes for shields to regenerate after breaking
|
||||
#define MARAUDER_SPACE_FULL_DAMAGE 6 //amount of damage per life tick while inside space
|
||||
#define MARAUDER_SPACE_NEAR_DAMAGE 4 //amount of damage taking per Life() tick from being next to space.
|
||||
|
||||
//Clockwork marauder: A well-rounded frontline construct. Only one can exist for every two human servants.
|
||||
/mob/living/simple_animal/hostile/clockwork/marauder
|
||||
@@ -20,12 +22,14 @@
|
||||
movement_type = FLYING
|
||||
a_intent = INTENT_HARM
|
||||
loot = list(/obj/item/clockwork/component/geis_capacitor/fallen_armor)
|
||||
light_range = 2
|
||||
light_power = 1.1
|
||||
light_range = 3
|
||||
light_power = 1.7
|
||||
playstyle_string = "<span class='big bold'><span class='neovgre'>You are a clockwork marauder,</span></span><b> a well-rounded frontline construct of Ratvar. Although you have no \
|
||||
unique abilities, you're a fearsome fighter in one-on-one combat, and your shield protects from projectiles!<br><br>Obey the Servants and do as they \
|
||||
tell you. Your primary goal is to defend the Ark from destruction; they are your allies in this, and should be protected from harm.</b>"
|
||||
tell you. Your primary goal is to defend the Ark from destruction; they are your allies in this, and should be protected from harm.</b> \
|
||||
<span class='danger big'>Be warned, however, that you will rapidly decay near the void of space.</span>"
|
||||
empower_string = "<span class='neovgre'>The Anima Bulwark's power flows through you! Your weapon will strike harder, your armor is sturdier, and your shield is more durable.</span>"
|
||||
var/default_speed = 0
|
||||
var/max_shield_health = 3
|
||||
var/shield_health = 3 //Amount of projectiles that can be deflected within
|
||||
var/shield_health_regen = 0 //When world.time equals this, shield health will regenerate
|
||||
@@ -36,10 +40,21 @@
|
||||
|
||||
/mob/living/simple_animal/hostile/clockwork/marauder/Life()
|
||||
..()
|
||||
var/turf/T = get_turf(src)
|
||||
var/turf/open/space/S = isspaceturf(T)? T : null
|
||||
var/less_space_damage
|
||||
if(!istype(S))
|
||||
var/turf/open/space/nearS = locate() in oview(1)
|
||||
if(nearS)
|
||||
S = nearS
|
||||
less_space_damage = TRUE
|
||||
if(S)
|
||||
to_chat(src, "<span class='userdanger'>The void of space drains Ratvar's Light from you! You feel yourself rapidly decaying. It would be wise to get back inside!</span>")
|
||||
adjustBruteLoss(less_space_damage? MARAUDER_SPACE_NEAR_DAMAGE : MARAUDER_SPACE_FULL_DAMAGE)
|
||||
if(!GLOB.ratvar_awakens && health / maxHealth <= MARAUDER_SLOWDOWN_PERCENTAGE)
|
||||
speed = initial(speed) + 1 //Yes, this slows them down
|
||||
speed = default_speed + 1 //Yes, this slows them down
|
||||
else
|
||||
speed = initial(speed)
|
||||
speed = default_speed
|
||||
if(shield_health < max_shield_health && world.time >= shield_health_regen)
|
||||
shield_health_regen = world.time + MARAUDER_SHIELD_REGEN_TIME
|
||||
to_chat(src, "<span class='neovgre'>Your shield has recovered, <b>[shield_health]</b> blocks remaining!</span>")
|
||||
|
||||
@@ -87,9 +87,22 @@
|
||||
object_path = /obj/item/clockwork/construct_chassis/clockwork_marauder
|
||||
construct_type = /mob/living/simple_animal/hostile/clockwork/marauder
|
||||
combat_construct = TRUE
|
||||
var/static/recent_marauders = 0
|
||||
var/static/time_since_last_marauder = 0
|
||||
var/static/scaled_recital_time = 0
|
||||
var/static/last_marauder = 0
|
||||
|
||||
/datum/clockwork_scripture/create_object/construct/clockwork_marauder/post_recital()
|
||||
last_marauder = world.time
|
||||
return ..()
|
||||
|
||||
/datum/clockwork_scripture/create_object/construct/clockwork_marauder/pre_recital()
|
||||
if(!is_reebe(invoker.z))
|
||||
if(!CONFIG_GET(flag/allow_clockwork_marauder_on_station))
|
||||
to_chat(invoker, "<span class='brass'>This particular station is too far from the influence of the Hierophant Network. You can not summon a marauder here.</span>")
|
||||
return FALSE
|
||||
if(world.time < (last_marauder + CONFIG_GET(number/marauder_delay_non_reebe)))
|
||||
to_chat(invoker, "<span class='brass'>The hierophant network is still strained from the last summoning of a marauder on a plane without the strong energy connection of Reebe to support it. \
|
||||
You must wait another [DisplayTimeText((last_marauder + CONFIG_GET(number/marauder_delay_non_reebe)) - world.time, TRUE)]!</span>")
|
||||
return FALSE
|
||||
return ..()
|
||||
|
||||
/datum/clockwork_scripture/create_object/construct/clockwork_marauder/update_construct_limit()
|
||||
var/human_servants = 0
|
||||
@@ -98,27 +111,7 @@
|
||||
var/mob/living/L = M.current
|
||||
if(ishuman(L) && L.stat != DEAD)
|
||||
human_servants++
|
||||
construct_limit = round(CLAMP((human_servants / 4), 1, 3)) - recent_marauders //1 per 4 human servants, maximum of 3, reduced by recent marauder creation
|
||||
if(recent_marauders)
|
||||
to_chat(invoker, "<span class='warning'>The Hierophant Network is depleted by a summoning in the last [DisplayTimeText(MARAUDER_SCRIPTURE_SCALING_THRESHOLD, TRUE)] - limiting the number of available marauders by [recent_marauders]!</span>")
|
||||
|
||||
/datum/clockwork_scripture/create_object/construct/clockwork_marauder/pre_recital()
|
||||
channel_time = initial(channel_time)
|
||||
if(recent_marauders)
|
||||
scaled_recital_time = min(recent_marauders * MARAUDER_SCRIPTURE_SCALING_TIME, MARAUDER_SCRIPTURE_SCALING_MAX)
|
||||
to_chat(invoker, "<span class='warning'>The Hierophant Network is under strain from repeated summoning, making this scripture [DisplayTimeText(scaled_recital_time)] slower!</span>")
|
||||
channel_time += scaled_recital_time
|
||||
return TRUE
|
||||
|
||||
/datum/clockwork_scripture/create_object/construct/clockwork_marauder/scripture_effects()
|
||||
. = ..()
|
||||
recent_marauders++
|
||||
addtimer(CALLBACK(GLOBAL_PROC, .proc/marauder_reset),MARAUDER_SCRIPTURE_SCALING_THRESHOLD)
|
||||
|
||||
/proc/marauder_reset()
|
||||
var/datum/clockwork_scripture/create_object/construct/clockwork_marauder/CM = new()
|
||||
CM.recent_marauders--
|
||||
qdel(CM)
|
||||
construct_limit = round(CLAMP((human_servants / 4), 1, 3)) //1 per 4 human servants, maximum of 3
|
||||
|
||||
//Summon Neovgre: Summon a very powerful combat mech that explodes when destroyed for massive damage.
|
||||
/datum/clockwork_scripture/create_object/summon_arbiter
|
||||
|
||||
@@ -438,21 +438,27 @@
|
||||
target.visible_message("<span class='warning'>[L] starts to glow in a halo of light!</span>", \
|
||||
"<span class='userdanger'>A feeling of warmth washes over you, rays of holy light surround your body and protect you from the flash of light!</span>")
|
||||
else
|
||||
to_chat(user, "<span class='cultitalic'>In an brilliant flash of red, [L] falls to the ground!</span>")
|
||||
L.Knockdown(160)
|
||||
L.adjustStaminaLoss(140) //Ensures hard stamcrit
|
||||
L.flash_act(1,1)
|
||||
if(issilicon(target))
|
||||
var/mob/living/silicon/S = L
|
||||
S.emp_act(EMP_HEAVY)
|
||||
else if(iscarbon(target))
|
||||
var/mob/living/carbon/C = L
|
||||
C.silent += 6
|
||||
C.stuttering += 15
|
||||
C.cultslurring += 15
|
||||
C.Jitter(15)
|
||||
if(is_servant_of_ratvar(L))
|
||||
if(!iscultist(L))
|
||||
L.Knockdown(160)
|
||||
L.adjustStaminaLoss(140) //Ensures hard stamcrit
|
||||
L.flash_act(1,1)
|
||||
if(issilicon(target))
|
||||
var/mob/living/silicon/S = L
|
||||
S.emp_act(EMP_HEAVY)
|
||||
else if(iscarbon(target))
|
||||
var/mob/living/carbon/C = L
|
||||
C.silent += CLAMP(12 - C.silent, 0, 6)
|
||||
C.stuttering += CLAMP(30 - C.stuttering, 0, 15)
|
||||
C.cultslurring += CLAMP(30 - C.cultslurring, 0, 15)
|
||||
C.Jitter(15)
|
||||
else // cultstun no longer hardstuns + damages hostile cultists, instead debuffs them hard + deals some damage; debuffs for a bit longer since they don't add the clockie belligerent debuff
|
||||
if(iscarbon(target))
|
||||
var/mob/living/carbon/C = L
|
||||
C.stuttering = max(10, C.stuttering)
|
||||
C.drowsyness = max(10, C.drowsyness)
|
||||
C.confused += CLAMP(20 - C.confused, 0, 10)
|
||||
L.adjustBruteLoss(15)
|
||||
to_chat(user, "<span class='cultitalic'>In an brilliant flash of red, [L] [iscultist(L) ? "writhes in pain" : "falls to the ground!"]</span>")
|
||||
uses--
|
||||
..()
|
||||
|
||||
|
||||
@@ -703,7 +703,10 @@
|
||||
else if(!..())
|
||||
if(!L.anti_magic_check())
|
||||
if(is_servant_of_ratvar(L))
|
||||
L.Knockdown(100)
|
||||
to_chat(L, "<span class='cultlarge'>\"Kneel for me, scum\"</span>")
|
||||
L.confused += CLAMP(10 - L.confused, 0, 5) //confuses and lightly knockdowns + damages hostile cultists instead of hardstunning like before
|
||||
L.Knockdown(15)
|
||||
L.adjustBruteLoss(10)
|
||||
else
|
||||
L.Knockdown(50)
|
||||
break_spear(T)
|
||||
|
||||
@@ -34,6 +34,12 @@
|
||||
. = ..()
|
||||
name_source = GLOB.commando_names
|
||||
|
||||
/datum/antagonist/ert/deathsquad/apply_innate_effects(mob/living/mob_override)
|
||||
ADD_TRAIT(owner, TRAIT_DISK_VERIFIER, DEATHSQUAD_TRAIT)
|
||||
|
||||
/datum/antagonist/ert/deathsquad/remove_innate_effects(mob/living/mob_override)
|
||||
REMOVE_TRAIT(owner, TRAIT_DISK_VERIFIER, DEATHSQUAD_TRAIT)
|
||||
|
||||
/datum/antagonist/ert/security // kinda handled by the base template but here for completion
|
||||
|
||||
/datum/antagonist/ert/security/amber
|
||||
|
||||
@@ -611,10 +611,7 @@ This is here to make the tiles around the station mininuke change when it's arme
|
||||
if(!fake)
|
||||
return
|
||||
|
||||
var/ghost = isobserver(user)
|
||||
var/captain = user.mind && user.mind.assigned_role == "Captain"
|
||||
var/nukie = user.mind && user.mind.has_antag_datum(/datum/antagonist/nukeop)
|
||||
if(ghost || captain || nukie)
|
||||
if(isobserver(user) || HAS_TRAIT(user, TRAIT_DISK_VERIFIER) || (user.mind && HAS_TRAIT(user.mind, TRAIT_DISK_VERIFIER)))
|
||||
. += "<span class='warning'>The serial numbers on [src] are incorrect.</span>"
|
||||
|
||||
/obj/item/disk/nuclear/attackby(obj/item/I, mob/living/user, params)
|
||||
@@ -653,3 +650,7 @@ This is here to make the tiles around the station mininuke change when it's arme
|
||||
|
||||
/obj/item/disk/nuclear/fake
|
||||
fake = TRUE
|
||||
|
||||
/obj/item/disk/nuclear/fake/obvious
|
||||
name = "cheap plastic imitation of the nuclear authentication disk"
|
||||
desc = "How anyone could mistake this for the real thing is beyond you."
|
||||
|
||||
@@ -23,10 +23,12 @@
|
||||
/datum/antagonist/nukeop/apply_innate_effects(mob/living/mob_override)
|
||||
var/mob/living/M = mob_override || owner.current
|
||||
update_synd_icons_added(M)
|
||||
ADD_TRAIT(owner, TRAIT_DISK_VERIFIER, NUKEOP_TRAIT)
|
||||
|
||||
/datum/antagonist/nukeop/remove_innate_effects(mob/living/mob_override)
|
||||
var/mob/living/M = mob_override || owner.current
|
||||
update_synd_icons_removed(M)
|
||||
REMOVE_TRAIT(owner, TRAIT_DISK_VERIFIER, NUKEOP_TRAIT)
|
||||
|
||||
/datum/antagonist/nukeop/proc/equip_op()
|
||||
if(!ishuman(owner.current))
|
||||
@@ -42,7 +44,6 @@
|
||||
owner.current.playsound_local(get_turf(owner.current), 'sound/ambience/antag/ops.ogg',100,0)
|
||||
to_chat(owner, "<span class='notice'>You are a [nuke_team ? nuke_team.syndicate_name : "syndicate"] agent!</span>")
|
||||
owner.announce_objectives()
|
||||
return
|
||||
|
||||
/datum/antagonist/nukeop/on_gain()
|
||||
give_alias()
|
||||
|
||||
@@ -177,6 +177,10 @@
|
||||
owner.AddSpell(new /obj/effect/proc_holder/spell/aoe_turf/knock(null))
|
||||
owner.AddSpell(new /obj/effect/proc_holder/spell/targeted/mind_transfer(null))
|
||||
to_chat(owner, "<B>Your service has not gone unrewarded, however. Studying under [master.current.real_name], you have learned stealthy, robeless spells. You are able to cast knock and mindswap.")
|
||||
if(APPRENTICE_MARTIAL)
|
||||
owner.AddSpell(new /obj/effect/proc_holder/spell/targeted/touch/nuclear_fist(null))
|
||||
H.put_in_hands(new /obj/item/book/granter/martial/plasma_fist(H))
|
||||
to_chat(owner, "<B>Your service has not gone unrewarded, however. Studying under [master.current.real_name], you have learned mystical martial abilities. You are also able to use the Nuclear Fist at will.")
|
||||
|
||||
/datum/antagonist/wizard/apprentice/create_objectives()
|
||||
var/datum/objective/protect/new_objective = new /datum/objective/protect
|
||||
|
||||
@@ -176,6 +176,23 @@
|
||||
/obj/item/storage/bag/tray)
|
||||
crate_name = "fruit crate"
|
||||
|
||||
/datum/supply_pack/organic/grill
|
||||
name = "Grilling Starter Kit"
|
||||
desc = "Hey dad I'm Hungry. Hi Hungry I'm THE NEW GRILLING STARTER KIT ONLY 5000 BUX GET NOW! Contains a cooking grill and five fuel coal sheets."
|
||||
cost = 3000
|
||||
crate_type = /obj/structure/closet/crate
|
||||
contains = list(/obj/item/stack/sheet/mineral/coal/five,
|
||||
/obj/machinery/grill/unwrenched)
|
||||
crate_name = "grilling starter kit crate"
|
||||
|
||||
/datum/supply_pack/organic/grillfuel
|
||||
name = "Grilling Fuel Kit"
|
||||
desc = "Contains coal and coal accessories. (Note: only ten coal sheets.)"
|
||||
cost = 1000
|
||||
crate_type = /obj/structure/closet/crate
|
||||
contains = list(/obj/item/stack/sheet/mineral/coal/ten)
|
||||
crate_name = "grilling fuel kit crate"
|
||||
|
||||
/datum/supply_pack/organic/cream_piee
|
||||
name = "High-yield Clown-grade Cream Pie Crate"
|
||||
desc = "Designed by Aussec's Advanced Warfare Research Division, these high-yield, Clown-grade cream pies are powered by a synergy of performance and efficiency. Guaranteed to provide maximum results."
|
||||
|
||||
@@ -309,4 +309,4 @@
|
||||
//The "pocket" for the M1 helmet so you can tuck things into the elastic band
|
||||
|
||||
/datum/component/storage/concrete/pockets/tiny/spacenam
|
||||
attack_hand_interact = TRUE //So you can actually see what you stuff in there
|
||||
attack_hand_interact = TRUE //So you can actually see what you stuff in there
|
||||
|
||||
@@ -132,14 +132,10 @@
|
||||
transfer_fingerprints_to(B)
|
||||
qdel(src)
|
||||
|
||||
|
||||
|
||||
|
||||
////////////////////////////////////////////////////////////////////////////////
|
||||
/// Drinks. END
|
||||
////////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
|
||||
/obj/item/reagent_containers/food/drinks/trophy
|
||||
name = "pewter cup"
|
||||
desc = "Everyone gets a trophy."
|
||||
@@ -178,7 +174,6 @@
|
||||
materials = list(MAT_SILVER=800)
|
||||
volume = 100
|
||||
|
||||
|
||||
/obj/item/reagent_containers/food/drinks/trophy/bronze_cup
|
||||
name = "bronze cup"
|
||||
desc = "At least you ranked!"
|
||||
@@ -190,7 +185,7 @@
|
||||
materials = list(MAT_METAL=400)
|
||||
volume = 25
|
||||
|
||||
///////////////////////////////////////////////Drinks
|
||||
///////////////////////////////////////////////Drinks/////////////////////////////////////////
|
||||
//Notes by Darem: Drinks are simply containers that start preloaded. Unlike condiments, the contents can be ingested directly
|
||||
// rather then having to add it to something else first. They should only contain liquids. They have a default container size of 50.
|
||||
// Formatting is the same as food.
|
||||
@@ -203,6 +198,7 @@
|
||||
spillable = TRUE
|
||||
resistance_flags = FREEZE_PROOF
|
||||
isGlass = FALSE
|
||||
foodtype = BREAKFAST
|
||||
|
||||
//Used by MREs
|
||||
/obj/item/reagent_containers/food/drinks/coffee/type2
|
||||
@@ -211,7 +207,6 @@
|
||||
icon = 'icons/obj/food/containers.dmi'
|
||||
icon_state = "condi_cornoil"
|
||||
|
||||
|
||||
/obj/item/reagent_containers/food/drinks/ice
|
||||
name = "ice cup"
|
||||
desc = "Careful, cold ice, do not chew."
|
||||
@@ -243,10 +238,8 @@
|
||||
desc = "Made in Space South America."
|
||||
list_reagents = list("hot_coco" = 30, "sugar" = 5)
|
||||
foodtype = SUGAR
|
||||
|
||||
resistance_flags = FREEZE_PROOF
|
||||
|
||||
|
||||
/obj/item/reagent_containers/food/drinks/dry_ramen
|
||||
name = "cup ramen"
|
||||
desc = "Just add 10ml of water, self heats! A taste that reminds you of your school years."
|
||||
@@ -325,27 +318,27 @@
|
||||
icon_state = "orangebox"
|
||||
name = "orange juice box"
|
||||
desc = "A great source of vitamins. Stay healthy!"
|
||||
foodtype = FRUIT
|
||||
foodtype = FRUIT | BREAKFAST
|
||||
if("milk")
|
||||
icon_state = "milkbox"
|
||||
name = "carton of milk"
|
||||
desc = "An excellent source of calcium for growing space explorers."
|
||||
foodtype = DAIRY
|
||||
foodtype = DAIRY | BREAKFAST
|
||||
if("applejuice")
|
||||
icon_state = "juicebox"
|
||||
name = "apple juice box"
|
||||
desc = "Sweet apple juice. Don't be late for school!"
|
||||
foodtype = FRUIT
|
||||
foodtype = FRUIT | BREAKFAST
|
||||
if("grapejuice")
|
||||
icon_state = "grapebox"
|
||||
name = "grape juice box"
|
||||
desc = "Tasty grape juice in a fun little container. Non-alcoholic!"
|
||||
foodtype = FRUIT
|
||||
foodtype = FRUIT | BREAKFAST
|
||||
if("chocolate_milk")
|
||||
icon_state = "chocolatebox"
|
||||
name = "carton of chocolate milk"
|
||||
desc = "Milk for cool kids!"
|
||||
foodtype = SUGAR
|
||||
foodtype = SUGAR | BREAKFAST
|
||||
if("eggnog")
|
||||
icon_state = "nog2"
|
||||
name = "carton of eggnog"
|
||||
@@ -357,8 +350,7 @@
|
||||
desc = "A small carton, intended for holding drinks."
|
||||
|
||||
|
||||
|
||||
//////////////////////////drinkingglass and shaker//
|
||||
//////////////////////////drinkingglass and shaker/////////////////////////////////////////////////////////////////////////////////////
|
||||
//Note by Darem: This code handles the mixing of drinks. New drinks go in three places: In Chemistry-Reagents.dm (for the drink
|
||||
// itself), in Chemistry-Recipes.dm (for the reaction that changes the components into the drink), and here (for the drinking glass
|
||||
// icon states.
|
||||
@@ -399,8 +391,8 @@
|
||||
volume = 30
|
||||
spillable = TRUE
|
||||
|
||||
//////////////////////////soda_cans//
|
||||
//These are in their own group to be used as IED's in /obj/item/grenade/ghettobomb.dm
|
||||
//////////////////////////soda_cans////////////////////////////////////////////////////
|
||||
//These are in their own group to be used as IED's in /obj/item/grenade/ghettobomb.dm//
|
||||
|
||||
/obj/item/reagent_containers/food/drinks/soda_cans
|
||||
name = "soda can"
|
||||
@@ -426,7 +418,6 @@
|
||||
qdel(src)
|
||||
..()
|
||||
|
||||
|
||||
/obj/item/reagent_containers/food/drinks/soda_cans/attack_self(mob/user)
|
||||
if(!is_drainable())
|
||||
to_chat(user, "You pull back the tab of \the [src] with a satisfying pop.") //Ahhhhhhhh
|
||||
@@ -515,6 +506,13 @@
|
||||
list_reagents = list("shamblers" = 30)
|
||||
foodtype = SUGAR | JUNKFOOD
|
||||
|
||||
/obj/item/reagent_containers/food/drinks/soda_cans/buzz_fuzz
|
||||
name = "Buzz Fuzz"
|
||||
desc = "The sister drink of Shambler's Juice! Uses real honey, making it a sweet tooth's dream drink. The slogan reads ''A Hive of Flavour'', there's also a label about how it is adddicting."
|
||||
icon_state = "honeysoda_can"
|
||||
list_reagents = list("buzz_fuzz" = 25, "honey" = 5)
|
||||
foodtype = SUGAR | JUNKFOOD
|
||||
|
||||
/obj/item/reagent_containers/food/drinks/soda_cans/grey_bull
|
||||
name = "Grey Bull"
|
||||
desc = "Grey Bull, it gives you gloves!"
|
||||
@@ -527,3 +525,10 @@
|
||||
desc = "There is no air shortage. Do not drink."
|
||||
icon_state = "air"
|
||||
list_reagents = list("nitrogen" = 24, "oxygen" = 6)
|
||||
|
||||
/obj/item/reagent_containers/food/drinks/soda_cans/monkey_energy
|
||||
name = "Monkey Energy"
|
||||
desc = "Unleash the ape!"
|
||||
icon_state = "monkey_energy"
|
||||
list_reagents = list("monkey_energy" = 50)
|
||||
foodtype = SUGAR | JUNKFOOD
|
||||
|
||||
@@ -429,7 +429,7 @@
|
||||
righthand_file = 'icons/mob/inhands/equipment/kitchen_righthand.dmi'
|
||||
isGlass = FALSE
|
||||
list_reagents = list("orangejuice" = 100)
|
||||
foodtype = FRUIT
|
||||
foodtype = FRUIT| BREAKFAST
|
||||
|
||||
/obj/item/reagent_containers/food/drinks/bottle/cream
|
||||
name = "milk cream"
|
||||
|
||||
@@ -5,6 +5,9 @@
|
||||
/// the parent to the exclusion list in code/__HELPERS/unsorted.dm's
|
||||
/// get_random_food proc.
|
||||
////////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
#define STOP_SERVING_BREAKFAST (15 MINUTES)
|
||||
|
||||
/obj/item/reagent_containers/food
|
||||
possible_transfer_amounts = list()
|
||||
volume = 50 //Sets the default container amount for all food items.
|
||||
@@ -40,4 +43,8 @@
|
||||
if(foodtype & H.dna.species.toxic_food)
|
||||
to_chat(H, "<span class='warning'>You don't feel so good...</span>")
|
||||
H.adjust_disgust(25 + 30 * fraction)
|
||||
if((foodtype & BREAKFAST) && world.time - SSticker.round_start_time < STOP_SERVING_BREAKFAST)
|
||||
SEND_SIGNAL(H, COMSIG_ADD_MOOD_EVENT, "breakfast", /datum/mood_event/breakfast)
|
||||
last_check_time = world.time
|
||||
|
||||
#undef STOP_SERVING_BREAKFAST
|
||||
@@ -26,6 +26,7 @@
|
||||
"cornoil" = list("oliveoil", "corn oil bottle", "A delicious oil used in cooking. Made from corn"),
|
||||
"sugar" = list("emptycondiment", "sugar bottle", "Tasty spacey sugar!"),
|
||||
"mayonnaise" = list("mayonnaise", "mayonnaise jar", "An oily condiment made from egg yolks."),
|
||||
"bbqsauce" = list("condi_bbq", "BBQ sauce", "Hand wipes not included."),
|
||||
"peanut_butter" = list("peanutbutter", "peanut butter jar", "A deliciously and sticky spread made from peanuts."))
|
||||
var/originalname = "condiment" //Can't use initial(name) for this. This stores the name set by condimasters.
|
||||
|
||||
@@ -299,3 +300,8 @@
|
||||
name = "astrotame pack"
|
||||
originalname = "astrotame"
|
||||
list_reagents = list("astrotame" = 5)
|
||||
|
||||
/obj/item/reagent_containers/food/condiment/pack/bbqsauce
|
||||
name = "bbq sauce pack"
|
||||
originalname = "bbq sauce"
|
||||
list_reagents = list("bbqsauce" = 10)
|
||||
|
||||
@@ -52,6 +52,8 @@ All foods are distributed among various categories. Use common sense.
|
||||
var/list/bonus_reagents //the amount of reagents (usually nutriment and vitamin) added to crafted/cooked snacks, on top of the ingredients reagents.
|
||||
var/customfoodfilling = 1 // whether it can be used as filling in custom food
|
||||
var/list/tastes // for example list("crisps" = 2, "salt" = 1)
|
||||
var/dunkable = FALSE // for dunkable food, make true
|
||||
var/dunk_amount = 10 // how much reagent is transferred per dunk
|
||||
|
||||
//Placeholder for effect that trigger on eating that aren't tied to reagents.
|
||||
|
||||
@@ -328,6 +330,24 @@ All foods are distributed among various categories. Use common sense.
|
||||
M.emote("me", EMOTE_VISIBLE, "[sattisfaction_text]")
|
||||
qdel(src)
|
||||
|
||||
//////////////////////////////////////////Dunking///////////////////////////////////////////
|
||||
|
||||
/obj/item/reagent_containers/food/snacks/afterattack(obj/item/reagent_containers/M, mob/user, proximity)
|
||||
. = ..()
|
||||
if(!dunkable || !proximity)
|
||||
return
|
||||
if(istype(M, /obj/item/reagent_containers/glass) || istype(M, /obj/item/reagent_containers/food/drinks)) //you can dunk dunkable snacks into beakers or drinks
|
||||
if(!M.is_drainable())
|
||||
to_chat(user, "<span class='warning'>[M] is unable to be dunked in!</span>")
|
||||
return
|
||||
if(M.reagents.trans_to(src, dunk_amount)) //if reagents were transfered, show the message
|
||||
to_chat(user, "<span class='notice'>You dunk the [M].</span>")
|
||||
return
|
||||
if(!M.reagents.total_volume)
|
||||
to_chat(user, "<span class='warning'>[M] is empty!</span>")
|
||||
else
|
||||
to_chat(user, "<span class='warning'>[src] is full!</span>")
|
||||
|
||||
// //////////////////////////////////////////////Store////////////////////////////////////////
|
||||
/// All the food items that can store an item inside itself, like bread or cake.
|
||||
/obj/item/reagent_containers/food/snacks/store
|
||||
|
||||
@@ -57,6 +57,33 @@
|
||||
else if(subjectjob)
|
||||
S.name = "[subjectjob] meatsteak"
|
||||
|
||||
/obj/item/reagent_containers/food/snacks/meat/rawcrab
|
||||
name = "raw crab meat"
|
||||
desc = "A pile of raw crab meat."
|
||||
icon_state = "crabmeatraw"
|
||||
cooked_type = /obj/item/reagent_containers/food/snacks/meat/crab
|
||||
bitesize = 3
|
||||
list_reagents = list("nutriment" = 1, "cooking_oil" = 3)
|
||||
filling_color = "#EAD079"
|
||||
tastes = list("raw crab" = 1)
|
||||
foodtype = RAW | MEAT
|
||||
|
||||
/obj/item/reagent_containers/food/snacks/meat/crab
|
||||
name = "crab meat"
|
||||
desc = "Some deliciously cooked crab meat."
|
||||
icon_state = "crabmeat"
|
||||
list_reagents = list("nutriment" = 2)
|
||||
bonus_reagents = list("nutriment" = 3, "vitamin" = 2, "cooking_oil" = 2)
|
||||
filling_color = "#DFB73A"
|
||||
tastes = list("crab" = 1)
|
||||
foodtype = MEAT
|
||||
|
||||
/obj/item/reagent_containers/food/snacks/meat/slab/chicken
|
||||
name = "chicken meat"
|
||||
desc = "A slab of raw chicken. Remember to wash your hands!"
|
||||
cooked_type = /obj/item/reagent_containers/food/snacks/meat/steak/chicken
|
||||
slice_path = /obj/item/reagent_containers/food/snacks/meat/rawcutlet/chicken
|
||||
tastes = list("chicken" = 1)
|
||||
|
||||
/obj/item/reagent_containers/food/snacks/meat/slab/human/mutant/slime
|
||||
icon_state = "slimemeat"
|
||||
@@ -205,7 +232,6 @@
|
||||
tastes = list("meat" = 1, "salmon" = 1)
|
||||
foodtype = RAW | MEAT
|
||||
|
||||
|
||||
/obj/item/reagent_containers/food/snacks/meat/slab/xeno
|
||||
name = "xeno meat"
|
||||
desc = "A slab of meat."
|
||||
@@ -229,7 +255,6 @@
|
||||
tastes = list("cobwebs" = 1)
|
||||
foodtype = RAW | MEAT | TOXIC
|
||||
|
||||
|
||||
/obj/item/reagent_containers/food/snacks/meat/slab/goliath
|
||||
name = "goliath meat"
|
||||
desc = "A slab of goliath meat. It's not very edible now, but it cooks great in lava."
|
||||
@@ -277,7 +302,7 @@
|
||||
bonus_reagents = list("nutriment" = 1, "vitamin" = 1, "cooking_oil" = 2)
|
||||
filling_color = "#854817"
|
||||
tastes = list("bacon" = 1)
|
||||
foodtype = MEAT
|
||||
foodtype = MEAT | BREAKFAST
|
||||
|
||||
/obj/item/reagent_containers/food/snacks/meat/slab/gondola
|
||||
name = "gondola meat"
|
||||
@@ -303,6 +328,10 @@
|
||||
foodtype = MEAT
|
||||
tastes = list("meat" = 1)
|
||||
|
||||
/obj/item/reagent_containers/food/snacks/meat/steak/chicken
|
||||
name = "chicken steak" //Can you have chicken steaks? Maybe this should be renamed once it gets new sprites.
|
||||
tastes = list("chicken" = 1)
|
||||
|
||||
/obj/item/reagent_containers/food/snacks/meat/steak/plain
|
||||
foodtype = MEAT
|
||||
|
||||
@@ -310,6 +339,10 @@
|
||||
tastes = list("tender meat" = 1)
|
||||
foodtype = MEAT | GROSS
|
||||
|
||||
/obj/item/reagent_containers/food/snacks/meat/steak/penguin
|
||||
name = "penguin steak"
|
||||
tastes = list("beef" = 1, "cod fish" = 1)
|
||||
|
||||
/obj/item/reagent_containers/food/snacks/meat/steak/killertomato
|
||||
name = "killer tomato steak"
|
||||
tastes = list("tomato" = 1)
|
||||
@@ -376,6 +409,11 @@
|
||||
else if(subjectjob)
|
||||
S.name = "[subjectjob] [initial(S.name)]"
|
||||
|
||||
/obj/item/reagent_containers/food/snacks/meat/rawcutlet/chicken
|
||||
name = "raw chicken cutlet"
|
||||
cooked_type = /obj/item/reagent_containers/food/snacks/meat/cutlet/chicken
|
||||
tastes = list("chicken" = 1)
|
||||
|
||||
/obj/item/reagent_containers/food/snacks/meat/rawcutlet/killertomato
|
||||
name = "raw killer tomato cutlet"
|
||||
cooked_type = /obj/item/reagent_containers/food/snacks/meat/cutlet/killertomato
|
||||
@@ -441,3 +479,11 @@
|
||||
/obj/item/reagent_containers/food/snacks/meat/cutlet/gondola
|
||||
name = "gondola cutlet"
|
||||
tastes = list("meat" = 1, "tranquility" = 1)
|
||||
|
||||
/obj/item/reagent_containers/food/snacks/meat/cutlet/penguin
|
||||
name = "penguin cutlet"
|
||||
tastes = list("beef" = 1, "cod fish" = 1)
|
||||
|
||||
/obj/item/reagent_containers/food/snacks/meat/cutlet/chicken
|
||||
name = "chicken cutlet"
|
||||
tastes = list("chicken" = 1)
|
||||
|
||||
@@ -5,7 +5,7 @@
|
||||
slices_num = 5
|
||||
tastes = list("bread" = 10)
|
||||
foodtype = GRAIN
|
||||
|
||||
dunkable = TRUE
|
||||
|
||||
/obj/item/reagent_containers/food/snacks/breadslice
|
||||
icon = 'icons/obj/food/burgerbread.dmi'
|
||||
@@ -16,6 +16,7 @@
|
||||
slot_flags = ITEM_SLOT_HEAD
|
||||
customfoodfilling = 0 //to avoid infinite bread-ception
|
||||
foodtype = GRAIN
|
||||
dunkable = TRUE
|
||||
|
||||
/obj/item/reagent_containers/food/snacks/store/bread/plain
|
||||
name = "bread"
|
||||
@@ -270,6 +271,7 @@ GLOBAL_LIST_INIT(frying_bad_chems, list(
|
||||
list_reagents = list("nutriment" = 4)
|
||||
bonus_reagents = list("nutriment" = 1, "vitamin" = 1)
|
||||
tastes = list("butter" = 1, "toast" = 1)
|
||||
foodtype = GRAIN | BREAKFAST
|
||||
|
||||
/obj/item/reagent_containers/food/snacks/butterbiscuit
|
||||
name = "butter biscuit"
|
||||
@@ -280,6 +282,7 @@ GLOBAL_LIST_INIT(frying_bad_chems, list(
|
||||
list_reagents = list("nutriment" = 5)
|
||||
bonus_reagents = list("nutriment" = 1, "vitamin" = 1)
|
||||
tastes = list("butter" = 1, "biscuit" = 1)
|
||||
foodtype = GRAIN | BREAKFAST
|
||||
|
||||
/obj/item/reagent_containers/food/snacks/butterdog
|
||||
name = "butterdog"
|
||||
|
||||
@@ -134,13 +134,54 @@
|
||||
tastes = list("bun" = 4, "brains" = 2)
|
||||
foodtype = GRAIN | MEAT | GROSS
|
||||
|
||||
//////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
||||
/obj/item/reagent_containers/food/snacks/burger/ghost
|
||||
name = "ghost burger"
|
||||
desc = "Too Spooky!"
|
||||
alpha = 125
|
||||
icon_state = "ghostburger"
|
||||
bonus_reagents = list("nutriment" = 5, "vitamin" = 12)
|
||||
tastes = list("bun" = 4, "ectoplasm" = 2)
|
||||
foodtype = GRAIN
|
||||
alpha = 170
|
||||
verb_say = "moans"
|
||||
verb_yell = "wails"
|
||||
|
||||
/obj/item/reagent_containers/food/snacks/burger/ghost/Initialize()
|
||||
. = ..()
|
||||
START_PROCESSING(SSobj, src)
|
||||
|
||||
/obj/item/reagent_containers/food/snacks/burger/ghost/process()
|
||||
if(!isturf(loc)) //no floating out of bags
|
||||
return
|
||||
var/paranormal_activity = rand(100)
|
||||
switch(paranormal_activity)
|
||||
if(97 to 100)
|
||||
audible_message("[src] rattles a length of chain.")
|
||||
playsound(loc,'sound/spookoween/chain_rattling.ogg', 300, TRUE)
|
||||
if(91 to 96)
|
||||
say(pick("OoOoOoo.", "OoooOOooOoo!!"))
|
||||
if(84 to 90)
|
||||
dir = pick(NORTH, SOUTH, EAST, WEST, NORTHEAST, NORTHWEST, SOUTHEAST, SOUTHWEST)
|
||||
step(src, dir)
|
||||
if(71 to 83)
|
||||
step(src, dir)
|
||||
if(65 to 70)
|
||||
var/obj/machinery/light/L = locate(/obj/machinery/light) in view(4, src)
|
||||
if(L)
|
||||
L.flicker()
|
||||
if(62 to 64)
|
||||
playsound(loc,pick('sound/hallucinations/i_see_you1.ogg', 'sound/hallucinations/i_see_you2.ogg'), 50, TRUE, ignore_walls = FALSE)
|
||||
if(61)
|
||||
visible_message("[src] spews out a glob of ectoplasm!")
|
||||
new /obj/effect/decal/cleanable/greenglow/ecto(loc)
|
||||
playsound(loc,'sound/effects/splat.ogg', 200, TRUE)
|
||||
|
||||
//If i was less lazy i would make the burger forcefeed itself to a nearby mob here.
|
||||
|
||||
/obj/item/reagent_containers/food/snacks/burger/ghost/Destroy()
|
||||
STOP_PROCESSING(SSobj, src)
|
||||
. = ..()
|
||||
//////////////////////////////////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
/obj/item/reagent_containers/food/snacks/burger/red
|
||||
name = "red burger"
|
||||
@@ -281,3 +322,49 @@
|
||||
bonus_reagents = list("nutriment" = 8, "vitamin" = 1)
|
||||
tastes = list("bun" = 4, "bacon" = 2)
|
||||
foodtype = GRAIN | MEAT
|
||||
|
||||
/obj/item/reagent_containers/food/snacks/burger/soylent
|
||||
name = "soylent burger"
|
||||
desc = "A eco-friendly burger made using upcycled low value biomass."
|
||||
icon_state = "soylentburger"
|
||||
bonus_reagents = list("nutriment" = 5, "vitamin" = 3)
|
||||
tastes = list("bun" = 2, "assistant" = 4)
|
||||
foodtype = GRAIN | MEAT | DAIRY
|
||||
|
||||
/obj/item/reagent_containers/food/snacks/burger/rib
|
||||
name = "mcrib"
|
||||
desc = "An elusive rib shaped burger with limited availablity across the galaxy. Not as good as you remember it."
|
||||
icon_state = "mcrib"
|
||||
bonus_reagents = list("bbqsauce" = 5, "vitamin" = 3)
|
||||
tastes = list("bun" = 2, "pork patty" = 4)
|
||||
foodtype = GRAIN | MEAT
|
||||
|
||||
/obj/item/reagent_containers/food/snacks/burger/mcguffin
|
||||
name = "mcguffin"
|
||||
desc = "A cheap and greasy imitation of an eggs benedict."
|
||||
icon_state = "mcguffin"
|
||||
tastes = list("muffin" = 2, "bacon" = 3)
|
||||
bonus_reagents = list("eggyolk" = 3, "nutriment" = 1)
|
||||
foodtype = GRAIN | MEAT | BREAKFAST
|
||||
|
||||
/obj/item/reagent_containers/food/snacks/burger/chicken
|
||||
name = "chicken sandwich" //Apparently the proud people of Americlapstan object to this thing being called a burger. Apparently McDonald's just calls it a burger in Europe as to not scare and confuse us.
|
||||
desc = "A delicious chicken sandwich, it is said the proceeds from this treat helps criminalize homosexuality on the space frontier."
|
||||
icon_state = "chickenburger"
|
||||
tastes = list("bun" = 2, "chicken" = 4, "God's covenant" = 1)
|
||||
bonus_reagents = list("mayonnaise" = 3, "cooking_oil" = 2, "nutriment" = 2)
|
||||
foodtype = GRAIN | MEAT | FRIED
|
||||
|
||||
/obj/item/reagent_containers/food/snacks/burger/cheese
|
||||
name = "cheese burger"
|
||||
desc = "This noble burger stands proudly clad in golden cheese."
|
||||
icon_state = "cheeseburger"
|
||||
tastes = list("bun" = 2, "beef patty" = 4, "cheese" = 3)
|
||||
bonus_reagents = list("nutriment" = 1)
|
||||
foodtype = GRAIN | MEAT | DAIRY
|
||||
|
||||
/obj/item/reagent_containers/food/snacks/burger/cheese/Initialize()
|
||||
. = ..()
|
||||
if(prob(33))
|
||||
icon_state = "cheeseburgeralt"
|
||||
|
||||
|
||||
@@ -379,3 +379,21 @@ obj/item/reagent_containers/food/snacks/store/cake/pound_cake
|
||||
filling_color = "#00FFFF"
|
||||
tastes = list("cake" = 1, "sugar" = 1, "peachjuice" = 10)
|
||||
foodtype = GRAIN | SUGAR | DAIRY
|
||||
|
||||
/obj/item/reagent_containers/food/snacks/store/cake/trumpet
|
||||
name = "spaceman's cake"
|
||||
desc = "A spaceman's trumpet frosted cake."
|
||||
icon_state = "trumpetcake"
|
||||
slice_path = /obj/item/reagent_containers/food/snacks/cakeslice/trumpet
|
||||
bonus_reagents = list("polypyr" = 15, "cream" = 5, "vitamin" = 5, "berryjuice" = 5)
|
||||
filling_color = "#7A3D80"
|
||||
tastes = list("cake" = 4, "violets" = 2, "jam" = 2)
|
||||
foodtype = GRAIN | DAIRY | FRUIT | SUGAR
|
||||
|
||||
/obj/item/reagent_containers/food/snacks/cakeslice/trumpet
|
||||
name = "spaceman's cake"
|
||||
desc = "A spaceman's trumpet frosted cake."
|
||||
icon_state = "trumpetcakeslice"
|
||||
filling_color = "#7A3D80"
|
||||
tastes = list("cake" = 4, "violets" = 2, "jam" = 2)
|
||||
foodtype = GRAIN | DAIRY | FRUIT | SUGAR
|
||||
@@ -94,7 +94,7 @@
|
||||
filling_color = "#FFFFF0"
|
||||
list_reagents = list("nutriment" = 3)
|
||||
tastes = list("egg" = 4, "salt" = 1, "pepper" = 1)
|
||||
foodtype = MEAT | FRIED
|
||||
foodtype = MEAT | FRIED | BREAKFAST
|
||||
|
||||
/obj/item/reagent_containers/food/snacks/boiledegg
|
||||
name = "boiled egg"
|
||||
@@ -104,7 +104,7 @@
|
||||
filling_color = "#FFFFF0"
|
||||
list_reagents = list("nutriment" = 2, "vitamin" = 1)
|
||||
tastes = list("egg" = 1)
|
||||
foodtype = MEAT
|
||||
foodtype = MEAT | BREAKFAST
|
||||
|
||||
/obj/item/reagent_containers/food/snacks/omelette //FUCK THIS
|
||||
name = "omelette du fromage"
|
||||
@@ -116,7 +116,7 @@
|
||||
bitesize = 1
|
||||
w_class = WEIGHT_CLASS_NORMAL
|
||||
tastes = list("egg" = 1, "cheese" = 1)
|
||||
foodtype = MEAT
|
||||
foodtype = MEAT | BREAKFAST
|
||||
|
||||
/obj/item/reagent_containers/food/snacks/omelette/attackby(obj/item/W, mob/user, params)
|
||||
if(istype(W, /obj/item/kitchen/fork))
|
||||
@@ -145,5 +145,4 @@
|
||||
w_class = WEIGHT_CLASS_NORMAL
|
||||
list_reagents = list("nutriment" = 6, "vitamin" = 4)
|
||||
tastes = list("egg" = 1, "bacon" = 1, "bun" = 1)
|
||||
|
||||
foodtype = MEAT
|
||||
foodtype = MEAT | BREAKFAST
|
||||
|
||||
@@ -81,16 +81,15 @@
|
||||
filling_color = "#87CEFA"
|
||||
tastes = list("blue cherries" = 2, "ice cream" = 2)
|
||||
foodtype = FRUIT | DAIRY
|
||||
|
||||
/////////////
|
||||
//SNOWCONES//
|
||||
/////////////
|
||||
|
||||
/obj/item/reagent_containers/food/snacks/snowcones //We use this as a base for all other snowcones
|
||||
name = "flaverless snowcone"
|
||||
desc = "Its just harden water slivers. Still fun to chew on."
|
||||
name = "flavorless snowcone"
|
||||
desc = "It's just shaved ice. Still fun to chew on."
|
||||
icon = 'icons/obj/food/snowcones.dmi'
|
||||
icon_state = "flaverless_sc"
|
||||
icon_state = "flavorless_sc"
|
||||
trash = /obj/item/reagent_containers/food/drinks/sillycup //We dont eat paper cups
|
||||
bonus_reagents = list("water" = 10) //Base line will allways give water
|
||||
list_reagents = list("water" = 1) // We dont get food for water/juices
|
||||
@@ -99,106 +98,106 @@
|
||||
foodtype = SUGAR //We use SUGAR as a base line to act in as junkfood, other wise we use fruit
|
||||
|
||||
/obj/item/reagent_containers/food/snacks/snowcones/lime
|
||||
name = "lime flavored snowcone"
|
||||
desc = "A lime flavord snowball in a paper cup."
|
||||
name = "lime snowcone"
|
||||
desc = "Lime syrup drizzled over a snowball in a paper cup."
|
||||
icon_state = "lime_sc"
|
||||
list_reagents = list("nutriment" = 1, "limejuice" = 5)
|
||||
tastes = list("ice" = 1, "water" = 1, "limes" = 5)
|
||||
foodtype = FRUIT
|
||||
|
||||
/obj/item/reagent_containers/food/snacks/snowcones/lemon
|
||||
name = "lemon flavored snowcone"
|
||||
desc = "A lemon flavord snowball in a paper cup."
|
||||
name = "lemon snowcone"
|
||||
desc = "Lemon syrup drizzled over a snowball in a paper cup."
|
||||
icon_state = "lemon_sc"
|
||||
list_reagents = list("nutriment" = 1, "lemonjuice" = 5)
|
||||
tastes = list("ice" = 1, "water" = 1, "lemons" = 5)
|
||||
foodtype = FRUIT
|
||||
|
||||
/obj/item/reagent_containers/food/snacks/snowcones/apple
|
||||
name = "apple flavored snowcone"
|
||||
desc = "A apple flavord snowball in a paper cup."
|
||||
icon_state = "blue_sc"
|
||||
name = "apple snowcone"
|
||||
desc = "Apple syrup drizzled over a snowball in a paper cup."
|
||||
icon_state = "amber_sc"
|
||||
list_reagents = list("nutriment" = 1, "applejuice" = 5)
|
||||
tastes = list("ice" = 1, "water" = 1, "apples" = 5)
|
||||
foodtype = FRUIT
|
||||
|
||||
/obj/item/reagent_containers/food/snacks/snowcones/grape
|
||||
name = "grape flavored snowcone"
|
||||
desc = "A grape flavord snowball in a paper cup."
|
||||
name = "grape snowcone"
|
||||
desc = "Grape syrup drizzled over a snowball in a paper cup."
|
||||
icon_state = "grape_sc"
|
||||
list_reagents = list("nutriment" = 1, "berryjuice" = 5)
|
||||
list_reagents = list("nutriment" = 1, "grapejuice" = 5)
|
||||
tastes = list("ice" = 1, "water" = 1, "grape" = 5)
|
||||
foodtype = FRUIT
|
||||
|
||||
/obj/item/reagent_containers/food/snacks/snowcones/orange
|
||||
name = "orange flavored snowcone"
|
||||
desc = "A orange flavor dizzled on a snowball in a paper cup."
|
||||
name = "orange snowcone"
|
||||
desc = "Orange syrup drizzled over a snowball in a paper cup."
|
||||
icon_state = "orange_sc"
|
||||
list_reagents = list("nutriment" = 1, "orangejuice" = 10)
|
||||
tastes = list("ice" = 1, "water" = 1, "berries" = 5)
|
||||
list_reagents = list("nutriment" = 1, "orangejuice" = 5)
|
||||
tastes = list("ice" = 1, "water" = 1, "orange" = 5)
|
||||
foodtype = FRUIT
|
||||
|
||||
/obj/item/reagent_containers/food/snacks/snowcones/blue
|
||||
name = "bluecherry flavored snowcone"
|
||||
desc = "A bluecharry flavord snowball in a paper cup, how rare!"
|
||||
icon_state = "red_sc"
|
||||
name = "bluecherry snowcone"
|
||||
desc = "Bluecherry syrup drizzled over a snowball in a paper cup, how rare!"
|
||||
icon_state = "blue_sc"
|
||||
list_reagents = list("nutriment" = 1, "bluecherryjelly" = 5)
|
||||
tastes = list("ice" = 1, "water" = 1, "blue" = 5)
|
||||
tastes = list("ice" = 1, "water" = 1, "blue" = 5, "cherries" = 5)
|
||||
foodtype = FRUIT
|
||||
|
||||
/obj/item/reagent_containers/food/snacks/snowcones/red
|
||||
name = "cherry flavored snowcone"
|
||||
desc = "A cherry flavord snowball in a paper cup."
|
||||
icon_state = "blue_sc"
|
||||
name = "cherry snowcone"
|
||||
desc = "Cherry syrup drizzled over a snowball in a paper cup."
|
||||
icon_state = "red_sc"
|
||||
list_reagents = list("nutriment" = 1, "cherryjelly" = 5)
|
||||
tastes = list("ice" = 1, "water" = 1, "red" = 5)
|
||||
tastes = list("ice" = 1, "water" = 1, "red" = 5, "cherries" = 5)
|
||||
foodtype = FRUIT
|
||||
|
||||
/obj/item/reagent_containers/food/snacks/snowcones/kiwi
|
||||
name = "kiwi flavored snowcone"
|
||||
desc = "A kiwi flavord snowball in a paper cup."
|
||||
name = "kiwi snowcone"
|
||||
desc = "A kiwi snowball in a paper cup."
|
||||
icon_state = "kiwi_sc"
|
||||
list_reagents = list("nutriment" = 3, "vitamin" = 6)
|
||||
tastes = list("ice" = 1, "space" = 3, "kiwi" = 5)
|
||||
foodtype = FRUIT
|
||||
|
||||
/obj/item/reagent_containers/food/snacks/snowcones/mix
|
||||
name = "mixed berry flavored snowcone"
|
||||
desc = "A mix of different flavors dizzled on a snowball in a paper cup."
|
||||
icon_state = "berry_sc"
|
||||
list_reagents = list("nutriment" = 1, "berryjuice" = 10)
|
||||
tastes = list("ice" = 1, "water" = 1, "berries" = 5)
|
||||
foodtype = FRUIT
|
||||
|
||||
/obj/item/reagent_containers/food/snacks/snowcones/peach
|
||||
name = "peach flavored snowcone"
|
||||
desc = "A peach flavord snowball in a paper cup."
|
||||
name = "peach snowcone"
|
||||
desc = "A peach snowball in a paper cup."
|
||||
icon_state = "peach_sc"
|
||||
list_reagents = list("nutriment" = 1, "peachjuice" = 10)
|
||||
tastes = list("ice" = 1, "water" = 1, " peach" = 5)
|
||||
foodtype = FRUIT
|
||||
|
||||
/obj/item/reagent_containers/food/snacks/snowcones/strawberry
|
||||
name = "strawberry flavored snowcone"
|
||||
desc = "A strawberry flavord snowball in a paper cup."
|
||||
name = "strawberry snowcone"
|
||||
desc = "A strawberry snowball in a paper cup."
|
||||
icon_state = "blue_sc"
|
||||
list_reagents = list("nutriment" = 1, "berryjuice" = 10)
|
||||
tastes = list("ice" = 1, "water" = 1, " strawberry" = 5)
|
||||
foodtype = FRUIT
|
||||
|
||||
/obj/item/reagent_containers/food/snacks/snowcones/berry
|
||||
name = "berry snowcone"
|
||||
desc = "Berry syrup drizzled over a snowball in a paper cup."
|
||||
icon_state = "berry_sc"
|
||||
list_reagents = list("nutriment" = 1, "berryjuice" = 5)
|
||||
tastes = list("ice" = 1, "water" = 1, "berries" = 5)
|
||||
foodtype = FRUIT
|
||||
|
||||
/obj/item/reagent_containers/food/snacks/snowcones/fruitsalad
|
||||
name = "mixed fruit flavored snowcone"
|
||||
desc = "A mix of different flavors dizzled on a snowball in a paper cup."
|
||||
name = "fruit salad snowcone"
|
||||
desc = "A delightful mix of citrus syrups drizzled over a snowball in a paper cup."
|
||||
icon_state = "fruitsalad_sc"
|
||||
list_reagents = list("nutriment" = 1, "limejuice" = 5, "lemonjuice" = 5, "orangejuice" = 5)
|
||||
tastes = list("ice" = 1, "water" = 1, "fruits" = 25)
|
||||
list_reagents = list("nutriment" = 1, "lemonjuice" = 5, "limejuice" = 5, "orangejuice" = 5)
|
||||
tastes = list("ice" = 1, "water" = 1, "oranges" = 5, "limes" = 5, "lemons" = 5, "citrus" = 5, "salad" = 5)
|
||||
foodtype = FRUIT
|
||||
|
||||
/obj/item/reagent_containers/food/snacks/snowcones/pineapple
|
||||
name = "pineapple flavored snowcone"
|
||||
desc = "A pineapple flavord snowball in a paper cup."
|
||||
name = "pineapple snowcone"
|
||||
desc = "Pineapple syrup drizzled over a snowball in a paper cup."
|
||||
icon_state = "pineapple_sc"
|
||||
list_reagents = list("nutriment" = 1, "water" = 1)
|
||||
list_reagents = list("nutriment" = 1, "water" = 10)
|
||||
tastes = list("ice" = 1, "water" = 1, "pineapples" = 5)
|
||||
foodtype = PINEAPPLE //Pineapple to allow all that like pineapple to enjoy
|
||||
|
||||
@@ -207,41 +206,46 @@
|
||||
desc = "..."
|
||||
icon_state = "mime_sc"
|
||||
list_reagents = list("nutriment" = 1, "nothing" = 5)
|
||||
tastes = list("nothing" = 5)
|
||||
tastes = list("ice" = 1, "water" = 1, "nothing" = 5)
|
||||
|
||||
/obj/item/reagent_containers/food/snacks/snowcones/clown
|
||||
name = "joke flavored snowcone"
|
||||
desc = "A waterd down jokeful flavord snowball in a paper cup."
|
||||
name = "clown snowcone"
|
||||
desc = "Laughter drizzled over a snowball in a paper cup."
|
||||
icon_state = "clown_sc"
|
||||
list_reagents = list("nutriment" = 1, "laughter" = 5)
|
||||
tastes = list("jokes" = 5, "brainfreeze" = 5, "joy" = 5)
|
||||
tastes = list("ice" = 1, "water" = 1, "jokes" = 5, "brainfreeze" = 5, "joy" = 5)
|
||||
|
||||
/obj/item/reagent_containers/food/snacks/snowcones/soda
|
||||
name = "sodawater flavored snowcone"
|
||||
desc = "A waterd down sodawater flavored snowcone snowball in a paper cup."
|
||||
name = "space cola snowcone"
|
||||
desc = "Space Cola drizzled over a snowball in a paper cup."
|
||||
icon_state = "soda_sc"
|
||||
list_reagents = list("nutriment" = 1, "sodawater" = 5)
|
||||
tastes = list("surgar" = 1, "water" = 5, "soda" = 5)
|
||||
foodtype = JUNKFOOD | SUGAR
|
||||
list_reagents = list("nutriment" = 1, "space_cola" = 5)
|
||||
tastes = list("ice" = 1, "water" = 1, "cola" = 5)
|
||||
|
||||
/obj/item/reagent_containers/food/snacks/snowcones/pwgrmer
|
||||
name = "pwergamer flavored snowcone"
|
||||
desc = "A waterd down pwergamer soda flavord snowball in a paper cup."
|
||||
icon_state = "pwergamer_sc"
|
||||
list_reagents = list("nutriment" = 1, "laughter" = 1)
|
||||
tastes = list("vaild" = 5, "salt" = 5, "wats" = 5)
|
||||
foodtype = JUNKFOOD | SUGAR
|
||||
/obj/item/reagent_containers/food/snacks/snowcones/spacemountainwind
|
||||
name = "Space Mountain Wind snowcone"
|
||||
desc = "Space Mountain Wind drizzled over a snowball in a paper cup."
|
||||
icon_state = "kiwi_sc"
|
||||
list_reagents = list("nutriment" = 1, "spacemountainwind" = 5)
|
||||
tastes = list("ice" = 1, "water" = 1, "mountain wind" = 5)
|
||||
|
||||
/obj/item/reagent_containers/food/snacks/snowcones/pwrgame
|
||||
name = "pwrgame snowcone"
|
||||
desc = "Pwrgame soda drizzled over a snowball in a paper cup."
|
||||
icon_state = "pwrgame_sc"
|
||||
list_reagents = list("nutriment" = 1, "pwr_game" = 5)
|
||||
tastes = list("ice" = 1, "water" = 1, "valid" = 5, "salt" = 5, "wats" = 5)
|
||||
|
||||
/obj/item/reagent_containers/food/snacks/snowcones/honey
|
||||
name = "honey flavored snowcone"
|
||||
desc = "A honey flavord snowball in a paper cup."
|
||||
icon_state = "honey_sc"
|
||||
name = "honey snowcone"
|
||||
desc = "Honey drizzled over a snowball in a paper cup."
|
||||
icon_state = "amber_sc"
|
||||
list_reagents = list("nutriment" = 1, "honey" = 5)
|
||||
tastes = list("pollen" = 5, "sweetness" = 5, "wax" = 1)
|
||||
tastes = list("ice" = 1, "water" = 1, "flowers" = 5, "sweetness" = 5, "wax" = 1)
|
||||
|
||||
/obj/item/reagent_containers/food/snacks/snowcones/rainbow
|
||||
name = "rainbow color snowcone"
|
||||
desc = "A rainbow color snowball in a paper cup."
|
||||
name = "rainbow snowcone"
|
||||
desc = "A very colorful snowball in a paper cup."
|
||||
icon_state = "rainbow_sc"
|
||||
list_reagents = list("nutriment" = 5, "laughter" = 25)
|
||||
tastes = list("sunlight" = 5, "light" = 5, "slime" = 5, "paint" = 3, "clouds" = 3)
|
||||
tastes = list("ice" = 1, "water" = 1, "sunlight" = 5, "light" = 5, "slime" = 5, "paint" = 3, "clouds" = 3)
|
||||
@@ -149,7 +149,7 @@
|
||||
bonus_reagents = list("nutriment" = 1, "vitamin" = 1)
|
||||
list_reagents = list("nutriment" = 6, "vitamin" = 1)
|
||||
tastes = list("meat" = 1)
|
||||
foodtype = MEAT
|
||||
foodtype = MEAT | BREAKFAST
|
||||
var/roasted = FALSE
|
||||
|
||||
/obj/item/reagent_containers/food/snacks/sausage/Initialize()
|
||||
@@ -344,3 +344,19 @@
|
||||
icon_state = "doubleratkebab"
|
||||
tastes = list("rat meat" = 2, "metal" = 1)
|
||||
bonus_reagents = list("nutriment" = 6, "vitamin" = 2)
|
||||
|
||||
/obj/item/reagent_containers/food/snacks/kebab/fiesta
|
||||
name = "fiesta skewer"
|
||||
icon_state = "fiestaskewer"
|
||||
tastes = list("tex-mex" = 3, "cumin" = 2)
|
||||
bonus_reagents = list("vitamin" = 5, "capsaicin" = 3)
|
||||
|
||||
/obj/item/reagent_containers/food/snacks/bbqribs
|
||||
name = "bbq ribs"
|
||||
desc = "BBQ ribs, slathered in a healthy coating of BBQ sauce. The least vegan thing to ever exist."
|
||||
icon_state = "ribs"
|
||||
w_class = WEIGHT_CLASS_NORMAL
|
||||
list_reagents = list("nutriment" = 8, "vitamin" = 2, "bbqsauce" = 5)
|
||||
bonus_reagents = list("nutriment" = 1, "vitamin" = 1)
|
||||
tastes = list("meat" = 3, "smokey sauce" = 1)
|
||||
foodtype = MEAT
|
||||
@@ -47,6 +47,7 @@
|
||||
filling_color = "#A0522D"
|
||||
tastes = list("chocolate" = 1)
|
||||
foodtype = JUNKFOOD | SUGAR
|
||||
dunkable = TRUE
|
||||
|
||||
/obj/item/reagent_containers/food/snacks/hugemushroomslice
|
||||
name = "huge mushroom slice"
|
||||
@@ -90,6 +91,7 @@
|
||||
filling_color = "#FFD700"
|
||||
tastes = list("fries" = 3, "salt" = 1)
|
||||
foodtype = VEGETABLES | GRAIN | FRIED
|
||||
dunkable = TRUE
|
||||
|
||||
/obj/item/reagent_containers/food/snacks/tatortot
|
||||
name = "tator tot"
|
||||
@@ -99,6 +101,7 @@
|
||||
filling_color = "FFD700"
|
||||
tastes = list("potato" = 3, "valids" = 1)
|
||||
foodtype = FRIED | VEGETABLES
|
||||
dunkable = TRUE
|
||||
|
||||
/obj/item/reagent_containers/food/snacks/soydope
|
||||
name = "soy dope"
|
||||
@@ -109,6 +112,7 @@
|
||||
filling_color = "#DEB887"
|
||||
tastes = list("soy" = 1)
|
||||
foodtype = VEGETABLES
|
||||
dunkable = TRUE
|
||||
|
||||
/obj/item/reagent_containers/food/snacks/cheesyfries
|
||||
name = "cheesy fries"
|
||||
@@ -128,6 +132,7 @@
|
||||
list_reagents = list("bad_food" = 30)
|
||||
filling_color = "#8B4513"
|
||||
foodtype = GROSS
|
||||
dunkable = TRUE
|
||||
|
||||
/obj/item/reagent_containers/food/snacks/carrotfries
|
||||
name = "carrot fries"
|
||||
@@ -401,7 +406,6 @@
|
||||
tastes = list("death" = 2, "rock" = 1, "meat" = 1, "hot peppers" = 1)
|
||||
foodtype = MEAT
|
||||
|
||||
|
||||
/obj/item/reagent_containers/food/snacks/powercrepe
|
||||
name = "Powercrepe"
|
||||
desc = "With great power, comes great crepes. It looks like a pancake filled with jelly but packs quite a punch."
|
||||
@@ -583,6 +587,7 @@
|
||||
filling_color = "#ffdf26"
|
||||
tastes = list("strawberries" = 5, "chocolate" = 3)
|
||||
foodtype = FRUIT | SUGAR
|
||||
dunkable = TRUE
|
||||
|
||||
/obj/item/reagent_containers/food/snacks/chocolatebanana
|
||||
name = "Chocolate dipped banana"
|
||||
@@ -591,4 +596,17 @@
|
||||
list_reagents = list("sugar" = 5, "nutriment" = 3, "vitamin" = 1)
|
||||
filling_color = "#ffdf26"
|
||||
tastes = list("banana" = 5, "chocolate" = 3)
|
||||
foodtype = FRUIT | SUGAR
|
||||
foodtype = FRUIT | SUGAR
|
||||
dunkable = TRUE
|
||||
|
||||
/obj/item/reagent_containers/food/snacks/cornchips
|
||||
name = "boritos corn chips"
|
||||
desc = "Triangular corn chips. They do seem a bit bland but would probably go well with some kind of dipping sauce."
|
||||
icon_state = "boritos"
|
||||
trash = /obj/item/trash/boritos
|
||||
bitesize = 2
|
||||
list_reagents = list("nutriment" = 3, "cooking_oil" = 2, "sodiumchloride" = 3)
|
||||
filling_color = "#ECA735"
|
||||
tastes = list("fried corn" = 1)
|
||||
foodtype = JUNKFOOD | FRIED
|
||||
dunkable = TRUE
|
||||
@@ -5,28 +5,31 @@
|
||||
/obj/item/reagent_containers/food/snacks/donut
|
||||
name = "donut"
|
||||
desc = "Goes great with robust coffee."
|
||||
icon_state = "donut1"
|
||||
icon = 'icons/obj/food/donut.dmi'
|
||||
icon_state = "donut"
|
||||
bitesize = 5
|
||||
bonus_reagents = list("sugar" = 1)
|
||||
list_reagents = list("nutriment" = 3, "sprinkles" = 1, "sugar" = 2)
|
||||
filling_color = "#D2691E"
|
||||
tastes = list("donut" = 1)
|
||||
foodtype = JUNKFOOD | GRAIN | FRIED | SUGAR
|
||||
var/frosted_icon = "donut2"
|
||||
var/is_frosted = FALSE
|
||||
foodtype = JUNKFOOD | GRAIN | FRIED | SUGAR | BREAKFAST
|
||||
dunkable = TRUE
|
||||
var/decorated_icon = "donut_homer"
|
||||
var/is_decorated = FALSE
|
||||
var/extra_reagent = null
|
||||
var/decorated_adjective = "sprinkled"
|
||||
|
||||
/obj/item/reagent_containers/food/snacks/donut/Initialize()
|
||||
. = ..()
|
||||
if(prob(30))
|
||||
frost_donut()
|
||||
decorate_donut()
|
||||
|
||||
/obj/item/reagent_containers/food/snacks/donut/proc/frost_donut()
|
||||
if(is_frosted || !frosted_icon)
|
||||
/obj/item/reagent_containers/food/snacks/donut/proc/decorate_donut()
|
||||
if(is_decorated || !decorated_icon)
|
||||
return
|
||||
is_frosted = TRUE
|
||||
name = "frosted [name]"
|
||||
icon_state = frosted_icon //delish~!
|
||||
is_decorated = TRUE
|
||||
name = "[decorated_adjective] [name]"
|
||||
icon_state = decorated_icon //delish~!
|
||||
reagents.add_reagent("sprinkles", 1)
|
||||
filling_color = "#FF69B4"
|
||||
return TRUE
|
||||
@@ -43,64 +46,283 @@
|
||||
return
|
||||
..()
|
||||
|
||||
/obj/item/reagent_containers/food/snacks/donut/plain
|
||||
//Use this donut ingame
|
||||
|
||||
/obj/item/reagent_containers/food/snacks/donut/chaos
|
||||
name = "chaos donut"
|
||||
desc = "Like life, it never quite tastes the same."
|
||||
icon_state = "donut_chaos"
|
||||
bitesize = 10
|
||||
tastes = list("donut" = 3, "chaos" = 1)
|
||||
|
||||
/obj/item/reagent_containers/food/snacks/donut/chaos/Initialize()
|
||||
. = ..()
|
||||
extra_reagent = pick("nutriment", "capsaicin", "frostoil", "krokodil", "plasma", "cocoa", "slimejelly", "banana", "berryjuice", "omnizine")
|
||||
reagents.add_reagent("[extra_reagent]", 3)
|
||||
reagents.add_reagent(extra_reagent, 3)
|
||||
|
||||
/obj/item/reagent_containers/food/snacks/donut/meat
|
||||
name = "Meat Donut"
|
||||
desc = "Tastes as gross as it looks."
|
||||
icon_state = "donut_meat"
|
||||
bonus_reagents = list("ketchup" = 1)
|
||||
list_reagents = list("nutriment" = 3, "ketchup" = 2)
|
||||
tastes = list("meat" = 1)
|
||||
foodtype = JUNKFOOD | MEAT | GROSS | FRIED | BREAKFAST
|
||||
|
||||
/obj/item/reagent_containers/food/snacks/donut/berry
|
||||
name = "pink donut"
|
||||
desc = "Goes great with a soy latte."
|
||||
icon_state = "donut_pink"
|
||||
bonus_reagents = list("berryjuice" = 3, "sprinkles" = 1) //Extra sprinkles to reward frosting
|
||||
filling_color = "#E57d9A"
|
||||
decorated_icon = "donut_homer"
|
||||
|
||||
/obj/item/reagent_containers/food/snacks/donut/trumpet
|
||||
name = "spaceman's donut"
|
||||
desc = "Goes great with a cold beaker of malk."
|
||||
icon_state = "donut_purple"
|
||||
bonus_reagents = list("polypyr" = 3, "sprinkles" = 1)
|
||||
tastes = list("donut" = 3, "violets" = 1)
|
||||
is_decorated = TRUE
|
||||
filling_color = "#8739BF"
|
||||
|
||||
/obj/item/reagent_containers/food/snacks/donut/apple
|
||||
name = "apple donut"
|
||||
desc = "Goes great with a shot of cinnamon schnapps."
|
||||
icon_state = "donut_green"
|
||||
bonus_reagents = list("applejuice" = 3, "sprinkles" = 1)
|
||||
tastes = list("donut" = 3, "green apples" = 1)
|
||||
is_decorated = TRUE
|
||||
filling_color = "#6ABE30"
|
||||
|
||||
/obj/item/reagent_containers/food/snacks/donut/caramel
|
||||
name = "caramel donut"
|
||||
desc = "Goes great with a mug of hot coco."
|
||||
icon_state = "donut_beige"
|
||||
bonus_reagents = list("caramel" = 3, "sprinkles" = 1)
|
||||
tastes = list("donut" = 3, "buttery sweetness" = 1)
|
||||
is_decorated = TRUE
|
||||
filling_color = "#D4AD5B"
|
||||
|
||||
/obj/item/reagent_containers/food/snacks/donut/choco
|
||||
name = "chocolate donut"
|
||||
desc = "Goes great with a glass of warm milk."
|
||||
icon_state = "donut_choc"
|
||||
bonus_reagents = list("hot_coco" = 3, "sprinkles" = 1) //the coco reagent is just bitter.
|
||||
tastes = list("donut" = 4, "bitterness" = 1)
|
||||
decorated_icon = "donut_choc_sprinkles"
|
||||
filling_color = "#4F230D"
|
||||
|
||||
/obj/item/reagent_containers/food/snacks/donut/blumpkin
|
||||
name = "blumpkin donut"
|
||||
desc = "Goes great with a mug of soothing drunken blumpkin."
|
||||
icon_state = "donut_blue"
|
||||
bonus_reagents = list("blumpkinjuice" = 3, "sprinkles" = 1)
|
||||
tastes = list("donut" = 2, "blumpkin" = 1)
|
||||
is_decorated = TRUE
|
||||
filling_color = "#2788C4"
|
||||
|
||||
/obj/item/reagent_containers/food/snacks/donut/bungo
|
||||
name = "bungo donut"
|
||||
desc = "Goes great with a mason jar of hippie's delight."
|
||||
icon_state = "donut_yellow"
|
||||
bonus_reagents = list("bungojuice" = 3, "sprinkles" = 1)
|
||||
tastes = list("donut" = 3, "tropical sweetness" = 1)
|
||||
is_decorated = TRUE
|
||||
filling_color = "#DEC128"
|
||||
|
||||
/obj/item/reagent_containers/food/snacks/donut/matcha
|
||||
name = "matcha donut"
|
||||
desc = "Goes great with a cup of tea."
|
||||
icon_state = "donut_olive"
|
||||
bonus_reagents = list("teapowder = 3", "sprinkles" = 1)
|
||||
tastes = list("donut" = 3, "matcha" = 1)
|
||||
is_decorated = TRUE
|
||||
filling_color = "#879630"
|
||||
|
||||
//////////////////////JELLY DONUTS/////////////////////////
|
||||
|
||||
/obj/item/reagent_containers/food/snacks/donut/jelly
|
||||
name = "jelly donut"
|
||||
desc = "You jelly?"
|
||||
icon_state = "jdonut1"
|
||||
frosted_icon = "jdonut2"
|
||||
icon_state = "jelly"
|
||||
decorated_icon = "jelly_homer"
|
||||
bonus_reagents = list("sugar" = 1, "vitamin" = 1)
|
||||
extra_reagent = "berryjuice"
|
||||
tastes = list("jelly" = 1, "donut" = 3)
|
||||
foodtype = JUNKFOOD | GRAIN | FRIED | FRUIT | SUGAR
|
||||
foodtype = JUNKFOOD | GRAIN | FRIED | FRUIT | SUGAR | BREAKFAST
|
||||
|
||||
/obj/item/reagent_containers/food/snacks/donut/jelly/Initialize()
|
||||
. = ..()
|
||||
if(extra_reagent)
|
||||
reagents.add_reagent("[extra_reagent]", 3)
|
||||
|
||||
/obj/item/reagent_containers/food/snacks/donut/jelly/plain //use this ingame to avoid inheritance related crafting issues.
|
||||
|
||||
/obj/item/reagent_containers/food/snacks/donut/jelly/berry
|
||||
name = "pink jelly donut"
|
||||
desc = "Goes great with a soy latte."
|
||||
icon_state = "jelly_pink"
|
||||
bonus_reagents = list("berryjuice" = 3, "sprinkles" = 1, "vitamin" = 1) //Extra sprinkles to reward frosting.
|
||||
filling_color = "#E57d9A"
|
||||
decorated_icon = "jelly_homer"
|
||||
|
||||
/obj/item/reagent_containers/food/snacks/donut/jelly/trumpet
|
||||
name = "spaceman's jelly donut"
|
||||
desc = "Goes great with a cold beaker of malk."
|
||||
icon_state = "jelly_purple"
|
||||
bonus_reagents = list("polypyr" = 3, "sprinkles" = 1, "vitamin" = 1)
|
||||
tastes = list("jelly" = 1, "donut" = 3, "violets" = 1)
|
||||
is_decorated = TRUE
|
||||
filling_color = "#8739BF"
|
||||
|
||||
/obj/item/reagent_containers/food/snacks/donut/jelly/apple
|
||||
name = "apple jelly donut"
|
||||
desc = "Goes great with a shot of cinnamon schnapps."
|
||||
icon_state = "jelly_green"
|
||||
bonus_reagents = list("applejuice" = 3, "sprinkles" = 1, "vitamin" = 1)
|
||||
tastes = list("jelly" = 1, "donut" = 3, "green apples" = 1)
|
||||
is_decorated = TRUE
|
||||
filling_color = "#6ABE30"
|
||||
|
||||
/obj/item/reagent_containers/food/snacks/donut/jelly/caramel
|
||||
name = "caramel jelly donut"
|
||||
desc = "Goes great with a mug of hot coco."
|
||||
icon_state = "jelly_beige"
|
||||
bonus_reagents = list("caramel" = 3, "sprinkles" = 1, "vitamin" = 1)
|
||||
tastes = list("jelly" = 1, "donut" = 3, "buttery sweetness" = 1)
|
||||
is_decorated = TRUE
|
||||
filling_color = "#D4AD5B"
|
||||
|
||||
/obj/item/reagent_containers/food/snacks/donut/jelly/choco
|
||||
name = "chocolate jelly donut"
|
||||
desc = "Goes great with a glass of warm milk."
|
||||
icon_state = "jelly_choc"
|
||||
bonus_reagents = list("hot_coco" = 3, "sprinkles" = 1, "vitamin" = 1) //the coco reagent is just bitter.
|
||||
tastes = list("jelly" = 1, "donut" = 4, "bitterness" = 1)
|
||||
decorated_icon = "jelly_choc_sprinkles"
|
||||
filling_color = "#4F230D"
|
||||
|
||||
/obj/item/reagent_containers/food/snacks/donut/jelly/blumpkin
|
||||
name = "blumpkin jelly donut"
|
||||
desc = "Goes great with a mug of soothing drunken blumpkin."
|
||||
icon_state = "jelly_blue"
|
||||
bonus_reagents = list("blumpkinjuice" = 3, "sprinkles" = 1, "vitamin" = 1)
|
||||
tastes = list("jelly" = 1, "donut" = 2, "blumpkin" = 1)
|
||||
is_decorated = TRUE
|
||||
filling_color = "#2788C4"
|
||||
|
||||
/obj/item/reagent_containers/food/snacks/donut/jelly/bungo
|
||||
name = "bungo jelly donut"
|
||||
desc = "Goes great with a mason jar of hippie's delight."
|
||||
icon_state = "jelly_yellow"
|
||||
bonus_reagents = list("bungojuice" = 3, "sprinkles" = 1, "vitamin" = 1)
|
||||
tastes = list("jelly" = 1, "donut" = 3, "tropical sweetness" = 1)
|
||||
is_decorated = TRUE
|
||||
filling_color = "#DEC128"
|
||||
|
||||
/obj/item/reagent_containers/food/snacks/donut/jelly/matcha
|
||||
name = "matcha jelly donut"
|
||||
desc = "Goes great with a cup of tea."
|
||||
icon_state = "jelly_olive"
|
||||
bonus_reagents = list("teapowder" = 3, "sprinkles" = 1, "vitamin" = 1)
|
||||
tastes = list("jelly" = 1, "donut" = 3, "matcha" = 1)
|
||||
is_decorated = TRUE
|
||||
filling_color = "#879630"
|
||||
|
||||
//////////////////////////SLIME DONUTS/////////////////////////
|
||||
|
||||
/obj/item/reagent_containers/food/snacks/donut/jelly/slimejelly
|
||||
name = "jelly donut"
|
||||
desc = "You jelly?"
|
||||
icon_state = "jdonut1"
|
||||
icon_state = "jelly"
|
||||
extra_reagent = "slimejelly"
|
||||
foodtype = JUNKFOOD | GRAIN | FRIED | TOXIC | SUGAR
|
||||
foodtype = JUNKFOOD | GRAIN | FRIED | TOXIC | SUGAR | BREAKFAST
|
||||
|
||||
/obj/item/reagent_containers/food/snacks/donut/jelly/cherryjelly
|
||||
name = "jelly donut"
|
||||
desc = "You jelly?"
|
||||
icon_state = "jdonut1"
|
||||
extra_reagent = "cherryjelly"
|
||||
foodtype = JUNKFOOD | GRAIN | FRIED | FRUIT
|
||||
/obj/item/reagent_containers/food/snacks/donut/jelly/slimejelly/plain
|
||||
|
||||
/obj/item/reagent_containers/food/snacks/donut/meat
|
||||
bonus_reagents = list("ketchup" = 1)
|
||||
list_reagents = list("nutriment" = 3, "ketchup" = 2)
|
||||
tastes = list("meat" = 1)
|
||||
foodtype = JUNKFOOD | MEAT | GROSS | FRIED
|
||||
/obj/item/reagent_containers/food/snacks/donut/jelly/slimejelly/berry
|
||||
name = "pink jelly donut"
|
||||
desc = "Goes great with a soy latte."
|
||||
icon_state = "jelly_pink"
|
||||
bonus_reagents = list("berryjuice" = 3, "sprinkles" = 1, "vitamin" = 1) //Extra sprinkles to reward frosting
|
||||
filling_color = "#E57d9A"
|
||||
|
||||
/obj/item/reagent_containers/food/snacks/donut/semen
|
||||
name = "\"cream\" donut"
|
||||
desc = "That cream looks a little runny..."
|
||||
icon_state = "donut3"
|
||||
/obj/item/reagent_containers/food/snacks/donut/jelly/slimejelly/trumpet
|
||||
name = "spaceman's jelly donut"
|
||||
desc = "Goes great with a cold beaker of malk."
|
||||
icon_state = "jelly_purple"
|
||||
bonus_reagents = list("polypyr" = 3, "sprinkles" = 1, "vitamin" = 1)
|
||||
tastes = list("jelly" = 1, "donut" = 3, "violets" = 1)
|
||||
is_decorated = TRUE
|
||||
filling_color = "#8739BF"
|
||||
|
||||
/obj/item/reagent_containers/food/snacks/donut/jelly/slimejelly/apple
|
||||
name = "apple jelly donut"
|
||||
desc = "Goes great with a shot of cinnamon schnapps."
|
||||
icon_state = "jelly_green"
|
||||
bonus_reagents = list("applejuice" = 3, "sprinkles" = 1, "vitamin" = 1)
|
||||
tastes = list("jelly" = 1, "donut" = 3, "green apples" = 1)
|
||||
is_decorated = TRUE
|
||||
filling_color = "#6ABE30"
|
||||
|
||||
/obj/item/reagent_containers/food/snacks/donut/jelly/slimejelly/caramel
|
||||
name = "caramel jelly donut"
|
||||
desc = "Goes great with a mug of hot coco."
|
||||
icon_state = "jelly_beige"
|
||||
bonus_reagents = list("caramel" = 3, "sprinkles" = 1, "vitamin" = 1)
|
||||
tastes = list("jelly" = 1, "donut" = 3, "buttery sweetness" = 1)
|
||||
is_decorated = TRUE
|
||||
filling_color = "#D4AD5B"
|
||||
|
||||
/obj/item/reagent_containers/food/snacks/donut/jelly/slimejelly/choco
|
||||
name = "chocolate jelly donut"
|
||||
desc = "Goes great with a glass of warm milk."
|
||||
icon_state = "jelly_choc"
|
||||
bonus_reagents = list("hot_coco" = 3, "sprinkles" = 1, "vitamin" = 1) //the coco reagent is just bitter.
|
||||
tastes = list("jelly" = 1, "donut" = 4, "bitterness" = 1)
|
||||
decorated_icon = "jelly_choc_sprinkles"
|
||||
filling_color = "#4F230D"
|
||||
|
||||
/obj/item/reagent_containers/food/snacks/donut/jelly/slimejelly/blumpkin
|
||||
name = "blumpkin jelly donut"
|
||||
desc = "Goes great with a mug of soothing drunken blumpkin."
|
||||
icon_state = "jelly_blue"
|
||||
bonus_reagents = list("blumpkinjuice" = 3, "sprinkles" = 1, "vitamin" = 1)
|
||||
tastes = list("jelly" = 1, "donut" = 2, "blumpkin" = 1)
|
||||
is_decorated = TRUE
|
||||
filling_color = "#2788C4"
|
||||
|
||||
/obj/item/reagent_containers/food/snacks/donut/jelly/slimejelly/bungo
|
||||
name = "bungo jelly donut"
|
||||
desc = "Goes great with a mason jar of hippie's delight."
|
||||
icon_state = "jelly_yellow"
|
||||
bonus_reagents = list("bungojuice" = 3, "sprinkles" = 1, "vitamin" = 1)
|
||||
tastes = list("jelly" = 1, "donut" = 3, "tropical sweetness" = 1)
|
||||
is_decorated = TRUE
|
||||
filling_color = "#DEC128"
|
||||
|
||||
/obj/item/reagent_containers/food/snacks/donut/jelly/slimejelly/matcha
|
||||
name = "matcha jelly donut"
|
||||
desc = "Goes great with a cup of tea."
|
||||
icon_state = "jelly_olive"
|
||||
bonus_reagents = list("teapowder" = 3, "sprinkles" = 1, "vitamin" = 1)
|
||||
tastes = list("jelly" = 1, "donut" = 3, "matcha" = 1)
|
||||
is_decorated = TRUE
|
||||
filling_color = "#879630"
|
||||
|
||||
/obj/item/reagent_containers/food/snacks/donut/glaze
|
||||
name = "glazed donut"
|
||||
desc = "A sugar glazed donut."
|
||||
icon_state = "donut_glaze"
|
||||
bitesize = 10
|
||||
bonus_reagents = list("semen" = 1)
|
||||
list_reagents = list("nutriment" = 3, "sugar" = 2, "semen" = 5)
|
||||
bonus_reagents = list("sugar" = 3)
|
||||
list_reagents = list("nutriment" = 3, "sugar" = 8)
|
||||
filling_color = "#FFFFFF"
|
||||
tastes = list("donut" = 1, "salt" = 3)
|
||||
foodtype = JUNKFOOD | GRAIN | FRIED | SUGAR
|
||||
|
||||
|
||||
////////////////////////////////////////////MUFFINS////////////////////////////////////////////
|
||||
|
||||
/obj/item/reagent_containers/food/snacks/muffin
|
||||
@@ -111,14 +333,14 @@
|
||||
list_reagents = list("nutriment" = 6)
|
||||
filling_color = "#F4A460"
|
||||
tastes = list("muffin" = 1)
|
||||
foodtype = GRAIN | SUGAR
|
||||
foodtype = GRAIN | SUGAR | BREAKFAST
|
||||
|
||||
/obj/item/reagent_containers/food/snacks/muffin/berry
|
||||
name = "berry muffin"
|
||||
icon_state = "berrymuffin"
|
||||
desc = "A delicious and spongy little cake, with berries."
|
||||
tastes = list("muffin" = 3, "berry" = 1)
|
||||
foodtype = GRAIN | FRUIT | SUGAR
|
||||
foodtype = GRAIN | FRUIT | SUGAR | BREAKFAST
|
||||
|
||||
/obj/item/reagent_containers/food/snacks/muffin/booberry
|
||||
name = "booberry muffin"
|
||||
@@ -126,7 +348,7 @@
|
||||
alpha = 125
|
||||
desc = "My stomach is a graveyard! No living being can quench my bloodthirst!"
|
||||
tastes = list("muffin" = 3, "spookiness" = 1)
|
||||
foodtype = GRAIN | FRUIT | SUGAR
|
||||
foodtype = GRAIN | FRUIT | SUGAR | BREAKFAST
|
||||
|
||||
/obj/item/reagent_containers/food/snacks/chawanmushi
|
||||
name = "chawanmushi"
|
||||
@@ -149,7 +371,7 @@
|
||||
list_reagents = list("nutriment" = 8, "vitamin" = 1)
|
||||
filling_color = "#D2691E"
|
||||
tastes = list("waffles" = 1)
|
||||
foodtype = GRAIN | SUGAR
|
||||
foodtype = GRAIN | SUGAR | BREAKFAST
|
||||
|
||||
/obj/item/reagent_containers/food/snacks/soylentgreen
|
||||
name = "\improper Soylent Green"
|
||||
@@ -160,7 +382,7 @@
|
||||
list_reagents = list("nutriment" = 10, "vitamin" = 1)
|
||||
filling_color = "#9ACD32"
|
||||
tastes = list("waffles" = 7, "people" = 1)
|
||||
foodtype = GRAIN | GROSS | MEAT
|
||||
foodtype = GRAIN | MEAT
|
||||
|
||||
/obj/item/reagent_containers/food/snacks/soylenviridians
|
||||
name = "\improper Soylent Virdians"
|
||||
@@ -183,7 +405,7 @@
|
||||
list_reagents = list("nutriment" = 8, "mushroomhallucinogen" = 2, "vitamin" = 2)
|
||||
filling_color = "#00BFFF"
|
||||
tastes = list("waffle" = 1, "mushrooms" = 1)
|
||||
foodtype = GRAIN | VEGETABLES | TOXIC | SUGAR
|
||||
foodtype = GRAIN | VEGETABLES | SUGAR | BREAKFAST
|
||||
|
||||
////////////////////////////////////////////OTHER////////////////////////////////////////////
|
||||
|
||||
@@ -196,7 +418,8 @@
|
||||
list_reagents = list("nutriment" = 1)
|
||||
filling_color = "#F0E68C"
|
||||
tastes = list("cookie" = 1)
|
||||
foodtype = SUGAR
|
||||
foodtype = GRAIN | SUGAR
|
||||
dunkable = TRUE
|
||||
|
||||
/obj/item/reagent_containers/food/snacks/donkpocket
|
||||
name = "\improper Donk-pocket"
|
||||
@@ -213,6 +436,7 @@
|
||||
desc = "The heated food of choice for the seasoned traitor."
|
||||
bonus_reagents = list("omnizine" = 3)
|
||||
list_reagents = list("nutriment" = 4, "omnizine" = 3)
|
||||
cooked_type = null
|
||||
tastes = list("meat" = 2, "dough" = 2, "laziness" = 1)
|
||||
foodtype = GRAIN
|
||||
|
||||
@@ -315,6 +539,7 @@
|
||||
filling_color = "#CD853F"
|
||||
tastes = list("sweetness" = 1)
|
||||
foodtype = GRAIN | JUNKFOOD | SUGAR
|
||||
dunkable = TRUE
|
||||
|
||||
/obj/item/reagent_containers/food/snacks/chococornet
|
||||
name = "chocolate cornet"
|
||||
@@ -335,6 +560,7 @@
|
||||
filling_color = "#D2691E"
|
||||
tastes = list("cookie" = 2, "oat" = 1)
|
||||
foodtype = GRAIN
|
||||
dunkable = TRUE
|
||||
|
||||
/obj/item/reagent_containers/food/snacks/raisincookie
|
||||
name = "raisin cookie"
|
||||
@@ -345,6 +571,7 @@
|
||||
filling_color = "#F0E68C"
|
||||
tastes = list("cookie" = 1, "raisins" = 1)
|
||||
foodtype = GRAIN | FRUIT
|
||||
dunkable = TRUE
|
||||
|
||||
/obj/item/reagent_containers/food/snacks/cherrycupcake
|
||||
name = "cherry cupcake"
|
||||
@@ -367,7 +594,7 @@
|
||||
foodtype = GRAIN | FRUIT | SUGAR
|
||||
|
||||
/obj/item/reagent_containers/food/snacks/strawberrycupcake
|
||||
name = "Strawberry cupcake"
|
||||
name = "strawberry cupcake"
|
||||
desc = "Strawberry inside a delicious cupcake."
|
||||
icon_state = "strawberrycupcake"
|
||||
bonus_reagents = list("nutriment" = 1, "vitamin" = 3)
|
||||
@@ -384,9 +611,9 @@
|
||||
list_reagents = list("nutriment" = 5, "honey" = 5)
|
||||
filling_color = "#F2CE91"
|
||||
tastes = list("pastry" = 1, "sweetness" = 1)
|
||||
foodtype = GRAIN
|
||||
foodtype = GRAIN | SUGAR
|
||||
|
||||
#define PANCAKE_MAX_STACK 30
|
||||
#define PANCAKE_MAX_STACK 10
|
||||
|
||||
/obj/item/reagent_containers/food/snacks/pancakes
|
||||
name = "pancake"
|
||||
@@ -397,7 +624,7 @@
|
||||
list_reagents = list("nutriment" = 4, "vitamin" = 1)
|
||||
filling_color = "#D2691E"
|
||||
tastes = list("pancakes" = 1)
|
||||
foodtype = GRAIN | SUGAR
|
||||
foodtype = GRAIN | SUGAR | BREAKFAST
|
||||
|
||||
/obj/item/reagent_containers/food/snacks/pancakes/blueberry
|
||||
name = "blueberry pancake"
|
||||
|
||||
@@ -47,7 +47,7 @@
|
||||
bonus_reagents = list("nutriment" = 4, "vitamin" = 4)
|
||||
list_reagents = list("nutriment" = 7, "milk" = 10, "vitamin" = 2)
|
||||
tastes = list("oats" = 1, "milk" = 1)
|
||||
foodtype = DAIRY | GRAIN
|
||||
foodtype = DAIRY | GRAIN | BREAKFAST
|
||||
|
||||
/obj/item/reagent_containers/food/snacks/salad/fruit
|
||||
name = "fruit salad"
|
||||
@@ -55,7 +55,7 @@
|
||||
icon_state = "fruitsalad"
|
||||
bonus_reagents = list("nutriment" = 2, "vitamin" = 4)
|
||||
tastes = list("fruit" = 1)
|
||||
foodtype = FRUIT
|
||||
foodtype = FRUIT | BREAKFAST
|
||||
|
||||
/obj/item/reagent_containers/food/snacks/salad/jungle
|
||||
name = "jungle salad"
|
||||
@@ -64,7 +64,7 @@
|
||||
bonus_reagents = list("nutriment" = 4, "vitamin" = 4)
|
||||
list_reagents = list("nutriment" = 7, "banana" = 5, "vitamin" = 4)
|
||||
tastes = list("fruit" = 1, "the jungle" = 1)
|
||||
foodtype = FRUIT
|
||||
foodtype = FRUIT | BREAKFAST
|
||||
|
||||
/obj/item/reagent_containers/food/snacks/salad/citrusdelight
|
||||
name = "citrus delight"
|
||||
@@ -73,7 +73,7 @@
|
||||
bonus_reagents = list("nutriment" = 4, "vitamin" = 4)
|
||||
list_reagents = list("nutriment" = 7, "vitamin" = 5)
|
||||
tastes = list("sourness" = 1, "leaves" = 1)
|
||||
foodtype = FRUIT
|
||||
foodtype = FRUIT | BREAKFAST
|
||||
|
||||
/obj/item/reagent_containers/food/snacks/salad/ricebowl
|
||||
name = "ricebowl"
|
||||
@@ -91,7 +91,7 @@
|
||||
bonus_reagents = list("nutriment" = 1, "vitamin" = 1)
|
||||
list_reagents = list("nutriment" = 5, "vitamin" = 1)
|
||||
tastes = list("rice" = 1)
|
||||
foodtype = GRAIN
|
||||
foodtype = GRAIN | BREAKFAST
|
||||
|
||||
/obj/item/reagent_containers/food/snacks/salad/ricepudding
|
||||
name = "rice pudding"
|
||||
|
||||
@@ -225,3 +225,22 @@
|
||||
bonus_reagents = list("nutriment" = 4, "vitamin" = 6)
|
||||
tastes = list("beet" = 1)
|
||||
foodtype = VEGETABLES
|
||||
|
||||
/obj/item/reagent_containers/food/snacks/soup/electron
|
||||
name = "electron soup"
|
||||
desc = "A gastronomic curiosity of ethereal origin. It is famed for the minature weather system formed over a properly prepared soup."
|
||||
icon_state = "electronsoup"
|
||||
list_reagents = list("nutriment" = 3, "liquidelectricity" = 5)
|
||||
tastes = list("mushroom" = 1, "electrons" = 4, "shockingly good")
|
||||
filling_color = "#CC2B52"
|
||||
foodtype = VEGETABLES | TOXIC
|
||||
|
||||
/obj/item/reagent_containers/food/snacks/soup/bungocurry
|
||||
name = "bungo curry"
|
||||
desc = "A spicy vegetable curry made with the humble bungo fruit, Exotic!"
|
||||
icon_state = "bungocurry"
|
||||
bonus_reagents = list("vitamin" = 11)
|
||||
list_reagents = list("nutriment" = 6, "capsaicin" = 5)
|
||||
tastes = list("bungo" = 2, "hot curry" = 4, "tropical sweetness" = 1)
|
||||
filling_color = "#E6A625"
|
||||
foodtype = VEGETABLES | FRUIT | DAIRY
|
||||
|
||||
@@ -80,6 +80,9 @@ God bless America.
|
||||
I.reagents.trans_to(src, I.reagents.total_volume)
|
||||
qdel(I)
|
||||
return
|
||||
if(istype(I,/obj/item/clothing/head/mob_holder))
|
||||
to_chat(user, "<span class='warning'>This does not fit in the fryer.</span>") // TODO: Deepfrying instakills mobs, spawns a whole deep-fried mob.
|
||||
return
|
||||
if(!reagents.has_reagent("cooking_oil"))
|
||||
to_chat(user, "<span class='warning'>[src] has no cooking oil to fry with!</span>")
|
||||
return
|
||||
|
||||
@@ -0,0 +1,139 @@
|
||||
/obj/machinery/grill
|
||||
name = "grill"
|
||||
desc = "Just like the old days."
|
||||
icon = 'icons/obj/kitchen.dmi'
|
||||
icon_state = "grill_open"
|
||||
density = TRUE
|
||||
layer = BELOW_OBJ_LAYER
|
||||
use_power = NO_POWER_USE
|
||||
var/grill_fuel = 0
|
||||
var/obj/item/reagent_containers/food/grilled_item
|
||||
var/grill_time = 0
|
||||
var/datum/looping_sound/grill/grill_loop
|
||||
|
||||
/obj/machinery/grill/Initialize()
|
||||
. = ..()
|
||||
grill_loop = new(list(src), FALSE)
|
||||
|
||||
/obj/machinery/grill/update_icon()
|
||||
if(grilled_item)
|
||||
icon_state = "grill"
|
||||
else if(grill_fuel)
|
||||
icon_state = "grill_on"
|
||||
else
|
||||
icon_state = "grill_open"
|
||||
|
||||
/obj/machinery/grill/attackby(obj/item/I, mob/user)
|
||||
if(istype(I, /obj/item/stack/sheet/mineral/coal) || istype(I, /obj/item/stack/sheet/mineral/wood))
|
||||
var/obj/item/stack/S = I
|
||||
var/stackamount = S.get_amount()
|
||||
to_chat(user, "<span class='notice'>You put [stackamount] [I]s in [src].</span>")
|
||||
if(istype(I, /obj/item/stack/sheet/mineral/coal))
|
||||
grill_fuel += (500 * stackamount)
|
||||
else
|
||||
grill_fuel += (50 * stackamount)
|
||||
S.use(stackamount)
|
||||
update_icon()
|
||||
return
|
||||
if(I.resistance_flags & INDESTRUCTIBLE)
|
||||
to_chat(user, "<span class='warning'>You don't feel it would be wise to grill [I]...</span>")
|
||||
return ..()
|
||||
if(istype(I, /obj/item/reagent_containers))
|
||||
if(istype(I, /obj/item/reagent_containers/food) && !istype(I, /obj/item/reagent_containers/food/drinks))
|
||||
if(HAS_TRAIT(I, TRAIT_NODROP) || (I.item_flags & (ABSTRACT | DROPDEL)))
|
||||
return ..()
|
||||
else if(!grill_fuel)
|
||||
to_chat(user, "<span class='notice'>There is not enough fuel.</span>")
|
||||
return
|
||||
else if(!grilled_item && user.transferItemToLoc(I, src))
|
||||
grilled_item = I
|
||||
to_chat(user, "<span class='notice'>You put the [grilled_item] on [src].</span>")
|
||||
update_icon()
|
||||
grill_loop.start()
|
||||
return
|
||||
else
|
||||
if(I.reagents.has_reagent("monkey_energy"))
|
||||
grill_fuel += (20 * (I.reagents.get_reagent_amount("monkey_energy")))
|
||||
to_chat(user, "<span class='notice'>You pour the Monkey Energy in [src].</span>")
|
||||
I.reagents.remove_reagent("monkey_energy", I.reagents.get_reagent_amount("monkey_energy"))
|
||||
update_icon()
|
||||
return
|
||||
..()
|
||||
|
||||
/obj/machinery/grill/process()
|
||||
..()
|
||||
update_icon()
|
||||
if(!grill_fuel)
|
||||
return
|
||||
else
|
||||
grill_fuel -= 1
|
||||
if(prob(1))
|
||||
var/datum/effect_system/smoke_spread/bad/smoke = new
|
||||
smoke.set_up(1, loc)
|
||||
smoke.start()
|
||||
if(grilled_item)
|
||||
grill_time += 1
|
||||
grilled_item.reagents.add_reagent("char", 1)
|
||||
grill_fuel -= 10
|
||||
grilled_item.AddComponent(/datum/component/sizzle)
|
||||
|
||||
/obj/machinery/grill/Exited(atom/movable/AM)
|
||||
if(AM == grilled_item)
|
||||
finish_grill()
|
||||
grilled_item = null
|
||||
..()
|
||||
|
||||
/obj/machinery/grill/Destroy()
|
||||
grilled_item = null
|
||||
. = ..()
|
||||
|
||||
/obj/machinery/grill/handle_atom_del(atom/A)
|
||||
if(A == grilled_item)
|
||||
grilled_item = null
|
||||
. = ..()
|
||||
|
||||
/obj/machinery/grill/wrench_act(mob/living/user, obj/item/I)
|
||||
. = ..()
|
||||
if(default_unfasten_wrench(user, I) != CANT_UNFASTEN)
|
||||
return TRUE
|
||||
|
||||
/obj/machinery/grill/deconstruct(disassembled = TRUE)
|
||||
finish_grill()
|
||||
if(!(flags_1 & NODECONSTRUCT_1))
|
||||
new /obj/item/stack/sheet/metal(loc, 5)
|
||||
new /obj/item/stack/rods(loc, 5)
|
||||
..()
|
||||
|
||||
/obj/machinery/grill/attack_ai(mob/user)
|
||||
return
|
||||
|
||||
/obj/machinery/grill/attack_hand(mob/user)
|
||||
if(grilled_item)
|
||||
to_chat(user, "<span class='notice'>You take out [grilled_item] from [src].</span>")
|
||||
grilled_item.forceMove(drop_location())
|
||||
update_icon()
|
||||
return
|
||||
return ..()
|
||||
|
||||
/obj/machinery/grill/proc/finish_grill()
|
||||
switch(grill_time) //no 0-9 to prevent spam
|
||||
if(10 to 15)
|
||||
grilled_item.name = "lightly-grilled [grilled_item.name]"
|
||||
grilled_item.desc = "[grilled_item.desc] It's been lightly grilled."
|
||||
if(16 to 39)
|
||||
grilled_item.name = "grilled [grilled_item.name]"
|
||||
grilled_item.desc = "[grilled_item.desc] It's been grilled."
|
||||
grilled_item.foodtype |= FRIED
|
||||
if(40 to 50)
|
||||
grilled_item.name = "heavily grilled [grilled_item.name]"
|
||||
grilled_item.desc = "[grilled_item.desc] It's been heavily grilled."
|
||||
grilled_item.foodtype |= FRIED
|
||||
if(51 to INFINITY) //grill marks reach max alpha
|
||||
grilled_item.name = "Powerfully Grilled [grilled_item.name]"
|
||||
grilled_item.desc = "A [grilled_item.name]. Reminds you of your deepfryer skills, wait, no, it's better!"
|
||||
grilled_item.foodtype |= FRIED
|
||||
grill_time = 0
|
||||
grill_loop.stop()
|
||||
|
||||
/obj/machinery/grill/unwrenched
|
||||
anchored = FALSE
|
||||
@@ -76,6 +76,22 @@
|
||||
required_reagents = list("corn_starch" = 1, "sacid" = 1)
|
||||
required_temp = 374
|
||||
|
||||
/datum/chemical_reaction/caramel
|
||||
name = "Caramel"
|
||||
id = "caramel"
|
||||
results = list("caramel" = 1)
|
||||
required_reagents = list("sugar" = 1)
|
||||
required_temp = 413
|
||||
mob_react = FALSE
|
||||
|
||||
/datum/chemical_reaction/caramel_burned
|
||||
name = "Caramel burned"
|
||||
id = "caramel_burned"
|
||||
results = list("carbon" = 1)
|
||||
required_reagents = list("caramel" = 1)
|
||||
required_temp = 483
|
||||
mob_react = FALSE
|
||||
|
||||
/datum/chemical_reaction/cheesewheel
|
||||
name = "Cheesewheel"
|
||||
id = "cheesewheel"
|
||||
@@ -161,3 +177,9 @@
|
||||
new /obj/item/reagent_containers/food/snacks/salad/ricebowl(location)
|
||||
if(holder && holder.my_atom)
|
||||
qdel(holder.my_atom)
|
||||
|
||||
/datum/chemical_reaction/bbqsauce
|
||||
name = "BBQ Sauce"
|
||||
id = "bbqsauce"
|
||||
results = list("bbqsauce" = 5)
|
||||
required_reagents = list("ash" = 1, "tomatojuice" = 1, "salglu_solution" = 3, "blackpepper" = 1)
|
||||
@@ -44,6 +44,10 @@
|
||||
input = /obj/item/reagent_containers/food/snacks/grown/parsnip
|
||||
output = /obj/item/reagent_containers/food/snacks/roastparsnip
|
||||
|
||||
/datum/food_processor_process/tortilla
|
||||
input = /obj/item/reagent_containers/food/snacks/tortilla
|
||||
output = /obj/item/reagent_containers/food/snacks/cornchips
|
||||
|
||||
/datum/food_processor_process/mob/slime
|
||||
input = /mob/living/simple_animal/slime
|
||||
output = null
|
||||
|
||||
@@ -76,6 +76,7 @@
|
||||
name = "Fish burger"
|
||||
reqs = list(
|
||||
/obj/item/reagent_containers/food/snacks/carpmeat = 1,
|
||||
/obj/item/reagent_containers/food/snacks/cheesewedge = 1,
|
||||
/obj/item/reagent_containers/food/snacks/bun = 1
|
||||
)
|
||||
result = /obj/item/reagent_containers/food/snacks/burger/fish
|
||||
@@ -94,6 +95,7 @@
|
||||
name = "Ghost burger"
|
||||
reqs = list(
|
||||
/obj/item/ectoplasm = 1,
|
||||
/datum/reagent/consumable/sodiumchloride = 2,
|
||||
/obj/item/reagent_containers/food/snacks/bun = 1
|
||||
)
|
||||
result = /obj/item/reagent_containers/food/snacks/burger/ghost
|
||||
@@ -176,7 +178,7 @@
|
||||
)
|
||||
result = /obj/item/reagent_containers/food/snacks/burger/purple
|
||||
subcategory = CAT_BURGER
|
||||
|
||||
|
||||
/datum/crafting_recipe/food/blackburger
|
||||
name = "Black burger"
|
||||
reqs = list(
|
||||
@@ -186,7 +188,7 @@
|
||||
)
|
||||
result = /obj/item/reagent_containers/food/snacks/burger/black
|
||||
subcategory = CAT_BURGER
|
||||
|
||||
|
||||
/datum/crafting_recipe/food/whiteburger
|
||||
name = "White burger"
|
||||
reqs = list(
|
||||
@@ -218,6 +220,7 @@
|
||||
name = "Big bite burger"
|
||||
reqs = list(
|
||||
/obj/item/reagent_containers/food/snacks/meat/steak/plain = 3,
|
||||
/obj/item/reagent_containers/food/snacks/cheesewedge = 2,
|
||||
/obj/item/reagent_containers/food/snacks/bun = 1
|
||||
)
|
||||
result = /obj/item/reagent_containers/food/snacks/burger/bigbite
|
||||
@@ -231,7 +234,8 @@
|
||||
/obj/item/reagent_containers/food/snacks/meat/steak/plain = 5,
|
||||
/obj/item/reagent_containers/food/snacks/grown/tomato = 4,
|
||||
/obj/item/reagent_containers/food/snacks/cheesewedge = 3,
|
||||
/obj/item/reagent_containers/food/snacks/boiledegg = 2,
|
||||
/obj/item/reagent_containers/food/snacks/boiledegg = 1,
|
||||
/obj/item/reagent_containers/food/snacks/meat/bacon = 1,
|
||||
/obj/item/reagent_containers/food/snacks/bun = 1
|
||||
|
||||
)
|
||||
@@ -260,6 +264,7 @@
|
||||
name = "Five alarm burger"
|
||||
reqs = list(
|
||||
/obj/item/reagent_containers/food/snacks/grown/ghost_chili = 2,
|
||||
/obj/item/reagent_containers/food/snacks/meat/steak/plain = 1,
|
||||
/obj/item/reagent_containers/food/snacks/bun = 1
|
||||
)
|
||||
result = /obj/item/reagent_containers/food/snacks/burger/fivealarm
|
||||
@@ -293,3 +298,53 @@
|
||||
|
||||
result = /obj/item/reagent_containers/food/snacks/burger/baconburger
|
||||
subcategory = CAT_BURGER
|
||||
|
||||
/datum/crafting_recipe/food/cheeseburger
|
||||
name = "Cheese Burger"
|
||||
reqs = list(
|
||||
/obj/item/reagent_containers/food/snacks/meat/steak/plain = 1,
|
||||
/obj/item/reagent_containers/food/snacks/cheesewedge = 1,
|
||||
/obj/item/reagent_containers/food/snacks/bun = 1
|
||||
)
|
||||
result = /obj/item/reagent_containers/food/snacks/burger/cheese
|
||||
subcategory = CAT_BURGER
|
||||
|
||||
/datum/crafting_recipe/food/soylentburger
|
||||
name = "Soylent Burger"
|
||||
reqs = list(
|
||||
/obj/item/reagent_containers/food/snacks/soylentgreen = 1, //two full meats worth.
|
||||
/obj/item/reagent_containers/food/snacks/cheesewedge = 2,
|
||||
/obj/item/reagent_containers/food/snacks/bun = 1
|
||||
)
|
||||
result = /obj/item/reagent_containers/food/snacks/burger/soylent
|
||||
subcategory = CAT_BURGER
|
||||
|
||||
/datum/crafting_recipe/food/ribburger
|
||||
name = "McRib"
|
||||
reqs = list(
|
||||
/obj/item/reagent_containers/food/snacks/bbqribs = 1, //The sauce is already included in the ribs
|
||||
/obj/item/reagent_containers/food/snacks/onion_slice = 1, //feel free to remove if too burdensome.
|
||||
/obj/item/reagent_containers/food/snacks/bun = 1
|
||||
)
|
||||
result = /obj/item/reagent_containers/food/snacks/burger/rib
|
||||
subcategory = CAT_BURGER
|
||||
|
||||
/datum/crafting_recipe/food/mcguffin
|
||||
name = "McGuffin"
|
||||
reqs = list(
|
||||
/obj/item/reagent_containers/food/snacks/friedegg = 1,
|
||||
/obj/item/reagent_containers/food/snacks/meat/bacon = 2,
|
||||
/obj/item/reagent_containers/food/snacks/bun = 1
|
||||
)
|
||||
result = /obj/item/reagent_containers/food/snacks/burger/mcguffin
|
||||
subcategory = CAT_BURGER
|
||||
|
||||
/datum/crafting_recipe/food/chickenburger
|
||||
name = "Chicken Sandwich"
|
||||
reqs = list(
|
||||
/obj/item/reagent_containers/food/snacks/meat/steak/chicken = 1,
|
||||
/datum/reagent/consumable/mayonnaise = 5,
|
||||
/obj/item/reagent_containers/food/snacks/bun = 1
|
||||
)
|
||||
result = /obj/item/reagent_containers/food/snacks/burger/chicken
|
||||
subcategory = CAT_BURGER
|
||||
@@ -180,6 +180,17 @@
|
||||
result = /obj/item/reagent_containers/food/snacks/store/cake/peach_cake
|
||||
subcategory = CAT_CAKE
|
||||
|
||||
/datum/crafting_recipe/food/trumpetcake
|
||||
name = "Spaceman's Cake"
|
||||
reqs = list(
|
||||
/obj/item/reagent_containers/food/snacks/store/cake/plain = 1,
|
||||
/obj/item/reagent_containers/food/snacks/grown/trumpet = 2,
|
||||
/datum/reagent/consumable/cream = 5,
|
||||
/datum/reagent/consumable/berryjuice = 5
|
||||
)
|
||||
result = /obj/item/reagent_containers/food/snacks/store/cake/trumpet
|
||||
subcategory = CAT_CAKE
|
||||
|
||||
/datum/crafting_recipe/food/cak
|
||||
name = "Living cat/cake hybrid"
|
||||
reqs = list(
|
||||
|
||||
@@ -1,4 +1,8 @@
|
||||
|
||||
/////////////////
|
||||
//Misc. Frozen.//
|
||||
/////////////////
|
||||
|
||||
/datum/crafting_recipe/food/icecreamsandwich
|
||||
name = "Icecream sandwich"
|
||||
reqs = list(
|
||||
@@ -90,11 +94,10 @@
|
||||
|
||||
//////////////////////////SNOW CONES///////////////////////
|
||||
|
||||
/datum/crafting_recipe/food/flaverless_sc
|
||||
name = "Flaverless snowcone"
|
||||
/datum/crafting_recipe/food/flavorless_sc
|
||||
name = "Flavorless snowcone"
|
||||
reqs = list(
|
||||
/obj/item/reagent_containers/food/drinks/sillycup = 1,
|
||||
/datum/reagent/water = 5,
|
||||
/datum/reagent/consumable/ice = 15
|
||||
)
|
||||
result = /obj/item/reagent_containers/food/snacks/snowcones
|
||||
@@ -104,7 +107,6 @@
|
||||
name = "Pineapple snowcone"
|
||||
reqs = list(
|
||||
/obj/item/reagent_containers/food/drinks/sillycup = 1,
|
||||
/datum/reagent/water = 5,
|
||||
/datum/reagent/consumable/ice = 15,
|
||||
/obj/item/reagent_containers/food/snacks/pineappleslice = 2
|
||||
)
|
||||
@@ -115,7 +117,6 @@
|
||||
name = "Lime snowcone"
|
||||
reqs = list(
|
||||
/obj/item/reagent_containers/food/drinks/sillycup = 1,
|
||||
/datum/reagent/water = 5,
|
||||
/datum/reagent/consumable/ice = 15,
|
||||
/datum/reagent/consumable/limejuice = 5
|
||||
)
|
||||
@@ -126,7 +127,6 @@
|
||||
name = "Lemon snowcone"
|
||||
reqs = list(
|
||||
/obj/item/reagent_containers/food/drinks/sillycup = 1,
|
||||
/datum/reagent/water = 5,
|
||||
/datum/reagent/consumable/ice = 15,
|
||||
/datum/reagent/consumable/lemonjuice = 5
|
||||
)
|
||||
@@ -137,7 +137,6 @@
|
||||
name = "Apple snowcone"
|
||||
reqs = list(
|
||||
/obj/item/reagent_containers/food/drinks/sillycup = 1,
|
||||
/datum/reagent/water = 5,
|
||||
/datum/reagent/consumable/ice = 15,
|
||||
/datum/reagent/consumable/applejuice = 5
|
||||
)
|
||||
@@ -148,9 +147,8 @@
|
||||
name = "Grape snowcone"
|
||||
reqs = list(
|
||||
/obj/item/reagent_containers/food/drinks/sillycup = 1,
|
||||
/datum/reagent/water = 5,
|
||||
/datum/reagent/consumable/ice = 15,
|
||||
/datum/reagent/consumable/berryjuice = 5
|
||||
/datum/reagent/consumable/grapejuice = 5
|
||||
)
|
||||
result = /obj/item/reagent_containers/food/snacks/snowcones/grape
|
||||
subcategory = CAT_ICE
|
||||
@@ -159,7 +157,6 @@
|
||||
name = "Orange snowcone"
|
||||
reqs = list(
|
||||
/obj/item/reagent_containers/food/drinks/sillycup = 1,
|
||||
/datum/reagent/water = 5,
|
||||
/datum/reagent/consumable/ice = 15,
|
||||
/datum/reagent/consumable/orangejuice = 5
|
||||
)
|
||||
@@ -170,7 +167,6 @@
|
||||
name = "Bluecherry snowcone"
|
||||
reqs = list(
|
||||
/obj/item/reagent_containers/food/drinks/sillycup = 1,
|
||||
/datum/reagent/water = 5,
|
||||
/datum/reagent/consumable/ice = 15,
|
||||
/datum/reagent/consumable/bluecherryjelly= 5
|
||||
)
|
||||
@@ -181,22 +177,20 @@
|
||||
name = "Cherry snowcone"
|
||||
reqs = list(
|
||||
/obj/item/reagent_containers/food/drinks/sillycup = 1,
|
||||
/datum/reagent/water = 5,
|
||||
/datum/reagent/consumable/ice = 15,
|
||||
/datum/reagent/consumable/cherryjelly= 5
|
||||
)
|
||||
result = /obj/item/reagent_containers/food/snacks/snowcones/red
|
||||
subcategory = CAT_ICE
|
||||
|
||||
/datum/crafting_recipe/food/mix_sc
|
||||
name = "Mixed berrie snowcone"
|
||||
/datum/crafting_recipe/food/berry_sc
|
||||
name = "Berry snowcone"
|
||||
reqs = list(
|
||||
/obj/item/reagent_containers/food/drinks/sillycup = 1,
|
||||
/datum/reagent/water = 5,
|
||||
/datum/reagent/consumable/ice = 15,
|
||||
/datum/reagent/consumable/berryjuice = 15
|
||||
/datum/reagent/consumable/berryjuice = 5
|
||||
)
|
||||
result = /obj/item/reagent_containers/food/snacks/snowcones/mix
|
||||
result = /obj/item/reagent_containers/food/snacks/snowcones/berry
|
||||
subcategory = CAT_ICE
|
||||
|
||||
/datum/crafting_recipe/food/fruitsalad_sc
|
||||
@@ -216,7 +210,6 @@
|
||||
name = "Mime snowcone"
|
||||
reqs = list(
|
||||
/obj/item/reagent_containers/food/drinks/sillycup = 1,
|
||||
/datum/reagent/water = 5,
|
||||
/datum/reagent/consumable/ice = 15,
|
||||
/datum/reagent/consumable/nothing = 5
|
||||
)
|
||||
@@ -227,86 +220,57 @@
|
||||
name = "Clown snowcone"
|
||||
reqs = list(
|
||||
/obj/item/reagent_containers/food/drinks/sillycup = 1,
|
||||
/datum/reagent/water = 5,
|
||||
/datum/reagent/consumable/ice = 15,
|
||||
/datum/reagent/consumable/clownstears = 5
|
||||
/datum/reagent/consumable/laughter = 5
|
||||
)
|
||||
result = /obj/item/reagent_containers/food/snacks/snowcones/clown
|
||||
subcategory = CAT_ICE
|
||||
|
||||
/datum/crafting_recipe/food/soda_sc
|
||||
name = "Soda water snowcone"
|
||||
name = "Space Cola snowcone"
|
||||
reqs = list(
|
||||
/obj/item/reagent_containers/food/drinks/sillycup = 1,
|
||||
/datum/reagent/water = 5,
|
||||
/datum/reagent/consumable/ice = 15,
|
||||
/datum/reagent/consumable/sodawater = 15
|
||||
/datum/reagent/consumable/space_cola = 5
|
||||
)
|
||||
result = /obj/item/reagent_containers/food/snacks/snowcones/soda
|
||||
subcategory = CAT_ICE
|
||||
|
||||
/datum/crafting_recipe/food/pwgrmer_sc
|
||||
name = "Pwergamer snowcone"
|
||||
/datum/crafting_recipe/food/spacemountainwind_sc
|
||||
name = "Space Mountain Wind snowcone"
|
||||
reqs = list(
|
||||
/obj/item/reagent_containers/food/drinks/sillycup = 1,
|
||||
/datum/reagent/consumable/ice = 15,
|
||||
/datum/reagent/consumable/spacemountainwind = 5
|
||||
)
|
||||
result = /obj/item/reagent_containers/food/snacks/snowcones/spacemountainwind
|
||||
|
||||
/datum/crafting_recipe/food/pwrgame_sc
|
||||
name = "Pwrgame snowcone"
|
||||
reqs = list(
|
||||
/obj/item/reagent_containers/food/drinks/sillycup = 1,
|
||||
/datum/reagent/water = 5,
|
||||
/datum/reagent/consumable/ice = 15,
|
||||
/datum/reagent/consumable/pwr_game = 15
|
||||
)
|
||||
result = /obj/item/reagent_containers/food/snacks/snowcones/pwgrmer
|
||||
subcategory = CAT_ICE
|
||||
|
||||
/datum/crafting_recipe/food/kiwi_sc
|
||||
name = "Kiwi snowcone"
|
||||
reqs = list(
|
||||
/obj/item/reagent_containers/food/drinks/sillycup = 1,
|
||||
/obj/item/reagent_containers/food/snacks/egg/kiwiEgg = 1,
|
||||
/datum/reagent/water = 5,
|
||||
/datum/reagent/consumable/ice = 15
|
||||
)
|
||||
result = /obj/item/reagent_containers/food/snacks/snowcones/kiwi
|
||||
result = /obj/item/reagent_containers/food/snacks/snowcones/pwrgame
|
||||
subcategory = CAT_ICE
|
||||
|
||||
/datum/crafting_recipe/food/honey_sc
|
||||
name = "Honey snowcone"
|
||||
reqs = list(
|
||||
/obj/item/reagent_containers/food/drinks/sillycup = 1,
|
||||
/datum/reagent/water = 5,
|
||||
/datum/reagent/consumable/ice = 15,
|
||||
/datum/reagent/consumable/honey = 5
|
||||
)
|
||||
result = /obj/item/reagent_containers/food/snacks/snowcones/honey
|
||||
subcategory = CAT_ICE
|
||||
|
||||
/datum/crafting_recipe/food/peach_sc
|
||||
name = "Peach snowcone"
|
||||
reqs = list(
|
||||
/obj/item/reagent_containers/food/drinks/sillycup = 1,
|
||||
/datum/reagent/water = 5,
|
||||
/datum/reagent/consumable/ice = 15,
|
||||
/obj/item/reagent_containers/food/snacks/grown/peach = 1
|
||||
)
|
||||
result = /obj/item/reagent_containers/food/snacks/snowcones/peach
|
||||
subcategory = CAT_ICE
|
||||
|
||||
/datum/crafting_recipe/food/strawberry_sc
|
||||
name = "Strawberry snowcone"
|
||||
reqs = list(
|
||||
/obj/item/reagent_containers/food/drinks/sillycup = 1,
|
||||
/datum/reagent/water = 5,
|
||||
/datum/reagent/consumable/ice = 15,
|
||||
/obj/item/reagent_containers/food/snacks/grown/strawberry = 2
|
||||
)
|
||||
result = /obj/item/reagent_containers/food/snacks/snowcones/strawberry
|
||||
subcategory = CAT_ICE
|
||||
|
||||
/datum/crafting_recipe/food/honey_sc
|
||||
/datum/crafting_recipe/food/rainbow_sc
|
||||
name = "Rainbow snowcone"
|
||||
reqs = list(
|
||||
/obj/item/reagent_containers/food/drinks/sillycup = 1,
|
||||
/datum/reagent/water = 5,
|
||||
/datum/reagent/consumable/ice = 15,
|
||||
/datum/reagent/colorful_reagent = 1 //Hard to make
|
||||
/datum/reagent/colorful_reagent = 1 //Harder to make
|
||||
)
|
||||
result = /obj/item/reagent_containers/food/snacks/snowcones/rainbow
|
||||
subcategory = CAT_ICE
|
||||
subcategory = CAT_ICE
|
||||
@@ -166,3 +166,25 @@
|
||||
)
|
||||
result = /obj/item/reagent_containers/food/snacks/salad/ricepork
|
||||
subcategory = CAT_MEAT
|
||||
|
||||
/datum/crafting_recipe/food/fiestaskewer
|
||||
name = "Fiesta Skewer"
|
||||
reqs = list(
|
||||
/obj/item/stack/rods = 1,
|
||||
/obj/item/reagent_containers/food/snacks/grown/chili = 1,
|
||||
/obj/item/reagent_containers/food/snacks/meat/cutlet = 1,
|
||||
/obj/item/reagent_containers/food/snacks/grown/corn = 1,
|
||||
/obj/item/reagent_containers/food/snacks/grown/tomato = 1
|
||||
)
|
||||
result = /obj/item/reagent_containers/food/snacks/kebab/fiesta
|
||||
subcategory = CAT_MEAT
|
||||
|
||||
/datum/crafting_recipe/food/ribs
|
||||
name = "BBQ Ribs"
|
||||
reqs = list(
|
||||
/datum/reagent/consumable/bbqsauce = 5,
|
||||
/obj/item/reagent_containers/food/snacks/meat/steak/plain = 2,
|
||||
/obj/item/stack/rods = 2
|
||||
)
|
||||
result = /obj/item/reagent_containers/food/snacks/bbqribs
|
||||
subcategory = CAT_MEAT
|
||||
@@ -1,18 +1,7 @@
|
||||
|
||||
// see code/module/crafting/table.dm
|
||||
|
||||
////////////////////////////////////////////////DONUTS////////////////////////////////////////////////
|
||||
|
||||
/datum/crafting_recipe/food/chaosdonut
|
||||
name = "Chaos donut"
|
||||
reqs = list(
|
||||
/datum/reagent/consumable/frostoil = 5,
|
||||
/datum/reagent/consumable/capsaicin = 5,
|
||||
/obj/item/reagent_containers/food/snacks/pastrybase = 1
|
||||
)
|
||||
result = /obj/item/reagent_containers/food/snacks/donut/chaos
|
||||
subcategory = CAT_PASTRY
|
||||
|
||||
/datum/crafting_recipe/food/donut
|
||||
time = 15
|
||||
name = "Donut"
|
||||
@@ -20,18 +9,17 @@
|
||||
/datum/reagent/consumable/sugar = 1,
|
||||
/obj/item/reagent_containers/food/snacks/pastrybase = 1
|
||||
)
|
||||
result = /obj/item/reagent_containers/food/snacks/donut
|
||||
result = /obj/item/reagent_containers/food/snacks/donut/plain
|
||||
subcategory = CAT_PASTRY
|
||||
|
||||
/datum/crafting_recipe/food/donut/semen
|
||||
time = 15
|
||||
name = "Semen donut"
|
||||
/datum/crafting_recipe/food/donut/chaos
|
||||
name = "Chaos donut"
|
||||
reqs = list(
|
||||
/datum/reagent/consumable/semen = 10,
|
||||
/datum/reagent/consumable/frostoil = 5,
|
||||
/datum/reagent/consumable/capsaicin = 5,
|
||||
/obj/item/reagent_containers/food/snacks/pastrybase = 1
|
||||
)
|
||||
result = /obj/item/reagent_containers/food/snacks/donut/semen
|
||||
subcategory = CAT_PASTRY
|
||||
result = /obj/item/reagent_containers/food/snacks/donut/chaos
|
||||
|
||||
datum/crafting_recipe/food/donut/meat
|
||||
time = 15
|
||||
@@ -41,35 +29,232 @@ datum/crafting_recipe/food/donut/meat
|
||||
/obj/item/reagent_containers/food/snacks/pastrybase = 1
|
||||
)
|
||||
result = /obj/item/reagent_containers/food/snacks/donut/meat
|
||||
subcategory = CAT_PASTRY
|
||||
|
||||
/datum/crafting_recipe/food/jellydonut
|
||||
/datum/crafting_recipe/food/donut/jelly
|
||||
name = "Jelly donut"
|
||||
reqs = list(
|
||||
/datum/reagent/consumable/berryjuice = 5,
|
||||
/obj/item/reagent_containers/food/snacks/pastrybase = 1
|
||||
)
|
||||
result = /obj/item/reagent_containers/food/snacks/donut/jelly
|
||||
subcategory = CAT_PASTRY
|
||||
result = /obj/item/reagent_containers/food/snacks/donut/jelly/plain
|
||||
|
||||
/datum/crafting_recipe/food/cherryjellydonut
|
||||
name = "Cherry jelly donut"
|
||||
reqs = list(
|
||||
/datum/reagent/consumable/cherryjelly = 5,
|
||||
/obj/item/reagent_containers/food/snacks/pastrybase = 1
|
||||
)
|
||||
result = /obj/item/reagent_containers/food/snacks/donut/jelly/cherryjelly
|
||||
subcategory = CAT_PASTRY
|
||||
|
||||
/datum/crafting_recipe/food/slimejellydonut
|
||||
/datum/crafting_recipe/food/donut/slimejelly
|
||||
name = "Slime jelly donut"
|
||||
reqs = list(
|
||||
/datum/reagent/toxin/slimejelly = 5,
|
||||
/obj/item/reagent_containers/food/snacks/pastrybase = 1
|
||||
)
|
||||
result = /obj/item/reagent_containers/food/snacks/donut/jelly/slimejelly
|
||||
result = /obj/item/reagent_containers/food/snacks/donut/jelly/slimejelly/plain
|
||||
|
||||
/datum/crafting_recipe/food/donut/glaze
|
||||
time = 15
|
||||
name = "glaze donut"
|
||||
reqs = list(
|
||||
/datum/reagent/consumable/sugar = 10,
|
||||
/obj/item/reagent_containers/food/snacks/pastrybase = 1
|
||||
)
|
||||
result = /obj/item/reagent_containers/food/snacks/donut/glaze
|
||||
subcategory = CAT_PASTRY
|
||||
|
||||
/datum/crafting_recipe/food/donut/berry
|
||||
name = "Berry Donut"
|
||||
reqs = list(
|
||||
/datum/reagent/consumable/berryjuice = 3,
|
||||
/obj/item/reagent_containers/food/snacks/donut/plain = 1
|
||||
)
|
||||
result = /obj/item/reagent_containers/food/snacks/donut/berry
|
||||
|
||||
/datum/crafting_recipe/food/donut/trumpet
|
||||
name = "Spaceman's Donut"
|
||||
reqs = list(
|
||||
/datum/reagent/medicine/polypyr = 3,
|
||||
/obj/item/reagent_containers/food/snacks/donut/plain = 1
|
||||
)
|
||||
|
||||
result = /obj/item/reagent_containers/food/snacks/donut/trumpet
|
||||
|
||||
/datum/crafting_recipe/food/donut/apple
|
||||
name = "Apple Donut"
|
||||
reqs = list(
|
||||
/datum/reagent/consumable/applejuice = 3,
|
||||
/obj/item/reagent_containers/food/snacks/donut/plain = 1
|
||||
)
|
||||
result = /obj/item/reagent_containers/food/snacks/donut/apple
|
||||
|
||||
/datum/crafting_recipe/food/donut/caramel
|
||||
name = "Caramel Donut"
|
||||
reqs = list(
|
||||
/datum/reagent/consumable/caramel = 3,
|
||||
/obj/item/reagent_containers/food/snacks/donut/plain = 1
|
||||
)
|
||||
result = /obj/item/reagent_containers/food/snacks/donut/caramel
|
||||
|
||||
/datum/crafting_recipe/food/donut/choco
|
||||
name = "Chocolate Donut"
|
||||
reqs = list(
|
||||
/obj/item/reagent_containers/food/snacks/chocolatebar = 1,
|
||||
/obj/item/reagent_containers/food/snacks/donut/plain = 1
|
||||
)
|
||||
result = /obj/item/reagent_containers/food/snacks/donut/choco
|
||||
|
||||
/datum/crafting_recipe/food/donut/blumpkin
|
||||
name = "Blumpkin Donut"
|
||||
reqs = list(
|
||||
/datum/reagent/consumable/blumpkinjuice = 3,
|
||||
/obj/item/reagent_containers/food/snacks/donut/plain = 1
|
||||
)
|
||||
result = /obj/item/reagent_containers/food/snacks/donut/blumpkin
|
||||
|
||||
/datum/crafting_recipe/food/donut/bungo
|
||||
name = "Bungo Donut"
|
||||
reqs = list(
|
||||
/obj/item/reagent_containers/food/snacks/grown/bungofruit = 1,
|
||||
/obj/item/reagent_containers/food/snacks/donut/plain = 1
|
||||
)
|
||||
result = /obj/item/reagent_containers/food/snacks/donut/bungo
|
||||
|
||||
/datum/crafting_recipe/food/donut/matcha
|
||||
name = "Matcha Donut"
|
||||
reqs = list(
|
||||
/datum/reagent/toxin/teapowder = 3,
|
||||
/obj/item/reagent_containers/food/snacks/donut/plain = 1
|
||||
)
|
||||
result = /obj/item/reagent_containers/food/snacks/donut/matcha
|
||||
|
||||
////////////////////////////////////////////////////JELLY DONUTS///////////////////////////////////////////////////////
|
||||
|
||||
/datum/crafting_recipe/food/donut/jelly/berry
|
||||
name = "Berry Jelly Donut"
|
||||
reqs = list(
|
||||
/datum/reagent/consumable/berryjuice = 3,
|
||||
/obj/item/reagent_containers/food/snacks/donut/jelly/plain = 1
|
||||
)
|
||||
result = /obj/item/reagent_containers/food/snacks/donut/jelly/berry
|
||||
|
||||
/datum/crafting_recipe/food/donut/jelly/trumpet
|
||||
name = "Spaceman's Jelly Donut"
|
||||
reqs = list(
|
||||
/datum/reagent/medicine/polypyr = 3,
|
||||
/obj/item/reagent_containers/food/snacks/donut/jelly/plain = 1
|
||||
)
|
||||
|
||||
result = /obj/item/reagent_containers/food/snacks/donut/jelly/trumpet
|
||||
|
||||
/datum/crafting_recipe/food/donut/jelly/apple
|
||||
name = "Apple Jelly Donut"
|
||||
reqs = list(
|
||||
/datum/reagent/consumable/applejuice = 3,
|
||||
/obj/item/reagent_containers/food/snacks/donut/jelly/plain = 1
|
||||
)
|
||||
result = /obj/item/reagent_containers/food/snacks/donut/jelly/apple
|
||||
|
||||
/datum/crafting_recipe/food/donut/jelly/caramel
|
||||
name = "Caramel Jelly Donut"
|
||||
reqs = list(
|
||||
/datum/reagent/consumable/caramel = 3,
|
||||
/obj/item/reagent_containers/food/snacks/donut/jelly/plain = 1
|
||||
)
|
||||
result = /obj/item/reagent_containers/food/snacks/donut/jelly/caramel
|
||||
|
||||
/datum/crafting_recipe/food/donut/jelly/choco
|
||||
name = "Chocolate Jelly Donut"
|
||||
reqs = list(
|
||||
/obj/item/reagent_containers/food/snacks/chocolatebar = 1,
|
||||
/obj/item/reagent_containers/food/snacks/donut/jelly/plain = 1
|
||||
)
|
||||
result = /obj/item/reagent_containers/food/snacks/donut/jelly/choco
|
||||
|
||||
/datum/crafting_recipe/food/donut/jelly/blumpkin
|
||||
name = "Blumpkin Jelly Donut"
|
||||
reqs = list(
|
||||
/datum/reagent/consumable/blumpkinjuice = 3,
|
||||
/obj/item/reagent_containers/food/snacks/donut/jelly/plain = 1
|
||||
)
|
||||
result = /obj/item/reagent_containers/food/snacks/donut/jelly/blumpkin
|
||||
|
||||
/datum/crafting_recipe/food/donut/jelly/bungo
|
||||
name = "Bungo Jelly Donut"
|
||||
reqs = list(
|
||||
/obj/item/reagent_containers/food/snacks/grown/bungofruit = 1,
|
||||
/obj/item/reagent_containers/food/snacks/donut/jelly/plain = 1
|
||||
)
|
||||
result = /obj/item/reagent_containers/food/snacks/donut/jelly/bungo
|
||||
|
||||
/datum/crafting_recipe/food/donut/jelly/matcha
|
||||
name = "Matcha Jelly Donut"
|
||||
reqs = list(
|
||||
/datum/reagent/toxin/teapowder = 3,
|
||||
/obj/item/reagent_containers/food/snacks/donut/jelly/plain = 1
|
||||
)
|
||||
result = /obj/item/reagent_containers/food/snacks/donut/jelly/matcha
|
||||
|
||||
////////////////////////////////////////////////////SLIME DONUTS///////////////////////////////////////////////////////
|
||||
|
||||
/datum/crafting_recipe/food/donut/slimejelly/berry
|
||||
name = "Berry Slime Donut"
|
||||
reqs = list(
|
||||
/datum/reagent/consumable/berryjuice = 3,
|
||||
/obj/item/reagent_containers/food/snacks/donut/jelly/slimejelly/plain = 1
|
||||
)
|
||||
result = /obj/item/reagent_containers/food/snacks/donut/jelly/slimejelly/berry
|
||||
|
||||
/datum/crafting_recipe/food/donut/slimejelly/trumpet
|
||||
name = "Spaceman's Slime Donut"
|
||||
reqs = list(
|
||||
/datum/reagent/medicine/polypyr = 3,
|
||||
/obj/item/reagent_containers/food/snacks/donut/jelly/slimejelly/plain = 1
|
||||
)
|
||||
|
||||
result = /obj/item/reagent_containers/food/snacks/donut/jelly/slimejelly/trumpet
|
||||
|
||||
/datum/crafting_recipe/food/donut/slimejelly/apple
|
||||
name = "Apple Slime Donut"
|
||||
reqs = list(
|
||||
/datum/reagent/consumable/applejuice = 3,
|
||||
/obj/item/reagent_containers/food/snacks/donut/jelly/slimejelly/plain = 1
|
||||
)
|
||||
result = /obj/item/reagent_containers/food/snacks/donut/jelly/slimejelly/apple
|
||||
|
||||
/datum/crafting_recipe/food/donut/slimejelly/caramel
|
||||
name = "Caramel Slime Donut"
|
||||
reqs = list(
|
||||
/datum/reagent/consumable/caramel = 3,
|
||||
/obj/item/reagent_containers/food/snacks/donut/jelly/slimejelly/plain = 1
|
||||
)
|
||||
result = /obj/item/reagent_containers/food/snacks/donut/jelly/slimejelly/caramel
|
||||
|
||||
/datum/crafting_recipe/food/donut/slimejelly/choco
|
||||
name = "Chocolate Slime Donut"
|
||||
reqs = list(
|
||||
/obj/item/reagent_containers/food/snacks/chocolatebar = 1,
|
||||
/obj/item/reagent_containers/food/snacks/donut/jelly/slimejelly/plain = 1
|
||||
)
|
||||
result = /obj/item/reagent_containers/food/snacks/donut/jelly/slimejelly/choco
|
||||
|
||||
/datum/crafting_recipe/food/donut/slimejelly/blumpkin
|
||||
name = "Blumpkin Slime Donut"
|
||||
reqs = list(
|
||||
/datum/reagent/consumable/blumpkinjuice = 3,
|
||||
/obj/item/reagent_containers/food/snacks/donut/jelly/slimejelly/plain = 1
|
||||
)
|
||||
result = /obj/item/reagent_containers/food/snacks/donut/jelly/slimejelly/blumpkin
|
||||
|
||||
/datum/crafting_recipe/food/donut/slimejelly/bungo
|
||||
name = "Bungo Slime Donut"
|
||||
reqs = list(
|
||||
/obj/item/reagent_containers/food/snacks/grown/bungofruit = 1,
|
||||
/obj/item/reagent_containers/food/snacks/donut/jelly/slimejelly/plain = 1
|
||||
)
|
||||
result = /obj/item/reagent_containers/food/snacks/donut/jelly/slimejelly/bungo
|
||||
|
||||
/datum/crafting_recipe/food/donut/slimejelly/matcha
|
||||
name = "Matcha Slime Donut"
|
||||
reqs = list(
|
||||
/datum/reagent/toxin/teapowder = 3,
|
||||
/obj/item/reagent_containers/food/snacks/donut/jelly/slimejelly/plain = 1
|
||||
)
|
||||
result = /obj/item/reagent_containers/food/snacks/donut/jelly/slimejelly/matcha
|
||||
|
||||
////////////////////////////////////////////////WAFFLES AND PANCAKES////////////////////////////////////////////////
|
||||
|
||||
/datum/crafting_recipe/food/waffles
|
||||
@@ -341,4 +526,4 @@ datum/crafting_recipe/food/donut/meat
|
||||
/datum/reagent/consumable/honey = 5
|
||||
)
|
||||
result = /obj/item/reagent_containers/food/snacks/honeybun
|
||||
subcategory = CAT_PASTRY
|
||||
subcategory = CAT_PASTRY
|
||||
@@ -532,7 +532,7 @@
|
||||
if(S.has_reagent("charcoal", 1))
|
||||
adjustToxic(-round(S.get_reagent_amount("charcoal") * 2))
|
||||
|
||||
// NIGGA, YOU JUST WENT ON FULL RETARD.
|
||||
// Toxins, not good for anything
|
||||
if(S.has_reagent("toxin", 1))
|
||||
adjustToxic(round(S.get_reagent_amount("toxin") * 2))
|
||||
|
||||
@@ -547,14 +547,14 @@
|
||||
adjustNutri(round(S.get_reagent_amount("beer") * 0.25))
|
||||
adjustWater(round(S.get_reagent_amount("beer") * 0.7))
|
||||
|
||||
// You're an idiot for thinking that one of the most corrosive and deadly gasses would be beneficial
|
||||
// Fluorine one of the most corrosive and deadly gasses
|
||||
if(S.has_reagent("fluorine", 1))
|
||||
adjustHealth(-round(S.get_reagent_amount("fluorine") * 2))
|
||||
adjustToxic(round(S.get_reagent_amount("fluorine") * 2.5))
|
||||
adjustWater(-round(S.get_reagent_amount("fluorine") * 0.5))
|
||||
adjustWeeds(-rand(1,4))
|
||||
|
||||
// You're an idiot for thinking that one of the most corrosive and deadly gasses would be beneficial
|
||||
// Chlorine one of the most corrosive and deadly gasses
|
||||
if(S.has_reagent("chlorine", 1))
|
||||
adjustHealth(-round(S.get_reagent_amount("chlorine") * 1))
|
||||
adjustToxic(round(S.get_reagent_amount("chlorine") * 1.5))
|
||||
@@ -569,7 +569,7 @@
|
||||
adjustWater(-round(S.get_reagent_amount("phosphorus") * 0.5))
|
||||
adjustWeeds(-rand(1,2))
|
||||
|
||||
// Plants should not have sugar, they can't use it and it prevents them getting water/ nutients, it is good for mold though...
|
||||
// Plants should not have sugar, they can't use it and it prevents them getting water/nutients, it is good for mold though...
|
||||
if(S.has_reagent("sugar", 1))
|
||||
adjustWeeds(rand(1,2))
|
||||
adjustPests(rand(1,2))
|
||||
@@ -591,13 +591,13 @@
|
||||
adjustHealth(round(S.get_reagent_amount("sodawater") * 0.1))
|
||||
adjustNutri(round(S.get_reagent_amount("sodawater") * 0.1))
|
||||
|
||||
// Man, you guys are retards
|
||||
// Sulphuric Acid
|
||||
if(S.has_reagent("sacid", 1))
|
||||
adjustHealth(-round(S.get_reagent_amount("sacid") * 1))
|
||||
adjustToxic(round(S.get_reagent_amount("sacid") * 1.5))
|
||||
adjustWeeds(-rand(1,2))
|
||||
|
||||
// SERIOUSLY
|
||||
// Acid
|
||||
if(S.has_reagent("facid", 1))
|
||||
adjustHealth(-round(S.get_reagent_amount("facid") * 2))
|
||||
adjustToxic(round(S.get_reagent_amount("facid") * 3))
|
||||
@@ -609,7 +609,7 @@
|
||||
adjustToxic(round(S.get_reagent_amount("plantbgone") * 6))
|
||||
adjustWeeds(-rand(4,8))
|
||||
|
||||
// why, just why
|
||||
// Napalm, not known for being good for anything organic
|
||||
if(S.has_reagent("napalm", 1))
|
||||
if(!(myseed.resistance_flags & FIRE_PROOF))
|
||||
adjustHealth(-round(S.get_reagent_amount("napalm") * 6))
|
||||
@@ -646,13 +646,14 @@
|
||||
if (myseed)
|
||||
myseed.adjust_production(-round(salt/100)-prob(salt%100))
|
||||
myseed.adjust_potency(round(salt*0.5))
|
||||
|
||||
// Ash is also used IRL in gardening, as a fertilizer enhancer and weed killer
|
||||
if(S.has_reagent("ash", 1))
|
||||
adjustHealth(round(S.get_reagent_amount("ash") * 0.25))
|
||||
adjustNutri(round(S.get_reagent_amount("ash") * 0.5))
|
||||
adjustWeeds(-1)
|
||||
|
||||
// This is more bad ass, and pests get hurt by the corrosive nature of it, not the plant.
|
||||
// Diethylamine is more bad ass, and pests get hurt by the corrosive nature of it, not the plant.
|
||||
if(S.has_reagent("diethylamine", 1))
|
||||
adjustHealth(round(S.get_reagent_amount("diethylamine") * 1))
|
||||
adjustNutri(round(S.get_reagent_amount("diethylamine") * 2))
|
||||
@@ -660,26 +661,37 @@
|
||||
myseed.adjust_yield(round(S.get_reagent_amount("diethylamine") * 0.02))
|
||||
adjustPests(-rand(1,2))
|
||||
|
||||
// Compost, effectively
|
||||
// Nutriment Compost, effectively
|
||||
if(S.has_reagent("nutriment", 1))
|
||||
adjustHealth(round(S.get_reagent_amount("nutriment") * 0.5))
|
||||
adjustNutri(round(S.get_reagent_amount("nutriment") * 1))
|
||||
|
||||
// Compost for EVERYTHING
|
||||
// Virusfood Compost for EVERYTHING
|
||||
if(S.has_reagent("virusfood", 1))
|
||||
adjustNutri(round(S.get_reagent_amount("virusfood") * 0.5))
|
||||
adjustHealth(-round(S.get_reagent_amount("virusfood") * 0.5))
|
||||
|
||||
// FEED ME
|
||||
// Blood
|
||||
if(S.has_reagent("blood", 1))
|
||||
adjustNutri(round(S.get_reagent_amount("blood") * 1))
|
||||
adjustPests(rand(2,4))
|
||||
|
||||
// FEED ME SEYMOUR
|
||||
// Strange reagent
|
||||
if(S.has_reagent("strangereagent", 1))
|
||||
spawnplant()
|
||||
|
||||
// The best stuff there is. For testing/debugging.
|
||||
// Honey, Pests are dieing of sugar, so is the plant
|
||||
if(S.has_reagent("honey", 1))
|
||||
adjustPests(-rand(2,5))
|
||||
adjustHealth(-round(S.get_reagent_amount("honey") * 1))
|
||||
|
||||
// Buzz Fuzz, a drink seemingly made for plants...
|
||||
if(S.has_reagent("buzz_fuzz", 1))
|
||||
adjustPests(-rand(2,5))
|
||||
adjustHealth(round(S.get_reagent_amount("buzz_fuzz") * 0.1))
|
||||
adjustNutri(round(S.get_reagent_amount("buzz_fuzz") * 0.5))
|
||||
|
||||
// Adminordrazine the best stuff there is. For testing/debugging.
|
||||
if(S.has_reagent("adminordrazine", 1))
|
||||
adjustWater(round(S.get_reagent_amount("adminordrazine") * 1))
|
||||
adjustHealth(round(S.get_reagent_amount("adminordrazine") * 1))
|
||||
|
||||
@@ -20,8 +20,7 @@
|
||||
access = list() //See get_access()
|
||||
minimal_access = list() //See get_access()
|
||||
|
||||
mind_traits = list(TRAIT_CAPTAIN_METABOLISM)
|
||||
// mind_traits = list(TRAIT_DISK_VERIFIER)
|
||||
mind_traits = list(TRAIT_CAPTAIN_METABOLISM, TRAIT_DISK_VERIFIER)
|
||||
|
||||
display_order = JOB_DISPLAY_ORDER_CAPTAIN
|
||||
|
||||
|
||||
@@ -157,23 +157,34 @@
|
||||
return
|
||||
//END OF CIT CHANGES
|
||||
|
||||
var/atom/movable/thrown_thing
|
||||
var/obj/item/I = get_active_held_item()
|
||||
|
||||
if(!I)
|
||||
if(pulling && isliving(pulling) && grab_state >= GRAB_AGGRESSIVE)
|
||||
var/mob/living/throwable_mob = pulling
|
||||
if(!throwable_mob.buckled)
|
||||
thrown_thing = throwable_mob
|
||||
var/atom/movable/thrown_thing
|
||||
var/mob/living/throwable_mob
|
||||
|
||||
if(istype(I, /obj/item/clothing/head/mob_holder))
|
||||
var/obj/item/clothing/head/mob_holder/holder = I
|
||||
if(holder.held_mob)
|
||||
throwable_mob = holder.held_mob
|
||||
holder.release()
|
||||
|
||||
if(!I || throwable_mob)
|
||||
if(!throwable_mob && pulling && isliving(pulling) && grab_state >= GRAB_AGGRESSIVE)
|
||||
throwable_mob = pulling
|
||||
|
||||
if(throwable_mob && !throwable_mob.buckled)
|
||||
thrown_thing = throwable_mob
|
||||
if(pulling)
|
||||
stop_pulling()
|
||||
if(HAS_TRAIT(src, TRAIT_PACIFISM))
|
||||
to_chat(src, "<span class='notice'>You gently let go of [throwable_mob].</span>")
|
||||
return
|
||||
adjustStaminaLossBuffered(25)//CIT CHANGE - throwing an entire person shall be very tiring
|
||||
var/turf/start_T = get_turf(loc) //Get the start and target tile for the descriptors
|
||||
var/turf/end_T = get_turf(target)
|
||||
if(start_T && end_T)
|
||||
log_combat(src, throwable_mob, "thrown", addition="grab from tile in [AREACOORD(start_T)] towards tile at [AREACOORD(end_T)]")
|
||||
if(HAS_TRAIT(src, TRAIT_PACIFISM))
|
||||
to_chat(src, "<span class='notice'>You gently let go of [throwable_mob].</span>")
|
||||
return
|
||||
|
||||
adjustStaminaLossBuffered(25)//CIT CHANGE - throwing an entire person shall be very tiring
|
||||
var/turf/start_T = get_turf(loc) //Get the start and target tile for the descriptors
|
||||
var/turf/end_T = get_turf(target)
|
||||
if(start_T && end_T)
|
||||
log_combat(src, throwable_mob, "thrown", addition="grab from tile in [AREACOORD(start_T)] towards tile at [AREACOORD(end_T)]")
|
||||
|
||||
else if(!CHECK_BITFIELD(I.item_flags, ABSTRACT) && !HAS_TRAIT(I, TRAIT_NODROP))
|
||||
thrown_thing = I
|
||||
@@ -193,6 +204,8 @@
|
||||
newtonian_move(get_dir(target, src))
|
||||
thrown_thing.safe_throw_at(target, thrown_thing.throw_range, thrown_thing.throw_speed, src, null, null, null, move_force)
|
||||
|
||||
|
||||
|
||||
/mob/living/carbon/restrained(ignore_grab)
|
||||
. = (handcuffed || (!ignore_grab && pulledby && pulledby.grab_state >= GRAB_AGGRESSIVE))
|
||||
|
||||
@@ -583,6 +596,9 @@
|
||||
sight |= E.sight_flags
|
||||
if(!isnull(E.lighting_alpha))
|
||||
lighting_alpha = E.lighting_alpha
|
||||
if(HAS_TRAIT(src, TRAIT_NIGHT_VISION))
|
||||
lighting_alpha = min(LIGHTING_PLANE_ALPHA_NV_TRAIT, lighting_alpha)
|
||||
see_in_dark = max(NIGHT_VISION_DARKSIGHT_RANGE, see_in_dark)
|
||||
|
||||
if(client.eye && client.eye != src)
|
||||
var/atom/A = client.eye
|
||||
@@ -958,4 +974,4 @@
|
||||
/mob/living/carbon/transfer_ckey(mob/new_mob, send_signal = TRUE)
|
||||
if(combatmode)
|
||||
toggle_combat_mode(TRUE, TRUE)
|
||||
return ..()
|
||||
return ..()
|
||||
|
||||
@@ -279,6 +279,12 @@
|
||||
M.visible_message("<span class='notice'>[M] shakes [src] trying to get [p_them()] up!</span>", \
|
||||
"<span class='notice'>You shake [src] trying to get [p_them()] up!</span>")
|
||||
|
||||
else if(check_zone(M.zone_selected) == "mouth") // I ADDED BOOP-EH-DEH-NOSEH - Jon
|
||||
M.visible_message( \
|
||||
"<span class='notice'>[M] boops [src]'s nose.</span>", \
|
||||
"<span class='notice'>You boop [src] on the nose.</span>", )
|
||||
playsound(src, 'sound/items/Nose_boop.ogg', 50, 0)
|
||||
|
||||
else if(check_zone(M.zone_selected) == "head")
|
||||
var/mob/living/carbon/human/H = src
|
||||
var/datum/species/pref_species = H.dna.species
|
||||
@@ -321,12 +327,6 @@
|
||||
M.visible_message( \
|
||||
"<span class='notice'>[M] shakes [src]'s hand.</span>", \
|
||||
"<span class='notice'>You shake [src]'s hand.</span>", )
|
||||
|
||||
else if(check_zone(M.zone_selected) == "mouth") // I ADDED BOOP-EH-DEH-NOSEH - Jon
|
||||
M.visible_message( \
|
||||
"<span class='notice'>[M] boops [src]'s nose.</span>", \
|
||||
"<span class='notice'>You boop [src] on the nose.</span>", )
|
||||
playsound(src, 'sound/items/Nose_boop.ogg', 50, 0)
|
||||
|
||||
else
|
||||
M.visible_message("<span class='notice'>[M] hugs [src] to make [p_them()] feel better!</span>", \
|
||||
|
||||
@@ -15,7 +15,11 @@
|
||||
if (wear_mask)
|
||||
. += "[t_He] [t_is] wearing [wear_mask.get_examine_string(user)] on [t_his] face."
|
||||
if (wear_neck)
|
||||
. += "[t_He] [t_is] wearing [wear_neck.get_examine_string(user)] around [t_his] neck."
|
||||
. += "[t_He] [t_is] wearing [wear_neck.get_examine_string(user)] around [t_his] neck.\n"
|
||||
if(can_be_held)
|
||||
. += "[t_He] looks small enough to be picked up with <b>Alt+Click</b>!\n"
|
||||
|
||||
|
||||
|
||||
for(var/obj/item/I in held_items)
|
||||
if(!(I.item_flags & ABSTRACT))
|
||||
|
||||
@@ -132,6 +132,10 @@
|
||||
pickupTarget = null
|
||||
pickupTimer = 0
|
||||
else if(ismob(pickupTarget.loc)) // in someones hand
|
||||
if(istype(pickupTarget, /obj/item/clothing/head/mob_holder/))
|
||||
var/obj/item/clothing/head/mob_holder/h = pickupTarget
|
||||
if(h && h.held_mob==src)
|
||||
return//dont let them pickpocket themselves
|
||||
var/mob/M = pickupTarget.loc
|
||||
if(!pickpocketing)
|
||||
pickpocketing = TRUE
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user