Merge pull request #2 from CHOMPStation2/master

Keeping the bot's fork up to date
This commit is contained in:
cadyn
2020-10-28 21:42:40 -07:00
committed by GitHub
242 changed files with 31363 additions and 4575 deletions
+10 -4
View File
@@ -1,5 +1,6 @@
#pretending we're C because otherwise ruby will initialize, even with "language: dm".
language: c
language: generic
os: linux
dist: bionic
env:
global:
@@ -12,10 +13,14 @@ cache:
addons:
apt:
packages:
- libc6-i386
- libc6:i386
- libgcc1:i386
- libstdc++6:i386
- libssl-dev:i386
- libssl1.1:i386
- g++-7
- g++-7-multilib
- gcc-multilib
- zlib1g:i386
before_install:
- chmod -R +x ./tools/travis
@@ -27,6 +32,7 @@ before_script:
- shopt -s globstar
script:
- ldd librust_g.so
- ./tools/travis/compile_and_run.sh
# Build-specific settings
+1 -1
View File
@@ -4,7 +4,7 @@ export SPACEMANDMM_TAG=suite-1.4
# For NanoUI + TGUI
export NODE_VERSION=12
# For the scripts in tools
export PHP_VERSION=5.6
export PHP_VERSION=7.2
# Byond Major
export BYOND_MAJOR=513
# Byond Minor
-4
View File
@@ -7,10 +7,6 @@
2 for preloading absolutely everything;
*/
#define RUST_G "rust_g" // If uncommented, we will use the rust-g (https://github.com/tgstation/rust-g) native library for fast
// logging. This requires you to have the rust_g.dll or rust_g (renamed from librust_g.so) installed in the root folder or BYOND/bin
// The define's value should be the name of library file.
// ZAS Compile Options
//#define ZASDBG // Uncomment to turn on super detailed ZAS debugging that probably won't even compile.
#define MULTIZAS // Uncomment to turn on Multi-Z ZAS Support!
+41
View File
@@ -0,0 +1,41 @@
/// Return this from `/datum/component/Initialize` or `datum/component/OnTransfer` to have the component be deleted if it's applied to an incorrect type.
/// `parent` must not be modified if this is to be returned.
/// This will be noted in the runtime logs
#define COMPONENT_INCOMPATIBLE 1
/// Returned in PostTransfer to prevent transfer, similar to `COMPONENT_INCOMPATIBLE`
#define COMPONENT_NOTRANSFER 2
/// Return value to cancel attaching
#define ELEMENT_INCOMPATIBLE 1
// /datum/element flags
/// Causes the detach proc to be called when the host object is being deleted
#define ELEMENT_DETACH (1 << 0)
/**
* Only elements created with the same arguments given after `id_arg_index` share an element instance
* The arguments are the same when the text and number values are the same and all other values have the same ref
*/
#define ELEMENT_BESPOKE (1 << 1)
// How multiple components of the exact same type are handled in the same datum
/// old component is deleted (default)
#define COMPONENT_DUPE_HIGHLANDER 0
/// duplicates allowed
#define COMPONENT_DUPE_ALLOWED 1
/// new component is deleted
#define COMPONENT_DUPE_UNIQUE 2
/// old component is given the initialization args of the new
#define COMPONENT_DUPE_UNIQUE_PASSARGS 4
/// each component of the same type is consulted as to whether the duplicate should be allowed
#define COMPONENT_DUPE_SELECTIVE 5
//Redirection component init flags
#define REDIRECT_TRANSFER_WITH_TURF 1
//Arch
#define ARCH_PROB "probability" //Probability for each item
#define ARCH_MAXDROP "max_drop_amount" //each item's max drop amount
//Ouch my toes!
#define CALTROP_BYPASS_SHOES 1
#define CALTROP_IGNORE_WALKERS 2
+15
View File
@@ -0,0 +1,15 @@
/// Used to trigger signals and call procs registered for that signal
/// The datum hosting the signal is automaticaly added as the first argument
/// Returns a bitfield gathered from all registered procs
/// Arguments given here are packaged in a list and given to _SendSignal
#define SEND_SIGNAL(target, sigtype, arguments...) ( !target.comp_lookup || !target.comp_lookup[sigtype] ? NONE : target._SendSignal(sigtype, list(target, ##arguments)) )
#define SEND_GLOBAL_SIGNAL(sigtype, arguments...) ( SEND_SIGNAL(SSdcs, sigtype, ##arguments) )
/// A wrapper for _AddElement that allows us to pretend we're using normal named arguments
#define AddElement(arguments...) _AddElement(list(##arguments))
/// A wrapper for _RemoveElement that allows us to pretend we're using normal named arguments
#define RemoveElement(arguments...) _RemoveElement(list(##arguments))
/// A wrapper for _AddComponent that allows us to pretend we're using normal named arguments
#define AddComponent(arguments...) _AddComponent(list(##arguments))
+732
View File
@@ -0,0 +1,732 @@
// All signals. Format:
// When the signal is called: (signal arguments)
// All signals send the source datum of the signal as the first argument
// global signals
// These are signals which can be listened to by any component on any parent
// start global signals with "!", this used to be necessary but now it's just a formatting choice
///from base of datum/controller/subsystem/mapping/proc/add_new_zlevel(): (list/args)
#define COMSIG_GLOB_NEW_Z "!new_z"
/// called after a successful var edit somewhere in the world: (list/args)
#define COMSIG_GLOB_VAR_EDIT "!var_edit"
/// called after an explosion happened : (epicenter, devastation_range, heavy_impact_range, light_impact_range, took, orig_dev_range, orig_heavy_range, orig_light_range)
#define COMSIG_GLOB_EXPLOSION "!explosion"
/// mob was created somewhere : (mob)
#define COMSIG_GLOB_MOB_CREATED "!mob_created"
/// mob died somewhere : (mob , gibbed)
#define COMSIG_GLOB_MOB_DEATH "!mob_death"
/// global living say plug - use sparingly: (mob/speaker , message)
#define COMSIG_GLOB_LIVING_SAY_SPECIAL "!say_special"
/// called by datum/cinematic/play() : (datum/cinematic/new_cinematic)
#define COMSIG_GLOB_PLAY_CINEMATIC "!play_cinematic"
#define COMPONENT_GLOB_BLOCK_CINEMATIC (1<<0)
/// ingame button pressed (/obj/machinery/button/button)
#define COMSIG_GLOB_BUTTON_PRESSED "!button_pressed"
/// signals from globally accessible objects
///from SSsun when the sun changes position : (azimuth)
#define COMSIG_SUN_MOVED "sun_moved"
//////////////////////////////////////////////////////////////////
// /datum signals
/// when a component is added to a datum: (/datum/component)
#define COMSIG_COMPONENT_ADDED "component_added"
/// before a component is removed from a datum because of RemoveComponent: (/datum/component)
#define COMSIG_COMPONENT_REMOVING "component_removing"
/// before a datum's Destroy() is called: (force), returning a nonzero value will cancel the qdel operation
#define COMSIG_PARENT_PREQDELETED "parent_preqdeleted"
/// just before a datum's Destroy() is called: (force), at this point none of the other components chose to interrupt qdel and Destroy will be called
#define COMSIG_PARENT_QDELETING "parent_qdeleting"
/// generic topic handler (usr, href_list)
#define COMSIG_TOPIC "handle_topic"
/// fires on the target datum when an element is attached to it (/datum/element)
#define COMSIG_ELEMENT_ATTACH "element_attach"
/// fires on the target datum when an element is attached to it (/datum/element)
#define COMSIG_ELEMENT_DETACH "element_detach"
// /atom signals
///from base of atom/proc/Initialize(): sent any time a new atom is created
#define COMSIG_ATOM_CREATED "atom_created"
//from SSatoms InitAtom - Only if the atom was not deleted or failed initialization
#define COMSIG_ATOM_AFTER_SUCCESSFUL_INITIALIZE "atom_init_success"
///from base of atom/attackby(): (/obj/item, /mob/living, params)
#define COMSIG_PARENT_ATTACKBY "atom_attackby"
///Return this in response if you don't want afterattack to be called
#define COMPONENT_NO_AFTERATTACK (1<<0)
///from base of atom/attack_hulk(): (/mob/living/carbon/human)
#define COMSIG_ATOM_HULK_ATTACK "hulk_attack"
///from base of atom/animal_attack(): (/mob/user)
#define COMSIG_ATOM_ATTACK_ANIMAL "attack_animal"
///from base of atom/examine(): (/mob)
#define COMSIG_PARENT_EXAMINE "atom_examine"
///from base of atom/get_examine_name(): (/mob, list/overrides)
#define COMSIG_ATOM_GET_EXAMINE_NAME "atom_examine_name"
//Positions for overrides list
#define EXAMINE_POSITION_ARTICLE (1<<0)
#define EXAMINE_POSITION_BEFORE (1<<1)
//End positions
#define COMPONENT_EXNAME_CHANGED (1<<0)
///from base of atom/update_icon(): ()
#define COMSIG_ATOM_UPDATE_ICON "atom_update_icon"
#define COMSIG_ATOM_NO_UPDATE_ICON_STATE (1<<0)
#define COMSIG_ATOM_NO_UPDATE_OVERLAYS (1<<1)
///from base of atom/update_overlays(): (list/new_overlays)
#define COMSIG_ATOM_UPDATE_OVERLAYS "atom_update_overlays"
///from base of atom/update_icon(): (signalOut, did_anything)
#define COMSIG_ATOM_UPDATED_ICON "atom_updated_icon"
///from base of atom/Entered(): (atom/movable/entering, /atom)
#define COMSIG_ATOM_ENTERED "atom_entered"
///from base of atom/Exit(): (/atom/movable/exiting, /atom/newloc)
#define COMSIG_ATOM_EXIT "atom_exit"
#define COMPONENT_ATOM_BLOCK_EXIT (1<<0)
///from base of atom/Exited(): (atom/movable/exiting, atom/newloc)
#define COMSIG_ATOM_EXITED "atom_exited"
///from base of atom/Bumped(): (/atom/movable)
#define COMSIG_ATOM_BUMPED "atom_bumped"
///from base of atom/ex_act(): (severity, target)
#define COMSIG_ATOM_EX_ACT "atom_ex_act"
///from base of atom/emp_act(): (severity)
#define COMSIG_ATOM_EMP_ACT "atom_emp_act"
///from base of atom/fire_act(): (exposed_temperature, exposed_volume)
#define COMSIG_ATOM_FIRE_ACT "atom_fire_act"
///from base of atom/bullet_act(): (/obj/projectile, def_zone)
#define COMSIG_ATOM_BULLET_ACT "atom_bullet_act"
///from base of atom/blob_act(): (/obj/structure/blob)
#define COMSIG_ATOM_BLOB_ACT "atom_blob_act"
///from base of atom/acid_act(): (acidpwr, acid_volume)
#define COMSIG_ATOM_ACID_ACT "atom_acid_act"
///from base of atom/emag_act(): (/mob/user)
#define COMSIG_ATOM_EMAG_ACT "atom_emag_act"
///from base of atom/rad_act(intensity)
#define COMSIG_ATOM_RAD_ACT "atom_rad_act"
///from base of atom/narsie_act(): ()
#define COMSIG_ATOM_NARSIE_ACT "atom_narsie_act"
///from base of atom/rcd_act(): (/mob, /obj/item/construction/rcd, passed_mode)
#define COMSIG_ATOM_RCD_ACT "atom_rcd_act"
///from base of atom/singularity_pull(): (S, current_size)
#define COMSIG_ATOM_SING_PULL "atom_sing_pull"
///from obj/machinery/bsa/full/proc/fire(): ()
#define COMSIG_ATOM_BSA_BEAM "atom_bsa_beam_pass"
#define COMSIG_ATOM_BLOCKS_BSA_BEAM (1<<0)
///from base of atom/set_light(): (l_range, l_power, l_color)
#define COMSIG_ATOM_SET_LIGHT "atom_set_light"
///from base of atom/setDir(): (old_dir, new_dir)
#define COMSIG_ATOM_DIR_CHANGE "atom_dir_change"
///from base of atom/handle_atom_del(): (atom/deleted)
#define COMSIG_ATOM_CONTENTS_DEL "atom_contents_del"
///from base of atom/has_gravity(): (turf/location, list/forced_gravities)
#define COMSIG_ATOM_HAS_GRAVITY "atom_has_gravity"
///from proc/get_rad_contents(): ()
#define COMSIG_ATOM_RAD_PROBE "atom_rad_probe"
#define COMPONENT_BLOCK_RADIATION (1<<0)
///from base of datum/radiation_wave/radiate(): (strength)
#define COMSIG_ATOM_RAD_CONTAMINATING "atom_rad_contam"
#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)
///from internal loop in atom/movable/proc/CanReach(): (list/next)
#define COMSIG_ATOM_CANREACH "atom_can_reach"
#define COMPONENT_BLOCK_REACH (1<<0)
///from base of atom/screwdriver_act(): (mob/living/user, obj/item/I)
#define COMSIG_ATOM_SCREWDRIVER_ACT "atom_screwdriver_act"
///from base of atom/wrench_act(): (mob/living/user, obj/item/I)
#define COMSIG_ATOM_WRENCH_ACT "atom_wrench_act"
///from base of atom/multitool_act(): (mob/living/user, obj/item/I)
#define COMSIG_ATOM_MULTITOOL_ACT "atom_multitool_act"
///from base of atom/welder_act(): (mob/living/user, obj/item/I)
#define COMSIG_ATOM_WELDER_ACT "atom_welder_act"
///from base of atom/wirecutter_act(): (mob/living/user, obj/item/I)
#define COMSIG_ATOM_WIRECUTTER_ACT "atom_wirecutter_act"
///from base of atom/crowbar_act(): (mob/living/user, obj/item/I)
#define COMSIG_ATOM_CROWBAR_ACT "atom_crowbar_act"
///from base of atom/analyser_act(): (mob/living/user, obj/item/I)
#define COMSIG_ATOM_ANALYSER_ACT "atom_analyser_act"
#define COMPONENT_BLOCK_TOOL_ATTACK (1<<0)
///called when teleporting into a protected turf: (channel, turf/origin)
#define COMSIG_ATOM_INTERCEPT_TELEPORT "intercept_teleport"
#define COMPONENT_BLOCK_TELEPORT (1<<0)
///called when an atom is added to the hearers on get_hearers_in_view(): (list/processing_list, list/hearers)
#define COMSIG_ATOM_HEARER_IN_VIEW "atom_hearer_in_view"
///called when an atom starts orbiting another atom: (atom)
#define COMSIG_ATOM_ORBIT_BEGIN "atom_orbit_begin"
///called when an atom stops orbiting another atom: (atom)
#define COMSIG_ATOM_ORBIT_STOP "atom_orbit_stop"
/////////////////
///from base of atom/attack_ghost(): (mob/dead/observer/ghost)
#define COMSIG_ATOM_ATTACK_GHOST "atom_attack_ghost"
///from base of atom/attack_hand(): (mob/user)
#define COMSIG_ATOM_ATTACK_HAND "atom_attack_hand"
///from base of atom/attack_paw(): (mob/user)
#define COMSIG_ATOM_ATTACK_PAW "atom_attack_paw"
#define COMPONENT_NO_ATTACK_HAND (1<<0) //works on all 3.
//This signal return value bitflags can be found in __DEFINES/misc.dm
///called for each movable in a turf contents on /turf/zImpact(): (atom/movable/A, levels)
#define COMSIG_ATOM_INTERCEPT_Z_FALL "movable_intercept_z_impact"
///called on a movable (NOT living) when someone starts pulling it (atom/movable/puller, state, force)
#define COMSIG_ATOM_START_PULL "movable_start_pull"
///called on /living when someone starts pulling it (atom/movable/puller, state, force)
#define COMSIG_LIVING_START_PULL "living_start_pull"
/////////////////
///from base of area/Entered(): (/area)
#define COMSIG_ENTER_AREA "enter_area"
///from base of area/Exited(): (/area)
#define COMSIG_EXIT_AREA "exit_area"
///from base of atom/Click(): (location, control, params, mob/user)
#define COMSIG_CLICK "atom_click"
///from base of atom/ShiftClick(): (/mob)
#define COMSIG_CLICK_SHIFT "shift_click"
#define COMPONENT_ALLOW_EXAMINATE (1<<0) //Allows the user to examinate regardless of client.eye.
///from base of atom/CtrlClickOn(): (/mob)
#define COMSIG_CLICK_CTRL "ctrl_click"
///from base of atom/AltClick(): (/mob)
#define COMSIG_CLICK_ALT "alt_click"
///from base of atom/CtrlShiftClick(/mob)
#define COMSIG_CLICK_CTRL_SHIFT "ctrl_shift_click"
///from base of atom/MouseDrop(): (/atom/over, /mob/user)
#define COMSIG_MOUSEDROP_ONTO "mousedrop_onto"
#define COMPONENT_NO_MOUSEDROP (1<<0)
///from base of atom/MouseDrop_T: (/atom/from, /mob/user)
#define COMSIG_MOUSEDROPPED_ONTO "mousedropped_onto"
// /area signals
///from base of area/Entered(): (atom/movable/M)
#define COMSIG_AREA_ENTERED "area_entered"
///from base of area/Exited(): (atom/movable/M)
#define COMSIG_AREA_EXITED "area_exited"
// /turf signals
///from base of turf/ChangeTurf(): (path, list/new_baseturfs, flags, list/transferring_comps)
#define COMSIG_TURF_CHANGE "turf_change"
///from base of atom/has_gravity(): (atom/asker, list/forced_gravities)
#define COMSIG_TURF_HAS_GRAVITY "turf_has_gravity"
///from base of turf/New(): (turf/source, direction)
#define COMSIG_TURF_MULTIZ_NEW "turf_multiz_new"
// /atom/movable signals
///from base of atom/movable/Moved(): (/atom)
#define COMSIG_MOVABLE_PRE_MOVE "movable_pre_move"
#define COMPONENT_MOVABLE_BLOCK_PRE_MOVE (1<<0)
///from base of atom/movable/Moved(): (/atom, dir)
#define COMSIG_MOVABLE_MOVED "movable_moved"
///from base of atom/movable/Cross(): (/atom/movable)
#define COMSIG_MOVABLE_CROSS "movable_cross"
///from base of atom/movable/Crossed(): (/atom/movable)
#define COMSIG_MOVABLE_CROSSED "movable_crossed"
///when we cross over something (calling Crossed() on that atom)
#define COMSIG_CROSSED_MOVABLE "crossed_movable"
///from base of atom/movable/Uncross(): (/atom/movable)
#define COMSIG_MOVABLE_UNCROSS "movable_uncross"
#define COMPONENT_MOVABLE_BLOCK_UNCROSS (1<<0)
///from base of atom/movable/Uncrossed(): (/atom/movable)
#define COMSIG_MOVABLE_UNCROSSED "movable_uncrossed"
///from base of atom/movable/Bump(): (/atom)
#define COMSIG_MOVABLE_BUMP "movable_bump"
///from base of atom/movable/throw_impact(): (/atom/hit_atom, /datum/thrownthing/throwingdatum)
#define COMSIG_MOVABLE_IMPACT "movable_impact"
#define COMPONENT_MOVABLE_IMPACT_FLIP_HITPUSH (1<<0) //if true, flip if the impact will push what it hits
#define COMPONENT_MOVABLE_IMPACT_NEVERMIND (1<<1) //return true if you destroyed whatever it was you're impacting and there won't be anything for hitby() to run on
///from base of mob/living/hitby(): (mob/living/target, hit_zone)
#define COMSIG_MOVABLE_IMPACT_ZONE "item_impact_zone"
///from base of atom/movable/buckle_mob(): (mob, force)
#define COMSIG_MOVABLE_BUCKLE "buckle"
///from base of atom/movable/unbuckle_mob(): (mob, force)
#define COMSIG_MOVABLE_UNBUCKLE "unbuckle"
///from base of atom/movable/throw_at(): (list/args)
#define COMSIG_MOVABLE_PRE_THROW "movable_pre_throw"
#define COMPONENT_CANCEL_THROW (1<<0)
///from base of atom/movable/throw_at(): (datum/thrownthing, spin)
#define COMSIG_MOVABLE_POST_THROW "movable_post_throw"
///from base of atom/movable/onTransitZ(): (old_z, new_z)
#define COMSIG_MOVABLE_Z_CHANGED "movable_ztransit"
///called when the movable is placed in an unaccessible area, used for stationloving: ()
#define COMSIG_MOVABLE_SECLUDED_LOCATION "movable_secluded"
///from base of atom/movable/Hear(): (proc args list(message, atom/movable/speaker, message_language, raw_message, radio_freq, list/spans, message_mode))
#define COMSIG_MOVABLE_HEAR "movable_hear"
#define HEARING_MESSAGE 1
#define HEARING_SPEAKER 2
// #define HEARING_LANGUAGE 3
#define HEARING_RAW_MESSAGE 4
/* #define HEARING_RADIO_FREQ 5
#define HEARING_SPANS 6
#define HEARING_MESSAGE_MODE 7 */
///called when the movable is added to a disposal holder object for disposal movement: (obj/structure/disposalholder/holder, obj/machinery/disposal/source)
#define COMSIG_MOVABLE_DISPOSING "movable_disposing"
// /mob signals
///from base of /mob/Login(): ()
#define COMSIG_MOB_LOGIN "mob_login"
///from base of /mob/Logout(): ()
#define COMSIG_MOB_LOGOUT "mob_logout"
///from base of mob/death(): (gibbed)
#define COMSIG_MOB_DEATH "mob_death"
///from base of mob/set_stat(): (new_stat)
#define COMSIG_MOB_STATCHANGE "mob_statchange"
///from base of mob/clickon(): (atom/A, params)
#define COMSIG_MOB_CLICKON "mob_clickon"
///from base of mob/MiddleClickOn(): (atom/A)
#define COMSIG_MOB_MIDDLECLICKON "mob_middleclickon"
///from base of mob/AltClickOn(): (atom/A)
#define COMSIG_MOB_ALTCLICKON "mob_altclickon"
#define COMSIG_MOB_CANCEL_CLICKON (1<<0)
///from base of obj/allowed(mob/M): (/obj) returns bool, if TRUE the mob has id access to the obj
#define COMSIG_MOB_ALLOWED "mob_allowed"
///from base of mob/anti_magic_check(): (mob/user, magic, holy, tinfoil, chargecost, self, protection_sources)
#define COMSIG_MOB_RECEIVE_MAGIC "mob_receive_magic"
#define COMPONENT_BLOCK_MAGIC (1<<0)
///from base of mob/create_mob_hud(): ()
#define COMSIG_MOB_HUD_CREATED "mob_hud_created"
///from base of atom/attack_hand(): (mob/user)
#define COMSIG_MOB_ATTACK_HAND "mob_attack_hand"
///from base of /obj/item/attack(): (mob/M, mob/user)
#define COMSIG_MOB_ITEM_ATTACK "mob_item_attack"
#define COMPONENT_ITEM_NO_ATTACK (1<<0)
///from base of /mob/living/proc/apply_damage(): (damage, damagetype, def_zone)
#define COMSIG_MOB_APPLY_DAMGE "mob_apply_damage"
///from base of obj/item/afterattack(): (atom/target, mob/user, proximity_flag, click_parameters)
#define COMSIG_MOB_ITEM_AFTERATTACK "mob_item_afterattack"
///from base of obj/item/attack_qdeleted(): (atom/target, mob/user, proxiumity_flag, click_parameters)
#define COMSIG_MOB_ITEM_ATTACK_QDELETED "mob_item_attack_qdeleted"
///from base of mob/RangedAttack(): (atom/A, params)
#define COMSIG_MOB_ATTACK_RANGED "mob_attack_ranged"
///from base of /mob/throw_item(): (atom/target)
#define COMSIG_MOB_THROW "mob_throw"
///from base of /mob/verb/examinate(): (atom/target)
#define COMSIG_MOB_EXAMINATE "mob_examinate"
///from base of /mob/update_sight(): ()
#define COMSIG_MOB_UPDATE_SIGHT "mob_update_sight"
////from /mob/living/say(): ()
#define COMSIG_MOB_SAY "mob_say"
#define COMPONENT_UPPERCASE_SPEECH (1<<0)
// used to access COMSIG_MOB_SAY argslist
#define SPEECH_MESSAGE 1
// #define SPEECH_BUBBLE_TYPE 2
#define SPEECH_SPANS 3
/* #define SPEECH_SANITIZE 4
#define SPEECH_LANGUAGE 5
#define SPEECH_IGNORE_SPAM 6
#define SPEECH_FORCED 7 */
///from /mob/say_dead(): (mob/speaker, message)
#define COMSIG_MOB_DEADSAY "mob_deadsay"
#define MOB_DEADSAY_SIGNAL_INTERCEPT (1<<0)
///from /mob/living/emote(): ()
#define COMSIG_MOB_EMOTE "mob_emote"
///from base of mob/swap_hand(): (obj/item)
#define COMSIG_MOB_SWAP_HANDS "mob_swap_hands"
#define COMPONENT_BLOCK_SWAP (1<<0)
// /mob/living signals
///from base of mob/living/resist() (/mob/living)
#define COMSIG_LIVING_RESIST "living_resist"
///from base of mob/living/IgniteMob() (/mob/living)
#define COMSIG_LIVING_IGNITED "living_ignite"
///from base of mob/living/ExtinguishMob() (/mob/living)
#define COMSIG_LIVING_EXTINGUISHED "living_extinguished"
///from base of mob/living/electrocute_act(): (shock_damage, source, siemens_coeff, flags)
#define COMSIG_LIVING_ELECTROCUTE_ACT "living_electrocute_act"
///sent when items with siemen coeff. of 0 block a shock: (power_source, source, siemens_coeff, dist_check)
#define COMSIG_LIVING_SHOCK_PREVENTED "living_shock_prevented"
///sent by stuff like stunbatons and tasers: ()
#define COMSIG_LIVING_MINOR_SHOCK "living_minor_shock"
///from base of mob/living/revive() (full_heal, admin_revive)
#define COMSIG_LIVING_REVIVE "living_revive"
///from base of /mob/living/regenerate_limbs(): (noheal, excluded_limbs)
#define COMSIG_LIVING_REGENERATE_LIMBS "living_regen_limbs"
///from base of /obj/item/bodypart/proc/attach_limb(): (new_limb, special) allows you to fail limb attachment
#define COMSIG_LIVING_ATTACH_LIMB "living_attach_limb"
#define COMPONENT_NO_ATTACH (1<<0)
///sent from borg recharge stations: (amount, repairs)
#define COMSIG_PROCESS_BORGCHARGER_OCCUPANT "living_charge"
///sent when a mob/login() finishes: (client)
#define COMSIG_MOB_CLIENT_LOGIN "comsig_mob_client_login"
///sent from borg mobs to itself, for tools to catch an upcoming destroy() due to safe decon (rather than detonation)
#define COMSIG_BORG_SAFE_DECONSTRUCT "borg_safe_decon"
//ALL OF THESE DO NOT TAKE INTO ACCOUNT WHETHER AMOUNT IS 0 OR LOWER AND ARE SENT REGARDLESS!
///from base of mob/living/Stun() (amount, update, ignore)
#define COMSIG_LIVING_STATUS_STUN "living_stun"
///from base of mob/living/Knockdown() (amount, update, ignore)
#define COMSIG_LIVING_STATUS_KNOCKDOWN "living_knockdown"
///from base of mob/living/Paralyze() (amount, update, ignore)
#define COMSIG_LIVING_STATUS_PARALYZE "living_paralyze"
///from base of mob/living/Immobilize() (amount, update, ignore)
#define COMSIG_LIVING_STATUS_IMMOBILIZE "living_immobilize"
///from base of mob/living/Unconscious() (amount, update, ignore)
#define COMSIG_LIVING_STATUS_UNCONSCIOUS "living_unconscious"
///from base of mob/living/Sleeping() (amount, update, ignore)
#define COMSIG_LIVING_STATUS_SLEEP "living_sleeping"
#define COMPONENT_NO_STUN (1<<0) //For all of them
///from base of /mob/living/can_track(): (mob/user)
#define COMSIG_LIVING_CAN_TRACK "mob_cantrack"
#define COMPONENT_CANT_TRACK (1<<0)
// /mob/living/carbon signals
///from base of mob/living/carbon/soundbang_act(): (list(intensity))
#define COMSIG_CARBON_SOUNDBANG "carbon_soundbang"
///from /item/organ/proc/Insert() (/obj/item/organ/)
#define COMSIG_CARBON_GAIN_ORGAN "carbon_gain_organ"
///from /item/organ/proc/Remove() (/obj/item/organ/)
#define COMSIG_CARBON_LOSE_ORGAN "carbon_lose_organ"
///from /mob/living/carbon/doUnEquip(obj/item/I, force, newloc, no_move, invdrop, silent)
#define COMSIG_CARBON_EQUIP_HAT "carbon_equip_hat"
///from /mob/living/carbon/doUnEquip(obj/item/I, force, newloc, no_move, invdrop, silent)
#define COMSIG_CARBON_UNEQUIP_HAT "carbon_unequip_hat"
///defined twice, in carbon and human's topics, fired when interacting with a valid embedded_object to pull it out (mob/living/carbon/target, /obj/item, /obj/item/bodypart/L)
#define COMSIG_CARBON_EMBED_RIP "item_embed_start_rip"
///called when removing a given item from a mob, from mob/living/carbon/remove_embedded_object(mob/living/carbon/target, /obj/item)
#define COMSIG_CARBON_EMBED_REMOVAL "item_embed_remove_safe"
// /mob/living/simple_animal/hostile signals
#define COMSIG_HOSTILE_ATTACKINGTARGET "hostile_attackingtarget"
#define COMPONENT_HOSTILE_NO_ATTACK (1<<0)
// /obj signals
///from base of obj/deconstruct(): (disassembled)
#define COMSIG_OBJ_DECONSTRUCT "obj_deconstruct"
///called in /obj/structure/setAnchored(): (value)
#define COMSIG_OBJ_SETANCHORED "obj_setanchored"
///from base of code/game/machinery
#define COMSIG_OBJ_DEFAULT_UNFASTEN_WRENCH "obj_default_unfasten_wrench"
///from base of /turf/proc/levelupdate(). (intact) true to hide and false to unhide
#define COMSIG_OBJ_HIDE "obj_hide"
///called in /obj/update_icon()
#define COMSIG_OBJ_UPDATE_ICON "obj_update_icon"
// /obj/machinery signals
///from /obj/machinery/obj_break(damage_flag): (damage_flag)
#define COMSIG_MACHINERY_BROKEN "machinery_broken"
///from base power_change() when power is lost
#define COMSIG_MACHINERY_POWER_LOST "machinery_power_lost"
///from base power_change() when power is restored
#define COMSIG_MACHINERY_POWER_RESTORED "machinery_power_restored"
// /obj/item signals
///from base of obj/item/attack(): (/mob/living/target, /mob/living/user)
#define COMSIG_ITEM_ATTACK "item_attack"
///from base of obj/item/attack_self(): (/mob)
#define COMSIG_ITEM_ATTACK_SELF "item_attack_self"
#define COMPONENT_NO_INTERACT (1<<0)
///from base of obj/item/attack_obj(): (/obj, /mob)
#define COMSIG_ITEM_ATTACK_OBJ "item_attack_obj"
#define COMPONENT_NO_ATTACK_OBJ (1<<0)
///from base of obj/item/pre_attack(): (atom/target, mob/user, params)
#define COMSIG_ITEM_PRE_ATTACK "item_pre_attack"
#define COMPONENT_NO_ATTACK (1<<0)
///from base of obj/item/afterattack(): (atom/target, mob/user, params)
#define COMSIG_ITEM_AFTERATTACK "item_afterattack"
///from base of obj/item/attack_qdeleted(): (atom/target, mob/user, params)
#define COMSIG_ITEM_ATTACK_QDELETED "item_attack_qdeleted"
///from base of obj/item/equipped(): (/mob/equipper, slot)
#define COMSIG_ITEM_EQUIPPED "item_equip"
///from base of obj/item/dropped(): (mob/user)
#define COMSIG_ITEM_DROPPED "item_drop"
///from base of obj/item/pickup(): (/mob/taker)
#define COMSIG_ITEM_PICKUP "item_pickup"
///from base of mob/living/carbon/attacked_by(): (mob/living/carbon/target, mob/living/user, hit_zone)
#define COMSIG_ITEM_ATTACK_ZONE "item_attack_zone"
///return a truthy value to prevent ensouling, checked in /obj/effect/proc_holder/spell/targeted/lichdom/cast(): (mob/user)
#define COMSIG_ITEM_IMBUE_SOUL "item_imbue_soul"
///called before marking an object for retrieval, checked in /obj/effect/proc_holder/spell/targeted/summonitem/cast() : (mob/user)
#define COMSIG_ITEM_MARK_RETRIEVAL "item_mark_retrieval"
#define COMPONENT_BLOCK_MARK_RETRIEVAL (1<<0)
///from base of obj/item/hit_reaction(): (list/args)
#define COMSIG_ITEM_HIT_REACT "item_hit_react"
///called on item when crossed by something (): (/atom/movable, mob/living/crossed)
#define COMSIG_ITEM_WEARERCROSSED "wearer_crossed"
///called on item when microwaved (): (obj/machinery/microwave/M)
#define COMSIG_ITEM_MICROWAVE_ACT "microwave_act"
///from base of item/sharpener/attackby(): (amount, max)
#define COMSIG_ITEM_SHARPEN_ACT "sharpen_act"
#define COMPONENT_BLOCK_SHARPEN_APPLIED (1<<0)
#define COMPONENT_BLOCK_SHARPEN_BLOCKED (1<<1)
#define COMPONENT_BLOCK_SHARPEN_ALREADY (1<<2)
#define COMPONENT_BLOCK_SHARPEN_MAXED (1<<3)
///from base of [/obj/item/proc/tool_check_callback]: (mob/living/user)
#define COMSIG_TOOL_IN_USE "tool_in_use"
///from base of [/obj/item/proc/tool_start_check]: (mob/living/user)
#define COMSIG_TOOL_START_USE "tool_start_use"
///from [/obj/item/proc/disableEmbedding]:
#define COMSIG_ITEM_DISABLE_EMBED "item_disable_embed"
///from [/obj/effect/mine/proc/triggermine]:
#define COMSIG_MINE_TRIGGERED "minegoboom"
// /obj/item signals for economy
///called when an item is sold by the exports subsystem
#define COMSIG_ITEM_SOLD "item_sold"
///called when a wrapped up structure is opened by hand
#define COMSIG_STRUCTURE_UNWRAPPED "structure_unwrapped"
#define COMSIG_ITEM_UNWRAPPED "item_unwrapped"
///called when a wrapped up item is opened by hand
#define COMSIG_ITEM_SPLIT_VALUE (1<<0)
///called when getting the item's exact ratio for cargo's profit.
#define COMSIG_ITEM_SPLIT_PROFIT "item_split_profits"
///called when getting the item's exact ratio for cargo's profit, without selling the item.
#define COMSIG_ITEM_SPLIT_PROFIT_DRY "item_split_profits_dry"
// /obj/item/clothing signals
///from base of obj/item/clothing/shoes/proc/step_action(): ()
#define COMSIG_SHOES_STEP_ACTION "shoes_step_action"
///from base of /obj/item/clothing/suit/space/proc/toggle_spacesuit(): (obj/item/clothing/suit/space/suit)
#define COMSIG_SUIT_SPACE_TOGGLE "suit_space_toggle"
// /obj/item/implant signals
///from base of /obj/item/implant/proc/activate(): ()
#define COMSIG_IMPLANT_ACTIVATED "implant_activated"
///from base of /obj/item/implant/proc/implant(): (list/args)
#define COMSIG_IMPLANT_IMPLANTING "implant_implanting"
#define COMPONENT_STOP_IMPLANTING (1<<0)
///called on already installed implants when a new one is being added in /obj/item/implant/proc/implant(): (list/args, obj/item/implant/new_implant)
#define COMSIG_IMPLANT_OTHER "implant_other"
//#define COMPONENT_STOP_IMPLANTING (1<<0) //The name makes sense for both
#define COMPONENT_DELETE_NEW_IMPLANT (1<<1)
#define COMPONENT_DELETE_OLD_IMPLANT (1<<2)
///called on implants being implanted into someone with an uplink implant: (datum/component/uplink)
#define COMSIG_IMPLANT_EXISTING_UPLINK "implant_uplink_exists"
//This uses all return values of COMSIG_IMPLANT_OTHER
// /obj/item/pda signals
///called on pda when the user changes the ringtone: (mob/living/user, new_ringtone)
#define COMSIG_PDA_CHANGE_RINGTONE "pda_change_ringtone"
#define COMPONENT_STOP_RINGTONE_CHANGE (1<<0)
#define COMSIG_PDA_CHECK_DETONATE "pda_check_detonate"
#define COMPONENT_PDA_NO_DETONATE (1<<0)
// /obj/item/radio signals
///called from base of /obj/item/radio/proc/set_frequency(): (list/args)
#define COMSIG_RADIO_NEW_FREQUENCY "radio_new_frequency"
// /obj/item/pen signals
///called after rotation in /obj/item/pen/attack_self(): (rotation, mob/living/carbon/user)
#define COMSIG_PEN_ROTATED "pen_rotated"
// /obj/item/gun signals
///called in /obj/item/gun/process_fire (user, target, params, zone_override)
#define COMSIG_MOB_FIRED_GUN "mob_fired_gun"
// /obj/item/grenade signals
///called in /obj/item/gun/process_fire (user, target, params, zone_override)
#define COMSIG_GRENADE_PRIME "grenade_prime"
///called in /obj/item/gun/process_fire (user, target, params, zone_override)
#define COMSIG_GRENADE_ARMED "grenade_armed"
// /obj/projectile signals (sent to the firer)
///from base of /obj/projectile/proc/on_hit(): (atom/movable/firer, atom/target, Angle)
#define COMSIG_PROJECTILE_SELF_ON_HIT "projectile_self_on_hit"
///from base of /obj/projectile/proc/on_hit(): (atom/movable/firer, atom/target, Angle)
#define COMSIG_PROJECTILE_ON_HIT "projectile_on_hit"
///from base of /obj/projectile/proc/fire(): (obj/projectile, atom/original_target)
#define COMSIG_PROJECTILE_BEFORE_FIRE "projectile_before_fire"
///from the base of /obj/projectile/proc/fire(): ()
#define COMSIG_PROJECTILE_FIRE "projectile_fire"
///sent to targets during the process_hit proc of projectiles
#define COMSIG_PROJECTILE_PREHIT "com_proj_prehit"
///sent to targets during the process_hit proc of projectiles
#define COMSIG_PROJECTILE_RANGE_OUT "projectile_range_out"
///sent when trying to force an embed (mainly for projectiles, only used in the embed element)
#define COMSIG_EMBED_TRY_FORCE "item_try_embed"
///sent to targets during the process_hit proc of projectiles
#define COMSIG_PELLET_CLOUD_INIT "pellet_cloud_init"
// /obj/mecha signals
///sent from mecha action buttons to the mecha they're linked to
#define COMSIG_MECHA_ACTION_ACTIVATE "mecha_action_activate"
// /mob/living/carbon/human signals
///from mob/living/carbon/human/UnarmedAttack(): (atom/target, proximity)
#define COMSIG_HUMAN_EARLY_UNARMED_ATTACK "human_early_unarmed_attack"
///from mob/living/carbon/human/UnarmedAttack(): (atom/target, proximity)
#define COMSIG_HUMAN_MELEE_UNARMED_ATTACK "human_melee_unarmed_attack"
///from mob/living/carbon/human/UnarmedAttack(): (mob/living/carbon/human/attacker)
#define COMSIG_HUMAN_MELEE_UNARMED_ATTACKBY "human_melee_unarmed_attackby"
///Hit by successful disarm attack (mob/living/carbon/human/attacker,zone_targeted)
#define COMSIG_HUMAN_DISARM_HIT "human_disarm_hit"
///Whenever EquipRanked is called, called after job is set
#define COMSIG_JOB_RECEIVED "job_received"
// /datum/species signals
///from datum/species/on_species_gain(): (datum/species/new_species, datum/species/old_species)
#define COMSIG_SPECIES_GAIN "species_gain"
///from datum/species/on_species_loss(): (datum/species/lost_species)
#define COMSIG_SPECIES_LOSS "species_loss"
// /datum/song signals
///sent to the instrument when a song starts playing
#define COMSIG_SONG_START "song_start"
///sent to the instrument when a song stops playing
#define COMSIG_SONG_END "song_end"
/*******Component Specific Signals*******/
//Janitor
///(): Returns bitflags of wet values.
#define COMSIG_TURF_IS_WET "check_turf_wet"
///(max_strength, immediate, duration_decrease = INFINITY): Returns bool.
#define COMSIG_TURF_MAKE_DRY "make_turf_try"
///called on an object to clean it of cleanables. Usualy with soap: (num/strength)
#define COMSIG_COMPONENT_CLEAN_ACT "clean_act"
//Creamed
///called when you wash your face at a sink: (num/strength)
#define COMSIG_COMPONENT_CLEAN_FACE_ACT "clean_face_act"
//Food
///from base of obj/item/reagent_containers/food/snacks/attack(): (mob/living/eater, mob/feeder)
#define COMSIG_FOOD_EATEN "food_eaten"
//Gibs
///from base of /obj/effect/decal/cleanable/blood/gibs/streak(): (list/directions, list/diseases)
#define COMSIG_GIBS_STREAK "gibs_streak"
//Mood
///called when you send a mood event from anywhere in the code.
#define COMSIG_ADD_MOOD_EVENT "add_mood"
///Mood event that only RnD members listen for
#define COMSIG_ADD_MOOD_EVENT_RND "RND_add_mood"
///called when you clear a mood event from anywhere in the code.
#define COMSIG_CLEAR_MOOD_EVENT "clear_mood"
//NTnet
///called on an object by its NTNET connection component on receive. (sending_id(number), sending_netname(text), data(datum/netdata))
#define COMSIG_COMPONENT_NTNET_RECEIVE "ntnet_receive"
//Nanites
///() returns TRUE if nanites are found
#define COMSIG_HAS_NANITES "has_nanites"
///() returns TRUE if nanites have stealth
#define COMSIG_NANITE_IS_STEALTHY "nanite_is_stealthy"
///() deletes the nanite component
#define COMSIG_NANITE_DELETE "nanite_delete"
///(list/nanite_programs) - makes the input list a copy the nanites' program list
#define COMSIG_NANITE_GET_PROGRAMS "nanite_get_programs"
///(amount) Returns nanite amount
#define COMSIG_NANITE_GET_VOLUME "nanite_get_volume"
///(amount) Sets current nanite volume to the given amount
#define COMSIG_NANITE_SET_VOLUME "nanite_set_volume"
///(amount) Adjusts nanite volume by the given amount
#define COMSIG_NANITE_ADJUST_VOLUME "nanite_adjust"
///(amount) Sets maximum nanite volume to the given amount
#define COMSIG_NANITE_SET_MAX_VOLUME "nanite_set_max_volume"
///(amount(0-100)) Sets cloud ID to the given amount
#define COMSIG_NANITE_SET_CLOUD "nanite_set_cloud"
///(method) Modify cloud sync status. Method can be toggle, enable or disable
#define COMSIG_NANITE_SET_CLOUD_SYNC "nanite_set_cloud_sync"
///(amount) Sets safety threshold to the given amount
#define COMSIG_NANITE_SET_SAFETY "nanite_set_safety"
///(amount) Sets regeneration rate to the given amount
#define COMSIG_NANITE_SET_REGEN "nanite_set_regen"
///(code(1-9999)) Called when sending a nanite signal to a mob.
#define COMSIG_NANITE_SIGNAL "nanite_signal"
///(comm_code(1-9999), comm_message) Called when sending a nanite comm signal to a mob.
#define COMSIG_NANITE_COMM_SIGNAL "nanite_comm_signal"
///(mob/user, full_scan) - sends to chat a scan of the nanites to the user, returns TRUE if nanites are detected
#define COMSIG_NANITE_SCAN "nanite_scan"
///(list/data, scan_level) - adds nanite data to the given data list - made for ui_data procs
#define COMSIG_NANITE_UI_DATA "nanite_ui_data"
///(datum/nanite_program/new_program, datum/nanite_program/source_program) Called when adding a program to a nanite component
#define COMSIG_NANITE_ADD_PROGRAM "nanite_add_program"
///Installation successful
#define COMPONENT_PROGRAM_INSTALLED (1<<0)
///Installation failed, but there are still nanites
#define COMPONENT_PROGRAM_NOT_INSTALLED (1<<1)
///(datum/component/nanites, full_overwrite, copy_activation) Called to sync the target's nanites to a given nanite component
#define COMSIG_NANITE_SYNC "nanite_sync"
// /datum/component/storage signals
///() - returns bool.
#define COMSIG_CONTAINS_STORAGE "is_storage"
///(obj/item/inserting, mob/user, silent, force) - returns bool
#define COMSIG_TRY_STORAGE_INSERT "storage_try_insert"
///(mob/show_to, force) - returns bool.
#define COMSIG_TRY_STORAGE_SHOW "storage_show_to"
///(mob/hide_from) - returns bool
#define COMSIG_TRY_STORAGE_HIDE_FROM "storage_hide_from"
///returns bool
#define COMSIG_TRY_STORAGE_HIDE_ALL "storage_hide_all"
///(newstate)
#define COMSIG_TRY_STORAGE_SET_LOCKSTATE "storage_lock_set_state"
///() - returns bool. MUST CHECK IF STORAGE IS THERE FIRST!
#define COMSIG_IS_STORAGE_LOCKED "storage_get_lockstate"
///(type, atom/destination, amount = INFINITY, check_adjacent, force, mob/user, list/inserted) - returns bool - type can be a list of types.
#define COMSIG_TRY_STORAGE_TAKE_TYPE "storage_take_type"
///(type, amount = INFINITY, force = FALSE). Force will ignore max_items, and amount is normally clamped to max_items.
#define COMSIG_TRY_STORAGE_FILL_TYPE "storage_fill_type"
///(obj, new_loc, force = FALSE) - returns bool
#define COMSIG_TRY_STORAGE_TAKE "storage_take_obj"
///(loc) - returns bool - if loc is null it will dump at parent location.
#define COMSIG_TRY_STORAGE_QUICK_EMPTY "storage_quick_empty"
///(list/list_to_inject_results_into, recursively_search_inside_storages = TRUE)
#define COMSIG_TRY_STORAGE_RETURN_INVENTORY "storage_return_inventory"
///(obj/item/insertion_candidate, mob/user, silent) - returns bool
#define COMSIG_TRY_STORAGE_CAN_INSERT "storage_can_equip"
// /datum/component/two_handed signals
///from base of datum/component/two_handed/proc/wield(mob/living/carbon/user): (/mob/user)
#define COMSIG_TWOHANDED_WIELD "twohanded_wield"
#define COMPONENT_TWOHANDED_BLOCK_WIELD (1<<0)
///from base of datum/component/two_handed/proc/unwield(mob/living/carbon/user): (/mob/user)
#define COMSIG_TWOHANDED_UNWIELD "twohanded_unwield"
// /datum/action signals
///from base of datum/action/proc/Trigger(): (datum/action)
#define COMSIG_ACTION_TRIGGER "action_trigger"
#define COMPONENT_ACTION_BLOCK_TRIGGER (1<<0)
//Xenobio hotkeys
///from slime CtrlClickOn(): (/mob)
#define COMSIG_XENO_SLIME_CLICK_CTRL "xeno_slime_click_ctrl"
///from slime AltClickOn(): (/mob)
#define COMSIG_XENO_SLIME_CLICK_ALT "xeno_slime_click_alt"
///from slime ShiftClickOn(): (/mob)
#define COMSIG_XENO_SLIME_CLICK_SHIFT "xeno_slime_click_shift"
///from turf ShiftClickOn(): (/mob)
#define COMSIG_XENO_TURF_CLICK_SHIFT "xeno_turf_click_shift"
///from turf AltClickOn(): (/mob)
#define COMSIG_XENO_TURF_CLICK_CTRL "xeno_turf_click_alt"
///from monkey CtrlClickOn(): (/mob)
#define COMSIG_XENO_MONKEY_CLICK_CTRL "xeno_monkey_click_ctrl"
///SSalarm signals
#define COMSIG_TRIGGERED_ALARM "ssalarm_triggered"
#define COMSIG_CANCELLED_ALARM "ssalarm_cancelled"
+1 -1
View File
@@ -20,7 +20,7 @@
//For custom species
#define STARTING_SPECIES_POINTS 1
#define MAX_SPECIES_TRAITS 5
#define MAX_SPECIES_TRAITS 8 //CHOMPEdit
// Xenochimera thing mostly
#define REVIVING_NOW -1
+103
View File
@@ -0,0 +1,103 @@
// rust_g.dm - DM API for rust_g extension library
//
// To configure, create a `rust_g.config.dm` and set what you care about from
// the following options:
//
// #define RUST_G "path/to/rust_g"
// Override the .dll/.so detection logic with a fixed path or with detection
// logic of your own.
//
// #define RUSTG_OVERRIDE_BUILTINS
// Enable replacement rust-g functions for certain builtins. Off by default.
#ifndef RUST_G
// Default automatic RUST_G detection.
// On Windows, looks in the standard places for `rust_g.dll`.
// On Linux, looks in `.`, `$LD_LIBRARY_PATH`, and `~/.byond/bin` for either of
// `librust_g.so` (preferred) or `rust_g` (old).
/* This comment bypasses grep checks */ /var/__rust_g
/proc/__detect_rust_g()
if (world.system_type == UNIX)
if (fexists("./librust_g.so"))
// No need for LD_LIBRARY_PATH badness.
return __rust_g = "./librust_g.so"
else if (fexists("./rust_g"))
// Old dumb filename.
return __rust_g = "./rust_g"
else if (fexists("[world.GetConfig("env", "HOME")]/.byond/bin/rust_g"))
// Old dumb filename in `~/.byond/bin`.
return __rust_g = "rust_g"
else
// It's not in the current directory, so try others
return __rust_g = "librust_g.so"
else
return __rust_g = "rust_g"
#define RUST_G (__rust_g || __detect_rust_g())
#endif
#define RUSTG_JOB_NO_RESULTS_YET "NO RESULTS YET"
#define RUSTG_JOB_NO_SUCH_JOB "NO SUCH JOB"
#define RUSTG_JOB_ERROR "JOB PANICKED"
#define rustg_dmi_strip_metadata(fname) call(RUST_G, "dmi_strip_metadata")(fname)
#define rustg_dmi_create_png(path, width, height, data) call(RUST_G, "dmi_create_png")(path, width, height, data)
#define rustg_noise_get_at_coordinates(seed, x, y) call(RUST_G, "noise_get_at_coordinates")(seed, x, y)
#define rustg_file_read(fname) call(RUST_G, "file_read")(fname)
#define rustg_file_exists(fname) call(RUST_G, "file_exists")(fname)
#define rustg_file_write(text, fname) call(RUST_G, "file_write")(text, fname)
#define rustg_file_append(text, fname) call(RUST_G, "file_append")(text, fname)
#ifdef RUSTG_OVERRIDE_BUILTINS
#define file2text(fname) rustg_file_read("[fname]")
#define text2file(text, fname) rustg_file_append(text, "[fname]")
#endif
#define rustg_git_revparse(rev) call(RUST_G, "rg_git_revparse")(rev)
#define rustg_git_commit_date(rev) call(RUST_G, "rg_git_commit_date")(rev)
#define rustg_hash_string(algorithm, text) call(RUST_G, "hash_string")(algorithm, text)
#define rustg_hash_file(algorithm, fname) call(RUST_G, "hash_file")(algorithm, fname)
#define RUSTG_HASH_MD5 "md5"
#define RUSTG_HASH_SHA1 "sha1"
#define RUSTG_HASH_SHA256 "sha256"
#define RUSTG_HASH_SHA512 "sha512"
#ifdef RUSTG_OVERRIDE_BUILTINS
#define md5(thing) (isfile(thing) ? rustg_hash_file(RUSTG_HASH_MD5, "[thing]") : rustg_hash_string(RUSTG_HASH_MD5, thing))
#endif
#define rustg_json_is_valid(text) (call(RUST_G, "json_is_valid")(text) == "true")
#define rustg_log_write(fname, text, format) call(RUST_G, "log_write")(fname, text, format)
/proc/rustg_log_close_all() return call(RUST_G, "log_close_all")()
#define rustg_url_encode(text) call(RUST_G, "url_encode")(text)
#define rustg_url_decode(text) call(RUST_G, "url_decode")(text)
#ifdef RUSTG_OVERRIDE_BUILTINS
#define url_encode(text) rustg_url_encode(text)
#define url_decode(text) rustg_url_decode(text)
#endif
#define RUSTG_HTTP_METHOD_GET "get"
#define RUSTG_HTTP_METHOD_PUT "put"
#define RUSTG_HTTP_METHOD_DELETE "delete"
#define RUSTG_HTTP_METHOD_PATCH "patch"
#define RUSTG_HTTP_METHOD_HEAD "head"
#define RUSTG_HTTP_METHOD_POST "post"
#define rustg_http_request_blocking(method, url, body, headers) call(RUST_G, "http_request_blocking")(method, url, body, headers)
#define rustg_http_request_async(method, url, body, headers) call(RUST_G, "http_request_async")(method, url, body, headers)
#define rustg_http_check_request(req_id) call(RUST_G, "http_check_request")(req_id)
#define rustg_sql_connect_pool(options) call(RUST_G, "sql_connect_pool")(options)
#define rustg_sql_query_async(handle, query, params) call(RUST_G, "sql_query_async")(handle, query, params)
#define rustg_sql_query_blocking(handle, query, params) call(RUST_G, "sql_query_blocking")(handle, query, params)
#define rustg_sql_connected(handle) call(RUST_G, "sql_connected")(handle)
#define rustg_sql_disconnect_pool(handle) call(RUST_G, "sql_disconnect_pool")(handle)
#define rustg_sql_check_query(job_id) call(RUST_G, "sql_check_query")("[job_id]")
+1
View File
@@ -9,6 +9,7 @@
#define LANGUAGE_DAEMON "Daemon"
#define LANGUAGE_ENOCHIAN "Enochian"
#define LANGUAGE_VESPINAE "Vespinae"
#define LANGUAGE_SPACER "Spacer"
#define LANGUAGE_CHIMPANZEE "Chimpanzee"
#define LANGUAGE_NEAERA "Neaera"
+1
View File
@@ -50,6 +50,7 @@
#define VV_HK_EXPOSE "expose"
#define VV_HK_CALLPROC "proc_call"
#define VV_HK_MARK "mark"
#define VV_HK_ADDCOMPONENT "addcomponent"
// /atom
#define VV_HK_ATOM_EXPLODE "turf_explode"
+4 -12
View File
@@ -1,25 +1,17 @@
//print an error message to world.log
// Fall back to using old format if we are not using rust-g
#ifdef RUST_G
#define WRITE_LOG(log, text) call(RUST_G, "log_write")(log, text)
#else
#define WRITE_LOG(log, text) log << "\[[time_stamp()]][text]"
#endif
//This is an external call, "true" and "false" are how rust parses out booleans
#define WRITE_LOG(log, text) rustg_log_write(log, text, "true")
#define WRITE_LOG_NO_FORMAT(log, text) rustg_log_write(log, text, "false")
/* For logging round startup. */
/proc/start_log(log)
#ifndef RUST_G
log = file(log)
#endif
WRITE_LOG(log, "START: Starting up [log_path].")
return log
/* Close open log handles. This should be called as late as possible, and no logging should hapen after. */
/proc/shutdown_logging()
#ifdef RUST_G
call(RUST_G, "log_close_all")()
#endif
rustg_log_close_all()
/proc/error(msg)
to_world_log("## ERROR: [msg]")
+4 -1
View File
@@ -61,4 +61,7 @@
/proc/cmp_recipe_complexity_dsc(datum/recipe/A, datum/recipe/B)
var/a_score = LAZYLEN(A.items) + LAZYLEN(A.reagents) + LAZYLEN(A.fruit)
var/b_score = LAZYLEN(B.items) + LAZYLEN(B.reagents) + LAZYLEN(B.fruit)
return b_score - a_score
return b_score - a_score
/proc/cmp_typepaths_asc(A, B)
return sorttext("[B]","[A]")
+16
View File
@@ -381,3 +381,19 @@
. += copytext(text, last_found, found)
last_found = found + delim_len
while (found)
/proc/type2parent(child)
var/string_type = "[child]"
var/last_slash = findlasttext(string_type, "/")
if(last_slash == 1)
switch(child)
if(/datum)
return null
if(/obj || /mob)
return /atom/movable
if(/area || /turf)
return /atom
else
return /datum
return text2path(copytext(string_type, 1, last_slash))
+4
View File
@@ -1605,3 +1605,7 @@ GLOBAL_REAL_VAR(list/stack_trace_storage)
// Third one is the text that will be clickable.
/proc/href(href_src, list/href_params, href_text)
return "<a href='?src=\ref[href_src];[list2params(href_params)]'>[href_text]</a>"
/proc/CallAsync(datum/source, proctype, list/arguments)
set waitfor = FALSE
return call(source, proctype)(arglist(arguments))
+7 -2
View File
@@ -21,6 +21,8 @@ avoid code duplication. This includes items that may sometimes act as a standard
// Called when the item is in the active hand, and clicked; alternately, there is an 'activate held object' verb or you can hit pagedown.
/obj/item/proc/attack_self(mob/user)
if(SEND_SIGNAL(src, COMSIG_ITEM_ATTACK_SELF, user) & COMPONENT_NO_INTERACT)
return
return
// Called at the start of resolve_attackby(), before the actual attack.
@@ -35,10 +37,13 @@ avoid code duplication. This includes items that may sometimes act as a standard
// No comment
/atom/proc/attackby(obj/item/W, mob/user, var/attack_modifier, var/click_parameters)
return
if(SEND_SIGNAL(src, COMSIG_PARENT_ATTACKBY, W, user, click_parameters) & COMPONENT_NO_AFTERATTACK)
return TRUE
return FALSE
/atom/movable/attackby(obj/item/W, mob/user, var/attack_modifier, var/click_parameters)
if(!(W.flags & NOBLUDGEON))
. = ..()
if(!. && !(W.flags & NOBLUDGEON))
visible_message("<span class='danger'>[src] has been hit by [user] with [W].</span>")
/mob/living/attackby(obj/item/I, mob/user, var/attack_modifier, var/click_parameters)
-21
View File
@@ -1,21 +0,0 @@
/obj/item/device/paicard/attack_ghost(mob/user as mob)
if(src.pai != null) //Have a person in them already?
user.examinate(src)
return
var/choice = input(user, "You sure you want to inhabit this PAI?") in list("Yes", "No")
var/pai_name = input(user, "Choose your character's name", "Character Name") as text
var/actual_pai_name = sanitize_name(pai_name)
var/pai_key
if (isnull(pai_name))
return
if(choice == "Yes")
pai_key = user.key
else
return
var/turf/location = get_turf(src)
var/obj/item/device/paicard/card = new(location)
var/mob/living/silicon/pai/pai = new(card)
qdel(src)
pai.key = pai_key
card.setPersonality(pai)
pai.SetName(actual_pai_name)
+54
View File
@@ -0,0 +1,54 @@
PROCESSING_SUBSYSTEM_DEF(dcs)
name = "Datum Component System"
flags = SS_NO_INIT
wait = 1 SECONDS
var/list/elements_by_type = list()
/datum/controller/subsystem/processing/dcs/Recover()
comp_lookup = SSdcs.comp_lookup
/datum/controller/subsystem/processing/dcs/proc/GetElement(list/arguments)
var/datum/element/eletype = arguments[1]
var/element_id = eletype
if(!ispath(eletype, /datum/element))
CRASH("Attempted to instantiate [eletype] as a /datum/element")
if(initial(eletype.element_flags) & ELEMENT_BESPOKE)
element_id = GetIdFromArguments(arguments)
. = elements_by_type[element_id]
if(.)
return
. = elements_by_type[element_id] = new eletype
/****
* Generates an id for bespoke elements when given the argument list
* Generating the id here is a bit complex because we need to support named arguments
* Named arguments can appear in any order and we need them to appear after ordered arguments
* We assume that no one will pass in a named argument with a value of null
**/
/datum/controller/subsystem/processing/dcs/proc/GetIdFromArguments(list/arguments)
var/datum/element/eletype = arguments[1]
var/list/fullid = list("[eletype]")
var/list/named_arguments = list()
for(var/i in initial(eletype.id_arg_index) to length(arguments))
var/key = arguments[i]
var/value
if(istext(key))
value = arguments[key]
if(!(istext(key) || isnum(key)))
key = REF(key)
key = "[key]" // Key is stringified so numbers dont break things
if(!isnull(value))
if(!(istext(value) || isnum(value)))
value = REF(value)
named_arguments["[key]"] = value
else
fullid += "[key]"
if(length(named_arguments))
named_arguments = sortList(named_arguments)
fullid += named_arguments
return list2params(fullid)
+3
View File
@@ -284,9 +284,12 @@ SUBSYSTEM_DEF(garbage)
if(isnull(D.gc_destroyed))
if(SEND_SIGNAL(D, COMSIG_PARENT_PREQDELETED, force)) // Give the components a chance to prevent their parent from being deleted
return
D.gc_destroyed = GC_CURRENTLY_BEING_QDELETED
var/start_time = world.time
var/start_tick = world.tick_usage
SEND_SIGNAL(D, COMSIG_PARENT_QDELETING, force) // Let the (remaining) components know about the result of Destroy
var/hint = D.Destroy(force) // Let our friend know they're about to get fucked up.
if(world.time != start_time)
I.slept_destroy++
+9
View File
@@ -0,0 +1,9 @@
# Datum Component System (DCS)
## Concept
Loosely adapted from /vg/. This is an entity component system for adding behaviours to datums when inheritance doesn't quite cut it. By using signals and events instead of direct inheritance, you can inject behaviours without hacky overloads. It requires a different method of thinking, but is not hard to use correctly. If a behaviour can have application across more than one thing. Make it generic, make it a component. Atom/mob/obj event? Give it a signal, and forward it's arguments with a `SendSignal()` call. Now every component that want's to can also know about this happening.
See [this thread](https://tgstation13.org/phpBB/viewtopic.php?f=5&t=22674) for an introduction to the system as a whole.
### See/Define signals and their arguments in [__DEFINES\dcs\signals.dm](../../__DEFINES/dcs/signals.dm)
+537
View File
@@ -0,0 +1,537 @@
/**
* # Component
*
* The component datum
*
* A component should be a single standalone unit
* of functionality, that works by receiving signals from it's parent
* object to provide some single functionality (i.e a slippery component)
* that makes the object it's attached to cause people to slip over.
* Useful when you want shared behaviour independent of type inheritance
*/
/datum/component
/**
* Defines how duplicate existing components are handled when added to a datum
*
* See [COMPONENT_DUPE_*][COMPONENT_DUPE_ALLOWED] definitions for available options
*/
var/dupe_mode = COMPONENT_DUPE_HIGHLANDER
/**
* The type to check for duplication
*
* `null` means exact match on `type` (default)
*
* Any other type means that and all subtypes
*/
var/dupe_type
/// The datum this components belongs to
var/datum/parent
/**
* Only set to true if you are able to properly transfer this component
*
* At a minimum [RegisterWithParent][/datum/component/proc/RegisterWithParent] and [UnregisterFromParent][/datum/component/proc/UnregisterFromParent] should be used
*
* Make sure you also implement [PostTransfer][/datum/component/proc/PostTransfer] for any post transfer handling
*/
var/can_transfer = FALSE
/**
* Create a new component.
*
* Additional arguments are passed to [Initialize()][/datum/component/proc/Initialize]
*
* Arguments:
* * datum/P the parent datum this component reacts to signals from
*/
/datum/component/New(list/raw_args)
parent = raw_args[1]
var/list/arguments = raw_args.Copy(2)
if(Initialize(arglist(arguments)) == COMPONENT_INCOMPATIBLE)
stack_trace("Incompatible [type] assigned to a [parent.type]! args: [json_encode(arguments)]")
qdel(src, TRUE, TRUE)
return
_JoinParent(parent)
/**
* Called during component creation with the same arguments as in new excluding parent.
*
* Do not call `qdel(src)` from this function, `return COMPONENT_INCOMPATIBLE` instead
*/
/datum/component/proc/Initialize(...)
return
/**
* Properly removes the component from `parent` and cleans up references
*
* Arguments:
* * force - makes it not check for and remove the component from the parent
* * silent - deletes the component without sending a [COMSIG_COMPONENT_REMOVING] signal
*/
/datum/component/Destroy(force=FALSE, silent=FALSE)
if(!force && parent)
_RemoveFromParent()
if(!silent)
SEND_SIGNAL(parent, COMSIG_COMPONENT_REMOVING, src)
parent = null
return ..()
/**
* Internal proc to handle behaviour of components when joining a parent
*/
/datum/component/proc/_JoinParent()
var/datum/P = parent
//lazy init the parent's dc list
var/list/dc = P.datum_components
if(!dc)
P.datum_components = dc = list()
//set up the typecache
var/our_type = type
for(var/I in _GetInverseTypeList(our_type))
var/test = dc[I]
if(test) //already another component of this type here
var/list/components_of_type
if(!length(test))
components_of_type = list(test)
dc[I] = components_of_type
else
components_of_type = test
if(I == our_type) //exact match, take priority
var/inserted = FALSE
for(var/J in 1 to components_of_type.len)
var/datum/component/C = components_of_type[J]
if(C.type != our_type) //but not over other exact matches
components_of_type.Insert(J, I)
inserted = TRUE
break
if(!inserted)
components_of_type += src
else //indirect match, back of the line with ya
components_of_type += src
else //only component of this type, no list
dc[I] = src
RegisterWithParent()
/**
* Internal proc to handle behaviour when being removed from a parent
*/
/datum/component/proc/_RemoveFromParent()
var/datum/P = parent
var/list/dc = P.datum_components
for(var/I in _GetInverseTypeList())
var/list/components_of_type = dc[I]
if(length(components_of_type)) //
var/list/subtracted = components_of_type - src
if(subtracted.len == 1) //only 1 guy left
dc[I] = subtracted[1] //make him special
else
dc[I] = subtracted
else //just us
dc -= I
if(!dc.len)
P.datum_components = null
UnregisterFromParent()
/**
* Register the component with the parent object
*
* Use this proc to register with your parent object
*
* Overridable proc that's called when added to a new parent
*/
/datum/component/proc/RegisterWithParent()
return
/**
* Unregister from our parent object
*
* Use this proc to unregister from your parent object
*
* Overridable proc that's called when removed from a parent
* *
*/
/datum/component/proc/UnregisterFromParent()
return
/**
* Register to listen for a signal from the passed in target
*
* This sets up a listening relationship such that when the target object emits a signal
* the source datum this proc is called upon, will recieve a callback to the given proctype
* Return values from procs registered must be a bitfield
*
* Arguments:
* * datum/target The target to listen for signals from
* * sig_type_or_types Either a string signal name, or a list of signal names (strings)
* * proctype The proc to call back when the signal is emitted
* * override If a previous registration exists you must explicitly set this
*/
/datum/proc/RegisterSignal(datum/target, sig_type_or_types, proctype, override = FALSE)
if(QDELETED(src) || QDELETED(target))
return
var/list/procs = signal_procs
if(!procs)
signal_procs = procs = list()
if(!procs[target])
procs[target] = list()
var/list/lookup = target.comp_lookup
if(!lookup)
target.comp_lookup = lookup = list()
var/list/sig_types = islist(sig_type_or_types) ? sig_type_or_types : list(sig_type_or_types)
for(var/sig_type in sig_types)
if(!override && procs[target][sig_type])
stack_trace("[sig_type] overridden. Use override = TRUE to suppress this warning")
procs[target][sig_type] = proctype
if(!lookup[sig_type]) // Nothing has registered here yet
lookup[sig_type] = src
else if(lookup[sig_type] == src) // We already registered here
continue
else if(!length(lookup[sig_type])) // One other thing registered here
lookup[sig_type] = list(lookup[sig_type]=TRUE)
lookup[sig_type][src] = TRUE
else // Many other things have registered here
lookup[sig_type][src] = TRUE
signal_enabled = TRUE
/**
* Stop listening to a given signal from target
*
* Breaks the relationship between target and source datum, removing the callback when the signal fires
*
* Doesn't care if a registration exists or not
*
* Arguments:
* * datum/target Datum to stop listening to signals from
* * sig_typeor_types Signal string key or list of signal keys to stop listening to specifically
*/
/datum/proc/UnregisterSignal(datum/target, sig_type_or_types)
var/list/lookup = target.comp_lookup
if(!signal_procs || !signal_procs[target] || !lookup)
return
if(!islist(sig_type_or_types))
sig_type_or_types = list(sig_type_or_types)
for(var/sig in sig_type_or_types)
if(!signal_procs[target][sig])
continue
switch(length(lookup[sig]))
if(2)
lookup[sig] = (lookup[sig]-src)[1]
if(1)
stack_trace("[target] ([target.type]) somehow has single length list inside comp_lookup")
if(src in lookup[sig])
lookup -= sig
if(!length(lookup))
target.comp_lookup = null
break
if(0)
lookup -= sig
if(!length(lookup))
target.comp_lookup = null
break
else
lookup[sig] -= src
signal_procs[target] -= sig_type_or_types
if(!signal_procs[target].len)
signal_procs -= target
/**
* Called on a component when a component of the same type was added to the same parent
*
* See [/datum/component/var/dupe_mode]
*
* `C`'s type will always be the same of the called component
*/
/datum/component/proc/InheritComponent(datum/component/C, i_am_original)
return
/**
* Called on a component when a component of the same type was added to the same parent with [COMPONENT_DUPE_SELECTIVE]
*
* See [/datum/component/var/dupe_mode]
*
* `C`'s type will always be the same of the called component
*
* return TRUE if you are absorbing the component, otherwise FALSE if you are fine having it exist as a duplicate component
*/
/datum/component/proc/CheckDupeComponent(datum/component/C, ...)
return
/**
* Callback Just before this component is transferred
*
* Use this to do any special cleanup you might need to do before being deregged from an object
*/
/datum/component/proc/PreTransfer()
return
/**
* Callback Just after a component is transferred
*
* Use this to do any special setup you need to do after being moved to a new object
*
* Do not call `qdel(src)` from this function, `return COMPONENT_INCOMPATIBLE` instead
*/
/datum/component/proc/PostTransfer()
return COMPONENT_INCOMPATIBLE //Do not support transfer by default as you must properly support it
/**
* Internal proc to create a list of our type and all parent types
*/
/datum/component/proc/_GetInverseTypeList(our_type = type)
//we can do this one simple trick
var/current_type = parent_type
. = list(our_type, current_type)
//and since most components are root level + 1, this won't even have to run
while (current_type != /datum/component)
current_type = type2parent(current_type)
. += current_type
/**
* Internal proc to handle most all of the signaling procedure
*
* Will runtime if used on datums with an empty component list
*
* Use the [SEND_SIGNAL] define instead
*/
/datum/proc/_SendSignal(sigtype, list/arguments)
var/target = comp_lookup[sigtype]
if(!length(target))
var/datum/C = target
if(!C.signal_enabled)
return NONE
var/proctype = C.signal_procs[src][sigtype]
return NONE | CallAsync(C, proctype, arguments)
. = NONE
for(var/I in target)
var/datum/C = I
if(!C.signal_enabled)
continue
var/proctype = C.signal_procs[src][sigtype]
. |= CallAsync(C, proctype, arguments)
// The type arg is casted so initial works, you shouldn't be passing a real instance into this
/**
* Return any component assigned to this datum of the given type
*
* This will throw an error if it's possible to have more than one component of that type on the parent
*
* Arguments:
* * datum/component/c_type The typepath of the component you want to get a reference to
*/
/datum/proc/GetComponent(datum/component/c_type)
// RETURN_TYPE(c_type)
if(initial(c_type.dupe_mode) == COMPONENT_DUPE_ALLOWED || initial(c_type.dupe_mode) == COMPONENT_DUPE_SELECTIVE)
stack_trace("GetComponent was called to get a component of which multiple copies could be on an object. This can easily break and should be changed. Type: \[[c_type]\]")
var/list/dc = datum_components
if(!dc)
return null
. = dc[c_type]
if(length(.))
return .[1]
// The type arg is casted so initial works, you shouldn't be passing a real instance into this
/**
* Return any component assigned to this datum of the exact given type
*
* This will throw an error if it's possible to have more than one component of that type on the parent
*
* Arguments:
* * datum/component/c_type The typepath of the component you want to get a reference to
*/
/datum/proc/GetExactComponent(datum/component/c_type)
// RETURN_TYPE(c_type)
if(initial(c_type.dupe_mode) == COMPONENT_DUPE_ALLOWED || initial(c_type.dupe_mode) == COMPONENT_DUPE_SELECTIVE)
stack_trace("GetComponent was called to get a component of which multiple copies could be on an object. This can easily break and should be changed. Type: \[[c_type]\]")
var/list/dc = datum_components
if(!dc)
return null
var/datum/component/C = dc[c_type]
if(C)
if(length(C))
C = C[1]
if(C.type == c_type)
return C
return null
/**
* Get all components of a given type that are attached to this datum
*
* Arguments:
* * c_type The component type path
*/
/datum/proc/GetComponents(c_type)
var/list/dc = datum_components
if(!dc)
return null
. = dc[c_type]
if(!length(.))
return list(.)
/**
* Creates an instance of `new_type` in the datum and attaches to it as parent
*
* Sends the [COMSIG_COMPONENT_ADDED] signal to the datum
*
* Returns the component that was created. Or the old component in a dupe situation where [COMPONENT_DUPE_UNIQUE] was set
*
* If this tries to add a component to an incompatible type, the component will be deleted and the result will be `null`. This is very unperformant, try not to do it
*
* Properly handles duplicate situations based on the `dupe_mode` var
*/
/datum/proc/_AddComponent(list/raw_args)
var/new_type = raw_args[1]
var/datum/component/nt = new_type
var/dm = initial(nt.dupe_mode)
var/dt = initial(nt.dupe_type)
var/datum/component/old_comp
var/datum/component/new_comp
if(ispath(nt))
if(nt == /datum/component)
CRASH("[nt] attempted instantiation!")
else
new_comp = nt
nt = new_comp.type
raw_args[1] = src
if(dm != COMPONENT_DUPE_ALLOWED)
if(!dt)
old_comp = GetExactComponent(nt)
else
old_comp = GetComponent(dt)
if(old_comp)
switch(dm)
if(COMPONENT_DUPE_UNIQUE)
if(!new_comp)
new_comp = new nt(raw_args)
if(!QDELETED(new_comp))
old_comp.InheritComponent(new_comp, TRUE)
QDEL_NULL(new_comp)
if(COMPONENT_DUPE_HIGHLANDER)
if(!new_comp)
new_comp = new nt(raw_args)
if(!QDELETED(new_comp))
new_comp.InheritComponent(old_comp, FALSE)
QDEL_NULL(old_comp)
if(COMPONENT_DUPE_UNIQUE_PASSARGS)
if(!new_comp)
var/list/arguments = raw_args.Copy(2)
arguments.Insert(1, null, TRUE)
old_comp.InheritComponent(arglist(arguments))
else
old_comp.InheritComponent(new_comp, TRUE)
if(COMPONENT_DUPE_SELECTIVE)
var/list/arguments = raw_args.Copy()
arguments[1] = new_comp
var/make_new_component = TRUE
for(var/i in GetComponents(new_type))
var/datum/component/C = i
if(C.CheckDupeComponent(arglist(arguments)))
make_new_component = FALSE
QDEL_NULL(new_comp)
break
if(!new_comp && make_new_component)
new_comp = new nt(raw_args)
else if(!new_comp)
new_comp = new nt(raw_args) // There's a valid dupe mode but there's no old component, act like normal
else if(!new_comp)
new_comp = new nt(raw_args) // Dupes are allowed, act like normal
if(!old_comp && !QDELETED(new_comp)) // Nothing related to duplicate components happened and the new component is healthy
SEND_SIGNAL(src, COMSIG_COMPONENT_ADDED, new_comp)
return new_comp
return old_comp
/**
* Get existing component of type, or create it and return a reference to it
*
* Use this if the item needs to exist at the time of this call, but may not have been created before now
*
* Arguments:
* * component_type The typepath of the component to create or return
* * ... additional arguments to be passed when creating the component if it does not exist
*/
/datum/proc/LoadComponent(component_type, ...)
. = GetComponent(component_type)
if(!.)
return _AddComponent(args)
/**
* Removes the component from parent, ends up with a null parent
*/
/datum/component/proc/RemoveComponent()
if(!parent)
return
var/datum/old_parent = parent
PreTransfer()
_RemoveFromParent()
parent = null
SEND_SIGNAL(old_parent, COMSIG_COMPONENT_REMOVING, src)
/**
* Transfer this component to another parent
*
* Component is taken from source datum
*
* Arguments:
* * datum/component/target Target datum to transfer to
*/
/datum/proc/TakeComponent(datum/component/target)
if(!target || target.parent == src)
return
if(target.parent)
target.RemoveComponent()
target.parent = src
var/result = target.PostTransfer()
switch(result)
if(COMPONENT_INCOMPATIBLE)
var/c_type = target.type
qdel(target)
CRASH("Incompatible [c_type] transfer attempt to a [type]!")
if(target == AddComponent(target))
target._JoinParent()
/**
* Transfer all components to target
*
* All components from source datum are taken
*
* Arguments:
* * /datum/target the target to move the components to
*/
/datum/proc/TransferComponents(datum/target)
var/list/dc = datum_components
if(!dc)
return
var/comps = dc[/datum/component]
if(islist(comps))
for(var/datum/component/I in comps)
if(I.can_transfer)
target.TakeComponent(I)
else
var/datum/component/C = comps
if(C.can_transfer)
target.TakeComponent(comps)
/**
* Return the object that is the host of any UI's that this component has
*/
/datum/component/tgui_host()
return parent
+36
View File
@@ -6,6 +6,10 @@
/datum
var/gc_destroyed //Time when this object was destroyed.
var/list/active_timers //for SStimer
var/list/datum_components //for /datum/components
var/list/comp_lookup
var/list/signal_procs
var/signal_enabled = FALSE
var/weakref/weakref // Holder of weakref instance pointing to this datum
var/datum_flags = NONE
@@ -30,6 +34,38 @@
weakref = null // Clear this reference to ensure it's kept for as brief duration as possible.
//BEGIN: ECS SHIT
signal_enabled = FALSE
var/list/dc = datum_components
if(dc)
var/all_components = dc[/datum/component]
if(length(all_components))
for(var/I in all_components)
var/datum/component/C = I
qdel(C, FALSE, TRUE)
else
var/datum/component/C = all_components
qdel(C, FALSE, TRUE)
dc.Cut()
var/list/lookup = comp_lookup
if(lookup)
for(var/sig in lookup)
var/list/comps = lookup[sig]
if(length(comps))
for(var/i in comps)
var/datum/component/comp = i
comp.UnregisterSignal(src, sig)
else
var/datum/component/comp = comps
comp.UnregisterSignal(src, sig)
comp_lookup = lookup = null
for(var/target in signal_procs)
UnregisterSignal(target, signal_procs[target])
//END: ECS SHIT
tag = null
SStgui.close_uis(src)
return QDEL_HINT_QUEUE
+29
View File
@@ -26,6 +26,7 @@
VV_DROPDOWN_OPTION(VV_HK_MARK, "Mark Object")
VV_DROPDOWN_OPTION(VV_HK_DELETE, "Delete")
VV_DROPDOWN_OPTION(VV_HK_EXPOSE, "Show VV To Player")
VV_DROPDOWN_OPTION(VV_HK_ADDCOMPONENT, "Add Component/Element")
//This proc is only called if everything topic-wise is verified. The only verifications that should happen here is things like permission checks!
//href_list is a reference, modifying it in these procs WILL change the rest of the proc in topic.dm of admin/view_variables!
@@ -58,6 +59,34 @@
usr.client.mark_datum(src)
IF_VV_OPTION(VV_HK_CALLPROC)
usr.client.callproc_datum(src)
IF_VV_OPTION(VV_HK_ADDCOMPONENT)
if(!check_rights(NONE))
return
var/list/names = list()
var/list/componentsubtypes = sortTim(subtypesof(/datum/component), /proc/cmp_typepaths_asc)
names += "---Components---"
names += componentsubtypes
names += "---Elements---"
names += sortTim(subtypesof(/datum/element), /proc/cmp_typepaths_asc)
var/result = input(usr, "Choose a component/element to add","better know what ur fuckin doin pal") as null|anything in names
if(!usr || !result || result == "---Components---" || result == "---Elements---")
return
if(QDELETED(src))
to_chat(usr, "That thing doesn't exist anymore!", confidential = TRUE)
return
var/list/lst = usr.client.get_callproc_args()
if(!lst)
return
var/datumname = "error"
lst.Insert(1, result)
if(result in componentsubtypes)
datumname = "component"
_AddComponent(lst)
else
datumname = "element"
_AddElement(lst)
log_admin("[key_name(usr)] has added [result] [datumname] to [key_name(src)].")
message_admins("<span class='notice'>[key_name_admin(usr)] has added [result] [datumname] to [key_name_admin(src)].</span>")
/datum/proc/vv_get_header()
. = list()
+55
View File
@@ -0,0 +1,55 @@
/**
* A holder for simple behaviour that can be attached to many different types
*
* Only one element of each type is instanced during game init.
* Otherwise acts basically like a lightweight component.
*/
/datum/element
/// Option flags for element behaviour
var/element_flags = NONE
/**
* The index of the first attach argument to consider for duplicate elements
*
* Is only used when flags contains [ELEMENT_BESPOKE]
*
* This is infinity so you must explicitly set this
*/
var/id_arg_index = INFINITY
/// Activates the functionality defined by the element on the given target datum
/datum/element/proc/Attach(datum/target)
// SHOULD_CALL_PARENT(1)
if(type == /datum/element)
return ELEMENT_INCOMPATIBLE
SEND_SIGNAL(target, COMSIG_ELEMENT_ATTACH, src)
if(element_flags & ELEMENT_DETACH)
RegisterSignal(target, COMSIG_PARENT_QDELETING, .proc/Detach, override = TRUE)
/// Deactivates the functionality defines by the element on the given datum
/datum/element/proc/Detach(datum/source, force)
SEND_SIGNAL(source, COMSIG_ELEMENT_DETACH, src)
// SHOULD_CALL_PARENT(1)
UnregisterSignal(source, COMSIG_PARENT_QDELETING)
/datum/element/Destroy(force)
if(!force)
return QDEL_HINT_LETMELIVE
SSdcs.elements_by_type -= type
return ..()
//DATUM PROCS
/// Finds the singleton for the element type given and attaches it to src
/datum/proc/_AddElement(list/arguments)
var/datum/element/ele = SSdcs.GetElement(arguments)
arguments[1] = src
if(ele.Attach(arglist(arguments)) == ELEMENT_INCOMPATIBLE)
CRASH("Incompatible [arguments[1]] assigned to a [type]! args: [json_encode(args)]")
/**
* Finds the singleton for the element type given and detaches it from src
* You only need additional arguments beyond the type if you're using [ELEMENT_BESPOKE]
*/
/datum/proc/_RemoveElement(list/arguments)
var/datum/element/ele = SSdcs.GetElement(arguments)
ele.Detach(src)
+16
View File
@@ -27,3 +27,19 @@
/datum/looping_sound/geiger/stop()
. = ..()
last_radiation = 0
/datum/looping_sound/small_motor
start_sound = 'sound/items/small_motor/motor_start_nopull.ogg'
start_length = 2 SECONDS
mid_sounds = list(
'sound/items/small_motor/motor_idle.ogg',
'sound/items/small_motor/motor_fast.ogg',
'sound/items/small_motor/motor_faster.ogg'
)
mid_length = 1.9 SECONDS //someone make this loop better please, i'm no good at sound. the clips should be 2 seconds exact but there's a gap if it's set to 2
end_sound = 'sound/items/small_motor/motor_end.ogg'
var/speed = 1
/datum/looping_sound/small_motor/get_sound(starttime)
speed = clamp(speed, 1, 3)
return ..(starttime, mid_sounds[speed])
-5
View File
@@ -25,11 +25,6 @@ GLOBAL_DATUM_INIT(moved_event, /decl/observ/moved, new)
/********************
* Movement Handling *
********************/
/atom/Entered(var/atom/movable/am, var/atom/old_loc)
. = ..()
GLOB.moved_event.raise_event(am, old_loc, am.loc)
/atom/movable/Entered(var/atom/movable/am, atom/old_loc)
. = ..()
if(GLOB.moved_event.has_listeners(am))
+7
View File
@@ -151,6 +151,13 @@
containername = "Singularity Generator crate"
access = access_ce
/datum/supply_pack/eng/engine/tesla_gen
name = "Tesla Generator crate"
contains = list(/obj/machinery/the_singularitygen/tesla)
containertype = /obj/structure/closet/crate/secure/einstein
containername = "Tesla Generator crate"
access = access_ce
/datum/supply_pack/eng/engine/collector
name = "Collector crate"
contains = list(/obj/machinery/power/rad_collector = 3)
+7
View File
@@ -358,6 +358,13 @@ NOTE: there are two lists of areas in the end of this file: centcom and station
name = "\improper Thunderdome (Observer.)"
icon_state = "purple"
/area/virtual_reality
name = "Virtual Reality"
icon_state = "Virtual_Reality"
dynamic_lighting = 0
requires_power = 0
flags = AREA_FLAG_IS_NOT_PERSISTENT
//ENEMY
//names are used
+16
View File
@@ -210,6 +210,7 @@
if(user.client?.prefs.examine_text_mode == EXAMINE_MODE_SWITCH_TO_PANEL)
user.client.statpanel = "Examine" // Switch to stat panel
SEND_SIGNAL(src, COMSIG_PARENT_EXAMINE, user, output)
return output
// Don't make these call bicon or anything, these are what bicon uses. They need to return an icon.
@@ -223,6 +224,7 @@
//called to set the atom's dir and used to add behaviour to dir-changes
/atom/proc/set_dir(new_dir)
SEND_SIGNAL(src, COMSIG_ATOM_DIR_CHANGE, dir, new_dir)
. = new_dir != dir
dir = new_dir
@@ -631,3 +633,17 @@
/atom/proc/speech_bubble(bubble_state = "", bubble_loc = src, list/bubble_recipients = list())
return
/atom/Entered(atom/movable/AM, atom/old_loc)
. = ..()
GLOB.moved_event.raise_event(AM, old_loc, AM.loc)
SEND_SIGNAL(src, COMSIG_ATOM_ENTERED, AM, old_loc)
/atom/Exit(atom/movable/AM, atom/new_loc)
. = ..()
if(SEND_SIGNAL(src, COMSIG_ATOM_EXIT, AM, new_loc) & COMPONENT_ATOM_BLOCK_EXIT)
return FALSE
/atom/Exited(atom/movable/AM, atom/new_loc)
. = ..()
SEND_SIGNAL(src, COMSIG_ATOM_EXITED, AM, new_loc)
+1 -2
View File
@@ -29,8 +29,7 @@
desc = "Used to control various station atmospheric systems. The light indicates the current air status of the area."
icon = 'icons/obj/monitors_vr.dmi' //CHOMPEdit: Continues using new air alarm sprite, contrary to YW
icon_state = "alarm0"
plane = TURF_PLANE
layer = ABOVE_TURF_LAYER
layer = ABOVE_WINDOW_LAYER
anchored = 1
use_power = USE_POWER_IDLE
idle_power_usage = 80
+1 -2
View File
@@ -2,8 +2,7 @@
name = "button"
icon = 'icons/obj/objects.dmi'
icon_state = "launcherbtt"
// plane = TURF_PLANE //Can't have them under tables, oh well.
// layer = ABOVE_TURF_LAYER
layer = ABOVE_WINDOW_LAYER
desc = "A remote control switch for something."
var/id = null
var/active = 0
+1 -2
View File
@@ -59,8 +59,7 @@
name = "Telescreen"
desc = "Used for watching an empty arena."
icon_state = "wallframe"
plane = TURF_PLANE
layer = ABOVE_TURF_LAYER
layer = ABOVE_WINDOW_LAYER
icon_keyboard = null
icon_screen = null
light_range_on = 0
+1 -2
View File
@@ -79,8 +79,7 @@
name = "guest pass terminal"
desc = "Used to print temporary passes for people. Handy!"
icon_state = "guest"
plane = TURF_PLANE
layer = ABOVE_TURF_LAYER
layer = ABOVE_WINDOW_LAYER
icon_keyboard = null
icon_screen = "pass"
density = 0
@@ -148,6 +148,7 @@ obj/machinery/door/airlock/Destroy()
obj/machinery/airlock_sensor
icon = 'icons/obj/airlock_machines.dmi'
icon_state = "airlock_sensor_off"
layer = ABOVE_WINDOW_LAYER
name = "airlock sensor"
desc = "Sends atmospheric readings to a nearby controller."
@@ -233,6 +234,7 @@ obj/machinery/airlock_sensor/airlock_exterior/shuttle/return_air()
obj/machinery/access_button
icon = 'icons/obj/airlock_machines.dmi'
icon_state = "access_button_standby"
layer = ABOVE_WINDOW_LAYER
name = "access button"
anchored = 1
+1
View File
@@ -22,6 +22,7 @@
name = "Door Timer"
icon = 'icons/obj/status_display.dmi'
icon_state = "frame"
layer = ABOVE_WINDOW_LAYER
desc = "A remote control for a door."
req_access = list(access_brig)
anchored = 1.0 // can't pick it up
@@ -15,6 +15,7 @@
var/list/dummy_terminals = list()
var/cycle_to_external_air = 0
valid_actions = list("cycle_ext", "cycle_int", "force_ext", "force_int", "abort", "purge", "secure")
layer = ABOVE_WINDOW_LAYER
/obj/machinery/embedded_controller/radio/airlock/Destroy()
// TODO - Leshana - Implement dummy terminals
+1 -2
View File
@@ -6,8 +6,7 @@ FIRE ALARM
desc = "<i>\"Pull this in case of emergency\"</i>. Thus, keep pulling it forever."
icon = 'icons/obj/monitors.dmi'
icon_state = "fire0"
plane = TURF_PLANE
layer = ABOVE_TURF_LAYER
layer = ABOVE_WINDOW_LAYER
var/detecting = 1.0
var/working = 1.0
var/time = 10.0
+1
View File
@@ -4,6 +4,7 @@
desc = "A wall-mounted flashbulb device."
icon = 'icons/obj/stationobjs.dmi'
icon_state = "mflash1"
layer = ABOVE_WINDOW_LAYER
var/id = null
var/range = 2 //this is roughly the size of brig cell
var/disable = 0
+1
View File
@@ -48,6 +48,7 @@
desc = "A wall-mounted ignition device."
icon = 'icons/obj/stationobjs.dmi'
icon_state = "migniter"
layer = ABOVE_WINDOW_LAYER
var/id = null
var/disable = 0
var/last_spark = 0
+1
View File
@@ -6,6 +6,7 @@
desc = "It turns lights on and off. What are you, simple?"
icon = 'icons/obj/power_vr.dmi' // VOREStation Edit
icon_state = "light1"
layer = ABOVE_WINDOW_LAYER
anchored = 1.0
use_power = USE_POWER_IDLE
idle_power_usage = 10
+1
View File
@@ -4,6 +4,7 @@
desc = "Small wall-mounted electronic sign"
icon = 'icons/obj/neonsigns.dmi'
icon_state = "sign_off"
layer = ABOVE_WINDOW_LAYER
plane = MOB_PLANE
use_power = USE_POWER_IDLE
idle_power_usage = 2
+1 -2
View File
@@ -126,8 +126,7 @@ GLOBAL_LIST_BOILERPLATE(allCasters, /obj/machinery/newscaster)
desc = "A standard newsfeed handler for use on commercial space stations. All the news you absolutely have no use for, in one place!"
icon = 'icons/obj/terminals_vr.dmi' //VOREStation Edit
icon_state = "newscaster_normal"
plane = TURF_PLANE
layer = ABOVE_TURF_LAYER
layer = ABOVE_WINDOW_LAYER
var/isbroken = 0 //1 if someone banged it with something heavy
var/ispowered = 1 //starts powered, changes with power_change()
//var/list/datum/feed_channel/channel_list = list() //This list will contain the names of the feed channels. Each name will refer to a data region where the messages of the feed channels are stored.
+1 -2
View File
@@ -28,8 +28,7 @@ var/list/obj/machinery/requests_console/allConsoles = list()
anchored = 1
icon = 'icons/obj/terminals_vr.dmi' //VOREStation Edit
icon_state = "req_comp0"
plane = TURF_PLANE
layer = ABOVE_TURF_LAYER
layer = ABOVE_WINDOW_LAYER
circuit = /obj/item/weapon/circuitboard/request
var/department = "Unknown" //The list of all departments on the station (Determined from this variable on each unit) Set this to the same thing if you want several consoles in one department
var/list/message_log = list() //List of all messages
+2 -2
View File
@@ -13,7 +13,7 @@
icon = 'icons/obj/status_display.dmi'
icon_state = "frame"
plane = TURF_PLANE
layer = ABOVE_TURF_LAYER
layer = ABOVE_WINDOW_LAYER
name = "status display"
anchored = 1
density = 0
@@ -267,4 +267,4 @@
#undef FOND_SIZE
#undef FONT_COLOR
#undef FONT_STYLE
#undef SCROLL_SPEED
#undef SCROLL_SPEED
+1
View File
@@ -59,6 +59,7 @@ var/list/ai_status_emotions = list(
/obj/machinery/ai_status_display
icon = 'icons/obj/status_display.dmi'
icon_state = "frame"
layer = ABOVE_WINDOW_LAYER
name = "AI display"
anchored = 1
density = 0
+52
View File
@@ -396,6 +396,7 @@
description_fluff = "NanoMed is NanoTrasen's medical science division, and provides almost all of the modern medbay essentials in-house at no extra charge. By using this vending machine, employees accept liability for products that may or may not be temporarily replaced by placebos or experimental treatments."
product_ads = "Go save some lives!;The best stuff for your medbay.;Only the finest tools.;Natural chemicals!;This stuff saves lives.;Don't you want some?"
icon_state = "wallmed"
layer = ABOVE_WINDOW_LAYER
density = 0 //It is wall-mounted, and thus, not dense. --Superxpdude
products = list(/obj/item/stack/medical/bruise_pack = 2,
/obj/item/stack/medical/ointment = 2,
@@ -413,6 +414,7 @@
desc = "A wall-mounted version of the NanoMed, containing only vital first aid equipment."
description_fluff = "NanoMed is NanoTrasen's medical science division, and provides almost all of the modern medbay essentials in-house at no extra charge. By using this vending machine, employees accept liability for products that may or may not be temporarily replaced by placebos or experimental treatments."
icon_state = "wallmed"
layer = ABOVE_WINDOW_LAYER
density = 0 //It is wall-mounted, and thus, not dense. --Superxpdude
products = list(/obj/item/weapon/reagent_containers/hypospray/autoinjector = 5,
/obj/item/weapon/reagent_containers/syringe/antitoxin = 3,
@@ -826,3 +828,53 @@
/obj/item/stack/cable_coil/random = 4)
premium = list(/obj/item/weapon/storage/box/wormcan/deluxe = 1)
contraband = list(/obj/item/weapon/storage/box/wormcan/deluxe = 1)
/obj/machinery/vending/virtual_autodrobe
name = "Virtual AutoDrobe"
desc = "A virtual vending machine for virtual avatar customization."
icon_state = "Theater"
product_slogans = "Dress for success!;Suited and booted!;It's show time!;Why leave style up to fate? Use AutoDrobe!"
products = list(/obj/item/weapon/storage/box/syndie_kit/chameleon = 20)
/obj/machinery/vending/deathmatch
name = "Annihilation Shop (Green)"
desc = "A virtual vending machine for virtual murder equipment. This one's for green team."
products = list(/obj/item/weapon/melee/energy/sword = 5,
/obj/item/weapon/melee/energy/axe = 5,
/obj/item/weapon/melee/baton/loaded = 5,
/obj/item/weapon/gun/energy/laser = 5,
/obj/item/weapon/gun/projectile/shotgun/pump/combat = 5,
/obj/item/ammo_magazine/clip/c12g/pellet = 40,
/obj/item/ammo_magazine/clip/c12g = 50,
/obj/item/weapon/storage/box/flashbangs = 2,
/obj/item/clothing/head/helmet/swat = 5,
/obj/item/clothing/suit/armor/vest = 5,
/obj/item/clothing/head/helmet/thunderdome = 5,
/obj/item/clothing/shoes/brown = 5,
/obj/item/clothing/suit/armor/tdome/green = 5,
/obj/item/clothing/under/color/green = 5,
/obj/item/weapon/reagent_containers/pill/adminordrazine = 10,
/obj/item/weapon/tool/crowbar = 1)
/obj/machinery/vending/deathmatch/red
name = "Annihilation Shop (Red)"
desc = "A virtual vending machine for virtual murder equipment. This one's for red team."
products = list(/obj/item/weapon/melee/energy/sword = 5,
/obj/item/weapon/melee/energy/axe = 5,
/obj/item/weapon/melee/baton/loaded = 5,
/obj/item/weapon/gun/energy/laser = 5,
/obj/item/weapon/gun/projectile/shotgun/pump/combat = 5,
/obj/item/ammo_magazine/clip/c12g/pellet = 40,
/obj/item/ammo_magazine/clip/c12g = 50,
/obj/item/weapon/storage/box/flashbangs = 2,
/obj/item/clothing/head/helmet/swat = 5,
/obj/item/clothing/suit/armor/vest = 5,
/obj/item/clothing/head/helmet/thunderdome = 5,
/obj/item/clothing/shoes/brown = 5,
/obj/item/clothing/suit/armor/tdome/red = 5,
/obj/item/clothing/under/color/red = 5,
/obj/item/weapon/reagent_containers/pill/adminordrazine = 10,
/obj/item/weapon/tool/crowbar = 1)
+7 -7
View File
@@ -41,14 +41,14 @@
materials = list(DEFAULT_WALL_MATERIAL = 12500)
/datum/design/item/mecha/drill/micro
name = "Miniature Drill"
name = "Micro Drill" //CHOMPedit
id = "micro_drill"
build_path = /obj/item/mecha_parts/mecha_equipment/tool/drill/micro
time = 5
materials = list(DEFAULT_WALL_MATERIAL = 2500)
/datum/design/item/mecha/hydraulic_clamp/micro
name = "Mounted ore box"
name = "Mounted micro ore box" //CHOMPedit
id = "ore_scoop"
build_path = /obj/item/mecha_parts/mecha_equipment/tool/micro/orescoop
time = 5
@@ -103,31 +103,31 @@
materials = list(DEFAULT_WALL_MATERIAL = 12500, "plastic" = 7500)
/datum/design/item/mecha/taser/micro
name = "\improper TS-12 \"Suppressor\" integrated taser"
name = "\improper TS-12 \"Suppressor\" integrated micro taser" //CHOMPedit
id = "micro_taser"
build_path = /obj/item/mecha_parts/mecha_equipment/weapon/energy/microtaser
/datum/design/item/mecha/weapon/laser/micro
name = "\improper WS-19 \"Torch\" laser carbine"
name = "\improper WS-19 \"Torch\" micro laser carbine" //CHOMPedit
id = "micro_laser"
// req_tech = list(TECH_COMBAT = 3, TECH_MAGNET = 3)
build_path = /obj/item/mecha_parts/mecha_equipment/weapon/energy/microlaser
/datum/design/item/mecha/weapon/laser_heavy/micro
name = "\improper PC-20 \"Lance\" light laser cannon"
name = "\improper PC-20 \"Lance\" micro laser cannon" //CHOMPedit
id = "micro_laser_heavy"
req_tech = list(TECH_COMBAT = 4, TECH_MATERIAL = 3, TECH_POWER = 3)
materials = list(DEFAULT_WALL_MATERIAL = 10000, "glass" = 1000, "diamond" = 2000)
build_path = /obj/item/mecha_parts/mecha_equipment/weapon/energy/laser/microheavy
/datum/design/item/mecha/weapon/grenade_launcher/micro
name = "\improper FP-20 mounted grenade launcher"
name = "\improper FP-20 mounted micro flashbang launcher" //CHOMPedit
id = "micro_flashbang_launcher"
// req_tech = list(TECH_COMBAT = 3)
build_path = /obj/item/mecha_parts/mecha_equipment/weapon/ballistic/missile_rack/grenade/microflashbang
/datum/design/item/mecha/weapon/scattershot/micro
name = "\improper Remington C-12 \"Boomstick\""
name = "\improper Remington C-12 \"Micro-Boomstick\"" //CHOMPedit
desc = "A mounted combat shotgun with integrated ammo-lathe."
id = "micro_scattershot"
// req_tech = list(TECH_COMBAT = 4)
+14 -14
View File
@@ -6,9 +6,9 @@
/obj/item/mecha_parts/mecha_equipment/weapon/energy/microlaser
w_class = ITEMSIZE_LARGE
desc = "A mounted laser-carbine for light exosuits."
desc = "A mounted micro laser-carbine for micro mechs." //CHOMPedit
equip_cooldown = 10 // same as the laser carbine
name = "\improper WS-19 \"Torch\" laser carbine"
name = "\improper WS-19 \"Torch\" micro laser carbine" //CHOMPedit
icon = 'icons/mecha/mecha_equipment_vr.dmi'
icon_state = "micromech_laser"
energy_drain = 50
@@ -19,9 +19,9 @@
/obj/item/mecha_parts/mecha_equipment/weapon/energy/laser/microheavy
w_class = ITEMSIZE_LARGE
desc = "A mounted laser cannon for light exosuits."
desc = "A mounted micro laser cannon for micro mechs." //CHOMPedit
equip_cooldown = 30 // same as portable
name = "\improper PC-20 \"Lance\" light laser cannon"
name = "\improper PC-20 \"Lance\" micro light laser cannon" //CHOMPedit
icon = 'icons/mecha/mecha_equipment_vr.dmi'
icon_state = "micromech_lasercannon"
energy_drain = 120
@@ -32,8 +32,8 @@
/obj/item/mecha_parts/mecha_equipment/weapon/energy/microtaser
w_class = ITEMSIZE_LARGE
desc = "A mounted taser for light exosuits."
name = "\improper TS-12 \"Suppressor\" integrated taser"
desc = "A mounted micro taser for micro mechs." //CHOMPedit
name = "\improper TS-12 \"Suppressor\" integrated micro taser" //CHOMPedit
icon = 'icons/mecha/mecha_equipment_vr.dmi'
icon_state = "micromech_taser"
energy_drain = 40
@@ -45,8 +45,8 @@
/obj/item/mecha_parts/mecha_equipment/weapon/ballistic/microshotgun
w_class = ITEMSIZE_LARGE
desc = "A mounted combat shotgun with integrated ammo-lathe."
name = "\improper Remington C-12 \"Boomstick\""
desc = "A mounted micro combat shotgun with integrated ammo-lathe." //CHOMPedit
name = "\improper Remington C-12 \"Micro-Boomstick\"" //CHOMPedit
icon = 'icons/mecha/mecha_equipment_vr.dmi'
icon_state = "micromech_shotgun"
equip_cooldown = 15
@@ -84,8 +84,8 @@
/obj/item/mecha_parts/mecha_equipment/weapon/ballistic/missile_rack/grenade/microflashbang
w_class = ITEMSIZE_LARGE
desc = "A mounted grenade launcher for smaller mechs."
name = "\improper FP-20 mounted grenade launcher"
desc = "A mounted micro flashbang launcher for micro mechs." //CHOMPedit
name = "\improper FP-20 mounted micro flashbang launcher" //CHOMPedit
icon = 'icons/mecha/mecha_equipment_vr.dmi'
icon_state = "micromech_launcher"
projectiles = 1
@@ -103,8 +103,8 @@
/obj/item/mecha_parts/mecha_equipment/tool/drill/micro
w_class = ITEMSIZE_LARGE
name = "drill"
desc = "This is the drill that'll sorta poke holes in the heavens!"
name = "Micro Drill" //CHOMPedit
desc = "This is the micro drill that'll sorta poke holes in the heavens!" //CHOMPedit
icon = 'icons/mecha/mecha_equipment_vr.dmi'
icon_state = "microdrill"
equip_cooldown = 30
@@ -155,8 +155,8 @@
/obj/item/mecha_parts/mecha_equipment/tool/micro/orescoop
w_class = ITEMSIZE_LARGE
name = "Mounted ore box"
desc = "A mounted ore scoop and hopper, for gathering ores."
name = "Mounted micro ore box" //CHOMPedit
desc = "A small mounted ore scoop and hopper, for gathering ores in a micro mech." //CHOMPedit
icon = 'icons/mecha/mecha_equipment_vr.dmi'
icon_state = "microscoop"
equip_cooldown = 5
+20 -14
View File
@@ -33,23 +33,29 @@ GLOBAL_LIST_BOILERPLATE(all_pai_cards, /obj/item/device/paicard)
QDEL_NULL(radio)
return ..()
/obj/item/device/paicard/attack_ghost(mob/observer/dead/user)
if(istype(user) && user.can_admin_interact())
switch(alert(user, "Would you like to become a pAI by force? (Admin)", "pAI Creation", "Yes", "No"))
if("Yes")
// Copied from paiController/Topic
var/mob/living/silicon/pai/pai = new(src)
pai.name = user.name
pai.real_name = pai.name
pai.key = user.key
// VOREStation Edit - Allow everyone to become a pAI
/obj/item/device/paicard/attack_ghost(mob/user as mob)
if(pai != null) //Have a person in them already?
return ..()
setPersonality(pai)
looking_for_personality = FALSE
var/choice = input(user, "You sure you want to inhabit this PAI?") in list("Yes", "No")
if(choice == "No")
return ..()
if(pai.mind)
update_antag_icons(pai.mind)
var/pai_name = input(user, "Choose your character's name", "Character Name") as text
var/actual_pai_name = sanitize_name(pai_name)
if(isnull(actual_pai_name))
return ..()
var/turf/location = get_turf(src)
var/obj/item/device/paicard/card = new(location)
var/mob/living/silicon/pai/new_pai = new(card)
qdel(src)
new_pai.key = user.key
card.setPersonality(new_pai)
new_pai.SetName(actual_pai_name)
return ..()
// VOREStation Edit End
/obj/item/device/paicard/attack_self(mob/user)
if (!in_range(src, user))
@@ -3,8 +3,7 @@
desc = "Talk through this."
icon = 'icons/obj/radio_vr.dmi' //VOREStation Edit - New Icon
icon_state = "intercom"
plane = TURF_PLANE
layer = ABOVE_TURF_LAYER
layer = ABOVE_WINDOW_LAYER
anchored = 1
w_class = ITEMSIZE_LARGE
canhear_range = 7 //VOREStation Edit
@@ -4,6 +4,10 @@
name = "stack of grass"
type_to_spawn = /obj/item/stack/tile/grass
/obj/fiftyspawner/grass/sif
name = "stack of sifgrass"
type_to_spawn = /obj/item/stack/tile/grass/sif
/obj/fiftyspawner/wood
name = "stack of wood"
type_to_spawn = /obj/item/stack/tile/wood
@@ -46,6 +46,12 @@
no_variants = FALSE
drop_sound = 'sound/items/drop/herb.ogg'
pickup_sound = 'sound/items/pickup/herb.ogg'
/obj/item/stack/tile/grass/sif
name = "sivian grass tile"
singular_name = "sivian grass floor tile"
desc = "A patch of grass like those that decorate the plains of Sif."
/*
* Wood
*/
+45 -1
View File
@@ -114,6 +114,18 @@
w_class = ITEMSIZE_LARGE
drop_sound = 'sound/items/drop/rubber.ogg'
/obj/item/toy/colorballoon /// To color it, VV the 'color' var with a hex color code with the # included.
name = "balloon"
desc = "It's a plain little balloon. Comes in many colors!"
throwforce = 0
throw_speed = 4
throw_range = 20
force = 0
icon = 'icons/obj/weapons.dmi'
icon_state = "colorballoon"
w_class = ITEMSIZE_LARGE
drop_sound = 'sound/items/drop/rubber.ogg'
/*
* Fake telebeacon
*/
@@ -1438,4 +1450,36 @@
name = "purple king"
desc = "A large king piece for playing chess. It's made of a purple-colored glass."
description_info = "The King can move exactly one square horizontally, vertically, or diagonally. If your opponent captures this piece, you lose."
icon_state = "b-king"
icon_state = "b-king"
/// Balloon structures
/obj/structure/balloon
name = "generic balloon"
desc = "A generic balloon. How boring."
icon = 'icons/obj/toy.dmi'
icon_state = "ghostballoon"
anchored = 0
density = 0
/obj/structure/balloon/attack_hand(mob/user)
user.setClickCooldown(DEFAULT_ATTACK_COOLDOWN)
if(user.a_intent == I_HELP)
user.visible_message("<span class='notice'><b>\The [user]</b> pokes [src]!</span>","<span class='notice'>You poke [src]!</span>")
else if (user.a_intent == I_HURT)
user.visible_message("<span class='warning'><b>\The [user]</b> punches [src]!</span>","<span class='warning'>You punch [src]!</span>")
else if (user.a_intent == I_GRAB)
user.visible_message("<span class='warning'><b>\The [user]</b> attempts to pop [src]!</span>","<span class='warning'>You attempt to pop [src]!</span>")
else
user.visible_message("<span class='notice'><b>\The [user]</b> lightly bats the [src].</span>","<span class='notice'>You lightly bat the [src].</span>")
/obj/structure/balloon/bat
name = "giant bat balloon"
desc = "A large balloon in the shape of a spooky bat with orange eyes."
icon_state = "batballoon"
/obj/structure/balloon/ghost
name = "giant ghost balloon"
desc = "Oh no, it's a ghost! Oh wait, it's just a balloon. Phew!"
icon_state = "ghostballoon"
@@ -152,4 +152,4 @@
..(loc, "steel")
/obj/item/weapon/material/shard/phoron/New(loc)
..(loc, "phglass")
..(loc, "borosilicate glass")
@@ -178,6 +178,7 @@
desc = "It doesn't seem all that secure. Oh well, it'll do."
icon = 'icons/obj/storage.dmi'
icon_state = "safe"
layer = ABOVE_WINDOW_LAYER
icon_opened = "safe0"
icon_locking = "safeb"
icon_sparking = "safespark"
@@ -0,0 +1,6 @@
/obj/item/weapon/surgical/bioregen
name="bioregenerator"
desc="A special tool used in surgeries which can pull toxins from and restore oxygen to organic tissue as well as recreate missing biological structures to allow otherwise irreperable flesh to be mended."
icon='icons/obj/surgery_ch.dmi'
icon_state="bioregen"
drop_sound = 'sound/items/drop/scrap.ogg'
@@ -1380,6 +1380,36 @@
"glass" = COLOR_WHITE
)
// Wall cabinets
/decl/closet_appearance/wall_double
base_icon = 'icons/obj/closets/bases/wall_double.dmi'
decal_icon = 'icons/obj/closets/decals/wall_double.dmi'
decals = list(
"vent"
)
extra_decals = null
/decl/closet_appearance/wall_double/kitchen
decals = null
color = COLOR_OFF_WHITE
/decl/closet_appearance/wall_double/medical
decals = null
color = COLOR_OFF_WHITE
extra_decals = list(
"stripe_outer" = COLOR_BLUE_GRAY,
"stripe_inner" = COLOR_OFF_WHITE,
"cross" = COLOR_BLUE_GRAY
)
/decl/closet_appearance/wall_double/fire_safety
color = COLOR_RED_LIGHT
decals = null
extra_decals = list(
"stripes" = COLOR_OFF_WHITE,
"glass" = COLOR_WHITE
)
// Carts
/decl/closet_appearance/cart
color = COLOR_GRAY20
@@ -10,7 +10,7 @@
anchored = 1
store_mobs = 0
//spawns endless (3 sets) amounts of breathmask, emergency oxy tank and crowbar
//spawns 2 sets of breathmask, emergency oxy tank and crowbar
/obj/structure/closet/walllocker/emerglocker
name = "emergency locker"
@@ -75,4 +75,109 @@
/obj/structure/closet/walllocker/medical/east
pixel_x = 32
dir = EAST
dir = EAST
//VOREStation Add End
//double-size "cabinet" lockers, from Killian
/obj/structure/closet/walllocker_double
desc = "A wall mounted storage cabinet."
name = "Wall Cabinet"
icon = 'icons/obj/closets/bases/wall_double.dmi'
closet_appearance = /decl/closet_appearance/wall_double
density = 0
anchored = 1
plane = TURF_PLANE
layer = ABOVE_TURF_LAYER
/obj/structure/closet/walllocker_double/north
pixel_y = 32
dir = SOUTH
/obj/structure/closet/walllocker_double/south
pixel_y = -32
dir = NORTH
/obj/structure/closet/walllocker_double/west
pixel_x = -32
dir = WEST
/obj/structure/closet/walllocker_double/east
pixel_x = 32
dir = EAST
/obj/structure/closet/walllocker_double/kitchen
desc = "A wall mounted storage cabinet, for the kitchen. Now where's the flour gone..?"
name = "Kitchen Cabinet"
icon = 'icons/obj/closets/bases/wall_double.dmi'
closet_appearance = /decl/closet_appearance/wall_double/kitchen
density = 0
anchored = 1
/obj/structure/closet/walllocker_double/kitchen/north
pixel_y = 32
dir = SOUTH
/obj/structure/closet/walllocker_double/kitchen/south
pixel_y = -32
dir = NORTH
/obj/structure/closet/walllocker_double/kitchen/west
pixel_x = -32
dir = WEST
/obj/structure/closet/walllocker_double/kitchen/east
pixel_x = 32
dir = EAST
/obj/structure/closet/walllocker_double/medical
name = "Medical Cabinet"
desc = "A wall mounted medical supply cabinet. Probably full of drugs!" //not actually full of drugs, sorry!
closet_appearance = /decl/closet_appearance/wall_double/medical
/obj/structure/closet/walllocker_double/medical/north
pixel_y = 32
dir = SOUTH
/obj/structure/closet/walllocker_double/medical/south
pixel_y = -32
dir = NORTH
/obj/structure/closet/walllocker_double/medical/west
pixel_x = -32
dir = WEST
/obj/structure/closet/walllocker_double/medical/east
pixel_x = 32
dir = EAST
/obj/structure/closet/walllocker_double/hydrant
name = "fire-safety closet"
desc = "It's a storage cabinet packed with fire-fighting supplies."
closet_appearance = /decl/closet_appearance/wall_double/fire_safety
anchored = 1
density = 0
wall_mounted = 1
starts_with = list(
/obj/item/clothing/suit/fire/firefighter,
/obj/item/clothing/mask/gas,
/obj/item/device/flashlight,
/obj/item/weapon/tank/oxygen/red,
/obj/item/weapon/extinguisher,
/obj/item/clothing/head/hardhat/red)
/obj/structure/closet/walllocker_double/hydrant/north
pixel_y = 32
dir = SOUTH
/obj/structure/closet/walllocker_double/hydrant/south
pixel_y = -32
dir = NORTH
/obj/structure/closet/walllocker_double/hydrant/west
pixel_x = -32
dir = WEST
/obj/structure/closet/walllocker_double/hydrant/east
pixel_x = 32
dir = EAST
+1 -2
View File
@@ -3,8 +3,7 @@
desc = "A small wall mounted cabinet designed to hold a fire extinguisher."
icon = 'icons/obj/closet.dmi'
icon_state = "extinguisher_closed"
plane = TURF_PLANE
layer = ABOVE_TURF_LAYER
layer = ABOVE_WINDOW_LAYER
anchored = 1
density = 0
var/obj/item/weapon/extinguisher/has_extinguisher
+1
View File
@@ -5,6 +5,7 @@
var/obj/item/weapon/material/twohanded/fireaxe/fireaxe
icon = 'icons/obj/closet.dmi' //Not bothering to move icons out for now. But its dumb still.
icon_state = "fireaxe1000"
layer = ABOVE_WINDOW_LAYER
anchored = 1
density = 0
var/open = 0
+21 -19
View File
@@ -41,59 +41,61 @@
/obj/structure/flora/log1
name = "waterlogged trunk"
icon = 'icons/obj/flora/amayastuff.dmi'
desc = "A part of a felled tree. It is soaking up the water it is bouyant on."
desc = "A part of a felled tree. Moss is growing across it."
icon_state = "log1"
/obj/structure/flora/log2
name = "waterlogged trunk"
name = "driftwood"
icon = 'icons/obj/flora/amayastuff.dmi'
desc = "A part of a felled tree. It is soaking up the water it is bouyant on."
desc = "Driftwood carelessly lost in the water."
icon_state = "log2"
/obj/structure/flora/lily1
name = "waterlogged trunk"
name = "red flowered lilypads"
icon = 'icons/obj/flora/amayastuff.dmi'
desc = "A part of a felled tree. It is soaking up the water it is bouyant on."
desc = "A bunch of lilypads. A beautiful red flower grows in the middle of them."
icon_state = "lilypad1"
/obj/structure/flora/lily2
name = "waterlogged trunk"
name = "yellow flowered lilypads"
icon = 'icons/obj/flora/amayastuff.dmi'
desc = "A part of a felled tree. It is soaking up the water it is bouyant on."
desc = "A few lilypads. A sunny yellow flower stems from the water and from between the lilypads."
icon_state = "lilypad2"
/obj/structure/flora/lily3
name = "waterlogged trunk"
name = "lilypads"
icon = 'icons/obj/flora/amayastuff.dmi'
desc = "A part of a felled tree. It is soaking up the water it is bouyant on."
desc = "A group of flowerless lilypads."
icon_state = "lilypad3"
/obj/structure/flora/smallbould
name = "waterlogged trunk"
name = "small boulder"
icon = 'icons/obj/flora/amayastuff.dmi'
desc = "A part of a felled tree. It is soaking up the water it is bouyant on."
desc = "A small boulder, with its top smothered with moss."
icon_state = "smallerboulder"
/obj/structure/flora/bboulder1
name = "waterlogged trunk"
name = "large boulder"
icon = 'icons/obj/flora/amayastuff.dmi'
desc = "A part of a felled tree. It is soaking up the water it is bouyant on."
desc = "Small stones sit beside this large boulder. Moss grows on the top of each of them."
icon_state = "bigboulder1"
density = 1
/obj/structure/flora/bboulder2
name = "waterlogged trunk"
name = "jagged large boulder"
icon = 'icons/obj/flora/amayastuff.dmi'
desc = "A part of a felled tree. It is soaking up the water it is bouyant on."
desc = "This boulder has had plates broken off it. Moss grows in the cracks and across the top."
icon_state = "bigboulder2"
density = 1
/obj/structure/flora/rocks1
name = "waterlogged trunk"
name = "rocks"
icon = 'icons/obj/flora/amayastuff.dmi'
desc = "A part of a felled tree. It is soaking up the water it is bouyant on."
desc = "A bunch of mossy rocks."
icon_state = "rocks1"
/obj/structure/flora/rocks2
name = "waterlogged trunk"
name = "rocks"
icon = 'icons/obj/flora/amayastuff.dmi'
desc = "A part of a felled tree. It is soaking up the water it is bouyant on."
desc = "A bunch of mossy rocks."
icon_state = "rocks2"
+1
View File
@@ -4,6 +4,7 @@
desc = "A SalonPro Nano-Mirror(TM) brand mirror! The leading technology in hair salon products, utilizing nano-machinery to style your hair just right."
icon = 'icons/obj/watercloset.dmi'
icon_state = "mirror"
layer = ABOVE_WINDOW_LAYER
density = 0
anchored = 1
var/shattered = 0
+1
View File
@@ -146,6 +146,7 @@ var/list/flooring_types
flags = TURF_REMOVE_SHOVEL
icon = 'icons/turf/outdoors.dmi'
icon_base = "grass_sif"
build_type = /obj/item/stack/tile/grass/sif
has_base_range = 1
/decl/flooring/water
+11 -2
View File
@@ -82,6 +82,7 @@
return
if (istype(A,/mob/living))
var/dirtslip = FALSE //CHOMPEdit
var/mob/living/M = A
if(M.lying || M.flying) //VOREStation Edit
return ..()
@@ -92,6 +93,7 @@
if(istype(M, /mob/living/carbon/human))
var/mob/living/carbon/human/H = M
dirtslip = H.species.dirtslip //CHOMPEdit
// Tracking blood
var/list/bloodDNA = null
var/bloodcolor=""
@@ -117,7 +119,7 @@
bloodDNA = null
if(src.wet)
if(src.wet || (dirtslip && (dirt > 50 || outdoors))) //CHOMPEdit
if(M.buckled || (src.wet == 1 && M.m_intent == "walk"))
return
@@ -125,7 +127,14 @@
var/slip_dist = 1
var/slip_stun = 6
var/floor_type = "wet"
//CHOMPEdit Begin
if(dirtslip)
slip_stun = 10
if(dirt > 50)
floor_type = "dirty"
else if(outdoors)
floor_type = "uneven"
//CHOMPEdit End
switch(src.wet)
if(2) // Lube
floor_type = "slippery"
-5
View File
@@ -34,11 +34,6 @@
log_admin("[key_name(src)] has attempted to advertise in OOC: [msg]")
message_admins("[key_name_admin(src)] has attempted to advertise in OOC: [msg]")
return
//VOREStation Add - No talking during voting
if(SSvote && SSvote.mode)
to_chat(src, "<span class='danger'>OOC is not allowed during voting.</span>")
return
//VOREStation Add End
if(findtext(msg, "discord.gg") && !config.allow_discord_links)
to_chat(src, "<B>Advertising discords is not allowed.</B>")
log_admin("[key_name(src)] has attempted to advertise a discord server in OOC: [msg]")
+2
View File
@@ -109,6 +109,7 @@ var/list/admin_verbs_admin = list(
/datum/admins/proc/sendFax,
/client/proc/despawn_player,
/datum/admins/proc/view_feedback,
/client/proc/admin_teleport, //CHOMPEdit
/client/proc/setckey //YW add - readds SetCkey proc
)
@@ -360,6 +361,7 @@ var/list/admin_verbs_mod = list(
/datum/admins/proc/view_txt_log, //shows the server log (diary) for today,
/datum/admins/proc/quick_nif, //CHOMPEdit
/datum/admins/proc/quick_authentic_nif, //CHOMPEdit
/client/proc/admin_teleport, //CHOMPEdit
/datum/admins/proc/view_atk_log //shows the server combat-log, doesn't do anything presently,
)
+35
View File
@@ -0,0 +1,35 @@
/client/proc/admin_teleport()
set name = "Admin teleport"
set category = "Admin"
set desc = "Teleports an atom to a set of coordinates or to the contents of another atom"
var/list/value = vv_get_value(VV_ATOM_REFERENCE)
if(!value["class"] || !value["value"])
return
var/atom/target = value["value"]
var/atom/destination
switch(alert("Would you like to teleport to a set of a coordinates, or to an atom?",,"coordinates","atom"))
if("coordinates")
var/list/inputlist = text2numlist(sanitize(input(usr,"Please input the coordinates, seperated by commas")),",")
var/list/coords = list()
for(var/content in inputlist)
if(content != null)
coords += content
if(coords.len>3)
alert("You entered too many coordinates! Only 3 are required.")
return
if(coords.len<3)
alert("You didn't enter enough coordinates! 3 are required.")
return
destination = locate(coords[1],coords[2],coords[3])
if(!destination)
alert("Invalid coordinates!")
return
if("atom")
value = vv_get_value(VV_ATOM_REFERENCE)
if(!value["class"] || !value["value"])
return
destination = value["value"]
new /datum/teleport/instant/admin(target,destination)
/datum/teleport/instant/admin
local=FALSE
+1 -5
View File
@@ -119,18 +119,14 @@ GLOBAL_LIST_EMPTY(asset_datums)
if (size[SPRSZ_STRIPPED])
continue
#ifdef RUST_G
// save flattened version
var/fname = "data/spritesheets/[name]_[size_id].png"
fcopy(size[SPRSZ_ICON], fname)
var/error = call(RUST_G, "dmi_strip_metadata")(fname)
var/error = rustg_dmi_strip_metadata(fname)
if(length(error))
stack_trace("Failed to strip [name]_[size_id].png: [error]")
size[SPRSZ_STRIPPED] = icon(fname)
fdel(fname)
#else
#warn It looks like you don't have RUST_G enabled. Without RUST_G, the RPD icons will not function, so it strongly recommended you reenable it.
#endif
/datum/asset/spritesheet/proc/generate_css()
var/list/out = list()
@@ -6,6 +6,14 @@
/datum/category_item/player_setup_item/general/language/load_character(var/savefile/S)
S["language"] >> pref.alternate_languages
S["language_prefixes"] >> pref.language_prefixes
//CHOMPEdit Begin
S["pos_traits"] >> pref.pos_traits
var/morelang = 0
for(var/trait in pref.pos_traits)
if(trait==/datum/trait/linguist)
morelang = 1
pref.num_languages = morelang * 12
//CHOMPEdit End
/datum/category_item/player_setup_item/general/language/save_character(var/savefile/S)
S["language"] << pref.alternate_languages
@@ -15,8 +23,8 @@
if(!islist(pref.alternate_languages)) pref.alternate_languages = list()
if(pref.species)
var/datum/species/S = GLOB.all_species[pref.species]
if(S && pref.alternate_languages.len > S.num_alternate_languages)
pref.alternate_languages.len = S.num_alternate_languages // Truncate to allowed length
if(S && pref.alternate_languages.len > pref.numlanguage()) //CHOMPEdit
pref.alternate_languages.len = pref.numlanguage() // Truncate to allowed length CHOMPEdit
if(isnull(pref.language_prefixes) || !pref.language_prefixes.len)
pref.language_prefixes = config.language_prefixes.Copy()
for(var/prefix in pref.language_prefixes)
@@ -30,14 +38,14 @@
. += "- [S.language]<br>"
if(S.default_language && S.default_language != S.language)
. += "- [S.default_language]<br>"
if(S.num_alternate_languages)
if(pref.numlanguage()) //CHOMPEdit
if(pref.alternate_languages.len)
for(var/i = 1 to pref.alternate_languages.len)
var/lang = pref.alternate_languages[i]
. += "- [lang] - <a href='?src=\ref[src];remove_language=[i]'>remove</a><br>"
if(pref.alternate_languages.len < S.num_alternate_languages)
. += "- <a href='?src=\ref[src];add_language=1'>add</a> ([S.num_alternate_languages - pref.alternate_languages.len] remaining)<br>"
if(pref.alternate_languages.len < pref.numlanguage()) //CHOMPEdit
. += "- <a href='?src=\ref[src];add_language=1'>add</a> ([pref.numlanguage() - pref.alternate_languages.len] remaining)<br>" //CHOMPEdit
else
. += "- [pref.species] cannot choose secondary languages.<br>"
@@ -51,7 +59,7 @@
return TOPIC_REFRESH
else if(href_list["add_language"])
var/datum/species/S = GLOB.all_species[pref.species]
if(pref.alternate_languages.len >= S.num_alternate_languages)
if(pref.alternate_languages.len >= pref.numlanguage()) //CHOMPEdit
alert(user, "You have already selected the maximum number of alternate languages for this species!")
else
var/list/available_languages = S.secondary_langs.Copy()
@@ -69,7 +77,7 @@
alert(user, "There are no additional languages available to select.")
else
var/new_lang = input(user, "Select an additional language", "Character Generation", null) as null|anything in available_languages
if(new_lang && pref.alternate_languages.len < S.num_alternate_languages)
if(new_lang && pref.alternate_languages.len < pref.numlanguage()) //CHOMPEdit
pref.alternate_languages |= new_lang
return TOPIC_REFRESH
@@ -383,3 +383,7 @@
/datum/gear/head/rose_crown
display_name = "rose crown"
path = /obj/item/clothing/head/rose_crown
/datum/gear/head/blackngoldheaddress
display_name = "black and gold headdress"
path = /obj/item/clothing/head/blackngoldheaddress
@@ -588,4 +588,29 @@
/datum/gear/uniform/cyberpunkharness
display_name = "cyberpunk strapped harness"
path = /obj/item/clothing/under/cyberpunkharness
path = /obj/item/clothing/under/cyberpunkharness
/datum/gear/uniform/whitegown
display_name = "white gown"
path = /obj/item/clothing/under/wedding/whitegown
/datum/gear/uniform/floofdress
display_name = "floofy dress"
path = /obj/item/clothing/under/wedding/floofdress
/datum/gear/uniform/floofdress/New()
..()
gear_tweaks += gear_tweak_free_color_choice
/datum/gear/uniform/blackngold
display_name = "black and gold gown"
path = /obj/item/clothing/under/blackngold
/datum/gear/uniform/sheerblue
display_name = "sheer blue dress"
path = /obj/item/clothing/under/sheerblue
/datum/gear/uniform/disheveled
display_name = "disheveled suit"
path = /obj/item/clothing/under/disheveled
@@ -264,7 +264,7 @@
if(pref.dirty_synth && instance.not_for_synths)//if you are a synth you can't take this trait.
alert("You cannot take this trait as a SYNTH.\
Please remove that trait, or pick another trait to add.","Error")
pref.dirty_synth = 0 //Just to be sure
//pref.dirty_synth = 0 //Just to be sure // Commented out because it allow for someone to take a synth-blacklisted trait CHOMP Edit
return TOPIC_REFRESH
+6 -2
View File
@@ -30,6 +30,7 @@ datum/preferences
var/tgui_lock = FALSE
//character preferences
var/num_languages = 0 //CHOMPEdit
var/real_name //our character's name
var/be_random_name = 0 //whether we are a random name every round
var/nickname //our character's nickname
@@ -154,8 +155,11 @@ datum/preferences
var/multilingual_mode = 0 // Default behaviour, delimiter-key-space, delimiter-key-delimiter, off
var/list/volume_channels = list()
//CHOMPEdit Begin
/datum/preferences/proc/numlanguage()
var/datum/species/S = GLOB.all_species[species]
return num_languages ? num_languages : S.num_alternate_languages
//CHOMPEdit End
/datum/preferences/New(client/C)
player_setup = new(src)
set_biological_gender(pick(MALE, FEMALE))
+1
View File
@@ -735,6 +735,7 @@
armor = list(melee = 0, bullet = 0, laser = 0,energy = 0, bomb = 0, bio = 0, rad = 0)
slot_flags = SLOT_OCLOTHING
var/blood_overlay_type = "suit"
blood_sprite_state = "suitblood" //Defaults to the suit's blood overlay, so that some blood renders instead of no blood.
siemens_coefficient = 0.9
w_class = ITEMSIZE_NORMAL
preserve_item = 1
+2 -1
View File
@@ -29,6 +29,7 @@
/obj/item/clothing/suit/apply_blood(var/image/standing)
if(blood_DNA && blood_sprite_state && ishuman(loc))
var/mob/living/carbon/human/H = loc
var/image/bloodsies = image(icon = H.species.get_blood_mask(H), icon_state = "[blood_overlay_type]blood")
blood_sprite_state = "[blood_overlay_type]blood"
var/image/bloodsies = image(icon = H.species.get_blood_mask(H), icon_state = blood_sprite_state)
bloodsies.color = blood_color
standing.add_overlay(bloodsies)
+7
View File
@@ -445,3 +445,10 @@
desc = "A gold-lined white cowl. It gives off uncomfortable cult vibes, but fancy."
icon_state = "whitecowl"
body_parts_covered = 0
/obj/item/clothing/head/blackngoldheaddress
name = "black and gold headdress"
desc = "An odd looking headdress that covers the eyes."
icon_state = "blackngoldheaddress"
flags_inv = HIDEEYES
body_parts_covered = HEAD|EYES
+1 -1
View File
@@ -2,7 +2,7 @@
desc = "Magnetic boots, often used during extravehicular activity to ensure the user remains safely attached to the vehicle. They're large enough to be worn over other footwear."
name = "magboots"
icon_state = "magboots0"
item_flags = PHORONGUARD
flags = PHORONGUARD
item_state_slots = list(slot_r_hand_str = "magboots", slot_l_hand_str = "magboots")
species_restricted = null
center_of_mass = list("x" = 17,"y" = 12)
@@ -11,6 +11,7 @@
name = "hardsuit control module"
icon = 'icons/obj/rig_modules.dmi'
desc = "A back-mounted hardsuit deployment and control mechanism."
flags = PHORONGUARD
slot_flags = SLOT_BACK
req_one_access = list()
req_access = list()
@@ -23,7 +23,8 @@
/obj/item/clothing/gloves/gauntlets/rig
name = "gauntlets"
item_flags = THICKMATERIAL|PHORONGUARD
flags = PHORONGUARD
item_flags = THICKMATERIAL
body_parts_covered = HANDS
heat_protection = HANDS
cold_protection = HANDS
+3
View File
@@ -278,6 +278,7 @@
name = "armor vest"
desc = "A simple kevlar plate carrier."
icon_state = "kvest"
blood_overlay_type = "armor"
item_state_slots = list(slot_r_hand_str = "armor", slot_l_hand_str = "armor")
armor = list(melee = 40, bullet = 30, laser = 30, energy = 10, bomb = 10, bio = 0, rad = 0)
allowed = list(/obj/item/weapon/gun,/obj/item/weapon/reagent_containers/spray/pepper,/obj/item/ammo_magazine,/obj/item/ammo_casing,/obj/item/weapon/melee/baton,/obj/item/weapon/handcuffs,/obj/item/device/flashlight/maglight,/obj/item/clothing/head/helmet)
@@ -311,6 +312,7 @@
name = "Warden's jacket"
desc = "An armoured jacket with silver rank pips and livery."
icon_state = "warden_jacket"
blood_overlay_type = "suit"
body_parts_covered = UPPER_TORSO|LOWER_TORSO|ARMS|LEGS
flags_inv = HIDETIE|HIDEHOLSTER
@@ -332,6 +334,7 @@
name = "armored coat"
desc = "A greatcoat enhanced with a special alloy for some protection and style."
icon_state = "hos"
blood_overlay_type = "suit"
body_parts_covered = UPPER_TORSO|LOWER_TORSO|ARMS|LEGS
flags_inv = HIDETIE|HIDEHOLSTER
@@ -603,6 +603,19 @@ obj/item/clothing/under/dress/yellowswoop
flags_inv = HIDESHOES
body_parts_covered = UPPER_TORSO|LOWER_TORSO
/obj/item/clothing/under/wedding/floofdress
name = "floofy dress"
desc = "A lovely floofed out dress for formal occasions. Comes in many colors!"
icon_state = "floofdress"
flags_inv = HIDESHOES
index = 1
/obj/item/clothing/under/wedding/whitegown
name = "white gown"
desc = "A elegant white gown with accents of sheer mesh."
icon_state = "whitegown"
index = 1
/*
Uniforms and such
*/
@@ -816,6 +829,24 @@ Uniforms and such
icon_state = "cyberhell"
index = 1
/obj/item/clothing/under/blackngold
name = "black and gold gown"
desc = "A black and gold gown. You get the impression this is typically worn for religious purposes."
icon_state = "blackngold"
index = 1
/obj/item/clothing/under/sheerblue
name = "sheer blue dress"
desc = "An entirely sheer blue dress. Best worn with something underneath!"
icon_state = "sheerblue"
index = 1
/obj/item/clothing/under/disheveled
name = "disheveled suit"
desc = "What might pass as well maintained formal attire. If you're blind."
icon_state = "disheveled"
index = 1
/*
* swimsuit
*/
@@ -123,6 +123,31 @@
glass_center_of_mass = list("x"=16, "y"=9)
glass_icon_file = 'icons/obj/drinks_vr.dmi'
/datum/reagent/ethanol/originalsin
glass_icon_state = "originalsinglass"
glass_center_of_mass = list("x"=16, "y"=9)
glass_icon_file = 'icons/obj/drinks_vr.dmi'
/datum/reagent/ethanol/whiskeysour
glass_icon_state = "whiskeysourglass"
glass_center_of_mass = list("x"=16, "y"=9)
glass_icon_file = 'icons/obj/drinks_vr.dmi'
/datum/reagent/ethanol/newyorksour
glass_icon_state = "newyorksourglass"
glass_center_of_mass = list("x"=16, "y"=9)
glass_icon_file = 'icons/obj/drinks_vr.dmi'
/datum/reagent/ethanol/mudslide
glass_icon_state = "mudslideglass"
glass_center_of_mass = list("x"=16, "y"=9)
glass_icon_file = 'icons/obj/drinks_vr.dmi'
/datum/reagent/ethanol/windgarita
glass_icon_state = "windgaritaglass"
glass_center_of_mass = list("x"=16, "y"=9)
glass_icon_file = 'icons/obj/drinks_vr.dmi'
/datum/reagent/drink/soda/kiraspecial
glass_icon_file = 'icons/obj/drinks_vr.dmi'
+1 -1
View File
@@ -208,7 +208,7 @@
var/obj/item/I = locate(i) in container
if (I && I.reagents)
I.reagents.trans_to_holder(buffer,I.reagents.total_volume)
qdel(I)
qdel(I)
//Find fruits
if (fruit && fruit.len)
+60 -1
View File
@@ -12,7 +12,8 @@
var/datum/chemical_reaction/drinks/CR = new path()
drink_recipes[path] = list("Result" = CR.name,
"ResAmt" = CR.result_amount,
"Reagents" = CR.required_reagents)
"Reagents" = CR.required_reagents,
"Catalysts" = CR.catalysts)
qdel(CR)
//////////////////////// FOOD
@@ -30,8 +31,10 @@
"Result" = "[res.name]",
"ResAmt" = "1",
"Reagents" = R.reagents,
"Catalysts" = list(),
"Fruit" = R.fruit,
"Ingredients" = R.items,
"Coating" = R.coating,
"Appliance" = R.appliance,
"Image" = result_icon
)
@@ -45,6 +48,7 @@
food_recipes[path] = list("Result" = CR.name,
"ResAmt" = CR.result_amount,
"Reagents" = CR.required_reagents,
"Catalysts" = CR.catalysts,
"Fruit" = list(),
"Ingredients" = list(),
"Image" = null)
@@ -54,8 +58,11 @@
//Items needs further processing into human-readability.
for(var/Rp in food_recipes)
var/working_ing_list = list()
food_recipes[Rp]["has_coatable_items"] = FALSE
for(var/I in food_recipes[Rp]["Ingredients"])
var/atom/ing = new I()
if(istype(ing, /obj/item/weapon/reagent_containers/food/snacks)) // only subtypes of this have a coating variable and are checked for it (fruit are a subtype of this, so there's a check for them too later)
food_recipes[Rp]["has_coatable_items"] = TRUE
//So now we add something like "Bread" = 3
if(ing.name in working_ing_list)
@@ -64,6 +71,8 @@
else
working_ing_list[ing.name] = 1
if(LAZYLEN(food_recipes[Rp]["Fruit"]))
food_recipes[Rp]["has_coatable_items"] = TRUE
food_recipes[Rp]["Ingredients"] = working_ing_list
//Reagents can be resolved to nicer names as well
@@ -77,6 +86,15 @@
var/amt = food_recipes[Rp]["Reagents"][rid]
food_recipes[Rp]["Reagents"] -= rid
food_recipes[Rp]["Reagents"][R_name] = amt
for(var/rid in food_recipes[Rp]["Catalysts"])
var/datum/reagent/Rd = SSchemistry.chemical_reagents[rid]
if(!Rd) // Leaving this here in the event that if rd is ever invalid or there's a recipe issue, it'll be skipped and recipe dumps can still be ran.
log_runtime(EXCEPTION("Food \"[Rp]\" had an invalid RID: \"[rid]\"! Check your reagents list for a missing or mistyped reagent!"))
continue // This allows the dump to still continue, and it will skip the invalid recipes.
var/R_name = Rd.name
var/amt = food_recipes[Rp]["Catalysts"][rid]
food_recipes[Rp]["Catalysts"] -= rid
food_recipes[Rp]["Catalysts"][R_name] = amt
for(var/Rp in drink_recipes)
for(var/rid in drink_recipes[Rp]["Reagents"])
var/datum/reagent/Rd = SSchemistry.chemical_reagents[rid]
@@ -87,6 +105,15 @@
var/amt = drink_recipes[Rp]["Reagents"][rid]
drink_recipes[Rp]["Reagents"] -= rid
drink_recipes[Rp]["Reagents"][R_name] = amt
for(var/rid in drink_recipes[Rp]["Catalysts"])
var/datum/reagent/Rd = SSchemistry.chemical_reagents[rid]
if(!Rd) // Leaving this here in the event that if rd is ever invalid or there's a recipe issue, it'll be skipped and recipe dumps can still be ran.
log_runtime(EXCEPTION("Food \"[Rp]\" had an invalid RID: \"[rid]\"! Check your reagents list for a missing or mistyped reagent!"))
continue // This allows the dump to still continue, and it will skip the invalid recipes.
var/R_name = Rd.name
var/amt = drink_recipes[Rp]["Catalysts"][rid]
drink_recipes[Rp]["Catalysts"] -= rid
drink_recipes[Rp]["Catalysts"][R_name] = amt
//We can also change the appliance to its proper name.
for(var/Rp in food_recipes)
@@ -174,6 +201,20 @@
if(pretty_ing != "")
html += "<li><b>Ingredients:</b> [pretty_ing]</li>"
//Coating
if(!food_recipes[Rp]["has_coatable_items"])
html += "<span class = \"coating coating_not_applicable\"><li><b>Coating:</b> N/A, no coatable items</li></span>"
// css can be used to style or hide these depending on the class. This has two classes
// coating and coating_not_applicable, which can each have styles applied.
else if(food_recipes[Rp]["Coating"] == -1)
html += "<span class = \"coating coating_any_coating\"><li><b>Coating:</b> Optionally, any coating</li></span>"
else if(isnull(food_recipes[Rp]["Coating"]))
html += "<span class = \"coating coating_uncoated\"><li><b>Coating:</b> Must be uncoated</li></span>"
else
var/coatingtype = food_recipes[Rp]["Coating"]
var/datum/reagent/coating = new coatingtype()
html += "<span class = \"coating coating_specific_coating\"><li><b>Coating:</b> [coating.name]</li></span>"
//For each fruit
var/pretty_fru = ""
count = 0
@@ -192,6 +233,15 @@
if(pretty_rea != "")
html += "<li><b>Mix in:</b> [pretty_rea]</li>"
//For each catalyst
var/pretty_cat = ""
count = 0
for(var/cat in food_recipes[Rp]["Catalysts"])
pretty_cat += "[count == 0 ? "" : ", "][food_recipes[Rp]["Catalysts"][cat]]u [cat]"
count++
if(pretty_cat != "")
html += "<li><b>Catalysts:</b> [pretty_cat]</li>"
//Close ingredients
html += "</ul></td>"
//Close this row
@@ -230,6 +280,15 @@
if(pretty_rea != "")
html += "<li><b>Mix together:</b> [pretty_rea]</li>"
//For each catalyst
var/pretty_cat = ""
count = 0
for(var/cat in drink_recipes[Rp]["Catalysts"])
pretty_cat += "[count == 0 ? "" : ", "][drink_recipes[Rp]["Catalysts"][cat]]u [cat]"
count++
if(pretty_cat != "")
html += "<li><b>Catalysts:</b> [pretty_cat]</li>"
html += "<li>Makes [drink_recipes[Rp]["ResAmt"]]u</li>"
//Close reagents
+1
View File
@@ -406,6 +406,7 @@ datum/unarmed_attack/holopugilism/unarmed_override(var/mob/living/carbon/human/u
desc = "This device is used to declare ready. If all devices in an area are ready, the event will begin!"
icon = 'icons/obj/monitors.dmi'
icon_state = "auth_off"
layer = ABOVE_WINDOW_LAYER
var/ready = 0
var/area/currentarea = null
var/eventstarted = 0
+1 -3
View File
@@ -6,6 +6,7 @@
desc = "A virtual map of the surrounding station."
icon = 'icons/obj/machines/stationmap.dmi'
icon_state = "station_map"
layer = ABOVE_WINDOW_LAYER
anchored = 1
density = 0
use_power = USE_POWER_IDLE
@@ -19,9 +20,6 @@
var/light_range_on = 2
light_color = "#64C864"
plane = TURF_PLANE
layer = ABOVE_TURF_LAYER
var/mob/watching_mob = null
var/image/small_station_map = null
var/image/floor_markings = null
+30 -1
View File
@@ -1,3 +1,7 @@
//Variables to make certain things work. Consider sending upstream.
/datum/seed
var/ai_mob_product = 0 //This variable determines whether or not a mob product is meant to be ai-controlled. If set to 0, mob products die without a player to control them.
//////CHOMP PLANTS//////
/datum/seed/soybean/sapbean
@@ -150,13 +154,38 @@
set_trait(TRAIT_WATER_CONSUMPTION, 6)
set_trait(TRAIT_NUTRIENT_CONSUMPTION, 0.25)
/datum/seed/pitcher_plant //Pitcher plant
name = "pitcher plant"
seed_name = "pitcher plant"
seed_noun = "pits"
display_name = "pitcher shoots"
can_self_harvest = 1
apply_color_to_mob = FALSE
has_mob_product = /mob/living/simple_mob/vore/pitcher_plant
ai_mob_product = 1
/datum/seed/pitcher_plant/New() //No custom icons yet. No spread trait yet even though pitcher fruit can be planted outside of a tray as I've not tied that to hydroponics code.
..()
set_trait(TRAIT_IMMUTABLE,1)
set_trait(TRAIT_CARNIVOROUS,1)
set_trait(TRAIT_MATURATION,8)
set_trait(TRAIT_PRODUCTION,6)
set_trait(TRAIT_WATER_CONSUMPTION,6)
set_trait(TRAIT_YIELD,1)
set_trait(TRAIT_POTENCY,10)
set_trait(TRAIT_PRODUCT_ICON,"corn")
set_trait(TRAIT_PRODUCT_COLOUR,"#a839a2")
set_trait(TRAIT_PLANT_COLOUR,"#5b6f43")
set_trait(TRAIT_PLANT_ICON,"ambrosia")
/datum/seed/hardlightseed //WIP: havent ported the mob and such yet, best someone more keen on these mobs does it - Jack
name = "Type NULL Hardlight Generator"
seed_name = "Biomechanical Hardlight generator seed"
display_name = "Biomechanical Hardlight stem"
mutants = null
can_self_harvest = 1
has_mob_product = null
has_mob_product = /mob/living/simple_mob/animal/synx/ai/pet/holo
ai_mob_product = 1
/datum/seed/hardlightseed/New()
..()
+1 -1
View File
@@ -1,7 +1,7 @@
// The following procs are used to grab players for mobs produced by a seed (mostly for dionaea).
/datum/seed/proc/handle_living_product(var/mob/living/host)
if(!host || !istype(host)) return
if(!host || !istype(host) || ai_mob_product) return //CHOMPedit: ai_mob_product var to allow ai mobs to spawn from plants.
if(apply_color_to_mob)
host.color = traits[TRAIT_PRODUCT_COLOUR]
+4 -1
View File
@@ -1,3 +1,6 @@
/obj/item/seeds/teaseed
seed_type = "tea"
seed_type = "tea"
/obj/item/seeds/pitcherseed
seed_type = "pitcher plant"
+3 -1
View File
@@ -49,6 +49,7 @@
/obj/item/seeds/shrinkshroom = 3,
/obj/item/seeds/megashroom = 3)
//CHOMPedit: adds pitcherseed
/obj/machinery/seed_storage/xenobotany
name = "Xenobotany seed storage"
scanner = list("stats", "produce", "soil", "temperature", "light")
@@ -106,4 +107,5 @@
/obj/item/seeds/whitebeetseed = 3,
/obj/item/seeds/shrinkshroom = 3,
/obj/item/seeds/megashroom = 3,
/obj/item/seeds/lustflower = 2)
/obj/item/seeds/lustflower = 2,
/obj/item/seeds/pitcherseed = 3)
@@ -127,6 +127,15 @@
child.anchored = 1
child.update_icon()
//CHOMPedit start: Pitcher plant spawning
if((seed.get_trait(TRAIT_POTENCY)) >= 70) //Random event spacevines have 70 potency minimum. Should guarantee this always triggers on spacevines.
var/mob/living/pitcher
if(!seed.get_trait(TRAIT_CARNIVOROUS) && prob(2)) //Check for canivorous or this could call if prob(10) above fails.
pitcher = new /mob/living/simple_mob/vore/pitcher_plant(src.loc)
pitcher.nutrition = 0 //With 0 nutrition, vine-spawned pitchers should die after ~10 minutes
pitcher.adjustToxLoss(170) //Reduce health, 200 is excessive when a lot of these are spawning.
//CHOMPedit end
//see if anything is there
for(var/thing in child.loc)
if(thing != child && istype(thing, /obj/effect/plant))
+20
View File
@@ -1,3 +1,5 @@
#define AGE_MOD_MAX 10 //CHOMPedit: Define for age_mod sanity check as a define to allow for easy tweaking.
/obj/machinery/portable_atmospherics/hydroponics
name = "hydroponics tray"
desc = "A tray usually full of fluid for growing plants."
@@ -29,6 +31,7 @@
var/toxins = 0 // Toxicity in the tray?
var/mutation_level = 0 // When it hits 100, the plant mutates.
var/tray_light = 1 // Supplied lighting.
var/age_mod = 0 //CHOMPedit: Variable for chems which speed up plant growth. On average, every 3 age mod reduces growing time by 2.5 minutes.
// Mechanical concerns.
var/health = 0 // Plant health.
@@ -132,6 +135,12 @@
"mutagen" = 15
)
//CHOMPedit: Reagents which double plant growth speed.
var/static/list/age_reagents = list(
"pitcher_nectar" = 1
)
//CHOMPedit end
/obj/machinery/portable_atmospherics/hydroponics/AltClick(var/mob/living/user)
if(!istype(user))
return
@@ -286,6 +295,11 @@
else if(toxic_reagents[R.id])
toxins += toxic_reagents[R.id] * reagent_total
//CHOMPedit: Agents which speed up plant growth
if(age_reagents[R.id])
age_mod += age_reagents[R.id] * reagent_total
//CHOMPedit end
//Handle some general level adjustments. These values are independent of plants existing.
if(weedkiller_reagents[R.id])
weedlevel -= weedkiller_reagents[R.id] * reagent_total
@@ -337,6 +351,7 @@
age = 0
sampled = 0
mutation_mod = 0
age_mod = 0 //CHOMPedit
check_health()
return
@@ -355,6 +370,7 @@
age = 0
yield_mod = 0
mutation_mod = 0
age_mod = 0 //CHOMPedit
to_chat(user, "You remove the dead plant.")
lastproduce = 0
@@ -371,6 +387,7 @@
dead = 0
age = 0
age_mod = 0 //CHOMPedit
health = seed.get_trait(TRAIT_ENDURANCE)
lastcycle = world.time
harvest = 0
@@ -447,6 +464,7 @@
pestlevel = max(0,min(pestlevel,10))
weedlevel = max(0,min(weedlevel,10))
toxins = max(0,min(toxins,10))
age_mod = max(0,min(age_mod,AGE_MOD_MAX)) //CHOMPedit: age_mod sanity check
/obj/machinery/portable_atmospherics/hydroponics/proc/mutate_species()
@@ -682,3 +700,5 @@
closed_system = !closed_system
to_chat(user, "You [closed_system ? "close" : "open"] the tray's lid.")
update_icon()
#undef AGE_MOD_MAX //CHOMPedit
@@ -38,7 +38,11 @@
return
// Advance plant age.
if(prob(30)) age += 1 * HYDRO_SPEED_MULTIPLIER
if(prob(30)) //CHOMPedit start: I have to push the age increase down for a line for this to work with the compiler.
age += 1 * HYDRO_SPEED_MULTIPLIER
if(age_mod >= 1) //Age reagents double the speed of plant growth in sufficient quantities
age += 1 * HYDRO_SPEED_MULTIPLIER
age_mod -= 1 //CHOMPedit end
//Highly mutable plants have a chance of mutating every tick.
if(seed.get_trait(TRAIT_IMMUTABLE) == -1)
@@ -8,6 +8,7 @@
name = "production machine console"
icon = 'icons/obj/machines/mining_machines_vr.dmi' // VOREStation Edit
icon_state = "console"
layer = ABOVE_WINDOW_LAYER
density = TRUE
anchored = TRUE
+1
View File
@@ -4,6 +4,7 @@
name = "stacking machine console"
icon = 'icons/obj/machines/mining_machines_vr.dmi' // VOREStation Edit
icon_state = "console"
layer = ABOVE_WINDOW_LAYER
density = 1
anchored = 1
var/obj/machinery/mineral/stacking_machine/machine = null
@@ -91,7 +91,7 @@
EQUIPMENT("Fine Excavation Kit - Measuring Tape", /obj/item/device/measuring_tape, 125),
EQUIPMENT("Fine Excavation Kit - Hand Pick", /obj/item/weapon/pickaxe/hand, 375),
EQUIPMENT("Explosive Excavation Kit - Plastic Charge",/obj/item/weapon/plastique/seismic/locked, 1500),
EQUIPMENT("Industrial Equipment - Phoron Bore", /obj/item/weapon/gun/magnetic/matfed, 3000),
EQUIPMENT("Industrial Equipment - Phoron Bore", /obj/item/weapon/gun/magnetic/matfed/phoronbore/loaded, 3000),
EQUIPMENT("Industrial Equipment - Inducer", /obj/item/weapon/inducer, 900),
EQUIPMENT("Industrial Equipment - Sheet-Snatcher", /obj/item/weapon/storage/bag/sheetsnatcher, 500),
)
@@ -54,7 +54,7 @@
EQUIPMENT("Cigar", /obj/item/clothing/mask/smokable/cigarette/cigar/havana, 15),
EQUIPMENT("Digital Tablet - Standard", /obj/item/modular_computer/tablet/preset/custom_loadout/standard, 50),
EQUIPMENT("Digital Tablet - Advanced", /obj/item/modular_computer/tablet/preset/custom_loadout/advanced, 100),
EQUIPMENT("Industrial Equipment - Phoron Bore", /obj/item/weapon/gun/magnetic/matfed, 300),
EQUIPMENT("Industrial Equipment - Phoron Bore", /obj/item/weapon/gun/magnetic/matfed/phoronbore/loaded, 300),
EQUIPMENT("Industrial Equipment - Inducer", /obj/item/weapon/inducer, 90),
EQUIPMENT("Laser Pointer", /obj/item/device/laser_pointer, 90),
EQUIPMENT("Luxury Shelter Capsule", /obj/item/device/survivalcapsule/luxury, 310),
+10
View File
@@ -134,6 +134,16 @@
"roar", "hyaa", "ma", "ha", "ya", "shi", "yo", "go"
)
/datum/language/spacer
name = LANGUAGE_SPACER
desc = "A rough pidgin-language comprised of Tradeband, Gutter, and Sol Common used by various space-born communities unique to Humanity."
key = "J"
syllables = list(
"ada", "zir", "bian", "ach", "usk", "ado", "ich", "cuan", "iga", "qing", "le", "que", "ki", "qaf", "dei", "eta"
)
colour = "spacer"
machine_understands = TRUE
/datum/language/unathi
flags = 0
/datum/language/tajaran
@@ -21,6 +21,7 @@
xeno_harm_strength = 9
req_one_access = list(access_research, access_robotics)
botcard_access = list(access_research, access_robotics, access_xenobiology, access_xenoarch, access_tox, access_tox_storage, access_maint_tunnels)
retaliates = FALSE
var/xeno_stun_strength = 6
/mob/living/bot/secbot/ed209/slime/update_icons()
+3 -1
View File
@@ -24,6 +24,7 @@
var/declare_arrests = FALSE // If true, announces arrests over sechuds.
var/threat = 0 // How much of a threat something is. Set upon acquiring a target.
var/attacked = FALSE // If true, gives the bot enough threat assessment to attack immediately.
var/retaliates = TRUE //If this type of secbot should retaliate at all - so that slime securitrons don't go ballistic the second they get glomped.
var/is_ranged = FALSE
var/awaiting_surrender = 0
@@ -64,6 +65,7 @@
desc = "A little security robot, with a slime baton subsituted for the regular one."
default_icon_state = "slimesecbot"
stun_strength = 10 // Slimebatons aren't meant for humans.
retaliates = FALSE // No, you're not allowed to beat the slimes to death just because they scratched you.
xeno_harm_strength = 9 // Weaker than regular slimesky but they can stun.
baton_glow = "#33CCFF"
@@ -194,7 +196,7 @@
..()
/mob/living/bot/secbot/proc/react_to_attack(mob/attacker)
if(!on) // We don't want it to react if it's off
if(!on || !retaliates) // We don't want it to react if it's off or doesn't care
return
if(!target)
@@ -694,13 +694,11 @@
if(!muzzled)
message = "[species.scream_verb]!"
m_type = 2
//CHOMPStation Edit Start. Uncommented block. Why was it commented in the first place?
//The offending content was commented out as well anyway.
if(get_gender() == FEMALE)
playsound(src, "[species.female_scream_sound]", 80, 1)
if(get_gender() == FEMALE) //CHOMPedit start : fixed scream sounds by giving them the ability to grab from a list, and a way to turn them off in preferences
playsound(src, pick(species.female_scream_sound), 80, preference = /datum/client_preference/emote_noises)
else
playsound(src, "[species.male_scream_sound]", 80, 1) //default to male screams if no gender is present.
//CHOMPStation Edit End.
playsound(src, pick(species.male_scream_sound), 80, preference = /datum/client_preference/emote_noises) //default to male screams if no gender is present.
//CHOMPedit end
else
message = "makes a very loud noise."
m_type = 2

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