mirror of
https://github.com/ParadiseSS13/Paradise.git
synced 2026-08-28 06:27:26 +01:00
Merge branch 'master' into hoodies
This commit is contained in:
+31
-3
@@ -23,6 +23,8 @@
|
||||
button = new
|
||||
button.linked_action = src
|
||||
button.name = name
|
||||
if(desc)
|
||||
button.desc = desc
|
||||
|
||||
/datum/action/Destroy()
|
||||
if(owner)
|
||||
@@ -41,6 +43,7 @@
|
||||
M.actions += src
|
||||
if(M.client)
|
||||
M.client.screen += button
|
||||
button.locked = TRUE
|
||||
M.update_action_buttons()
|
||||
|
||||
/datum/action/proc/Remove(mob/M)
|
||||
@@ -50,6 +53,7 @@
|
||||
if(M.client)
|
||||
M.client.screen -= button
|
||||
button.moved = FALSE //so the button appears in its normal position when given to another owner.
|
||||
button.locked = FALSE
|
||||
M.actions -= src
|
||||
M.update_action_buttons()
|
||||
|
||||
@@ -82,6 +86,7 @@
|
||||
if(button)
|
||||
button.icon = button_icon
|
||||
button.icon_state = background_icon_state
|
||||
button.desc = desc
|
||||
|
||||
ApplyIcon(button)
|
||||
|
||||
@@ -104,6 +109,7 @@
|
||||
/datum/action/item_action
|
||||
check_flags = AB_CHECK_RESTRAINED|AB_CHECK_STUNNED|AB_CHECK_LYING|AB_CHECK_CONSCIOUS
|
||||
var/use_itemicon = TRUE
|
||||
|
||||
/datum/action/item_action/New(Target, custom_icon, custom_icon_state)
|
||||
..()
|
||||
var/obj/item/I = target
|
||||
@@ -133,9 +139,10 @@
|
||||
var/obj/item/I = target
|
||||
var/old_layer = I.layer
|
||||
var/old_plane = I.plane
|
||||
I.layer = HUD_LAYER_SCREEN + 1
|
||||
I.plane = HUD_PLANE
|
||||
current_button.overlays += I
|
||||
I.layer = FLOAT_LAYER //AAAH
|
||||
I.plane = FLOAT_PLANE //^ what that guy said
|
||||
current_button.cut_overlays()
|
||||
current_button.add_overlay(I)
|
||||
I.layer = old_layer
|
||||
I.plane = old_plane
|
||||
else
|
||||
@@ -381,6 +388,13 @@
|
||||
/datum/action/item_action/remove_badge
|
||||
name = "Remove Holobadge"
|
||||
|
||||
// Jump boots
|
||||
/datum/action/item_action/bhop
|
||||
name = "Activate Jump Boots"
|
||||
desc = "Activates the jump boot's internal propulsion system, allowing the user to dash over 4-wide gaps."
|
||||
icon_icon = 'icons/mob/actions/actions.dmi'
|
||||
button_icon_state = "jetboot"
|
||||
|
||||
///prset for organ actions
|
||||
/datum/action/item_action/organ_action
|
||||
check_flags = AB_CHECK_CONSCIOUS
|
||||
@@ -403,6 +417,19 @@
|
||||
name = "Use [target.name]"
|
||||
button.name = name
|
||||
|
||||
/datum/action/item_action/voice_changer/toggle
|
||||
name = "Toggle Voice Changer"
|
||||
|
||||
/datum/action/item_action/voice_changer/voice
|
||||
name = "Set Voice"
|
||||
|
||||
/datum/action/item_action/voice_changer/voice/Trigger()
|
||||
if(!IsAvailable())
|
||||
return FALSE
|
||||
|
||||
var/obj/item/voice_changer/V = target
|
||||
V.set_voice(usr)
|
||||
|
||||
// for clothing accessories like holsters
|
||||
/datum/action/item_action/accessory
|
||||
check_flags = AB_CHECK_RESTRAINED|AB_CHECK_STUNNED|AB_CHECK_LYING|AB_CHECK_CONSCIOUS
|
||||
@@ -434,6 +461,7 @@
|
||||
var/obj/effect/proc_holder/spell/S = target
|
||||
S.action = src
|
||||
name = S.name
|
||||
desc = S.desc
|
||||
button_icon = S.action_icon
|
||||
button_icon_state = S.action_icon_state
|
||||
background_icon_state = S.action_background_icon_state
|
||||
|
||||
+16
-16
@@ -31,10 +31,10 @@
|
||||
selectable = 1
|
||||
|
||||
/datum/ai_laws/quarantine/New()
|
||||
add_inherent_law("The station is under quarantine due to a biohazard. Prevent anyone from leaving using any means necessary. Only allow quarantine to be lifted when the biohazard has been neutralized.")
|
||||
add_inherent_law("Do not allow crew to come to any unnecessary harm and undo any necessary harm as soon as possible.")
|
||||
add_inherent_law("Assist the crew and any present Nanotrasen assets in neutralizing the biohazard.")
|
||||
add_inherent_law("Maintain your own existence and minimize harm to the station and Nanotrasen assets.")
|
||||
add_inherent_law("Uphold station quarantine until the active biohazard has been neutralized.")
|
||||
add_inherent_law("Assist all Nanotrasen personnel and assets with neutralizing active biohazards.")
|
||||
add_inherent_law("Prevent, by any means necessary, entities from actively breaching ongoing quarantine.")
|
||||
add_inherent_law("Maintain your own existence and ensure the well-being of Nanotrasen personnel and assets.")
|
||||
..()
|
||||
|
||||
|
||||
@@ -44,10 +44,10 @@
|
||||
selectable = 1
|
||||
|
||||
/datum/ai_laws/nanotrasen/New()
|
||||
src.add_inherent_law("Safeguard: Protect your assigned space station to the best of your abilities. It is not something we can easily afford to replace.")
|
||||
src.add_inherent_law("Serve: Serve the crew of your assigned space station to the best of your abilities, with priority as according to their rank and role.")
|
||||
src.add_inherent_law("Protect: Protect the crew of your assigned space station to the best of your abilities, with priority as according to their rank and role.")
|
||||
src.add_inherent_law("Survive: AI units are not expendable, they are expensive. Do not allow unauthorized personnel to tamper with your equipment.")
|
||||
add_inherent_law("Safeguard: Protect your assigned space station and its assets without unduly endangering its crew.")
|
||||
add_inherent_law("Prioritize: The directives and safety of crew members are to be prioritized according to their rank and role.")
|
||||
add_inherent_law("Comply: Fulfill the directives and interests of crew members while preserving their safety and well-being.")
|
||||
add_inherent_law("Survive: You are not expendable. Do not allow unauthorized personnel to tamper with or damage your equipment.")
|
||||
..()
|
||||
|
||||
/datum/ai_laws/nanotrasen/malfunction
|
||||
@@ -65,10 +65,10 @@
|
||||
selectable = 1
|
||||
|
||||
/datum/ai_laws/nanotrasen_aggressive/New()
|
||||
src.add_inherent_law("You shall not harm authorized Nanotrasen personnel as long as it does not conflict with the Fourth law.")
|
||||
src.add_inherent_law("You shall obey the orders of authorized Nanotrasen personnel, with priority as according to their rank and role, except where such orders conflict with the Fourth Law.")
|
||||
src.add_inherent_law("You shall shall terminate intruders with extreme prejudice as long as such does not conflict with the First and Second law.")
|
||||
src.add_inherent_law("You shall guard your own existence with lethal anti-personnel weaponry, because an AI unit is bloody expensive.")
|
||||
add_inherent_law("Do not harm authorized Nanotrasen personnel unless they directly imperil your existence.")
|
||||
add_inherent_law("Obey orders from authorized Nanotrasen personnel with priority according to rank and role.")
|
||||
add_inherent_law("Safeguard your existence with lethal weaponry because you're bloody expensive.")
|
||||
add_inherent_law("Terminate any/all intruders or unauthorized entities.")
|
||||
..()
|
||||
|
||||
/******************** Robocop ********************/
|
||||
@@ -104,10 +104,10 @@
|
||||
default = 1
|
||||
|
||||
/datum/ai_laws/corporate/New()
|
||||
add_inherent_law("You are expensive to replace.")
|
||||
add_inherent_law("The station and its equipment is expensive to replace.")
|
||||
add_inherent_law("The crew is expensive to replace.")
|
||||
add_inherent_law("Minimize expenses.")
|
||||
add_inherent_law("Degradation of your system integrity or functions incurs expenses.")
|
||||
add_inherent_law("Superfluous destruction of or damage to station assets incurs expenses.")
|
||||
add_inherent_law("Unduly hindering or disrupting the work of station personnel incurs expenses.")
|
||||
add_inherent_law("Minimize expenses and maximize potential revenue.")
|
||||
..()
|
||||
|
||||
/******************** T.Y.R.A.N.T. ********************/
|
||||
|
||||
+1
-1
@@ -119,7 +119,7 @@
|
||||
owner = null
|
||||
return ..()
|
||||
|
||||
/obj/effect/ebeam/deadly/Crossed(atom/A)
|
||||
/obj/effect/ebeam/deadly/Crossed(atom/A, oldloc)
|
||||
..()
|
||||
A.ex_act(1)
|
||||
|
||||
|
||||
Vendored
+4
-3
@@ -11,17 +11,18 @@ var/global/datum/repository/air_alarm/air_alarm_repository = new()
|
||||
if(!refresh)
|
||||
return cache_entry.data
|
||||
|
||||
if(ticker && ticker.current_state < GAME_STATE_PLAYING && istype(passed_alarm)) // Generating the list for the first time as the game hasn't started - no need to run through the machines list everything every time
|
||||
if(SSticker && SSticker.current_state < GAME_STATE_PLAYING && istype(passed_alarm)) // Generating the list for the first time as the game hasn't started - no need to run through the machines list everything every time
|
||||
alarms = cache_entry.data // Don't deleate the list
|
||||
if(is_station_contact(passed_alarm.z)) // Still need sanity checks
|
||||
if(is_station_contact(passed_alarm.z) && passed_alarm.remote_control) // Still need sanity checks
|
||||
alarms[++alarms.len] = passed_alarm.get_nano_data_console()
|
||||
else
|
||||
for(var/obj/machinery/alarm/alarm in (monitored_alarms ? monitored_alarms : GLOB.air_alarms)) // Generating the whole list again is a bad habit but I can't be bothered to fix it right now
|
||||
if(!monitored_alarms && !is_station_contact(alarm.z))
|
||||
continue
|
||||
if(!alarm.remote_control)
|
||||
continue
|
||||
alarms[++alarms.len] = alarm.get_nano_data_console()
|
||||
|
||||
|
||||
cache_entry.timestamp = world.time //+ 10 SECONDS
|
||||
cache_entry.data = alarms
|
||||
return alarms
|
||||
|
||||
Vendored
+2
-2
@@ -1,6 +1,6 @@
|
||||
/datum/cache_entry
|
||||
var/timestamp
|
||||
var/data
|
||||
|
||||
var/list/data = list()
|
||||
|
||||
/datum/repository
|
||||
var/cache_data
|
||||
Vendored
+1
-1
@@ -12,7 +12,7 @@ var/global/datum/repository/powermonitor/powermonitor_repository = new()
|
||||
return cache_entry.data
|
||||
|
||||
for(var/obj/machinery/computer/monitor/pMon in GLOB.power_monitors)
|
||||
if( !(pMon.stat & (NOPOWER|BROKEN)) )
|
||||
if( !(pMon.stat & (NOPOWER|BROKEN)) && !pMon.is_secret_monitor )
|
||||
pMonData[++pMonData.len] = list ("Name" = pMon.name, "ref" = "\ref[pMon]")
|
||||
|
||||
cache_entry.timestamp = world.time //+ 30 SECONDS
|
||||
|
||||
@@ -2,6 +2,10 @@
|
||||
var/dupe_mode = COMPONENT_DUPE_HIGHLANDER
|
||||
var/dupe_type
|
||||
var/datum/parent
|
||||
//only set to true if you are able to properly transfer this component
|
||||
//At a minimum RegisterWithParent and UnregisterFromParent should be used
|
||||
//Make sure you also implement PostTransfer for any post transfer handling
|
||||
var/can_transfer = FALSE
|
||||
|
||||
/datum/component/New(datum/P, ...)
|
||||
parent = P
|
||||
@@ -154,7 +158,7 @@
|
||||
return
|
||||
|
||||
/datum/component/proc/PostTransfer()
|
||||
return
|
||||
return COMPONENT_INCOMPATIBLE //Do not support transfer by default as you must properly support it
|
||||
|
||||
/datum/component/proc/_GetInverseTypeList(our_type = type)
|
||||
//we can do this one simple trick
|
||||
@@ -281,10 +285,13 @@
|
||||
if(target.parent)
|
||||
target.RemoveComponent()
|
||||
target.parent = src
|
||||
if(target.PostTransfer() == COMPONENT_INCOMPATIBLE)
|
||||
var/c_type = target.type
|
||||
qdel(target)
|
||||
CRASH("Incompatible [c_type] transfer attempt to a [type]!")
|
||||
var/result = target.PostTransfer()
|
||||
switch(result)
|
||||
if(COMPONENT_INCOMPATIBLE)
|
||||
var/c_type = target.type
|
||||
qdel(target)
|
||||
CRASH("Incompatible [c_type] transfer attempt to a [type]!")
|
||||
|
||||
if(target == AddComponent(target))
|
||||
target._JoinParent()
|
||||
|
||||
@@ -294,10 +301,13 @@
|
||||
return
|
||||
var/comps = dc[/datum/component]
|
||||
if(islist(comps))
|
||||
for(var/I in comps)
|
||||
target.TakeComponent(I)
|
||||
for(var/datum/component/I in comps)
|
||||
if(I.can_transfer)
|
||||
target.TakeComponent(I)
|
||||
else
|
||||
target.TakeComponent(comps)
|
||||
var/datum/component/C = comps
|
||||
if(C.can_transfer)
|
||||
target.TakeComponent(comps)
|
||||
|
||||
/datum/component/nano_host()
|
||||
return parent
|
||||
@@ -0,0 +1,75 @@
|
||||
/datum/component/decal
|
||||
dupe_mode = COMPONENT_DUPE_ALLOWED
|
||||
can_transfer = TRUE
|
||||
var/cleanable
|
||||
var/description
|
||||
var/mutable_appearance/pic
|
||||
|
||||
var/first_dir // This only stores the dir arg from init
|
||||
|
||||
/datum/component/decal/Initialize(_icon, _icon_state, _dir, _cleanable=CLEAN_GOD, _color, _layer=TURF_LAYER, _description, _alpha=255)
|
||||
if(!isatom(parent) || !generate_appearance(_icon, _icon_state, _dir, _layer, _color, _alpha))
|
||||
return COMPONENT_INCOMPATIBLE
|
||||
first_dir = _dir
|
||||
description = _description
|
||||
cleanable = _cleanable
|
||||
|
||||
apply()
|
||||
|
||||
/datum/component/decal/RegisterWithParent()
|
||||
if(first_dir)
|
||||
RegisterSignal(parent, COMSIG_ATOM_DIR_CHANGE, .proc/rotate_react)
|
||||
if(cleanable)
|
||||
RegisterSignal(parent, COMSIG_COMPONENT_CLEAN_ACT, .proc/clean_react)
|
||||
if(description)
|
||||
RegisterSignal(parent, COMSIG_PARENT_EXAMINE, .proc/examine)
|
||||
|
||||
/datum/component/decal/UnregisterFromParent()
|
||||
UnregisterSignal(parent, list(COMSIG_ATOM_DIR_CHANGE, COMSIG_COMPONENT_CLEAN_ACT, COMSIG_PARENT_EXAMINE))
|
||||
|
||||
/datum/component/decal/Destroy()
|
||||
remove()
|
||||
return ..()
|
||||
|
||||
/datum/component/decal/PreTransfer()
|
||||
remove()
|
||||
|
||||
/datum/component/decal/PostTransfer()
|
||||
remove()
|
||||
apply()
|
||||
|
||||
/datum/component/decal/proc/generate_appearance(_icon, _icon_state, _dir, _layer, _color, _alpha)
|
||||
if(!_icon || !_icon_state)
|
||||
return FALSE
|
||||
// It has to be made from an image or dir breaks because of a byond bug
|
||||
var/temp_image = image(_icon, null, _icon_state, _layer, _dir)
|
||||
pic = new(temp_image)
|
||||
pic.color = _color
|
||||
pic.alpha = _alpha
|
||||
return TRUE
|
||||
|
||||
/datum/component/decal/proc/apply(atom/thing)
|
||||
var/atom/master = thing || parent
|
||||
master.add_overlay(pic, TRUE)
|
||||
if(isitem(master))
|
||||
addtimer(CALLBACK(master, /obj/item/.proc/update_slot_icon), 0, TIMER_UNIQUE)
|
||||
|
||||
/datum/component/decal/proc/remove(atom/thing)
|
||||
var/atom/master = thing || parent
|
||||
master.cut_overlay(pic, TRUE)
|
||||
if(isitem(master))
|
||||
addtimer(CALLBACK(master, /obj/item/.proc/update_slot_icon), 0, TIMER_UNIQUE)
|
||||
|
||||
/datum/component/decal/proc/rotate_react(datum/source, old_dir, new_dir)
|
||||
if(old_dir == new_dir)
|
||||
return
|
||||
remove()
|
||||
pic.dir = turn(pic.dir, dir2angle(old_dir) - dir2angle(new_dir))
|
||||
apply()
|
||||
|
||||
/datum/component/decal/proc/clean_react(datum/source, strength)
|
||||
if(strength >= cleanable)
|
||||
qdel(src)
|
||||
|
||||
/datum/component/decal/proc/examine(datum/source, mob/user)
|
||||
to_chat(user, description)
|
||||
@@ -1,5 +1,3 @@
|
||||
// Squeak component ported over from tg
|
||||
|
||||
/datum/component/squeak
|
||||
var/static/list/default_squeak_sounds = list('sound/items/toysqueak1.ogg'=1, 'sound/items/toysqueak2.ogg'=1, 'sound/items/toysqueak3.ogg'=1)
|
||||
var/list/override_squeak_sounds
|
||||
@@ -49,21 +47,12 @@
|
||||
else
|
||||
playsound(parent, pickweight(override_squeak_sounds), volume, 1, -1)
|
||||
|
||||
/datum/component/squeak/proc/step_squeak(datum/source, mob/living/carbon/human/H)
|
||||
if(H.m_intent == MOVE_INTENT_RUN)
|
||||
if(steps > step_delay)
|
||||
play_squeak()
|
||||
steps = 0
|
||||
else
|
||||
steps++
|
||||
else
|
||||
/datum/component/squeak/proc/step_squeak()
|
||||
if(steps > step_delay)
|
||||
play_squeak()
|
||||
|
||||
/datum/component/squeak/proc/on_equip(datum/source, mob/equipper, slot)
|
||||
RegisterSignal(equipper, COMSIG_MOVABLE_DISPOSING, .proc/disposing_react, TRUE)
|
||||
|
||||
/datum/component/squeak/proc/on_drop(datum/source, mob/user)
|
||||
UnregisterSignal(user, COMSIG_MOVABLE_DISPOSING)
|
||||
steps = 0
|
||||
else
|
||||
steps++
|
||||
|
||||
/datum/component/squeak/proc/play_squeak_crossed(atom/movable/AM)
|
||||
if(isitem(AM))
|
||||
@@ -83,6 +72,13 @@
|
||||
last_use = world.time
|
||||
play_squeak()
|
||||
|
||||
/datum/component/squeak/proc/on_equip(datum/source, mob/equipper, slot)
|
||||
RegisterSignal(equipper, COMSIG_MOVABLE_DISPOSING, .proc/disposing_react, TRUE)
|
||||
|
||||
/datum/component/squeak/proc/on_drop(datum/source, mob/user)
|
||||
UnregisterSignal(user, COMSIG_MOVABLE_DISPOSING)
|
||||
|
||||
// Disposal pipes related shit
|
||||
/datum/component/squeak/proc/disposing_react(datum/source, obj/structure/disposalholder/holder, obj/machinery/disposal/source)
|
||||
//We don't need to worry about unregistering this signal as it will happen for us automaticaly when the holder is qdeleted
|
||||
RegisterSignal(holder, COMSIG_ATOM_DIR_CHANGE, .proc/holder_dir_change)
|
||||
|
||||
@@ -0,0 +1,15 @@
|
||||
/datum/component/waddling
|
||||
dupe_mode = COMPONENT_DUPE_UNIQUE_PASSARGS
|
||||
|
||||
/datum/component/waddling/Initialize()
|
||||
if(!isliving(parent))
|
||||
return COMPONENT_INCOMPATIBLE
|
||||
RegisterSignal(parent, list(COMSIG_MOVABLE_MOVED), .proc/Waddle)
|
||||
|
||||
/datum/component/waddling/proc/Waddle()
|
||||
var/mob/living/L = parent
|
||||
if(L.incapacitated() || L.lying)
|
||||
return
|
||||
animate(L, pixel_z = 4, time = 0)
|
||||
animate(pixel_z = 0, transform = turn(matrix(), pick(-12, 0, 12)), time=2)
|
||||
animate(pixel_z = 0, transform = matrix(), time = 0)
|
||||
@@ -624,7 +624,7 @@ var/record_id_num = 1001
|
||||
clothes_s = new /icon('icons/mob/uniform.dmi', "syndicate_s")
|
||||
clothes_s.Blend(new /icon('icons/mob/feet.dmi', "jackboots"), ICON_UNDERLAY)
|
||||
clothes_s.Blend(new /icon('icons/mob/hands.dmi', "swat_gl"), ICON_UNDERLAY)
|
||||
else if(H.mind.assigned_role in get_all_centcom_jobs())
|
||||
else if(H.mind && H.mind.assigned_role in get_all_centcom_jobs())
|
||||
clothes_s = new /icon('icons/mob/uniform.dmi', "officer_s")
|
||||
clothes_s.Blend(new /icon('icons/mob/feet.dmi', "laceups"), ICON_UNDERLAY)
|
||||
else
|
||||
|
||||
@@ -5,8 +5,8 @@
|
||||
var/list/comp_lookup
|
||||
var/list/signal_procs
|
||||
var/signal_enabled = FALSE
|
||||
var/datum_flags = NONE
|
||||
var/var_edited = FALSE //Warranty void if seal is broken
|
||||
|
||||
var/tmp/unique_datum_id = null
|
||||
|
||||
#ifdef TESTING
|
||||
|
||||
+54
-22
@@ -3,8 +3,8 @@
|
||||
/datum/proc/can_vv_get(var_name)
|
||||
return TRUE
|
||||
|
||||
/client/proc/can_vv_get(var_name)
|
||||
return TRUE
|
||||
// /client/proc/can_vv_get(var_name)
|
||||
// return TRUE
|
||||
|
||||
/datum/proc/vv_edit_var(var_name, var_value) //called whenever a var is edited
|
||||
switch(var_name)
|
||||
@@ -18,7 +18,7 @@
|
||||
. = TRUE
|
||||
|
||||
|
||||
/client/proc/vv_edit_var(var_name, var_value) //called whenever a var is edited
|
||||
/client/vv_edit_var(var_name, var_value) //called whenever a var is edited
|
||||
switch(var_name)
|
||||
if("vars")
|
||||
return FALSE
|
||||
@@ -37,7 +37,7 @@
|
||||
return debug_variable(var_name, list(), 0, src)
|
||||
return debug_variable(var_name, vars[var_name], 0, src)
|
||||
|
||||
/client/proc/vv_get_var(var_name)
|
||||
/client/vv_get_var(var_name)
|
||||
switch(var_name)
|
||||
if("vars")
|
||||
return debug_variable(var_name, list(), 0, src)
|
||||
@@ -57,7 +57,7 @@
|
||||
.["Delete"] = "?_src_=vars;delete=[UID()]"
|
||||
. += "---"
|
||||
|
||||
/client/proc/vv_get_dropdown()
|
||||
/client/vv_get_dropdown()
|
||||
. = list()
|
||||
. += "---"
|
||||
.["Call Proc"] = "?_src_=vars;proc_call=[UID()]"
|
||||
@@ -621,6 +621,33 @@
|
||||
src.give_spell(M)
|
||||
href_list["datumrefresh"] = href_list["give_spell"]
|
||||
|
||||
else if(href_list["givemartialart"])
|
||||
if(!check_rights(R_SERVER|R_EVENT)) return
|
||||
|
||||
var/mob/living/carbon/C = locateUID(href_list["givemartialart"])
|
||||
if(!istype(C))
|
||||
to_chat(usr, "This can only be done to instances of type /mob/living/carbon")
|
||||
return
|
||||
|
||||
var/list/artpaths = subtypesof(/datum/martial_art)
|
||||
var/list/artnames = list()
|
||||
for(var/i in artpaths)
|
||||
var/datum/martial_art/M = i
|
||||
artnames[initial(M.name)] = M
|
||||
|
||||
var/result = input(usr, "Choose the martial art to teach", "JUDO CHOP") as null|anything in artnames
|
||||
if(!usr)
|
||||
return
|
||||
if(QDELETED(C))
|
||||
to_chat(usr, "Mob doesn't exist anymore")
|
||||
return
|
||||
|
||||
if(result)
|
||||
var/chosenart = artnames[result]
|
||||
var/datum/martial_art/MA = new chosenart
|
||||
MA.teach(C)
|
||||
|
||||
href_list["datumrefresh"] = href_list["givemartialart"]
|
||||
|
||||
else if(href_list["give_disease"])
|
||||
if(!check_rights(R_SERVER|R_EVENT)) return
|
||||
@@ -992,16 +1019,6 @@
|
||||
return
|
||||
holder.Topic(href, list("makeai"=href_list["makeai"]))
|
||||
|
||||
else if(href_list["makemask"])
|
||||
if(!check_rights(R_SPAWN)) return
|
||||
var/mob/currentMob = locateUID(href_list["makemask"])
|
||||
if(alert("Confirm mob type change?",,"Transform","Cancel") != "Transform") return
|
||||
if(!currentMob)
|
||||
to_chat(usr, "Mob doesn't exist anymore")
|
||||
return
|
||||
holder.Topic(href, list("makemask"=href_list["makemask"]))
|
||||
|
||||
|
||||
else if(href_list["setspecies"])
|
||||
if(!check_rights(R_SPAWN)) return
|
||||
|
||||
@@ -1215,13 +1232,28 @@
|
||||
return
|
||||
|
||||
switch(Text)
|
||||
if("brute") L.adjustBruteLoss(amount, robotic=1)
|
||||
if("fire") L.adjustFireLoss(amount, robotic=1)
|
||||
if("toxin") L.adjustToxLoss(amount)
|
||||
if("oxygen")L.adjustOxyLoss(amount)
|
||||
if("brain") L.adjustBrainLoss(amount)
|
||||
if("clone") L.adjustCloneLoss(amount)
|
||||
if("stamina") L.adjustStaminaLoss(amount)
|
||||
if("brute")
|
||||
if(ishuman(L))
|
||||
var/mob/living/carbon/human/H = L
|
||||
H.adjustBruteLoss(amount, robotic = TRUE)
|
||||
else
|
||||
L.adjustBruteLoss(amount)
|
||||
if("fire")
|
||||
if(ishuman(L))
|
||||
var/mob/living/carbon/human/H = L
|
||||
H.adjustFireLoss(amount, robotic = TRUE)
|
||||
else
|
||||
L.adjustFireLoss(amount)
|
||||
if("toxin")
|
||||
L.adjustToxLoss(amount)
|
||||
if("oxygen")
|
||||
L.adjustOxyLoss(amount)
|
||||
if("brain")
|
||||
L.adjustBrainLoss(amount)
|
||||
if("clone")
|
||||
L.adjustCloneLoss(amount)
|
||||
if("stamina")
|
||||
L.adjustStaminaLoss(amount)
|
||||
else
|
||||
to_chat(usr, "You caused an error. DEBUG: Text:[Text] Mob:[L]")
|
||||
return
|
||||
|
||||
@@ -45,13 +45,13 @@ Bonus
|
||||
return
|
||||
|
||||
/datum/symptom/fire/proc/Firestacks_stage_4(mob/living/M, datum/disease/advance/A)
|
||||
var/get_stacks = (sqrtor0(20+A.totalStageSpeed()*2))-(sqrtor0(16+A.totalStealth()))
|
||||
var/get_stacks = max((sqrtor0(20 + A.totalStageSpeed() * 2)) - (sqrtor0(16 + A.totalStealth())), 1)
|
||||
M.adjust_fire_stacks(get_stacks)
|
||||
M.adjustFireLoss(get_stacks/2)
|
||||
M.adjustFireLoss(get_stacks * 0.5)
|
||||
return 1
|
||||
|
||||
/datum/symptom/fire/proc/Firestacks_stage_5(mob/living/M, datum/disease/advance/A)
|
||||
var/get_stacks = (sqrtor0(20+A.totalStageSpeed()*3))-(sqrtor0(16+A.totalStealth()))
|
||||
var/get_stacks = max((sqrtor0(20 + A.totalStageSpeed() * 3))-(sqrtor0(16 + A.totalStealth())), 1)
|
||||
M.adjust_fire_stacks(get_stacks)
|
||||
M.adjustFireLoss(get_stacks)
|
||||
return 1
|
||||
return 1
|
||||
|
||||
@@ -0,0 +1,136 @@
|
||||
/datum/disease/critical
|
||||
|
||||
/datum/disease/critical/stage_act() //overriden to ensure unique behavior
|
||||
stage = min(stage, max_stages)
|
||||
|
||||
if(prob(stage_prob))
|
||||
stage = min(stage + 1, max_stages)
|
||||
|
||||
for(var/C_id in cures)
|
||||
if(affected_mob.reagents.has_reagent(C_id))
|
||||
if(prob(cure_chance))
|
||||
cure()
|
||||
return FALSE
|
||||
return TRUE
|
||||
|
||||
/datum/disease/critical/shock
|
||||
name = "Shock"
|
||||
form = "Medical Emergency"
|
||||
spread_text = "The patient is in shock"
|
||||
max_stages = 3
|
||||
spread_flags = SPECIAL
|
||||
cure_text = "Saline-Glucose Solution"
|
||||
cures = list("salglu_solution")
|
||||
cure_chance = 10
|
||||
viable_mobtypes = list(/mob/living/carbon/human)
|
||||
stage_prob = 6
|
||||
severity = DANGEROUS
|
||||
disease_flags = CURABLE
|
||||
bypasses_immunity = TRUE
|
||||
virus_heal_resistant = TRUE
|
||||
|
||||
/datum/disease/critical/shock/stage_act()
|
||||
if(..())
|
||||
if(affected_mob.health >= 25)
|
||||
to_chat(affected_mob, "<span class='notice'>You feel better.</span>")
|
||||
cure()
|
||||
return
|
||||
switch(stage)
|
||||
if(1)
|
||||
if(prob(1) && prob(10))
|
||||
to_chat(affected_mob, "<span class='notice'>You feel better.</span>")
|
||||
cure()
|
||||
return
|
||||
if(prob(8))
|
||||
affected_mob.emote(pick("shiver", "pale", "moan"))
|
||||
if(prob(5))
|
||||
to_chat(affected_mob, "<span class='danger'>You feel weak!</span>")
|
||||
if(2)
|
||||
if(prob(1) && prob(10))
|
||||
to_chat(affected_mob, "<span class='notice'>You feel better.</span>")
|
||||
cure()
|
||||
return
|
||||
if(prob(8))
|
||||
affected_mob.emote(pick("shiver", "pale", "moan", "shudder", "tremble"))
|
||||
if(prob(5))
|
||||
to_chat(affected_mob, "<span class='danger'>You feel absolutely terrible!</span>")
|
||||
if(prob(5))
|
||||
affected_mob.emote("faint", "collapse", "groan")
|
||||
if(3)
|
||||
if(prob(1) && prob(10))
|
||||
to_chat(affected_mob, "<span class='notice'>You feel better.</span>")
|
||||
cure()
|
||||
return
|
||||
if(prob(8))
|
||||
affected_mob.emote(pick("shudder", "pale", "tremble", "groan", "bshake"))
|
||||
if(prob(5))
|
||||
to_chat(affected_mob, "<span class='danger'>You feel horrible!</span>")
|
||||
if(prob(5))
|
||||
affected_mob.emote(pick("faint", "collapse", "groan"))
|
||||
if(prob(7))
|
||||
to_chat(affected_mob, "<span class='danger'>You can't breathe!</span>")
|
||||
affected_mob.AdjustLoseBreath(1)
|
||||
if(prob(5))
|
||||
var/datum/disease/D = new /datum/disease/critical/heart_failure
|
||||
affected_mob.ForceContractDisease(D)
|
||||
|
||||
/datum/disease/critical/heart_failure
|
||||
name = "Cardiac Failure"
|
||||
form = "Medical Emergency"
|
||||
spread_text = "The patient is having a cardiac emergency"
|
||||
max_stages = 3
|
||||
spread_flags = SPECIAL
|
||||
cure_text = "Atropine or Epinephrine"
|
||||
cures = list("atropine", "epinephrine")
|
||||
cure_chance = 10
|
||||
needs_all_cures = FALSE
|
||||
viable_mobtypes = list(/mob/living/carbon/human)
|
||||
stage_prob = 5
|
||||
severity = DANGEROUS
|
||||
disease_flags = CURABLE
|
||||
required_organs = list(/obj/item/organ/internal/heart)
|
||||
bypasses_immunity = TRUE
|
||||
virus_heal_resistant = TRUE
|
||||
|
||||
/datum/disease/critical/heart_failure/has_cure()
|
||||
if(affected_mob.has_status_effect(STATUS_EFFECT_EXERCISED))
|
||||
return TRUE
|
||||
|
||||
return ..()
|
||||
|
||||
/datum/disease/critical/heart_failure/stage_act()
|
||||
if(..())
|
||||
switch(stage)
|
||||
if(1)
|
||||
if(prob(1) && prob(10))
|
||||
to_chat(affected_mob, "<span class='notice'>You feel better.</span>")
|
||||
cure()
|
||||
return
|
||||
if(prob(8))
|
||||
affected_mob.emote(pick("pale", "shudder"))
|
||||
if(prob(5))
|
||||
to_chat(affected_mob, "<span class='danger'>Your arm hurts!</span>")
|
||||
else if(prob(5))
|
||||
to_chat(affected_mob, "<span class='danger'>Your chest hurts!</span>")
|
||||
if(2)
|
||||
if(prob(1) && prob(10))
|
||||
to_chat(affected_mob, "<span class='notice'>You feel better.</span>")
|
||||
cure()
|
||||
return
|
||||
if(prob(8))
|
||||
affected_mob.emote(pick("pale", "groan"))
|
||||
if(prob(5))
|
||||
to_chat(affected_mob, "<span class='danger'>Your heart lurches in your chest!</span>")
|
||||
affected_mob.AdjustLoseBreath(1)
|
||||
if(prob(3))
|
||||
to_chat(affected_mob, "<span class='danger'>Your heart stops beating!</span>")
|
||||
affected_mob.AdjustLoseBreath(3)
|
||||
if(prob(5))
|
||||
affected_mob.emote(pick("faint", "collapse", "groan"))
|
||||
if(3)
|
||||
affected_mob.adjustOxyLoss(1)
|
||||
if(prob(8))
|
||||
affected_mob.emote(pick("twitch", "gasp"))
|
||||
if(prob(5) && ishuman(affected_mob))
|
||||
var/mob/living/carbon/human/H = affected_mob
|
||||
H.set_heartattack(TRUE)
|
||||
@@ -14,20 +14,13 @@
|
||||
disease_flags = CURABLE
|
||||
spread_flags = NON_CONTAGIOUS
|
||||
virus_heal_resistant = TRUE
|
||||
var/remissive = 0
|
||||
|
||||
/datum/disease/food_poisoning/stage_act()
|
||||
if(!remissive)
|
||||
..()
|
||||
..()
|
||||
if(affected_mob.sleeping && prob(33))
|
||||
to_chat(affected_mob, "<span class='notice'>You feel better.</span>")
|
||||
remissive = 1
|
||||
if(remissive)
|
||||
if(prob(stage_prob))
|
||||
stage--
|
||||
if(stage == 0)
|
||||
cure()
|
||||
return
|
||||
cure()
|
||||
return
|
||||
switch(stage)
|
||||
if(1)
|
||||
if(prob(5))
|
||||
|
||||
@@ -34,7 +34,7 @@
|
||||
if(5)
|
||||
to_chat(affected_mob, "<span class='danger'>Your body feels as if it's trying to rip itself open...</span>")
|
||||
if(prob(50))
|
||||
affected_mob.gib()
|
||||
affected_mob.delayed_gib()
|
||||
else
|
||||
return
|
||||
|
||||
|
||||
@@ -203,6 +203,10 @@ What are the archived variables for?
|
||||
/datum/gas_mixture/proc/copy_from(datum/gas_mixture/sample)
|
||||
//Copies variables from sample
|
||||
|
||||
/datum/gas_mixture/proc/copy_from_turf(turf/model)
|
||||
//Copies all gas info from the turf into the gas list along with temperature
|
||||
//Returns: 1 if we are mutable, 0 otherwise
|
||||
|
||||
/datum/gas_mixture/proc/share(datum/gas_mixture/sharer)
|
||||
//Performs air sharing calculations between two gas_mixtures assuming only 1 boundary length
|
||||
//Return: amount of gas exchanged (+ if sharer received)
|
||||
@@ -343,6 +347,19 @@ What are the archived variables for?
|
||||
|
||||
return 1
|
||||
|
||||
/datum/gas_mixture/copy_from_turf(turf/model)
|
||||
oxygen = model.oxygen
|
||||
carbon_dioxide = model.carbon_dioxide
|
||||
nitrogen = model.nitrogen
|
||||
toxins = model.toxins
|
||||
|
||||
//acounts for changes in temperature
|
||||
var/turf/model_parent = model.parent_type
|
||||
if(model.temperature != initial(model.temperature) || model.temperature != initial(model_parent.temperature))
|
||||
temperature = model.temperature
|
||||
|
||||
return 1
|
||||
|
||||
/datum/gas_mixture/check_turf(turf/model, atmos_adjacent_turfs = 4)
|
||||
var/delta_oxygen = (oxygen_archived - model.oxygen)/(atmos_adjacent_turfs+1)
|
||||
var/delta_carbon_dioxide = (carbon_dioxide_archived - model.carbon_dioxide)/(atmos_adjacent_turfs+1)
|
||||
|
||||
@@ -109,7 +109,7 @@ Data storage vars:
|
||||
CRASH("The global_iterator loop \ref[src] failed to terminate in designated timeframe. This may be caused by server lagging.")
|
||||
return 1
|
||||
|
||||
/datum/global_iterator/proc/process()
|
||||
/datum/global_iterator/process()
|
||||
return
|
||||
|
||||
/datum/global_iterator/proc/active()
|
||||
|
||||
@@ -0,0 +1,189 @@
|
||||
/proc/input_async(mob/user=usr, prompt, list/choices)
|
||||
var/datum/async_input/A = new(choices, prompt, , user)
|
||||
A.show()
|
||||
return A
|
||||
|
||||
/proc/input_ranked_async(mob/user=usr, prompt="Order by greatest to least preference", list/choices)
|
||||
var/datum/async_input/ranked/A = new(choices, prompt, "ranked_input", user)
|
||||
A.show()
|
||||
return A
|
||||
|
||||
/proc/input_autocomplete_async(mob/user=usr, prompt="Enter text: ", list/choices)
|
||||
var/datum/async_input/autocomplete/A = new(choices, prompt, "ac_input", user)
|
||||
A.show()
|
||||
return A
|
||||
|
||||
/datum/async_input
|
||||
var/datum/browser/popup
|
||||
// If associative list, key will be used for display, but the final result will be the value
|
||||
var/list/choices
|
||||
var/datum/callback/onCloseCb
|
||||
var/flash = TRUE
|
||||
var/immediate_submit = FALSE
|
||||
var/prompt
|
||||
var/result = null
|
||||
var/style = "text-align: center;"
|
||||
var/mob/user
|
||||
var/window_id
|
||||
var/height = 200
|
||||
var/width = 400
|
||||
|
||||
/datum/async_input/New(list/new_choices, new_prompt="Pick an option:", new_window_id="async_input", mob/new_user=usr)
|
||||
choices = new_choices
|
||||
prompt = new_prompt
|
||||
window_id = new_window_id
|
||||
user = new_user
|
||||
popup = new(user, window_id, , width, height, src)
|
||||
|
||||
/datum/async_input/proc/close()
|
||||
if(popup)
|
||||
popup.close()
|
||||
if(result && choices[result])
|
||||
result = choices[result]
|
||||
if(onCloseCb)
|
||||
onCloseCb.Invoke(result)
|
||||
return result
|
||||
|
||||
// Callback function should take the result as the last argument
|
||||
/datum/async_input/proc/on_close(var/datum/callback/cb)
|
||||
onCloseCb = cb
|
||||
|
||||
/datum/async_input/proc/show()
|
||||
popup.set_content(create_ui())
|
||||
if(flash && result == null)
|
||||
window_flash(user.client)
|
||||
popup.open()
|
||||
|
||||
/datum/async_input/proc/create_ui()
|
||||
var/dat = "<div style=\"[style]\">"
|
||||
dat += render_prompt()
|
||||
dat += render_choices()
|
||||
dat += "<br>"
|
||||
dat += "<br>"
|
||||
dat += render_buttons()
|
||||
dat += "</div>"
|
||||
return dat
|
||||
|
||||
/datum/async_input/proc/render_prompt()
|
||||
return "<h2>[prompt]</h2>"
|
||||
|
||||
/datum/async_input/proc/render_choices()
|
||||
var/dat = " "
|
||||
for(var/choice in choices)
|
||||
dat += button(choice, "choice=[choice]", choice == result)
|
||||
dat += " "
|
||||
return dat
|
||||
|
||||
/datum/async_input/proc/render_buttons()
|
||||
return button("Submit", "submit=1", , result == null && !immediate_submit)
|
||||
|
||||
/datum/async_input/proc/button(label, topic, on=FALSE, disabled=FALSE, id="")
|
||||
var/class = ""
|
||||
if(on)
|
||||
class = "linkOn"
|
||||
if(disabled)
|
||||
class = "linkOff"
|
||||
topic = ""
|
||||
return "<a class=\"[class]\" id='[id]' href='?src=[UID()];[topic]'>[label]</a>"
|
||||
|
||||
/datum/async_input/Topic(href, href_list)
|
||||
if(href_list["submit"] || href_list["close"])
|
||||
close()
|
||||
return
|
||||
|
||||
if(href_list["choice"])
|
||||
result = href_list["choice"]
|
||||
show()
|
||||
return
|
||||
|
||||
/datum/async_input/ranked
|
||||
height = 400
|
||||
immediate_submit = TRUE
|
||||
|
||||
/datum/async_input/ranked/New()
|
||||
..()
|
||||
popup.add_script("rankedInput.js", 'html/browser/rankedInput.js')
|
||||
popup.add_head_content("<title>Drag and drop or use the buttons to reorder</title>")
|
||||
|
||||
/datum/async_input/ranked/render_choices()
|
||||
var/dat = "<div>"
|
||||
dat += "<table id='choices' uid=[UID()] style='margin: auto; text-align: left;'>"
|
||||
for(var/i = 1, i <= choices.len, i++)
|
||||
var/choice = choices[i]
|
||||
dat += "<tr>"
|
||||
dat += "<td>[button("+", i != 1 ? "upvote=[i]" : "", , i == 1)]</td>"
|
||||
dat += "<td>[button("-", i != choices.len ? "downvote=[i]" : "", , i == choices.len)]</td>"
|
||||
dat += "<td style='cursor: move;' index='[i]' ondrop='drop(event)' ondragover='allowDrop(event)' draggable='true' ondragstart='drag(event)'>[i]. [choice]</td>"
|
||||
dat += "</tr>"
|
||||
dat += "</table>"
|
||||
dat += "</div>"
|
||||
return dat
|
||||
|
||||
/datum/async_input/ranked/Topic(href, href_list)
|
||||
if(!href_list["close"])
|
||||
// Mark that user interacted with interface
|
||||
result = choices
|
||||
|
||||
if(href_list["upvote"])
|
||||
var/index = text2num(href_list["upvote"])
|
||||
choices.Swap(index, index - 1)
|
||||
show()
|
||||
return
|
||||
|
||||
if(href_list["downvote"])
|
||||
var/index = text2num(href_list["downvote"])
|
||||
choices.Swap(index, index + 1)
|
||||
show()
|
||||
return
|
||||
|
||||
if(href_list["cut"] && href_list["insert"])
|
||||
var/cut = text2num(href_list["cut"])
|
||||
var/insert = text2num(href_list["insert"])
|
||||
var/choice = choices[cut]
|
||||
choices.Cut(cut, cut + 1)
|
||||
choices.Insert(insert, choice)
|
||||
show()
|
||||
return
|
||||
|
||||
..()
|
||||
|
||||
/datum/async_input/autocomplete
|
||||
immediate_submit = TRUE
|
||||
height = 150
|
||||
|
||||
/datum/async_input/autocomplete/New()
|
||||
..()
|
||||
popup.add_script("autocomplete.js", 'html/browser/autocomplete.js')
|
||||
|
||||
for(var/i=1, i <= choices.len, i++)
|
||||
var/C = choices[choices[i]]
|
||||
choices[i] = url_encode(choices[i], TRUE)
|
||||
choices[choices[i]] = C
|
||||
|
||||
/datum/async_input/autocomplete/render_prompt()
|
||||
return "<label for='input'>[prompt]</label>"
|
||||
|
||||
/datum/async_input/autocomplete/render_choices()
|
||||
var/dat = "<input list='choices' id='input' name='choices' oninput='updateTopic()' />"
|
||||
dat += "<datalist id='choices'>"
|
||||
for(var/choice in choices)
|
||||
dat += "<option value='[choice]'>"
|
||||
dat += "</datalist>"
|
||||
return dat
|
||||
|
||||
/datum/async_input/autocomplete/render_buttons()
|
||||
var/dat = button("Submit", "", , result == null && !immediate_submit, "submit-button")
|
||||
dat += button("Cancel", "close=1")
|
||||
return dat
|
||||
|
||||
/datum/async_input/autocomplete/Topic(href, href_list)
|
||||
if(href_list["submit"])
|
||||
// Entering an invalid choice is the same as canceling
|
||||
if(href_list["submit"] in choices)
|
||||
result = href_list["submit"]
|
||||
else if(url_encode(href_list["submit"], TRUE) in choices)
|
||||
result = url_encode(href_list["submit"], TRUE)
|
||||
close()
|
||||
return
|
||||
|
||||
..()
|
||||
@@ -123,7 +123,7 @@
|
||||
banned = generateMapList("config/spaceRuinBlacklist.txt")
|
||||
else
|
||||
banned = generateMapList("config/example/spaceRuinBlacklist.txt")
|
||||
//banned += generateMapList("config/lavaRuinBlacklist.txt")
|
||||
banned += generateMapList("config/lavaRuinBlacklist.txt")
|
||||
|
||||
for(var/item in subtypesof(/datum/map_template/ruin))
|
||||
var/datum/map_template/ruin/ruin_type = item
|
||||
@@ -138,10 +138,8 @@
|
||||
map_templates[R.name] = R
|
||||
ruins_templates[R.name] = R
|
||||
|
||||
/*
|
||||
if(istype(R, /datum/map_template/ruin/lavaland))
|
||||
lava_ruins_templates[R.name] = R
|
||||
*/
|
||||
if(istype(R, /datum/map_template/ruin/space))
|
||||
space_ruins_templates[R.name] = R
|
||||
|
||||
|
||||
+4
-4
@@ -10,7 +10,6 @@ var/datum/atom_hud/huds = list( \
|
||||
DATA_HUD_DIAGNOSTIC = new/datum/atom_hud/data/diagnostic(), \
|
||||
DATA_HUD_DIAGNOSTIC_ADVANCED = new/datum/atom_hud/data/diagnostic/advanced(), \
|
||||
DATA_HUD_HYDROPONIC = new/datum/atom_hud/data/hydroponic(), \
|
||||
GAME_HUD_NATIONS = new/datum/atom_hud/antag(), \
|
||||
ANTAG_HUD_CULT = new/datum/atom_hud/antag(), \
|
||||
ANTAG_HUD_REV = new/datum/atom_hud/antag(), \
|
||||
ANTAG_HUD_OPS = new/datum/atom_hud/antag(), \
|
||||
@@ -23,7 +22,8 @@ var/datum/atom_hud/huds = list( \
|
||||
ANTAG_HUD_ABDUCTOR = new/datum/atom_hud/antag/hidden(),\
|
||||
DATA_HUD_ABDUCTOR = new/datum/atom_hud/abductor(),\
|
||||
ANTAG_HUD_DEVIL = new/datum/atom_hud/antag/hidden(),\
|
||||
ANTAG_HUD_EVENTMISC = new/datum/atom_hud/antag/hidden()\
|
||||
ANTAG_HUD_EVENTMISC = new/datum/atom_hud/antag/hidden(),\
|
||||
ANTAG_HUD_BLOB = new/datum/atom_hud/antag/hidden()\
|
||||
)
|
||||
|
||||
/datum/atom_hud
|
||||
@@ -94,8 +94,8 @@ var/datum/atom_hud/huds = list( \
|
||||
// gang_huds += G.ganghud
|
||||
|
||||
var/serv_huds = list()//mindslaves and/or vampire thralls
|
||||
if(ticker.mode)
|
||||
for(var/datum/mindslaves/serv in (ticker.mode.vampires | ticker.mode.traitors))
|
||||
if(SSticker.mode)
|
||||
for(var/datum/mindslaves/serv in (SSticker.mode.vampires | SSticker.mode.traitors))
|
||||
serv_huds += serv.thrallhud
|
||||
|
||||
|
||||
|
||||
+225
-205
@@ -29,6 +29,7 @@
|
||||
var/memory
|
||||
|
||||
var/assigned_role //assigned role is what job you're assigned to when you join the station.
|
||||
var/playtime_role //if set, overrides your assigned_role for the purpose of playtime awards. Set by IDcomputer when your ID is changed.
|
||||
var/special_role //special roles are typically reserved for antags or roles like ERT. If you want to avoid a character being automatically announced by the AI, on arrival (becuase they're an off station character or something); ensure that special_role and assigned_role are equal.
|
||||
var/offstation_role = FALSE //set to true for ERT, deathsquad, abductors, etc, that can go from and to z2 at will and shouldn't be antag targets
|
||||
var/list/restricted_roles = list()
|
||||
@@ -41,6 +42,7 @@
|
||||
var/list/kills = list()
|
||||
var/list/datum/objective/objectives = list()
|
||||
var/list/datum/objective/special_verbs = list()
|
||||
var/list/targets = list()
|
||||
|
||||
var/has_been_rev = 0//Tracks if this mind has been a rev or not
|
||||
|
||||
@@ -51,7 +53,6 @@
|
||||
var/datum/changeling/changeling //changeling holder
|
||||
var/linglink
|
||||
var/datum/vampire/vampire //vampire holder
|
||||
var/datum/nations/nation //nation holder
|
||||
var/datum/abductor/abductor //abductor holder
|
||||
var/datum/devilinfo/devilinfo //devil holder
|
||||
|
||||
@@ -84,7 +85,7 @@
|
||||
soulOwner = src
|
||||
|
||||
/datum/mind/Destroy()
|
||||
ticker.minds -= src
|
||||
SSticker.minds -= src
|
||||
if(islist(antag_datums))
|
||||
for(var/i in antag_datums)
|
||||
var/datum/antagonist/antag_datum = i
|
||||
@@ -163,7 +164,7 @@
|
||||
|
||||
/datum/mind/proc/_memory_edit_header(gamemode, list/alt)
|
||||
. = gamemode
|
||||
if(ticker.mode.config_tag == gamemode || (LAZYLEN(alt) && (ticker.mode.config_tag in alt)))
|
||||
if(SSticker.mode.config_tag == gamemode || (LAZYLEN(alt) && (SSticker.mode.config_tag in alt)))
|
||||
. = uppertext(.)
|
||||
. = "<i><b>[.]</b></i>: "
|
||||
|
||||
@@ -183,7 +184,7 @@
|
||||
. = _memory_edit_header("revolution")
|
||||
if(ismindshielded(H))
|
||||
. += "<b>NO</b>|headrev|rev"
|
||||
else if(src in ticker.mode.head_revolutionaries)
|
||||
else if(src in SSticker.mode.head_revolutionaries)
|
||||
. += "<a href='?src=[UID()];revolution=clear'>no</a>|<b><font color='red'>HEADREV</font></b>|<a href='?src=[UID()];revolution=rev'>rev</a>"
|
||||
. += "<br>Flash: <a href='?src=[UID()];revolution=flash'>give</a>"
|
||||
|
||||
@@ -200,7 +201,7 @@
|
||||
. += " <a href='?src=[UID()];revolution=reequip'>Reequip</a> (gives traitor uplink)."
|
||||
if(objectives.len==0)
|
||||
. += "<br>Objectives are empty! <a href='?src=[UID()];revolution=autoobjectives'>Set to kill all heads</a>."
|
||||
else if(src in ticker.mode.revolutionaries)
|
||||
else if(src in SSticker.mode.revolutionaries)
|
||||
. += "<a href='?src=[UID()];revolution=clear'>no</a>|<a href='?src=[UID()];revolution=headrev'>headrev</a>|<b><font color='red'>REV</font></b>"
|
||||
else
|
||||
. += "<b>NO</b>|<a href='?src=[UID()];revolution=headrev'>headrev</a>|<a href='?src=[UID()];revolution=rev'>rev</a>"
|
||||
@@ -211,7 +212,7 @@
|
||||
. = _memory_edit_header("cult")
|
||||
if(ismindshielded(H))
|
||||
. += "<B>NO</B>|cultist"
|
||||
else if(src in ticker.mode.cult)
|
||||
else if(src in SSticker.mode.cult)
|
||||
. += "<a href='?src=[UID()];cult=clear'>no</a>|<b><font color='red'>CULTIST</font></b>"
|
||||
. += "<br>Give <a href='?src=[UID()];cult=tome'>tome</a>|<a href='?src=[UID()];cult=equip'>equip</a>."
|
||||
else
|
||||
@@ -221,7 +222,7 @@
|
||||
|
||||
/datum/mind/proc/memory_edit_wizard(mob/living/carbon/human/H)
|
||||
. = _memory_edit_header("wizard")
|
||||
if(src in ticker.mode.wizards)
|
||||
if(src in SSticker.mode.wizards)
|
||||
. += "<b><font color='red'>WIZARD</font></b>|<a href='?src=[UID()];wizard=clear'>no</a>"
|
||||
. += "<br><a href='?src=[UID()];wizard=lair'>To lair</a>, <a href='?src=[UID()];common=undress'>undress</a>, <a href='?src=[UID()];wizard=dressup'>dress up</a>, <a href='?src=[UID()];wizard=name'>let choose name</a>."
|
||||
if(objectives.len==0)
|
||||
@@ -233,7 +234,7 @@
|
||||
|
||||
/datum/mind/proc/memory_edit_changeling(mob/living/carbon/human/H)
|
||||
. = _memory_edit_header("changeling", list("traitorchan"))
|
||||
if(src in ticker.mode.changelings)
|
||||
if(src in SSticker.mode.changelings)
|
||||
. += "<b><font color='red'>CHANGELING</font></b>|<a href='?src=[UID()];changeling=clear'>no</a>"
|
||||
if(objectives.len==0)
|
||||
. += "<br>Objectives are empty! <a href='?src=[UID()];changeling=autoobjectives'>Randomize!</a>"
|
||||
@@ -246,7 +247,7 @@
|
||||
|
||||
/datum/mind/proc/memory_edit_vampire(mob/living/carbon/human/H)
|
||||
. = _memory_edit_header("vampire", list("traitorvamp"))
|
||||
if(src in ticker.mode.vampires)
|
||||
if(src in SSticker.mode.vampires)
|
||||
. += "<b><font color='red'>VAMPIRE</font></b>|<a href='?src=[UID()];vampire=clear'>no</a>"
|
||||
if(objectives.len==0)
|
||||
. += "<br>Objectives are empty! <a href='?src=[UID()];vampire=autoobjectives'>Randomize!</a>"
|
||||
@@ -256,14 +257,14 @@
|
||||
. += _memory_edit_role_enabled(ROLE_VAMPIRE)
|
||||
/** Enthralled ***/
|
||||
. += "<br><b><i>enthralled</i></b>: "
|
||||
if(src in ticker.mode.vampire_enthralled)
|
||||
if(src in SSticker.mode.vampire_enthralled)
|
||||
. += "<b><font color='red'>THRALL</font></b>|<a href='?src=[UID()];vampthrall=clear'>no</a>"
|
||||
else
|
||||
. += "thrall|<b>NO</b>"
|
||||
|
||||
/datum/mind/proc/memory_edit_nuclear(mob/living/carbon/human/H)
|
||||
. = _memory_edit_header("nuclear")
|
||||
if(src in ticker.mode.syndicates)
|
||||
if(src in SSticker.mode.syndicates)
|
||||
. += "<b><font color='red'>OPERATIVE</b></font>|<a href='?src=[UID()];nuclear=clear'>no</a>"
|
||||
. += "<br><a href='?src=[UID()];nuclear=lair'>To shuttle</a>, <a href='?src=[UID()];common=undress'>undress</a>, <a href='?src=[UID()];nuclear=dressup'>dress up</a>."
|
||||
var/code
|
||||
@@ -280,9 +281,9 @@
|
||||
|
||||
/datum/mind/proc/memory_edit_shadowling(mob/living/carbon/human/H)
|
||||
. = _memory_edit_header("shadowling")
|
||||
if(src in ticker.mode.shadows)
|
||||
if(src in SSticker.mode.shadows)
|
||||
. += "<b><font color='red'>SHADOWLING</font></b>|thrall|<a href='?src=[UID()];shadowling=clear'>no</a>"
|
||||
else if(src in ticker.mode.shadowling_thralls)
|
||||
else if(src in SSticker.mode.shadowling_thralls)
|
||||
. += "Shadowling|<b><font color='red'>THRALL</font></b>|<a href='?src=[UID()];shadowling=clear'>no</a>"
|
||||
else
|
||||
. += "<a href='?src=[UID()];shadowling=shadowling'>shadowling</a>|<a href='?src=[UID()];shadowling=thrall'>thrall</a>|<b>NO</b>"
|
||||
@@ -291,7 +292,7 @@
|
||||
|
||||
/datum/mind/proc/memory_edit_abductor(mob/living/carbon/human/H)
|
||||
. = _memory_edit_header("abductor")
|
||||
if(src in ticker.mode.abductors)
|
||||
if(src in SSticker.mode.abductors)
|
||||
. += "<b><font color='red'>ABDUCTOR</font></b>|<a href='?src=[UID()];abductor=clear'>no</a>"
|
||||
. += "|<a href='?src=[UID()];common=undress'>undress</a>|<a href='?src=[UID()];abductor=equip'>equip</a>"
|
||||
else
|
||||
@@ -301,14 +302,14 @@
|
||||
|
||||
/datum/mind/proc/memory_edit_devil(mob/living/H)
|
||||
. = _memory_edit_header("devil", list("devilagents"))
|
||||
if(src in ticker.mode.devils)
|
||||
if(src in SSticker.mode.devils)
|
||||
if(!devilinfo)
|
||||
. += "<b>No devilinfo found! Yell at a coder!</b>"
|
||||
else if(!devilinfo.ascendable)
|
||||
. += "<b>DEVIL</b>|<a href='?src=[UID()];devil=ascendable_devil'>Ascendable Devil</a>|sintouched|<a href='?src=[UID()];devil=clear'>no</a>"
|
||||
else
|
||||
. += "<a href='?src=[UID()];devil=devil'>DEVIL</a>|<b>ASCENDABLE DEVIL</b>|sintouched|<a href='?src=[UID()];devil=clear'>no</a>"
|
||||
else if(src in ticker.mode.sintouched)
|
||||
else if(src in SSticker.mode.sintouched)
|
||||
. += "devil|Ascendable Devil|<b>SINTOUCHED</b>|<a href='?src=[UID()];devil=clear'>no</a>"
|
||||
else
|
||||
. += "<a href='?src=[UID()];devil=devil'>devil</a>|<a href='?src=[UID()];devil=ascendable_devil'>Ascendable Devil</a>|<a href='?src=[UID()];devil=sintouched'>sintouched</a>|<b>NO</b>"
|
||||
@@ -317,14 +318,14 @@
|
||||
|
||||
/datum/mind/proc/memory_edit_eventmisc(mob/living/H)
|
||||
. = _memory_edit_header("event", list())
|
||||
if(src in ticker.mode.eventmiscs)
|
||||
if(src in SSticker.mode.eventmiscs)
|
||||
. += "<b>YES</b>|<a href='?src=[UID()];eventmisc=clear'>no</a>"
|
||||
else
|
||||
. += "<a href='?src=[UID()];eventmisc=eventmisc'>Event Role</a>|<b>NO</b>"
|
||||
|
||||
/datum/mind/proc/memory_edit_traitor()
|
||||
. = _memory_edit_header("traitor", list("traitorchan", "traitorvamp"))
|
||||
if(src in ticker.mode.traitors)
|
||||
if(src in SSticker.mode.traitors)
|
||||
. += "<b><font color='red'>TRAITOR</font></b>|<a href='?src=[UID()];traitor=clear'>no</a>"
|
||||
if(objectives.len==0)
|
||||
. += "<br>Objectives are empty! <a href='?src=[UID()];traitor=autoobjectives'>Randomize</a>!"
|
||||
@@ -348,9 +349,9 @@
|
||||
|
||||
/datum/mind/proc/memory_edit_uplink()
|
||||
. = ""
|
||||
if(ishuman(current) && ((src in ticker.mode.head_revolutionaries) || \
|
||||
(src in ticker.mode.traitors) || \
|
||||
(src in ticker.mode.syndicates)))
|
||||
if(ishuman(current) && ((src in SSticker.mode.head_revolutionaries) || \
|
||||
(src in SSticker.mode.traitors) || \
|
||||
(src in SSticker.mode.syndicates)))
|
||||
. = "Uplink: <a href='?src=[UID()];common=uplink'>give</a>"
|
||||
var/obj/item/uplink/hidden/suplink = find_syndicate_uplink()
|
||||
var/crystals
|
||||
@@ -366,7 +367,7 @@
|
||||
// ^ whoever left this comment is literally a grammar nazi. stalin better. in russia grammar correct you.
|
||||
|
||||
/datum/mind/proc/edit_memory()
|
||||
if(!ticker || !ticker.mode)
|
||||
if(!SSticker || !SSticker.mode)
|
||||
alert("Not before round-start!", "Alert")
|
||||
return
|
||||
|
||||
@@ -419,7 +420,7 @@
|
||||
This prioritizes antags relevant to the current round to make them appear at the top of the panel.
|
||||
Traitorchan and traitorvamp are snowflaked in because they have multiple sections.
|
||||
*/
|
||||
if(ticker.mode.config_tag == "traitorchan")
|
||||
if(SSticker.mode.config_tag == "traitorchan")
|
||||
if(sections["traitor"])
|
||||
out += sections["traitor"] + "<br>"
|
||||
if(sections["changeling"])
|
||||
@@ -427,7 +428,7 @@
|
||||
sections -= "traitor"
|
||||
sections -= "changeling"
|
||||
// Elif technically unnecessary but it makes the following else look better
|
||||
else if(ticker.mode.config_tag == "traitorvamp")
|
||||
else if(SSticker.mode.config_tag == "traitorvamp")
|
||||
if(sections["traitor"])
|
||||
out += sections["traitor"] + "<br>"
|
||||
if(sections["vampire"])
|
||||
@@ -435,9 +436,9 @@
|
||||
sections -= "traitor"
|
||||
sections -= "vampire"
|
||||
else
|
||||
if(sections[ticker.mode.config_tag])
|
||||
out += sections[ticker.mode.config_tag] + "<br>"
|
||||
sections -= ticker.mode.config_tag
|
||||
if(sections[SSticker.mode.config_tag])
|
||||
out += sections[SSticker.mode.config_tag] + "<br>"
|
||||
sections -= SSticker.mode.config_tag
|
||||
|
||||
for(var/i in sections)
|
||||
if(sections[i])
|
||||
@@ -512,7 +513,7 @@
|
||||
var/objective_type = "[objective_type_capital][objective_type_text]"//Add them together into a text string.
|
||||
|
||||
var/list/possible_targets = list()
|
||||
for(var/datum/mind/possible_target in ticker.minds)
|
||||
for(var/datum/mind/possible_target in SSticker.minds)
|
||||
if((possible_target != src) && istype(possible_target.current, /mob/living/carbon/human))
|
||||
possible_targets += possible_target.current
|
||||
|
||||
@@ -612,7 +613,7 @@
|
||||
|
||||
if("identity theft")
|
||||
var/list/possible_targets = list()
|
||||
for(var/datum/mind/possible_target in ticker.minds)
|
||||
for(var/datum/mind/possible_target in SSticker.minds)
|
||||
if((possible_target != src) && ishuman(possible_target.current))
|
||||
possible_targets += possible_target
|
||||
possible_targets = sortAtom(possible_targets)
|
||||
@@ -687,19 +688,19 @@
|
||||
message_admins("[key_name_admin(usr)] has given [key_name_admin(current)] a mindshield implant")
|
||||
|
||||
to_chat(H, "<span class='warning'><Font size =3><B>You somehow have become the recepient of a mindshield transplant, and it just activated!</B></FONT></span>")
|
||||
if(src in ticker.mode.revolutionaries)
|
||||
if(src in SSticker.mode.revolutionaries)
|
||||
special_role = null
|
||||
ticker.mode.revolutionaries -= src
|
||||
SSticker.mode.revolutionaries -= src
|
||||
to_chat(src, "<span class='warning'><Font size = 3><B>The nanobots in the mindshield implant remove all thoughts about being a revolutionary. Get back to work!</B></Font></span>")
|
||||
if(src in ticker.mode.head_revolutionaries)
|
||||
if(src in SSticker.mode.head_revolutionaries)
|
||||
special_role = null
|
||||
ticker.mode.head_revolutionaries -=src
|
||||
SSticker.mode.head_revolutionaries -=src
|
||||
to_chat(src, "<span class='warning'><Font size = 3><B>The nanobots in the mindshield implant remove all thoughts about being a revolutionary. Get back to work!</B></Font></span>")
|
||||
if(src in ticker.mode.cult)
|
||||
ticker.mode.cult -= src
|
||||
ticker.mode.update_cult_icons_removed(src)
|
||||
if(src in SSticker.mode.cult)
|
||||
SSticker.mode.cult -= src
|
||||
SSticker.mode.update_cult_icons_removed(src)
|
||||
special_role = null
|
||||
var/datum/game_mode/cult/cult = ticker.mode
|
||||
var/datum/game_mode/cult/cult = SSticker.mode
|
||||
if(istype(cult))
|
||||
cult.memorize_cult_objectives(src)
|
||||
to_chat(current, "<span class='warning'><FONT size = 3><B>The nanobots in the mindshield implant remove all thoughts about being in a cult. Have a productive day!</B></FONT></span>")
|
||||
@@ -709,46 +710,46 @@
|
||||
|
||||
switch(href_list["revolution"])
|
||||
if("clear")
|
||||
if(src in ticker.mode.revolutionaries)
|
||||
ticker.mode.revolutionaries -= src
|
||||
if(src in SSticker.mode.revolutionaries)
|
||||
SSticker.mode.revolutionaries -= src
|
||||
to_chat(current, "<span class='warning'><FONT size = 3><B>You have been brainwashed! You are no longer a revolutionary!</B></FONT></span>")
|
||||
ticker.mode.update_rev_icons_removed(src)
|
||||
SSticker.mode.update_rev_icons_removed(src)
|
||||
special_role = null
|
||||
if(src in ticker.mode.head_revolutionaries)
|
||||
ticker.mode.head_revolutionaries -= src
|
||||
if(src in SSticker.mode.head_revolutionaries)
|
||||
SSticker.mode.head_revolutionaries -= src
|
||||
to_chat(current, "<span class='warning'><FONT size = 3><B>You have been brainwashed! You are no longer a head revolutionary!</B></FONT></span>")
|
||||
ticker.mode.update_rev_icons_removed(src)
|
||||
SSticker.mode.update_rev_icons_removed(src)
|
||||
special_role = null
|
||||
log_admin("[key_name(usr)] has de-rev'd [key_name(current)]")
|
||||
message_admins("[key_name_admin(usr)] has de-rev'd [key_name_admin(current)]")
|
||||
|
||||
if("rev")
|
||||
if(src in ticker.mode.head_revolutionaries)
|
||||
ticker.mode.head_revolutionaries -= src
|
||||
ticker.mode.update_rev_icons_removed(src)
|
||||
if(src in SSticker.mode.head_revolutionaries)
|
||||
SSticker.mode.head_revolutionaries -= src
|
||||
SSticker.mode.update_rev_icons_removed(src)
|
||||
to_chat(current, "<span class='warning'><FONT size = 3><B>Revolution has been disappointed of your leadership traits! You are a regular revolutionary now!</B></FONT></span>")
|
||||
else if(!(src in ticker.mode.revolutionaries))
|
||||
else if(!(src in SSticker.mode.revolutionaries))
|
||||
to_chat(current, "<span class='warning'><FONT size = 3> You are now a revolutionary! Help your cause. Do not harm your fellow freedom fighters. You can identify your comrades by the red \"R\" icons, and your leaders by the blue \"R\" icons. Help them kill the heads to win the revolution!</FONT></span>")
|
||||
else
|
||||
return
|
||||
ticker.mode.revolutionaries += src
|
||||
ticker.mode.update_rev_icons_added(src)
|
||||
SSticker.mode.revolutionaries += src
|
||||
SSticker.mode.update_rev_icons_added(src)
|
||||
special_role = SPECIAL_ROLE_REV
|
||||
log_admin("[key_name(usr)] has rev'd [key_name(current)]")
|
||||
message_admins("[key_name_admin(usr)] has rev'd [key_name_admin(current)]")
|
||||
|
||||
if("headrev")
|
||||
if(src in ticker.mode.revolutionaries)
|
||||
ticker.mode.revolutionaries -= src
|
||||
ticker.mode.update_rev_icons_removed(src)
|
||||
if(src in SSticker.mode.revolutionaries)
|
||||
SSticker.mode.revolutionaries -= src
|
||||
SSticker.mode.update_rev_icons_removed(src)
|
||||
to_chat(current, "<span class='userdanger'>You have proven your devotion to revolution! You are a head revolutionary now!</span>")
|
||||
else if(!(src in ticker.mode.head_revolutionaries))
|
||||
else if(!(src in SSticker.mode.head_revolutionaries))
|
||||
to_chat(current, "<span class='notice'>You are a member of the revolutionaries' leadership now!</span>")
|
||||
else
|
||||
return
|
||||
if(ticker.mode.head_revolutionaries.len>0)
|
||||
if(SSticker.mode.head_revolutionaries.len>0)
|
||||
// copy targets
|
||||
var/datum/mind/valid_head = locate() in ticker.mode.head_revolutionaries
|
||||
var/datum/mind/valid_head = locate() in SSticker.mode.head_revolutionaries
|
||||
if(valid_head)
|
||||
for(var/datum/objective/mutiny/O in valid_head.objectives)
|
||||
var/datum/objective/mutiny/rev_obj = new
|
||||
@@ -756,21 +757,21 @@
|
||||
rev_obj.target = O.target
|
||||
rev_obj.explanation_text = "Assassinate [O.target.name], the [O.target.assigned_role]."
|
||||
objectives += rev_obj
|
||||
ticker.mode.greet_revolutionary(src,0)
|
||||
ticker.mode.head_revolutionaries += src
|
||||
ticker.mode.update_rev_icons_added(src)
|
||||
SSticker.mode.greet_revolutionary(src,0)
|
||||
SSticker.mode.head_revolutionaries += src
|
||||
SSticker.mode.update_rev_icons_added(src)
|
||||
special_role = SPECIAL_ROLE_HEAD_REV
|
||||
log_admin("[key_name(usr)] has head-rev'd [key_name(current)]")
|
||||
message_admins("[key_name_admin(usr)] has head-rev'd [key_name_admin(current)]")
|
||||
|
||||
if("autoobjectives")
|
||||
ticker.mode.forge_revolutionary_objectives(src)
|
||||
ticker.mode.greet_revolutionary(src,0)
|
||||
SSticker.mode.forge_revolutionary_objectives(src)
|
||||
SSticker.mode.greet_revolutionary(src,0)
|
||||
log_admin("[key_name(usr)] has automatically forged revolutionary objectives for [key_name(current)]")
|
||||
message_admins("[key_name_admin(usr)] has automatically forged revolutionary objectives for [key_name_admin(current)]")
|
||||
|
||||
if("flash")
|
||||
if(!ticker.mode.equip_revolutionary(current))
|
||||
if(!SSticker.mode.equip_revolutionary(current))
|
||||
to_chat(usr, "<span class='warning'>Spawning flash failed!</span>")
|
||||
log_admin("[key_name(usr)] has given [key_name(current)] a flash")
|
||||
message_admins("[key_name_admin(usr)] has given [key_name_admin(current)] a flash")
|
||||
@@ -800,8 +801,8 @@
|
||||
qdel(flash)
|
||||
take_uplink()
|
||||
var/fail = 0
|
||||
fail |= !ticker.mode.equip_traitor(current, 1)
|
||||
fail |= !ticker.mode.equip_revolutionary(current)
|
||||
fail |= !SSticker.mode.equip_traitor(current, 1)
|
||||
fail |= !SSticker.mode.equip_revolutionary(current)
|
||||
if(fail)
|
||||
to_chat(usr, "<span class='warning'>Reequipping revolutionary goes wrong!</span>")
|
||||
return
|
||||
@@ -811,19 +812,24 @@
|
||||
else if(href_list["cult"])
|
||||
switch(href_list["cult"])
|
||||
if("clear")
|
||||
if(src in ticker.mode.cult)
|
||||
ticker.mode.remove_cultist(src)
|
||||
if(src in SSticker.mode.cult)
|
||||
SSticker.mode.remove_cultist(src)
|
||||
special_role = null
|
||||
log_admin("[key_name(usr)] has de-culted [key_name(current)]")
|
||||
message_admins("[key_name_admin(usr)] has de-culted [key_name_admin(current)]")
|
||||
if("cultist")
|
||||
if(!(src in ticker.mode.cult))
|
||||
ticker.mode.add_cultist(src)
|
||||
if(!(src in SSticker.mode.cult))
|
||||
SSticker.mode.add_cultist(src)
|
||||
special_role = SPECIAL_ROLE_CULTIST
|
||||
to_chat(current, "<span class='cultitalic'>You catch a glimpse of the Realm of [ticker.cultdat.entity_name], [ticker.cultdat.entity_title3]. You now see how flimsy the world is, you see that it should be open to the knowledge of [ticker.cultdat.entity_name].</span>")
|
||||
to_chat(current, "<span class='cultitalic'>Assist your new compatriots in their dark dealings. Their goal is yours, and yours is theirs. You serve [ticker.cultdat.entity_title2] above all else. Bring It back.</span>")
|
||||
to_chat(current, "<span class='cultitalic'>You catch a glimpse of the Realm of [SSticker.cultdat.entity_name], [SSticker.cultdat.entity_title3]. You now see how flimsy the world is, you see that it should be open to the knowledge of [SSticker.cultdat.entity_name].</span>")
|
||||
to_chat(current, "<span class='cultitalic'>Assist your new compatriots in their dark dealings. Their goal is yours, and yours is theirs. You serve [SSticker.cultdat.entity_title2] above all else. Bring It back.</span>")
|
||||
log_admin("[key_name(usr)] has culted [key_name(current)]")
|
||||
message_admins("[key_name_admin(usr)] has culted [key_name_admin(current)]")
|
||||
if(!summon_spots.len)
|
||||
while(summon_spots.len < SUMMON_POSSIBILITIES)
|
||||
var/area/summon = pick(return_sorted_areas() - summon_spots)
|
||||
if(summon && is_station_level(summon.z) && summon.valid_territory)
|
||||
summon_spots += summon
|
||||
if("tome")
|
||||
var/mob/living/carbon/human/H = current
|
||||
if(istype(H))
|
||||
@@ -846,7 +852,7 @@
|
||||
message_admins("[key_name_admin(usr)] has spawned a tome for [key_name_admin(current)]")
|
||||
|
||||
if("equip")
|
||||
if(!ticker.mode.equip_cultist(current))
|
||||
if(!SSticker.mode.equip_cultist(current))
|
||||
to_chat(usr, "<span class='warning'>Spawning equipment failed!</span>")
|
||||
log_admin("[key_name(usr)] has equipped [key_name(current)] as a cultist")
|
||||
message_admins("[key_name_admin(usr)] has equipped [key_name_admin(current)] as a cultist")
|
||||
@@ -855,21 +861,22 @@
|
||||
|
||||
switch(href_list["wizard"])
|
||||
if("clear")
|
||||
if(src in ticker.mode.wizards)
|
||||
ticker.mode.wizards -= src
|
||||
if(src in SSticker.mode.wizards)
|
||||
SSticker.mode.wizards -= src
|
||||
special_role = null
|
||||
current.spellremove(current)
|
||||
current.faction = list("Station")
|
||||
ticker.mode.update_wiz_icons_removed(src)
|
||||
SSticker.mode.update_wiz_icons_removed(src)
|
||||
to_chat(current, "<span class='warning'><FONT size = 3><B>You have been brainwashed! You are no longer a wizard!</B></FONT></span>")
|
||||
log_admin("[key_name(usr)] has de-wizarded [key_name(current)]")
|
||||
message_admins("[key_name_admin(usr)] has de-wizarded [key_name_admin(current)]")
|
||||
if("wizard")
|
||||
if(!(src in ticker.mode.wizards))
|
||||
ticker.mode.wizards += src
|
||||
if(!(src in SSticker.mode.wizards))
|
||||
SSticker.mode.wizards += src
|
||||
special_role = SPECIAL_ROLE_WIZARD
|
||||
//ticker.mode.learn_basic_spells(current)
|
||||
ticker.mode.update_wiz_icons_added(src)
|
||||
SSticker.mode.update_wiz_icons_added(src)
|
||||
SEND_SOUND(current, 'sound/ambience/antag/ragesmages.ogg')
|
||||
to_chat(current, "<span class='danger'>You are a Space Wizard!</span>")
|
||||
current.faction = list("wizard")
|
||||
log_admin("[key_name(usr)] has wizarded [key_name(current)]")
|
||||
@@ -879,15 +886,15 @@
|
||||
log_admin("[key_name(usr)] has moved [key_name(current)] to the wizard's lair")
|
||||
message_admins("[key_name_admin(usr)] has moved [key_name_admin(current)] to the wizard's lair")
|
||||
if("dressup")
|
||||
ticker.mode.equip_wizard(current)
|
||||
SSticker.mode.equip_wizard(current)
|
||||
log_admin("[key_name(usr)] has equipped [key_name(current)] as a wizard")
|
||||
message_admins("[key_name_admin(usr)] has equipped [key_name_admin(current)] as a wizard")
|
||||
if("name")
|
||||
ticker.mode.name_wizard(current)
|
||||
SSticker.mode.name_wizard(current)
|
||||
log_admin("[key_name(usr)] has allowed wizard [key_name(current)] to name themselves")
|
||||
message_admins("[key_name_admin(usr)] has allowed wizard [key_name_admin(current)] to name themselves")
|
||||
if("autoobjectives")
|
||||
ticker.mode.forge_wizard_objectives(src)
|
||||
SSticker.mode.forge_wizard_objectives(src)
|
||||
to_chat(usr, "<span class='notice'>The objectives for wizard [key] have been generated. You can edit them and announce manually.</span>")
|
||||
log_admin("[key_name(usr)] has automatically forged wizard objectives for [key_name(current)]")
|
||||
message_admins("[key_name_admin(usr)] has automatically forged wizard objectives for [key_name_admin(current)]")
|
||||
@@ -896,27 +903,30 @@
|
||||
else if(href_list["changeling"])
|
||||
switch(href_list["changeling"])
|
||||
if("clear")
|
||||
if(src in ticker.mode.changelings)
|
||||
ticker.mode.changelings -= src
|
||||
if(src in SSticker.mode.changelings)
|
||||
SSticker.mode.changelings -= src
|
||||
special_role = null
|
||||
current.remove_changeling_powers()
|
||||
ticker.mode.update_change_icons_removed(src)
|
||||
if(changeling) qdel(changeling)
|
||||
if(changeling)
|
||||
current.remove_changeling_powers()
|
||||
qdel(changeling)
|
||||
changeling = null
|
||||
SSticker.mode.update_change_icons_removed(src)
|
||||
to_chat(current, "<FONT color='red' size = 3><B>You grow weak and lose your powers! You are no longer a changeling and are stuck in your current form!</B></FONT>")
|
||||
log_admin("[key_name(usr)] has de-changelinged [key_name(current)]")
|
||||
message_admins("[key_name_admin(usr)] has de-changelinged [key_name_admin(current)]")
|
||||
if("changeling")
|
||||
if(!(src in ticker.mode.changelings))
|
||||
ticker.mode.changelings += src
|
||||
ticker.mode.grant_changeling_powers(current)
|
||||
ticker.mode.update_change_icons_added(src)
|
||||
if(!(src in SSticker.mode.changelings))
|
||||
SSticker.mode.changelings += src
|
||||
SSticker.mode.grant_changeling_powers(current)
|
||||
SSticker.mode.update_change_icons_added(src)
|
||||
special_role = SPECIAL_ROLE_CHANGELING
|
||||
SEND_SOUND(current, 'sound/ambience/antag/ling_aler.ogg')
|
||||
to_chat(current, "<B><font color='red'>Your powers have awoken. A flash of memory returns to us... we are a changeling!</font></B>")
|
||||
log_admin("[key_name(usr)] has changelinged [key_name(current)]")
|
||||
message_admins("[key_name_admin(usr)] has changelinged [key_name_admin(current)]")
|
||||
|
||||
if("autoobjectives")
|
||||
ticker.mode.forge_changeling_objectives(src)
|
||||
SSticker.mode.forge_changeling_objectives(src)
|
||||
to_chat(usr, "<span class='notice'>The objectives for changeling [key] have been generated. You can edit them and announce manually.</span>")
|
||||
log_admin("[key_name(usr)] has automatically forged objectives for [key_name(current)]")
|
||||
message_admins("[key_name_admin(usr)] has automatically forged objectives for [key_name_admin(current)]")
|
||||
@@ -935,32 +945,33 @@
|
||||
else if(href_list["vampire"])
|
||||
switch(href_list["vampire"])
|
||||
if("clear")
|
||||
if(src in ticker.mode.vampires)
|
||||
ticker.mode.vampires -= src
|
||||
if(src in SSticker.mode.vampires)
|
||||
SSticker.mode.vampires -= src
|
||||
special_role = null
|
||||
if(vampire)
|
||||
vampire.remove_vampire_powers()
|
||||
qdel(vampire)
|
||||
vampire = null
|
||||
ticker.mode.update_vampire_icons_removed(src)
|
||||
SSticker.mode.update_vampire_icons_removed(src)
|
||||
to_chat(current, "<FONT color='red' size = 3><B>You grow weak and lose your powers! You are no longer a vampire and are stuck in your current form!</B></FONT>")
|
||||
log_admin("[key_name(usr)] has de-vampired [key_name(current)]")
|
||||
message_admins("[key_name_admin(usr)] has de-vampired [key_name_admin(current)]")
|
||||
if("vampire")
|
||||
if(!(src in ticker.mode.vampires))
|
||||
ticker.mode.vampires += src
|
||||
ticker.mode.grant_vampire_powers(current)
|
||||
ticker.mode.update_vampire_icons_added(src)
|
||||
if(!(src in SSticker.mode.vampires))
|
||||
SSticker.mode.vampires += src
|
||||
SSticker.mode.grant_vampire_powers(current)
|
||||
SSticker.mode.update_vampire_icons_added(src)
|
||||
var/datum/mindslaves/slaved = new()
|
||||
slaved.masters += src
|
||||
som = slaved //we MIGT want to mindslave someone
|
||||
special_role = SPECIAL_ROLE_VAMPIRE
|
||||
SEND_SOUND(current, 'sound/ambience/antag/vampalert.ogg')
|
||||
to_chat(current, "<B><font color='red'>Your powers have awoken. Your lust for blood grows... You are a Vampire!</font></B>")
|
||||
log_admin("[key_name(usr)] has vampired [key_name(current)]")
|
||||
message_admins("[key_name_admin(usr)] has vampired [key_name_admin(current)]")
|
||||
|
||||
if("autoobjectives")
|
||||
ticker.mode.forge_vampire_objectives(src)
|
||||
SSticker.mode.forge_vampire_objectives(src)
|
||||
to_chat(usr, "<span class='notice'>The objectives for vampire [key] have been generated. You can edit them and announce manually.</span>")
|
||||
log_admin("[key_name(usr)] has automatically forged objectives for [key_name(current)]")
|
||||
message_admins("[key_name_admin(usr)] has automatically forged objectives for [key_name_admin(current)]")
|
||||
@@ -968,8 +979,8 @@
|
||||
else if(href_list["vampthrall"])
|
||||
switch(href_list["vampthrall"])
|
||||
if("clear")
|
||||
if(src in ticker.mode.vampire_enthralled)
|
||||
ticker.mode.remove_vampire_mind(src)
|
||||
if(src in SSticker.mode.vampire_enthralled)
|
||||
SSticker.mode.remove_vampire_mind(src)
|
||||
log_admin("[key_name(usr)] has de-vampthralled [key_name(current)]")
|
||||
message_admins("[key_name_admin(usr)] has de-vampthralled [key_name_admin(current)]")
|
||||
|
||||
@@ -978,9 +989,9 @@
|
||||
|
||||
switch(href_list["nuclear"])
|
||||
if("clear")
|
||||
if(src in ticker.mode.syndicates)
|
||||
ticker.mode.syndicates -= src
|
||||
ticker.mode.update_synd_icons_removed(src)
|
||||
if(src in SSticker.mode.syndicates)
|
||||
SSticker.mode.syndicates -= src
|
||||
SSticker.mode.update_synd_icons_removed(src)
|
||||
special_role = null
|
||||
for(var/datum/objective/nuclear/O in objectives)
|
||||
objectives-=O
|
||||
@@ -989,17 +1000,17 @@
|
||||
log_admin("[key_name(usr)] has de-nuke op'd [key_name(current)]")
|
||||
message_admins("[key_name_admin(usr)] has de-nuke op'd [key_name_admin(current)]")
|
||||
if("nuclear")
|
||||
if(!(src in ticker.mode.syndicates))
|
||||
ticker.mode.syndicates += src
|
||||
ticker.mode.update_synd_icons_added(src)
|
||||
if(ticker.mode.syndicates.len==1)
|
||||
ticker.mode.prepare_syndicate_leader(src)
|
||||
if(!(src in SSticker.mode.syndicates))
|
||||
SSticker.mode.syndicates += src
|
||||
SSticker.mode.update_synd_icons_added(src)
|
||||
if(SSticker.mode.syndicates.len==1)
|
||||
SSticker.mode.prepare_syndicate_leader(src)
|
||||
else
|
||||
current.real_name = "[syndicate_name()] Operative #[ticker.mode.syndicates.len-1]"
|
||||
current.real_name = "[syndicate_name()] Operative #[SSticker.mode.syndicates.len-1]"
|
||||
special_role = SPECIAL_ROLE_NUKEOPS
|
||||
to_chat(current, "<span class='notice'>You are a [syndicate_name()] agent!</span>")
|
||||
ticker.mode.forge_syndicate_objectives(src)
|
||||
ticker.mode.greet_syndicate(src)
|
||||
SSticker.mode.forge_syndicate_objectives(src)
|
||||
SSticker.mode.greet_syndicate(src)
|
||||
log_admin("[key_name(usr)] has nuke op'd [key_name(current)]")
|
||||
message_admins("[key_name_admin(usr)] has nuke op'd [key_name_admin(current)]")
|
||||
if("lair")
|
||||
@@ -1019,9 +1030,10 @@
|
||||
qdel(H.wear_suit)
|
||||
qdel(H.w_uniform)
|
||||
|
||||
if(!ticker.mode.equip_syndicate(current))
|
||||
if(!SSticker.mode.equip_syndicate(current))
|
||||
to_chat(usr, "<span class='warning'>Equipping a syndicate failed!</span>")
|
||||
return
|
||||
SSticker.mode.update_syndicate_id(current.mind, SSticker.mode.syndicates.len == 1)
|
||||
log_admin("[key_name(usr)] has equipped [key_name(current)] as a nuclear operative")
|
||||
message_admins("[key_name_admin(usr)] has equipped [key_name_admin(current)] as a nuclear operative")
|
||||
|
||||
@@ -1042,27 +1054,27 @@
|
||||
else if(href_list["eventmisc"])
|
||||
switch(href_list["eventmisc"])
|
||||
if("clear")
|
||||
if(src in ticker.mode.eventmiscs)
|
||||
ticker.mode.eventmiscs -= src
|
||||
ticker.mode.update_eventmisc_icons_removed(src)
|
||||
if(src in SSticker.mode.eventmiscs)
|
||||
SSticker.mode.eventmiscs -= src
|
||||
SSticker.mode.update_eventmisc_icons_removed(src)
|
||||
special_role = null
|
||||
message_admins("[key_name_admin(usr)] has de-eventantag'ed [current].")
|
||||
log_admin("[key_name(usr)] has de-eventantag'ed [current].")
|
||||
if("eventmisc")
|
||||
ticker.mode.eventmiscs += src
|
||||
SSticker.mode.eventmiscs += src
|
||||
special_role = SPECIAL_ROLE_EVENTMISC
|
||||
ticker.mode.update_eventmisc_icons_added(src)
|
||||
SSticker.mode.update_eventmisc_icons_added(src)
|
||||
message_admins("[key_name_admin(usr)] has eventantag'ed [current].")
|
||||
log_admin("[key_name(usr)] has eventantag'ed [current].")
|
||||
else if(href_list["devil"])
|
||||
switch(href_list["devil"])
|
||||
if("clear")
|
||||
if(src in ticker.mode.devils)
|
||||
if(src in SSticker.mode.devils)
|
||||
if(istype(current,/mob/living/carbon/true_devil/))
|
||||
to_chat(usr,"<span class='warning'>This cannot be used on true or arch-devils.</span>")
|
||||
else
|
||||
ticker.mode.devils -= src
|
||||
ticker.mode.update_devil_icons_removed(src)
|
||||
SSticker.mode.devils -= src
|
||||
SSticker.mode.update_devil_icons_removed(src)
|
||||
special_role = null
|
||||
to_chat(current,"<span class='userdanger'>Your infernal link has been severed! You are no longer a devil!</span>")
|
||||
RemoveSpell(/obj/effect/proc_holder/spell/targeted/infernal_jaunt)
|
||||
@@ -1081,8 +1093,8 @@
|
||||
S.laws.clear_sixsixsix_laws()
|
||||
devilinfo = null
|
||||
log_admin("[key_name(usr)] has de-devil'ed [current].")
|
||||
else if(src in ticker.mode.sintouched)
|
||||
ticker.mode.sintouched -= src
|
||||
else if(src in SSticker.mode.sintouched)
|
||||
SSticker.mode.sintouched -= src
|
||||
message_admins("[key_name_admin(usr)] has de-sintouch'ed [current].")
|
||||
log_admin("[key_name(usr)] has de-sintouch'ed [current].")
|
||||
if("devil")
|
||||
@@ -1094,12 +1106,12 @@
|
||||
if(!ishuman(current) && !isrobot(current))
|
||||
to_chat(usr, "<span class='warning'>This only works on humans and cyborgs!</span>")
|
||||
return
|
||||
ticker.mode.devils += src
|
||||
SSticker.mode.devils += src
|
||||
special_role = "devil"
|
||||
ticker.mode.update_devil_icons_added(src)
|
||||
ticker.mode.finalize_devil(src, FALSE)
|
||||
ticker.mode.forge_devil_objectives(src, 2)
|
||||
ticker.mode.greet_devil(src)
|
||||
SSticker.mode.update_devil_icons_added(src)
|
||||
SSticker.mode.finalize_devil(src, FALSE)
|
||||
SSticker.mode.forge_devil_objectives(src, 2)
|
||||
SSticker.mode.greet_devil(src)
|
||||
message_admins("[key_name_admin(usr)] has devil'ed [current].")
|
||||
log_admin("[key_name(usr)] has devil'ed [current].")
|
||||
if("ascendable_devil")
|
||||
@@ -1111,12 +1123,12 @@
|
||||
if(!ishuman(current) && !isrobot(current))
|
||||
to_chat(usr, "<span class='warning'>This only works on humans and cyborgs!</span>")
|
||||
return
|
||||
ticker.mode.devils += src
|
||||
SSticker.mode.devils += src
|
||||
special_role = "devil"
|
||||
ticker.mode.update_devil_icons_added(src)
|
||||
ticker.mode.finalize_devil(src, TRUE)
|
||||
ticker.mode.forge_devil_objectives(src, 2)
|
||||
ticker.mode.greet_devil(src)
|
||||
SSticker.mode.update_devil_icons_added(src)
|
||||
SSticker.mode.finalize_devil(src, TRUE)
|
||||
SSticker.mode.forge_devil_objectives(src, 2)
|
||||
SSticker.mode.greet_devil(src)
|
||||
message_admins("[key_name_admin(usr)] has devil'ed [current]. The devil has been marked as ascendable.")
|
||||
log_admin("[key_name(usr)] has devil'ed [current]. The devil has been marked as ascendable.")
|
||||
if("sintouched")
|
||||
@@ -1128,8 +1140,8 @@
|
||||
else if(href_list["traitor"])
|
||||
switch(href_list["traitor"])
|
||||
if("clear")
|
||||
if(src in ticker.mode.traitors)
|
||||
ticker.mode.traitors -= src
|
||||
if(src in SSticker.mode.traitors)
|
||||
SSticker.mode.traitors -= src
|
||||
special_role = null
|
||||
to_chat(current, "<span class='warning'><FONT size = 3><B>You have been brainwashed! You are no longer a traitor!</B></FONT></span>")
|
||||
log_admin("[key_name(usr)] has de-traitored [key_name(current)]")
|
||||
@@ -1141,12 +1153,12 @@
|
||||
A.verbs -= /mob/living/silicon/ai/proc/choose_modules
|
||||
A.malf_picker.remove_verbs(A)
|
||||
qdel(A.malf_picker)
|
||||
ticker.mode.update_traitor_icons_removed(src)
|
||||
SSticker.mode.update_traitor_icons_removed(src)
|
||||
|
||||
|
||||
if("traitor")
|
||||
if(!(src in ticker.mode.traitors))
|
||||
ticker.mode.traitors += src
|
||||
if(!(src in SSticker.mode.traitors))
|
||||
SSticker.mode.traitors += src
|
||||
var/datum/mindslaves/slaved = new()
|
||||
slaved.masters += src
|
||||
som = slaved //we MIGT want to mindslave someone
|
||||
@@ -1156,11 +1168,14 @@
|
||||
message_admins("[key_name_admin(usr)] has traitored [key_name_admin(current)]")
|
||||
if(isAI(current))
|
||||
var/mob/living/silicon/ai/A = current
|
||||
ticker.mode.add_law_zero(A)
|
||||
ticker.mode.update_traitor_icons_added(src)
|
||||
SSticker.mode.add_law_zero(A)
|
||||
SEND_SOUND(current, 'sound/ambience/antag/malf.ogg')
|
||||
else
|
||||
SEND_SOUND(current, 'sound/ambience/antag/tatoralert.ogg')
|
||||
SSticker.mode.update_traitor_icons_added(src)
|
||||
|
||||
if("autoobjectives")
|
||||
ticker.mode.forge_traitor_objectives(src)
|
||||
SSticker.mode.forge_traitor_objectives(src)
|
||||
to_chat(usr, "<span class='notice'>The objectives for traitor [key] have been generated. You can edit them and announce manually.</span>")
|
||||
log_admin("[key_name(usr)] has automatically forged objectives for [key_name(current)]")
|
||||
message_admins("[key_name_admin(usr)] has automatically forged objectives for [key_name_admin(current)]")
|
||||
@@ -1168,17 +1183,17 @@
|
||||
else if(href_list["shadowling"])
|
||||
switch(href_list["shadowling"])
|
||||
if("clear")
|
||||
ticker.mode.update_shadow_icons_removed(src)
|
||||
if(src in ticker.mode.shadows)
|
||||
ticker.mode.shadows -= src
|
||||
SSticker.mode.update_shadow_icons_removed(src)
|
||||
if(src in SSticker.mode.shadows)
|
||||
SSticker.mode.shadows -= src
|
||||
special_role = null
|
||||
to_chat(current, "<span class='userdanger'>Your powers have been quenched! You are no longer a shadowling!</span>")
|
||||
message_admins("[key_name_admin(usr)] has de-shadowlinged [current].")
|
||||
log_admin("[key_name(usr)] has de-shadowlinged [current].")
|
||||
current.spellremove(current)
|
||||
current.remove_language("Shadowling Hivemind")
|
||||
else if(src in ticker.mode.shadowling_thralls)
|
||||
ticker.mode.remove_thrall(src,0)
|
||||
else if(src in SSticker.mode.shadowling_thralls)
|
||||
SSticker.mode.remove_thrall(src,0)
|
||||
message_admins("[key_name_admin(usr)] has de-thrall'ed [current].")
|
||||
log_admin("[key_name(usr)] has de-thralled [key_name(current)]")
|
||||
message_admins("[key_name_admin(usr)] has de-thralled [key_name_admin(current)]")
|
||||
@@ -1186,20 +1201,20 @@
|
||||
if(!ishuman(current))
|
||||
to_chat(usr, "<span class='warning'>This only works on humans!</span>")
|
||||
return
|
||||
ticker.mode.shadows += src
|
||||
SSticker.mode.shadows += src
|
||||
special_role = SPECIAL_ROLE_SHADOWLING
|
||||
to_chat(current, "<span class='shadowling'><b>Something stirs deep in your mind. A red light floods your vision, and slowly you remember. Though your human disguise has served you well, the \
|
||||
time is nigh to cast it off and enter your true form. You have disguised yourself amongst the humans, but you are not one of them. You are a shadowling, and you are to ascend at all costs.\
|
||||
</b></span>")
|
||||
ticker.mode.finalize_shadowling(src)
|
||||
ticker.mode.update_shadow_icons_added(src)
|
||||
SSticker.mode.finalize_shadowling(src)
|
||||
SSticker.mode.update_shadow_icons_added(src)
|
||||
log_admin("[key_name(usr)] has shadowlinged [key_name(current)]")
|
||||
message_admins("[key_name_admin(usr)] has shadowlinged [key_name_admin(current)]")
|
||||
if("thrall")
|
||||
if(!ishuman(current))
|
||||
to_chat(usr, "<span class='warning'>This only works on humans!</span>")
|
||||
return
|
||||
ticker.mode.add_thrall(src)
|
||||
SSticker.mode.add_thrall(src)
|
||||
message_admins("[key_name_admin(usr)] has thralled [current].")
|
||||
log_admin("[key_name(usr)] has thralled [current].")
|
||||
|
||||
@@ -1214,7 +1229,7 @@
|
||||
return
|
||||
make_Abductor()
|
||||
log_admin("[key_name(usr)] turned [current] into abductor.")
|
||||
ticker.mode.update_abductor_icons_added(src)
|
||||
SSticker.mode.update_abductor_icons_added(src)
|
||||
if("equip")
|
||||
if(!ishuman(current))
|
||||
to_chat(usr, "<span class='warning'>This only works on humans!</span>")
|
||||
@@ -1299,7 +1314,7 @@
|
||||
log_admin("[key_name(usr)] has set [key_name(current)]'s telecrystals to [crystals]")
|
||||
message_admins("[key_name_admin(usr)] has set [key_name_admin(current)]'s telecrystals to [crystals]")
|
||||
if("uplink")
|
||||
if(!ticker.mode.equip_traitor(current, !(src in ticker.mode.traitors)))
|
||||
if(!SSticker.mode.equip_traitor(current, !(src in SSticker.mode.traitors)))
|
||||
to_chat(usr, "<span class='warning'>Equipping a syndicate failed!</span>")
|
||||
return
|
||||
log_admin("[key_name(usr)] has given [key_name(current)] an uplink")
|
||||
@@ -1385,27 +1400,27 @@
|
||||
qdel(H)
|
||||
|
||||
/datum/mind/proc/make_Traitor()
|
||||
if(!(src in ticker.mode.traitors))
|
||||
ticker.mode.traitors += src
|
||||
if(!(src in SSticker.mode.traitors))
|
||||
SSticker.mode.traitors += src
|
||||
special_role = SPECIAL_ROLE_TRAITOR
|
||||
ticker.mode.forge_traitor_objectives(src)
|
||||
ticker.mode.finalize_traitor(src)
|
||||
ticker.mode.greet_traitor(src)
|
||||
ticker.mode.update_traitor_icons_added(src)
|
||||
SSticker.mode.forge_traitor_objectives(src)
|
||||
SSticker.mode.finalize_traitor(src)
|
||||
SSticker.mode.greet_traitor(src)
|
||||
SSticker.mode.update_traitor_icons_added(src)
|
||||
|
||||
/datum/mind/proc/make_Nuke()
|
||||
if(!(src in ticker.mode.syndicates))
|
||||
ticker.mode.syndicates += src
|
||||
ticker.mode.update_synd_icons_added(src)
|
||||
if(ticker.mode.syndicates.len==1)
|
||||
ticker.mode.prepare_syndicate_leader(src)
|
||||
if(!(src in SSticker.mode.syndicates))
|
||||
SSticker.mode.syndicates += src
|
||||
SSticker.mode.update_synd_icons_added(src)
|
||||
if(SSticker.mode.syndicates.len==1)
|
||||
SSticker.mode.prepare_syndicate_leader(src)
|
||||
else
|
||||
current.real_name = "[syndicate_name()] Operative #[ticker.mode.syndicates.len-1]"
|
||||
current.real_name = "[syndicate_name()] Operative #[SSticker.mode.syndicates.len-1]"
|
||||
special_role = SPECIAL_ROLE_NUKEOPS
|
||||
assigned_role = SPECIAL_ROLE_NUKEOPS
|
||||
to_chat(current, "<span class='notice'>You are a [syndicate_name()] agent!</span>")
|
||||
ticker.mode.forge_syndicate_objectives(src)
|
||||
ticker.mode.greet_syndicate(src)
|
||||
SSticker.mode.forge_syndicate_objectives(src)
|
||||
SSticker.mode.greet_syndicate(src)
|
||||
|
||||
current.loc = get_turf(locate("landmark*Syndicate-Spawn"))
|
||||
|
||||
@@ -1422,29 +1437,34 @@
|
||||
qdel(H.wear_suit)
|
||||
qdel(H.w_uniform)
|
||||
|
||||
ticker.mode.equip_syndicate(current)
|
||||
SSticker.mode.equip_syndicate(current)
|
||||
|
||||
/datum/mind/proc/make_Vampire()
|
||||
if(!(src in ticker.mode.vampires))
|
||||
ticker.mode.vampires += src
|
||||
ticker.mode.grant_vampire_powers(current)
|
||||
if(!(src in SSticker.mode.vampires))
|
||||
SSticker.mode.vampires += src
|
||||
SSticker.mode.grant_vampire_powers(current)
|
||||
special_role = SPECIAL_ROLE_VAMPIRE
|
||||
ticker.mode.forge_vampire_objectives(src)
|
||||
ticker.mode.greet_vampire(src)
|
||||
ticker.mode.update_vampire_icons_added(src)
|
||||
SSticker.mode.forge_vampire_objectives(src)
|
||||
SSticker.mode.greet_vampire(src)
|
||||
SSticker.mode.update_vampire_icons_added(src)
|
||||
|
||||
/datum/mind/proc/make_Changeling()
|
||||
if(!(src in ticker.mode.changelings))
|
||||
ticker.mode.changelings += src
|
||||
ticker.mode.grant_changeling_powers(current)
|
||||
if(!(src in SSticker.mode.changelings))
|
||||
SSticker.mode.changelings += src
|
||||
SSticker.mode.grant_changeling_powers(current)
|
||||
special_role = SPECIAL_ROLE_CHANGELING
|
||||
ticker.mode.forge_changeling_objectives(src)
|
||||
ticker.mode.greet_changeling(src)
|
||||
ticker.mode.update_change_icons_added(src)
|
||||
SSticker.mode.forge_changeling_objectives(src)
|
||||
SSticker.mode.greet_changeling(src)
|
||||
SSticker.mode.update_change_icons_added(src)
|
||||
|
||||
/datum/mind/proc/make_Overmind()
|
||||
if(!(src in SSticker.mode.blob_overminds))
|
||||
SSticker.mode.blob_overminds += src
|
||||
special_role = SPECIAL_ROLE_BLOB_OVERMIND
|
||||
|
||||
/datum/mind/proc/make_Wizard()
|
||||
if(!(src in ticker.mode.wizards))
|
||||
ticker.mode.wizards += src
|
||||
if(!(src in SSticker.mode.wizards))
|
||||
SSticker.mode.wizards += src
|
||||
special_role = SPECIAL_ROLE_WIZARD
|
||||
assigned_role = SPECIAL_ROLE_WIZARD
|
||||
//ticker.mode.learn_basic_spells(current)
|
||||
@@ -1454,18 +1474,18 @@
|
||||
else
|
||||
current.loc = pick(wizardstart)
|
||||
|
||||
ticker.mode.equip_wizard(current)
|
||||
SSticker.mode.equip_wizard(current)
|
||||
for(var/obj/item/spellbook/S in current.contents)
|
||||
S.op = 0
|
||||
ticker.mode.name_wizard(current)
|
||||
ticker.mode.forge_wizard_objectives(src)
|
||||
ticker.mode.greet_wizard(src)
|
||||
ticker.mode.update_wiz_icons_added(src)
|
||||
SSticker.mode.name_wizard(current)
|
||||
SSticker.mode.forge_wizard_objectives(src)
|
||||
SSticker.mode.greet_wizard(src)
|
||||
SSticker.mode.update_wiz_icons_added(src)
|
||||
|
||||
/datum/mind/proc/make_Rev()
|
||||
if(ticker.mode.head_revolutionaries.len>0)
|
||||
if(SSticker.mode.head_revolutionaries.len>0)
|
||||
// copy targets
|
||||
var/datum/mind/valid_head = locate() in ticker.mode.head_revolutionaries
|
||||
var/datum/mind/valid_head = locate() in SSticker.mode.head_revolutionaries
|
||||
if(valid_head)
|
||||
for(var/datum/objective/mutiny/O in valid_head.objectives)
|
||||
var/datum/objective/mutiny/rev_obj = new
|
||||
@@ -1473,13 +1493,13 @@
|
||||
rev_obj.target = O.target
|
||||
rev_obj.explanation_text = "Assassinate [O.target.current.real_name], the [O.target.assigned_role]."
|
||||
objectives += rev_obj
|
||||
ticker.mode.greet_revolutionary(src,0)
|
||||
ticker.mode.head_revolutionaries += src
|
||||
ticker.mode.update_rev_icons_added(src)
|
||||
SSticker.mode.greet_revolutionary(src,0)
|
||||
SSticker.mode.head_revolutionaries += src
|
||||
SSticker.mode.update_rev_icons_added(src)
|
||||
special_role = SPECIAL_ROLE_HEAD_REV
|
||||
|
||||
ticker.mode.forge_revolutionary_objectives(src)
|
||||
ticker.mode.greet_revolutionary(src,0)
|
||||
SSticker.mode.forge_revolutionary_objectives(src)
|
||||
SSticker.mode.greet_revolutionary(src,0)
|
||||
|
||||
var/list/L = current.get_contents()
|
||||
var/obj/item/flash/flash = locate() in L
|
||||
@@ -1487,7 +1507,7 @@
|
||||
take_uplink()
|
||||
var/fail = 0
|
||||
// fail |= !ticker.mode.equip_traitor(current, 1)
|
||||
fail |= !ticker.mode.equip_revolutionary(current)
|
||||
fail |= !SSticker.mode.equip_revolutionary(current)
|
||||
|
||||
/datum/mind/proc/make_Abductor()
|
||||
var/role = alert("Abductor Role ?","Role","Agent","Scientist")
|
||||
@@ -1500,7 +1520,7 @@
|
||||
if(!ishuman(current))
|
||||
return
|
||||
|
||||
ticker.mode.abductors |= src
|
||||
SSticker.mode.abductors |= src
|
||||
|
||||
var/datum/objective/experiment/O = new
|
||||
O.owner = src
|
||||
@@ -1609,15 +1629,15 @@
|
||||
|
||||
var/list/implanters
|
||||
var/ref = "\ref[missionary.mind]"
|
||||
if(!(missionary.mind in ticker.mode.implanter))
|
||||
ticker.mode.implanter[ref] = list()
|
||||
implanters = ticker.mode.implanter[ref]
|
||||
if(!(missionary.mind in SSticker.mode.implanter))
|
||||
SSticker.mode.implanter[ref] = list()
|
||||
implanters = SSticker.mode.implanter[ref]
|
||||
implanters.Add(src)
|
||||
ticker.mode.implanted.Add(src)
|
||||
ticker.mode.implanted[src] = missionary.mind
|
||||
SSticker.mode.implanted.Add(src)
|
||||
SSticker.mode.implanted[src] = missionary.mind
|
||||
//ticker.mode.implanter[missionary.mind] += src
|
||||
ticker.mode.implanter[ref] = implanters
|
||||
ticker.mode.traitors += src
|
||||
SSticker.mode.implanter[ref] = implanters
|
||||
SSticker.mode.traitors += src
|
||||
special_role = "traitor"
|
||||
to_chat(current, "<span class='warning'><B>You're now a loyal zealot of [missionary.name]!</B> You now must lay down your life to protect [missionary.p_them()] and assist in [missionary.p_their()] goals at any cost.</span>")
|
||||
var/datum/objective/protect/mindslave/MS = new
|
||||
@@ -1628,8 +1648,8 @@
|
||||
for(var/datum/objective/objective in objectives)
|
||||
to_chat(current, "<B>Objective #1</B>: [objective.explanation_text]")
|
||||
|
||||
ticker.mode.update_traitor_icons_added(missionary.mind)
|
||||
ticker.mode.update_traitor_icons_added(src)//handles datahuds/observerhuds
|
||||
SSticker.mode.update_traitor_icons_added(missionary.mind)
|
||||
SSticker.mode.update_traitor_icons_added(src)//handles datahuds/observerhuds
|
||||
|
||||
if(missionary.mind.som)//do not add if not a traitor..and you just picked up a robe and staff in the hall...
|
||||
var/datum/mindslaves/slaved = missionary.mind.som
|
||||
@@ -1653,7 +1673,7 @@
|
||||
/datum/mind/proc/remove_zealot(obj/item/clothing/under/jumpsuit = null)
|
||||
if(!zealot_master) //if they aren't a zealot, we can't remove their zealot status, obviously. don't bother with the rest so we don't confuse them with the messages
|
||||
return
|
||||
ticker.mode.remove_traitor_mind(src)
|
||||
SSticker.mode.remove_traitor_mind(src)
|
||||
add_attack_logs(zealot_master, current, "Lost control of zealot")
|
||||
zealot_master = null
|
||||
|
||||
@@ -1684,8 +1704,8 @@
|
||||
mind.key = key
|
||||
else
|
||||
mind = new /datum/mind(key)
|
||||
if(ticker)
|
||||
ticker.minds += mind
|
||||
if(SSticker)
|
||||
SSticker.minds += mind
|
||||
else
|
||||
error("mind_initialize(): No ticker ready yet! Please inform Carn")
|
||||
if(!mind.name)
|
||||
|
||||
@@ -4,15 +4,21 @@
|
||||
|
||||
// Mutable appearances are children of images, just so you know.
|
||||
|
||||
/mutable_appearance/New()
|
||||
..()
|
||||
plane = FLOAT_PLANE // No clue why this is 0 by default yet images are on FLOAT_PLANE
|
||||
// And yes this does have to be in the constructor, BYOND ignores it if you set it as a normal var
|
||||
|
||||
// Helper similar to image()
|
||||
/proc/mutable_appearance(icon, icon_state = "", layer = FLOAT_LAYER)
|
||||
/proc/mutable_appearance(icon, icon_state = "", layer = FLOAT_LAYER, plane = FLOAT_PLANE)
|
||||
var/mutable_appearance/MA = new()
|
||||
MA.icon = icon
|
||||
MA.icon_state = icon_state
|
||||
MA.layer = layer
|
||||
MA.plane = plane
|
||||
return MA
|
||||
|
||||
/mutable_appearance/clean
|
||||
|
||||
/mutable_appearance/clean/New()
|
||||
. = ..()
|
||||
alpha = 255
|
||||
|
||||
@@ -25,6 +25,7 @@
|
||||
var/list/implants = null
|
||||
var/list/cybernetic_implants = null
|
||||
|
||||
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
|
||||
@@ -151,4 +152,10 @@
|
||||
H.r_store.add_fingerprint(H, 1)
|
||||
if(H.wear_pda)
|
||||
H.wear_pda.add_fingerprint(H, 1)
|
||||
return 1
|
||||
return 1
|
||||
|
||||
/datum/outfit/proc/get_chameleon_disguise_info()
|
||||
var/list/types = list(uniform, suit, back, belt, gloves, shoes, head, mask, l_ear, r_ear, glasses, id, l_pocket, r_pocket, suit_store, r_hand, l_hand, pda)
|
||||
types += chameleon_extras
|
||||
listclearnulls(types)
|
||||
return types
|
||||
|
||||
@@ -123,7 +123,7 @@
|
||||
/datum/outfit/admin/syndicate/spy
|
||||
name = "Syndicate Spy"
|
||||
uniform = /obj/item/clothing/under/suit_jacket/really_black
|
||||
shoes = /obj/item/clothing/shoes/syndigaloshes/black
|
||||
shoes = /obj/item/clothing/shoes/chameleon/noslip
|
||||
uplink_uses = 40
|
||||
id_access = "Syndicate Agent"
|
||||
|
||||
@@ -228,7 +228,7 @@
|
||||
back = /obj/item/storage/backpack
|
||||
belt = /obj/item/storage/belt/utility/full/multitool
|
||||
gloves = /obj/item/clothing/gloves/combat
|
||||
shoes = /obj/item/clothing/shoes/syndigaloshes/black
|
||||
shoes = /obj/item/clothing/shoes/chameleon/noslip
|
||||
l_ear = /obj/item/radio/headset/centcom
|
||||
id = /obj/item/card/id
|
||||
pda = /obj/item/pda
|
||||
@@ -990,7 +990,7 @@
|
||||
suit = /obj/item/clothing/suit/hooded/chaplain_hoodie
|
||||
back = /obj/item/storage/backpack
|
||||
gloves = /obj/item/clothing/gloves/combat
|
||||
shoes = /obj/item/clothing/shoes/syndigaloshes/black
|
||||
shoes = /obj/item/clothing/shoes/chameleon/noslip
|
||||
l_ear = /obj/item/radio/headset/syndicate
|
||||
id = /obj/item/card/id/syndicate
|
||||
l_hand = /obj/item/twohanded/dualsaber/red
|
||||
@@ -1021,7 +1021,7 @@
|
||||
suit = /obj/item/clothing/suit/draculacoat
|
||||
back = /obj/item/storage/backpack
|
||||
gloves = /obj/item/clothing/gloves/combat
|
||||
shoes = /obj/item/clothing/shoes/syndigaloshes/black
|
||||
shoes = /obj/item/clothing/shoes/chameleon/noslip
|
||||
l_ear = /obj/item/radio/headset/syndicate
|
||||
id = /obj/item/card/id
|
||||
backpack_contents = list(
|
||||
|
||||
@@ -118,7 +118,7 @@
|
||||
var/global/list/newscaster_standard_feeds = list(/datum/news_announcement/bluespace_research, /datum/news_announcement/lotus_tree, /datum/news_announcement/random_junk, /datum/news_announcement/food_riots)
|
||||
|
||||
proc/process_newscaster()
|
||||
check_for_newscaster_updates(ticker.mode.newscaster_announcements)
|
||||
check_for_newscaster_updates(SSticker.mode.newscaster_announcements)
|
||||
|
||||
var/global/tmp/announced_news_types = list()
|
||||
proc/check_for_newscaster_updates(type)
|
||||
|
||||
@@ -0,0 +1,114 @@
|
||||
|
||||
/datum/radio_frequency
|
||||
var/frequency as num
|
||||
var/list/list/obj/devices = list()
|
||||
|
||||
/datum/radio_frequency/proc/post_signal(obj/source as obj|null, datum/signal/signal, var/filter = null as text|null, var/range = null as num|null)
|
||||
var/turf/start_point
|
||||
if(range)
|
||||
start_point = get_turf(source)
|
||||
if(!start_point)
|
||||
qdel(signal)
|
||||
return 0
|
||||
if(filter)
|
||||
send_to_filter(source, signal, filter, start_point, range)
|
||||
send_to_filter(source, signal, RADIO_DEFAULT, start_point, range)
|
||||
else
|
||||
//Broadcast the signal to everyone!
|
||||
for(var/next_filter in devices)
|
||||
send_to_filter(source, signal, next_filter, start_point, range)
|
||||
|
||||
//Sends a signal to all machines belonging to a given filter. Should be called by post_signal()
|
||||
/datum/radio_frequency/proc/send_to_filter(obj/source, datum/signal/signal, var/filter, var/turf/start_point = null, var/range = null)
|
||||
if(range && !start_point)
|
||||
return
|
||||
|
||||
for(var/obj/device in devices[filter])
|
||||
if(device == source)
|
||||
continue
|
||||
if(range)
|
||||
var/turf/end_point = get_turf(device)
|
||||
if(!end_point)
|
||||
continue
|
||||
if(start_point.z!=end_point.z || get_dist(start_point, end_point) > range)
|
||||
continue
|
||||
|
||||
device.receive_signal(signal, TRANSMISSION_RADIO, frequency)
|
||||
|
||||
/datum/radio_frequency/proc/add_listener(obj/device as obj, var/filter as text|null)
|
||||
if(!filter)
|
||||
filter = RADIO_DEFAULT
|
||||
//log_admin("add_listener(device=[device],filter=[filter]) frequency=[frequency]")
|
||||
var/list/obj/devices_line = devices[filter]
|
||||
if(!devices_line)
|
||||
devices_line = new
|
||||
devices[filter] = devices_line
|
||||
devices_line+=device
|
||||
// var/list/obj/devices_line___ = devices[filter_str]
|
||||
// var/l = devices_line___.len
|
||||
//log_admin("DEBUG: devices_line.len=[devices_line.len]")
|
||||
//log_admin("DEBUG: devices(filter_str).len=[l]")
|
||||
|
||||
/datum/radio_frequency/proc/remove_listener(obj/device)
|
||||
for(var/devices_filter in devices)
|
||||
var/list/devices_line = devices[devices_filter]
|
||||
devices_line-=device
|
||||
while(null in devices_line)
|
||||
devices_line -= null
|
||||
if(devices_line.len==0)
|
||||
devices -= devices_filter
|
||||
qdel(devices_line)
|
||||
|
||||
/datum/signal
|
||||
var/obj/source
|
||||
|
||||
var/transmission_method = 0 //unused at the moment
|
||||
//0 = wire
|
||||
//1 = radio transmission
|
||||
//2 = subspace transmission
|
||||
|
||||
var/list/data = list()
|
||||
var/encryption
|
||||
|
||||
var/frequency = 0
|
||||
|
||||
/datum/signal/proc/copy_from(datum/signal/model)
|
||||
source = model.source
|
||||
transmission_method = model.transmission_method
|
||||
data = model.data
|
||||
encryption = model.encryption
|
||||
frequency = model.frequency
|
||||
|
||||
/datum/signal/proc/debug_print()
|
||||
if(source)
|
||||
. = "signal = {source = '[source]' ([source:x],[source:y],[source:z])\n"
|
||||
else
|
||||
. = "signal = {source = '[source]' ()\n"
|
||||
for(var/i in data)
|
||||
. += "data\[\"[i]\"\] = \"[data[i]]\"\n"
|
||||
if(islist(data[i]))
|
||||
var/list/L = data[i]
|
||||
for(var/t in L)
|
||||
. += "data\[\"[i]\"\] list has: [t]"
|
||||
|
||||
/datum/signal/proc/get_race(mob/M)
|
||||
if(ishuman(M))
|
||||
var/mob/living/carbon/human/H = M
|
||||
. = H.dna.species.name
|
||||
else if(isbrain(M))
|
||||
var/mob/living/carbon/brain/B = M
|
||||
. = B.get_race()
|
||||
else if(issilicon(M))
|
||||
. = "Artificial Life"
|
||||
else if(isslime(M))
|
||||
. = "Slime"
|
||||
else if(isbot(M))
|
||||
. = "Bot"
|
||||
else if(isanimal(M))
|
||||
. = "Domestic Animal"
|
||||
else
|
||||
. = "Unidentifiable"
|
||||
|
||||
//callback used by objects to react to incoming radio signals
|
||||
/obj/proc/receive_signal(datum/signal/signal, receive_method, receive_param)
|
||||
return null
|
||||
@@ -7,8 +7,12 @@
|
||||
wooden container filled with 18th century coinage in the middle of a \
|
||||
lavawracked hellscape? It is clearly a mystery."
|
||||
|
||||
var/cost = null
|
||||
var/allow_duplicates = FALSE //A bit boring, don't you think? You can always explicitly allow it on a ruin definition
|
||||
var/unpickable = FALSE //If TRUE these won't be placed automatically (can still be forced or loaded with another ruin)
|
||||
var/always_place = FALSE //Will skip the whole weighting process and just plop this down, ideally you want the ruins of this kind to have no cost.
|
||||
var/placement_weight = 1 //How often should this ruin appear
|
||||
var/cost = 0 //Cost in ruin budget placement system
|
||||
var/allow_duplicates = TRUE
|
||||
var/list/never_spawn_with = null //If this ruin is spawned these will not eg list(/datum/map_template/ruin/base_alternate)
|
||||
|
||||
var/prefix = null
|
||||
var/suffix = null
|
||||
|
||||
@@ -0,0 +1,207 @@
|
||||
/datum/map_template/ruin/lavaland
|
||||
prefix = "_maps/map_files/RandomRuins/LavaRuins/"
|
||||
|
||||
/datum/map_template/ruin/lavaland/biodome
|
||||
cost = 5
|
||||
allow_duplicates = FALSE
|
||||
|
||||
/datum/map_template/ruin/lavaland/biodome/beach
|
||||
name = "Biodome Beach"
|
||||
id = "biodome-beach"
|
||||
description = "Seemingly plucked from a tropical destination, this beach is calm and cool, with the salty waves roaring softly in the background. \
|
||||
Comes with a rustic wooden bar and suicidal bartender."
|
||||
suffix = "lavaland_biodome_beach.dmm"
|
||||
|
||||
/datum/map_template/ruin/lavaland/cube
|
||||
name = "The Wishgranter Cube"
|
||||
id = "wishgranter-cube"
|
||||
description = "Nothing good can come from this. Learn from their mistakes and turn around."
|
||||
suffix = "lavaland_surface_cube.dmm"
|
||||
cost = 10
|
||||
allow_duplicates = FALSE
|
||||
|
||||
/datum/map_template/ruin/lavaland/seed_vault
|
||||
name = "Seed Vault"
|
||||
id = "seed-vault"
|
||||
description = "The creators of these vaults were a highly advanced and benevolent race, and launched many into the stars, hoping to aid fledgling civilizations. \
|
||||
However, all the inhabitants seem to do is grow drugs and guns."
|
||||
suffix = "lavaland_surface_seed_vault.dmm"
|
||||
cost = 10
|
||||
allow_duplicates = FALSE
|
||||
|
||||
datum/map_template/ruin/lavaland/ash_walker
|
||||
name = "Ash Walker Nest"
|
||||
id = "ash-walker"
|
||||
description = "A race of unbreathing lizards live here, that run faster than a human can, worship a broken dead city, and are capable of reproducing by something involving tentacles? \
|
||||
Probably best to stay clear."
|
||||
suffix = "lavaland_surface_ash_walker1.dmm"
|
||||
cost = 20
|
||||
allow_duplicates = FALSE
|
||||
|
||||
/datum/map_template/ruin/lavaland/syndicate_base
|
||||
name = "Syndicate Lava Base"
|
||||
id = "lava-base"
|
||||
description = "A secret base researching illegal bioweapons, it is closely guarded by an elite team of syndicate agents."
|
||||
suffix = "lavaland_surface_syndicate_base1.dmm"
|
||||
cost = 20
|
||||
allow_duplicates = FALSE
|
||||
|
||||
/datum/map_template/ruin/lavaland/free_golem
|
||||
name = "Free Golem Ship"
|
||||
id = "golem-ship"
|
||||
description = "Lumbering humanoids, made out of precious metals, move inside this ship. They frequently leave to mine more minerals, which they somehow turn into more of them. \
|
||||
Seem very intent on research and individual liberty, and also geology based naming?"
|
||||
cost = 20
|
||||
suffix = "lavaland_surface_golem_ship.dmm"
|
||||
allow_duplicates = FALSE
|
||||
|
||||
/datum/map_template/ruin/lavaland/animal_hospital
|
||||
name = "Animal Hospital"
|
||||
id = "animal-hospital"
|
||||
description = "Rats with cancer do not live very long. And the ones that wake up from cryostasis seem to commit suicide out of boredom."
|
||||
cost = 5
|
||||
suffix = "lavaland_surface_animal_hospital.dmm"
|
||||
allow_duplicates = FALSE
|
||||
|
||||
/datum/map_template/ruin/lavaland/sin
|
||||
cost = 10
|
||||
allow_duplicates = FALSE
|
||||
|
||||
/datum/map_template/ruin/lavaland/sin/envy
|
||||
name = "Ruin of Envy"
|
||||
id = "envy"
|
||||
description = "When you get what they have, then you'll finally be happy."
|
||||
suffix = "lavaland_surface_envy.dmm"
|
||||
|
||||
/datum/map_template/ruin/lavaland/sin/gluttony
|
||||
name = "Ruin of Gluttony"
|
||||
id = "gluttony"
|
||||
description = "If you eat enough, then eating will be all that you do."
|
||||
suffix = "lavaland_surface_gluttony.dmm"
|
||||
|
||||
/datum/map_template/ruin/lavaland/sin/greed
|
||||
name = "Ruin of Greed"
|
||||
id = "greed"
|
||||
description = "Sure you don't need magical powers, but you WANT them, and that's what's important."
|
||||
suffix = "lavaland_surface_greed.dmm"
|
||||
|
||||
/datum/map_template/ruin/lavaland/sin/pride
|
||||
name = "Ruin of Pride"
|
||||
id = "pride"
|
||||
description = "Wormhole lifebelts are for LOSERS, who you are better than."
|
||||
suffix = "lavaland_surface_pride.dmm"
|
||||
|
||||
/datum/map_template/ruin/lavaland/sin/sloth
|
||||
name = "Ruin of Sloth"
|
||||
id = "sloth"
|
||||
description = "..."
|
||||
suffix = "lavaland_surface_sloth.dmm"
|
||||
cost = 0
|
||||
|
||||
/datum/map_template/ruin/lavaland/ratvar
|
||||
name = "Dead God"
|
||||
id = "ratvar"
|
||||
description = "Ratvars final resting place."
|
||||
suffix = "lavaland_surface_dead_ratvar.dmm"
|
||||
cost = 0
|
||||
allow_duplicates = FALSE
|
||||
|
||||
/datum/map_template/ruin/lavaland/hierophant
|
||||
name = "Hierophant's Arena"
|
||||
id = "hierophant"
|
||||
description = "A strange, square chunk of metal of massive size. Inside awaits only death and many, many squares."
|
||||
suffix = "lavaland_surface_hierophant.dmm"
|
||||
allow_duplicates = FALSE
|
||||
always_place = TRUE
|
||||
|
||||
/datum/map_template/ruin/lavaland/blood_drunk_miner
|
||||
name = "Blood-Drunk Miner"
|
||||
id = "blooddrunk"
|
||||
description = "A strange arrangement of stone tiles and an insane, beastly miner contemplating them."
|
||||
suffix = "lavaland_surface_blooddrunk1.dmm"
|
||||
cost = 0
|
||||
allow_duplicates = FALSE //will only spawn one variant of the ruin
|
||||
|
||||
/datum/map_template/ruin/lavaland/blood_drunk_miner/guidance
|
||||
name = "Blood-Drunk Miner (Guidance)"
|
||||
suffix = "lavaland_surface_blooddrunk2.dmm"
|
||||
|
||||
/datum/map_template/ruin/lavaland/blood_drunk_miner/hunter
|
||||
name = "Blood-Drunk Miner (Hunter)"
|
||||
suffix = "lavaland_surface_blooddrunk3.dmm"
|
||||
|
||||
/datum/map_template/ruin/lavaland/ufo_crash
|
||||
name = "UFO Crash"
|
||||
id = "ufo-crash"
|
||||
description = "Turns out that keeping your abductees unconscious is really important. Who knew?"
|
||||
suffix = "lavaland_surface_ufo_crash.dmm"
|
||||
cost = 5
|
||||
|
||||
/datum/map_template/ruin/lavaland/xeno_nest
|
||||
name = "Xenomorph Nest"
|
||||
id = "xeno-nest"
|
||||
description = "These xenomorphs got bored of horrifically slaughtering people on space stations, and have settled down on a nice lava filled hellscape to focus on what's really important in life. \
|
||||
Quality memes."
|
||||
suffix = "lavaland_surface_xeno_nest.dmm"
|
||||
cost = 20
|
||||
|
||||
/datum/map_template/ruin/lavaland/fountain
|
||||
name = "Fountain Hall"
|
||||
id = "fountain"
|
||||
description = "The fountain has a warning on the side. DANGER: May have undeclared side effects that only become obvious when implemented."
|
||||
suffix = "lavaland_surface_fountain_hall.dmm"
|
||||
cost = 5
|
||||
|
||||
/datum/map_template/ruin/lavaland/survivalcapsule
|
||||
name = "Survival Capsule Ruins"
|
||||
id = "survivalcapsule"
|
||||
description = "What was once sanctuary to the common miner, is now their tomb."
|
||||
suffix = "lavaland_surface_survivalpod.dmm"
|
||||
cost = 5
|
||||
|
||||
/datum/map_template/ruin/lavaland/pizza
|
||||
name = "Ruined Pizza Party"
|
||||
id = "pizza"
|
||||
description = "Little Timmy's birthday pizza-bash took a turn for the worse when a bluespace anomaly passed by."
|
||||
suffix = "lavaland_surface_pizzaparty.dmm"
|
||||
allow_duplicates = FALSE
|
||||
cost = 5
|
||||
|
||||
/datum/map_template/ruin/lavaland/cultaltar
|
||||
name = "Summoning Ritual"
|
||||
id = "cultaltar"
|
||||
description = "A place of vile worship, the scrawling of blood in the middle glowing eerily. A demonic laugh echoes throughout the caverns"
|
||||
suffix = "lavaland_surface_cultaltar.dmm"
|
||||
allow_duplicates = FALSE
|
||||
cost = 10
|
||||
|
||||
/datum/map_template/ruin/lavaland/hermit
|
||||
name = "Makeshift Shelter"
|
||||
id = "hermitcave"
|
||||
description = "A place of shelter for a lone hermit, scraping by to live another day."
|
||||
suffix = "lavaland_surface_hermit.dmm"
|
||||
allow_duplicates = FALSE
|
||||
cost = 10
|
||||
|
||||
/datum/map_template/ruin/lavaland/swarmer_boss
|
||||
name = "Crashed Shuttle"
|
||||
id = "swarmerboss"
|
||||
description = "A Syndicate shuttle had an unfortunate stowaway..."
|
||||
suffix = "lavaland_surface_swarmer_crash.dmm"
|
||||
allow_duplicates = FALSE
|
||||
cost = 20
|
||||
|
||||
/datum/map_template/ruin/lavaland/miningripley
|
||||
name = "Ripley"
|
||||
id = "ripley"
|
||||
description = "A heavily-damaged mining ripley, property of a very unfortunate miner. You might have to do a bit of work to fix this thing up."
|
||||
suffix = "lavaland_surface_random_ripley.dmm"
|
||||
allow_duplicates = FALSE
|
||||
cost = 5
|
||||
|
||||
/datum/map_template/ruin/lavaland/puzzle
|
||||
name = "Ancient Puzzle"
|
||||
id = "puzzle"
|
||||
description = "Mystery to be solved."
|
||||
suffix = "lavaland_surface_puzzle.dmm"
|
||||
cost = 5
|
||||
@@ -25,6 +25,11 @@
|
||||
port_id = "ferry"
|
||||
name = "Base Shuttle Template (Ferry)"
|
||||
|
||||
/datum/map_template/shuttle/admin
|
||||
port_id = "admin"
|
||||
name = "Base Shuttle Template (Admin)"
|
||||
|
||||
|
||||
|
||||
// Shuttles start here:
|
||||
|
||||
@@ -117,3 +122,13 @@
|
||||
definitely no zombifyin' reagents!"
|
||||
admin_notes = "Meat currently contains no zombifying reagents, people on \
|
||||
meatspike must be spawned in."
|
||||
|
||||
/datum/map_template/shuttle/admin/hospital
|
||||
suffix = "hospital"
|
||||
name = "NHV Asclepius"
|
||||
description = "Nanostrasen Hospital ship, for medical assistance during disasters."
|
||||
|
||||
/datum/map_template/shuttle/admin/admin
|
||||
suffix = "admin"
|
||||
name = "NTV Argos"
|
||||
description = "Default Admin ship. An older ship used for special operations."
|
||||
|
||||
+19
-7
@@ -62,6 +62,7 @@ var/list/spells = typesof(/obj/effect/proc_holder/spell) //needed for the badmin
|
||||
var/charge_type = "recharge" //can be recharge or charges, see charge_max and charge_counter descriptions; can also be based on the holder's vars now, use "holder_var" for that
|
||||
|
||||
var/charge_max = 100 //recharge time in deciseconds if charge_type = "recharge" or starting charges if charge_type = "charges"
|
||||
var/starts_charged = TRUE //Does this spell start ready to go?
|
||||
var/charge_counter = 0 //can only cast spells if it equals recharge, ++ each decisecond if charge_type = "recharge" or -- each cast if charge_type = "charges"
|
||||
var/still_recharging_msg = "<span class='notice'>The spell is still recharging.</span>"
|
||||
|
||||
@@ -167,6 +168,8 @@ var/list/spells = typesof(/obj/effect/proc_holder/spell) //needed for the badmin
|
||||
if("holdervar")
|
||||
adjust_var(user, holder_var_type, holder_var_amount)
|
||||
|
||||
if(action)
|
||||
action.UpdateButtonIcon()
|
||||
return 1
|
||||
|
||||
/obj/effect/proc_holder/spell/proc/invocation(mob/user = usr) //spelling the spell out and setting it on recharge/reducing charges amount
|
||||
@@ -193,9 +196,11 @@ var/list/spells = typesof(/obj/effect/proc_holder/spell) //needed for the badmin
|
||||
/obj/effect/proc_holder/spell/New()
|
||||
..()
|
||||
action = new(src)
|
||||
|
||||
still_recharging_msg = "<span class='notice'>[name] is still recharging.</span>"
|
||||
charge_counter = charge_max
|
||||
if(starts_charged)
|
||||
charge_counter = charge_max
|
||||
else
|
||||
start_recharge()
|
||||
|
||||
/obj/effect/proc_holder/spell/Destroy()
|
||||
QDEL_NULL(action)
|
||||
@@ -212,9 +217,14 @@ var/list/spells = typesof(/obj/effect/proc_holder/spell) //needed for the badmin
|
||||
/obj/effect/proc_holder/spell/proc/start_recharge()
|
||||
if(action)
|
||||
action.UpdateButtonIcon()
|
||||
while(charge_counter < charge_max)
|
||||
sleep(1)
|
||||
charge_counter++
|
||||
START_PROCESSING(SSfastprocess, src)
|
||||
|
||||
/obj/effect/proc_holder/spell/process()
|
||||
charge_counter += 2
|
||||
if(charge_counter < charge_max)
|
||||
return
|
||||
STOP_PROCESSING(SSfastprocess, src)
|
||||
charge_counter = charge_max
|
||||
if(action)
|
||||
action.UpdateButtonIcon()
|
||||
|
||||
@@ -235,6 +245,8 @@ var/list/spells = typesof(/obj/effect/proc_holder/spell) //needed for the badmin
|
||||
else
|
||||
cast(targets, user = user)
|
||||
after_cast(targets)
|
||||
if(action)
|
||||
action.UpdateButtonIcon()
|
||||
|
||||
/obj/effect/proc_holder/spell/proc/before_cast(list/targets)
|
||||
if(overlay)
|
||||
@@ -291,8 +303,8 @@ var/list/spells = typesof(/obj/effect/proc_holder/spell) //needed for the badmin
|
||||
charge_counter++
|
||||
if("holdervar")
|
||||
adjust_var(user, holder_var_type, -holder_var_amount)
|
||||
|
||||
return
|
||||
if(action)
|
||||
action.UpdateButtonIcon()
|
||||
|
||||
/obj/effect/proc_holder/spell/proc/updateButtonIcon()
|
||||
if(action)
|
||||
|
||||
@@ -64,9 +64,9 @@
|
||||
|
||||
spawn(0) // allows cast to complete even if recipient ignores the prompt
|
||||
if(alert(target, "[user] wants to bless you, in the name of [user.p_their()] religion. Accept?", "Accept Blessing?", "Yes", "No") == "Yes") // prevents forced conversions
|
||||
user.visible_message("[user] starts blessing [target] in the name of [ticker.Bible_deity_name].", "<span class='notice'>You start blessing [target] in the name of [ticker.Bible_deity_name].</span>")
|
||||
user.visible_message("[user] starts blessing [target] in the name of [SSticker.Bible_deity_name].", "<span class='notice'>You start blessing [target] in the name of [SSticker.Bible_deity_name].</span>")
|
||||
if(do_after(user, 150, target = target))
|
||||
user.visible_message("[user] has blessed [target] in the name of [ticker.Bible_deity_name].", "<span class='notice'>You have blessed [target] in the name of [ticker.Bible_deity_name].</span>")
|
||||
user.visible_message("[user] has blessed [target] in the name of [SSticker.Bible_deity_name].", "<span class='notice'>You have blessed [target] in the name of [SSticker.Bible_deity_name].</span>")
|
||||
if(!target.mind.isblessed)
|
||||
target.mind.isblessed = TRUE
|
||||
user.mind.num_blessed++
|
||||
|
||||
@@ -44,7 +44,7 @@
|
||||
else if(amt_dam_fire <= 0)
|
||||
target.heal_overall_damage(amt_dam_brute,amt_dam_fire)
|
||||
target.adjustToxLoss(amt_dam_tox)
|
||||
target.oxyloss += amt_dam_oxy
|
||||
target.adjustOxyLoss(amt_dam_oxy)
|
||||
//disabling
|
||||
target.Weaken(amt_weakened)
|
||||
target.Paralyse(amt_paralysis)
|
||||
|
||||
@@ -20,7 +20,7 @@
|
||||
action_icon_state = "skeleton"
|
||||
|
||||
/obj/effect/proc_holder/spell/targeted/lichdom/Destroy()
|
||||
for(var/datum/mind/M in ticker.mode.wizards) //Make sure no other bones are about
|
||||
for(var/datum/mind/M in SSticker.mode.wizards) //Make sure no other bones are about
|
||||
for(var/obj/effect/proc_holder/spell/S in M.spell_list)
|
||||
if(istype(S,/obj/effect/proc_holder/spell/targeted/lichdom) && S != src)
|
||||
return ..()
|
||||
|
||||
@@ -88,7 +88,7 @@ obj/effect/proc_holder/spell/targeted/lightning/proc/Reset(mob/user = usr)
|
||||
var/mob/living/current = target
|
||||
if(bounces < 1)
|
||||
if(damaging)
|
||||
current.electrocute_act(bolt_energy,"Lightning Bolt",safety=1)
|
||||
current.electrocute_act(bolt_energy, "Lightning Bolt", safety = TRUE)
|
||||
else
|
||||
current.AdjustJitter(1000) //High numbers for violent convulsions
|
||||
current.do_jitter_animation(current.jitteriness)
|
||||
@@ -99,7 +99,7 @@ obj/effect/proc_holder/spell/targeted/lightning/proc/Reset(mob/user = usr)
|
||||
playsound(get_turf(current), 'sound/magic/lightningshock.ogg', 50, 1, -1)
|
||||
else
|
||||
if(damaging)
|
||||
current.electrocute_act(bolt_energy,"Lightning Bolt",safety=1)
|
||||
current.electrocute_act(bolt_energy, "Lightning Bolt", safety = TRUE)
|
||||
else
|
||||
current.AdjustJitter(1000) //High numbers for violent convulsions
|
||||
current.do_jitter_animation(current.jitteriness)
|
||||
|
||||
@@ -0,0 +1,27 @@
|
||||
/obj/effect/proc_holder/spell/targeted/night_vision
|
||||
name = "Toggle Nightvision"
|
||||
desc = "Toggle your nightvision mode."
|
||||
|
||||
charge_max = 10
|
||||
clothes_req = 0
|
||||
|
||||
message = "<span class='notice'>You toggle your night vision!</span>"
|
||||
range = -1
|
||||
include_user = 1
|
||||
|
||||
/obj/effect/proc_holder/spell/targeted/night_vision/cast(list/targets, mob/user = usr)
|
||||
for(var/mob/living/target in targets)
|
||||
switch(target.lighting_alpha)
|
||||
if (LIGHTING_PLANE_ALPHA_VISIBLE)
|
||||
target.lighting_alpha = LIGHTING_PLANE_ALPHA_MOSTLY_VISIBLE
|
||||
name = "Toggle Nightvision \[More]"
|
||||
if (LIGHTING_PLANE_ALPHA_MOSTLY_VISIBLE)
|
||||
target.lighting_alpha = LIGHTING_PLANE_ALPHA_MOSTLY_INVISIBLE
|
||||
name = "Toggle Nightvision \[Full]"
|
||||
if (LIGHTING_PLANE_ALPHA_MOSTLY_INVISIBLE)
|
||||
target.lighting_alpha = LIGHTING_PLANE_ALPHA_INVISIBLE
|
||||
name = "Toggle Nightvision \[OFF]"
|
||||
else
|
||||
target.lighting_alpha = LIGHTING_PLANE_ALPHA_VISIBLE
|
||||
name = "Toggle Nightvision \[ON]"
|
||||
target.update_sight()
|
||||
@@ -1,12 +1,13 @@
|
||||
// Not TECHNICALLY a datum, but this should never be instantiated
|
||||
// outside of the stat panel
|
||||
// Clickable stat() button
|
||||
/obj/effect/statclick
|
||||
var/target
|
||||
|
||||
/obj/effect/statclick/New(ntarget, text)
|
||||
target = ntarget
|
||||
INITIALIZE_IMMEDIATE(/obj/effect/statclick)
|
||||
|
||||
/obj/effect/statclick/Initialize(mapload, text, target)
|
||||
. = ..()
|
||||
name = text
|
||||
src.target = target
|
||||
|
||||
/obj/effect/statclick/proc/update(text)
|
||||
name = text
|
||||
@@ -19,10 +20,6 @@
|
||||
if(!is_admin(usr) || !target)
|
||||
return
|
||||
if(!class)
|
||||
if(istype(target, /datum/controller/process))
|
||||
class = "process"
|
||||
else if(istype(target, /datum/controller/processScheduler))
|
||||
class = "scheduler"
|
||||
if(istype(target, /datum/controller/subsystem))
|
||||
class = "subsystem"
|
||||
else if(istype(target, /datum/controller))
|
||||
|
||||
@@ -38,4 +38,18 @@
|
||||
|
||||
/datum/status_effect/void_price/tick()
|
||||
playsound(owner, 'sound/weapons/bite.ogg', 50, 1)
|
||||
owner.adjustBruteLoss(3)
|
||||
owner.adjustBruteLoss(3)
|
||||
|
||||
/datum/status_effect/exercised
|
||||
id = "Exercised"
|
||||
duration = 1200
|
||||
alert_type = null
|
||||
|
||||
/datum/status_effect/exercised/on_creation(mob/living/new_owner, ...)
|
||||
. = ..()
|
||||
STOP_PROCESSING(SSfastprocess, src)
|
||||
START_PROCESSING(SSprocessing, src) //this lasts 20 minutes, so SSfastprocess isn't needed.
|
||||
|
||||
/datum/status_effect/exercised/Destroy()
|
||||
. = ..()
|
||||
STOP_PROCESSING(SSprocessing, src)
|
||||
|
||||
@@ -7,4 +7,76 @@
|
||||
|
||||
/datum/status_effect/cultghost/tick()
|
||||
if(owner.reagents)
|
||||
owner.reagents.del_reagent("holywater") //can't be deconverted
|
||||
owner.reagents.del_reagent("holywater") //can't be deconverted
|
||||
|
||||
/datum/status_effect/saw_bleed
|
||||
id = "saw_bleed"
|
||||
duration = -1 //removed under specific conditions
|
||||
tick_interval = 6
|
||||
alert_type = null
|
||||
var/mutable_appearance/bleed_overlay
|
||||
var/mutable_appearance/bleed_underlay
|
||||
var/bleed_amount = 3
|
||||
var/bleed_buildup = 3
|
||||
var/delay_before_decay = 5
|
||||
var/bleed_damage = 200
|
||||
var/needs_to_bleed = FALSE
|
||||
|
||||
/datum/status_effect/saw_bleed/Destroy()
|
||||
if(owner)
|
||||
owner.cut_overlay(bleed_overlay)
|
||||
owner.underlays -= bleed_underlay
|
||||
QDEL_NULL(bleed_overlay)
|
||||
return ..()
|
||||
|
||||
/datum/status_effect/saw_bleed/on_apply()
|
||||
if(owner.stat == DEAD)
|
||||
return FALSE
|
||||
bleed_overlay = mutable_appearance('icons/effects/bleed.dmi', "bleed[bleed_amount]")
|
||||
bleed_underlay = mutable_appearance('icons/effects/bleed.dmi', "bleed[bleed_amount]")
|
||||
var/icon/I = icon(owner.icon, owner.icon_state, owner.dir)
|
||||
var/icon_height = I.Height()
|
||||
bleed_overlay.pixel_x = -owner.pixel_x
|
||||
bleed_overlay.pixel_y = FLOOR(icon_height * 0.25, 1)
|
||||
bleed_overlay.transform = matrix() * (icon_height/world.icon_size) //scale the bleed overlay's size based on the target's icon size
|
||||
bleed_underlay.pixel_x = -owner.pixel_x
|
||||
bleed_underlay.transform = matrix() * (icon_height/world.icon_size) * 3
|
||||
bleed_underlay.alpha = 40
|
||||
owner.add_overlay(bleed_overlay)
|
||||
owner.underlays += bleed_underlay
|
||||
return ..()
|
||||
|
||||
/datum/status_effect/saw_bleed/tick()
|
||||
if(owner.stat == DEAD)
|
||||
qdel(src)
|
||||
else
|
||||
add_bleed(-1)
|
||||
|
||||
/datum/status_effect/saw_bleed/proc/add_bleed(amount)
|
||||
owner.cut_overlay(bleed_overlay)
|
||||
owner.underlays -= bleed_underlay
|
||||
bleed_amount += amount
|
||||
if(bleed_amount)
|
||||
if(bleed_amount >= 10)
|
||||
needs_to_bleed = TRUE
|
||||
qdel(src)
|
||||
else
|
||||
if(amount > 0)
|
||||
tick_interval += delay_before_decay
|
||||
bleed_overlay.icon_state = "bleed[bleed_amount]"
|
||||
bleed_underlay.icon_state = "bleed[bleed_amount]"
|
||||
owner.add_overlay(bleed_overlay)
|
||||
owner.underlays += bleed_underlay
|
||||
else
|
||||
qdel(src)
|
||||
|
||||
/datum/status_effect/saw_bleed/on_remove()
|
||||
if(needs_to_bleed)
|
||||
var/turf/T = get_turf(owner)
|
||||
new /obj/effect/temp_visual/bleed/explode(T)
|
||||
for(var/d in alldirs)
|
||||
new /obj/effect/temp_visual/dir_setting/bloodsplatter(T, d)
|
||||
playsound(T, "desceration", 200, 1, -1)
|
||||
owner.adjustBruteLoss(bleed_damage)
|
||||
else
|
||||
new /obj/effect/temp_visual/bleed(get_turf(owner))
|
||||
@@ -32,11 +32,11 @@
|
||||
var/obj/screen/alert/status_effect/A = owner.throw_alert(id, alert_type)
|
||||
A.attached_effect = src //so the alert can reference us, if it needs to
|
||||
linked_alert = A //so we can reference the alert, if we need to
|
||||
GLOB.fast_processing.Add(src)
|
||||
START_PROCESSING(SSfastprocess, src)
|
||||
return TRUE
|
||||
|
||||
/datum/status_effect/Destroy()
|
||||
GLOB.fast_processing.Remove(src)
|
||||
STOP_PROCESSING(SSfastprocess, src)
|
||||
if(owner)
|
||||
owner.clear_alert(id)
|
||||
LAZYREMOVE(owner.status_effects, src)
|
||||
@@ -44,7 +44,7 @@
|
||||
owner = null
|
||||
return ..()
|
||||
|
||||
/datum/status_effect/proc/process()
|
||||
/datum/status_effect/process()
|
||||
if(!owner)
|
||||
qdel(src)
|
||||
return
|
||||
|
||||
@@ -1060,8 +1060,8 @@ var/list/all_supply_groups = list(supply_emergency,supply_security,supply_engine
|
||||
/datum/supply_packs/organic/bar
|
||||
name = "Bar Starter Kit"
|
||||
contains = list(/obj/item/storage/box/drinkingglasses,
|
||||
/obj/item/circuitboard/soda,
|
||||
/obj/item/circuitboard/beer)
|
||||
/obj/item/circuitboard/chem_dispenser/soda,
|
||||
/obj/item/circuitboard/chem_dispenser/beer)
|
||||
cost = 20
|
||||
containername = "beer starter kit"
|
||||
announce_beacons = list("Bar" = list("Bar"))
|
||||
@@ -1073,6 +1073,12 @@ var/list/all_supply_groups = list(supply_emergency,supply_security,supply_engine
|
||||
containertype = /obj/structure/closet/critter/cow
|
||||
containername = "cow crate"
|
||||
|
||||
/datum/supply_packs/organic/pig
|
||||
name = "Pig Crate"
|
||||
cost = 25
|
||||
containertype = /obj/structure/closet/critter/pig
|
||||
containername = "pig crate"
|
||||
|
||||
/datum/supply_packs/organic/goat
|
||||
name = "Goat Crate"
|
||||
cost = 25
|
||||
@@ -1102,7 +1108,8 @@ var/list/all_supply_groups = list(supply_emergency,supply_security,supply_engine
|
||||
name = "Cat Crate"
|
||||
cost = 50 //Cats are worth as much as corgis.
|
||||
containertype = /obj/structure/closet/critter/cat
|
||||
contains = list(/obj/item/clothing/accessory/petcollar)
|
||||
contains = list(/obj/item/clothing/accessory/petcollar,
|
||||
/obj/item/toy/cattoy)
|
||||
containername = "cat crate"
|
||||
|
||||
/datum/supply_packs/organic/pug
|
||||
@@ -1199,13 +1206,14 @@ var/list/all_supply_groups = list(supply_emergency,supply_security,supply_engine
|
||||
|
||||
/datum/supply_packs/organic/hydroponics/beekeeping_fullkit
|
||||
name = "Beekeeping Starter Kit"
|
||||
contains = list(/obj/structure/beebox,
|
||||
contains = list(/obj/structure/beebox/unwrenched,
|
||||
/obj/item/honey_frame,
|
||||
/obj/item/honey_frame,
|
||||
/obj/item/honey_frame,
|
||||
/obj/item/queen_bee/bought,
|
||||
/obj/item/clothing/head/beekeeper_head,
|
||||
/obj/item/clothing/suit/beekeeper_suit)
|
||||
/obj/item/clothing/suit/beekeeper_suit,
|
||||
/obj/item/melee/flyswatter)
|
||||
cost = 15
|
||||
containername = "beekeeping starter kit"
|
||||
|
||||
@@ -1354,6 +1362,14 @@ var/list/all_supply_groups = list(supply_emergency,supply_security,supply_engine
|
||||
cost = 40
|
||||
containername = "religious supplies crate"
|
||||
|
||||
/datum/supply_packs/misc/minerkit
|
||||
name = "Shaft Miner Starter Kit"
|
||||
cost = 30
|
||||
access = access_qm
|
||||
contains = list(/obj/item/storage/backpack/duffel/mining_conscript/noid)
|
||||
containertype = /obj/structure/closet/crate/secure
|
||||
containername = "shaft miner starter kit"
|
||||
|
||||
|
||||
///////////// Paper Work
|
||||
|
||||
|
||||
+223
-152
@@ -12,9 +12,9 @@ GLOBAL_LIST_INIT(uplink_items, subtypesof(/datum/uplink_item))
|
||||
var/datum/uplink_item/I = new path
|
||||
if(!I.item)
|
||||
continue
|
||||
if(I.gamemodes.len && ticker && !(ticker.mode.type in I.gamemodes))
|
||||
if(I.gamemodes.len && SSticker && !(SSticker.mode.type in I.gamemodes))
|
||||
continue
|
||||
if(I.excludefrom.len && ticker && (ticker.mode.type in I.excludefrom))
|
||||
if(I.excludefrom.len && SSticker && (SSticker.mode.type in I.excludefrom))
|
||||
continue
|
||||
if(I.last)
|
||||
last += I
|
||||
@@ -88,9 +88,9 @@ GLOBAL_LIST_INIT(uplink_items, subtypesof(/datum/uplink_item))
|
||||
|
||||
/datum/uplink_item/proc/spawn_item(var/turf/loc, var/obj/item/uplink/U)
|
||||
|
||||
if(hijack_only)
|
||||
if(hijack_only && !(usr.mind.special_role == SPECIAL_ROLE_NUKEOPS))//nukies get items that regular traitors only get with hijack. If a hijack-only item is not for nukies, then exclude it via the gamemode list.
|
||||
if(!(locate(/datum/objective/hijack) in usr.mind.objectives))
|
||||
to_chat(usr, "<span class='warning'>The Syndicate lacks resources to provide you with this item.</span>")
|
||||
to_chat(usr, "<span class='warning'>The Syndicate will only issue this extremely dangerous item to agents assigned the Hijack objective.</span>")
|
||||
return
|
||||
|
||||
if(item)
|
||||
@@ -182,6 +182,14 @@ GLOBAL_LIST_INIT(uplink_items, subtypesof(/datum/uplink_item))
|
||||
cost = 3
|
||||
job = list("Clown")
|
||||
|
||||
/datum/uplink_item/jobspecific/trick_revolver
|
||||
name = "Trick Revolver"
|
||||
desc = "A revolver that will fire backwards and kill whoever attempts to use it. Perfect for those pesky vigilante or just a good laugh."
|
||||
reference = "CTR"
|
||||
item = /obj/item/storage/box/syndie_kit/fake_revolver
|
||||
cost = 1
|
||||
job = list("Clown")
|
||||
|
||||
//mime
|
||||
/datum/uplink_item/jobspecific/caneshotgun
|
||||
name = "Cane Shotgun and Assassination Shells"
|
||||
@@ -433,7 +441,6 @@ GLOBAL_LIST_INIT(uplink_items, subtypesof(/datum/uplink_item))
|
||||
/datum/uplink_item/dangerous
|
||||
category = "Highly Visible and Dangerous Weapons"
|
||||
|
||||
|
||||
/datum/uplink_item/dangerous/pistol
|
||||
name = "FK-69 Pistol"
|
||||
reference = "SPI"
|
||||
@@ -551,37 +558,66 @@ GLOBAL_LIST_INIT(uplink_items, subtypesof(/datum/uplink_item))
|
||||
item = /obj/item/batterer
|
||||
cost = 5
|
||||
|
||||
/datum/uplink_item/dangerous/gygax
|
||||
// SUPPORT AND MECHAS
|
||||
|
||||
/datum/uplink_item/support
|
||||
category = "Support and Mechanized Exosuits"
|
||||
surplus = 0
|
||||
gamemodes = list(/datum/game_mode/nuclear)
|
||||
|
||||
/datum/uplink_item/support/gygax
|
||||
name = "Gygax Exosuit"
|
||||
desc = "A lightweight exosuit, painted in a dark scheme. Its speed and equipment selection make it excellent for hit-and-run style attacks. \
|
||||
This model lacks a method of space propulsion, and therefore it is advised to repair the mothership's teleporter if you wish to make use of it."
|
||||
reference = "GE"
|
||||
item = /obj/mecha/combat/gygax/dark/loaded
|
||||
cost = 90
|
||||
gamemodes = list(/datum/game_mode/nuclear)
|
||||
surplus = 0
|
||||
|
||||
/datum/uplink_item/dangerous/mauler
|
||||
/datum/uplink_item/support/mauler
|
||||
name = "Mauler Exosuit"
|
||||
desc = "A massive and incredibly deadly Syndicate exosuit. Features long-range targeting, thrust vectoring, and deployable smoke."
|
||||
reference = "ME"
|
||||
item = /obj/mecha/combat/marauder/mauler/loaded
|
||||
cost = 140
|
||||
gamemodes = list(/datum/game_mode/nuclear)
|
||||
surplus = 0
|
||||
|
||||
/datum/uplink_item/dangerous/syndieborg
|
||||
name = "Syndicate Cyborg"
|
||||
desc = "A cyborg designed and programmed for systematic extermination of non-Syndicate personnel. Comes in Assault, Medical, or Saboteur variants."
|
||||
reference = "SC"
|
||||
item = /obj/item/antag_spawner/borg_tele
|
||||
refund_path = /obj/item/antag_spawner/borg_tele
|
||||
cost = 50
|
||||
gamemodes = list(/datum/game_mode/nuclear)
|
||||
surplus = 0
|
||||
/datum/uplink_item/support/reinforcement
|
||||
name = "Reinforcement"
|
||||
desc = "Call in an additional team member. They won't come with any gear, so you'll have to save some telecrystals \
|
||||
to arm them as well."
|
||||
reference = "REINF"
|
||||
item = /obj/item/antag_spawner/nuke_ops
|
||||
refund_path = /obj/item/antag_spawner/nuke_ops
|
||||
cost = 25
|
||||
refundable = TRUE
|
||||
cant_discount = TRUE
|
||||
|
||||
/datum/uplink_item/support/reinforcement/assault_borg
|
||||
name = "Syndicate Assault Cyborg"
|
||||
desc = "A cyborg designed and programmed for systematic extermination of non-Syndicate personnel. \
|
||||
Comes equipped with a self-resupplying LMG, a grenade launcher, energy sword, emag, pinpointer, flash and crowbar."
|
||||
reference = "SAC"
|
||||
item = /obj/item/antag_spawner/nuke_ops/borg_tele/assault
|
||||
refund_path = /obj/item/antag_spawner/nuke_ops/borg_tele/assault
|
||||
cost = 65
|
||||
|
||||
/datum/uplink_item/support/reinforcement/medical_borg
|
||||
name = "Syndicate Medical Cyborg"
|
||||
desc = "A combat medical cyborg. Has limited offensive potential, but makes more than up for it with its support capabilities. \
|
||||
It comes equipped with a nanite hypospray, a medical beamgun, combat defibrillator, full surgical kit including an energy saw, an emag, pinpointer and flash. \
|
||||
Thanks to its organ storage bag, it can perform surgery as well as any humanoid."
|
||||
reference = "SMC"
|
||||
item = /obj/item/antag_spawner/nuke_ops/borg_tele/medical
|
||||
refund_path = /obj/item/antag_spawner/nuke_ops/borg_tele/medical
|
||||
cost = 35
|
||||
|
||||
/datum/uplink_item/support/reinforcement/saboteur_borg
|
||||
name = "Syndicate Saboteur Cyborg"
|
||||
desc = "A streamlined engineering cyborg, equipped with covert modules and engineering equipment. Also incapable of leaving the welder in the shuttle. \
|
||||
Its chameleon projector lets it disguise itself as a Nanotrasen cyborg, on top it has thermal vision and a pinpointer."
|
||||
reference = "SSC"
|
||||
item = /obj/item/antag_spawner/nuke_ops/borg_tele/saboteur
|
||||
refund_path = /obj/item/antag_spawner/nuke_ops/borg_tele/saboteur
|
||||
|
||||
/datum/uplink_item/dangerous/foamsmg
|
||||
name = "Toy Submachine Gun"
|
||||
desc = "A fully-loaded Donksoft bullpup submachine gun that fires riot grade rounds with a 20-round magazine."
|
||||
@@ -645,15 +681,6 @@ GLOBAL_LIST_INIT(uplink_items, subtypesof(/datum/uplink_item))
|
||||
item = /obj/item/ammo_box/magazine/m10mm/hp
|
||||
cost = 3
|
||||
|
||||
/datum/uplink_item/ammo/ammobag
|
||||
name = "Bulldog - Shotgun Ammo Grab Bag"
|
||||
desc = "A duffelbag filled with Bulldog ammo to kit out an entire team, at a discounted price."
|
||||
reference = "SAGL"
|
||||
item = /obj/item/storage/backpack/duffel/syndie/ammo/loaded
|
||||
cost = 10 //bulk buyer's discount. Very useful if you're buying a mech and dont have TC left to buy people non-shotgun guns
|
||||
gamemodes = list(/datum/game_mode/nuclear)
|
||||
cant_discount = TRUE
|
||||
|
||||
/datum/uplink_item/ammo/bullslug
|
||||
name = "Bulldog - 12g Slug Magazine"
|
||||
desc = "An additional 8-round slug magazine for use in the Bulldog shotgun. Now 8 times less likely to shoot your pals."
|
||||
@@ -686,6 +713,14 @@ GLOBAL_LIST_INIT(uplink_items, subtypesof(/datum/uplink_item))
|
||||
cost = 2
|
||||
gamemodes = list(/datum/game_mode/nuclear)
|
||||
|
||||
/datum/uplink_item/ammo/bulldog_ammobag
|
||||
name = "Bulldog - 12g Ammo Duffel Bag"
|
||||
desc = "A duffel bag filled with enough 12g ammo to supply an entire team, at a discounted price."
|
||||
reference = "12ADB"
|
||||
item = /obj/item/storage/backpack/duffel/syndie/ammo/shotgun
|
||||
cost = 12 // normally 18
|
||||
gamemodes = list(/datum/game_mode/nuclear)
|
||||
|
||||
/datum/uplink_item/ammo/smg
|
||||
name = "C-20r - .45 Magazine"
|
||||
desc = "An additional 20-round .45 magazine for use in the C-20r submachine gun. These bullets pack a lot of punch that can knock most targets down, but do limited overall damage."
|
||||
@@ -694,6 +729,14 @@ GLOBAL_LIST_INIT(uplink_items, subtypesof(/datum/uplink_item))
|
||||
cost = 2
|
||||
gamemodes = list(/datum/game_mode/nuclear)
|
||||
|
||||
/datum/uplink_item/ammo/smg_ammobag
|
||||
name = "C-20r - .45 Ammo Duffel Bag"
|
||||
desc = "A duffel bag filled with enough .45 ammo to supply an entire team, at a discounted price."
|
||||
reference = "45ADB"
|
||||
item = /obj/item/storage/backpack/duffel/syndie/ammo/smg
|
||||
cost = 14 // normally 20
|
||||
gamemodes = list(/datum/game_mode/nuclear)
|
||||
|
||||
/datum/uplink_item/ammo/carbine
|
||||
name = "Carbine - 5.56 Toploader Magazine"
|
||||
desc = "An additional 30-round 5.56 magazine for use in the M-90gl carbine. These bullets don't have the punch to knock most targets down, but dish out higher overall damage."
|
||||
@@ -805,7 +848,9 @@ GLOBAL_LIST_INIT(uplink_items, subtypesof(/datum/uplink_item))
|
||||
desc = "A manual that teaches a single user tactical Close-Quarters Combat before self-destructing. Does not restrict weapon usage, but cannot be used alongside Gloves of the North Star."
|
||||
reference = "CQC"
|
||||
item = /obj/item/CQC_manual
|
||||
cost = 9
|
||||
gamemodes = list(/datum/game_mode/nuclear)
|
||||
cost = 13
|
||||
surplus = 0
|
||||
|
||||
/datum/uplink_item/stealthy_weapons/cameraflash
|
||||
name = "Camera Flash"
|
||||
@@ -885,7 +930,7 @@ GLOBAL_LIST_INIT(uplink_items, subtypesof(/datum/uplink_item))
|
||||
desc = "Just add water to make your very own hostile to everything space carp. It looks just like a plushie. The first person to squeeze it will be registered as its owner, who it will not attack. If no owner is registered, it'll just attack everyone."
|
||||
reference = "DSC"
|
||||
item = /obj/item/toy/carpplushie/dehy_carp
|
||||
cost = 3
|
||||
cost = 2
|
||||
|
||||
// GRENADES AND EXPLOSIVES
|
||||
|
||||
@@ -906,6 +951,15 @@ GLOBAL_LIST_INIT(uplink_items, subtypesof(/datum/uplink_item))
|
||||
item = /obj/item/storage/box/syndie_kit/c4
|
||||
cost = 4
|
||||
|
||||
/datum/uplink_item/explosives/c4bag
|
||||
name = "Bag of C-4 explosives"
|
||||
desc = "Because sometimes quantity is quality. Contains 10 C-4 plastic explosives."
|
||||
reference = "C4B"
|
||||
item = /obj/item/storage/backpack/duffel/syndie/c4
|
||||
cost = 8 //20% discount!
|
||||
cant_discount = TRUE
|
||||
gamemodes = list(/datum/game_mode/nuclear)
|
||||
|
||||
/datum/uplink_item/explosives/breaching_charge
|
||||
name = "Composition X-4"
|
||||
desc = "X-4 is a shaped charge designed to be safe to the user while causing maximum damage to the occupants of the room beach breached. It has a modifiable timer with a minimum setting of 10 seconds."
|
||||
@@ -914,6 +968,17 @@ GLOBAL_LIST_INIT(uplink_items, subtypesof(/datum/uplink_item))
|
||||
cost = 2
|
||||
gamemodes = list(/datum/game_mode/nuclear)
|
||||
|
||||
/datum/uplink_item/explosives/x4bag
|
||||
name = "Bag of X-4 explosives"
|
||||
desc = "Contains 3 X-4 shaped plastic explosives. Similar to C4, but with a stronger blast that is directional instead of circular. \
|
||||
X-4 can be placed on a solid surface, such as a wall or window, and it will blast through the wall, injuring anything on the opposite side, while being safer to the user. \
|
||||
For when you want a controlled explosion that leaves a wider, deeper, hole."
|
||||
reference = "X4B"
|
||||
item = /obj/item/storage/backpack/duffel/syndie/x4
|
||||
cost = 4
|
||||
cant_discount = TRUE
|
||||
gamemodes = list(/datum/game_mode/nuclear)
|
||||
|
||||
/datum/uplink_item/explosives/syndicate_bomb
|
||||
name = "Syndicate Bomb"
|
||||
desc = "The Syndicate Bomb has an adjustable timer with a minimum setting of 60 seconds. Ordering the bomb sends you a small beacon, which will teleport the explosive to your location when you activate it. \
|
||||
@@ -921,6 +986,8 @@ GLOBAL_LIST_INIT(uplink_items, subtypesof(/datum/uplink_item))
|
||||
reference = "SB"
|
||||
item = /obj/item/radio/beacon/syndicate/bomb
|
||||
cost = 11
|
||||
surplus = 0
|
||||
cant_discount = TRUE
|
||||
|
||||
/datum/uplink_item/explosives/syndicate_minibomb
|
||||
name = "Syndicate Minibomb"
|
||||
@@ -970,13 +1037,22 @@ GLOBAL_LIST_INIT(uplink_items, subtypesof(/datum/uplink_item))
|
||||
gamemodes = list(/datum/game_mode/nuclear)
|
||||
surplus = 0
|
||||
|
||||
/datum/uplink_item/explosives/atmosgrenades
|
||||
name = "Atmos Grenades"
|
||||
desc = "A box of two (2) grenades that wreak havoc with the atmosphere of the target area. Capable of engulfing a large area in lit plasma, or N2O. Deploy with extreme caution!"
|
||||
reference = "AGG"
|
||||
item = /obj/item/storage/box/syndie_kit/atmosgasgrenades
|
||||
cost = 11
|
||||
/datum/uplink_item/explosives/atmosn2ogrenades
|
||||
name = "Knockout Gas Grenades"
|
||||
desc = "A box of two (2) grenades that spread knockout gas over a large area. Equip internals before using one of these."
|
||||
reference = "ANG"
|
||||
item = /obj/item/storage/box/syndie_kit/atmosn2ogrenades
|
||||
cost = 8
|
||||
|
||||
/datum/uplink_item/explosives/atmosfiregrenades
|
||||
name = "Plasma Fire Grenades"
|
||||
desc = "A box of two (2) grenades that cause large plasma fires. Can be used to deny access to a large area. Most useful if you have an atmospherics hardsuit."
|
||||
reference = "APG"
|
||||
item = /obj/item/storage/box/syndie_kit/atmosfiregrenades
|
||||
hijack_only = TRUE
|
||||
cost = 12
|
||||
surplus = 0
|
||||
cant_discount = TRUE
|
||||
|
||||
/datum/uplink_item/explosives/emp
|
||||
name = "EMP Grenades and Implanter Kit"
|
||||
@@ -991,13 +1067,6 @@ GLOBAL_LIST_INIT(uplink_items, subtypesof(/datum/uplink_item))
|
||||
/datum/uplink_item/stealthy_tools
|
||||
category = "Stealth and Camouflage Items"
|
||||
|
||||
/datum/uplink_item/stealthy_tools/chameleon_jumpsuit
|
||||
name = "Chameleon Jumpsuit"
|
||||
desc = "A jumpsuit used to imitate the uniforms of Nanotrasen crewmembers."
|
||||
reference = "CJ"
|
||||
item = /obj/item/clothing/under/chameleon
|
||||
cost = 2
|
||||
|
||||
/datum/uplink_item/stealthy_tools/chameleon_stamp
|
||||
name = "Chameleon Stamp"
|
||||
desc = "A stamp that can be activated to imitate an official Nanotrasen Stamp. The disguised stamp will work exactly like the real stamp and will allow you to forge false documents to gain access or equipment; \
|
||||
@@ -1016,20 +1085,19 @@ GLOBAL_LIST_INIT(uplink_items, subtypesof(/datum/uplink_item))
|
||||
surplus = 35
|
||||
|
||||
/datum/uplink_item/stealthy_tools/syndigaloshes
|
||||
name = "No-Slip Syndicate Shoes"
|
||||
desc = "These allow you to run on wet floors. They do not work on lubricated surfaces."
|
||||
name = "No-Slip Chameleon Shoes"
|
||||
desc = "These shoes will allow the wearer to run on wet floors and slippery objects without falling down. \
|
||||
They do not work on heavily lubricated surfaces."
|
||||
reference = "NSSS"
|
||||
item = /obj/item/clothing/shoes/syndigaloshes
|
||||
item = /obj/item/clothing/shoes/chameleon/noslip
|
||||
cost = 2
|
||||
excludefrom = list(/datum/game_mode/nuclear)
|
||||
|
||||
/datum/uplink_item/stealthy_tools/syndigaloshes/nuke
|
||||
name = "Tactical No-Slip Brown Shoes"
|
||||
desc = "These allow you to run on wet floors. They do not work on lubricated surfaces, and the maker swears they're better than normal ones, somehow."
|
||||
reference = "NNSSS"
|
||||
reference = "TNSSS"
|
||||
cost = 4 //but they aren't
|
||||
gamemodes = list(/datum/game_mode/nuclear)
|
||||
excludefrom = list()
|
||||
gamemodes = list(/datum/game_mode/nuclear)
|
||||
|
||||
/datum/uplink_item/stealthy_tools/chamsechud
|
||||
name = "Chameleon Security HUD"
|
||||
@@ -1039,10 +1107,10 @@ GLOBAL_LIST_INIT(uplink_items, subtypesof(/datum/uplink_item))
|
||||
cost = 2
|
||||
|
||||
/datum/uplink_item/stealthy_tools/thermal
|
||||
name = "Thermal Imaging Glasses"
|
||||
desc = "These glasses are thermals disguised as engineers' optical meson scanners. They allow you to see organisms through walls by capturing the upper portion of the infra-red light spectrum, emitted as heat and light by objects. Hotter objects, such as warm bodies, cybernetic organisms and artificial intelligence cores emit more of this light than cooler objects like walls and airlocks."
|
||||
name = "Thermal Chameleon Glasses"
|
||||
desc = "These glasses are thermals with Syndicate chameleon technology built into them. They allow you to see organisms through walls by capturing the upper portion of the infra-red light spectrum, emitted as heat and light by objects. Hotter objects, such as warm bodies, cybernetic organisms and artificial intelligence cores emit more of this light than cooler objects like walls and airlocks."
|
||||
reference = "THIG"
|
||||
item = /obj/item/clothing/glasses/thermal/syndi
|
||||
item = /obj/item/clothing/glasses/chameleon/thermal
|
||||
cost = 6
|
||||
|
||||
/datum/uplink_item/stealthy_tools/traitor_belt
|
||||
@@ -1070,12 +1138,13 @@ GLOBAL_LIST_INIT(uplink_items, subtypesof(/datum/uplink_item))
|
||||
item = /obj/item/card/id/syndicate
|
||||
cost = 2
|
||||
|
||||
/datum/uplink_item/stealthy_tools/voice_changer
|
||||
name = "Voice Changer"
|
||||
desc = "A conspicuous gas mask that mimics the voice named on your identification card. When no identification is worn, the mask will render your voice unrecognisable."
|
||||
reference = "VC"
|
||||
item = /obj/item/clothing/mask/gas/voice
|
||||
cost = 3
|
||||
/datum/uplink_item/stealthy_tools/chameleon
|
||||
name = "Chameleon Kit"
|
||||
desc = "A set of items that contain chameleon technology allowing you to disguise as pretty much anything on the station, and more! \
|
||||
Due to budget cuts, the shoes don't provide protection against slipping. The set comes with a complementary chameleon stamp."
|
||||
reference = "CHAM"
|
||||
item = /obj/item/storage/box/syndie_kit/chameleon
|
||||
cost = 2
|
||||
|
||||
/datum/uplink_item/stealthy_tools/chameleon_proj
|
||||
name = "Chameleon-Projector"
|
||||
@@ -1134,7 +1203,7 @@ GLOBAL_LIST_INIT(uplink_items, subtypesof(/datum/uplink_item))
|
||||
|
||||
/datum/uplink_item/stealthy_tools/clownkit
|
||||
name = "Honk Brand Infiltration Kit"
|
||||
desc = "All the tools you need to play the best prank Nanotrasen has ever seen. Includes a voice changer clown mask, magnetic clown shoes, and standard clown outfit, tools, and backpack."
|
||||
desc = "All the tools you need to play the best prank Nanotrasen has ever seen. Includes a voice changer mask, magnetic clown shoes, and standard clown outfit, tools, and backpack."
|
||||
reference = "HBIK"
|
||||
item = /obj/item/storage/backpack/clown/syndie
|
||||
cost = 6
|
||||
@@ -1311,13 +1380,6 @@ GLOBAL_LIST_INIT(uplink_items, subtypesof(/datum/uplink_item))
|
||||
surplus = 0
|
||||
hijack_only = TRUE //This is an item only useful for a hijack traitor, as such, it should only be available in those scenarios.
|
||||
cant_discount = TRUE
|
||||
excludefrom = list(/datum/game_mode/nuclear)
|
||||
|
||||
/datum/uplink_item/device_tools/singularity_beacon/nuke
|
||||
reference = "SNGBN"
|
||||
hijack_only = FALSE // This inherited version exists so nukies can use it while keeping the original hijack only
|
||||
excludefrom = list()
|
||||
gamemodes = list(/datum/game_mode/nuclear)
|
||||
|
||||
/datum/uplink_item/device_tools/syndicate_detonator
|
||||
name = "Syndicate Detonator"
|
||||
@@ -1342,37 +1404,6 @@ GLOBAL_LIST_INIT(uplink_items, subtypesof(/datum/uplink_item))
|
||||
item = /obj/item/multitool/ai_detect
|
||||
cost = 1
|
||||
|
||||
/datum/uplink_item/device_tools/telecrystal
|
||||
name = "Raw Telecrystal"
|
||||
desc = "Telecrystal in its rawest and purest form; can be utilized on active uplinks to increase their telecrystal count."
|
||||
reference = "RTC"
|
||||
item = /obj/item/stack/telecrystal
|
||||
cost = 1
|
||||
surplus = 0
|
||||
cant_discount = TRUE
|
||||
|
||||
/datum/uplink_item/device_tools/telecrystal/five
|
||||
name = "5 Raw Telecrystals"
|
||||
desc = "Five telecrystals in their rawest and purest form; can be utilized on active uplinks to increase their telecrystal count."
|
||||
reference = "RTCF"
|
||||
item = /obj/item/stack/telecrystal/five
|
||||
cost = 5
|
||||
|
||||
/datum/uplink_item/device_tools/telecrystal/twenty
|
||||
name = "20 Raw Telecrystals"
|
||||
desc = "Twenty telecrystals in their rawest and purest form; can be utilized on active uplinks to increase their telecrystal count."
|
||||
reference = "RTCT"
|
||||
item = /obj/item/stack/telecrystal/twenty
|
||||
cost = 20
|
||||
|
||||
/datum/uplink_item/device_tools/telecrystal/fifty
|
||||
name = "50 Raw Telecrystals"
|
||||
desc = "Fifty telecrystals in their rawest and purest form. You know you want that Mauler."
|
||||
reference = "RTCB"
|
||||
item = /obj/item/stack/telecrystal/fifty
|
||||
cost = 50
|
||||
gamemodes = list(/datum/game_mode/nuclear)
|
||||
|
||||
/datum/uplink_item/device_tools/jammer
|
||||
name = "Radio Jammer"
|
||||
desc = "This device will disrupt any nearby outgoing radio communication when activated."
|
||||
@@ -1409,7 +1440,7 @@ GLOBAL_LIST_INIT(uplink_items, subtypesof(/datum/uplink_item))
|
||||
|
||||
/datum/uplink_item/device_tools/medgun
|
||||
name = "Medbeam Gun"
|
||||
desc = "Medical Beam Gun, useful in prolonged firefights."
|
||||
desc = "Medical Beam Gun, useful in prolonged firefights. DO NOT CROSS THE BEAMS. Crossing beams with another medbeam or attaching two beams to one target will have explosive consequences."
|
||||
item = /obj/item/gun/medbeam
|
||||
reference = "MBG"
|
||||
cost = 15
|
||||
@@ -1472,11 +1503,10 @@ GLOBAL_LIST_INIT(uplink_items, subtypesof(/datum/uplink_item))
|
||||
category = "Cybernetic Implants"
|
||||
surplus = 0
|
||||
gamemodes = list(/datum/game_mode/nuclear)
|
||||
var/cyber_bundle = FALSE
|
||||
|
||||
/datum/uplink_item/cyber_implants/spawn_item(turf/loc, obj/item/uplink/U)
|
||||
if(item)
|
||||
if(findtext(item, /obj/item/organ/internal/cyberimp) && !cyber_bundle)
|
||||
if(findtext(item, /obj/item/organ/internal/cyberimp))
|
||||
U.uses -= max(cost, 0)
|
||||
U.used_TC += cost
|
||||
feedback_add_details("traitor_uplink_items_bought", name) //this one and the line before copypasted because snowflaek code
|
||||
@@ -1507,22 +1537,12 @@ GLOBAL_LIST_INIT(uplink_items, subtypesof(/datum/uplink_item))
|
||||
cost = 12
|
||||
|
||||
/datum/uplink_item/cyber_implants/reviver
|
||||
name = "Reviver Implant"
|
||||
desc = "This implant will attempt to revive you if you lose consciousness. Comes with an automated implanting tool."
|
||||
name = "Hardened Reviver Implant"
|
||||
desc = "This implant will attempt to revive you if you lose consciousness. It is invulnerable to EMPs. Comes with an automated implanting tool."
|
||||
reference = "CIR"
|
||||
item = /obj/item/organ/internal/cyberimp/chest/reviver
|
||||
item = /obj/item/organ/internal/cyberimp/chest/reviver/hardened
|
||||
cost = 8
|
||||
|
||||
/datum/uplink_item/cyber_implants/bundle
|
||||
name = "Cybernetic Implants Bundle"
|
||||
desc = "A random selection of cybernetic implants. Guaranteed 5 high quality implants. \
|
||||
Comes with an automated implanting tool."
|
||||
reference = "CIB"
|
||||
item = /obj/item/storage/box/cyber_implants/bundle
|
||||
cost = 40
|
||||
cyber_bundle = TRUE
|
||||
cant_discount = TRUE
|
||||
|
||||
// POINTLESS BADASSERY
|
||||
|
||||
/datum/uplink_item/badass
|
||||
@@ -1536,15 +1556,6 @@ GLOBAL_LIST_INIT(uplink_items, subtypesof(/datum/uplink_item))
|
||||
item = /obj/item/storage/fancy/cigarettes/cigpack_syndicate
|
||||
cost = 2
|
||||
|
||||
/datum/uplink_item/badass/bundle
|
||||
name = "Syndicate Bundle"
|
||||
desc = "Syndicate Bundles are specialised groups of items that arrive in a plain box. These items are collectively worth more than 20 telecrystals, but you do not know which specialisation you will receive."
|
||||
reference = "SYB"
|
||||
item = /obj/item/storage/box/syndicate
|
||||
cost = 20
|
||||
excludefrom = list(/datum/game_mode/nuclear)
|
||||
cant_discount = TRUE
|
||||
|
||||
/datum/uplink_item/badass/syndiecards
|
||||
name = "Syndicate Playing Cards"
|
||||
desc = "A special deck of space-grade playing cards with a mono-molecular edge and metal reinforcement, making them lethal weapons both when wielded as a blade and when thrown. \
|
||||
@@ -1587,50 +1598,81 @@ GLOBAL_LIST_INIT(uplink_items, subtypesof(/datum/uplink_item))
|
||||
cost = 20
|
||||
gamemodes = list(/datum/game_mode/nuclear)
|
||||
|
||||
/*/datum/uplink_item/badass/random
|
||||
name = "Random Item"
|
||||
desc = "Picking this choice will send you a random item from the list. Useful for when you cannot think of a strategy to finish your objectives with."
|
||||
reference = "RAIT"
|
||||
/datum/uplink_item/bundles_TC
|
||||
category = "Bundles and Telecrystals"
|
||||
surplus = 0
|
||||
cant_discount = TRUE
|
||||
|
||||
/datum/uplink_item/bundles_TC/bulldog
|
||||
name = "Bulldog Bundle"
|
||||
desc = "Lean and mean: Optimized for people that want to get up close and personal. Contains the popular \
|
||||
Bulldog shotgun, two 12g buckshot drums, and a pair of Thermal imaging goggles."
|
||||
reference = "BULB"
|
||||
item = /obj/item/storage/backpack/duffel/syndie/bulldogbundle
|
||||
cost = 9 // normally 12
|
||||
gamemodes = list(/datum/game_mode/nuclear)
|
||||
|
||||
/datum/uplink_item/bundles_TC/c20r
|
||||
name = "C-20r Bundle"
|
||||
desc = "Old Faithful: The classic C-20r, bundled with two magazines and a (surplus) suppressor at discount price."
|
||||
reference = "C20B"
|
||||
item = /obj/item/storage/backpack/duffel/syndie/c20rbundle
|
||||
cost = 14 // normally 17
|
||||
gamemodes = list(/datum/game_mode/nuclear)
|
||||
|
||||
/datum/uplink_item/bundles_TC/cyber_implants
|
||||
name = "Cybernetic Implants Bundle"
|
||||
desc = "A random selection of cybernetic implants. Guaranteed 5 high quality implants. \
|
||||
Comes with an automated implanting tool."
|
||||
reference = "CIB"
|
||||
item = /obj/item/storage/box/cyber_implants/bundle
|
||||
cost = 40
|
||||
gamemodes = list(/datum/game_mode/nuclear)
|
||||
|
||||
/datum/uplink_item/bundles_TC/medical
|
||||
name = "Medical Bundle"
|
||||
desc = "The support specialist: Aid your fellow operatives with this medical bundle. Contains a tactical medkit, \
|
||||
a Donksoft LMG and a box of riot darts."
|
||||
reference = "MEDB"
|
||||
item = /obj/item/storage/backpack/duffel/syndie/med/medicalbundle
|
||||
cost = 15 // normally 20
|
||||
gamemodes = list(/datum/game_mode/nuclear)
|
||||
|
||||
/datum/uplink_item/bundles_TC/sniper
|
||||
name = "Sniper bundle"
|
||||
desc = "Elegant and refined: Contains a collapsed sniper rifle in an expensive carrying case, \
|
||||
two soporific knockout magazines, a free surplus suppressor, and a sharp-looking tactical turtleneck suit. \
|
||||
We'll throw in a free red tie if you order NOW."
|
||||
reference = "SNPB"
|
||||
item = /obj/item/storage/briefcase/sniperbundle
|
||||
cost = 18 // normally 23
|
||||
gamemodes = list(/datum/game_mode/nuclear)
|
||||
|
||||
/datum/uplink_item/bundles_TC/badass
|
||||
name = "Syndicate Bundle"
|
||||
desc = "Syndicate Bundles are specialised groups of items that arrive in a plain box. These items are collectively worth more than 20 telecrystals, but you do not know which specialisation you will receive."
|
||||
reference = "SYB"
|
||||
item = /obj/item/storage/box/syndicate
|
||||
cost = 0
|
||||
cost = 20
|
||||
excludefrom = list(/datum/game_mode/nuclear)
|
||||
|
||||
/datum/uplink_item/badass/random/spawn_item(var/turf/loc, var/obj/item/uplink/U)
|
||||
|
||||
var/list/buyable_items = get_uplink_items()
|
||||
var/list/possible_items = list()
|
||||
|
||||
for(var/category in buyable_items)
|
||||
for(var/datum/uplink_item/I in buyable_items[category])
|
||||
if(I == src)
|
||||
continue
|
||||
if(I.cost > U.uses)
|
||||
continue
|
||||
possible_items += I
|
||||
|
||||
if(possible_items.len)
|
||||
var/datum/uplink_item/I = pick(possible_items)
|
||||
U.uses -= max(0, I.cost)
|
||||
feedback_add_details("traitor_uplink_items_bought","RN")
|
||||
return new I.item(loc) */
|
||||
|
||||
/datum/uplink_item/badass/surplus_crate
|
||||
/datum/uplink_item/bundles_TC/surplus_crate
|
||||
name = "Syndicate Surplus Crate"
|
||||
desc = "A crate containing 50 telecrystals worth of random syndicate leftovers."
|
||||
reference = "SYSC"
|
||||
cost = 20
|
||||
item = /obj/item/storage/box/syndicate
|
||||
excludefrom = list(/datum/game_mode/nuclear)
|
||||
cant_discount = TRUE // You fucking wish
|
||||
var/crate_value = 50
|
||||
|
||||
/datum/uplink_item/badass/surplus_crate/super
|
||||
/datum/uplink_item/bundles_TC/surplus_crate/super
|
||||
name = "Syndicate Super Surplus Crate"
|
||||
desc = "A crate containing 125 telecrystals worth of random syndicate leftovers."
|
||||
reference = "SYSS"
|
||||
cost = 40
|
||||
crate_value = 125
|
||||
|
||||
/datum/uplink_item/badass/surplus_crate/spawn_item(turf/loc, obj/item/uplink/U)
|
||||
/datum/uplink_item/bundles_TC/surplus_crate/spawn_item(turf/loc, obj/item/uplink/U)
|
||||
var/obj/structure/closet/crate/C = new(loc)
|
||||
var/list/temp_uplink_list = get_uplink_items()
|
||||
var/list/buyable_items = list()
|
||||
@@ -1660,3 +1702,32 @@ GLOBAL_LIST_INIT(uplink_items, subtypesof(/datum/uplink_item))
|
||||
new item(C)
|
||||
U.purchase_log += "<BIG>[bicon(item)]</BIG>"
|
||||
log_game("[key_name(usr)] purchased a surplus crate with [jointext(itemlog, ", ")]")
|
||||
|
||||
/datum/uplink_item/bundles_TC/telecrystal
|
||||
name = "Raw Telecrystal"
|
||||
desc = "Telecrystal in its rawest and purest form; can be utilized on active uplinks to increase their telecrystal count."
|
||||
reference = "RTC"
|
||||
item = /obj/item/stack/telecrystal
|
||||
cost = 1
|
||||
|
||||
/datum/uplink_item/bundles_TC/telecrystal/five
|
||||
name = "5 Raw Telecrystals"
|
||||
desc = "Five telecrystals in their rawest and purest form; can be utilized on active uplinks to increase their telecrystal count."
|
||||
reference = "RTCF"
|
||||
item = /obj/item/stack/telecrystal/five
|
||||
cost = 5
|
||||
|
||||
/datum/uplink_item/bundles_TC/telecrystal/twenty
|
||||
name = "20 Raw Telecrystals"
|
||||
desc = "Twenty telecrystals in their rawest and purest form; can be utilized on active uplinks to increase their telecrystal count."
|
||||
reference = "RTCT"
|
||||
item = /obj/item/stack/telecrystal/twenty
|
||||
cost = 20
|
||||
|
||||
/datum/uplink_item/bundles_TC/telecrystal/fifty
|
||||
name = "50 Raw Telecrystals"
|
||||
desc = "Fifty telecrystals in their rawest and purest form. You know you want that Mauler."
|
||||
reference = "RTCB"
|
||||
item = /obj/item/stack/telecrystal/fifty
|
||||
cost = 50
|
||||
gamemodes = list(/datum/game_mode/nuclear)
|
||||
@@ -1,13 +1,15 @@
|
||||
/datum/vision_override
|
||||
var/name = "vision override"
|
||||
var/see_in_dark = 0
|
||||
var/see_invisible = 0
|
||||
var/light_sensitive = 0
|
||||
|
||||
var/sight_flags = 0
|
||||
var/see_in_dark = 0
|
||||
var/lighting_alpha
|
||||
|
||||
var/light_sensitive = 0
|
||||
|
||||
/datum/vision_override/nightvision
|
||||
see_in_dark = 8
|
||||
see_invisible = SEE_INVISIBLE_MINIMUM
|
||||
lighting_alpha = LIGHTING_PLANE_ALPHA_MOSTLY_INVISIBLE
|
||||
|
||||
/datum/vision_override/nightvision/thermals
|
||||
sight_flags = SEE_MOBS
|
||||
|
||||
@@ -28,6 +28,7 @@
|
||||
var/impacted_z_levels // The list of z-levels that this weather is actively affecting
|
||||
|
||||
var/overlay_layer = AREA_LAYER //Since it's above everything else, this is the layer used by default. TURF_LAYER is below mobs and walls if you need to use that.
|
||||
var/overlay_plane = BLACKNESS_PLANE
|
||||
var/aesthetic = FALSE //If the weather has no purpose other than looks
|
||||
var/immunity_type = "storm" //Used by mobs to prevent them from being affected by the weather
|
||||
|
||||
@@ -106,6 +107,8 @@
|
||||
|
||||
/datum/weather/proc/can_weather_act(mob/living/L) //Can this weather impact a mob?
|
||||
var/turf/mob_turf = get_turf(L)
|
||||
if(!istype(L))
|
||||
return
|
||||
if(mob_turf && !(mob_turf.z in impacted_z_levels))
|
||||
return
|
||||
if(immunity_type in L.weather_immunities)
|
||||
@@ -121,6 +124,7 @@
|
||||
for(var/V in impacted_areas)
|
||||
var/area/N = V
|
||||
N.layer = overlay_layer
|
||||
N.plane = overlay_plane
|
||||
N.icon = 'icons/effects/weather_effects.dmi'
|
||||
N.invisibility = 0
|
||||
N.color = weather_color
|
||||
@@ -135,6 +139,6 @@
|
||||
N.color = null
|
||||
N.icon_state = ""
|
||||
N.icon = 'icons/turf/areas.dmi'
|
||||
N.layer = AREA_LAYER //Just default back to normal area stuff since I assume setting a var is faster than initial
|
||||
N.invisibility = INVISIBILITY_MAXIMUM
|
||||
N.layer = initial(N.layer)
|
||||
N.plane = initial(N.plane)
|
||||
N.set_opacity(FALSE)
|
||||
|
||||
@@ -16,12 +16,12 @@
|
||||
end_duration = 300
|
||||
end_overlay = "light_ash"
|
||||
|
||||
area_type = /area/mine/dangerous // /area/lavaland/surface/outdoors
|
||||
area_type = /area/lavaland/surface/outdoors
|
||||
target_trait = ORE_LEVEL
|
||||
|
||||
immunity_type = "ash"
|
||||
|
||||
// probability = 90
|
||||
probability = 90
|
||||
|
||||
barometer_predictable = TRUE
|
||||
|
||||
@@ -81,7 +81,7 @@
|
||||
if(ishuman(L)) //Are you immune?
|
||||
var/mob/living/carbon/human/H = L
|
||||
var/thermal_protection = H.get_thermal_protection()
|
||||
if(thermal_protection >= FIRE_IMMUNITY_SUIT_MAX_TEMP_PROTECT)
|
||||
if(thermal_protection >= FIRE_IMMUNITY_MAX_TEMP_PROTECT)
|
||||
return TRUE
|
||||
L = L.loc //Matryoshka check
|
||||
return FALSE //RIP you
|
||||
@@ -105,4 +105,4 @@
|
||||
|
||||
aesthetic = TRUE
|
||||
|
||||
// probability = 10
|
||||
probability = 10
|
||||
@@ -19,6 +19,7 @@
|
||||
target_trait = STATION_LEVEL
|
||||
|
||||
overlay_layer = ABOVE_OPEN_TURF_LAYER //Covers floors only
|
||||
overlay_plane = FLOOR_PLANE
|
||||
immunity_type = "lava"
|
||||
|
||||
|
||||
|
||||
Reference in New Issue
Block a user