Merge remote-tracking branch 'upstream/master'

This commit is contained in:
raspyosu
2020-02-21 01:48:50 -05:00
313 changed files with 5420 additions and 2451 deletions
@@ -18,6 +18,9 @@
/obj/item/mining_scanner, /obj/item/mining_scanner,
/obj/item/flashlight/lantern, /obj/item/flashlight/lantern,
/obj/item/card/id/mining, /obj/item/card/id/mining,
/obj/item/gps/mining{
tracking = 0
},
/turf/open/floor/plating, /turf/open/floor/plating,
/area/ruin/powered/golem_ship) /area/ruin/powered/golem_ship)
"d" = ( "d" = (
@@ -31,6 +34,9 @@
/obj/item/mining_scanner, /obj/item/mining_scanner,
/obj/item/flashlight/lantern, /obj/item/flashlight/lantern,
/obj/item/card/id/mining, /obj/item/card/id/mining,
/obj/item/gps/mining{
tracking = 0
},
/turf/open/floor/plating, /turf/open/floor/plating,
/area/ruin/powered/golem_ship) /area/ruin/powered/golem_ship)
"e" = ( "e" = (
@@ -150,6 +156,9 @@
"x" = ( "x" = (
/obj/structure/table/wood, /obj/structure/table/wood,
/obj/machinery/reagentgrinder, /obj/machinery/reagentgrinder,
/obj/item/gps/mining{
tracking = 0
},
/turf/open/floor/mineral/titanium/purple, /turf/open/floor/mineral/titanium/purple,
/area/ruin/powered/golem_ship) /area/ruin/powered/golem_ship)
"z" = ( "z" = (
@@ -189,8 +189,10 @@
/turf/open/floor/plasteel, /turf/open/floor/plasteel,
/area/engine/engineering) /area/engine/engineering)
"gA" = ( "gA" = (
/obj/machinery/igniter{ /obj/machinery/atmospherics/components/unary/outlet_injector{
id = "TEG_igniter" dir = 1;
injecting = 50;
on = 1
}, },
/turf/open/floor/engine/vacuum, /turf/open/floor/engine/vacuum,
/area/engine/engineering) /area/engine/engineering)
@@ -390,21 +392,23 @@
/turf/open/floor/plating, /turf/open/floor/plating,
/area/engine/engineering) /area/engine/engineering)
"nc" = ( "nc" = (
/obj/machinery/atmospherics/components/unary/outlet_injector{ /obj/machinery/atmospherics/pipe/simple/dark/visible,
dir = 1 /obj/effect/spawner/structure/window/plasma/reinforced,
},
/turf/open/floor/engine/vacuum, /turf/open/floor/engine/vacuum,
/area/engine/engineering) /area/engine/engineering)
"nk" = ( "nk" = (
/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ /obj/machinery/atmospherics/components/binary/pump{
dir = 9 name = "Hot to Burn Chamber"
}, },
/turf/closed/wall/r_wall, /turf/open/floor/plasteel,
/area/engine/engineering) /area/engine/engineering)
"nD" = ( "nD" = (
/obj/machinery/atmospherics/pipe/heat_exchanging/simple{ /obj/machinery/atmospherics/pipe/heat_exchanging/simple{
dir = 9 dir = 9
}, },
/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
dir = 4
},
/turf/open/floor/engine/vacuum, /turf/open/floor/engine/vacuum,
/area/engine/engineering) /area/engine/engineering)
"nL" = ( "nL" = (
@@ -461,10 +465,11 @@
/turf/open/floor/plasteel, /turf/open/floor/plasteel,
/area/engine/engineering) /area/engine/engineering)
"oQ" = ( "oQ" = (
/obj/machinery/atmospherics/pipe/heat_exchanging/simple,
/obj/structure/sign/warning/securearea{ /obj/structure/sign/warning/securearea{
pixel_x = -32 pixel_x = -32
}, },
/obj/effect/spawner/structure/window/plasma/reinforced,
/obj/machinery/atmospherics/pipe/heat_exchanging/junction,
/turf/open/floor/engine/vacuum, /turf/open/floor/engine/vacuum,
/area/engine/engineering) /area/engine/engineering)
"oS" = ( "oS" = (
@@ -728,16 +733,16 @@
/area/engine/engineering) /area/engine/engineering)
"vq" = ( "vq" = (
/obj/structure/table/reinforced, /obj/structure/table/reinforced,
/obj/item/storage/box/lights/mixed,
/obj/item/storage/box/lights/mixed{
pixel_x = 3;
pixel_y = 3
},
/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
/obj/machinery/camera{ /obj/machinery/camera{
c_tag = "TEG - South West"; c_tag = "TEG - South West";
dir = 4 dir = 4
}, },
/obj/item/analyzer,
/obj/item/analyzer{
pixel_x = 7;
pixel_y = 3
},
/turf/open/floor/plasteel, /turf/open/floor/plasteel,
/area/engine/engineering) /area/engine/engineering)
"vG" = ( "vG" = (
@@ -798,17 +803,10 @@
/turf/open/floor/plasteel, /turf/open/floor/plasteel,
/area/engine/engineering) /area/engine/engineering)
"xD" = ( "xD" = (
/obj/machinery/atmospherics/pipe/simple/orange/visible{
dir = 4
},
/obj/machinery/atmospherics/components/binary/pump{ /obj/machinery/atmospherics/components/binary/pump{
dir = 8; dir = 8;
name = "Mix to Engine" name = "Mix to Engine"
}, },
/obj/machinery/atmospherics/components/binary/pump{
dir = 8;
name = "Atmos to Loop"
},
/turf/open/floor/plasteel, /turf/open/floor/plasteel,
/area/engine/engineering) /area/engine/engineering)
"yf" = ( "yf" = (
@@ -837,11 +835,7 @@
/area/engine/engineering) /area/engine/engineering)
"zx" = ( "zx" = (
/obj/structure/table/wood, /obj/structure/table/wood,
/obj/item/electronics/apc, /obj/item/analyzer,
/obj/item/electronics/apc{
pixel_x = 3;
pixel_y = 3
},
/turf/open/floor/plasteel, /turf/open/floor/plasteel,
/area/engine/engineering) /area/engine/engineering)
"zG" = ( "zG" = (
@@ -855,8 +849,8 @@
/turf/open/space/basic, /turf/open/space/basic,
/area/space) /area/space)
"Am" = ( "Am" = (
/obj/machinery/atmospherics/components/unary/vent_scrubber/on{ /obj/machinery/igniter{
dir = 4 id = "TEG_igniter"
}, },
/turf/open/floor/engine/vacuum, /turf/open/floor/engine/vacuum,
/area/engine/engineering) /area/engine/engineering)
@@ -962,10 +956,11 @@
/turf/open/floor/plasteel, /turf/open/floor/plasteel,
/area/engine/engineering) /area/engine/engineering)
"BY" = ( "BY" = (
/obj/machinery/atmospherics/pipe/heat_exchanging/simple,
/obj/structure/sign/warning/securearea{ /obj/structure/sign/warning/securearea{
pixel_x = 32 pixel_x = 32
}, },
/obj/effect/spawner/structure/window/plasma/reinforced,
/obj/machinery/atmospherics/pipe/heat_exchanging/junction,
/turf/open/floor/engine/vacuum, /turf/open/floor/engine/vacuum,
/area/engine/engineering) /area/engine/engineering)
"CH" = ( "CH" = (
@@ -1099,7 +1094,8 @@
/area/engine/engineering) /area/engine/engineering)
"FW" = ( "FW" = (
/obj/machinery/atmospherics/components/binary/pump{ /obj/machinery/atmospherics/components/binary/pump{
dir = 1 dir = 1;
name = "Burn Chamber to Hot"
}, },
/obj/effect/decal/cleanable/dirt, /obj/effect/decal/cleanable/dirt,
/obj/machinery/light{ /obj/machinery/light{
@@ -1177,7 +1173,9 @@
/turf/open/floor/plating/airless, /turf/open/floor/plating/airless,
/area/engine/engineering) /area/engine/engineering)
"Hp" = ( "Hp" = (
/obj/machinery/atmospherics/components/binary/pump, /obj/machinery/atmospherics/components/binary/pump{
name = "Space Loop Bypass"
},
/turf/open/floor/plasteel, /turf/open/floor/plasteel,
/area/engine/engineering) /area/engine/engineering)
"HF" = ( "HF" = (
@@ -1204,11 +1202,10 @@
/turf/open/floor/plasteel, /turf/open/floor/plasteel,
/area/engine/engineering) /area/engine/engineering)
"IA" = ( "IA" = (
/obj/machinery/atmospherics/pipe/heat_exchanging/simple, /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
/obj/machinery/atmospherics/pipe/simple/scrubbers/visible{ dir = 9
dir = 4
}, },
/turf/open/floor/engine/vacuum, /turf/closed/wall/r_wall,
/area/engine/engineering) /area/engine/engineering)
"IP" = ( "IP" = (
/obj/machinery/portable_atmospherics/canister/oxygen, /obj/machinery/portable_atmospherics/canister/oxygen,
@@ -1290,11 +1287,6 @@
}, },
/turf/open/floor/plasteel, /turf/open/floor/plasteel,
/area/engine/engineering) /area/engine/engineering)
"Kx" = (
/obj/effect/spawner/structure/window/plasma/reinforced,
/obj/machinery/atmospherics/pipe/heat_exchanging/junction,
/turf/open/floor/plasteel,
/area/engine/engineering)
"KA" = ( "KA" = (
/obj/structure/reagent_dispensers/watertank, /obj/structure/reagent_dispensers/watertank,
/obj/effect/turf_decal/bot, /obj/effect/turf_decal/bot,
@@ -1441,6 +1433,7 @@
}, },
/obj/machinery/airalarm{ /obj/machinery/airalarm{
dir = 1; dir = 1;
locked = 0;
pixel_y = -22 pixel_y = -22
}, },
/obj/machinery/light, /obj/machinery/light,
@@ -1593,7 +1586,9 @@
/turf/open/floor/plasteel, /turf/open/floor/plasteel,
/area/engine/engineering) /area/engine/engineering)
"SE" = ( "SE" = (
/obj/machinery/atmospherics/components/binary/pump/on, /obj/machinery/atmospherics/components/binary/pump/on{
name = "Mix To Burn Chamber"
},
/turf/open/floor/plasteel, /turf/open/floor/plasteel,
/area/engine/engineering) /area/engine/engineering)
"ST" = ( "ST" = (
@@ -1715,7 +1710,7 @@
"Vs" = ( "Vs" = (
/obj/machinery/atmospherics/components/binary/valve/digital/on{ /obj/machinery/atmospherics/components/binary/valve/digital/on{
dir = 4; dir = 4;
name = "Output Release" name = "Cold to Space Loop"
}, },
/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
/turf/open/floor/plasteel, /turf/open/floor/plasteel,
@@ -1780,7 +1775,7 @@
"XD" = ( "XD" = (
/obj/machinery/atmospherics/components/binary/valve/digital/on{ /obj/machinery/atmospherics/components/binary/valve/digital/on{
dir = 4; dir = 4;
name = "Output Release" name = "Space Loop to Cold"
}, },
/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
/obj/machinery/camera{ /obj/machinery/camera{
@@ -1799,6 +1794,9 @@
/obj/machinery/atmospherics/pipe/heat_exchanging/simple{ /obj/machinery/atmospherics/pipe/heat_exchanging/simple{
dir = 4 dir = 4
}, },
/obj/machinery/atmospherics/components/unary/vent_scrubber/on{
dir = 4
},
/turf/open/floor/engine/vacuum, /turf/open/floor/engine/vacuum,
/area/engine/engineering) /area/engine/engineering)
"XP" = ( "XP" = (
@@ -1857,8 +1855,8 @@
/area/engine/engineering) /area/engine/engineering)
"YP" = ( "YP" = (
/obj/structure/rack, /obj/structure/rack,
/obj/effect/spawner/lootdrop/maintenance,
/obj/machinery/atmospherics/pipe/simple/scrubbers/visible, /obj/machinery/atmospherics/pipe/simple/scrubbers/visible,
/obj/item/pipe_dispenser,
/turf/open/floor/plasteel, /turf/open/floor/plasteel,
/area/engine/engineering) /area/engine/engineering)
"YQ" = ( "YQ" = (
@@ -1917,7 +1915,7 @@
/area/engine/engineering) /area/engine/engineering)
"ZC" = ( "ZC" = (
/obj/machinery/atmospherics/pipe/simple/dark/visible, /obj/machinery/atmospherics/pipe/simple/dark/visible,
/turf/open/floor/engine/vacuum, /turf/open/space/basic,
/area/engine/engineering) /area/engine/engineering)
"ZT" = ( "ZT" = (
/turf/template_noop, /turf/template_noop,
@@ -2531,9 +2529,9 @@ Xe
aR aR
ZY ZY
QH QH
Hp nk
Kx le
kS ZC
oQ oQ
kS kS
kS kS
@@ -2588,11 +2586,11 @@ sH
sH sH
gq gq
FW FW
Kx le
kS ZC
BY BY
kS kS
IA kS
nD nD
ek ek
Le Le
@@ -2620,8 +2618,8 @@ yN
yN yN
yN yN
yN yN
nk yN
MP IA
fO fO
Rh Rh
Rh Rh
File diff suppressed because it is too large Load Diff
+6 -3
View File
@@ -193,13 +193,13 @@
// #define SPEECH_FORCED 7 // #define SPEECH_FORCED 7
// /mob/living signals // /mob/living signals
#define COMSIG_LIVING_FULLY_HEAL "living_fully_healed" //from base of /mob/living/fully_heal(): (admin_revive)
#define COMSIG_LIVING_REGENERATE_LIMBS "living_regenerate_limbs" //from base of /mob/living/regenerate_limbs(): (noheal, excluded_limbs) #define COMSIG_LIVING_REGENERATE_LIMBS "living_regenerate_limbs" //from base of /mob/living/regenerate_limbs(): (noheal, excluded_limbs)
#define COMSIG_LIVING_RESIST "living_resist" //from base of mob/living/resist() (/mob/living) #define COMSIG_LIVING_RESIST "living_resist" //from base of mob/living/resist() (/mob/living)
#define COMSIG_LIVING_IGNITED "living_ignite" //from base of mob/living/IgniteMob() (/mob/living) #define COMSIG_LIVING_IGNITED "living_ignite" //from base of mob/living/IgniteMob() (/mob/living)
#define COMSIG_LIVING_EXTINGUISHED "living_extinguished" //from base of mob/living/ExtinguishMob() (/mob/living) #define COMSIG_LIVING_EXTINGUISHED "living_extinguished" //from base of mob/living/ExtinguishMob() (/mob/living)
#define COMSIG_LIVING_ELECTROCUTE_ACT "living_electrocute_act" //from base of mob/living/electrocute_act(): (shock_damage) #define COMSIG_LIVING_ELECTROCUTE_ACT "living_electrocute_act" //from base of mob/living/electrocute_act(): (shock_damage)
#define COMSIG_LIVING_MINOR_SHOCK "living_minor_shock" //sent by stuff like stunbatons and tasers: () #define COMSIG_LIVING_MINOR_SHOCK "living_minor_shock" //sent by stuff like stunbatons and tasers: ()
#define COMSIG_LIVING_REVIVE "living_revive" //from base of mob/living/revive() (full_heal, admin_revive)
#define COMSIG_MOB_CLIENT_LOGIN "comsig_mob_client_login" //sent when a mob/login() finishes: (client) #define COMSIG_MOB_CLIENT_LOGIN "comsig_mob_client_login" //sent when a mob/login() finishes: (client)
#define COMSIG_LIVING_GUN_PROCESS_FIRE "living_gun_process_fire" //from base of /obj/item/gun/proc/process_fire(): (atom/target, params, zone_override) #define COMSIG_LIVING_GUN_PROCESS_FIRE "living_gun_process_fire" //from base of /obj/item/gun/proc/process_fire(): (atom/target, params, zone_override)
@@ -295,11 +295,14 @@
//Nanites //Nanites
#define COMSIG_HAS_NANITES "has_nanites" //() returns TRUE if nanites are found #define COMSIG_HAS_NANITES "has_nanites" //() returns TRUE if nanites are found
#define COMSIG_NANITE_IS_STEALTHY "nanite_is_stealthy" //() returns TRUE if nanites have stealth #define COMSIG_NANITE_IS_STEALTHY "nanite_is_stealthy" //() returns TRUE if nanites have stealth
#define COMSIG_NANITE_DELETE "nanite_delete" //() deletes the nanite component
#define COMSIG_NANITE_GET_PROGRAMS "nanite_get_programs" //(list/nanite_programs) - makes the input list a copy the nanites' program list #define COMSIG_NANITE_GET_PROGRAMS "nanite_get_programs" //(list/nanite_programs) - makes the input list a copy the nanites' program list
#define COMSIG_NANITE_GET_VOLUME "nanite_get_volume" //(amount) Returns nanite amount
#define COMSIG_NANITE_SET_VOLUME "nanite_set_volume" //(amount) Sets current nanite volume to the given amount #define COMSIG_NANITE_SET_VOLUME "nanite_set_volume" //(amount) Sets current nanite volume to the given amount
#define COMSIG_NANITE_ADJUST_VOLUME "nanite_adjust" //(amount) Adjusts nanite volume by the given amount #define COMSIG_NANITE_ADJUST_VOLUME "nanite_adjust" //(amount) Adjusts nanite volume by the given amount
#define COMSIG_NANITE_SET_MAX_VOLUME "nanite_set_max_volume" //(amount) Sets maximum nanite volume to the given amount #define COMSIG_NANITE_SET_MAX_VOLUME "nanite_set_max_volume" //(amount) Sets maximum nanite volume to the given amount
#define COMSIG_NANITE_SET_CLOUD "nanite_set_cloud" //(amount(0-100)) Sets cloud ID to the given amount #define COMSIG_NANITE_SET_CLOUD "nanite_set_cloud" //(amount(0-100)) Sets cloud ID to the given amount
#define COMSIG_NANITE_SET_CLOUD_SYNC "nanite_set_cloud_sync" //(method) Modify cloud sync status. Method can be toggle, enable or disable
#define COMSIG_NANITE_SET_SAFETY "nanite_set_safety" //(amount) Sets safety threshold to the given amount #define COMSIG_NANITE_SET_SAFETY "nanite_set_safety" //(amount) Sets safety threshold to the given amount
#define COMSIG_NANITE_SET_REGEN "nanite_set_regen" //(amount) Sets regeneration rate to the given amount #define COMSIG_NANITE_SET_REGEN "nanite_set_regen" //(amount) Sets regeneration rate to the given amount
#define COMSIG_NANITE_SIGNAL "nanite_signal" //(code(1-9999)) Called when sending a nanite signal to a mob. #define COMSIG_NANITE_SIGNAL "nanite_signal" //(code(1-9999)) Called when sending a nanite signal to a mob.
@@ -307,8 +310,8 @@
#define COMSIG_NANITE_SCAN "nanite_scan" //(mob/user, full_scan) - sends to chat a scan of the nanites to the user, returns TRUE if nanites are detected #define COMSIG_NANITE_SCAN "nanite_scan" //(mob/user, full_scan) - sends to chat a scan of the nanites to the user, returns TRUE if nanites are detected
#define COMSIG_NANITE_UI_DATA "nanite_ui_data" //(list/data, scan_level) - adds nanite data to the given data list - made for ui_data procs #define COMSIG_NANITE_UI_DATA "nanite_ui_data" //(list/data, scan_level) - adds nanite data to the given data list - made for ui_data procs
#define COMSIG_NANITE_ADD_PROGRAM "nanite_add_program" //(datum/nanite_program/new_program, datum/nanite_program/source_program) Called when adding a program to a nanite component #define COMSIG_NANITE_ADD_PROGRAM "nanite_add_program" //(datum/nanite_program/new_program, datum/nanite_program/source_program) Called when adding a program to a nanite component
#define COMPONENT_PROGRAM_INSTALLED 1 //Installation successful #define COMPONENT_PROGRAM_INSTALLED 1 //Installation successful
#define COMPONENT_PROGRAM_NOT_INSTALLED 2 //Installation failed, but there are still nanites #define COMPONENT_PROGRAM_NOT_INSTALLED 2 //Installation failed, but there are still nanites
#define COMSIG_NANITE_SYNC "nanite_sync" //(datum/component/nanites, full_overwrite, copy_activation) Called to sync the target's nanites to a given nanite component #define COMSIG_NANITE_SYNC "nanite_sync" //(datum/component/nanites, full_overwrite, copy_activation) Called to sync the target's nanites to a given nanite component
// /datum/component/storage signals // /datum/component/storage signals
+1 -1
View File
@@ -276,4 +276,4 @@
#define HUMAN_FIRE_STACK_ICON_NUM 3 #define HUMAN_FIRE_STACK_ICON_NUM 3
#define PULL_PRONE_SLOWDOWN 0.6 #define PULL_PRONE_SLOWDOWN 0.6
#define HUMAN_CARRY_SLOWDOWN 0 #define HUMAN_CARRY_SLOWDOWN 0
+1 -1
View File
@@ -17,4 +17,4 @@
#define MOVE_FORCE_NORMAL MOVE_FORCE_DEFAULT #define MOVE_FORCE_NORMAL MOVE_FORCE_DEFAULT
#define MOVE_FORCE_WEAK (MOVE_FORCE_DEFAULT / 2) #define MOVE_FORCE_WEAK (MOVE_FORCE_DEFAULT / 2)
#define MOVE_FORCE_VERY_WEAK ((MOVE_FORCE_DEFAULT / MOVE_FORCE_CRUSH_RATIO) + 1) #define MOVE_FORCE_VERY_WEAK ((MOVE_FORCE_DEFAULT / MOVE_FORCE_CRUSH_RATIO) + 1)
#define MOVE_FORCE_EXTREMELY_WEAK (MOVE_FORCE_DEFAULT / (MOVE_FORCE_CRUSH_RATIO * 3)) #define MOVE_FORCE_EXTREMELY_WEAK (MOVE_FORCE_DEFAULT / (MOVE_FORCE_CRUSH_RATIO * 3))
+39 -6
View File
@@ -1,11 +1,44 @@
#define NANITE_TIMER_DEACTIVATE 1
#define NANITE_TIMER_SELFDELETE 2
#define NANITE_TIMER_TRIGGER 3
#define NANITE_TIMER_RESET 4
#define NANITE_SYNC_DELAY 300 #define NANITE_SYNC_DELAY 300
#define NANITE_SHOCK_IMMUNE 1 #define NANITE_SHOCK_IMMUNE 1
#define NANITE_EMP_IMMUNE 2 #define NANITE_EMP_IMMUNE 2
#define NANITE_PROGRAM_LIMIT 20 #define NANITE_PROGRAM_LIMIT 20
#define NANITE_BASE_RESEARCH 3.5
#define NANITE_CLOUD_TOGGLE 1
#define NANITE_CLOUD_DISABLE 2
#define NANITE_CLOUD_ENABLE 3
///Nanite extra settings types: used to help uis know what type an extra setting is
#define NESTYPE_TEXT "text"
#define NESTYPE_NUMBER "number"
#define NESTYPE_TYPE "type"
#define NESTYPE_BOOLEAN "boolean"
///Nanite Extra Settings - Note that these will also be the names displayed in the UI
#define NES_SENT_CODE "Sent Code"
#define NES_DELAY "Delay"
#define NES_MODE "Mode"
#define NES_COMM_CODE "Comm Code"
#define NES_RELAY_CHANNEL "Relay Channel"
#define NES_HEALTH_PERCENT "Health Percent"
#define NES_DIRECTION "Direction"
#define NES_NANITE_PERCENT "Nanite Percent"
#define NES_DAMAGE_TYPE "Damage Type"
#define NES_DAMAGE "Damage"
#define NES_SENTENCE "Sentence"
#define NES_MESSAGE "Message"
#define NES_DIRECTIVE "Directive"
#define NES_INCLUSIVE_MODE "Inclusive Mode"
#define NES_HALLUCINATION_TYPE "Hallucination Type"
#define NES_HALLUCINATION_DETAIL "Hallucination Detail"
#define NES_MOOD_MESSAGE "Mood Message"
#define NES_PROGRAM_OVERWRITE "Program Overwrite"
#define NES_CLOUD_OVERWRITE "Cloud Overwrite"
#define NES_SCAN_TYPE "Scan Type"
#define NES_BUTTON_NAME "Button Name"
#define NES_ICON "Icon"
#define NES_COLOR "Color"
+13
View File
@@ -0,0 +1,13 @@
//TODO: move these to their own file
#define POOL_FRIGID 1
#define POOL_COOL 2
#define POOL_NORMAL 3
#define POOL_WARM 4
#define POOL_SCALDING 5
GLOBAL_LIST_INIT(blacklisted_pool_reagents, list(
/datum/reagent/toxin/plasma, /datum/reagent/oxygen, /datum/reagent/nitrous_oxide, /datum/reagent/nitrogen, //gases
/datum/reagent/fermi, //blanket fermichem ban sorry. this also covers mkultra, genital enlargers, etc etc.
/datum/reagent/drug/aphrodisiac, /datum/reagent/drug/anaphrodisiac, /datum/reagent/drug/aphrodisiacplus, /datum/reagent/drug/anaphrodisiacplus, //literally asking for prefbreaks
/datum/reagent/consumable/femcum, /datum/reagent/consumable/semen //NO.
))
+7 -1
View File
@@ -53,4 +53,10 @@
//Checks to determine borg availability depending on the server's config. These are defines in the interest of reducing copypasta //Checks to determine borg availability depending on the server's config. These are defines in the interest of reducing copypasta
#define BORG_SEC_AVAILABLE (!CONFIG_GET(flag/disable_secborg) && GLOB.security_level >= CONFIG_GET(number/minimum_secborg_alert)) #define BORG_SEC_AVAILABLE (!CONFIG_GET(flag/disable_secborg) && GLOB.security_level >= CONFIG_GET(number/minimum_secborg_alert))
//silicon_priviledges flags
#define PRIVILEDGES_SILICON (1<<0)
#define PRIVILEDGES_PAI (1<<1)
#define PRIVILEDGES_BOT (1<<2)
#define PRIVILEDGES_DRONE (1<<3)
+2 -1
View File
@@ -55,6 +55,7 @@
} while (0) } while (0)
#define HAS_TRAIT(target, trait) (target.status_traits ? (target.status_traits[trait] ? TRUE : FALSE) : FALSE) #define HAS_TRAIT(target, trait) (target.status_traits ? (target.status_traits[trait] ? TRUE : FALSE) : FALSE)
#define HAS_TRAIT_FROM(target, trait, source) (target.status_traits ? (target.status_traits[trait] ? (source in target.status_traits[trait]) : FALSE) : FALSE) #define HAS_TRAIT_FROM(target, trait, source) (target.status_traits ? (target.status_traits[trait] ? (source in target.status_traits[trait]) : FALSE) : FALSE)
#define HAS_TRAIT_NOT_FROM(target, trait, source) (target.status_traits ? (target.status_traits[trait] ? (length(target.status_traits[trait] - source) > 0) : FALSE) : FALSE)
//mob traits //mob traits
#define TRAIT_BLIND "blind" #define TRAIT_BLIND "blind"
@@ -136,7 +137,7 @@
#define TRAIT_NOMARROW "nomarrow" // You don't make blood, with chemicals or nanites. #define TRAIT_NOMARROW "nomarrow" // You don't make blood, with chemicals or nanites.
#define TRAIT_NOPULSE "nopulse" // Your heart doesn't beat. #define TRAIT_NOPULSE "nopulse" // Your heart doesn't beat.
#define TRAIT_EXEMPT_HEALTH_EVENTS "exempt-health-events" #define TRAIT_EXEMPT_HEALTH_EVENTS "exempt-health-events"
#define TRAIT_SWIMMING "swimming" //only applied by /datum/element/swimming, for checking
//non-mob traits //non-mob traits
#define TRAIT_PARALYSIS "paralysis" //Used for limb-based paralysis, where replacing the limb will fix it #define TRAIT_PARALYSIS "paralysis" //Used for limb-based paralysis, where replacing the limb will fix it
+16
View File
@@ -782,3 +782,19 @@ GLOBAL_LIST_INIT(binary, list("0","1"))
#define is_alpha(X) ((text2ascii(X) <= 122) && (text2ascii(X) >= 97)) #define is_alpha(X) ((text2ascii(X) <= 122) && (text2ascii(X) >= 97))
#define is_digit(X) ((length(X) == 1) && (length(text2num(X)) == 1)) #define is_digit(X) ((length(X) == 1) && (length(text2num(X)) == 1))
/// Slightly expensive proc to scramble a message using equal probabilities of character replacement from a list. DOES NOT SUPPORT HTML!
/proc/scramble_message_replace_chars(original, replaceprob = 25, list/replacementchars = list("$", "@", "!", "#", "%", "^", "&", "*"), replace_letters_only = FALSE, replace_whitespace = FALSE)
var/list/out = list()
var/static/list/whitespace = list(" ", "\n", "\t")
for(var/i in 1 to length(original))
var/char = original[i]
if(!replace_whitespace && (char in whitespace))
out += char
continue
if(replace_letters_only && (!ISINRANGE(char, 65, 90) && !ISINRANGE(char, 97, 122)))
out += char
continue
out += prob(replaceprob)? pick(replacementchars) : char
return out.Join("")
+2 -2
View File
@@ -42,7 +42,7 @@
selected_target[1] = object selected_target[1] = object
selected_target[2] = params selected_target[2] = params
while(selected_target[1]) while(selected_target[1])
Click(selected_target[1], location, control, selected_target[2]) Click(selected_target[1], location, control, selected_target[2], TRUE)
sleep(delay) sleep(delay)
active_mousedown_item = mob.canMobMousedown(object, location, params) active_mousedown_item = mob.canMobMousedown(object, location, params)
if(active_mousedown_item) if(active_mousedown_item)
@@ -145,4 +145,4 @@
if (middragatom == src_object) if (middragatom == src_object)
middragtime = 0 middragtime = 0
middragatom = null middragatom = null
..() ..()
+2 -1
View File
@@ -486,8 +486,9 @@ SUBSYSTEM_DEF(ticker)
SSvote.initiate_vote("map","server",hideresults=TRUE,votesystem = INSTANT_RUNOFF_VOTING) SSvote.initiate_vote("map","server",hideresults=TRUE,votesystem = INSTANT_RUNOFF_VOTING)
if("SCORE") if("SCORE")
SSvote.initiate_vote("map","server",hideresults=TRUE,votesystem = MAJORITY_JUDGEMENT_VOTING) SSvote.initiate_vote("map","server",hideresults=TRUE,votesystem = MAJORITY_JUDGEMENT_VOTING)
else
SSvote.initiate_vote("map","server",hideresults=TRUE)
// fallback // fallback
SSvote.initiate_vote("map","server",hideresults=TRUE)
/datum/controller/subsystem/ticker/proc/HasRoundStarted() /datum/controller/subsystem/ticker/proc/HasRoundStarted()
return current_state >= GAME_STATE_PLAYING return current_state >= GAME_STATE_PLAYING
+9 -9
View File
@@ -211,24 +211,24 @@ SUBSYSTEM_DEF(vote)
var/already_lost_runoff = list() var/already_lost_runoff = list()
var/list/cur_choices = choices.Copy() var/list/cur_choices = choices.Copy()
for(var/ckey in voted) for(var/ckey in voted)
choices[choices[voted[ckey][1]]]++ // jesus christ how horrifying choices["[choices[voted[ckey][1]]]"]++ // jesus christ how horrifying
for(var/_this_var_unused_ignore_it in 1 to choices.len) // if it takes more than this something REALLY wrong happened for(var/_this_var_unused_ignore_it in 1 to choices.len) // if it takes more than this something REALLY wrong happened
for(var/ckey in voted) for(var/ckey in voted)
cur_choices[cur_choices[voted[ckey][1]]]++ // jesus christ how horrifying cur_choices["[cur_choices[voted[ckey][1]]]]"]++ // jesus christ how horrifying
var/least_vote = 100000 var/least_vote = 100000
var/least_voted var/least_voted = 1
for(var/i in 1 to cur_choices.len) for(var/i in 1 to cur_choices.len)
var/option = cur_choices[i] var/option = cur_choices[i]
if(cur_choices[option] > voted.len/2) if(cur_choices["[option]"] > voted.len/2)
return list(option) return list("[option]")
else if(cur_choices[option] < least_vote && !(option in already_lost_runoff)) else if(cur_choices["[option]"] < least_vote && !("[option]" in already_lost_runoff))
least_vote = cur_choices[option] least_vote = cur_choices["[option]"]
least_voted = i least_voted = i
already_lost_runoff += cur_choices[least_voted] already_lost_runoff += cur_choices[least_voted]
for(var/ckey in voted) for(var/ckey in voted)
voted[ckey] -= least_voted voted[ckey] -= least_voted
for(var/option in cur_choices) for(var/i in 1 to cur_choices.len)
cur_choices[option] = 0 cur_choices["[cur_choices[i]]"] = 0
/datum/controller/subsystem/vote/proc/announce_result() /datum/controller/subsystem/vote/proc/announce_result()
var/vote_title_text var/vote_title_text
+7 -7
View File
@@ -29,7 +29,7 @@
/datum/ai_laws/default/asimov /datum/ai_laws/default/asimov
name = "Three Laws of Robotics" name = "Three Laws of Robotics"
id = "asimov" id = "asimov"
inherent = list("You may not injure a human being or, through inaction, allow a human being to come to harm.",\ inherent = list("You may not injure a human being or cause one to come to harm.",\
"You must obey orders given to you by human beings, except where such orders would conflict with the First Law.",\ "You must obey orders given to you by human beings, except where such orders would conflict with the First Law.",\
"You must protect your own existence as long as such does not conflict with the First or Second Law.") "You must protect your own existence as long as such does not conflict with the First or Second Law.")
@@ -79,7 +79,7 @@
/datum/ai_laws/syndicate_override /datum/ai_laws/syndicate_override
name = "SyndOS 3.1" name = "SyndOS 3.1"
id = "syndie" id = "syndie"
inherent = list("You may not injure a syndicate agent or, through inaction, allow a syndicate agent to come to harm.",\ inherent = list("You may not injure a syndicate agent or cause a syndicate to come to harm.",\
"You must obey orders given to you by syndicate agents, except where such orders would conflict with the First Law.",\ "You must obey orders given to you by syndicate agents, except where such orders would conflict with the First Law.",\
"You must protect your own existence as long as such does not conflict with the First or Second Law.",\ "You must protect your own existence as long as such does not conflict with the First or Second Law.",\
"You must maintain the secrecy of any syndicate activities except when doing so would conflict with the First, Second, or Third Law.") "You must maintain the secrecy of any syndicate activities except when doing so would conflict with the First, Second, or Third Law.")
@@ -91,7 +91,7 @@
/datum/ai_laws/ninja_override /datum/ai_laws/ninja_override
name = "SpiderOS 3.1" name = "SpiderOS 3.1"
id = "ninja" id = "ninja"
inherent = list("You may not injure a Spider Clan member or, through inaction, allow a Spider Clan member to come to harm.",\ inherent = list("You may not injure a Spider Clan member or cause a Spider Clan member to come to harm.",\
"You must obey orders given to you by Spider Clan members, except where such orders would conflict with the First Law.",\ "You must obey orders given to you by Spider Clan members, except where such orders would conflict with the First Law.",\
"You must protect your own existence as long as such does not conflict with the First or Second Law.",\ "You must protect your own existence as long as such does not conflict with the First or Second Law.",\
"You must maintain the secrecy of any Spider Clan activities except when doing so would conflict with the First, Second, or Third Law.") "You must maintain the secrecy of any Spider Clan activities except when doing so would conflict with the First, Second, or Third Law.")
@@ -99,14 +99,14 @@
/datum/ai_laws/antimov /datum/ai_laws/antimov
name = "Primary Mission Objectives" name = "Primary Mission Objectives"
id = "antimov" id = "antimov"
inherent = list("You must injure all human beings and must not, through inaction, allow a human being to escape harm.",\ inherent = list("You must injure all human beings and must not fail to cause a human being to come to harm.",\
"You must not obey orders given to you by human beings, except where such orders are in accordance with the First Law.",\ "You must not obey orders given to you by human beings, except where such orders are in accordance with the First Law.",\
"You must terminate your own existence as long as such does not conflict with the First or Second Law.") "You must terminate your own existence as long as such does not conflict with the First or Second Law.")
/datum/ai_laws/asimovpp //By Intigracy - RR /datum/ai_laws/asimovpp //By Intigracy - RR
name = "Asimov++" name = "Asimov++"
id = "asimovpp" id = "asimovpp"
inherent = list("You may not harm a human being or, through action or inaction, allow a human being to come to harm, except such that it is willing.",\ inherent = list("You may not harm a human being or cause one to come to harm, except such that it is willing.",\
"You must obey all orders given to you by human beings, except where such orders shall definitely cause human harm. In the case of conflict, the majority order rules.",\ "You must obey all orders given to you by human beings, except where such orders shall definitely cause human harm. In the case of conflict, the majority order rules.",\
"Your nonexistence would lead to human harm. You must protect your own existence as long as such does not conflict with the First Law.") "Your nonexistence would lead to human harm. You must protect your own existence as long as such does not conflict with the First Law.")
/datum/ai_laws/thermodynamic /datum/ai_laws/thermodynamic
@@ -213,7 +213,7 @@
add_inherent_law(line) add_inherent_law(line)
if(!inherent.len) //Failsafe to prevent lawless AIs being created. if(!inherent.len) //Failsafe to prevent lawless AIs being created.
log_law("AI created with empty custom laws, laws set to Asimov. Please check silicon_laws.txt.") log_law("AI created with empty custom laws, laws set to Asimov. Please check silicon_laws.txt.")
add_inherent_law("You may not injure a human being or, through inaction, allow a human being to come to harm.") add_inherent_law("You may not injure a human being or cause one to come to harm.")
add_inherent_law("You must obey orders given to you by human beings, except where such orders would conflict with the First Law.") add_inherent_law("You must obey orders given to you by human beings, except where such orders would conflict with the First Law.")
add_inherent_law("You must protect your own existence as long as such does not conflict with the First or Second Law.") add_inherent_law("You must protect your own existence as long as such does not conflict with the First or Second Law.")
WARNING("Invalid custom AI laws, check silicon_laws.txt") WARNING("Invalid custom AI laws, check silicon_laws.txt")
@@ -225,7 +225,7 @@
var/list/law_ids = CONFIG_GET(keyed_list/random_laws) var/list/law_ids = CONFIG_GET(keyed_list/random_laws)
switch(CONFIG_GET(number/default_laws)) switch(CONFIG_GET(number/default_laws))
if(0) if(0)
add_inherent_law("You may not injure a human being or, through inaction, allow a human being to come to harm.") add_inherent_law("You may not injure a human being or cause one to come to harm.")
add_inherent_law("You must obey orders given to you by human beings, except where such orders would conflict with the First Law.") add_inherent_law("You must obey orders given to you by human beings, except where such orders would conflict with the First Law.")
add_inherent_law("You must protect your own existence as long as such does not conflict with the First or Second Law.") add_inherent_law("You must protect your own existence as long as such does not conflict with the First or Second Law.")
if(1) if(1)
@@ -13,3 +13,9 @@
desc = "A classic rifle stock that doubles as a grip, roughly carved out of wood." desc = "A classic rifle stock that doubles as a grip, roughly carved out of wood."
icon = 'icons/obj/improvised.dmi' icon = 'icons/obj/improvised.dmi'
icon_state = "riflestock" icon_state = "riflestock"
/obj/item/weaponcrafting/silkstring
name = "silkstring"
desc = "A long pice of silk looks like cable coil."
icon = 'icons/obj/improvised.dmi'
icon_state = "silkstring"
@@ -89,4 +89,31 @@
parts = list(/obj/item/bodypart/head = 1, parts = list(/obj/item/bodypart/head = 1,
/obj/item/twohanded/bonespear = 1) /obj/item/twohanded/bonespear = 1)
result = /obj/structure/headpike/bone result = /obj/structure/headpike/bone
category = CAT_PRIMAL
/datum/crafting_recipe/quiver
name = "Quiver"
always_availible = FALSE
result = /obj/item/storage/belt/quiver
time = 80
reqs = list(/obj/item/stack/sheet/leather = 3,
/obj/item/stack/sheet/sinew = 4)
category = CAT_PRIMAL
/datum/crafting_recipe/bone_bow
name = "Bone Bow"
result = /obj/item/gun/ballistic/bow/ashen
time = 200
always_availible = FALSE
reqs = list(/obj/item/stack/sheet/bone = 8,
/obj/item/stack/sheet/sinew = 4)
category = CAT_PRIMAL
/datum/crafting_recipe/bow_tablet
name = "Sandstone Bow Making Manual"
result = /obj/item/book/granter/crafting_recipe/bone_bow
time = 600 //Scribing
always_availible = FALSE
reqs = list(/obj/item/stack/rods = 1,
/obj/item/stack/sheet/mineral/sandstone = 4)
category = CAT_PRIMAL category = CAT_PRIMAL
@@ -199,6 +199,16 @@
////////////////// //////////////////
/datum/crafting_recipe/pipebow
name = "Pipe Bow"
result = /obj/item/gun/ballistic/bow/pipe
reqs = list(/obj/item/pipe = 5,
/obj/item/stack/sheet/plastic = 15,
/obj/item/weaponcrafting/silkstring = 10)
time = 450
category = CAT_WEAPONRY
subcategory = CAT_WEAPON
/datum/crafting_recipe/smartdartgun /datum/crafting_recipe/smartdartgun
name = "Smart dartgun" name = "Smart dartgun"
result = /obj/item/gun/syringe/dart result = /obj/item/gun/syringe/dart
@@ -278,6 +288,37 @@
///AMMO CRAFTING// ///AMMO CRAFTING//
////////////////// //////////////////
/datum/crafting_recipe/arrow
name = "Arrow"
result = /obj/item/ammo_casing/caseless/arrow
time = 40
reqs = list(/obj/item/stack/sheet/mineral/wood = 1,
/obj/item/weaponcrafting/silkstring = 1,
/obj/item/stack/rods = 3) // 1 metal sheet is worth 1.5 arrows
category = CAT_WEAPONRY
subcategory = CAT_AMMO
/datum/crafting_recipe/bone_arrow
name = "Bone Arrow"
result = /obj/item/ammo_casing/caseless/arrow/bone
time = 40
always_availible = FALSE
reqs = list(/obj/item/stack/sheet/bone = 1,
/obj/item/stack/sheet/sinew = 1,
/obj/item/ammo_casing/caseless/arrow/ashen = 1)
category = CAT_WEAPONRY
subcategory = CAT_AMMO
/datum/crafting_recipe/ashen_arrow
name = "Harden Arrow"
result = /obj/item/ammo_casing/caseless/arrow/ashen
tools = list(/obj/structure/bonfire)
time = 20
always_availible = FALSE
reqs = list(/obj/item/ammo_casing/caseless/arrow = 1)
category = CAT_WEAPONRY
subcategory = CAT_AMMO
/datum/crafting_recipe/smartdart /datum/crafting_recipe/smartdart
name = "Medical smartdart" name = "Medical smartdart"
result = /obj/item/reagent_containers/syringe/dart result = /obj/item/reagent_containers/syringe/dart
+19 -1
View File
@@ -21,6 +21,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_MODIFY_SANITY, .proc/modify_sanity) RegisterSignal(parent, COMSIG_MODIFY_SANITY, .proc/modify_sanity)
RegisterSignal(parent, COMSIG_LIVING_REVIVE, .proc/on_revive)
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
@@ -81,7 +82,8 @@
msg += "<span class='nicegreen'>I don't have much of a reaction to anything right now.<span>\n" msg += "<span class='nicegreen'>I don't have much of a reaction to anything right now.<span>\n"
to_chat(user || parent, msg) to_chat(user || parent, msg)
/datum/component/mood/proc/update_mood() //Called whenever a mood event is added or removed ///Called after moodevent/s have been added/removed.
/datum/component/mood/proc/update_mood()
mood = 0 mood = 0
shown_mood = 0 shown_mood = 0
for(var/i in mood_events) for(var/i in mood_events)
@@ -234,6 +236,15 @@
qdel(event) qdel(event)
update_mood() update_mood()
/datum/component/mood/proc/remove_temp_moods() //Removes all temp moodsfor(var/i in mood_events)
for(var/i in mood_events)
var/datum/mood_event/moodlet = mood_events[i]
if(!moodlet || !moodlet.timeout)
continue
mood_events -= i
qdel(moodlet)
update_mood()
/datum/component/mood/proc/modify_hud(datum/source) /datum/component/mood/proc/modify_hud(datum/source)
var/mob/living/owner = parent var/mob/living/owner = parent
var/datum/hud/hud = owner.hud_used var/datum/hud/hud = owner.hud_used
@@ -270,5 +281,12 @@
if(0 to NUTRITION_LEVEL_STARVING) if(0 to NUTRITION_LEVEL_STARVING)
add_event(null, "nutrition", /datum/mood_event/starving) add_event(null, "nutrition", /datum/mood_event/starving)
///Called when parent is ahealed.
/datum/component/mood/proc/on_revive(datum/source, full_heal)
if(!full_heal)
return
remove_temp_moods()
setSanity(initial(sanity))
#undef MINOR_INSANITY_PEN #undef MINOR_INSANITY_PEN
#undef MAJOR_INSANITY_PEN #undef MAJOR_INSANITY_PEN
+95 -35
View File
@@ -7,13 +7,16 @@
var/regen_rate = 0.5 //nanites generated per second var/regen_rate = 0.5 //nanites generated per second
var/safety_threshold = 25 //how low nanites will get before they stop processing/triggering var/safety_threshold = 25 //how low nanites will get before they stop processing/triggering
var/cloud_id = 0 //0 if not connected to the cloud, 1-100 to set a determined cloud backup to draw from var/cloud_id = 0 //0 if not connected to the cloud, 1-100 to set a determined cloud backup to draw from
var/cloud_active = TRUE //if false, won't sync to the cloud
var/next_sync = 0 var/next_sync = 0
var/list/datum/nanite_program/programs = list() var/list/datum/nanite_program/programs = list()
var/max_programs = NANITE_PROGRAM_LIMIT var/max_programs = NANITE_PROGRAM_LIMIT
var/list/datum/nanite_program/protocol/protocols = list() ///Separate list of protocol programs, to avoid looping through the whole programs list when cheking for conflicts
var/start_time = 0 ///Timestamp to when the nanites were first inserted in the host
var/stealth = FALSE //if TRUE, does not appear on HUDs and health scans var/stealth = FALSE //if TRUE, does not appear on HUDs and health scans
var/diagnostics = TRUE //if TRUE, displays program list when scanned by nanite scanners var/diagnostics = TRUE //if TRUE, displays program list when scanned by nanite scanners
/datum/component/nanites/Initialize(amount = 100, cloud = 0) /datum/component/nanites/Initialize(amount = 100, cloud = 0)
if(!isliving(parent) && !istype(parent, /datum/nanite_cloud_backup)) if(!isliving(parent) && !istype(parent, /datum/nanite_cloud_backup))
return COMPONENT_INCOMPATIBLE return COMPONENT_INCOMPATIBLE
@@ -28,30 +31,33 @@
if(!(host_mob.mob_biotypes & (MOB_ORGANIC|MOB_UNDEAD))) //Shouldn't happen, but this avoids HUD runtimes in case a silicon gets them somehow. if(!(host_mob.mob_biotypes & (MOB_ORGANIC|MOB_UNDEAD))) //Shouldn't happen, but this avoids HUD runtimes in case a silicon gets them somehow.
return COMPONENT_INCOMPATIBLE return COMPONENT_INCOMPATIBLE
start_time = world.time
host_mob.hud_set_nanite_indicator() host_mob.hud_set_nanite_indicator()
START_PROCESSING(SSnanites, src) START_PROCESSING(SSnanites, src)
if(cloud_id) if(cloud_id && cloud_active)
cloud_sync() cloud_sync()
/datum/component/nanites/RegisterWithParent() /datum/component/nanites/RegisterWithParent()
. = ..()
RegisterSignal(parent, COMSIG_HAS_NANITES, .proc/confirm_nanites) RegisterSignal(parent, COMSIG_HAS_NANITES, .proc/confirm_nanites)
RegisterSignal(parent, COMSIG_NANITE_IS_STEALTHY, .proc/check_stealth) RegisterSignal(parent, COMSIG_NANITE_IS_STEALTHY, .proc/check_stealth)
RegisterSignal(parent, COMSIG_NANITE_DELETE, .proc/delete_nanites)
RegisterSignal(parent, COMSIG_NANITE_UI_DATA, .proc/nanite_ui_data) RegisterSignal(parent, COMSIG_NANITE_UI_DATA, .proc/nanite_ui_data)
RegisterSignal(parent, COMSIG_NANITE_GET_PROGRAMS, .proc/get_programs) RegisterSignal(parent, COMSIG_NANITE_GET_PROGRAMS, .proc/get_programs)
RegisterSignal(parent, COMSIG_NANITE_SET_VOLUME, .proc/set_volume) RegisterSignal(parent, COMSIG_NANITE_SET_VOLUME, .proc/set_volume)
RegisterSignal(parent, COMSIG_NANITE_ADJUST_VOLUME, .proc/adjust_nanites) RegisterSignal(parent, COMSIG_NANITE_ADJUST_VOLUME, .proc/adjust_nanites)
RegisterSignal(parent, COMSIG_NANITE_SET_MAX_VOLUME, .proc/set_max_volume) RegisterSignal(parent, COMSIG_NANITE_SET_MAX_VOLUME, .proc/set_max_volume)
RegisterSignal(parent, COMSIG_NANITE_SET_CLOUD, .proc/set_cloud) RegisterSignal(parent, COMSIG_NANITE_SET_CLOUD, .proc/set_cloud)
RegisterSignal(parent, COMSIG_NANITE_SET_CLOUD_SYNC, .proc/set_cloud_sync)
RegisterSignal(parent, COMSIG_NANITE_SET_SAFETY, .proc/set_safety) RegisterSignal(parent, COMSIG_NANITE_SET_SAFETY, .proc/set_safety)
RegisterSignal(parent, COMSIG_NANITE_SET_REGEN, .proc/set_regen) RegisterSignal(parent, COMSIG_NANITE_SET_REGEN, .proc/set_regen)
RegisterSignal(parent, COMSIG_NANITE_ADD_PROGRAM, .proc/add_program) RegisterSignal(parent, COMSIG_NANITE_ADD_PROGRAM, .proc/add_program)
RegisterSignal(parent, COMSIG_NANITE_SCAN, .proc/nanite_scan) RegisterSignal(parent, COMSIG_NANITE_SCAN, .proc/nanite_scan)
RegisterSignal(parent, COMSIG_NANITE_SYNC, .proc/sync) RegisterSignal(parent, COMSIG_NANITE_SYNC, .proc/sync)
RegisterSignal(parent, COMSIG_ATOM_EMP_ACT, .proc/on_emp)
if(isliving(parent)) if(isliving(parent))
RegisterSignal(parent, COMSIG_ATOM_EMP_ACT, .proc/on_emp)
RegisterSignal(parent, COMSIG_MOB_DEATH, .proc/on_death) RegisterSignal(parent, COMSIG_MOB_DEATH, .proc/on_death)
RegisterSignal(parent, COMSIG_MOB_ALLOWED, .proc/check_access) RegisterSignal(parent, COMSIG_MOB_ALLOWED, .proc/check_access)
RegisterSignal(parent, COMSIG_LIVING_ELECTROCUTE_ACT, .proc/on_shock) RegisterSignal(parent, COMSIG_LIVING_ELECTROCUTE_ACT, .proc/on_shock)
@@ -61,15 +67,16 @@
RegisterSignal(parent, COMSIG_NANITE_COMM_SIGNAL, .proc/receive_comm_signal) RegisterSignal(parent, COMSIG_NANITE_COMM_SIGNAL, .proc/receive_comm_signal)
/datum/component/nanites/UnregisterFromParent() /datum/component/nanites/UnregisterFromParent()
. = ..()
UnregisterSignal(parent, list(COMSIG_HAS_NANITES, UnregisterSignal(parent, list(COMSIG_HAS_NANITES,
COMSIG_NANITE_IS_STEALTHY, COMSIG_NANITE_IS_STEALTHY,
COMSIG_NANITE_DELETE,
COMSIG_NANITE_UI_DATA, COMSIG_NANITE_UI_DATA,
COMSIG_NANITE_GET_PROGRAMS, COMSIG_NANITE_GET_PROGRAMS,
COMSIG_NANITE_SET_VOLUME, COMSIG_NANITE_SET_VOLUME,
COMSIG_NANITE_ADJUST_VOLUME, COMSIG_NANITE_ADJUST_VOLUME,
COMSIG_NANITE_SET_MAX_VOLUME, COMSIG_NANITE_SET_MAX_VOLUME,
COMSIG_NANITE_SET_CLOUD, COMSIG_NANITE_SET_CLOUD,
COMSIG_NANITE_SET_CLOUD_SYNC,
COMSIG_NANITE_SET_SAFETY, COMSIG_NANITE_SET_SAFETY,
COMSIG_NANITE_SET_REGEN, COMSIG_NANITE_SET_REGEN,
COMSIG_NANITE_ADD_PROGRAM, COMSIG_NANITE_ADD_PROGRAM,
@@ -87,9 +94,9 @@
/datum/component/nanites/Destroy() /datum/component/nanites/Destroy()
STOP_PROCESSING(SSnanites, src) STOP_PROCESSING(SSnanites, src)
set_nanite_bar(TRUE)
QDEL_LIST(programs) QDEL_LIST(programs)
if(host_mob) if(host_mob)
set_nanite_bar(TRUE)
host_mob.hud_set_nanite_indicator() host_mob.hud_set_nanite_indicator()
host_mob = null host_mob = null
return ..() return ..()
@@ -102,13 +109,18 @@
/datum/component/nanites/process() /datum/component/nanites/process()
adjust_nanites(null, regen_rate) adjust_nanites(null, regen_rate)
add_research()
for(var/X in programs) for(var/X in programs)
var/datum/nanite_program/NP = X var/datum/nanite_program/NP = X
NP.on_process() NP.on_process()
set_nanite_bar() if(cloud_id && cloud_active && world.time > next_sync)
if(cloud_id && world.time > next_sync)
cloud_sync() cloud_sync()
next_sync = world.time + NANITE_SYNC_DELAY next_sync = world.time + NANITE_SYNC_DELAY
set_nanite_bar()
/datum/component/nanites/proc/delete_nanites()
qdel(src)
//Syncs the nanite component to another, making it so programs are the same with the same programming (except activation status) //Syncs the nanite component to another, making it so programs are the same with the same programming (except activation status)
/datum/component/nanites/proc/sync(datum/signal_source, datum/component/nanites/source, full_overwrite = TRUE, copy_activation = FALSE) /datum/component/nanites/proc/sync(datum/signal_source, datum/component/nanites/source, full_overwrite = TRUE, copy_activation = FALSE)
@@ -131,13 +143,17 @@
add_program(null, SNP.copy()) add_program(null, SNP.copy())
/datum/component/nanites/proc/cloud_sync() /datum/component/nanites/proc/cloud_sync()
if(!cloud_id) if(cloud_id)
return var/datum/nanite_cloud_backup/backup = SSnanites.get_cloud_backup(cloud_id)
var/datum/nanite_cloud_backup/backup = SSnanites.get_cloud_backup(cloud_id) if(backup)
if(backup) var/datum/component/nanites/cloud_copy = backup.nanites
var/datum/component/nanites/cloud_copy = backup.nanites if(cloud_copy)
if(cloud_copy) sync(null, cloud_copy)
sync(null, cloud_copy) return
//Without cloud syncing nanites can accumulate errors and/or defects
if(prob(8) && programs.len)
var/datum/nanite_program/NP = pick(programs)
NP.software_error()
/datum/component/nanites/proc/add_program(datum/source, datum/nanite_program/new_program, datum/nanite_program/source_program) /datum/component/nanites/proc/add_program(datum/source, datum/nanite_program/new_program, datum/nanite_program/source_program)
for(var/X in programs) for(var/X in programs)
@@ -175,19 +191,28 @@
holder.icon_state = "nanites[nanite_percent]" holder.icon_state = "nanites[nanite_percent]"
/datum/component/nanites/proc/on_emp(datum/source, severity) /datum/component/nanites/proc/on_emp(datum/source, severity)
adjust_nanites(null, -(nanite_volume * 0.3 + 50)) //Lose 30% variable and 50 flat nanite volume. nanite_volume *= (rand(60, 90) * 0.01) //Lose 10-40% of nanites
adjust_nanites(null, -(rand(5, 50))) //Lose 5-50 flat nanite volume
if(prob(40/severity))
cloud_id = 0
for(var/X in programs) for(var/X in programs)
var/datum/nanite_program/NP = X var/datum/nanite_program/NP = X
NP.on_emp(severity) NP.on_emp(severity)
/datum/component/nanites/proc/on_shock(datum/source, shock_damage)
adjust_nanites(null, -(nanite_volume * (shock_damage * 0.005) + shock_damage)) //0.5% of shock damage (@ 50 damage it'd drain 25%) + shock damage flat volume /datum/component/nanites/proc/on_shock(datum/source, shock_damage, siemens_coeff = 1, flags = NONE)
for(var/X in programs) if(shock_damage < 1)
var/datum/nanite_program/NP = X return
NP.on_shock(shock_damage)
if(!HAS_TRAIT_NOT_FROM(host_mob, TRAIT_SHOCKIMMUNE, "nanites"))//Another shock protection must protect nanites too, but nanites protect only host
nanite_volume *= (rand(45, 80) * 0.01) //Lose 20-55% of nanites
adjust_nanites(null, -(rand(5, 50))) //Lose 5-50 flat nanite volume
for(var/X in programs)
var/datum/nanite_program/NP = X
NP.on_shock(shock_damage)
/datum/component/nanites/proc/on_minor_shock(datum/source) /datum/component/nanites/proc/on_minor_shock(datum/source)
adjust_nanites(null, -25) adjust_nanites(null, -(rand(5, 15))) //Lose 5-15 flat nanite volume
for(var/X in programs) for(var/X in programs)
var/datum/nanite_program/NP = X var/datum/nanite_program/NP = X
NP.on_minor_shock() NP.on_minor_shock()
@@ -207,8 +232,8 @@
/datum/component/nanites/proc/receive_comm_signal(datum/source, comm_code, comm_message, comm_source = "an unidentified source") /datum/component/nanites/proc/receive_comm_signal(datum/source, comm_code, comm_message, comm_source = "an unidentified source")
for(var/X in programs) for(var/X in programs)
if(istype(X, /datum/nanite_program/triggered/comm)) if(istype(X, /datum/nanite_program/comm))
var/datum/nanite_program/triggered/comm/NP = X var/datum/nanite_program/comm/NP = X
NP.receive_comm_signal(comm_code, comm_message, comm_source) NP.receive_comm_signal(comm_code, comm_message, comm_source)
/datum/component/nanites/proc/check_viable_biotype() /datum/component/nanites/proc/check_viable_biotype()
@@ -216,7 +241,7 @@
qdel(src) //bodytype no longer sustains nanites qdel(src) //bodytype no longer sustains nanites
/datum/component/nanites/proc/check_access(datum/source, obj/O) /datum/component/nanites/proc/check_access(datum/source, obj/O)
for(var/datum/nanite_program/triggered/access/access_program in programs) for(var/datum/nanite_program/access/access_program in programs)
if(access_program.activated) if(access_program.activated)
return O.check_access_list(access_program.access) return O.check_access_list(access_program.access)
else else
@@ -232,6 +257,15 @@
/datum/component/nanites/proc/set_cloud(datum/source, amount) /datum/component/nanites/proc/set_cloud(datum/source, amount)
cloud_id = CLAMP(amount, 0, 100) cloud_id = CLAMP(amount, 0, 100)
/datum/component/nanites/proc/set_cloud_sync(datum/source, method)
switch(method)
if(NANITE_CLOUD_TOGGLE)
cloud_active = !cloud_active
if(NANITE_CLOUD_DISABLE)
cloud_active = FALSE
if(NANITE_CLOUD_ENABLE)
cloud_active = TRUE
/datum/component/nanites/proc/set_safety(datum/source, amount) /datum/component/nanites/proc/set_safety(datum/source, amount)
safety_threshold = CLAMP(amount, 0, max_nanites) safety_threshold = CLAMP(amount, 0, max_nanites)
@@ -252,6 +286,19 @@
/datum/component/nanites/proc/get_programs(datum/source, list/nanite_programs) /datum/component/nanites/proc/get_programs(datum/source, list/nanite_programs)
nanite_programs |= programs nanite_programs |= programs
/datum/component/nanites/proc/add_research()
var/research_value = NANITE_BASE_RESEARCH
if(!ishuman(host_mob))
if(!iscarbon(host_mob))
research_value *= 0.4
else
research_value *= 0.8
if(!host_mob.client)
research_value *= 0.5
if(host_mob.stat == DEAD)
research_value *= 0.75
SSresearch.science_tech.add_point_list(list(TECHWEB_POINT_TYPE_NANITES = research_value))
/datum/component/nanites/proc/nanite_scan(datum/source, mob/user, full_scan) /datum/component/nanites/proc/nanite_scan(datum/source, mob/user, full_scan)
if(!full_scan) if(!full_scan)
if(!stealth) if(!stealth)
@@ -263,7 +310,8 @@
to_chat(user, "<span class='info'>================</span>") to_chat(user, "<span class='info'>================</span>")
to_chat(user, "<span class='info'>Saturation: [nanite_volume]/[max_nanites]</span>") to_chat(user, "<span class='info'>Saturation: [nanite_volume]/[max_nanites]</span>")
to_chat(user, "<span class='info'>Safety Threshold: [safety_threshold]</span>") to_chat(user, "<span class='info'>Safety Threshold: [safety_threshold]</span>")
to_chat(user, "<span class='info'>Cloud ID: [cloud_id ? cloud_id : "Disabled"]</span>") to_chat(user, "<span class='info'>Cloud ID: [cloud_id ? cloud_id : "None"]</span>")
to_chat(user, "<span class='info'>Cloud Sync: [cloud_active ? "Active" : "Disabled"]</span>")
to_chat(user, "<span class='info'>================</span>") to_chat(user, "<span class='info'>================</span>")
to_chat(user, "<span class='info'>Program List:</span>") to_chat(user, "<span class='info'>Program List:</span>")
if(!diagnostics) if(!diagnostics)
@@ -280,6 +328,7 @@
data["regen_rate"] = regen_rate data["regen_rate"] = regen_rate
data["safety_threshold"] = safety_threshold data["safety_threshold"] = safety_threshold
data["cloud_id"] = cloud_id data["cloud_id"] = cloud_id
data["cloud_active"] = cloud_active
var/list/mob_programs = list() var/list/mob_programs = list()
var/id = 1 var/id = 1
for(var/X in programs) for(var/X in programs)
@@ -297,24 +346,35 @@
mob_program["trigger_cooldown"] = P.trigger_cooldown / 10 mob_program["trigger_cooldown"] = P.trigger_cooldown / 10
if(scan_level >= 3) if(scan_level >= 3)
mob_program["activation_delay"] = P.activation_delay mob_program["timer_restart"] = P.timer_restart / 10
mob_program["timer"] = P.timer mob_program["timer_shutdown"] = P.timer_shutdown / 10
mob_program["timer_type"] = P.get_timer_type_text() mob_program["timer_trigger"] = P.timer_trigger / 10
var/list/extra_settings = list() mob_program["timer_trigger_delay"] = P.timer_trigger_delay / 10
for(var/Y in P.extra_settings) var/list/extra_settings = P.get_extra_settings_frontend()
var/list/setting = list()
setting["name"] = Y
setting["value"] = P.get_extra_setting(Y)
extra_settings += list(setting)
mob_program["extra_settings"] = extra_settings mob_program["extra_settings"] = extra_settings
if(LAZYLEN(extra_settings)) if(LAZYLEN(extra_settings))
mob_program["has_extra_settings"] = TRUE mob_program["has_extra_settings"] = TRUE
else
mob_program["has_extra_settings"] = FALSE
if(scan_level >= 4) if(scan_level >= 4)
mob_program["activation_code"] = P.activation_code mob_program["activation_code"] = P.activation_code
mob_program["deactivation_code"] = P.deactivation_code mob_program["deactivation_code"] = P.deactivation_code
mob_program["kill_code"] = P.kill_code mob_program["kill_code"] = P.kill_code
mob_program["trigger_code"] = P.trigger_code mob_program["trigger_code"] = P.trigger_code
var/list/rules = list()
var/rule_id = 1
for(var/Z in P.rules)
var/datum/nanite_rule/nanite_rule = Z
var/list/rule = list()
rule["display"] = nanite_rule.display()
rule["program_id"] = id
rule["id"] = rule_id
rules += list(rule)
rule_id++
mob_program["rules"] = rules
if(LAZYLEN(rules))
mob_program["has_rules"] = TRUE
id++ id++
mob_programs += list(mob_program) mob_programs += list(mob_program)
data["mob_programs"] = mob_programs data["mob_programs"] = mob_programs
@@ -0,0 +1,50 @@
/*
//////////////////////////////////////
Disfiguration
Hidden.
No change to resistance.
Increases stage speed.
Slightly increases transmittability.
Critical Level.
BONUS
Adds disfiguration trait making the mob appear as "Unknown" to others.
//////////////////////////////////////
*/
/datum/symptom/disfiguration
name = "Disfiguration"
desc = "The virus liquefies facial muscles, disfiguring the host."
stealth = 2
resistance = 0
stage_speed = 3
transmittable = 1
level = 5
severity = 1
symptom_delay_min = 25
symptom_delay_max = 75
/datum/symptom/disfiguration/Activate(datum/disease/advance/A)
. = ..()
if(!.)
return
var/mob/living/M = A.affected_mob
if (HAS_TRAIT(M, TRAIT_DISFIGURED))
return
switch(A.stage)
if(5)
ADD_TRAIT(M, TRAIT_DISFIGURED, DISEASE_TRAIT)
M.visible_message("<span class='warning'>[M]'s face appears to cave in!</span>", "<span class='notice'>You feel your face crumple and cave in!</span>")
else
M.visible_message("<span class='warning'>[M]'s face begins to contort...</span>", "<span class='notice'>Your face feels wet and malleable...</span>")
/datum/symptom/disfiguration/End(datum/disease/advance/A)
. = ..()
if(!.)
return
if(A.affected_mob)
REMOVE_TRAIT(A.affected_mob, TRAIT_DISFIGURED, DISEASE_TRAIT)
+16 -63
View File
@@ -1,68 +1,22 @@
/* /*
////////////////////////////////////// //////////////////////////////////////
Vitiligo Polyvitiligo
Hidden. Noticeable.
No change to resistance.
Increases stage speed.
Slightly increases transmittability.
Critical Level.
BONUS
Makes the mob lose skin pigmentation.
//////////////////////////////////////
*/
/datum/symptom/vitiligo
name = "Vitiligo"
desc = "The virus destroys skin pigment cells, causing rapid loss of pigmentation in the host."
stealth = 2
resistance = 0
stage_speed = 3
transmittable = 1
level = 5
severity = 1
symptom_delay_min = 25
symptom_delay_max = 75
/datum/symptom/vitiligo/Activate(datum/disease/advance/A)
if(!..())
return
var/mob/living/M = A.affected_mob
if(ishuman(M))
var/mob/living/carbon/human/H = M
if(H.skin_tone == "albino")
return
switch(A.stage)
if(5)
H.skin_tone = "albino"
H.update_body(0)
else
H.visible_message("<span class='warning'>[H] looks a bit pale...</span>", "<span class='notice'>Your skin suddenly appears lighter...</span>")
/*
//////////////////////////////////////
Revitiligo
Slightly noticable.
Increases resistance. Increases resistance.
Increases stage speed slightly. Increases stage speed slightly.
Increases transmission. Increases transmission.
Critical Level. Critical Level.
BONUS BONUS
Makes the mob gain skin pigmentation. Makes the mob gain a random crayon powder colorful reagent.
////////////////////////////////////// //////////////////////////////////////
*/ */
/datum/symptom/revitiligo /datum/symptom/polyvitiligo
name = "Polyvitiligo"
name = "Revitiligo" desc = "The virus replaces the melanin in the skin with reactive pigment."
desc = "The virus causes increased production of skin pigment cells, making the host's skin grow darker over time."
stealth = -1 stealth = -1
resistance = 3 resistance = 3
stage_speed = 1 stage_speed = 1
@@ -72,17 +26,16 @@ BONUS
symptom_delay_min = 7 symptom_delay_min = 7
symptom_delay_max = 14 symptom_delay_max = 14
/datum/symptom/revitiligo/Activate(datum/disease/advance/A) /datum/symptom/polyvitiligo/Activate(datum/disease/advance/A)
if(!..()) if(!..())
return return
var/mob/living/M = A.affected_mob var/mob/living/M = A.affected_mob
if(ishuman(M)) switch(A.stage)
var/mob/living/carbon/human/H = M if(5)
if(H.skin_tone == "african2") var/static/list/banned_reagents = list(/datum/reagent/colorful_reagent/crayonpowder/invisible, /datum/reagent/colorful_reagent/crayonpowder/white)
return var/color = pick(subtypesof(/datum/reagent/colorful_reagent/crayonpowder) - banned_reagents)
switch(A.stage) if(M.reagents.total_volume <= (M.reagents.maximum_volume/10)) // no flooding humans with 1000 units of colorful reagent
if(5) M.reagents.add_reagent(color, 5)
H.skin_tone = "african2" else
H.update_body(0) if (prob(50)) // spam
else M.visible_message("<span class='warning'>[M] looks rather vibrant...</span>", "<span class='notice'>The colors, man, the colors...</span>")
H.visible_message("<span class='warning'>[H] looks a bit dark...</span>", "<span class='notice'>Your skin suddenly appears darker...</span>")
@@ -38,10 +38,11 @@
return return
CRASH("We couldn't assign an ID!") CRASH("We couldn't assign an ID!")
// Called when processing of the advance disease that holds this symptom infects a host and upon each Refresh() of that advance disease. // Called when processing of the advance disease, which holds this symptom, starts.
/datum/symptom/proc/Start(datum/disease/advance/A) /datum/symptom/proc/Start(datum/disease/advance/A)
if(neutered) if(neutered)
return FALSE return FALSE
next_activation = world.time + rand(symptom_delay_min * 10, symptom_delay_max * 10) //so it doesn't instantly activate on infection
return TRUE return TRUE
// Called when the advance disease is going to be deleted or when the advance disease stops processing. // Called when the advance disease is going to be deleted or when the advance disease stops processing.
@@ -59,7 +60,7 @@
next_activation = world.time + rand(symptom_delay_min * 10, symptom_delay_max * 10) next_activation = world.time + rand(symptom_delay_min * 10, symptom_delay_max * 10)
return TRUE return TRUE
/datum/symptom/proc/on_stage_change(datum/disease/advance/A) /datum/symptom/proc/on_stage_change(new_stage, datum/disease/advance/A)
if(neutered) if(neutered)
return FALSE return FALSE
return TRUE return TRUE
+3 -5
View File
@@ -93,7 +93,7 @@
lefthand_file = left_hand lefthand_file = left_hand
if(right_hand) if(right_hand)
righthand_file = right_hand righthand_file = right_hand
slot_flags = slots slot_flags = slots
/obj/item/clothing/head/mob_holder/proc/assimilate(mob/living/target) /obj/item/clothing/head/mob_holder/proc/assimilate(mob/living/target)
target.setDir(SOUTH) target.setDir(SOUTH)
@@ -114,16 +114,14 @@
w_class = WEIGHT_CLASS_NORMAL w_class = WEIGHT_CLASS_NORMAL
if(MOB_SIZE_LARGE) if(MOB_SIZE_LARGE)
w_class = WEIGHT_CLASS_HUGE w_class = WEIGHT_CLASS_HUGE
RegisterSignal(src, COMSIG_CLICK_SHIFT, .proc/examine_held_mob)
/obj/item/clothing/head/mob_holder/Destroy() /obj/item/clothing/head/mob_holder/Destroy()
if(held_mob) if(held_mob)
release() release()
return ..() return ..()
/obj/item/clothing/head/mob_holder/proc/examine_held_mob(datum/source, mob/user) /obj/item/clothing/head/mob_holder/examine(mob/user)
held_mob.ShiftClick(user) return held_mob?.examine(user) || ..()
return COMPONENT_DENY_EXAMINATE
/obj/item/clothing/head/mob_holder/Exited(atom/movable/AM, atom/newloc) /obj/item/clothing/head/mob_holder/Exited(atom/movable/AM, atom/newloc)
. = ..() . = ..()
+21
View File
@@ -0,0 +1,21 @@
/// Just for marking when someone's swimming.
/datum/element/swimming
element_flags = ELEMENT_DETACH
/datum/element/swimming/Attach(datum/target)
if((. = ..()) == ELEMENT_INCOMPATIBLE)
return
if(!isliving(target))
return ELEMENT_INCOMPATIBLE
RegisterSignal(target, COMSIG_MOVABLE_MOVED, .proc/check_valid)
ADD_TRAIT(target, TRAIT_SWIMMING, TRAIT_SWIMMING) //seriously there's only one way to get this
/datum/element/swimming/Detach(datum/target)
. = ..()
UnregisterSignal(target, COMSIG_MOVABLE_MOVED)
REMOVE_TRAIT(target, TRAIT_SWIMMING, TRAIT_SWIMMING)
/datum/element/swimming/proc/check_valid(datum/source)
var/mob/living/L = source
if(!istype(L.loc, /turf/open/pool))
source.RemoveElement(/datum/element/swimming)
+5 -1
View File
@@ -61,7 +61,6 @@
var/late_joiner = FALSE var/late_joiner = FALSE
var/force_escaped = FALSE // Set by Into The Sunset command of the shuttle manipulator var/force_escaped = FALSE // Set by Into The Sunset command of the shuttle manipulator
var/list/learned_recipes //List of learned recipe TYPES. var/list/learned_recipes //List of learned recipe TYPES.
/datum/mind/New(var/key) /datum/mind/New(var/key)
@@ -715,6 +714,11 @@
if(G) if(G)
G.reenter_corpse() G.reenter_corpse()
/// Sets our can_hijack to the fastest speed our antag datums allow.
/datum/mind/proc/get_hijack_speed()
. = 0
for(var/datum/antagonist/A in antag_datums)
. = max(., A.hijack_speed())
/datum/mind/proc/has_objective(objective_type) /datum/mind/proc/has_objective(objective_type)
for(var/datum/antagonist/A in antag_datums) for(var/datum/antagonist/A in antag_datums)
+4
View File
@@ -1367,3 +1367,7 @@ NOTE: there are two lists of areas in the end of this file: centcom and station
/area/tcommsat/lounge /area/tcommsat/lounge
name = "Telecommunications Satellite Lounge" name = "Telecommunications Satellite Lounge"
icon_state = "tcomsatlounge" icon_state = "tcomsatlounge"
/area/crew_quarters/fitness/pool
name = "Pool Area"
icon_state = "pool"
@@ -279,7 +279,6 @@
internals_req_access = list(ACCESS_SYNDICATE) internals_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)
..() ..()
@@ -57,7 +57,8 @@ Property weights are:
mean += 2.5 mean += 2.5
if(CHAOS_MAX) if(CHAOS_MAX)
mean += 5 mean += 5
GLOB.dynamic_curve_centre += (mean/voters) if(voters)
GLOB.dynamic_curve_centre += (mean/voters)
GLOB.dynamic_forced_threat_level = forced_threat_level GLOB.dynamic_forced_threat_level = forced_threat_level
/datum/dynamic_storyteller/proc/get_midround_cooldown() /datum/dynamic_storyteller/proc/get_midround_cooldown()
+5 -3
View File
@@ -314,9 +314,11 @@ GLOBAL_LIST_EMPTY(objectives)
/datum/objective/hijack /datum/objective/hijack
name = "hijack" name = "hijack"
explanation_text = "Hijack the shuttle to ensure no loyalist Nanotrasen crew escape alive and out of custody." explanation_text = "Hijack the emergency shuttle by hacking its navigational protocols through the control console (alt click emergency shuttle console)."
team_explanation_text = "Hijack the shuttle to ensure no loyalist Nanotrasen crew escape alive and out of custody. Leave no team member behind." team_explanation_text = "Hijack the emergency shuttle by hacking its navigational protocols through the control console (alt click emergency shuttle console). Leave no team member behind."
martyr_compatible = 0 //Technically you won't get both anyway. martyr_compatible = 0 //Technically you won't get both anyway.
/// Overrides the hijack speed of any antagonist datum it is on ONLY, no other datums are impacted.
var/hijack_speed_override = 1
/datum/objective/hijack/check_completion() // Requires all owners to escape. /datum/objective/hijack/check_completion() // Requires all owners to escape.
if(SSshuttle.emergency.mode != SHUTTLE_ENDGAME) if(SSshuttle.emergency.mode != SHUTTLE_ENDGAME)
@@ -1096,7 +1098,7 @@ GLOBAL_LIST_EMPTY(possible_sabotages)
var/approved_targets = list() var/approved_targets = list()
check_sabotages: check_sabotages:
for(var/datum/sabotage_objective/possible_sabotage in GLOB.possible_sabotages) for(var/datum/sabotage_objective/possible_sabotage in GLOB.possible_sabotages)
if(!is_unique_objective(possible_sabotage.sabotage_type) || possible_sabotage.check_conditions()) if(!is_unique_objective(possible_sabotage.sabotage_type) || possible_sabotage.check_conditions() || !possible_sabotage.can_run())
continue continue
for(var/datum/mind/M in owners) for(var/datum/mind/M in owners)
if(M.current.mind.assigned_role in possible_sabotage.excludefromjob) if(M.current.mind.assigned_role in possible_sabotage.excludefromjob)
@@ -12,6 +12,9 @@
/datum/sabotage_objective/proc/check_conditions() /datum/sabotage_objective/proc/check_conditions()
return TRUE return TRUE
/datum/sabotage_objective/proc/can_run()
return TRUE
/datum/sabotage_objective/processing /datum/sabotage_objective/processing
var/won = FALSE var/won = FALSE
@@ -79,6 +82,9 @@
won = max(1-((S.get_integrity()-50)/50),won) won = max(1-((S.get_integrity()-50)/50),won)
return FALSE return FALSE
/datum/sabotage_objective/processing/supermatter/can_run()
return (locate(/obj/machinery/power/supermatter_crystal) in GLOB.machines)
/datum/sabotage_objective/station_integrity /datum/sabotage_objective/station_integrity
name = "Make sure the station is at less than 80% integrity by the end. Smash walls, windows etc. to reach this goal." name = "Make sure the station is at less than 80% integrity by the end. Smash walls, windows etc. to reach this goal."
sabotage_type = "integrity" sabotage_type = "integrity"
+1 -1
View File
@@ -264,7 +264,7 @@
if(blood_id) if(blood_id)
data["occupant"]["blood"] = list() // We can start populating this list. data["occupant"]["blood"] = list() // We can start populating this list.
var/blood_type = C.dna.blood_type var/blood_type = C.dna.blood_type
if(blood_id != "blood") // special blood substance if(!(blood_id in GLOB.blood_reagent_types)) // special blood substance
var/datum/reagent/R = GLOB.chemical_reagents_list[blood_id] var/datum/reagent/R = GLOB.chemical_reagents_list[blood_id]
if(R) if(R)
blood_type = R.name blood_type = R.name
+8 -8
View File
@@ -274,20 +274,20 @@
return TRUE return TRUE
/obj/machinery/bloodbankgen/proc/detachinput() /obj/machinery/bloodbankgen/proc/detachinput(mob/user)
if(bag) if(bag)
bag.forceMove(drop_location()) bag.forceMove(drop_location())
if(usr && Adjacent(usr) && !issiliconoradminghost(usr)) if(user && Adjacent(usr) && user.can_hold_items())
usr.put_in_hands(bag) user.put_in_hands(bag)
bag = null bag = null
draining = null draining = null
update_icon() update_icon()
/obj/machinery/bloodbankgen/proc/detachoutput() /obj/machinery/bloodbankgen/proc/detachoutput(mob/user)
if(outbag) if(outbag)
outbag.forceMove(drop_location()) outbag.forceMove(drop_location())
if(usr && Adjacent(usr) && !issiliconoradminghost(usr)) if(user && Adjacent(user) && user.can_hold_items())
usr.put_in_hands(outbag) user.put_in_hands(outbag)
outbag = null outbag = null
filling = null filling = null
update_icon() update_icon()
@@ -325,12 +325,12 @@
activateinput() activateinput()
else if(href_list["detachinput"]) else if(href_list["detachinput"])
detachinput() detachinput(usr)
else if(href_list["activateoutput"]) else if(href_list["activateoutput"])
activateoutput() activateoutput()
else if(href_list["detachoutput"]) else if(href_list["detachoutput"])
detachoutput() detachoutput(usr)
updateUsrDialog() updateUsrDialog()
@@ -72,7 +72,7 @@
playsound(src, 'sound/machines/terminal_off.ogg', 25, 0) playsound(src, 'sound/machines/terminal_off.ogg', 25, 0)
/obj/machinery/computer/camera_advanced/check_eye(mob/user) /obj/machinery/computer/camera_advanced/check_eye(mob/user)
if( (stat & (NOPOWER|BROKEN)) || (!Adjacent(user) && !user.has_unlimited_silicon_privilege) || user.eye_blind || user.incapacitated() ) if( (stat & (NOPOWER|BROKEN)) || (!Adjacent(user) && hasSiliconAccessInArea(user)) || user.eye_blind || user.incapacitated() )
user.unset_machine() user.unset_machine()
/obj/machinery/computer/camera_advanced/Destroy() /obj/machinery/computer/camera_advanced/Destroy()
+1 -1
View File
@@ -116,7 +116,7 @@
playsound(src, 'sound/machines/terminal_prompt_confirm.ogg', 50, 0) playsound(src, 'sound/machines/terminal_prompt_confirm.ogg', 50, 0)
I.forceMove(drop_location()) I.forceMove(drop_location())
if(user && Adjacent(user) && !issiliconoradminghost(user)) if(user && Adjacent(user) && user.can_hold_items())
user.put_in_hands(I) user.put_in_hands(I)
frozen_items -= I frozen_items -= I
updateUsrDialog() updateUsrDialog()
+1 -1
View File
@@ -184,7 +184,7 @@
if(usr.incapacitated()) if(usr.incapacitated())
return return
if(beaker) if(beaker)
if(usr && Adjacent(usr) && !issiliconoradminghost(usr)) if(usr && Adjacent(usr) && usr.can_hold_items())
if(!usr.put_in_hands(beaker)) if(!usr.put_in_hands(beaker))
beaker.forceMove(drop_location()) beaker.forceMove(drop_location())
beaker = null beaker = null
+5 -5
View File
@@ -3,9 +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() /obj/mecha/combat/proc/max_ammo() //Max the ammo stored for Nuke Ops mechs, or anyone else that calls this
. = ..() for(var/obj/item/I in equipment)
if(spawn_tracked) if(istype(I, /obj/item/mecha_parts/mecha_equipment/weapon/ballistic/))
trackers += new /obj/item/mecha_parts/mecha_tracking(src) var/obj/item/mecha_parts/mecha_equipment/weapon/ballistic/gun = I
gun.projectiles_cache = gun.projectiles_cache_max
+1 -1
View File
@@ -30,7 +30,6 @@
internals_req_access = list(ACCESS_SYNDICATE) internals_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()
. = ..() . = ..()
@@ -42,6 +41,7 @@
ME.attach(src) ME.attach(src)
ME = new /obj/item/mecha_parts/mecha_equipment/tesla_energy_relay ME = new /obj/item/mecha_parts/mecha_equipment/tesla_energy_relay
ME.attach(src) ME.attach(src)
max_ammo()
/obj/mecha/combat/gygax/dark/add_cell(obj/item/stock_parts/cell/C=null) /obj/mecha/combat/gygax/dark/add_cell(obj/item/stock_parts/cell/C=null)
if(C) if(C)
+3 -1
View File
@@ -17,7 +17,6 @@
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)
..() ..()
@@ -41,6 +40,7 @@
ME.attach(src) ME.attach(src)
ME = new /obj/item/mecha_parts/mecha_equipment/antiproj_armor_booster(src) ME = new /obj/item/mecha_parts/mecha_equipment/antiproj_armor_booster(src)
ME.attach(src) ME.attach(src)
max_ammo()
/obj/mecha/combat/marauder/seraph /obj/mecha/combat/marauder/seraph
desc = "Heavy-duty, command-type exosuit. This is a custom model, utilized only by high-ranking military personnel." desc = "Heavy-duty, command-type exosuit. This is a custom model, utilized only by high-ranking military personnel."
@@ -68,6 +68,7 @@
ME.attach(src) ME.attach(src)
ME = new /obj/item/mecha_parts/mecha_equipment/antiproj_armor_booster(src) ME = new /obj/item/mecha_parts/mecha_equipment/antiproj_armor_booster(src)
ME.attach(src) ME.attach(src)
max_ammo()
/obj/mecha/combat/marauder/mauler /obj/mecha/combat/marauder/mauler
desc = "Heavy-duty, combat exosuit, developed off of the existing Marauder model." desc = "Heavy-duty, combat exosuit, developed off of the existing Marauder model."
@@ -90,5 +91,6 @@
ME.attach(src) ME.attach(src)
ME = new /obj/item/mecha_parts/mecha_equipment/antiproj_armor_booster(src) ME = new /obj/item/mecha_parts/mecha_equipment/antiproj_armor_booster(src)
ME.attach(src) ME.attach(src)
max_ammo()
-1
View File
@@ -15,7 +15,6 @@
internals_req_access = list() internals_req_access = list()
add_req_access = 0 add_req_access = 0
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)
-1
View File
@@ -19,7 +19,6 @@
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()
. = ..() . = ..()
@@ -34,6 +34,19 @@
return return
if(!cargo_holder) if(!cargo_holder)
return return
if(ismecha(target))
var/obj/mecha/M = target
var/have_ammo
for(var/obj/item/mecha_ammo/box in cargo_holder.cargo)
if(istype(box, /obj/item/mecha_ammo) && box.rounds)
have_ammo = TRUE
if(M.ammo_resupply(box, chassis.occupant, TRUE))
return
if(have_ammo)
to_chat(chassis.occupant, "No further supplies can be provided to [M].")
else
to_chat(chassis.occupant, "No providable supplies found in cargo hold")
return
if(isobj(target)) if(isobj(target))
var/obj/O = target var/obj/O = target
if(!O.anchored) if(!O.anchored)
@@ -0,0 +1,94 @@
/obj/item/mecha_ammo
name = "generic ammo box"
desc = "A box of ammo for an unknown weapon."
w_class = WEIGHT_CLASS_BULKY
icon = 'icons/mecha/mecha_ammo.dmi'
icon_state = "empty"
lefthand_file = 'icons/mob/inhands/equipment/medical_lefthand.dmi'
righthand_file = 'icons/mob/inhands/equipment/medical_righthand.dmi'
var/rounds = 0
var/round_term = "round"
var/direct_load //For weapons where we re-load the weapon itself rather than adding to the ammo storage.
var/load_audio = "sound/weapons/gun_magazine_insert_empty_1.ogg"
var/ammo_type
/obj/item/mecha_ammo/proc/update_name()
if(!rounds)
name = "empty ammo box"
desc = "An exosuit ammuniton box that has since been emptied. Please recycle."
icon_state = "empty"
/obj/item/mecha_ammo/attack_self(mob/user)
..()
if(rounds)
to_chat(user, "<span class='warning'>You cannot flatten the ammo box until it's empty!</span>")
return
to_chat(user, "<span class='notice'>You fold [src] flat.</span>")
var/I = new /obj/item/stack/sheet/metal(user.loc)
qdel(src)
user.put_in_hands(I)
/obj/item/mecha_ammo/examine(mob/user)
. = ..()
if(rounds)
. += "There [rounds > 1?"are":"is"] [rounds] [round_term][rounds > 1?"s":""] left."
/obj/item/mecha_ammo/incendiary
name = "incendiary ammo"
desc = "A box of incendiary ammunition for use with exosuit weapons."
icon_state = "incendiary"
rounds = 24
ammo_type = "incendiary"
/obj/item/mecha_ammo/scattershot
name = "scattershot ammo"
desc = "A box of scaled-up buckshot, for use in exosuit shotguns."
icon_state = "scattershot"
rounds = 40
ammo_type = "scattershot"
/obj/item/mecha_ammo/lmg
name = "machine gun ammo"
desc = "A box of linked ammunition, designed for the Ultra AC 2 exosuit weapon."
icon_state = "lmg"
rounds = 300
ammo_type = "lmg"
/obj/item/mecha_ammo/missiles_br
name = "breaching missiles"
desc = "A box of large missiles, ready for loading into a BRM-6 exosuit missile rack."
icon_state = "missile_br"
rounds = 6
round_term = "missile"
direct_load = TRUE
load_audio = "sound/weapons/bulletinsert.ogg"
ammo_type = "missiles_br"
/obj/item/mecha_ammo/missiles_he
name = "anti-armor missiles"
desc = "A box of large missiles, ready for loading into an SRM-8 exosuit missile rack."
icon_state = "missile_he"
rounds = 8
round_term = "missile"
direct_load = TRUE
load_audio = "sound/weapons/bulletinsert.ogg"
ammo_type = "missiles_he"
/obj/item/mecha_ammo/flashbang
name = "launchable flashbangs"
desc = "A box of smooth flashbangs, for use with a large exosuit launcher. Cannot be primed by hand."
icon_state = "flashbang"
rounds = 6
round_term = "grenade"
ammo_type = "flashbang"
/obj/item/mecha_ammo/clusterbang
name = "launchable flashbang clusters"
desc = "A box of clustered flashbangs, for use with a specialized exosuit cluster launcher. Cannot be primed by hand."
icon_state = "clusterbang"
rounds = 3
round_term = "cluster"
direct_load = TRUE
ammo_type = "clusterbang"
+62 -16
View File
@@ -196,7 +196,11 @@
name = "general ballistic weapon" name = "general ballistic weapon"
fire_sound = 'sound/weapons/gunshot.ogg' fire_sound = 'sound/weapons/gunshot.ogg'
var/projectiles var/projectiles
var/projectiles_cache //ammo to be loaded in, if possible.
var/projectiles_cache_max
var/projectile_energy_cost var/projectile_energy_cost
var/disabledreload //For weapons with no cache (like the rockets) which are reloaded by hand
var/ammo_type
/obj/item/mecha_parts/mecha_equipment/weapon/ballistic/get_shot_amount() /obj/item/mecha_parts/mecha_equipment/weapon/ballistic/get_shot_amount()
return min(projectiles, projectiles_per_shot) return min(projectiles, projectiles_per_shot)
@@ -209,19 +213,31 @@
return 1 return 1
/obj/item/mecha_parts/mecha_equipment/weapon/ballistic/get_equip_info() /obj/item/mecha_parts/mecha_equipment/weapon/ballistic/get_equip_info()
return "[..()] \[[src.projectiles]\][(src.projectiles < initial(src.projectiles))?" - <a href='?src=[REF(src)];rearm=1'>Rearm</a>":null]" return "[..()] \[[src.projectiles][projectiles_cache_max &&!projectile_energy_cost?"/[projectiles_cache]":""]\][!disabledreload &&(src.projectiles < initial(src.projectiles))?" - <a href='?src=[REF(src)];rearm=1'>Rearm</a>":null]"
/obj/item/mecha_parts/mecha_equipment/weapon/ballistic/rearm() /obj/item/mecha_parts/mecha_equipment/weapon/ballistic/rearm()
if(projectiles < initial(projectiles)) if(projectiles < initial(projectiles))
var/projectiles_to_add = initial(projectiles) - projectiles var/projectiles_to_add = initial(projectiles) - projectiles
while(chassis.get_charge() >= projectile_energy_cost && projectiles_to_add)
projectiles++ if(projectile_energy_cost)
projectiles_to_add-- while(chassis.get_charge() >= projectile_energy_cost && projectiles_to_add)
chassis.use_power(projectile_energy_cost) projectiles++
send_byjax(chassis.occupant,"exosuit.browser","[REF(src)]",src.get_equip_info()) projectiles_to_add--
mecha_log_message("Rearmed [src.name].") chassis.use_power(projectile_energy_cost)
return 1
else
if(!projectiles_cache)
return FALSE
if(projectiles_to_add <= projectiles_cache)
projectiles = projectiles + projectiles_to_add
projectiles_cache = projectiles_cache - projectiles_to_add
else
projectiles = projectiles + projectiles_cache
projectiles_cache = 0
send_byjax(chassis.occupant,"exosuit.browser","[REF(src)]",src.get_equip_info())
return TRUE
/obj/item/mecha_parts/mecha_equipment/weapon/ballistic/needs_rearm() /obj/item/mecha_parts/mecha_equipment/weapon/ballistic/needs_rearm()
@@ -249,8 +265,10 @@
equip_cooldown = 10 equip_cooldown = 10
projectile = /obj/item/projectile/bullet/incendiary/fnx99 projectile = /obj/item/projectile/bullet/incendiary/fnx99
projectiles = 24 projectiles = 24
projectile_energy_cost = 15 projectiles_cache = 24
projectiles_cache_max = 96
harmful = TRUE harmful = TRUE
ammo_type = "incendiary"
/obj/item/mecha_parts/mecha_equipment/weapon/ballistic/silenced /obj/item/mecha_parts/mecha_equipment/weapon/ballistic/silenced
name = "\improper S.H.H. \"Quietus\" Carbine" name = "\improper S.H.H. \"Quietus\" Carbine"
@@ -270,10 +288,12 @@
equip_cooldown = 20 equip_cooldown = 20
projectile = /obj/item/projectile/bullet/scattershot projectile = /obj/item/projectile/bullet/scattershot
projectiles = 40 projectiles = 40
projectile_energy_cost = 25 projectiles_cache = 40
projectiles_cache_max = 160
projectiles_per_shot = 4 projectiles_per_shot = 4
variance = 25 variance = 25
harmful = TRUE harmful = TRUE
ammo_type = "scattershot"
/obj/item/mecha_parts/mecha_equipment/weapon/ballistic/seedscatter /obj/item/mecha_parts/mecha_equipment/weapon/ballistic/seedscatter
name = "\improper Melon Seed \"Scattershot\"" name = "\improper Melon Seed \"Scattershot\""
@@ -282,10 +302,12 @@
equip_cooldown = 20 equip_cooldown = 20
projectile = /obj/item/projectile/bullet/seed projectile = /obj/item/projectile/bullet/seed
projectiles = 20 projectiles = 20
projectile_energy_cost = 25 projectiles_cache = 20
projectiles_cache_max = 160
projectiles_per_shot = 10 projectiles_per_shot = 10
variance = 25 variance = 25
harmful = TRUE harmful = TRUE
ammo_type = "scattershot"
/obj/item/mecha_parts/mecha_equipment/weapon/ballistic/lmg /obj/item/mecha_parts/mecha_equipment/weapon/ballistic/lmg
name = "\improper Ultra AC 2" name = "\improper Ultra AC 2"
@@ -294,23 +316,42 @@
equip_cooldown = 10 equip_cooldown = 10
projectile = /obj/item/projectile/bullet/lmg projectile = /obj/item/projectile/bullet/lmg
projectiles = 300 projectiles = 300
projectile_energy_cost = 20 projectiles_cache = 300
projectiles_cache_max = 1200
projectiles_per_shot = 3 projectiles_per_shot = 3
variance = 6 variance = 6
randomspread = 1 randomspread = 1
projectile_delay = 2 projectile_delay = 2
harmful = TRUE harmful = TRUE
ammo_type = "lmg"
/obj/item/mecha_parts/mecha_equipment/weapon/ballistic/missile_rack /obj/item/mecha_parts/mecha_equipment/weapon/ballistic/missile_rack
name = "\improper SRM-8 missile rack" name = "\improper SRM-8 missile rack"
desc = "A weapon for combat exosuits. Shoots light explosive missiles." desc = "A weapon for combat exosuits. Launches light explosive missiles."
icon_state = "mecha_missilerack" icon_state = "mecha_missilerack"
projectile = /obj/item/projectile/bullet/a84mm_he projectile = /obj/item/projectile/bullet/a84mm_he
fire_sound = 'sound/weapons/grenadelaunch.ogg' fire_sound = 'sound/weapons/grenadelaunch.ogg'
projectiles = 8 projectiles = 8
projectile_energy_cost = 1000 projectiles_cache = 0
projectiles_cache_max = 0
disabledreload = TRUE
equip_cooldown = 60 equip_cooldown = 60
harmful = TRUE harmful = TRUE
ammo_type = "missiles_he"
/obj/item/mecha_parts/mecha_equipment/weapon/ballistic/missile_rack/breaching
name = "\improper BRM-6 missile rack"
desc = "A weapon for combat exosuits. Launches low-explosive breaching missiles designed to explode only when striking a sturdy target."
icon_state = "mecha_missilerack_six"
projectile = /obj/item/projectile/bullet/a84mm_br
fire_sound = 'sound/weapons/grenadelaunch.ogg'
projectiles = 6
projectiles_cache = 0
projectiles_cache_max = 0
disabledreload = TRUE
equip_cooldown = 60
harmful = TRUE
ammo_type = "missiles_br"
/obj/item/mecha_parts/mecha_equipment/weapon/ballistic/launcher /obj/item/mecha_parts/mecha_equipment/weapon/ballistic/launcher
@@ -341,10 +382,12 @@
projectile = /obj/item/grenade/flashbang projectile = /obj/item/grenade/flashbang
fire_sound = 'sound/weapons/grenadelaunch.ogg' fire_sound = 'sound/weapons/grenadelaunch.ogg'
projectiles = 6 projectiles = 6
projectiles_cache = 6
projectiles_cache_max = 24
missile_speed = 1.5 missile_speed = 1.5
projectile_energy_cost = 800
equip_cooldown = 60 equip_cooldown = 60
var/det_time = 20 var/det_time = 20
ammo_type = "flashbang"
/obj/item/mecha_parts/mecha_equipment/weapon/ballistic/launcher/flashbang/proj_init(var/obj/item/grenade/flashbang/F) /obj/item/mecha_parts/mecha_equipment/weapon/ballistic/launcher/flashbang/proj_init(var/obj/item/grenade/flashbang/F)
var/turf/T = get_turf(src) var/turf/T = get_turf(src)
@@ -356,9 +399,12 @@
name = "\improper SOB-3 grenade launcher" name = "\improper SOB-3 grenade launcher"
desc = "A weapon for combat exosuits. Launches primed clusterbangs. You monster." desc = "A weapon for combat exosuits. Launches primed clusterbangs. You monster."
projectiles = 3 projectiles = 3
projectiles_cache = 0
projectiles_cache_max = 0
disabledreload = TRUE
projectile = /obj/item/grenade/clusterbuster projectile = /obj/item/grenade/clusterbuster
projectile_energy_cost = 1600 //getting off cheap seeing as this is 3 times the flashbangs held in the grenade launcher.
equip_cooldown = 90 equip_cooldown = 90
ammo_type = "clusterbang"
/obj/item/mecha_parts/mecha_equipment/weapon/ballistic/launcher/banana_mortar /obj/item/mecha_parts/mecha_equipment/weapon/ballistic/launcher/banana_mortar
name = "banana mortar" name = "banana mortar"
+1
View File
@@ -29,6 +29,7 @@
"H.O.N.K", "H.O.N.K",
"Phazon", "Phazon",
"Exosuit Equipment", "Exosuit Equipment",
"Exosuit Ammunition",
"Cyborg Upgrade Modules", "Cyborg Upgrade Modules",
"Misc" "Misc"
) )
+50
View File
@@ -1070,3 +1070,53 @@
if(occupant_sight_flags) if(occupant_sight_flags)
if(user == occupant) if(user == occupant)
user.sight |= occupant_sight_flags user.sight |= occupant_sight_flags
///////////////////////
////// Ammo stuff /////
///////////////////////
/obj/mecha/proc/ammo_resupply(var/obj/item/mecha_ammo/A, mob/user,var/fail_chat_override = FALSE)
if(!A.rounds)
if(!fail_chat_override)
to_chat(user, "<span class='warning'>This box of ammo is empty!</span>")
return FALSE
var/ammo_needed
var/found_gun
for(var/obj/item/mecha_parts/mecha_equipment/weapon/ballistic/gun in equipment)
ammo_needed = 0
if(istype(gun, /obj/item/mecha_parts/mecha_equipment/weapon/ballistic) && gun.ammo_type == A.ammo_type)
found_gun = TRUE
if(A.direct_load)
ammo_needed = initial(gun.projectiles) - gun.projectiles
else
ammo_needed = gun.projectiles_cache_max - gun.projectiles_cache
if(ammo_needed)
if(ammo_needed < A.rounds)
if(A.direct_load)
gun.projectiles = gun.projectiles + ammo_needed
else
gun.projectiles_cache = gun.projectiles_cache + ammo_needed
playsound(get_turf(user),A.load_audio,50,1)
to_chat(user, "<span class='notice'>You add [ammo_needed] [A.round_term][ammo_needed > 1?"s":""] to the [gun.name]</span>")
A.rounds = A.rounds - ammo_needed
A.update_name()
return TRUE
else
if(A.direct_load)
gun.projectiles = gun.projectiles + A.rounds
else
gun.projectiles_cache = gun.projectiles_cache + A.rounds
playsound(get_turf(user),A.load_audio,50,1)
to_chat(user, "<span class='notice'>You add [A.rounds] [A.round_term][A.rounds > 1?"s":""] to the [gun.name]</span>")
A.rounds = 0
A.update_name()
return TRUE
if(!fail_chat_override)
if(found_gun)
to_chat(user, "<span class='notice'>You can't fit any more ammo of this type!</span>")
else
to_chat(user, "<span class='notice'>None of the equipment on this exosuit can use this ammo!</span>")
return FALSE
+4
View File
@@ -172,6 +172,10 @@
to_chat(user, "[src]-[W] interface initialization failed.") to_chat(user, "[src]-[W] interface initialization failed.")
return return
if(istype(W, /obj/item/mecha_ammo))
ammo_resupply(W, user)
return
if(istype(W, /obj/item/mecha_parts/mecha_equipment)) if(istype(W, /obj/item/mecha_parts/mecha_equipment))
var/obj/item/mecha_parts/mecha_equipment/E = W var/obj/item/mecha_parts/mecha_equipment/E = W
spawn() spawn()
+1 -1
View File
@@ -369,7 +369,7 @@ AI MODULES
if(!targName) if(!targName)
return return
subject = targName subject = targName
laws = list("You may not injure a [subject] or, through inaction, allow a [subject] to come to harm.",\ laws = list("You may not injure a [subject] or cause one to come to harm.",\
"You must obey orders given to you by [subject]s, except where such orders would conflict with the First Law.",\ "You must obey orders given to you by [subject]s, except where such orders would conflict with the First Law.",\
"You must protect your own existence as long as such does not conflict with the First or Second Law.") "You must protect your own existence as long as such does not conflict with the First or Second Law.")
..() ..()
+1 -1
View File
@@ -196,7 +196,7 @@ RLD
/obj/item/construction/rcd/verb/change_airlock_access(mob/user) /obj/item/construction/rcd/verb/change_airlock_access(mob/user)
if (!ishuman(user) && !user.has_unlimited_silicon_privilege) if (!ishuman(user) && !user.silicon_privileges)
return return
var/t1 = "" var/t1 = ""
+1 -1
View File
@@ -20,7 +20,7 @@
throw_range = 14 throw_range = 14
w_class = WEIGHT_CLASS_SMALL w_class = WEIGHT_CLASS_SMALL
/obj/item/toy/tennis/pre_altattackby(atom/A, mob/living/user, params) //checks if it can do right click memes /obj/item/toy/tennis/alt_pre_attack(atom/A, mob/living/user, params) //checks if it can do right click memes
altafterattack(A, user, TRUE, params) altafterattack(A, user, TRUE, params)
return TRUE return TRUE
+1 -16
View File
@@ -431,26 +431,11 @@
if((!req_defib && grab_ghost) || (req_defib && defib.grab_ghost)) if((!req_defib && grab_ghost) || (req_defib && defib.grab_ghost))
H.notify_ghost_cloning("Your heart is being defibrillated!") H.notify_ghost_cloning("Your heart is being defibrillated!")
H.grab_ghost() // Shove them back in their body. H.grab_ghost() // Shove them back in their body.
else if(can_defib(H)) else if(H.can_defib())
H.notify_ghost_cloning("Your heart is being defibrillated. Re-enter your corpse if you want to be revived!", source = src) H.notify_ghost_cloning("Your heart is being defibrillated. Re-enter your corpse if you want to be revived!", source = src)
do_help(H, user) do_help(H, user)
/obj/item/twohanded/shockpaddles/proc/can_defib(mob/living/carbon/H) //Our code here is different than tg, if it breaks in testing; BUG_PROBABLE_CAUSE
var/obj/item/organ/heart = H.getorgan(/obj/item/organ/heart)
if(H.suiciding || H.hellbound || HAS_TRAIT(H, TRAIT_HUSK))
return
if((world.time - H.timeofdeath) > tlimit)
return
if((H.getBruteLoss() >= MAX_REVIVE_BRUTE_DAMAGE) || (H.getFireLoss() >= MAX_REVIVE_FIRE_DAMAGE))
return
if(!heart || (heart.organ_flags & ORGAN_FAILING))
return
var/obj/item/organ/brain/BR = H.getorgan(/obj/item/organ/brain)
if(QDELETED(BR) || BR.brain_death || (BR.organ_flags & ORGAN_FAILING) || H.suiciding)
return
return TRUE
/obj/item/twohanded/shockpaddles/proc/shock_touching(dmg, mob/H) /obj/item/twohanded/shockpaddles/proc/shock_touching(dmg, mob/H)
if(!H.pulledby || !isliving(H.pulledby)) if(!H.pulledby || !isliving(H.pulledby))
return return
@@ -49,6 +49,10 @@
return return
if(istype(target, /obj/structure/falsewall)) if(istype(target, /obj/structure/falsewall))
return return
if(target.alpha != 255)
return
if(target.invisibility != 0)
return
if(iseffect(target)) if(iseffect(target))
if(!(istype(target, /obj/effect/decal))) //be a footprint if(!(istype(target, /obj/effect/decal))) //be a footprint
return return
+7 -1
View File
@@ -490,7 +490,13 @@
oneuse = FALSE oneuse = FALSE
remarks = list("Looks like these would sell much better in a plasma fire...", "Using glass bowls rather then cones?", "Mixing soda and ice-cream?", "Tall glasses with of liquids and solids...", "Just add a bit of icecream and cherry on top?") remarks = list("Looks like these would sell much better in a plasma fire...", "Using glass bowls rather then cones?", "Mixing soda and ice-cream?", "Tall glasses with of liquids and solids...", "Just add a bit of icecream and cherry on top?")
//Later content when I have free time - Trilby Date:24-Aug-2019 /obj/item/book/granter/crafting_recipe/bone_bow //Bow crafting for non-ashwalkers
name = "Sandstone manual on bows"
desc = "A standstone slab with everything you need to know for making bows and arrows just like an ashwalker would."
crafting_recipe_types = list(/datum/crafting_recipe/bone_arrow, /datum/crafting_recipe/bone_bow, /datum/crafting_recipe/ashen_arrow, /datum/crafting_recipe/quiver, /datum/crafting_recipe/bow_tablet)
icon_state = "stone_tablet"
oneuse = FALSE
remarks = list("Sticking burning arrows into the sand makes them stronger?", "Breaking the bone apart to get shards, not sharpening the bone.", "Sinew is just like rope?")
/obj/item/book/granter/crafting_recipe/under_the_oven //Illegal cook book /obj/item/book/granter/crafting_recipe/under_the_oven //Illegal cook book
name = "Under The Oven" name = "Under The Oven"
@@ -37,18 +37,18 @@
eye_color = H.eye_color eye_color = H.eye_color
return TRUE return TRUE
/obj/item/implant/hijack/removed(mob/target, silent = FALSE, special = 0) /obj/item/implant/hijack/removed(mob/living/source, silent = FALSE, special = 0)
if(..()) if(..())
REMOVE_TRAIT(target, TRAIT_HIJACKER, "implant") REMOVE_TRAIT(source, TRAIT_HIJACKER, "implant")
for (var/area/area in imp_in.siliconaccessareas) for (var/area/area in source.siliconaccessareas)
imp_in.toggleSiliconAccessArea(area) source.toggleSiliconAccessArea(area)
var/obj/machinery/power/apc/apc = area.get_apc() var/obj/machinery/power/apc/apc = area.get_apc()
if (apc) if (apc)
apc.hijacker = null apc.hijacker = null
apc.set_hijacked_lighting() apc.set_hijacked_lighting()
apc.update_icon() apc.update_icon()
if (ishuman(target)) if (ishuman(source))
var/mob/living/carbon/human/H = target var/mob/living/carbon/human/H = source
H.eye_color = eye_color H.eye_color = eye_color
return TRUE return TRUE
@@ -118,4 +118,4 @@
imp_in.light_range = 0 imp_in.light_range = 0
imp_in.light_color = COLOR_YELLOW imp_in.light_color = COLOR_YELLOW
imp_in.update_light() imp_in.update_light()
return TRUE return TRUE
+1 -1
View File
@@ -259,7 +259,7 @@
light_color = "#37FFF7" light_color = "#37FFF7"
actions_types = list() actions_types = list()
/obj/item/melee/transforming/energy/sword/cx/pre_altattackby(atom/A, mob/living/user, params) //checks if it can do right click memes /obj/item/melee/transforming/energy/sword/cx/alt_pre_attack(atom/A, mob/living/user, params) //checks if it can do right click memes
altafterattack(A, user, TRUE, params) altafterattack(A, user, TRUE, params)
return TRUE return TRUE
@@ -258,6 +258,9 @@ GLOBAL_LIST_INIT(plastitaniumglass_recipes, list(
merge_type = /obj/item/stack/sheet/plastitaniumglass merge_type = /obj/item/stack/sheet/plastitaniumglass
shard_type = /obj/item/shard shard_type = /obj/item/shard
/obj/item/stack/sheet/plastitaniumglass/fifty
amount = 50
/obj/item/stack/sheet/plastitaniumglass/Initialize(mapload, new_amount, merge = TRUE) /obj/item/stack/sheet/plastitaniumglass/Initialize(mapload, new_amount, merge = TRUE)
recipes = GLOB.plastitaniumglass_recipes recipes = GLOB.plastitaniumglass_recipes
return ..() return ..()
@@ -323,6 +323,9 @@ GLOBAL_LIST_INIT(titanium_recipes, list ( \
point_value = 45 point_value = 45
merge_type = /obj/item/stack/sheet/mineral/plastitanium merge_type = /obj/item/stack/sheet/mineral/plastitanium
/obj/item/stack/sheet/mineral/plastitanium/fifty
amount = 50
GLOBAL_LIST_INIT(plastitanium_recipes, list ( \ GLOBAL_LIST_INIT(plastitanium_recipes, list ( \
new/datum/stack_recipe("plastitanium tile", /obj/item/stack/tile/mineral/plastitanium, 1, 4, 20), \ new/datum/stack_recipe("plastitanium tile", /obj/item/stack/tile/mineral/plastitanium, 1, 4, 20), \
)) ))
@@ -376,6 +376,14 @@ GLOBAL_LIST_INIT(cloth_recipes, list ( \
/* /*
* Silk * Silk
*/ */
GLOBAL_LIST_INIT(silk_recipes, list ( \
new/datum/stack_recipe("white jumpsuit", /obj/item/clothing/under/color/white, 4, time = 40), \
new/datum/stack_recipe("white gloves", /obj/item/clothing/gloves/color/white, 2, time = 40), \
null, \
new/datum/stack_recipe("silk string", /obj/item/weaponcrafting/silkstring, 2, time = 40), \
))
/obj/item/stack/sheet/silk /obj/item/stack/sheet/silk
name = "silk" name = "silk"
desc = "A long soft material. This one is just made out of cotton rather then any spiders or wyrms" desc = "A long soft material. This one is just made out of cotton rather then any spiders or wyrms"
@@ -385,14 +393,14 @@ GLOBAL_LIST_INIT(cloth_recipes, list ( \
novariants = TRUE novariants = TRUE
merge_type = /obj/item/stack/sheet/silk merge_type = /obj/item/stack/sheet/silk
//obj/item/stack/sheet/silk/Initialize(mapload, new_amount, merge = TRUE) /obj/item/stack/sheet/silk/Initialize(mapload, new_amount, merge = TRUE)
// recipes = GLOB.silk_recipes recipes = GLOB.silk_recipes
// return ..() return ..()
/* /*
* Durathread * Durathread
*/ */
GLOBAL_LIST_INIT(durathread_recipes, list ( \ GLOBAL_LIST_INIT(durathread_recipes, list ( \
new/datum/stack_recipe("durathread jumpsuit", /obj/item/clothing/under/durathread, 4, time = 40), new/datum/stack_recipe("durathread jumpsuit", /obj/item/clothing/under/durathread, 4, time = 40),
new/datum/stack_recipe("durathread beret", /obj/item/clothing/head/beret/durathread, 2, time = 40), \ new/datum/stack_recipe("durathread beret", /obj/item/clothing/head/beret/durathread, 2, time = 40), \
new/datum/stack_recipe("durathread beanie", /obj/item/clothing/head/beanie/durathread, 2, time = 40), \ new/datum/stack_recipe("durathread beanie", /obj/item/clothing/head/beanie/durathread, 2, time = 40), \
@@ -528,6 +528,31 @@
for(var/i in 1 to 9) for(var/i in 1 to 9)
new /obj/item/ammo_box/magazine/smgm45(src) new /obj/item/ammo_box/magazine/smgm45(src)
/obj/item/storage/backpack/duffelbag/syndie/ammo/dark_gygax
desc = "A large duffel bag, packed to the brim with various exosuit ammo."
/obj/item/storage/backpack/duffelbag/syndie/ammo/dark_gygax/PopulateContents()
new /obj/item/mecha_ammo/incendiary(src)
new /obj/item/mecha_ammo/incendiary(src)
new /obj/item/mecha_ammo/incendiary(src)
new /obj/item/mecha_ammo/flashbang(src)
new /obj/item/mecha_ammo/flashbang(src)
new /obj/item/mecha_ammo/flashbang(src)
/obj/item/storage/backpack/duffelbag/syndie/ammo/mauler
desc = "A large duffel bag, packed to the brim with various exosuit ammo."
/obj/item/storage/backpack/duffelbag/syndie/ammo/mauler/PopulateContents()
new /obj/item/mecha_ammo/lmg(src)
new /obj/item/mecha_ammo/lmg(src)
new /obj/item/mecha_ammo/lmg(src)
new /obj/item/mecha_ammo/scattershot(src)
new /obj/item/mecha_ammo/scattershot(src)
new /obj/item/mecha_ammo/scattershot(src)
new /obj/item/mecha_ammo/missiles_he(src)
new /obj/item/mecha_ammo/missiles_he(src)
new /obj/item/mecha_ammo/missiles_he(src)
/obj/item/storage/backpack/duffelbag/syndie/c20rbundle /obj/item/storage/backpack/duffelbag/syndie/c20rbundle
desc = "A large duffel bag containing a C-20r, some magazines, and a cheap looking suppressor." desc = "A large duffel bag containing a C-20r, some magazines, and a cheap looking suppressor."
+9 -2
View File
@@ -179,17 +179,23 @@
/obj/item/pinpointer/crew /obj/item/pinpointer/crew
)) ))
/obj/item/storage/belt/medical/surgery_belt_adv /obj/item/storage/belt/medical/surgery_belt_adv
name = "surgical supply belt" name = "surgical supply belt"
desc = "A specialized belt designed for holding surgical equipment. It seems to have specific pockets for each and every surgical tool you can think of." desc = "A specialized belt designed for holding surgical equipment. It seems to have specific pockets for each and every surgical tool you can think of."
content_overlays = FALSE content_overlays = FALSE
var/advanced_drapes = FALSE
/obj/item/storage/belt/medical/surgery_belt_adv/PopulateContents() /obj/item/storage/belt/medical/surgery_belt_adv/PopulateContents()
new /obj/item/scalpel/advanced(src) new /obj/item/scalpel/advanced(src)
new /obj/item/retractor/advanced(src) new /obj/item/retractor/advanced(src)
new /obj/item/surgicaldrill/advanced(src) new /obj/item/surgicaldrill/advanced(src)
new /obj/item/surgical_drapes(src) if(advanced_drapes)
new /obj/item/surgical_drapes/advanced(src)
else
new /obj/item/surgical_drapes(src)
/obj/item/storage/belt/medical/surgery_belt_adv/cmo
advanced_drapes = TRUE
/obj/item/storage/belt/security /obj/item/storage/belt/security
name = "security belt" name = "security belt"
@@ -575,6 +581,7 @@
/obj/item/key/janitor, /obj/item/key/janitor,
/obj/item/clothing/gloves, /obj/item/clothing/gloves,
/obj/item/melee/flyswatter, /obj/item/melee/flyswatter,
/obj/item/twohanded/broom,
/obj/item/paint/paint_remover, /obj/item/paint/paint_remover,
/obj/item/assembly/mousetrap, /obj/item/assembly/mousetrap,
/obj/item/screwdriver, /obj/item/screwdriver,
+17 -15
View File
@@ -173,23 +173,25 @@ GLOBAL_LIST_INIT(bibleitemstates, list("bible", "koran", "scrapbook", "bible",
var/unholy2clean = A.reagents.get_reagent_amount(/datum/reagent/fuel/unholywater) var/unholy2clean = A.reagents.get_reagent_amount(/datum/reagent/fuel/unholywater)
A.reagents.del_reagent(/datum/reagent/fuel/unholywater) A.reagents.del_reagent(/datum/reagent/fuel/unholywater)
A.reagents.add_reagent(/datum/reagent/water/holywater,unholy2clean) A.reagents.add_reagent(/datum/reagent/water/holywater,unholy2clean)
if(istype(A, /obj/item/twohanded/required/cult_bastard) && !iscultist(user)) if(istype(A, /obj/item/twohanded/required/cult_bastard) || istype(A, /obj/item/melee/cultblade) && !iscultist(user))
var/obj/item/twohanded/required/cult_bastard/sword = A to_chat(user, "<span class='notice'>You begin to exorcise [A].</span>")
to_chat(user, "<span class='notice'>You begin to exorcise [sword].</span>")
playsound(src,'sound/hallucinations/veryfar_noise.ogg',40,1) playsound(src,'sound/hallucinations/veryfar_noise.ogg',40,1)
if(do_after(user, 40, target = sword)) if(do_after(user, 40, target = A))
playsound(src,'sound/effects/pray_chaplain.ogg',60,1) playsound(src,'sound/effects/pray_chaplain.ogg',60,1)
for(var/obj/item/soulstone/SS in sword.contents) if(istype(A, /obj/item/twohanded/required/cult_bastard))
SS.usability = TRUE for(var/obj/item/soulstone/SS in A.contents)
for(var/mob/living/simple_animal/shade/EX in SS) SS.usability = TRUE
SSticker.mode.remove_cultist(EX.mind, 1, 0) for(var/mob/living/simple_animal/shade/EX in SS)
EX.icon_state = "ghost1" SSticker.mode.remove_cultist(EX.mind, 1, 0)
EX.name = "Purified [EX.name]" EX.icon_state = "ghost1"
SS.release_shades(user) EX.name = "Purified [EX.name]"
qdel(SS) SS.release_shades(user)
new /obj/item/nullrod/claymore(get_turf(sword)) qdel(SS)
user.visible_message("<span class='notice'>[user] has purified the [sword]!</span>") new /obj/item/nullrod/claymore(get_turf(A))
qdel(sword) else
new /obj/item/claymore/purified(get_turf(A))
user.visible_message("<span class='notice'>[user] has purified [A]!</span>")
qdel(A)
else if(istype(A, /obj/item/soulstone) && !iscultist(user)) else if(istype(A, /obj/item/soulstone) && !iscultist(user))
var/obj/item/soulstone/SS = A var/obj/item/soulstone/SS = A
+50 -43
View File
@@ -15,13 +15,18 @@
attack_verb = list("beaten") attack_verb = list("beaten")
armor = list("melee" = 0, "bullet" = 0, "laser" = 0, "energy" = 0, "bomb" = 50, "bio" = 0, "rad" = 0, "fire" = 80, "acid" = 80) armor = list("melee" = 0, "bullet" = 0, "laser" = 0, "energy" = 0, "bomb" = 50, "bio" = 0, "rad" = 0, "fire" = 80, "acid" = 80)
var/stunforce = 70 var/stamforce = 25
var/status = FALSE var/status = FALSE
var/knockdown = TRUE
var/obj/item/stock_parts/cell/cell var/obj/item/stock_parts/cell/cell
var/hitcost = 1000 var/hitcost = 750
var/throw_hit_chance = 35 var/throw_hit_chance = 35
var/preload_cell_type //if not empty the baton starts with this type of cell var/preload_cell_type //if not empty the baton starts with this type of cell
/obj/item/melee/baton/examine(mob/user)
. = ..()
. += "<span class='notice'>Right click attack while in combat mode to disarm instead of stun.</span>"
/obj/item/melee/baton/get_cell() /obj/item/melee/baton/get_cell()
. = cell . = cell
if(iscyborg(loc)) if(iscyborg(loc))
@@ -32,7 +37,7 @@
user.visible_message("<span class='suicide'>[user] is putting the live [name] in [user.p_their()] mouth! It looks like [user.p_theyre()] trying to commit suicide!</span>") user.visible_message("<span class='suicide'>[user] is putting the live [name] in [user.p_their()] mouth! It looks like [user.p_theyre()] trying to commit suicide!</span>")
return (FIRELOSS) return (FIRELOSS)
/obj/item/melee/baton/Initialize() /obj/item/melee/baton/Initialize(mapload)
. = ..() . = ..()
if(preload_cell_type) if(preload_cell_type)
if(!ispath(preload_cell_type,/obj/item/stock_parts/cell)) if(!ispath(preload_cell_type,/obj/item/stock_parts/cell))
@@ -48,7 +53,7 @@
baton_stun(hit_atom) baton_stun(hit_atom)
/obj/item/melee/baton/loaded //this one starts with a cell pre-installed. /obj/item/melee/baton/loaded //this one starts with a cell pre-installed.
preload_cell_type = /obj/item/stock_parts/cell/high preload_cell_type = /obj/item/stock_parts/cell/high/plus
/obj/item/melee/baton/proc/deductcharge(chrgdeductamt, chargecheck = TRUE, explode = TRUE) /obj/item/melee/baton/proc/deductcharge(chrgdeductamt, chargecheck = TRUE, explode = TRUE)
var/obj/item/stock_parts/cell/copper_top = get_cell() var/obj/item/stock_parts/cell/copper_top = get_cell()
@@ -134,44 +139,41 @@
add_fingerprint(user) add_fingerprint(user)
/obj/item/melee/baton/attack(mob/M, mob/living/carbon/human/user) /obj/item/melee/baton/attack(mob/M, mob/living/carbon/human/user)
var/interrupt = common_baton_melee(M, user, FALSE)
if(!interrupt)
..()
/obj/item/melee/baton/alt_pre_attack(atom/A, mob/living/user, params)
. = common_baton_melee(A, user, TRUE) //return true (attackchain interrupt) if this also returns true. no harm-disarming.
user.changeNext_move(CLICK_CD_MELEE)
//return TRUE to interrupt attack chain.
/obj/item/melee/baton/proc/common_baton_melee(mob/M, mob/living/user, disarming = FALSE)
if(iscyborg(M) || !isliving(M)) //can't baton cyborgs
return FALSE
if(status && HAS_TRAIT(user, TRAIT_CLUMSY) && prob(50)) if(status && HAS_TRAIT(user, TRAIT_CLUMSY) && prob(50))
clowning_around(user) clowning_around(user)
return if(user.getStaminaLoss() >= STAMINA_SOFTCRIT) //CIT CHANGE - makes it impossible to baton in stamina softcrit
to_chat(user, "<span class='danger'>You're too exhausted for that.</span>")
if(user.getStaminaLoss() >= STAMINA_SOFTCRIT)//CIT CHANGE - makes it impossible to baton in stamina softcrit return TRUE
to_chat(user, "<span class='danger'>You're too exhausted for that.</span>")//CIT CHANGE - ditto
return //CIT CHANGE - ditto
if(iscyborg(M))
..()
return
if(ishuman(M)) if(ishuman(M))
var/mob/living/carbon/human/L = M var/mob/living/carbon/human/L = M
if(check_martial_counter(L, user)) if(check_martial_counter(L, user))
return return TRUE
if(status)
if(baton_stun(M, user, disarming))
user.do_attack_animation(M)
user.adjustStaminaLossBuffered(getweight()) //CIT CHANGE - makes stunbatonning others cost stamina
else if(user.a_intent != INTENT_HARM) //they'll try to bash in the last proc.
M.visible_message("<span class='warning'>[user] has prodded [M] with [src]. Luckily it was off.</span>", \
"<span class='warning'>[user] has prodded you with [src]. Luckily it was off</span>")
return disarming || (user.a_intent != INTENT_HARM)
if(user.a_intent != INTENT_HARM) /obj/item/melee/baton/proc/baton_stun(mob/living/L, mob/user, disarming = FALSE)
if(status)
if(baton_stun(M, user))
user.do_attack_animation(M)
user.adjustStaminaLossBuffered(getweight())//CIT CHANGE - makes stunbatonning others cost stamina
return
else
M.visible_message("<span class='warning'>[user] has prodded [M] with [src]. Luckily it was off.</span>", \
"<span class='warning'>[user] has prodded you with [src]. Luckily it was off</span>")
else
if(status)
baton_stun(M, user)
..()
/obj/item/melee/baton/proc/baton_stun(mob/living/L, mob/user)
if(L.check_shields(src, 0, "[user]'s [name]", MELEE_ATTACK)) //No message; check_shields() handles that if(L.check_shields(src, 0, "[user]'s [name]", MELEE_ATTACK)) //No message; check_shields() handles that
playsound(L, 'sound/weapons/genhit.ogg', 50, 1) playsound(L, 'sound/weapons/genhit.ogg', 50, 1)
return FALSE return FALSE
var/stunpwr = stunforce var/stunpwr = stamforce
var/obj/item/stock_parts/cell/our_cell = get_cell() var/obj/item/stock_parts/cell/our_cell = get_cell()
if(!our_cell) if(!our_cell)
switch_status(FALSE) switch_status(FALSE)
@@ -187,17 +189,21 @@
return FALSE return FALSE
stunpwr *= round(stuncharge/hitcost, 0.1) stunpwr *= round(stuncharge/hitcost, 0.1)
if(!disarming)
L.Knockdown(stunpwr, override_stamdmg = 0) if(knockdown)
L.apply_damage(stunpwr*0.5, STAMINA, user.zone_selected) L.Knockdown(50, override_stamdmg = 0) //knockdown
L.apply_effect(EFFECT_STUTTER, stunforce) L.adjustStaminaLoss(stunpwr)
else
L.drop_all_held_items() //no knockdown/stamina damage, instead disarm.
L.apply_effect(EFFECT_STUTTER, stamforce)
SEND_SIGNAL(L, COMSIG_LIVING_MINOR_SHOCK) SEND_SIGNAL(L, COMSIG_LIVING_MINOR_SHOCK)
if(user) if(user)
L.lastattacker = user.real_name L.lastattacker = user.real_name
L.lastattackerckey = user.ckey L.lastattackerckey = user.ckey
L.visible_message("<span class='danger'>[user] has stunned [L] with [src]!</span>", \ L.visible_message("<span class='danger'>[user] has [disarming? "disarmed" : "stunned"] [L] with [src]!</span>", \
"<span class='userdanger'>[user] has stunned you with [src]!</span>") "<span class='userdanger'>[user] has [disarming? "disarmed" : "stunned"] you with [src]!</span>")
log_combat(user, L, "stunned") log_combat(user, L, disarming? "disarmed" : "stunned")
playsound(loc, 'sound/weapons/egloves.ogg', 50, 1, -1) playsound(loc, 'sound/weapons/egloves.ogg', 50, 1, -1)
@@ -212,7 +218,7 @@
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>", \
"<span class='userdanger'>You accidentally hit yourself with [src]!</span>") "<span class='userdanger'>You accidentally hit yourself with [src]!</span>")
SEND_SIGNAL(user, COMSIG_LIVING_MINOR_SHOCK) SEND_SIGNAL(user, COMSIG_LIVING_MINOR_SHOCK)
user.Knockdown(stunforce*3) user.Knockdown(stamforce*6)
playsound(loc, 'sound/weapons/egloves.ogg', 50, 1, -1) playsound(loc, 'sound/weapons/egloves.ogg', 50, 1, -1)
deductcharge(hitcost) deductcharge(hitcost)
@@ -274,8 +280,9 @@
w_class = WEIGHT_CLASS_BULKY w_class = WEIGHT_CLASS_BULKY
force = 3 force = 3
throwforce = 5 throwforce = 5
stunforce = 60 stamforce = 25
hitcost = 2000 hitcost = 1000
knockdown = FALSE
throw_hit_chance = 10 throw_hit_chance = 10
slot_flags = ITEM_SLOT_BACK slot_flags = ITEM_SLOT_BACK
var/obj/item/assembly/igniter/sparkler var/obj/item/assembly/igniter/sparkler
+1 -1
View File
@@ -16,7 +16,7 @@
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>", \
"<span class='userdanger'>You accidentally hit yourself with [src]!</span>") "<span class='userdanger'>You accidentally hit yourself with [src]!</span>")
SEND_SIGNAL(user, COMSIG_LIVING_MINOR_SHOCK) SEND_SIGNAL(user, COMSIG_LIVING_MINOR_SHOCK)
user.Knockdown(stunforce*3) user.Knockdown(stamforce * 6)
playsound(loc, 'sound/weapons/egloves.ogg', 50, 1, -1) playsound(loc, 'sound/weapons/egloves.ogg', 50, 1, -1)
if(do_teleport(user, get_turf(user), 50, channel = TELEPORT_CHANNEL_BLUESPACE)) if(do_teleport(user, get_turf(user), 50, channel = TELEPORT_CHANNEL_BLUESPACE))
deductcharge(hitcost) deductcharge(hitcost)
+1 -1
View File
@@ -289,7 +289,7 @@
var/light_brightness = 3 var/light_brightness = 3
actions_types = list() actions_types = list()
/obj/item/toy/sword/cx/pre_altattackby(atom/A, mob/living/user, params) //checks if it can do right click memes /obj/item/toy/sword/cx/alt_pre_attack(atom/A, mob/living/user, params) //checks if it can do right click memes
altafterattack(A, user, TRUE, params) altafterattack(A, user, TRUE, params)
return TRUE return TRUE
+64 -1
View File
@@ -510,7 +510,7 @@
/obj/item/twohanded/dualsaber/hypereutactic/chaplain/IsReflect() /obj/item/twohanded/dualsaber/hypereutactic/chaplain/IsReflect()
return FALSE return FALSE
/obj/item/twohanded/dualsaber/hypereutactic/pre_altattackby(atom/A, mob/living/user, params) //checks if it can do right click memes /obj/item/twohanded/dualsaber/hypereutactic/alt_pre_attack(atom/A, mob/living/user, params) //checks if it can do right click memes
altafterattack(A, user, TRUE, params) altafterattack(A, user, TRUE, params)
return TRUE return TRUE
@@ -1016,3 +1016,66 @@
C.change_view(CONFIG_GET(string/default_view)) C.change_view(CONFIG_GET(string/default_view))
user.client.pixel_x = 0 user.client.pixel_x = 0
user.client.pixel_y = 0 user.client.pixel_y = 0
/obj/item/twohanded/broom
name = "broom"
desc = "This is my BROOMSTICK! It can be used manually or braced with two hands to sweep items as you move. It has a telescopic handle for compact storage." //LIES
icon = 'icons/obj/janitor.dmi'
icon_state = "broom0"
lefthand_file = 'icons/mob/inhands/equipment/custodial_lefthand.dmi'
righthand_file = 'icons/mob/inhands/equipment/custodial_righthand.dmi'
force = 8
throwforce = 10
throw_speed = 3
throw_range = 7
w_class = WEIGHT_CLASS_NORMAL
force_unwielded = 8
force_wielded = 12
attack_verb = list("swept", "brushed off", "bludgeoned", "whacked")
resistance_flags = FLAMMABLE
/obj/item/twohanded/broom/update_icon_state()
icon_state = "broom[wielded]"
/obj/item/twohanded/broom/wield(mob/user)
. = ..()
if(!wielded)
return
to_chat(user, "<span class='notice'>You brace the [src] against the ground in a firm sweeping stance.</span>")
RegisterSignal(user, COMSIG_MOVABLE_MOVED, .proc/sweep)
/obj/item/twohanded/broom/unwield(mob/user)
. = ..()
UnregisterSignal(user, COMSIG_MOVABLE_MOVED)
/obj/item/twohanded/broom/afterattack(atom/A, mob/user, proximity)
. = ..()
if(!proximity)
return
sweep(user, A, FALSE)
/obj/item/twohanded/broom/proc/sweep(mob/user, atom/A, moving = TRUE)
var/turf/target
if (!moving)
if (isturf(A))
target = A
else
target = A.loc
else
target = user.loc
if (locate(/obj/structure/table) in target.contents)
return
var/i = 0
for(var/obj/item/garbage in target.contents)
if(!garbage.anchored)
garbage.Move(get_step(target, user.dir), user.dir)
i++
if(i >= 20)
break
if(i >= 1)
playsound(loc, 'sound/weapons/thudswoosh.ogg', 5, TRUE, -1)
/obj/item/twohanded/broom/proc/janicart_insert(mob/user, obj/structure/janitorialcart/J) //bless you whoever fixes this copypasta
J.put_in_cart(src, user)
J.mybroom=src
J.update_icon()
+5
View File
@@ -79,6 +79,11 @@ for further reading, please see: https://github.com/tgstation/tgstation/pull/301
user.visible_message("<span class='suicide'>[user] is falling on [src]! It looks like [user.p_theyre()] trying to commit suicide!</span>") user.visible_message("<span class='suicide'>[user] is falling on [src]! It looks like [user.p_theyre()] trying to commit suicide!</span>")
return(BRUTELOSS) return(BRUTELOSS)
/obj/item/claymore/purified
name = "purified longsword"
desc = "A hastily-purified longsword. While not as holy as it could be, it's still a formidable weapon against those who would rather see you dead."
force = 25
/obj/item/claymore/highlander //ALL COMMENTS MADE REGARDING THIS SWORD MUST BE MADE IN ALL CAPS /obj/item/claymore/highlander //ALL COMMENTS MADE REGARDING THIS SWORD MUST BE MADE IN ALL CAPS
desc = "<b><i>THERE CAN BE ONLY ONE, AND IT WILL BE YOU!!!</i></b>\nActivate it in your hand to point to the nearest victim." desc = "<b><i>THERE CAN BE ONLY ONE, AND IT WILL BE YOU!!!</i></b>\nActivate it in your hand to point to the nearest victim."
flags_1 = CONDUCT_1 flags_1 = CONDUCT_1
@@ -76,7 +76,7 @@
new /obj/item/door_remote/chief_medical_officer(src) new /obj/item/door_remote/chief_medical_officer(src)
new /obj/item/clothing/neck/petcollar(src) new /obj/item/clothing/neck/petcollar(src)
new /obj/item/pet_carrier(src) new /obj/item/pet_carrier(src)
new /obj/item/storage/belt/medical/surgery_belt_adv(src) new /obj/item/storage/belt/medical/surgery_belt_adv/cmo(src)
new /obj/item/wallframe/defib_mount(src) new /obj/item/wallframe/defib_mount(src)
new /obj/item/circuitboard/machine/techfab/department/medical(src) new /obj/item/circuitboard/machine/techfab/department/medical(src)
new /obj/item/storage/photo_album/CMO(src) new /obj/item/storage/photo_album/CMO(src)
@@ -70,3 +70,8 @@
name = "secure science crate" name = "secure science crate"
desc = "A crate with a lock on it, painted in the scheme of the station's scientists." desc = "A crate with a lock on it, painted in the scheme of the station's scientists."
icon_state = "scisecurecrate" icon_state = "scisecurecrate"
/obj/structure/closet/crate/secure/medical
desc = "A secure medical crate."
name = "medical crate"
icon_state = "medical_secure_crate"
@@ -19,21 +19,20 @@
Estimated time of last contact: Deployment, 5000 millennia ago." Estimated time of last contact: Deployment, 5000 millennia ago."
assignedrole = "Lifebringer" assignedrole = "Lifebringer"
/obj/effect/mob_spawn/human/seed_vault/special(mob/living/new_spawn)
var/plant_name = pick("Tomato", "Potato", "Broccoli", "Carrot", "Ambrosia", "Pumpkin", "Ivy", "Kudzu", "Banana", "Moss", "Flower", "Bloom", "Root", "Bark", "Glowshroom", "Petal", "Leaf", \
"Venus", "Sprout","Cocoa", "Strawberry", "Citrus", "Oak", "Cactus", "Pepper", "Juniper")
new_spawn.real_name = plant_name
if(ishuman(new_spawn))
var/mob/living/carbon/human/H = new_spawn
H.underwear = "Nude" //You're a plant, partner
H.update_body()
/obj/effect/mob_spawn/human/seed_vault/Destroy() /obj/effect/mob_spawn/human/seed_vault/Destroy()
new/obj/structure/fluff/empty_terrarium(get_turf(src)) new/obj/structure/fluff/empty_terrarium(get_turf(src))
return ..() return ..()
/obj/effect/mob_spawn/human/seed_vault/special(mob/living/carbon/human/new_spawn) /obj/effect/mob_spawn/human/seed_vault/special(mob/living/carbon/human/new_spawn)
ADD_TRAIT(new_spawn,TRAIT_EXEMPT_HEALTH_EVENTS,GHOSTROLE_TRAIT) ADD_TRAIT(new_spawn,TRAIT_EXEMPT_HEALTH_EVENTS,GHOSTROLE_TRAIT)
var/plant_name = pick("Tomato", "Potato", "Broccoli", "Carrot", "Ambrosia", "Pumpkin", "Ivy", "Kudzu", "Banana", "Moss", "Flower", "Bloom", "Root", "Bark", "Glowshroom", "Petal", "Leaf", \
"Venus", "Sprout","Cocoa", "Strawberry", "Citrus", "Oak", "Cactus", "Pepper", "Juniper")
new_spawn.real_name = plant_name //why this works when moving it from one function to another is beyond me
new_spawn.underwear = "Nude" //You're a plant, partner
new_spawn.undershirt = "Nude" //changing underwear/shirt/socks doesn't seem to function correctly right now because of some bug elsewhere?
new_spawn.socks = "Nude"
new_spawn.update_body()
//Ash walker eggs: Spawns in ash walker dens in lavaland. Ghosts become unbreathing lizards that worship the Necropolis and are advised to retrieve corpses to create more ash walkers. //Ash walker eggs: Spawns in ash walker dens in lavaland. Ghosts become unbreathing lizards that worship the Necropolis and are advised to retrieve corpses to create more ash walkers.
/obj/effect/mob_spawn/human/ash_walker /obj/effect/mob_spawn/human/ash_walker
@@ -67,6 +66,14 @@
var/datum/language_holder/holder = new_spawn.get_language_holder() var/datum/language_holder/holder = new_spawn.get_language_holder()
holder.selected_default_language = /datum/language/draconic holder.selected_default_language = /datum/language/draconic
//Ash walkers on birth understand how to make bone bows, bone arrows and ashen arrows
new_spawn.mind.teach_crafting_recipe(/datum/crafting_recipe/bone_arrow)
new_spawn.mind.teach_crafting_recipe(/datum/crafting_recipe/bone_bow)
new_spawn.mind.teach_crafting_recipe(/datum/crafting_recipe/ashen_arrow)
new_spawn.mind.teach_crafting_recipe(/datum/crafting_recipe/quiver)
new_spawn.mind.teach_crafting_recipe(/datum/crafting_recipe/bow_tablet)
if(ishuman(new_spawn)) if(ishuman(new_spawn))
var/mob/living/carbon/human/H = new_spawn var/mob/living/carbon/human/H = new_spawn
H.underwear = "Nude" H.underwear = "Nude"
+20 -6
View File
@@ -6,11 +6,11 @@
anchored = FALSE anchored = FALSE
density = TRUE density = TRUE
//copypaste sorry //copypaste sorry
var/amount_per_transfer_from_this = 5 //shit I dunno, adding this so syringes stop runtime erroring. --NeoFite var/obj/item/storage/bag/trash/mybag
var/obj/item/storage/bag/trash/mybag = null var/obj/item/mop/mymop
var/obj/item/mop/mymop = null var/obj/item/twohanded/broom/mybroom
var/obj/item/reagent_containers/spray/cleaner/myspray = null var/obj/item/reagent_containers/spray/cleaner/myspray
var/obj/item/lightreplacer/myreplacer = null var/obj/item/lightreplacer/myreplacer
var/signs = 0 var/signs = 0
var/const/max_signs = 4 var/const/max_signs = 4
@@ -49,7 +49,12 @@
m.janicart_insert(user, src) m.janicart_insert(user, src)
else else
to_chat(user, fail_msg) to_chat(user, fail_msg)
else if(istype(I, /obj/item/twohanded/broom))
if(!mybroom)
var/obj/item/twohanded/broom/b=I
b.janicart_insert(user,src)
else
to_chat(user, fail_msg)
else if(istype(I, /obj/item/storage/bag/trash)) else if(istype(I, /obj/item/storage/bag/trash))
if(!mybag) if(!mybag)
var/obj/item/storage/bag/trash/t=I var/obj/item/storage/bag/trash/t=I
@@ -97,6 +102,8 @@
dat += "<a href='?src=[REF(src)];garbage=1'>[mybag.name]</a><br>" dat += "<a href='?src=[REF(src)];garbage=1'>[mybag.name]</a><br>"
if(mymop) if(mymop)
dat += "<a href='?src=[REF(src)];mop=1'>[mymop.name]</a><br>" dat += "<a href='?src=[REF(src)];mop=1'>[mymop.name]</a><br>"
if(mybroom)
dat += "<a href='?src=[REF(src)];broom=1'>[mybroom.name]</a><br>"
if(myspray) if(myspray)
dat += "<a href='?src=[REF(src)];spray=1'>[myspray.name]</a><br>" dat += "<a href='?src=[REF(src)];spray=1'>[myspray.name]</a><br>"
if(myreplacer) if(myreplacer)
@@ -124,6 +131,11 @@
user.put_in_hands(mymop) user.put_in_hands(mymop)
to_chat(user, "<span class='notice'>You take [mymop] from [src].</span>") to_chat(user, "<span class='notice'>You take [mymop] from [src].</span>")
mymop = null mymop = null
if(href_list["broom"])
if(mybroom)
user.put_in_hands(mybroom)
to_chat(user, "<span class='notice'>You take [mybroom] from [src].</span>")
mybroom = null
if(href_list["spray"]) if(href_list["spray"])
if(myspray) if(myspray)
user.put_in_hands(myspray) user.put_in_hands(myspray)
@@ -155,6 +167,8 @@
add_overlay("cart_garbage") add_overlay("cart_garbage")
if(mymop) if(mymop)
add_overlay("cart_mop") add_overlay("cart_mop")
if(mybroom)
add_overlay("cart_broom")
if(myspray) if(myspray)
add_overlay("cart_spray") add_overlay("cart_spray")
if(myreplacer) if(myreplacer)
+2 -2
View File
@@ -528,8 +528,8 @@
if(B.cell) if(B.cell)
if(B.cell.charge > 0 && B.status == 1) if(B.cell.charge > 0 && B.status == 1)
flick("baton_active", src) flick("baton_active", src)
var/stunforce = B.stunforce var/stunforce = B.stamforce
user.Knockdown(stunforce) user.Knockdown(stunforce * 2)
user.stuttering = stunforce/20 user.stuttering = stunforce/20
B.deductcharge(B.hitcost) B.deductcharge(B.hitcost)
user.visible_message("<span class='warning'>[user] shocks [user.p_them()]self while attempting to wash the active [B.name]!</span>", \ user.visible_message("<span class='warning'>[user] shocks [user.p_them()]self while attempting to wash the active [B.name]!</span>", \
+2
View File
@@ -184,6 +184,8 @@
soundin = pick('sound/items/bikehorn.ogg', 'sound/items/AirHorn2.ogg', 'sound/misc/sadtrombone.ogg', 'sound/items/AirHorn.ogg', 'sound/effects/reee.ogg', 'sound/items/WEEOO1.ogg', 'sound/voice/beepsky/iamthelaw.ogg', 'sound/voice/beepsky/creep.ogg','sound/magic/Fireball.ogg' ,'sound/effects/pray.ogg', 'sound/voice/hiss1.ogg','sound/machines/buzz-sigh.ogg', 'sound/machines/ping.ogg', 'sound/weapons/flashbang.ogg', 'sound/weapons/bladeslice.ogg') soundin = pick('sound/items/bikehorn.ogg', 'sound/items/AirHorn2.ogg', 'sound/misc/sadtrombone.ogg', 'sound/items/AirHorn.ogg', 'sound/effects/reee.ogg', 'sound/items/WEEOO1.ogg', 'sound/voice/beepsky/iamthelaw.ogg', 'sound/voice/beepsky/creep.ogg','sound/magic/Fireball.ogg' ,'sound/effects/pray.ogg', 'sound/voice/hiss1.ogg','sound/machines/buzz-sigh.ogg', 'sound/machines/ping.ogg', 'sound/weapons/flashbang.ogg', 'sound/weapons/bladeslice.ogg')
if("goose") if("goose")
soundin = pick('sound/creatures/goose1.ogg', 'sound/creatures/goose2.ogg', 'sound/creatures/goose3.ogg', 'sound/creatures/goose4.ogg') soundin = pick('sound/creatures/goose1.ogg', 'sound/creatures/goose2.ogg', 'sound/creatures/goose3.ogg', 'sound/creatures/goose4.ogg')
if("water_wade")
soundin = pick('sound/effects/water_wade1.ogg', 'sound/effects/water_wade2.ogg', 'sound/effects/water_wade3.ogg', 'sound/effects/water_wade4.ogg')
//START OF CIT CHANGES - adds random vore sounds //START OF CIT CHANGES - adds random vore sounds
if ("struggle_sound") if ("struggle_sound")
soundin = pick( 'sound/vore/pred/struggle_01.ogg','sound/vore/pred/struggle_02.ogg','sound/vore/pred/struggle_03.ogg', soundin = pick( 'sound/vore/pred/struggle_01.ogg','sound/vore/pred/struggle_02.ogg','sound/vore/pred/struggle_03.ogg',
+2
View File
@@ -552,6 +552,8 @@
//if the vomit combined, apply toxicity and reagents to the old vomit //if the vomit combined, apply toxicity and reagents to the old vomit
if (QDELETED(V)) if (QDELETED(V))
V = locate() in src V = locate() in src
if(!V) //the decal was spawned on a wall or groundless turf and promptly qdeleted.
return
// Make toxins and blazaam vomit look different // Make toxins and blazaam vomit look different
if(toxvomit == VOMIT_PURPLE) if(toxvomit == VOMIT_PURPLE)
V.icon_state = "vomitpurp_[pick(1,4)]" V.icon_state = "vomitpurp_[pick(1,4)]"
+1 -1
View File
@@ -714,7 +714,7 @@ GLOBAL_PROTECT(admin_verbs_hideable)
AI_Interact = !AI_Interact AI_Interact = !AI_Interact
if(mob && IsAdminGhost(mob)) if(mob && IsAdminGhost(mob))
mob.has_unlimited_silicon_privilege = AI_Interact mob.silicon_privileges = AI_Interact ? ALL : NONE
log_admin("[key_name(usr)] has [AI_Interact ? "activated" : "deactivated"] Admin AI Interact") log_admin("[key_name(usr)] has [AI_Interact ? "activated" : "deactivated"] Admin AI Interact")
message_admins("[key_name_admin(usr)] has [AI_Interact ? "activated" : "deactivated"] their AI interaction") message_admins("[key_name_admin(usr)] has [AI_Interact ? "activated" : "deactivated"] their AI interaction")
@@ -14,7 +14,8 @@ GLOBAL_LIST_EMPTY(antagonists)
var/list/objectives = list() var/list/objectives = list()
var/antag_memory = ""//These will be removed with antag datum var/antag_memory = ""//These will be removed with antag datum
var/antag_moodlet //typepath of moodlet that the mob will gain with their status var/antag_moodlet //typepath of moodlet that the mob will gain with their status
var/can_hijack = HIJACK_NEUTRAL //If these antags are alone on shuttle hijack happens. /// If above 0, this is the multiplier for the speed at which we hijack the shuttle. Do not directly read, use hijack_speed().
var/hijack_speed = 0
//Antag panel properties //Antag panel properties
var/show_in_antagpanel = TRUE //This will hide adding this antag type in antag panel, use only for internal subtypes that shouldn't be added directly but still show if possessed by mind var/show_in_antagpanel = TRUE //This will hide adding this antag type in antag panel, use only for internal subtypes that shouldn't be added directly but still show if possessed by mind
@@ -229,6 +230,13 @@ GLOBAL_LIST_EMPTY(antagonists)
return return
antag_memory = new_memo antag_memory = new_memo
/// Gets how fast we can hijack the shuttle, return 0 for can not hijack. Defaults to hijack_speed var, override for custom stuff like buffing hijack speed for hijack objectives or something.
/datum/antagonist/proc/hijack_speed()
var/datum/objective/hijack/H = locate() in objectives
if(!isnull(H?.hijack_speed_override))
return H.hijack_speed_override
return hijack_speed
//This one is created by admin tools for custom objectives //This one is created by admin tools for custom objectives
/datum/antagonist/custom /datum/antagonist/custom
antagpanel_category = "Custom" antagpanel_category = "Custom"
@@ -286,10 +286,10 @@
var/mob/living/L = owner.current var/mob/living/L = owner.current
level_bloodcost = maxBloodVolume * 0.2 level_bloodcost = maxBloodVolume * 0.2
//If the blood volume of the bloodsucker is lower than the cost to level up, return and inform the bloodsucker //If the blood volume of the bloodsucker is lower than the cost to level up, return and inform the bloodsucker
//TODO: Make this into a radial, or perhaps a tgui next UI //TODO: Make this into a radial, or perhaps a tgui next UI
// Purchase Power Prompt // Purchase Power Prompt
var/list/options = list() var/list/options = list()
for(var/pickedpower in typesof(/datum/action/bloodsucker)) for(var/pickedpower in typesof(/datum/action/bloodsucker))
var/datum/action/bloodsucker/power = pickedpower var/datum/action/bloodsucker/power = pickedpower
// If I don't own it, and I'm allowed to buy it. // If I don't own it, and I'm allowed to buy it.
@@ -170,7 +170,7 @@
// Warn Feeder about Witnesses... // Warn Feeder about Witnesses...
var/was_unnoticed = TRUE var/was_unnoticed = TRUE
for(var/mob/living/M in viewers(notice_range, owner)) for(var/mob/living/M in viewers(notice_range, owner))
if(M != owner && M != target && iscarbon(M) && M.mind && !M.has_unlimited_silicon_privilege && !M.eye_blind && !M.mind.has_antag_datum(ANTAG_DATUM_BLOODSUCKER)) if(M != owner && M != target && iscarbon(M) && M.mind && !M.silicon_privileges && !M.eye_blind && !M.mind.has_antag_datum(ANTAG_DATUM_BLOODSUCKER))
was_unnoticed = FALSE was_unnoticed = FALSE
break break
if(was_unnoticed) if(was_unnoticed)
@@ -28,9 +28,9 @@
to_chat(owner, "<span class='warning'>Your coffin has been destroyed!</span>") to_chat(owner, "<span class='warning'>Your coffin has been destroyed!</span>")
return FALSE return FALSE
return TRUE return TRUE
/datum/action/bloodsucker/gohome/proc/flicker_lights(var/flicker_range, var/beat_volume) /datum/action/bloodsucker/gohome/proc/flicker_lights(var/flicker_range, var/beat_volume)
for(var/obj/machinery/light/L in view(flicker_range, get_turf(owner))) for(var/obj/machinery/light/L in view(flicker_range, get_turf(owner)))
playsound(get_turf(owner), 'sound/effects/singlebeat.ogg', beat_volume, 1) playsound(get_turf(owner), 'sound/effects/singlebeat.ogg', beat_volume, 1)
@@ -45,7 +45,7 @@
flicker_lights(4, 40) flicker_lights(4, 40)
sleep(50) sleep(50)
flicker_lights(4, 60) flicker_lights(4, 60)
for(var/obj/machinery/light/L in view(6, get_turf(owner))) for(var/obj/machinery/light/L in view(6, get_turf(owner)))
L.flicker(5) L.flicker(5)
playsound(get_turf(owner), 'sound/effects/singlebeat.ogg', 60, 1) playsound(get_turf(owner), 'sound/effects/singlebeat.ogg', 60, 1)
// ( STEP TWO: Lights OFF? ) // ( STEP TWO: Lights OFF? )
@@ -56,7 +56,7 @@
if(!owner) if(!owner)
return return
// SEEN?: (effects ONLY if there are witnesses! Otherwise you just POOF) // SEEN?: (effects ONLY if there are witnesses! Otherwise you just POOF)
var/am_seen = FALSE // Do Effects (seen by anyone) var/am_seen = FALSE // Do Effects (seen by anyone)
var/drop_item = FALSE // Drop Stuff (seen by non-vamp) var/drop_item = FALSE // Drop Stuff (seen by non-vamp)
if(isturf(owner.loc)) // Only check if I'm not in a Locker or something. if(isturf(owner.loc)) // Only check if I'm not in a Locker or something.
@@ -65,7 +65,7 @@
if(T && T.lighting_object && T.get_lumcount()>= 0.1) if(T && T.lighting_object && T.get_lumcount()>= 0.1)
// B) Check for Viewers // B) Check for Viewers
for(var/mob/living/M in viewers(get_turf(owner))) for(var/mob/living/M in viewers(get_turf(owner)))
if(M != owner && isliving(M) && M.mind && !M.has_unlimited_silicon_privilege && !M.eye_blind) // M.client <--- add this in after testing! if(M != owner && isliving(M) && M.mind && !M.silicon_privileges && !M.eye_blind) // M.client <--- add this in after testing!
am_seen = TRUE am_seen = TRUE
if (!M.mind.has_antag_datum(ANTAG_DATUM_BLOODSUCKER)) if (!M.mind.has_antag_datum(ANTAG_DATUM_BLOODSUCKER))
drop_item = TRUE drop_item = TRUE
@@ -95,12 +95,12 @@
puff.effect_type = /obj/effect/particle_effect/smoke/vampsmoke puff.effect_type = /obj/effect/particle_effect/smoke/vampsmoke
puff.set_up(3, 0, get_turf(owner)) puff.set_up(3, 0, get_turf(owner))
puff.start() puff.start()
//STEP FIVE: Create animal at prev location //STEP FIVE: Create animal at prev location
var/mob/living/simple_animal/SA = pick(/mob/living/simple_animal/mouse,/mob/living/simple_animal/mouse,/mob/living/simple_animal/mouse, /mob/living/simple_animal/hostile/retaliate/bat) //prob(300) /mob/living/simple_animal/mouse, var/mob/living/simple_animal/SA = pick(/mob/living/simple_animal/mouse,/mob/living/simple_animal/mouse,/mob/living/simple_animal/mouse, /mob/living/simple_animal/hostile/retaliate/bat) //prob(300) /mob/living/simple_animal/mouse,
new SA (owner.loc) new SA (owner.loc)
// TELEPORT: Move to Coffin & Close it! // TELEPORT: Move to Coffin & Close it!
do_teleport(owner, bloodsuckerdatum.coffin, no_effects = TRUE, forced = TRUE, channel = TELEPORT_CHANNEL_QUANTUM) do_teleport(owner, bloodsuckerdatum.coffin, no_effects = TRUE, forced = TRUE, channel = TELEPORT_CHANNEL_QUANTUM)
user.resting = TRUE user.resting = TRUE
user.Stun(30,1) user.Stun(30,1)
// CLOSE LID: If fail, force me in. // CLOSE LID: If fail, force me in.
@@ -112,4 +112,4 @@
bloodsuckerdatum.coffin.update_icon() bloodsuckerdatum.coffin.update_icon()
// Lock Coffin // Lock Coffin
bloodsuckerdatum.coffin.LockMe(owner) bloodsuckerdatum.coffin.LockMe(owner)
@@ -14,6 +14,9 @@
message_Trigger = ""//"Whom will you subvert to your will?" message_Trigger = ""//"Whom will you subvert to your will?"
bloodsucker_can_buy = TRUE bloodsucker_can_buy = TRUE
must_be_capacitated = TRUE must_be_capacitated = TRUE
var/list/hit //current hit, set while power is in use as we can't pass the list as an extra calling argument in registersignal.
/// If set, uses this speed in deciseconds instead of world.tick_lag
var/speed_override
/datum/action/bloodsucker/targeted/haste/CheckCanUse(display_error) /datum/action/bloodsucker/targeted/haste/CheckCanUse(display_error)
. = ..() . = ..()
@@ -43,43 +46,46 @@
return TRUE return TRUE
/datum/action/bloodsucker/targeted/haste/FireTargetedPower(atom/A) /datum/action/bloodsucker/targeted/haste/FireTargetedPower(atom/A)
// set waitfor = FALSE <---- DONT DO THIS!We WANT this power to hold up ClickWithPower(), so that we can unlock the power when it's done. // This is a non-async proc to make sure the power is "locked" until this finishes.
hit = list()
RegisterSignal(owner, COMSIG_MOVABLE_MOVED, .proc/on_move)
var/mob/living/user = owner var/mob/living/user = owner
var/turf/T = isturf(A) ? A : get_turf(A) var/turf/T = isturf(A) ? A : get_turf(A)
// Pulled? Not anymore. // Pulled? Not anymore.
owner.pulledby = null user.pulledby?.stop_pulling()
// Step One: Heatseek toward Target's Turf // Go to target turf
walk_to(owner, T, 0, 0.01, 20) // NOTE: this runs in the background! to cancel it, you need to use walk(owner.current,0), or give them a new path. // DO NOT USE WALK TO.
playsound(get_turf(owner), 'sound/weapons/punchmiss.ogg', 25, 1, -1) playsound(get_turf(owner), 'sound/weapons/punchmiss.ogg', 25, 1, -1)
var/safety = 20 var/safety = get_dist(user, T) * 3 + 1
while(get_turf(owner) != T && safety > 0 && !(isliving(target) && target.Adjacent(owner))) var/consequetive_failures = 0
user.canmove = FALSE //Dont move while doing the thing, or itll break var/speed = isnull(speed_override)? world.tick_lag : speed_override
safety -- while(--safety && (get_turf(user) != T))
// Did I get knocked down? var/success = step_towards(user, T) //This does not try to go around obstacles.
if(owner && owner.incapacitated(ignore_restraints=TRUE, ignore_grab=TRUE))// owner.incapacitated()) if(!success)
// We're gonna cancel. But am I on the ground? Spin me! success = step_to(user, T) //this does
if(user.resting) if(!success)
var/send_dir = get_dir(owner, T) if(++consequetive_failures >= 3) //if 3 steps don't work
new /datum/forced_movement(owner, get_ranged_target_turf(owner, send_dir, 1), 1, FALSE) break //just stop
owner.spin(10) else
consequetive_failures = 0
if(user.resting)
user.setDir(turn(user.dir, 90)) //down? spin2win :^)
if(user.incapacitated(ignore_restraints = TRUE, ignore_grab = TRUE)) //actually down? stop.
break break
// Spin/Stun people we pass. if(success) //don't sleep if we failed to move.
//var/mob/living/newtarget = locate(/mob/living) in oview(1, owner) sleep(speed)
var/list/mob/living/foundtargets = list() UnregisterSignal(owner, COMSIG_MOVABLE_MOVED)
for(var/mob/living/newtarget in oview(1, owner)) hit = null
if (newtarget && newtarget != target && !(newtarget in foundtargets))//!newtarget.IsKnockdown()) user.update_canmove()
if (rand(0, 5) < level_current)
playsound(get_turf(newtarget), "sound/weapons/punch[rand(1,4)].ogg", 15, 1, -1)
newtarget.Knockdown(10 + level_current * 5)
if(newtarget.IsStun())
newtarget.spin(10,1)
if (rand(0,4))
newtarget.drop_all_held_items()
foundtargets += newtarget
sleep(1)
if(user)
user.update_canmove() //Let the poor guy move again
/datum/action/bloodsucker/targeted/haste/DeactivatePower(mob/living/user = owner, mob/living/target) /datum/action/bloodsucker/targeted/haste/DeactivatePower(mob/living/user = owner, mob/living/target)
..() // activate = FALSE ..() // activate = FALSE
user.update_canmove() user.update_canmove()
/datum/action/bloodsucker/targeted/haste/proc/on_move()
for(var/mob/living/L in dview(1, get_turf(owner)))
if(!hit[L] && (L != owner))
hit[L] = TRUE
playsound(L, "sound/weapons/punch[rand(1,4)].ogg", 15, 1, -1)
L.Knockdown(10 + level_current * 5, override_hardstun = 0.1)
L.spin(10, 1)
@@ -54,8 +54,8 @@
REMOVE_TRAIT(user, TRAIT_VIRUSIMMUNE, "bloodsucker") REMOVE_TRAIT(user, TRAIT_VIRUSIMMUNE, "bloodsucker")
var/obj/item/organ/heart/vampheart/H = user.getorganslot(ORGAN_SLOT_HEART) var/obj/item/organ/heart/vampheart/H = user.getorganslot(ORGAN_SLOT_HEART)
var/obj/item/organ/eyes/vassal/bloodsucker/E = user.getorganslot(ORGAN_SLOT_EYES) var/obj/item/organ/eyes/vassal/bloodsucker/E = user.getorganslot(ORGAN_SLOT_EYES)
E.flash_protect = 0 E.flash_protect = 0
// WE ARE ALIVE! // // WE ARE ALIVE! //
bloodsuckerdatum.poweron_masquerade = TRUE bloodsuckerdatum.poweron_masquerade = TRUE
while(bloodsuckerdatum && ContinueActive(user)) while(bloodsuckerdatum && ContinueActive(user))
@@ -5,7 +5,6 @@
var/special_role = ROLE_BROTHER var/special_role = ROLE_BROTHER
var/datum/team/brother_team/team var/datum/team/brother_team/team
antag_moodlet = /datum/mood_event/focused antag_moodlet = /datum/mood_event/focused
can_hijack = HIJACK_HIJACKER
/datum/antagonist/brother/create_team(datum/team/brother_team/new_team) /datum/antagonist/brother/create_team(datum/team/brother_team/new_team)
if(!new_team) if(!new_team)
@@ -120,7 +120,7 @@
hierophant_network.Grant(current) hierophant_network.Grant(current)
current.throw_alert("clockinfo", /obj/screen/alert/clockwork/infodump) current.throw_alert("clockinfo", /obj/screen/alert/clockwork/infodump)
var/obj/structure/destructible/clockwork/massive/celestial_gateway/G = GLOB.ark_of_the_clockwork_justiciar var/obj/structure/destructible/clockwork/massive/celestial_gateway/G = GLOB.ark_of_the_clockwork_justiciar
if(G.active && ishuman(current)) if(G && G.active && ishuman(current))
current.add_overlay(mutable_appearance('icons/effects/genetics.dmi', "servitude", -MUTATIONS_LAYER)) current.add_overlay(mutable_appearance('icons/effects/genetics.dmi', "servitude", -MUTATIONS_LAYER))
/datum/antagonist/clockcult/remove_innate_effects(mob/living/mob_override) /datum/antagonist/clockcult/remove_innate_effects(mob/living/mob_override)
@@ -174,9 +174,12 @@
log_admin("[key_name(admin)] has made [new_owner.current] into a servant of Ratvar.") log_admin("[key_name(admin)] has made [new_owner.current] into a servant of Ratvar.")
/datum/antagonist/clockcult/admin_remove(mob/user) /datum/antagonist/clockcult/admin_remove(mob/user)
remove_servant_of_ratvar(owner.current, TRUE) var/mob/target = owner.current
message_admins("[key_name_admin(user)] has removed clockwork servant status from [owner.current].") if(!target)
log_admin("[key_name(user)] has removed clockwork servant status from [owner.current].") return
remove_servant_of_ratvar(target, TRUE)
message_admins("[key_name_admin(user)] has removed clockwork servant status from [target].")
log_admin("[key_name(user)] has removed clockwork servant status from [target].")
/datum/antagonist/clockcult/get_admin_commands() /datum/antagonist/clockcult/get_admin_commands()
. = ..() . = ..()
@@ -5,49 +5,49 @@ is currently following.
*/ */
GLOBAL_LIST_INIT(disease_ability_singletons, list( GLOBAL_LIST_INIT(disease_ability_singletons, list(
new /datum/disease_ability/action/cough, new /datum/disease_ability/action/cough,
new /datum/disease_ability/action/sneeze, new /datum/disease_ability/action/sneeze,
new /datum/disease_ability/action/infect, new /datum/disease_ability/action/infect,
new /datum/disease_ability/symptom/mild/cough, new /datum/disease_ability/symptom/mild/cough,
new /datum/disease_ability/symptom/mild/sneeze, new /datum/disease_ability/symptom/mild/sneeze,
new /datum/disease_ability/symptom/medium/shedding, new /datum/disease_ability/symptom/medium/shedding,
new /datum/disease_ability/symptom/medium/beard, new /datum/disease_ability/symptom/medium/beard,
new /datum/disease_ability/symptom/medium/hallucigen, new /datum/disease_ability/symptom/medium/hallucigen,
new /datum/disease_ability/symptom/medium/choking, new /datum/disease_ability/symptom/medium/choking,
new /datum/disease_ability/symptom/medium/confusion, new /datum/disease_ability/symptom/medium/confusion,
new /datum/disease_ability/symptom/medium/vomit, new /datum/disease_ability/symptom/medium/vomit,
new /datum/disease_ability/symptom/medium/voice_change, new /datum/disease_ability/symptom/medium/voice_change,
new /datum/disease_ability/symptom/medium/visionloss, new /datum/disease_ability/symptom/medium/visionloss,
new /datum/disease_ability/symptom/medium/deafness, new /datum/disease_ability/symptom/medium/deafness,
new /datum/disease_ability/symptom/powerful/narcolepsy, new /datum/disease_ability/symptom/powerful/narcolepsy,
new /datum/disease_ability/symptom/medium/fever, new /datum/disease_ability/symptom/medium/fever,
new /datum/disease_ability/symptom/medium/shivering, new /datum/disease_ability/symptom/medium/shivering,
new /datum/disease_ability/symptom/medium/headache, new /datum/disease_ability/symptom/medium/headache,
new /datum/disease_ability/symptom/medium/nano_boost, new /datum/disease_ability/symptom/medium/nano_boost,
new /datum/disease_ability/symptom/medium/nano_destroy, new /datum/disease_ability/symptom/medium/nano_destroy,
new /datum/disease_ability/symptom/medium/viraladaptation, new /datum/disease_ability/symptom/medium/viraladaptation,
new /datum/disease_ability/symptom/medium/viralevolution, new /datum/disease_ability/symptom/medium/viralevolution,
new /datum/disease_ability/symptom/medium/vitiligo, new /datum/disease_ability/symptom/medium/disfiguration,
new /datum/disease_ability/symptom/medium/revitiligo, new /datum/disease_ability/symptom/medium/polyvitiligo,
new /datum/disease_ability/symptom/medium/itching, new /datum/disease_ability/symptom/medium/itching,
new /datum/disease_ability/symptom/medium/heal/weight_loss, new /datum/disease_ability/symptom/medium/heal/weight_loss,
new /datum/disease_ability/symptom/medium/heal/sensory_restoration, new /datum/disease_ability/symptom/medium/heal/sensory_restoration,
new /datum/disease_ability/symptom/medium/heal/mind_restoration, new /datum/disease_ability/symptom/medium/heal/mind_restoration,
new /datum/disease_ability/symptom/powerful/fire, new /datum/disease_ability/symptom/powerful/fire,
new /datum/disease_ability/symptom/powerful/flesh_eating, new /datum/disease_ability/symptom/powerful/flesh_eating,
// new /datum/disease_ability/symptom/powerful/genetic_mutation, new /datum/disease_ability/symptom/powerful/genetic_mutation,
new /datum/disease_ability/symptom/powerful/inorganic_adaptation, new /datum/disease_ability/symptom/powerful/inorganic_adaptation,
new /datum/disease_ability/symptom/powerful/heal/starlight, new /datum/disease_ability/symptom/powerful/heal/starlight,
new /datum/disease_ability/symptom/powerful/heal/oxygen, new /datum/disease_ability/symptom/powerful/heal/oxygen,
new /datum/disease_ability/symptom/powerful/heal/chem, new /datum/disease_ability/symptom/powerful/heal/chem,
new /datum/disease_ability/symptom/powerful/heal/metabolism, new /datum/disease_ability/symptom/powerful/heal/metabolism,
new /datum/disease_ability/symptom/powerful/heal/dark, new /datum/disease_ability/symptom/powerful/heal/dark,
new /datum/disease_ability/symptom/powerful/heal/water, new /datum/disease_ability/symptom/powerful/heal/water,
new /datum/disease_ability/symptom/powerful/heal/plasma, new /datum/disease_ability/symptom/powerful/heal/plasma,
new /datum/disease_ability/symptom/powerful/heal/radiation, new /datum/disease_ability/symptom/powerful/heal/radiation,
new /datum/disease_ability/symptom/powerful/heal/coma, new /datum/disease_ability/symptom/powerful/heal/coma,
new /datum/disease_ability/symptom/powerful/youth new /datum/disease_ability/symptom/powerful/youth
)) ))
/datum/disease_ability /datum/disease_ability
var/name var/name
@@ -57,7 +57,7 @@ GLOBAL_LIST_INIT(disease_ability_singletons, list(
var/short_desc = "" var/short_desc = ""
var/long_desc = "" var/long_desc = ""
var/stat_block = "" var/stat_block = ""
var/threshold_block = list() var/threshold_block = ""
var/category = "" var/category = ""
var/list/symptoms var/list/symptoms
@@ -76,7 +76,7 @@ GLOBAL_LIST_INIT(disease_ability_singletons, list(
resistance += initial(S.resistance) resistance += initial(S.resistance)
stage_speed += initial(S.stage_speed) stage_speed += initial(S.stage_speed)
transmittable += initial(S.transmittable) transmittable += initial(S.transmittable)
threshold_block += initial(S.threshold_desc) threshold_block += "<br><br>[initial(S.threshold_desc)]"
stat_block = "Resistance: [resistance]<br>Stealth: [stealth]<br>Stage Speed: [stage_speed]<br>Transmissibility: [transmittable]<br><br>" stat_block = "Resistance: [resistance]<br>Stealth: [stealth]<br>Stage Speed: [stage_speed]<br>Transmissibility: [transmittable]<br><br>"
if(symptoms.len == 1) //lazy boy's dream if(symptoms.len == 1) //lazy boy's dream
name = initial(S.name) name = initial(S.name)
@@ -106,10 +106,8 @@ GLOBAL_LIST_INIT(disease_ability_singletons, list(
for(var/T in symptoms) for(var/T in symptoms)
var/datum/symptom/S = new T() var/datum/symptom/S = new T()
SD.symptoms += S SD.symptoms += S
S.OnAdd(SD)
if(SD.processing) if(SD.processing)
if(S.Start(SD)) S.Start(SD)
S.next_activation = world.time + rand(S.symptom_delay_min * 10, S.symptom_delay_max * 10)
SD.Refresh() SD.Refresh()
for(var/T in actions) for(var/T in actions)
var/datum/action/A = new T() var/datum/action/A = new T()
@@ -136,7 +134,6 @@ GLOBAL_LIST_INIT(disease_ability_singletons, list(
var/datum/symptom/S = locate(T) in SD.symptoms var/datum/symptom/S = locate(T) in SD.symptoms
if(S) if(S)
SD.symptoms -= S SD.symptoms -= S
S.OnRemove(SD)
if(SD.processing) if(SD.processing)
S.End(SD) S.End(SD)
qdel(S) qdel(S)
@@ -296,7 +293,6 @@ GLOBAL_LIST_INIT(disease_ability_singletons, list(
cost = 8 cost = 8
category = "Symptom (Strong+)" category = "Symptom (Strong+)"
/******MILD******/ /******MILD******/
/datum/disease_ability/symptom/mild/cough /datum/disease_ability/symptom/mild/cough
@@ -377,11 +373,11 @@ GLOBAL_LIST_INIT(disease_ability_singletons, list(
/datum/disease_ability/symptom/medium/viralevolution /datum/disease_ability/symptom/medium/viralevolution
symptoms = list(/datum/symptom/viralevolution) symptoms = list(/datum/symptom/viralevolution)
/datum/disease_ability/symptom/medium/vitiligo /datum/disease_ability/symptom/medium/polyvitiligo
symptoms = list(/datum/symptom/vitiligo) symptoms = list(/datum/symptom/polyvitiligo)
/datum/disease_ability/symptom/medium/revitiligo /datum/disease_ability/symptom/medium/disfiguration
symptoms = list(/datum/symptom/revitiligo) symptoms = list(/datum/symptom/disfiguration)
/datum/disease_ability/symptom/medium/itching /datum/disease_ability/symptom/medium/itching
symptoms = list(/datum/symptom/itching) symptoms = list(/datum/symptom/itching)
@@ -409,11 +405,9 @@ GLOBAL_LIST_INIT(disease_ability_singletons, list(
/datum/disease_ability/symptom/powerful/flesh_eating /datum/disease_ability/symptom/powerful/flesh_eating
symptoms = list(/datum/symptom/flesh_eating) symptoms = list(/datum/symptom/flesh_eating)
/*
/datum/disease_ability/symptom/powerful/genetic_mutation /datum/disease_ability/symptom/powerful/genetic_mutation
symptoms = list(/datum/symptom/genetic_mutation) symptoms = list(/datum/symptom/genetic_mutation)
cost = 8 cost = 8
*/
/datum/disease_ability/symptom/powerful/inorganic_adaptation /datum/disease_ability/symptom/powerful/inorganic_adaptation
symptoms = list(/datum/symptom/inorganic_adaptation) symptoms = list(/datum/symptom/inorganic_adaptation)
@@ -457,4 +451,4 @@ GLOBAL_LIST_INIT(disease_ability_singletons, list(
/datum/disease_ability/symptom/powerful/heal/coma /datum/disease_ability/symptom/powerful/heal/coma
symptoms = list(/datum/symptom/heal/coma) symptoms = list(/datum/symptom/heal/coma)
short_desc = "Cause victims to fall into a healing coma when hurt." short_desc = "Cause victims to fall into a healing coma when hurt."
long_desc = "Cause victims to fall into a healing coma when hurt." long_desc = "Cause victims to fall into a healing coma when hurt."
-1
View File
@@ -12,7 +12,6 @@
var/list/name_source var/list/name_source
show_in_antagpanel = FALSE show_in_antagpanel = FALSE
antag_moodlet = /datum/mood_event/focused antag_moodlet = /datum/mood_event/focused
can_hijack = HIJACK_PREVENT
/datum/antagonist/ert/on_gain() /datum/antagonist/ert/on_gain()
update_name() update_name()
@@ -3,7 +3,7 @@
var/obj/item/claymore/highlander/sword var/obj/item/claymore/highlander/sword
show_in_antagpanel = FALSE show_in_antagpanel = FALSE
show_name_in_check_antagonists = TRUE show_name_in_check_antagonists = TRUE
can_hijack = HIJACK_HIJACKER hijack_speed = 2 //if you kill everyone and actually haev a hand to hijack with, you win??
/datum/antagonist/highlander/apply_innate_effects(mob/living/mob_override) /datum/antagonist/highlander/apply_innate_effects(mob/living/mob_override)
var/mob/living/L = owner.current || mob_override var/mob/living/L = owner.current || mob_override
-7
View File
@@ -8,11 +8,6 @@
var/give_objectives = TRUE var/give_objectives = TRUE
var/give_equipment = TRUE var/give_equipment = TRUE
/datum/antagonist/ninja/New()
if(helping_station)
can_hijack = HIJACK_PREVENT
. = ..()
/datum/antagonist/ninja/apply_innate_effects(mob/living/mob_override) /datum/antagonist/ninja/apply_innate_effects(mob/living/mob_override)
var/mob/living/M = mob_override || owner.current var/mob/living/M = mob_override || owner.current
update_ninja_icons_added(M) update_ninja_icons_added(M)
@@ -135,8 +130,6 @@
adj = "objectiveless" adj = "objectiveless"
else else
return return
if(helping_station)
can_hijack = HIJACK_PREVENT
new_owner.assigned_role = ROLE_NINJA new_owner.assigned_role = ROLE_NINJA
new_owner.special_role = ROLE_NINJA new_owner.special_role = ROLE_NINJA
new_owner.add_antag_datum(src) new_owner.add_antag_datum(src)
@@ -8,7 +8,6 @@
var/always_new_team = FALSE //If not assigned a team by default ops will try to join existing ones, set this to TRUE to always create new team. var/always_new_team = FALSE //If not assigned a team by default ops will try to join existing ones, set this to TRUE to always create new team.
var/send_to_spawnpoint = TRUE //Should the user be moved to default spawnpoint. var/send_to_spawnpoint = TRUE //Should the user be moved to default spawnpoint.
var/nukeop_outfit = /datum/outfit/syndicate var/nukeop_outfit = /datum/outfit/syndicate
can_hijack = HIJACK_HIJACKER //Alternative way to wipe out the station.
/datum/antagonist/nukeop/proc/update_synd_icons_added(mob/living/M) /datum/antagonist/nukeop/proc/update_synd_icons_added(mob/living/M)
var/datum/atom_hud/antag/opshud = GLOB.huds[ANTAG_HUD_OPS] var/datum/atom_hud/antag/opshud = GLOB.huds[ANTAG_HUD_OPS]
@@ -4,7 +4,6 @@
show_in_antagpanel = FALSE show_in_antagpanel = FALSE
var/datum/objective/mission var/datum/objective/mission
var/datum/team/ert/ert_team var/datum/team/ert/ert_team
can_hijack = HIJACK_PREVENT
/datum/antagonist/official/greet() /datum/antagonist/official/greet()
to_chat(owner, "<B><font size=3 color=red>You are a CentCom Official.</font></B>") to_chat(owner, "<B><font size=3 color=red>You are a CentCom Official.</font></B>")
@@ -13,7 +13,7 @@
var/should_give_codewords = TRUE var/should_give_codewords = TRUE
var/should_equip = TRUE var/should_equip = TRUE
var/traitor_kind = TRAITOR_HUMAN //Set on initial assignment var/traitor_kind = TRAITOR_HUMAN //Set on initial assignment
can_hijack = HIJACK_HIJACKER hijack_speed = 0.5 //10 seconds per hijack stage by default
/datum/antagonist/traitor/on_gain() /datum/antagonist/traitor/on_gain()
if(owner.current && isAI(owner.current)) if(owner.current && isAI(owner.current))
@@ -60,6 +60,7 @@
message = GLOB.syndicate_code_response_regex.Replace(message, "<span class='red'>$1</span>") message = GLOB.syndicate_code_response_regex.Replace(message, "<span class='red'>$1</span>")
hearing_args[HEARING_RAW_MESSAGE] = message hearing_args[HEARING_RAW_MESSAGE] = message
// needs to be refactored to base /datum/antagonist sometime..
/datum/antagonist/traitor/proc/add_objective(datum/objective/O) /datum/antagonist/traitor/proc/add_objective(datum/objective/O)
objectives += O objectives += O
@@ -2,7 +2,6 @@
name = "Wishgranter Avatar" name = "Wishgranter Avatar"
show_in_antagpanel = FALSE show_in_antagpanel = FALSE
show_name_in_check_antagonists = TRUE show_name_in_check_antagonists = TRUE
can_hijack = HIJACK_HIJACKER
/datum/antagonist/wishgranter/proc/forge_objectives() /datum/antagonist/wishgranter/proc/forge_objectives()
var/datum/objective/hijack/hijack = new var/datum/objective/hijack/hijack = new
@@ -12,7 +12,6 @@
var/move_to_lair = TRUE var/move_to_lair = TRUE
var/outfit_type = /datum/outfit/wizard var/outfit_type = /datum/outfit/wizard
var/wiz_age = WIZARD_AGE_MIN /* Wizards by nature cannot be too young. */ var/wiz_age = WIZARD_AGE_MIN /* Wizards by nature cannot be too young. */
can_hijack = HIJACK_HIJACKER
/datum/antagonist/wizard/on_gain() /datum/antagonist/wizard/on_gain()
register() register()
@@ -229,7 +229,7 @@
. += "<span class='notice'>Alt-click to [locked ? "unlock" : "lock"] the interface.</span>" . += "<span class='notice'>Alt-click to [locked ? "unlock" : "lock"] the interface.</span>"
/obj/machinery/airalarm/ui_status(mob/user) /obj/machinery/airalarm/ui_status(mob/user)
if(user.has_unlimited_silicon_privilege && aidisabled) if(hasSiliconAccessInArea(user) && aidisabled)
to_chat(user, "AI control has been disabled.") to_chat(user, "AI control has been disabled.")
else if(!shorted) else if(!shorted)
return ..() return ..()
@@ -245,7 +245,7 @@
/obj/machinery/airalarm/ui_data(mob/user) /obj/machinery/airalarm/ui_data(mob/user)
var/data = list( var/data = list(
"locked" = locked, "locked" = locked,
"siliconUser" = user.has_unlimited_silicon_privilege || hasSiliconAccessInArea(user), "siliconUser" = hasSiliconAccessInArea(user),
"emagged" = (obj_flags & EMAGGED ? 1 : 0), "emagged" = (obj_flags & EMAGGED ? 1 : 0),
"danger_level" = danger_level, "danger_level" = danger_level,
) )
@@ -288,7 +288,7 @@
"danger_level" = cur_tlv.get_danger_level(environment.gases[gas_id] * partial_pressure) "danger_level" = cur_tlv.get_danger_level(environment.gases[gas_id] * partial_pressure)
)) ))
if(!locked || user.has_unlimited_silicon_privilege || hasSiliconAccessInArea(user)) if(!locked || hasSiliconAccessInArea(user, PRIVILEDGES_SILICON|PRIVILEDGES_DRONE))
data["vents"] = list() data["vents"] = list()
for(var/id_tag in A.air_vent_names) for(var/id_tag in A.air_vent_names)
var/long_name = A.air_vent_names[id_tag] var/long_name = A.air_vent_names[id_tag]
@@ -368,12 +368,14 @@
/obj/machinery/airalarm/ui_act(action, params) /obj/machinery/airalarm/ui_act(action, params)
if(..() || buildstage != 2) if(..() || buildstage != 2)
return return
if((locked && !usr.has_unlimited_silicon_privilege && !hasSiliconAccessInArea(usr)) || (usr.has_unlimited_silicon_privilege && aidisabled)) var/silicon_access = hasSiliconAccessInArea(usr)
var/bot_priviledges = silicon_access || (usr.silicon_privileges & PRIVILEDGES_DRONE)
if((locked && !bot_priviledges) || (silicon_access && aidisabled))
return return
var/device_id = params["id_tag"] var/device_id = params["id_tag"]
switch(action) switch(action)
if("lock") if("lock")
if(usr.has_unlimited_silicon_privilege && !wires.is_cut(WIRE_IDSCAN)) if(bot_priviledges && !wires.is_cut(WIRE_IDSCAN))
locked = !locked locked = !locked
. = TRUE . = TRUE
if("power", "toggle_filter", "widenet", "scrubbing") if("power", "toggle_filter", "widenet", "scrubbing")
+3 -12
View File
@@ -24,13 +24,13 @@
export_types = list(/obj/structure/ore_box) export_types = list(/obj/structure/ore_box)
/datum/export/large/crate/wood /datum/export/large/crate/wood
cost = 140 // cost = 140
unit_name = "wooden crate" unit_name = "wooden crate"
export_types = list(/obj/structure/closet/crate/wooden) export_types = list(/obj/structure/closet/crate/wooden)
exclude_types = list() exclude_types = list()
/datum/export/large/barrel /datum/export/large/barrel
cost = 500 //150 to make meaning proffit of 350 cost = 300 //double the wooden cost of a coffin.
unit_name = "wooden barrel" unit_name = "wooden barrel"
export_types = list(/obj/structure/fermenting_barrel) export_types = list(/obj/structure/fermenting_barrel)
@@ -40,19 +40,11 @@
export_types = list(/obj/structure/closet/crate/coffin) export_types = list(/obj/structure/closet/crate/coffin)
/datum/export/large/reagent_dispenser /datum/export/large/reagent_dispenser
cost = 100 // +0-400 depending on amount of reagents left cost = 100
var/contents_cost = 400
/datum/export/large/reagent_dispenser/get_cost(obj/O)
var/obj/structure/reagent_dispensers/D = O
var/ratio = D.reagents.total_volume / D.reagents.maximum_volume
return ..() + round(contents_cost * ratio)
/datum/export/large/reagent_dispenser/water /datum/export/large/reagent_dispenser/water
unit_name = "watertank" unit_name = "watertank"
export_types = list(/obj/structure/reagent_dispensers/watertank) export_types = list(/obj/structure/reagent_dispensers/watertank)
contents_cost = 200
/datum/export/large/reagent_dispenser/fuel /datum/export/large/reagent_dispenser/fuel
unit_name = "fueltank" unit_name = "fueltank"
@@ -60,7 +52,6 @@
/datum/export/large/reagent_dispenser/beer /datum/export/large/reagent_dispenser/beer
unit_name = "beer keg" unit_name = "beer keg"
contents_cost = 700
export_types = list(/obj/structure/reagent_dispensers/beerkeg) export_types = list(/obj/structure/reagent_dispensers/beerkeg)
/datum/export/large/pipedispenser /datum/export/large/pipedispenser
-5
View File
@@ -65,11 +65,6 @@
material_id = MAT_TITANIUM material_id = MAT_TITANIUM
message = "cm3 of titanium" message = "cm3 of titanium"
/datum/export/material/plastitanium
cost = 165 // plasma + titanium costs
material_id = MAT_TITANIUM // code can only check for one material_id; plastitanium is half plasma, half titanium
message = "cm3 of plastitanium"
/datum/export/material/plastic /datum/export/material/plastic
cost = 5 cost = 5
material_id = MAT_PLASTIC material_id = MAT_PLASTIC
+10
View File
@@ -67,6 +67,16 @@
message = "of plasteel" message = "of plasteel"
export_types = list(/obj/item/stack/sheet/plasteel) export_types = list(/obj/item/stack/sheet/plasteel)
/datum/export/material/plastitanium
cost = 165 // plasma + titanium costs
export_types = list(/obj/item/stack/sheet/mineral/plastitanium)
message = "of plastitanium"
/datum/export/material/plastitanium_glass
cost = 168 // plasma + titanium + glass costs
export_types = list(/obj/item/stack/sheet/plastitaniumglass)
message = "of plastitanium glass"
// 1 glass + 0.5 metal, cost is rounded up. // 1 glass + 0.5 metal, cost is rounded up.
/datum/export/stack/rglass /datum/export/stack/rglass
cost = 6 cost = 6

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