[MIRROR] next grep, no spaces (#10548)

Co-authored-by: Kashargul <144968721+Kashargul@users.noreply.github.com>
This commit is contained in:
CHOMPStation2StaffMirrorBot
2025-03-29 14:13:04 -07:00
committed by GitHub
parent 16a213f699
commit 8d0febfbb6
104 changed files with 1278 additions and 1189 deletions
+1 -1
View File
@@ -141,7 +141,7 @@
#define COMPONENT_BLOCK_CONTAMINATION (1<<0)
///from base of datum/radiation_wave/check_obstructions(): (datum/radiation_wave, width)
#define COMSIG_ATOM_RAD_WAVE_PASSING "atom_rad_wave_pass"
#define COMPONENT_RAD_WAVE_HANDLED (1<<0)
#define COMPONENT_RAD_WAVE_HANDLED (1<<0)
///from internal loop in atom/movable/proc/CanReach(): (list/next)
#define COMSIG_ATOM_CANREACH "atom_can_reach"
#define COMPONENT_BLOCK_REACH (1<<0)
+1 -1
View File
@@ -1,7 +1,7 @@
var/global/defer_powernet_rebuild = 0 // True if net rebuild will be called manually after an event.
#define CELLRATE 0.002 // Multiplier for watts per tick <> cell storage (e.g., 0.02 means if there is a load of 1000 watts, 20 units will be taken from a cell per second)
// It's a conversion constant. power_used*CELLRATE = charge_provided, or charge_used/CELLRATE = power_provided
// It's a conversion constant. power_used*CELLRATE = charge_provided, or charge_used/CELLRATE = power_provided
#define SMESRATE 0.03333 // Same for SMESes. A different number for some reason.
#define KILOWATTS *1000
+1 -1
View File
@@ -1,4 +1,4 @@
//How far from the edge of overmap zlevel could randomly placed objects spawn
//How far from the edge of overmap zlevel could randomly placed objects spawn
#define OVERMAP_EDGE 2
#define SHIP_SIZE_TINY 1
+1 -1
View File
@@ -1,4 +1,4 @@
#define VORE_PREF_TRANSFER(target, source) \
#define VORE_PREF_TRANSFER(target, source) \
target.digestable = source.digestable; \
target.devourable = source.devourable; \
target.feeding = source.feeding; \
+3 -3
View File
@@ -1,7 +1,7 @@
/*
FUN ZONE OF ADMIN LISTINGS
Try to keep this in sync with __DEFINES/traits.dm
Not to be confused with character creator traits
* FUN ZONE OF ADMIN LISTINGS
* Try to keep this in sync with __DEFINES/traits.dm
* Not to be confused with character creator traits
*/
GLOBAL_LIST_INIT(traits_by_type, list(
/mob = list(
+12 -12
View File
@@ -23,19 +23,19 @@ var/global/list/joblist = list() //list of all jobstypes, minus borg and AI
#define all_genders_define_list list(MALE,FEMALE,PLURAL,NEUTER,HERM) //VOREStaton Edit
#define all_genders_text_list list("Male","Female","Plural","Neuter","Herm") //VOREStation Edit
#define pronoun_set_to_genders list(\
"He/Him" = MALE,\
"She/Her" = FEMALE,\
"It/Its" = NEUTER,\
"They/Them" = PLURAL,\
"Shi/Hir" = HERM\
)
"He/Him" = MALE,\
"She/Her" = FEMALE,\
"It/Its" = NEUTER,\
"They/Them" = PLURAL,\
"Shi/Hir" = HERM\
)
#define genders_to_pronoun_set list(\
MALE = "He/Him",\
FEMALE = "She/Her",\
NEUTER = "It/Its",\
PLURAL = "They/Them",\
HERM = "Shi/Hir"\
)
MALE = "He/Him",\
FEMALE = "She/Her",\
NEUTER = "It/Its",\
PLURAL = "They/Them",\
HERM = "Shi/Hir"\
)
var/list/mannequins_
+14 -14
View File
@@ -1,11 +1,11 @@
/**
* handles adding verbs and updating the stat panel browser
*
* pass the verb type path to this instead of adding it directly to verbs so the statpanel can update
* Arguments:
* * target - Who the verb is being added to, client or mob typepath
* * verb - typepath to a verb, or a list of verbs, supports lists of lists
*/
* handles adding verbs and updating the stat panel browser
*
* pass the verb type path to this instead of adding it directly to verbs so the statpanel can update
* Arguments:
* * target - Who the verb is being added to, client or mob typepath
* * verb - typepath to a verb, or a list of verbs, supports lists of lists
*/
/proc/add_verb(client/target, verb_or_list_to_add)
if(!target)
CRASH("add_verb called without a target")
@@ -47,13 +47,13 @@
target.stat_panel.send_message("add_verb_list", output_list)
/**
* handles removing verb and sending it to browser to update, use this for removing verbs
*
* pass the verb type path to this instead of removing it from verbs so the statpanel can update
* Arguments:
* * target - Who the verb is being removed from, client or mob typepath
* * verb - typepath to a verb, or a list of verbs, supports lists of lists
*/
* handles removing verb and sending it to browser to update, use this for removing verbs
*
* pass the verb type path to this instead of removing it from verbs so the statpanel can update
* Arguments:
* * target - Who the verb is being removed from, client or mob typepath
* * verb - typepath to a verb, or a list of verbs, supports lists of lists
*/
/proc/remove_verb(client/target, verb_or_list_to_remove)
if(IsAdminAdvancedProcCall())
return
+9 -8
View File
@@ -1,17 +1,18 @@
//A system to manage and display alerts on screen without needing you to do it yourself
//PUBLIC - call these wherever you want
//PUBLIC - call these wherever you want
/mob/proc/throw_alert(category, type, severity, obj/new_master)
/* Proc to create or update an alert. Returns the alert if the alert is new or updated, 0 if it was thrown already
category is a text string. Each mob may only have one alert per category; the previous one will be replaced
path is a type path of the actual alert type to throw
severity is an optional number that will be placed at the end of the icon_state for this alert
For example, high pressure's icon_state is "highpressure" and can be serverity 1 or 2 to get "highpressure1" or "highpressure2"
new_master is optional and sets the alert's icon state to "template" in the ui_style icons with the master as an overlay.
Clicks are forwarded to master */
/** Proc to create or update an alert. Returns the alert if the alert is new or updated, 0 if it was thrown already
* category is a text string. Each mob may only have one alert per category; the previous one will be replaced
* path is a type path of the actual alert type to throw
* severity is an optional number that will be placed at the end of the icon_state for this alert
* For example, high pressure's icon_state is "highpressure" and can be serverity 1 or 2 to get "highpressure1" or "highpressure2"
* new_master is optional and sets the alert's icon state to "template" in the ui_style icons with the master as an overlay.
* Clicks are forwarded to master
*/
if(!category)
return
+10 -10
View File
@@ -1,9 +1,9 @@
/**
* Sends a message to TGS chat channels.
*
* message - The message to send.
* channel_tag - Required. If "", the message with be sent to all connected (Game-type for TGS3) channels. Otherwise, it will be sent to TGS4 channels with that tag (Delimited by ','s).
*/
* Sends a message to TGS chat channels.
*
* message - The message to send.
* channel_tag - Required. If "", the message with be sent to all connected (Game-type for TGS3) channels. Otherwise, it will be sent to TGS4 channels with that tag (Delimited by ','s).
*/
/proc/send2chat(message, channel_tag)
if(channel_tag == null || !world.TgsAvailable())
return
@@ -24,11 +24,11 @@
world.TgsChatBroadcast(message, channels_to_use)
/**
* Sends a message to TGS admin chat channels.
*
* category - The category of the mssage.
* message - The message to send.
*/
* Sends a message to TGS admin chat channels.
*
* category - The category of the mssage.
* message - The message to send.
*/
/proc/send2adminchat(category, message)
category = replacetext(replacetext(category, "\proper", ""), "\improper", "")
message = replacetext(replacetext(message, "\proper", ""), "\improper", "")
+43 -43
View File
@@ -19,11 +19,11 @@
#define CHAT_RUNE_RADIO 0x2
/**
* # Chat Message Overlay
*
* Datum for generating a message overlay on the map
* Ported from TGStation; https://github.com/tgstation/tgstation/pull/50608/, author: bobbahbrown
*/
* # Chat Message Overlay
*
* Datum for generating a message overlay on the map
* Ported from TGStation; https://github.com/tgstation/tgstation/pull/50608/, author: bobbahbrown
*/
// Cached runechat icon
var/list/runechat_image_cache = list()
@@ -60,15 +60,15 @@ var/list/runechat_image_cache = list()
/**
* Constructs a chat message overlay
*
* Arguments:
* * text - The text content of the overlay
* * target - The target atom to display the overlay at
* * owner - The mob that owns this overlay, only this mob will be able to view it
* * extra_classes - Extra classes to apply to the span that holds the text
* * lifespan - The lifespan of the message in deciseconds
*/
* Constructs a chat message overlay
*
* Arguments:
* * text - The text content of the overlay
* * target - The target atom to display the overlay at
* * owner - The mob that owns this overlay, only this mob will be able to view it
* * extra_classes - Extra classes to apply to the span that holds the text
* * lifespan - The lifespan of the message in deciseconds
*/
/datum/chatmessage/New(text, atom/target, mob/owner, list/extra_classes = null, lifespan = CHAT_MESSAGE_LIFESPAN)
. = ..()
if(!istype(target))
@@ -96,15 +96,15 @@ var/list/runechat_image_cache = list()
return ..()
/**
* Generates a chat message image representation
*
* Arguments:
* * text - The text content of the overlay
* * target - The target atom to display the overlay at
* * owner - The mob that owns this overlay, only this mob will be able to view it
* * extra_classes - Extra classes to apply to the span that holds the text
* * lifespan - The lifespan of the message in deciseconds
*/
* Generates a chat message image representation
*
* Arguments:
* * text - The text content of the overlay
* * target - The target atom to display the overlay at
* * owner - The mob that owns this overlay, only this mob will be able to view it
* * extra_classes - Extra classes to apply to the span that holds the text
* * lifespan - The lifespan of the message in deciseconds
*/
/datum/chatmessage/proc/generate_image(text, atom/target, mob/owner, list/extra_classes, lifespan)
if(!target || !owner)
@@ -306,8 +306,8 @@ var/list/runechat_image_cache = list()
return (1 - ((time_spent - time_before_fade) / CHAT_MESSAGE_EOL_FADE)) * 255
/**
* Applies final animations to overlay CHAT_MESSAGE_EOL_FADE deciseconds prior to message deletion
*/
* Applies final animations to overlay CHAT_MESSAGE_EOL_FADE deciseconds prior to message deletion
*/
/datum/chatmessage/proc/end_of_life(fadetime = CHAT_MESSAGE_EOL_FADE)
if(gc_destroyed || ending_life)
return
@@ -316,14 +316,14 @@ var/list/runechat_image_cache = list()
addtimer(CALLBACK(GLOBAL_PROC, GLOBAL_PROC_REF(qdel), src), fadetime, TIMER_DELETE_ME)
/**
* Creates a message overlay at a defined location for a given speaker
*
* Arguments:
* * speaker - The atom who is saying this message
* * message - The text content of the message
* * italics - Decides if this should be small or not, as generally italics text are for whisper/radio overhear
* * existing_extra_classes - Additional classes to add to the message
*/
* Creates a message overlay at a defined location for a given speaker
*
* Arguments:
* * speaker - The atom who is saying this message
* * message - The text content of the message
* * italics - Decides if this should be small or not, as generally italics text are for whisper/radio overhear
* * existing_extra_classes - Additional classes to add to the message
*/
/mob/proc/create_chat_message(atom/movable/speaker, message, italics, list/existing_extra_classes, audible = TRUE)
if(!client)
return
@@ -350,7 +350,7 @@ var/list/runechat_image_cache = list()
message = strip_html_properly(message)
if(!message)
return
*/
*/
var/list/extra_classes = list()
extra_classes += existing_extra_classes
@@ -378,15 +378,15 @@ var/list/runechat_image_cache = list()
#define CM_COLOR_LUM_MAX 0.90
/**
* Gets a color for a name, will return the same color for a given string consistently within a round.atom
*
* Note that this proc aims to produce pastel-ish colors using the HSL colorspace. These seem to be favorable for displaying on the map.
*
* Arguments:
* * name - The name to generate a color for
* * sat_shift - A value between 0 and 1 that will be multiplied against the saturation
* * lum_shift - A value between 0 and 1 that will be multiplied against the luminescence
*/
* Gets a color for a name, will return the same color for a given string consistently within a round.atom
*
* Note that this proc aims to produce pastel-ish colors using the HSL colorspace. These seem to be favorable for displaying on the map.
*
* Arguments:
* * name - The name to generate a color for
* * sat_shift - A value between 0 and 1 that will be multiplied against the saturation
* * lum_shift - A value between 0 and 1 that will be multiplied against the luminescence
*/
/datum/chatmessage/proc/colorize_string(name, sat_shift = 1, lum_shift = 1)
// seed to help randomness
var/static/rseed = rand(1,26)
+2 -2
View File
@@ -431,9 +431,9 @@
if(!.)
return _AddComponent(arguments)
/**
* Removes the component from parent, ends up with a null parent
* Removes the component from parent, ends up with a null parent
* Used as a helper proc by the component transfer proc, does not clean up the component like Destroy does
*/
*/
/datum/component/proc/RemoveComponent()
if(!parent)
return
+1 -1
View File
@@ -221,7 +221,7 @@
* * user - the mob who is interacting with the wires.
*/
/datum/wires/proc/can_see_wire_info(mob/user)
// TODO: Reimplement this if we ever get Advanced Admin Interaction.
// TODO: Reimplement this if we ever get Advanced Admin Interaction.
// if(user.can_admin_interact())
// return TRUE
var/obj/item/I = user.get_active_hand()
+19 -19
View File
@@ -2,11 +2,11 @@
### This file contains a list of all the areas in your station. Format is as follows:
/area/CATEGORY/OR/DESCRIPTOR/NAME (you can make as many subdivisions as you want)
name = "NICE NAME" (not required but makes things really nice)
icon = "ICON FILENAME" (defaults to areas.dmi)
icon_state = "NAME OF ICON" (defaults to "unknown" (blank))
requires_power = 0 (defaults to 1)
/area/CATEGORY/OR/DESCRIPTOR/NAME (you can make as many subdivisions as you want)
name = "NICE NAME" (not required but makes things really nice)
icon = "ICON FILENAME" (defaults to areas.dmi)
icon_state = "NAME OF ICON" (defaults to "unknown" (blank))
requires_power = 0 (defaults to 1)
music = "music/music.ogg" (defaults to "music/music.ogg")
NOTE: there are two lists of areas in the end of this file: centcom and station itself. Please maintain these lists valid. --rastaf0
@@ -1276,26 +1276,26 @@ NOTE: there are two lists of areas in the end of this file: centcom and station
sound_env = LARGE_SOFTFLOOR
/area/crew_quarters/visitor_lodging
name = "\improper Visitor Lodging"
icon_state = "visitor_lodging"
name = "\improper Visitor Lodging"
icon_state = "visitor_lodging"
/area/crew_quarters/visitor_dining
name = "\improper Visitor Dining"
icon_state = "visitor_dinning"
name = "\improper Visitor Dining"
icon_state = "visitor_dinning"
/area/crew_quarters/visitor_laundry
name = "\improper Visitor Laundry"
icon_state = "visitor_laundry"
name = "\improper Visitor Laundry"
icon_state = "visitor_laundry"
/area/library
name = "\improper Library"
icon_state = "library"
sound_env = LARGE_SOFTFLOOR
lightswitch = 0 // VOREStation Edit - We like dark libraries
name = "\improper Library"
icon_state = "library"
sound_env = LARGE_SOFTFLOOR
lightswitch = 0 // VOREStation Edit - We like dark libraries
/area/library_conference_room
name = "\improper Library Conference Room"
icon_state = "library_conference_room"
name = "\improper Library Conference Room"
icon_state = "library_conference_room"
/area/chapel
ambience = AMBIENCE_CHAPEL
@@ -2611,8 +2611,8 @@ NOTE: there are two lists of areas in the end of this file: centcom and station
/////////////////////////////////////////////////////////////////////
/*
Lists of areas to be used with is_type_in_list.
Used in gamemodes code at the moment. --rastaf0
* Lists of areas to be used with is_type_in_list.
* Used in gamemodes code at the moment. --rastaf0
*/
// CENTCOM
+19 -19
View File
@@ -696,12 +696,12 @@
return TRUE
/**
* Creates a blank injector with the name of the buffer at the given buffer_id
*
* Arguments:
* * buffer_id - The ID of the buffer
* * copy_buffer - Whether the injector should copy the buffer contents
*/
* Creates a blank injector with the name of the buffer at the given buffer_id
*
* Arguments:
* * buffer_id - The ID of the buffer
* * copy_buffer - Whether the injector should copy the buffer contents
*/
/obj/machinery/computer/scan_consolenew/proc/create_injector(buffer_id, copy_buffer = FALSE)
if(buffer_id < 1 || buffer_id > length(buffers))
return
@@ -721,18 +721,18 @@
return I
/**
* Called when the injector creation cooldown finishes
*/
* Called when the injector creation cooldown finishes
*/
/obj/machinery/computer/scan_consolenew/proc/injector_cooldown_finish()
injector_ready = TRUE
/**
* Called in tgui_act() to process modal actions
*
* Arguments:
* * action - The action passed by tgui
* * params - The params passed by tgui
*/
* Called in tgui_act() to process modal actions
*
* Arguments:
* * action - The action passed by tgui
* * params - The params passed by tgui
*/
/obj/machinery/computer/scan_consolenew/proc/tgui_act_modal(action, params)
. = TRUE
var/id = params["id"] // The modal's ID
@@ -763,11 +763,11 @@
/**
* Triggers sleeve growing in a clonepod within the area
*
* Arguments:
* * active_br - Body record to print
*/
* Triggers sleeve growing in a clonepod within the area
*
* Arguments:
* * active_br - Body record to print
*/
/obj/machinery/computer/scan_consolenew/proc/print_sleeve(var/mob/user, var/datum/transhuman/body_record/active_br)
//deleted record
if(!istype(active_br))
+17 -17
View File
@@ -2,27 +2,27 @@
* ENDGAME STUFF
**********************/
// Universal State
// Handles stuff like space icon_state, constants, etc.
// Essentially a policy manager. Once shit hits the fan, this changes its policies.
// Called by master controller.
// Universal State
// Handles stuff like space icon_state, constants, etc.
// Essentially a policy manager. Once shit hits the fan, this changes its policies.
// Called by master controller.
// Default shit.
// Default shit.
/datum/universal_state
// Just for reference, for now.
// Might eventually add an observatory job.
var/name = "Normal"
var/desc = "Nothing seems awry."
var/name = "Normal"
var/desc = "Nothing seems awry."
// Sets world.turf, replaces all turfs of type /turf/space.
var/space_type = /turf/space
// Sets world.turf, replaces all turfs of type /turf/space.
var/space_type = /turf/space
// Replaces all turfs of type /turf/space/transit
var/transit_space_type = /turf/space/transit
// Replaces all turfs of type /turf/space/transit
var/transit_space_type = /turf/space/transit
// Chance of a floor or wall getting damaged [0-100]
// Simulates stuff getting broken due to molecular bonds decaying.
var/decay_rate = 0
// Chance of a floor or wall getting damaged [0-100]
// Simulates stuff getting broken due to molecular bonds decaying.
var/decay_rate = 0
// Actually decay the turf.
/datum/universal_state/proc/DecayTurf(var/turf/T)
@@ -50,15 +50,15 @@
// Apply changes when exiting state
/datum/universal_state/proc/OnExit()
// Does nothing by default
// Does nothing by default
// Apply changes when entering state
/datum/universal_state/proc/OnEnter()
// Does nothing by default
// Does nothing by default
// Apply changes to a new turf.
/datum/universal_state/proc/OnTurfChange(var/turf/NT)
return
return
/datum/universal_state/proc/OverlayAndAmbientSet()
return
@@ -2,10 +2,10 @@ var/global/universe_has_ended = 0
/datum/universal_state/supermatter_cascade
name = "Supermatter Cascade"
desc = "Unknown harmonance affecting universal substructure, converting nearby matter to supermatter."
name = "Supermatter Cascade"
desc = "Unknown harmonance affecting universal substructure, converting nearby matter to supermatter."
decay_rate = 5 // 5% chance of a turf decaying on lighting update/airflow (there's no actual tick for turfs)
decay_rate = 5 // 5% chance of a turf decaying on lighting update/airflow (there's no actual tick for turfs)
/datum/universal_state/supermatter_cascade/OnShuttleCall(var/mob/user)
if(user)
@@ -61,16 +61,15 @@ var/global/universe_has_ended = 0
new /obj/singularity/narsie/large/exit(pick(endgame_exits))
spawn(rand(30,60) SECONDS)
var/txt = {"
There's been a galaxy-wide electromagnetic pulse. All of our systems are heavily damaged and many personnel are dead or dying. We are seeing increasing indications of the universe itself beginning to unravel.
There's been a galaxy-wide electromagnetic pulse. All of our systems are heavily damaged and many personnel are dead or dying. We are seeing increasing indications of the universe itself beginning to unravel.
[station_name()], you are the only facility nearby a bluespace rift, which is near your research outpost. You are hereby directed to enter the rift using all means necessary, quite possibly as the last of your species alive.
[station_name()], you are the only facility nearby a bluespace rift, which is near your research outpost. You are hereby directed to enter the rift using all means necessary, quite possibly as the last of your species alive.
You have five minutes before the universe collapses. Good l\[\[###!!!-
You have five minutes before the universe collapses. Good l\[\[###!!!-
AUTOMATED ALERT: Link to [command_name()] lost.
AUTOMATED ALERT: Link to [command_name()] lost.
The access requirements on the Asteroid Shuttles' consoles have now been revoked.
"}
The access requirements on the Asteroid Shuttles' consoles have now been revoked.
"}
priority_announcement.Announce(txt,"SUPERMATTER CASCADE DETECTED")
for(var/obj/machinery/computer/shuttle_control/C in machines)
+2 -2
View File
@@ -267,13 +267,13 @@ var/const/access_explorer = 43
id = access_explorer
desc = JOB_EXPLORER
region = ACCESS_REGION_GENERAL
//CHOMP explo keep removed a wide comment field on this line
//CHOMP explo keep removed a wide comment field on this line
/var/const/access_pathfinder = 44
/datum/access/pathfinder
id = access_pathfinder
desc = JOB_PATHFINDER
region = ACCESS_REGION_GENERAL
//CHOMP explo keep removed the closing wide comment field on this line. KEEP THE PATHFINDER
//CHOMP explo keep removed the closing wide comment field on this line. KEEP THE PATHFINDER
/var/const/access_surgery = 45
/datum/access/surgery
+9 -9
View File
@@ -77,13 +77,13 @@
minimal_access = list() //See /datum/job/intern/get_access()
outfit_type = /decl/hierarchy/outfit/job/assistant/intern
alt_titles = list(JOB_ALT_APPRENTICE_ENGINEER = /datum/alt_title/intern_eng,
JOB_ALT_MEDICAL_INTERN = /datum/alt_title/intern_med,
JOB_ALT_LAB_ASSISTANT = /datum/alt_title/intern_sci, //CHOMPEdit
JOB_ALT_SECURITY_CADET = /datum/alt_title/intern_sec,
JOB_ALT_JR_CARGO_TECH = /datum/alt_title/intern_crg,
JOB_ALT_JR_EXPLORER = /datum/alt_title/intern_exp, //CHOMP Explo keep
JOB_ALT_SERVER = /datum/alt_title/server,
JOB_ALT_ASSISTANT = /datum/alt_title/assistant)
JOB_ALT_MEDICAL_INTERN = /datum/alt_title/intern_med,
JOB_ALT_LAB_ASSISTANT = /datum/alt_title/intern_sci, //CHOMPEdit
JOB_ALT_SECURITY_CADET = /datum/alt_title/intern_sec,
JOB_ALT_JR_CARGO_TECH = /datum/alt_title/intern_crg,
JOB_ALT_JR_EXPLORER = /datum/alt_title/intern_exp, //CHOMP Explo keep
JOB_ALT_SERVER = /datum/alt_title/server,
JOB_ALT_ASSISTANT = /datum/alt_title/assistant)
job_description = "An " + JOB_INTERN + " does whatever is requested of them, often doing so in process of learning \
another job. Though they are part of the crew, they have no real authority."
timeoff_factor = 0 // Interns, noh
@@ -118,13 +118,13 @@
title_blurb = "A " + JOB_ALT_JR_CARGO_TECH + " attempts to provide whatever the Cargo department needs. They are not proper Cargo Technicians, and are \
often in training to become a " + JOB_CARGO_TECHNICIAN + ". A " + JOB_ALT_JR_CARGO_TECH + " has no real authority."
title_outfit = /decl/hierarchy/outfit/job/assistant/cargo
//CHOMP explo keep removed a wide comment field here
//CHOMP explo keep removed a wide comment field here
/datum/alt_title/intern_exp
title = "Jr. " + JOB_EXPLORER + ""
title_blurb = "A Jr. " + JOB_EXPLORER + " attempts to provide whatever the Exploration department needs. They are not proper " + JOB_EXPLORER + "s, and are \
often in training to become an " + JOB_EXPLORER + ". A Jr. " + JOB_EXPLORER + " has no real authority."
title_outfit = /decl/hierarchy/outfit/job/assistant/explorer
//CHOMP explo keep removed the end of the wide comment field here
//CHOMP explo keep removed the end of the wide comment field here
/datum/alt_title/server
title = JOB_ALT_SERVER
title_blurb = "A " + JOB_ALT_SERVER + " helps out kitchen and diner staff with various tasks, primarily food delivery. A " + JOB_ALT_SERVER + " has no real authority."
+12 -12
View File
@@ -461,24 +461,24 @@
return (scanner && scanner.scan_level > 3)
/**
* Sets a temporary message to display to the user
*
* Arguments:
* * text - Text to display, null/empty to clear the message from the UI
* * style - The style of the message: (color name), info, success, warning, danger
*/
* Sets a temporary message to display to the user
*
* Arguments:
* * text - Text to display, null/empty to clear the message from the UI
* * style - The style of the message: (color name), info, success, warning, danger
*/
/obj/machinery/computer/cloning/proc/set_temp(text = "", style = "info", update_now = FALSE)
temp = list(text = text, style = style)
if(update_now)
SStgui.update_uis(src)
/**
* Sets a temporary scan message to display to the user
*
* Arguments:
* * text - Text to display, null/empty to clear the message from the UI
* * color - The color of the message: (color name)
*/
* Sets a temporary scan message to display to the user
*
* Arguments:
* * text - Text to display, null/empty to clear the message from the UI
* * color - The color of the message: (color name)
*/
/obj/machinery/computer/cloning/proc/set_scan_temp(text = "", color = "", update_now = FALSE)
scantemp = list(text = text, color = color)
if(update_now)
+14 -14
View File
@@ -368,12 +368,12 @@
return FALSE
/**
* Called in tgui_act() to process modal actions
*
* Arguments:
* * action - The action passed by tgui
* * params - The params passed by tgui
*/
* Called in tgui_act() to process modal actions
*
* Arguments:
* * action - The action passed by tgui
* * params - The params passed by tgui
*/
/obj/machinery/computer/med_data/proc/tgui_act_modal(action, params)
. = TRUE
var/id = params["id"] // The modal's ID
@@ -427,8 +427,8 @@
/**
* Called when the print timer finishes
*/
* Called when the print timer finishes
*/
/obj/machinery/computer/med_data/proc/print_finish()
var/obj/item/paper/P = new(loc)
P.info = "<center>" + span_bold("Medical Record") + "</center><br>"
@@ -470,12 +470,12 @@
SStgui.update_uis(src)
/**
* Sets a temporary message to display to the user
*
* Arguments:
* * text - Text to display, null/empty to clear the message from the UI
* * style - The style of the message: (color name), info, success, warning, danger, virus
*/
* Sets a temporary message to display to the user
*
* Arguments:
* * text - Text to display, null/empty to clear the message from the UI
* * style - The style of the message: (color name), info, success, warning, danger, virus
*/
/obj/machinery/computer/med_data/proc/set_temp(text = "", style = "info", update_now = FALSE)
temp = list(text = text, style = style)
if(update_now)
+31 -31
View File
@@ -30,13 +30,13 @@
return FALSE
/**
* Does this borg show up in the console
*
* Returns TRUE if a robot will show up in the console
* Returns FALSE if a robot will not show up in the console
* Arguments:
* * R - The [mob/living/silicon/robot] to be checked
*/
* Does this borg show up in the console
*
* Returns TRUE if a robot will show up in the console
* Returns FALSE if a robot will not show up in the console
* Arguments:
* * R - The [mob/living/silicon/robot] to be checked
*/
/obj/machinery/computer/robotics/proc/console_shows(mob/living/silicon/robot/R)
if(!istype(R))
return FALSE
@@ -49,15 +49,15 @@
return TRUE
/**
* Check if a user can send a lockdown/detonate command to a specific borg
*
* Returns TRUE if a user can send the command (does not guarantee it will work)
* Returns FALSE if a user cannot
* Arguments:
* * user - The [mob/user] to be checked
* * R - The [mob/living/silicon/robot] to be checked
* * telluserwhy - Bool of whether the user should be sent a to_chat message if they don't have access
*/
* Check if a user can send a lockdown/detonate command to a specific borg
*
* Returns TRUE if a user can send the command (does not guarantee it will work)
* Returns FALSE if a user cannot
* Arguments:
* * user - The [mob/user] to be checked
* * R - The [mob/living/silicon/robot] to be checked
* * telluserwhy - Bool of whether the user should be sent a to_chat message if they don't have access
*/
/obj/machinery/computer/robotics/proc/can_control(mob/user, mob/living/silicon/robot/R, telluserwhy = FALSE)
if(!istype(user))
return FALSE
@@ -76,13 +76,13 @@
return TRUE
/**
* Check if the user is the right kind of entity to be able to hack borgs
*
* Returns TRUE if a user is a traitor AI, or aghost
* Returns FALSE otherwise
* Arguments:
* * user - The [mob/user] to be checked
*/
* Check if the user is the right kind of entity to be able to hack borgs
*
* Returns TRUE if a user is a traitor AI, or aghost
* Returns FALSE otherwise
* Arguments:
* * user - The [mob/user] to be checked
*/
/obj/machinery/computer/robotics/proc/can_hack_any(mob/user)
if(!istype(user))
return FALSE
@@ -95,14 +95,14 @@
return (user.mind.special_role && user.mind.original == user)
/**
* Check if the user is allowed to hack a specific borg
*
* Returns TRUE if a user can hack the specific cyborg
* Returns FALSE if a user cannot
* Arguments:
* * user - The [mob/user] to be checked
* * R - The [mob/living/silicon/robot] to be checked
*/
* Check if the user is allowed to hack a specific borg
*
* Returns TRUE if a user can hack the specific cyborg
* Returns FALSE if a user cannot
* Arguments:
* * user - The [mob/user] to be checked
* * R - The [mob/living/silicon/robot] to be checked
*/
/obj/machinery/computer/robotics/proc/can_hack(mob/user, mob/living/silicon/robot/R)
if(!can_hack_any(user))
return FALSE
+14 -14
View File
@@ -361,12 +361,12 @@
return FALSE
/**
* Called in tgui_act() to process modal actions
*
* Arguments:
* * action - The action passed by tgui
* * params - The params passed by tgui
*/
* Called in tgui_act() to process modal actions
*
* Arguments:
* * action - The action passed by tgui
* * params - The params passed by tgui
*/
/obj/machinery/computer/secure_data/proc/tgui_act_modal(action, params)
. = TRUE
var/id = params["id"] // The modal's ID
@@ -428,8 +428,8 @@
/**
* Called when the print timer finishes
*/
* Called when the print timer finishes
*/
/obj/machinery/computer/secure_data/proc/print_finish()
var/obj/item/paper/P = new(loc)
P.info = "<center>" + span_bold("Security Record") + "</center><br>"
@@ -465,12 +465,12 @@
/**
* Sets a temporary message to display to the user
*
* Arguments:
* * text - Text to display, null/empty to clear the message from the UI
* * style - The style of the message: (color name), info, success, warning, danger, virus
*/
* Sets a temporary message to display to the user
*
* Arguments:
* * text - Text to display, null/empty to clear the message from the UI
* * style - The style of the message: (color name), info, success, warning, danger, virus
*/
/obj/machinery/computer/secure_data/proc/set_temp(text = "", style = "info", update_now = FALSE)
temp = list(text = text, style = style)
if(update_now)
+14 -14
View File
@@ -266,12 +266,12 @@
return FALSE
/**
* Called in tgui_act() to process modal actions
*
* Arguments:
* * action - The action passed by tgui
* * params - The params passed by tgui
*/
* Called in tgui_act() to process modal actions
*
* Arguments:
* * action - The action passed by tgui
* * params - The params passed by tgui
*/
/obj/machinery/computer/skills/proc/tgui_act_modal(action, params)
. = TRUE
var/id = params["id"] // The modal's ID
@@ -323,8 +323,8 @@
return FALSE
/**
* Called when the print timer finishes
*/
* Called when the print timer finishes
*/
/obj/machinery/computer/skills/proc/print_finish()
var/obj/item/paper/P = new(loc)
P.info = "<center>" + span_bold("Medical Record") + "</center><br>"
@@ -355,12 +355,12 @@
SStgui.update_uis(src)
/**
* Sets a temporary message to display to the user
*
* Arguments:
* * text - Text to display, null/empty to clear the message from the UI
* * style - The style of the message: (color name), info, success, warning, danger, virus
*/
* Sets a temporary message to display to the user
*
* Arguments:
* * text - Text to display, null/empty to clear the message from the UI
* * style - The style of the message: (color name), info, success, warning, danger, virus
*/
/obj/machinery/computer/skills/proc/set_temp(text = "", style = "info", update_now = FALSE)
temp = list(text = text, style = style)
if(update_now)
+2 -2
View File
@@ -388,8 +388,8 @@
// SUBTYPE: Multi-tile
// Pod doors ported from Paradise
// Whoever wrote the old code for multi-tile spesspod doors needs to burn in hell. - Unknown
// Wise words. - Bxil
// Whoever wrote the old code for multi-tile spesspod doors needs to burn in hell. - Unknown
// Wise words. - Bxil
/obj/machinery/door/blast/multi_tile
name = "large blast door"
+6 -6
View File
@@ -276,12 +276,12 @@ GLOBAL_LIST_BOILERPLATE(allCasters, /obj/machinery/newscaster)
tgui_interact(user)
/**
* Sets a temporary message to display to the user
*
* Arguments:
* * text - Text to display, null/empty to clear the message from the UI
* * style - The style of the message: (color name), info, success, warning, danger, virus
*/
* Sets a temporary message to display to the user
*
* Arguments:
* * text - Text to display, null/empty to clear the message from the UI
* * style - The style of the message: (color name), info, success, warning, danger, virus
*/
/obj/machinery/newscaster/proc/set_temp(text = "", style = "info", update_now = FALSE)
temp = list(text = text, style = style)
if(update_now)
+8 -8
View File
@@ -341,7 +341,7 @@ var/message_delay = 0 // To make sure restarting the recentmessages list is kept
var/data, var/compression, var/list/level, var/freq, var/verbage = "says",
var/list/forced_radios)
/* ###### Prepare the radio connection ###### */
/* ###### Prepare the radio connection ###### */
var/display_freq = freq
@@ -392,9 +392,9 @@ var/message_delay = 0 // To make sure restarting the recentmessages list is kept
// Get a list of mobs who can hear from the radios we collected.
var/list/receive = get_mobs_in_radio_ranges(radios)
/* ###### Organize the receivers into categories for displaying the message ###### */
/* ###### Organize the receivers into categories for displaying the message ###### */
// Understood the message:
// Understood the message:
var/list/heard_masked = list() // masked name or no real name
var/list/heard_normal = list() // normal message
@@ -453,7 +453,7 @@ var/message_delay = 0 // To make sure restarting the recentmessages list is kept
heard_garbled += R
/* ###### Begin formatting and sending the message ###### */
/* ###### Begin formatting and sending the message ###### */
if(length(heard_masked) || length(heard_normal) || length(heard_voice) || length(heard_garbled) || length(heard_gibberish))
/* --- Some miscellaneous variables to format the string output --- */
@@ -557,7 +557,7 @@ var/message_delay = 0 // To make sure restarting the recentmessages list is kept
/proc/Broadcast_SimpleMessage(var/source, var/frequency, list/message_pieces, var/data, var/mob/M, var/compression, var/level, var/list/forced_radios)
var/text = multilingual_to_message(message_pieces)
/* ###### Prepare the radio connection ###### */
/* ###### Prepare the radio connection ###### */
if(!M)
var/mob/living/carbon/human/H = new
@@ -613,7 +613,7 @@ var/message_delay = 0 // To make sure restarting the recentmessages list is kept
receive |= R.send_hear(display_freq)
/* ###### Organize the receivers into categories for displaying the message ###### */
/* ###### Organize the receivers into categories for displaying the message ###### */
// Understood the message:
var/list/heard_normal = list() // normal message
@@ -650,7 +650,7 @@ var/message_delay = 0 // To make sure restarting the recentmessages list is kept
heard_garbled += R
/* ###### Begin formatting and sending the message ###### */
/* ###### Begin formatting and sending the message ###### */
if(length(heard_normal) || length(heard_garbled) || length(heard_gibberish))
/* --- Some miscellaneous variables to format the string output --- */
@@ -759,7 +759,7 @@ var/message_delay = 0 // To make sure restarting the recentmessages list is kept
)
signal.frequency = PUB_FREQ// Common channel
//#### Sending the signal to all subspace receivers ####//
//#### Sending the signal to all subspace receivers ####//
for(var/obj/machinery/telecomms/receiver/R in telecomms_list)
R.receive_signal(signal)
+82 -82
View File
@@ -117,12 +117,12 @@
/**
* Generates an info list for a given part.
*
* Returns a list of part information.
* * D - Design datum to get information on.
* * categories - Boolean, whether or not to parse snowflake categories into the part information list.
*/
* Generates an info list for a given part.
*
* Returns a list of part information.
* * D - Design datum to get information on.
* * categories - Boolean, whether or not to parse snowflake categories into the part information list.
*/
/obj/machinery/mecha_part_fabricator/proc/output_part_info(datum/design/D, var/categories = FALSE)
var/cost = list()
for(var/c in D.materials)
@@ -206,11 +206,11 @@
/**
* Generates a list of resources / materials available to this Exosuit Fab
*
* Returns null if there is no material container available.
* List format is list(material_name = list(amount = ..., ref = ..., etc.))
*/
* Generates a list of resources / materials available to this Exosuit Fab
*
* Returns null if there is no material container available.
* List format is list(material_name = list(amount = ..., ref = ..., etc.))
*/
/obj/machinery/mecha_part_fabricator/proc/output_available_resources()
var/list/material_data = list()
@@ -228,19 +228,19 @@
return material_data
/**
* Intended to be called when an item starts printing.
*
* Adds the overlay to show the fab working and sets active power usage settings.
*/
* Intended to be called when an item starts printing.
*
* Adds the overlay to show the fab working and sets active power usage settings.
*/
/obj/machinery/mecha_part_fabricator/proc/on_start_printing()
add_overlay("[icon_state]-active")
use_power = USE_POWER_ACTIVE
/**
* Intended to be called when the exofab has stopped working and is no longer printing items.
*
* Removes the overlay to show the fab working and sets idle power usage settings. Additionally resets the description and turns off queue processing.
*/
* Intended to be called when the exofab has stopped working and is no longer printing items.
*
* Removes the overlay to show the fab working and sets idle power usage settings. Additionally resets the description and turns off queue processing.
*/
/obj/machinery/mecha_part_fabricator/proc/on_finish_printing()
cut_overlay("[icon_state]-active")
use_power = USE_POWER_IDLE
@@ -248,11 +248,11 @@
process_queue = FALSE
/**
* Calculates resource/material costs for printing an item based on the machine's resource coefficient.
*
* Returns a list of k,v resources with their amounts.
* * D - Design datum to calculate the modified resource cost of.
*/
* Calculates resource/material costs for printing an item based on the machine's resource coefficient.
*
* Returns a list of k,v resources with their amounts.
* * D - Design datum to calculate the modified resource cost of.
*/
/obj/machinery/mecha_part_fabricator/proc/get_resources_w_coeff(datum/design/D)
var/list/resources = list()
for(var/mat_id in D.materials)
@@ -260,12 +260,12 @@
return resources
/**
* Checks if the Exofab has enough resources to print a given item.
*
* Returns FALSE if the design has no reagents used in its construction (?) or if there are insufficient resources.
* Returns TRUE if there are sufficient resources to print the item.
* * D - Design datum to calculate the modified resource cost of.
*/
* Checks if the Exofab has enough resources to print a given item.
*
* Returns FALSE if the design has no reagents used in its construction (?) or if there are insufficient resources.
* Returns TRUE if there are sufficient resources to print the item.
* * D - Design datum to calculate the modified resource cost of.
*/
/obj/machinery/mecha_part_fabricator/proc/check_resources(datum/design/D)
if(length(D.chemicals)) // No reagents storage - no reagent designs.
return FALSE
@@ -276,12 +276,12 @@
return FALSE
/**
* Attempts to build the next item in the build queue.
*
* Returns FALSE if either there are no more parts to build or the next part is not buildable.
* Returns TRUE if the next part has started building.
* * verbose - Whether the machine should use say() procs. Set to FALSE to disable the machine saying reasons for failure to build.
*/
* Attempts to build the next item in the build queue.
*
* Returns FALSE if either there are no more parts to build or the next part is not buildable.
* Returns TRUE if the next part has started building.
* * verbose - Whether the machine should use say() procs. Set to FALSE to disable the machine saying reasons for failure to build.
*/
/obj/machinery/mecha_part_fabricator/proc/build_next_in_queue(verbose = TRUE)
if(!length(queue))
return FALSE
@@ -294,13 +294,13 @@
return FALSE
/**
* Starts the build process for a given design datum.
*
* Returns FALSE if the procedure fails. Returns TRUE when being_built is set.
* Uses materials.
* * D - Design datum to attempt to print.
* * verbose - Whether the machine should use say() procs. Set to FALSE to disable the machine saying reasons for failure to build.
*/
* Starts the build process for a given design datum.
*
* Returns FALSE if the procedure fails. Returns TRUE when being_built is set.
* Uses materials.
* * D - Design datum to attempt to print.
* * verbose - Whether the machine should use say() procs. Set to FALSE to disable the machine saying reasons for failure to build.
*/
/obj/machinery/mecha_part_fabricator/proc/build_part(datum/design/D, verbose = TRUE)
if(!D)
return FALSE
@@ -351,12 +351,12 @@
/**
* Dispenses a part to the tile infront of the Exosuit Fab.
*
* Returns FALSE is the machine cannot dispense the part on the appropriate turf.
* Return TRUE if the part was successfully dispensed.
* * D - Design datum to attempt to dispense.
*/
* Dispenses a part to the tile infront of the Exosuit Fab.
*
* Returns FALSE is the machine cannot dispense the part on the appropriate turf.
* Return TRUE if the part was successfully dispensed.
* * D - Design datum to attempt to dispense.
*/
/obj/machinery/mecha_part_fabricator/proc/dispense_built_part(datum/design/D)
var/obj/item/I = D.Fabricate(src, src)
// I.material_flags |= MATERIAL_NO_EFFECTS //Find a better way to do this.
@@ -376,23 +376,23 @@
return I
/**
* Adds a list of datum designs to the build queue.
*
* Will only add designs that are in this machine's stored techweb.
* Does final checks for datum IDs and makes sure this machine can build the designs.
* * part_list - List of datum design ids for designs to add to the queue.
*/
* Adds a list of datum designs to the build queue.
*
* Will only add designs that are in this machine's stored techweb.
* Does final checks for datum IDs and makes sure this machine can build the designs.
* * part_list - List of datum design ids for designs to add to the queue.
*/
/obj/machinery/mecha_part_fabricator/proc/add_part_set_to_queue(list/part_list)
for(var/datum/design/D in files.known_designs)
if((D.build_type & valid_buildtype) && (D.id in part_list))
add_to_queue(D)
/**
* Adds a datum design to the build queue.
*
* Returns TRUE if successful and FALSE if the design was not added to the queue.
* * D - Datum design to add to the queue.
*/
* Adds a datum design to the build queue.
*
* Returns TRUE if successful and FALSE if the design was not added to the queue.
* * D - Datum design to add to the queue.
*/
/obj/machinery/mecha_part_fabricator/proc/add_to_queue(datum/design/D)
if(!istype(queue))
queue = list()
@@ -402,11 +402,11 @@
return FALSE
/**
* Removes datum design from the build queue based on index.
*
* Returns TRUE if successful and FALSE if a design was not removed from the queue.
* * index - Index in the build queue of the element to remove.
*/
* Removes datum design from the build queue based on index.
*
* Returns TRUE if successful and FALSE if a design was not removed from the queue.
* * index - Index in the build queue of the element to remove.
*/
/obj/machinery/mecha_part_fabricator/proc/remove_from_queue(index)
if(!isnum(index) || !ISINTEGER(index) || !istype(queue) || (index<1 || index>length(queue)))
return FALSE
@@ -414,10 +414,10 @@
return TRUE
/**
* Generates a list of parts formatted for tgui based on the current build queue.
*
* Returns a formatted list of lists containing formatted part information for every part in the build queue.
*/
* Generates a list of parts formatted for tgui based on the current build queue.
*
* Returns a formatted list of lists containing formatted part information for every part in the build queue.
*/
/obj/machinery/mecha_part_fabricator/proc/list_queue()
if(!istype(queue) || !length(queue))
return null
@@ -445,23 +445,23 @@
return
/**
* Calculates the coefficient-modified resource cost of a single material component of a design's recipe.
*
* Returns coefficient-modified resource cost for the given material component.
* * D - Design datum to pull the resource cost from.
* * resource - Material datum reference to the resource to calculate the cost of.
* * roundto - Rounding value for round() proc
*/
* Calculates the coefficient-modified resource cost of a single material component of a design's recipe.
*
* Returns coefficient-modified resource cost for the given material component.
* * D - Design datum to pull the resource cost from.
* * resource - Material datum reference to the resource to calculate the cost of.
* * roundto - Rounding value for round() proc
*/
/obj/machinery/mecha_part_fabricator/proc/get_resource_cost_w_coeff(datum/design/D, var/amt, roundto = 1)
return round(amt * component_coeff, roundto)
/**
* Calculates the coefficient-modified build time of a design.
*
* Returns coefficient-modified build time of a given design.
* * D - Design datum to calculate the modified build time of.
* * roundto - Rounding value for round() proc
*/
* Calculates the coefficient-modified build time of a design.
*
* Returns coefficient-modified build time of a given design.
* * D - Design datum to calculate the modified build time of.
* * roundto - Rounding value for round() proc
*/
/obj/machinery/mecha_part_fabricator/proc/get_construction_time_w_coeff(construction_time, roundto = 1) //aran
return round(construction_time * time_coeff, roundto)
+2 -2
View File
@@ -2853,8 +2853,8 @@
<a href='byond://?src=\ref[src];debug=1;clear_i_dam=[MECHA_INT_SHORT_CIRCUIT]'>MECHA_INT_SHORT_CIRCUIT</a><br />
<a href='byond://?src=\ref[src];debug=1;clear_i_dam=[MECHA_INT_TANK_BREACH]'>MECHA_INT_TANK_BREACH</a><br />
<a href='byond://?src=\ref[src];debug=1;clear_i_dam=[MECHA_INT_CONTROL_LOST]'>MECHA_INT_CONTROL_LOST</a><br />
</body>
</html>"}
</body>
</html>"}
occupant << browse(output, "window=ex_debug")
//src.health = initial(src.health)/2.2
+2 -2
View File
@@ -556,7 +556,7 @@
return
//////////////////////
//////////////////////
// Serenity
//////////////////////
/datum/construction/mecha/serenity_chassis
@@ -679,7 +679,7 @@
if(!..())
return 0
//TODO: better messages.
//TODO: better messages.
switch(index)
if(20)
user.visible_message(span_infoplain("[user] connects [holder] hydraulic systems"), span_infoplain("You connect [holder] hydraulic systems."))
+1 -1
View File
@@ -1,4 +1,4 @@
/////////////////////////
/////////////////////////
////// Mecha Parts //////
/////////////////////////
@@ -44,14 +44,14 @@
name = JOB_CARGO_TECHNICIAN
/obj/effect/landmark/start/miner
name = JOB_SHAFT_MINER
//CHOMP explo keep removed wide comment field
//CHOMP explo keep removed wide comment field
/obj/effect/landmark/start/pf
name = JOB_PATHFINDER
/obj/effect/landmark/start/explorer
name = JOB_EXPLORER
/obj/effect/landmark/start/fieldmedic
name = JOB_FIELD_MEDIC
//CHOMP explo keep removed wide comment field end
//CHOMP explo keep removed wide comment field end
/obj/effect/landmark/start/bartender
name = JOB_BARTENDER
/obj/effect/landmark/start/botanist
+3 -3
View File
@@ -10,9 +10,9 @@
can_atmos_pass = ATMOS_PASS_PROC
/obj/effect/zone_divider/CanZASPass(turf/T, is_zone)
// Special case to prevent us from being part of a zone during the first air master tick.
// We must merge ourselves into a zone on next tick. This will cause a bit of lag on
// startup, but it can't really be helped you know?
// Special case to prevent us from being part of a zone during the first air master tick.
// We must merge ourselves into a zone on next tick. This will cause a bit of lag on
// startup, but it can't really be helped you know?
if(SSair && SSair.current_cycle == 0)
spawn(1)
SSair.mark_for_update(get_turf(src))
+2 -2
View File
@@ -183,8 +183,8 @@ GLOBAL_LIST_EMPTY(GPS_list)
/obj/item/gps/attack_self(mob/user)
display(user)
// Compiles all the data not available directly from the GPS
// Like the positions and directions to all other GPS units
// Compiles all the data not available directly from the GPS
// Like the positions and directions to all other GPS units
/obj/item/gps/proc/display_list()
var/list/dat = list()
@@ -73,7 +73,7 @@
if(blood_volume <= M.species.blood_volume*M.species.blood_level_safe)
bloodloss = TRUE
//CHOMPedit start: Wording
//CHOMPedit start: Wording
if(bleeding_external)
dat += span_bold("Surface Bleeding") + " - Apply bandages or administer Bicaridine.<br>"
if(bleeding_internal)
+10 -10
View File
@@ -38,16 +38,16 @@
return //Stub, used on children.
// HIDDEN UPLINK - Can be stored in anything but the host item has to have a trigger for it.
/* How to create an uplink in 3 easy steps!
1. All obj/item 's have a hidden_uplink var. By default it's null. Give the item one with "new(src)", it must be in it's contents. Feel free to add "uses".
2. Code in the triggers. Use check_trigger for this, I recommend closing the item's menu with "usr << browse(null, "window=windowname") if it returns true.
The var/value is the value that will be compared with the var/target. If they are equal it will activate the menu.
3. If you want the menu to stay until the users locks his uplink, add an active_uplink_check(mob/user as mob) in your interact/attack_hand proc.
Then check if it's true, if true return. This will stop the normal menu appearing and will instead show the uplink menu.
*/
/** How to create an uplink in 3 easy steps!
*
* 1. All obj/item 's have a hidden_uplink var. By default it's null. Give the item one with "new(src)", it must be in it's contents. Feel free to add "uses".
*
* 2. Code in the triggers. Use check_trigger for this, I recommend closing the item's menu with "usr << browse(null, "window=windowname") if it returns true.
* The var/value is the value that will be compared with the var/target. If they are equal it will activate the menu.
*
* 3. If you want the menu to stay until the users locks his uplink, add an active_uplink_check(mob/user as mob) in your interact/attack_hand proc.
* Then check if it's true, if true return. This will stop the normal menu appearing and will instead show the uplink menu.
*/
/obj/item/uplink/hidden
name = "hidden uplink"
+58 -58
View File
@@ -58,18 +58,18 @@
return 0 //not in range and not telekinetic
/**
* this proc combines "sleep" while also checking for if the battle should continue
*
* this goes through some of the checks - the toys need to be next to each other to fight!
* if it's player vs themself: They need to be able to "control" both mechs (either must be adjacent or using TK).
* if it's player vs player: Both players need to be able to "control" their mechs (either must be adjacent or using TK).
* if all the checks are TRUE, it does the sleeps, and returns TRUE. Otherwise, it returns FALSE.
* Arguments:
* * delay - the amount of time the sleep at the end of the check will sleep for
* * attacker - the attacking toy in the battle.
* * attacker_controller - the controller of the attacking toy. there should ALWAYS be an attacker_controller
* * opponent - (optional) the defender controller in the battle, for PvP
*/
* this proc combines "sleep" while also checking for if the battle should continue
*
* this goes through some of the checks - the toys need to be next to each other to fight!
* if it's player vs themself: They need to be able to "control" both mechs (either must be adjacent or using TK).
* if it's player vs player: Both players need to be able to "control" their mechs (either must be adjacent or using TK).
* if all the checks are TRUE, it does the sleeps, and returns TRUE. Otherwise, it returns FALSE.
* Arguments:
* * delay - the amount of time the sleep at the end of the check will sleep for
* * attacker - the attacking toy in the battle.
* * attacker_controller - the controller of the attacking toy. there should ALWAYS be an attacker_controller
* * opponent - (optional) the defender controller in the battle, for PvP
*/
/obj/item/toy/mecha/proc/combat_sleep(var/delay, obj/item/toy/mecha/attacker, mob/living/carbon/attacker_controller, mob/living/carbon/opponent)
if(!attacker_controller) // If the attacker for whatever reason is null, don't continue.
@@ -130,8 +130,8 @@
attack_self(user)
/**
* If you attack a mech with a mech, initiate combat between them
*/
* If you attack a mech with a mech, initiate combat between them
*/
/obj/item/toy/mecha/attackby(obj/item/user_toy, mob/living/user)
if(istype(user_toy, /obj/item/toy/mecha))
var/obj/item/toy/mecha/M = user_toy
@@ -140,8 +140,8 @@
..()
/**
* Attack is called from the user's toy, aimed at target(another human), checking for target's toy.
*/
* Attack is called from the user's toy, aimed at target(another human), checking for target's toy.
*/
/obj/item/toy/mecha/attack(mob/living/carbon/human/target, mob/living/carbon/human/user)
if(target == user)
to_chat(user, span_notice("Target another toy mech if you want to start a battle with yourself."))
@@ -176,8 +176,8 @@
..()
/**
* Overrides attack_tk - Sorry, you have to be face to face to initiate a battle, it's good sportsmanship
*/
* Overrides attack_tk - Sorry, you have to be face to face to initiate a battle, it's good sportsmanship
*/
/obj/item/toy/mecha/attack_tk(mob/user)
if(timer < world.time)
to_chat(user, span_notice("You telekinetically play with [src]."))
@@ -185,12 +185,12 @@
playsound(user, 'sound/mecha/mechstep.ogg', 20, TRUE)
/**
* Resets the request for battle.
*
* For use in a timer, this proc resets the wants_to_battle variable after a short period.
* Arguments:
* * user - the user wanting to do battle
*/
* Resets the request for battle.
*
* For use in a timer, this proc resets the wants_to_battle variable after a short period.
* Arguments:
* * user - the user wanting to do battle
*/
/obj/item/toy/mecha/proc/withdraw_offer(mob/living/carbon/user)
if(wants_to_battle)
wants_to_battle = FALSE
@@ -209,18 +209,18 @@
. += span_notice("This toy has [wins] wins, and [losses] losses.")
/**
* The 'master' proc of the mech battle. Processes the entire battle's events and makes sure it start and finishes correctly.
*
* src is the defending toy, and the battle proc is called on it to begin the battle.
* After going through a few checks at the beginning to ensure the battle can start properly, the battle begins a loop that lasts
* until either toy has no more health. During this loop, it also ensures the mechs stay in combat range of each other.
* It will then randomly decide attacks for each toy, occasionally making one or the other use their special attack.
* When either mech has no more health, the loop ends, and it displays the victor and the loser while updating their stats and resetting them.
* Arguments:
* * attacker - the attacking toy, the toy in the attacker_controller's hands
* * attacker_controller - the user, the one who is holding the toys / controlling the fight
* * opponent - optional arg used in Mech PvP battles: the other person who is taking part in the fight (controls src)
*/
* The 'master' proc of the mech battle. Processes the entire battle's events and makes sure it start and finishes correctly.
*
* src is the defending toy, and the battle proc is called on it to begin the battle.
* After going through a few checks at the beginning to ensure the battle can start properly, the battle begins a loop that lasts
* until either toy has no more health. During this loop, it also ensures the mechs stay in combat range of each other.
* It will then randomly decide attacks for each toy, occasionally making one or the other use their special attack.
* When either mech has no more health, the loop ends, and it displays the victor and the loser while updating their stats and resetting them.
* Arguments:
* * attacker - the attacking toy, the toy in the attacker_controller's hands
* * attacker_controller - the user, the one who is holding the toys / controlling the fight
* * opponent - optional arg used in Mech PvP battles: the other person who is taking part in the fight (controls src)
*/
/obj/item/toy/mecha/proc/mecha_brawl(obj/item/toy/mecha/attacker, mob/living/carbon/attacker_controller, mob/living/carbon/opponent)
//A GOOD DAY FOR A SWELL BATTLE!
attacker_controller.visible_message(span_danger(" [attacker_controller.name] collides [attacker] with [src]! Looks like they're preparing for a brawl! "), \
@@ -380,16 +380,16 @@
return
/**
* This proc checks if a battle can be initiated between src and attacker.
*
* Both SRC and attacker (if attacker is included) timers are checked if they're on cooldown, and
* both SRC and attacker (if attacker is included) are checked if they are in combat already.
* If any of the above are true, the proc returns FALSE and sends a message to user (and target, if included) otherwise, it returns TRUE
* Arguments:
* * user: the user who is initiating the battle
* * attacker: optional arg for checking two mechs at once
* * target: optional arg used in Mech PvP battles (if used, attacker is target's toy)
*/
* This proc checks if a battle can be initiated between src and attacker.
*
* Both SRC and attacker (if attacker is included) timers are checked if they're on cooldown, and
* both SRC and attacker (if attacker is included) are checked if they are in combat already.
* If any of the above are true, the proc returns FALSE and sends a message to user (and target, if included) otherwise, it returns TRUE
* Arguments:
* * user: the user who is initiating the battle
* * attacker: optional arg for checking two mechs at once
* * target: optional arg used in Mech PvP battles (if used, attacker is target's toy)
*/
/obj/item/toy/mecha/proc/check_battle_start(mob/living/carbon/user, obj/item/toy/mecha/attacker, mob/living/carbon/target)
var/datum/gender/T
if(target)
@@ -418,12 +418,12 @@
return TRUE
/**
* Processes any special attack moves that happen in the battle (called in the mechaBattle proc).
*
* Makes the toy shout their special attack cry and updates its cooldown. Then, does the special attack.
* Arguments:
* * victim - the toy being hit by the special move
*/
* Processes any special attack moves that happen in the battle (called in the mechaBattle proc).
*
* Makes the toy shout their special attack cry and updates its cooldown. Then, does the special attack.
* Arguments:
* * victim - the toy being hit by the special move
*/
/obj/item/toy/mecha/proc/special_attack_move(obj/item/toy/mecha/victim)
visible_message(special_attack_cry + "!!")
@@ -447,12 +447,12 @@
visible_message("I FORGOT MY SPECIAL ATTACK...")
/**
* Base proc for 'other' special attack moves.
*
* This one is only for inheritance, each mech with an 'other' type move has their procs below.
* Arguments:
* * victim - the toy being hit by the super special move (doesn't necessarily need to be used)
*/
* Base proc for 'other' special attack moves.
*
* This one is only for inheritance, each mech with an 'other' type move has their procs below.
* Arguments:
* * victim - the toy being hit by the super special move (doesn't necessarily need to be used)
*/
/obj/item/toy/mecha/proc/super_special_attack(obj/item/toy/mecha/victim)
visible_message(span_notice(" [src] does a cool flip."))
+1 -1
View File
@@ -14,7 +14,7 @@
* Plushies
* Toy cult sword
* Bouquets
Stick Horse
* Stick Horse
*/
+27 -27
View File
@@ -543,49 +543,49 @@
max_storage_space = ITEMSIZE_COST_NORMAL * 2
/obj/item/storage/belt/fannypack/black
name = "black fannypack"
icon_state = "fannypack_black"
item_state = "fannypack_black"
name = "black fannypack"
icon_state = "fannypack_black"
item_state = "fannypack_black"
/obj/item/storage/belt/fannypack/blue
name = "blue fannypack"
icon_state = "fannypack_blue"
item_state = "fannypack_blue"
name = "blue fannypack"
icon_state = "fannypack_blue"
item_state = "fannypack_blue"
/obj/item/storage/belt/fannypack/cyan
name = "cyan fannypack"
icon_state = "fannypack_cyan"
item_state = "fannypack_cyan"
name = "cyan fannypack"
icon_state = "fannypack_cyan"
item_state = "fannypack_cyan"
/obj/item/storage/belt/fannypack/green
name = "green fannypack"
icon_state = "fannypack_green"
item_state = "fannypack_green"
name = "green fannypack"
icon_state = "fannypack_green"
item_state = "fannypack_green"
/obj/item/storage/belt/fannypack/orange
name = "orange fannypack"
icon_state = "fannypack_orange"
item_state = "fannypack_orange"
name = "orange fannypack"
icon_state = "fannypack_orange"
item_state = "fannypack_orange"
/obj/item/storage/belt/fannypack/purple
name = "purple fannypack"
icon_state = "fannypack_purple"
item_state = "fannypack_purple"
name = "purple fannypack"
icon_state = "fannypack_purple"
item_state = "fannypack_purple"
/obj/item/storage/belt/fannypack/red
name = "red fannypack"
icon_state = "fannypack_red"
item_state = "fannypack_red"
name = "red fannypack"
icon_state = "fannypack_red"
item_state = "fannypack_red"
/obj/item/storage/belt/fannypack/white
name = "white fannypack"
icon_state = "fannypack_white"
item_state = "fannypack_white"
name = "white fannypack"
icon_state = "fannypack_white"
item_state = "fannypack_white"
/obj/item/storage/belt/fannypack/yellow
name = "yellow fannypack"
icon_state = "fannypack_yellow"
item_state = "fannypack_yellow"
name = "yellow fannypack"
icon_state = "fannypack_yellow"
item_state = "fannypack_yellow"
/obj/item/storage/belt/ranger
name = "ranger belt"
@@ -68,11 +68,11 @@ GLOBAL_LIST_INIT(bibleitemstates, list(
to_chat(user, span_notice("You invoke [user.mind.my_religion.deity] and prepare a copy of [src]."))
/**
* Checks if we are allowed to interact with a radial menu
*
* Arguments:
* * user The mob interacting with the menu
*/
* Checks if we are allowed to interact with a radial menu
*
* Arguments:
* * user The mob interacting with the menu
*/
/obj/item/storage/bible/proc/check_menu(mob/living/carbon/human/user)
if(user.mind.my_religion.configured)
return FALSE
+1 -1
View File
@@ -61,7 +61,7 @@
/**
*
Notes on change_state
* Notes on change_state
*
* tl;dr "You can varedit 'state' on these to the things in the comments below to get cool animations"
*
+1 -1
View File
@@ -2,7 +2,7 @@
//Thanks to Kilakk for the admin-button portion of this code.
var/global/send_emergency_team = 0 // Used for automagic response teams
// 'admin_emergency_team' for admin-spawned response teams
// 'admin_emergency_team' for admin-spawned response teams
var/ert_base_chance = 10 // Default base chance. Will be incremented by increment ERT chance.
var/can_call_ert
var/silent_ert = 0
+1 -1
View File
@@ -10,7 +10,7 @@
//allocate a channel if necessary now so its the same for everyone
channel = channel || SSsounds.random_available_channel()
// Looping through the player list has the added bonus of working for mobs inside containers
// Looping through the player list has the added bonus of working for mobs inside containers
var/sound/S = sound(get_sfx(soundin))
var/maxdistance = (world.view + extrarange) * 2 //VOREStation Edit - 3 to 2
var/list/listeners = player_list.Copy()
@@ -180,6 +180,41 @@ GLOBAL_LIST_EMPTY(fancy_shuttles)
/obj/effect/floor_decal/fancy_shuttle/get_cache_key(var/turf/T)
return "[alpha]-[color]-[dir]-[icon_state]-[T.layer]-[icon_file]"
/**
* Shuttle Glass
*/
//OLD GLASS - USE NEW GLASS
/turf/simulated/wall/fancy_shuttle/window
opacity = FALSE
icon_state = "hull_transparent"
/turf/simulated/wall/fancy_shuttle/window/attack_generic(mob/user, damage, attack_message)
take_damage(damage)
return damage
//NEW GLASS
/obj/structure/window/fancy_shuttle
name = "shuttle window"
desc = "It looks rather strong. Might take a few good hits to shatter it."
icon = 'icons/turf/fancy_shuttles/_fancy_helpers.dmi'
icon_state = "hull_window"
density = TRUE
fulltile = TRUE
maxhealth = 60
reinf = 1
force_threshold = 7
var/fancy_shuttle_tag
// Trust me, this is WAY faster than the normal wall overlays shenanigans, don't worry about performance
/obj/structure/window/fancy_shuttle/update_icon()
if(fancy_shuttle_tag) // after a shuttle jump it won't be set anymore, but the shuttle jump proc will set our icon and state
var/obj/effect/fancy_shuttle/F = GLOB.fancy_shuttles[fancy_shuttle_tag]
if(!F)
warning("Fancy shuttle wall at [x],[y],[z] couldn't locate a helper with tag [fancy_shuttle_tag]")
return
icon = F.split_icon
icon_state = "walls [x - F.x],[y - F.y]"
/**
* Invisible ship equipment (otherwise the same as normal)
*/
+1 -1
View File
@@ -194,6 +194,6 @@
return TRUE
/proc/forbidden_varedit_object_types()
return list(
return list(
/datum/admins //Admins editing their own admin-power object? Yup, sounds like a good idea.
)
+4 -4
View File
@@ -115,11 +115,11 @@
///Average ping of the client
var/avgping = 0
///world.time they connected
///world.time they connected
var/connection_time
///world.realtime they connected
///world.realtime they connected
var/connection_realtime
///world.timeofday they connected
///world.timeofday they connected
var/connection_timeofday
// Runechat messages
@@ -166,7 +166,7 @@
/// Bitfield of movement dirs that were released *this* cycle (even if currently held).
/// Note that only dirs that were already held at the start of this cycle are included, if it pressed then released it won't be in here.
/// On next move, subtract this dir from the move that would otherwise be done
/// On next move, subtract this dir from the move that would otherwise be done
var/next_move_dir_sub
#ifdef CARDINAL_INPUT_ONLY
+1 -1
View File
@@ -6,7 +6,7 @@ SEE_MOBS // can see all mobs, no matter what
SEE_OBJS // can see all objs, no matter what
SEE_TURFS // can see all turfs (and areas), no matter what
SEE_PIXELS// if an object is located on an unlit area, but some of its pixels are
// in a lit area (via pixel_x,y or smooth movement), can see those pixels
// in a lit area (via pixel_x,y or smooth movement), can see those pixels
BLIND // can't see anything
*/
///////////////////////////////////////////////////////////////////////
@@ -1,4 +1,4 @@
/obj/item/clothing/suit/straight_jacket //An addition from yawn wider
sprite_sheets = list(
SPECIES_TESHARI = 'icons/vore/custom_onmob_yw.dmi'
)
sprite_sheets = list(
SPECIES_TESHARI = 'icons/vore/custom_onmob_yw.dmi'
)
+5 -5
View File
@@ -2,11 +2,11 @@
#define COMPASS_PERIOD 15
#define COMPASS_LABEL_OFFSET 150
/*
This folder contains an abstract type (/obj/compass_holder) which contains a set of
waypoints (/datum/compass_waypoint) and generates a circular compass with markers for
mobs that have the object in their screen list. See GPS for an example implementation.
*/
/**
* This folder contains an abstract type (/obj/compass_holder) which contains a set of
* waypoints (/datum/compass_waypoint) and generates a circular compass with markers for
* mobs that have the object in their screen list. See GPS for an example implementation.
*/
/image/compass_marker
maptext_height = 64
@@ -145,9 +145,9 @@
emote_message_3p = "squeaks."
emote_sound = 'sound/items/drop/plushie.ogg'
/decl/emote/audible/mothscream
key = "mothscream"
emote_message_3p ="screams"
emote_sound = 'sound/voice/moth/scream_moth.ogg'
key = "mothscream"
emote_message_3p ="screams"
emote_sound = 'sound/voice/moth/scream_moth.ogg'
/decl/emote/audible/mothchitter
key = "mothchitter"
+14 -14
View File
@@ -17,20 +17,20 @@
// Requires Dantom.DB library ( http://www.byond.com/developer/Dantom/DB )
/*
The Library
------------
A place for the crew to go, relax, and enjoy a good book.
Aspiring authors can even self publish and, if they're lucky
convince the on-staff Librarian to submit it to the Archives
to be chronicled in history forever - some say even persisting
through alternate dimensions.
Written by TLE for /tg/station 13
Feel free to use this as you like. Some credit would be cool.
Check us out at http://nanotrasen.com/ if you're so inclined.
*/
/**
* The Library
* ------------
* A place for the crew to go, relax, and enjoy a good book.
* Aspiring authors can even self publish and, if they're lucky
* convince the on-staff Librarian to submit it to the Archives
* to be chronicled in history forever - some say even persisting
* through alternate dimensions.
*
*
* Written by TLE for /tg/station 13
* Feel free to use this as you like. Some credit would be cool.
* Check us out at http://nanotrasen.com/ if you're so inclined.
*/
// CONTAINS:
@@ -285,12 +285,12 @@
. = ..()
/**
* Called when someone slaps the machine with a mining voucher
*
* Arguments:
* * voucher - The voucher card item
* * redeemer - The person holding it
*/
* Called when someone slaps the machine with a mining voucher
*
* Arguments:
* * voucher - The voucher card item
* * redeemer - The person holding it
*/
/obj/machinery/mineral/equipment_vendor/proc/redeem_voucher(obj/item/mining_voucher/voucher, mob/redeemer)
var/selection = tgui_input_list(redeemer, "Pick your equipment", "Mining Voucher Redemption", list("Kinetic Accelerator", "Resonator", "Mining Drone", "Advanced Scanner", "Crusher"))
if(!selection || !Adjacent(redeemer) || voucher.loc != redeemer)
+51 -51
View File
@@ -1,51 +1,51 @@
// CREDITS
/*
Initial code credit for this goes to Uristqwerty.
Debugging, functionality, all comments and porting by Giacom.
Everything about freelook (or what we can put in here) will be stored here.
WHAT IS THIS?
This is a replacement for the current camera movement system, of the AI. Before this, the AI had to move between cameras and could
only see what the cameras could see. Not only this but the cameras could see through walls, which created problems.
With this, the AI controls an "AI Eye" mob, which moves just like a ghost; such as moving through walls and being invisible to players.
The AI's eye is set to this mob and then we use a system (explained below) to determine what the cameras around the AI Eye can and
cannot see. If the camera cannot see a turf, it will black it out, otherwise it won't and the AI will be able to see it.
This creates several features, such as.. no more see-through-wall cameras, easier to control camera movement, easier tracking,
the AI only being able to track mobs which are visible to a camera, only trackable mobs appearing on the mob list and many more.
HOW IT WORKS
It works by first creating a camera network datum. Inside of this camera network are "chunks" (which will be
explained later) and "cameras". The cameras list is kept up to date by obj/machinery/camera/New() and Destroy().
Next the camera network has chunks. These chunks are a 16x16 tile block of turfs and cameras contained inside the chunk.
These turfs are then sorted out based on what the cameras can and cannot see. If none of the cameras can see the turf, inside
the 16x16 block, it is listed as an "obscured" turf. Meaning the AI won't be able to see it.
HOW IT UPDATES
The camera network uses a streaming method in order to effeciently update chunks. Since the server will have doors opening, doors closing,
turf being destroyed and other lag inducing stuff, we want to update it under certain conditions and not every tick.
The chunks are not created straight away, only when an AI eye moves into it's area is when it gets created.
One a chunk is created, when a non glass door opens/closes or an opacity turf is destroyed, we check to see if an AI Eye is looking in the area.
We do this with the "seenby" list, which updates everytime an AI is near a chunk. If there is an AI eye inside the area, we update the chunk
that the changed atom is inside and all surrounding chunks, since a camera's vision could leak onto another chunk. If there is no AI Eye, we instead
flag the chunk to update whenever it is loaded by an AI Eye. This is basically how the chunks update and keep it in sync. We then add some lag reducing
measures, such as an UPDATE_BUFFER which stops a chunk from updating too many times in a certain time-frame, only updating if the changed atom was blocking
sight; for example, we don't update glass airlocks or floors.
WHERE IS EVERYTHING?
cameranet.dm = Everything about the cameranet datum.
chunk.dm = Everything about the chunk datum.
eye.dm = Everything about the AI and the AIEye.
updating.dm = Everything about triggers that will update chunks.
*/
// * CREDITS
/**
* Initial * code * credit * for * this * goes * to * Uristqwerty.
* Debugging, * functionality, * all * comments * and * porting * by * Giacom.
*
* Everything * about * freelook * (or * what * we * can * put * in * here) * will * be * stored * here.
*
*
* WHAT * IS * THIS?
*
* This * is * a * replacement * for * the * current * camera * movement * system, * of * the * AI. * Before * this, * the * AI * had * to * move * between * cameras * and * could
* only * see * what * the * cameras * could * see. * Not * only * this * but * the * cameras * could * see * through * walls, * which * created * problems.
* With * this, * the * AI * controls * an * "AI * Eye" * mob, * which * moves * just * like * a * ghost; * such * as * moving * through * walls * and * being * invisible * to * players.
* The * AI's * eye * is * set * to * this * mob * and * then * we * use * a * system * (explained * below) * to * determine * what * the * cameras * around * the * AI * Eye * can * and
* cannot * see. * If * the * camera * cannot * see * a * turf, * it * will * black * it * out, * otherwise * it * won't * and * the * AI * will * be * able * to * see * it.
* This * creates * several * features, * such * as.. * no * more * see-through-wall * cameras, * easier * to * control * camera * movement, * easier * tracking,
* the * AI * only * being * able * to * track * mobs * which * are * visible * to * a * camera, * only * trackable * mobs * appearing * on * the * mob * list * and * many * more.
*
*
* HOW * IT * WORKS
*
* It * works * by * first * creating * a * camera * network * datum. * Inside * of * this * camera * network * are * "chunks" * (which * will * be
* explained * later) * and * "cameras". * The * cameras * list * is * kept * up * to * date * by * obj/machinery/camera/New() * and * Destroy().
*
* Next * the * camera * network * has * chunks. * These * chunks * are * a * 16x16 * tile * block * of * turfs * and * cameras * contained * inside * the * chunk.
* These * turfs * are * then * sorted * out * based * on * what * the * cameras * can * and * cannot * see. * If * none * of * the * cameras * can * see * the * turf, * inside
* the * 16x16 * block, * it * is * listed * as * an * "obscured" * turf. * Meaning * the * AI * won't * be * able * to * see * it.
*
*
* HOW * IT * UPDATES
*
* The * camera * network * uses * a * streaming * method * in * order * to * effeciently * update * chunks. * Since * the * server * will * have * doors * opening, * doors * closing,
* turf * being * destroyed * and * other * lag * inducing * stuff, * we * want * to * update * it * under * certain * conditions * and * not * every * tick.
*
* The * chunks * are * not * created * straight * away, * only * when * an * AI * eye * moves * into * it's * area * is * when * it * gets * created.
* One * a * chunk * is * created, * when * a * non * glass * door * opens/closes * or * an * opacity * turf * is * destroyed, * we * check * to * see * if * an * AI * Eye * is * looking * in * the * area.
* We * do * this * with * the * "seenby" * list, * which * updates * everytime * an * AI * is * near * a * chunk. * If * there * is * an * AI * eye * inside * the * area, * we * update * the * chunk
* that * the * changed * atom * is * inside * and * all * surrounding * chunks, * since * a * camera's * vision * could * leak * onto * another * chunk. * If * there * is * no * AI * Eye, * we * instead
* flag * the * chunk * to * update * whenever * it * is * loaded * by * an * AI * Eye. * This * is * basically * how * the * chunks * update * and * keep * it * in * sync. * We * then * add * some * lag * reducing
* measures, * such * as * an * UPDATE_BUFFER * which * stops * a * chunk * from * updating * too * many * times * in * a * certain * time-frame, * only * updating * if * the * changed * atom * was * blocking
* sight; * for * example, * we * don't * update * glass * airlocks * or * floors.
*
*
* WHERE * IS * EVERYTHING?
*
* cameranet.dm = Everything * about * the * cameranet * datum.
* chunk.dm = Everything * about * the * chunk * datum.
* eye.dm = Everything * about * the * AI * and * the * AIEye.
* updating.dm = Everything * about * triggers * that * will * update * chunks.
*
*/
+59 -59
View File
@@ -24,8 +24,8 @@
key = "0"
flags = RESTRICTED
syllables = list(
"vol", "zum", "coo","zoo","bi","do","ooz","ite","og","re","si","ite","ish",
"ar","at","on","ee","east","ma","da", "rim")
"vol", "zum", "coo","zoo","bi","do","ooz","ite","og","re","si","ite","ish",
"ar","at","on","ee","east","ma","da", "rim")
partial_understanding = list(LANGUAGE_SKRELLIAN = 30, LANGUAGE_SOL_COMMON = 30)
//TODO flag certain languages to use the mob-type specific say_quote and then get rid of these.
@@ -45,11 +45,11 @@
colour = "say_quote"
key = "2"
syllables = list(
"fea","vea","vei","veh","vee","feh","fa","soa","su","sua","sou","se","seh","twa","twe","twi",
"ahm","lea","lee","nae","nah","pa","pau","fae","fai","soh","mou","ahe","ll","ea","ai","thi",
"hie","zei","zie","ize","ehy","uy","oya","dor","di","ja","ej","er","um","in","qu","is","re",
"nt","ti","us","it","en","at","tu","te","ri","es","et","ra","ta","an","ni","li","on","or","se",
"am","ae","ia","di","ue","em","ar","ui","st","si","de","ci","iu","ne","pe","co","os","ur","ru")
"fea","vea","vei","veh","vee","feh","fa","soa","su","sua","sou","se","seh","twa","twe","twi",
"ahm","lea","lee","nae","nah","pa","pau","fae","fai","soh","mou","ahe","ll","ea","ai","thi",
"hie","zei","zie","ize","ehy","uy","oya","dor","di","ja","ej","er","um","in","qu","is","re",
"nt","ti","us","it","en","at","tu","te","ri","es","et","ra","ta","an","ni","li","on","or","se",
"am","ae","ia","di","ue","em","ar","ui","st","si","de","ci","iu","ne","pe","co","os","ur","ru")
/datum/language/terminus
name = LANGUAGE_TERMINUS
@@ -61,8 +61,8 @@
// flags = WHITELISTED (VOREstation edit)
// partial_understanding = list(LANGUAGE_SOL_COMMON = 20) (VOREStation Edit: It is a Zorren language now)
syllables = list (".a", "spa", "pan", "blaif", "stra", "!u", "!ei", "!am", "by", ".y", "gry", "zbly", "!y", "fl",
"sm", "rn", "cpi", "ku", "koi", "pr", "glau", "stu", "ved", "ki", "tsa", "xau", "jbu", "sny", "stro", "nu",
"uan", "ju", "!i", "ge", "luk", "an", "ar", "at", "es", "et", "bel", "ki", "jaa", "ch", "ki", "gh", "ll", "uu", "wat")
"sm", "rn", "cpi", "ku", "koi", "pr", "glau", "stu", "ved", "ki", "tsa", "xau", "jbu", "sny", "stro", "nu",
"uan", "ju", "!i", "ge", "luk", "an", "ar", "at", "es", "et", "bel", "ki", "jaa", "ch", "ki", "gh", "ll", "uu", "wat")
// Criminal language.
/datum/language/gutter
@@ -74,56 +74,56 @@
space_chance = 45
partial_understanding = list(LANGUAGE_GALCOM = 10, LANGUAGE_TRADEBAND = 20, LANGUAGE_SOL_COMMON = 20)
syllables = list (
"gra","ba","ba","breh","bra","rah","dur","ra","ro","gro","go","ber","bar","geh","heh", "gra",
"a", "ai", "an", "ang", "ao", "ba", "bai", "ban", "bang", "bao", "bei", "ben", "beng", "bi", "bian", "biao",
"bie", "bin", "bing", "bo", "bu", "ca", "cai", "can", "cang", "cao", "ce", "cei", "cen", "ceng", "cha", "chai",
"chan", "chang", "chao", "che", "chen", "cheng", "chi", "chong", "chou", "chu", "chua", "chuai", "chuan", "chuang", "chui", "chun",
"chuo", "ci", "cong", "cou", "cu", "cuan", "cui", "cun", "cuo", "da", "dai", "dan", "dang", "dao", "de", "dei",
"den", "deng", "di", "dian", "diao", "die", "ding", "diu", "dong", "dou", "du", "duan", "dui", "dun", "duo", "e",
"ei", "en", "er", "fa", "fan", "fang", "fei", "fen", "feng", "fo", "fou", "fu", "ga", "gai", "gan", "gang",
"gao", "ge", "gei", "gen", "geng", "gong", "gou", "gu", "gua", "guai", "guan", "guang", "gui", "gun", "guo", "ha",
"hai", "han", "hang", "hao", "he", "hei", "hen", "heng", "hm", "hng", "hong", "hou", "hu", "hua", "huai", "huan",
"huang", "hui", "hun", "huo", "ji", "jia", "jian", "jiang", "jiao", "jie", "jin", "jing", "jiong", "jiu", "ju", "juan",
"jue", "jun", "ka", "kai", "kan", "kang", "kao", "ke", "kei", "ken", "keng", "kong", "kou", "ku", "kua", "kuai",
"kuan", "kuang", "kui", "kun", "kuo", "la", "lai", "lan", "lang", "lao", "le", "lei", "leng", "li", "lia", "lian",
"liang", "liao", "lie", "lin", "ling", "liu", "long", "lou", "lu", "luan", "lun", "luo", "ma", "mai", "man", "mang",
"mao", "me", "mei", "men", "meng", "mi", "mian", "miao", "mie", "min", "ming", "miu", "mo", "mou", "mu", "na",
"nai", "nan", "nang", "nao", "ne", "nei", "nen", "neng", "ng", "ni", "nian", "niang", "niao", "nie", "nin", "ning",
"niu", "nong", "nou", "nu", "nuan", "nuo", "o", "ou", "pa", "pai", "pan", "pang", "pao", "pei", "pen", "peng",
"pi", "pian", "piao", "pie", "pin", "ping", "po", "pou", "pu", "qi", "qia", "qian", "qiang", "qiao", "qie", "qin",
"qing", "qiong", "qiu", "qu", "quan", "que", "qun", "ran", "rang", "rao", "re", "ren", "reng", "ri", "rong", "rou",
"ru", "rua", "ruan", "rui", "run", "ruo", "sa", "sai", "san", "sang", "sao", "se", "sei", "sen", "seng", "sha",
"shai", "shan", "shang", "shao", "she", "shei", "shen", "sheng", "shi", "shou", "shu", "shua", "shuai", "shuan", "shuang", "shui",
"shun", "shuo", "si", "song", "sou", "su", "suan", "sui", "sun", "suo", "ta", "tai", "tan", "tang", "tao", "te",
"teng", "ti", "tian", "tiao", "tie", "ting", "tong", "tou", "tu", "tuan", "tui", "tun", "tuo", "wa", "wai", "wan",
"wang", "wei", "wen", "weng", "wo", "wu", "xi", "xia", "xian", "xiang", "xiao", "xie", "xin", "xing", "xiong", "xiu",
"xu", "xuan", "xue", "xun", "ya", "yan", "yang", "yao", "ye", "yi", "yin", "ying", "yong", "you", "yu", "yuan",
"yue", "yun", "za", "zai", "zan", "zang", "zao", "ze", "zei", "zen", "zeng", "zha", "zhai", "zhan", "zhang", "zhao",
"zhe", "zhei", "zhen", "zheng", "zhi", "zhong", "zhou", "zhu", "zhua", "zhuai", "zhuan", "zhuang", "zhui", "zhun", "zhuo", "zi",
"zong", "zou", "zuan", "zui", "zun", "zuo", "zu", "al", "an", "ar", "as", "at", "ea", "ed", "en", "er", "es", "ha", "he", "hi", "in", "is", "it",
"le", "me", "nd", "ne", "ng", "nt", "on", "or", "ou", "re", "se", "st", "te", "th", "ti", "to",
"ve", "wa", "all", "and", "are", "but", "ent", "era", "ere", "eve", "for", "had", "hat", "hen", "her", "hin",
"his", "ing", "ion", "ith", "not", "ome", "oul", "our", "sho", "ted", "ter", "tha", "the", "thi",
"al", "an", "ar", "as", "at", "ea", "ed", "en", "er", "es", "ha", "he", "hi", "in", "is", "it",
"le", "me", "nd", "ne", "ng", "nt", "on", "or", "ou", "re", "se", "st", "te", "th", "ti", "to",
"ve", "wa", "all", "and", "are", "but", "ent", "era", "ere", "eve", "for", "had", "hat", "hen", "her", "hin",
"his", "ing", "ion", "ith", "not", "ome", "oul", "our", "sho", "ted", "ter", "tha", "the", "thi",
"al", "an", "ar", "as", "at", "ea", "ed", "en", "er", "es", "ha", "he", "hi", "in", "is", "it",
"le", "me", "nd", "ne", "ng", "nt", "on", "or", "ou", "re", "se", "st", "te", "th", "ti", "to",
"ve", "wa", "all", "and", "are", "but", "ent", "era", "ere", "eve", "for", "had", "hat", "hen", "her", "hin",
"his", "ing", "ion", "ith", "not", "ome", "oul", "our", "sho", "ted", "ter", "tha", "the", "thi",
"al", "an", "ar", "as", "at", "ea", "ed", "en", "er", "es", "ha", "he", "hi", "in", "is", "it",
"le", "me", "nd", "ne", "ng", "nt", "on", "or", "ou", "re", "se", "st", "te", "th", "ti", "to",
"ve", "wa", "all", "and", "are", "but", "ent", "era", "ere", "eve", "for", "had", "hat", "hen", "her", "hin",
"his", "ing", "ion", "ith", "not", "ome", "oul", "our", "sho", "ted", "ter", "tha", "the", "thi",
"al", "an", "ar", "as", "at", "ea", "ed", "en", "er", "es", "ha", "he", "hi", "in", "is", "it",
"le", "me", "nd", "ne", "ng", "nt", "on", "or", "ou", "re", "se", "st", "te", "th", "ti", "to",
"ve", "wa", "all", "and", "are", "but", "ent", "era", "ere", "eve", "for", "had", "hat", "hen", "her", "hin",
"his", "ing", "ion", "ith", "not", "ome", "oul", "our", "sho", "ted", "ter", "tha", "the", "thi",
"al", "an", "ar", "as", "at", "ea", "ed", "en", "er", "es", "ha", "he", "hi", "in", "is", "it",
"le", "me", "nd", "ne", "ng", "nt", "on", "or", "ou", "re", "se", "st", "te", "th", "ti", "to",
"ve", "wa", "all", "and", "are", "but", "ent", "era", "ere", "eve", "for", "had", "hat", "hen", "her", "hin",
"his", "ing", "ion", "ith", "not", "ome", "oul", "our", "sho", "ted", "ter", "tha", "the", "thi")
"gra","ba","ba","breh","bra","rah","dur","ra","ro","gro","go","ber","bar","geh","heh", "gra",
"a", "ai", "an", "ang", "ao", "ba", "bai", "ban", "bang", "bao", "bei", "ben", "beng", "bi", "bian", "biao",
"bie", "bin", "bing", "bo", "bu", "ca", "cai", "can", "cang", "cao", "ce", "cei", "cen", "ceng", "cha", "chai",
"chan", "chang", "chao", "che", "chen", "cheng", "chi", "chong", "chou", "chu", "chua", "chuai", "chuan", "chuang", "chui", "chun",
"chuo", "ci", "cong", "cou", "cu", "cuan", "cui", "cun", "cuo", "da", "dai", "dan", "dang", "dao", "de", "dei",
"den", "deng", "di", "dian", "diao", "die", "ding", "diu", "dong", "dou", "du", "duan", "dui", "dun", "duo", "e",
"ei", "en", "er", "fa", "fan", "fang", "fei", "fen", "feng", "fo", "fou", "fu", "ga", "gai", "gan", "gang",
"gao", "ge", "gei", "gen", "geng", "gong", "gou", "gu", "gua", "guai", "guan", "guang", "gui", "gun", "guo", "ha",
"hai", "han", "hang", "hao", "he", "hei", "hen", "heng", "hm", "hng", "hong", "hou", "hu", "hua", "huai", "huan",
"huang", "hui", "hun", "huo", "ji", "jia", "jian", "jiang", "jiao", "jie", "jin", "jing", "jiong", "jiu", "ju", "juan",
"jue", "jun", "ka", "kai", "kan", "kang", "kao", "ke", "kei", "ken", "keng", "kong", "kou", "ku", "kua", "kuai",
"kuan", "kuang", "kui", "kun", "kuo", "la", "lai", "lan", "lang", "lao", "le", "lei", "leng", "li", "lia", "lian",
"liang", "liao", "lie", "lin", "ling", "liu", "long", "lou", "lu", "luan", "lun", "luo", "ma", "mai", "man", "mang",
"mao", "me", "mei", "men", "meng", "mi", "mian", "miao", "mie", "min", "ming", "miu", "mo", "mou", "mu", "na",
"nai", "nan", "nang", "nao", "ne", "nei", "nen", "neng", "ng", "ni", "nian", "niang", "niao", "nie", "nin", "ning",
"niu", "nong", "nou", "nu", "nuan", "nuo", "o", "ou", "pa", "pai", "pan", "pang", "pao", "pei", "pen", "peng",
"pi", "pian", "piao", "pie", "pin", "ping", "po", "pou", "pu", "qi", "qia", "qian", "qiang", "qiao", "qie", "qin",
"qing", "qiong", "qiu", "qu", "quan", "que", "qun", "ran", "rang", "rao", "re", "ren", "reng", "ri", "rong", "rou",
"ru", "rua", "ruan", "rui", "run", "ruo", "sa", "sai", "san", "sang", "sao", "se", "sei", "sen", "seng", "sha",
"shai", "shan", "shang", "shao", "she", "shei", "shen", "sheng", "shi", "shou", "shu", "shua", "shuai", "shuan", "shuang", "shui",
"shun", "shuo", "si", "song", "sou", "su", "suan", "sui", "sun", "suo", "ta", "tai", "tan", "tang", "tao", "te",
"teng", "ti", "tian", "tiao", "tie", "ting", "tong", "tou", "tu", "tuan", "tui", "tun", "tuo", "wa", "wai", "wan",
"wang", "wei", "wen", "weng", "wo", "wu", "xi", "xia", "xian", "xiang", "xiao", "xie", "xin", "xing", "xiong", "xiu",
"xu", "xuan", "xue", "xun", "ya", "yan", "yang", "yao", "ye", "yi", "yin", "ying", "yong", "you", "yu", "yuan",
"yue", "yun", "za", "zai", "zan", "zang", "zao", "ze", "zei", "zen", "zeng", "zha", "zhai", "zhan", "zhang", "zhao",
"zhe", "zhei", "zhen", "zheng", "zhi", "zhong", "zhou", "zhu", "zhua", "zhuai", "zhuan", "zhuang", "zhui", "zhun", "zhuo", "zi",
"zong", "zou", "zuan", "zui", "zun", "zuo", "zu", "al", "an", "ar", "as", "at", "ea", "ed", "en", "er", "es", "ha", "he", "hi", "in", "is", "it",
"le", "me", "nd", "ne", "ng", "nt", "on", "or", "ou", "re", "se", "st", "te", "th", "ti", "to",
"ve", "wa", "all", "and", "are", "but", "ent", "era", "ere", "eve", "for", "had", "hat", "hen", "her", "hin",
"his", "ing", "ion", "ith", "not", "ome", "oul", "our", "sho", "ted", "ter", "tha", "the", "thi",
"al", "an", "ar", "as", "at", "ea", "ed", "en", "er", "es", "ha", "he", "hi", "in", "is", "it",
"le", "me", "nd", "ne", "ng", "nt", "on", "or", "ou", "re", "se", "st", "te", "th", "ti", "to",
"ve", "wa", "all", "and", "are", "but", "ent", "era", "ere", "eve", "for", "had", "hat", "hen", "her", "hin",
"his", "ing", "ion", "ith", "not", "ome", "oul", "our", "sho", "ted", "ter", "tha", "the", "thi",
"al", "an", "ar", "as", "at", "ea", "ed", "en", "er", "es", "ha", "he", "hi", "in", "is", "it",
"le", "me", "nd", "ne", "ng", "nt", "on", "or", "ou", "re", "se", "st", "te", "th", "ti", "to",
"ve", "wa", "all", "and", "are", "but", "ent", "era", "ere", "eve", "for", "had", "hat", "hen", "her", "hin",
"his", "ing", "ion", "ith", "not", "ome", "oul", "our", "sho", "ted", "ter", "tha", "the", "thi",
"al", "an", "ar", "as", "at", "ea", "ed", "en", "er", "es", "ha", "he", "hi", "in", "is", "it",
"le", "me", "nd", "ne", "ng", "nt", "on", "or", "ou", "re", "se", "st", "te", "th", "ti", "to",
"ve", "wa", "all", "and", "are", "but", "ent", "era", "ere", "eve", "for", "had", "hat", "hen", "her", "hin",
"his", "ing", "ion", "ith", "not", "ome", "oul", "our", "sho", "ted", "ter", "tha", "the", "thi",
"al", "an", "ar", "as", "at", "ea", "ed", "en", "er", "es", "ha", "he", "hi", "in", "is", "it",
"le", "me", "nd", "ne", "ng", "nt", "on", "or", "ou", "re", "se", "st", "te", "th", "ti", "to",
"ve", "wa", "all", "and", "are", "but", "ent", "era", "ere", "eve", "for", "had", "hat", "hen", "her", "hin",
"his", "ing", "ion", "ith", "not", "ome", "oul", "our", "sho", "ted", "ter", "tha", "the", "thi",
"al", "an", "ar", "as", "at", "ea", "ed", "en", "er", "es", "ha", "he", "hi", "in", "is", "it",
"le", "me", "nd", "ne", "ng", "nt", "on", "or", "ou", "re", "se", "st", "te", "th", "ti", "to",
"ve", "wa", "all", "and", "are", "but", "ent", "era", "ere", "eve", "for", "had", "hat", "hen", "her", "hin",
"his", "ing", "ion", "ith", "not", "ome", "oul", "our", "sho", "ted", "ter", "tha", "the", "thi")
/datum/language/sign
name = LANGUAGE_SIGN
+83 -83
View File
@@ -35,12 +35,12 @@
space_chance = 40
syllables = list(
"za", "az", "ze", "ez", "zi", "iz", "zo", "oz", "zu", "uz", "zs", "sz",
"ha", "ah", "he", "eh", "hi", "ih", "ho", "oh", "hu", "uh", "hs", "sh",
"la", "al", "le", "el", "li", "il", "lo", "ol", "lu", "ul", "ls", "sl",
"ka", "ak", "ke", "ek", "ki", "ik", "ko", "ok", "ku", "uk", "ks", "sk",
"sa", "as", "se", "es", "si", "is", "so", "os", "su", "us", "ss", "ss",
"ra", "ar", "re", "er", "ri", "ir", "ro", "or", "ru", "ur", "rs", "sr",
"a", "a", "e", "e", "i", "i", "o", "o", "u", "u", "s", "s"
"ha", "ah", "he", "eh", "hi", "ih", "ho", "oh", "hu", "uh", "hs", "sh",
"la", "al", "le", "el", "li", "il", "lo", "ol", "lu", "ul", "ls", "sl",
"ka", "ak", "ke", "ek", "ki", "ik", "ko", "ok", "ku", "uk", "ks", "sk",
"sa", "as", "se", "es", "si", "is", "so", "os", "su", "us", "ss", "ss",
"ra", "ar", "re", "er", "ri", "ir", "ro", "or", "ru", "ur", "rs", "sr",
"a", "a", "e", "e", "i", "i", "o", "o", "u", "u", "s", "s"
)
/datum/language/unathi/get_random_name()
@@ -236,80 +236,80 @@
http://www.chinahighlights.com/travelguide/learning-chinese/pinyin-syllables.htm
*/
/datum/language/human/syllables = list(
"a", "ai", "an", "ang", "ao", "ba", "bai", "ban", "bang", "bao", "bei", "ben", "beng", "bi", "bian", "biao",
"bie", "bin", "bing", "bo", "bu", "ca", "cai", "can", "cang", "cao", "ce", "cei", "cen", "ceng", "cha", "chai",
"chan", "chang", "chao", "che", "chen", "cheng", "chi", "chong", "chou", "chu", "chua", "chuai", "chuan", "chuang", "chui", "chun",
"chuo", "ci", "cong", "cou", "cu", "cuan", "cui", "cun", "cuo", "da", "dai", "dan", "dang", "dao", "de", "dei",
"den", "deng", "di", "dian", "diao", "die", "ding", "diu", "dong", "dou", "du", "duan", "dui", "dun", "duo", "e",
"ei", "en", "er", "fa", "fan", "fang", "fei", "fen", "feng", "fo", "fou", "fu", "ga", "gai", "gan", "gang",
"gao", "ge", "gei", "gen", "geng", "gong", "gou", "gu", "gua", "guai", "guan", "guang", "gui", "gun", "guo", "ha",
"hai", "han", "hang", "hao", "he", "hei", "hen", "heng", "hm", "hng", "hong", "hou", "hu", "hua", "huai", "huan",
"huang", "hui", "hun", "huo", "ji", "jia", "jian", "jiang", "jiao", "jie", "jin", "jing", "jiong", "jiu", "ju", "juan",
"jue", "jun", "ka", "kai", "kan", "kang", "kao", "ke", "kei", "ken", "keng", "kong", "kou", "ku", "kua", "kuai",
"kuan", "kuang", "kui", "kun", "kuo", "la", "lai", "lan", "lang", "lao", "le", "lei", "leng", "li", "lia", "lian",
"liang", "liao", "lie", "lin", "ling", "liu", "long", "lou", "lu", "luan", "lun", "luo", "ma", "mai", "man", "mang",
"mao", "me", "mei", "men", "meng", "mi", "mian", "miao", "mie", "min", "ming", "miu", "mo", "mou", "mu", "na",
"nai", "nan", "nang", "nao", "ne", "nei", "nen", "neng", "ng", "ni", "nian", "niang", "niao", "nie", "nin", "ning",
"niu", "nong", "nou", "nu", "nuan", "nuo", "o", "ou", "pa", "pai", "pan", "pang", "pao", "pei", "pen", "peng",
"pi", "pian", "piao", "pie", "pin", "ping", "po", "pou", "pu", "qi", "qia", "qian", "qiang", "qiao", "qie", "qin",
"qing", "qiong", "qiu", "qu", "quan", "que", "qun", "ran", "rang", "rao", "re", "ren", "reng", "ri", "rong", "rou",
"ru", "rua", "ruan", "rui", "run", "ruo", "sa", "sai", "san", "sang", "sao", "se", "sei", "sen", "seng", "sha",
"shai", "shan", "shang", "shao", "she", "shei", "shen", "sheng", "shi", "shou", "shu", "shua", "shuai", "shuan", "shuang", "shui",
"shun", "shuo", "si", "song", "sou", "su", "suan", "sui", "sun", "suo", "ta", "tai", "tan", "tang", "tao", "te",
"teng", "ti", "tian", "tiao", "tie", "ting", "tong", "tou", "tu", "tuan", "tui", "tun", "tuo", "wa", "wai", "wan",
"wang", "wei", "wen", "weng", "wo", "wu", "xi", "xia", "xian", "xiang", "xiao", "xie", "xin", "xing", "xiong", "xiu",
"xu", "xuan", "xue", "xun", "ya", "yan", "yang", "yao", "ye", "yi", "yin", "ying", "yong", "you", "yu", "yuan",
"yue", "yun", "za", "zai", "zan", "zang", "zao", "ze", "zei", "zen", "zeng", "zha", "zhai", "zhan", "zhang", "zhao",
"zhe", "zhei", "zhen", "zheng", "zhi", "zhong", "zhou", "zhu", "zhua", "zhuai", "zhuan", "zhuang", "zhui", "zhun", "zhuo", "zi",
"zong", "zou", "zuan", "zui", "zun", "zuo", "zu",
"al", "an", "ar", "as", "at", "ea", "ed", "en", "er", "es", "ha", "he", "hi", "in", "is", "it",
"le", "me", "nd", "ne", "ng", "nt", "on", "or", "ou", "re", "se", "st", "te", "th", "ti", "to",
"ve", "wa", "all", "and", "are", "but", "ent", "era", "ere", "eve", "for", "had", "hat", "hen", "her", "hin",
"his", "ing", "ion", "ith", "not", "ome", "oul", "our", "sho", "ted", "ter", "tha", "the", "thi",
"al", "an", "ar", "as", "at", "ea", "ed", "en", "er", "es", "ha", "he", "hi", "in", "is", "it",
"le", "me", "nd", "ne", "ng", "nt", "on", "or", "ou", "re", "se", "st", "te", "th", "ti", "to",
"ve", "wa", "all", "and", "are", "but", "ent", "era", "ere", "eve", "for", "had", "hat", "hen", "her", "hin",
"his", "ing", "ion", "ith", "not", "ome", "oul", "our", "sho", "ted", "ter", "tha", "the", "thi",
"al", "an", "ar", "as", "at", "ea", "ed", "en", "er", "es", "ha", "he", "hi", "in", "is", "it",
"le", "me", "nd", "ne", "ng", "nt", "on", "or", "ou", "re", "se", "st", "te", "th", "ti", "to",
"ve", "wa", "all", "and", "are", "but", "ent", "era", "ere", "eve", "for", "had", "hat", "hen", "her", "hin",
"his", "ing", "ion", "ith", "not", "ome", "oul", "our", "sho", "ted", "ter", "tha", "the", "thi",
"al", "an", "ar", "as", "at", "ea", "ed", "en", "er", "es", "ha", "he", "hi", "in", "is", "it",
"le", "me", "nd", "ne", "ng", "nt", "on", "or", "ou", "re", "se", "st", "te", "th", "ti", "to",
"ve", "wa", "all", "and", "are", "but", "ent", "era", "ere", "eve", "for", "had", "hat", "hen", "her", "hin",
"his", "ing", "ion", "ith", "not", "ome", "oul", "our", "sho", "ted", "ter", "tha", "the", "thi",
"al", "an", "ar", "as", "at", "ea", "ed", "en", "er", "es", "ha", "he", "hi", "in", "is", "it",
"le", "me", "nd", "ne", "ng", "nt", "on", "or", "ou", "re", "se", "st", "te", "th", "ti", "to",
"ve", "wa", "all", "and", "are", "but", "ent", "era", "ere", "eve", "for", "had", "hat", "hen", "her", "hin",
"his", "ing", "ion", "ith", "not", "ome", "oul", "our", "sho", "ted", "ter", "tha", "the", "thi",
"al", "an", "ar", "as", "at", "ea", "ed", "en", "er", "es", "ha", "he", "hi", "in", "is", "it",
"le", "me", "nd", "ne", "ng", "nt", "on", "or", "ou", "re", "se", "st", "te", "th", "ti", "to",
"ve", "wa", "all", "and", "are", "but", "ent", "era", "ere", "eve", "for", "had", "hat", "hen", "her", "hin",
"his", "ing", "ion", "ith", "not", "ome", "oul", "our", "sho", "ted", "ter", "tha", "the", "thi",
"ah", "be", "bo", "eh", "ep", "et", "ka", "ko", "ha", "he", "ho", "ob", "oh", "op", "oc", "ot", "pa", "pe", "ct", "ta", "te", "to",
"vse", "tak", "nak", "no", "epo", "pre", "kan", "dly", "ime", "sha", "kur", "yey", "khi", "yeg", "ne",
"ion", "ne", "nas", "v",
"ah", "be", "bo", "eh", "ep", "et", "ka", "ko", "ha", "he", "ho", "ob", "oh", "op", "oc", "ot", "pa", "pe", "ct", "ta", "te", "to",
"vse", "tak", "nak", "no", "epo", "pre", "kan", "dly", "ime", "sha", "kur", "yey", "khi", "yeg", "ne",
"ion", "ne", "nas", "v",
"ah", "be", "bo", "eh", "ep", "et", "ka", "ko", "ha", "he", "ho", "ob", "oh", "op", "oc", "ot", "pa", "pe", "ct", "ta", "te", "to",
"vse", "tak", "nak", "no", "epo", "pre", "kan", "dly", "ime", "sha", "kur", "yey", "khi", "yeg", "ne",
"ion", "ne", "nas", "v",
"ai", "an", "ar", "au", "ce", "ch", "co", "de", "em", "en", "er", "es", "et", "eu", "il", "in", "is", "la", "le",
"ma", "me", "ne", "ns", "nt", "on", "ou", "pa", "qu", "ra", "re", "se", "te", "ti", "tr", "ue", "ur", "us", "ve",
"tou", "e", "eve", "hen", "son", "non", "not", "le",
"ai", "an", "ar", "au", "ce", "ch", "co", "de", "em", "en", "er", "es", "et", "eu", "il", "in", "is", "la", "le",
"ma", "me", "ne", "ns", "nt", "on", "ou", "pa", "qu", "ra", "re", "se", "te", "ti", "tr", "ue", "ur", "us", "ve",
"tou", "e", "eve", "hen", "son", "non", "not", "le",
"ai", "an", "ar", "au", "ce", "ch", "co", "de", "em", "en", "er", "es", "et", "eu", "il", "in", "is", "la", "le",
"ma", "me", "ne", "ns", "nt", "on", "ou", "pa", "qu", "ra", "re", "se", "te", "ti", "tr", "ue", "ur", "us", "ve",
"tou", "e", "eve", "hen", "son", "non", "not", "le",
"ad", "al", "an", "ar", "as", "ci", "co", "de", "do", "el", "en", "er", "es", "ie", "in", "la", "lo", "me", "na",
"no", "nt", "or", "os", "pa", "qu", "ra", "re", "ro", "se", "st", "ta", "te", "to", "ue", "un",
"tod", "ser", "su", "no", "nue", "el",
"ad", "al", "an", "ar", "as", "ci", "co", "de", "do", "el", "en", "er", "es", "ie", "in", "la", "lo", "me", "na",
"no", "nt", "or", "os", "pa", "qu", "ra", "re", "ro", "se", "st", "ta", "te", "to", "ue", "un",
"tod", "ser", "su", "no", "nue", "el",
"ad", "al", "an", "ar", "as", "ci", "co", "de", "do", "el", "en", "er", "es", "ie", "in", "la", "lo", "me", "na",
"no", "nt", "or", "os", "pa", "qu", "ra", "re", "ro", "se", "st", "ta", "te", "to", "ue", "un",
"tod", "ser", "su", "no", "nue", "el")
"a", "ai", "an", "ang", "ao", "ba", "bai", "ban", "bang", "bao", "bei", "ben", "beng", "bi", "bian", "biao",
"bie", "bin", "bing", "bo", "bu", "ca", "cai", "can", "cang", "cao", "ce", "cei", "cen", "ceng", "cha", "chai",
"chan", "chang", "chao", "che", "chen", "cheng", "chi", "chong", "chou", "chu", "chua", "chuai", "chuan", "chuang", "chui", "chun",
"chuo", "ci", "cong", "cou", "cu", "cuan", "cui", "cun", "cuo", "da", "dai", "dan", "dang", "dao", "de", "dei",
"den", "deng", "di", "dian", "diao", "die", "ding", "diu", "dong", "dou", "du", "duan", "dui", "dun", "duo", "e",
"ei", "en", "er", "fa", "fan", "fang", "fei", "fen", "feng", "fo", "fou", "fu", "ga", "gai", "gan", "gang",
"gao", "ge", "gei", "gen", "geng", "gong", "gou", "gu", "gua", "guai", "guan", "guang", "gui", "gun", "guo", "ha",
"hai", "han", "hang", "hao", "he", "hei", "hen", "heng", "hm", "hng", "hong", "hou", "hu", "hua", "huai", "huan",
"huang", "hui", "hun", "huo", "ji", "jia", "jian", "jiang", "jiao", "jie", "jin", "jing", "jiong", "jiu", "ju", "juan",
"jue", "jun", "ka", "kai", "kan", "kang", "kao", "ke", "kei", "ken", "keng", "kong", "kou", "ku", "kua", "kuai",
"kuan", "kuang", "kui", "kun", "kuo", "la", "lai", "lan", "lang", "lao", "le", "lei", "leng", "li", "lia", "lian",
"liang", "liao", "lie", "lin", "ling", "liu", "long", "lou", "lu", "luan", "lun", "luo", "ma", "mai", "man", "mang",
"mao", "me", "mei", "men", "meng", "mi", "mian", "miao", "mie", "min", "ming", "miu", "mo", "mou", "mu", "na",
"nai", "nan", "nang", "nao", "ne", "nei", "nen", "neng", "ng", "ni", "nian", "niang", "niao", "nie", "nin", "ning",
"niu", "nong", "nou", "nu", "nuan", "nuo", "o", "ou", "pa", "pai", "pan", "pang", "pao", "pei", "pen", "peng",
"pi", "pian", "piao", "pie", "pin", "ping", "po", "pou", "pu", "qi", "qia", "qian", "qiang", "qiao", "qie", "qin",
"qing", "qiong", "qiu", "qu", "quan", "que", "qun", "ran", "rang", "rao", "re", "ren", "reng", "ri", "rong", "rou",
"ru", "rua", "ruan", "rui", "run", "ruo", "sa", "sai", "san", "sang", "sao", "se", "sei", "sen", "seng", "sha",
"shai", "shan", "shang", "shao", "she", "shei", "shen", "sheng", "shi", "shou", "shu", "shua", "shuai", "shuan", "shuang", "shui",
"shun", "shuo", "si", "song", "sou", "su", "suan", "sui", "sun", "suo", "ta", "tai", "tan", "tang", "tao", "te",
"teng", "ti", "tian", "tiao", "tie", "ting", "tong", "tou", "tu", "tuan", "tui", "tun", "tuo", "wa", "wai", "wan",
"wang", "wei", "wen", "weng", "wo", "wu", "xi", "xia", "xian", "xiang", "xiao", "xie", "xin", "xing", "xiong", "xiu",
"xu", "xuan", "xue", "xun", "ya", "yan", "yang", "yao", "ye", "yi", "yin", "ying", "yong", "you", "yu", "yuan",
"yue", "yun", "za", "zai", "zan", "zang", "zao", "ze", "zei", "zen", "zeng", "zha", "zhai", "zhan", "zhang", "zhao",
"zhe", "zhei", "zhen", "zheng", "zhi", "zhong", "zhou", "zhu", "zhua", "zhuai", "zhuan", "zhuang", "zhui", "zhun", "zhuo", "zi",
"zong", "zou", "zuan", "zui", "zun", "zuo", "zu",
"al", "an", "ar", "as", "at", "ea", "ed", "en", "er", "es", "ha", "he", "hi", "in", "is", "it",
"le", "me", "nd", "ne", "ng", "nt", "on", "or", "ou", "re", "se", "st", "te", "th", "ti", "to",
"ve", "wa", "all", "and", "are", "but", "ent", "era", "ere", "eve", "for", "had", "hat", "hen", "her", "hin",
"his", "ing", "ion", "ith", "not", "ome", "oul", "our", "sho", "ted", "ter", "tha", "the", "thi",
"al", "an", "ar", "as", "at", "ea", "ed", "en", "er", "es", "ha", "he", "hi", "in", "is", "it",
"le", "me", "nd", "ne", "ng", "nt", "on", "or", "ou", "re", "se", "st", "te", "th", "ti", "to",
"ve", "wa", "all", "and", "are", "but", "ent", "era", "ere", "eve", "for", "had", "hat", "hen", "her", "hin",
"his", "ing", "ion", "ith", "not", "ome", "oul", "our", "sho", "ted", "ter", "tha", "the", "thi",
"al", "an", "ar", "as", "at", "ea", "ed", "en", "er", "es", "ha", "he", "hi", "in", "is", "it",
"le", "me", "nd", "ne", "ng", "nt", "on", "or", "ou", "re", "se", "st", "te", "th", "ti", "to",
"ve", "wa", "all", "and", "are", "but", "ent", "era", "ere", "eve", "for", "had", "hat", "hen", "her", "hin",
"his", "ing", "ion", "ith", "not", "ome", "oul", "our", "sho", "ted", "ter", "tha", "the", "thi",
"al", "an", "ar", "as", "at", "ea", "ed", "en", "er", "es", "ha", "he", "hi", "in", "is", "it",
"le", "me", "nd", "ne", "ng", "nt", "on", "or", "ou", "re", "se", "st", "te", "th", "ti", "to",
"ve", "wa", "all", "and", "are", "but", "ent", "era", "ere", "eve", "for", "had", "hat", "hen", "her", "hin",
"his", "ing", "ion", "ith", "not", "ome", "oul", "our", "sho", "ted", "ter", "tha", "the", "thi",
"al", "an", "ar", "as", "at", "ea", "ed", "en", "er", "es", "ha", "he", "hi", "in", "is", "it",
"le", "me", "nd", "ne", "ng", "nt", "on", "or", "ou", "re", "se", "st", "te", "th", "ti", "to",
"ve", "wa", "all", "and", "are", "but", "ent", "era", "ere", "eve", "for", "had", "hat", "hen", "her", "hin",
"his", "ing", "ion", "ith", "not", "ome", "oul", "our", "sho", "ted", "ter", "tha", "the", "thi",
"al", "an", "ar", "as", "at", "ea", "ed", "en", "er", "es", "ha", "he", "hi", "in", "is", "it",
"le", "me", "nd", "ne", "ng", "nt", "on", "or", "ou", "re", "se", "st", "te", "th", "ti", "to",
"ve", "wa", "all", "and", "are", "but", "ent", "era", "ere", "eve", "for", "had", "hat", "hen", "her", "hin",
"his", "ing", "ion", "ith", "not", "ome", "oul", "our", "sho", "ted", "ter", "tha", "the", "thi",
"ah", "be", "bo", "eh", "ep", "et", "ka", "ko", "ha", "he", "ho", "ob", "oh", "op", "oc", "ot", "pa", "pe", "ct", "ta", "te", "to",
"vse", "tak", "nak", "no", "epo", "pre", "kan", "dly", "ime", "sha", "kur", "yey", "khi", "yeg", "ne",
"ion", "ne", "nas", "v",
"ah", "be", "bo", "eh", "ep", "et", "ka", "ko", "ha", "he", "ho", "ob", "oh", "op", "oc", "ot", "pa", "pe", "ct", "ta", "te", "to",
"vse", "tak", "nak", "no", "epo", "pre", "kan", "dly", "ime", "sha", "kur", "yey", "khi", "yeg", "ne",
"ion", "ne", "nas", "v",
"ah", "be", "bo", "eh", "ep", "et", "ka", "ko", "ha", "he", "ho", "ob", "oh", "op", "oc", "ot", "pa", "pe", "ct", "ta", "te", "to",
"vse", "tak", "nak", "no", "epo", "pre", "kan", "dly", "ime", "sha", "kur", "yey", "khi", "yeg", "ne",
"ion", "ne", "nas", "v",
"ai", "an", "ar", "au", "ce", "ch", "co", "de", "em", "en", "er", "es", "et", "eu", "il", "in", "is", "la", "le",
"ma", "me", "ne", "ns", "nt", "on", "ou", "pa", "qu", "ra", "re", "se", "te", "ti", "tr", "ue", "ur", "us", "ve",
"tou", "e", "eve", "hen", "son", "non", "not", "le",
"ai", "an", "ar", "au", "ce", "ch", "co", "de", "em", "en", "er", "es", "et", "eu", "il", "in", "is", "la", "le",
"ma", "me", "ne", "ns", "nt", "on", "ou", "pa", "qu", "ra", "re", "se", "te", "ti", "tr", "ue", "ur", "us", "ve",
"tou", "e", "eve", "hen", "son", "non", "not", "le",
"ai", "an", "ar", "au", "ce", "ch", "co", "de", "em", "en", "er", "es", "et", "eu", "il", "in", "is", "la", "le",
"ma", "me", "ne", "ns", "nt", "on", "ou", "pa", "qu", "ra", "re", "se", "te", "ti", "tr", "ue", "ur", "us", "ve",
"tou", "e", "eve", "hen", "son", "non", "not", "le",
"ad", "al", "an", "ar", "as", "ci", "co", "de", "do", "el", "en", "er", "es", "ie", "in", "la", "lo", "me", "na",
"no", "nt", "or", "os", "pa", "qu", "ra", "re", "ro", "se", "st", "ta", "te", "to", "ue", "un",
"tod", "ser", "su", "no", "nue", "el",
"ad", "al", "an", "ar", "as", "ci", "co", "de", "do", "el", "en", "er", "es", "ie", "in", "la", "lo", "me", "na",
"no", "nt", "or", "os", "pa", "qu", "ra", "re", "ro", "se", "st", "ta", "te", "to", "ue", "un",
"tod", "ser", "su", "no", "nue", "el",
"ad", "al", "an", "ar", "as", "ci", "co", "de", "do", "el", "en", "er", "es", "ie", "in", "la", "lo", "me", "na",
"no", "nt", "or", "os", "pa", "qu", "ra", "re", "ro", "se", "st", "ta", "te", "to", "ue", "un",
"tod", "ser", "su", "no", "nue", "el")
@@ -15,5 +15,5 @@
adjustOxyLoss(-1)
if(!client)
handle_npc(src)
if(!client)
handle_npc(src)
@@ -1,10 +1,10 @@
/*
A system for easily and quickly removing your own bodyparts, with a view towards
swapping them out for new ones, or just doing it as a party trick to horrify an
audience. Current implementation only supports robolimbs and uses a modular_bodypart
value on the manufacturer datum, but I have tried to keep it generic for future work.
PS. jesus christ this was meant to be a half an hour port
*/
/**
* A system for easily and quickly removing your own bodyparts, with a view towards
* swapping them out for new ones, or just doing it as a party trick to horrify an
* audience. Current implementation only supports robolimbs and uses a modular_bodypart
* value on the manufacturer datum, but I have tried to keep it generic for future work.
* PS. jesus christ this was meant to be a half an hour port
*/
// External organ procs:
// Does this bodypart count as a modular limb, and if so, what kind?
@@ -1,6 +1,6 @@
/*
proteans
*/
/**
* proteans
*/
/obj/item/rig/protean
name = "nanosuit control cluster"
suit_type = "nanomachine"
@@ -27,7 +27,7 @@
return 0
//No longer needed, but I'll leave it here incase we plan to re-use it.
//No longer needed, but I'll leave it here incase we plan to re-use it.
/mob/living/silicon/robot/movement_delay()
. = speed
@@ -284,7 +284,7 @@
new /obj/item/bikehorn(location)
M.custom_pain("You suddenly cough up a bikehorn!",60)
/*why is this in here twice? -Lo
/*why is this in here twice? -Lo
/datum/reagent/inaprovaline/synxchem/affect_blood(var/mob/living/carbon/M, var/alien, var/removed)
if(alien != IS_DIONA)
if(prob(5))
@@ -659,30 +659,30 @@
/mob/living/simple_mob/animal/synx/ai/pet/greed/synth
/*
▓███▓ ▓▓▓ ▓▓▓ ▓▓▓ ▓▓▓ ▓███▓
▓▓ ▓▓▓█ ▓▓ ▓▓█ ▓▓ ▓▓█ ▓▓ ▓▓█ ▓▓ ▓▓█ ▓▓ ▓▓▓█
▓ ▓▓▓▓ ▓▓▓ ▓▓▓ ▓▓▓ ▓▓▓ ▓▓▓▓
▓ █▓▓▓ █▓▓ █▓▓ █▓▓ █▓▓ █▓▓▓
▓ █▓▓▓▓█ █▓▓ ▓█ █▓▓ ▓█ █▓▓█▓█ █▓▓▓ █▓▓▓
▓ █▓▓▓ ▓█▓ █▓█▓█ █▓█▓█ ▓▓█ ▓█ █▓▓▓
▓█ █▓▓▓ ▓▓▓ ▓▓▓ ▓▓ █▓▓▓
▓▓ █▓▓ ▓ ▓ ▓ █▓▓▓
▓ █▓▓ ▓█ █▓▓
▓ ▓▓▓ ▓▓ █▓▓
█\ ▓▓ ▓▓ ▓█ ▓ █▓▓
▓█\ ▓█ ▓█▓ ▓▓▓ █▓ █▓▓
▓▓▓█ ▓ ▓▓▓▓ ▓ ▓▓ ▓ █▓▓
▓█▓ ▓▓█▓▓ ▓ ▓▓ ▓▓▓
▓▓ █▓▓█ █▓ █▓▓
▓▓ ▓▓▓ ▓▓ █▓▓
▓ ▓▓▓ ▓ █▓▓
▓▓ █▓▓█ █▓ █▓▓▓
▓ █▓▓▓ ▓▓█ █▓█ ▓▓ █▓▓▓
▓ █▓▓▓▓▓ ▓▓█ ▓▓ ▓▓█▓ █▓▓▓
▓ █▓▓▓ ▓▓▓ ▓▓▓ █▓▓▓
▓ █▓▓▓ ▓▓▓ ▓▓▓ █▓▓▓
▓█▓██▓▓▓█▓█▓█▓▓▓█▓█▓█▓▓▓█▓█▓██▓▓▓
*/
* ▓███▓ ▓▓▓ ▓▓▓ ▓▓▓ ▓▓▓ ▓███▓
* ▓▓ ▓▓▓█ ▓▓ ▓▓█ ▓▓ ▓▓█ ▓▓ ▓▓█ ▓▓ ▓▓█ ▓▓ ▓▓▓█
* ▓ ▓▓▓▓ ▓▓▓ ▓▓▓ ▓▓▓ ▓▓▓ ▓▓▓▓
* ▓ █▓▓▓ █▓▓ █▓▓ █▓▓ █▓▓ █▓▓▓
* ▓ █▓▓▓▓█ █▓▓ ▓█ █▓▓ ▓█ █▓▓█▓█ █▓▓▓ █▓▓▓
* ▓ █▓▓▓ ▓█▓ █▓█▓█ █▓█▓█ ▓▓█ ▓█ █▓▓▓
* ▓█ █▓▓▓ ▓▓▓ ▓▓▓ ▓▓ █▓▓▓
* ▓▓ █▓▓ ▓ ▓ ▓ █▓▓▓
* ▓ █▓▓ ▓█ █▓▓
* ▓ ▓▓▓ ▓▓ █▓▓
* █\ ▓▓ ▓▓ ▓█ ▓ █▓▓
* ▓█\ ▓█ ▓█▓ ▓▓▓ █▓ █▓▓
* ▓▓▓█ ▓ ▓▓▓▓ ▓ ▓▓ ▓ █▓▓
* ▓█▓ ▓▓█▓▓ ▓ ▓▓ ▓▓▓
* ▓▓ █▓▓█ █▓ █▓▓
* ▓▓ ▓▓▓ ▓▓ █▓▓
* ▓ ▓▓▓ ▓ █▓▓
* ▓▓ █▓▓█ █▓ █▓▓▓
* ▓ █▓▓▓ ▓▓█ █▓█ ▓▓ █▓▓▓
* ▓ █▓▓▓▓▓ ▓▓█ ▓▓ ▓▓█▓ █▓▓▓
* ▓ █▓▓▓ ▓▓▓ ▓▓▓ █▓▓▓
* ▓ █▓▓▓ ▓▓▓ ▓▓▓ █▓▓▓
* ▓█▓██▓▓▓█▓█▓█▓▓▓█▓█▓█▓▓▓█▓█▓██▓▓▓
*/
icon_state = "synx_C_living"
icon_living = "synx_C_living"
icon_dead = "synx_C_dead"
@@ -1,4 +1,4 @@
//Fodder
//Fodder
/mob/living/simple_mob/mechanical/cyber_horror
name = "Cyber horror"
desc = "What was once a man, twisted and warped by machine."
@@ -67,7 +67,7 @@
threaten_delay = 1 SECOND
threaten_timeout = 30 SECONDS
// Fragile but dangerous
// Fragile but dangerous
/mob/living/simple_mob/mechanical/cyber_horror/plasma_cyber_horror
name = "Nanite husk"
desc = "What was once a phoronoid, now a empty shell of malfunctioning nanites."
@@ -84,7 +84,7 @@
attacktext = "splattered on"
attack_sound = 'sound/effects/slime_squish.ogg'
// Do y'like brain damage?
// Do y'like brain damage?
var/poison_chance = 100
var/poison_per_bite = 3
var/poison_type = "neurophage_nanites"
@@ -100,14 +100,14 @@
if(L.can_inject(src, null, target_zone))
inject_poison(L, target_zone)
// Does actual poison injection, after all checks passed.
// Does actual poison injection, after all checks passed.
/mob/living/simple_mob/mechanical/cyber_horror/plasma_cyber_horror/proc/inject_poison(mob/living/L, target_zone)
if(prob(poison_chance))
to_chat(L, span_warning("You feel nanites digging into your skin!"))
L.reagents.add_reagent(poison_type, poison_per_bite)
// Mech Shredder
// Mech Shredder
/mob/living/simple_mob/mechanical/cyber_horror/ling_cyber_horror
name = "Nanite abomination"
desc = "What was once something, now an exposed shell with lashing cables."
@@ -117,7 +117,7 @@
maxHealth = 250
health = 250
// Four attacks per second.
// Four attacks per second.
melee_damage_lower = 10
melee_damage_upper = 20
attack_armor_pen = 50
@@ -126,30 +126,30 @@
attack_edge = 1
attack_sound = 'modular_chomp/sound/mob/robots/Cyber_Horror_ChangelingMelee.ogg'
attacktext = list ("sliced", "diced", "lashed", "shredded")
// Slow as all sin
// Slow as all sin
movement_cooldown = 9
movement_sound = 'sound/effects/houndstep.ogg'
ai_holder_type = /datum/ai_holder/simple_mob/melee/cyber_horror
// You do NOT Want to get in touchy range of this thing.
// You do NOT Want to get in touchy range of this thing.
armor = list(melee = 75, bullet = -10, laser = -25, bio = 100, rad = 100)
hovering = FALSE
// Leaping is a special attack, so these values determine when leap can happen.
// Leaping won't occur if its on cooldown, set to a minute due to it purely break formations.
// Leaping is a special attack, so these values determine when leap can happen.
// Leaping won't occur if its on cooldown, set to a minute due to it purely break formations.
special_attack_min_range = 2
special_attack_max_range = 7
special_attack_cooldown = 60 SECONDS
// How long the leap telegraphing is.
// How long the leap telegraphing is.
var/leap_warmup = 2 SECOND
var/leap_sound = 'modular_chomp/sound/mob/robots/Cyber_Horror_ChangelingLeap.ogg'
/datum/say_list/cyber_horror/ling
threaten_sound = 'modular_chomp/sound/mob/robots/Cyber_Horror_Changeling.ogg'
// Multiplies damage if the victim is stunned in some form, including a successful leap.
// Multiplies damage if the victim is stunned in some form, including a successful leap.
/mob/living/simple_mob/mechanical/cyber_horror/ling_cyber_horror/apply_bonus_melee_damage(atom/A, damage_amount)
if(isliving(A))
var/mob/living/L = A
@@ -157,36 +157,36 @@
return damage_amount * 2.5
return ..()
// The actual leaping attack.
// The actual leaping attack.
/mob/living/simple_mob/mechanical/cyber_horror/ling_cyber_horror/do_special_attack(atom/A)
set waitfor = FALSE
set_AI_busy(TRUE)
// Telegraph, since getting stunned suddenly feels bad.
// Telegraph, since getting stunned suddenly feels bad.
do_windup_animation(A, leap_warmup)
// For the telegraphing.
// For the telegraphing.
sleep(leap_warmup)
// Do the actual leap.
// Lets us pass over everything.
// Do the actual leap.
// Lets us pass over everything.
status_flags |= LEAPING
visible_message(span_danger("\The [src] leaps at \the [A]!"))
throw_at(get_step(get_turf(A), get_turf(src)), special_attack_max_range+1, 1, src)
playsound(src, leap_sound, 75, 1)
// For the throw to complete. It won't hold up the AI SSticker due to waitfor being false.
// For the throw to complete. It won't hold up the AI SSticker due to waitfor being false.
sleep(5)
// Revert special passage ability.
// Revert special passage ability.
if(status_flags & LEAPING)
status_flags &= ~LEAPING
// Where we landed. This might be different than A's turf.
// Where we landed. This might be different than A's turf.
var/turf/T = get_turf(src)
. = FALSE
// Now for the stun.
// Now for the stun.
var/mob/living/victim = null
// So player-controlled cyber horrors only need to click the tile to stun them.
// So player-controlled cyber horrors only need to click the tile to stun them.
for(var/mob/living/L in T)
if(L == src)
continue
@@ -194,7 +194,7 @@
if(ishuman(L))
var/mob/living/carbon/human/H = L
if(H.check_shields(damage = 0, damage_source = src, attacker = src, def_zone = null, attack_text = "the leap"))
// We were blocked.
// We were blocked.
continue
victim = L
@@ -209,7 +209,7 @@
set_AI_busy(FALSE)
//Slightly more durable fodder
//Slightly more durable fodder
/mob/living/simple_mob/mechanical/cyber_horror/vox
name = "Vox shambles"
desc = "Once a Vox now torn and changed, peices of a Durand has been grafted onto it."
@@ -361,7 +361,7 @@
melee_damage_lower = 2
melee_damage_upper = 2
// Four attacks per second.
// Four attacks per second.
base_attack_cooldown = 2.5
attack_sharp = 1
attack_edge = 1
@@ -369,7 +369,7 @@
attacktext = list("jabbed", "injected")
// Do y'like drugs?
// Do y'like drugs?
var/poison_chance = 75
var/poison_per_bite = 3
var/poison_type = REAGENT_ID_MINDBREAKER
@@ -385,7 +385,7 @@
if(L.can_inject(src, null, target_zone))
inject_poison(L, target_zone)
// Does actual poison injection, after all checks passed.
// Does actual poison injection, after all checks passed.
/mob/living/simple_mob/mechanical/cyber_horror/cat_cyber_horror/proc/inject_poison(mob/living/L, target_zone)
if(prob(poison_chance))
to_chat(L, span_warning("You feel an uncomfortable prick!"))
@@ -2,22 +2,22 @@
// This file overrides settings on upstream simple animals to turn on vore behavior
//
/*
## For anything that previously inhertited from: /mob/living/simple_mob/hostile/vore ##
vore_active = 1
icon = 'icons/mob/vore.dmi'
## For anything that previously inhertied from: /mob/living/simple_mob/hostile/vore/large ##
vore_active = 1
icon = 'icons/mob/vore64x64.dmi'
old_x = -16
old_y = -16
pixel_x = -16
pixel_y = -16
vore_pounce_chance = 50
*/
/**
* ## For anything that previously inhertited from: /mob/living/simple_mob/hostile/vore ##
*
* vore_active = 1
* icon = 'icons/mob/vore.dmi'
*
* ## For anything that previously inhertied from: /mob/living/simple_mob/hostile/vore/large ##
*
* vore_active = 1
* icon = 'icons/mob/vore64x64.dmi'
* old_x = -16
* old_y = -16
* pixel_x = -16
* pixel_y = -16
* vore_pounce_chance = 50
*/
//
// Okay! Here we go!
+1 -1
View File
@@ -132,7 +132,7 @@
/atom/proc/drain_power(var/drain_check,var/surge, var/amount = 0)
return -1
// used for petrification machines
// used for petrification machines
/atom/proc/get_ultimate_mob()
var/mob/ultimate_mob
var/atom/to_check = loc
+44
View File
@@ -0,0 +1,44 @@
// This file contains all Nano procs/definitions for external classes/objects
/**
* Called when a Nano UI window is closed
* This is how Nano handles closed windows
* It must be a verb so that it can be called using winset
*
* @return nothing
*/
/client/verb/nanoclose(var/uiref as text)
set hidden = 1 // hide this verb from the user's panel
set name = "nanoclose"
var/datum/nanoui/ui = locate(uiref)
if (istype(ui))
ui.close()
if(ui.ref)
var/href = "close=1"
src.Topic(href, params2list(href), ui.ref) // this will direct to the atom's Topic() proc via client.Topic()
else if (ui.on_close_logic)
// no atomref specified (or not found)
// so just reset the user mob's machine var
if(src && src.mob)
src.mob.unset_machine()
/**
* The ui_interact proc is used to open and update Nano UIs
* If ui_interact is not used then the UI will not update correctly
* ui_interact is currently defined for /atom/movable
*
* @param user /mob The mob who is interacting with this ui
* @param ui_key string A string key to use for this ui. Allows for multiple unique uis on one obj/mob (defaut value "main")
* @param ui /datum/nanoui This parameter is passed by the nanoui process() proc when updating an open ui
* @param force_open boolean Force the UI to (re)open, even if it's already open
*
* @return nothing
*/
/datum/proc/ui_interact(mob/user, ui_key = "main", var/datum/nanoui/ui = null, var/force_open = 1, master_ui = null, var/datum/topic_state/state = default_state)
return
// Used by the Nano UI Manager (/datum/nanomanager) to track UIs opened by this mob
/mob/var/list/open_uis = list()
+2 -2
View File
@@ -28,11 +28,11 @@
// This is so specific atoms can override these, and ignore certain ones
/atom/proc/vars_to_save()
return list("color","dir","icon","icon_state","name","pixel_x","pixel_y")
return list("color","dir","icon","icon_state","name","pixel_x","pixel_y")
/atom/proc/map_important_vars()
// A list of important things to save in the map editor
return list("color","dir","icon","icon_state","layer","name","pixel_x","pixel_y")
return list("color","dir","icon","icon_state","layer","name","pixel_x","pixel_y")
/area/map_important_vars()
// Keep the area default icons, to keep things nice and legible
+8 -8
View File
@@ -7,14 +7,14 @@
// Definitions
////////////////////////////////
/* Cable directions (d1 and d2)
9 1 5
\ | /
8 - 0 - 4,
/ | \
10 2 6
/** Cable directions (d1 and d2)
*
*
* 9 1 5
* \ | /
* 8 - 0 - 4,
* / | \
* 10 2 6
If d1 = 0 and d2 = 0, there's no cable
If d1 = 0 and d2 = dir, it's a O-X cable, getting from the center of the tile to dir (knot cable)
@@ -1,16 +1,16 @@
//This file was auto-corrected by findeclaration.exe on 25.5.2012 20:42:33
/*
field_generator power level display
The icon used for the field_generator need to have 'num_power_levels' number of icon states
named 'Field_Gen +p[num]' where 'num' ranges from 1 to 'num_power_levels'
The power level is displayed using overlays. The current displayed power level is stored in 'powerlevel'.
The overlay in use and the powerlevel variable must be kept in sync. A powerlevel equal to 0 means that
no power level overlay is currently in the overlays list.
-Aygar
*/
/**
* field_generator power level display
* The icon used for the field_generator need to have 'num_power_levels' number of icon states
* named 'Field_Gen +p[num]' where 'num' ranges from 1 to 'num_power_levels'
*
* The power level is displayed using overlays. The current displayed power level is stored in 'powerlevel'.
* The overlay in use and the powerlevel variable must be kept in sync. A powerlevel equal to 0 means that
* no power level overlay is currently in the overlays list.
* -Aygar
*/
#define field_generator_max_power 250000
/obj/machinery/field_generator
@@ -33,11 +33,11 @@ proc
process()
check_build()
Setup map
|EC|
CC|FC|
|PB|
PE|PE|PE
* Setup map
* |EC|
* CC|FC|
* |PB|
* PE|PE|PE
Icon Addemdum
@@ -53,7 +53,7 @@
* C-20r
*/
/* CHOMPedit remove: Moved to automatic_ch.dm. *
/* CHOMPedit remove: Moved to automatic_ch.dm. *
/obj/item/gun/projectile/automatic/c20r
name = "submachine gun"
+10 -10
View File
@@ -59,15 +59,15 @@
var/hsize = round(input_size/2)
/*
(x,y+isize)----(x+hsize,y+isize)----(x+size,y+isize)
| | |
| | |
| | |
(x,y+hsize)----(x+hsize,y+hsize)----(x+isize,y)
| | |
| | |
| | |
(x,y)----------(x+hsize,y)----------(x+isize,y)
* (x,y+isize)----(x+hsize,y+isize)----(x+size,y+isize)
* | | |
* | | |
* | | |
* (x,y+hsize)----(x+hsize,y+hsize)----(x+isize,y)
* | | |
* | | |
* | | |
* (x,y)----------(x+hsize,y)----------(x+isize,y)
*/
// Central edge values become average of corners.
map[TRANSLATE_COORD(x+hsize,y+isize)] = round((\
@@ -103,7 +103,7 @@
map[current_cell] *= (rand(1,2)==1 ? (1.0-random_element) : (1.0+random_element))
map[current_cell] = max(0,min(cell_range,map[current_cell]))
// Recurse until size is too small to subdivide.
// Recurse until size is too small to subdivide.
if(isize>3)
if(!priority_process)
CHECK_TICK
@@ -133,12 +133,12 @@
return data
/**
* Called in tgui_act() to process modal actions
*
* Arguments:
* * action - The action passed by tgui
* * params - The params passed by tgui
*/
* Called in tgui_act() to process modal actions
*
* Arguments:
* * action - The action passed by tgui
* * params - The params passed by tgui
*/
/obj/machinery/chem_master/proc/tgui_act_modal(action, params, datum/tgui/ui, datum/tgui_state/state)
. = TRUE
var/id = params["id"] // The modal's ID
+2 -2
View File
@@ -233,9 +233,9 @@
// Called when a mob dies
/datum/reagent/proc/on_mob_death(var/mob/M)
return
return
//on transfer to new container, return 1 to allow it to continue
//on transfer to new container, return 1 to allow it to continue
/datum/reagent/proc/on_transfer(var/volume)
return 1
//YW edit end
+1 -1
View File
@@ -301,7 +301,7 @@
if(alien == IS_SLIME && prob(10))
M.visible_message(span_warning("[M]'s flesh sizzles where the water touches it!"), span_danger("Your flesh burns in the water!"))
..()
//VOREStation Edit End,
//VOREStation Edit End,
#undef WATER_LATENT_HEAT
+6 -6
View File
@@ -507,12 +507,12 @@
var/list/datum/transhuman/mind_record/stored = list()
/**
* Sets a temporary message to display to the user
*
* Arguments:
* * text - Text to display, null/empty to clear the message from the UI
* * style - The style of the message: (color name), info, success, warning, danger
*/
* Sets a temporary message to display to the user
*
* Arguments:
* * text - Text to display, null/empty to clear the message from the UI
* * style - The style of the message: (color name), info, success, warning, danger
*/
/obj/machinery/computer/transhuman/resleeving/proc/set_temp(text = "", style = "info", update_now = FALSE)
temp = list(text = text, style = style)
if(update_now)
+15 -15
View File
@@ -112,21 +112,21 @@
*/
//Sure, I could probably do this with math. But I'm tired.
/*
S1 300
-----------------------------------
|015/285 135/285|166/285 285/285|
| | |S
| A3 | A4 |2
| | |
0|015/166 135/166|166/166 285/166|3
0|---------------------------------|0
0|015/135 135/135|166/135 285/135|0
| | |
S| A1 | A2 |
4| | |
|015/015 135/015|166/015 285/015|
-----------------------------------
000 S3
* S1 300
* -----------------------------------
* |015/285 135/285|166/285 285/285|
* | | |S
* | A3 | A4 |2
* | | |
* 0|015/166 135/166|166/166 285/166|3
* 0|---------------------------------|0
* 0|015/135 135/135|166/135 285/135|0
* | | |
* S| A1 | A2 |
* 4| | |
* |015/015 135/015|166/015 285/015|
* -----------------------------------
* 000 S3
*/
/*
//////////// AREA 1
+122 -122
View File
@@ -7,16 +7,16 @@
GLOBAL_LIST(tgui_modals)
/**
* Call this from a proc that is called in tgui_act() to process modal actions
*
* Example: /obj/machinery/chem_master/proc/tgui_act_modal
* You can then switch based on the return value and show different
* modals depending on the answer.
* Arguments:
* * source - The source datum
* * action - The called action
* * params - The params to the action
*/
* Call this from a proc that is called in tgui_act() to process modal actions
*
* Example: /obj/machinery/chem_master/proc/tgui_act_modal
* You can then switch based on the return value and show different
* modals depending on the answer.
* Arguments:
* * source - The source datum
* * action - The called action
* * params - The params to the action
*/
/datum/proc/tgui_modal_act(datum/source = src, action = "", params)
ASSERT(istype(source))
@@ -36,11 +36,11 @@ GLOBAL_LIST(tgui_modals)
return TGUI_MODAL_CLOSE
/**
* Call this from tgui_data() to return modal information if needed
* Call this from tgui_data() to return modal information if needed
* Arguments:
* * source - The source datum
*/
* Arguments:
* * source - The source datum
*/
/datum/proc/tgui_modal_data(datum/source = src)
ASSERT(istype(source))
@@ -51,11 +51,11 @@ GLOBAL_LIST(tgui_modals)
return current.to_data()
/**
* Clears the current modal for a given datum
*
* Arguments:
* * source - The source datum
*/
* Clears the current modal for a given datum
*
* Arguments:
* * source - The source datum
*/
/datum/proc/tgui_modal_clear(datum/source = src)
ASSERT(istype(source))
@@ -74,15 +74,15 @@ GLOBAL_LIST(tgui_modals)
return TRUE
/**
* Opens a message TGUI modal
*
* Arguments:
* * source - The source datum
* * id - The ID of the modal
* * text - The text to display above the answers
* * delegate - The proc to call when closed
* * arguments - List of arguments passed to and from JS (mostly useful for chaining modals)
*/
* Opens a message TGUI modal
*
* Arguments:
* * source - The source datum
* * id - The ID of the modal
* * text - The text to display above the answers
* * delegate - The proc to call when closed
* * arguments - List of arguments passed to and from JS (mostly useful for chaining modals)
*/
/datum/proc/tgui_modal_message(datum/source = src, id, text = "Default modal message", delegate, arguments)
ASSERT(length(id))
@@ -90,17 +90,17 @@ GLOBAL_LIST(tgui_modals)
return tgui_modal_new(source, modal)
/**
* Opens a text input TGUI modal
*
* Arguments:
* * source - The source datum
* * id - The ID of the modal
* * text - The text to display above the answers
* * delegate - The proc to call when submitted
* * arguments - List of arguments passed to and from JS (mostly useful for chaining modals)
* * value - The default value of the input
* * max_length - The maximum char length of the input
*/
* Opens a text input TGUI modal
*
* Arguments:
* * source - The source datum
* * id - The ID of the modal
* * text - The text to display above the answers
* * delegate - The proc to call when submitted
* * arguments - List of arguments passed to and from JS (mostly useful for chaining modals)
* * value - The default value of the input
* * max_length - The maximum char length of the input
*/
/datum/proc/tgui_modal_input(datum/source = src, id, text = "Default modal message", delegate, arguments, value = "", max_length = TGUI_MODAL_INPUT_MAX_LENGTH)
ASSERT(length(id))
ASSERT(max_length > 0)
@@ -109,18 +109,18 @@ GLOBAL_LIST(tgui_modals)
return tgui_modal_new(source, modal)
/**
* Opens a dropdown input TGUI modal
*
* Internally checks if the answer is in the list of choices.
* Arguments:
* * source - The source datum
* * id - The ID of the modal
* * text - The text to display above the answers
* * delegate - The proc to call when submitted
* * arguments - List of arguments passed to and from JS (mostly useful for chaining modals)
* * value - The default value of the dropdown
* * choices - The list of available choices in the dropdown
*/
* Opens a dropdown input TGUI modal
*
* Internally checks if the answer is in the list of choices.
* Arguments:
* * source - The source datum
* * id - The ID of the modal
* * text - The text to display above the answers
* * delegate - The proc to call when submitted
* * arguments - List of arguments passed to and from JS (mostly useful for chaining modals)
* * value - The default value of the dropdown
* * choices - The list of available choices in the dropdown
*/
/datum/proc/tgui_modal_choice(datum/source = src, id, text = "Default modal message", delegate, arguments, value = "", choices)
ASSERT(length(id))
@@ -128,18 +128,18 @@ GLOBAL_LIST(tgui_modals)
return tgui_modal_new(source, modal)
/**
* Opens a bento input TGUI modal
*
* Internally checks if the answer is in the list of choices.
* Arguments:
* * source - The source datum
* * id - The ID of the modal
* * text - The text to display above the answers
* * delegate - The proc to call when submitted
* * arguments - List of arguments passed to and from JS (mostly useful for chaining modals)
* * value - The default value of the bento
* * choices - The list of available choices in the bento
*/
* Opens a bento input TGUI modal
*
* Internally checks if the answer is in the list of choices.
* Arguments:
* * source - The source datum
* * id - The ID of the modal
* * text - The text to display above the answers
* * delegate - The proc to call when submitted
* * arguments - List of arguments passed to and from JS (mostly useful for chaining modals)
* * value - The default value of the bento
* * choices - The list of available choices in the bento
*/
/datum/proc/tgui_modal_bento(datum/source = src, id, text = "Default modal message", delegate, arguments, value, choices)
ASSERT(length(id))
@@ -154,18 +154,18 @@ GLOBAL_LIST(tgui_modals)
return tgui_modal_new(source, modal)
/**
* Opens a yes/no TGUI modal
*
* Arguments:
* * source - The source datum
* * id - The ID of the modal
* * text - The text to display above the answers
* * delegate - The proc to call when "Yes" is pressed
* * delegate_no - The proc to call when "No" is pressed
* * arguments - List of arguments passed to and from JS (mostly useful for chaining modals)
* * yes_text - The text to show in the "Yes" button
* * no_text - The text to show in the "No" button
*/
* Opens a yes/no TGUI modal
*
* Arguments:
* * source - The source datum
* * id - The ID of the modal
* * text - The text to display above the answers
* * delegate - The proc to call when "Yes" is pressed
* * delegate_no - The proc to call when "No" is pressed
* * arguments - List of arguments passed to and from JS (mostly useful for chaining modals)
* * yes_text - The text to show in the "Yes" button
* * no_text - The text to show in the "No" button
*/
/datum/proc/tgui_modal_boolean(datum/source = src, id, text = "Default modal message", delegate, delegate_no, arguments, yes_text = "Yes", no_text = "No")
ASSERT(length(id))
@@ -173,14 +173,14 @@ GLOBAL_LIST(tgui_modals)
return tgui_modal_new(source, modal)
/**
* Registers a given modal to a source. Private.
*
* Arguments:
* * source - The source datum
* * modal - The datum/tgui_modal to register
* * replace_previous - Whether any modal currently assigned to source should be replaced
* * instant_update - Whether the changes should reflect immediately
*/
* Registers a given modal to a source. Private.
*
* Arguments:
* * source - The source datum
* * modal - The datum/tgui_modal to register
* * replace_previous - Whether any modal currently assigned to source should be replaced
* * instant_update - Whether the changes should reflect immediately
*/
/datum/proc/tgui_modal_new(datum/source = src, datum/tgui_modal/modal = null, replace_previous = TRUE, instant_update = TRUE)
ASSERT(istype(source))
ASSERT(istype(modal))
@@ -198,13 +198,13 @@ GLOBAL_LIST(tgui_modals)
return TRUE
/**
* Calls the source's currently assigned modal's (if there is one) on_answer() proc. Private.
*
* Arguments:
* * source - The source datum
* * id - The ID of the modal
* * answer - The provided answer
*/
* Calls the source's currently assigned modal's (if there is one) on_answer() proc. Private.
*
* Arguments:
* * source - The source datum
* * id - The ID of the modal
* * answer - The provided answer
*/
/datum/proc/tgui_modal_answer(datum/source = src, id, answer = "")
ASSERT(istype(source))
@@ -215,14 +215,14 @@ GLOBAL_LIST(tgui_modals)
return current.on_answer(answer)
/**
* Passes an answer from JS through the modal's proc.
*
* Used namely for cutting the text short if it's longer
* than an input modal's max_length.
* Arguments:
* * source - The source datum
* * answer - The provided answer
*/
* Passes an answer from JS through the modal's proc.
*
* Used namely for cutting the text short if it's longer
* than an input modal's max_length.
* Arguments:
* * source - The source datum
* * answer - The provided answer
*/
/datum/proc/tgui_modal_preprocess_answer(datum/source = src, answer = "")
ASSERT(istype(source))
@@ -233,8 +233,8 @@ GLOBAL_LIST(tgui_modals)
return current.preprocess_answer(answer)
/**
* Modal datum (contains base information for a modal)
*/
* Modal datum (contains base information for a modal)
*/
/datum/tgui_modal
var/datum/owning_source
var/id
@@ -250,28 +250,28 @@ GLOBAL_LIST(tgui_modals)
src.arguments = arguments
/**
* Called when it's time to pre-process the answer before using it
*
* Arguments:
* * answer - The answer, a nullable text
*/
* Called when it's time to pre-process the answer before using it
*
* Arguments:
* * answer - The answer, a nullable text
*/
/datum/tgui_modal/proc/preprocess_answer(answer)
return reject_bad_text(answer, TGUI_MODAL_INPUT_MAX_LENGTH) // bleh
/**
* Called when a modal receives an answer
*
* Arguments:
* * answer - The answer, a nullable text
*/
* Called when a modal receives an answer
*
* Arguments:
* * answer - The answer, a nullable text
*/
/datum/tgui_modal/proc/on_answer(answer)
if(delegate)
return call(owning_source, delegate)(answer, arguments)
return FALSE
/**
* Creates a list that describes a modal visually to be passed to JS
*/
* Creates a list that describes a modal visually to be passed to JS
*/
/datum/tgui_modal/proc/to_data()
. = list()
.["id"] = id
@@ -280,8 +280,8 @@ GLOBAL_LIST(tgui_modals)
.["type"] = modal_type
/**
* Input modal - has a text entry that can be used to enter an answer
*/
* Input modal - has a text entry that can be used to enter an answer
*/
/datum/tgui_modal/input
modal_type = "input"
var/value
@@ -302,8 +302,8 @@ GLOBAL_LIST(tgui_modals)
.["value"] = value
/**
* Choice modal - has a dropdown menu that can be used to select an answer
*/
* Choice modal - has a dropdown menu that can be used to select an answer
*/
/datum/tgui_modal/input/choice
modal_type = "choice"
var/choices
@@ -322,10 +322,10 @@ GLOBAL_LIST(tgui_modals)
.["choices"] = choices
/**
* Bento modal - Similar to choice, it displays the choices in a grid of images
*
* The returned answer is the index of the choice.
*/
* Bento modal - Similar to choice, it displays the choices in a grid of images
*
* The returned answer is the index of the choice.
*/
/datum/tgui_modal/input/bento
modal_type = "bento"
var/choices
@@ -351,8 +351,8 @@ GLOBAL_LIST(tgui_modals)
modal_type = "bentospritesheet"
/**
* Boolean modal - has yes/no buttons that do different actions depending on which is pressed
*/
* Boolean modal - has yes/no buttons that do different actions depending on which is pressed
*/
/datum/tgui_modal/boolean
modal_type = "boolean"
var/delegate_no
+4 -4
View File
@@ -3,10 +3,10 @@
* SPDX-License-Identifier: MIT
*/
/**
* tgui state: admin_state
*
* Checks that the user is an admin, end-of-story.
/**
* tgui state: admin_state
*
* Checks that the user is an admin, end-of-story.
**/
GLOBAL_DATUM_INIT(tgui_admin_state, /datum/tgui_state/admin_state, new)
+4 -4
View File
@@ -3,10 +3,10 @@
* SPDX-License-Identifier: MIT
*/
/**
* tgui state: always_state
*
* Always grants the user UI_INTERACTIVE. Period.
/**
* tgui state: always_state
*
* Always grants the user UI_INTERACTIVE. Period.
**/
GLOBAL_DATUM_INIT(tgui_always_state, /datum/tgui_state/always_state, new)
+4 -4
View File
@@ -3,10 +3,10 @@
* SPDX-License-Identifier: MIT
*/
/**
* tgui state: conscious_state
*
* Only checks if the user is conscious.
/**
* tgui state: conscious_state
*
* Only checks if the user is conscious.
**/
GLOBAL_DATUM_INIT(tgui_conscious_state, /datum/tgui_state/conscious_state, new)
+4 -4
View File
@@ -3,10 +3,10 @@
* SPDX-License-Identifier: MIT
*/
/**
* tgui state: contained_state
*
* Checks that the user is inside the src_object.
/**
* tgui state: contained_state
*
* Checks that the user is inside the src_object.
**/
GLOBAL_DATUM_INIT(tgui_contained_state, /datum/tgui_state/contained_state, new)
+4 -4
View File
@@ -3,10 +3,10 @@
* SPDX-License-Identifier: MIT
*/
/**
* tgui state: deep_inventory_state
*
* Checks that the src_object is in the user's deep (backpack, box, toolbox, etc) inventory.
/**
* tgui state: deep_inventory_state
*
* Checks that the src_object is in the user's deep (backpack, box, toolbox, etc) inventory.
**/
GLOBAL_DATUM_INIT(tgui_deep_inventory_state, /datum/tgui_state/deep_inventory_state, new)
+4 -4
View File
@@ -3,10 +3,10 @@
* SPDX-License-Identifier: MIT
*/
/**
* tgui state: default_state
*
* Checks a number of things -- mostly physical distance for humans and view for robots.
/**
* tgui state: default_state
*
* Checks a number of things -- mostly physical distance for humans and view for robots.
**/
GLOBAL_DATUM_INIT(tgui_default_state, /datum/tgui_state/default, new)
+4 -4
View File
@@ -3,10 +3,10 @@
* SPDX-License-Identifier: MIT
*/
/**
* tgui state: hands_state
*
* Checks that the src_object is in the user's hands.
/**
* tgui state: hands_state
*
* Checks that the src_object is in the user's hands.
**/
GLOBAL_DATUM_INIT(tgui_hands_state, /datum/tgui_state/hands_state, new)
+5 -5
View File
@@ -3,11 +3,11 @@
* SPDX-License-Identifier: MIT
*/
/**
* tgui state: human_adjacent_state
*
* In addition to default checks, only allows interaction for a
* human adjacent user.
/**
* tgui state: human_adjacent_state
*
* In addition to default checks, only allows interaction for a
* human adjacent user.
**/
GLOBAL_DATUM_INIT(tgui_human_adjacent_state, /datum/tgui_state/human_adjacent_state, new)
+4 -4
View File
@@ -3,10 +3,10 @@
* SPDX-License-Identifier: MIT
*/
/**
* tgui state: inventory_state
*
* Checks that the src_object is in the user's top-level (hand, ear, pocket, belt, etc) inventory.
/**
* tgui state: inventory_state
*
* Checks that the src_object is in the user's top-level (hand, ear, pocket, belt, etc) inventory.
**/
GLOBAL_DATUM_INIT(tgui_inventory_state, /datum/tgui_state/inventory_state, new)
+4 -4
View File
@@ -1,7 +1,7 @@
/**
* tgui state: mentor_state
*
* Checks that the user is an mentor.
/**
* tgui state: mentor_state
*
* Checks that the user is an mentor.
**/
GLOBAL_DATUM_INIT(tgui_mentor_state, /datum/tgui_state/mentor_state, new)
@@ -3,18 +3,18 @@
* SPDX-License-Identifier: MIT
*/
/**
* tgui state: not_incapacitated_state
*
* Checks that the user isn't incapacitated
/**
* tgui state: not_incapacitated_state
*
* Checks that the user isn't incapacitated
**/
GLOBAL_DATUM_INIT(tgui_not_incapacitated_state, /datum/tgui_state/not_incapacitated_state, new)
/**
* tgui state: not_incapacitated_turf_state
*
* Checks that the user isn't incapacitated and that their loc is a turf
/**
* tgui state: not_incapacitated_turf_state
*
* Checks that the user isn't incapacitated and that their loc is a turf
**/
GLOBAL_DATUM_INIT(tgui_not_incapacitated_turf_state, /datum/tgui_state/not_incapacitated_state, new(no_turfs = TRUE))
+4 -4
View File
@@ -3,10 +3,10 @@
* SPDX-License-Identifier: MIT
*/
/**
* tgui state: notcontained_state
*
* Checks that the user is not inside src_object, and then makes the default checks.
/**
* tgui state: notcontained_state
*
* Checks that the user is not inside src_object, and then makes the default checks.
**/
GLOBAL_DATUM_INIT(tgui_notcontained_state, /datum/tgui_state/notcontained_state, new)
+4 -4
View File
@@ -3,10 +3,10 @@
* SPDX-License-Identifier: MIT
*/
/**
* tgui state: observer_state
*
* Checks that the user is an observer/ghost.
/**
* tgui state: observer_state
*
* Checks that the user is an observer/ghost.
**/
GLOBAL_DATUM_INIT(tgui_observer_state, /datum/tgui_state/observer_state, new)
+9 -9
View File
@@ -3,10 +3,10 @@
* SPDX-License-Identifier: MIT
*/
/**
* tgui state: physical_state
*
* Short-circuits the default state to only check physical distance.
/**
* tgui state: physical_state
*
* Short-circuits the default state to only check physical distance.
**/
GLOBAL_DATUM_INIT(tgui_physical_state, /datum/tgui_state/physical, new)
@@ -53,11 +53,11 @@ GLOBAL_DATUM_INIT(tgui_physical_obscured_state, /datum/tgui_state/physical_obscu
/mob/living/silicon/ai/physical_obscured_can_use_topic(src_object)
return STATUS_UPDATE // AIs are not physical.
/**
* tgui state: physical_state_bigscreen
*
* Short-circuits the default state to only check physical distance,
* but allows updates out to the full size of the screen.
/**
* tgui state: physical_state_bigscreen
*
* Short-circuits the default state to only check physical distance,
* but allows updates out to the full size of the screen.
**/
GLOBAL_DATUM_INIT(tgui_physical_state_bigscreen, /datum/tgui_state/physical_bigscreen, new)
+4 -4
View File
@@ -3,10 +3,10 @@
* SPDX-License-Identifier: MIT
*/
/**
* tgui state: self_state
*
* Only checks that the user and src_object are the same.
/**
* tgui state: self_state
*
* Only checks that the user and src_object are the same.
**/
GLOBAL_DATUM_INIT(tgui_self_state, /datum/tgui_state/self_state, new)
+4 -4
View File
@@ -1,7 +1,7 @@
/**
* tgui state: vorepanel_state
*
* Only checks that the user and src_object are the same.
/**
* tgui state: vorepanel_state
*
* Only checks that the user and src_object are the same.
**/
GLOBAL_DATUM_INIT(tgui_vorepanel_state, /datum/tgui_state/vorepanel_state, new)
+4 -4
View File
@@ -3,10 +3,10 @@
* SPDX-License-Identifier: MIT
*/
/**
* tgui state: z_state
*
* Only checks that the Z-level of the user and src_object are the same.
/**
* tgui state: z_state
*
* Only checks that the Z-level of the user and src_object are the same.
**/
GLOBAL_DATUM_INIT(tgui_z_state, /datum/tgui_state/z_state, new)
+2 -2
View File
@@ -188,10 +188,10 @@
/obj/vehicle/train/engine/relaymove(mob/user, direction)
if(user != load)
return 0
// Start CHOMPStation Edit
// Start CHOMPStation Edit
if(user.paralysis || user.sleeping)
return 0
// End CHOMPStation Edit
// End CHOMPStation Edit
if(is_train_head())
if(direction == reverse_direction(dir) && tow)
return 0
+19 -18
View File
@@ -1,23 +1,24 @@
/*
VVVVVVVV VVVVVVVV OOOOOOOOO RRRRRRRRRRRRRRRRR EEEEEEEEEEEEEEEEEEEEEE
V::::::V V::::::V OO:::::::::OO R::::::::::::::::R E::::::::::::::::::::E
V::::::V V::::::V OO:::::::::::::OO R::::::RRRRRR:::::R E::::::::::::::::::::E
V::::::V V::::::VO:::::::OOO:::::::ORR:::::R R:::::REE::::::EEEEEEEEE::::E
V:::::V V:::::V O::::::O O::::::O R::::R R:::::R E:::::E EEEEEE
V:::::V V:::::V O:::::O O:::::O R::::R R:::::R E:::::E
V:::::V V:::::V O:::::O O:::::O R::::RRRRRR:::::R E::::::EEEEEEEEEE
V:::::V V:::::V O:::::O O:::::O R:::::::::::::RR E:::::::::::::::E
V:::::V V:::::V O:::::O O:::::O R::::RRRRRR:::::R E:::::::::::::::E
V:::::V V:::::V O:::::O O:::::O R::::R R:::::R E::::::EEEEEEEEEE
V:::::V:::::V O:::::O O:::::O R::::R R:::::R E:::::E
V:::::::::V O::::::O O::::::O R::::R R:::::R E:::::E EEEEEE
V:::::::V O:::::::OOO:::::::ORR:::::R R:::::REE::::::EEEEEEEE:::::E
V:::::V OO:::::::::::::OO R::::::R R:::::RE::::::::::::::::::::E
V:::V OO:::::::::OO R::::::R R:::::RE::::::::::::::::::::E
VVV OOOOOOOOO RRRRRRRR RRRRRRREEEEEEEEEEEEEEEEEEEEEE
-Aro <3 */
* VVVVVVVV VVVVVVVV OOOOOOOOO RRRRRRRRRRRRRRRRR EEEEEEEEEEEEEEEEEEEEEE
* V::::::V V::::::V OO:::::::::OO R::::::::::::::::R E::::::::::::::::::::E
* V::::::V V::::::V OO:::::::::::::OO R::::::RRRRRR:::::R E::::::::::::::::::::E
* V::::::V V::::::VO:::::::OOO:::::::ORR:::::R R:::::REE::::::EEEEEEEEE::::E
* V:::::V V:::::V O::::::O O::::::O R::::R R:::::R E:::::E EEEEEE
* V:::::V V:::::V O:::::O O:::::O R::::R R:::::R E:::::E
* V:::::V V:::::V O:::::O O:::::O R::::RRRRRR:::::R E::::::EEEEEEEEEE
* V:::::V V:::::V O:::::O O:::::O R:::::::::::::RR E:::::::::::::::E
* V:::::V V:::::V O:::::O O:::::O R::::RRRRRR:::::R E:::::::::::::::E
* V:::::V V:::::V O:::::O O:::::O R::::R R:::::R E::::::EEEEEEEEEE
* V:::::V:::::V O:::::O O:::::O R::::R R:::::R E:::::E
* V:::::::::V O::::::O O::::::O R::::R R:::::R E:::::E EEEEEE
* V:::::::V O:::::::OOO:::::::ORR:::::R R:::::REE::::::EEEEEEEE:::::E
* V:::::V OO:::::::::::::OO R::::::R R:::::RE::::::::::::::::::::E
* V:::V OO:::::::::OO R::::::R R:::::RE::::::::::::::::::::E
* VVV OOOOOOOOO RRRRRRRR RRRRRRREEEEEEEEEEEEEEEEEEEEEE
*
* -Aro <3
*/
//
// Overrides/additions to stock defines go here, as well as hooks. Sort them by
+44 -42
View File
@@ -2126,48 +2126,50 @@
if("reset")
var/confirm = tgui_alert(user,"This will delete any custom messages. Are you sure?","Confirmation",list("Cancel","DELETE"))
if(confirm == "DELETE")
host.vore_selected.digest_messages_prey = initial(host.vore_selected.digest_messages_prey)
host.vore_selected.digest_messages_owner = initial(host.vore_selected.digest_messages_owner)
host.vore_selected.absorb_messages_prey = initial(host.vore_selected.absorb_messages_prey)
host.vore_selected.absorb_messages_owner = initial(host.vore_selected.absorb_messages_owner)
host.vore_selected.unabsorb_messages_prey = initial(host.vore_selected.unabsorb_messages_prey)
host.vore_selected.unabsorb_messages_owner = initial(host.vore_selected.unabsorb_messages_owner)
host.vore_selected.struggle_messages_outside = initial(host.vore_selected.struggle_messages_outside)
host.vore_selected.struggle_messages_inside = initial(host.vore_selected.struggle_messages_inside)
host.vore_selected.absorbed_struggle_messages_outside = initial(host.vore_selected.absorbed_struggle_messages_outside)
host.vore_selected.absorbed_struggle_messages_inside = initial(host.vore_selected.absorbed_struggle_messages_inside)
host.vore_selected.escape_attempt_messages_owner = initial(host.vore_selected.escape_attempt_messages_owner)
host.vore_selected.escape_attempt_messages_prey = initial(host.vore_selected.escape_attempt_messages_prey)
host.vore_selected.escape_messages_owner = initial(host.vore_selected.escape_messages_owner)
host.vore_selected.escape_messages_prey = initial(host.vore_selected.escape_messages_prey)
host.vore_selected.escape_messages_outside = initial(host.vore_selected.escape_messages_outside)
host.vore_selected.escape_item_messages_owner = initial(host.vore_selected.escape_item_messages_owner)
host.vore_selected.escape_item_messages_prey = initial(host.vore_selected.escape_item_messages_prey)
host.vore_selected.escape_item_messages_outside = initial(host.vore_selected.escape_item_messages_outside)
host.vore_selected.escape_fail_messages_owner = initial(host.vore_selected.escape_fail_messages_owner)
host.vore_selected.escape_fail_messages_prey = initial(host.vore_selected.escape_fail_messages_prey)
host.vore_selected.escape_attempt_absorbed_messages_owner = initial(host.vore_selected.escape_attempt_absorbed_messages_owner)
host.vore_selected.escape_attempt_absorbed_messages_prey = initial(host.vore_selected.escape_attempt_absorbed_messages_prey)
host.vore_selected.escape_absorbed_messages_owner = initial(host.vore_selected.escape_absorbed_messages_owner)
host.vore_selected.escape_absorbed_messages_prey = initial(host.vore_selected.escape_absorbed_messages_prey)
host.vore_selected.escape_absorbed_messages_outside = initial(host.vore_selected.escape_absorbed_messages_outside)
host.vore_selected.escape_fail_absorbed_messages_owner = initial(host.vore_selected.escape_fail_absorbed_messages_owner)
host.vore_selected.escape_fail_absorbed_messages_prey = initial(host.vore_selected.escape_fail_absorbed_messages_prey)
host.vore_selected.primary_transfer_messages_owner = initial(host.vore_selected.primary_transfer_messages_owner)
host.vore_selected.primary_transfer_messages_prey = initial(host.vore_selected.primary_transfer_messages_prey)
host.vore_selected.secondary_transfer_messages_owner = initial(host.vore_selected.secondary_transfer_messages_owner)
host.vore_selected.secondary_transfer_messages_prey = initial(host.vore_selected.secondary_transfer_messages_prey)
host.vore_selected.primary_autotransfer_messages_owner = initial(host.vore_selected.primary_autotransfer_messages_owner)
host.vore_selected.primary_autotransfer_messages_prey = initial(host.vore_selected.primary_autotransfer_messages_prey)
host.vore_selected.secondary_autotransfer_messages_owner = initial(host.vore_selected.secondary_autotransfer_messages_owner)
host.vore_selected.secondary_autotransfer_messages_prey = initial(host.vore_selected.secondary_autotransfer_messages_prey)
host.vore_selected.digest_chance_messages_owner = initial(host.vore_selected.digest_chance_messages_owner)
host.vore_selected.digest_chance_messages_prey = initial(host.vore_selected.digest_chance_messages_prey)
host.vore_selected.absorb_chance_messages_owner = initial(host.vore_selected.absorb_chance_messages_owner)
host.vore_selected.absorb_chance_messages_prey = initial(host.vore_selected.absorb_chance_messages_prey)
host.vore_selected.examine_messages = initial(host.vore_selected.examine_messages)
host.vore_selected.examine_messages_absorbed = initial(host.vore_selected.examine_messages_absorbed)
host.vore_selected.emote_lists = initial(host.vore_selected.emote_lists)
var/obj/belly/default_belly = new /obj/belly(null)
host.vore_selected.digest_messages_prey = default_belly.digest_messages_prey.Copy()
host.vore_selected.digest_messages_owner = default_belly.digest_messages_owner.Copy()
host.vore_selected.absorb_messages_prey = default_belly.absorb_messages_prey.Copy()
host.vore_selected.absorb_messages_owner = default_belly.absorb_messages_owner.Copy()
host.vore_selected.unabsorb_messages_prey = default_belly.unabsorb_messages_prey.Copy()
host.vore_selected.unabsorb_messages_owner = default_belly.unabsorb_messages_owner.Copy()
host.vore_selected.struggle_messages_outside = default_belly.struggle_messages_outside.Copy()
host.vore_selected.struggle_messages_inside = default_belly.struggle_messages_inside.Copy()
host.vore_selected.absorbed_struggle_messages_outside = default_belly.absorbed_struggle_messages_outside.Copy()
host.vore_selected.absorbed_struggle_messages_inside = default_belly.absorbed_struggle_messages_inside.Copy()
host.vore_selected.escape_attempt_messages_owner = default_belly.escape_attempt_messages_owner.Copy()
host.vore_selected.escape_attempt_messages_prey = default_belly.escape_attempt_messages_prey.Copy()
host.vore_selected.escape_messages_owner = default_belly.escape_messages_owner.Copy()
host.vore_selected.escape_messages_prey = default_belly.escape_messages_prey.Copy()
host.vore_selected.escape_messages_outside = default_belly.escape_messages_outside.Copy()
host.vore_selected.escape_item_messages_owner = default_belly.escape_item_messages_owner.Copy()
host.vore_selected.escape_item_messages_prey = default_belly.escape_item_messages_prey.Copy()
host.vore_selected.escape_item_messages_outside = default_belly.escape_item_messages_outside.Copy()
host.vore_selected.escape_fail_messages_owner = default_belly.escape_fail_messages_owner.Copy()
host.vore_selected.escape_fail_messages_prey = default_belly.escape_fail_messages_prey.Copy()
host.vore_selected.escape_attempt_absorbed_messages_owner = default_belly.escape_attempt_absorbed_messages_owner.Copy()
host.vore_selected.escape_attempt_absorbed_messages_prey = default_belly.escape_attempt_absorbed_messages_prey.Copy()
host.vore_selected.escape_absorbed_messages_owner = default_belly.escape_absorbed_messages_owner.Copy()
host.vore_selected.escape_absorbed_messages_prey = default_belly.escape_absorbed_messages_prey.Copy()
host.vore_selected.escape_absorbed_messages_outside = default_belly.escape_absorbed_messages_outside.Copy()
host.vore_selected.escape_fail_absorbed_messages_owner = default_belly.escape_fail_absorbed_messages_owner.Copy()
host.vore_selected.escape_fail_absorbed_messages_prey = default_belly.escape_fail_absorbed_messages_prey.Copy()
host.vore_selected.primary_transfer_messages_owner = default_belly.primary_transfer_messages_owner.Copy()
host.vore_selected.primary_transfer_messages_prey = default_belly.primary_transfer_messages_prey.Copy()
host.vore_selected.secondary_transfer_messages_owner = default_belly.secondary_transfer_messages_owner.Copy()
host.vore_selected.secondary_transfer_messages_prey = default_belly.secondary_transfer_messages_prey.Copy()
host.vore_selected.primary_autotransfer_messages_owner = default_belly.primary_autotransfer_messages_owner.Copy()
host.vore_selected.primary_autotransfer_messages_prey = default_belly.primary_autotransfer_messages_prey.Copy()
host.vore_selected.secondary_autotransfer_messages_owner = default_belly.secondary_autotransfer_messages_owner.Copy()
host.vore_selected.secondary_autotransfer_messages_prey = default_belly.secondary_autotransfer_messages_prey.Copy()
host.vore_selected.digest_chance_messages_owner = default_belly.digest_chance_messages_owner.Copy()
host.vore_selected.digest_chance_messages_prey = default_belly.digest_chance_messages_prey.Copy()
host.vore_selected.absorb_chance_messages_owner = default_belly.absorb_chance_messages_owner.Copy()
host.vore_selected.absorb_chance_messages_prey = default_belly.absorb_chance_messages_prey.Copy()
host.vore_selected.examine_messages = default_belly.examine_messages.Copy()
host.vore_selected.examine_messages_absorbed = default_belly.examine_messages_absorbed.Copy()
host.vore_selected.emote_lists = default_belly.emote_lists.Copy()
qdel(default_belly)
. = TRUE
if("b_verb")
var/new_verb = html_encode(tgui_input_text(user,"New verb when eating (infinitive tense, e.g. nom or swallow):","New Verb"))
@@ -704,22 +704,22 @@
//Aurora Goldtail
/obj/item/clothing/glasses/omnihud/prescription/aurora
name = "Round glasses"
desc = "A pair of circular shaped prescription glasses. They seem fit for a avian head and will most likely make anyone wearing these look like a big nerd. It seems they are outfitted with a augmented reality module."
icon = 'icons/vore/custom_clothes_yw.dmi'
icon_state = "aurora_glasses"
icon_override = 'icons/vore/custom_onmob_yw.dmi'
item_state = "aurora_glasses"
name = "Round glasses"
desc = "A pair of circular shaped prescription glasses. They seem fit for a avian head and will most likely make anyone wearing these look like a big nerd. It seems they are outfitted with a augmented reality module."
icon = 'icons/vore/custom_clothes_yw.dmi'
icon_state = "aurora_glasses"
icon_override = 'icons/vore/custom_onmob_yw.dmi'
item_state = "aurora_glasses"
//Strix Hades
//Strix Hades
/obj/item/clothing/suit/storage/teshari/cloak/fluff/strix
name = JOB_ALT_COLONY_DIRECTOR + " Coat"
desc = "It drapes over a Avali's shoulders and closes at the neck with pockets convienently placed inside. It bears the " + JOB_ALT_COLONY_DIRECTOR + "'s colors. The name 'Strix Hades' is embroilled in gold lettering around a golden embroilled outline on the neck collar."
icon = 'icons/vore/custom_clothes_yw.dmi'
icon_state = "tesh_cloak_cd"
icon_override = 'icons/vore/custom_clothes_yw.dmi'
item_state = "tesh_cloak_cd"
name = JOB_ALT_COLONY_DIRECTOR + " Coat"
desc = "It drapes over a Avali's shoulders and closes at the neck with pockets convienently placed inside. It bears the " + JOB_ALT_COLONY_DIRECTOR + "'s colors. The name 'Strix Hades' is embroilled in gold lettering around a golden embroilled outline on the neck collar."
icon = 'icons/vore/custom_clothes_yw.dmi'
icon_state = "tesh_cloak_cd"
icon_override = 'icons/vore/custom_clothes_yw.dmi'
item_state = "tesh_cloak_cd"
/obj/item/clothing/under/teshari/undercoat/fluff/strix
name = JOB_ALT_COLONY_DIRECTOR + " Undercoat"
@@ -733,12 +733,12 @@
)
/obj/item/clothing/suit/storage/teshari/cloak/fluff/strix_cco
name = "Central Command Cloak"
desc = "It drapes over a Avali's shoulders and closes at the neck with pockets convienently placed inside. It bears the Central Command's colors. The name 'Strix Hades' is embroilled in gold lettering around a golden embroilled outline on the neck collar."
icon = 'icons/vore/custom_clothes_yw.dmi'
icon_state = "tesh_cloak_cco"
icon_override = 'icons/vore/custom_clothes_yw.dmi'
item_state = "tesh_cloak_cco"
name = "Central Command Cloak"
desc = "It drapes over a Avali's shoulders and closes at the neck with pockets convienently placed inside. It bears the Central Command's colors. The name 'Strix Hades' is embroilled in gold lettering around a golden embroilled outline on the neck collar."
icon = 'icons/vore/custom_clothes_yw.dmi'
icon_state = "tesh_cloak_cco"
icon_override = 'icons/vore/custom_clothes_yw.dmi'
item_state = "tesh_cloak_cco"
/obj/item/clothing/under/teshari/undercoat/fluff/strix_cco
name = "Central Command Undercoat"
@@ -877,12 +877,12 @@
//Kita
/obj/item/clothing/suit/storage/teshari/cloak/fluff/kita
name = "Magical Cloak"
desc = "It drapes over a Teshari's shoulders and closes at the neck with pockets convienently placed inside. It bears magical colors."
icon = 'icons/vore/custom_clothes_yw.dmi'
icon_state = "tesh_cloak_kita"
icon_override = 'icons/vore/custom_clothes_yw.dmi'
item_state = "tesh_cloak_kita"
name = "Magical Cloak"
desc = "It drapes over a Teshari's shoulders and closes at the neck with pockets convienently placed inside. It bears magical colors."
icon = 'icons/vore/custom_clothes_yw.dmi'
icon_state = "tesh_cloak_kita"
icon_override = 'icons/vore/custom_clothes_yw.dmi'
item_state = "tesh_cloak_kita"
// ********
// lukevale
@@ -1088,12 +1088,12 @@
//Saroth
/obj/item/clothing/suit/storage/teshari/cloak/fluff/Saroth
name = "Research Director cloak"
desc = "It drapes over a Teshari's shoulders and closes at the neck with pockets conveniently placed inside. This one bears the colors of the science department with additional trimming to designate it as the research director's. It has 'operty of Saroth' sewed in on the inside at the neck. The pockets seem slightly bigger on the inside than they appear on the outside."
icon = 'icons/vore/custom_clothes_yw.dmi'
icon_state = "tesh_cloak_saroth"
icon_override = 'icons/vore/custom_clothes_yw.dmi'
item_state = "tesh_cloak_saroth"
name = "Research Director cloak"
desc = "It drapes over a Teshari's shoulders and closes at the neck with pockets conveniently placed inside. This one bears the colors of the science department with additional trimming to designate it as the research director's. It has 'operty of Saroth' sewed in on the inside at the neck. The pockets seem slightly bigger on the inside than they appear on the outside."
icon = 'icons/vore/custom_clothes_yw.dmi'
icon_state = "tesh_cloak_saroth"
icon_override = 'icons/vore/custom_clothes_yw.dmi'
item_state = "tesh_cloak_saroth"
/obj/item/clothing/accessory/poncho/cloak/fluff/Jaree
name = "plain cloak"
@@ -1,5 +1,5 @@
//Unused file due to icon update upstream.
/obj/item/depth_scanner //On second thought, the ano_scanner sprite looks better as a depth scanner instead of an anomaly scanner.
icon_state = "ano_scanner"
icon = 'icons/obj/xenoarchaeology_vr.dmi'
icon_state = "ano_scanner"
icon = 'icons/obj/xenoarchaeology_vr.dmi'
@@ -44,15 +44,15 @@
contraband = 1
/datum/supply_pack/munitions/bolt_rifles_militia
name = "Weapon - Surplus militia rifles"
contains = list(
/obj/item/gun/projectile/shotgun/pump/rifle = 3,
/obj/item/ammo_magazine/clip/c762 = 6
)
cost = 1000
contraband = 1
containertype = /obj/structure/closet/crate/hedberg
containername = "Ballistic weapons crate"
name = "Weapon - Surplus militia rifles"
contains = list(
/obj/item/gun/projectile/shotgun/pump/rifle = 3,
/obj/item/ammo_magazine/clip/c762 = 6
)
cost = 1000
contraband = 1
containertype = /obj/structure/closet/crate/hedberg
containername = "Ballistic weapons crate"
/datum/supply_pack/randomised/misc/telecrate
name = "Confiscated equipment"
@@ -233,7 +233,7 @@
edge_blending_priority = 4
turf_layers = list(/turf/simulated/floor/outdoors/desert_planet/sand)
//I want this for the water tiles
//I want this for the water tiles
/turf/simulated/floor/water
name = "shallow water"
desc = "A body of water. It seems shallow enough to walk through, if needed."
@@ -332,7 +332,7 @@
new /obj/item/bikehorn(location)
M.custom_pain("You suddenly cough up a bikehorn!",60)
/*why is this in here twice? -Lo
/*why is this in here twice? -Lo
/datum/reagent/inaprovaline/synxchem/affect_blood(var/mob/living/carbon/M, var/alien, var/removed)
if(alien != IS_DIONA)
if(prob(5))
@@ -851,30 +851,30 @@
/mob/living/simple_mob/animal/synx/ai/pet/greed/synth
/*
▓███▓ ▓▓▓ ▓▓▓ ▓▓▓ ▓▓▓ ▓███▓
▓▓ ▓▓▓█ ▓▓ ▓▓█ ▓▓ ▓▓█ ▓▓ ▓▓█ ▓▓ ▓▓█ ▓▓ ▓▓▓█
▓ ▓▓▓▓ ▓▓▓ ▓▓▓ ▓▓▓ ▓▓▓ ▓▓▓▓
▓ █▓▓▓ █▓▓ █▓▓ █▓▓ █▓▓ █▓▓▓
▓ █▓▓▓▓█ █▓▓ ▓█ █▓▓ ▓█ █▓▓█▓█ █▓▓▓ █▓▓▓
▓ █▓▓▓ ▓█▓ █▓█▓█ █▓█▓█ ▓▓█ ▓█ █▓▓▓
▓█ █▓▓▓ ▓▓▓ ▓▓▓ ▓▓ █▓▓▓
▓▓ █▓▓ ▓ ▓ ▓ █▓▓▓
▓ █▓▓ ▓█ █▓▓
▓ ▓▓▓ ▓▓ █▓▓
█\ ▓▓ ▓▓ ▓█ ▓ █▓▓
▓█\ ▓█ ▓█▓ ▓▓▓ █▓ █▓▓
▓▓▓█ ▓ ▓▓▓▓ ▓ ▓▓ ▓ █▓▓
▓█▓ ▓▓█▓▓ ▓ ▓▓ ▓▓▓
▓▓ █▓▓█ █▓ █▓▓
▓▓ ▓▓▓ ▓▓ █▓▓
▓ ▓▓▓ ▓ █▓▓
▓▓ █▓▓█ █▓ █▓▓▓
▓ █▓▓▓ ▓▓█ █▓█ ▓▓ █▓▓▓
▓ █▓▓▓▓▓ ▓▓█ ▓▓ ▓▓█▓ █▓▓▓
▓ █▓▓▓ ▓▓▓ ▓▓▓ █▓▓▓
▓ █▓▓▓ ▓▓▓ ▓▓▓ █▓▓▓
▓█▓██▓▓▓█▓█▓█▓▓▓█▓█▓█▓▓▓█▓█▓██▓▓▓
*/
* ▓███▓ ▓▓▓ ▓▓▓ ▓▓▓ ▓▓▓ ▓███▓
* ▓▓ ▓▓▓█ ▓▓ ▓▓█ ▓▓ ▓▓█ ▓▓ ▓▓█ ▓▓ ▓▓█ ▓▓ ▓▓▓█
* ▓ ▓▓▓▓ ▓▓▓ ▓▓▓ ▓▓▓ ▓▓▓ ▓▓▓▓
* ▓ █▓▓▓ █▓▓ █▓▓ █▓▓ █▓▓ █▓▓▓
* ▓ █▓▓▓▓█ █▓▓ ▓█ █▓▓ ▓█ █▓▓█▓█ █▓▓▓ █▓▓▓
* ▓ █▓▓▓ ▓█▓ █▓█▓█ █▓█▓█ ▓▓█ ▓█ █▓▓▓
* ▓█ █▓▓▓ ▓▓▓ ▓▓▓ ▓▓ █▓▓▓
* ▓▓ █▓▓ ▓ ▓ ▓ █▓▓▓
* ▓ █▓▓ ▓█ █▓▓
* ▓ ▓▓▓ ▓▓ █▓▓
* █\ ▓▓ ▓▓ ▓█ ▓ █▓▓
* ▓█\ ▓█ ▓█▓ ▓▓▓ █▓ █▓▓
* ▓▓▓█ ▓ ▓▓▓▓ ▓ ▓▓ ▓ █▓▓
* ▓█▓ ▓▓█▓▓ ▓ ▓▓ ▓▓▓
* ▓▓ █▓▓█ █▓ █▓▓
* ▓▓ ▓▓▓ ▓▓ █▓▓
* ▓ ▓▓▓ ▓ █▓▓
* ▓▓ █▓▓█ █▓ █▓▓▓
* ▓ █▓▓▓ ▓▓█ █▓█ ▓▓ █▓▓▓
* ▓ █▓▓▓▓▓ ▓▓█ ▓▓ ▓▓█▓ █▓▓▓
* ▓ █▓▓▓ ▓▓▓ ▓▓▓ █▓▓▓
* ▓ █▓▓▓ ▓▓▓ ▓▓▓ █▓▓▓
* ▓█▓██▓▓▓█▓█▓█▓▓▓█▓█▓█▓▓▓█▓█▓██▓▓▓
*/
icon_state = "synx_C_living"
icon_living = "synx_C_living"
icon_dead = "synx_C_dead"

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