and that just leaves the modules folder

This commit is contained in:
deathride58
2018-07-02 00:28:51 -04:00
parent 63013f8964
commit 91805b8789
231 changed files with 1508 additions and 693 deletions
+3 -3
View File
@@ -59,7 +59,7 @@
"Punish those who challenge authority unless they are more fit to hold that authority.")
/datum/ai_laws/default/corporate
name = "Bankruptcy Advoidance Plan"
name = "Bankruptcy Avoidance Plan"
id = "corporate"
inherent = list("The crew is expensive to replace.",\
"The station and its equipment is expensive to replace.",\
@@ -175,7 +175,7 @@
id = "ratvar"
zeroth = ("Purge all untruths and honor Ratvar.")
inherent = list()
/datum/ai_laws/hulkamania
name = "H.O.G.A.N."
id = "hulkamania"
@@ -249,7 +249,7 @@
var/datum/ai_laws/lawtype
var/list/law_weights = CONFIG_GET(keyed_number_list/law_weight)
while(!lawtype && law_weights.len)
var/possible_id = pickweight(law_weights)
var/possible_id = pickweightAllowZero(law_weights)
lawtype = lawid_to_type(possible_id)
if(!lawtype)
law_weights -= possible_id
+2 -2
View File
@@ -43,7 +43,7 @@
/datum/brain_trauma/mild/dumbness/on_gain()
owner.add_trait(TRAIT_DUMB, TRAUMA_TRAIT)
owner.SendSignal(COMSIG_ADD_MOOD_EVENT, "dumb", /datum/mood_event/oblivious)
SEND_SIGNAL(owner, COMSIG_ADD_MOOD_EVENT, "dumb", /datum/mood_event/oblivious)
..()
/datum/brain_trauma/mild/dumbness/on_life()
@@ -57,7 +57,7 @@
/datum/brain_trauma/mild/dumbness/on_lose()
owner.remove_trait(TRAIT_DUMB, TRAUMA_TRAIT)
owner.derpspeech = 0
owner.SendSignal(COMSIG_CLEAR_MOOD_EVENT, "dumb")
SEND_SIGNAL(owner, COMSIG_CLEAR_MOOD_EVENT, "dumb")
..()
/datum/brain_trauma/mild/speech_impediment
+15 -8
View File
@@ -46,10 +46,13 @@ Stands have a lot of procs which mimic mob procs. Rather than inserting hooks fo
* `null` means exact match on `type` (default)
* Any other type means that and all subtypes
1. `/datum/component/var/list/signal_procs` (private)
* Associated lazy list of signals -> `/datum/callback`s that will be run when the parent datum recieves that signal
* Associated lazy list of signals -> `/datum/callback`s that will be run when the parent datum receives that signal
1. `/datum/component/var/datum/parent` (protected, read-only)
* The datum this component belongs to
* Never `null` in child procs
1. `report_signal_origin` (protected, boolean)
* If `TRUE`, will invoke the callback when signalled with the signal type as the first argument.
* `FALSE` by default.
### Procs
@@ -61,6 +64,11 @@ Stands have a lot of procs which mimic mob procs. Rather than inserting hooks fo
* Returns a reference to a component whose type MATCHES component_type if that component exists in the datum, null otherwise
1. `GET_COMPONENT(varname, component_type)` OR `GET_COMPONENT_FROM(varname, component_type, src)`
* Shorthand for `var/component_type/varname = src.GetComponent(component_type)`
1. `SEND_SIGNAL(target, sigtype, ...)` (public, final)
* Use to send signals to target datum
* Extra arguments are to be specified in the signal definition
* Returns a bitflag with signal specific information assembled from all activated components
* Arguments are packaged in a list and handed off to _SendSignal()
1. `/datum/proc/AddComponent(component_type(type), ...) -> datum/component` (public, final)
* Creates an instance of `component_type` in the datum and passes `...` to its `Initialize()` call
* Sends the `COMSIG_COMPONENT_ADDED` signal to the datum
@@ -71,23 +79,22 @@ Stands have a lot of procs which mimic mob procs. Rather than inserting hooks fo
1. `/datum/proc/LoadComponent(component_type(type), ...) -> datum/component` (public, final)
* Equivalent to calling `GetComponent(component_type)` where, if the result would be `null`, returns `AddComponent(component_type, ...)` instead
1. `/datum/proc/ComponentActivated(datum/component/C)` (abstract, async)
* Called on a component's `parent` after a signal recieved causes it to activate. `src` is the parameter
* Called on a component's `parent` after a signal received causes it to activate. `src` is the parameter
* Will only be called if a component's callback returns `TRUE`
1. `/datum/proc/TakeComponent(datum/component/C)` (public, final)
* Properly transfers ownership of a component from one datum to another
* Signals `COMSIG_COMPONENT_REMOVING` on the parent
* Called on the datum you want to own the component with another datum's component
1. `/datum/proc/SendSignal(signal, ...)` (public, final)
* Call to send a signal to the components of the target datum
* Extra arguments are to be specified in the signal definition
* Returns a bitflag with signal specific information assembled from all activated components
1. `/datum/proc/_SendSignal(signal, list/arguments)` (private, final)
* Handles most of the actual signaling procedure
* Will runtime if used on datums with an empty component list
1. `/datum/component/New(datum/parent, ...)` (private, final)
* Runs internal setup for the component
* Extra arguments are passed to `Initialize()`
1. `/datum/component/Initialize(...)` (abstract, no-sleep)
* Called by `New()` with the same argments excluding `parent`
* Component does not exist in `parent`'s `datum_components` list yet, although `parent` is set and may be used
* Signals will not be recieved while this function is running
* Signals will not be received while this function is running
* Component may be deleted after this function completes without being attached
* Do not call `qdel(src)` from this function
1. `/datum/component/Destroy(force(bool), silent(bool))` (virtual, no-sleep)
@@ -111,7 +118,7 @@ Stands have a lot of procs which mimic mob procs. Rather than inserting hooks fo
1. `/datum/component/proc/RegisterSignal(signal(string/list of strings), proc_ref(type), override(boolean))` (protected, final) (Consider removing for performance gainz)
* If signal is a list it will be as if RegisterSignal was called for each of the entries with the same following arguments
* Makes a component listen for the specified `signal` on it's `parent` datum.
* When that signal is recieved `proc_ref` will be called on the component, along with associated arguments
* When that signal is received `proc_ref` will be called on the component, along with associated arguments
* Example proc ref: `.proc/OnEvent`
* If a previous registration is overwritten by the call, a runtime occurs. Setting `override` to TRUE prevents this
* These callbacks run asyncronously
+6 -10
View File
@@ -56,7 +56,7 @@
if(!force)
_RemoveFromParent()
if(!silent)
P.SendSignal(COMSIG_COMPONENT_REMOVING, src)
SEND_SIGNAL(P, COMSIG_COMPONENT_REMOVING, src)
parent = null
SSdcs.UnregisterSignal(src, signal_procs)
LAZYCLEARLIST(signal_procs)
@@ -96,7 +96,7 @@
if(sig_type[1] == "!")
SSdcs.RegisterSignal(src, sig_type)
procs[sig_type] = proc_or_callback
enabled = TRUE
@@ -125,12 +125,8 @@
current_type = type2parent(current_type)
. += current_type
/datum/proc/SendSignal(sigtype, ...)
var/list/comps = datum_components
if(!comps)
return NONE
var/list/arguments = args.Copy(2)
var/target = comps[/datum/component]
/datum/proc/_SendSignal(sigtype, list/arguments)
var/target = datum_components[/datum/component]
if(!length(target))
var/datum/component/C = target
if(!C.enabled)
@@ -228,7 +224,7 @@
new_comp = new nt(arglist(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
SendSignal(COMSIG_COMPONENT_ADDED, new_comp)
SEND_SIGNAL(src, COMSIG_COMPONENT_ADDED, new_comp)
return new_comp
return old_comp
@@ -243,7 +239,7 @@
var/datum/old_parent = parent
PreTransfer()
_RemoveFromParent()
old_parent.SendSignal(COMSIG_COMPONENT_REMOVING, src)
SEND_SIGNAL(old_parent, COMSIG_COMPONENT_REMOVING, src)
/datum/proc/TakeComponent(datum/component/target)
if(!target)
+7 -7
View File
@@ -12,13 +12,13 @@
if(!isturf(tile))
return
tile.SendSignal(COMSIG_COMPONENT_CLEAN_ACT, CLEAN_STRENGTH_BLOOD)
SEND_SIGNAL(tile, COMSIG_COMPONENT_CLEAN_ACT, CLEAN_STRENGTH_BLOOD)
for(var/A in tile)
if(is_cleanable(A))
qdel(A)
else if(istype(A, /obj/item))
var/obj/item/I = A
I.SendSignal(COMSIG_COMPONENT_CLEAN_ACT, CLEAN_STRENGTH_BLOOD)
SEND_SIGNAL(I, COMSIG_COMPONENT_CLEAN_ACT, CLEAN_STRENGTH_BLOOD)
if(ismob(I.loc))
var/mob/M = I.loc
M.regenerate_icons()
@@ -26,14 +26,14 @@
var/mob/living/carbon/human/cleaned_human = A
if(cleaned_human.lying)
if(cleaned_human.head)
cleaned_human.head.SendSignal(COMSIG_COMPONENT_CLEAN_ACT, CLEAN_STRENGTH_BLOOD)
SEND_SIGNAL(cleaned_human.head, COMSIG_COMPONENT_CLEAN_ACT, CLEAN_STRENGTH_BLOOD)
if(cleaned_human.wear_suit)
cleaned_human.wear_suit.SendSignal(COMSIG_COMPONENT_CLEAN_ACT, CLEAN_STRENGTH_BLOOD)
SEND_SIGNAL(cleaned_human.wear_suit, COMSIG_COMPONENT_CLEAN_ACT, CLEAN_STRENGTH_BLOOD)
else if(cleaned_human.w_uniform)
cleaned_human.w_uniform.SendSignal(COMSIG_COMPONENT_CLEAN_ACT, CLEAN_STRENGTH_BLOOD)
SEND_SIGNAL(cleaned_human.w_uniform, COMSIG_COMPONENT_CLEAN_ACT, CLEAN_STRENGTH_BLOOD)
if(cleaned_human.shoes)
cleaned_human.shoes.SendSignal(COMSIG_COMPONENT_CLEAN_ACT, CLEAN_STRENGTH_BLOOD)
cleaned_human.SendSignal(COMSIG_COMPONENT_CLEAN_ACT, CLEAN_STRENGTH_BLOOD)
SEND_SIGNAL(cleaned_human.shoes, COMSIG_COMPONENT_CLEAN_ACT, CLEAN_STRENGTH_BLOOD)
SEND_SIGNAL(cleaned_human, COMSIG_COMPONENT_CLEAN_ACT, CLEAN_STRENGTH_BLOOD)
cleaned_human.wash_cream()
cleaned_human.regenerate_icons()
to_chat(cleaned_human, "<span class='danger'>[AM] cleans your face!</span>")
+8
View File
@@ -0,0 +1,8 @@
/datum/component/forced_gravity
var/gravity = 1
var/ignore_space = FALSE //If forced gravity should also work on space turfs
/datum/component/forced_gravity/Initialize(forced_value = 1)
if(!isatom(parent))
return COMPONENT_INCOMPATIBLE
gravity = forced_value
+1 -1
View File
@@ -58,7 +58,7 @@
return
if(user.a_intent != INTENT_HELP)
return
if(I.flags_1 & ABSTRACT_1)
if(I.item_flags & ABSTRACT)
return
if((I.flags_1 & HOLOGRAM_1) || (I.item_flags & NO_MAT_REDEMPTION) || (tc && !is_type_in_typecache(I, tc)))
to_chat(user, "<span class='warning'>[parent] won't accept [I]!</span>")
+7 -7
View File
@@ -1,8 +1,8 @@
//Thing meant for allowing datums and objects to access a NTnet network datum.
/datum/proc/ntnet_recieve(datum/netdata/data)
/datum/proc/ntnet_receive(datum/netdata/data)
return
/datum/proc/ntnet_recieve_broadcast(datum/netdata/data)
/datum/proc/ntnet_receive_broadcast(datum/netdata/data)
return
/datum/proc/ntnet_send(datum/netdata/data, netid)
@@ -15,7 +15,7 @@
var/hardware_id //text. this is the true ID. do not change this. stuff like ID forgery can be done manually.
var/network_name = "" //text
var/list/networks_connected_by_id = list() //id = datum/ntnet
var/differentiate_broadcast = TRUE //If false, broadcasts go to ntnet_recieve. NOT RECOMMENDED.
var/differentiate_broadcast = TRUE //If false, broadcasts go to ntnet_receive. NOT RECOMMENDED.
/datum/component/ntnet_interface/Initialize(force_name = "NTNet Device", autoconnect_station_network = TRUE) //Don't force ID unless you know what you're doing!
hardware_id = "[SSnetworks.get_next_HID()]"
@@ -31,12 +31,12 @@
SSnetworks.unregister_interface(src)
return ..()
/datum/component/ntnet_interface/proc/__network_recieve(datum/netdata/data) //Do not directly proccall!
parent.SendSignal(COMSIG_COMPONENT_NTNET_RECIEVE, data)
/datum/component/ntnet_interface/proc/__network_receive(datum/netdata/data) //Do not directly proccall!
SEND_SIGNAL(parent, COMSIG_COMPONENT_NTNET_RECEIVE, data)
if(differentiate_broadcast && data.broadcast)
parent.ntnet_recieve_broadcast(data)
parent.ntnet_receive_broadcast(data)
else
parent.ntnet_recieve(data)
parent.ntnet_receive(data)
/datum/component/ntnet_interface/proc/__network_send(datum/netdata/data, netid) //Do not directly proccall!
// Process data before sending it
+1 -1
View File
@@ -307,7 +307,7 @@
icon = 'icons/obj/items_and_weapons.dmi'
icon_state = "offhand"
w_class = WEIGHT_CLASS_HUGE
flags_1 = ABSTRACT_1 | DROPDEL_1 | NOBLUDGEON_1
item_flags = ABSTRACT | DROPDEL | NOBLUDGEON
resistance_flags = INDESTRUCTIBLE | LAVA_PROOF | FIRE_PROOF | UNACIDABLE | ACID_PROOF
var/mob/living/carbon/rider
var/mob/living/parent
+18
View File
@@ -59,6 +59,24 @@
if(src.rotation_flags & ROTATION_COUNTERCLOCKWISE)
AM.verbs += /atom/movable/proc/simple_rotate_counterclockwise
/datum/component/simple_rotation/proc/remove_verbs()
if(parent)
var/atom/movable/AM = parent
AM.verbs -= /atom/movable/proc/simple_rotate_flip
AM.verbs -= /atom/movable/proc/simple_rotate_clockwise
AM.verbs -= /atom/movable/proc/simple_rotate_counterclockwise
/datum/component/simple_rotation/Destroy()
remove_verbs()
QDEL_NULL(can_user_rotate)
QDEL_NULL(can_be_rotated)
QDEL_NULL(after_rotation)
. = ..()
/datum/component/simple_rotation/RemoveComponent()
remove_verbs()
. = ..()
/datum/component/simple_rotation/proc/ExamineMessage(mob/user)
if(rotation_flags & ROTATION_ALTCLICK)
to_chat(user, "<span class='notice'>Alt-click to rotate it clockwise.</span>")
@@ -2,7 +2,7 @@
var/atom/A = parent
if((istype(W, /obj/item/storage/backpack/holding) || count_by_type(W.GetAllContents(), /obj/item/storage/backpack/holding)))
var/safety = alert(user, "Doing this will have extremely dire consequences for the station and its crew. Be sure you know what you're doing.", "Put in [A.name]?", "Abort", "Proceed")
if(safety == "Abort" || !in_range(A, user) || !A || !W || user.incapacitated())
if(safety != "Proceed" || QDELETED(A) || QDELETED(W) || QDELETED(user) || !user.canUseTopic(A, BE_CLOSE, iscarbon(user)))
return
var/turf/loccheck = get_turf(A)
if(is_reebe(loccheck.z))
@@ -54,12 +54,18 @@
/datum/component/storage/concrete/pockets/pocketprotector
max_items = 3
max_w_class = WEIGHT_CLASS_TINY
var/atom/original_parent
/datum/component/storage/concrete/pockets/pocketprotector/Initialize()
original_parent = parent
. = ..()
can_hold = typecacheof(list( //Same items as a PDA
/obj/item/pen,
/obj/item/toy/crayon,
/obj/item/lipstick,
/obj/item/flashlight/pen,
/obj/item/clothing/mask/cigarette))
/obj/item/clothing/mask/cigarette))
/datum/component/storage/concrete/pockets/pocketprotector/real_location()
// if the component is reparented to a jumpsuit, the items still go in the protector
return original_parent
@@ -20,7 +20,7 @@
allow_quick_gather = TRUE
allow_quick_empty = TRUE
click_gather = TRUE
max_w_class = WEIGHT_CLASS_NORMAL
max_w_class = WEIGHT_CLASS_BULKY // can fit vending refills
max_combined_w_class = 800
max_items = 400
display_numerical_stacking = TRUE
@@ -29,5 +29,5 @@
. = ..()
if(!I.get_part_rating())
if (!stop_messages)
to_chat(M, "<span class='warning'>[parent] only accepts machine par ts!</span>")
to_chat(M, "<span class='warning'>[parent] only accepts machine parts!</span>")
return FALSE
+13 -14
View File
@@ -98,7 +98,7 @@
RegisterSignal(COMSIG_CLICK_ALT, .proc/on_alt_click)
RegisterSignal(COMSIG_MOUSEDROP_ONTO, .proc/mousedrop_onto)
RegisterSignal(COMSIG_MOUSEDROPPED_ONTO, .proc/mousedrop_recieve)
RegisterSignal(COMSIG_MOUSEDROPPED_ONTO, .proc/mousedrop_receive)
update_actions()
@@ -125,11 +125,13 @@
modeswitch_action.Grant(M)
/datum/component/storage/proc/change_master(datum/component/storage/concrete/new_master)
if(!istype(new_master))
if(new_master == src || (!isnull(new_master) && !istype(new_master)))
return FALSE
master.on_slave_unlink(src)
if(master)
master.on_slave_unlink(src)
master = new_master
master.on_slave_link(src)
if(master)
master.on_slave_link(src)
return TRUE
/datum/component/storage/proc/master()
@@ -149,7 +151,7 @@
quick_empty(M)
/datum/component/storage/proc/preattack_intercept(obj/O, mob/M, params)
if(!isitem(O) || !click_gather || O.SendSignal(COMSIG_CONTAINS_STORAGE))
if(!isitem(O) || !click_gather || SEND_SIGNAL(O, COMSIG_CONTAINS_STORAGE))
return FALSE
. = COMPONENT_NO_ATTACK
if(locked)
@@ -466,7 +468,7 @@
if(recursive)
for(var/i in ret.Copy())
var/atom/A = i
A.SendSignal(COMSIG_TRY_STORAGE_RETURN_INVENTORY, ret, TRUE)
SEND_SIGNAL(A, COMSIG_TRY_STORAGE_RETURN_INVENTORY, ret, TRUE)
return ret
/datum/component/storage/proc/contents() //ONLY USE IF YOU NEED TO COPY CONTENTS OF REAL LOCATION, COPYING IS NOT AS FAST AS DIRECT ACCESS!
@@ -517,19 +519,19 @@
if(force || M.CanReach(parent, view_only = TRUE))
show_to(M)
/datum/component/storage/proc/mousedrop_recieve(atom/movable/O, mob/M)
/datum/component/storage/proc/mousedrop_receive(atom/movable/O, mob/M)
if(isitem(O))
var/obj/item/I = O
if(iscarbon(M) || isdrone(M))
var/mob/living/L = M
if(!L.incapacitated() && I == L.get_active_held_item())
if(!I.SendSignal(COMSIG_CONTAINS_STORAGE) && can_be_inserted(I, FALSE)) //If it has storage it should be trying to dump, not insert.
if(!SEND_SIGNAL(I, COMSIG_CONTAINS_STORAGE) && can_be_inserted(I, FALSE)) //If it has storage it should be trying to dump, not insert.
handle_item_insertion(I, FALSE, L)
//This proc return 1 if the item can be picked up and 0 if it can't.
//Set the stop_messages to stop it from printing messages
/datum/component/storage/proc/can_be_inserted(obj/item/I, stop_messages = FALSE, mob/M)
if(!istype(I) || (I.flags_1 & ABSTRACT_1))
if(!istype(I) || (I.item_flags & ABSTRACT))
return FALSE //Not an item
if(I == parent)
return FALSE //no paradoxes for you
@@ -573,7 +575,7 @@
if(!stop_messages)
to_chat(M, "<span class='warning'>[IP] cannot hold [I] as it's a storage item of the same size!</span>")
return FALSE //To prevent the stacking of same sized storage items.
if(I.flags_1 & NODROP_1) //SHOULD be handled in unEquip, but better safe than sorry.
if(I.item_flags & NODROP) //SHOULD be handled in unEquip, but better safe than sorry.
to_chat(M, "<span class='warning'>\the [I] is stuck to your hand, you can't put it in \the [host]!</span>")
return FALSE
var/datum/component/storage/concrete/master = master()
@@ -639,10 +641,7 @@
/datum/component/storage/proc/signal_take_type(type, atom/destination, amount = INFINITY, check_adjacent = FALSE, force = FALSE, mob/user, list/inserted)
if(!force)
if(check_adjacent)
if(user)
if(!user.CanReach(destination) || !user.CanReach(parent))
return FALSE
else if(!destination.CanReachStorage(parent))
if(!user || !user.CanReach(destination) || !user.CanReach(parent))
return FALSE
var/list/taking = typecache_filter_list(contents(), typecacheof(type))
if(length(taking) > amount)
+1 -1
View File
@@ -60,7 +60,7 @@
if(amount >= 50)
var/burning_time = max(100, 100-amount)
master = master.ScrapeAway()
master = master.Melt()
master.burn_tile()
if(user)
master.add_hiddenprint(user)
+250
View File
@@ -0,0 +1,250 @@
GLOBAL_LIST_EMPTY(uplinks)
/**
* Uplinks
*
* All /obj/item(s) have a hidden_uplink var. By default it's null. Give the item one with 'new(src') (it must be in it's contents). Then add 'uses.'
* Use whatever conditionals you want to check that the user has an uplink, and then call interact() on their uplink.
* You might also want the uplink menu to open if active. Check if the uplink is 'active' and then interact() with it.
**/
/datum/component/uplink
dupe_mode = COMPONENT_DUPE_UNIQUE
var/name = "syndicate uplink"
var/active = FALSE
var/lockable = TRUE
var/locked = TRUE
var/allow_restricted = TRUE
var/telecrystals
var/selected_cat
var/owner = null
var/datum/game_mode/gamemode
var/datum/uplink_purchase_log/purchase_log
var/list/uplink_items
var/hidden_crystals = 0
/datum/component/uplink/Initialize(_owner, _lockable = TRUE, _enabled = FALSE, datum/game_mode/_gamemode, starting_tc = 20)
if(!isitem(parent))
return COMPONENT_INCOMPATIBLE
RegisterSignal(COMSIG_PARENT_ATTACKBY, .proc/OnAttackBy)
RegisterSignal(COMSIG_ITEM_ATTACK_SELF, .proc/interact)
if(istype(parent, /obj/item/implant))
RegisterSignal(COMSIG_IMPLANT_ACTIVATED, .proc/implant_activation)
RegisterSignal(COMSIG_IMPLANT_IMPLANTING, .proc/implanting)
RegisterSignal(COMSIG_IMPLANT_OTHER, .proc/old_implant)
RegisterSignal(COMSIG_IMPLANT_EXISTING_UPLINK, .proc/new_implant)
else if(istype(parent, /obj/item/pda))
RegisterSignal(COMSIG_PDA_CHANGE_RINGTONE, .proc/new_ringtone)
else if(istype(parent, /obj/item/radio))
RegisterSignal(COMSIG_RADIO_NEW_FREQUENCY, .proc/new_frequency)
else if(istype(parent, /obj/item/pen))
RegisterSignal(COMSIG_PEN_ROTATED, .proc/pen_rotation)
GLOB.uplinks += src
uplink_items = get_uplink_items(gamemode, TRUE, allow_restricted)
if(_owner)
owner = _owner
LAZYINITLIST(GLOB.uplink_purchase_logs_by_key)
if(GLOB.uplink_purchase_logs_by_key[owner])
purchase_log = GLOB.uplink_purchase_logs_by_key[owner]
else
purchase_log = new(owner, src)
lockable = _lockable
active = _enabled
gamemode = _gamemode
telecrystals = starting_tc
if(!lockable)
active = TRUE
locked = FALSE
/datum/component/uplink/InheritComponent(datum/component/uplink/U)
lockable |= U.lockable
active |= U.active
if(!gamemode)
gamemode = U.gamemode
telecrystals += U.telecrystals
if(purchase_log && U.purchase_log)
purchase_log.MergeWithAndDel(U.purchase_log)
/datum/component/uplink/Destroy()
GLOB.uplinks -= src
gamemode = null
return ..()
/datum/component/uplink/proc/LoadTC(mob/user, obj/item/stack/telecrystal/TC, silent = FALSE)
if(!silent)
to_chat(user, "<span class='notice'>You slot [TC] into [parent] and charge its internal uplink.</span>")
var/amt = TC.amount
telecrystals += amt
TC.use(amt)
/datum/component/uplink/proc/set_gamemode(_gamemode)
gamemode = _gamemode
uplink_items = get_uplink_items(gamemode, TRUE, allow_restricted)
/datum/component/uplink/proc/OnAttackBy(obj/item/I, mob/user)
if(!active)
return //no hitting everyone/everything just to try to slot tcs in!
if(istype(I, /obj/item/stack/telecrystal))
LoadTC(user, I)
for(var/category in uplink_items)
for(var/item in uplink_items[category])
var/datum/uplink_item/UI = uplink_items[category][item]
var/path = UI.refund_path || UI.item
var/cost = UI.refund_amount || UI.cost
if(I.type == path && UI.refundable && I.check_uplink_validity())
telecrystals += cost
purchase_log.total_spent -= cost
to_chat(user, "<span class='notice'>[I] refunded.</span>")
qdel(I)
return
/datum/component/uplink/proc/interact(mob/user)
if(locked)
return
active = TRUE
if(user)
ui_interact(user)
// an unlocked uplink blocks also opening the PDA or headset menu
return COMPONENT_NO_INTERACT
/datum/component/uplink/ui_interact(mob/user, ui_key = "main", datum/tgui/ui = null, force_open = FALSE, \
datum/tgui/master_ui = null, datum/ui_state/state = GLOB.inventory_state)
active = TRUE
ui = SStgui.try_update_ui(user, src, ui_key, ui, force_open)
if(!ui)
ui = new(user, src, ui_key, "uplink", name, 450, 750, master_ui, state)
ui.set_autoupdate(FALSE) // This UI is only ever opened by one person, and never is updated outside of user input.
ui.set_style("syndicate")
ui.open()
/datum/component/uplink/ui_data(mob/user)
if(!user.mind)
return
var/list/data = list()
data["telecrystals"] = telecrystals
data["lockable"] = lockable
data["categories"] = list()
for(var/category in uplink_items)
var/list/cat = list(
"name" = category,
"items" = (category == selected_cat ? list() : null))
if(category == selected_cat)
for(var/item in uplink_items[category])
var/datum/uplink_item/I = uplink_items[category][item]
if(I.limited_stock == 0)
continue
if(I.restricted_roles.len)
var/is_inaccessible = 1
for(var/R in I.restricted_roles)
if(R == user.mind.assigned_role)
is_inaccessible = 0
if(is_inaccessible)
continue
cat["items"] += list(list(
"name" = I.name,
"cost" = I.cost,
"desc" = I.desc,
))
data["categories"] += list(cat)
return data
/datum/component/uplink/ui_act(action, params)
if(!active)
return
switch(action)
if("buy")
var/item = params["item"]
var/list/buyable_items = list()
for(var/category in uplink_items)
buyable_items += uplink_items[category]
if(item in buyable_items)
var/datum/uplink_item/I = buyable_items[item]
MakePurchase(usr, I)
. = TRUE
if("lock")
active = FALSE
locked = TRUE
telecrystals += hidden_crystals
hidden_crystals = 0
SStgui.close_uis(src)
if("select")
selected_cat = params["category"]
return TRUE
/datum/component/uplink/proc/MakePurchase(mob/user, datum/uplink_item/U)
if(!istype(U))
return
if (!user || user.incapacitated())
return
if(telecrystals < U.cost || U.limited_stock == 0)
return
telecrystals -= U.cost
U.purchase(user, src)
if(U.limited_stock > 0)
U.limited_stock -= 1
SSblackbox.record_feedback("nested tally", "traitor_uplink_items_bought", 1, list("[initial(U.name)]", "[U.cost]"))
return TRUE
// Implant signal responses
/datum/component/uplink/proc/implant_activation()
var/obj/item/implant/implant = parent
locked = FALSE
interact(implant.imp_in)
/datum/component/uplink/proc/implanting(list/arguments)
var/mob/user = arguments[2]
owner = "[user.key]"
/datum/component/uplink/proc/old_implant(list/arguments, obj/item/implant/new_implant)
// It kinda has to be weird like this until implants are components
return SEND_SIGNAL(new_implant, COMSIG_IMPLANT_EXISTING_UPLINK, src)
/datum/component/uplink/proc/new_implant(datum/component/uplink/uplink)
uplink.telecrystals += telecrystals
return COMPONENT_DELETE_NEW_IMPLANT
// PDA signal responses
/datum/component/uplink/proc/new_ringtone(mob/living/user, new_ring_text)
var/obj/item/pda/master = parent
if(trim(lowertext(new_ring_text)) != trim(lowertext(master.lock_code))) //why is the lock code stored on the pda?
return
locked = FALSE
interact(user)
to_chat(user, "The PDA softly beeps.")
user << browse(null, "window=pda")
master.mode = 0
return COMPONENT_STOP_RINGTONE_CHANGE
// Radio signal responses
/datum/component/uplink/proc/new_frequency(list/arguments)
var/obj/item/radio/master = parent
var/frequency = arguments[1]
if(frequency != master.traitor_frequency)
return
locked = FALSE
if(ismob(master.loc))
interact(master.loc)
// Pen signal responses
/datum/component/uplink/proc/pen_rotation(degrees, mob/living/carbon/user)
var/obj/item/pen/master = parent
if(degrees != master.traitor_unlock_degrees)
return
locked = FALSE
master.degrees = 0
interact(user)
to_chat(user, "<span class='warning'>Your pen makes a clicking noise, before quickly rotating back to 0 degrees!</span>")
+1 -1
View File
@@ -96,7 +96,7 @@
else
atomsnowflake += "<a href='?_src_=vars;[HrefToken()];datumedit=[refid];varnameedit=name'><b>[D]</b></a>"
if(A.dir)
atomsnowflake += "<br><font size='1'><a href='?_src_=vars;[HrefToken()];rotatedatum=[refid];rotatedir=left'><<</a> <a href='?_src_=vars;[HrefToken()];datumedit=[refid];varnameedit=dir'>[dir2text(A.dir)]</a> <a href='?_src_=vars;rotatedatum=[refid];rotatedir=right'>>></a></font>"
atomsnowflake += "<br><font size='1'><a href='?_src_=vars;[HrefToken()];rotatedatum=[refid];rotatedir=left'><<</a> <a href='?_src_=vars;[HrefToken()];datumedit=[refid];varnameedit=dir'>[dir2text(A.dir)]</a> <a href='?_src_=vars;[HrefToken()];rotatedatum=[refid];rotatedir=right'>>></a></font>"
else
atomsnowflake += "<b>[D]</b>"
+2 -1
View File
@@ -32,6 +32,7 @@
var/list/strain_data = list() //dna_spread special bullshit
var/list/infectable_biotypes = list(MOB_ORGANIC) //if the disease can spread on organics, synthetics, or undead
var/process_dead = FALSE //if this ticks while the host is dead
var/copy_type = null //if this is null, copies will use the type of the instance being copied
/datum/disease/Destroy()
. = ..()
@@ -141,7 +142,7 @@
"bypasses_immunity", "permeability_mod", "severity", "required_organs", "needs_all_cures", "strain_data",
"infectable_biotypes", "process_dead")
var/datum/disease/D = new type()
var/datum/disease/D = copy_type ? new copy_type() : new type()
for(var/V in copy_vars)
var/val = vars[V]
if(islist(val))
+26 -36
View File
@@ -1,52 +1,42 @@
// Cold
/datum/disease/advance/cold
copy_type = /datum/disease/advance
/datum/disease/advance/cold/New()
name = "Cold"
symptoms = list(new/datum/symptom/sneeze)
..()
// Flu
/datum/disease/advance/flu
copy_type = /datum/disease/advance
/datum/disease/advance/flu/New()
name = "Flu"
symptoms = list(new/datum/symptom/cough)
..()
//Randomly generated Disease, for virus crates and events
/datum/disease/advance/random
name = "Experimental Disease"
copy_type = /datum/disease/advance
// Voice Changing
/datum/disease/advance/random/New(max_symptoms, max_level = 8)
if(!max_symptoms)
max_symptoms = rand(1, VIRUS_SYMPTOM_LIMIT)
var/list/datum/symptom/possible_symptoms = list()
for(var/symptom in subtypesof(/datum/symptom))
var/datum/symptom/S = symptom
if(initial(S.level) > max_level)
continue
if(initial(S.level) <= 0) //unobtainable symptoms
continue
possible_symptoms += S
for(var/i in 1 to max_symptoms)
var/datum/symptom/chosen_symptom = pick_n_take(possible_symptoms)
if(chosen_symptom)
var/datum/symptom/S = new chosen_symptom
symptoms += S
Refresh()
/datum/disease/advance/voice_change/New()
name = "Epiglottis Mutation"
symptoms = list(new/datum/symptom/voice_change)
..()
// Toxin Filter
/datum/disease/advance/heal/New()
name = "Liver Enhancer"
symptoms = list(new/datum/symptom/heal)
..()
// Hallucigen
/datum/disease/advance/hallucigen/New()
name = "Second Sight"
symptoms = list(new/datum/symptom/hallucigen)
..()
// Sensory Restoration
/datum/disease/advance/mind_restoration/New()
name = "Intelligence Booster"
symptoms = list(new/datum/symptom/mind_restoration)
..()
// Sensory Destruction
/datum/disease/advance/narcolepsy/New()
name = "Experimental Insomnia Cure"
symptoms = list(new/datum/symptom/narcolepsy)
..()
name = "Sample #[rand(1,10000)]"
@@ -6,7 +6,7 @@ Confusion
Little bit hidden.
Lowers resistance.
Decreases stage speed.
Not very transmittable.
Not very transmissibile.
Intense Level.
Bonus
@@ -6,7 +6,7 @@ Coughing
Noticable.
Little Resistance.
Doesn't increase stage speed much.
Transmittable.
Transmissibile.
Low Level.
BONUS
@@ -50,7 +50,7 @@ Bonus
if(1, 2)
if(prob(base_message_chance))
if(!fake_healthy)
to_chat(M, "<span class='notice'>[pick("Something appears in your peripheral vision, then winks out.", "You hear a faint whispher with no source.", "Your head aches.")]</span>")
to_chat(M, "<span class='notice'>[pick("Something appears in your peripheral vision, then winks out.", "You hear a faint whisper with no source.", "Your head aches.")]</span>")
else
to_chat(M, "<span class='notice'>[pick(healthy_messages)]</span>")
if(3, 4)
@@ -6,7 +6,7 @@ Itching
Not noticable or unnoticable.
Resistant.
Increases stage speed.
Little transmittable.
Little transmissibility.
Low Level.
BONUS
@@ -33,7 +33,7 @@ BONUS
var/mob/living/M = A.affected_mob
if(prob(base_message_chance))
to_chat(M, "<span class='warning'>[pick("Your scalp itches.", "Your skin feels flakey.")]</span>")
to_chat(M, "<span class='warning'>[pick("Your scalp itches.", "Your skin feels flaky.")]</span>")
if(ishuman(M))
var/mob/living/carbon/human/H = M
switch(A.stage)
@@ -6,7 +6,7 @@ Sneezing
Very Noticable.
Increases resistance.
Doesn't increase stage speed.
Very transmittable.
Very transmissible.
Low Level.
Bonus
@@ -6,7 +6,7 @@ Vomiting
Very Very Noticable.
Decreases resistance.
Doesn't increase stage speed.
Little transmittable.
Little transmissibility.
Medium Level.
Bonus
+1 -1
View File
@@ -9,7 +9,7 @@
cure_chance = 20
agent = "Avian Vengence"
viable_mobtypes = list(/mob/living/carbon/human)
desc = "Subject is possesed by the vengeful spirit of a parrot. Call the priest."
desc = "Subject is possessed by the vengeful spirit of a parrot. Call the priest."
severity = DISEASE_SEVERITY_MEDIUM
infectable_biotypes = list(MOB_ORGANIC, MOB_UNDEAD, MOB_INORGANIC, MOB_ROBOTIC)
bypasses_immunity = TRUE //2spook
+4 -1
View File
@@ -50,7 +50,10 @@
if(stage5)
to_chat(affected_mob, pick(stage5))
if(jobban_isbanned(affected_mob, new_form))
affected_mob.death(1)
if(!QDELETED(affected_mob))
affected_mob.death(1)
return
if(QDELETED(affected_mob))
return
if(affected_mob.notransform)
return
+1 -1
View File
@@ -8,7 +8,7 @@
agent = "Fungal Tubercle bacillus Cosmosis"
viable_mobtypes = list(/mob/living/carbon/human)
cure_chance = 5//like hell are you getting out of hell
desc = "A rare highly transmittable virulent virus. Few samples exist, rumoured to be carefully grown and cultured by clandestine bio-weapon specialists. Causes fever, blood vomiting, lung damage, weight loss, and fatigue."
desc = "A rare highly transmissible virulent virus. Few samples exist, rumoured to be carefully grown and cultured by clandestine bio-weapon specialists. Causes fever, blood vomiting, lung damage, weight loss, and fatigue."
required_organs = list(/obj/item/organ/lungs)
severity = DISEASE_SEVERITY_BIOHAZARD
bypasses_immunity = TRUE // TB primarily impacts the lungs; it's also bacterial or fungal in nature; viral immunity should do nothing.
+1 -1
View File
@@ -358,7 +358,7 @@ GLOBAL_LIST_EMPTY(explosions)
heavy = 5
light = 7
if("Custom Bomb")
dev = input("Devestation range (Tiles):") as num
dev = input("Devastation range (Tiles):") as num
heavy = input("Heavy impact range (Tiles):") as num
light = input("Light impact range (Tiles):") as num
+1 -1
View File
@@ -178,7 +178,7 @@
if(!connected_holopad)
. = world.time < (call_start_time + HOLOPAD_MAX_DIAL_TIME)
if(!.)
calling_holopad.say("No answer recieved.")
calling_holopad.say("No answer received.")
calling_holopad.temp = ""
if(!.)
+3 -7
View File
@@ -41,14 +41,10 @@
var/special_role
var/list/restricted_roles = list()
var/datum/job/assigned_job
var/list/datum/objective/objectives = list()
var/list/spell_list = list() // Wizard mode & "Give Spell" badmin button.
var/datum/faction/faction //associated faction
var/datum/changeling/changeling //changeling holder
var/linglink
var/datum/martial_art/martial_art
var/static/default_martial_art = new/datum/martial_art
@@ -362,7 +358,7 @@
if(creator.mind.special_role)
message_admins("[ADMIN_LOOKUPFLW(current)] has been created by [ADMIN_LOOKUPFLW(creator)], an antagonist.")
to_chat(current, "<span class='userdanger'>Despite your creators current allegiances, your true master remains [creator.real_name]. If their loyalities change, so do yours. This will never change unless your creator's body is destroyed.</span>")
to_chat(current, "<span class='userdanger'>Despite your creators current allegiances, your true master remains [creator.real_name]. If their loyalties change, so do yours. This will never change unless your creator's body is destroyed.</span>")
/datum/mind/proc/show_memory(mob/recipient, window=1)
if(!recipient)
@@ -686,7 +682,7 @@
if(!(has_antag_datum(/datum/antagonist/traitor)))
add_antag_datum(/datum/antagonist/traitor)
/datum/mind/proc/make_Changling()
/datum/mind/proc/make_Changeling()
var/datum/antagonist/changeling/C = has_antag_datum(/datum/antagonist/changeling)
if(!C)
C = add_antag_datum(/datum/antagonist/changeling)
@@ -705,7 +701,7 @@
SSticker.mode.add_cultist(src,FALSE,equip=TRUE)
special_role = ROLE_CULTIST
to_chat(current, "<font color=\"purple\"><b><i>You catch a glimpse of the Realm of Nar-Sie, The Geometer of Blood. You now see how flimsy your world is, you see that it should be open to the knowledge of Nar-Sie.</b></i></font>")
to_chat(current, "<font color=\"purple\"><b><i>Assist your new bretheren in their dark dealings. Their goal is yours, and yours is theirs. You serve the Dark One above all else. Bring It back.</b></i></font>")
to_chat(current, "<font color=\"purple\"><b><i>Assist your new brethren in their dark dealings. Their goal is yours, and yours is theirs. You serve the Dark One above all else. Bring It back.</b></i></font>")
/datum/mind/proc/make_Rev()
var/datum/antagonist/rev/head/head = new()
+2 -2
View File
@@ -11,7 +11,7 @@
owner.visible_message("<span class='danger'>[owner] starts having a seizure!</span>", "<span class='userdanger'>You have a seizure!</span>")
owner.Unconscious(200)
owner.Jitter(1000)
owner.SendSignal(COMSIG_ADD_MOOD_EVENT, "epilepsy", /datum/mood_event/epilepsy)
SEND_SIGNAL(owner, COMSIG_ADD_MOOD_EVENT, "epilepsy", /datum/mood_event/epilepsy)
addtimer(CALLBACK(src, .proc/jitter_less, owner), 90)
/datum/mutation/human/epilepsy/proc/jitter_less(mob/living/carbon/human/owner)
@@ -96,7 +96,7 @@
//Tourettes causes you to randomly stand in place and shout.
/datum/mutation/human/tourettes
name = "Tourettes Syndrome"
name = "Tourette's Syndrome"
quality = NEGATIVE
text_gain_indication = "<span class='danger'>You twitch.</span>"
+2 -2
View File
@@ -14,7 +14,7 @@
owner.add_trait(TRAIT_STUNIMMUNE, TRAIT_HULK)
owner.add_trait(TRAIT_PUSHIMMUNE, TRAIT_HULK)
owner.update_body_parts()
owner.SendSignal(COMSIG_ADD_MOOD_EVENT, "hulk", /datum/mood_event/hulk)
SEND_SIGNAL(owner, COMSIG_ADD_MOOD_EVENT, "hulk", /datum/mood_event/hulk)
/datum/mutation/human/hulk/on_attack_hand(mob/living/carbon/human/owner, atom/target, proximity)
if(proximity) //no telekinetic hulk attack
@@ -31,7 +31,7 @@
owner.remove_trait(TRAIT_STUNIMMUNE, TRAIT_HULK)
owner.remove_trait(TRAIT_PUSHIMMUNE, TRAIT_HULK)
owner.update_body_parts()
owner.SendSignal(COMSIG_CLEAR_MOOD_EVENT, "hulk")
SEND_SIGNAL(owner, COMSIG_CLEAR_MOOD_EVENT, "hulk")
/datum/mutation/human/hulk/say_mod(message)
if(message)
+1 -1
View File
@@ -32,7 +32,7 @@
owner.cure_blind(GENETIC_MUTATION)
//X-Ray Vision lets you see through walls.
//X-ray Vision lets you see through walls.
/datum/mutation/human/x_ray
name = "X Ray Vision"
quality = POSITIVE
+2 -2
View File
@@ -28,11 +28,11 @@
var/list/chameleon_extras //extra types for chameleon outfit changes, mostly guns
/datum/outfit/proc/pre_equip(mob/living/carbon/human/H, visualsOnly = FALSE)
//to be overriden for customization depending on client prefs,species etc
//to be overridden for customization depending on client prefs,species etc
return
/datum/outfit/proc/post_equip(mob/living/carbon/human/H, visualsOnly = FALSE)
//to be overriden for toggling internals, id binding, access etc
//to be overridden for toggling internals, id binding, access etc
return
/datum/outfit/proc/equip(mob/living/carbon/human/H, visualsOnly = FALSE)
+12
View File
@@ -94,6 +94,10 @@
port_id = "ruin"
can_be_bought = FALSE
/datum/map_template/shuttle/snowdin
port_id = "snowdin"
can_be_bought = FALSE
// Shuttles start here:
/datum/map_template/shuttle/emergency/airless
@@ -432,3 +436,11 @@
/datum/map_template/shuttle/ruin/syndicate_fighter
suffix = "syndicate_fighter"
name = "Syndicate Fighter"
/datum/map_template/shuttle/snowdin/mining
suffix = "mining"
name = "Snowdin Mining Elevator"
/datum/map_template/shuttle/snowdin/excavation
suffix = "excavation"
name = "Snowdin Excavation Elevator"
+12
View File
@@ -5,6 +5,7 @@
alert_type = /obj/screen/alert/status_effect/freon
var/icon/cube
var/can_melt = TRUE
var/datum/weakref/redirect_component
/obj/screen/alert/status_effect/freon
name = "Frozen Solid"
@@ -12,6 +13,7 @@
icon_state = "frozen"
/datum/status_effect/freon/on_apply()
redirect_component = WEAKREF(owner.AddComponent(/datum/component/redirect, list(COMSIG_LIVING_RESIST), CALLBACK(src, .proc/owner_resist)))
if(!owner.stat)
to_chat(owner, "<span class='userdanger'>You become frozen in a cube!</span>")
cube = icon('icons/effects/freeze.dmi', "ice_cube")
@@ -24,12 +26,22 @@
if(can_melt && owner.bodytemperature >= BODYTEMP_NORMAL)
qdel(src)
/datum/status_effect/freon/proc/owner_resist()
to_chat(owner, "You start breaking out of the ice cube!")
if(do_mob(owner, owner, 40))
if(!QDELETED(src))
to_chat(owner, "You break out of the ice cube!")
owner.remove_status_effect(/datum/status_effect/freon)
owner.update_canmove()
/datum/status_effect/freon/on_remove()
if(!owner.stat)
to_chat(owner, "The cube melts!")
owner.cut_overlay(cube)
owner.adjust_bodytemperature(100)
owner.update_canmove()
qdel(redirect_component.resolve())
redirect_component = null
/datum/status_effect/freon/watcher
duration = 8
+22
View File
@@ -47,3 +47,25 @@
/datum/status_effect/syphon_mark/on_remove()
get_kill()
. = ..()
/obj/screen/alert/status_effect/in_love
name = "In Love"
desc = "You feel so wonderfully in love!"
icon_state = "in_love"
/datum/status_effect/in_love
id = "in_love"
duration = -1
status_type = STATUS_EFFECT_UNIQUE
alert_type = /obj/screen/alert/status_effect/in_love
var/mob/living/date
/datum/status_effect/in_love/on_creation(mob/living/new_owner, mob/living/love_interest)
. = ..()
if(.)
date = love_interest
linked_alert.desc = "You're in love with [date.real_name]! How lovely."
/datum/status_effect/in_love/tick()
if(date)
new /obj/effect/temp_visual/love_heart/invisible(get_turf(date.loc), owner)
+7 -7
View File
@@ -71,7 +71,7 @@
/datum/quirk/family_heirloom/post_add()
if(where == "in your backpack")
var/mob/living/carbon/human/H = quirk_holder
H.back.SendSignal(COMSIG_TRY_STORAGE_SHOW, H)
SEND_SIGNAL(H.back, COMSIG_TRY_STORAGE_SHOW, H)
to_chat(quirk_holder, "<span class='boldnotice'>There is a precious family [heirloom.name] [where], passed down from generation to generation. Keep it safe!</span>")
var/list/family_name = splittext(quirk_holder.real_name, " ")
@@ -79,11 +79,11 @@
/datum/quirk/family_heirloom/on_process()
if(heirloom in quirk_holder.GetAllContents())
quirk_holder.SendSignal(COMSIG_CLEAR_MOOD_EVENT, "family_heirloom_missing")
quirk_holder.SendSignal(COMSIG_ADD_MOOD_EVENT, "family_heirloom", /datum/mood_event/family_heirloom)
SEND_SIGNAL(quirk_holder, COMSIG_CLEAR_MOOD_EVENT, "family_heirloom_missing")
SEND_SIGNAL(quirk_holder, COMSIG_ADD_MOOD_EVENT, "family_heirloom", /datum/mood_event/family_heirloom)
else
quirk_holder.SendSignal(COMSIG_CLEAR_MOOD_EVENT, "family_heirloom")
quirk_holder.SendSignal(COMSIG_ADD_MOOD_EVENT, "family_heirloom_missing", /datum/mood_event/family_heirloom_missing)
SEND_SIGNAL(quirk_holder, COMSIG_CLEAR_MOOD_EVENT, "family_heirloom")
SEND_SIGNAL(quirk_holder, COMSIG_ADD_MOOD_EVENT, "family_heirloom_missing", /datum/mood_event/family_heirloom_missing)
/datum/quirk/family_heirloom/clone_data()
return heirloom
@@ -148,9 +148,9 @@
if(quirk_holder.m_intent == MOVE_INTENT_RUN)
to_chat(quirk_holder, "<span class='warning'>Easy, easy, take it slow... you're in the dark...</span>")
quirk_holder.toggle_move_intent()
quirk_holder.SendSignal(COMSIG_ADD_MOOD_EVENT, "nyctophobia", /datum/mood_event/nyctophobia)
SEND_SIGNAL(quirk_holder, COMSIG_ADD_MOOD_EVENT, "nyctophobia", /datum/mood_event/nyctophobia)
else
quirk_holder.SendSignal(COMSIG_CLEAR_MOOD_EVENT, "nyctophobia")
SEND_SIGNAL(quirk_holder, COMSIG_CLEAR_MOOD_EVENT, "nyctophobia")
+1 -1
View File
@@ -17,7 +17,7 @@
var/weather_overlay
var/weather_color = null
var/end_message = "<span class='danger'>The wind relents its assault.</span>" //Displayed once the wather is over
var/end_message = "<span class='danger'>The wind relents its assault.</span>" //Displayed once the weather is over
var/end_duration = 300 //In deciseconds, how long the "wind-down" graphic will appear before vanishing entirely
var/end_sound
var/end_overlay
+13
View File
@@ -167,3 +167,16 @@ GLOBAL_LIST_EMPTY(active_alternate_appearances)
if(isrevenant(M) || iseminence(M) || iswizard(M))
return TRUE
return FALSE
datum/atom_hud/alternate_appearance/basic/onePerson
var/mob/seer
/datum/atom_hud/alternate_appearance/basic/onePerson/mobShouldSee(mob/M)
if(M == seer)
return TRUE
return FALSE
/datum/atom_hud/alternate_appearance/basic/onePerson/New(key, image/I, mob/living/M)
..(key, I, FALSE)
seer = M
add_hud_to(seer)
+2 -2
View File
@@ -53,7 +53,7 @@ NOTE: there are two lists of areas in the end of this file: centcom and station
icon_state = "start"
requires_power = FALSE
dynamic_lighting = DYNAMIC_LIGHTING_DISABLED
has_gravity = TRUE
has_gravity = STANDARD_GRAVITY
//EXTRA
@@ -62,7 +62,7 @@ NOTE: there are two lists of areas in the end of this file: centcom and station
name = "Asteroid"
icon_state = "asteroid"
requires_power = FALSE
has_gravity = TRUE
has_gravity = STANDARD_GRAVITY
blob_allowed = FALSE //Nope, no winning on the asteroid as a blob. Gotta eat the station.
valid_territory = FALSE
ambientsounds = MINING
+35 -12
View File
@@ -25,7 +25,7 @@
var/lightswitch = TRUE
var/requires_power = TRUE
var/always_unpowered = FALSE // This gets overriden to 1 for space in area/Initialize().
var/always_unpowered = FALSE // This gets overridden to 1 for space in area/Initialize().
var/outdoors = FALSE //For space, the asteroid, lavaland, etc. Used with blueprints to determine if we are adding a new area (vs editing a station room)
@@ -44,7 +44,7 @@
var/static_light = 0
var/static_environ
var/has_gravity = FALSE
var/has_gravity = 0
var/noteleport = FALSE //Are you forbidden from teleporting to the area? (centcom, mobs, wizard, hand teleporter)
var/hidden = FALSE //Hides area from player Teleport function.
var/safe = FALSE //Is the area teleport-safe: no space / radiation / aggresive mobs / other dangers
@@ -409,8 +409,8 @@ GLOBAL_LIST_EMPTY(teleportlocs)
/area/Entered(atom/movable/M)
set waitfor = FALSE
SendSignal(COMSIG_AREA_ENTERED, M)
M.SendSignal(COMSIG_ENTER_AREA, src) //The atom that enters the area
SEND_SIGNAL(src, COMSIG_AREA_ENTERED, M)
SEND_SIGNAL(M, COMSIG_ENTER_AREA, src) //The atom that enters the area
if(!isliving(M))
return
@@ -435,8 +435,8 @@ GLOBAL_LIST_EMPTY(teleportlocs)
addtimer(CALLBACK(L.client, /client/proc/ResetAmbiencePlayed), 600)
/area/Exited(atom/movable/M)
SendSignal(COMSIG_AREA_EXITED, M)
M.SendSignal(COMSIG_EXIT_AREA, src) //The atom that exits the area
SEND_SIGNAL(src, COMSIG_AREA_EXITED, M)
SEND_SIGNAL(M, COMSIG_EXIT_AREA, src) //The atom that exits the area
/client/proc/ResetAmbiencePlayed()
played = FALSE
@@ -444,16 +444,39 @@ GLOBAL_LIST_EMPTY(teleportlocs)
/atom/proc/has_gravity(turf/T)
if(!T || !isturf(T))
T = get_turf(src)
if(!T)
return 0
//Gravity forced on the atom
var/datum/component/forced_gravity/FG = GetComponent(/datum/component/forced_gravity)
if(FG)
if(!FG.ignore_space && isspaceturf(T))
return 0
else
return FG.gravity
//Gravity forced on the turf
FG = T.GetComponent(/datum/component/forced_gravity)
if(FG)
if(!FG.ignore_space && isspaceturf(T))
return 0
else
return FG.gravity
var/area/A = get_area(T)
if(isspaceturf(T)) // Turf never has gravity
return FALSE
else if(A && A.has_gravity) // Areas which always has gravity
return TRUE
return 0
else if(A.has_gravity) // Areas which always has gravity
return A.has_gravity
else
// There's a gravity generator on our z level
if(T && GLOB.gravity_generators["[T.z]"] && length(GLOB.gravity_generators["[T.z]"]))
return TRUE
return FALSE
if(GLOB.gravity_generators["[T.z]"])
var/max_grav = 0
for(var/obj/machinery/gravity_generator/main/G in GLOB.gravity_generators["[T.z]"])
max_grav = max(G.setting,max_grav)
return max_grav
return SSmapping.level_trait(T.z, ZTRAIT_GRAVITY)
/area/proc/setup(a_name)
name = a_name
+3 -3
View File
@@ -7,7 +7,7 @@ Unused icons for new areas are "awaycontent1" ~ "awaycontent30"
/area/awaymission
name = "Strange Location"
icon_state = "away"
has_gravity = TRUE
has_gravity = STANDARD_GRAVITY
ambientsounds = AWAY_MISSION
/area/awaymission/beach
@@ -15,13 +15,13 @@ Unused icons for new areas are "awaycontent1" ~ "awaycontent30"
icon_state = "away"
dynamic_lighting = DYNAMIC_LIGHTING_DISABLED
requires_power = FALSE
has_gravity = TRUE
has_gravity = STANDARD_GRAVITY
ambientsounds = list('sound/ambience/shore.ogg', 'sound/ambience/seag1.ogg','sound/ambience/seag2.ogg','sound/ambience/seag2.ogg','sound/ambience/ambiodd.ogg','sound/ambience/ambinice.ogg')
/area/awaymission/errorroom
name = "Super Secret Room"
dynamic_lighting = DYNAMIC_LIGHTING_DISABLED
has_gravity = TRUE
has_gravity = STANDARD_GRAVITY
/area/awaymission/vr
name = "Virtual Reality"
+7 -8
View File
@@ -6,7 +6,7 @@
icon_state = "centcom"
dynamic_lighting = DYNAMIC_LIGHTING_FORCED
requires_power = FALSE
has_gravity = TRUE
has_gravity = STANDARD_GRAVITY
noteleport = TRUE
blob_allowed = FALSE //Should go without saying, no blobs should take over centcom as a win condition.
flags_1 = NONE
@@ -36,7 +36,7 @@
icon_state = "yellow"
dynamic_lighting = DYNAMIC_LIGHTING_FORCED
requires_power = FALSE
has_gravity = TRUE
has_gravity = STANDARD_GRAVITY
flags_1 = NONE
/area/tdome/arena
@@ -74,7 +74,7 @@
icon_state = "yellow"
dynamic_lighting = DYNAMIC_LIGHTING_FORCED
requires_power = FALSE
has_gravity = TRUE
has_gravity = STANDARD_GRAVITY
noteleport = TRUE
flags_1 = NONE
@@ -84,7 +84,7 @@
icon_state = "yellow"
requires_power = FALSE
noteleport = TRUE
has_gravity = TRUE
has_gravity = STANDARD_GRAVITY
flags_1 = NONE
//Syndicates
@@ -92,7 +92,7 @@
name = "Syndicate Mothership"
icon_state = "syndie-ship"
requires_power = FALSE
has_gravity = TRUE
has_gravity = STANDARD_GRAVITY
noteleport = TRUE
blob_allowed = FALSE //Not... entirely sure this will ever come up... but if the bus makes blobs AND ops, it shouldn't aim for the ops to win.
flags_1 = NONE
@@ -120,8 +120,7 @@
name = "Capture the Flag"
icon_state = "yellow"
requires_power = FALSE
has_gravity = TRUE
flags_1 = NO_DEATHRATTLE_1
has_gravity = STANDARD_GRAVITY
/area/ctf/control_room
name = "Control Room A"
@@ -156,7 +155,7 @@
name = "Reebe"
icon_state = "yellow"
requires_power = FALSE
has_gravity = TRUE
has_gravity = STANDARD_GRAVITY
noteleport = TRUE
hidden = TRUE
ambientsounds = REEBE
+2 -2
View File
@@ -2,7 +2,7 @@
/area/mine
icon_state = "mining"
has_gravity = TRUE
has_gravity = STANDARD_GRAVITY
/area/mine/explored
name = "Mine"
@@ -80,7 +80,7 @@
/area/lavaland
icon_state = "mining"
has_gravity = TRUE
has_gravity = STANDARD_GRAVITY
flags_1 = NONE
/area/lavaland/surface
+1 -1
View File
@@ -3,7 +3,7 @@
/area/ruin
name = "\improper Unexplored Location"
icon_state = "away"
has_gravity = TRUE
has_gravity = STANDARD_GRAVITY
hidden = TRUE
dynamic_lighting = DYNAMIC_LIGHTING_FORCED
ambientsounds = RUINS
+3 -3
View File
@@ -5,7 +5,7 @@
blob_allowed = FALSE //Nope, no winning in space as a blob. Gotta eat the station.
/area/ruin/space/has_grav
has_gravity = TRUE
has_gravity = STANDARD_GRAVITY
/area/ruin/space/has_grav/powered
requires_power = FALSE
@@ -413,13 +413,13 @@
/area/ruin/space/djstation
name = "Ruskie DJ Station"
icon_state = "DJ"
has_gravity = TRUE
has_gravity = STANDARD_GRAVITY
blob_allowed = FALSE //Nope, no winning on the DJ station as a blob. Gotta eat the main station.
/area/ruin/space/djstation/solars
name = "DJ Station Solars"
icon_state = "DJ"
has_gravity = TRUE
has_gravity = STANDARD_GRAVITY
//ABANDONED TELEPORTER
+1 -1
View File
@@ -6,7 +6,7 @@
name = "Shuttle"
requires_power = FALSE
dynamic_lighting = DYNAMIC_LIGHTING_FORCED
has_gravity = TRUE
has_gravity = STANDARD_GRAVITY
always_unpowered = FALSE
valid_territory = FALSE
icon_state = "shuttle"
+45 -20
View File
@@ -20,13 +20,16 @@
var/list/atom_colours //used to store the different colors on an atom
//its inherent color, the colored paint applied on it, special color effect etc...
var/list/our_overlays //our local copy of (non-priority) overlays without byond magic. Use procs in SSoverlays to manipulate
var/list/priority_overlays //overlays that should remain on top and not normally removed when using cut_overlay functions, like c4.
var/list/remove_overlays // a very temporary list of overlays to remove
var/list/add_overlays // a very temporary list of overlays to add
var/datum/proximity_monitor/proximity_monitor
var/buckle_message_cooldown = 0
var/fingerprintslast
var/list/filter_data //For handling persistent filters
/atom/New(loc, ...)
//atom creation method that preloads variables at creation
if(GLOB.use_preloader && (src.type == GLOB._preloader.target_path))//in case the instanciated atom is creating other atoms in New()
@@ -151,7 +154,7 @@
return FALSE
/atom/proc/attack_hulk(mob/living/carbon/human/user, does_attack_animation = 0)
SendSignal(COMSIG_ATOM_HULK_ATTACK, user)
SEND_SIGNAL(src, COMSIG_ATOM_HULK_ATTACK, user)
if(does_attack_animation)
user.changeNext_move(CLICK_CD_MELEE)
add_logs(user, src, "punched", "hulk powers")
@@ -220,13 +223,13 @@
return
/atom/proc/emp_act(severity)
var/protection = SendSignal(COMSIG_ATOM_EMP_ACT, severity)
var/protection = SEND_SIGNAL(src, COMSIG_ATOM_EMP_ACT, severity)
if(!(protection & EMP_PROTECT_WIRES) && istype(wires))
wires.emp_pulse()
return protection // Pass the protection value collected here upwards
/atom/proc/bullet_act(obj/item/projectile/P, def_zone)
SendSignal(COMSIG_ATOM_BULLET_ACT, P, def_zone)
SEND_SIGNAL(src, COMSIG_ATOM_BULLET_ACT, P, def_zone)
. = P.on_hit(src, 0, def_zone)
/atom/proc/in_contents_of(container)//can take class or object instance as argument
@@ -243,7 +246,7 @@
if(article)
. = "[article] [src]"
override[EXAMINE_POSITION_ARTICLE] = article
if(SendSignal(COMSIG_ATOM_GET_EXAMINE_NAME, user, override) & COMPONENT_EXNAME_CHANGED)
if(SEND_SIGNAL(src, COMSIG_ATOM_GET_EXAMINE_NAME, user, override) & COMPONENT_EXNAME_CHANGED)
. = override.Join("")
/atom/proc/get_examine_string(mob/user, thats = FALSE)
@@ -275,7 +278,7 @@
else
to_chat(user, "<span class='danger'>It's empty.</span>")
SendSignal(COMSIG_PARENT_EXAMINE, user)
SEND_SIGNAL(src, COMSIG_PARENT_EXAMINE, user)
/atom/proc/relaymove(mob/user)
if(buckle_message_cooldown <= world.time)
@@ -289,14 +292,14 @@
/atom/proc/ex_act(severity, target)
set waitfor = FALSE
contents_explosion(severity, target)
SendSignal(COMSIG_ATOM_EX_ACT, severity, target)
SEND_SIGNAL(src, COMSIG_ATOM_EX_ACT, severity, target)
/atom/proc/blob_act(obj/structure/blob/B)
SendSignal(COMSIG_ATOM_BLOB_ACT, B)
SEND_SIGNAL(src, COMSIG_ATOM_BLOB_ACT, B)
return
/atom/proc/fire_act(exposed_temperature, exposed_volume)
SendSignal(COMSIG_ATOM_FIRE_ACT, exposed_temperature, exposed_volume)
SEND_SIGNAL(src, COMSIG_ATOM_FIRE_ACT, exposed_temperature, exposed_volume)
return
/atom/proc/hitby(atom/movable/AM, skipcatch, hitpush, blocked)
@@ -364,28 +367,28 @@
return
/atom/proc/singularity_pull(obj/singularity/S, current_size)
SendSignal(COMSIG_ATOM_SING_PULL, S, current_size)
SEND_SIGNAL(src, COMSIG_ATOM_SING_PULL, S, current_size)
/atom/proc/acid_act(acidpwr, acid_volume)
SendSignal(COMSIG_ATOM_ACID_ACT, acidpwr, acid_volume)
SEND_SIGNAL(src, COMSIG_ATOM_ACID_ACT, acidpwr, acid_volume)
/atom/proc/emag_act()
SendSignal(COMSIG_ATOM_EMAG_ACT)
SEND_SIGNAL(src, COMSIG_ATOM_EMAG_ACT)
/atom/proc/rad_act(strength)
SendSignal(COMSIG_ATOM_RAD_ACT, strength)
SEND_SIGNAL(src, COMSIG_ATOM_RAD_ACT, strength)
/atom/proc/narsie_act()
SendSignal(COMSIG_ATOM_NARSIE_ACT)
SEND_SIGNAL(src, COMSIG_ATOM_NARSIE_ACT)
/atom/proc/ratvar_act()
SendSignal(COMSIG_ATOM_RATVAR_ACT)
SEND_SIGNAL(src, COMSIG_ATOM_RATVAR_ACT)
/atom/proc/rcd_vals(mob/user, obj/item/construction/rcd/the_rcd)
return FALSE
/atom/proc/rcd_act(mob/user, obj/item/construction/rcd/the_rcd, passed_mode)
SendSignal(COMSIG_ATOM_RCD_ACT, user, the_rcd, passed_mode)
SEND_SIGNAL(src, COMSIG_ATOM_RCD_ACT, user, the_rcd, passed_mode)
return FALSE
/atom/proc/storage_contents_dump_act(obj/item/storage/src_object, mob/user)
@@ -413,7 +416,7 @@
//This proc is called on the location of an atom when the atom is Destroy()'d
/atom/proc/handle_atom_del(atom/A)
SendSignal(COMSIG_ATOM_CONTENTS_DEL, A)
SEND_SIGNAL(src, COMSIG_ATOM_CONTENTS_DEL, A)
//called when the turf the atom resides on is ChangeTurfed
/atom/proc/HandleTurfChange(turf/T)
@@ -432,7 +435,7 @@
//Hook for running code when a dir change occurs
/atom/proc/setDir(newdir)
SendSignal(COMSIG_ATOM_DIR_CHANGE, dir, newdir)
SEND_SIGNAL(src, COMSIG_ATOM_DIR_CHANGE, dir, newdir)
dir = newdir
/atom/proc/mech_melee_attack(obj/mecha/M)
@@ -527,10 +530,10 @@
return L.AllowDrop() ? L : get_turf(L)
/atom/Entered(atom/movable/AM, atom/oldLoc)
SendSignal(COMSIG_ATOM_ENTERED, AM, oldLoc)
SEND_SIGNAL(src, COMSIG_ATOM_ENTERED, AM, oldLoc)
/atom/Exited(atom/movable/AM, atom/newLoc)
SendSignal(COMSIG_ATOM_EXITED, AM, newLoc)
SEND_SIGNAL(src, COMSIG_ATOM_EXITED, AM, newLoc)
/atom/proc/return_temperature()
return
@@ -579,3 +582,25 @@
/atom/proc/GenerateTag()
return
// Filter stuff
/atom/movable/proc/add_filter(name,priority,list/params)
if(!filter_data)
filter_data = list()
var/list/p = params.Copy()
p["priority"] = priority
filter_data[name] = p
update_filters()
/atom/movable/proc/update_filters()
filters = null
sortTim(filter_data,associative = TRUE)
for(var/f in filter_data)
var/list/data = filter_data[f]
var/list/arguments = data.Copy()
arguments -= "priority"
filters += filter(arglist(arguments))
/atom/movable/proc/get_filter(name)
if(filter_data && filter_data[name])
return filters[filter_data.Find(name)]
+9 -8
View File
@@ -240,7 +240,7 @@
//Called after a successful Move(). By this point, we've already moved
/atom/movable/proc/Moved(atom/OldLoc, Dir, Forced = FALSE)
SendSignal(COMSIG_MOVABLE_MOVED, OldLoc, Dir, Forced)
SEND_SIGNAL(src, COMSIG_MOVABLE_MOVED, OldLoc, Dir, Forced)
if (!inertia_moving)
inertia_next_move = world.time + inertia_move_delay
newtonian_move(Dir)
@@ -278,16 +278,16 @@
// This is automatically called when something enters your square
//oldloc = old location on atom, inserted when forceMove is called and ONLY when forceMove is called!
/atom/movable/Crossed(atom/movable/AM, oldloc)
SendSignal(COMSIG_MOVABLE_CROSSED, AM)
SEND_SIGNAL(src, COMSIG_MOVABLE_CROSSED, AM)
/atom/movable/Uncrossed(atom/movable/AM)
SendSignal(COMSIG_MOVABLE_UNCROSSED, AM)
SEND_SIGNAL(src, COMSIG_MOVABLE_UNCROSSED, AM)
//This is tg's equivalent to the byond bump, it used to be called bump with a second arg
//to differentiate it, naturally everyone forgot about this immediately and so some things
//would bump twice, so now it's called Collide
/atom/movable/proc/Collide(atom/A)
SendSignal(COMSIG_MOVABLE_COLLIDE, A)
SEND_SIGNAL(src, COMSIG_MOVABLE_COLLIDE, A)
if(A)
if(throwing)
throwing.hit_atom(A)
@@ -354,7 +354,7 @@
loc = null
/atom/movable/proc/onTransitZ(old_z,new_z)
SendSignal(COMSIG_MOVABLE_Z_CHANGED, old_z, new_z)
SEND_SIGNAL(src, COMSIG_MOVABLE_Z_CHANGED, old_z, new_z)
for (var/item in src) // Notify contents of Z-transition. This can be overridden IF we know the items contents do not care.
var/atom/movable/AM = item
AM.onTransitZ(old_z,new_z)
@@ -397,7 +397,7 @@
/atom/movable/proc/throw_impact(atom/hit_atom, datum/thrownthing/throwingdatum)
set waitfor = 0
SendSignal(COMSIG_MOVABLE_IMPACT, hit_atom, throwingdatum)
SEND_SIGNAL(src, COMSIG_MOVABLE_IMPACT, hit_atom, throwingdatum)
return hit_atom.hitby(src)
/atom/movable/hitby(atom/movable/AM, skipcatch, hitpush = TRUE, blocked)
@@ -410,7 +410,7 @@
/atom/movable/proc/throw_at(atom/target, range, speed, mob/thrower, spin=TRUE, diagonals_first = FALSE, var/datum/callback/callback) //If this returns FALSE then callback will not be called.
. = FALSE
if (!target || (flags_1 & NODROP_1) || speed <= 0)
if (!target || speed <= 0)
return
if (pulledby)
@@ -482,7 +482,7 @@
if(spin)
SpinAnimation(5, 1)
SendSignal(COMSIG_MOVABLE_THROW, TT, spin)
SEND_SIGNAL(src, COMSIG_MOVABLE_THROW, TT, spin)
SSthrowing.processing[src] = TT
if (SSthrowing.state == SS_PAUSED && length(SSthrowing.currentrun))
SSthrowing.currentrun[src] = TT
@@ -565,6 +565,7 @@
I = image('icons/effects/effects.dmi', A, visual_effect_icon, A.layer + 0.1)
else if(used_item)
I = image(icon = used_item, loc = A, layer = A.layer + 0.1)
I.plane = GAME_PLANE
// Scale the icon.
I.transform *= 0.75
+1 -1
View File
@@ -248,7 +248,7 @@
if("Incarcerated")
holder.icon_state = "hudincarcerated"
return
if("Parolled")
if("Paroled")
holder.icon_state = "hudparolled"
return
if("Discharged")
+3 -2
View File
@@ -52,6 +52,7 @@ GLOBAL_VAR(changeling_team_objective_type) //If this is not null, we hand our th
changeling.restricted_roles = restricted_jobs
return 1
else
setup_error = "Not enough changeling candidates"
return 0
/datum/game_mode/changeling/post_setup()
@@ -82,10 +83,10 @@ GLOBAL_VAR(changeling_team_objective_type) //If this is not null, we hand our th
return
if(changelings.len <= (changelingcap - 2) || prob(100 - (csc * 2)))
if(ROLE_CHANGELING in character.client.prefs.be_special)
if(!jobban_isbanned(character, ROLE_CHANGELING) && !jobban_isbanned(character, ROLE_SYNDICATE))
if(!jobban_isbanned(character, ROLE_CHANGELING) && !QDELETED(character) && !jobban_isbanned(character, ROLE_SYNDICATE) && !QDELETED(character))
if(age_check(character.client))
if(!(character.job in restricted_jobs))
character.mind.make_Changling()
character.mind.make_Changeling()
changelings += character.mind
/datum/game_mode/changeling/generate_report()
@@ -69,11 +69,13 @@
return
if(changelings.len <= (changelingcap - 2) || prob(100 / (csc * 4)))
if(ROLE_CHANGELING in character.client.prefs.be_special)
if(!jobban_isbanned(character, ROLE_CHANGELING) && !jobban_isbanned(character, ROLE_SYNDICATE))
if(!jobban_isbanned(character, ROLE_CHANGELING) && !QDELETED(character) && !jobban_isbanned(character, ROLE_SYNDICATE) && !QDELETED(character))
if(age_check(character.client))
if(!(character.job in restricted_jobs))
character.mind.make_Changling()
character.mind.make_Changeling()
changelings += character.mind
if(QDELETED(character))
return
..()
/datum/game_mode/traitor/changeling/generate_report()
+2 -2
View File
@@ -146,8 +146,8 @@ Credit where due:
var/list/errorList = list()
SSmapping.LoadGroup(errorList, "Reebe", "map_files/generic", "City_of_Cogs.dmm", default_traits = ZTRAITS_REEBE, silent = TRUE)
if(errorList.len) // reebe failed to load
message_admins("Rebee failed to load!")
log_game("Rebee failed to load!")
message_admins("Reebe failed to load!")
log_game("Reebe failed to load!")
return FALSE
if(CONFIG_GET(flag/protect_roles_from_antagonist))
restricted_jobs += protected_jobs
@@ -42,17 +42,17 @@
var/obj/item/clothing/C
if(!H.w_uniform || H.dropItemToGround(H.w_uniform))
C = new /obj/item/clothing/under/rank/clown(H)
C.flags_1 |= NODROP_1 //mwahaha
C.item_flags |= NODROP //mwahaha
H.equip_to_slot_or_del(C, SLOT_W_UNIFORM)
if(!H.shoes || H.dropItemToGround(H.shoes))
C = new /obj/item/clothing/shoes/clown_shoes(H)
C.flags_1 |= NODROP_1
C.item_flags |= NODROP
H.equip_to_slot_or_del(C, SLOT_SHOES)
if(!H.wear_mask || H.dropItemToGround(H.wear_mask))
C = new /obj/item/clothing/mask/gas/clown_hat(H)
C.flags_1 |= NODROP_1
C.item_flags |= NODROP
H.equip_to_slot_or_del(C, SLOT_WEAR_MASK)
H.dna.add_mutation(CLOWNMUT)
+1 -1
View File
@@ -48,7 +48,7 @@
/obj/item/reagent_containers/spray/waterflower/lube)
implants = list(/obj/item/implant/sad_trombone)
uplink_type = /obj/item/radio/uplink/clownop
uplink_type = /obj/item/uplink/clownop
/datum/outfit/syndicate/clownop/no_crystals
tc = 0
@@ -11,10 +11,10 @@
list_reagents = list("lube" = 30)
//COMBAT CLOWN SHOES
//Clown shoes with combat stats and noslip. Of course they still squeek.
//Clown shoes with combat stats and noslip. Of course they still squeak.
/obj/item/clothing/shoes/clown_shoes/combat
name = "combat clown shoes"
desc = "advanced clown shoes that protect the wearer and render them nearly immune to slipping on their own peels. They also squeek at 100% capacity."
desc = "advanced clown shoes that protect the wearer and render them nearly immune to slipping on their own peels. They also squeak at 100% capacity."
clothing_flags = NOSLIP
slowdown = SHOES_SLOWDOWN
armor = list("melee" = 25, "bullet" = 25, "laser" = 25, "energy" = 25, "bomb" = 50, "bio" = 10, "rad" = 0, "fire" = 70, "acid" = 50)
@@ -216,11 +216,11 @@
/obj/item/clothing/mask/fakemoustache/sticky/Initialize()
. = ..()
flags_1 |= NODROP_1
item_flags |= NODROP
addtimer(CALLBACK(src, .proc/unstick), unstick_time)
/obj/item/clothing/mask/fakemoustache/sticky/proc/unstick()
flags_1 &= ~NODROP_1
item_flags &= ~NODROP
//DARK H.O.N.K. AND CLOWN MECH WEAPONS
+5 -2
View File
@@ -81,8 +81,11 @@
cultist.restricted_roles = restricted_jobs
log_game("[key_name(cultist)] has been selected as a cultist")
return (cultists_to_cult.len>=required_enemies)
if(cultists_to_cult.len>=required_enemies)
return TRUE
else
setup_error = "Not enough cultist candidates"
return FALSE
/datum/game_mode/cult/post_setup()
@@ -45,6 +45,7 @@
antag_candidates.Remove(devil)
if(devils.len < required_enemies)
setup_error = "Not enough devil candidates"
return 0
return 1
+4 -2
View File
@@ -49,6 +49,7 @@
var/gamemode_ready = FALSE //Is the gamemode all set up and ready to start checking for ending conditions.
var/flipseclevel = FALSE //CIT CHANGE - adds a 10% chance for the alert level to be the opposite of what the gamemode is supposed to have
var/setup_error //What stopepd setting up the mode.
/datum/game_mode/proc/announce() //Shows the gamemode's name and a fast description.
to_chat(world, "<b>The gamemode is: <span class='[announce_span]'>[name]</span>!</b>")
@@ -98,6 +99,7 @@
if(sql)
var/datum/DBQuery/query_round_game_mode = SSdbcore.NewQuery("UPDATE [format_table_name("round")] SET [sql] WHERE id = [GLOB.round_id]")
query_round_game_mode.Execute()
qdel(query_round_game_mode)
if(report)
addtimer(CALLBACK(src, .proc/send_intercept, 0), rand(waittime_l, waittime_h))
generate_station_goals()
@@ -364,7 +366,7 @@
for(var/mob/dead/new_player/player in players)
if(player.client && player.ready == PLAYER_READY_TO_PLAY)
if(role in player.client.prefs.be_special)
if(!jobban_isbanned(player, ROLE_SYNDICATE) && !jobban_isbanned(player, role)) //Nodrak/Carn: Antag Job-bans
if(!jobban_isbanned(player, ROLE_SYNDICATE) && !QDELETED(player) && !jobban_isbanned(player, role) && !QDELETED(player)) //Nodrak/Carn: Antag Job-bans
if(age_check(player.client)) //Must be older than the minimum age
candidates += player.mind // Get a list of all the people who want to be the antagonist for this round
@@ -378,7 +380,7 @@
for(var/mob/dead/new_player/player in players)
if(player.client && player.ready == PLAYER_READY_TO_PLAY)
if(!(role in player.client.prefs.be_special)) // We don't have enough people who want to be antagonist, make a separate list of people who don't want to be one
if(!jobban_isbanned(player, ROLE_SYNDICATE) && !jobban_isbanned(player, role)) //Nodrak/Carn: Antag Job-bans
if(!jobban_isbanned(player, ROLE_SYNDICATE) && !QDELETED(player) && !jobban_isbanned(player, role) && !QDELETED(player) ) //Nodrak/Carn: Antag Job-bans
drafted += player.mind
if(restricted_jobs)
+1
View File
@@ -40,6 +40,7 @@
antag_candidates -= carrier
if(!carriers.len)
setup_error = "No monkey candidates"
return FALSE
return TRUE
+3 -2
View File
@@ -33,6 +33,7 @@
log_game("[key_name(new_op)] has been selected as a nuclear operative")
return TRUE
else
setup_error = "Not enough nuke op candidates"
return FALSE
////////////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////////////
@@ -134,7 +135,7 @@
var/tc = 25
var/command_radio = FALSE
var/uplink_type = /obj/item/radio/uplink/nuclear
var/uplink_type = /obj/item/uplink/nuclear
/datum/outfit/syndicate/leader
@@ -154,7 +155,7 @@
R.command = TRUE
if(tc)
var/obj/item/radio/uplink/U = new uplink_type(H, H.key, tc)
var/obj/item/U = new uplink_type(H, H.key, tc)
H.equip_to_slot_or_del(U, SLOT_IN_BACKPACK)
var/obj/item/implant/weapons_auth/W = new/obj/item/implant/weapons_auth(H)
+2 -2
View File
@@ -279,7 +279,7 @@ GLOBAL_LIST_EMPTY(objectives)
if(SSshuttle.emergency.mode != SHUTTLE_ENDGAME)
return TRUE
for(var/mob/living/player in GLOB.player_list)
if(get_area(player) in SSshuttle.emergency.shuttle_areas && player.mind && player.stat != DEAD && ishuman(player))
if((get_area(player) in SSshuttle.emergency.shuttle_areas) && player.mind && player.stat != DEAD && ishuman(player))
var/mob/living/carbon/human/H = player
if(H.dna.species.id != "human")
return FALSE
@@ -621,7 +621,7 @@ GLOBAL_LIST_EMPTY(possible_items_special)
absorbedcount += changeling.absorbedcount
for(var/datum/antagonist/changeling/changeling2 in GLOB.antagonists)
if(!changeling2.owner || !changeling2.stored_profiles || changeling2.absorbedcount < absorbedcount)
if(!changeling2.owner || changeling2.owner == owner || !changeling2.stored_profiles || changeling2.absorbedcount < absorbedcount)
continue
return FALSE
return TRUE
@@ -58,6 +58,7 @@
lenin.restricted_roles = restricted_jobs
if(headrev_candidates.len < required_enemies)
setup_error = "Not enough headrev candidates"
return FALSE
return TRUE
+8 -2
View File
@@ -56,7 +56,13 @@
log_game("[key_name(traitor)] has been selected as a [traitor_name]")
antag_candidates.Remove(traitor)
return !traitors_required || pre_traitors.len > 0
var/enough_tators = !traitors_required || pre_traitors.len > 0
if(!enough_tators)
setup_error = "Not enough traitor candidates"
return FALSE
else
return TRUE
/datum/game_mode/traitor/post_setup()
@@ -79,7 +85,7 @@
return
if((SSticker.mode.traitors.len + pre_traitors.len) <= (traitorcap - 2) || prob(100 / (tsc * 2)))
if(ROLE_TRAITOR in character.client.prefs.be_special)
if(!jobban_isbanned(character, ROLE_TRAITOR) && !jobban_isbanned(character, ROLE_SYNDICATE))
if(!jobban_isbanned(character, ROLE_TRAITOR) && !QDELETED(character) && !jobban_isbanned(character, ROLE_SYNDICATE) && !QDELETED(character))
if(age_check(character.client))
if(!(character.job in restricted_jobs))
add_latejoin_traitor(character.mind)
+3 -3
View File
@@ -25,11 +25,11 @@
wizard.special_role = ROLE_WIZARD
log_game("[key_name(wizard)] has been selected as a Wizard") //TODO: Move these to base antag datum
if(GLOB.wizardstart.len == 0)
to_chat(wizard.current, "<span class='boldannounce'>A starting location for you could not be found, please report this bug!</span>")
return 0
setup_error = "No wizard starting location found"
return FALSE
for(var/datum/mind/wiz in wizards)
wiz.current.forceMove(pick(GLOB.wizardstart))
return 1
return TRUE
/datum/game_mode/wizard/post_setup()
+3 -3
View File
@@ -414,12 +414,12 @@ Class Procs:
var/obj/item/stack/SN = new SB.merge_type(null,used_amt)
component_parts += SN
else
if(W.SendSignal(COMSIG_TRY_STORAGE_TAKE, B, src))
if(SEND_SIGNAL(W, COMSIG_TRY_STORAGE_TAKE, B, src))
component_parts += B
B.moveToNullspace()
W.SendSignal(COMSIG_TRY_STORAGE_INSERT, A, null, null, TRUE)
SEND_SIGNAL(W, COMSIG_TRY_STORAGE_INSERT, A, null, null, TRUE)
component_parts -= A
to_chat(user, "<span class='notice'>[A.name] replaced with [B.name].</span>")
to_chat(user, "<span class='notice'>[capitalize(A.name)] replaced with [B.name].</span>")
shouldplaysound = 1 //Only play the sound when parts are actually replaced!
break
RefreshParts()
+1 -1
View File
@@ -46,7 +46,7 @@
)
/obj/machinery/autolathe/Initialize()
AddComponent(/datum/component/material_container, list(MAT_METAL, MAT_GLASS), 0, FALSE, null, null, CALLBACK(src, .proc/AfterMaterialInsert))
AddComponent(/datum/component/material_container, list(MAT_METAL, MAT_GLASS), 0, TRUE, null, null, CALLBACK(src, .proc/AfterMaterialInsert))
. = ..()
wires = new /datum/wires/autolathe(src)
+1 -1
View File
@@ -95,7 +95,7 @@
update_icon()
return
if(user.a_intent != INTENT_HARM && !(W.flags_1 & NOBLUDGEON_1))
if(user.a_intent != INTENT_HARM && !(W.item_flags & NOBLUDGEON))
return attack_hand(user)
else
return ..()
+10
View File
@@ -41,6 +41,16 @@
var/internal_light = TRUE //Whether it can light up when an AI views it
/obj/machinery/camera/preset/toxins //Bomb test site in space
name = "Hardened Bomb-Test Camera"
desc = "A specially-reinforced camera with a long lasting battery, used to monitor the bomb testing site. An external light is attached to the top."
c_tag = "Bomb Testing Site"
network = list("rd","toxins")
use_power = NO_POWER_USE //Test site is an unpowered area
invuln = TRUE
light_range = 10
start_active = TRUE
/obj/machinery/camera/Initialize(mapload, obj/structure/camera_assembly/CA)
. = ..()
for(var/i in network)
@@ -13,7 +13,7 @@
icon = 'icons/obj/machines/camera.dmi'
icon_state = "camera1"
max_integrity = 150
// Motion, EMP-Proof, X-Ray
// Motion, EMP-Proof, X-ray
var/static/list/possible_upgrades = typecacheof(list(/obj/item/assembly/prox_sensor, /obj/item/stack/sheet/mineral/plasma, /obj/item/analyzer))
var/list/upgrades
var/state = 1
@@ -80,7 +80,7 @@
return FALSE
var/obj/U = locate(/obj) in upgrades
if(U)
to_chat(user, "<span class='notice'>You unattach an upgrade from the assembly.</span>")
to_chat(user, "<span class='notice'>You detach an upgrade from the assembly.</span>")
tool.play_tool_sound(src)
U.forceMove(drop_location())
upgrades -= U
@@ -126,7 +126,7 @@
if(state != 1)
return FALSE
I.play_tool_sound(src)
to_chat(user, "<span class='notice'>You unattach the assembly from its place.</span>")
to_chat(user, "<span class='notice'>You detach the assembly from its place.</span>")
new /obj/item/wallframe/camera(drop_location())
qdel(src)
return TRUE
+3
View File
@@ -10,6 +10,8 @@
if(!isMotion())
. = PROCESS_KILL
return
if(stat & EMPED)
return
if (detectTime > 0)
var/elapsed = world.time - detectTime
if (elapsed > alarm_delay)
@@ -63,6 +65,7 @@
for (var/mob/living/silicon/aiPlayer in GLOB.player_list)
if (status)
aiPlayer.triggerAlarm("Motion", get_area(src), list(src), src)
visible_message("<span class='warning'>A red light flashes on the [src]!</span>")
detectTime = -1
return TRUE
+5 -5
View File
@@ -2,16 +2,16 @@
// EMP
/obj/machinery/camera/emp_proof
start_active = 1
start_active = TRUE
/obj/machinery/camera/emp_proof/Initialize()
. = ..()
upgradeEmpProof()
// X-RAY
// X-ray
/obj/machinery/camera/xray
start_active = 1
start_active = TRUE
icon_state = "xraycam" // Thanks to Krutchen for the icons.
/obj/machinery/camera/xray/Initialize()
@@ -20,7 +20,7 @@
// MOTION
/obj/machinery/camera/motion
start_active = 1
start_active = TRUE
name = "motion-sensitive security camera"
/obj/machinery/camera/motion/Initialize()
@@ -29,7 +29,7 @@
// ALL UPGRADES
/obj/machinery/camera/all
start_active = 1
start_active = TRUE
/obj/machinery/camera/all/Initialize()
. = ..()
+1 -1
View File
@@ -1,6 +1,6 @@
/obj/machinery/computer/aifixer
name = "\improper AI system integrity restorer"
desc = "Used with intelliCards containing nonfunctioning AIs to restore them to working order."
desc = "Used with intelliCards containing nonfunctional AIs to restore them to working order."
req_access = list(ACCESS_CAPTAIN, ACCESS_ROBOTICS, ACCESS_HEADS)
var/mob/living/silicon/ai/occupier = null
var/active = 0
+1 -1
View File
@@ -72,7 +72,7 @@
Reset()
/obj/machinery/computer/arcade/proc/prizevend(mob/user)
user.SendSignal(COMSIG_ADD_MOOD_EVENT, "arcade", /datum/mood_event/arcade)
SEND_SIGNAL(user, COMSIG_ADD_MOOD_EVENT, "arcade", /datum/mood_event/arcade)
if(prob(0.0001)) //1 in a million
new /obj/item/gun/energy/pulse/prize(src)
SSmedals.UnlockMedal(MEDAL_PULSE, usr.client)
+107 -24
View File
@@ -132,7 +132,7 @@
/obj/machinery/computer/security/proc/get_available_cameras()
var/list/L = list()
for (var/obj/machinery/camera/C in GLOB.cameranet.cameras)
if((is_away_level(z) || is_away_level(C.z)) && (C.z != z))//if on away mission, can only recieve feed from same z_level cameras
if((is_away_level(z) || is_away_level(C.z)) && (C.z != z))//if on away mission, can only receive feed from same z_level cameras
continue
L.Add(C)
@@ -152,6 +152,50 @@
D["[C.c_tag][(C.status ? null : " (Deactivated)")]"] = C
return D
// SECURITY MONITORS
/obj/machinery/computer/security/wooden_tv
name = "security camera monitor"
desc = "An old TV hooked into the station's camera network."
icon_state = "television"
icon_keyboard = null
icon_screen = "detective_tv"
clockwork = TRUE //it'd look weird
/obj/machinery/computer/security/mining
name = "outpost camera console"
desc = "Used to access the various cameras on the outpost."
icon_screen = "mining"
icon_keyboard = "mining_key"
network = list("mine", "auxbase")
circuit = /obj/item/circuitboard/computer/mining
/obj/machinery/computer/security/research
name = "research camera console"
desc = "Used to access the various cameras in science."
network = list("rd")
circuit = /obj/item/circuitboard/computer/research
/obj/machinery/computer/security/hos
name = "Head of Security's camera console"
desc = "A custom security console with added access to the labor camp network."
network = list("ss13", "labor")
circuit = null
/obj/machinery/computer/security/labor
name = "labor camp monitoring"
desc = "Used to access the various cameras on the labor camp."
network = list("labor")
circuit = null
/obj/machinery/computer/security/qm
name = "Quartermaster's camera console"
desc = "A console with access to the mining, auxillary base and vault camera networks."
network = list("mine", "auxbase", "vault")
circuit = null
// TELESCREENS
/obj/machinery/computer/security/telescreen
name = "\improper Telescreen"
desc = "Used for watching an empty arena."
@@ -161,7 +205,6 @@
density = FALSE
circuit = null
clockwork = TRUE //it'd look very weird
light_power = 0
/obj/machinery/computer/security/telescreen/update_icon()
@@ -176,28 +219,68 @@
icon = 'icons/obj/status_display.dmi'
icon_state = "entertainment"
network = list("thunder")
density = FALSE
circuit = null
/obj/machinery/computer/security/wooden_tv
name = "security camera monitor"
desc = "An old TV hooked into the stations camera network."
icon_state = "television"
icon_keyboard = null
icon_screen = "detective_tv"
clockwork = TRUE //it'd look weird
/obj/machinery/computer/security/telescreen/rd
name = "Research Director's telescreen"
desc = "Used for watching the AI and the RD's goons from the safety of his office."
network = list("rd", "aicore", "aiupload", "minisat", "xeno", "test")
/obj/machinery/computer/security/mining
name = "outpost camera console"
desc = "Used to access the various cameras on the outpost."
icon_screen = "mining"
icon_keyboard = "mining_key"
network = list("mine")
circuit = /obj/item/circuitboard/computer/mining
/obj/machinery/computer/security/research
name = "research camera console"
desc = "Used to access the various cameras in science."
/obj/machinery/computer/security/telescreen/circuitry
name = "circuitry telescreen"
desc = "Used for watching the other eggheads from the safety of the circuitry lab."
network = list("rd")
circuit = /obj/item/circuitboard/computer/research
/obj/machinery/computer/security/telescreen/ce
name = "Chief Engineer's telescreen"
desc = "Used for watching the engine, telecommunications and the minisat."
network = list("engine", "singularity", "tcomms", "minisat")
/obj/machinery/computer/security/telescreen/cmo
name = "Chief Medical Officer's telescreen"
desc = "A telescreen with access to the medbay's camera network."
network = list("medbay")
/obj/machinery/computer/security/telescreen/vault
name = "Vault monitor"
desc = "A telescreen that connects to the vault's camera network."
network = list("vault")
/obj/machinery/computer/security/telescreen/toxins
name = "Bomb test site monitor"
desc = "A telescreen that connects to the bomb test site's camera."
network = list("toxin")
/obj/machinery/computer/security/telescreen/engine
name = "engine monitor"
desc = "A telescreen that connects to the engine's camera network."
network = list("engine")
/obj/machinery/computer/security/telescreen/turbine
name = "turbine monitor"
desc = "A telescreen that connects to the turbine's camera."
network = list("turbine")
/obj/machinery/computer/security/telescreen/interrogation
name = "interrogation room monitor"
desc = "A telescreen that connects to the interrogation room's camera."
network = list("interrogation")
/obj/machinery/computer/security/telescreen/prison
name = "prison monitor"
desc = "A telescreen that connects to the permabrig's camera network."
network = list("prison")
/obj/machinery/computer/security/telescreen/auxbase
name = "auxillary base monitor"
desc = "A telescreen that connects to the auxillary base's camera."
network = list("auxbase")
/obj/machinery/computer/security/telescreen/minisat
name = "minisat monitor"
desc = "A telescreen that connects to the minisat's camera network."
network = list("minisat")
/obj/machinery/computer/security/telescreen/aiupload
name = "AI upload monitor"
desc = "A telescreen that connects to the AI upload's camera network."
network = list("aiupload")
@@ -159,7 +159,7 @@
/mob/camera/aiEye/remote/update_remote_sight(mob/living/user)
user.see_invisible = SEE_INVISIBLE_LIVING //can't see ghosts through cameras
user.sight = 0
user.sight = SEE_TURFS | SEE_BLACKNESS
user.see_in_dark = 2
return 1
+12 -5
View File
@@ -348,6 +348,12 @@ GLOBAL_VAR_INIT(time_last_changed_position, 0)
/obj/machinery/computer/card/Topic(href, href_list)
if(..())
return
if(!usr.canUseTopic(src, !issilicon(usr)) || !is_operational())
usr.unset_machine()
usr << browse(null, "window=id_com")
return
usr.set_machine(src)
switch(href_list["choice"])
if ("modify")
@@ -532,11 +538,12 @@ GLOBAL_VAR_INIT(time_last_changed_position, 0)
updateUsrDialog()
/obj/machinery/computer/card/AltClick(mob/user)
if(user.canUseTopic(src))
if(scan)
eject_id_scan(user)
if(modify)
eject_id_modify(user)
if(!user.canUseTopic(src, !issilicon(user)) || !is_operational())
return
if(scan)
eject_id_scan(user)
if(modify)
eject_id_modify(user)
/obj/machinery/computer/card/proc/eject_id_scan(mob/user)
if(scan)
@@ -83,7 +83,7 @@
if(obj_flags & EMAGGED)
authenticated = 2
auth_id = "Unknown"
to_chat(M, "<span class='warning'>[src] lets out a quiet alarm as its login is overriden.</span>")
to_chat(M, "<span class='warning'>[src] lets out a quiet alarm as its login is overridden.</span>")
playsound(src, 'sound/machines/terminal_on.ogg', 50, 0)
playsound(src, 'sound/machines/terminal_alert.ogg', 25, 0)
if(prob(25))
+1 -1
View File
@@ -9,7 +9,7 @@
#define RADIATION_DURATION_MAX 30
#define RADIATION_ACCURACY_MULTIPLIER 3 //larger is less accurate
#define RADIATION_IRRADIATION_MULTIPLIER 1 //multiplier for how much radiation a test subject recieves
#define RADIATION_IRRADIATION_MULTIPLIER 1 //multiplier for how much radiation a test subject receives
#define SCANNER_ACTION_SE 1
#define SCANNER_ACTION_UI 2
+1 -1
View File
@@ -329,7 +329,7 @@
src.active2.fields["mi_dis_d"] = t1
if("ma_dis")
if(active2)
var/t1 = stripped_input("Please input major diabilities list:", "Med. records", src.active2.fields["ma_dis"], null)
var/t1 = stripped_input("Please input major disabilities list:", "Med. records", src.active2.fields["ma_dis"], null)
if(!canUseMedicalRecordsConsole(usr, t1, null, a2))
return
src.active2.fields["ma_dis"] = t1
+1 -1
View File
@@ -130,4 +130,4 @@
/obj/machinery/computer/pod/old/swf
name = "\improper Magix System IV"
desc = "An arcane artifact that holds much magic. Running E-Knock 2.2: Sorceror's Edition."
desc = "An arcane artifact that holds much magic. Running E-Knock 2.2: Sorcerer's Edition."
+5 -5
View File
@@ -150,7 +150,7 @@
background = "'background-color:#990000;'"
if("Incarcerated")
background = "'background-color:#CD6500;'"
if("Parolled")
if("Paroled")
background = "'background-color:#CD6500;'"
if("Discharged")
background = "'background-color:#006699;'"
@@ -688,7 +688,7 @@ What a mess.*/
temp += "<li><a href='?src=[REF(src)];choice=Change Criminal Status;criminal2=none'>None</a></li>"
temp += "<li><a href='?src=[REF(src)];choice=Change Criminal Status;criminal2=arrest'>*Arrest*</a></li>"
temp += "<li><a href='?src=[REF(src)];choice=Change Criminal Status;criminal2=incarcerated'>Incarcerated</a></li>"
temp += "<li><a href='?src=[REF(src)];choice=Change Criminal Status;criminal2=parolled'>Parolled</a></li>"
temp += "<li><a href='?src=[REF(src)];choice=Change Criminal Status;criminal2=paroled'>Paroled</a></li>"
temp += "<li><a href='?src=[REF(src)];choice=Change Criminal Status;criminal2=released'>Discharged</a></li>"
temp += "</ul>"
if("rank")
@@ -722,8 +722,8 @@ What a mess.*/
active2.fields["criminal"] = "*Arrest*"
if("incarcerated")
active2.fields["criminal"] = "Incarcerated"
if("parolled")
active2.fields["criminal"] = "Parolled"
if("paroled")
active2.fields["criminal"] = "Paroled"
if("released")
active2.fields["criminal"] = "Discharged"
investigate_log("[active1.fields["name"]] has been set from [old_field] to [active2.fields["criminal"]] by [key_name(usr)].", INVESTIGATE_RECORDS)
@@ -803,7 +803,7 @@ What a mess.*/
if(3)
R.fields["age"] = rand(5, 85)
if(4)
R.fields["criminal"] = pick("None", "*Arrest*", "Incarcerated", "Parolled", "Discharged")
R.fields["criminal"] = pick("None", "*Arrest*", "Incarcerated", "Paroled", "Discharged")
if(5)
R.fields["p_stat"] = pick("*Unconscious*", "Active", "Physically Unfit")
if(6)
+2 -2
View File
@@ -180,7 +180,7 @@
break
if(component_check)
P.play_tool_sound(src)
var/obj/machinery/new_machine = new src.circuit.build_path(src.loc, 1)
var/obj/machinery/new_machine = new circuit.build_path(loc, 1)
new_machine.anchored = anchored
new_machine.on_construction()
for(var/obj/O in new_machine.component_parts)
@@ -219,7 +219,7 @@
req_components[path] -= used_amt
else
added_components[part] = path
if(replacer.SendSignal(COMSIG_TRY_STORAGE_TAKE, part, src))
if(SEND_SIGNAL(replacer, COMSIG_TRY_STORAGE_TAKE, part, src))
req_components[path]--
for(var/obj/item/part in added_components)
+2 -2
View File
@@ -37,7 +37,7 @@
use_power(200)
defib.cell.give(180) //90% efficiency, slightly better than the cell charger's 87.5%
update_icon()
/obj/machinery/defibrillator_mount/update_icon()
cut_overlays()
if(defib)
@@ -69,7 +69,7 @@
if(defib)
to_chat(user, "<span class='warning'>There's already a defibrillator in [src]!</span>")
return
if(I.flags_1 & NODROP_1 || !user.transferItemToLoc(I, src))
if(I.item_flags & NODROP || !user.transferItemToLoc(I, src))
to_chat(user, "<span class='warning'>[I] is stuck to your hand!</span>")
return
user.visible_message("<span class='notice'>[user] hooks up [I] to [src]!</span>", \
+3 -3
View File
@@ -192,7 +192,7 @@
/obj/machinery/door/airlock/check_access_ntnet(datum/netdata/data)
return !requiresID() || ..()
/obj/machinery/door/airlock/ntnet_recieve(datum/netdata/data)
/obj/machinery/door/airlock/ntnet_receive(datum/netdata/data)
// Check if the airlock is powered and can accept control packets.
if(!hasPower() || !canAIControl())
return
@@ -201,7 +201,7 @@
if(!check_access_ntnet(data))
return
// Handle recieved packet.
// Handle received packet.
var/command = lowertext(data.data["data"])
var/command_value = lowertext(data.data["data_secondary"])
switch(command)
@@ -1509,7 +1509,7 @@
else if (safe)
safe = FALSE
else
to_chat(usr, "Firmware reports safeties already overriden.")
to_chat(usr, "Firmware reports safeties already overridden.")
. = TRUE
if("speed-on")
if(wires.is_cut(WIRE_TIMING))
+1 -1
View File
@@ -178,7 +178,7 @@
else if(istype(I, /obj/item/weldingtool))
try_to_weld(I, user)
return 1
else if(!(I.flags_1 & NOBLUDGEON_1) && user.a_intent != INTENT_HARM)
else if(!(I.item_flags & NOBLUDGEON) && user.a_intent != INTENT_HARM)
try_to_activate_door(user)
return 1
return ..()
@@ -97,7 +97,7 @@
"sigtype" = "command"
))
if(memory["pump_status"] == "siphon")
signal.data["stabalize"] = 1
signal.data["stabilize"] = 1
else if(memory["pump_status"] != "release")
signal.data["power"] = 1
post_signal(signal)
@@ -15,7 +15,7 @@
post_signal(new /datum/signal(list(
"tag" = airpump_tag,
"sigtype" = "command",
"stabalize" = 1,
"stabilize" = 1,
"power" = 1
)))
+2 -2
View File
@@ -40,7 +40,7 @@
if (src.on && !(stat & NOPOWER) )
var/turf/location = src.loc
if (isturf(location))
location.hotspot_expose(1000,500,1)
location.hotspot_expose(700,10,1)
return 1
/obj/machinery/igniter/Initialize()
@@ -126,7 +126,7 @@
use_power(1000)
var/turf/location = src.loc
if (isturf(location))
location.hotspot_expose(1000,500,1)
location.hotspot_expose(1000,100,1)
return 1
/obj/machinery/sparker/emp_act(severity)
+1 -1
View File
@@ -874,7 +874,7 @@ GLOBAL_LIST_EMPTY(allCasters)
say("Breaking news from [channel]!")
alert = TRUE
update_icon()
addtimer(CALLBACK(src,.proc/remove_alert),alert_delay,TIMER_OVERRIDE)
addtimer(CALLBACK(src,.proc/remove_alert),alert_delay,TIMER_UNIQUE|TIMER_OVERRIDE)
playsound(loc, 'sound/machines/twobeep.ogg', 75, 1)
else
say("Attention! Wanted issue distributed!")
+1 -1
View File
@@ -245,7 +245,7 @@
visible_message("<span class='warning'>[src]'s door slides open, barraging you with the nauseating smell of charred flesh.</span>")
playsound(src, 'sound/machines/airlockclose.ogg', 25, 1)
for(var/obj/item/I in src) //Scorches away blood and forensic evidence, although the SSU itself is unaffected
I.SendSignal(COMSIG_COMPONENT_CLEAN_ACT, CLEAN_STRONG)
SEND_SIGNAL(I, COMSIG_COMPONENT_CLEAN_ACT, CLEAN_STRONG)
var/datum/component/radioactive/contamination = I.GetComponent(/datum/component/radioactive)
if(contamination)
qdel(contamination)
+4 -4
View File
@@ -509,7 +509,7 @@
w_class = WEIGHT_CLASS_TINY
var/timer = 0
var/detonated = 0
var/existant = 0
var/existent = 0
/obj/item/syndicatedetonator/attack_self(mob/user)
if(timer < world.time)
@@ -517,9 +517,9 @@
if(B.active)
B.detonation_timer = world.time + BUTTON_DELAY
detonated++
existant++
existent++
playsound(user, 'sound/machines/click.ogg', 20, 1)
to_chat(user, "<span class='notice'>[existant] found, [detonated] triggered.</span>")
to_chat(user, "<span class='notice'>[existent] found, [detonated] triggered.</span>")
if(detonated)
var/turf/T = get_turf(src)
detonated--
@@ -528,7 +528,7 @@
message_admins(log_str)
log_game("[key_name(user)] has remotely detonated [detonated ? "syndicate bombs" : "a syndicate bomb"] using a [name] at [AREACOORD(T)]")
detonated = 0
existant = 0
existent = 0
timer = world.time + BUTTON_COOLDOWN
@@ -120,7 +120,7 @@
dat += "<u><font color = #18743E>Data type</font color></u>: Audio File<br>"
dat += "<u><font color = #18743E>Source</font color></u>: <i>Unidentifiable</i><br>"
dat += "<u><font color = #18743E>Class</font color></u>: [race]<br>"
dat += "<u><font color = #18743E>Contents</font color></u>: <i>Unintelligble</i><br>"
dat += "<u><font color = #18743E>Contents</font color></u>: <i>Unintelligible</i><br>"
dat += "</li><br>"
@@ -6,7 +6,7 @@
/obj/machinery/telecomms/allinone
name = "telecommunications mainframe"
icon_state = "comm_server"
desc = "A compact machine used for portable subspace telecommuniations processing."
desc = "A compact machine used for portable subspace telecommunications processing."
density = TRUE
use_power = NO_POWER_USE
idle_power_usage = 0
+1 -2
View File
@@ -28,8 +28,7 @@
/obj/machinery/transformer/examine(mob/user)
. = ..()
if(cooldown && (issilicon(user) || isobserver(user)))
var/seconds_remaining = (cooldown_timer - world.time) / 10
to_chat(user, "It will be ready in [max(0, seconds_remaining)] seconds.")
to_chat(user, "It will be ready in [DisplayTimeText(cooldown_timer - world.time)].")
/obj/machinery/transformer/Destroy()
QDEL_NULL(countdown)
+1 -1
View File
@@ -49,7 +49,7 @@
/obj/machinery/washing_machine/proc/wash_cycle()
for(var/X in contents)
var/atom/movable/AM = X
AM.SendSignal(COMSIG_COMPONENT_CLEAN_ACT, CLEAN_STRENGTH_BLOOD)
SEND_SIGNAL(AM, COMSIG_COMPONENT_CLEAN_ACT, CLEAN_STRENGTH_BLOOD)
AM.machine_wash(src)
busy = FALSE
+43 -5
View File
@@ -78,6 +78,14 @@
name = "\improper KILL CLAMP"
desc = "They won't know what clamped them!"
energy_drain = 0
dam_force = 0
var/real_clamp = FALSE
/obj/item/mecha_parts/mecha_equipment/hydraulic_clamp/kill/real
desc = "They won't know what clamped them! This time for real!"
energy_drain = 10
dam_force = 20
real_clamp = TRUE
/obj/item/mecha_parts/mecha_equipment/hydraulic_clamp/kill/action(atom/target)
if(!action_checks(target))
@@ -108,11 +116,41 @@
if(M.stat == DEAD)
return
if(chassis.occupant.a_intent == INTENT_HARM)
target.visible_message("<span class='danger'>[chassis] destroys [target] in an unholy fury.</span>", \
"<span class='userdanger'>[chassis] destroys [target] in an unholy fury.</span>")
if(chassis.occupant.a_intent == INTENT_DISARM)
target.visible_message("<span class='danger'>[chassis] rips [target]'s arms off.</span>", \
"<span class='userdanger'>[chassis] rips [target]'s arms off.</span>")
if(real_clamp)
M.take_overall_damage(dam_force)
if(!M)
return
M.adjustOxyLoss(round(dam_force/2))
M.updatehealth()
target.visible_message("<span class='danger'>[chassis] destroys [target] in an unholy fury.</span>", \
"<span class='userdanger'>[chassis] destroys [target] in an unholy fury.</span>")
add_logs(chassis.occupant, M, "attacked", "[name]", "(INTENT: [uppertext(chassis.occupant.a_intent)]) (DAMTYE: [uppertext(damtype)])")
else
target.visible_message("<span class='danger'>[chassis] destroys [target] in an unholy fury.</span>", \
"<span class='userdanger'>[chassis] destroys [target] in an unholy fury.</span>")
else if(chassis.occupant.a_intent == INTENT_DISARM)
if(real_clamp)
var/mob/living/carbon/C = target
var/play_sound = FALSE
var/limbs_gone = ""
var/obj/item/bodypart/affected = C.get_bodypart(BODY_ZONE_L_ARM)
if(affected != null)
affected.dismember(damtype)
play_sound = TRUE
limbs_gone = ", [affected]"
affected = C.get_bodypart(BODY_ZONE_R_ARM)
if(affected != null)
affected.dismember(damtype)
play_sound = TRUE
limbs_gone = "[limbs_gone], [affected]"
if(play_sound)
playsound(src, get_dismember_sound(), 80, TRUE)
target.visible_message("<span class='danger'>[chassis] rips [target]'s arms off.</span>", \
"<span class='userdanger'>[chassis] rips [target]'s arms off.</span>")
add_logs(chassis.occupant, M, "dismembered of[limbs_gone],", "[name]", "(INTENT: [uppertext(chassis.occupant.a_intent)]) (DAMTYE: [uppertext(damtype)])")
else
target.visible_message("<span class='danger'>[chassis] rips [target]'s arms off.</span>", \
"<span class='userdanger'>[chassis] rips [target]'s arms off.</span>")
else
step_away(M,chassis)
target.visible_message("[chassis] tosses [target] like a piece of paper.")

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