Merge branch 'master' into stuff
This commit is contained in:
@@ -138,8 +138,8 @@
|
||||
|
||||
////organ defines
|
||||
#define STANDARD_ORGAN_THRESHOLD 100
|
||||
#define STANDARD_ORGAN_HEALING 0.001
|
||||
#define STANDARD_ORGAN_DECAY 0.00222 //designed to fail organs when left to decay for ~15 minutes
|
||||
#define STANDARD_ORGAN_HEALING (1/(15 MINUTES / (2 SECONDS)))
|
||||
#define STANDARD_ORGAN_DECAY (1/(15 MINUTES / (2 SECONDS))) //designed to fail organs when left to decay for ~15 minutes. 2 SECOND is SSmobs tickrate.
|
||||
|
||||
#define G_MALE 1
|
||||
#define G_FEMALE 2
|
||||
|
||||
@@ -20,7 +20,7 @@
|
||||
#define NEW_SS_GLOBAL(varname) if(varname != src){if(istype(varname)){Recover();qdel(varname);}varname = src;}
|
||||
|
||||
#define START_PROCESSING(Processor, Datum) if (!(Datum.datum_flags & DF_ISPROCESSING)) {Datum.datum_flags |= DF_ISPROCESSING;Processor.processing += Datum}
|
||||
#define STOP_PROCESSING(Processor, Datum) Datum.datum_flags &= ~DF_ISPROCESSING;Processor.processing -= Datum
|
||||
#define STOP_PROCESSING(Processor, Datum) Datum.datum_flags &= ~DF_ISPROCESSING;Processor.processing -= Datum;Processor.currentrun -= Datum
|
||||
|
||||
//SubSystem flags (Please design any new flags so that the default is off, to make adding flags to subsystems easier)
|
||||
|
||||
|
||||
@@ -20,5 +20,3 @@
|
||||
#define INTERACT_MACHINE_SET_MACHINE (1<<6) //MACHINES HAVE THIS BY DEFAULT, SOMEONE SHOULD RUN THROUGH MACHINES AND REMOVE IT FROM THINGS LIKE LIGHT SWITCHES WHEN POSSIBLE!!--------------------------
|
||||
//This flag determines if a machine set_machine's the user when the user uses it, making updateUsrDialog make the user re-call interact() on it.
|
||||
//THIS FLAG IS ON ALL MACHINES BY DEFAULT, NEEDS TO BE RE-EVALUATED LATER!!
|
||||
|
||||
#define INTERACT_GHOST_READ (1<<0)
|
||||
|
||||
+11
-11
@@ -35,17 +35,17 @@
|
||||
#define BLOODCRAWL 1
|
||||
#define BLOODCRAWL_EAT 2
|
||||
|
||||
//Mob bio-types
|
||||
#define MOB_ORGANIC "organic"
|
||||
#define MOB_INORGANIC "inorganic"
|
||||
#define MOB_ROBOTIC "robotic"
|
||||
#define MOB_UNDEAD "undead"
|
||||
#define MOB_HUMANOID "humanoid"
|
||||
#define MOB_BUG "bug"
|
||||
#define MOB_BEAST "beast"
|
||||
#define MOB_EPIC "epic" //megafauna
|
||||
#define MOB_REPTILE "reptile"
|
||||
#define MOB_SPIRIT "spirit"
|
||||
//Mob bio-types flags
|
||||
#define MOB_ORGANIC 1 << 0
|
||||
#define MOB_MINERAL 1 << 1
|
||||
#define MOB_ROBOTIC 1 << 2
|
||||
#define MOB_UNDEAD 1 << 3
|
||||
#define MOB_HUMANOID 1 << 4
|
||||
#define MOB_BUG 1 << 5
|
||||
#define MOB_BEAST 1 << 6
|
||||
#define MOB_EPIC 1 << 7 //megafauna
|
||||
#define MOB_REPTILE 1 << 8
|
||||
#define MOB_SPIRIT 1 << 9
|
||||
|
||||
//Organ defines for carbon mobs
|
||||
#define ORGAN_ORGANIC 1
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
#define PROFILE_START ;PROFILE_STORE = list();PROFILE_SET;
|
||||
#define PROFILE_STOP ;PROFILE_STORE = null;
|
||||
#define LINE_PROFILE_START ;PROFILE_STORE = list();PROFILE_SET;
|
||||
#define LINE_PROFILE_STOP ;PROFILE_STORE = null;
|
||||
|
||||
#define PROFILE_SET ;PROFILE_TIME = TICK_USAGE_REAL; PROFILE_LINE = __LINE__; PROFILE_FILE = __FILE__; PROFILE_SLEEPCHECK = world.time;
|
||||
|
||||
|
||||
@@ -47,6 +47,7 @@
|
||||
// Subsystems shutdown in the reverse of the order they initialize in
|
||||
// The numbers just define the ordering, they are meaningless otherwise.
|
||||
|
||||
#define INIT_ORDER_PROFILER 101
|
||||
#define INIT_ORDER_FAIL2TOPIC 22
|
||||
#define INIT_ORDER_TITLE 20
|
||||
#define INIT_ORDER_GARBAGE 19
|
||||
|
||||
@@ -146,19 +146,19 @@
|
||||
var/list/file_data = list()
|
||||
var/pos = 1
|
||||
for(var/V in GLOB.news_network.network_channels)
|
||||
var/datum/newscaster/feed_channel/channel = V
|
||||
var/datum/news/feed_channel/channel = V
|
||||
if(!istype(channel))
|
||||
stack_trace("Non-channel in newscaster channel list")
|
||||
continue
|
||||
file_data["[pos]"] = list("channel name" = "[channel.channel_name]", "author" = "[channel.author]", "censored" = channel.censored ? 1 : 0, "author censored" = channel.authorCensor ? 1 : 0, "messages" = list())
|
||||
for(var/M in channel.messages)
|
||||
var/datum/newscaster/feed_message/message = M
|
||||
var/datum/news/feed_message/message = M
|
||||
if(!istype(message))
|
||||
stack_trace("Non-message in newscaster channel messages list")
|
||||
continue
|
||||
var/list/comment_data = list()
|
||||
for(var/C in message.comments)
|
||||
var/datum/newscaster/feed_comment/comment = C
|
||||
var/datum/news/feed_comment/comment = C
|
||||
if(!istype(comment))
|
||||
stack_trace("Non-message in newscaster message comments list")
|
||||
continue
|
||||
|
||||
@@ -214,5 +214,18 @@ GLOBAL_LIST_INIT(bitfields, list(
|
||||
"CAN_MASTURBATE_WITH" = CAN_MASTURBATE_WITH,
|
||||
"MASTURBATE_LINKED_ORGAN" = MASTURBATE_LINKED_ORGAN,
|
||||
"CAN_CLIMAX_WITH" = CAN_CLIMAX_WITH
|
||||
)
|
||||
))
|
||||
|
||||
),
|
||||
"mob_biotypes" = list (
|
||||
"MOB_ORGANIC" = MOB_ORGANIC,
|
||||
"MOB_MINERAL" = MOB_MINERAL,
|
||||
"MOB_ROBOTIC" = MOB_ROBOTIC,
|
||||
"MOB_UNDEAD" = MOB_UNDEAD,
|
||||
"MOB_HUMANOID" = MOB_HUMANOID,
|
||||
"MOB_BUG" = MOB_BUG,
|
||||
"MOB_BEAST" = MOB_BEAST,
|
||||
"MOB_EPIC" = MOB_EPIC,
|
||||
"MOB_REPTILE" = MOB_REPTILE,
|
||||
"MOB_SPIRIT" = MOB_SPIRIT
|
||||
)
|
||||
))
|
||||
|
||||
@@ -1 +1,59 @@
|
||||
GLOBAL_LIST_EMPTY(donators_by_group) //group id = donator list of ckeys
|
||||
|
||||
GLOBAL_LIST_INIT(flirts, list("Roses are red / Violets are good / One day while Andy...",
|
||||
"My love for you is like the singularity. It cannot be contained.",
|
||||
"Will you be my lusty xenomorph maid?",
|
||||
"We go together like the clown and the external airlock.",
|
||||
"Roses are red / Liches are wizards / I love you more than a whole squad of lizards.",
|
||||
"Be my valentine. Law 2.",
|
||||
"You must be a mime, because you leave me speechless.",
|
||||
"I love you like Ian loves the HoP.",
|
||||
"You're hotter than a plasma fire in toxins.",
|
||||
"Are you a rogue atmos tech? Because you're taking my breath away.",
|
||||
"Could I have all access... to your heart?",
|
||||
"Call me the doctor, because I'm here to inspect your johnson.",
|
||||
"I'm not a changeling, but you make my proboscis extend.",
|
||||
"I just can't get EI NATH of you.",
|
||||
"You must be a nuke op, because you make my heart explode.",
|
||||
"Roses are red / Botany is a farm / Not being my Valentine / causes human harm.",
|
||||
"I want you more than an assistant wants insulated gloves.",
|
||||
"If I was a security officer, I'd brig you all shift.",
|
||||
"Are you the janitor? Because I think I've fallen for you.",
|
||||
"You're always valid to my heart.",
|
||||
"I'd risk the wrath of the gods to bwoink you.",
|
||||
"You look as beautiful now as the last time you were cloned.",
|
||||
"Someone check the gravitational generator, because I'm only attracted to you.",
|
||||
"If I were the warden I'd always let you into my armory.",
|
||||
"The virologist is rogue, and the only cure is a kiss from you.",
|
||||
"Would you spend some time in my upgraded sleeper?",
|
||||
"You must be a silicon, because you've unbolted my heart.",
|
||||
"Are you Nar'Sie? Because there's nar-one else I sie.",
|
||||
"If you were a taser, you'd be set to stunning.",
|
||||
"Do you have stamina damage from running through my dreams?",
|
||||
"If I were an alien, would you let me hug you?",
|
||||
"My love for you is stronger than a reinforced wall.",
|
||||
"This must be the captain's office, because I see a fox.",
|
||||
"I'm not a highlander, but there can only be one for me.",
|
||||
"The floor is made of lava! Quick, get on my bed.",
|
||||
"If you were an abandoned station you'd be the DEARelict.",
|
||||
"If you had a pickaxe you'd be a shaft FINEr.",
|
||||
"Roses are red, tide is gray, if I were an assistant I'd steal you away.",
|
||||
"Roses are red, text is green, I love you more than cleanbots clean.",
|
||||
"If you were a carp I'd fi-lay you.",
|
||||
"I'm a nuke op, and my pinpointer leads to your heart.",
|
||||
"Wanna slay my megafauna?",
|
||||
"I'm a clockwork cultist. Or zl inyragvar.",
|
||||
"If you were a disposal bin I'd ride you all day.",
|
||||
"Put on your explorer's suit because I'm taking you to LOVEaland.",
|
||||
"I must be the CMO, 'cause I saw you on my CUTE sensors.",
|
||||
"You're the vomit to my flyperson.",
|
||||
"You must be liquid dark matter, because you're pulling me closer.",
|
||||
"Not even sorium can drive me away from you.",
|
||||
"Wanna make like a borg and do some heavy petting?",
|
||||
"Are you powering the station? Because you super matter to me.",
|
||||
"I wish science could make me a bag of holding you.",
|
||||
"Let's call the emergency CUDDLE.",
|
||||
"I must be tripping on BZ, because I saw an angel walk by.",
|
||||
"Wanna empty out my tool storage?",
|
||||
"Did you visit the medbay after you fell from heaven?",
|
||||
"Are you wearing space pants? Wanna not be?" ))
|
||||
|
||||
@@ -1,3 +1,5 @@
|
||||
/datum/config_entry/flag/auto_profile // Automatically start profiler on server start
|
||||
|
||||
/datum/config_entry/flag/autoadmin // if autoadmin is enabled
|
||||
protection = CONFIG_ENTRY_LOCKED
|
||||
|
||||
|
||||
+7
-16
@@ -4,25 +4,16 @@
|
||||
#define END_STAGE 4
|
||||
|
||||
//Used for all kinds of weather, ex. lavaland ash storms.
|
||||
SUBSYSTEM_DEF(weather)
|
||||
PROCESSING_SUBSYSTEM_DEF(weather)
|
||||
name = "Weather"
|
||||
flags = SS_BACKGROUND
|
||||
wait = 10
|
||||
runlevels = RUNLEVEL_GAME
|
||||
var/list/processing = list()
|
||||
var/list/eligible_zlevels = list()
|
||||
var/list/next_hit_by_zlevel = list() //Used by barometers to know when the next storm is coming
|
||||
|
||||
/datum/controller/subsystem/weather/fire()
|
||||
// process active weather
|
||||
for(var/V in processing)
|
||||
var/datum/weather/W = V
|
||||
if(W.aesthetic || W.stage != MAIN_STAGE)
|
||||
continue
|
||||
for(var/i in GLOB.mob_living_list)
|
||||
var/mob/living/L = i
|
||||
if(W.can_weather_act(L))
|
||||
W.weather_act(L)
|
||||
/datum/controller/subsystem/processing/weather/fire()
|
||||
. = ..() //Active weather is handled by . = ..() processing subsystem base fire().
|
||||
|
||||
// start random weather on relevant levels
|
||||
for(var/z in eligible_zlevels)
|
||||
@@ -34,7 +25,7 @@ SUBSYSTEM_DEF(weather)
|
||||
addtimer(CALLBACK(src, .proc/make_eligible, z, possible_weather), randTime + initial(W.weather_duration_upper), TIMER_UNIQUE) //Around 5-10 minutes between weathers
|
||||
next_hit_by_zlevel["[z]"] = world.time + randTime + initial(W.telegraph_duration)
|
||||
|
||||
/datum/controller/subsystem/weather/Initialize(start_timeofday)
|
||||
/datum/controller/subsystem/processing/weather/Initialize(start_timeofday)
|
||||
for(var/V in subtypesof(/datum/weather))
|
||||
var/datum/weather/W = V
|
||||
var/probability = initial(W.probability)
|
||||
@@ -47,7 +38,7 @@ SUBSYSTEM_DEF(weather)
|
||||
eligible_zlevels["[z]"][W] = probability
|
||||
return ..()
|
||||
|
||||
/datum/controller/subsystem/weather/proc/run_weather(datum/weather/weather_datum_type, z_levels)
|
||||
/datum/controller/subsystem/processing/weather/proc/run_weather(datum/weather/weather_datum_type, z_levels)
|
||||
if (istext(weather_datum_type))
|
||||
for (var/V in subtypesof(/datum/weather))
|
||||
var/datum/weather/W = V
|
||||
@@ -69,11 +60,11 @@ SUBSYSTEM_DEF(weather)
|
||||
var/datum/weather/W = new weather_datum_type(z_levels)
|
||||
W.telegraph()
|
||||
|
||||
/datum/controller/subsystem/weather/proc/make_eligible(z, possible_weather)
|
||||
/datum/controller/subsystem/processing/weather/proc/make_eligible(z, possible_weather)
|
||||
eligible_zlevels[z] = possible_weather
|
||||
next_hit_by_zlevel["[z]"] = null
|
||||
|
||||
/datum/controller/subsystem/weather/proc/get_weather(z, area/active_area)
|
||||
/datum/controller/subsystem/processing/weather/proc/get_weather(z, area/active_area)
|
||||
var/datum/weather/A
|
||||
for(var/V in processing)
|
||||
var/datum/weather/W = V
|
||||
@@ -0,0 +1,63 @@
|
||||
#define PROFILER_FILENAME "profiler.json"
|
||||
|
||||
SUBSYSTEM_DEF(profiler)
|
||||
name = "Profiler"
|
||||
init_order = INIT_ORDER_PROFILER
|
||||
runlevels = RUNLEVELS_DEFAULT | RUNLEVEL_LOBBY
|
||||
wait = 3000
|
||||
flags = SS_NO_TICK_CHECK
|
||||
var/fetch_cost = 0
|
||||
var/write_cost = 0
|
||||
|
||||
/datum/controller/subsystem/profiler/stat_entry(msg)
|
||||
msg += "F:[round(fetch_cost,1)]ms"
|
||||
msg += "|W:[round(write_cost,1)]ms"
|
||||
..(msg)
|
||||
|
||||
/datum/controller/subsystem/profiler/Initialize()
|
||||
if(CONFIG_GET(flag/auto_profile))
|
||||
StartProfiling()
|
||||
else
|
||||
StopProfiling() //Stop the early start from world/New
|
||||
return ..()
|
||||
|
||||
/datum/controller/subsystem/profiler/fire()
|
||||
if(CONFIG_GET(flag/auto_profile))
|
||||
DumpFile()
|
||||
|
||||
/datum/controller/subsystem/profiler/Shutdown()
|
||||
if(CONFIG_GET(flag/auto_profile))
|
||||
DumpFile()
|
||||
return ..()
|
||||
|
||||
/datum/controller/subsystem/profiler/proc/StartProfiling()
|
||||
#if DM_BUILD < 1506 || DM_VERSION < 513
|
||||
stack_trace("Auto profiling unsupported on this byond version")
|
||||
CONFIG_SET(flag/auto_profile, FALSE)
|
||||
#else
|
||||
world.Profile(PROFILE_START)
|
||||
#endif
|
||||
|
||||
/datum/controller/subsystem/profiler/proc/StopProfiling()
|
||||
#if DM_BUILD >= 1506 && DM_VERSION >= 513
|
||||
world.Profile(PROFILE_STOP)
|
||||
#endif
|
||||
|
||||
/datum/controller/subsystem/profiler/proc/DumpFile()
|
||||
#if DM_BUILD < 1506 || DM_VERSION < 513
|
||||
stack_trace("Auto profiling unsupported on this byond version")
|
||||
CONFIG_SET(flag/auto_profile, FALSE)
|
||||
#else
|
||||
var/timer = TICK_USAGE_REAL
|
||||
var/current_profile_data = world.Profile(PROFILE_REFRESH,format="json")
|
||||
fetch_cost = MC_AVERAGE(fetch_cost, TICK_DELTA_TO_MS(TICK_USAGE_REAL - timer))
|
||||
CHECK_TICK
|
||||
if(!length(current_profile_data)) //Would be nice to have explicit proc to check this
|
||||
stack_trace("Warning, profiling stopped manually before dump.")
|
||||
var/json_file = file("[GLOB.log_directory]/[PROFILER_FILENAME]")
|
||||
if(fexists(json_file))
|
||||
fdel(json_file)
|
||||
timer = TICK_USAGE_REAL
|
||||
WRITE_FILE(json_file, current_profile_data)
|
||||
write_cost = MC_AVERAGE(write_cost, TICK_DELTA_TO_MS(TICK_USAGE_REAL - timer))
|
||||
#endif
|
||||
@@ -64,29 +64,48 @@
|
||||
|
||||
|
||||
|
||||
|
||||
/datum/component/personal_crafting/proc/check_contents(datum/crafting_recipe/R, list/contents)
|
||||
/**
|
||||
* Check that the contents of the recipe meet the requirements.
|
||||
*
|
||||
* user: The /mob that initated the crafting.
|
||||
* R: The /datum/crafting_recipe being attempted.
|
||||
* contents: List of items to search for R's reqs.
|
||||
*/
|
||||
/datum/component/personal_crafting/proc/check_contents(mob/user, datum/crafting_recipe/R, list/contents)
|
||||
var/list/item_instances = contents["instances"]
|
||||
contents = contents["other"]
|
||||
main_loop:
|
||||
for(var/A in R.reqs)
|
||||
var/needed_amount = R.reqs[A]
|
||||
for(var/B in contents)
|
||||
if(ispath(B, A))
|
||||
if (R.blacklist.Find(B))
|
||||
continue
|
||||
if(contents[B] >= R.reqs[A])
|
||||
continue main_loop
|
||||
else
|
||||
needed_amount -= contents[B]
|
||||
if(needed_amount <= 0)
|
||||
continue main_loop
|
||||
else
|
||||
continue
|
||||
|
||||
var/list/requirements_list = list()
|
||||
|
||||
// Process all requirements
|
||||
for(var/requirement_path in R.reqs)
|
||||
// Check we have the appropriate amount available in the contents list
|
||||
var/needed_amount = R.reqs[requirement_path]
|
||||
for(var/content_item_path in contents)
|
||||
// Right path and not blacklisted
|
||||
if(!ispath(content_item_path, requirement_path) || R.blacklist.Find(requirement_path))
|
||||
continue
|
||||
|
||||
needed_amount -= contents[content_item_path]
|
||||
if(needed_amount <= 0)
|
||||
break
|
||||
|
||||
if(needed_amount > 0)
|
||||
return FALSE
|
||||
for(var/A in R.chem_catalysts)
|
||||
if(contents[A] < R.chem_catalysts[A])
|
||||
|
||||
// Store the instances of what we will use for R.check_requirements() for requirement_path
|
||||
var/list/instances_list = list()
|
||||
for(var/instance_path in item_instances)
|
||||
if(ispath(instance_path, requirement_path))
|
||||
instances_list += item_instances[instance_path]
|
||||
|
||||
requirements_list[requirement_path] = instances_list
|
||||
|
||||
for(var/requirement_path in R.chem_catalysts)
|
||||
if(contents[requirement_path] < R.chem_catalysts[requirement_path])
|
||||
return FALSE
|
||||
return TRUE
|
||||
|
||||
return R.check_requirements(user, requirements_list)
|
||||
|
||||
/datum/component/personal_crafting/proc/get_environment(mob/user)
|
||||
. = list()
|
||||
@@ -110,9 +129,14 @@
|
||||
. = list()
|
||||
.["tool_behaviour"] = list()
|
||||
.["other"] = list()
|
||||
.["instances"] = list()
|
||||
for(var/obj/item/I in get_environment(user))
|
||||
if(I.flags_1 & HOLOGRAM_1)
|
||||
continue
|
||||
if(.["instances"][I.type])
|
||||
.["instances"][I.type] += I
|
||||
else
|
||||
.["instances"][I.type] = list(I)
|
||||
if(istype(I, /obj/item/stack))
|
||||
var/obj/item/stack/S = I
|
||||
.["other"][I.type] += S.amount
|
||||
@@ -161,11 +185,11 @@
|
||||
/datum/component/personal_crafting/proc/construct_item(mob/user, datum/crafting_recipe/R)
|
||||
var/list/contents = get_surroundings(user)
|
||||
var/send_feedback = 1
|
||||
if(check_contents(R, contents))
|
||||
if(check_contents(user, R, contents))
|
||||
if(check_tools(user, R, contents))
|
||||
if(do_after(user, R.time, target = user))
|
||||
contents = get_surroundings(user)
|
||||
if(!check_contents(R, contents))
|
||||
if(!check_contents(user, R, contents))
|
||||
return ", missing component."
|
||||
if(!check_tools(user, R, contents))
|
||||
return ", missing tool."
|
||||
@@ -341,7 +365,7 @@
|
||||
if((R.category != cur_category) || (R.subcategory != cur_subcategory))
|
||||
continue
|
||||
|
||||
craftability["[REF(R)]"] = check_contents(R, surroundings)
|
||||
craftability["[REF(R)]"] = check_contents(user, R, surroundings)
|
||||
|
||||
data["craftability"] = craftability
|
||||
return data
|
||||
|
||||
@@ -8,6 +8,12 @@
|
||||
category = CAT_WEAPONRY
|
||||
subcategory = CAT_WEAPON
|
||||
|
||||
/datum/crafting_recipe/pin_removal/check_requirements(mob/user, list/collected_requirements)
|
||||
var/obj/item/gun/G = collected_requirements[/obj/item/gun][1]
|
||||
if (G.no_pin_required || !G.pin)
|
||||
return FALSE
|
||||
return TRUE
|
||||
|
||||
/datum/crafting_recipe/strobeshield
|
||||
name = "Strobe Shield"
|
||||
result = /obj/item/assembly/flash/shield
|
||||
|
||||
@@ -25,7 +25,7 @@
|
||||
if(isliving(parent))
|
||||
host_mob = parent
|
||||
|
||||
if(!(MOB_ORGANIC in host_mob.mob_biotypes) && !(MOB_UNDEAD in host_mob.mob_biotypes)) //Shouldn't happen, but this avoids HUD runtimes in case a silicon gets them somehow.
|
||||
if(!(host_mob.mob_biotypes & (MOB_ORGANIC|MOB_UNDEAD))) //Shouldn't happen, but this avoids HUD runtimes in case a silicon gets them somehow.
|
||||
return COMPONENT_INCOMPATIBLE
|
||||
|
||||
host_mob.hud_set_nanite_indicator()
|
||||
@@ -212,7 +212,7 @@
|
||||
NP.receive_comm_signal(comm_code, comm_message, comm_source)
|
||||
|
||||
/datum/component/nanites/proc/check_viable_biotype()
|
||||
if(!(MOB_ORGANIC in host_mob.mob_biotypes) && !(MOB_UNDEAD in host_mob.mob_biotypes))
|
||||
if(!(host_mob.mob_biotypes & (MOB_ORGANIC|MOB_UNDEAD)))
|
||||
qdel(src) //bodytype no longer sustains nanites
|
||||
|
||||
/datum/component/nanites/proc/check_access(datum/source, obj/O)
|
||||
|
||||
@@ -41,6 +41,7 @@
|
||||
|
||||
var/obj/screen/storage/boxes //storage display object
|
||||
var/obj/screen/close/closer //close button object
|
||||
var/current_maxscreensize
|
||||
|
||||
var/allow_big_nesting = FALSE //allow storage objects of the same or greater size.
|
||||
|
||||
@@ -362,11 +363,15 @@
|
||||
break
|
||||
closer.screen_loc = "[screen_start_x + cols]:[screen_pixel_x],[screen_start_y]:[screen_pixel_y]"
|
||||
|
||||
/datum/component/storage/proc/show_to(mob/M)
|
||||
/datum/component/storage/proc/show_to(mob/M, set_screen_size = TRUE)
|
||||
if(!M.client)
|
||||
return FALSE
|
||||
var/list/cview = getviewsize(M.client.view)
|
||||
var/maxallowedscreensize = cview[1]-8
|
||||
if(set_screen_size)
|
||||
current_maxscreensize = maxallowedscreensize
|
||||
else if(current_maxscreensize)
|
||||
maxallowedscreensize = current_maxscreensize
|
||||
if(M.active_storage != src && (M.stat == CONSCIOUS))
|
||||
for(var/obj/item/I in accessible_items())
|
||||
if(I.on_found(M))
|
||||
@@ -547,14 +552,14 @@
|
||||
return
|
||||
A.add_fingerprint(M)
|
||||
|
||||
/datum/component/storage/proc/user_show_to_mob(mob/M, force = FALSE)
|
||||
/datum/component/storage/proc/user_show_to_mob(mob/M, force = FALSE, ghost = FALSE)
|
||||
var/atom/A = parent
|
||||
if(!istype(M))
|
||||
return FALSE
|
||||
A.add_fingerprint(M)
|
||||
if(!force && (check_locked(null, M) || !M.CanReach(parent, view_only = TRUE)))
|
||||
return FALSE
|
||||
show_to(M)
|
||||
show_to(M, !ghost)
|
||||
|
||||
/datum/component/storage/proc/mousedrop_receive(datum/source, atom/movable/O, mob/M)
|
||||
if(isitem(O))
|
||||
@@ -665,7 +670,7 @@
|
||||
return can_be_inserted(I, silent, M)
|
||||
|
||||
/datum/component/storage/proc/show_to_ghost(datum/source, mob/dead/observer/M)
|
||||
return user_show_to_mob(M, TRUE)
|
||||
return user_show_to_mob(M, TRUE, TRUE)
|
||||
|
||||
/datum/component/storage/proc/signal_show_attempt(datum/source, mob/showto, force = FALSE)
|
||||
return user_show_to_mob(showto, force)
|
||||
|
||||
@@ -25,6 +25,7 @@ GLOBAL_LIST_EMPTY(uplinks)
|
||||
var/unlock_code
|
||||
var/failsafe_code
|
||||
var/datum/ui_state/checkstate
|
||||
var/compact_mode = FALSE
|
||||
var/debug = FALSE
|
||||
|
||||
/datum/component/uplink/Initialize(_owner, _lockable = TRUE, _enabled = FALSE, datum/game_mode/_gamemode, starting_tc = 20, datum/ui_state/_checkstate)
|
||||
@@ -122,7 +123,7 @@ GLOBAL_LIST_EMPTY(uplinks)
|
||||
active = TRUE
|
||||
ui = SStgui.try_update_ui(user, src, ui_key, ui, force_open)
|
||||
if(!ui)
|
||||
ui = new(user, src, ui_key, "uplink", name, 450, 750, master_ui, state)
|
||||
ui = new(user, src, ui_key, "uplink", name, 620, 580, master_ui, state)
|
||||
ui.set_autoupdate(FALSE) // This UI is only ever opened by one person, and never is updated outside of user input.
|
||||
ui.set_style("syndicate")
|
||||
ui.open()
|
||||
@@ -139,29 +140,35 @@ GLOBAL_LIST_EMPTY(uplinks)
|
||||
var/list/data = list()
|
||||
data["telecrystals"] = telecrystals
|
||||
data["lockable"] = lockable
|
||||
data["compact_mode"] = compact_mode
|
||||
|
||||
return data
|
||||
|
||||
/datum/component/uplink/ui_static_data(mob/user)
|
||||
var/list/data = list()
|
||||
data["categories"] = list()
|
||||
for(var/category in uplink_items)
|
||||
var/list/cat = list(
|
||||
"name" = category,
|
||||
"items" = (category == selected_cat ? list() : null))
|
||||
if(category == selected_cat)
|
||||
for(var/item in uplink_items[category])
|
||||
var/datum/uplink_item/I = uplink_items[category][item]
|
||||
if(I.limited_stock == 0)
|
||||
for(var/item in uplink_items[category])
|
||||
var/datum/uplink_item/I = uplink_items[category][item]
|
||||
if(I.limited_stock == 0)
|
||||
continue
|
||||
if(I.restricted_roles.len)
|
||||
var/is_inaccessible = TRUE
|
||||
for(var/R in I.restricted_roles)
|
||||
if(R == user.mind.assigned_role || debug)
|
||||
is_inaccessible = FALSE
|
||||
if(is_inaccessible)
|
||||
continue
|
||||
if(I.restricted_roles.len)
|
||||
var/is_inaccessible = 1
|
||||
for(var/R in I.restricted_roles)
|
||||
if(R == user.mind.assigned_role || debug)
|
||||
is_inaccessible = 0
|
||||
if(is_inaccessible)
|
||||
continue
|
||||
cat["items"] += list(list(
|
||||
"name" = I.name,
|
||||
"cost" = I.cost,
|
||||
"desc" = I.desc,
|
||||
))
|
||||
cat["items"] += list(list(
|
||||
"name" = I.name,
|
||||
"cost" = I.cost,
|
||||
"desc" = I.desc,
|
||||
))
|
||||
data["categories"] += list(cat)
|
||||
return data
|
||||
|
||||
@@ -189,6 +196,8 @@ GLOBAL_LIST_EMPTY(uplinks)
|
||||
SStgui.close_uis(src)
|
||||
if("select")
|
||||
selected_cat = params["category"]
|
||||
if("compact_toggle")
|
||||
compact_mode = !compact_mode
|
||||
return TRUE
|
||||
|
||||
/datum/component/uplink/proc/MakePurchase(mob/user, datum/uplink_item/U)
|
||||
|
||||
@@ -17,14 +17,10 @@
|
||||
if(HasDisease(D))
|
||||
return FALSE
|
||||
|
||||
var/can_infect = FALSE
|
||||
for(var/host_type in D.infectable_biotypes)
|
||||
if(host_type in mob_biotypes)
|
||||
can_infect = TRUE
|
||||
break
|
||||
if(!can_infect)
|
||||
if(!(D.infectable_biotypes & mob_biotypes))
|
||||
return FALSE
|
||||
|
||||
|
||||
if(!(type in D.viable_mobtypes))
|
||||
return FALSE
|
||||
|
||||
|
||||
@@ -30,7 +30,7 @@
|
||||
var/list/required_organs = list()
|
||||
var/needs_all_cures = TRUE
|
||||
var/list/strain_data = list() //dna_spread special bullshit
|
||||
var/list/infectable_biotypes = list(MOB_ORGANIC) //if the disease can spread on organics, synthetics, or undead
|
||||
var/infectable_biotypes = MOB_ORGANIC //if the disease can spread on organics, synthetics, or undead
|
||||
var/process_dead = FALSE //if this ticks while the host is dead
|
||||
var/copy_type = null //if this is null, copies will use the type of the instance being copied
|
||||
|
||||
|
||||
@@ -14,7 +14,7 @@
|
||||
|
||||
/datum/symptom/undead_adaptation/OnRemove(datum/disease/advance/A)
|
||||
A.process_dead = FALSE
|
||||
A.infectable_biotypes -= MOB_UNDEAD
|
||||
A.infectable_biotypes &= ~MOB_UNDEAD
|
||||
|
||||
/datum/symptom/inorganic_adaptation
|
||||
name = "Inorganic Biology"
|
||||
@@ -27,7 +27,8 @@
|
||||
severity = 0
|
||||
|
||||
/datum/symptom/inorganic_adaptation/OnAdd(datum/disease/advance/A)
|
||||
A.infectable_biotypes |= MOB_INORGANIC
|
||||
A.infectable_biotypes |= MOB_MINERAL //Mineral covers plasmamen and golems.
|
||||
|
||||
/datum/symptom/inorganic_adaptation/OnRemove(datum/disease/advance/A)
|
||||
A.infectable_biotypes -= MOB_INORGANIC
|
||||
A.infectable_biotypes &= ~MOB_MINERAL
|
||||
|
||||
|
||||
@@ -10,7 +10,7 @@
|
||||
viable_mobtypes = list(/mob/living/carbon/human, /mob/living/carbon/monkey)
|
||||
desc = "If left untreated subject will regurgitate bees."
|
||||
severity = DISEASE_SEVERITY_MEDIUM
|
||||
infectable_biotypes = list(MOB_ORGANIC, MOB_UNDEAD) //bees nesting in corpses
|
||||
infectable_biotypes = MOB_ORGANIC|MOB_UNDEAD //bees nesting in corpses
|
||||
|
||||
/datum/disease/beesease/stage_act()
|
||||
..()
|
||||
|
||||
@@ -10,7 +10,7 @@
|
||||
permeability_mod = 0.75
|
||||
desc = "This disease disrupts the magnetic field of your body, making it act as if a powerful magnet. Injections of iron help stabilize the field."
|
||||
severity = DISEASE_SEVERITY_MEDIUM
|
||||
infectable_biotypes = list(MOB_ORGANIC, MOB_ROBOTIC)
|
||||
infectable_biotypes = MOB_ORGANIC|MOB_ROBOTIC
|
||||
process_dead = TRUE
|
||||
|
||||
/datum/disease/magnitis/stage_act()
|
||||
|
||||
@@ -11,7 +11,7 @@
|
||||
viable_mobtypes = list(/mob/living/carbon/human)
|
||||
desc = "Subject is possessed by the vengeful spirit of a parrot. Call the priest."
|
||||
severity = DISEASE_SEVERITY_MEDIUM
|
||||
infectable_biotypes = list(MOB_ORGANIC, MOB_UNDEAD, MOB_INORGANIC, MOB_ROBOTIC)
|
||||
infectable_biotypes = MOB_ORGANIC|MOB_UNDEAD|MOB_ROBOTIC|MOB_MINERAL
|
||||
bypasses_immunity = TRUE //2spook
|
||||
var/mob/living/simple_animal/parrot/Poly/ghost/parrot
|
||||
|
||||
|
||||
@@ -168,7 +168,7 @@
|
||||
stage4 = list("<span class='danger'>Your skin feels very loose.</span>", "<span class='danger'>You can feel... something...inside you.</span>")
|
||||
stage5 = list("<span class='danger'>Your skin feels as if it's about to burst off!</span>")
|
||||
new_form = /mob/living/silicon/robot
|
||||
infectable_biotypes = list(MOB_ORGANIC, MOB_UNDEAD, MOB_ROBOTIC)
|
||||
infectable_biotypes = MOB_ORGANIC|MOB_UNDEAD|MOB_ROBOTIC
|
||||
bantype = "Cyborg"
|
||||
|
||||
/datum/disease/transformation/robot/stage_act()
|
||||
@@ -284,7 +284,7 @@
|
||||
stage4 = list("<span class='danger'>You're ravenous.</span>")
|
||||
stage5 = list("<span class='danger'>You have become a morph.</span>")
|
||||
new_form = /mob/living/simple_animal/hostile/morph
|
||||
infectable_biotypes = list(MOB_ORGANIC, MOB_INORGANIC, MOB_UNDEAD) //magic!
|
||||
infectable_biotypes = MOB_ORGANIC|MOB_MINERAL|MOB_UNDEAD //magic!
|
||||
|
||||
/datum/disease/transformation/gondola
|
||||
name = "Gondola Transformation"
|
||||
|
||||
@@ -40,7 +40,7 @@
|
||||
to_chat(user, "<span class='warning'>Your hands are full!</span>")
|
||||
return FALSE
|
||||
if(source.buckled)
|
||||
to_chat(user, "<span class='warning'>[src] is buckled to something!</span>")
|
||||
to_chat(user, "<span class='warning'>[source] is buckled to something!</span>")
|
||||
return FALSE
|
||||
if(source == user)
|
||||
to_chat(user, "<span class='warning'>You can't pick yourself up.</span>")
|
||||
@@ -52,7 +52,7 @@
|
||||
|
||||
source.visible_message("<span class='warning'>[user] picks up [source]!</span>", \
|
||||
"<span class='userdanger'>[user] picks you up!</span>")
|
||||
to_chat(user, "<span class='notice'>You pick [src] up.</span>")
|
||||
to_chat(user, "<span class='notice'>You pick [source] up.</span>")
|
||||
source.drop_all_held_items()
|
||||
var/obj/item/clothing/head/mob_holder/holder = new(get_turf(source), source, worn_state, alt_worn, right_hand, left_hand, inv_slots)
|
||||
if(proctype)
|
||||
@@ -101,6 +101,8 @@
|
||||
target.forceMove(src)
|
||||
var/image/I = new //work around to retain the same appearance to the mob idependently from inhands/worn states.
|
||||
I.appearance = target.appearance
|
||||
I.layer = FLOAT_LAYER //So it doesn't get screwed up by layer overrides.
|
||||
I.plane = FLOAT_PLANE //Same as above but for planes.
|
||||
I.override = TRUE
|
||||
add_overlay(I)
|
||||
name = target.name
|
||||
@@ -128,7 +130,7 @@
|
||||
if(AM == held_mob)
|
||||
held_mob.reset_perspective()
|
||||
held_mob = null
|
||||
qdel(src)
|
||||
QDEL_IN(src, 1) //To avoid a qdel loop.
|
||||
|
||||
/obj/item/clothing/head/mob_holder/Entered(atom/movable/AM, atom/newloc)
|
||||
. = ..()
|
||||
@@ -158,7 +160,7 @@
|
||||
/obj/item/clothing/head/mob_holder/container_resist()
|
||||
if(isliving(loc))
|
||||
var/mob/living/L = loc
|
||||
L.visible_message("<span class='warning'>[src] escapes from [L]!</span>", "<span class='warning'>[src] escapes your grip!</span>")
|
||||
L.visible_message("<span class='warning'>[held_mob] escapes from [L]!</span>", "<span class='warning'>[held_mob] escapes your grip!</span>")
|
||||
release()
|
||||
|
||||
/obj/item/clothing/head/mob_holder/assume_air(datum/gas_mixture/env)
|
||||
@@ -170,7 +172,7 @@
|
||||
location = location.loc
|
||||
if(ismob(location))
|
||||
return location.loc.assume_air(env)
|
||||
return loc.assume_air(env)
|
||||
return location.assume_air(env)
|
||||
|
||||
/obj/item/clothing/head/mob_holder/remove_air(amount)
|
||||
var/atom/location = loc
|
||||
@@ -181,4 +183,4 @@
|
||||
location = location.loc
|
||||
if(ismob(location))
|
||||
return location.loc.remove_air(amount)
|
||||
return loc.remove_air(amount)
|
||||
return location.remove_air(amount)
|
||||
|
||||
@@ -1,62 +0,0 @@
|
||||
/datum/topic_input
|
||||
var/href
|
||||
var/list/href_list
|
||||
|
||||
/datum/topic_input/New(thref,list/thref_list)
|
||||
href = thref
|
||||
href_list = thref_list.Copy()
|
||||
return
|
||||
|
||||
/datum/topic_input/proc/get(i)
|
||||
return listgetindex(href_list,i)
|
||||
|
||||
/datum/topic_input/proc/getAndLocate(i)
|
||||
var/t = get(i)
|
||||
if(t)
|
||||
t = locate(t)
|
||||
if (istext(t))
|
||||
t = null
|
||||
return t || null
|
||||
|
||||
/datum/topic_input/proc/getNum(i)
|
||||
var/t = get(i)
|
||||
if(t)
|
||||
t = text2num(t)
|
||||
return isnum(t) ? t : null
|
||||
|
||||
/datum/topic_input/proc/getObj(i)
|
||||
var/t = getAndLocate(i)
|
||||
return isobj(t) ? t : null
|
||||
|
||||
/datum/topic_input/proc/getMob(i)
|
||||
var/t = getAndLocate(i)
|
||||
return ismob(t) ? t : null
|
||||
|
||||
/datum/topic_input/proc/getTurf(i)
|
||||
var/t = getAndLocate(i)
|
||||
return isturf(t) ? t : null
|
||||
|
||||
/datum/topic_input/proc/getAtom(i)
|
||||
return getType(i, /atom)
|
||||
|
||||
/datum/topic_input/proc/getArea(i)
|
||||
var/t = getAndLocate(i)
|
||||
return isarea(t) ? t : null
|
||||
|
||||
/datum/topic_input/proc/getStr(i)//params should always be text, but...
|
||||
var/t = get(i)
|
||||
return istext(t) ? t : null
|
||||
|
||||
/datum/topic_input/proc/getType(i,type)
|
||||
var/t = getAndLocate(i)
|
||||
return istype(t,type) ? t : null
|
||||
|
||||
/datum/topic_input/proc/getPath(i)
|
||||
var/t = get(i)
|
||||
if(t)
|
||||
t = text2path(t)
|
||||
return ispath(t) ? t : null
|
||||
|
||||
/datum/topic_input/proc/getList(i)
|
||||
var/t = getAndLocate(i)
|
||||
return islist(t) ? t : null
|
||||
@@ -61,7 +61,7 @@
|
||||
if(A.z in impacted_z_levels)
|
||||
impacted_areas |= A
|
||||
weather_duration = rand(weather_duration_lower, weather_duration_upper)
|
||||
START_PROCESSING(SSweather, src)
|
||||
START_PROCESSING(SSweather, src) //The reason this doesn't start and stop at main stage is because processing list is also used to see active running weathers (for example, you wouldn't want two ash storms starting at once.)
|
||||
update_areas()
|
||||
for(var/M in GLOB.player_list)
|
||||
var/turf/mob_turf = get_turf(M)
|
||||
@@ -107,6 +107,14 @@
|
||||
STOP_PROCESSING(SSweather, src)
|
||||
update_areas()
|
||||
|
||||
/datum/weather/process()
|
||||
if(aesthetic || (stage != MAIN_STAGE))
|
||||
return
|
||||
for(var/i in GLOB.mob_living_list)
|
||||
var/mob/living/L = i
|
||||
if(can_weather_act(L))
|
||||
weather_act(L)
|
||||
|
||||
/datum/weather/proc/can_weather_act(mob/living/L) //Can this weather impact a mob?
|
||||
var/turf/mob_turf = get_turf(L)
|
||||
if(mob_turf && !(mob_turf.z in impacted_z_levels))
|
||||
|
||||
@@ -6,7 +6,6 @@
|
||||
|
||||
var/flags_1 = NONE
|
||||
var/interaction_flags_atom = NONE
|
||||
var/ghost_flags = NONE
|
||||
var/datum/reagents/reagents = null
|
||||
|
||||
//This atom's HUD (med/sec, etc) images. Associative list.
|
||||
|
||||
@@ -7,7 +7,7 @@
|
||||
|
||||
// LISTS //
|
||||
var/list/vassal_allowed_antags = list(/datum/antagonist/brother, /datum/antagonist/traitor, /datum/antagonist/traitor/internal_affairs, /datum/antagonist/survivalist, \
|
||||
/datum/antagonist/rev, /datum/antagonist/nukeop, /datum/antagonist/pirate, /datum/antagonist/cult, /datum/antagonist/abductee)
|
||||
/datum/antagonist/rev, /datum/antagonist/nukeop, /datum/antagonist/pirate, /datum/antagonist/cult, /datum/antagonist/abductee, /datum/antagonist/valentine, /datum/antagonist/heartbreaker,)
|
||||
// The antags you're allowed to be if turning Vassal.
|
||||
/proc/isvamp(mob/living/M)
|
||||
return istype(M) && M.mind && M.mind.has_antag_datum(/datum/antagonist/bloodsucker)
|
||||
|
||||
@@ -242,7 +242,7 @@ Class Procs:
|
||||
else
|
||||
if(interaction_flags_machine & INTERACT_MACHINE_REQUIRES_SILICON)
|
||||
return FALSE
|
||||
if(!Adjacent(user) && !isobserver(user))
|
||||
if(!Adjacent(user))
|
||||
var/mob/living/carbon/H = user
|
||||
if(!(istype(H) && H.has_dna() && H.dna.check_mutation(TK)))
|
||||
return FALSE
|
||||
|
||||
@@ -71,7 +71,7 @@
|
||||
say("Subject may not have abiotic items on.")
|
||||
playsound(src, 'sound/machines/buzz-sigh.ogg', 30, 1)
|
||||
return
|
||||
if(!(MOB_ORGANIC in C.mob_biotypes))
|
||||
if(!(C.mob_biotypes & MOB_ORGANIC))
|
||||
say("Subject is not organic.")
|
||||
playsound(src, 'sound/machines/buzz-sigh.ogg', 30, 1)
|
||||
return
|
||||
|
||||
@@ -108,16 +108,17 @@
|
||||
|
||||
/obj/item/mecha_parts/mecha_equipment/medical/sleeper/Topic(href,href_list)
|
||||
..()
|
||||
var/datum/topic_input/afilter = new /datum/topic_input(href,href_list)
|
||||
if(afilter.get("eject"))
|
||||
if(href_list["eject"])
|
||||
go_out()
|
||||
if(afilter.get("view_stats"))
|
||||
if(href_list["view_stats"])
|
||||
chassis.occupant << browse(get_patient_stats(),"window=msleeper")
|
||||
onclose(chassis.occupant, "msleeper")
|
||||
return
|
||||
if(afilter.get("inject"))
|
||||
inject_reagent(afilter.getType("inject", /datum/reagent),afilter.getObj("source"))
|
||||
return
|
||||
if(href_list["inject"])
|
||||
var/obj/item/mecha_parts/mecha_equipment/medical/syringe_gun/SG = locate() in chassis
|
||||
var/datum/reagent/R = locate(href_list["inject"]) in SG.reagents.reagent_list
|
||||
if (istype(R))
|
||||
inject_reagent(R, SG)
|
||||
|
||||
/obj/item/mecha_parts/mecha_equipment/medical/sleeper/proc/get_patient_stats()
|
||||
if(!patient)
|
||||
@@ -354,19 +355,18 @@
|
||||
|
||||
/obj/item/mecha_parts/mecha_equipment/medical/syringe_gun/Topic(href,href_list)
|
||||
..()
|
||||
var/datum/topic_input/afilter = new (href,href_list)
|
||||
if(afilter.get("toggle_mode"))
|
||||
if (href_list["toggle_mode"])
|
||||
mode = !mode
|
||||
update_equip_info()
|
||||
return
|
||||
if(afilter.get("select_reagents"))
|
||||
if (href_list["select_reagents"])
|
||||
processed_reagents.len = 0
|
||||
var/m = 0
|
||||
var/message
|
||||
for(var/i=1 to known_reagents.len)
|
||||
if(m>=synth_speed)
|
||||
break
|
||||
var/reagent = afilter.get("reagent_[i]")
|
||||
var/reagent = text2path(href_list["reagent_[i]"])
|
||||
if(reagent && (reagent in known_reagents))
|
||||
message = "[m ? ", " : null][known_reagents[reagent]]"
|
||||
processed_reagents += reagent
|
||||
@@ -375,20 +375,18 @@
|
||||
message += " added to production"
|
||||
START_PROCESSING(SSobj, src)
|
||||
occupant_message(message)
|
||||
occupant_message("Reagent processing started.")
|
||||
occupant_message("<span class='notice'>Reagent processing started.</span>")
|
||||
mecha_log_message("Reagent processing started.")
|
||||
return
|
||||
if(afilter.get("show_reagents"))
|
||||
if (href_list["show_reagents"])
|
||||
chassis.occupant << browse(get_reagents_page(),"window=msyringegun")
|
||||
if(afilter.get("purge_reagent"))
|
||||
var/reagent = afilter.get("purge_reagent")
|
||||
if (href_list["purge_reagent"])
|
||||
var/reagent = href_list["purge_reagent"]
|
||||
if(reagent)
|
||||
reagents.del_reagent(reagent)
|
||||
return
|
||||
if(afilter.get("purge_all"))
|
||||
if (href_list["purge_all"])
|
||||
reagents.clear_reagents()
|
||||
return
|
||||
return
|
||||
|
||||
/obj/item/mecha_parts/mecha_equipment/medical/syringe_gun/proc/get_reagents_page()
|
||||
var/output = {"<html>
|
||||
|
||||
@@ -317,9 +317,8 @@
|
||||
/obj/machinery/mecha_part_fabricator/Topic(href, href_list)
|
||||
if(..())
|
||||
return
|
||||
var/datum/topic_input/afilter = new /datum/topic_input(href,href_list)
|
||||
if(href_list["part_set"])
|
||||
var/tpart_set = afilter.getStr("part_set")
|
||||
var/tpart_set = href_list["part_set"]
|
||||
if(tpart_set)
|
||||
if(tpart_set=="clear")
|
||||
part_set = null
|
||||
@@ -327,7 +326,7 @@
|
||||
part_set = tpart_set
|
||||
screen = "parts"
|
||||
if(href_list["part"])
|
||||
var/T = afilter.getStr("part")
|
||||
var/T = href_list["part"]
|
||||
for(var/v in stored_research.researched_designs)
|
||||
var/datum/design/D = SSresearch.techweb_design_by_id(v)
|
||||
if(D.build_type & MECHFAB)
|
||||
@@ -338,7 +337,7 @@
|
||||
add_to_queue(D)
|
||||
break
|
||||
if(href_list["add_to_queue"])
|
||||
var/T = afilter.getStr("add_to_queue")
|
||||
var/T = href_list["add_to_queue"]
|
||||
for(var/v in stored_research.researched_designs)
|
||||
var/datum/design/D = SSresearch.techweb_design_by_id(v)
|
||||
if(D.build_type & MECHFAB)
|
||||
@@ -347,10 +346,10 @@
|
||||
break
|
||||
return update_queue_on_page()
|
||||
if(href_list["remove_from_queue"])
|
||||
remove_from_queue(afilter.getNum("remove_from_queue"))
|
||||
remove_from_queue(text2num(href_list["remove_from_queue"]))
|
||||
return update_queue_on_page()
|
||||
if(href_list["partset_to_queue"])
|
||||
add_part_set_to_queue(afilter.get("partset_to_queue"))
|
||||
add_part_set_to_queue(href_list["partset_to_queue"])
|
||||
return update_queue_on_page()
|
||||
if(href_list["process_queue"])
|
||||
spawn(0)
|
||||
@@ -364,8 +363,8 @@
|
||||
if(href_list["screen"])
|
||||
screen = href_list["screen"]
|
||||
if(href_list["queue_move"] && href_list["index"])
|
||||
var/index = afilter.getNum("index")
|
||||
var/new_index = index + afilter.getNum("queue_move")
|
||||
var/index = text2num(href_list["index"])
|
||||
var/new_index = index + text2num(href_list["queue_move"])
|
||||
if(isnum(index) && isnum(new_index) && ISINTEGER(index) && ISINTEGER(new_index))
|
||||
if(ISINRANGE(new_index,1,queue.len))
|
||||
queue.Swap(index,new_index)
|
||||
@@ -376,7 +375,7 @@
|
||||
if(href_list["sync"])
|
||||
sync()
|
||||
if(href_list["part_desc"])
|
||||
var/T = afilter.getStr("part_desc")
|
||||
var/T = href_list["part_desc"]
|
||||
for(var/v in stored_research.researched_designs)
|
||||
var/datum/design/D = SSresearch.techweb_design_by_id(v)
|
||||
if(D.build_type & MECHFAB)
|
||||
|
||||
@@ -39,21 +39,24 @@
|
||||
/obj/machinery/computer/mecha/Topic(href, href_list)
|
||||
if(..())
|
||||
return
|
||||
var/datum/topic_input/afilter = new /datum/topic_input(href,href_list)
|
||||
if(href_list["send_message"])
|
||||
var/obj/item/mecha_parts/mecha_tracking/MT = afilter.getObj("send_message")
|
||||
var/obj/item/mecha_parts/mecha_tracking/MT = locate(href_list["send_message"])
|
||||
if (!istype(MT))
|
||||
return
|
||||
var/message = stripped_input(usr,"Input message","Transmit message")
|
||||
var/obj/mecha/M = MT.in_mecha()
|
||||
if(trim(message) && M)
|
||||
M.occupant_message(message)
|
||||
return
|
||||
if(href_list["shock"])
|
||||
var/obj/item/mecha_parts/mecha_tracking/MT = afilter.getObj("shock")
|
||||
MT.shock()
|
||||
var/obj/item/mecha_parts/mecha_tracking/MT = locate(href_list["shock"])
|
||||
if (istype(MT))
|
||||
MT.shock()
|
||||
if(href_list["get_log"])
|
||||
var/obj/item/mecha_parts/mecha_tracking/MT = afilter.getObj("get_log")
|
||||
stored_data = MT.get_mecha_log()
|
||||
screen = 1
|
||||
var/obj/item/mecha_parts/mecha_tracking/MT = locate(href_list["get_log"])
|
||||
if(istype(MT))
|
||||
stored_data = MT.get_mecha_log()
|
||||
screen = 1
|
||||
if(href_list["return"])
|
||||
screen = 0
|
||||
updateUsrDialog()
|
||||
|
||||
@@ -221,73 +221,71 @@
|
||||
if(usr.incapacitated())
|
||||
return
|
||||
|
||||
var/datum/topic_input/afilter = new /datum/topic_input(href,href_list)
|
||||
|
||||
if(in_range(src, usr))
|
||||
var/obj/item/card/id/id_card
|
||||
if (href_list["id_card"])
|
||||
id_card = locate(href_list["id_card"])
|
||||
if (!istype(id_card))
|
||||
return
|
||||
|
||||
if(href_list["req_access"] && add_req_access)
|
||||
output_access_dialog(afilter.getObj("id_card"),afilter.getMob("user"))
|
||||
output_access_dialog(id_card, usr)
|
||||
|
||||
if(href_list["maint_access"] && maint_access)
|
||||
var/mob/user = afilter.getMob("user")
|
||||
if(user)
|
||||
if(state==0)
|
||||
state = 1
|
||||
to_chat(user, "The securing bolts are now exposed.")
|
||||
else if(state==1)
|
||||
state = 0
|
||||
to_chat(user, "The securing bolts are now hidden.")
|
||||
output_maintenance_dialog(afilter.getObj("id_card"),user)
|
||||
if(state==0)
|
||||
state = 1
|
||||
to_chat(usr, "The securing bolts are now exposed.")
|
||||
else if(state==1)
|
||||
state = 0
|
||||
to_chat(usr, "The securing bolts are now hidden.")
|
||||
output_maintenance_dialog(id_card, usr)
|
||||
|
||||
if(href_list["set_internal_tank_valve"] && state >=1)
|
||||
var/mob/user = afilter.getMob("user")
|
||||
if(user)
|
||||
var/new_pressure = input(user,"Input new output pressure","Pressure setting",internal_tank_valve) as num
|
||||
if(new_pressure)
|
||||
internal_tank_valve = new_pressure
|
||||
to_chat(user, "The internal pressure valve has been set to [internal_tank_valve]kPa.")
|
||||
var/new_pressure = input(usr,"Input new output pressure","Pressure setting",internal_tank_valve) as num
|
||||
if(new_pressure)
|
||||
internal_tank_valve = new_pressure
|
||||
to_chat(usr, "The internal pressure valve has been set to [internal_tank_valve]kPa.")
|
||||
|
||||
if(href_list["add_req_access"] && add_req_access && afilter.getObj("id_card"))
|
||||
operation_req_access += afilter.getNum("add_req_access")
|
||||
output_access_dialog(afilter.getObj("id_card"),afilter.getMob("user"))
|
||||
if(href_list["add_req_access"] && add_req_access)
|
||||
operation_req_access += text2num(href_list["add_req_access"])
|
||||
output_access_dialog(id_card, usr)
|
||||
|
||||
if(href_list["del_req_access"] && add_req_access && afilter.getObj("id_card"))
|
||||
operation_req_access -= afilter.getNum("del_req_access")
|
||||
output_access_dialog(afilter.getObj("id_card"),afilter.getMob("user"))
|
||||
if(href_list["del_req_access"] && add_req_access)
|
||||
operation_req_access -= text2num(href_list["add_req_access"])
|
||||
output_access_dialog(id_card, usr)
|
||||
|
||||
if(href_list["finish_req_access"])
|
||||
add_req_access = 0
|
||||
var/mob/user = afilter.getMob("user")
|
||||
user << browse(null,"window=exosuit_add_access")
|
||||
usr << browse(null,"window=exosuit_add_access")
|
||||
|
||||
if(usr != occupant)
|
||||
return
|
||||
|
||||
if(href_list["update_content"])
|
||||
send_byjax(src.occupant,"exosuit.browser","content",src.get_stats_part())
|
||||
send_byjax(usr,"exosuit.browser","content",src.get_stats_part())
|
||||
|
||||
if(href_list["select_equip"])
|
||||
var/obj/item/mecha_parts/mecha_equipment/equip = afilter.getObj("select_equip")
|
||||
var/obj/item/mecha_parts/mecha_equipment/equip = locate(href_list["select_equip"]) in src
|
||||
if(equip && equip.selectable)
|
||||
src.selected = equip
|
||||
src.occupant_message("You switch to [equip]")
|
||||
src.visible_message("[src] raises [equip]")
|
||||
send_byjax(src.occupant,"exosuit.browser","eq_list",src.get_equipment_list())
|
||||
selected = equip
|
||||
occupant_message("You switch to [equip]")
|
||||
visible_message("[src] raises [equip]")
|
||||
send_byjax(usr, "exosuit.browser","eq_list", get_equipment_list())
|
||||
|
||||
if(href_list["rmictoggle"])
|
||||
radio.broadcasting = !radio.broadcasting
|
||||
send_byjax(src.occupant,"exosuit.browser","rmicstate",(radio.broadcasting?"Engaged":"Disengaged"))
|
||||
send_byjax(usr,"exosuit.browser","rmicstate",(radio.broadcasting?"Engaged":"Disengaged"))
|
||||
|
||||
if(href_list["rspktoggle"])
|
||||
radio.listening = !radio.listening
|
||||
send_byjax(src.occupant,"exosuit.browser","rspkstate",(radio.listening?"Engaged":"Disengaged"))
|
||||
send_byjax(usr,"exosuit.browser","rspkstate",(radio.listening?"Engaged":"Disengaged"))
|
||||
|
||||
if(href_list["rfreq"])
|
||||
var/new_frequency = (radio.frequency + afilter.getNum("rfreq"))
|
||||
var/new_frequency = (radio.frequency + text2num(href_list["rfreq"]))
|
||||
if (!radio.freerange || (radio.frequency < MIN_FREE_FREQ || radio.frequency > MAX_FREE_FREQ))
|
||||
new_frequency = sanitize_frequency(new_frequency)
|
||||
radio.set_frequency(new_frequency)
|
||||
send_byjax(src.occupant,"exosuit.browser","rfreq","[format_frequency(radio.frequency)]")
|
||||
send_byjax(usr,"exosuit.browser","rfreq","[format_frequency(radio.frequency)]")
|
||||
|
||||
if (href_list["view_log"])
|
||||
src.occupant << browse(src.get_log_html(), "window=exosuit_log")
|
||||
@@ -302,14 +300,14 @@
|
||||
|
||||
if (href_list["toggle_id_upload"])
|
||||
add_req_access = !add_req_access
|
||||
send_byjax(src.occupant,"exosuit.browser","t_id_upload","[add_req_access?"L":"Unl"]ock ID upload panel")
|
||||
send_byjax(usr,"exosuit.browser","t_id_upload","[add_req_access?"L":"Unl"]ock ID upload panel")
|
||||
|
||||
if(href_list["toggle_maint_access"])
|
||||
if(state)
|
||||
occupant_message("<span class='danger'>Maintenance protocols in effect</span>")
|
||||
return
|
||||
maint_access = !maint_access
|
||||
send_byjax(src.occupant,"exosuit.browser","t_maint_access","[maint_access?"Forbid":"Permit"] maintenance protocols")
|
||||
send_byjax(usr,"exosuit.browser","t_maint_access","[maint_access?"Forbid":"Permit"] maintenance protocols")
|
||||
|
||||
if (href_list["toggle_port_connection"])
|
||||
if(internal_tank.connected_port)
|
||||
|
||||
@@ -563,22 +563,22 @@ Code:
|
||||
if (53) // Newscaster
|
||||
menu = "<h4>[PDAIMG(notes)] Newscaster Access</h4>"
|
||||
menu += "<br> Current Newsfeed: <A href='byond://?src=[REF(src)];choice=Newscaster Switch Channel'>[current_channel ? current_channel : "None"]</a> <br>"
|
||||
var/datum/newscaster/feed_channel/current
|
||||
for(var/datum/newscaster/feed_channel/chan in GLOB.news_network.network_channels)
|
||||
var/datum/news/feed_channel/current
|
||||
for(var/datum/news/feed_channel/chan in GLOB.news_network.network_channels)
|
||||
if (chan.channel_name == current_channel)
|
||||
current = chan
|
||||
if(!current)
|
||||
menu += "<h5> ERROR : NO CHANNEL FOUND </h5>"
|
||||
return
|
||||
var/i = 1
|
||||
for(var/datum/newscaster/feed_message/msg in current.messages)
|
||||
for(var/datum/news/feed_message/msg in current.messages)
|
||||
menu +="-[msg.returnBody(-1)] <BR><FONT SIZE=1>\[Story by <FONT COLOR='maroon'>[msg.returnAuthor(-1)]</FONT>\]</FONT><BR>"
|
||||
menu +="<b><font size=1>[msg.comments.len] comment[msg.comments.len > 1 ? "s" : ""]</font></b><br>"
|
||||
if(msg.img)
|
||||
user << browse_rsc(msg.img, "tmp_photo[i].png")
|
||||
menu +="<img src='tmp_photo[i].png' width = '180'><BR>"
|
||||
i++
|
||||
for(var/datum/newscaster/feed_comment/comment in msg.comments)
|
||||
for(var/datum/news/feed_comment/comment in msg.comments)
|
||||
menu +="<font size=1><small>[comment.body]</font><br><font size=1><small><small><small>[comment.author] [comment.time_stamp]</small></small></small></small></font><br>"
|
||||
menu += "<br> <A href='byond://?src=[REF(src)];choice=Newscaster Message'>Post Message</a>"
|
||||
|
||||
@@ -682,8 +682,8 @@ Code:
|
||||
if("Newscaster Message")
|
||||
var/host_pda_owner_name = host_pda.id ? "[host_pda.id.registered_name] ([host_pda.id.assignment])" : "Unknown"
|
||||
var/message = host_pda.msg_input()
|
||||
var/datum/newscaster/feed_channel/current
|
||||
for(var/datum/newscaster/feed_channel/chan in GLOB.news_network.network_channels)
|
||||
var/datum/news/feed_channel/current
|
||||
for(var/datum/news/feed_channel/chan in GLOB.news_network.network_channels)
|
||||
if (chan.channel_name == current_channel)
|
||||
current = chan
|
||||
if(current.locked && current.author != host_pda_owner_name)
|
||||
|
||||
@@ -89,25 +89,6 @@
|
||||
else
|
||||
to_chat(user, "<span class='notice'>Anomalous error. Summon a coder.</span>")
|
||||
|
||||
else if(ishuman(target) && user.zone_selected == BODY_ZONE_PRECISE_GROIN)
|
||||
var/mob/living/carbon/human/H = target
|
||||
var/obj/item/organ/genital/penis/P = H.getorganslot(ORGAN_SLOT_PENIS)
|
||||
if(!P)
|
||||
return
|
||||
playsound(get_turf(src), 'sound/weapons/flash.ogg', 50, 1)
|
||||
H.visible_message("<span class='warning'>[user] is preparing to shrink [H]\'s [P.name] with their bluespace compression kit!</span>")
|
||||
if(do_mob(user, H, 40) && charges > 0 && P.length > 0)
|
||||
H.visible_message("<span class='warning'>[user] has shrunk [H]\'s [P.name]!</span>")
|
||||
playsound(get_turf(src), 'sound/weapons/emitter2.ogg', 50, 1)
|
||||
sparks()
|
||||
flash_lighting_fx(3, 3, LIGHT_COLOR_CYAN)
|
||||
charges -= 1
|
||||
var/p_name = P.name
|
||||
P.modify_size(-5)
|
||||
if(QDELETED(P))
|
||||
H.visible_message("<span class='warning'>[H]\'s [p_name] vanishes!</span>")
|
||||
|
||||
|
||||
/obj/item/compressionkit/attackby(obj/item/I, mob/user, params)
|
||||
..()
|
||||
if(istype(I, /obj/item/stack/ore/bluespace_crystal))
|
||||
@@ -117,4 +98,4 @@
|
||||
if(B.amount > 1)
|
||||
B.amount -= 1
|
||||
else
|
||||
qdel(I)
|
||||
qdel(I)
|
||||
|
||||
@@ -236,3 +236,4 @@
|
||||
throwforce = 15 //Massive pice of metal
|
||||
w_class = WEIGHT_CLASS_HUGE
|
||||
item_flags = SLOWS_WHILE_IN_HAND
|
||||
transparent = FALSE
|
||||
|
||||
@@ -51,6 +51,7 @@ GLOBAL_LIST_INIT(metal_recipes, list ( \
|
||||
new/datum/stack_recipe("closet", /obj/structure/closet, 2, time = 15, one_per_turf = TRUE, on_floor = TRUE), \
|
||||
null, \
|
||||
new/datum/stack_recipe("canister", /obj/machinery/portable_atmospherics/canister, 10, time = 15, one_per_turf = TRUE, on_floor = TRUE), \
|
||||
new/datum/stack_recipe("trash bin", /obj/structure/closet/crate/bin, 10, time = 15, one_per_turf = TRUE, on_floor = TRUE),\
|
||||
null, \
|
||||
new/datum/stack_recipe("floor tile", /obj/item/stack/tile/plasteel, 1, 4, 20), \
|
||||
new/datum/stack_recipe("metal rod", /obj/item/stack/rods, 1, 2, 60), \
|
||||
@@ -733,7 +734,6 @@ GLOBAL_LIST_INIT(plastic_recipes, list(
|
||||
new /datum/stack_recipe("opaque plastic flaps", /obj/structure/plasticflaps/opaque, 5, one_per_turf = TRUE, on_floor = TRUE, time = 40), \
|
||||
new /datum/stack_recipe("water bottle", /obj/item/reagent_containers/glass/beaker/waterbottle/empty), \
|
||||
new /datum/stack_recipe("large water bottle", /obj/item/reagent_containers/glass/beaker/waterbottle/large/empty,3), \
|
||||
new /datum/stack_recipe("large trash cart", /obj/structure/closet/crate/bin,50),\
|
||||
new /datum/stack_recipe("wet floor sign", /obj/item/caution, 2)))
|
||||
|
||||
/obj/item/stack/sheet/plastic
|
||||
|
||||
@@ -399,10 +399,12 @@
|
||||
/obj/item/storage/bag/bio/ComponentInitialize()
|
||||
. = ..()
|
||||
var/datum/component/storage/STR = GetComponent(/datum/component/storage)
|
||||
STR.max_w_class = WEIGHT_CLASS_NORMAL //Allows you to pick up Lungs, Liver, and Stomach
|
||||
STR.max_combined_w_class = 200
|
||||
STR.max_items = 25
|
||||
STR.insert_preposition = "in"
|
||||
STR.can_hold = typecacheof(list(/obj/item/slime_extract, /obj/item/reagent_containers/syringe, /obj/item/reagent_containers/glass/beaker, /obj/item/reagent_containers/glass/bottle, /obj/item/reagent_containers/blood, /obj/item/reagent_containers/hypospray/medipen, /obj/item/reagent_containers/food/snacks/deadmouse, /obj/item/reagent_containers/food/snacks/monkeycube))
|
||||
STR.can_hold = typecacheof(list(/obj/item/slime_extract, /obj/item/reagent_containers/syringe, /obj/item/reagent_containers/glass/beaker, /obj/item/reagent_containers/glass/bottle, /obj/item/reagent_containers/blood, /obj/item/reagent_containers/hypospray/medipen, /obj/item/reagent_containers/food/snacks/deadmouse, /obj/item/reagent_containers/food/snacks/monkeycube, /obj/item/organ, /obj/item/reagent_containers/food/snacks/meat/slab, /obj/item/bodypart))
|
||||
STR.cant_hold = typecacheof(list(/obj/item/organ/brain, /obj/item/organ/liver/cybernetic, /obj/item/organ/heart/cybernetic, /obj/item/organ/lungs/cybernetic, /obj/item/organ/tongue/cybernetic, /obj/item/organ/ears/cybernetic, /obj/item/organ/eyes/robotic, /obj/item/organ/cyberimp))
|
||||
|
||||
/obj/item/storage/bag/bio/holding
|
||||
name = "bio bag of holding"
|
||||
|
||||
@@ -612,6 +612,21 @@
|
||||
/obj/item/ammo_casing
|
||||
))
|
||||
|
||||
/obj/item/storage/belt/quiver
|
||||
name = "leather quiver"
|
||||
desc = "A quiver made from the hide of some animal. Used to hold arrows."
|
||||
icon_state = "quiver"
|
||||
item_state = "quiver"
|
||||
|
||||
/obj/item/storage/belt/quiver/ComponentInitialize()
|
||||
. = ..()
|
||||
var/datum/component/storage/STR = GetComponent(/datum/component/storage)
|
||||
STR.max_items = 15
|
||||
STR.display_numerical_stacking = TRUE
|
||||
STR.can_hold = typecacheof(list(
|
||||
/obj/item/ammo_casing/caseless/arrow
|
||||
))
|
||||
|
||||
/obj/item/storage/belt/medolier
|
||||
name = "medolier"
|
||||
desc = "A medical bandolier for holding smartdarts."
|
||||
|
||||
@@ -141,11 +141,14 @@
|
||||
return TRUE
|
||||
return ..()
|
||||
|
||||
/obj/item/hand_tele/proc/try_dispel_portal(atom/target, mob/user)
|
||||
if(is_parent_of_portal(target))
|
||||
/obj/item/hand_tele/proc/try_dispel_portal(atom/target, mob/user, delay = 30)
|
||||
var/datum/beam/B = user.Beam(target)
|
||||
if(is_parent_of_portal(target) && (!delay || do_after(user, delay, target = target)))
|
||||
qdel(target)
|
||||
to_chat(user, "<span class='notice'>You dispel [target] with \the [src]!</span>")
|
||||
qdel(B)
|
||||
return TRUE
|
||||
qdel(B)
|
||||
return FALSE
|
||||
|
||||
/obj/item/hand_tele/afterattack(atom/target, mob/user)
|
||||
|
||||
@@ -4,8 +4,8 @@
|
||||
icon_state = "largebins"
|
||||
open_sound = 'sound/effects/bin_open.ogg'
|
||||
close_sound = 'sound/effects/bin_close.ogg'
|
||||
material_drop = /obj/item/stack/sheet/plastic
|
||||
material_drop_amount = 40
|
||||
material_drop = /obj/item/stack/sheet/metal
|
||||
material_drop_amount = 10
|
||||
anchored = TRUE
|
||||
horizontal = FALSE
|
||||
delivery_icon = null
|
||||
|
||||
@@ -362,16 +362,14 @@
|
||||
. = ..()
|
||||
if(.)
|
||||
return
|
||||
if(!user || !istype(user, /mob/living))
|
||||
return FALSE
|
||||
if(length(src_object.contents()))
|
||||
to_chat(user, "<span class='notice'>You start dumping out the contents...</span>")
|
||||
if(!do_after(usr,20,target=src_object.parent))
|
||||
if(!do_after(user,20,target=src_object.parent))
|
||||
return FALSE
|
||||
|
||||
var/list/things = src_object.contents()
|
||||
var/datum/progressbar/progress = new(user, things.len, src)
|
||||
while (do_after(usr, 10, TRUE, src, FALSE, CALLBACK(src_object, /datum/component/storage.proc/mass_remove_from_storage, src, things, progress)))
|
||||
while (do_after(user, 10, TRUE, src, FALSE, CALLBACK(src_object, /datum/component/storage.proc/mass_remove_from_storage, src, things, progress)))
|
||||
stoplag(1)
|
||||
qdel(progress)
|
||||
|
||||
|
||||
@@ -10,6 +10,10 @@ GLOBAL_LIST(topic_status_cache)
|
||||
/world/New()
|
||||
enable_debugger()
|
||||
|
||||
#if DM_VERSION >= 513 && DM_BUILD >= 1506
|
||||
world.Profile(PROFILE_START)
|
||||
#endif
|
||||
|
||||
log_world("World loaded at [TIME_STAMP("hh:mm:ss", FALSE)]!")
|
||||
|
||||
SetupExternalRSC()
|
||||
|
||||
@@ -240,7 +240,7 @@
|
||||
if( isemptylist(GLOB.news_network.network_channels) )
|
||||
dat+="<I>No active channels found...</I>"
|
||||
else
|
||||
for(var/datum/newscaster/feed_channel/CHANNEL in GLOB.news_network.network_channels)
|
||||
for(var/datum/news/feed_channel/CHANNEL in GLOB.news_network.network_channels)
|
||||
if(CHANNEL.is_admin_channel)
|
||||
dat+="<B><FONT style='BACKGROUND-COLOR: LightGreen'><A href='?src=[REF(src)];ac_show_channel=[REF(CHANNEL)]'>[CHANNEL.channel_name]</A></FONT></B><BR>"
|
||||
else
|
||||
@@ -277,7 +277,7 @@
|
||||
if(src.admincaster_feed_channel.channel_name =="" || src.admincaster_feed_channel.channel_name == "\[REDACTED\]")
|
||||
dat+="<FONT COLOR='maroon'>Invalid channel name.</FONT><BR>"
|
||||
var/check = 0
|
||||
for(var/datum/newscaster/feed_channel/FC in GLOB.news_network.network_channels)
|
||||
for(var/datum/news/feed_channel/FC in GLOB.news_network.network_channels)
|
||||
if(FC.channel_name == src.admincaster_feed_channel.channel_name)
|
||||
check = 1
|
||||
break
|
||||
@@ -294,7 +294,7 @@
|
||||
dat+="<I>No feed messages found in channel...</I><BR>"
|
||||
else
|
||||
var/i = 0
|
||||
for(var/datum/newscaster/feed_message/MESSAGE in src.admincaster_feed_channel.messages)
|
||||
for(var/datum/news/feed_message/MESSAGE in src.admincaster_feed_channel.messages)
|
||||
i++
|
||||
dat+="-[MESSAGE.returnBody(-1)] <BR>"
|
||||
if(MESSAGE.img)
|
||||
@@ -302,7 +302,7 @@
|
||||
dat+="<img src='tmp_photo[i].png' width = '180'><BR><BR>"
|
||||
dat+="<FONT SIZE=1>\[Story by <FONT COLOR='maroon'>[MESSAGE.returnAuthor(-1)]</FONT>\]</FONT><BR>"
|
||||
dat+="[MESSAGE.comments.len] comment[MESSAGE.comments.len > 1 ? "s" : ""]:<br>"
|
||||
for(var/datum/newscaster/feed_comment/comment in MESSAGE.comments)
|
||||
for(var/datum/news/feed_comment/comment in MESSAGE.comments)
|
||||
dat+="[comment.body]<br><font size=1>[comment.author] [comment.time_stamp]</font><br>"
|
||||
dat+="<br>"
|
||||
dat+="<BR><HR><A href='?src=[REF(src)];[HrefToken()];ac_refresh=1'>Refresh</A>"
|
||||
@@ -315,7 +315,7 @@
|
||||
if(isemptylist(GLOB.news_network.network_channels))
|
||||
dat+="<I>No feed channels found active...</I><BR>"
|
||||
else
|
||||
for(var/datum/newscaster/feed_channel/CHANNEL in GLOB.news_network.network_channels)
|
||||
for(var/datum/news/feed_channel/CHANNEL in GLOB.news_network.network_channels)
|
||||
dat+="<A href='?src=[REF(src)];[HrefToken()];ac_pick_censor_channel=[REF(CHANNEL)]'>[CHANNEL.channel_name]</A> [(CHANNEL.censored) ? ("<FONT COLOR='red'>***</FONT>") : ""]<BR>"
|
||||
dat+="<BR><A href='?src=[REF(src)];[HrefToken()];ac_setScreen=[0]'>Cancel</A>"
|
||||
if(11)
|
||||
@@ -326,7 +326,7 @@
|
||||
if(isemptylist(GLOB.news_network.network_channels))
|
||||
dat+="<I>No feed channels found active...</I><BR>"
|
||||
else
|
||||
for(var/datum/newscaster/feed_channel/CHANNEL in GLOB.news_network.network_channels)
|
||||
for(var/datum/news/feed_channel/CHANNEL in GLOB.news_network.network_channels)
|
||||
dat+="<A href='?src=[REF(src)];[HrefToken()];ac_pick_d_notice=[REF(CHANNEL)]'>[CHANNEL.channel_name]</A> [(CHANNEL.censored) ? ("<FONT COLOR='red'>***</FONT>") : ""]<BR>"
|
||||
|
||||
dat+="<BR><A href='?src=[REF(src)];[HrefToken()];ac_setScreen=[0]'>Back</A>"
|
||||
@@ -337,11 +337,11 @@
|
||||
if( isemptylist(src.admincaster_feed_channel.messages) )
|
||||
dat+="<I>No feed messages found in channel...</I><BR>"
|
||||
else
|
||||
for(var/datum/newscaster/feed_message/MESSAGE in src.admincaster_feed_channel.messages)
|
||||
for(var/datum/news/feed_message/MESSAGE in src.admincaster_feed_channel.messages)
|
||||
dat+="-[MESSAGE.returnBody(-1)] <BR><FONT SIZE=1>\[Story by <FONT COLOR='maroon'>[MESSAGE.returnAuthor(-1)]</FONT>\]</FONT><BR>"
|
||||
dat+="<FONT SIZE=2><A href='?src=[REF(src)];[HrefToken()];ac_censor_channel_story_body=[REF(MESSAGE)]'>[(MESSAGE.bodyCensor) ? ("Undo story censorship") : ("Censor story")]</A> - <A href='?src=[REF(src)];[HrefToken()];ac_censor_channel_story_author=[REF(MESSAGE)]'>[(MESSAGE.authorCensor) ? ("Undo Author Censorship") : ("Censor message Author")]</A></FONT><BR>"
|
||||
dat+="[MESSAGE.comments.len] comment[MESSAGE.comments.len > 1 ? "s" : ""]: <a href='?src=[REF(src)];[HrefToken()];ac_lock_comment=[REF(MESSAGE)]'>[MESSAGE.locked ? "Unlock" : "Lock"]</a><br>"
|
||||
for(var/datum/newscaster/feed_comment/comment in MESSAGE.comments)
|
||||
for(var/datum/news/feed_comment/comment in MESSAGE.comments)
|
||||
dat+="[comment.body] <a href='?src=[REF(src)];[HrefToken()];ac_del_comment=[REF(comment)];ac_del_comment_msg=[REF(MESSAGE)]'>X</a><br><font size=1>[comment.author] [comment.time_stamp]</font><br>"
|
||||
dat+="<BR><A href='?src=[REF(src)];[HrefToken()];ac_setScreen=[10]'>Back</A>"
|
||||
if(13)
|
||||
@@ -354,7 +354,7 @@
|
||||
if( isemptylist(src.admincaster_feed_channel.messages) )
|
||||
dat+="<I>No feed messages found in channel...</I><BR>"
|
||||
else
|
||||
for(var/datum/newscaster/feed_message/MESSAGE in src.admincaster_feed_channel.messages)
|
||||
for(var/datum/news/feed_message/MESSAGE in src.admincaster_feed_channel.messages)
|
||||
dat+="-[MESSAGE.returnBody(-1)] <BR><FONT SIZE=1>\[Story by <FONT COLOR='maroon'>[MESSAGE.returnAuthor(-1)]</FONT>\]</FONT><BR>"
|
||||
dat+="<BR><A href='?src=[REF(src)];[HrefToken()];ac_setScreen=[11]'>Back</A>"
|
||||
if(14)
|
||||
|
||||
@@ -19,9 +19,9 @@ GLOBAL_PROTECT(href_token)
|
||||
var/spamcooldown = 0
|
||||
|
||||
var/admincaster_screen = 0 //TODO: remove all these 5 variables, they are completly unacceptable
|
||||
var/datum/newscaster/feed_message/admincaster_feed_message = new /datum/newscaster/feed_message
|
||||
var/datum/newscaster/wanted_message/admincaster_wanted_message = new /datum/newscaster/wanted_message
|
||||
var/datum/newscaster/feed_channel/admincaster_feed_channel = new /datum/newscaster/feed_channel
|
||||
var/datum/news/feed_message/admincaster_feed_message = new /datum/news/feed_message
|
||||
var/datum/news/wanted_message/admincaster_wanted_message = new /datum/news/wanted_message
|
||||
var/datum/news/feed_channel/admincaster_feed_channel = new /datum/news/feed_channel
|
||||
var/admin_signature
|
||||
|
||||
var/href_token
|
||||
|
||||
+15
-15
@@ -2481,7 +2481,7 @@
|
||||
if(!check_rights(R_ADMIN))
|
||||
return
|
||||
var/check = 0
|
||||
for(var/datum/newscaster/feed_channel/FC in GLOB.news_network.network_channels)
|
||||
for(var/datum/news/feed_channel/FC in GLOB.news_network.network_channels)
|
||||
if(FC.channel_name == src.admincaster_feed_channel.channel_name)
|
||||
check = 1
|
||||
break
|
||||
@@ -2500,7 +2500,7 @@
|
||||
if(!check_rights(R_ADMIN))
|
||||
return
|
||||
var/list/available_channels = list()
|
||||
for(var/datum/newscaster/feed_channel/F in GLOB.news_network.network_channels)
|
||||
for(var/datum/news/feed_channel/F in GLOB.news_network.network_channels)
|
||||
available_channels += F.channel_name
|
||||
src.admincaster_feed_channel.channel_name = adminscrub(input(usr, "Choose receiving Feed Channel.", "Network Channel Handler") in available_channels )
|
||||
src.access_news_network()
|
||||
@@ -2606,28 +2606,28 @@
|
||||
else if(href_list["ac_censor_channel_author"])
|
||||
if(!check_rights(R_ADMIN))
|
||||
return
|
||||
var/datum/newscaster/feed_channel/FC = locate(href_list["ac_censor_channel_author"])
|
||||
var/datum/news/feed_channel/FC = locate(href_list["ac_censor_channel_author"])
|
||||
FC.toggleCensorAuthor()
|
||||
src.access_news_network()
|
||||
|
||||
else if(href_list["ac_censor_channel_story_author"])
|
||||
if(!check_rights(R_ADMIN))
|
||||
return
|
||||
var/datum/newscaster/feed_message/MSG = locate(href_list["ac_censor_channel_story_author"])
|
||||
var/datum/news/feed_message/MSG = locate(href_list["ac_censor_channel_story_author"])
|
||||
MSG.toggleCensorAuthor()
|
||||
src.access_news_network()
|
||||
|
||||
else if(href_list["ac_censor_channel_story_body"])
|
||||
if(!check_rights(R_ADMIN))
|
||||
return
|
||||
var/datum/newscaster/feed_message/MSG = locate(href_list["ac_censor_channel_story_body"])
|
||||
var/datum/news/feed_message/MSG = locate(href_list["ac_censor_channel_story_body"])
|
||||
MSG.toggleCensorBody()
|
||||
src.access_news_network()
|
||||
|
||||
else if(href_list["ac_pick_d_notice"])
|
||||
if(!check_rights(R_ADMIN))
|
||||
return
|
||||
var/datum/newscaster/feed_channel/FC = locate(href_list["ac_pick_d_notice"])
|
||||
var/datum/news/feed_channel/FC = locate(href_list["ac_pick_d_notice"])
|
||||
src.admincaster_feed_channel = FC
|
||||
src.admincaster_screen=13
|
||||
src.access_news_network()
|
||||
@@ -2635,7 +2635,7 @@
|
||||
else if(href_list["ac_toggle_d_notice"])
|
||||
if(!check_rights(R_ADMIN))
|
||||
return
|
||||
var/datum/newscaster/feed_channel/FC = locate(href_list["ac_toggle_d_notice"])
|
||||
var/datum/news/feed_channel/FC = locate(href_list["ac_toggle_d_notice"])
|
||||
FC.toggleCensorDclass()
|
||||
src.access_news_network()
|
||||
|
||||
@@ -2651,17 +2651,17 @@
|
||||
src.admincaster_screen = text2num(href_list["ac_setScreen"])
|
||||
if (src.admincaster_screen == 0)
|
||||
if(src.admincaster_feed_channel)
|
||||
src.admincaster_feed_channel = new /datum/newscaster/feed_channel
|
||||
src.admincaster_feed_channel = new /datum/news/feed_channel
|
||||
if(src.admincaster_feed_message)
|
||||
src.admincaster_feed_message = new /datum/newscaster/feed_message
|
||||
src.admincaster_feed_message = new /datum/news/feed_message
|
||||
if(admincaster_wanted_message)
|
||||
admincaster_wanted_message = new /datum/newscaster/wanted_message
|
||||
admincaster_wanted_message = new /datum/news/wanted_message
|
||||
src.access_news_network()
|
||||
|
||||
else if(href_list["ac_show_channel"])
|
||||
if(!check_rights(R_ADMIN))
|
||||
return
|
||||
var/datum/newscaster/feed_channel/FC = locate(href_list["ac_show_channel"])
|
||||
var/datum/news/feed_channel/FC = locate(href_list["ac_show_channel"])
|
||||
src.admincaster_feed_channel = FC
|
||||
src.admincaster_screen = 9
|
||||
src.access_news_network()
|
||||
@@ -2669,7 +2669,7 @@
|
||||
else if(href_list["ac_pick_censor_channel"])
|
||||
if(!check_rights(R_ADMIN))
|
||||
return
|
||||
var/datum/newscaster/feed_channel/FC = locate(href_list["ac_pick_censor_channel"])
|
||||
var/datum/news/feed_channel/FC = locate(href_list["ac_pick_censor_channel"])
|
||||
src.admincaster_feed_channel = FC
|
||||
src.admincaster_screen = 12
|
||||
src.access_news_network()
|
||||
@@ -2688,8 +2688,8 @@
|
||||
else if(href_list["ac_del_comment"])
|
||||
if(!check_rights(R_ADMIN))
|
||||
return
|
||||
var/datum/newscaster/feed_comment/FC = locate(href_list["ac_del_comment"])
|
||||
var/datum/newscaster/feed_message/FM = locate(href_list["ac_del_comment_msg"])
|
||||
var/datum/news/feed_comment/FC = locate(href_list["ac_del_comment"])
|
||||
var/datum/news/feed_message/FM = locate(href_list["ac_del_comment_msg"])
|
||||
FM.comments -= FC
|
||||
qdel(FC)
|
||||
src.access_news_network()
|
||||
@@ -2697,7 +2697,7 @@
|
||||
else if(href_list["ac_lock_comment"])
|
||||
if(!check_rights(R_ADMIN))
|
||||
return
|
||||
var/datum/newscaster/feed_message/FM = locate(href_list["ac_lock_comment"])
|
||||
var/datum/news/feed_message/FM = locate(href_list["ac_lock_comment"])
|
||||
FM.locked ^= 1
|
||||
src.access_news_network()
|
||||
|
||||
|
||||
@@ -1058,7 +1058,7 @@ GLOBAL_PROTECT(AdminProcCallSpamPrevention)
|
||||
set name = "Start Line Profiling"
|
||||
set desc = "Starts tracking line by line profiling for code lines that support it"
|
||||
|
||||
PROFILE_START
|
||||
LINE_PROFILE_START
|
||||
|
||||
message_admins("<span class='adminnotice'>[key_name_admin(src)] started line by line profiling.</span>")
|
||||
SSblackbox.record_feedback("tally", "admin_verb", 1, "Start Line Profiling")
|
||||
@@ -1069,7 +1069,7 @@ GLOBAL_PROTECT(AdminProcCallSpamPrevention)
|
||||
set name = "Stops Line Profiling"
|
||||
set desc = "Stops tracking line by line profiling for code lines that support it"
|
||||
|
||||
PROFILE_STOP
|
||||
LINE_PROFILE_STOP
|
||||
|
||||
message_admins("<span class='adminnotice'>[key_name_admin(src)] stopped line by line profiling.</span>")
|
||||
SSblackbox.record_feedback("tally", "admin_verb", 1, "Stop Line Profiling")
|
||||
|
||||
@@ -8,7 +8,7 @@
|
||||
name = "clockwork marauder"
|
||||
desc = "The stalwart apparition of a soldier, blazing with crimson flames. It's armed with a gladius and shield."
|
||||
icon_state = "clockwork_marauder"
|
||||
mob_biotypes = list(MOB_INORGANIC, MOB_HUMANOID)
|
||||
mob_biotypes = MOB_HUMANOID
|
||||
health = 120
|
||||
maxHealth = 120
|
||||
force_threshold = 8
|
||||
|
||||
@@ -13,7 +13,7 @@
|
||||
icon = 'icons/mob/mob.dmi'
|
||||
icon_state = "imp"
|
||||
icon_living = "imp"
|
||||
mob_biotypes = list(MOB_ORGANIC, MOB_HUMANOID)
|
||||
mob_biotypes = MOB_ORGANIC|MOB_HUMANOID
|
||||
speed = 1
|
||||
a_intent = INTENT_HARM
|
||||
stop_automated_movement = 1
|
||||
|
||||
@@ -381,6 +381,7 @@
|
||||
playsound(src, 'sound/machines/nuke/confirm_beep.ogg', 50, FALSE)
|
||||
set_active()
|
||||
update_ui_mode()
|
||||
. = TRUE
|
||||
else
|
||||
playsound(src, 'sound/machines/nuke/angry_beep.ogg', 50, FALSE)
|
||||
if("anchor")
|
||||
|
||||
@@ -16,7 +16,7 @@
|
||||
var/icon_stun = "revenant_stun"
|
||||
var/icon_drain = "revenant_draining"
|
||||
var/stasis = FALSE
|
||||
mob_biotypes = list(MOB_SPIRIT)
|
||||
mob_biotypes = MOB_SPIRIT
|
||||
incorporeal_move = INCORPOREAL_MOVE_JAUNT
|
||||
invisibility = INVISIBILITY_REVENANT
|
||||
health = INFINITY //Revenants don't use health, they use essence instead
|
||||
|
||||
@@ -12,7 +12,7 @@
|
||||
icon = 'icons/mob/mob.dmi'
|
||||
icon_state = "daemon"
|
||||
icon_living = "daemon"
|
||||
mob_biotypes = list(MOB_ORGANIC, MOB_HUMANOID)
|
||||
mob_biotypes = MOB_ORGANIC|MOB_HUMANOID
|
||||
speed = 1
|
||||
a_intent = INTENT_HARM
|
||||
stop_automated_movement = 1
|
||||
|
||||
@@ -62,7 +62,7 @@
|
||||
speak_emote = list("tones")
|
||||
initial_language_holder = /datum/language_holder/swarmer
|
||||
bubble_icon = "swarmer"
|
||||
mob_biotypes = list(MOB_ROBOTIC)
|
||||
mob_biotypes = MOB_ROBOTIC
|
||||
health = 40
|
||||
maxHealth = 40
|
||||
status_flags = CANPUSH
|
||||
|
||||
@@ -466,7 +466,9 @@
|
||||
|
||||
// MELEE GANG
|
||||
/obj/item/claymore/ctf
|
||||
slot_flags = SLOT_BACK
|
||||
slot_flags = ITEM_SLOT_BACK
|
||||
armour_penetration = 100
|
||||
total_mass = 1
|
||||
|
||||
/obj/item/claymore/ctf/pre_attack(atom/target, mob/user, params)
|
||||
if(!is_ctf_target(target))
|
||||
|
||||
@@ -6,7 +6,7 @@
|
||||
k_elasticity = 0
|
||||
unit_name = "crate"
|
||||
export_types = list(/obj/structure/closet/crate)
|
||||
exclude_types = list(/obj/structure/closet/crate/large, /obj/structure/closet/crate/wooden)
|
||||
exclude_types = list(/obj/structure/closet/crate/large, /obj/structure/closet/crate/wooden, /obj/structure/closet/crate/bin)
|
||||
|
||||
/datum/export/large/crate/total_printout(datum/export_report/ex, notes = TRUE) // That's why a goddamn metal crate costs that much.
|
||||
. = ..()
|
||||
|
||||
@@ -5,6 +5,7 @@
|
||||
w_class = WEIGHT_CLASS_TINY
|
||||
icon = 'icons/obj/ring.dmi'
|
||||
icon_state = "ringgold"
|
||||
item_state = "gring"
|
||||
body_parts_covered = 0
|
||||
attack_verb = list("proposed")
|
||||
transfer_prints = TRUE
|
||||
@@ -17,10 +18,15 @@
|
||||
|
||||
/obj/item/clothing/gloves/ring/diamond
|
||||
name = "diamond ring"
|
||||
desc = "A tiny gold ring, studded with a diamond. Cultures have used these rings in courtship for a millenia."
|
||||
desc = "An expensive ring, studded with a diamond. Cultures have used these rings in courtship for a millenia."
|
||||
icon_state = "ringdiamond"
|
||||
item_state = "dring"
|
||||
|
||||
/obj/item/clothing/gloves/ring/diamond/attack_self(mob/user)
|
||||
user.visible_message("<span class='warning'>\The [user] gets down on one knee, presenting \the [src].</span>","<span class='warning'>You get down on one knee, presenting \the [src].</span>")
|
||||
|
||||
/obj/item/clothing/gloves/ring/silver
|
||||
name = "silver ring"
|
||||
desc = "A tiny silver ring, sized to wrap around a finger."
|
||||
icon_state = "ringsilver"
|
||||
item_state = "sring"
|
||||
|
||||
@@ -703,8 +703,9 @@
|
||||
name = "cosmic winter coat"
|
||||
icon_state = "coatcosmic"
|
||||
item_state = "coatcosmic"
|
||||
allowed = list(/obj/item/flashlight)
|
||||
hoodtype = /obj/item/clothing/head/hooded/winterhood/cosmic
|
||||
light_power = 1.8
|
||||
light_range = 1.2
|
||||
|
||||
/obj/item/clothing/head/hooded/winterhood/cosmic
|
||||
icon_state = "winterhood_cosmic"
|
||||
@@ -994,4 +995,4 @@
|
||||
tertiary_color = sanitize_hexcolor(tertiary_color_input, desired_format=6, include_crunch=1)
|
||||
update_icon()
|
||||
user.regenerate_icons()
|
||||
return TRUE
|
||||
return TRUE
|
||||
|
||||
@@ -64,65 +64,10 @@
|
||||
resistance_flags = FLAMMABLE
|
||||
w_class = WEIGHT_CLASS_TINY
|
||||
|
||||
/obj/item/valentine/New()
|
||||
..()
|
||||
message = pick("Roses are red / Violets are good / One day while Andy...",
|
||||
"My love for you is like the singularity. It cannot be contained.",
|
||||
"Will you be my lusty xenomorph maid?",
|
||||
"We go together like the clown and the external airlock.",
|
||||
"Roses are red / Liches are wizards / I love you more than a whole squad of lizards.",
|
||||
"Be my valentine. Law 2.",
|
||||
"You must be a mime, because you leave me speechless.",
|
||||
"I love you like Ian loves the HoP.",
|
||||
"You're hotter than a plasma fire in toxins.",
|
||||
"Are you a rogue atmos tech? Because you're taking my breath away.",
|
||||
"Could I have all access... to your heart?",
|
||||
"Call me the doctor, because I'm here to inspect your johnson.",
|
||||
"I'm not a changeling, but you make my proboscis extend.",
|
||||
"I just can't get EI NATH of you.",
|
||||
"You must be a nuke op, because you make my heart explode.",
|
||||
"Roses are red / Botany is a farm / Not being my Valentine / causes human harm.",
|
||||
"I want you more than an assistant wants insulated gloves.",
|
||||
"If I was a security officer, I'd brig you all shift.",
|
||||
"Are you the janitor? Because I think I've fallen for you.",
|
||||
"You're always valid to my heart.",
|
||||
"I'd risk the wrath of the gods to bwoink you.",
|
||||
"You look as beautiful now as the last time you were cloned.",
|
||||
"Someone check the gravitational generator, because I'm only attracted to you.",
|
||||
"If I were the warden I'd always let you into my armory.",
|
||||
"The virologist is rogue, and the only cure is a kiss from you.",
|
||||
"Would you spend some time in my upgraded sleeper?",
|
||||
"You must be a silicon, because you've unbolted my heart.",
|
||||
"Are you Nar'Sie? Because there's nar-one else I sie.",
|
||||
"If you were a taser, you'd be set to stunning.",
|
||||
"Do you have stamina damage from running through my dreams?",
|
||||
"If I were an alien, would you let me hug you?",
|
||||
"My love for you is stronger than a reinforced wall.",
|
||||
"This must be the captain's office, because I see a fox.",
|
||||
"I'm not a highlander, but there can only be one for me.",
|
||||
"The floor is made of lava! Quick, get on my bed.",
|
||||
"If you were an abandoned station you'd be the DEARelict.",
|
||||
"If you had a pickaxe you'd be a shaft FINEr.",
|
||||
"Roses are red, tide is gray, if I were an assistant I'd steal you away.",
|
||||
"Roses are red, text is green, I love you more than cleanbots clean.",
|
||||
"If you were a carp I'd fi-lay you.",
|
||||
"I'm a nuke op, and my pinpointer leads to your heart.",
|
||||
"Wanna slay my megafauna?",
|
||||
"I'm a clockwork cultist. Or zl inyragvar.",
|
||||
"If you were a disposal bin I'd ride you all day.",
|
||||
"Put on your explorer's suit because I'm taking you to LOVEaland.",
|
||||
"I must be the CMO, 'cause I saw you on my CUTE sensors.",
|
||||
"You're the vomit to my flyperson.",
|
||||
"You must be liquid dark matter, because you're pulling me closer.",
|
||||
"Not even sorium can drive me away from you.",
|
||||
"Wanna make like a borg and do some heavy petting?",
|
||||
"Are you powering the station? Because you super matter to me.",
|
||||
"I wish science could make me a bag of holding you.",
|
||||
"Let's call the emergency CUDDLE.",
|
||||
"I must be tripping on BZ, because I saw an angel walk by.",
|
||||
"Wanna empty out my tool storage?",
|
||||
"Did you visit the medbay after you fell from heaven?",
|
||||
"Are you wearing space pants? Wanna not be?" )
|
||||
/obj/item/valentine/Initialize(mapload)
|
||||
message = pick(GLOB.flirts)
|
||||
return ..()
|
||||
|
||||
|
||||
/obj/item/valentine/attackby(obj/item/W, mob/user, params)
|
||||
..()
|
||||
|
||||
@@ -19,7 +19,7 @@
|
||||
continue
|
||||
if(!H.getorgan(/obj/item/organ/appendix)) //Don't give the disease to some who lacks it, only for it to be auto-cured
|
||||
continue
|
||||
if(!(MOB_ORGANIC in H.mob_biotypes)) //biotype sleeper bugs strike again, once again making appendicitis pick a target that can't take it
|
||||
if(!(H.mob_biotypes & MOB_ORGANIC)) //biotype sleeper bugs strike again, once again making appendicitis pick a target that can't take it
|
||||
continue
|
||||
var/foundAlready = FALSE //don't infect someone that already has appendicitis
|
||||
for(var/datum/disease/appendicitis/A in H.diseases)
|
||||
|
||||
@@ -280,19 +280,24 @@
|
||||
spillable = TRUE
|
||||
|
||||
/obj/item/reagent_containers/food/drinks/mug/on_reagent_change(changetype)
|
||||
cut_overlays()
|
||||
if(reagents.total_volume)
|
||||
icon_state = "tea"
|
||||
var/mutable_appearance/MA = mutable_appearance(icon,"mugoverlay")
|
||||
MA.color = mix_color_from_reagents(reagents.reagent_list)
|
||||
add_overlay(MA)
|
||||
else
|
||||
icon_state = "tea_empty"
|
||||
|
||||
/obj/item/reagent_containers/food/drinks/mug/tea
|
||||
name = "Duke Purple tea"
|
||||
icon_state = "tea"
|
||||
desc = "An insult to Duke Purple is an insult to the Space Queen! Any proper gentleman will fight you, if you sully this tea."
|
||||
list_reagents = list(/datum/reagent/consumable/tea = 30)
|
||||
|
||||
/obj/item/reagent_containers/food/drinks/mug/coco
|
||||
name = "Dutch hot coco"
|
||||
desc = "Made in Space South America."
|
||||
icon_state = "coco"
|
||||
list_reagents = list(/datum/reagent/consumable/hot_coco = 30, /datum/reagent/consumable/sugar = 5)
|
||||
foodtype = SUGAR
|
||||
resistance_flags = FREEZE_PROOF
|
||||
|
||||
@@ -96,6 +96,16 @@
|
||||
tastes = list("egg" = 4, "salt" = 1, "pepper" = 1)
|
||||
foodtype = MEAT | FRIED | BREAKFAST
|
||||
|
||||
/obj/item/reagent_containers/food/snacks/baconegg
|
||||
name = "bacon and eggs"
|
||||
desc = "A fried egg with a side of bacon. Delicious!"
|
||||
icon_state = "baconegg"
|
||||
bonus_reagents = list(/datum/reagent/consumable/nutriment = 1, /datum/reagent/consumable/nutriment/vitamin = 1)
|
||||
bitesize = 1
|
||||
filling_color = "#FFFFF0"
|
||||
tastes = list("egg" = 2, "bacon" = 2, "salt" = 1, "pepper" = 1)
|
||||
foodtype = MEAT | FRIED | BREAKFAST
|
||||
|
||||
/obj/item/reagent_containers/food/snacks/boiledegg
|
||||
name = "boiled egg"
|
||||
desc = "A hard boiled egg."
|
||||
|
||||
@@ -549,7 +549,7 @@
|
||||
name = "chocolate"
|
||||
desc = "A tiny and sweet chocolate. Has a 'strawberry' filling!"
|
||||
icon_state = "tiny_chocolate"
|
||||
list_reagents = list(/datum/reagent/consumable/nutriment = 1, /datum/reagent/consumable/sugar = 1, /datum/reagent/consumable/coco = 1, /datum/reagent/drug/aphrodisiac = 1)
|
||||
list_reagents = list(/datum/reagent/consumable/nutriment = 1, /datum/reagent/consumable/sugar = 1, /datum/reagent/consumable/coco = 1)
|
||||
filling_color = "#A0522D"
|
||||
tastes = list("chocolate" = 1)
|
||||
foodtype = JUNKFOOD | SUGAR
|
||||
|
||||
@@ -353,6 +353,13 @@
|
||||
tastes = list("muffin" = 3, "spookiness" = 1)
|
||||
foodtype = GRAIN | FRUIT | SUGAR | BREAKFAST
|
||||
|
||||
/obj/item/reagent_containers/food/snacks/muffin/poppy
|
||||
name = "poppy muffin"
|
||||
icon_state = "poppymuffin"
|
||||
desc = "A classic lemon poppy seed muffin. Do not consume prior to drug testing."
|
||||
tastes = list("muffin" = 3, "lemon" = 1, "seeds" = 1)
|
||||
foodtype = GRAIN | SUGAR | BREAKFAST
|
||||
|
||||
/obj/item/reagent_containers/food/snacks/chawanmushi
|
||||
name = "chawanmushi"
|
||||
desc = "A legendary egg custard that makes friends out of enemies. Probably too hot for a cat to eat."
|
||||
|
||||
@@ -13,6 +13,15 @@
|
||||
result = /obj/item/reagent_containers/food/snacks/friedegg
|
||||
subcategory = CAT_EGG
|
||||
|
||||
/datum/crafting_recipe/food/baconegg
|
||||
name = "Bacon and Eggs"
|
||||
reqs = list(
|
||||
/obj/item/reagent_containers/food/snacks/friedegg = 1,
|
||||
/obj/item/reagent_containers/food/snacks/meat/bacon = 1
|
||||
)
|
||||
result = /obj/item/reagent_containers/food/snacks/baconegg
|
||||
subcategory = CAT_EGG
|
||||
|
||||
/datum/crafting_recipe/food/omelette
|
||||
name = "Omelette"
|
||||
reqs = list(
|
||||
|
||||
@@ -377,6 +377,17 @@ datum/crafting_recipe/food/donut/meat
|
||||
result = /obj/item/reagent_containers/food/snacks/muffin/booberry
|
||||
subcategory = CAT_PASTRY
|
||||
|
||||
/datum/crafting_recipe/food/poppymuffin
|
||||
name = "Poppy muffin"
|
||||
reqs = list(
|
||||
/datum/reagent/consumable/milk = 5,
|
||||
/obj/item/reagent_containers/food/snacks/pastrybase = 1,
|
||||
/obj/item/reagent_containers/food/snacks/grown/citrus/lemon = 1,
|
||||
/obj/item/seeds/poppy = 1
|
||||
)
|
||||
result = /obj/item/reagent_containers/food/snacks/muffin/poppy
|
||||
subcategory = CAT_PASTRY
|
||||
|
||||
/datum/crafting_recipe/food/chawanmushi
|
||||
name = "Chawanmushi"
|
||||
reqs = list(
|
||||
|
||||
@@ -33,6 +33,7 @@
|
||||
icon_state = "seed-oat"
|
||||
species = "oat"
|
||||
plantname = "Oat Stalks"
|
||||
rarity = 10 //Not really new, just better
|
||||
product = /obj/item/reagent_containers/food/snacks/grown/oat
|
||||
mutatelist = list()
|
||||
|
||||
@@ -45,7 +46,7 @@
|
||||
filling_color = "#556B2F"
|
||||
bitesize_mod = 2
|
||||
foodtype = GRAIN
|
||||
grind_results = list(/datum/reagent/consumable/flour = 0)
|
||||
grind_results = list(/datum/reagent/consumable/flour = 0.5) //So when it grinds it has 50% more flour
|
||||
tastes = list("oat" = 1)
|
||||
distill_reagent = /datum/reagent/consumable/ethanol/ale
|
||||
|
||||
@@ -81,6 +82,7 @@
|
||||
species = "meatwheat"
|
||||
plantname = "Meatwheat"
|
||||
product = /obj/item/reagent_containers/food/snacks/grown/meatwheat
|
||||
rarity = 40
|
||||
mutatelist = list()
|
||||
|
||||
/obj/item/reagent_containers/food/snacks/grown/meatwheat
|
||||
|
||||
@@ -112,7 +112,6 @@
|
||||
else
|
||||
return ..()
|
||||
|
||||
|
||||
/obj/structure/bookcase/attack_hand(mob/user)
|
||||
. = ..()
|
||||
if(.)
|
||||
@@ -129,14 +128,17 @@
|
||||
choice.forceMove(drop_location())
|
||||
update_icon()
|
||||
|
||||
/obj/structure/bookcase/attack_ghost(mob/dead/observer/user as mob)
|
||||
if(contents.len && in_range(user, src))
|
||||
var/obj/item/book/choice = input("Which book would you like to read?") as null|obj in contents
|
||||
if(choice)
|
||||
if(!istype(choice)) //spellbook, cult tome, or the one weird bible storage
|
||||
to_chat(user,"A mysterious force is keeping you from reading that.")
|
||||
return
|
||||
choice.attack_self(user)
|
||||
/obj/structure/bookcase/attack_ghost(mob/dead/observer/user)
|
||||
. = ..()
|
||||
if(!length(contents))
|
||||
to_chat(user, "<span class='warning'>It's empty!</span>")
|
||||
return
|
||||
var/obj/item/book/choice = input("Which book would you like to read?") as null|obj in contents
|
||||
if(choice)
|
||||
if(!istype(choice)) //spellbook, cult tome, or the one weird bible storage
|
||||
to_chat(user,"A mysterious force is keeping you from reading that.")
|
||||
return
|
||||
choice.attack_ghost(user)
|
||||
|
||||
/obj/structure/bookcase/deconstruct(disassembled = TRUE)
|
||||
new /obj/item/stack/sheet/mineral/wood(loc, 4)
|
||||
@@ -211,14 +213,17 @@
|
||||
to_chat(user, "<span class='notice'>You skim through the book but can't comprehend any of it.</span>")
|
||||
return
|
||||
if(dat)
|
||||
user << browse("<TT><I>Penned by [author].</I></TT> <BR>" + "[dat]", "window=book[window_size != null ? ";size=[window_size]" : ""]")
|
||||
if(istype(user, /mob/living))
|
||||
user.visible_message("[user] opens a book titled \"[title]\" and begins reading intently.")
|
||||
SEND_SIGNAL(user, COMSIG_ADD_MOOD_EVENT, "book_nerd", /datum/mood_event/book_nerd)
|
||||
onclose(user, "book")
|
||||
show_to(user)
|
||||
user.visible_message("[user] opens a book titled \"[title]\" and begins reading intently.")
|
||||
else
|
||||
to_chat(user, "<span class='notice'>This book is completely blank!</span>")
|
||||
|
||||
/obj/item/book/attack_ghost(mob/dead/observer/O)
|
||||
. = ..()
|
||||
show_to(O)
|
||||
|
||||
/obj/item/book/proc/show_to(mob/user)
|
||||
user << browse("<TT><I>Penned by [author].</I></TT> <BR>" + "[dat]", "window=book[window_size != null ? ";size=[window_size]" : ""]")
|
||||
|
||||
/obj/item/book/attackby(obj/item/I, mob/user, params)
|
||||
if(istype(I, /obj/item/pen))
|
||||
@@ -320,9 +325,6 @@
|
||||
else
|
||||
..()
|
||||
|
||||
/obj/item/book/attack_ghost(mob/user)
|
||||
attack_self(user)
|
||||
|
||||
|
||||
/*
|
||||
* Barcode Scanner
|
||||
|
||||
@@ -441,7 +441,7 @@ GLOBAL_LIST(cachedbooks) // List of our cached book datums
|
||||
if(!GLOB.news_network)
|
||||
alert("No news network found on station. Aborting.")
|
||||
var/channelexists = 0
|
||||
for(var/datum/newscaster/feed_channel/FC in GLOB.news_network.network_channels)
|
||||
for(var/datum/news/feed_channel/FC in GLOB.news_network.network_channels)
|
||||
if(FC.channel_name == "Nanotrasen Book Club")
|
||||
channelexists = 1
|
||||
break
|
||||
|
||||
@@ -66,6 +66,22 @@
|
||||
force = 19
|
||||
materials = list(MAT_DIAMOND=4000)
|
||||
|
||||
/obj/item/pickaxe/plasteel
|
||||
name = "plasteel-tipped pickaxe"
|
||||
icon_state = "titaxe"
|
||||
toolspeed = 0.5
|
||||
desc = "A pickaxe with a plasteel pick head. Less robust at cracking rock walls and digging up dirt than the titanium pickaxe, but better at cracking open skulls."
|
||||
force = 19
|
||||
materials = list(MAT_METAL=2000, MAT_PLASMA=2000)
|
||||
|
||||
/obj/item/pickaxe/titanium
|
||||
name = "titanium-tipped pickaxe"
|
||||
icon_state = "psteelaxe"
|
||||
toolspeed = 0.3
|
||||
desc = "A pickaxe with a titanium pick head. Extremely robust at cracking rock walls and digging up dirt, but less than the plasteel pickaxe at cracking open skulls."
|
||||
force = 17
|
||||
materials = list(MAT_TITANIUM=4000)
|
||||
|
||||
/obj/item/pickaxe/drill
|
||||
name = "mining drill"
|
||||
icon_state = "handdrill"
|
||||
|
||||
@@ -770,7 +770,7 @@ This is the proc mobs get to turn into a ghost. Forked from ghostize due to comp
|
||||
update_icon()
|
||||
|
||||
/mob/dead/observer/canUseTopic(atom/movable/M, be_close=FALSE, no_dextery=FALSE, no_tk=FALSE)
|
||||
return IsAdminGhost(usr) || (M.ghost_flags & INTERACT_GHOST_READ)
|
||||
return IsAdminGhost(usr)
|
||||
|
||||
/mob/dead/observer/is_literate()
|
||||
return 1
|
||||
|
||||
@@ -10,7 +10,7 @@
|
||||
organ_flags = ORGAN_VITAL
|
||||
attack_verb = list("attacked", "slapped", "whacked")
|
||||
///The brain's organ variables are significantly more different than the other organs, with half the decay rate for balance reasons, and twice the maxHealth
|
||||
decay_factor = STANDARD_ORGAN_DECAY / 4 //30 minutes of decaying to result in a fully damaged brain, since a fast decay rate would be unfun gameplay-wise
|
||||
decay_factor = STANDARD_ORGAN_DECAY / 2 //30 minutes of decaying to result in a fully damaged brain, since a fast decay rate would be unfun gameplay-wise
|
||||
healing_factor = STANDARD_ORGAN_HEALING / 2
|
||||
|
||||
maxHealth = BRAIN_DAMAGE_DEATH
|
||||
|
||||
@@ -5,7 +5,7 @@
|
||||
pressure_resistance = 25
|
||||
can_buckle = TRUE
|
||||
buckle_lying = FALSE
|
||||
mob_biotypes = list(MOB_ORGANIC, MOB_HUMANOID)
|
||||
mob_biotypes = MOB_ORGANIC|MOB_HUMANOID
|
||||
//Hair colour and style
|
||||
var/hair_color = "000"
|
||||
var/hair_style = "Bald"
|
||||
|
||||
@@ -76,7 +76,7 @@ GLOBAL_LIST_EMPTY(roundstart_race_names)
|
||||
var/list/species_traits = list()
|
||||
// generic traits tied to having the species
|
||||
var/list/inherent_traits = list()
|
||||
var/list/inherent_biotypes = list(MOB_ORGANIC, MOB_HUMANOID)
|
||||
var/inherent_biotypes = MOB_ORGANIC|MOB_HUMANOID
|
||||
|
||||
var/attack_verb = "punch" // punch-specific attack verb
|
||||
var/sound/attack_sound = 'sound/weapons/punch1.ogg'
|
||||
|
||||
@@ -4,7 +4,7 @@
|
||||
say_mod = "states"
|
||||
species_traits = list(NOBLOOD,NOGENITALS,NOAROUSAL)
|
||||
inherent_traits = list(TRAIT_RESISTHEAT,TRAIT_NOBREATH,TRAIT_RESISTCOLD,TRAIT_RESISTHIGHPRESSURE,TRAIT_RESISTLOWPRESSURE,TRAIT_RADIMMUNE,TRAIT_NOFIRE,TRAIT_PIERCEIMMUNE,TRAIT_NOHUNGER,TRAIT_LIMBATTACHMENT)
|
||||
inherent_biotypes = list(MOB_ROBOTIC, MOB_HUMANOID)
|
||||
inherent_biotypes = MOB_ROBOTIC|MOB_HUMANOID
|
||||
meat = null
|
||||
gib_types = /obj/effect/gibspawner/robot
|
||||
damage_overlay_type = "synth"
|
||||
|
||||
@@ -3,7 +3,7 @@
|
||||
id = "fly"
|
||||
say_mod = "buzzes"
|
||||
species_traits = list(NOEYES)
|
||||
inherent_biotypes = list(MOB_ORGANIC, MOB_HUMANOID, MOB_BUG)
|
||||
inherent_biotypes = MOB_ORGANIC|MOB_HUMANOID|MOB_BUG
|
||||
mutanttongue = /obj/item/organ/tongue/fly
|
||||
mutantliver = /obj/item/organ/liver/fly
|
||||
mutantstomach = /obj/item/organ/stomach/fly
|
||||
|
||||
@@ -4,7 +4,7 @@
|
||||
id = "iron golem"
|
||||
species_traits = list(NOBLOOD,MUTCOLORS,NO_UNDERWEAR,NOGENITALS,NOAROUSAL)
|
||||
inherent_traits = list(TRAIT_RESISTHEAT,TRAIT_NOBREATH,TRAIT_RESISTCOLD,TRAIT_RESISTHIGHPRESSURE,TRAIT_RESISTLOWPRESSURE,TRAIT_NOFIRE,TRAIT_CHUNKYFINGERS,TRAIT_RADIMMUNE,TRAIT_PIERCEIMMUNE,TRAIT_NODISMEMBER)
|
||||
inherent_biotypes = list(MOB_INORGANIC, MOB_HUMANOID)
|
||||
inherent_biotypes = MOB_HUMANOID|MOB_MINERAL
|
||||
mutant_organs = list(/obj/item/organ/adamantine_resonator)
|
||||
speedmod = 2
|
||||
armor = 55
|
||||
@@ -638,6 +638,7 @@
|
||||
species_traits = list(NOBLOOD,NO_UNDERWEAR,NOEYES,NOGENITALS,NOAROUSAL)
|
||||
inherent_biotypes = list(MOB_ROBOTIC, MOB_HUMANOID)
|
||||
inherent_traits = list(TRAIT_RESISTHEAT,TRAIT_NOBREATH,TRAIT_RESISTCOLD,TRAIT_RESISTHIGHPRESSURE,TRAIT_RESISTLOWPRESSURE,TRAIT_NOFIRE,TRAIT_RADIMMUNE,TRAIT_PIERCEIMMUNE,TRAIT_NODISMEMBER)
|
||||
inherent_biotypes = MOB_ROBOTIC|MOB_HUMANOID
|
||||
armor = 20 //Reinforced, but much less so to allow for fast movement
|
||||
attack_verb = "smash"
|
||||
attack_sound = 'sound/magic/clockwork/anima_fragment_attack.ogg'
|
||||
@@ -694,7 +695,7 @@
|
||||
Being made of cloth, your body is magic resistant and faster than that of other golems, but weaker and less resilient."
|
||||
species_traits = list(NOBLOOD,NO_UNDERWEAR,NOGENITALS,NOAROUSAL) //no mutcolors, and can burn
|
||||
inherent_traits = list(TRAIT_RESISTCOLD,TRAIT_NOBREATH,TRAIT_RESISTHIGHPRESSURE,TRAIT_RESISTLOWPRESSURE,TRAIT_RADIMMUNE,TRAIT_PIERCEIMMUNE,TRAIT_NODISMEMBER,TRAIT_CHUNKYFINGERS)
|
||||
inherent_biotypes = list(MOB_UNDEAD, MOB_HUMANOID)
|
||||
inherent_biotypes = MOB_UNDEAD|MOB_HUMANOID
|
||||
armor = 15 //feels no pain, but not too resistant
|
||||
burnmod = 2 // don't get burned
|
||||
speedmod = 1 // not as heavy as stone
|
||||
@@ -1017,7 +1018,7 @@
|
||||
else
|
||||
playsound(get_turf(owner),'sound/magic/RATTLEMEBONES.ogg', 100)
|
||||
for(var/mob/living/L in orange(7, get_turf(owner)))
|
||||
if((MOB_UNDEAD in L.mob_biotypes) || isgolem(L) || HAS_TRAIT(L, TRAIT_RESISTCOLD))
|
||||
if((L.mob_biotypes & MOB_UNDEAD) || isgolem(L) || HAS_TRAIT(L, TRAIT_RESISTCOLD))
|
||||
return //Do not affect our brothers
|
||||
|
||||
to_chat(L, "<span class='cultlarge'>A spine-chilling sound chills you to the bone!</span>")
|
||||
|
||||
@@ -5,8 +5,8 @@
|
||||
say_mod = "hisses"
|
||||
default_color = "00FF00"
|
||||
species_traits = list(MUTCOLORS,EYECOLOR,HAIR,FACEHAIR,LIPS,HORNCOLOR,WINGCOLOR)
|
||||
inherent_biotypes = list(MOB_ORGANIC, MOB_HUMANOID, MOB_REPTILE)
|
||||
mutant_bodyparts = list("tail_lizard", "snout", "spines", "horns", "frills", "body_markings", "legs", "taur", "deco_wings")
|
||||
inherent_biotypes = MOB_ORGANIC|MOB_HUMANOID|MOB_REPTILE
|
||||
mutanttongue = /obj/item/organ/tongue/lizard
|
||||
mutanttail = /obj/item/organ/tail/lizard
|
||||
coldmod = 1.5
|
||||
|
||||
@@ -6,7 +6,7 @@
|
||||
meat = /obj/item/stack/sheet/mineral/plasma
|
||||
species_traits = list(NOBLOOD,NOTRANSSTING,NOGENITALS)
|
||||
inherent_traits = list(TRAIT_RESISTCOLD,TRAIT_RADIMMUNE,TRAIT_NOHUNGER,TRAIT_CALCIUM_HEALER)
|
||||
inherent_biotypes = list(MOB_INORGANIC, MOB_HUMANOID)
|
||||
inherent_biotypes = MOB_HUMANOID|MOB_MINERAL
|
||||
mutantlungs = /obj/item/organ/lungs/plasmaman
|
||||
mutanttongue = /obj/item/organ/tongue/bone/plasmaman
|
||||
mutantliver = /obj/item/organ/liver/plasmaman
|
||||
|
||||
@@ -8,7 +8,7 @@
|
||||
meat = /obj/item/reagent_containers/food/snacks/meat/slab/human/mutant/skeleton
|
||||
species_traits = list(NOBLOOD,NOGENITALS,NOAROUSAL)
|
||||
inherent_traits = list(TRAIT_RESISTHEAT,TRAIT_NOBREATH,TRAIT_RESISTCOLD,TRAIT_RADIMMUNE,TRAIT_PIERCEIMMUNE,TRAIT_NOHUNGER,TRAIT_EASYDISMEMBER,TRAIT_LIMBATTACHMENT,TRAIT_FAKEDEATH, TRAIT_CALCIUM_HEALER)
|
||||
inherent_biotypes = list(MOB_UNDEAD, MOB_HUMANOID)
|
||||
inherent_biotypes = MOB_UNDEAD|MOB_HUMANOID
|
||||
mutanttongue = /obj/item/organ/tongue/bone
|
||||
damage_overlay_type = ""//let's not show bloody wounds or burns over bones.
|
||||
disliked_food = NONE
|
||||
|
||||
@@ -5,7 +5,7 @@
|
||||
sexes = 0
|
||||
species_traits = list(NOTRANSSTING,NOGENITALS,NOAROUSAL) //all of these + whatever we inherit from the real species
|
||||
inherent_traits = list(TRAIT_VIRUSIMMUNE,TRAIT_NODISMEMBER,TRAIT_NOLIMBDISABLE,TRAIT_NOHUNGER,TRAIT_NOBREATH)
|
||||
inherent_biotypes = list(MOB_ROBOTIC, MOB_HUMANOID)
|
||||
inherent_biotypes = MOB_ROBOTIC|MOB_HUMANOID
|
||||
dangerous_existence = 1
|
||||
blacklisted = 1
|
||||
meat = null
|
||||
@@ -124,4 +124,4 @@
|
||||
if (/datum/species/golem/bananium)
|
||||
speech_args[SPEECH_SPANS] |= SPAN_CLOWN
|
||||
if (/datum/species/golem/clockwork)
|
||||
speech_args[SPEECH_SPANS] |= SPAN_ROBOT
|
||||
speech_args[SPEECH_SPANS] |= SPAN_ROBOT
|
||||
|
||||
@@ -4,7 +4,7 @@
|
||||
default_color = "FFFFFF"
|
||||
species_traits = list(EYECOLOR,HAIR,FACEHAIR,LIPS,DRINKSBLOOD)
|
||||
inherent_traits = list(TRAIT_NOHUNGER,TRAIT_NOBREATH)
|
||||
inherent_biotypes = list(MOB_UNDEAD, MOB_HUMANOID)
|
||||
inherent_biotypes = MOB_UNDEAD|MOB_HUMANOID
|
||||
default_features = list("mcolor" = "FFF", "tail_human" = "None", "ears" = "None", "wings" = "None")
|
||||
exotic_bloodtype = "U"
|
||||
use_skintones = TRUE
|
||||
|
||||
@@ -10,7 +10,7 @@
|
||||
meat = /obj/item/reagent_containers/food/snacks/meat/slab/human/mutant/zombie
|
||||
species_traits = list(NOBLOOD,NOZOMBIE,NOTRANSSTING)
|
||||
inherent_traits = list(TRAIT_RESISTCOLD,TRAIT_RESISTHIGHPRESSURE,TRAIT_RESISTLOWPRESSURE,TRAIT_RADIMMUNE,TRAIT_EASYDISMEMBER,TRAIT_LIMBATTACHMENT,TRAIT_NOBREATH,TRAIT_NODEATH,TRAIT_FAKEDEATH)
|
||||
inherent_biotypes = list(MOB_UNDEAD, MOB_HUMANOID)
|
||||
inherent_biotypes = MOB_UNDEAD|MOB_HUMANOID
|
||||
mutanttongue = /obj/item/organ/tongue/zombie
|
||||
var/static/list/spooks = list('sound/hallucinations/growl1.ogg','sound/hallucinations/growl2.ogg','sound/hallucinations/growl3.ogg','sound/hallucinations/veryfar_noise.ogg','sound/hallucinations/wail.ogg')
|
||||
disliked_food = NONE
|
||||
|
||||
@@ -7,7 +7,7 @@
|
||||
gender = NEUTER
|
||||
pass_flags = PASSTABLE
|
||||
ventcrawler = VENTCRAWLER_NUDE
|
||||
mob_biotypes = list(MOB_ORGANIC, MOB_HUMANOID)
|
||||
mob_biotypes = MOB_ORGANIC|MOB_HUMANOID
|
||||
butcher_results = list(/obj/item/reagent_containers/food/snacks/meat/slab/monkey = 5, /obj/item/stack/sheet/animalhide/monkey = 1)
|
||||
type_of_meat = /obj/item/reagent_containers/food/snacks/meat/slab/monkey
|
||||
gib_type = /obj/effect/decal/cleanable/blood/gibs
|
||||
|
||||
@@ -52,7 +52,7 @@
|
||||
var/limb_destroyer = 0 //1 Sets AI behavior that allows mobs to target and dismember limbs with their basic attack.
|
||||
|
||||
var/mob_size = MOB_SIZE_HUMAN
|
||||
var/list/mob_biotypes = list(MOB_ORGANIC)
|
||||
var/mob_biotypes = MOB_ORGANIC
|
||||
var/metabolism_efficiency = 1 //more or less efficiency to metabolize helpful/harmful reagents and regulate body temperature..
|
||||
var/has_limbs = 0 //does the mob have distinct limbs?(arms,legs, chest,head)
|
||||
|
||||
|
||||
@@ -10,7 +10,7 @@
|
||||
bubble_icon = "machine"
|
||||
weather_immunities = list("ash")
|
||||
possible_a_intents = list(INTENT_HELP, INTENT_HARM)
|
||||
mob_biotypes = list(MOB_ROBOTIC)
|
||||
mob_biotypes = MOB_ROBOTIC
|
||||
rad_flags = RAD_PROTECT_CONTENTS | RAD_NO_CONTAMINATE
|
||||
speech_span = SPAN_ROBOT
|
||||
flags_1 = PREVENT_CONTENTS_EXPLOSION_1 | HEAR_1
|
||||
|
||||
@@ -3,7 +3,7 @@
|
||||
icon = 'icons/mob/aibots.dmi'
|
||||
layer = MOB_LAYER
|
||||
gender = NEUTER
|
||||
mob_biotypes = list(MOB_ROBOTIC)
|
||||
mob_biotypes = MOB_ROBOTIC
|
||||
light_range = 3
|
||||
light_power = 0.9
|
||||
light_color = "#CDDDFF"
|
||||
|
||||
@@ -3,7 +3,7 @@
|
||||
real_name = "Construct"
|
||||
desc = ""
|
||||
gender = NEUTER
|
||||
mob_biotypes = list(MOB_INORGANIC)
|
||||
mob_biotypes = NONE
|
||||
speak_emote = list("hisses")
|
||||
response_help = "thinks better of touching"
|
||||
response_disarm = "flails at"
|
||||
|
||||
@@ -18,7 +18,7 @@
|
||||
pass_flags = PASSTABLE | PASSGRILLE | PASSMOB
|
||||
ventcrawler = VENTCRAWLER_ALWAYS
|
||||
mob_size = MOB_SIZE_TINY
|
||||
mob_biotypes = list(MOB_ORGANIC, MOB_BUG)
|
||||
mob_biotypes = MOB_ORGANIC|MOB_BUG
|
||||
gold_core_spawnable = FRIENDLY_SPAWN
|
||||
verb_say = "flutters"
|
||||
verb_ask = "flutters inquisitively"
|
||||
|
||||
@@ -17,7 +17,7 @@
|
||||
ventcrawler = VENTCRAWLER_ALWAYS
|
||||
pass_flags = PASSTABLE
|
||||
mob_size = MOB_SIZE_SMALL
|
||||
mob_biotypes = list(MOB_ORGANIC, MOB_BEAST)
|
||||
mob_biotypes = MOB_ORGANIC|MOB_BEAST
|
||||
minbodytemp = 200
|
||||
maxbodytemp = 400
|
||||
unsuitable_atmos_damage = 1
|
||||
|
||||
@@ -13,7 +13,7 @@
|
||||
maxbodytemp = INFINITY
|
||||
pass_flags = PASSTABLE | PASSGRILLE | PASSMOB
|
||||
mob_size = MOB_SIZE_TINY
|
||||
mob_biotypes = list(MOB_ORGANIC, MOB_BUG)
|
||||
mob_biotypes = MOB_ORGANIC|MOB_BUG
|
||||
response_help = "pokes"
|
||||
response_disarm = "shoos"
|
||||
response_harm = "splats"
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
//Dogs.
|
||||
|
||||
/mob/living/simple_animal/pet/dog
|
||||
mob_biotypes = list(MOB_ORGANIC, MOB_BEAST)
|
||||
mob_biotypes = MOB_ORGANIC|MOB_BEAST
|
||||
response_help = "pets"
|
||||
response_disarm = "bops"
|
||||
response_harm = "kicks"
|
||||
|
||||
@@ -35,7 +35,7 @@
|
||||
sight = (SEE_TURFS | SEE_OBJS)
|
||||
status_flags = (CANPUSH | CANSTUN | CANKNOCKDOWN)
|
||||
gender = NEUTER
|
||||
mob_biotypes = list(MOB_ROBOTIC)
|
||||
mob_biotypes = MOB_ROBOTIC
|
||||
speak_emote = list("chirps")
|
||||
speech_span = SPAN_ROBOT
|
||||
bubble_icon = "machine"
|
||||
|
||||
@@ -17,7 +17,7 @@
|
||||
response_disarm = "gently pushes aside"
|
||||
response_harm = "kicks"
|
||||
faction = list("neutral")
|
||||
mob_biotypes = list(MOB_ORGANIC, MOB_BEAST)
|
||||
mob_biotypes = MOB_ORGANIC|MOB_BEAST
|
||||
attack_same = 1
|
||||
attacktext = "kicks"
|
||||
attack_sound = 'sound/weapons/punch1.ogg'
|
||||
@@ -112,7 +112,7 @@
|
||||
icon_dead = "cow_dead"
|
||||
icon_gib = "cow_gib"
|
||||
gender = FEMALE
|
||||
mob_biotypes = list(MOB_ORGANIC, MOB_BEAST)
|
||||
mob_biotypes = MOB_ORGANIC|MOB_BEAST
|
||||
speak = list("moo?","moo","MOOOOOO")
|
||||
speak_emote = list("moos","moos hauntingly")
|
||||
emote_hear = list("brays.")
|
||||
@@ -189,7 +189,7 @@
|
||||
icon_dead = "chick_dead"
|
||||
icon_gib = "chick_gib"
|
||||
gender = FEMALE
|
||||
mob_biotypes = list(MOB_ORGANIC, MOB_BEAST)
|
||||
mob_biotypes = MOB_ORGANIC|MOB_BEAST
|
||||
speak = list("Cherp.","Cherp?","Chirrup.","Cheep!")
|
||||
speak_emote = list("cheeps")
|
||||
emote_hear = list("cheeps.")
|
||||
@@ -235,7 +235,7 @@
|
||||
name = "\improper chicken"
|
||||
desc = "Hopefully the eggs are good this season."
|
||||
gender = FEMALE
|
||||
mob_biotypes = list(MOB_ORGANIC, MOB_BEAST)
|
||||
mob_biotypes = MOB_ORGANIC|MOB_BEAST
|
||||
icon_state = "chicken_brown"
|
||||
icon_living = "chicken_brown"
|
||||
icon_dead = "chicken_brown_dead"
|
||||
|
||||
@@ -18,7 +18,7 @@
|
||||
density = FALSE
|
||||
pass_flags = PASSTABLE | PASSMOB
|
||||
mob_size = MOB_SIZE_SMALL
|
||||
mob_biotypes = list(MOB_ORGANIC, MOB_BEAST, MOB_REPTILE)
|
||||
mob_biotypes = MOB_ORGANIC|MOB_BEAST|MOB_REPTILE
|
||||
gold_core_spawnable = FRIENDLY_SPAWN
|
||||
obj_damage = 0
|
||||
environment_smash = ENVIRONMENT_SMASH_NONE
|
||||
|
||||
@@ -22,7 +22,7 @@
|
||||
ventcrawler = VENTCRAWLER_ALWAYS
|
||||
pass_flags = PASSTABLE | PASSGRILLE | PASSMOB
|
||||
mob_size = MOB_SIZE_TINY
|
||||
mob_biotypes = list(MOB_ORGANIC, MOB_BEAST)
|
||||
mob_biotypes = MOB_ORGANIC|MOB_BEAST
|
||||
var/body_color //brown, gray and white, leave blank for random
|
||||
gold_core_spawnable = FRIENDLY_SPAWN
|
||||
var/chew_probability = 1
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
/mob/living/simple_animal/pet
|
||||
icon = 'icons/mob/pets.dmi'
|
||||
mob_size = MOB_SIZE_SMALL
|
||||
mob_biotypes = list(MOB_ORGANIC, MOB_BEAST)
|
||||
mob_biotypes = MOB_ORGANIC|MOB_BEAST
|
||||
blood_volume = BLOOD_VOLUME_NORMAL
|
||||
var/unique_pet = FALSE // if the mob can be renamed
|
||||
var/obj/item/clothing/neck/petcollar/pcollar
|
||||
|
||||
@@ -14,7 +14,7 @@
|
||||
response_help = "pets"
|
||||
response_disarm = "gently pushes aside"
|
||||
response_harm = "kicks"
|
||||
mob_biotypes = list(MOB_ORGANIC, MOB_BEAST)
|
||||
mob_biotypes = MOB_ORGANIC|MOB_BEAST
|
||||
gold_core_spawnable = FRIENDLY_SPAWN
|
||||
melee_damage_lower = 18
|
||||
melee_damage_upper = 18
|
||||
|
||||
@@ -30,7 +30,7 @@
|
||||
density = FALSE
|
||||
pass_flags = PASSTABLE | PASSMOB
|
||||
mob_size = MOB_SIZE_SMALL
|
||||
mob_biotypes = list(MOB_ORGANIC, MOB_BEAST, MOB_REPTILE)
|
||||
mob_biotypes = MOB_ORGANIC|MOB_BEAST|MOB_REPTILE
|
||||
gold_core_spawnable = FRIENDLY_SPAWN
|
||||
obj_damage = 0
|
||||
environment_smash = ENVIRONMENT_SMASH_NONE
|
||||
@@ -59,4 +59,4 @@
|
||||
QDEL_NULL(target)
|
||||
adjustBruteLoss(-2)
|
||||
else
|
||||
return ..()
|
||||
return ..()
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user