This commit is contained in:
Ghommie
2019-10-31 23:17:39 +01:00
268 changed files with 1235 additions and 718 deletions
+1 -2
View File
@@ -104,8 +104,7 @@
#define SHOVE_KNOCKDOWN_HUMAN 30 #define SHOVE_KNOCKDOWN_HUMAN 30
#define SHOVE_KNOCKDOWN_TABLE 30 #define SHOVE_KNOCKDOWN_TABLE 30
#define SHOVE_KNOCKDOWN_COLLATERAL 10 #define SHOVE_KNOCKDOWN_COLLATERAL 10
//Shove slowdown //for the shove slowdown, see __DEFINES/movespeed_modification.dm
#define SHOVE_SLOWDOWN_ID "shove_slowdown"
#define SHOVE_SLOWDOWN_LENGTH 30 #define SHOVE_SLOWDOWN_LENGTH 30
#define SHOVE_SLOWDOWN_STRENGTH 0.85 //multiplier #define SHOVE_SLOWDOWN_STRENGTH 0.85 //multiplier
//Shove disarming item list //Shove disarming item list
+2 -3
View File
@@ -126,7 +126,7 @@
#define COMSIG_MOB_GHOSTIZE "mob_ghostize" //from base of mob/Ghostize() (can_reenter_corpse) #define COMSIG_MOB_GHOSTIZE "mob_ghostize" //from base of mob/Ghostize() (can_reenter_corpse)
#define COMPONENT_BLOCK_GHOSTING 1 #define COMPONENT_BLOCK_GHOSTING 1
#define COMSIG_MOB_ALLOWED "mob_allowed" //from base of obj/allowed(mob/M): (/obj) returns bool, if TRUE the mob has id access to the obj #define COMSIG_MOB_ALLOWED "mob_allowed" //from base of obj/allowed(mob/M): (/obj) returns bool, if TRUE the mob has id access to the obj
#define COMSIG_MOB_RECEIVE_MAGIC "mob_receive_magic" //from base of mob/anti_magic_check(): (magic, holy, protection_sources) #define COMSIG_MOB_RECEIVE_MAGIC "mob_receive_magic" //from base of mob/anti_magic_check(): (mob/user, magic, holy, tinfoil, chargecost, self, protection_sources)
#define COMPONENT_BLOCK_MAGIC 1 #define COMPONENT_BLOCK_MAGIC 1
#define COMSIG_MOB_HUD_CREATED "mob_hud_created" //from base of mob/create_mob_hud(): () #define COMSIG_MOB_HUD_CREATED "mob_hud_created" //from base of mob/create_mob_hud(): ()
#define COMSIG_MOB_ATTACK_HAND "mob_attack_hand" //from base of #define COMSIG_MOB_ATTACK_HAND "mob_attack_hand" //from base of
@@ -233,8 +233,7 @@
//Mood //Mood
#define COMSIG_ADD_MOOD_EVENT "add_mood" //Called when you send a mood event from anywhere in the code. #define COMSIG_ADD_MOOD_EVENT "add_mood" //Called when you send a mood event from anywhere in the code.
#define COMSIG_CLEAR_MOOD_EVENT "clear_mood" //Called when you clear a mood event from anywhere in the code. #define COMSIG_CLEAR_MOOD_EVENT "clear_mood" //Called when you clear a mood event from anywhere in the code.
#define COMSIG_INCREASE_SANITY "decrease_sanity" //Called when you want to increase sanity from anywhere in the code. #define COMSIG_MODIFY_SANITY "modify_sanity" //Called when you want to increase or decrease sanity from anywhere in the code.
#define COMSIG_DECREASE_SANITY "increase_sanity" //Same as above but to decrease sanity instead.
//NTnet //NTnet
#define COMSIG_COMPONENT_NTNET_RECEIVE "ntnet_receive" //called on an object by its NTNET connection component on receive. (sending_id(number), sending_netname(text), data(datum/netdata)) #define COMSIG_COMPONENT_NTNET_RECEIVE "ntnet_receive" //called on an object by its NTNET connection component on receive. (sending_id(number), sending_netname(text), data(datum/netdata))
+1
View File
@@ -58,6 +58,7 @@ GLOBAL_LIST_INIT(bitflags, list(1, 2, 4, 8, 16, 32, 64, 128, 256, 512, 1024, 204
#define GROUND (1<<0) #define GROUND (1<<0)
#define FLYING (1<<1) #define FLYING (1<<1)
#define VENTCRAWLING (1<<2) #define VENTCRAWLING (1<<2)
#define FLOATING (1<<3)
//Fire and Acid stuff, for resistance_flags //Fire and Acid stuff, for resistance_flags
#define LAVA_PROOF (1<<0) #define LAVA_PROOF (1<<0)
+7 -1
View File
@@ -28,7 +28,9 @@
#define ITEM_SLOT_POCKET (1<<11) // this is to allow items with a w_class of WEIGHT_CLASS_NORMAL or WEIGHT_CLASS_BULKY to fit in pockets. #define ITEM_SLOT_POCKET (1<<11) // this is to allow items with a w_class of WEIGHT_CLASS_NORMAL or WEIGHT_CLASS_BULKY to fit in pockets.
#define ITEM_SLOT_DENYPOCKET (1<<12) // this is to deny items with a w_class of WEIGHT_CLASS_SMALL or WEIGHT_CLASS_TINY to fit in pockets. #define ITEM_SLOT_DENYPOCKET (1<<12) // this is to deny items with a w_class of WEIGHT_CLASS_SMALL or WEIGHT_CLASS_TINY to fit in pockets.
#define ITEM_SLOT_NECK (1<<13) #define ITEM_SLOT_NECK (1<<13)
#define ITEM_SLOT_SUITSTORE (1<<14) #define ITEM_SLOT_HANDS (1<<14)
#define ITEM_SLOT_BACKPACK (1<<15)
#define ITEM_SLOT_SUITSTORE (1<<16)
//SLOTS //SLOTS
#define SLOT_BACK 1 #define SLOT_BACK 1
@@ -86,6 +88,10 @@
. = ITEM_SLOT_ICLOTHING . = ITEM_SLOT_ICLOTHING
if(SLOT_L_STORE, SLOT_R_STORE) if(SLOT_L_STORE, SLOT_R_STORE)
. = ITEM_SLOT_POCKET . = ITEM_SLOT_POCKET
if(SLOT_HANDS)
. = ITEM_SLOT_HANDS
if(SLOT_IN_BACKPACK)
. = ITEM_SLOT_BACKPACK
if(SLOT_S_STORE) if(SLOT_S_STORE)
. = ITEM_SLOT_SUITSTORE . = ITEM_SLOT_SUITSTORE
+4
View File
@@ -92,3 +92,7 @@ require only minor tweaks.
#define PLACE_SAME_Z "same" #define PLACE_SAME_Z "same"
#define PLACE_SPACE_RUIN "space" #define PLACE_SPACE_RUIN "space"
#define PLACE_LAVA_RUIN "lavaland" #define PLACE_LAVA_RUIN "lavaland"
//Map type stuff.
#define MAP_TYPE_STATION "station"
+34 -2
View File
@@ -1,12 +1,19 @@
#define MOVESPEED_DATA_INDEX_PRIORITY 1 #define MOVESPEED_DATA_INDEX_PRIORITY 1
#define MOVESPEED_DATA_INDEX_FLAGS 2 #define MOVESPEED_DATA_INDEX_FLAGS 2
#define MOVESPEED_DATA_INDEX_MULTIPLICATIVE_SLOWDOWN 3 #define MOVESPEED_DATA_INDEX_MULTIPLICATIVE_SLOWDOWN 3
#define MOVESPEED_DATA_INDEX_MOVETYPE 4
#define MOVESPEED_DATA_INDEX_BL_MOVETYPE 5
#define MOVESPEED_DATA_INDEX_CONFLICT 6
#define MOVESPEED_DATA_INDEX_MAX 3 #define MOVESPEED_DATA_INDEX_MAX 6
//flags //flags
#define IGNORE_NOSLOW (1 << 0) #define IGNORE_NOSLOW (1 << 0)
//conflict types
#define MOVE_CONFLICT_JETPACK "JETPACK"
//ids //ids
#define MOVESPEED_ID_MOB_WALK_RUN_CONFIG_SPEED "MOB_WALK_RUN" #define MOVESPEED_ID_MOB_WALK_RUN_CONFIG_SPEED "MOB_WALK_RUN"
@@ -16,15 +23,29 @@
#define MOVESPEED_ID_SLIME_HEALTHMOD "SLIME_HEALTH_MODIFIER" #define MOVESPEED_ID_SLIME_HEALTHMOD "SLIME_HEALTH_MODIFIER"
#define MOVESPEED_ID_SLIME_TEMPMOD "SLIME_TEMPERATURE_MODIFIER" #define MOVESPEED_ID_SLIME_TEMPMOD "SLIME_TEMPERATURE_MODIFIER"
#define MOVESPEED_ID_SLIME_STATUS "SLIME_STATUS"
#define MOVESPEED_ID_TARANTULA_WEB "TARANTULA_WEB"
#define MOVESPEED_ID_LIVING_TURF_SPEEDMOD "LIVING_TURF_SPEEDMOD" #define MOVESPEED_ID_LIVING_TURF_SPEEDMOD "LIVING_TURF_SPEEDMOD"
#define MOVESPEED_ID_CARBON_SOFTCRIT "CARBON_SOFTCRIT" #define MOVESPEED_ID_CARBON_SOFTCRIT "CARBON_SOFTCRIT"
#define MOVESPEED_ID_CARBON_OLDSPEED "CARBON_DEPRECATED_SPEED" #define MOVESPEED_ID_CARBON_OLDSPEED "CARBON_DEPRECATED_SPEED"
#define MOVESPEED_ID_DNA_VAULT "DNA_VAULT"
#define MOVESPEED_ID_YELLOW_ORB "YELLOW_ORB"
#define MOVESPEED_ID_TARFOOT "TARFOOT"
#define MOVESPEED_ID_SEPIA "SEPIA"
#define MOVESPEED_ID_MONKEY_REAGENT_SPEEDMOD "MONKEY_REAGENT_SPEEDMOD" #define MOVESPEED_ID_MONKEY_REAGENT_SPEEDMOD "MONKEY_REAGENT_SPEEDMOD"
#define MOVESPEED_ID_MONKEY_TEMPERATURE_SPEEDMOD "MONKEY_TEMPERATURE_SPEEDMOD" #define MOVESPEED_ID_MONKEY_TEMPERATURE_SPEEDMOD "MONKEY_TEMPERATURE_SPEEDMOD"
#define MOVESPEED_ID_MONKEY_HEALTH_SPEEDMOD "MONKEY_HEALTH_SPEEDMOD" #define MOVESPEED_ID_MONKEY_HEALTH_SPEEDMOD "MONKEY_HEALTH_SPEEDMOD"
#define MOVESPEED_ID_CHANGELING_MUSCLES "CHANGELING_MUSCLES"
#define MOVESPEED_ID_SIMPLEMOB_VARSPEED "SIMPLEMOB_VARSPEED_MODIFIER" #define MOVESPEED_ID_SIMPLEMOB_VARSPEED "SIMPLEMOB_VARSPEED_MODIFIER"
#define MOVESPEED_ID_ADMIN_VAREDIT "ADMIN_VAREDIT_MODIFIER" #define MOVESPEED_ID_ADMIN_VAREDIT "ADMIN_VAREDIT_MODIFIER"
@@ -32,7 +53,18 @@
#define MOVESPEED_ID_SANITY "MOOD_SANITY" #define MOVESPEED_ID_SANITY "MOOD_SANITY"
#define MOVESPEED_ID_SPECIES "SPECIES_SPEED_MOD"
#define MOVESPEED_ID_PRONE_DRAGGING "PRONE_DRAG" #define MOVESPEED_ID_PRONE_DRAGGING "PRONE_DRAG"
#define MOVESPEED_ID_HUMAN_CARRYING "HUMAN_CARRY" #define MOVESPEED_ID_HUMAN_CARRYING "HUMAN_CARRY"
#define MOVESPEED_ID_TASED_STATUS "TASED" #define MOVESPEED_ID_TASED_STATUS "TASED"
#define MOVESPEED_ID_SLAUGHTER "SLAUGHTER"
#define MOVESPEED_ID_CYBER_THRUSTER "CYBER_IMPLANT_THRUSTER"
#define MOVESPEED_ID_JETPACK "JETPACK"
#define MOVESPEED_ID_SHOVE "SHOVE"
#define MOVESPEED_ID_MKULTRA "MKULTRA"
+1 -1
View File
@@ -27,7 +27,7 @@
#define NOBLIUM_RESEARCH_AMOUNT 1000 #define NOBLIUM_RESEARCH_AMOUNT 1000
#define BZ_RESEARCH_SCALE 4 #define BZ_RESEARCH_SCALE 4
#define BZ_RESEARCH_MAX_AMOUNT 400 #define BZ_RESEARCH_MAX_AMOUNT 400
#define MIASMA_RESEARCH_AMOUNT 160 #define MIASMA_RESEARCH_AMOUNT 6
#define STIMULUM_RESEARCH_AMOUNT 50 #define STIMULUM_RESEARCH_AMOUNT 50
//Plasma fusion properties //Plasma fusion properties
#define FUSION_ENERGY_THRESHOLD 3e9 //Amount of energy it takes to start a fusion reaction #define FUSION_ENERGY_THRESHOLD 3e9 //Amount of energy it takes to start a fusion reaction
+6 -6
View File
@@ -3,12 +3,12 @@
#define CHANNEL_ADMIN 1023 #define CHANNEL_ADMIN 1023
#define CHANNEL_VOX 1022 #define CHANNEL_VOX 1022
#define CHANNEL_JUKEBOX 1021 #define CHANNEL_JUKEBOX 1021
#define CHANNEL_JUKEBOX_START 1020 #define CHANNEL_JUKEBOX_START 1016 //The gap between this and CHANNEL_JUKEBOX determines the amount of free jukebox channels. This currently allows 6 jukebox channels to exist.
#define CHANNEL_JUSTICAR_ARK 1019 #define CHANNEL_JUSTICAR_ARK 1015
#define CHANNEL_HEARTBEAT 1018 //sound channel for heartbeats #define CHANNEL_HEARTBEAT 1014 //sound channel for heartbeats
#define CHANNEL_AMBIENCE 1017 #define CHANNEL_AMBIENCE 1013
#define CHANNEL_BUZZ 1016 #define CHANNEL_BUZZ 1012
#define CHANNEL_BICYCLE 1015 #define CHANNEL_BICYCLE 1011
//CIT CHANNELS - TRY NOT TO REGRESS //CIT CHANNELS - TRY NOT TO REGRESS
#define CHANNEL_PRED 1010 #define CHANNEL_PRED 1010
+1 -1
View File
@@ -99,7 +99,6 @@
#define FIRE_PRIORITY_GARBAGE 15 #define FIRE_PRIORITY_GARBAGE 15
#define FIRE_PRIORITY_WET_FLOORS 20 #define FIRE_PRIORITY_WET_FLOORS 20
#define FIRE_PRIORITY_AIR 20 #define FIRE_PRIORITY_AIR 20
#define FIRE_PRIORITY_NPC 20
#define FIRE_PRIORITY_PROCESS 25 #define FIRE_PRIORITY_PROCESS 25
#define FIRE_PRIORITY_THROWING 25 #define FIRE_PRIORITY_THROWING 25
#define FIRE_PRIORITY_SPACEDRIFT 30 #define FIRE_PRIORITY_SPACEDRIFT 30
@@ -112,6 +111,7 @@
#define FIRE_PRIORITY_AIR_TURFS 40 #define FIRE_PRIORITY_AIR_TURFS 40
#define FIRE_PRIORITY_DEFAULT 50 #define FIRE_PRIORITY_DEFAULT 50
#define FIRE_PRIORITY_PARALLAX 65 #define FIRE_PRIORITY_PARALLAX 65
#define FIRE_PRIORITY_NPC 80
#define FIRE_PRIORITY_FLIGHTPACKS 80 #define FIRE_PRIORITY_FLIGHTPACKS 80
#define FIRE_PRIORITY_MOBS 100 #define FIRE_PRIORITY_MOBS 100
#define FIRE_PRIORITY_TGUI 110 #define FIRE_PRIORITY_TGUI 110
-2
View File
@@ -70,8 +70,6 @@
#define TRAIT_MONKEYLIKE "monkeylike" //sets IsAdvancedToolUser to FALSE #define TRAIT_MONKEYLIKE "monkeylike" //sets IsAdvancedToolUser to FALSE
#define TRAIT_PACIFISM "pacifism" #define TRAIT_PACIFISM "pacifism"
#define TRAIT_IGNORESLOWDOWN "ignoreslow" #define TRAIT_IGNORESLOWDOWN "ignoreslow"
#define TRAIT_GOTTAGOFAST "fast"
#define TRAIT_GOTTAGOREALLYFAST "2fast"
#define TRAIT_DEATHCOMA "deathcoma" //Causes death-like unconsciousness #define TRAIT_DEATHCOMA "deathcoma" //Causes death-like unconsciousness
#define TRAIT_FAKEDEATH "fakedeath" //Makes the owner appear as dead to most forms of medical examination #define TRAIT_FAKEDEATH "fakedeath" //Makes the owner appear as dead to most forms of medical examination
#define TRAIT_DISFIGURED "disfigured" #define TRAIT_DISFIGURED "disfigured"
+6
View File
@@ -379,6 +379,12 @@
i++ i++
return i return i
/proc/count_occurences_of_value(list/L, val, limit) //special thanks to salmonsnake
. = 0
for (var/i in 1 to limit)
if (L[i] == val)
.++
/proc/find_record(field, value, list/L) /proc/find_record(field, value, list/L)
for(var/datum/data/record/R in L) for(var/datum/data/record/R in L)
if(R.fields[field] == value) if(R.fields[field] == value)
+94 -3
View File
@@ -1,4 +1,4 @@
/proc/priority_announce(text, title = "", sound = 'sound/ai/attention.ogg', type , sender_override) /proc/priority_announce(text, title = "", sound = "attention", type , sender_override)
if(!text) if(!text)
return return
@@ -29,19 +29,110 @@
announcement += "<br><span class='alert'>[html_encode(text)]</span><br>" announcement += "<br><span class='alert'>[html_encode(text)]</span><br>"
announcement += "<br>" announcement += "<br>"
var/s = sound(sound) var/s = sound(get_announcer_sound(sound))
for(var/mob/M in GLOB.player_list) for(var/mob/M in GLOB.player_list)
if(!isnewplayer(M) && M.can_hear()) if(!isnewplayer(M) && M.can_hear())
to_chat(M, announcement) to_chat(M, announcement)
if(M.client.prefs.toggles & SOUND_ANNOUNCEMENTS) if(M.client.prefs.toggles & SOUND_ANNOUNCEMENTS)
SEND_SOUND(M, s) SEND_SOUND(M, s)
/proc/get_announcer_sound(soundid)
if(isfile(soundid))
return soundid
else if(!istext(soundid))
CRASH("Invalid type passed to get_announcer_sound()")
switch(GLOB.announcertype) //These are all individually hardcoded to allow the announcer sounds to be included in the rsc, reducing lag from sending resources midgame.
if("classic")
switch(soundid)
if("aimalf")
. = 'sound/announcer/classic/aimalf.ogg'
if("aliens")
. = 'sound/announcer/classic/aliens.ogg'
if("animes")
. = 'sound/announcer/classic/animes.ogg'
if("attention")
. = 'sound/announcer/classic/attention.ogg'
if("commandreport")
. = 'sound/announcer/classic/commandreport.ogg'
if("granomalies")
. = 'sound/announcer/classic/granomalies.ogg'
if("intercept")
. = 'sound/announcer/classic/intercept.ogg'
if("ionstorm")
. = 'sound/announcer/classic/ionstorm.ogg'
if("meteors")
. = 'sound/announcer/classic/meteors.ogg'
if("newAI")
. = 'sound/announcer/classic/newAI.ogg'
if("outbreak5")
. = 'sound/announcer/classic/outbreak5.ogg'
if("outbreak7")
. = 'sound/announcer/classic/outbreak7.ogg'
if("poweroff")
. = 'sound/announcer/classic/poweroff.ogg'
if("poweron")
. = 'sound/announcer/classic/poweron.ogg'
if("radiation")
. = 'sound/announcer/classic/radiation.ogg'
if("shuttlecalled")
. = 'sound/announcer/classic/shuttlecalled.ogg'
if("shuttledock")
. = 'sound/announcer/classic/shuttledock.ogg'
if("shuttlerecalled")
. = 'sound/announcer/classic/shuttlerecalled.ogg'
if("spanomalies")
. = 'sound/announcer/classic/spanomalies.ogg'
if("welcome")
. = 'sound/announcer/classic/welcome.ogg'
if("medibot")
switch(soundid)
if("aimalf")
. = 'sound/announcer/classic/aimalf.ogg'
if("aliens")
. = 'sound/announcer/medibot/aliens.ogg'
if("animes")
. = 'sound/announcer/medibot/animes.ogg'
if("attention")
. = 'sound/announcer/medibot/attention.ogg'
if("commandreport")
. = 'sound/announcer/medibot/commandreport.ogg'
if("granomalies")
. = 'sound/announcer/medibot/granomalies.ogg'
if("intercept")
. = 'sound/announcer/medibot/intercept.ogg'
if("ionstorm")
. = 'sound/announcer/medibot/ionstorm.ogg'
if("meteors")
. = 'sound/announcer/medibot/meteors.ogg'
if("newAI")
. = 'sound/announcer/medibot/newAI.ogg'
if("outbreak5")
. = 'sound/announcer/medibot/outbreak5.ogg'
if("outbreak7")
. = 'sound/announcer/medibot/outbreak7.ogg'
if("poweroff")
. = 'sound/announcer/medibot/poweroff.ogg'
if("poweron")
. = 'sound/announcer/medibot/poweron.ogg'
if("radiation")
. = 'sound/announcer/medibot/radiation.ogg'
if("shuttlecalled")
. = 'sound/announcer/medibot/shuttlecalled.ogg'
if("shuttledock")
. = 'sound/announcer/medibot/shuttledocked.ogg'
if("shuttlerecalled")
. = 'sound/announcer/medibot/shuttlerecalled.ogg'
if("spanomalies")
. = 'sound/announcer/medibot/spanomalies.ogg'
if("welcome")
. = 'sound/announcer/medibot/welcome.ogg'
/proc/print_command_report(text = "", title = null, announce=TRUE) /proc/print_command_report(text = "", title = null, announce=TRUE)
if(!title) if(!title)
title = "Classified [command_name()] Update" title = "Classified [command_name()] Update"
if(announce) if(announce)
priority_announce("A report has been downloaded and printed out at all communications consoles.", "Incoming Classified Message", 'sound/ai/commandreport.ogg') priority_announce("A report has been downloaded and printed out at all communications consoles.", "Incoming Classified Message", "commandreport")
var/datum/comm_message/M = new var/datum/comm_message/M = new
M.title = title M.title = title
+7 -1
View File
@@ -2,6 +2,12 @@ GLOBAL_VAR_INIT(admin_notice, "") // Admin notice that all clients see when join
GLOBAL_VAR_INIT(timezoneOffset, 0) // The difference betwen midnight (of the host computer) and 0 world.ticks. GLOBAL_VAR_INIT(timezoneOffset, 0) // The difference betwen midnight (of the host computer) and 0 world.ticks.
GLOBAL_VAR_INIT(year, time2text(world.realtime,"YYYY"))
GLOBAL_VAR_INIT(year_integer, text2num(year)) // = 2013???
GLOBAL_VAR_INIT(announcertype, "standard")
// For FTP requests. (i.e. downloading runtime logs.) // For FTP requests. (i.e. downloading runtime logs.)
// However it'd be ok to use for accessing attack logs and such too, which are even laggier. // However it'd be ok to use for accessing attack logs and such too, which are even laggier.
GLOBAL_VAR_INIT(fileaccess_timer, 0) GLOBAL_VAR_INIT(fileaccess_timer, 0)
@@ -24,4 +30,4 @@ GLOBAL_VAR(bible_name)
GLOBAL_VAR(bible_icon_state) GLOBAL_VAR(bible_icon_state)
GLOBAL_VAR(bible_item_state) GLOBAL_VAR(bible_item_state)
GLOBAL_VAR(holy_weapon_type) GLOBAL_VAR(holy_weapon_type)
GLOBAL_VAR(holy_armor_type) GLOBAL_VAR(holy_armor_type)
+4 -4
View File
@@ -49,9 +49,9 @@
#define ui_storage1 "CENTER+1:18,SOUTH:5" #define ui_storage1 "CENTER+1:18,SOUTH:5"
#define ui_storage2 "CENTER+2:20,SOUTH:5" #define ui_storage2 "CENTER+2:20,SOUTH:5"
#define ui_borg_sensor "CENTER-3:16, SOUTH:5" //borgs #define ui_borg_sensor "CENTER-3:15, SOUTH:5" //borgs
#define ui_borg_lamp "CENTER-4:16, SOUTH:5" //borgs #define ui_borg_lamp "CENTER-4:15, SOUTH:5" //borgs
#define ui_borg_thrusters "CENTER-5:16, SOUTH:5" //borgs #define ui_borg_thrusters "CENTER-5:15, SOUTH:5" //borgs
#define ui_inv1 "CENTER-2:16,SOUTH:5" //borgs #define ui_inv1 "CENTER-2:16,SOUTH:5" //borgs
#define ui_inv2 "CENTER-1 :16,SOUTH:5" //borgs #define ui_inv2 "CENTER-1 :16,SOUTH:5" //borgs
#define ui_inv3 "CENTER :16,SOUTH:5" //borgs #define ui_inv3 "CENTER :16,SOUTH:5" //borgs
@@ -59,7 +59,7 @@
#define ui_borg_store "CENTER+2:16,SOUTH:5" //borgs #define ui_borg_store "CENTER+2:16,SOUTH:5" //borgs
#define ui_borg_camera "CENTER+3:21,SOUTH:5" //borgs #define ui_borg_camera "CENTER+3:21,SOUTH:5" //borgs
#define ui_borg_album "CENTER+4:21,SOUTH:5" //borgs #define ui_borg_album "CENTER+4:21,SOUTH:5" //borgs
#define ui_borg_language_menu "CENTER+4:21,SOUTH+1:5" //borgs #define ui_borg_language_menu "EAST-1:27,SOUTH+2:8" //borgs
#define ui_monkey_head "CENTER-5:13,SOUTH:5" //monkey #define ui_monkey_head "CENTER-5:13,SOUTH:5" //monkey
#define ui_monkey_mask "CENTER-4:14,SOUTH:5" //monkey #define ui_monkey_mask "CENTER-4:14,SOUTH:5" //monkey
+22 -2
View File
@@ -88,6 +88,26 @@
var/mob/living/silicon/robot/R = usr var/mob/living/silicon/robot/R = usr
R.toggle_ionpulse() R.toggle_ionpulse()
/obj/screen/robot/sensors
name = "Sensor Augmentation"
icon_state = "cyborg_sensor"
/obj/screen/robot/sensors/Click()
if(..())
return
var/mob/living/silicon/S = usr
S.toggle_sensors()
/obj/screen/robot/language_menu
name = "silicon language selection"
icon_state = "talk_wheel"
/obj/screen/robot/language_menu/Click()
if(..())
return
var/mob/living/silicon/S = usr
S.open_language_menu(usr)
/datum/hud/robot /datum/hud/robot
ui_style = 'icons/mob/screen_cyborg.dmi' ui_style = 'icons/mob/screen_cyborg.dmi'
@@ -96,7 +116,7 @@
var/mob/living/silicon/robot/mymobR = mymob var/mob/living/silicon/robot/mymobR = mymob
var/obj/screen/using var/obj/screen/using
using = new/obj/screen/language_menu using = new/obj/screen/robot/language_menu
using.screen_loc = ui_borg_language_menu using.screen_loc = ui_borg_language_menu
static_inventory += using static_inventory += using
@@ -133,7 +153,7 @@
static_inventory += using static_inventory += using
//Sec/Med HUDs //Sec/Med HUDs
using = new /obj/screen/ai/sensors() using = new /obj/screen/robot/sensors()
using.screen_loc = ui_borg_sensor using.screen_loc = ui_borg_sensor
static_inventory += using static_inventory += using
+1 -1
View File
@@ -82,7 +82,7 @@
log_combat(user, M, "attacked", src.name, "(INTENT: [uppertext(user.a_intent)]) (DAMTYPE: [uppertext(damtype)])") log_combat(user, M, "attacked", src.name, "(INTENT: [uppertext(user.a_intent)]) (DAMTYPE: [uppertext(damtype)])")
add_fingerprint(user) add_fingerprint(user)
user.adjustStaminaLossBuffered(getweight())//CIT CHANGE - makes attacking things cause stamina loss user.adjustStaminaLossBuffered(getweight()*0.8)//CIT CHANGE - makes attacking things cause stamina loss
//the equivalent of the standard version of attack() but for object targets. //the equivalent of the standard version of attack() but for object targets.
/obj/item/proc/attack_obj(obj/O, mob/living/user) /obj/item/proc/attack_obj(obj/O, mob/living/user)
@@ -66,6 +66,10 @@
/datum/config_entry/flag/disable_human_mood /datum/config_entry/flag/disable_human_mood
/datum/config_entry/flag/disable_borg_flash_knockdown //Should borg flashes be capable of knocking humanoid entities down?
/datum/config_entry/flag/weaken_secborg //Brings secborgs and k9s back in-line with the other borg modules
/datum/config_entry/flag/disable_secborg // disallow secborg module to be chosen. /datum/config_entry/flag/disable_secborg // disallow secborg module to be chosen.
/datum/config_entry/flag/disable_peaceborg /datum/config_entry/flag/disable_peaceborg
+28 -8
View File
@@ -3,6 +3,7 @@ SUBSYSTEM_DEF(jukeboxes)
wait = 5 wait = 5
var/list/songs = list() var/list/songs = list()
var/list/activejukeboxes = list() var/list/activejukeboxes = list()
var/list/freejukeboxchannels = list()
/datum/track /datum/track
var/song_name = "generic" var/song_name = "generic"
@@ -21,23 +22,39 @@ SUBSYSTEM_DEF(jukeboxes)
/datum/controller/subsystem/jukeboxes/proc/addjukebox(obj/jukebox, datum/track/T, jukefalloff = 1) /datum/controller/subsystem/jukeboxes/proc/addjukebox(obj/jukebox, datum/track/T, jukefalloff = 1)
if(!istype(T)) if(!istype(T))
CRASH("[src] tried to play a song with a nonexistant track") CRASH("[src] tried to play a song with a nonexistant track")
var/channeltoreserve = CHANNEL_JUKEBOX_START + activejukeboxes.len - 1 var/channeltoreserve = pick(freejukeboxchannels)
if(channeltoreserve > CHANNEL_JUKEBOX) if(!channeltoreserve)
return FALSE return FALSE
freejukeboxchannels -= channeltoreserve
var/list/youvegotafreejukebox = list(T, channeltoreserve, jukebox, jukefalloff)
activejukeboxes.len++ activejukeboxes.len++
activejukeboxes[activejukeboxes.len] = list(T, channeltoreserve, jukebox, jukefalloff) activejukeboxes[activejukeboxes.len] = youvegotafreejukebox
//Due to changes in later versions of 512, SOUND_UPDATE no longer properly plays audio when a file is defined in the sound datum. As such, we are now required to init the audio before we can actually do anything with it.
//Downsides to this? This means that you can *only* hear the jukebox audio if you were present on the server when it started playing, and it means that it's now impossible to add loops to the jukebox track list.
var/sound/song_to_init = sound(T.song_path)
song_to_init.status = SOUND_MUTE
for(var/mob/M in GLOB.player_list)
if(!M.client)
continue
if(!(M.client.prefs.toggles & SOUND_INSTRUMENTS))
continue
M.playsound_local(M, null, 100, channel = youvegotafreejukebox[2], S = song_to_init)
return activejukeboxes.len return activejukeboxes.len
/datum/controller/subsystem/jukeboxes/proc/removejukebox(IDtoremove) /datum/controller/subsystem/jukeboxes/proc/removejukebox(IDtoremove)
if(islist(activejukeboxes[IDtoremove])) if(islist(activejukeboxes[IDtoremove]))
var/jukechannel = activejukeboxes[IDtoremove][2]
for(var/mob/M in GLOB.player_list) for(var/mob/M in GLOB.player_list)
if(!M.client) if(!M.client)
continue continue
M.stop_sound_channel(activejukeboxes[IDtoremove][2]) M.stop_sound_channel(jukechannel)
freejukeboxchannels |= jukechannel
activejukeboxes.Cut(IDtoremove, IDtoremove+1) activejukeboxes.Cut(IDtoremove, IDtoremove+1)
return TRUE return TRUE
else else
to_chat(world, "<span class='warning'>If you see this, screenshot it and send it to a dev. Tried to remove jukebox with invalid ID</span>") CRASH("Tried to remove jukebox with invalid ID")
/datum/controller/subsystem/jukeboxes/proc/findjukeboxindex(obj/jukebox) /datum/controller/subsystem/jukeboxes/proc/findjukeboxindex(obj/jukebox)
if(activejukeboxes.len) if(activejukeboxes.len)
@@ -57,6 +74,8 @@ SUBSYSTEM_DEF(jukeboxes)
T.song_beat = text2num(L[3]) T.song_beat = text2num(L[3])
T.song_associated_id = L[4] T.song_associated_id = L[4]
songs |= T songs |= T
for(var/i in CHANNEL_JUKEBOX_START to CHANNEL_JUKEBOX)
freejukeboxchannels |= i
return ..() return ..()
/datum/controller/subsystem/jukeboxes/fire() /datum/controller/subsystem/jukeboxes/fire()
@@ -64,14 +83,15 @@ SUBSYSTEM_DEF(jukeboxes)
return return
for(var/list/jukeinfo in activejukeboxes) for(var/list/jukeinfo in activejukeboxes)
if(!jukeinfo.len) if(!jukeinfo.len)
to_chat(world, "<span class='warning'>If you see this, screenshot it and send it to a dev. Active jukebox without any associated metadata</span>") EXCEPTION("Active jukebox without any associated metadata.")
continue
var/datum/track/juketrack = jukeinfo[1] var/datum/track/juketrack = jukeinfo[1]
if(!istype(juketrack)) if(!istype(juketrack))
to_chat(world, "<span class='warning'>If you see this, screenshot it and send it to a dev. After jukebox track grabbing</span>") EXCEPTION("Invalid jukebox track datum.")
continue continue
var/obj/jukebox = jukeinfo[3] var/obj/jukebox = jukeinfo[3]
if(!istype(jukebox)) if(!istype(jukebox))
to_chat(world, "<span class='warning'>If you see this, screenshot it and send it to a dev. Nonexistant or invalid jukebox in active jukebox list") EXCEPTION("Nonexistant or invalid object associated with jukebox.")
continue continue
var/sound/song_played = sound(juketrack.song_path) var/sound/song_played = sound(juketrack.song_path)
var/area/currentarea = get_area(jukebox) var/area/currentarea = get_area(jukebox)
+2
View File
@@ -54,6 +54,8 @@ SUBSYSTEM_DEF(mapping)
if(!config || config.defaulted) if(!config || config.defaulted)
to_chat(world, "<span class='boldannounce'>Unable to load next or default map config, defaulting to Box Station</span>") to_chat(world, "<span class='boldannounce'>Unable to load next or default map config, defaulting to Box Station</span>")
config = old_config config = old_config
GLOB.year_integer += config.year_offset
GLOB.announcertype = (config.announcertype == "standard" ? (prob(1) ? "medibot" : "classic") : config.announcertype)
loadWorld() loadWorld()
repopulate_sorted_areas() repopulate_sorted_areas()
process_teleport_locs() //Sets up the wizard teleport locations process_teleport_locs() //Sets up the wizard teleport locations
+1 -1
View File
@@ -1,6 +1,6 @@
SUBSYSTEM_DEF(npcpool) SUBSYSTEM_DEF(npcpool)
name = "NPC Pool" name = "NPC Pool"
flags = SS_POST_FIRE_TIMING|SS_NO_INIT|SS_BACKGROUND flags = SS_KEEP_TIMING | SS_NO_INIT
priority = FIRE_PRIORITY_NPC priority = FIRE_PRIORITY_NPC
runlevels = RUNLEVEL_GAME | RUNLEVEL_POSTGAME runlevels = RUNLEVEL_GAME | RUNLEVEL_POSTGAME
+22
View File
@@ -1,4 +1,5 @@
#define FILE_ANTAG_REP "data/AntagReputation.json" #define FILE_ANTAG_REP "data/AntagReputation.json"
#define MAX_RECENT_MAP_RECORD 10
SUBSYSTEM_DEF(persistence) SUBSYSTEM_DEF(persistence)
name = "Persistence" name = "Persistence"
@@ -11,6 +12,7 @@ SUBSYSTEM_DEF(persistence)
var/list/obj/structure/chisel_message/chisel_messages = list() var/list/obj/structure/chisel_message/chisel_messages = list()
var/list/saved_messages = list() var/list/saved_messages = list()
var/list/saved_modes = list(1,2,3) var/list/saved_modes = list(1,2,3)
var/list/saved_maps
var/list/saved_trophies = list() var/list/saved_trophies = list()
var/list/spawned_objects = list() var/list/spawned_objects = list()
var/list/antag_rep = list() var/list/antag_rep = list()
@@ -25,6 +27,7 @@ SUBSYSTEM_DEF(persistence)
LoadChiselMessages() LoadChiselMessages()
LoadTrophies() LoadTrophies()
LoadRecentModes() LoadRecentModes()
LoadRecentMaps()
LoadPhotoPersistence() LoadPhotoPersistence()
if(CONFIG_GET(flag/use_antag_rep)) if(CONFIG_GET(flag/use_antag_rep))
LoadAntagReputation() LoadAntagReputation()
@@ -163,6 +166,15 @@ SUBSYSTEM_DEF(persistence)
return return
saved_modes = json["data"] saved_modes = json["data"]
/datum/controller/subsystem/persistence/proc/LoadRecentMaps()
var/json_file = file("data/RecentMaps.json")
if(!fexists(json_file))
return
var/list/json = json_decode(file2text(json_file))
if(!json)
return
saved_maps = json["maps"]
/datum/controller/subsystem/persistence/proc/LoadAntagReputation() /datum/controller/subsystem/persistence/proc/LoadAntagReputation()
var/json = file2text(FILE_ANTAG_REP) var/json = file2text(FILE_ANTAG_REP)
if(!json) if(!json)
@@ -204,6 +216,7 @@ SUBSYSTEM_DEF(persistence)
CollectSecretSatchels() CollectSecretSatchels()
CollectTrophies() CollectTrophies()
CollectRoundtype() CollectRoundtype()
RecordMaps()
SavePhotoPersistence() //THIS IS PERSISTENCE, NOT THE LOGGING PORTION. SavePhotoPersistence() //THIS IS PERSISTENCE, NOT THE LOGGING PORTION.
if(CONFIG_GET(flag/use_antag_rep)) if(CONFIG_GET(flag/use_antag_rep))
CollectAntagReputation() CollectAntagReputation()
@@ -359,6 +372,15 @@ SUBSYSTEM_DEF(persistence)
fdel(json_file) fdel(json_file)
WRITE_FILE(json_file, json_encode(file_data)) WRITE_FILE(json_file, json_encode(file_data))
/datum/controller/subsystem/persistence/proc/RecordMaps()
saved_maps = saved_maps?.len ? list("[SSmapping.config.map_name]") | saved_maps : list("[SSmapping.config.map_name]")
var/json_file = file("data/RecentMaps.json")
var/list/file_data = list()
file_data["maps"] = saved_maps
fdel(json_file)
WRITE_FILE(json_file, json_encode(file_data))
/datum/controller/subsystem/persistence/proc/CollectAntagReputation() /datum/controller/subsystem/persistence/proc/CollectAntagReputation()
var/ANTAG_REP_MAXIMUM = CONFIG_GET(number/antag_rep_maximum) var/ANTAG_REP_MAXIMUM = CONFIG_GET(number/antag_rep_maximum)
+1 -1
View File
@@ -373,7 +373,7 @@ SUBSYSTEM_DEF(shuttle)
emergency.setTimer(emergencyDockTime) emergency.setTimer(emergencyDockTime)
priority_announce("Hostile environment resolved. \ priority_announce("Hostile environment resolved. \
You have 3 minutes to board the Emergency Shuttle.", You have 3 minutes to board the Emergency Shuttle.",
null, 'sound/ai/shuttledock.ogg', "Priority") null, "shuttledock", "Priority")
//try to move/request to dockHome if possible, otherwise dockAway. Mainly used for admin buttons //try to move/request to dockHome if possible, otherwise dockAway. Mainly used for admin buttons
/datum/controller/subsystem/shuttle/proc/toggleShuttle(shuttleId, dockHome, dockAway, timed) /datum/controller/subsystem/shuttle/proc/toggleShuttle(shuttleId, dockHome, dockAway, timed)
+1 -1
View File
@@ -303,7 +303,7 @@ SUBSYSTEM_DEF(ticker)
SSdbcore.SetRoundStart() SSdbcore.SetRoundStart()
to_chat(world, "<span class='notice'><B>Welcome to [station_name()], enjoy your stay!</B></span>") to_chat(world, "<span class='notice'><B>Welcome to [station_name()], enjoy your stay!</B></span>")
SEND_SOUND(world, sound('sound/ai/welcome.ogg')) SEND_SOUND(world, sound(get_announcer_sound("welcome")))
current_state = GAME_STATE_PLAYING current_state = GAME_STATE_PLAYING
Master.SetRunLevel(RUNLEVEL_GAME) Master.SetRunLevel(RUNLEVEL_GAME)
+13 -3
View File
@@ -208,9 +208,19 @@ SUBSYSTEM_DEF(vote)
if("gamemode") if("gamemode")
choices.Add(config.votable_modes) choices.Add(config.votable_modes)
if("map") if("map")
choices.Add(config.maplist) var/players = GLOB.clients.len
for(var/i in choices)//this is necessary because otherwise we'll end up with a bunch of /datum/map_config's as the default vote value instead of 0 as intended var/list/lastmaps = SSpersistence.saved_maps?.len ? list("[SSmapping.config.map_name]") | SSpersistence.saved_maps : list("[SSmapping.config.map_name]")
choices[i] = 0 for(var/M in config.maplist) //This is a typeless loop due to the finnicky nature of keyed lists in this kind of context
var/datum/map_config/targetmap = config.maplist[M]
if(!istype(targetmap))
continue
if(!targetmap.voteweight)
continue
if((targetmap.config_min_users && players < targetmap.config_min_users) || (targetmap.config_max_users && players > targetmap.config_max_users))
continue
if(targetmap.max_round_search_span && count_occurences_of_value(lastmaps, M, targetmap.max_round_search_span) >= targetmap.max_rounds_played)
continue
choices |= M
if("roundtype") //CIT CHANGE - adds the roundstart secret/extended vote if("roundtype") //CIT CHANGE - adds the roundstart secret/extended vote
choices.Add("secret", "extended") choices.Add("secret", "extended")
if("custom") if("custom")
+27 -5
View File
@@ -1,26 +1,48 @@
/datum/component/anti_magic /datum/component/anti_magic
var/magic = FALSE var/magic = FALSE
var/holy = FALSE var/holy = FALSE
var/psychic = FALSE
var/allowed_slots = ~ITEM_SLOT_BACKPACK
var/charges = INFINITY
var/blocks_self = TRUE
var/datum/callback/reaction
var/datum/callback/expire
/datum/component/anti_magic/Initialize(_magic = FALSE, _holy = FALSE) /datum/component/anti_magic/Initialize(_magic = FALSE, _holy = FALSE, _psychic = FALSE, _allowed_slots, _charges, _blocks_self = TRUE, datum/callback/_reaction, datum/callback/_expire)
if(isitem(parent)) if(isitem(parent))
RegisterSignal(parent, COMSIG_ITEM_EQUIPPED, .proc/on_equip) RegisterSignal(parent, COMSIG_ITEM_EQUIPPED, .proc/on_equip)
RegisterSignal(parent, COMSIG_ITEM_DROPPED, .proc/on_drop) RegisterSignal(parent, COMSIG_ITEM_DROPPED, .proc/on_drop)
else if(ismob(parent)) else if(ismob(parent))
RegisterSignal(parent, COMSIG_MOB_RECEIVE_MAGIC, .proc/can_protect) RegisterSignal(parent, COMSIG_MOB_RECEIVE_MAGIC, .proc/protect)
else else
return COMPONENT_INCOMPATIBLE return COMPONENT_INCOMPATIBLE
magic = _magic magic = _magic
holy = _holy holy = _holy
psychic = _psychic
if(_allowed_slots)
allowed_slots = _allowed_slots
if(!isnull(_charges))
charges = _charges
blocks_self = _blocks_self
reaction = _reaction
expire = _expire
/datum/component/anti_magic/proc/on_equip(datum/source, mob/equipper, slot) /datum/component/anti_magic/proc/on_equip(datum/source, mob/equipper, slot)
RegisterSignal(equipper, COMSIG_MOB_RECEIVE_MAGIC, .proc/can_protect, TRUE) if(!CHECK_BITFIELD(allowed_slots, slotdefine2slotbit(slot))) //Check that the slot is valid for antimagic
UnregisterSignal(equipper, COMSIG_MOB_RECEIVE_MAGIC)
return
RegisterSignal(equipper, COMSIG_MOB_RECEIVE_MAGIC, .proc/protect, TRUE)
/datum/component/anti_magic/proc/on_drop(datum/source, mob/user) /datum/component/anti_magic/proc/on_drop(datum/source, mob/user)
UnregisterSignal(user, COMSIG_MOB_RECEIVE_MAGIC) UnregisterSignal(user, COMSIG_MOB_RECEIVE_MAGIC)
/datum/component/anti_magic/proc/can_protect(datum/source, _magic, _holy, list/protection_sources) /datum/component/anti_magic/proc/protect(datum/source, mob/user, _magic, _holy, _psychic, chargecost = 1, self, list/protection_sources)
if((_magic && magic) || (_holy && holy)) if(((_magic && magic) || (_holy && holy) || (_psychic && psychic)) && (!self || blocks_self))
protection_sources += parent protection_sources += parent
reaction?.Invoke(user, chargecost)
charges -= chargecost
if(charges <= 0)
expire?.Invoke(user)
qdel(src)
return COMPONENT_BLOCK_MAGIC return COMPONENT_BLOCK_MAGIC
+1 -1
View File
@@ -65,7 +65,7 @@
return FALSE return FALSE
if(!isliving(AM) && !isobj(AM)) if(!isliving(AM) && !isobj(AM))
return FALSE return FALSE
if(is_type_in_typecache(AM, forbidden_types) || AM.throwing || AM.floating) if(is_type_in_typecache(AM, forbidden_types) || AM.throwing || (AM.movement_type & FLOATING))
return FALSE return FALSE
//Flies right over the chasm //Flies right over the chasm
if(ismob(AM)) if(ismob(AM))
+13 -48
View File
@@ -10,7 +10,6 @@
var/mood_modifier = 1 //Modifier to allow certain mobs to be less affected by moodlets var/mood_modifier = 1 //Modifier to allow certain mobs to be less affected by moodlets
var/datum/mood_event/list/mood_events = list() var/datum/mood_event/list/mood_events = list()
var/insanity_effect = 0 //is the owner being punished for low mood? If so, how much? var/insanity_effect = 0 //is the owner being punished for low mood? If so, how much?
var/holdmyinsanityeffect = 0 //before we edit our sanity lets take a look
var/obj/screen/mood/screen_obj var/obj/screen/mood/screen_obj
/datum/component/mood/Initialize() /datum/component/mood/Initialize()
@@ -21,8 +20,7 @@
RegisterSignal(parent, COMSIG_ADD_MOOD_EVENT, .proc/add_event) RegisterSignal(parent, COMSIG_ADD_MOOD_EVENT, .proc/add_event)
RegisterSignal(parent, COMSIG_CLEAR_MOOD_EVENT, .proc/clear_event) RegisterSignal(parent, COMSIG_CLEAR_MOOD_EVENT, .proc/clear_event)
RegisterSignal(parent, COMSIG_INCREASE_SANITY, .proc/IncreaseSanity) RegisterSignal(parent, COMSIG_MODIFY_SANITY, .proc/modify_sanity)
RegisterSignal(parent, COMSIG_DECREASE_SANITY, .proc/DecreaseSanity)
RegisterSignal(parent, COMSIG_MOB_HUD_CREATED, .proc/modify_hud) RegisterSignal(parent, COMSIG_MOB_HUD_CREATED, .proc/modify_hud)
var/mob/living/owner = parent var/mob/living/owner = parent
@@ -131,31 +129,23 @@
switch(mood_level) switch(mood_level)
if(1) if(1)
DecreaseSanity(src, 0.2) setSanity(sanity-0.2)
if(2) if(2)
DecreaseSanity(src, 0.125, SANITY_CRAZY) setSanity(sanity-0.125, minimum=SANITY_CRAZY)
if(3) if(3)
DecreaseSanity(src, 0.075, SANITY_UNSTABLE) setSanity(sanity-0.075, minimum=SANITY_UNSTABLE)
if(4) if(4)
DecreaseSanity(src, 0.025, SANITY_DISTURBED) setSanity(sanity-0.025, minimum=SANITY_DISTURBED)
if(5) if(5)
IncreaseSanity(src, 0.1) setSanity(sanity+0.1)
if(6) if(6)
IncreaseSanity(src, 0.15) setSanity(sanity+0.15)
if(7) if(7)
IncreaseSanity(src, 0.20) setSanity(sanity+0.20)
if(8) if(8)
IncreaseSanity(src, 0.25, SANITY_GREAT) setSanity(sanity+0.25, maximum=SANITY_GREAT)
if(9) if(9)
IncreaseSanity(src, 0.4, SANITY_GREAT) setSanity(sanity+0.4, maximum=SANITY_GREAT)
/*
if(insanity_effect != holdmyinsanityeffect)
if(insanity_effect > holdmyinsanityeffect)
owner.crit_threshold += (insanity_effect - holdmyinsanityeffect)
else
owner.crit_threshold -= (holdmyinsanityeffect - insanity_effect)
*/
if(HAS_TRAIT(owner, TRAIT_DEPRESSION)) if(HAS_TRAIT(owner, TRAIT_DEPRESSION))
if(prob(0.05)) if(prob(0.05))
@@ -166,8 +156,6 @@
add_event(null, "jolly", /datum/mood_event/jolly) add_event(null, "jolly", /datum/mood_event/jolly)
clear_event(null, "depression") clear_event(null, "depression")
holdmyinsanityeffect = insanity_effect
HandleNutrition(owner) HandleNutrition(owner)
/datum/component/mood/proc/setSanity(amount, minimum=SANITY_INSANE, maximum=SANITY_NEUTRAL)//I'm sure bunging this in here will have no negative repercussions. /datum/component/mood/proc/setSanity(amount, minimum=SANITY_INSANE, maximum=SANITY_NEUTRAL)//I'm sure bunging this in here will have no negative repercussions.
@@ -189,7 +177,7 @@
sanity = amount sanity = amount
switch(sanity) switch(sanity)
if(SANITY_INSANE to SANITY_CRAZY) if(-INFINITY to SANITY_CRAZY)
setInsanityEffect(MAJOR_INSANITY_PEN) setInsanityEffect(MAJOR_INSANITY_PEN)
master.add_movespeed_modifier(MOVESPEED_ID_SANITY, TRUE, 100, override=TRUE, multiplicative_slowdown=1.5) //Did we change something ? movetypes is runtiming, movetypes=(~FLYING)) master.add_movespeed_modifier(MOVESPEED_ID_SANITY, TRUE, 100, override=TRUE, multiplicative_slowdown=1.5) //Did we change something ? movetypes is runtiming, movetypes=(~FLYING))
sanity_level = 6 sanity_level = 6
@@ -222,31 +210,8 @@
//master.crit_threshold = (master.crit_threshold - insanity_effect) + newval //master.crit_threshold = (master.crit_threshold - insanity_effect) + newval
insanity_effect = newval insanity_effect = newval
/datum/component/mood/proc/DecreaseSanity(datum/source, amount, minimum = SANITY_INSANE) /datum/component/mood/proc/modify_sanity(datum/source, amount, minimum = -INFINITY, maximum = INFINITY)
if(sanity < minimum) //This might make KevinZ stop fucking pinging me. setSanity(sanity + amount, minimum, maximum)
IncreaseSanity(src, 0.5)
else
sanity = max(minimum, sanity - amount)
if(sanity < SANITY_UNSTABLE)
if(sanity < SANITY_CRAZY)
insanity_effect = (MAJOR_INSANITY_PEN)
else
insanity_effect = (MINOR_INSANITY_PEN)
/datum/component/mood/proc/IncreaseSanity(datum/source, amount, maximum = SANITY_NEUTRAL)
// Disturbed stops you from getting any more sane - I'm just gonna bung this in here
var/mob/living/owner = parent
if(HAS_TRAIT(owner, TRAIT_UNSTABLE))
return
if(sanity > maximum)
DecreaseSanity(src, 0.5) //Removes some sanity to go back to our current limit.
else
sanity = min(maximum, sanity + amount)
if(sanity > SANITY_CRAZY)
if(sanity > SANITY_UNSTABLE)
insanity_effect = 0
else
insanity_effect = MINOR_INSANITY_PEN
/datum/component/mood/proc/add_event(datum/source, category, type, param) //Category will override any events in the same category, should be unique unless the event is based on the same thing like hunger. /datum/component/mood/proc/add_event(datum/source, category, type, param) //Category will override any events in the same category, should be unique unless the event is based on the same thing like hunger.
var/datum/mood_event/the_event var/datum/mood_event/the_event
+3 -3
View File
@@ -145,7 +145,7 @@
set src in oview(1) set src in oview(1)
var/datum/component/simple_rotation/rotcomp = GetComponent(/datum/component/simple_rotation) var/datum/component/simple_rotation/rotcomp = GetComponent(/datum/component/simple_rotation)
if(rotcomp) if(rotcomp)
rotcomp.HandRot(usr,ROTATION_CLOCKWISE) rotcomp.HandRot(null,usr,ROTATION_CLOCKWISE)
/atom/movable/proc/simple_rotate_counterclockwise() /atom/movable/proc/simple_rotate_counterclockwise()
set name = "Rotate Counter-Clockwise" set name = "Rotate Counter-Clockwise"
@@ -153,7 +153,7 @@
set src in oview(1) set src in oview(1)
var/datum/component/simple_rotation/rotcomp = GetComponent(/datum/component/simple_rotation) var/datum/component/simple_rotation/rotcomp = GetComponent(/datum/component/simple_rotation)
if(rotcomp) if(rotcomp)
rotcomp.HandRot(usr,ROTATION_COUNTERCLOCKWISE) rotcomp.HandRot(null,usr,ROTATION_COUNTERCLOCKWISE)
/atom/movable/proc/simple_rotate_flip() /atom/movable/proc/simple_rotate_flip()
set name = "Flip" set name = "Flip"
@@ -161,4 +161,4 @@
set src in oview(1) set src in oview(1)
var/datum/component/simple_rotation/rotcomp = GetComponent(/datum/component/simple_rotation) var/datum/component/simple_rotation/rotcomp = GetComponent(/datum/component/simple_rotation)
if(rotcomp) if(rotcomp)
rotcomp.HandRot(usr,ROTATION_FLIP) rotcomp.HandRot(null,usr,ROTATION_FLIP)
+21
View File
@@ -11,6 +11,8 @@
var/config_max_users = 0 var/config_max_users = 0
var/config_min_users = 0 var/config_min_users = 0
var/voteweight = 1 var/voteweight = 1
var/max_round_search_span = 0 //If this is nonzero, then if the map has been played more than max_rounds_played within the search span (max determined by define in persistence.dm), this map won't be available.
var/max_rounds_played = 0
// Config actually from the JSON - should default to Box // Config actually from the JSON - should default to Box
var/map_name = "Box Station" var/map_name = "Box Station"
@@ -23,6 +25,10 @@
var/minetype = "lavaland" var/minetype = "lavaland"
var/maptype = MAP_TYPE_STATION //This should be used to adjust ingame behavior depending on the specific type of map being played. For instance, if an overmap were added, it'd be appropriate for it to only generate with a MAP_TYPE_SHIP
var/announcertype = "standard" //Determines the announcer the map uses. standard uses the default announcer, classic, but has a random chance to use other similarly-themed announcers, like medibot
var/allow_custom_shuttles = TRUE var/allow_custom_shuttles = TRUE
var/shuttles = list( var/shuttles = list(
"cargo" = "cargo_box", "cargo" = "cargo_box",
@@ -30,6 +36,8 @@
"whiteship" = "whiteship_box", "whiteship" = "whiteship_box",
"emergency" = "emergency_box") "emergency" = "emergency_box")
var/year_offset = 540 //The offset of ingame year from the actual IRL year. You know you want to make a map that takes place in the 90's. Don't lie.
/proc/load_map_config(filename = "data/next_map.json", default_to_box, delete_after, error_if_missing = TRUE) /proc/load_map_config(filename = "data/next_map.json", default_to_box, delete_after, error_if_missing = TRUE)
var/datum/map_config/config = new var/datum/map_config/config = new
if (default_to_box) if (default_to_box)
@@ -122,8 +130,21 @@
log_world("map_config space_empty_levels is not a number!") log_world("map_config space_empty_levels is not a number!")
return return
temp = json["year_offset"]
if (isnum(temp))
year_offset = temp
else if (!isnull(temp))
log_world("map_config year_offset is not a number!")
return
if ("minetype" in json) if ("minetype" in json)
minetype = json["minetype"] minetype = json["minetype"]
if ("maptype" in json)
maptype = json["maptype"]
if ("announcertype" in json)
announcertype = json["announcertype"]
allow_custom_shuttles = json["allow_custom_shuttles"] != FALSE allow_custom_shuttles = json["allow_custom_shuttles"] != FALSE
+2 -2
View File
@@ -155,7 +155,7 @@
/datum/status_effect/belligerent/proc/do_movement_toggle(force_damage) /datum/status_effect/belligerent/proc/do_movement_toggle(force_damage)
var/number_legs = owner.get_num_legs(FALSE) var/number_legs = owner.get_num_legs(FALSE)
if(iscarbon(owner) && !is_servant_of_ratvar(owner) && !owner.anti_magic_check() && number_legs) if(iscarbon(owner) && !is_servant_of_ratvar(owner) && !owner.anti_magic_check(chargecost = 0) && number_legs)
if(force_damage || owner.m_intent != MOVE_INTENT_WALK) if(force_damage || owner.m_intent != MOVE_INTENT_WALK)
if(GLOB.ratvar_awakens) if(GLOB.ratvar_awakens)
owner.Knockdown(20) owner.Knockdown(20)
@@ -248,7 +248,7 @@
if(owner.confused) if(owner.confused)
owner.confused = 0 owner.confused = 0
severity = 0 severity = 0
else if(!owner.anti_magic_check() && owner.stat != DEAD && severity) else if(!owner.anti_magic_check(chargecost = 0) && owner.stat != DEAD && severity)
var/static/hum = get_sfx('sound/effects/screech.ogg') //same sound for every proc call var/static/hum = get_sfx('sound/effects/screech.ogg') //same sound for every proc call
if(owner.getToxLoss() > MANIA_DAMAGE_TO_CONVERT) if(owner.getToxLoss() > MANIA_DAMAGE_TO_CONVERT)
if(is_eligible_servant(owner)) if(is_eligible_servant(owner))
+1 -1
View File
@@ -829,7 +829,7 @@ Proc for attack log creation, because really why not
return filters[filter_data.Find(name)] return filters[filter_data.Find(name)]
/atom/movable/proc/remove_filter(name) /atom/movable/proc/remove_filter(name)
if(filter_data[name]) if(filter_data && filter_data[name])
filter_data -= name filter_data -= name
update_filters() update_filters()
return TRUE return TRUE
+7 -5
View File
@@ -27,7 +27,6 @@
glide_size = 8 glide_size = 8
appearance_flags = TILE_BOUND|PIXEL_SCALE appearance_flags = TILE_BOUND|PIXEL_SCALE
var/datum/forced_movement/force_moving = null //handled soley by forced_movement.dm var/datum/forced_movement/force_moving = null //handled soley by forced_movement.dm
var/floating = FALSE
var/movement_type = GROUND //Incase you have multiple types, you automatically use the most useful one. IE: Skating on ice, flippers on water, flying over chasm/space, etc. var/movement_type = GROUND //Incase you have multiple types, you automatically use the most useful one. IE: Skating on ice, flippers on water, flying over chasm/space, etc.
var/atom/movable/pulling var/atom/movable/pulling
var/grab_state = 0 var/grab_state = 0
@@ -422,6 +421,9 @@
var/atom/movable/AM = item var/atom/movable/AM = item
AM.onTransitZ(old_z,new_z) AM.onTransitZ(old_z,new_z)
/atom/movable/proc/setMovetype(newval)
movement_type = newval
//Called whenever an object moves and by mobs when they attempt to move themselves through space //Called whenever an object moves and by mobs when they attempt to move themselves through space
//And when an object or action applies a force on src, see newtonian_move() below //And when an object or action applies a force on src, see newtonian_move() below
//Return 0 to have src start/keep drifting in a no-grav area and 1 to stop/not start drifting //Return 0 to have src start/keep drifting in a no-grav area and 1 to stop/not start drifting
@@ -686,14 +688,14 @@
/atom/movable/proc/float(on) /atom/movable/proc/float(on)
if(throwing) if(throwing)
return return
if(on && !floating) if(on && !(movement_type & FLOATING))
animate(src, pixel_y = pixel_y + 2, time = 10, loop = -1) animate(src, pixel_y = pixel_y + 2, time = 10, loop = -1)
sleep(10) sleep(10)
animate(src, pixel_y = pixel_y - 2, time = 10, loop = -1) animate(src, pixel_y = pixel_y - 2, time = 10, loop = -1)
floating = TRUE setMovetype(movement_type | FLOATING)
else if (!on && floating) else if (!on && (movement_type & FLOATING))
animate(src, pixel_y = initial(pixel_y), time = 10) animate(src, pixel_y = initial(pixel_y), time = 10)
floating = FALSE setMovetype(movement_type & ~FLOATING)
/* Language procs */ /* Language procs */
/atom/movable/proc/get_language_holder(shadow=TRUE) /atom/movable/proc/get_language_holder(shadow=TRUE)
@@ -267,6 +267,7 @@
operation_req_access = list(ACCESS_SYNDICATE) operation_req_access = list(ACCESS_SYNDICATE)
wreckage = /obj/structure/mecha_wreckage/honker/dark wreckage = /obj/structure/mecha_wreckage/honker/dark
max_equip = 3 max_equip = 3
spawn_tracked = FALSE
/obj/mecha/combat/honker/dark/GrantActions(mob/living/user, human_occupant = 0) /obj/mecha/combat/honker/dark/GrantActions(mob/living/user, human_occupant = 0)
..() ..()
+1 -1
View File
@@ -221,7 +221,7 @@ GLOBAL_VAR_INIT(dynamic_forced_threat_level, -1)
. += G.get_report() . += G.get_report()
print_command_report(., "Central Command Status Summary", announce=FALSE) print_command_report(., "Central Command Status Summary", announce=FALSE)
priority_announce("A summary has been copied and printed to all communications consoles.", "Security level elevated.", 'sound/ai/intercept.ogg') priority_announce("A summary has been copied and printed to all communications consoles.", "Security level elevated.", "intercept")
if(GLOB.security_level < SEC_LEVEL_BLUE) if(GLOB.security_level < SEC_LEVEL_BLUE)
set_security_level(SEC_LEVEL_BLUE) set_security_level(SEC_LEVEL_BLUE)
@@ -263,7 +263,7 @@
M.mind.special_role = antag_flag M.mind.special_role = antag_flag
M.mind.add_antag_datum(AI) M.mind.add_antag_datum(AI)
if(prob(ion_announce)) if(prob(ion_announce))
priority_announce("Ion storm detected near the station. Please check all AI-controlled equipment for errors.", "Anomaly Alert", 'sound/ai/ionstorm.ogg') priority_announce("Ion storm detected near the station. Please check all AI-controlled equipment for errors.", "Anomaly Alert", "ionstorm")
if(prob(removeDontImproveChance)) if(prob(removeDontImproveChance))
M.replace_random_law(generate_ion_law(), list(LAW_INHERENT, LAW_SUPPLIED, LAW_ION)) M.replace_random_law(generate_ion_law(), list(LAW_INHERENT, LAW_SUPPLIED, LAW_ION))
else else
+3 -3
View File
@@ -1,5 +1,5 @@
/proc/power_failure() /proc/power_failure()
priority_announce("Abnormal activity detected in [station_name()]'s powernet. As a precautionary measure, the station's power will be shut off for an indeterminate duration.", "Critical Power Failure", 'sound/ai/poweroff.ogg') priority_announce("Abnormal activity detected in [station_name()]'s powernet. As a precautionary measure, the station's power will be shut off for an indeterminate duration.", "Critical Power Failure", "poweroff")
for(var/obj/machinery/power/smes/S in GLOB.machines) for(var/obj/machinery/power/smes/S in GLOB.machines)
if(istype(get_area(S), /area/ai_monitored/turret_protected) || !is_station_level(S.z)) if(istype(get_area(S), /area/ai_monitored/turret_protected) || !is_station_level(S.z))
continue continue
@@ -48,7 +48,7 @@
/proc/power_restore() /proc/power_restore()
priority_announce("Power has been restored to [station_name()]. We apologize for the inconvenience.", "Power Systems Nominal", 'sound/ai/poweron.ogg') priority_announce("Power has been restored to [station_name()]. We apologize for the inconvenience.", "Power Systems Nominal", "poweron")
for(var/obj/machinery/power/apc/C in GLOB.machines) for(var/obj/machinery/power/apc/C in GLOB.machines)
if(C.cell && is_station_level(C.z)) if(C.cell && is_station_level(C.z))
C.cell.charge = C.cell.maxcharge C.cell.charge = C.cell.maxcharge
@@ -70,7 +70,7 @@
/proc/power_restore_quick() /proc/power_restore_quick()
priority_announce("All SMESs on [station_name()] have been recharged. We apologize for the inconvenience.", "Power Systems Nominal", 'sound/ai/poweron.ogg') priority_announce("All SMESs on [station_name()] have been recharged. We apologize for the inconvenience.", "Power Systems Nominal", "poweron")
for(var/obj/machinery/power/smes/S in GLOB.machines) for(var/obj/machinery/power/smes/S in GLOB.machines)
if(!is_station_level(S.z)) if(!is_station_level(S.z))
continue continue
+1 -1
View File
@@ -29,4 +29,4 @@
/datum/game_mode/extended/announced/send_intercept(report = 0) /datum/game_mode/extended/announced/send_intercept(report = 0)
if(flipseclevel) //CIT CHANGE - allows the sec level to be flipped roundstart if(flipseclevel) //CIT CHANGE - allows the sec level to be flipped roundstart
return ..() return ..()
priority_announce("Thanks to the tireless efforts of our security and intelligence divisions, there are currently no credible threats to [station_name()]. All station construction projects have been authorized. Have a secure shift!", "Security Report", 'sound/ai/commandreport.ogg') priority_announce("Thanks to the tireless efforts of our security and intelligence divisions, there are currently no credible threats to [station_name()]. All station construction projects have been authorized. Have a secure shift!", "Security Report", "commandreport")
+2 -2
View File
@@ -258,7 +258,7 @@
/datum/game_mode/proc/send_intercept() /datum/game_mode/proc/send_intercept()
if(flipseclevel && !(config_tag == "extended"))//CIT CHANGE - lets the security level be flipped roundstart if(flipseclevel && !(config_tag == "extended"))//CIT CHANGE - lets the security level be flipped roundstart
priority_announce("Thanks to the tireless efforts of our security and intelligence divisions, there are currently no credible threats to [station_name()]. All station construction projects have been authorized. Have a secure shift!", "Security Report", 'sound/ai/commandreport.ogg') priority_announce("Thanks to the tireless efforts of our security and intelligence divisions, there are currently no credible threats to [station_name()]. All station construction projects have been authorized. Have a secure shift!", "Security Report", "commandreport")
return return
var/intercepttext = "<b><i>Central Command Status Summary</i></b><hr>" var/intercepttext = "<b><i>Central Command Status Summary</i></b><hr>"
intercepttext += "<b>Central Command has intercepted and partially decoded a Syndicate transmission with vital information regarding their movements. The following report outlines the most \ intercepttext += "<b>Central Command has intercepted and partially decoded a Syndicate transmission with vital information regarding their movements. The following report outlines the most \
@@ -288,7 +288,7 @@
intercepttext += G.get_report() intercepttext += G.get_report()
print_command_report(intercepttext, "Central Command Status Summary", announce=FALSE) print_command_report(intercepttext, "Central Command Status Summary", announce=FALSE)
priority_announce("A summary has been copied and printed to all communications consoles.", "Enemy communication intercepted. Security level elevated.", 'sound/ai/intercept.ogg') priority_announce("A summary has been copied and printed to all communications consoles.", "Enemy communication intercepted. Security level elevated.", "intercept")
if(GLOB.security_level < SEC_LEVEL_BLUE) if(GLOB.security_level < SEC_LEVEL_BLUE)
set_security_level(SEC_LEVEL_BLUE) set_security_level(SEC_LEVEL_BLUE)
+4 -3
View File
@@ -1,8 +1,7 @@
#define ARCADE_WEIGHT_TRICK 4 #define ARCADE_WEIGHT_TRICK 4
#define ARCADE_WEIGHT_USELESS 2 #define ARCADE_WEIGHT_USELESS 2
#define ARCADE_WEIGHT_RARE 1 #define ARCADE_WEIGHT_RARE 1
#define ARCADE_WEIGHT_PLUSH 65 #define ARCADE_RATIO_PLUSH 0.20 // average 1 out of 6 wins is a plush.
/obj/machinery/computer/arcade /obj/machinery/computer/arcade
name = "random arcade" name = "random arcade"
@@ -27,7 +26,6 @@
/obj/item/toy/katana = ARCADE_WEIGHT_TRICK, /obj/item/toy/katana = ARCADE_WEIGHT_TRICK,
/obj/item/toy/minimeteor = ARCADE_WEIGHT_TRICK, /obj/item/toy/minimeteor = ARCADE_WEIGHT_TRICK,
/obj/item/toy/nuke = ARCADE_WEIGHT_TRICK, /obj/item/toy/nuke = ARCADE_WEIGHT_TRICK,
/obj/item/toy/plush/random = ARCADE_WEIGHT_PLUSH,
/obj/item/toy/redbutton = ARCADE_WEIGHT_TRICK, /obj/item/toy/redbutton = ARCADE_WEIGHT_TRICK,
/obj/item/toy/spinningtoy = ARCADE_WEIGHT_TRICK, /obj/item/toy/spinningtoy = ARCADE_WEIGHT_TRICK,
/obj/item/toy/sword = ARCADE_WEIGHT_TRICK, /obj/item/toy/sword = ARCADE_WEIGHT_TRICK,
@@ -90,6 +88,9 @@
var/obj/item/circuitboard/CB = new thegame() var/obj/item/circuitboard/CB = new thegame()
new CB.build_path(loc, CB) new CB.build_path(loc, CB)
return INITIALIZE_HINT_QDEL return INITIALIZE_HINT_QDEL
//The below object acts as a spawner with a wide array of possible picks, most being uninspired references to past/current player characters.
//Nevertheless, this keeps its ratio constant with the sum of all the others prizes.
prizes[/obj/item/toy/plush/random] = counterlist_sum(prizes) * ARCADE_RATIO_PLUSH
Reset() Reset()
/obj/machinery/computer/arcade/proc/prizevend(mob/user, list/rarity_classes) /obj/machinery/computer/arcade/proc/prizevend(mob/user, list/rarity_classes)
@@ -335,7 +335,7 @@
Nuke_request(input, usr) Nuke_request(input, usr)
to_chat(usr, "<span class='notice'>Request sent.</span>") to_chat(usr, "<span class='notice'>Request sent.</span>")
usr.log_message("has requested the nuclear codes from CentCom", LOG_SAY) usr.log_message("has requested the nuclear codes from CentCom", LOG_SAY)
priority_announce("The codes for the on-station nuclear self-destruct have been requested by [usr]. Confirmation or denial of this request will be sent shortly.", "Nuclear Self Destruct Codes Requested",'sound/ai/commandreport.ogg') priority_announce("The codes for the on-station nuclear self-destruct have been requested by [usr]. Confirmation or denial of this request will be sent shortly.", "Nuclear Self Destruct Codes Requested","commandreport")
CM.lastTimeUsed = world.time CM.lastTimeUsed = world.time
+1 -1
View File
@@ -484,7 +484,7 @@
var/counter = 1 var/counter = 1
while(active2.fields[text("com_[]", counter)]) while(active2.fields[text("com_[]", counter)])
counter++ counter++
active2.fields[text("com_[]", counter)] = text("Made by [] ([]) on [] [], []<BR>[]", authenticated, rank, STATION_TIME_TIMESTAMP("hh:mm:ss"), time2text(world.realtime, "MMM DD"), GLOB.year_integer+540, t1) active2.fields[text("com_[]", counter)] = text("Made by [] ([]) on [] [], []<BR>[]", authenticated, rank, STATION_TIME_TIMESTAMP("hh:mm:ss"), time2text(world.realtime, "MMM DD"), GLOB.year_integer, t1)
else if(href_list["del_c"]) else if(href_list["del_c"])
if((istype(active2, /datum/data/record) && active2.fields[text("com_[]", href_list["del_c"])])) if((istype(active2, /datum/data/record) && active2.fields[text("com_[]", href_list["del_c"])]))
+1 -1
View File
@@ -455,7 +455,7 @@ What a mess.*/
var/counter = 1 var/counter = 1
while(active2.fields[text("com_[]", counter)]) while(active2.fields[text("com_[]", counter)])
counter++ counter++
active2.fields[text("com_[]", counter)] = text("Made by [] ([]) on [] [], []<BR>[]", src.authenticated, src.rank, STATION_TIME_TIMESTAMP("hh:mm:ss"), time2text(world.realtime, "MMM DD"), GLOB.year_integer+540, t1) active2.fields[text("com_[]", counter)] = text("Made by [] ([]) on [] [], []<BR>[]", src.authenticated, src.rank, STATION_TIME_TIMESTAMP("hh:mm:ss"), time2text(world.realtime, "MMM DD"), GLOB.year_integer, t1)
if("Delete Record (ALL)") if("Delete Record (ALL)")
if(active1) if(active1)
+6
View File
@@ -3,3 +3,9 @@
internal_damage_threshold = 50 internal_damage_threshold = 50
armor = list("melee" = 30, "bullet" = 30, "laser" = 15, "energy" = 20, "bomb" = 20, "bio" = 0, "rad" = 0, "fire" = 100, "acid" = 100) armor = list("melee" = 30, "bullet" = 30, "laser" = 15, "energy" = 20, "bomb" = 20, "bio" = 0, "rad" = 0, "fire" = 100, "acid" = 100)
mouse_pointer = 'icons/mecha/mecha_mouse.dmi' mouse_pointer = 'icons/mecha/mecha_mouse.dmi'
var/spawn_tracked = TRUE
/obj/mecha/combat/Initialize()
. = ..()
if(spawn_tracked)
trackers += new /obj/item/mecha_parts/mecha_tracking(src)
-4
View File
@@ -19,7 +19,3 @@
/obj/mecha/combat/durand/RemoveActions(mob/living/user, human_occupant = 0) /obj/mecha/combat/durand/RemoveActions(mob/living/user, human_occupant = 0)
..() ..()
defense_action.Remove(user) defense_action.Remove(user)
/obj/mecha/combat/Initialize()
. = ..()
trackers += new /obj/item/mecha_parts/mecha_tracking(src)
+1 -5
View File
@@ -29,6 +29,7 @@
operation_req_access = list(ACCESS_SYNDICATE) operation_req_access = list(ACCESS_SYNDICATE)
wreckage = /obj/structure/mecha_wreckage/gygax/dark wreckage = /obj/structure/mecha_wreckage/gygax/dark
max_equip = 4 max_equip = 4
spawn_tracked = FALSE
/obj/mecha/combat/gygax/dark/loaded/Initialize() /obj/mecha/combat/gygax/dark/loaded/Initialize()
. = ..() . = ..()
@@ -48,7 +49,6 @@
return return
cell = new /obj/item/stock_parts/cell/hyper(src) cell = new /obj/item/stock_parts/cell/hyper(src)
/obj/mecha/combat/gygax/GrantActions(mob/living/user, human_occupant = 0) /obj/mecha/combat/gygax/GrantActions(mob/living/user, human_occupant = 0)
..() ..()
overload_action.Grant(user, src) overload_action.Grant(user, src)
@@ -65,7 +65,3 @@
/obj/mecha/combat/gygax/dark/RemoveActions(mob/living/user, human_occupant = 0) /obj/mecha/combat/gygax/dark/RemoveActions(mob/living/user, human_occupant = 0)
..() ..()
thrusters_action.Remove(user) thrusters_action.Remove(user)
/obj/mecha/combat/Initialize()
. = ..()
trackers += new /obj/item/mecha_parts/mecha_tracking(src)
+1 -5
View File
@@ -152,8 +152,4 @@
var/color="" var/color=""
for (var/i=0;i<6;i++) for (var/i=0;i<6;i++)
color = color+pick(colors) color = color+pick(colors)
return color return color
/obj/mecha/combat/Initialize()
. = ..()
trackers += new /obj/item/mecha_parts/mecha_tracking(src)
+1
View File
@@ -16,6 +16,7 @@
force = 45 force = 45
max_equip = 4 max_equip = 4
bumpsmash = 1 bumpsmash = 1
spawn_tracked = FALSE
/obj/mecha/combat/marauder/GrantActions(mob/living/user, human_occupant = 0) /obj/mecha/combat/marauder/GrantActions(mob/living/user, human_occupant = 0)
..() ..()
+1
View File
@@ -13,6 +13,7 @@
breach_time = 100 //ten seconds till all goes to shit breach_time = 100 //ten seconds till all goes to shit
recharge_rate = 100 recharge_rate = 100
wreckage = /obj/structure/mecha_wreckage/durand/neovgre wreckage = /obj/structure/mecha_wreckage/durand/neovgre
spawn_tracked = FALSE
/obj/mecha/combat/neovgre/GrantActions(mob/living/user, human_occupant = 0) //No Eject action for you sonny jim, your life for Ratvar! /obj/mecha/combat/neovgre/GrantActions(mob/living/user, human_occupant = 0) //No Eject action for you sonny jim, your life for Ratvar!
internals_action.Grant(user, src) internals_action.Grant(user, src)
-4
View File
@@ -27,7 +27,3 @@
..() ..()
switch_damtype_action.Remove(user) switch_damtype_action.Remove(user)
phasing_action.Remove(user) phasing_action.Remove(user)
/obj/mecha/combat/Initialize()
. = ..()
trackers += new /obj/item/mecha_parts/mecha_tracking(src)
+1
View File
@@ -18,6 +18,7 @@
stepsound = null stepsound = null
turnsound = null turnsound = null
opacity = 0 opacity = 0
spawn_tracked = FALSE
/obj/mecha/combat/reticence/loaded/Initialize() /obj/mecha/combat/reticence/loaded/Initialize()
. = ..() . = ..()
+1 -4
View File
@@ -1025,7 +1025,7 @@
/obj/mecha/log_message(message as text, message_type=LOG_GAME, color=null, log_globally) /obj/mecha/log_message(message as text, message_type=LOG_GAME, color=null, log_globally)
log.len++ log.len++
log[log.len] = list("time"="[STATION_TIME_TIMESTAMP("hh:mm:ss")]","date","year"="[GLOB.year_integer+540]","message"="[color?"<font color='[color]'>":null][message][color?"</font>":null]") log[log.len] = list("time"="[STATION_TIME_TIMESTAMP("hh:mm:ss")]","date","year"="[GLOB.year_integer]","message"="[color?"<font color='[color]'>":null][message][color?"</font>":null]")
..() ..()
return log.len return log.len
@@ -1034,9 +1034,6 @@
last_entry["message"] += "<br>[red?"<font color='red'>":null][message][red?"</font>":null]" last_entry["message"] += "<br>[red?"<font color='red'>":null][message][red?"</font>":null]"
return return
GLOBAL_VAR_INIT(year, time2text(world.realtime,"YYYY"))
GLOBAL_VAR_INIT(year_integer, text2num(year)) // = 2013???
/////////////////////// ///////////////////////
///// Power stuff ///// ///// Power stuff /////
/////////////////////// ///////////////////////
+2 -2
View File
@@ -170,7 +170,7 @@
if(!victim.client || !istype(victim)) if(!victim.client || !istype(victim))
return return
to_chat(victim, "<span class='notice'>You feel fast!</span>") to_chat(victim, "<span class='notice'>You feel fast!</span>")
ADD_TRAIT(victim, TRAIT_GOTTAGOREALLYFAST, "yellow_orb") victim.add_movespeed_modifier(MOVESPEED_ID_YELLOW_ORB, update=TRUE, priority=100, multiplicative_slowdown=-2, blacklisted_movetypes=(FLYING|FLOATING))
sleep(duration) sleep(duration)
REMOVE_TRAIT(victim, TRAIT_GOTTAGOREALLYFAST, "yellow_orb") victim.remove_movespeed_modifier(MOVESPEED_ID_YELLOW_ORB)
to_chat(victim, "<span class='notice'>You slow down.</span>") to_chat(victim, "<span class='notice'>You slow down.</span>")
+4 -1
View File
@@ -439,6 +439,9 @@ RLD
/obj/item/construction/rcd/proc/rcd_create(atom/A, mob/user) /obj/item/construction/rcd/proc/rcd_create(atom/A, mob/user)
var/list/rcd_results = A.rcd_vals(user, src) var/list/rcd_results = A.rcd_vals(user, src)
var/turf/the_turf = get_turf(A)
var/turf_coords = "[COORD(the_turf)]"
investigate_log("[user] is attempting to use [src] on [A] (loc [turf_coords] at [the_turf]) with cost [rcd_results["cost"]], delay [rcd_results["delay"]], mode [rcd_results["mode"]].", INVESTIGATE_RCD)
if(!rcd_results) if(!rcd_results)
return FALSE return FALSE
if(do_after(user, rcd_results["delay"] * delay_mod, target = A)) if(do_after(user, rcd_results["delay"] * delay_mod, target = A))
@@ -447,7 +450,7 @@ RLD
if(A.rcd_act(user, src, rcd_results["mode"])) if(A.rcd_act(user, src, rcd_results["mode"]))
useResource(rcd_results["cost"], user) useResource(rcd_results["cost"], user)
activate() activate()
investigate_log("[user] used [src] on [cached] (now [A]) with cost [rcd_results["cost"]], delay [rcd_results["delay"]], mode [rcd_results["mode"]].", INVESTIGATE_RCD) investigate_log("[user] used [src] on [cached] (loc [turf_coords] at [the_turf]) with cost [rcd_results["cost"]], delay [rcd_results["delay"]], mode [rcd_results["mode"]].", INVESTIGATE_RCD)
playsound(src, 'sound/machines/click.ogg', 50, 1) playsound(src, 'sound/machines/click.ogg', 50, 1)
return TRUE return TRUE
+1 -1
View File
@@ -274,7 +274,7 @@ GLOBAL_LIST_EMPTY(PDAs)
dat += text("<br><a href='?src=[REF(src)];choice=UpdateInfo'>[id ? "Update PDA Info" : ""]</A><br><br>") dat += text("<br><a href='?src=[REF(src)];choice=UpdateInfo'>[id ? "Update PDA Info" : ""]</A><br><br>")
dat += "[STATION_TIME_TIMESTAMP("hh:mm:ss")]<br>" //:[world.time / 100 % 6][world.time / 100 % 10]" dat += "[STATION_TIME_TIMESTAMP("hh:mm:ss")]<br>" //:[world.time / 100 % 6][world.time / 100 % 10]"
dat += "[time2text(world.realtime, "MMM DD")] [GLOB.year_integer+540]" dat += "[time2text(world.realtime, "MMM DD")] [GLOB.year_integer]"
dat += "<br><br>" dat += "<br><br>"
+1 -1
View File
@@ -48,7 +48,7 @@
/obj/item/multitool/chaplain/Initialize() /obj/item/multitool/chaplain/Initialize()
. = ..() . = ..()
AddComponent(/datum/component/anti_magic, TRUE, TRUE) AddComponent(/datum/component/anti_magic, TRUE, TRUE, FALSE, null, null, FALSE)
/obj/item/multitool/examine(mob/user) /obj/item/multitool/examine(mob/user)
..() ..()
+1 -1
View File
@@ -233,7 +233,7 @@
/obj/item/nullrod/Initialize() /obj/item/nullrod/Initialize()
. = ..() . = ..()
AddComponent(/datum/component/anti_magic, TRUE, TRUE) AddComponent(/datum/component/anti_magic, TRUE, TRUE, FALSE, null, null, FALSE)
/obj/item/nullrod/suicide_act(mob/user) /obj/item/nullrod/suicide_act(mob/user)
user.visible_message("<span class='suicide'>[user] is killing [user.p_them()]self with [src]! It looks like [user.p_theyre()] trying to get closer to god!</span>") user.visible_message("<span class='suicide'>[user] is killing [user.p_them()]self with [src]! It looks like [user.p_theyre()] trying to get closer to god!</span>")
+2 -2
View File
@@ -366,10 +366,10 @@
/obj/item/toy/plush/random /obj/item/toy/plush/random
name = "Illegal plushie" name = "Illegal plushie"
desc = "Something fucked up" desc = "Something fucked up"
var/blacklisted_plushes = list(/obj/item/toy/plush/carpplushie/dehy_carp, /obj/item/toy/plush/awakenedplushie, /obj/item/toy/plush/random)
/obj/item/toy/plush/random/Initialize() /obj/item/toy/plush/random/Initialize()
..() var/newtype = pick(subtypesof(/obj/item/toy/plush) - typecacheof(blacklisted_plushes))
var/newtype = pick(subtypesof(/obj/item/toy/plush))
new newtype(loc) new newtype(loc)
return INITIALIZE_HINT_QDEL return INITIALIZE_HINT_QDEL
+1 -1
View File
@@ -313,7 +313,7 @@
if(M.get_ear_protection() == FALSE) if(M.get_ear_protection() == FALSE)
M.confused += 6 M.confused += 6
audible_message("<font color='red' size='7'>HUMAN HARM</font>") audible_message("<font color='red' size='7'>HUMAN HARM</font>")
playsound(get_turf(src), 'sound/ai/harmalarm.ogg', 70, 3) playsound(get_turf(src), 'sound/effects/harmalarm.ogg', 70, 3)
cooldown = world.time + 200 cooldown = world.time + 200
log_game("[key_name(user)] used a Cyborg Harm Alarm in [AREACOORD(user)]") log_game("[key_name(user)] used a Cyborg Harm Alarm in [AREACOORD(user)]")
if(iscyborg(user)) if(iscyborg(user))
+16 -12
View File
@@ -89,32 +89,36 @@
R.speed = initial(R.speed) R.speed = initial(R.speed)
/obj/item/borg/upgrade/disablercooler /obj/item/borg/upgrade/disablercooler
name = "cyborg rapid disabler cooling module" name = "cyborg rapid energy blaster cooling module"
desc = "Used to cool a mounted disabler, increasing the potential current in it and thus its recharge rate." desc = "Used to cool a mounted energy-based firearm, increasing the potential current in it and thus its recharge rate."
icon_state = "cyborg_upgrade3" icon_state = "cyborg_upgrade3"
require_module = 1 require_module = 1
/obj/item/borg/upgrade/disablercooler/action(mob/living/silicon/robot/R, user = usr) /obj/item/borg/upgrade/disablercooler/action(mob/living/silicon/robot/R, user = usr)
. = ..() . = ..()
if(.) if(.)
var/obj/item/gun/energy/disabler/cyborg/T = locate() in R.module.modules var/successflag
if(!T) for(var/obj/item/gun/energy/T in R.module.modules)
to_chat(user, "<span class='notice'>There's no disabler in this unit!</span>") if(T.charge_delay <= 2)
successflag = successflag || 2
continue
T.charge_delay = max(2, T.charge_delay - 4)
successflag = 1
if(!successflag)
to_chat(user, "<span class='notice'>There's no energy-based firearm in this unit!</span>")
return FALSE return FALSE
if(T.charge_delay <= 2) if(successflag == 2)
to_chat(R, "<span class='notice'>A cooling unit is already installed!</span>") to_chat(R, "<span class='notice'>A cooling unit is already installed!</span>")
to_chat(user, "<span class='notice'>There's no room for another cooling unit!</span>") to_chat(user, "<span class='notice'>There's no room for another cooling unit!</span>")
return FALSE return FALSE
T.charge_delay = max(2 , T.charge_delay - 4)
/obj/item/borg/upgrade/disablercooler/deactivate(mob/living/silicon/robot/R, user = usr) /obj/item/borg/upgrade/disablercooler/deactivate(mob/living/silicon/robot/R, user = usr)
. = ..() . = ..()
if (.) if (.)
var/obj/item/gun/energy/disabler/cyborg/T = locate() in R.module.modules for(var/obj/item/gun/energy/T in R.module.modules)
if(!T) T.charge_delay = initial(T.charge_delay)
return FALSE return .
T.charge_delay = initial(T.charge_delay) return FALSE
/obj/item/borg/upgrade/thrusters /obj/item/borg/upgrade/thrusters
name = "ion thruster upgrade" name = "ion thruster upgrade"
+1 -1
View File
@@ -1144,7 +1144,7 @@
if(can_expire) if(can_expire)
expiration_date = rand(expiration_date_min, expiration_date_max) expiration_date = rand(expiration_date_min, expiration_date_max)
desc += "\n<span_clas='notice'>An expiry date is listed on it. It reads: [expiration_date]</span>" desc += "\n<span_clas='notice'>An expiry date is listed on it. It reads: [expiration_date]</span>"
var/spess_current_year = GLOB.year_integer + 540 var/spess_current_year = GLOB.year_integer
if(expiration_date < spess_current_year) if(expiration_date < spess_current_year)
var/gross_risk = min(round(spess_current_year - expiration_date * 0.1), 1) var/gross_risk = min(round(spess_current_year - expiration_date * 0.1), 1)
var/toxic_risk = min(round(spess_current_year - expiration_date * 0.01), 1) var/toxic_risk = min(round(spess_current_year - expiration_date * 0.01), 1)
+4 -2
View File
@@ -1,4 +1,5 @@
#define STUNBATON_CHARGE_LENIENCY 0.3 #define STUNBATON_CHARGE_LENIENCY 0.3
#define STUNBATON_DEPLETION_RATE 0.006
/obj/item/melee/baton /obj/item/melee/baton
name = "stunbaton" name = "stunbaton"
@@ -76,7 +77,7 @@
update_icon() update_icon()
/obj/item/melee/baton/process() /obj/item/melee/baton/process()
deductcharge(hitcost * 0.004, FALSE, FALSE) deductcharge(round(hitcost * STUNBATON_DEPLETION_RATE), FALSE, FALSE)
/obj/item/melee/baton/update_icon() /obj/item/melee/baton/update_icon()
if(status) if(status)
@@ -250,4 +251,5 @@
sparkler?.activate() sparkler?.activate()
. = ..() . = ..()
#undef STUNBATON_CHARGE_LENIENCY #undef STUNBATON_CHARGE_LENIENCY
#undef STUNBATON_DEPLETION_RATE
+29 -18
View File
@@ -17,7 +17,7 @@
/obj/item/tank/jetpack/New() /obj/item/tank/jetpack/New()
..() ..()
if(gas_type) if(gas_type)
air_contents.gases[gas_type] = (6 * ONE_ATMOSPHERE) * volume / (R_IDEAL_GAS_EQUATION * T20C) air_contents.gases[gas_type] = ((6 * ONE_ATMOSPHERE) * volume / (R_IDEAL_GAS_EQUATION * T20C))
ion_trail = new ion_trail = new
ion_trail.set_up(src) ion_trail.set_up(src)
@@ -37,42 +37,50 @@
return return
if(!on) if(!on)
turn_on() turn_on(user)
to_chat(user, "<span class='notice'>You turn the jetpack on.</span>") to_chat(user, "<span class='notice'>You turn the jetpack on.</span>")
else else
turn_off() turn_off(user)
to_chat(user, "<span class='notice'>You turn the jetpack off.</span>") to_chat(user, "<span class='notice'>You turn the jetpack off.</span>")
for(var/X in actions) for(var/X in actions)
var/datum/action/A = X var/datum/action/A = X
A.UpdateButtonIcon() A.UpdateButtonIcon()
/obj/item/tank/jetpack/proc/turn_on() /obj/item/tank/jetpack/proc/turn_on(mob/user)
on = TRUE on = TRUE
icon_state = "[initial(icon_state)]-on" icon_state = "[initial(icon_state)]-on"
ion_trail.start() ion_trail.start()
RegisterSignal(user, COMSIG_MOVABLE_MOVED, .proc/move_react)
if(full_speed)
user.add_movespeed_modifier(MOVESPEED_ID_JETPACK, priority=100, multiplicative_slowdown=-2, movetypes=FLOATING, conflict=MOVE_CONFLICT_JETPACK)
/obj/item/tank/jetpack/proc/turn_off() /obj/item/tank/jetpack/proc/turn_off(mob/user)
on = FALSE on = FALSE
stabilizers = FALSE stabilizers = FALSE
icon_state = initial(icon_state) icon_state = initial(icon_state)
ion_trail.stop() ion_trail.stop()
UnregisterSignal(user, COMSIG_MOVABLE_MOVED)
user.remove_movespeed_modifier(MOVESPEED_ID_JETPACK)
/obj/item/tank/jetpack/proc/move_react(mob/user)
allow_thrust(0.01, user)
/obj/item/tank/jetpack/proc/allow_thrust(num, mob/living/user) /obj/item/tank/jetpack/proc/allow_thrust(num, mob/living/user)
if(!on) if(!on)
return return
if((num < 0.005 || air_contents.total_moles() < num)) if((num < 0.005 || air_contents.total_moles() < num))
turn_off() turn_off(user)
return return
var/datum/gas_mixture/removed = air_contents.remove(num) var/datum/gas_mixture/removed = air_contents.remove(num)
if(removed.total_moles() < 0.005) if(removed.total_moles() < 0.005)
turn_off() turn_off(user)
return return
var/turf/T = get_turf(user) var/turf/T = get_turf(user)
T.assume_air(removed) T.assume_air(removed)
return 1 return TRUE
/obj/item/tank/jetpack/suicide_act(mob/user) /obj/item/tank/jetpack/suicide_act(mob/user)
if (istype(user, /mob/living/carbon/human/)) if (istype(user, /mob/living/carbon/human/))
@@ -96,22 +104,22 @@
if(!on) if(!on)
return return
if((num < 0.005 || air_contents.total_moles() < num)) if((num < 0.005 || air_contents.total_moles() < num))
turn_off() turn_off(user)
return return
if(rand(0,250) == 0) if(rand(0,250) == 0)
to_chat(user, "<span class='notice'>You feel your jetpack's engines cut out.</span>") to_chat(user, "<span class='notice'>You feel your jetpack's engines cut out.</span>")
turn_off() turn_off(user)
return return
var/datum/gas_mixture/removed = air_contents.remove(num) var/datum/gas_mixture/removed = air_contents.remove(num)
if(removed.total_moles() < 0.005) if(removed.total_moles() < 0.005)
turn_off() turn_off(user)
return return
var/turf/T = get_turf(user) var/turf/T = get_turf(user)
T.assume_air(removed) T.assume_air(removed)
return 1 return TRUE
/obj/item/tank/jetpack/void /obj/item/tank/jetpack/void
name = "void jetpack (oxygen)" name = "void jetpack (oxygen)"
@@ -178,6 +186,7 @@
full_speed = FALSE full_speed = FALSE
var/datum/gas_mixture/temp_air_contents var/datum/gas_mixture/temp_air_contents
var/obj/item/tank/internals/tank = null var/obj/item/tank/internals/tank = null
var/mob/living/carbon/human/cur_user
/obj/item/tank/jetpack/suit/New() /obj/item/tank/jetpack/suit/New()
..() ..()
@@ -198,28 +207,30 @@
return return
..() ..()
/obj/item/tank/jetpack/suit/turn_on() /obj/item/tank/jetpack/suit/turn_on(mob/user)
if(!istype(loc, /obj/item/clothing/suit/space/hardsuit) || !ishuman(loc.loc)) if(!istype(loc, /obj/item/clothing/suit/space/hardsuit) || !ishuman(loc.loc) || loc.loc != user)
return return
var/mob/living/carbon/human/H = loc.loc var/mob/living/carbon/human/H = user
tank = H.s_store tank = H.s_store
air_contents = tank.air_contents air_contents = tank.air_contents
START_PROCESSING(SSobj, src) START_PROCESSING(SSobj, src)
cur_user = user
..() ..()
/obj/item/tank/jetpack/suit/turn_off() /obj/item/tank/jetpack/suit/turn_off(mob/user)
tank = null tank = null
air_contents = temp_air_contents air_contents = temp_air_contents
STOP_PROCESSING(SSobj, src) STOP_PROCESSING(SSobj, src)
cur_user = null
..() ..()
/obj/item/tank/jetpack/suit/process() /obj/item/tank/jetpack/suit/process()
if(!istype(loc, /obj/item/clothing/suit/space/hardsuit) || !ishuman(loc.loc)) if(!istype(loc, /obj/item/clothing/suit/space/hardsuit) || !ishuman(loc.loc))
turn_off() turn_off(cur_user)
return return
var/mob/living/carbon/human/H = loc.loc var/mob/living/carbon/human/H = loc.loc
if(!tank || tank != H.s_store) if(!tank || tank != H.s_store)
turn_off() turn_off(cur_user)
return return
..() ..()
+3 -3
View File
@@ -6,11 +6,11 @@
item_state = "teleprod" item_state = "teleprod"
slot_flags = null slot_flags = null
/obj/item/melee/baton/cattleprod/teleprod/baton_stun(mob/living/carbon/M, mob/living/carbon/user)//handles making things teleport when hit /obj/item/melee/baton/cattleprod/teleprod/baton_stun(mob/living/L, mob/living/carbon/user)//handles making things teleport when hit
. = ..() . = ..()
if(!. || !istype(M) || M.anchored) if(!. || L.anchored)
return return
do_teleport(M, get_turf(M), 15, channel = TELEPORT_CHANNEL_BLUESPACE) do_teleport(L, get_turf(L), 15, channel = TELEPORT_CHANNEL_BLUESPACE)
/obj/item/melee/baton/cattleprod/teleprod/clowning_around(mob/living/user) /obj/item/melee/baton/cattleprod/teleprod/clowning_around(mob/living/user)
user.visible_message("<span class='danger'>[user] accidentally hits [user.p_them()]self with [src]!</span>", \ user.visible_message("<span class='danger'>[user] accidentally hits [user.p_them()]self with [src]!</span>", \
+1 -1
View File
@@ -506,7 +506,7 @@
/obj/item/twohanded/dualsaber/hypereutactic/chaplain/Initialize() /obj/item/twohanded/dualsaber/hypereutactic/chaplain/Initialize()
. = ..() . = ..()
AddComponent(/datum/component/anti_magic, TRUE, TRUE) AddComponent(/datum/component/anti_magic, TRUE, TRUE, FALSE, null, null, FALSE)
/obj/item/twohanded/dualsaber/hypereutactic/chaplain/IsReflect() /obj/item/twohanded/dualsaber/hypereutactic/chaplain/IsReflect()
return FALSE return FALSE
+1 -1
View File
@@ -528,7 +528,7 @@ for further reading, please see: https://github.com/tgstation/tgstation/pull/301
/obj/item/melee/baseball_bat/chaplain/Initialize() /obj/item/melee/baseball_bat/chaplain/Initialize()
. = ..() . = ..()
AddComponent(/datum/component/anti_magic, TRUE, TRUE) AddComponent(/datum/component/anti_magic, TRUE, TRUE, FALSE, null, null, FALSE)
/obj/item/melee/baseball_bat/homerun /obj/item/melee/baseball_bat/homerun
name = "home run bat" name = "home run bat"
@@ -495,7 +495,25 @@
icon_state = "sofamiddle" icon_state = "sofamiddle"
icon = 'icons/obj/sofa.dmi' icon = 'icons/obj/sofa.dmi'
buildstackamount = 1 buildstackamount = 1
item_chair = null var/mutable_appearance/armrest
/obj/structure/chair/sofa/Initialize()
armrest = mutable_appearance(icon, "[icon_state]_armrest")
return ..()
/obj/structure/chair/sofa/post_buckle_mob(mob/living/M)
. = ..()
update_armrest()
/obj/structure/chair/sofa/proc/update_armrest()
if(has_buckled_mobs())
add_overlay(armrest)
else
cut_overlay(armrest)
/obj/structure/chair/sofa/post_unbuckle_mob()
. = ..()
update_armrest()
/obj/structure/chair/sofa/left /obj/structure/chair/sofa/left
icon_state = "sofaend_left" icon_state = "sofaend_left"
@@ -504,4 +522,7 @@
icon_state = "sofaend_right" icon_state = "sofaend_right"
/obj/structure/chair/sofa/corner /obj/structure/chair/sofa/corner
icon_state = "sofacorner" icon_state = "sofacorner"
/obj/structure/chair/sofa/corner/handle_layer() //only the armrest/back of this chair should cover the mob.
return
+2
View File
@@ -65,6 +65,8 @@
var/mob/M = AM var/mob/M = AM
if(M.mind in immune_minds) if(M.mind in immune_minds)
return return
if(M.anti_magic_check())
flare()
if(charges <= 0) if(charges <= 0)
return return
flare() flare()
+1 -1
View File
@@ -682,7 +682,7 @@
log_admin("[key_name(usr)] delayed the round start.") log_admin("[key_name(usr)] delayed the round start.")
else else
to_chat(world, "<b>The game will start in [DisplayTimeText(newtime)].</b>") to_chat(world, "<b>The game will start in [DisplayTimeText(newtime)].</b>")
SEND_SOUND(world, sound('sound/ai/attention.ogg')) SEND_SOUND(world, sound(get_announcer_sound("attention")))
log_admin("[key_name(usr)] set the pre-game delay to [DisplayTimeText(newtime)].") log_admin("[key_name(usr)] set the pre-game delay to [DisplayTimeText(newtime)].")
SSblackbox.record_feedback("tally", "admin_verb", 1, "Delay Game Start") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! SSblackbox.record_feedback("tally", "admin_verb", 1, "Delay Game Start") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
+2 -2
View File
@@ -400,7 +400,7 @@
SSblackbox.record_feedback("nested tally", "admin_secrets_fun_used", 1, list("Chinese Cartoons")) SSblackbox.record_feedback("nested tally", "admin_secrets_fun_used", 1, list("Chinese Cartoons"))
message_admins("[key_name_admin(usr)] made everything kawaii.") message_admins("[key_name_admin(usr)] made everything kawaii.")
for(var/mob/living/carbon/human/H in GLOB.carbon_list) for(var/mob/living/carbon/human/H in GLOB.carbon_list)
SEND_SOUND(H, sound('sound/ai/animes.ogg')) SEND_SOUND(H, sound(get_announcer_sound("animes")))
if(H.dna.species.id == "human") if(H.dna.species.id == "human")
if(H.dna.features["tail_human"] == "None" || H.dna.features["ears"] == "None") if(H.dna.features["tail_human"] == "None" || H.dna.features["ears"] == "None")
@@ -469,7 +469,7 @@
if(is_station_level(W.z) && !istype(get_area(W), /area/bridge) && !istype(get_area(W), /area/crew_quarters) && !istype(get_area(W), /area/security/prison)) if(is_station_level(W.z) && !istype(get_area(W), /area/bridge) && !istype(get_area(W), /area/crew_quarters) && !istype(get_area(W), /area/security/prison))
W.req_access = list() W.req_access = list()
message_admins("[key_name_admin(usr)] activated Egalitarian Station mode") message_admins("[key_name_admin(usr)] activated Egalitarian Station mode")
priority_announce("CentCom airlock control override activated. Please take this time to get acquainted with your coworkers.", null, 'sound/ai/commandreport.ogg') priority_announce("CentCom airlock control override activated. Please take this time to get acquainted with your coworkers.", null, "commandreport")
if("ak47s") if("ak47s")
if(!check_rights(R_FUN)) if(!check_rights(R_FUN))
+1 -1
View File
@@ -560,7 +560,7 @@ Traitors and the like can also be revived with the previous role mostly intact.
var/announce_command_report = TRUE var/announce_command_report = TRUE
switch(confirm) switch(confirm)
if("Yes") if("Yes")
priority_announce(input, null, 'sound/ai/commandreport.ogg') priority_announce(input, null, "commandreport")
announce_command_report = FALSE announce_command_report = FALSE
if("Cancel") if("Cancel")
return return
@@ -345,8 +345,8 @@
if(QDELETED(G)) if(QDELETED(G))
return return
if(istype(C.get_item_by_slot(SLOT_HEAD), /obj/item/clothing/head/foilhat)) if(C.anti_magic_check(FALSE, FALSE, TRUE, 0))
to_chat(user, "<span class='warning'>Your target seems to have some sort of protective headgear on, blocking the message from being sent!</span>") to_chat(user, "<span class='warning'>Your target seems to have some sort of tinfoil protection on, blocking the message from being sent!</span>")
return return
G.mind_control(command, user) G.mind_control(command, user)
@@ -523,10 +523,10 @@
/obj/item/abductor_baton/proc/SleepAttack(mob/living/L,mob/living/user) /obj/item/abductor_baton/proc/SleepAttack(mob/living/L,mob/living/user)
if(L.incapacitated(TRUE, TRUE)) if(L.incapacitated(TRUE, TRUE))
if(istype(L.get_item_by_slot(SLOT_HEAD), /obj/item/clothing/head/foilhat)) if(L.anti_magic_check(FALSE, FALSE, TRUE, 0))
to_chat(user, "<span class='warning'>The specimen's protective headgear is interfering with the sleep inducement!</span>") to_chat(user, "<span class='warning'>The specimen's tinfoil protection is interfering with the sleep inducement!</span>")
L.visible_message("<span class='danger'>[user] tried to induced sleep in [L] with [src], but [L.p_their()] headgear protected [L.p_them()]!</span>", \ L.visible_message("<span class='danger'>[user] tried to induced sleep in [L] with [src], but [L.p_their()] tinfoil protected [L.p_them()]!</span>", \
"<span class='userdanger'>You feel a strange wave of heavy drowsiness wash over you, but your headgear deflects most of it!</span>") "<span class='userdanger'>You feel a strange wave of heavy drowsiness wash over you, but your tinfoil protection deflects most of it!</span>")
L.drowsyness += 2 L.drowsyness += 2
return return
L.visible_message("<span class='danger'>[user] has induced sleep in [L] with [src]!</span>", \ L.visible_message("<span class='danger'>[user] has induced sleep in [L] with [src]!</span>", \
@@ -535,10 +535,10 @@
L.Sleeping(1200) L.Sleeping(1200)
log_combat(user, L, "put to sleep") log_combat(user, L, "put to sleep")
else else
if(istype(L.get_item_by_slot(SLOT_HEAD), /obj/item/clothing/head/foilhat)) if(L.anti_magic_check(FALSE, FALSE, TRUE, 0))
to_chat(user, "<span class='warning'>The specimen's protective headgear is completely blocking our sleep inducement methods!</span>") to_chat(user, "<span class='warning'>The specimen's tinfoil protection is completely blocking our sleep inducement methods!</span>")
L.visible_message("<span class='danger'>[user] tried to induce sleep in [L] with [src], but [L.p_their()] headgear completely protected [L.p_them()]!</span>", \ L.visible_message("<span class='danger'>[user] tried to induce sleep in [L] with [src], but [L.p_their()] tinfoil completely protected [L.p_them()]!</span>", \
"<span class='userdanger'>Any sense of drowsiness is quickly diminished as your headgear deflects the effects!</span>") "<span class='userdanger'>Any sense of drowsiness is quickly diminished as your tinfoil protection deflects the effects!</span>")
return return
L.drowsyness += 1 L.drowsyness += 1
to_chat(user, "<span class='warning'>Sleep inducement works fully only on stunned specimens! </span>") to_chat(user, "<span class='warning'>Sleep inducement works fully only on stunned specimens! </span>")
@@ -178,8 +178,8 @@
c.console = src c.console = src
/obj/machinery/abductor/console/proc/AddSnapshot(mob/living/carbon/human/target) /obj/machinery/abductor/console/proc/AddSnapshot(mob/living/carbon/human/target)
if(istype(target.get_item_by_slot(SLOT_HEAD), /obj/item/clothing/head/foilhat)) if(target.anti_magic_check(FALSE, FALSE, TRUE, 0))
say("Subject wearing specialized protective headgear, unable to get a proper scan!") say("Subject wearing specialized protective tinfoil gear, unable to get a proper scan!")
return return
var/datum/icon_snapshot/entry = new var/datum/icon_snapshot/entry = new
entry.name = target.name entry.name = target.name
@@ -27,7 +27,7 @@
. = ..() . = ..()
/obj/structure/blob/core/proc/generate_announcement() /obj/structure/blob/core/proc/generate_announcement()
priority_announce("Confirmed outbreak of level 5 biohazard aboard [station_name()]. All personnel must contain the outbreak.", "Biohazard Alert", 'sound/ai/outbreak5.ogg') priority_announce("Confirmed outbreak of level 5 biohazard aboard [station_name()]. All personnel must contain the outbreak.", "Biohazard Alert", "outbreak5")
/obj/structure/blob/core/scannerreport() /obj/structure/blob/core/scannerreport()
return "Directs the blob's expansion, gradually expands, and sustains nearby blob spores and blobbernauts." return "Directs the blob's expansion, gradually expands, and sustains nearby blob spores and blobbernauts."
@@ -21,7 +21,7 @@
to_chat(user, "<span class='notice'>Our muscles tense and strengthen.</span>") to_chat(user, "<span class='notice'>Our muscles tense and strengthen.</span>")
changeling.chem_recharge_slowdown += 0.5 changeling.chem_recharge_slowdown += 0.5
else else
REMOVE_TRAIT(user, TRAIT_GOTTAGOFAST, "changeling_muscles") user.remove_movespeed_modifier(MOVESPEED_ID_CHANGELING_MUSCLES)
to_chat(user, "<span class='notice'>Our muscles relax.</span>") to_chat(user, "<span class='notice'>Our muscles relax.</span>")
changeling.chem_recharge_slowdown -= 0.5 changeling.chem_recharge_slowdown -= 0.5
if(stacks >= 20) if(stacks >= 20)
@@ -36,12 +36,12 @@
/obj/effect/proc_holder/changeling/strained_muscles/proc/muscle_loop(mob/living/carbon/user) /obj/effect/proc_holder/changeling/strained_muscles/proc/muscle_loop(mob/living/carbon/user)
var/datum/antagonist/changeling/changeling = user.mind.has_antag_datum(/datum/antagonist/changeling) var/datum/antagonist/changeling/changeling = user.mind.has_antag_datum(/datum/antagonist/changeling)
while(active) while(active)
ADD_TRAIT(user, TRAIT_GOTTAGOFAST, "changeling_muscles") user.add_movespeed_modifier(MOVESPEED_ID_CHANGELING_MUSCLES, update=TRUE, priority=100, multiplicative_slowdown=-1, blacklisted_movetypes=(FLYING|FLOATING))
if(user.stat != CONSCIOUS || user.staminaloss >= 90) if(user.stat != CONSCIOUS || user.staminaloss >= 90)
active = !active active = !active
to_chat(user, "<span class='notice'>Our muscles relax without the energy to strengthen them.</span>") to_chat(user, "<span class='notice'>Our muscles relax without the energy to strengthen them.</span>")
user.Knockdown(40) user.Knockdown(40)
REMOVE_TRAIT(user, TRAIT_GOTTAGOFAST, "changeling_muscles") user.remove_movespeed_modifier(MOVESPEED_ID_CHANGELING_MUSCLES)
changeling.chem_recharge_slowdown -= 0.5 changeling.chem_recharge_slowdown -= 0.5
break break
@@ -35,7 +35,7 @@
/obj/item/clockwork/weapon/ratvarian_spear/attack(mob/living/target, mob/living/carbon/human/user) /obj/item/clockwork/weapon/ratvarian_spear/attack(mob/living/target, mob/living/carbon/human/user)
. = ..() . = ..()
if(!QDELETED(target) && target.stat != DEAD && !target.anti_magic_check() && !is_servant_of_ratvar(target)) //we do bonus damage on attacks unless they're a servant, have a null rod, or are dead if(!QDELETED(target) && target.stat != DEAD && !target.anti_magic_check(chargecost = 0) && !is_servant_of_ratvar(target)) //we do bonus damage on attacks unless they're a servant, have a null rod, or are dead
var/bonus_damage = bonus_burn //normally a total of 20 damage, 30 with ratvar var/bonus_damage = bonus_burn //normally a total of 20 damage, 30 with ratvar
if(issilicon(target)) if(issilicon(target))
target.visible_message("<span class='warning'>[target] shudders violently at [src]'s touch!</span>", "<span class='userdanger'>ERROR: Temperature rising!</span>") target.visible_message("<span class='warning'>[target] shudders violently at [src]'s touch!</span>", "<span class='userdanger'>ERROR: Temperature rising!</span>")
@@ -190,8 +190,8 @@
for(var/mob/living/L in range(1, src)) for(var/mob/living/L in range(1, src))
if(is_servant_of_ratvar(L)) if(is_servant_of_ratvar(L))
continue continue
if(L.anti_magic_check()) var/atom/I = L.anti_magic_check()
var/atom/I = L.anti_magic_check() if(I)
if(isitem(I)) if(isitem(I))
L.visible_message("<span class='warning'>Strange energy flows into [L]'s [I.name]!</span>", \ L.visible_message("<span class='warning'>Strange energy flows into [L]'s [I.name]!</span>", \
"<span class='userdanger'>Your [I.name] shields you from [src]!</span>") "<span class='userdanger'>Your [I.name] shields you from [src]!</span>")
@@ -60,7 +60,7 @@
else else
if(isliving(target)) if(isliving(target))
var/mob/living/L = target var/mob/living/L = target
if(!L.anti_magic_check()) if(!L.anti_magic_check(chargecost = 0))
if(isrevenant(L)) if(isrevenant(L))
var/mob/living/simple_animal/revenant/R = L var/mob/living/simple_animal/revenant/R = L
if(R.revealed) if(R.revealed)
@@ -53,7 +53,7 @@
/obj/structure/destructible/clockwork/taunting_trail/proc/affect_mob(mob/living/L) /obj/structure/destructible/clockwork/taunting_trail/proc/affect_mob(mob/living/L)
if(istype(L) && !is_servant_of_ratvar(L)) if(istype(L) && !is_servant_of_ratvar(L))
if(!L.anti_magic_check()) if(!L.anti_magic_check(chargecost = 0))
L.confused = min(L.confused + 15, 50) L.confused = min(L.confused + 15, 50)
L.dizziness = min(L.dizziness + 15, 50) L.dizziness = min(L.dizziness + 15, 50)
if(L.confused >= 25) if(L.confused >= 25)
+2 -2
View File
@@ -275,7 +275,7 @@
desc = "A torn, dust-caked hood. Strange letters line the inside." desc = "A torn, dust-caked hood. Strange letters line the inside."
flags_inv = HIDEFACE|HIDEHAIR|HIDEEARS flags_inv = HIDEFACE|HIDEHAIR|HIDEEARS
flags_cover = HEADCOVERSEYES flags_cover = HEADCOVERSEYES
armor = list("melee" = 40, "bullet" = 30, "laser" = 40,"energy" = 20, "bomb" = 25, "bio" = 10, "rad" = 0, "fire" = 10, "acid" = 10) armor = list("melee" = 40, "bullet" = 30, "laser" = 40,"energy" = 20, "bomb" = 65, "bio" = 10, "rad" = 0, "fire" = 10, "acid" = 10)
cold_protection = HEAD cold_protection = HEAD
min_cold_protection_temperature = HELMET_MIN_TEMP_PROTECT min_cold_protection_temperature = HELMET_MIN_TEMP_PROTECT
heat_protection = HEAD heat_protection = HEAD
@@ -288,7 +288,7 @@
item_state = "cultrobes" item_state = "cultrobes"
body_parts_covered = CHEST|GROIN|LEGS|ARMS body_parts_covered = CHEST|GROIN|LEGS|ARMS
allowed = list(/obj/item/tome, /obj/item/melee/cultblade) allowed = list(/obj/item/tome, /obj/item/melee/cultblade)
armor = list("melee" = 40, "bullet" = 30, "laser" = 40,"energy" = 20, "bomb" = 25, "bio" = 10, "rad" = 0, "fire" = 10, "acid" = 10) armor = list("melee" = 40, "bullet" = 30, "laser" = 40,"energy" = 20, "bomb" = 65, "bio" = 10, "rad" = 0, "fire" = 10, "acid" = 10)
flags_inv = HIDEJUMPSUIT flags_inv = HIDEJUMPSUIT
cold_protection = CHEST|GROIN|LEGS|ARMS cold_protection = CHEST|GROIN|LEGS|ARMS
min_cold_protection_temperature = ARMOR_MIN_TEMP_PROTECT min_cold_protection_temperature = ARMOR_MIN_TEMP_PROTECT
+1 -1
View File
@@ -107,7 +107,7 @@ This file contains the cult dagger and rune list code
if(!(A in summon_objective.summon_spots)) // Check again to make sure they didn't move if(!(A in summon_objective.summon_spots)) // Check again to make sure they didn't move
to_chat(user, "<span class='cultlarge'>The Geometer can only be summoned where the veil is weak - in [english_list(summon_objective.summon_spots)]!</span>") to_chat(user, "<span class='cultlarge'>The Geometer can only be summoned where the veil is weak - in [english_list(summon_objective.summon_spots)]!</span>")
return return
priority_announce("Figments from an eldritch god are being summoned by [user] into [A.map_name] from an unknown dimension. Disrupt the ritual at all costs!","Central Command Higher Dimensional Affairs", 'sound/ai/spanomalies.ogg') priority_announce("Figments from an eldritch god are being summoned by [user] into [A.map_name] from an unknown dimension. Disrupt the ritual at all costs!","Central Command Higher Dimensional Affairs", "spanomalies")
for(var/B in spiral_range_turfs(1, user, 1)) for(var/B in spiral_range_turfs(1, user, 1))
var/obj/structure/emergency_shield/sanguine/N = new(B) var/obj/structure/emergency_shield/sanguine/N = new(B)
shields += N shields += N
+3 -3
View File
@@ -237,7 +237,7 @@ structure_check() searches for nearby cultist structures required for the invoca
to_chat(M, "<span class='warning'>You need at least two invokers to convert [convertee]!</span>") to_chat(M, "<span class='warning'>You need at least two invokers to convert [convertee]!</span>")
log_game("Offer rune failed - tried conversion with one invoker") log_game("Offer rune failed - tried conversion with one invoker")
return 0 return 0
if(convertee.anti_magic_check(TRUE, TRUE, FALSE, 0)) //Not chargecost because it can be spammed if(convertee.anti_magic_check(TRUE, TRUE, chargecost = 0)) //Not major because it can be spammed
for(var/M in invokers) for(var/M in invokers)
to_chat(M, "<span class='warning'>Something is shielding [convertee]'s mind!</span>") to_chat(M, "<span class='warning'>Something is shielding [convertee]'s mind!</span>")
log_game("Offer rune failed - convertee had anti-magic") log_game("Offer rune failed - convertee had anti-magic")
@@ -767,7 +767,7 @@ structure_check() searches for nearby cultist structures required for the invoca
set_light(6, 1, color) set_light(6, 1, color)
for(var/mob/living/L in viewers(T)) for(var/mob/living/L in viewers(T))
if(!iscultist(L) && L.blood_volume) if(!iscultist(L) && L.blood_volume)
var/atom/I = L.anti_magic_check() var/atom/I = L.anti_magic_check(chargecost = 0)
if(I) if(I)
if(isitem(I)) if(isitem(I))
to_chat(L, "<span class='userdanger'>[I] suddenly burns hotly before returning to normal!</span>") to_chat(L, "<span class='userdanger'>[I] suddenly burns hotly before returning to normal!</span>")
@@ -797,7 +797,7 @@ structure_check() searches for nearby cultist structures required for the invoca
set_light(6, 1, color) set_light(6, 1, color)
for(var/mob/living/L in viewers(T)) for(var/mob/living/L in viewers(T))
if(!iscultist(L) && L.blood_volume) if(!iscultist(L) && L.blood_volume)
if(L.anti_magic_check()) if(L.anti_magic_check(chargecost = 0))
continue continue
L.take_overall_damage(tick_damage*multiplier, tick_damage*multiplier) L.take_overall_damage(tick_damage*multiplier, tick_damage*multiplier)
if(is_servant_of_ratvar(L)) if(is_servant_of_ratvar(L))
@@ -69,7 +69,7 @@
/mob/living/simple_animal/revenant/Initialize(mapload) /mob/living/simple_animal/revenant/Initialize(mapload)
. = ..() . = ..()
AddSpell(new /obj/effect/proc_holder/spell/targeted/night_vision/revenant(null)) AddSpell(new /obj/effect/proc_holder/spell/targeted/night_vision/revenant(null))
AddSpell(new /obj/effect/proc_holder/spell/targeted/revenant_transmit(null)) AddSpell(new /obj/effect/proc_holder/spell/targeted/telepathy/revenant(null))
AddSpell(new /obj/effect/proc_holder/spell/aoe_turf/revenant/defile(null)) AddSpell(new /obj/effect/proc_holder/spell/aoe_turf/revenant/defile(null))
AddSpell(new /obj/effect/proc_holder/spell/aoe_turf/revenant/overload(null)) AddSpell(new /obj/effect/proc_holder/spell/aoe_turf/revenant/overload(null))
AddSpell(new /obj/effect/proc_holder/spell/aoe_turf/revenant/blight(null)) AddSpell(new /obj/effect/proc_holder/spell/aoe_turf/revenant/blight(null))
@@ -66,7 +66,7 @@
if(target.anti_magic_check(FALSE, TRUE)) if(target.anti_magic_check(FALSE, TRUE))
to_chat(src, "<span class='revenminor'>Something's wrong! [target] seems to be resisting the siphoning, leaving you vulnerable!</span>") to_chat(src, "<span class='revenminor'>Something's wrong! [target] seems to be resisting the siphoning, leaving you vulnerable!</span>")
target.visible_message("<span class='warning'>[target] slumps onto the ground.</span>", \ target.visible_message("<span class='warning'>[target] slumps onto the ground.</span>", \
"<span class='revenwarning'>Violets lights, dancing in your vision, receding--</span>") "<span class='revenwarning'>Violet lights, dancing in your vision, receding--</span>")
draining = FALSE draining = FALSE
return return
var/datum/beam/B = Beam(target,icon_state="drain_life",time=INFINITY) var/datum/beam/B = Beam(target,icon_state="drain_life",time=INFINITY)
@@ -105,36 +105,16 @@
action_background_icon_state = "bg_revenant" action_background_icon_state = "bg_revenant"
//Transmit: the revemant's only direct way to communicate. Sends a single message silently to a single mob //Transmit: the revemant's only direct way to communicate. Sends a single message silently to a single mob
/obj/effect/proc_holder/spell/targeted/revenant_transmit /obj/effect/proc_holder/spell/targeted/telepathy/revenant
name = "Transmit" name = "Revenant Transmit"
desc = "Telepathically transmits a message to the target."
panel = "Revenant Abilities" panel = "Revenant Abilities"
charge_max = 0
clothes_req = 0
range = 7
include_user = 0
action_icon = 'icons/mob/actions/actions_revenant.dmi' action_icon = 'icons/mob/actions/actions_revenant.dmi'
action_icon_state = "r_transmit" action_icon_state = "r_transmit"
action_background_icon_state = "bg_revenant" action_background_icon_state = "bg_revenant"
notice = "revennotice"
/obj/effect/proc_holder/spell/targeted/revenant_transmit/cast(list/targets, mob/living/simple_animal/revenant/user = usr) boldnotice = "revenboldnotice"
for(var/mob/living/M in targets) holy_check = TRUE
var/msg = stripped_input(usr, "What do you wish to tell [M]?", null, "") tinfoil_check = FALSE
if(!msg)
charge_counter = charge_max
return
log_directed_talk(user, M, msg, LOG_SAY, "revenant whisper")
to_chat(user, "<span class='revenboldnotice'>You transmit to [M]:</span> <span class='revennotice'>[msg]</span>")
if(!M.anti_magic_check(FALSE, TRUE)) //hear no evil
to_chat(M, "<span class='revenboldnotice'>You hear something behind you talking...</span> <span class='revennotice'>[msg]</span>")
for(var/ded in GLOB.dead_mob_list)
if(!isobserver(ded))
continue
var/follow_rev = FOLLOW_LINK(ded, user)
var/follow_whispee = FOLLOW_LINK(ded, M)
to_chat(ded, "[follow_rev] <span class='revenboldnotice'>[user] Revenant Transmit:</span> <span class='revennotice'>\"[msg]\" to</span> [follow_whispee] <span class='name'>[M]</span>")
/obj/effect/proc_holder/spell/aoe_turf/revenant /obj/effect/proc_holder/spell/aoe_turf/revenant
clothes_req = 0 clothes_req = 0
@@ -46,11 +46,11 @@
if(!depression) if(!depression)
SEND_SIGNAL(affected_mob, COMSIG_ADD_MOOD_EVENT, "rev_blight", /datum/mood_event/revenant_blight) SEND_SIGNAL(affected_mob, COMSIG_ADD_MOOD_EVENT, "rev_blight", /datum/mood_event/revenant_blight)
depression = TRUE depression = TRUE
SEND_SIGNAL(affected_mob, COMSIG_DECREASE_SANITY, 0.12, SANITY_CRAZY) SEND_SIGNAL(affected_mob, COMSIG_MODIFY_SANITY, -0.12, SANITY_CRAZY)
if(prob(10)) if(prob(10))
affected_mob.emote(pick("pale","shiver")) affected_mob.emote(pick("pale","shiver"))
if(4) if(4)
SEND_SIGNAL(affected_mob, COMSIG_DECREASE_SANITY, 0.18, SANITY_CRAZY) SEND_SIGNAL(affected_mob, COMSIG_MODIFY_SANITY, -0.18, SANITY_CRAZY)
if(prob(15)) if(prob(15))
affected_mob.emote(pick("pale","shiver","cries")) affected_mob.emote(pick("pale","shiver","cries"))
if(5) if(5)
@@ -34,7 +34,6 @@
melee_damage_upper = 30 melee_damage_upper = 30
see_in_dark = 8 see_in_dark = 8
lighting_alpha = LIGHTING_PLANE_ALPHA_MOSTLY_INVISIBLE lighting_alpha = LIGHTING_PLANE_ALPHA_MOSTLY_INVISIBLE
var/boost = 0
bloodcrawl = BLOODCRAWL_EAT bloodcrawl = BLOODCRAWL_EAT
var/playstyle_string = "<span class='big bold'>You are a slaughter demon,</span><B> a terrible creature from another realm. You have a single desire: To kill. \ var/playstyle_string = "<span class='big bold'>You are a slaughter demon,</span><B> a terrible creature from another realm. You have a single desire: To kill. \
You may use the \"Blood Crawl\" ability near blood pools to travel through them, appearing and disappearing from the station at will. \ You may use the \"Blood Crawl\" ability near blood pools to travel through them, appearing and disappearing from the station at will. \
@@ -54,24 +53,18 @@
if(istype(loc, /obj/effect/dummy/phased_mob/slaughter)) if(istype(loc, /obj/effect/dummy/phased_mob/slaughter))
bloodspell.phased = TRUE bloodspell.phased = TRUE
/mob/living/simple_animal/slaughter/Life()
..()
if(boost<world.time)
speed = 1
else
speed = 0
/obj/effect/decal/cleanable/blood/innards /obj/effect/decal/cleanable/blood/innards
icon = 'icons/obj/surgery.dmi' icon = 'icons/obj/surgery.dmi'
name = "pile of viscera" name = "pile of viscera"
desc = "A repulsive pile of guts and gore." desc = "A repulsive pile of guts and gore."
gender = NEUTER gender = NEUTER
icon_state = "innards" icon_state = "innards"
random_icon_states = null
/mob/living/simple_animal/slaughter/phasein() /mob/living/simple_animal/slaughter/phasein()
. = ..() . = ..()
speed = 0 add_movespeed_modifier(MOVESPEED_ID_SLAUGHTER, update=TRUE, priority=100, multiplicative_slowdown=-1)
boost = world.time + 60 addtimer(CALLBACK(src, .proc/remove_movespeed_modifier, MOVESPEED_ID_SLAUGHTER, TRUE), 6 SECONDS, TIMER_UNIQUE | TIMER_OVERRIDE)
//The loot from killing a slaughter demon - can be consumed to allow the user to blood crawl //The loot from killing a slaughter demon - can be consumed to allow the user to blood crawl
@@ -304,7 +304,7 @@ GLOBAL_LIST_INIT(blacklisted_malf_machines, typecacheof(list(
sleep(30) sleep(30)
if(!owner || QDELETED(owner)) if(!owner || QDELETED(owner))
return return
priority_announce("Hostile runtimes detected in all station systems, please deactivate your AI to prevent possible damage to its morality core.", "Anomaly Alert", 'sound/ai/aimalf.ogg') priority_announce("Hostile runtimes detected in all station systems, please deactivate your AI to prevent possible damage to its morality core.", "Anomaly Alert", "aimalf")
set_security_level("delta") set_security_level("delta")
var/obj/machinery/doomsday_device/DOOM = new(owner_AI) var/obj/machinery/doomsday_device/DOOM = new(owner_AI)
owner_AI.nuking = TRUE owner_AI.nuking = TRUE
+3 -1
View File
@@ -201,8 +201,10 @@
/obj/item/assembly/flash/cyborg /obj/item/assembly/flash/cyborg
/obj/item/assembly/flash/cyborg/attack(mob/living/M, mob/user) /obj/item/assembly/flash/cyborg/attack(mob/living/M, mob/user)
..() . = ..()
new /obj/effect/temp_visual/borgflash(get_turf(src)) new /obj/effect/temp_visual/borgflash(get_turf(src))
if(. && !CONFIG_GET(flag/disable_borg_flash_knockdown) && iscarbon(M) && !M.resting && !M.get_eye_protection())
M.Knockdown(80)
/obj/item/assembly/flash/cyborg/attack_self(mob/user) /obj/item/assembly/flash/cyborg/attack_self(mob/user)
..() ..()
+46 -10
View File
@@ -242,26 +242,62 @@
armor = list("melee" = 0, "bullet" = 0, "laser" = -5,"energy" = 0, "bomb" = 0, "bio" = 0, "rad" = -5, "fire" = 0, "acid" = 0) armor = list("melee" = 0, "bullet" = 0, "laser" = -5,"energy" = 0, "bomb" = 0, "bio" = 0, "rad" = -5, "fire" = 0, "acid" = 0)
equip_delay_other = 140 equip_delay_other = 140
var/datum/brain_trauma/mild/phobia/paranoia var/datum/brain_trauma/mild/phobia/paranoia
var/warped = FALSE
clothing_flags = ANTI_TINFOIL_MANEUVER clothing_flags = ANTI_TINFOIL_MANEUVER
/obj/item/clothing/head/foilhat/Initialize(mapload)
. = ..()
if(!warped)
AddComponent(/datum/component/anti_magic, FALSE, FALSE, TRUE, ITEM_SLOT_HEAD, 6, TRUE, null, CALLBACK(src, .proc/warp_up))
else
warp_up()
/obj/item/clothing/head/foilhat/equipped(mob/living/carbon/human/user, slot) /obj/item/clothing/head/foilhat/equipped(mob/living/carbon/human/user, slot)
..() . = ..()
if(slot == SLOT_HEAD) if(slot != SLOT_HEAD || warped)
if(paranoia) return
QDEL_NULL(paranoia) if(paranoia)
paranoia = new() QDEL_NULL(paranoia)
user.gain_trauma(paranoia, TRAUMA_RESILIENCE_MAGIC, "conspiracies") paranoia = new()
to_chat(user, "<span class='warning'>As you don the foiled hat, an entire world of conspiracy theories and seemingly insane ideas suddenly rush into your mind. What you once thought unbelievable suddenly seems.. undeniable. Everything is connected and nothing happens just by accident. You know too much and now they're out to get you. </span>") user.gain_trauma(paranoia, TRAUMA_RESILIENCE_MAGIC, "conspiracies")
to_chat(user, "<span class='warning'>As you don the foiled hat, an entire world of conspiracy theories and seemingly insane ideas suddenly rush into your mind. What you once thought unbelievable suddenly seems.. undeniable. Everything is connected and nothing happens just by accident. You know too much and now they're out to get you. </span>")
/obj/item/clothing/head/foilhat/MouseDrop(atom/over_object)
//God Im sorry
if(!warped && iscarbon(usr))
var/mob/living/carbon/C = usr
if(src == C.head)
to_chat(C, "<span class='userdanger'>Why would you want to take this off? Do you want them to get into your mind?!</span>")
return
return ..()
/obj/item/clothing/head/foilhat/dropped(mob/user) /obj/item/clothing/head/foilhat/dropped(mob/user)
..() . = ..()
if(paranoia) if(paranoia)
QDEL_NULL(paranoia) QDEL_NULL(paranoia)
/obj/item/clothing/head/foilhat/proc/warp_up()
name = "scorched tinfoil hat"
desc = "A badly warped up hat. Quite unprobable this will still work against any of fictional and contemporary dangers it used to."
warped = TRUE
if(!isliving(loc) || !paranoia)
return
var/mob/living/target = loc
if(target.get_item_by_slot(SLOT_HEAD) != src)
return
QDEL_NULL(paranoia)
if(!target.IsUnconscious())
to_chat(target, "<span class='warning'>Your zealous conspirationism rapidly dissipates as the donned hat warps up into a ruined mess. All those theories starting to sound like nothing but a ridicolous fanfare.</span>")
/obj/item/clothing/head/foilhat/attack_hand(mob/user) /obj/item/clothing/head/foilhat/attack_hand(mob/user)
if(iscarbon(user)) if(!warped && iscarbon(user))
var/mob/living/carbon/C = user var/mob/living/carbon/C = user
if(src == C.head) if(src == C.head)
to_chat(user, "<span class='userdanger'>Why would you want to take this off? Do you want them to get into your mind?!</span>") to_chat(user, "<span class='userdanger'>Why would you want to take this off? Do you want them to get into your mind?!</span>")
return return
..() return ..()
/obj/item/clothing/head/foilhat/microwave_act(obj/machinery/microwave/M)
. = ..()
if(!warped)
warp_up()
+2 -2
View File
@@ -135,7 +135,7 @@
to_chat(user, "<span class='warning'>You cannot remove the jetpack from [src] while wearing it.</span>") to_chat(user, "<span class='warning'>You cannot remove the jetpack from [src] while wearing it.</span>")
return return
jetpack.turn_off() jetpack.turn_off(user)
jetpack.forceMove(drop_location()) jetpack.forceMove(drop_location())
jetpack = null jetpack = null
to_chat(user, "<span class='notice'>You successfully remove the jetpack from [src].</span>") to_chat(user, "<span class='notice'>You successfully remove the jetpack from [src].</span>")
@@ -433,7 +433,7 @@
/obj/item/clothing/suit/space/hardsuit/wizard/Initialize() /obj/item/clothing/suit/space/hardsuit/wizard/Initialize()
. = ..() . = ..()
AddComponent(/datum/component/anti_magic, TRUE, FALSE) AddComponent(/datum/component/anti_magic, TRUE, FALSE, FALSE, ITEM_SLOT_OCLOTHING, INFINITY, FALSE)
//Medical hardsuit //Medical hardsuit
/obj/item/clothing/head/helmet/space/hardsuit/medical /obj/item/clothing/head/helmet/space/hardsuit/medical
@@ -368,6 +368,10 @@ Contains:
resistance_flags = FIRE_PROOF resistance_flags = FIRE_PROOF
mutantrace_variation = NO_MUTANTRACE_VARIATION mutantrace_variation = NO_MUTANTRACE_VARIATION
/obj/item/clothing/suit/space/hardsuit/ert/paranormal/Initialize()
. = ..()
AddComponent(/datum/component/anti_magic, FALSE, FALSE, TRUE, ITEM_SLOT_HEAD)
/obj/item/clothing/suit/space/hardsuit/ert/paranormal /obj/item/clothing/suit/space/hardsuit/ert/paranormal
name = "paranormal response team suit" name = "paranormal response team suit"
desc = "Powerful wards are built into this hardsuit, protecting the user from all manner of paranormal threats." desc = "Powerful wards are built into this hardsuit, protecting the user from all manner of paranormal threats."
@@ -380,7 +384,7 @@ Contains:
/obj/item/clothing/suit/space/hardsuit/ert/paranormal/Initialize() /obj/item/clothing/suit/space/hardsuit/ert/paranormal/Initialize()
. = ..() . = ..()
AddComponent(/datum/component/anti_magic, TRUE, TRUE) AddComponent(/datum/component/anti_magic, TRUE, TRUE, FALSE, ITEM_SLOT_OCLOTHING)
/obj/item/clothing/suit/space/hardsuit/ert/paranormal/inquisitor /obj/item/clothing/suit/space/hardsuit/ert/paranormal/inquisitor
name = "inquisitor's hardsuit" name = "inquisitor's hardsuit"
+2 -1
View File
@@ -715,8 +715,9 @@
name = "gear harness" name = "gear harness"
desc = "A simple, inconspicuous harness replacement for a jumpsuit." desc = "A simple, inconspicuous harness replacement for a jumpsuit."
icon_state = "gear_harness" icon_state = "gear_harness"
item_state = "gear_harness" //We dont use golem do to being a item, item without faces making it default to error suit sprites. item_state = "gear_harness"
body_parts_covered = CHEST|GROIN body_parts_covered = CHEST|GROIN
can_adjust = FALSE
/obj/item/clothing/under/durathread /obj/item/clothing/under/durathread
name = "durathread jumpsuit" name = "durathread jumpsuit"
+1 -1
View File
@@ -32,7 +32,7 @@
/datum/round_event/ghost_role/alien_infestation/announce(fake) /datum/round_event/ghost_role/alien_infestation/announce(fake)
if(successSpawn || fake) if(successSpawn || fake)
priority_announce("Unidentified lifesigns detected coming aboard [station_name()]. Secure any exterior access, including ducting and ventilation.", "Lifesign Alert", 'sound/ai/aliens.ogg') priority_announce("Unidentified lifesigns detected coming aboard [station_name()]. Secure any exterior access, including ducting and ventilation.", "Lifesign Alert", "aliens")
/datum/round_event/ghost_role/alien_infestation/spawn_role() /datum/round_event/ghost_role/alien_infestation/spawn_role()
+1 -1
View File
@@ -13,7 +13,7 @@
if(prob(90)) if(prob(90))
priority_announce("Unstable bluespace anomaly detected on long range scanners. Expected location: [impact_area.name].", "Anomaly Alert") priority_announce("Unstable bluespace anomaly detected on long range scanners. Expected location: [impact_area.name].", "Anomaly Alert")
else else
priority_announce("A report has been downloaded and printed out at all communications consoles.", "Incoming Classified Message", 'sound/ai/commandreport.ogg') // CITADEL EDIT metabreak priority_announce("A report has been downloaded and printed out at all communications consoles.", "Incoming Classified Message", "commandreport") // CITADEL EDIT metabreak
for(var/obj/machinery/computer/communications/C in GLOB.machines) for(var/obj/machinery/computer/communications/C in GLOB.machines)
if(!(C.stat & (BROKEN|NOPOWER)) && is_station_level(C.z)) if(!(C.stat & (BROKEN|NOPOWER)) && is_station_level(C.z))
var/obj/item/paper/P = new(C.loc) var/obj/item/paper/P = new(C.loc)
+1 -1
View File
@@ -14,7 +14,7 @@
if(prob(90)) if(prob(90))
priority_announce("Localized hyper-energetic flux wave detected on long range scanners. Expected location: [impact_area.name].", "Anomaly Alert") priority_announce("Localized hyper-energetic flux wave detected on long range scanners. Expected location: [impact_area.name].", "Anomaly Alert")
else else
priority_announce("A report has been downloaded and printed out at all communications consoles.", "Incoming Classified Message", 'sound/ai/commandreport.ogg') // CITADEL EDIT metabreak priority_announce("A report has been downloaded and printed out at all communications consoles.", "Incoming Classified Message", "commandreport") // CITADEL EDIT metabreak
for(var/obj/machinery/computer/communications/C in GLOB.machines) for(var/obj/machinery/computer/communications/C in GLOB.machines)
if(!(C.stat & (BROKEN|NOPOWER)) && is_station_level(C.z)) if(!(C.stat & (BROKEN|NOPOWER)) && is_station_level(C.z))
var/obj/item/paper/P = new(C.loc) var/obj/item/paper/P = new(C.loc)
+1 -1
View File
@@ -12,7 +12,7 @@
if(prob(90)) if(prob(90))
priority_announce("Gravitational anomaly detected on long range scanners. Expected location: [impact_area.name].", "Anomaly Alert") priority_announce("Gravitational anomaly detected on long range scanners. Expected location: [impact_area.name].", "Anomaly Alert")
else else
priority_announce("A report has been downloaded and printed out at all communications consoles.", "Incoming Classified Message", 'sound/ai/commandreport.ogg') // CITADEL EDIT metabreak priority_announce("A report has been downloaded and printed out at all communications consoles.", "Incoming Classified Message", "commandreport") // CITADEL EDIT metabreak
for(var/obj/machinery/computer/communications/C in GLOB.machines) for(var/obj/machinery/computer/communications/C in GLOB.machines)
if(!(C.stat & (BROKEN|NOPOWER)) && is_station_level(C.z)) if(!(C.stat & (BROKEN|NOPOWER)) && is_station_level(C.z))
var/obj/item/paper/P = new(C.loc) var/obj/item/paper/P = new(C.loc)
+1 -1
View File
@@ -12,7 +12,7 @@
if(prob(90)) if(prob(90))
priority_announce("Pyroclastic anomaly detected on long range scanners. Expected location: [impact_area.name].", "Anomaly Alert") priority_announce("Pyroclastic anomaly detected on long range scanners. Expected location: [impact_area.name].", "Anomaly Alert")
else else
priority_announce("A report has been downloaded and printed out at all communications consoles.", "Incoming Classified Message", 'sound/ai/commandreport.ogg') // CITADEL EDIT metabreak priority_announce("A report has been downloaded and printed out at all communications consoles.", "Incoming Classified Message", "commandreport") // CITADEL EDIT metabreak
for(var/obj/machinery/computer/communications/C in GLOB.machines) for(var/obj/machinery/computer/communications/C in GLOB.machines)
if(!(C.stat & (BROKEN|NOPOWER)) && is_station_level(C.z)) if(!(C.stat & (BROKEN|NOPOWER)) && is_station_level(C.z))
var/obj/item/paper/P = new(C.loc) var/obj/item/paper/P = new(C.loc)
+1 -1
View File
@@ -14,7 +14,7 @@
if(prob(90)) if(prob(90))
priority_announce("Localized high-intensity vortex anomaly detected on long range scanners. Expected location: [impact_area.name]", "Anomaly Alert") priority_announce("Localized high-intensity vortex anomaly detected on long range scanners. Expected location: [impact_area.name]", "Anomaly Alert")
else else
priority_announce("A report has been downloaded and printed out at all communications consoles.", "Incoming Classified Message", 'sound/ai/commandreport.ogg') // CITADEL EDIT metabreak priority_announce("A report has been downloaded and printed out at all communications consoles.", "Incoming Classified Message", "commandreport") // CITADEL EDIT metabreak
for(var/obj/machinery/computer/communications/C in GLOB.machines) for(var/obj/machinery/computer/communications/C in GLOB.machines)
if(!(C.stat & (BROKEN|NOPOWER)) && is_station_level(C.z)) if(!(C.stat & (BROKEN|NOPOWER)) && is_station_level(C.z))
var/obj/item/paper/P = new(C.loc) var/obj/item/paper/P = new(C.loc)
+2 -2
View File
@@ -16,9 +16,9 @@
/datum/round_event/ghost_role/blob/announce(fake) /datum/round_event/ghost_role/blob/announce(fake)
if(prob(75)) if(prob(75))
priority_announce("Confirmed outbreak of level 5 biohazard aboard [station_name()]. All personnel must contain the outbreak.", "Biohazard Alert", 'sound/ai/outbreak5.ogg') priority_announce("Confirmed outbreak of level 5 biohazard aboard [station_name()]. All personnel must contain the outbreak.", "Biohazard Alert", "outbreak5")
else else
priority_announce("A report has been downloaded and printed out at all communications consoles.", "Incoming Classified Message", 'sound/ai/commandreport.ogg') // CITADEL EDIT metabreak priority_announce("A report has been downloaded and printed out at all communications consoles.", "Incoming Classified Message", "commandreport") // CITADEL EDIT metabreak
for(var/obj/machinery/computer/communications/C in GLOB.machines) for(var/obj/machinery/computer/communications/C in GLOB.machines)
if(!(C.stat & (BROKEN|NOPOWER)) && is_station_level(C.z)) if(!(C.stat & (BROKEN|NOPOWER)) && is_station_level(C.z))
var/obj/item/paper/P = new(C.loc) var/obj/item/paper/P = new(C.loc)
+1 -1
View File
@@ -38,7 +38,7 @@
if(prob(50)) if(prob(50))
priority_announce("Rampant brand intelligence has been detected aboard [station_name()]. Please stand by. The origin is believed to be \a [source].", "Machine Learning Alert") priority_announce("Rampant brand intelligence has been detected aboard [station_name()]. Please stand by. The origin is believed to be \a [source].", "Machine Learning Alert")
else else
priority_announce("A report has been downloaded and printed out at all communications consoles.", "Incoming Classified Message", 'sound/ai/commandreport.ogg') // CITADEL EDIT metabreak priority_announce("A report has been downloaded and printed out at all communications consoles.", "Incoming Classified Message", "commandreport") // CITADEL EDIT metabreak
for(var/obj/machinery/computer/communications/C in GLOB.machines) for(var/obj/machinery/computer/communications/C in GLOB.machines)
if(!(C.stat & (BROKEN|NOPOWER)) && is_station_level(C.z)) if(!(C.stat & (BROKEN|NOPOWER)) && is_station_level(C.z))
var/obj/item/paper/P = new(C.loc) var/obj/item/paper/P = new(C.loc)
+1 -1
View File
@@ -17,7 +17,7 @@
if(prob(50)) if(prob(50))
priority_announce("Unknown biological entities have been detected near [station_name()], please stand-by.", "Lifesign Alert") priority_announce("Unknown biological entities have been detected near [station_name()], please stand-by.", "Lifesign Alert")
else else
priority_announce("A report has been downloaded and printed out at all communications consoles.", "Incoming Classified Message", 'sound/ai/commandreport.ogg') // CITADEL EDIT metabreak priority_announce("A report has been downloaded and printed out at all communications consoles.", "Incoming Classified Message", "commandreport") // CITADEL EDIT metabreak
for(var/obj/machinery/computer/communications/C in GLOB.machines) for(var/obj/machinery/computer/communications/C in GLOB.machines)
if(!(C.stat & (BROKEN|NOPOWER)) && is_station_level(C.z)) if(!(C.stat & (BROKEN|NOPOWER)) && is_station_level(C.z))
var/obj/item/paper/P = new(C.loc) var/obj/item/paper/P = new(C.loc)

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