diff --git a/.travis.yml b/.travis.yml index 880562ca659..2d03fe999d5 100644 --- a/.travis.yml +++ b/.travis.yml @@ -17,9 +17,14 @@ matrix: - python3-pip - python3-setuptools - pcregrep + - rustc + - cargo + cache: + directories: + - $HOME/SpacemanDMM install: - tools/travis/install_build_tools.sh - - tools/travis/install_spaceman_dmm.sh dreamchecker + - tools/travis/build_spaceman_dmm.sh dreamchecker script: - tools/travis/check_filedirs.sh tgstation.dme - tools/travis/check_changelogs.sh diff --git a/_maps/RandomRuins/SpaceRuins/hellfactory.dmm b/_maps/RandomRuins/SpaceRuins/hellfactory.dmm index 6e973667359..b1d621dc52c 100644 --- a/_maps/RandomRuins/SpaceRuins/hellfactory.dmm +++ b/_maps/RandomRuins/SpaceRuins/hellfactory.dmm @@ -75,7 +75,9 @@ /area/ruin/space/has_grav/hellfactoryoffice) "ak" = ( /obj/machinery/atmospherics/components/unary/tank/oxygen{ - gas_type = /datum/gas/water_vapor + dir = 8; + gas_type = /datum/gas/water_vapor; + initialize_directions = 8 }, /turf/open/floor/plasteel/grimy, /area/ruin/space/has_grav/hellfactoryoffice) @@ -161,7 +163,7 @@ /obj/machinery/atmospherics/pipe/heat_exchanging/simple{ dir = 4 }, -/turf/closed/wall, +/turf/open/floor/plastic, /area/ruin/space/has_grav/hellfactory) "ax" = ( /obj/machinery/atmospherics/pipe/heat_exchanging/manifold{ @@ -834,6 +836,7 @@ /obj/effect/turf_decal{ dir = 5 }, +/obj/structure/fluff/broken_flooring, /turf/open/floor/plating, /area/ruin/space/has_grav/hellfactory) "cz" = ( @@ -851,10 +854,6 @@ /obj/item/stack/tile/plasteel, /turf/open/floor/plating, /area/ruin/space/has_grav/hellfactory) -"cC" = ( -/obj/structure/sign/warning/vacuum, -/turf/open/floor/plating, -/area/ruin/space/has_grav/hellfactory) "cD" = ( /obj/structure/ore_box, /obj/effect/turf_decal/delivery/white, @@ -978,7 +977,11 @@ "lR" = ( /obj/machinery/light/floor, /obj/effect/turf_decal/bot_white/right, -/turf/open/floor/plating, +/turf/open/floor/plasteel/dark, +/area/ruin/space/has_grav/hellfactory) +"nd" = ( +/obj/structure/sign/warning/vacuum, +/turf/closed/wall, /area/ruin/space/has_grav/hellfactory) "nT" = ( /obj/structure/rack, @@ -995,6 +998,9 @@ }, /turf/open/floor/plasteel/checker, /area/ruin/space/has_grav/hellfactory) +"oJ" = ( +/turf/open/floor/plasteel/dark, +/area/ruin/space/has_grav/hellfactory) "qB" = ( /obj/item/pressure_plate/hologrid{ reward = /obj/item/skub @@ -1005,7 +1011,7 @@ /obj/effect/decal/cleanable/dirt/dust, /obj/machinery/light/floor, /obj/effect/turf_decal/bot_white/left, -/turf/open/floor/plating, +/turf/open/floor/plasteel/dark, /area/ruin/space/has_grav/hellfactory) "rC" = ( /obj/structure/sign/poster/random, @@ -1015,7 +1021,7 @@ /obj/effect/decal/cleanable/dirt/dust, /obj/machinery/light/floor, /obj/effect/turf_decal/bot_white/right, -/turf/open/floor/plating, +/turf/open/floor/plasteel/dark, /area/ruin/space/has_grav/hellfactory) "wv" = ( /obj/machinery/power/apc/highcap/ten_k{ @@ -1037,7 +1043,7 @@ "BC" = ( /obj/machinery/light/floor, /obj/effect/turf_decal/bot_white/left, -/turf/open/floor/plating, +/turf/open/floor/plasteel/dark, /area/ruin/space/has_grav/hellfactory) "EP" = ( /obj/structure/cable, @@ -1095,6 +1101,19 @@ /obj/effect/decal/cleanable/dirt/dust, /turf/open/floor/plating, /area/ruin/space/has_grav/hellfactory) +"Yd" = ( +/obj/machinery/light/small, +/turf/open/floor/plasteel/grimy, +/area/ruin/space/has_grav/hellfactoryoffice) +"Zh" = ( +/obj/structure/closet/crate/trashcart, +/obj/item/stack/sheet/mineral/plasma, +/turf/open/floor/plating, +/area/ruin/space/has_grav/hellfactory) +"Zq" = ( +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/floor/plasteel/dark, +/area/ruin/space/has_grav/hellfactory) (1,1,1) = {" aa @@ -1355,8 +1374,8 @@ cV by Wh BC -by -Wh +oJ +Zq ry by by @@ -1373,7 +1392,7 @@ ah al ao aG -ao +Yd ah bg aA @@ -1381,10 +1400,10 @@ bL aA Wh Wh +oJ by by -by -by +oJ Wh by cw @@ -1409,8 +1428,8 @@ by by by lR -by -by +oJ +oJ uL by Wh @@ -1481,7 +1500,7 @@ ah ap ao aK -ao +Yd ah aA bn @@ -1548,9 +1567,9 @@ zI EP zI lv -cr +Zh cA -cC +by ab aa aa @@ -1578,7 +1597,7 @@ aL cr cB cL -ab +nd aa aa "} diff --git a/_maps/RandomRuins/SpaceRuins/intactemptyship.dmm b/_maps/RandomRuins/SpaceRuins/intactemptyship.dmm index 9bb394663ad..d41de462c97 100644 --- a/_maps/RandomRuins/SpaceRuins/intactemptyship.dmm +++ b/_maps/RandomRuins/SpaceRuins/intactemptyship.dmm @@ -73,7 +73,7 @@ /area/ruin/space/has_grav/powered/authorship) "o" = ( /obj/structure/table/wood, -/obj/machinery/computer/libraryconsole/bookmanagement, +/obj/machinery/computer/bookmanagement, /turf/open/floor/mineral/titanium/purple, /area/ruin/space/has_grav/powered/authorship) "p" = ( diff --git a/_maps/RandomRuins/SpaceRuins/listeningstation.dmm b/_maps/RandomRuins/SpaceRuins/listeningstation.dmm index 27e69a18d86..1e7ca9f9848 100644 --- a/_maps/RandomRuins/SpaceRuins/listeningstation.dmm +++ b/_maps/RandomRuins/SpaceRuins/listeningstation.dmm @@ -24,7 +24,7 @@ pixel_y = 24 }, /obj/effect/decal/cleanable/dirt, -/obj/machinery/computer/libraryconsole/bookmanagement, +/obj/machinery/computer/bookmanagement, /turf/open/floor/plasteel/dark, /area/ruin/space/has_grav/listeningstation) "af" = ( diff --git a/_maps/map_files/Deltastation/DeltaStation2.dmm b/_maps/map_files/Deltastation/DeltaStation2.dmm index 60de9748ead..70684d07872 100644 --- a/_maps/map_files/Deltastation/DeltaStation2.dmm +++ b/_maps/map_files/Deltastation/DeltaStation2.dmm @@ -381,7 +381,8 @@ "aaQ" = ( /obj/machinery/door/window{ dir = 2; - name = "Secure Art Exhibition" + name = "Secure Art Exhibition"; + req_access_txt = "37" }, /obj/structure/table/wood/fancy, /obj/structure/sign/painting/library_secure{ @@ -17538,7 +17539,7 @@ /area/security/prison) "aMe" = ( /obj/structure/table, -/obj/machinery/computer/libraryconsole/bookmanagement, +/obj/machinery/computer/bookmanagement, /obj/structure/cable, /turf/open/floor/plating, /area/security/prison) @@ -64400,7 +64401,8 @@ }, /obj/machinery/door/window{ dir = 8; - name = "Library Desk" + name = "Library Desk"; + req_access_txt = "37" }, /turf/open/floor/plasteel/grimy, /area/library) @@ -64426,7 +64428,7 @@ /area/library) "cpz" = ( /obj/structure/table/wood, -/obj/machinery/computer/libraryconsole/bookmanagement, +/obj/machinery/computer/bookmanagement, /obj/machinery/newscaster{ pixel_x = 32 }, @@ -98264,7 +98266,7 @@ pixel_x = -3; pixel_y = 2 }, -/obj/item/broom, +/obj/item/pushbroom, /turf/open/floor/plating{ icon_state = "platingdmg2" }, @@ -113598,6 +113600,14 @@ }, /turf/open/floor/plasteel, /area/maintenance/port) +"kzm" = ( +/obj/effect/turf_decal/tile/blue{ + dir = 4 + }, +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden, +/turf/open/floor/plasteel/white, +/area/medical/medbay/central) "kDh" = ( /obj/structure/table/reinforced, /obj/effect/turf_decal/tile/neutral{ @@ -113613,14 +113623,6 @@ /obj/structure/displaycase/forsale, /turf/open/floor/plasteel/dark, /area/crew_quarters/bar) -"kzm" = ( -/obj/effect/turf_decal/tile/blue{ - dir = 4 - }, -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden, -/turf/open/floor/plasteel/white, -/area/medical/medbay/central) "kEN" = ( /obj/effect/decal/cleanable/dirt, /turf/closed/wall, diff --git a/_maps/map_files/Donutstation/Donutstation.dmm b/_maps/map_files/Donutstation/Donutstation.dmm index 3e0e24d6194..e6c78510236 100644 --- a/_maps/map_files/Donutstation/Donutstation.dmm +++ b/_maps/map_files/Donutstation/Donutstation.dmm @@ -16357,7 +16357,7 @@ /area/library) "aLD" = ( /obj/structure/table/wood, -/obj/machinery/computer/libraryconsole/bookmanagement, +/obj/machinery/computer/bookmanagement, /turf/open/floor/carpet, /area/library) "aLE" = ( @@ -19541,7 +19541,7 @@ /area/maintenance/disposal/incinerator) "aSY" = ( /obj/structure/table, -/obj/machinery/computer/libraryconsole/bookmanagement, +/obj/machinery/computer/bookmanagement, /obj/effect/decal/cleanable/dirt, /turf/open/floor/plasteel, /area/security/prison/rec) diff --git a/_maps/map_files/KiloStation/KiloStation.dmm b/_maps/map_files/KiloStation/KiloStation.dmm index aea38b4705f..b9a2222b395 100644 --- a/_maps/map_files/KiloStation/KiloStation.dmm +++ b/_maps/map_files/KiloStation/KiloStation.dmm @@ -48855,7 +48855,7 @@ dir = 1 }, /obj/structure/table/wood, -/obj/machinery/computer/libraryconsole/bookmanagement{ +/obj/machinery/computer/bookmanagement{ pixel_y = 5 }, /obj/machinery/light{ @@ -58121,7 +58121,7 @@ /turf/open/floor/plasteel/dark, /area/crew_quarters/locker) "bJz" = ( -/obj/machinery/computer/libraryconsole/bookmanagement, +/obj/machinery/computer/bookmanagement, /obj/structure/table, /obj/effect/decal/cleanable/dirt, /obj/effect/turf_decal/tile/red, @@ -87942,7 +87942,7 @@ /area/engine/engineering) "cEr" = ( /obj/structure/table/wood, -/obj/machinery/computer/libraryconsole/bookmanagement{ +/obj/machinery/computer/bookmanagement{ pixel_y = 5 }, /obj/effect/turf_decal/tile/neutral, diff --git a/_maps/map_files/MetaStation/MetaStation.dmm b/_maps/map_files/MetaStation/MetaStation.dmm index 100d0ca6987..c7f7d627adb 100644 --- a/_maps/map_files/MetaStation/MetaStation.dmm +++ b/_maps/map_files/MetaStation/MetaStation.dmm @@ -481,7 +481,7 @@ /area/security/prison) "abl" = ( /obj/structure/table, -/obj/machinery/computer/libraryconsole/bookmanagement, +/obj/machinery/computer/bookmanagement, /obj/effect/decal/cleanable/dirt, /turf/open/floor/plasteel, /area/security/prison) @@ -64517,7 +64517,7 @@ /area/hallway/primary/central) "cVe" = ( /obj/structure/table/wood, -/obj/machinery/computer/libraryconsole/bookmanagement, +/obj/machinery/computer/bookmanagement, /obj/structure/noticeboard{ desc = "A board for pinning important notices upon. Probably helpful for keeping track of requests."; dir = 8; @@ -77104,7 +77104,7 @@ /turf/open/floor/plasteel, /area/security/checkpoint/engineering) "vGs" = ( -/obj/item/broom, +/obj/item/pushbroom, /obj/structure/closet{ name = "janitorial supplies" }, diff --git a/_maps/map_files/Mining/Lavaland.dmm b/_maps/map_files/Mining/Lavaland.dmm index faac3a6a421..38f7525c92e 100644 --- a/_maps/map_files/Mining/Lavaland.dmm +++ b/_maps/map_files/Mining/Lavaland.dmm @@ -106,7 +106,7 @@ /area/mine/laborcamp) "au" = ( /obj/structure/table, -/obj/machinery/computer/libraryconsole/bookmanagement, +/obj/machinery/computer/bookmanagement, /obj/effect/decal/cleanable/dirt, /turf/open/floor/plasteel, /area/mine/laborcamp) diff --git a/_maps/map_files/PubbyStation/PubbyStation.dmm b/_maps/map_files/PubbyStation/PubbyStation.dmm index b5ee1ff531b..4dd4fc1301e 100644 --- a/_maps/map_files/PubbyStation/PubbyStation.dmm +++ b/_maps/map_files/PubbyStation/PubbyStation.dmm @@ -1626,7 +1626,7 @@ /turf/open/floor/plating, /area/ai_monitored/turret_protected/AIsatextAS) "afn" = ( -/obj/machinery/computer/libraryconsole/bookmanagement, +/obj/machinery/computer/bookmanagement, /obj/structure/table, /obj/machinery/newscaster{ pixel_x = -32 @@ -44929,7 +44929,7 @@ /area/library/lounge) "clp" = ( /obj/structure/table/wood, -/obj/machinery/computer/libraryconsole/bookmanagement, +/obj/machinery/computer/bookmanagement, /turf/open/floor/plasteel/dark, /area/library) "cls" = ( @@ -54055,11 +54055,7 @@ pixel_x = 32 }, /obj/effect/decal/cleanable/dirt, -/obj/machinery/atmospherics/components/unary/vent_pump/on{ - external_pressure_bound = 140; - name = "server vent"; - pressure_checks = 0 - }, +/obj/machinery/atmospherics/components/unary/vent_pump/on, /turf/open/floor/plasteel/dark, /area/library/artgallery) "nLl" = ( @@ -77221,7 +77217,7 @@ cgG cgG bWV cfn -ceP +ceJ cwe cwr clm diff --git a/_maps/map_files/generic/CentCom.dmm b/_maps/map_files/generic/CentCom.dmm index 80d299181dd..0663bebcd7c 100644 --- a/_maps/map_files/generic/CentCom.dmm +++ b/_maps/map_files/generic/CentCom.dmm @@ -11959,7 +11959,7 @@ /area/centcom/holding) "Bs" = ( /obj/structure/table/wood, -/obj/machinery/computer/libraryconsole/bookmanagement, +/obj/machinery/computer/bookmanagement, /turf/open/floor/wood, /area/centcom/holding) "Bu" = ( diff --git a/_maps/shuttles/emergency_imfedupwiththisworld.dmm b/_maps/shuttles/emergency_imfedupwiththisworld.dmm index 59fa477058e..27f3f1b198c 100644 --- a/_maps/shuttles/emergency_imfedupwiththisworld.dmm +++ b/_maps/shuttles/emergency_imfedupwiththisworld.dmm @@ -163,7 +163,7 @@ /area/shuttle/escape) "A" = ( /obj/structure/table/wood, -/obj/machinery/computer/libraryconsole/bookmanagement, +/obj/machinery/computer/bookmanagement, /turf/open/floor/wood, /area/shuttle/escape) "B" = ( diff --git a/code/__DEFINES/DNA.dm b/code/__DEFINES/DNA.dm index 3719ec84df2..8f8f05fd678 100644 --- a/code/__DEFINES/DNA.dm +++ b/code/__DEFINES/DNA.dm @@ -54,6 +54,8 @@ #define GELADIKINESIS /datum/mutation/human/geladikinesis #define CRYOKINESIS /datum/mutation/human/cryokinesis #define SPIDER_WEB /datum/mutation/human/webbing +#define MARTYRDOM /datum/mutation/human/martyrdom +#define HARS /datum/mutation/human/headless #define UI_CHANGED "ui changed" #define UE_CHANGED "ue changed" diff --git a/code/__DEFINES/dcs/signals.dm b/code/__DEFINES/dcs/signals.dm index 8fbad1070c7..e3b66881cae 100644 --- a/code/__DEFINES/dcs/signals.dm +++ b/code/__DEFINES/dcs/signals.dm @@ -216,6 +216,8 @@ #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_LIVING_REGENERATE_LIMBS "living_regen_limbs" //from base of /mob/living/regenerate_limbs(): (noheal, excluded_limbs) +#define COMSIG_LIVING_ATTACH_LIMB "living_attach_limb" //from base of /obj/item/bodypart/proc/attach_limb(): (new_limb, special) allows you to fail limb attachment + #define COMPONENT_NO_ATTACH 1 #define COMSIG_PROCESS_BORGCHARGER_OCCUPANT "living_charge" //sent from borg recharge stations: (amount, repairs) #define COMSIG_MOB_CLIENT_LOGIN "comsig_mob_client_login" //sent when a mob/login() finishes: (client) #define COMSIG_BORG_SAFE_DECONSTRUCT "borg_safe_decon" //sent from borg mobs to itself, for tools to catch an upcoming destroy() due to safe decon (rather than detonation) @@ -275,6 +277,8 @@ #define COMPONENT_BLOCK_SHARPEN_BLOCKED 2 #define COMPONENT_BLOCK_SHARPEN_ALREADY 4 #define COMPONENT_BLOCK_SHARPEN_MAXED 8 +#define COMSIG_TOOL_IN_USE "tool_in_use" ///from base of [/obj/item/proc/tool_check_callback]: (mob/living/user) +#define COMSIG_TOOL_START_USE "tool_start_use" ///from base of [/obj/item/proc/tool_start_check]: (mob/living/user) // /obj/item signals for economy #define COMSIG_ITEM_SOLD "item_sold" //called when an item is sold by the exports subsystem diff --git a/code/__DEFINES/skills.dm b/code/__DEFINES/skills.dm index e61cb51ab77..c757af43b21 100644 --- a/code/__DEFINES/skills.dm +++ b/code/__DEFINES/skills.dm @@ -17,7 +17,9 @@ #define SKILL_EXP_LEGENDARY 2500 //Skill modifier types -#define SKILL_SPEED_MODIFIER "skill_speed_modifier" +#define SKILL_SPEED_MODIFIER "skill_speed_modifier"//ideally added/subtracted in speed calculations to make you do stuff faster +#define SKILL_PROBS_MODIFIER "skill_probability_modifier"//ideally added/subtracted where beneficial in prob(x) calls +#define SKILL_RANDS_MODIFIER "skill_randomness_modifier"//ideally added/subtracted where beneficial in rand(x,y) calls // Gets the reference for the skill type that was given diff --git a/code/__DEFINES/spaceman_dmm.dm b/code/__DEFINES/spaceman_dmm.dm index b9c0544bc10..3d4207c5c97 100644 --- a/code/__DEFINES/spaceman_dmm.dm +++ b/code/__DEFINES/spaceman_dmm.dm @@ -6,10 +6,26 @@ #define RETURN_TYPE(X) set SpacemanDMM_return_type = X #define SHOULD_CALL_PARENT(X) set SpacemanDMM_should_call_parent = X #define UNLINT(X) SpacemanDMM_unlint(X) + #define SHOULD_NOT_OVERRIDE(X) set SpacemanDMM_should_not_override = X + #define SHOULD_NOT_SLEEP(X) set SpacemanDMM_should_not_sleep = X + #define SHOULD_BE_PURE(X) set SpacemanDMM_should_be_pure = X + #define PRIVATE_PROC(X) set SpacemanDMM_private_proc = X + #define PROTECTED_PROC(X) set SpacemanDMM_protected_proc = X + #define VAR_FINAL var/SpacemanDMM_final + #define VAR_PRIVATE var/SpacemanDMM_private + #define VAR_PROTECTED var/SpacemanDMM_protected #else #define RETURN_TYPE(X) #define SHOULD_CALL_PARENT(X) #define UNLINT(X) X + #define SHOULD_NOT_OVERRIDE(X) + #define SHOULD_NOT_SLEEP(X) + #define SHOULD_BE_PURE(X) + #define PRIVATE_PROC(X) + #define PROTECTED_PROC(X) + #define VAR_FINAL var + #define VAR_PRIVATE var + #define VAR_PROTECTED var #endif /world/proc/enable_debugger() diff --git a/code/__DEFINES/traits.dm b/code/__DEFINES/traits.dm index ea8237e679d..09584eb27e5 100644 --- a/code/__DEFINES/traits.dm +++ b/code/__DEFINES/traits.dm @@ -165,6 +165,8 @@ Remember to update _globalvars/traits.dm if you're adding/removing/renaming trai #define TRAIT_NAIVE "naive" #define TRAIT_PRIMITIVE "primitive" #define TRAIT_GUNFLIP "gunflip" +#define TRAIT_BLOODCRAWL_EAT "bloodcrawl_eat" +#define TRAIT_GAMERGOD "gamer-god" //double arcade prizes //non-mob traits #define TRAIT_PARALYSIS "paralysis" //Used for limb-based paralysis, where replacing the limb will fix it diff --git a/code/__HELPERS/unsorted.dm b/code/__HELPERS/unsorted.dm index 70a24287f3a..60c05c9897e 100644 --- a/code/__HELPERS/unsorted.dm +++ b/code/__HELPERS/unsorted.dm @@ -1274,6 +1274,7 @@ GLOBAL_DATUM_INIT(dview_mob, /mob/dview, new) var/ready_to_die = FALSE /mob/dview/Initialize() //Properly prevents this mob from gaining huds or joining any global lists + SHOULD_CALL_PARENT(FALSE) return INITIALIZE_HINT_NORMAL /mob/dview/Destroy(force = FALSE) diff --git a/code/_globalvars/lists/maintenance_loot.dm b/code/_globalvars/lists/maintenance_loot.dm index 4be245d06b8..c0d3557f63d 100644 --- a/code/_globalvars/lists/maintenance_loot.dm +++ b/code/_globalvars/lists/maintenance_loot.dm @@ -78,7 +78,7 @@ GLOBAL_LIST_INIT(common_loot, list( //common: basic items /obj/item/geiger_counter = 1, /obj/item/analyzer = 1, /obj/item/mop = 1, - /obj/item/broom = 1, + /obj/item/pushbroom = 1, /obj/item/reagent_containers/glass/bucket = 1, /obj/item/toy/crayon/spraycan = 1, ) = 1, diff --git a/code/_globalvars/traits.dm b/code/_globalvars/traits.dm index 1b38a810f7b..c486bb96bf5 100644 --- a/code/_globalvars/traits.dm +++ b/code/_globalvars/traits.dm @@ -99,7 +99,8 @@ GLOBAL_LIST_INIT(traits_by_type, list( "TRAIT_XENO_IMMUNE" = TRAIT_XENO_IMMUNE, "TRAIT_NAIVE" = TRAIT_NAIVE, "TRAIT_PRIMITIVE" = TRAIT_PRIMITIVE, //unable to use mechs. Given to Ash Walkers - "TRAIT_GUNFLIP" = TRAIT_GUNFLIP + "TRAIT_GUNFLIP" = TRAIT_GUNFLIP, + "TRAIT_BLOODCRAWL_EAT" = TRAIT_BLOODCRAWL_EAT, ), /obj/item/bodypart = list( "TRAIT_PARALYSIS" = TRAIT_PARALYSIS diff --git a/code/controllers/subsystem.dm b/code/controllers/subsystem.dm index 24390c59235..5cf2407002c 100644 --- a/code/controllers/subsystem.dm +++ b/code/controllers/subsystem.dm @@ -46,6 +46,7 @@ //This is used so the mc knows when the subsystem sleeps. do not override. /datum/controller/subsystem/proc/ignite(resumed = 0) + SHOULD_NOT_OVERRIDE(TRUE) set waitfor = 0 . = SS_SLEEPING fire(resumed) diff --git a/code/controllers/subsystem/mapping.dm b/code/controllers/subsystem/mapping.dm index 271e9e5a20b..2ab53766a6a 100644 --- a/code/controllers/subsystem/mapping.dm +++ b/code/controllers/subsystem/mapping.dm @@ -523,6 +523,7 @@ GLOBAL_LIST_EMPTY(the_station_areas) //DO NOT CALL THIS PROC DIRECTLY, CALL wipe_reservations(). /datum/controller/subsystem/mapping/proc/do_wipe_turf_reservations() + PRIVATE_PROC(TRUE) UNTIL(initialized) //This proc is for AFTER init, before init turf reservations won't even exist and using this will likely break things. for(var/i in turf_reservations) var/datum/turf_reservation/TR = i diff --git a/code/datums/components/label.dm b/code/datums/components/label.dm new file mode 100644 index 00000000000..5c94adecd19 --- /dev/null +++ b/code/datums/components/label.dm @@ -0,0 +1,69 @@ +/** + The label component. + + This component is used to manage labels applied by the hand labeler. + + Atoms can only have one instance of this component, and therefore only one label at a time. + This is to avoid having names like "Backpack (label1) (label2) (label3)". This is annoying and abnoxious to read. + + When a player clicks the atom with a hand labeler to apply a label, this component gets applied to it. + If the labeler is off, the component will be removed from it, and the label will be removed from its name. + */ +/datum/component/label + dupe_mode = COMPONENT_DUPE_UNIQUE_PASSARGS + /// The name of the label the player is applying to the parent. + var/label_name + +/datum/component/label/Initialize(_label_name) + if(!isatom(parent)) + return COMPONENT_INCOMPATIBLE + + label_name = _label_name + + // Add the label to the name of the object in the format of: "Item name (label)" + var/atom/owner = parent + owner.name += " ([label_name])" + +/datum/component/label/RegisterWithParent() + RegisterSignal(parent, COMSIG_PARENT_ATTACKBY, .proc/RemoveLabel) + RegisterSignal(parent, COMSIG_PARENT_EXAMINE, .proc/Examine) + +/datum/component/label/UnregisterFromParent() + UnregisterSignal(parent, list(COMSIG_PARENT_ATTACKBY, COMSIG_PARENT_EXAMINE)) + +/** + This proc will trigger when any object is used to attack the parent. + + If the attacking object is not a hand labeler, it will return. + If the attacking object is a hand labeler it will restore the name of the parent to what it was before this component was added to it, and the component will be deleted. + + Arguments: + * source: The parent. + * attacker: The object that is hitting the parent. + * user: The mob who is wielding the attacking object. +*/ +/datum/component/label/proc/RemoveLabel(datum/source, obj/item/attacker, mob/user) + // If the attacking object is not a hand labeler or its mode is 1 (has a label ready to apply), return. + // The hand labeler should be off (mode is 0), in order to remove a label. + var/obj/item/hand_labeler/labeler = attacker + if(!istype(labeler) || labeler.mode) + return + + var/atom/owner = source // Source will be the owner / parent of this component. + owner.name = replacetext(owner.name, "([label_name])", "") // Remove the label text from the parent's name, wherever it may be. + owner.name = trim(owner.name) // Shave off any white space from the beginning or end of the parent's name. + playsound(owner, 'sound/items/poster_ripped.ogg', 20, TRUE) + to_chat(user, "You remove the label from [owner].") + qdel(src) // Remove the component from the object. + +/** + This proc will trigger when someone examines the parent. + It will attach the text found in the body of the proc to the `examine_list` and display it to the player examining the parent. + + Arguments: + * source: The parent. + * user: The mob exmaining the parent. + * examine_list: The current list of text getting passed from the parent's normal examine() proc. +*/ +/datum/component/label/proc/Examine(datum/source, mob/user, list/examine_list) + examine_list += "It has a label with some words written on it. Use a hand labeler to remove it." diff --git a/code/datums/diseases/gastrolisis.dm b/code/datums/diseases/gastrolisis.dm index 96efd38d5bc..119ccc0c60e 100644 --- a/code/datums/diseases/gastrolisis.dm +++ b/code/datums/diseases/gastrolisis.dm @@ -82,5 +82,5 @@ var/obj/item/storage/backpack/bag = H.get_item_by_slot(ITEM_SLOT_BACK) if(istype(bag, /obj/item/storage/backpack/snail)) bag.emptyStorage() - H.doUnEquip(bag, TRUE, no_move = TRUE) + H.temporarilyRemoveItemFromInventory(bag, TRUE) qdel(bag) diff --git a/code/datums/elements/tool_flash.dm b/code/datums/elements/tool_flash.dm new file mode 100644 index 00000000000..622fe51c12e --- /dev/null +++ b/code/datums/elements/tool_flash.dm @@ -0,0 +1,33 @@ +/** + * Tool flash bespoke element + * + * Flashes the user when using this tool + */ +/datum/element/tool_flash + element_flags = ELEMENT_BESPOKE + id_arg_index = 2 + /// Strength of the flash + var/flash_strength + +/datum/element/tool_flash/Attach(datum/target, flash_strength) + . = ..() + if(!isitem(target)) + return ELEMENT_INCOMPATIBLE + + src.flash_strength = flash_strength + + RegisterSignal(target, COMSIG_TOOL_IN_USE, .proc/prob_flash) + RegisterSignal(target, COMSIG_TOOL_START_USE, .proc/flash) + +/datum/element/tool_flash/Detach(datum/source, force) + . = ..() + UnregisterSignal(source, list(COMSIG_TOOL_IN_USE, COMSIG_TOOL_START_USE)) + +/datum/element/tool_flash/proc/prob_flash(datum/source, mob/living/user) + if(prob(90)) + return + flash(source, user) + +/datum/element/tool_flash/proc/flash(datum/source, mob/living/user) + if(user && get_dist(get_turf(source), get_turf(user)) <= 1) + user.flash_act(min(flash_strength,1)) diff --git a/code/datums/http.dm b/code/datums/http.dm index 58eb815acbf..8cac03d2bd0 100644 --- a/code/datums/http.dm +++ b/code/datums/http.dm @@ -30,7 +30,7 @@ id = rustg_http_request_async(method, url, body, headers) if (isnull(text2num(id))) - CRASH("Proc error: [id]") + stack_trace("Proc error: [id]") _raw_response = "Proc error: [id]" else in_progress = TRUE diff --git a/code/datums/mind.dm b/code/datums/mind.dm index 118b691345c..f6fc597446c 100644 --- a/code/datums/mind.dm +++ b/code/datums/mind.dm @@ -149,9 +149,9 @@ if(silent) return if(known_skills[S] >= old_level) - to_chat(current, "I feel like I've become more proficient at [S.name]!") + S.level_gained(src, known_skills[S], old_level) else - to_chat(current, "I feel like I've become worse at [S.name]!") + S.level_lost(src, known_skills[S], old_level) ///Gets the skill's singleton and returns the result of its get_skill_modifier /datum/mind/proc/get_skill_modifier(skill, modifier) diff --git a/code/datums/mutations/_combined.dm b/code/datums/mutations/_combined.dm index 46d7128b0a0..77d581e0214 100644 --- a/code/datums/mutations/_combined.dm +++ b/code/datums/mutations/_combined.dm @@ -36,3 +36,7 @@ /datum/generecipe/tonguechem required = "/datum/mutation/human/tongue_spike; /datum/mutation/human/stimmed" result = TONGUESPIKECHEM + +/datum/generecipe/martyrdom + required = "/datum/mutation/human/strong; /datum/mutation/human/stimmed" + result = MARTYRDOM diff --git a/code/datums/mutations/_mutations.dm b/code/datums/mutations/_mutations.dm index 2392f7c09b6..144683e8303 100644 --- a/code/datums/mutations/_mutations.dm +++ b/code/datums/mutations/_mutations.dm @@ -94,21 +94,21 @@ /datum/mutation/human/proc/on_losing(mob/living/carbon/human/owner) if(owner && istype(owner) && (owner.dna.mutations.Remove(src))) - if(text_lose_indication && owner.stat != DEAD) - to_chat(owner, text_lose_indication) - if(visual_indicators.len) - var/list/mut_overlay = list() - if(owner.overlays_standing[layer_used]) - mut_overlay = owner.overlays_standing[layer_used] - owner.remove_overlay(layer_used) - mut_overlay.Remove(get_visual_indicator()) - owner.overlays_standing[layer_used] = mut_overlay - owner.apply_overlay(layer_used) - if(power) - owner.RemoveSpell(power) - qdel(src) - return 0 - return 1 + return TRUE + . = FALSE + if(text_lose_indication && owner.stat != DEAD) + to_chat(owner, text_lose_indication) + if(visual_indicators.len) + var/list/mut_overlay = list() + if(owner.overlays_standing[layer_used]) + mut_overlay = owner.overlays_standing[layer_used] + owner.remove_overlay(layer_used) + mut_overlay.Remove(get_visual_indicator()) + owner.overlays_standing[layer_used] = mut_overlay + owner.apply_overlay(layer_used) + if(power) + owner.RemoveSpell(power) + qdel(src) /mob/living/carbon/proc/update_mutations_overlay() return diff --git a/code/datums/mutations/body.dm b/code/datums/mutations/body.dm index 7781b0a3d44..cf05b7aedb0 100644 --- a/code/datums/mutations/body.dm +++ b/code/datums/mutations/body.dm @@ -137,7 +137,7 @@ if(1) owner.emote("twitch") if(2 to 3) - owner.say("[prob(50) ? ";" : ""][pick("SHIT", "PISS", "FUCK", "CUNT", "COCKSUCKER", "MOTHERFUCKER", "TITS")]", forced="tourette's syndrome") + owner.say("[prob(50) ? ";" : ""][pick("SHIT", "PISS", "FUCK", "CUNT", "COCKSUCKER", "MOTHERFUCKER", "TITS")]", forced=name) var/x_offset_old = owner.pixel_x var/y_offset_old = owner.pixel_y var/x_offset = owner.pixel_x + rand(-2,2) @@ -394,3 +394,92 @@ return //remove the 'edge' cases to_chat(owner, "You trip over your own feet.") owner.Knockdown(30) + +/datum/mutation/human/martyrdom + name = "Internal Martyrdom" + desc = "A mutation that makes the body destruct when near death. Not damaging, but very, VERY disorienting." + locked = TRUE + quality = POSITIVE //not that cloning will be an option a lot but generally lets keep this around i guess? + text_gain_indication = "You get an intense feeling of heartburn." + text_lose_indication = "Your internal organs feel at ease." + +/datum/mutation/human/martyrdom/on_acquiring() + . = ..() + if(.) + return TRUE + RegisterSignal(owner, COMSIG_MOB_STATCHANGE, .proc/bloody_shower) + +/datum/mutation/human/martyrdom/on_losing() + . = ..() + if(.) + return TRUE + UnregisterSignal(owner, COMSIG_MOB_STATCHANGE) + +/datum/mutation/human/martyrdom/proc/bloody_shower(new_stat) + if(new_stat != UNCONSCIOUS) + return + var/list/organs = owner.getorganszone(BODY_ZONE_HEAD, 1) + + for(var/obj/item/organ/I in organs) + I.Remove(owner, TRUE) + + explosion(get_turf(owner), 0, 0, 2, 0, TRUE) + for(var/mob/living/carbon/human/H in view(2,owner)) + var/obj/item/organ/eyes/eyes = H.getorganslot(ORGAN_SLOT_EYES) + if(eyes) + to_chat(H, "You are blinded by a shower of blood!") + else + to_chat(H, "You are knocked down by a wave of... blood?!") + H.Stun(20) + H.blur_eyes(20) + eyes?.applyOrganDamage(5) + H.confused += 3 + for(var/mob/living/silicon/S in view(2,owner)) + to_chat(S, "Your sensors are disabled by a shower of blood!") + S.Paralyze(60) + owner.gib() + +/datum/mutation/human/headless + name = "H.A.R.S." + desc = "A mutation that makes the body reject the head. Stands for Head Allergic Rejection Syndrome. Warning: Removing this mutation is very dangerous, though it will regenerate head organs." + difficulty = 12 //pretty good for traitors + quality = NEGATIVE //holy shit no eyes or tongue or ears + text_gain_indication = "Something feels off." + +/datum/mutation/human/headless/on_acquiring() + . = ..() + if(.)//cant add + return TRUE + var/obj/item/organ/brain/brain = owner.getorganslot(ORGAN_SLOT_BRAIN) + if(brain) //so this doesn't instantly kill you + brain.organ_flags &= ~ORGAN_VITAL + qdel(brain) + + var/obj/item/bodypart/head/head = owner.get_bodypart(BODY_ZONE_HEAD) + if(head) + owner.visible_message("[owner]'s head splatters with a sickening crunch!", ignored_mobs = list(owner)) + new /obj/effect/gibspawner/generic(get_turf(owner), owner) + head.dismember(BRUTE) + head.drop_organs() + qdel(head) + owner.regenerate_icons() + RegisterSignal(owner, COMSIG_LIVING_ATTACH_LIMB, .proc/abortattachment) + +/datum/mutation/human/headless/on_losing() + . = ..() + if(.) + return TRUE + var/successful = owner.regenerate_limb(BODY_ZONE_HEAD, noheal = TRUE) //noheal needs to be TRUE to prevent weird adding and removing mutation healing + if(!successful) + stack_trace("HARS mutation head regeneration failed! (usually caused by headless syndrome having a head)") + return TRUE + UnregisterSignal(owner, COMSIG_LIVING_ATTACH_LIMB) + owner.dna.species.regenerate_organs(owner, excluded_zones = list(BODY_ZONE_CHEST)) //only regenerate head + owner.apply_damage(damage = 50, damagetype = BRUTE, def_zone = BODY_ZONE_HEAD) //and this to DISCOURAGE organ farming, or at least not make it free. + owner.visible_message("[owner]'s head returns with a sickening crunch!", "Your head regrows with a sickening crack! Ouch.") + new /obj/effect/gibspawner/generic(get_turf(owner), owner) + + +/datum/mutation/human/headless/proc/abortattachment(datum/source, obj/item/bodypart/new_limb, special) //you aren't getting your head back + if(istype(new_limb, /obj/item/bodypart/head)) + return COMPONENT_NO_ATTACH diff --git a/code/datums/skills/_skill.dm b/code/datums/skills/_skill.dm index 52d4f3e62ad..ca38b812c11 100644 --- a/code/datums/skills/_skill.dm +++ b/code/datums/skills/_skill.dm @@ -5,3 +5,21 @@ /datum/skill/proc/get_skill_modifier(modifier, level) return modifiers[modifier][level+1] //+1 because lists start at 1 + +/** + * level_gained: Gives skill levelup messages to the user + * + * Only fires if the xp gain isn't silent, so only really useful for messages. + * Arguments: + * * mind - The mind that you'll want to send messages + * * new_level - The newly gained level. Can check the actual level to give different messages at different levels, see defines in skills.dm + * * old_level - Similar to the above, but the level you had before levelling up. + */ +/datum/skill/proc/level_gained(var/datum/mind/mind, new_level, old_level)//just for announcements (doesn't go off if the xp gain is silent) + to_chat(mind.current, "I feel like I've become more proficient at [name]!") + +/** + * level_lost: See level_gained, same idea but fires on skill level-down + */ +/datum/skill/proc/level_lost(var/datum/mind/mind, new_level, old_level) + to_chat(mind.current, "I feel like I've become worse at [name]!") diff --git a/code/datums/skills/gaming.dm b/code/datums/skills/gaming.dm new file mode 100644 index 00000000000..5a8e098fda0 --- /dev/null +++ b/code/datums/skills/gaming.dm @@ -0,0 +1,15 @@ +/datum/skill/gaming + name = "Gaming" + desc = "My proficiency as a gamer. This helps me beat bosses with ease, powergame in Orion Trail, and makes me wanna slam some gamer fuel." + modifiers = list(SKILL_PROBS_MODIFIER = list(0, 5, 10, 15, 15, 20, 25), + SKILL_RANDS_MODIFIER = list(0, 1, 2, 3, 4, 5, 7)) + +/datum/skill/gaming/level_gained(var/datum/mind/mind, new_level, old_level) + switch(new_level) + if(SKILL_LEVEL_JOURNEYMAN)//gives slight extra perks outside roll modifiers + to_chat(mind.current, "I'm starting to pick up the meta of these arcade games. \ + If I were to minmax the optimal strat and accentuate my playstyle around well-refined tech...") + if(SKILL_LEVEL_LEGENDARY)//leads to a mysterious power... + to_chat(mind.current, "Maybe gamerfuel actually would help me play better...") + else + to_chat(mind.current, "I'm getting better at these arcade games!") diff --git a/code/datums/status_effects/buffs.dm b/code/datums/status_effects/buffs.dm index 540875aeb1b..4e8fee150b5 100644 --- a/code/datums/status_effects/buffs.dm +++ b/code/datums/status_effects/buffs.dm @@ -385,16 +385,7 @@ if(deathTick < 4) deathTick += 1 else - owner.visible_message("[owner]'s soul is absorbed into the rod, relieving the previous snake of its duty.") - var/mob/living/simple_animal/hostile/retaliate/poison/snake/healSnake = new(owner.loc) - var/list/chems = list(/datum/reagent/medicine/sal_acid, /datum/reagent/medicine/C2/convermol, /datum/reagent/medicine/oxandrolone) - healSnake.poison_type = pick(chems) - healSnake.name = "Asclepius's Snake" - healSnake.real_name = "Asclepius's Snake" - healSnake.desc = "A mystical snake previously trapped upon the Rod of Asclepius, now freed of its burden. Unlike the average snake, its bites contain chemicals with minor healing properties." - new /obj/effect/decal/cleanable/ash(owner.loc) - new /obj/item/rod_of_asclepius(owner.loc) - qdel(owner) + consume_owner() else if(iscarbon(owner)) var/mob/living/carbon/itemUser = owner @@ -406,12 +397,20 @@ //If user does not have the corresponding hand anymore, give them one and return the rod to their hand if(((hand % 2) == 0)) var/obj/item/bodypart/L = itemUser.newBodyPart(BODY_ZONE_R_ARM, FALSE, FALSE) - L.attach_limb(itemUser) - itemUser.put_in_hand(newRod, hand, forced = TRUE) + if(L.attach_limb(itemUser)) + itemUser.put_in_hand(newRod, hand, forced = TRUE) + else + qdel(L) + consume_owner() //we can't regrow, abort abort + return else var/obj/item/bodypart/L = itemUser.newBodyPart(BODY_ZONE_L_ARM, FALSE, FALSE) - L.attach_limb(itemUser) - itemUser.put_in_hand(newRod, hand, forced = TRUE) + if(L.attach_limb(itemUser)) + itemUser.put_in_hand(newRod, hand, forced = TRUE) + else + qdel(L) + consume_owner() //see above comment + return to_chat(itemUser, "Your arm suddenly grows back with the Rod of Asclepius still attached!") else //Otherwise get rid of whatever else is in their hand and return the rod to said hand @@ -446,6 +445,19 @@ var/mob/living/simple_animal/SM = L SM.adjustHealth(-3.5, forced = TRUE) +/datum/status_effect/hippocraticOath/proc/consume_owner() + owner.visible_message("[owner]'s soul is absorbed into the rod, relieving the previous snake of its duty.") + var/mob/living/simple_animal/hostile/retaliate/poison/snake/healSnake = new(owner.loc) + var/list/chems = list(/datum/reagent/medicine/sal_acid, /datum/reagent/medicine/C2/convermol, /datum/reagent/medicine/oxandrolone) + healSnake.poison_type = pick(chems) + healSnake.name = "Asclepius's Snake" + healSnake.real_name = "Asclepius's Snake" + healSnake.desc = "A mystical snake previously trapped upon the Rod of Asclepius, now freed of its burden. Unlike the average snake, its bites contain chemicals with minor healing properties." + new /obj/effect/decal/cleanable/ash(owner.loc) + new /obj/item/rod_of_asclepius(owner.loc) + qdel(owner) + + /datum/status_effect/good_music id = "Good Music" alert_type = null diff --git a/code/game/atoms.dm b/code/game/atoms.dm index 5982c5eb586..52b02101ee0 100644 --- a/code/game/atoms.dm +++ b/code/game/atoms.dm @@ -141,6 +141,8 @@ * * [/turf/open/space/Initialize] */ /atom/proc/Initialize(mapload, ...) + SHOULD_NOT_SLEEP(TRUE) + SHOULD_CALL_PARENT(TRUE) if(flags_1 & INITIALIZED_1) stack_trace("Warning: [src]([type]) initialized multiple times!") flags_1 |= INITIALIZED_1 @@ -222,6 +224,7 @@ ///Can the mover object pass this atom, while heading for the target turf /atom/proc/CanPass(atom/movable/mover, turf/target) SHOULD_CALL_PARENT(TRUE) + SHOULD_BE_PURE(TRUE) if(mover.movement_type & UNSTOPPABLE) return TRUE . = CanAllowThrough(mover, target) @@ -232,6 +235,7 @@ /// Returns true or false to allow the mover to move through src /atom/proc/CanAllowThrough(atom/movable/mover, turf/target) SHOULD_CALL_PARENT(TRUE) + SHOULD_BE_PURE(TRUE) return !density /** @@ -794,6 +798,7 @@ * Not recommended to use, listen for the [COMSIG_ATOM_DIR_CHANGE] signal instead (sent by this proc) */ /atom/proc/setDir(newdir) + SHOULD_CALL_PARENT(TRUE) SEND_SIGNAL(src, COMSIG_ATOM_DIR_CHANGE, dir, newdir) dir = newdir diff --git a/code/game/atoms_movable.dm b/code/game/atoms_movable.dm index 6ff6f320e2d..2f217a3f26c 100644 --- a/code/game/atoms_movable.dm +++ b/code/game/atoms_movable.dm @@ -384,6 +384,7 @@ //Called after a successful Move(). By this point, we've already moved /atom/movable/proc/Moved(atom/OldLoc, Dir, Forced = FALSE) + SHOULD_CALL_PARENT(TRUE) SEND_SIGNAL(src, COMSIG_MOVABLE_MOVED, OldLoc, Dir, Forced) if (!inertia_moving) inertia_next_move = world.time + inertia_move_delay @@ -426,6 +427,8 @@ //oldloc = old location on atom, inserted when forceMove is called and ONLY when forceMove is called! /atom/movable/Crossed(atom/movable/AM, oldloc) + SHOULD_CALL_PARENT(TRUE) + . = ..() SEND_SIGNAL(src, COMSIG_MOVABLE_CROSSED, AM) /atom/movable/Uncross(atom/movable/AM, atom/newloc) @@ -699,6 +702,7 @@ /// Returns true or false to allow src to move through the blocker, mover has final say /atom/movable/proc/CanPassThrough(atom/blocker, turf/target, blocker_opinion) SHOULD_CALL_PARENT(TRUE) + SHOULD_BE_PURE(TRUE) return blocker_opinion /// called when this atom is removed from a storage item, which is passed on as S. The loc variable is already set to the new destination before this is called. diff --git a/code/game/machinery/computer/arcade.dm b/code/game/machinery/computer/arcade.dm index 846a1deaa4c..27f0354aaf9 100644 --- a/code/game/machinery/computer/arcade.dm +++ b/code/game/machinery/computer/arcade.dm @@ -77,22 +77,28 @@ GLOBAL_LIST_INIT(arcade_prize_pool, list( return INITIALIZE_HINT_QDEL Reset() -/obj/machinery/computer/arcade/proc/prizevend(mob/user) - SEND_SIGNAL(user, COMSIG_ADD_MOOD_EVENT, "arcade", /datum/mood_event/arcade) - if(prob(0.0001)) //1 in a million - new /obj/item/gun/energy/pulse/prize(src) - visible_message("[src] dispenses.. woah, a gun! Way past cool.", "You hear a chime and a shot.") - user.client.give_award(/datum/award/achievement/misc/pulse, user) - return +/obj/machinery/computer/arcade/proc/prizevend(mob/user, prizes = 1) + if(user.mind?.get_skill_level(/datum/skill/gaming) >= SKILL_LEVEL_LEGENDARY && HAS_TRAIT(user, TRAIT_GAMERGOD)) + visible_message("[user] inputs an intense cheat code!",\ + "You hear a flurry of buttons being pressed.") + say("CODE ACTIVATED: EXTRA PRIZES.") + prizes *= 2 + for(var/i = 0, i < prizes, i++) + SEND_SIGNAL(user, COMSIG_ADD_MOOD_EVENT, "arcade", /datum/mood_event/arcade) + if(prob(0.0001)) //1 in a million + new /obj/item/gun/energy/pulse/prize(src) + visible_message("[src] dispenses.. woah, a gun! Way past cool.", "You hear a chime and a shot.") + user.client.give_award(/datum/award/achievement/misc/pulse, user) + return - var/prizeselect - if(prize_override) - prizeselect = pickweight(prize_override) - else - prizeselect = pickweight(GLOB.arcade_prize_pool) - var/atom/movable/the_prize = new prizeselect(get_turf(src)) - playsound(src, 'sound/machines/machine_vend.ogg', 50, TRUE, extrarange = -3) - visible_message("[src] dispenses [the_prize]!", "You hear a chime and a clunk.") + var/prizeselect + if(prize_override) + prizeselect = pickweight(prize_override) + else + prizeselect = pickweight(GLOB.arcade_prize_pool) + var/atom/movable/the_prize = new prizeselect(get_turf(src)) + playsound(src, 'sound/machines/machine_vend.ogg', 50, TRUE, extrarange = -3) + visible_message("[src] dispenses [the_prize]!", "You hear a chime and a clunk.") /obj/machinery/computer/arcade/emp_act(severity) . = ..() @@ -206,9 +212,11 @@ GLOBAL_LIST_INIT(arcade_prize_pool, list( return if (!blocked && !gameover) + var/gamerSkillLevel = usr.mind?.get_skill_level(/datum/skill/gaming) + var/gamerSkill = usr.mind?.get_skill_modifier(/datum/skill/gaming, SKILL_RANDS_MODIFIER) if (href_list["attack"]) blocked = TRUE - var/attackamt = rand(2,6) + var/attackamt = rand(2,6) + rand(0, gamerSkill) var/weapon = pick(weapons) temp = "You attack with a [weapon] for [attackamt] damage!" playsound(loc, 'sound/arcade/hit.ogg', 50, TRUE, extrarange = -3, falloff = 10) @@ -222,8 +230,11 @@ GLOBAL_LIST_INIT(arcade_prize_pool, list( else if (href_list["heal"]) blocked = TRUE - var/pointamt = rand(1,3) - var/healamt = rand(6,8) + var/maxPointCost = 3 + if(gamerSkillLevel >= SKILL_LEVEL_JOURNEYMAN) + maxPointCost = 2 + var/pointamt = rand(1, maxPointCost) + var/healamt = rand(6,8) + rand(0, gamerSkill) temp = "You use [pointamt] magic to heal for [healamt] damage!" playsound(loc, 'sound/arcade/heal.ogg', 50, TRUE, extrarange = -3, falloff = 10) updateUsrDialog() @@ -238,7 +249,7 @@ GLOBAL_LIST_INIT(arcade_prize_pool, list( else if (href_list["charge"]) blocked = TRUE - var/chargeamt = rand(4,7) + var/chargeamt = rand(4,7) + rand(0, gamerSkill) temp = "You regain [chargeamt] points." playsound(loc, 'sound/arcade/mana.ogg', 50, TRUE, extrarange = -3, falloff = 10) player_mp += chargeamt @@ -271,6 +282,7 @@ GLOBAL_LIST_INIT(arcade_prize_pool, list( return /obj/machinery/computer/arcade/battle/proc/arcade_action(mob/user) + var/xp_gained = 0 if ((enemy_mp <= 0) || (enemy_hp <= 0)) if(!gameover) gameover = TRUE @@ -284,8 +296,10 @@ GLOBAL_LIST_INIT(arcade_prize_pool, list( log_game("[key_name(usr)] has outbombed Cuban Pete and been awarded a bomb.") Reset() obj_flags &= ~EMAGGED + xp_gained += 100 else prizevend(user) + xp_gained += 50 SSblackbox.record_feedback("nested tally", "arcade_results", 1, list("win", (obj_flags & EMAGGED ? "emagged":"normal"))) @@ -327,10 +341,12 @@ GLOBAL_LIST_INIT(arcade_prize_pool, list( gameover = TRUE temp = "You have been crushed! GAME OVER" playsound(loc, 'sound/arcade/lose.ogg', 50, TRUE, extrarange = -3, falloff = 10) + xp_gained += 10//pity points if(obj_flags & EMAGGED) usr.gib() SSblackbox.record_feedback("nested tally", "arcade_results", 1, list("loss", "hp", (obj_flags & EMAGGED ? "emagged":"normal"))) + user?.mind?.adjust_experience(/datum/skill/gaming, xp_gained+1)//always gain at least 1 point of XP blocked = FALSE return @@ -512,6 +528,7 @@ GLOBAL_LIST_INIT(arcade_prize_pool, list( gamers[gamer] = -1 gamer.client.give_award(/datum/award/achievement/misc/gamer, gamer) // PSYCH REPORT NOTE: patient kept rambling about how they did it for an "achievement", recommend continued holding for observation + gamer.mind?.adjust_experience(/datum/skill/gaming, 50) // cheevos make u better if(!isnull(GLOB.data_core.general)) for(var/datum/data/record/R in GLOB.data_core.general) @@ -553,6 +570,8 @@ GLOBAL_LIST_INIT(arcade_prize_pool, list( desc = "Learn how our ancestors got to Orion, and have fun in the process!" dat += "

May They Rest In Peace

" + user?.mind?.adjust_experience(/datum/skill/gaming, 10)//learning from your mistakes is the first rule of roguelikes + else if(event) dat = eventdat else if(gameStatus == ORION_STATUS_NORMAL) @@ -592,20 +611,25 @@ GLOBAL_LIST_INIT(arcade_prize_pool, list( return busy = TRUE + var/gamerSkillLevel = usr.mind?.get_skill_level(/datum/skill/gaming) + var/gamerSkill = usr.mind?.get_skill_modifier(/datum/skill/gaming, SKILL_PROBS_MODIFIER) + var/gamerSkillRands = usr.mind?.get_skill_modifier(/datum/skill/gaming, SKILL_RANDS_MODIFIER) + var/xp_gained = 0 if (href_list["continue"]) //Continue your travels if(gameStatus == ORION_STATUS_NORMAL && !event && turns != 7) if(turns >= ORION_TRAIL_WINTURN) win(usr) + xp_gained += 34 else food -= (alive+lings_aboard)*2 fuel -= 5 - if(turns == 2 && prob(30)) + if(turns == 2 && prob(30-gamerSkill)) event = ORION_TRAIL_COLLISION event() - else if(prob(75)) + else if(prob(75-gamerSkill)) event = pickweight(events) if(lings_aboard) - if(event == ORION_TRAIL_LING || prob(55)) + if(event == ORION_TRAIL_LING || prob(55-gamerSkill)) event = ORION_TRAIL_LING_ATTACK event() turns += 1 @@ -613,7 +637,7 @@ GLOBAL_LIST_INIT(arcade_prize_pool, list( var/mob/living/carbon/M = usr //for some vars switch(event) if(ORION_TRAIL_RAIDERS) - if(prob(50)) + if(prob(50-gamerSkill)) to_chat(usr, "You hear battle shouts. The tramping of boots on cold metal. Screams of agony. The rush of venting air. Are you going insane?") M.hallucination += 30 else @@ -621,7 +645,10 @@ GLOBAL_LIST_INIT(arcade_prize_pool, list( M.take_bodypart_damage(30) playsound(loc, 'sound/weapons/genhit2.ogg', 100, TRUE) if(ORION_TRAIL_ILLNESS) - var/severity = rand(1,3) //pray to RNGesus. PRAY, PIGS + var/maxSeverity = 3 + if(gamerSkillLevel >= SKILL_LEVEL_EXPERT) + maxSeverity = 2 //part of gitting gud is rng mitigation + var/severity = rand(1,maxSeverity) //pray to RNGesus. PRAY, PIGS if(severity == 1) to_chat(M, "You suddenly feel slightly nauseated." ) if(severity == 2) @@ -633,7 +660,7 @@ GLOBAL_LIST_INIT(arcade_prize_pool, list( sleep(30) M.vomit(10, distance = 5) if(ORION_TRAIL_FLUX) - if(prob(75)) + if(prob(75-gamerSkill)) M.Paralyze(60) say("A sudden gust of powerful wind slams [M] into the floor!") M.take_bodypart_damage(25) @@ -641,7 +668,7 @@ GLOBAL_LIST_INIT(arcade_prize_pool, list( else to_chat(M, "A violent gale blows past you, and you barely manage to stay standing!") if(ORION_TRAIL_COLLISION) //by far the most damaging event - if(prob(90)) + if(prob(90-gamerSkill)) playsound(loc, 'sound/effects/bang.ogg', 100, TRUE) var/turf/open/floor/F for(F in orange(1, src)) @@ -724,7 +751,7 @@ GLOBAL_LIST_INIT(arcade_prize_pool, list( event = null else if(href_list["blackhole"]) //keep speed past a black hole if(turns == 7) - if(prob(75)) + if(prob(75-gamerSkill)) event = ORION_TRAIL_BLACKHOLE event() if(obj_flags & EMAGGED) @@ -805,15 +832,16 @@ GLOBAL_LIST_INIT(arcade_prize_pool, list( else if(href_list["raid_spaceport"]) if(gameStatus == ORION_STATUS_MARKET) if(!spaceport_raided) - var/success = min(15 * alive,100) //default crew (4) have a 60% chance + var/success = min(15 * alive + gamerSkill,100) //default crew (4) have a 60% chance spaceport_raided = 1 var/FU = 0 var/FO = 0 if(prob(success)) - FU = rand(5,15) - FO = rand(5,15) + FU = rand(5 + gamerSkillRands,15 + gamerSkillRands) + FO = rand(5 + gamerSkillRands,15 + gamerSkillRands) last_spaceport_action = "You successfully raided the spaceport! You gained [FU] Fuel and [FO] Food! (+[FU]FU,+[FO]FO)" + xp_gained += 10 else FU = rand(-5,-15) FO = rand(-5,-15) @@ -872,7 +900,7 @@ GLOBAL_LIST_INIT(arcade_prize_pool, list( add_fingerprint(usr) updateUsrDialog() busy = FALSE - return + usr?.mind?.adjust_experience(/datum/skill/gaming, xp_gained+1) /obj/machinery/computer/arcade/orion_trail/proc/event() @@ -1273,9 +1301,9 @@ GLOBAL_LIST_INIT(arcade_prize_pool, list( var/obj/item/bodypart/chopchop = c_user.get_bodypart(which_hand) chopchop.dismember() qdel(chopchop) + user.mind?.adjust_experience(/datum/skill/gaming, 100) playsound(loc, 'sound/arcade/win.ogg', 50, TRUE, extrarange = -3, falloff = 10) - for(var/i=1; i<=rand(3,5); i++) - prizevend(user) + prizevend(user, rand(3,5)) else to_chat(c_user, "You (wisely) decide against putting your hand in the machine.") diff --git a/code/game/machinery/computer/dna_console.dm b/code/game/machinery/computer/dna_console.dm index 0a15070c4cc..ae7773fb3dc 100644 --- a/code/game/machinery/computer/dna_console.dm +++ b/code/game/machinery/computer/dna_console.dm @@ -523,7 +523,10 @@ for(var/i in 1 to DNA_SEQUENCE_LENGTH) var/num = 1+(i-1)*2 var/genenum = num+(DNA_SEQUENCE_LENGTH*2*(block-1)) - temp_html += "
[sequence[num]]
" + if(sequence[num] == "X") + temp_html += "
[sequence[num]]
" + else + temp_html += "
[sequence[num]]
" temp_html += "" for(var/i in 1 to DNA_SEQUENCE_LENGTH) temp_html += "
|
" @@ -531,7 +534,11 @@ for(var/i in 1 to DNA_SEQUENCE_LENGTH) var/num = i*2 var/genenum = num+(DNA_SEQUENCE_LENGTH*2*(block-1)) - temp_html += "
[sequence[num]]
" + + if(sequence[num] == "X") + temp_html += "
[sequence[num]]
" + else + temp_html += "
[sequence[num]]
" temp_html += "" temp_html += "




" else diff --git a/code/game/machinery/doors/firedoor.dm b/code/game/machinery/doors/firedoor.dm index addce4d0be1..4ec92526c42 100644 --- a/code/game/machinery/doors/firedoor.dm +++ b/code/game/machinery/doors/firedoor.dm @@ -466,7 +466,7 @@ constructionStep = CONSTRUCTION_GUTTED update_icon() return TRUE - else if(RCD_DECONSTRUCT) + if(RCD_DECONSTRUCT) to_chat(user, "You deconstruct [src].") qdel(src) return TRUE diff --git a/code/game/machinery/scan_gate.dm b/code/game/machinery/scan_gate.dm index fb3880b90b6..8eaff2478d4 100644 --- a/code/game/machinery/scan_gate.dm +++ b/code/game/machinery/scan_gate.dm @@ -51,7 +51,10 @@ . += "The control panel is unlocked. Swipe an ID to lock it." /obj/machinery/scanner_gate/Crossed(atom/movable/AM) - ..() + . = ..() + auto_scan(AM) + +/obj/machinery/scanner_gate/proc/auto_scan(atom/movable/AM) if(!(machine_stat & (BROKEN|NOPOWER)) && isliving(AM)) perform_scan(AM) diff --git a/code/game/machinery/telecomms/machines/message_server.dm b/code/game/machinery/telecomms/machines/message_server.dm index e07708b93ba..e903356cd02 100644 --- a/code/game/machinery/telecomms/machines/message_server.dm +++ b/code/game/machinery/telecomms/machines/message_server.dm @@ -34,7 +34,6 @@ return /obj/machinery/blackbox_recorder/attackby(obj/item/I, mob/living/user, params) - . = ..() if(istype(I, /obj/item/blackbox)) if(HAS_TRAIT(I, TRAIT_NODROP) || !user.transferItemToLoc(I, src)) to_chat(user, "[I] is stuck to your hand!") @@ -44,7 +43,7 @@ playsound(src, 'sound/machines/click.ogg', 50, TRUE) stored = I update_icon() - return ..() + return return ..() /obj/machinery/blackbox_recorder/Destroy() diff --git a/code/game/mecha/mecha_construction_paths.dm b/code/game/mecha/mecha_construction_paths.dm index 44a5cc69c74..55b0fc19233 100644 --- a/code/game/mecha/mecha_construction_paths.dm +++ b/code/game/mecha/mecha_construction_paths.dm @@ -1054,7 +1054,7 @@ "key" = /obj/item/assembly/signaler/anomaly/bluespace, "action" = ITEM_DELETE, "back_key" = TOOL_WELDER, - "desc" = "Anomaly core socket is open.", + "desc" = "Bluespace anomaly core socket is open.", "icon_state" = "phazon24" ) ) diff --git a/code/game/mecha/mecha_parts.dm b/code/game/mecha/mecha_parts.dm index 7b617a3dd01..74b3cf9b67f 100644 --- a/code/game/mecha/mecha_parts.dm +++ b/code/game/mecha/mecha_parts.dm @@ -232,6 +232,11 @@ name = "\improper Phazon chassis" construct_type = /datum/component/construction/unordered/mecha_chassis/phazon +/obj/item/mecha_parts/chassis/phazon/attackby(obj/item/I, mob/user, params) + . = ..() + if(istype(I, /obj/item/assembly/signaler/anomaly) && !istype(I, /obj/item/assembly/signaler/anomaly/bluespace)) + to_chat(user, "The anomaly core socket only accepts bluespace anomaly cores!") + /obj/item/mecha_parts/part/phazon_torso name="\improper Phazon torso" desc="A Phazon torso part. The socket for the bluespace core that powers the exosuit's unique phase drives is located in the middle." diff --git a/code/game/objects/effects/alien_acid.dm b/code/game/objects/effects/alien_acid.dm index 5dcbc9ea952..16bc321b211 100644 --- a/code/game/objects/effects/alien_acid.dm +++ b/code/game/objects/effects/alien_acid.dm @@ -53,6 +53,7 @@ return 0 /obj/effect/acid/Crossed(AM as mob|obj) + . = ..() if(isliving(AM)) var/mob/living/L = AM if(L.movement_type & FLYING) diff --git a/code/game/objects/effects/anomalies.dm b/code/game/objects/effects/anomalies.dm index 78b8179799f..e6f7584a887 100644 --- a/code/game/objects/effects/anomalies.dm +++ b/code/game/objects/effects/anomalies.dm @@ -107,6 +107,7 @@ O.throw_at(target, 5, 10) /obj/effect/anomaly/grav/Crossed(atom/movable/AM) + . = ..() gravShock(AM) /obj/effect/anomaly/grav/Bump(atom/A) @@ -154,6 +155,7 @@ mobShock(M) /obj/effect/anomaly/flux/Crossed(atom/movable/AM) + . = ..() mobShock(AM) /obj/effect/anomaly/flux/Bump(atom/A) diff --git a/code/game/objects/effects/mines.dm b/code/game/objects/effects/mines.dm index 90131c59343..c2a6194cca6 100644 --- a/code/game/objects/effects/mines.dm +++ b/code/game/objects/effects/mines.dm @@ -11,6 +11,7 @@ to_chat(victim, "*click*") /obj/effect/mine/Crossed(AM as mob|obj) + . = ..() if(isturf(loc)) if(ismob(AM)) var/mob/MM = AM diff --git a/code/game/objects/effects/portals.dm b/code/game/objects/effects/portals.dm index 03b78b3080f..c3b30d5eae9 100644 --- a/code/game/objects/effects/portals.dm +++ b/code/game/objects/effects/portals.dm @@ -229,7 +229,6 @@ var/obj/projectile/P = M P.ignore_source_check = TRUE return TRUE - return FALSE // try to search for a new one if something was var edited etc set_linked() . = ..() diff --git a/code/game/objects/effects/proximity.dm b/code/game/objects/effects/proximity.dm index dbd9867d6da..677e2c3b256 100644 --- a/code/game/objects/effects/proximity.dm +++ b/code/game/objects/effects/proximity.dm @@ -112,4 +112,5 @@ /obj/effect/abstract/proximity_checker/Crossed(atom/movable/AM) set waitfor = FALSE + . = ..() monitor.hasprox_receiver.HasProximity(AM) diff --git a/code/game/objects/effects/temporary_visuals/miscellaneous.dm b/code/game/objects/effects/temporary_visuals/miscellaneous.dm index f9f9c24f664..a49355e9a74 100644 --- a/code/game/objects/effects/temporary_visuals/miscellaneous.dm +++ b/code/game/objects/effects/temporary_visuals/miscellaneous.dm @@ -461,6 +461,7 @@ icon_state = "" layer = ABOVE_ALL_MOB_LAYER anchored = TRUE + mouse_opacity = MOUSE_OPACITY_TRANSPARENT var/status = 0 var/delay = 0 diff --git a/code/game/objects/items.dm b/code/game/objects/items.dm index 6ae21403d9c..1f561c3706f 100644 --- a/code/game/objects/items.dm +++ b/code/game/objects/items.dm @@ -816,7 +816,9 @@ GLOBAL_VAR_INIT(embedpocalypse, FALSE) // if true, all items will be able to emb // Called before use_tool if there is a delay, or by use_tool if there isn't. // Only ever used by welding tools and stacks, so it's not added on any other use_tool checks. /obj/item/proc/tool_start_check(mob/living/user, amount=0) - return tool_use_check(user, amount) + . = tool_use_check(user, amount) + if(.) + SEND_SIGNAL(src, COMSIG_TOOL_START_USE, user) // A check called by tool_start_check once, and by use_tool on every tick of delay. /obj/item/proc/tool_use_check(mob/living/user, amount) @@ -837,9 +839,12 @@ GLOBAL_VAR_INIT(embedpocalypse, FALSE) // if true, all items will be able to emb playsound(target, played_sound, volume, TRUE) -// Used in a callback that is passed by use_tool into do_after call. Do not override, do not call manually. +/// Used in a callback that is passed by use_tool into do_after call. Do not override, do not call manually. /obj/item/proc/tool_check_callback(mob/living/user, amount, datum/callback/extra_checks) - return tool_use_check(user, amount) && (!extra_checks || extra_checks.Invoke()) + SHOULD_NOT_OVERRIDE(TRUE) + . = tool_use_check(user, amount) && (!extra_checks || extra_checks.Invoke()) + if(.) + SEND_SIGNAL(src, COMSIG_TOOL_IN_USE, user) // Returns a numeric value for sorting items used as parts in machines, so they can be replaced by the rped /obj/item/proc/get_part_rating() diff --git a/code/game/objects/items/broom.dm b/code/game/objects/items/broom.dm index c9aa2e24407..188b649c31a 100644 --- a/code/game/objects/items/broom.dm +++ b/code/game/objects/items/broom.dm @@ -1,5 +1,5 @@ -/obj/item/broom - name = "broom" +/obj/item/pushbroom + name = "push 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." icon = 'icons/obj/janitor.dmi' icon_state = "broom0" @@ -13,58 +13,63 @@ attack_verb = list("swept", "brushed off", "bludgeoned", "whacked") resistance_flags = FLAMMABLE -/obj/item/broom/Initialize() +/obj/item/pushbroom/Initialize() . = ..() RegisterSignal(src, COMSIG_TWOHANDED_WIELD, .proc/on_wield) RegisterSignal(src, COMSIG_TWOHANDED_UNWIELD, .proc/on_unwield) -/obj/item/broom/ComponentInitialize() +/obj/item/pushbroom/ComponentInitialize() . = ..() AddComponent(/datum/component/two_handed, force_unwielded=8, force_wielded=12, icon_wielded="broom1") -/obj/item/broom/update_icon_state() +/obj/item/pushbroom/update_icon_state() icon_state = "broom0" /// triggered on wield of two handed item -/obj/item/broom/proc/on_wield(obj/item/source, mob/user) +/obj/item/pushbroom/proc/on_wield(obj/item/source, mob/user) to_chat(user, "You brace the [src] against the ground in a firm sweeping stance.") RegisterSignal(user, COMSIG_MOVABLE_MOVED, .proc/sweep) /// triggered on unwield of two handed item -/obj/item/broom/proc/on_unwield(obj/item/source, mob/user) +/obj/item/pushbroom/proc/on_unwield(obj/item/source, mob/user) UnregisterSignal(user, COMSIG_MOVABLE_MOVED) -/obj/item/broom/afterattack(atom/A, mob/user, proximity) +/obj/item/pushbroom/afterattack(atom/A, mob/user, proximity) . = ..() if(!proximity) return sweep(user, A, FALSE) -/obj/item/broom/proc/sweep(mob/user, atom/A, moving = TRUE) +/obj/item/pushbroom/proc/sweep(mob/user, atom/A, moving = TRUE) var/turf/target if (!moving) if (isturf(A)) target = A else - if (isturf(A.loc)) - target = A.loc - else - return + target = A.loc else target = user.loc if (locate(/obj/structure/table) in target.contents) return var/i = 0 + var/turf/target_turf = get_step(target, user.dir) + var/obj/machinery/disposal/bin/target_bin = locate(/obj/machinery/disposal/bin) in target_turf.contents for(var/obj/item/garbage in target.contents) if(!garbage.anchored) - garbage.Move(get_step(target, user.dir), user.dir) - i++ - if(i >= 20) + if (target_bin) + garbage.forceMove(target_bin) + else + garbage.Move(target_turf, user.dir) + i++ + if(i > 19) break - if(i >= 1) + if(i > 0) + if (target_bin) + target_bin.update_icon() + to_chat(user, "You sweep the pile of garbage into [target_bin].") playsound(loc, 'sound/weapons/thudswoosh.ogg', 30, TRUE, -1) -/obj/item/broom/proc/janicart_insert(mob/user, obj/structure/janitorialcart/J) //bless you whoever fixes this copypasta +/obj/item/pushbroom/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() diff --git a/code/game/objects/items/cardboard_cutouts.dm b/code/game/objects/items/cardboard_cutouts.dm index f3f8a4a4220..020c60b99bf 100644 --- a/code/game/objects/items/cardboard_cutouts.dm +++ b/code/game/objects/items/cardboard_cutouts.dm @@ -181,7 +181,8 @@ return 1 /obj/item/cardboard_cutout/setDir(newdir) - dir = SOUTH + newdir = SOUTH + return ..() /obj/item/cardboard_cutout/adaptive //Purchased by Syndicate agents, these cutouts are indistinguishable from normal cutouts but aren't discolored when their appearance is changed deceptive = TRUE diff --git a/code/game/objects/items/circuitboards/computer_circuitboards.dm b/code/game/objects/items/circuitboards/computer_circuitboards.dm index bc0b228790e..40721defdb4 100644 --- a/code/game/objects/items/circuitboards/computer_circuitboards.dm +++ b/code/game/objects/items/circuitboards/computer_circuitboards.dm @@ -197,13 +197,13 @@ /obj/item/circuitboard/computer/libraryconsole/attackby(obj/item/I, mob/user, params) if(I.tool_behaviour == TOOL_SCREWDRIVER) - if(build_path == /obj/machinery/computer/libraryconsole/bookmanagement) + if(build_path == /obj/machinery/computer/bookmanagement) name = "Library Visitor Console (Computer Board)" build_path = /obj/machinery/computer/libraryconsole to_chat(user, "Defaulting access protocols.") else name = "Book Inventory Management Console (Computer Board)" - build_path = /obj/machinery/computer/libraryconsole/bookmanagement + build_path = /obj/machinery/computer/bookmanagement to_chat(user, "Access protocols successfully updated.") else return ..() diff --git a/code/game/objects/items/devices/radio/intercom.dm b/code/game/objects/items/devices/radio/intercom.dm index a9dd5fd778d..c59972e3c9d 100644 --- a/code/game/objects/items/devices/radio/intercom.dm +++ b/code/game/objects/items/devices/radio/intercom.dm @@ -92,7 +92,6 @@ /obj/item/radio/intercom/Hear(message, atom/movable/speaker, message_langs, raw_message, radio_freq, list/spans, message_mode) - . = ..() if (message_mode == MODE_INTERCOM) return // Avoid hearing the same thing twice if(!anyai && !(speaker in ai)) diff --git a/code/game/objects/items/devices/reverse_bear_trap.dm b/code/game/objects/items/devices/reverse_bear_trap.dm index 2627efce051..e04e2bdc422 100644 --- a/code/game/objects/items/devices/reverse_bear_trap.dm +++ b/code/game/objects/items/devices/reverse_bear_trap.dm @@ -76,8 +76,6 @@ "You force open the padlock!", "You hear a single, pronounced click!") REMOVE_TRAIT(src, TRAIT_NODROP, REVERSE_BEAR_TRAP_TRAIT) struggling = FALSE - else - ..() return ..() diff --git a/code/game/objects/items/devices/scanners.dm b/code/game/objects/items/devices/scanners.dm index e3881672e6d..1a119ffbaa2 100644 --- a/code/game/objects/items/devices/scanners.dm +++ b/code/game/objects/items/devices/scanners.dm @@ -302,15 +302,15 @@ GENE SCANNER var/datum/species/S = H.dna.species var/mutant = H.dna.check_mutation(HULK) \ || S.mutantlungs != initial(S.mutantlungs) \ - || S.mutant_brain != initial(S.mutant_brain) \ - || S.mutant_heart != initial(S.mutant_heart) \ + || S.mutantbrain != initial(S.mutantbrain) \ + || S.mutantheart != initial(S.mutantheart) \ || S.mutanteyes != initial(S.mutanteyes) \ || S.mutantears != initial(S.mutantears) \ || S.mutanthands != initial(S.mutanthands) \ || S.mutanttongue != initial(S.mutanttongue) \ - || S.mutanttail != initial(S.mutanttail) \ || S.mutantliver != initial(S.mutantliver) \ || S.mutantstomach != initial(S.mutantstomach) \ + || S.mutantappendix != initial(S.mutantappendix) \ || S.flying_species != initial(S.flying_species) render_list += "Species: [S.name][mutant ? "-derived mutant" : ""]\n" diff --git a/code/game/objects/items/handcuffs.dm b/code/game/objects/items/handcuffs.dm index b7e90603f2e..b4ef9874a47 100644 --- a/code/game/objects/items/handcuffs.dm +++ b/code/game/objects/items/handcuffs.dm @@ -151,7 +151,6 @@ breakouttime = 1 SECONDS /obj/item/restraints/handcuffs/cable/attackby(obj/item/I, mob/user, params) - ..() if(istype(I, /obj/item/stack/rods)) var/obj/item/stack/rods/R = I if (R.use(1)) diff --git a/code/game/objects/items/puzzle_pieces.dm b/code/game/objects/items/puzzle_pieces.dm index 5e0dbc421a1..69cc78fe135 100644 --- a/code/game/objects/items/puzzle_pieces.dm +++ b/code/game/objects/items/puzzle_pieces.dm @@ -116,20 +116,27 @@ var/reward = /obj/item/reagent_containers/food/snacks/cookie var/claimed = FALSE +/obj/item/pressure_plate/hologrid/hide(yes) + . = ..() + anchored = TRUE + /obj/item/pressure_plate/hologrid/examine(mob/user) . = ..() if(claimed) . += "This one appears to be spent already." /obj/item/pressure_plate/hologrid/trigger() - reward = new reward(loc) + if(!claimed) + new reward(loc) flick("lasergrid_a",src) icon_state = "lasergrid_full" + claimed = TRUE /obj/item/pressure_plate/hologrid/Crossed(atom/movable/AM) . = ..() if(trigger_item && istype(AM, specific_item) && !claimed) - claimed = TRUE + AM.anchored = TRUE flick("laserbox_burn", AM) + trigger() sleep(15) qdel(AM) diff --git a/code/game/objects/items/stacks/sheets/mineral.dm b/code/game/objects/items/stacks/sheets/mineral.dm index 55ea0d350fc..a65c5404aa4 100644 --- a/code/game/objects/items/stacks/sheets/mineral.dm +++ b/code/game/objects/items/stacks/sheets/mineral.dm @@ -452,6 +452,7 @@ GLOBAL_LIST_INIT(abductor_recipes, list ( \ singular_name = "coal lump" merge_type = /obj/item/stack/sheet/mineral/coal grind_results = list(/datum/reagent/carbon = 20) + novariants = TRUE /obj/item/stack/sheet/mineral/coal/attackby(obj/item/W, mob/user, params) if(W.get_temperature() > 300)//If the temperature of the object is over 300, then ignite diff --git a/code/game/objects/items/stacks/sheets/sheet_types.dm b/code/game/objects/items/stacks/sheets/sheet_types.dm index 39f197d48bf..39941f3ccde 100644 --- a/code/game/objects/items/stacks/sheets/sheet_types.dm +++ b/code/game/objects/items/stacks/sheets/sheet_types.dm @@ -89,7 +89,8 @@ GLOBAL_LIST_INIT(metal_recipes, list ( \ new/datum/stack_recipe("iron door", /obj/structure/mineral_door/iron, 20, one_per_turf = TRUE, on_floor = TRUE), \ new/datum/stack_recipe("floodlight frame", /obj/structure/floodlight_frame, 5, one_per_turf = TRUE, on_floor = TRUE), \ new/datum/stack_recipe("voting box", /obj/structure/votebox, 15, time = 50), \ - new/datum/stack_recipe("pestle", /obj/item/pestle, 1, time = 50) + new/datum/stack_recipe("pestle", /obj/item/pestle, 1, time = 50), \ + new/datum/stack_recipe("hygienebot assembly", /obj/item/bot_assembly/hygienebot, 2, time = 50) )) /obj/item/stack/sheet/metal diff --git a/code/game/objects/items/storage/belt.dm b/code/game/objects/items/storage/belt.dm index b3f9b849ed6..3918eb4f71a 100644 --- a/code/game/objects/items/storage/belt.dm +++ b/code/game/objects/items/storage/belt.dm @@ -539,7 +539,7 @@ /obj/item/melee/flyswatter, /obj/item/assembly/mousetrap, /obj/item/paint/paint_remover, - /obj/item/broom + /obj/item/pushbroom )) /obj/item/storage/belt/janitor/full/PopulateContents() diff --git a/code/game/objects/items/tools/weldingtool.dm b/code/game/objects/items/tools/weldingtool.dm index 62b49d8d887..684b84623a4 100644 --- a/code/game/objects/items/tools/weldingtool.dm +++ b/code/game/objects/items/tools/weldingtool.dm @@ -30,7 +30,6 @@ var/change_icons = 1 var/can_off_process = 0 var/light_intensity = 2 //how powerful the emitted light is when used. - var/progress_flash_divisor = 10 var/burned_fuel_for = 0 //when fuel was last removed heat = 3800 tool_behaviour = TOOL_WELDER @@ -45,6 +44,7 @@ /obj/item/weldingtool/ComponentInitialize() . = ..() AddElement(/datum/element/update_icon_updates_onmob) + AddElement(/datum/element/tool_flash, light_intensity) /obj/item/weldingtool/update_icon_state() if(welding) @@ -245,22 +245,6 @@ /obj/item/weldingtool/proc/isOn() return welding -// When welding is about to start, run a normal tool_use_check, then flash a mob if it succeeds. -/obj/item/weldingtool/tool_start_check(mob/living/user, amount=0) - . = tool_use_check(user, amount) - if(. && user && get_dist(get_turf(src), get_turf(user)) <= 1) - user.flash_act(light_intensity) - -// Flash the user during welding progress -/obj/item/weldingtool/tool_check_callback(mob/living/user, amount, datum/callback/extra_checks) - . = ..() - if(. && user && get_dist(get_turf(src), get_turf(user)) <= 1) - if (progress_flash_divisor == 0) - user.flash_act(min(light_intensity,1)) - progress_flash_divisor = initial(progress_flash_divisor) - else - progress_flash_divisor-- - // If welding tool ran out of fuel during a construction task, construction fails. /obj/item/weldingtool/tool_use_check(mob/living/user, amount) if(!isOn() || !check_fuel()) diff --git a/code/game/objects/items/toys.dm b/code/game/objects/items/toys.dm index 03760ad70dc..09030f10ea9 100644 --- a/code/game/objects/items/toys.dm +++ b/code/game/objects/items/toys.dm @@ -452,6 +452,7 @@ pop_burst() /obj/item/toy/snappop/Crossed(H as mob|obj) + . = ..() if(ishuman(H) || issilicon(H)) //i guess carp and shit shouldn't set them off var/mob/living/carbon/M = H if(issilicon(H) || M.m_intent == MOVE_INTENT_RUN) diff --git a/code/game/objects/structures/janicart.dm b/code/game/objects/structures/janicart.dm index 3cf14a7fb3e..adeeec5affe 100644 --- a/code/game/objects/structures/janicart.dm +++ b/code/game/objects/structures/janicart.dm @@ -9,7 +9,7 @@ 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/mop/mymop - var/obj/item/broom/mybroom + var/obj/item/pushbroom/mybroom var/obj/item/reagent_containers/spray/cleaner/myspray var/obj/item/lightreplacer/myreplacer var/signs = 0 @@ -51,9 +51,9 @@ m.janicart_insert(user, src) else to_chat(user, fail_msg) - else if(istype(I, /obj/item/broom)) + else if(istype(I, /obj/item/pushbroom)) if(!mybroom) - var/obj/item/broom/b=I + var/obj/item/pushbroom/b=I b.janicart_insert(user,src) else to_chat(user, fail_msg) diff --git a/code/game/objects/structures/tables_racks.dm b/code/game/objects/structures/tables_racks.dm index 4207dfc413f..39f0a1d4b5e 100644 --- a/code/game/objects/structures/tables_racks.dm +++ b/code/game/objects/structures/tables_racks.dm @@ -237,13 +237,13 @@ UnregisterSignal(source, COMSIG_MOVABLE_MOVED) /obj/structure/table/rolling/Moved(atom/OldLoc, Dir) + . = ..() for(var/mob/M in OldLoc.contents)//Kidnap everyone on top M.forceMove(loc) for(var/x in attached_items) var/atom/movable/AM = x if(!AM.Move(loc)) RemoveItemFromTable(AM, AM.loc) - return TRUE /* * Glass tables diff --git a/code/game/objects/structures/traps.dm b/code/game/objects/structures/traps.dm index f3013cda82a..f68a17063df 100644 --- a/code/game/objects/structures/traps.dm +++ b/code/game/objects/structures/traps.dm @@ -61,6 +61,7 @@ animate(src, alpha = initial(alpha), time = time_between_triggers) /obj/structure/trap/Crossed(atom/movable/AM) + . = ..() if(last_trigger + time_between_triggers > world.time) return // Don't want the traps triggered by sparks, ghosts or projectiles. diff --git a/code/game/turfs/open/space/space.dm b/code/game/turfs/open/space/space.dm index 8b7df53e482..f03fdd545f8 100644 --- a/code/game/turfs/open/space/space.dm +++ b/code/game/turfs/open/space/space.dm @@ -23,7 +23,13 @@ //This is used to optimize the map loader return +/** + * Space Initialize + * + * Doesn't call parent, see [/atom/proc/Initialize] + */ /turf/open/space/Initialize() + SHOULD_CALL_PARENT(FALSE) icon_state = SPACE_ICON_STATE air = space_gas vis_contents.Cut() //removes inherited overlays diff --git a/code/game/turfs/turf.dm b/code/game/turfs/turf.dm index aed84fa24e6..b391b9dee84 100755 --- a/code/game/turfs/turf.dm +++ b/code/game/turfs/turf.dm @@ -41,7 +41,13 @@ return FALSE . = ..() +/** + * Turf Initialize + * + * Doesn't call parent, see [/atom/proc/Initialize] + */ /turf/Initialize(mapload) + SHOULD_CALL_PARENT(FALSE) if(flags_1 & INITIALIZED_1) stack_trace("Warning: [src]([type]) initialized multiple times!") flags_1 |= INITIALIZED_1 diff --git a/code/modules/antagonists/abductor/equipment/abduction_gear.dm b/code/modules/antagonists/abductor/equipment/abduction_gear.dm index 7a0d5de0972..d48abe9c611 100644 --- a/code/modules/antagonists/abductor/equipment/abduction_gear.dm +++ b/code/modules/antagonists/abductor/equipment/abduction_gear.dm @@ -518,7 +518,7 @@ Congratulations! You are now trained for invasive xenobiology research!"} toggle_on(user) if(iscyborg(target)) - if(BATON_STUN) + if(mode == BATON_STUN) ..() return FALSE diff --git a/code/modules/antagonists/changeling/powers/regenerate.dm b/code/modules/antagonists/changeling/powers/regenerate.dm index d5105ec2d15..7f0e9e2f4c9 100644 --- a/code/modules/antagonists/changeling/powers/regenerate.dm +++ b/code/modules/antagonists/changeling/powers/regenerate.dm @@ -26,8 +26,8 @@ C.regenerate_limbs(1) if(!user.getorganslot(ORGAN_SLOT_BRAIN)) var/obj/item/organ/brain/B - if(C.has_dna() && C.dna.species.mutant_brain) - B = new C.dna.species.mutant_brain() + if(C.has_dna() && C.dna.species.mutantbrain) + B = new C.dna.species.mutantbrain() else B = new() B.organ_flags &= ~ORGAN_VITAL diff --git a/code/modules/antagonists/cult/runes.dm b/code/modules/antagonists/cult/runes.dm index 61c727cf7d0..eee48826e86 100644 --- a/code/modules/antagonists/cult/runes.dm +++ b/code/modules/antagonists/cult/runes.dm @@ -507,12 +507,11 @@ structure_check() searches for nearby cultist structures required for the invoca if(do_after(user, 50, target = src)) //Prevents accidental erasures. log_game("Summon Narsie rune erased by [key_name(user)] with [I.name]") message_admins("[ADMIN_LOOKUPFLW(user)] erased a Narsie rune with [I.name]") - ..() + else if(istype(I, /obj/item/nullrod)) //Begone foul magiks. You cannot hinder me. + log_game("Summon Narsie rune erased by [key_name(user)] using a null rod") + message_admins("[ADMIN_LOOKUPFLW(user)] erased a Narsie rune with a null rod") else - if(istype(I, /obj/item/nullrod)) //Begone foul magiks. You cannot hinder me. - log_game("Summon Narsie rune erased by [key_name(user)] using a null rod") - message_admins("[ADMIN_LOOKUPFLW(user)] erased a Narsie rune with a null rod") - ..() + ..() //Rite of Resurrection: Requires a dead or inactive cultist. When reviving the dead, you can only perform one revival for every three sacrifices your cult has carried out. /obj/effect/rune/raise_dead diff --git a/code/modules/antagonists/devil/imp/imp.dm b/code/modules/antagonists/devil/imp/imp.dm index 7f1d8b4f77f..8ca84d0775a 100644 --- a/code/modules/antagonists/devil/imp/imp.dm +++ b/code/modules/antagonists/devil/imp/imp.dm @@ -41,7 +41,6 @@ deathmessage = "screams in agony as it sublimates into a sulfurous smoke." deathsound = 'sound/magic/demon_dies.ogg' var/boost = 0 - bloodcrawl = BLOODCRAWL_EAT var/list/consumed_mobs = list() var/playstyle_string = "You are an imp, a mischievous creature from hell. You are the lowest rank on the hellish totem pole \ Though you are not obligated to help, perhaps by aiding a higher ranking devil, you might just get a promotion. However, you are incapable \ @@ -49,6 +48,7 @@ /mob/living/simple_animal/imp/Initialize() . = ..() + ADD_TRAIT(src, TRAIT_BLOODCRAWL_EAT, "innate") set_varspeed(1) addtimer(CALLBACK(src, /mob/living/simple_animal/proc/set_varspeed, 0), 30) diff --git a/code/modules/antagonists/revolution/revolution.dm b/code/modules/antagonists/revolution/revolution.dm index c463f52d197..bfdab56924b 100644 --- a/code/modules/antagonists/revolution/revolution.dm +++ b/code/modules/antagonists/revolution/revolution.dm @@ -115,7 +115,7 @@ /datum/antagonist/rev/head/proc/admin_take_flash(mob/admin) var/list/L = owner.current.get_contents() - var/obj/item/assembly/flash/flash = locate() in L + var/obj/item/assembly/flash/handheld/flash = locate() in L if (!flash) to_chat(admin, "Deleting flash failed!") return @@ -136,7 +136,7 @@ /datum/antagonist/rev/head/proc/admin_repair_flash(mob/admin) var/list/L = owner.current.get_contents() - var/obj/item/assembly/flash/flash = locate() in L + var/obj/item/assembly/flash/handheld/flash = locate() in L if (!flash) to_chat(admin, "Repairing flash failed!") else diff --git a/code/modules/antagonists/slaughter/slaughter.dm b/code/modules/antagonists/slaughter/slaughter.dm index 8cb12cb897a..1cd3053eb2f 100644 --- a/code/modules/antagonists/slaughter/slaughter.dm +++ b/code/modules/antagonists/slaughter/slaughter.dm @@ -38,7 +38,6 @@ melee_damage_upper = 30 see_in_dark = 8 lighting_alpha = LIGHTING_PLANE_ALPHA_MOSTLY_INVISIBLE - bloodcrawl = BLOODCRAWL_EAT var/playstyle_string = "You are a slaughter demon, a terrible creature from another realm. You have a single desire: To kill. \ You may use the \"Blood Crawl\" ability near blood pools to travel through them, appearing and disappearing from the station at will. \ Pulling a dead or unconscious mob while you enter a pool will pull them in with you, allowing you to feast and regain your health. \ @@ -52,6 +51,7 @@ /mob/living/simple_animal/slaughter/Initialize() ..() + ADD_TRAIT(src, TRAIT_BLOODCRAWL_EAT, "innate") var/obj/effect/proc_holder/spell/bloodcrawl/bloodspell = new AddSpell(bloodspell) if(istype(loc, /obj/effect/dummy/phased_mob/slaughter)) diff --git a/code/modules/assembly/holder.dm b/code/modules/assembly/holder.dm index eb31d9faf27..34d193bc198 100644 --- a/code/modules/assembly/holder.dm +++ b/code/modules/assembly/holder.dm @@ -67,6 +67,7 @@ master.update_icon() /obj/item/assembly_holder/Crossed(atom/movable/AM as mob|obj) + . = ..() if(a_left) a_left.Crossed(AM) if(a_right) diff --git a/code/modules/assembly/infrared.dm b/code/modules/assembly/infrared.dm index 8099d18fb93..23de27399b5 100644 --- a/code/modules/assembly/infrared.dm +++ b/code/modules/assembly/infrared.dm @@ -228,6 +228,7 @@ var/obj/item/assembly/infra/master /obj/effect/beam/i_beam/Crossed(atom/movable/AM as mob|obj) + . = ..() if(istype(AM, /obj/effect/beam)) return if (isitem(AM)) diff --git a/code/modules/awaymissions/capture_the_flag.dm b/code/modules/awaymissions/capture_the_flag.dm index 2d205394955..6d33ad62e63 100644 --- a/code/modules/awaymissions/capture_the_flag.dm +++ b/code/modules/awaymissions/capture_the_flag.dm @@ -613,6 +613,7 @@ QDEL_IN(src, AMMO_DROP_LIFETIME) /obj/effect/ctf/ammo/Crossed(atom/movable/AM) + . = ..() reload(AM) /obj/effect/ctf/ammo/Bump(atom/A) diff --git a/code/modules/awaymissions/mission_code/wildwest.dm b/code/modules/awaymissions/mission_code/wildwest.dm index 1aa70547441..6679125ad6e 100644 --- a/code/modules/awaymissions/mission_code/wildwest.dm +++ b/code/modules/awaymissions/mission_code/wildwest.dm @@ -127,6 +127,7 @@ var/triggered = 0 /obj/effect/meatgrinder/Crossed(atom/movable/AM) + . = ..() Bumped(AM) /obj/effect/meatgrinder/Bumped(atom/movable/AM) diff --git a/code/modules/cargo/exports/tools.dm b/code/modules/cargo/exports/tools.dm index 7bee3017d9f..287fba69aaa 100644 --- a/code/modules/cargo/exports/tools.dm +++ b/code/modules/cargo/exports/tools.dm @@ -95,6 +95,31 @@ export_types = list(/obj/item/radio) exclude_types = list(/obj/item/radio/mech) +//Advanced/Power Tools. +/datum/export/weldingtool/experimental + cost = 90 + unit_name = "experimental welding tool" + export_types = list(/obj/item/weldingtool/experimental) + +/datum/export/jawsoflife + cost = 100 + unit_name = "jaws of life" + export_types = list(/obj/item/crowbar/power) + +/datum/export/handdrill + cost = 100 + unit_name = "hand drill" + export_types = list(/obj/item/screwdriver/power) + +/datum/export/rld_mini + cost = 150 + unit_name = "mini rapid lighting device" + export_types = list(/obj/item/construction/rld/mini) + +/datum/export/rsf + cost = 100 + unit_name = "rapid service fabricator" + export_types = list(/obj/item/rsf) /datum/export/rcd cost = 100 diff --git a/code/modules/cargo/packs.dm b/code/modules/cargo/packs.dm index 583c470a9a2..c7a2b723c50 100644 --- a/code/modules/cargo/packs.dm +++ b/code/modules/cargo/packs.dm @@ -1467,7 +1467,7 @@ /obj/item/reagent_containers/glass/bucket, /obj/item/reagent_containers/glass/bucket, /obj/item/mop, - /obj/item/broom, + /obj/item/pushbroom, /obj/item/clothing/suit/caution, /obj/item/clothing/suit/caution, /obj/item/clothing/suit/caution, diff --git a/code/modules/events/_event.dm b/code/modules/events/_event.dm index f76f0e50675..d1578a216d3 100644 --- a/code/modules/events/_event.dm +++ b/code/modules/events/_event.dm @@ -166,6 +166,7 @@ //Do not override this proc, instead use the appropiate procs. //This proc will handle the calls to the appropiate procs. /datum/round_event/process() + SHOULD_NOT_OVERRIDE(TRUE) if(!processing) return diff --git a/code/modules/events/spacevine.dm b/code/modules/events/spacevine.dm index 4231eb71952..f6135348ba7 100644 --- a/code/modules/events/spacevine.dm +++ b/code/modules/events/spacevine.dm @@ -351,6 +351,7 @@ playsound(src.loc, 'sound/items/welder.ogg', 100, TRUE) /obj/structure/spacevine/Crossed(atom/movable/AM) + . = ..() if(!isliving(AM)) return for(var/datum/spacevine_mutation/SM in mutations) diff --git a/code/modules/fields/turf_objects.dm b/code/modules/fields/turf_objects.dm index 4d3a4cf4b70..f8d139a45dd 100644 --- a/code/modules/fields/turf_objects.dm +++ b/code/modules/fields/turf_objects.dm @@ -29,6 +29,7 @@ return parent.field_turf_canpass(AM, src, target) /obj/effect/abstract/proximity_checker/advanced/field_turf/Crossed(atom/movable/AM) + . = ..() if(parent) return parent.field_turf_crossed(AM, src) return TRUE @@ -53,6 +54,7 @@ return parent.field_edge_canpass(AM, src, target) /obj/effect/abstract/proximity_checker/advanced/field_edge/Crossed(atom/movable/AM) + . = ..() if(parent) return parent.field_edge_crossed(AM, src) return TRUE diff --git a/code/modules/flufftext/Hallucination.dm b/code/modules/flufftext/Hallucination.dm index bbfcdc96b1a..ebf752b8088 100644 --- a/code/modules/flufftext/Hallucination.dm +++ b/code/modules/flufftext/Hallucination.dm @@ -134,6 +134,7 @@ GLOBAL_LIST_INIT(hallucination_list, list( Show() /obj/effect/hallucination/simple/Moved(atom/OldLoc, Dir) + . = ..() Show() /obj/effect/hallucination/simple/Destroy() @@ -1082,6 +1083,7 @@ GLOBAL_LIST_INIT(hallucination_list, list( target.client.images += image /obj/effect/hallucination/danger/lava/Crossed(atom/movable/AM) + . = ..() if(AM == target) target.adjustStaminaLoss(20) new /datum/hallucination/fire(target) @@ -1095,6 +1097,7 @@ GLOBAL_LIST_INIT(hallucination_list, list( target.client.images += image /obj/effect/hallucination/danger/chasm/Crossed(atom/movable/AM) + . = ..() if(AM == target) if(istype(target, /obj/effect/dummy/phased_mob)) return @@ -1124,6 +1127,7 @@ GLOBAL_LIST_INIT(hallucination_list, list( target.client.images += image /obj/effect/hallucination/danger/anomaly/Crossed(atom/movable/AM) + . = ..() if(AM == target) new /datum/hallucination/shock(target) diff --git a/code/modules/food_and_drinks/drinks/drinks.dm b/code/modules/food_and_drinks/drinks/drinks.dm index 5f331e5df74..520115b1f03 100644 --- a/code/modules/food_and_drinks/drinks/drinks.dm +++ b/code/modules/food_and_drinks/drinks/drinks.dm @@ -704,7 +704,7 @@ /obj/item/reagent_containers/food/drinks/soda_cans/pwr_game name = "Pwr Game" - desc = "The only drink with the PWR that true gamers crave." + desc = "The only drink with the PWR that true gamers crave. When a gamer talks about gamerfuel, this is what they're literally referring to." icon_state = "purple_can" list_reagents = list(/datum/reagent/consumable/pwr_game = 30) diff --git a/code/modules/hydroponics/grown/towercap.dm b/code/modules/hydroponics/grown/towercap.dm index a85b7ba05e3..d5e6a33ff2e 100644 --- a/code/modules/hydroponics/grown/towercap.dm +++ b/code/modules/hydroponics/grown/towercap.dm @@ -246,6 +246,7 @@ StartBurning() /obj/structure/bonfire/Crossed(atom/movable/AM) + . = ..() if(burning & !grill) Burn() diff --git a/code/modules/hydroponics/hydroitemdefines.dm b/code/modules/hydroponics/hydroitemdefines.dm index 4853843213a..691c7cc5a9d 100644 --- a/code/modules/hydroponics/hydroitemdefines.dm +++ b/code/modules/hydroponics/hydroitemdefines.dm @@ -76,6 +76,7 @@ resistance_flags = FLAMMABLE /obj/item/cultivator/rake/Crossed(atom/movable/AM) + . = ..() if(!ishuman(AM)) return var/mob/living/carbon/human/H = AM diff --git a/code/modules/library/lib_items.dm b/code/modules/library/lib_items.dm index ffe88fd4699..71e21669200 100644 --- a/code/modules/library/lib_items.dm +++ b/code/modules/library/lib_items.dm @@ -315,7 +315,7 @@ throw_speed = 3 throw_range = 5 w_class = WEIGHT_CLASS_TINY - var/obj/machinery/computer/libraryconsole/bookmanagement/computer //Associated computer - Modes 1 to 3 use this + var/obj/machinery/computer/bookmanagement/computer //Associated computer - Modes 1 to 3 use this var/obj/item/book/book //Currently scanned book var/mode = 0 //0 - Scan only, 1 - Scan and Set Buffer, 2 - Scan and Attempt to Check In, 3 - Scan and Attempt to Add to Inventory diff --git a/code/modules/library/lib_machines.dm b/code/modules/library/lib_machines.dm index a589d35b344..c658c906fd8 100644 --- a/code/modules/library/lib_machines.dm +++ b/code/modules/library/lib_machines.dm @@ -70,7 +70,7 @@ /obj/machinery/computer/libraryconsole/Topic(href, href_list) . = ..() - if(..()) + if(.) usr << browse(null, "window=publiclibrary") onclose(usr, "publiclibrary") return @@ -162,14 +162,21 @@ GLOBAL_LIST(cachedbooks) // List of our cached book datums // TODO: Make this an actual /obj/machinery/computer that can be crafted from circuit boards and such // It is August 22nd, 2012... This TODO has already been here for months.. I wonder how long it'll last before someone does something about it. // It's December 25th, 2014, and this is STILL here, and it's STILL relevant. Kill me -/obj/machinery/computer/libraryconsole/bookmanagement +/obj/machinery/computer/bookmanagement name = "book inventory management console" desc = "Librarian's command station." - screenstate = 0 // 0 - Main Menu, 1 - Inventory, 2 - Checked Out, 3 - Check Out a Book verb_say = "beeps" verb_ask = "beeps" verb_exclaim = "beeps" pass_flags = PASSTABLE + + icon_state = "oldcomp" + icon_screen = "library" + icon_keyboard = null + circuit = /obj/item/circuitboard/computer/libraryconsole + + var/screenstate = 0 // 0 - Main Menu, 1 - Inventory, 2 - Checked Out, 3 - Check Out a Book + var/arcanecheckout = 0 var/buffer_book var/buffer_mob @@ -182,7 +189,7 @@ GLOBAL_LIST(cachedbooks) // List of our cached book datums var/page = 1 //current page of the external archives var/cooldown = 0 -/obj/machinery/computer/libraryconsole/bookmanagement/proc/build_library_menu() +/obj/machinery/computer/bookmanagement/proc/build_library_menu() if(libcomp_menu) return load_library_db_to_cache() @@ -198,13 +205,13 @@ GLOBAL_LIST(cachedbooks) // List of our cached book datums libcomp_menu[page] = "" libcomp_menu[page] += "[C.author][C.title][C.category]\[Order\]\n" -/obj/machinery/computer/libraryconsole/bookmanagement/Initialize() +/obj/machinery/computer/bookmanagement/Initialize() . = ..() if(circuit) circuit.name = "Book Inventory Management Console (Machine Board)" - circuit.build_path = /obj/machinery/computer/libraryconsole/bookmanagement + circuit.build_path = /obj/machinery/computer/bookmanagement -/obj/machinery/computer/libraryconsole/bookmanagement/ui_interact(mob/user) +/obj/machinery/computer/bookmanagement/ui_interact(mob/user) . = ..() var/dat = "" // switch(screenstate) @@ -316,17 +323,17 @@ GLOBAL_LIST(cachedbooks) // List of our cached book datums popup.set_title_image(user.browse_rsc_icon(src.icon, src.icon_state)) popup.open() -/obj/machinery/computer/libraryconsole/bookmanagement/proc/findscanner(viewrange) +/obj/machinery/computer/bookmanagement/proc/findscanner(viewrange) for(var/obj/machinery/libraryscanner/S in range(viewrange, get_turf(src))) return S return null -/obj/machinery/computer/libraryconsole/bookmanagement/proc/print_forbidden_lore(mob/user) +/obj/machinery/computer/bookmanagement/proc/print_forbidden_lore(mob/user) new /obj/item/melee/cultblade/dagger(get_turf(src)) to_chat(user, "Your sanity barely endures the seconds spent in the vault's browsing window. The only thing to remind you of this when you stop browsing is a sinister dagger sitting on the desk. You don't even remember where it came from...") user.visible_message("[user] stares at the blank screen for a few moments, [user.p_their()] expression frozen in fear. When [user.p_they()] finally awaken[user.p_s()] from it, [user.p_they()] look[user.p_s()] a lot older.", 2) -/obj/machinery/computer/libraryconsole/bookmanagement/attackby(obj/item/W, mob/user, params) +/obj/machinery/computer/bookmanagement/attackby(obj/item/W, mob/user, params) if(istype(W, /obj/item/barcodescanner)) var/obj/item/barcodescanner/scanner = W scanner.computer = src @@ -335,11 +342,11 @@ GLOBAL_LIST(cachedbooks) // List of our cached book datums else return ..() -/obj/machinery/computer/libraryconsole/bookmanagement/emag_act(mob/user) +/obj/machinery/computer/bookmanagement/emag_act(mob/user) if(density && !(obj_flags & EMAGGED)) obj_flags |= EMAGGED -/obj/machinery/computer/libraryconsole/bookmanagement/Topic(href, href_list) +/obj/machinery/computer/bookmanagement/Topic(href, href_list) if(..()) usr << browse(null, "window=library") onclose(usr, "library") diff --git a/code/modules/mapping/reader.dm b/code/modules/mapping/reader.dm index e7d7fd4898d..cecd61091bf 100644 --- a/code/modules/mapping/reader.dm +++ b/code/modules/mapping/reader.dm @@ -138,6 +138,7 @@ // Do not call except via load() above. /datum/parsed_map/proc/_load_impl(x_offset = 1, y_offset = 1, z_offset = world.maxz + 1, cropMap = FALSE, no_changeturf = FALSE, x_lower = -INFINITY, x_upper = INFINITY, y_lower = -INFINITY, y_upper = INFINITY, placeOnTop = FALSE) + PRIVATE_PROC(TRUE) var/list/areaCache = list() var/list/modelCache = build_cache(no_changeturf) var/space_key = modelCache[SPACE_KEY] diff --git a/code/modules/mining/equipment/regenerative_core.dm b/code/modules/mining/equipment/regenerative_core.dm index 386fb930a44..d1427da54c6 100644 --- a/code/modules/mining/equipment/regenerative_core.dm +++ b/code/modules/mining/equipment/regenerative_core.dm @@ -13,7 +13,7 @@ var/obj/item/organ/regenerative_core/C = M if(!istype(C, /obj/item/organ/regenerative_core)) to_chat(user, "The stabilizer only works on certain types of monster organs, generally regenerative in nature.") - return ..() + return C.preserved() to_chat(user, "You inject the [M] with the stabilizer. It will no longer go inert.") diff --git a/code/modules/mining/lavaland/necropolis_chests.dm b/code/modules/mining/lavaland/necropolis_chests.dm index 5b37d8b5265..3d2dfb8fb84 100644 --- a/code/modules/mining/lavaland/necropolis_chests.dm +++ b/code/modules/mining/lavaland/necropolis_chests.dm @@ -49,7 +49,7 @@ if(15) new /obj/item/nullrod/armblade(src) if(16) - new /obj/item/guardiancreator/hive(src) + new /obj/item/guardiancreator/miner(src) if(17) if(prob(50)) new /obj/item/disk/design_disk/modkit_disc/mob_and_turf_aoe(src) diff --git a/code/modules/mob/dead/dead.dm b/code/modules/mob/dead/dead.dm index 61366a12d77..570392f2929 100644 --- a/code/modules/mob/dead/dead.dm +++ b/code/modules/mob/dead/dead.dm @@ -8,6 +8,7 @@ INITIALIZE_IMMEDIATE(/mob/dead) throwforce = 0 /mob/dead/Initialize() + SHOULD_CALL_PARENT(FALSE) if(flags_1 & INITIALIZED_1) stack_trace("Warning: [src]([type]) initialized multiple times!") flags_1 |= INITIALIZED_1 diff --git a/code/modules/mob/inventory.dm b/code/modules/mob/inventory.dm index 96b80844205..84f2723165c 100644 --- a/code/modules/mob/inventory.dm +++ b/code/modules/mob/inventory.dm @@ -294,6 +294,7 @@ /mob/proc/doUnEquip(obj/item/I, force, newloc, no_move, invdrop = TRUE, silent = FALSE) //Force overrides TRAIT_NODROP for things like wizarditis and admin undress. //Use no_move if the item is just gonna be immediately moved afterward //Invdrop is used to prevent stuff in pockets dropping. only set to false if it's going to immediately be replaced + PROTECTED_PROC(TRUE) if(!I) //If there's nothing to drop, the drop is automatically succesfull. If(unEquip) should generally be used to check for TRAIT_NODROP. return TRUE diff --git a/code/modules/mob/living/bloodcrawl.dm b/code/modules/mob/living/bloodcrawl.dm index 7df2586ec45..75ee9c53c25 100644 --- a/code/modules/mob/living/bloodcrawl.dm +++ b/code/modules/mob/living/bloodcrawl.dm @@ -60,7 +60,7 @@ forceMove(holder) // if we're not pulling anyone, or we can't eat anyone - if(!pullee || bloodcrawl != BLOODCRAWL_EAT) + if(!pullee || !HAS_TRAIT(src, TRAIT_BLOODCRAWL_EAT)) notransform = FALSE return diff --git a/code/modules/mob/living/carbon/alien/special/facehugger.dm b/code/modules/mob/living/carbon/alien/special/facehugger.dm index eb9133697c4..53b5afe1df4 100644 --- a/code/modules/mob/living/carbon/alien/special/facehugger.dm +++ b/code/modules/mob/living/carbon/alien/special/facehugger.dm @@ -89,8 +89,8 @@ Attach(M) /obj/item/clothing/mask/facehugger/Crossed(atom/target) + . = ..() HasProximity(target) - return /obj/item/clothing/mask/facehugger/on_found(mob/finder) if(stat == CONSCIOUS) diff --git a/code/modules/mob/living/carbon/human/human.dm b/code/modules/mob/living/carbon/human/human.dm index 7771c380d27..9d093d22ba5 100644 --- a/code/modules/mob/living/carbon/human/human.dm +++ b/code/modules/mob/living/carbon/human/human.dm @@ -167,9 +167,15 @@ if(ITEM_SLOT_ICLOTHING in obscured) dat += "Uniform:Obscured" else - dat += "Uniform:[(w_uniform && !(w_uniform.item_flags & ABSTRACT)) ? w_uniform : "Empty"]" + dat += "Uniform:[(w_uniform && !(w_uniform.item_flags & ABSTRACT)) ? w_uniform : "Empty"]" + if(w_uniform) + var/obj/item/clothing/under/U = w_uniform + if (U.can_adjust) + dat += " Adjust" + dat += "" - if((w_uniform == null && !(dna && dna.species.nojumpsuit)) || (ITEM_SLOT_ICLOTHING in obscured)) + var/obj/item/bodypart/O = get_bodypart(BODY_ZONE_CHEST) + if((w_uniform == null && !(dna && dna.species.nojumpsuit) && !(O && O.status == BODYPART_ROBOTIC)) || (ITEM_SLOT_ICLOTHING in obscured)) dat += " ↳Pockets:" dat += " ↳ID:" dat += " ↳Belt:" @@ -254,6 +260,16 @@ // Display a warning if the user mocks up to_chat(src, "You feel your [pocket_side] pocket being fumbled with!") + if(href_list["toggle_uniform"] && usr.canUseTopic(src, BE_CLOSE, NO_DEXTERITY)) + var/obj/item/clothing/under/U = get_item_by_slot(ITEM_SLOT_ICLOTHING) + to_chat(src, "[usr.name] is trying to adjust your [U].") + if(do_mob(usr, src, U.strip_delay/2)) + to_chat(src, "[usr.name] successfully adjusted your [U].") + U.toggle_jumpsuit_adjust() + update_inv_w_uniform() + update_body() + + ///////HUDs/////// if(href_list["hud"]) if(!ishuman(usr)) diff --git a/code/modules/mob/living/carbon/human/human_defense.dm b/code/modules/mob/living/carbon/human/human_defense.dm index df6a887696e..1f460e0a1ae 100644 --- a/code/modules/mob/living/carbon/human/human_defense.dm +++ b/code/modules/mob/living/carbon/human/human_defense.dm @@ -176,7 +176,6 @@ var/hulk_verb = pick("smash","pummel") if(check_shields(user, 15, "the [hulk_verb]ing")) return - ..() playsound(loc, user.dna.species.attack_sound, 25, TRUE, -1) visible_message("[user] [hulk_verb]ed [src]!", \ "[user] [hulk_verb]ed [src]!", "You hear a sickening sound of flesh hitting flesh!", null, user) diff --git a/code/modules/mob/living/carbon/human/species.dm b/code/modules/mob/living/carbon/human/species.dm index d744bcf1753..7ba92ffced3 100644 --- a/code/modules/mob/living/carbon/human/species.dm +++ b/code/modules/mob/living/carbon/human/species.dm @@ -75,20 +75,23 @@ GLOBAL_LIST_EMPTY(roundstart_races) var/sound/attack_sound = 'sound/weapons/punch1.ogg' var/sound/miss_sound = 'sound/weapons/punchmiss.ogg' - //Breathing! - var/obj/item/organ/lungs/mutantlungs = null + //Breathing! Most changes are in mutantlungs, though var/breathid = "o2" - var/obj/item/organ/brain/mutant_brain = /obj/item/organ/brain - var/obj/item/organ/heart/mutant_heart = /obj/item/organ/heart + + //Do NOT remove by setting to null. use OR make a RESPECTIVE TRAIT (removing stomach? add the NOSTOMACH trait to your species) + //why does it work this way? because traits also disable the downsides of not having an organ, removing organs but not having the trait will make your species die + var/obj/item/organ/brain/mutantbrain = /obj/item/organ/brain + var/obj/item/organ/heart/mutantheart = /obj/item/organ/heart + var/obj/item/organ/lungs/mutantlungs = /obj/item/organ/lungs var/obj/item/organ/eyes/mutanteyes = /obj/item/organ/eyes var/obj/item/organ/ears/mutantears = /obj/item/organ/ears - var/obj/item/mutanthands var/obj/item/organ/tongue/mutanttongue = /obj/item/organ/tongue - var/obj/item/organ/tail/mutanttail = null - - var/obj/item/organ/liver/mutantliver - var/obj/item/organ/stomach/mutantstomach + var/obj/item/organ/liver/mutantliver = /obj/item/organ/liver + var/obj/item/organ/stomach/mutantstomach = /obj/item/organ/stomach + var/obj/item/organ/appendix/mutantappendix = /obj/item/organ/appendix + //only an honorary mutantthing because not an organ and not loaded in the same way, you've been warned to do your research + var/obj/item/mutanthands var/override_float = FALSE //Bitflag that controls what in game ways can select this species as a spawnable source @@ -149,110 +152,47 @@ GLOBAL_LIST_EMPTY(roundstart_races) return 0 return 1 -//Will regenerate missing organs -/datum/species/proc/regenerate_organs(mob/living/carbon/C,datum/species/old_species,replace_current=TRUE) - var/obj/item/organ/brain/brain = C.getorganslot(ORGAN_SLOT_BRAIN) - var/obj/item/organ/heart/heart = C.getorganslot(ORGAN_SLOT_HEART) - var/obj/item/organ/lungs/lungs = C.getorganslot(ORGAN_SLOT_LUNGS) - var/obj/item/organ/appendix/appendix = C.getorganslot(ORGAN_SLOT_APPENDIX) - var/obj/item/organ/eyes/eyes = C.getorganslot(ORGAN_SLOT_EYES) - var/obj/item/organ/ears/ears = C.getorganslot(ORGAN_SLOT_EARS) - var/obj/item/organ/tongue/tongue = C.getorganslot(ORGAN_SLOT_TONGUE) - var/obj/item/organ/liver/liver = C.getorganslot(ORGAN_SLOT_LIVER) - var/obj/item/organ/stomach/stomach = C.getorganslot(ORGAN_SLOT_STOMACH) - var/obj/item/organ/tail/tail = C.getorganslot(ORGAN_SLOT_TAIL) - var/should_have_brain = TRUE - var/should_have_heart = !(NOBLOOD in species_traits) - var/should_have_lungs = !(TRAIT_NOBREATH in inherent_traits) - var/should_have_appendix = !(TRAIT_NOHUNGER in inherent_traits) - var/should_have_eyes = TRUE - var/should_have_ears = TRUE - var/should_have_tongue = TRUE - var/should_have_liver = !(TRAIT_NOMETABOLISM in inherent_traits) - var/should_have_stomach = !(NOSTOMACH in species_traits) - var/should_have_tail = mutanttail +/** regenerate_organs + * Corrects organs in a carbon, removing ones it doesn't need and adding ones it does + * + * takes all organ slots, removes organs a species should not have, adds organs a species should have. + * can use replace_current to refresh all organs, creating an entirely new set. + * Arguments: + * C - carbon, the owner of the species datum AKA whoever we're regenerating organs in + * old_species - datum, used when regenerate organs is called in a switching species to remove old mutant organs. + * replace_current - boolean, forces all old organs to get deleted whether or not they pass the species' ability to keep that organ + * excluded_zones - list, add zone defines to block organs inside of the zones from getting handled. see headless mutation for an example + */ +/datum/species/proc/regenerate_organs(mob/living/carbon/C,datum/species/old_species,replace_current=TRUE,list/excluded_zones) + //what should be put in if there is no mutantorgan (brains handled seperately) + var/list/slot_mutantorgans = list(ORGAN_SLOT_BRAIN = mutantbrain, ORGAN_SLOT_HEART = mutantheart, ORGAN_SLOT_LUNGS = mutantlungs, ORGAN_SLOT_APPENDIX = mutantappendix, \ + ORGAN_SLOT_EYES = mutanteyes, ORGAN_SLOT_EARS = mutantears, ORGAN_SLOT_TONGUE = mutanttongue, ORGAN_SLOT_LIVER = mutantliver, ORGAN_SLOT_STOMACH = mutantstomach) - if(heart && (!should_have_heart || replace_current)) - heart.Remove(C,1) - QDEL_NULL(heart) - if(should_have_heart && !heart) - heart = new mutant_heart() - heart.Insert(C) + for(var/slot in list(ORGAN_SLOT_BRAIN, ORGAN_SLOT_HEART, ORGAN_SLOT_LUNGS, ORGAN_SLOT_APPENDIX, \ + ORGAN_SLOT_EYES, ORGAN_SLOT_EARS, ORGAN_SLOT_TONGUE, ORGAN_SLOT_LIVER, ORGAN_SLOT_STOMACH)) - if(lungs && (!should_have_lungs || replace_current)) - lungs.Remove(C,1) - QDEL_NULL(lungs) - if(should_have_lungs && !lungs) - if(mutantlungs) - lungs = new mutantlungs() - else - lungs = new() - lungs.Insert(C) + var/obj/item/organ/oldorgan = C.getorganslot(slot) //used in removing + var/obj/item/organ/neworgan = slot_mutantorgans[slot] //used in adding + var/used_neworgan = FALSE + neworgan = new neworgan() + var/should_have = neworgan.get_availability(src) //organ proc that points back to a species trait (so if the species is supposed to have this organ) - if(liver && (!should_have_liver || replace_current)) - liver.Remove(C,1) - QDEL_NULL(liver) - if(should_have_liver && !liver) - if(mutantliver) - liver = new mutantliver() - else - liver = new() - liver.Insert(C) + if(oldorgan && (!should_have || replace_current) && !(oldorgan.zone in excluded_zones)) + if(slot == ORGAN_SLOT_BRAIN) + var/obj/item/organ/brain/brain = oldorgan + if(!brain.decoy_override)//"Just keep it if it's fake" - confucius, probably + brain.Remove(C,TRUE, TRUE) //brain argument used so it doesn't cause any... sudden death. + QDEL_NULL(brain) + oldorgan.Remove(C,TRUE) + QDEL_NULL(oldorgan) - if(stomach && (!should_have_stomach || replace_current)) - stomach.Remove(C,1) - QDEL_NULL(stomach) - if(should_have_stomach && !stomach) - if(mutantstomach) - stomach = new mutantstomach() - else - stomach = new() - stomach.Insert(C) + if(!oldorgan && should_have && !(initial(neworgan.zone) in excluded_zones)) + used_neworgan = TRUE + neworgan.Insert(C) - if(appendix && (!should_have_appendix || replace_current)) - appendix.Remove(C,1) - QDEL_NULL(appendix) - if(should_have_appendix && !appendix) - appendix = new() - appendix.Insert(C) - - if(tail && (!should_have_tail || replace_current)) - tail.Remove(C,1) - QDEL_NULL(tail) - if(should_have_tail && !tail) - tail = new mutanttail() - tail.Insert(C) - - if(C.get_bodypart(BODY_ZONE_HEAD)) - if(brain && (replace_current || !should_have_brain)) - if(!brain.decoy_override)//Just keep it if it's fake - brain.Remove(C,TRUE,TRUE) - QDEL_NULL(brain) - if(should_have_brain && !brain) - brain = new mutant_brain() - brain.Insert(C, TRUE, TRUE) - - if(eyes && (replace_current || !should_have_eyes)) - eyes.Remove(C,1) - QDEL_NULL(eyes) - if(should_have_eyes && !eyes) - eyes = new mutanteyes - eyes.Insert(C) - - if(ears && (replace_current || !should_have_ears)) - ears.Remove(C,1) - QDEL_NULL(ears) - if(should_have_ears && !ears) - ears = new mutantears - ears.Insert(C) - - if(tongue && (replace_current || !should_have_tongue)) - tongue.Remove(C,1) - QDEL_NULL(tongue) - if(should_have_tongue && !tongue) - tongue = new mutanttongue - tongue.Insert(C) + if(!used_neworgan) + qdel(neworgan) if(old_species) for(var/mutantorgan in old_species.mutant_organs) diff --git a/code/modules/mob/living/carbon/human/species_types/dullahan.dm b/code/modules/mob/living/carbon/human/species_types/dullahan.dm index 74d83cdedf7..9935717ba80 100644 --- a/code/modules/mob/living/carbon/human/species_types/dullahan.dm +++ b/code/modules/mob/living/carbon/human/species_types/dullahan.dm @@ -6,7 +6,7 @@ inherent_traits = list(TRAIT_NOHUNGER,TRAIT_NOBREATH) default_features = list("mcolor" = "FFF", "tail_human" = "None", "ears" = "None", "wings" = "None") use_skintones = TRUE - mutant_brain = /obj/item/organ/brain/dullahan + mutantbrain = /obj/item/organ/brain/dullahan mutanteyes = /obj/item/organ/eyes/dullahan mutanttongue = /obj/item/organ/tongue/dullahan mutantears = /obj/item/organ/ears/dullahan @@ -142,8 +142,8 @@ hearers += owner //Stops dullahans from gibbing when regenerating limbs -/obj/item/dullahan_relay/proc/unlist_head(datum/source, noheal = FALSE, list/excluded_limbs) - excluded_limbs |= BODY_ZONE_HEAD +/obj/item/dullahan_relay/proc/unlist_head(datum/source, noheal = FALSE, list/excluded_zones) + excluded_zones |= BODY_ZONE_HEAD //Retrieving the owner's head for better ahealing. /obj/item/dullahan_relay/proc/retrieve_head(datum/source, full_heal, admin_revive) diff --git a/code/modules/mob/living/carbon/human/species_types/felinid.dm b/code/modules/mob/living/carbon/human/species_types/felinid.dm index 20926b5dce9..0b646fab85d 100644 --- a/code/modules/mob/living/carbon/human/species_types/felinid.dm +++ b/code/modules/mob/living/carbon/human/species_types/felinid.dm @@ -9,7 +9,7 @@ default_features = list("mcolor" = "FFF", "tail_human" = "Cat", "ears" = "Cat", "wings" = "None") mutantears = /obj/item/organ/ears/cat - mutanttail = /obj/item/organ/tail/cat + mutant_organs = list(/obj/item/organ/tail/cat) changesource_flags = MIRROR_BADMIN | WABBAJACK | MIRROR_PRIDE | MIRROR_MAGIC | RACE_SWAP | ERT_SPAWN | SLIME_EXTRACT var/original_felinid = TRUE //set to false for felinids created by mass-purrbation @@ -61,12 +61,12 @@ var/obj/item/organ/tail/cat/tail = new tail.Insert(H, drop_if_replaced = FALSE) else - mutanttail = null + mutant_organs = list() return ..() /datum/species/human/felinid/on_species_loss(mob/living/carbon/H, datum/species/new_species, pref_load) var/obj/item/organ/ears/cat/ears = H.getorgan(/obj/item/organ/ears/cat) - var/obj/item/organ/tail/cat/tail = H.getorgan(/obj/item/organ/tail/cat) +// var/obj/item/organ/tail/cat/tail = H.getorgan(/obj/item/organ/tail/cat) if(ears) var/obj/item/organ/ears/NE @@ -80,10 +80,12 @@ NE = new /obj/item/organ/ears NE.Insert(H, drop_if_replaced = FALSE) +/* if(tail) var/obj/item/organ/tail/NT - if(new_species && new_species.mutanttail) - // Roundstart cat tail overrides new_species.mutanttail, reset it here. + NT = locate(/obj/item/organ/tail) in new_species.mutant_organs + if(NT) + // Roundstart cat tail overrides new_species tail, reset it here. new_species.mutanttail = initial(new_species.mutanttail) if(new_species.mutanttail) NT = new new_species.mutanttail @@ -91,6 +93,7 @@ NT.Insert(H, drop_if_replaced = FALSE) else tail.Remove(H) +*/ /proc/mass_purrbation() for(var/M in GLOB.mob_list) @@ -141,8 +144,9 @@ for(var/obj/item/organ/current_organ in organs) if(istype(current_organ, /obj/item/organ/tail/cat)) current_organ.Remove(H, TRUE) - if(target_species.mutanttail) - var/obj/item/organ/new_tail = new target_species.mutanttail + var/obj/item/organ/tail/new_tail = locate(/obj/item/organ/tail) in target_species.mutant_organs + if(new_tail) + new_tail = new new_tail() new_tail.Insert(H, TRUE, FALSE) if(istype(current_organ, /obj/item/organ/ears/cat)) var/obj/item/organ/new_ears = new target_species.mutantears diff --git a/code/modules/mob/living/carbon/human/species_types/lizardpeople.dm b/code/modules/mob/living/carbon/human/species_types/lizardpeople.dm index 283fc02fb96..6ec26a5c6ea 100644 --- a/code/modules/mob/living/carbon/human/species_types/lizardpeople.dm +++ b/code/modules/mob/living/carbon/human/species_types/lizardpeople.dm @@ -8,7 +8,7 @@ inherent_biotypes = MOB_ORGANIC|MOB_HUMANOID|MOB_REPTILE mutant_bodyparts = list("tail_lizard", "snout", "spines", "horns", "frills", "body_markings", "legs") mutanttongue = /obj/item/organ/tongue/lizard - mutanttail = /obj/item/organ/tail/lizard + mutant_organs = list(/obj/item/organ/tail/lizard) coldmod = 1.5 heatmod = 0.67 default_features = list("mcolor" = "0F0", "tail_lizard" = "Smooth", "snout" = "Round", "horns" = "None", "frills" = "None", "spines" = "None", "body_markings" = "None", "legs" = "Normal Legs") diff --git a/code/modules/mob/living/carbon/human/species_types/mothmen.dm b/code/modules/mob/living/carbon/human/species_types/mothmen.dm index 8a4412f4950..f8865b97c79 100644 --- a/code/modules/mob/living/carbon/human/species_types/mothmen.dm +++ b/code/modules/mob/living/carbon/human/species_types/mothmen.dm @@ -18,7 +18,7 @@ changesource_flags = MIRROR_BADMIN | WABBAJACK | MIRROR_MAGIC | MIRROR_PRIDE | ERT_SPAWN | RACE_SWAP | SLIME_EXTRACT species_language_holder = /datum/language_holder/moth -/datum/species/moth/regenerate_organs(mob/living/carbon/C,datum/species/old_species,replace_current=TRUE) +/datum/species/moth/regenerate_organs(mob/living/carbon/C,datum/species/old_species,replace_current=TRUE,list/excluded_zones) . = ..() if(ishuman(C)) var/mob/living/carbon/human/H = C diff --git a/code/modules/mob/living/carbon/human/species_types/shadowpeople.dm b/code/modules/mob/living/carbon/human/species_types/shadowpeople.dm index 17bf82f2202..c134f3d47b2 100644 --- a/code/modules/mob/living/carbon/human/species_types/shadowpeople.dm +++ b/code/modules/mob/living/carbon/human/species_types/shadowpeople.dm @@ -39,8 +39,8 @@ species_traits = list(NOBLOOD,NO_UNDERWEAR,NO_DNA_COPY,NOTRANSSTING,NOEYESPRITES) inherent_traits = list(TRAIT_RESISTCOLD,TRAIT_NOBREATH,TRAIT_RESISTHIGHPRESSURE,TRAIT_RESISTLOWPRESSURE,TRAIT_CHUNKYFINGERS,TRAIT_RADIMMUNE,TRAIT_VIRUSIMMUNE,TRAIT_PIERCEIMMUNE,TRAIT_NODISMEMBER,TRAIT_NOHUNGER) mutanteyes = /obj/item/organ/eyes/night_vision/nightmare - mutant_organs = list(/obj/item/organ/heart/nightmare) - mutant_brain = /obj/item/organ/brain/nightmare + mutantheart = /obj/item/organ/heart/nightmare + mutantbrain = /obj/item/organ/brain/nightmare var/info_text = "You are a Nightmare. The ability shadow walk allows unlimited, unrestricted movement in the dark while activated. \ Your light eater will destroy any light producing objects you attack, as well as destroy any lights a living creature may be holding. You will automatically dodge gunfire and melee attacks when on a dark tile. If killed, you will eventually revive if left in darkness." diff --git a/code/modules/mob/living/carbon/human/species_types/snail.dm b/code/modules/mob/living/carbon/human/species_types/snail.dm index 9296e9ee58b..375ba7be6dc 100644 --- a/code/modules/mob/living/carbon/human/species_types/snail.dm +++ b/code/modules/mob/living/carbon/human/species_types/snail.dm @@ -41,7 +41,7 @@ var/obj/item/storage/backpack/bag = C.get_item_by_slot(ITEM_SLOT_BACK) if(istype(bag, /obj/item/storage/backpack/snail)) bag.emptyStorage() - C.doUnEquip(bag, TRUE, no_move = TRUE) + C.temporarilyRemoveItemFromInventory(bag, TRUE) qdel(bag) /obj/item/storage/backpack/snail diff --git a/code/modules/mob/living/carbon/human/species_types/vampire.dm b/code/modules/mob/living/carbon/human/species_types/vampire.dm index 8e9874d0faa..1bd65fc01ab 100644 --- a/code/modules/mob/living/carbon/human/species_types/vampire.dm +++ b/code/modules/mob/living/carbon/human/species_types/vampire.dm @@ -9,7 +9,7 @@ changesource_flags = MIRROR_BADMIN | WABBAJACK | MIRROR_PRIDE | MIRROR_MAGIC | ERT_SPAWN exotic_bloodtype = "U" use_skintones = TRUE - mutant_heart = /obj/item/organ/heart/vampire + mutantheart = /obj/item/organ/heart/vampire mutanttongue = /obj/item/organ/tongue/vampire limbs_id = "human" skinned_type = /obj/item/stack/sheet/animalhide/human diff --git a/code/modules/mob/living/living_defines.dm b/code/modules/mob/living/living_defines.dm index 22ec966267b..14b4427433d 100644 --- a/code/modules/mob/living/living_defines.dm +++ b/code/modules/mob/living/living_defines.dm @@ -59,10 +59,9 @@ var/on_fire = 0 ///The "Are we on fire?" var var/fire_stacks = 0 ///Tracks how many stacks of fire we have on, max is usually 20 - var/bloodcrawl = 0 ///0 No blood crawling, [BLOODCRAWL] for bloodcrawling, [BLOODCRAWL_EAT] for crawling+mob devour - var/holder = null ///The holder for blood crawling - var/ventcrawler = 0 ///0 No vent crawling, 1 vent crawling in the nude, 2 vent crawling always - var/limb_destroyer = 0 ///1 Sets AI behavior that allows mobs to target and dismember limbs with their basic attack. + var/holder = null //The holder for blood crawling + var/ventcrawler = 0 //0 No vent crawling, 1 vent crawling in the nude, 2 vent crawling always + var/limb_destroyer = 0 //1 Sets AI behavior that allows mobs to target and dismember limbs with their basic attack. var/mob_size = MOB_SIZE_HUMAN var/mob_biotypes = MOB_ORGANIC @@ -128,10 +127,10 @@ var/list/ownedSoullinks //soullinks we are the owner of var/list/sharedSoullinks //soullinks we are a/the sharer of - + /// List of changes to body temperature, used by desease symtoms like fever var/list/body_temp_changes = list() - + //this stuff is here to make it simple for admins to mess with custom held sprites var/icon/held_lh = 'icons/mob/pets_held_lh.dmi'//icons for holding mobs var/icon/held_rh = 'icons/mob/pets_held_rh.dmi' diff --git a/code/modules/mob/living/silicon/pai/pai_shell.dm b/code/modules/mob/living/silicon/pai/pai_shell.dm index 2e404b29dbe..fd3a3af0b83 100644 --- a/code/modules/mob/living/silicon/pai/pai_shell.dm +++ b/code/modules/mob/living/silicon/pai/pai_shell.dm @@ -55,6 +55,9 @@ return visible_message("[src] deactivates its holochassis emitter and folds back into a compact card!") stop_pulling() + if(istype(loc, /obj/item/clothing/head/mob_holder)) + var/obj/item/clothing/head/mob_holder/MH = loc + MH.release() if(client) client.perspective = EYE_PERSPECTIVE client.eye = card diff --git a/code/modules/mob/living/silicon/robot/robot.dm b/code/modules/mob/living/silicon/robot/robot.dm index 2b73aa86036..8af80955afa 100644 --- a/code/modules/mob/living/silicon/robot/robot.dm +++ b/code/modules/mob/living/silicon/robot/robot.dm @@ -856,6 +856,16 @@ new_hat.forceMove(src) update_icons() +/** + *Checking Exited() to detect if a hat gets up and walks off. + *Drones and pAIs might do this, after all. +*/ +/mob/living/silicon/robot/Exited(atom/A) + if(hat && hat == A) + hat = null + update_icons() + . = ..() + /mob/living/silicon/robot/proc/make_shell(var/obj/item/borg/upgrade/ai/board) if(!board) upgrades |= new /obj/item/borg/upgrade/ai(src) diff --git a/code/modules/mob/living/silicon/robot/robot_defense.dm b/code/modules/mob/living/silicon/robot/robot_defense.dm index 6250193bdb5..2eb08be7eea 100644 --- a/code/modules/mob/living/silicon/robot/robot_defense.dm +++ b/code/modules/mob/living/silicon/robot/robot_defense.dm @@ -1,7 +1,6 @@ GLOBAL_LIST_INIT(blacklisted_borg_hats, typecacheof(list( //Hats that don't really work on borgos /obj/item/clothing/head/helmet/space, /obj/item/clothing/head/welding, - /obj/item/clothing/head/mob_holder, //I am so very upset that this breaks things /obj/item/clothing/head/chameleon/broken \ ))) diff --git a/code/modules/mob/living/simple_animal/friendly/drone/interaction.dm b/code/modules/mob/living/simple_animal/friendly/drone/interaction.dm index fa2cfa0718e..45bdd5d1982 100644 --- a/code/modules/mob/living/simple_animal/friendly/drone/interaction.dm +++ b/code/modules/mob/living/simple_animal/friendly/drone/interaction.dm @@ -50,6 +50,7 @@ to_chat(user, "You pick [src] up.") drop_all_held_items() var/obj/item/clothing/head/mob_holder/drone/DH = new(get_turf(src), src) + DH.slot_flags = worn_slot_flags user.put_in_hands(DH) /mob/living/simple_animal/drone/proc/try_reactivate(mob/living/user) diff --git a/code/modules/mob/living/simple_animal/guardian/guardian.dm b/code/modules/mob/living/simple_animal/guardian/guardian.dm index dbb8ff45980..0b973774933 100644 --- a/code/modules/mob/living/simple_animal/guardian/guardian.dm +++ b/code/modules/mob/living/simple_animal/guardian/guardian.dm @@ -45,7 +45,7 @@ GLOBAL_LIST_EMPTY(parasites) //all currently existing/living guardians hud_type = /datum/hud/guardian dextrous_hud_type = /datum/hud/dextrous/guardian //if we're set to dextrous, account for it. var/mutable_appearance/cooloverlay - var/guardiancolor = "#ffffff" + var/guardiancolor var/recolorentiresprite var/theme var/list/guardian_overlays[GUARDIAN_TOTAL_LAYERS] @@ -54,11 +54,11 @@ GLOBAL_LIST_EMPTY(parasites) //all currently existing/living guardians var/mob/living/summoner var/range = 10 //how far from the user the spirit can be var/toggle_button_type = /obj/screen/guardian/ToggleMode/Inactive //what sort of toggle button the hud uses - var/playstyle_string = "You are a standard Guardian. You shouldn't exist!" + var/playstyle_string = "You are a Guardian without any type. You shouldn't exist!" var/magic_fluff_string = "You draw the Coder, symbolizing bugs and errors. This shouldn't happen! Submit a bug report!" var/tech_fluff_string = "BOOT SEQUENCE COMPLETE. ERROR MODULE LOADED. THIS SHOULDN'T HAPPEN. Submit a bug report!" var/carp_fluff_string = "CARP CARP CARP SOME SORT OF HORRIFIC BUG BLAME THE CODERS CARP CARP CARP" - var/hive_fluff_string = "The mass seems to be an anomaly, it shouldn't exist... Submit a bug report!" + var/miner_fluff_string = "You encounter... Mythril, it shouldn't exist... Submit a bug report!" /mob/living/simple_animal/hostile/guardian/Initialize(mapload, theme) GLOB.parasites += src @@ -87,7 +87,7 @@ GLOBAL_LIST_EMPTY(parasites) //all currently existing/living guardians /mob/living/simple_animal/hostile/guardian/proc/updatetheme(theme) //update the guardian's theme if(!theme) - theme = pick("magic", "tech", "carp", "hive") + theme = pick("magic", "tech", "carp", "miner") switch(theme)//should make it easier to create new stand designs in the future if anyone likes that if("magic") name = "Guardian Spirit" @@ -103,6 +103,13 @@ GLOBAL_LIST_EMPTY(parasites) //all currently existing/living guardians icon_state = "techbase" icon_living = "techbase" icon_dead = "techbase" + if("miner") + name = "Power Miner" + real_name = "Power Miner" + bubble_icon = "guardian" + icon_state = "minerbase" + icon_living = "minerbase" + icon_dead = "minerbase" if("carp") name = "Holocarp" real_name = "Holocarp" @@ -116,18 +123,6 @@ GLOBAL_LIST_EMPTY(parasites) //all currently existing/living guardians attack_verb_simple = "bite" attack_sound = 'sound/weapons/bite.ogg' recolorentiresprite = TRUE - if("hive") - name = "Hivelord" - real_name = "Hivelord" - bubble_icon = "guardian" - icon_state = "hivebase" - icon_living = "hivebase" - icon_dead = "hivebase" - speak_emote = list("telepathically cries") - desc = "A truly alien creature, it is a mass of unknown organic material, standing by its' owner's side." - attack_verb_continuous = "lashes out at" - attack_verb_simple = "lash out at" - attack_sound = 'sound/weapons/pierce.ogg' if(!recolorentiresprite) //we want this to proc before stand logs in, so the overlay isnt gone for some reason cooloverlay = mutable_appearance(icon, theme) add_overlay(cooloverlay) @@ -143,11 +138,9 @@ GLOBAL_LIST_EMPTY(parasites) //all currently existing/living guardians to_chat(src, "You are capable of manifesting or recalling to your master with the buttons on your HUD. You will also find a button to communicate with [summoner.p_them()] privately there.") to_chat(src, "While personally invincible, you will die if [summoner.real_name] does, and any damage dealt to you will have a portion passed on to [summoner.p_them()] as you feed upon [summoner.p_them()] to sustain yourself.") to_chat(src, playstyle_string) - guardiancustomize() - -/mob/living/simple_animal/hostile/guardian/proc/guardiancustomize() - guardianrecolor() - guardianrename() + if(!guardiancolor) + guardianrename() + guardianrecolor() /mob/living/simple_animal/hostile/guardian/proc/guardianrecolor() guardiancolor = input(src,"What would you like your color to be?","Choose Your Color","#ffffff") as color|null @@ -465,7 +458,8 @@ GLOBAL_LIST_EMPTY(parasites) //all currently existing/living guardians to_chat(src, "Your [G.real_name] has been successfully reset.") message_admins("[key_name_admin(C)] has taken control of ([ADMIN_LOOKUPFLW(G)])") G.ghostize(0) - G.guardiancustomize() //give it a new color, to show it's a new person + G.guardianrecolor() + G.guardianrename() //give it a new color and name, to show it's a new person G.key = C.key G.reset = 1 switch(G.theme) @@ -475,8 +469,8 @@ GLOBAL_LIST_EMPTY(parasites) //all currently existing/living guardians to_chat(src, "[G.real_name] has been summoned!") if("carp") to_chat(src, "[G.real_name] has been caught!") - if("hive") - to_chat(src, "[G.real_name] has been created from the core!") + if("miner") + to_chat(src, "[G.real_name] has appeared!") guardians -= G if(!guardians.len) verbs -= /mob/living/proc/guardian_reset @@ -613,9 +607,9 @@ GLOBAL_LIST_EMPTY(parasites) //all currently existing/living guardians if("carp") to_chat(user, "[G.carp_fluff_string]") to_chat(user, "[G.real_name] has been caught!") - if("hive") - to_chat(user, "[G.hive_fluff_string]") - to_chat(user, "[G.real_name] has been created from the core!") + if("miner") + to_chat(user, "[G.miner_fluff_string]") + to_chat(user, "[G.real_name] has appeared!") user.verbs += /mob/living/proc/guardian_comm user.verbs += /mob/living/proc/guardian_recall user.verbs += /mob/living/proc/guardian_reset @@ -727,23 +721,23 @@ GLOBAL_LIST_EMPTY(parasites) //all currently existing/living guardians use_message = "You put the fishsticks in your mouth..." used_message = "Someone's already taken a bite out of these fishsticks! Ew." failure_message = "You couldn't catch any carp spirits from the seas of Lake Carp. Maybe there are none, maybe you fucked up." - ling_failure = "Carp'sie is fine with changelings, so you shouldn't be seeing this message." + ling_failure = "Carp'sie seems to not have taken you as the chosen one. Maybe it's because of your horrifying origin." allowmultiple = TRUE /obj/item/guardiancreator/carp/choose random = FALSE -/obj/item/guardiancreator/hive - name = "mysterious core" - desc = "All that remains of a hivelord. It has a mysterious aura around it..." - icon = 'icons/obj/surgery.dmi' - icon_state = "roro core 2" - theme = "hive" - mob_name = "Hivelord" - use_message = "You place the core near your heart..." - used_message = "This core seems to have decayed and doesn't work anymore..." - failure_message = "You couldn't gather any mass with the core, maybe try again later." - ling_failure = "Even the dark energies seem to not want to be near your horrific body." +/obj/item/guardiancreator/miner + name = "dusty shard" + desc = "Seems to be a very old rock, may have originated from a strange meteor." + icon = 'icons/obj/lavaland/artefacts.dmi' + icon_state = "dustyshard" + theme = "miner" + mob_name = "Power Miner" + use_message = "You pierce your skin with the shard..." + used_message = "This shard seems to have lost all its' power..." + failure_message = "The shard hasn't reacted at all. Maybe try again later..." + ling_failure = "The power of the shard seems to not react with your horrifying, mutated body." -/obj/item/guardiancreator/hive/choose +/obj/item/guardiancreator/miner/choose random = FALSE diff --git a/code/modules/mob/living/simple_animal/guardian/types/assassin.dm b/code/modules/mob/living/simple_animal/guardian/types/assassin.dm index 44c2ab2e8e1..01f101c6455 100644 --- a/code/modules/mob/living/simple_animal/guardian/types/assassin.dm +++ b/code/modules/mob/living/simple_animal/guardian/types/assassin.dm @@ -10,7 +10,7 @@ magic_fluff_string = "..And draw the Space Ninja, a lethal, invisible assassin." tech_fluff_string = "Boot sequence complete. Assassin modules loaded. Holoparasite swarm online." carp_fluff_string = "CARP CARP CARP! Caught one! It's an assassin carp! Just when you thought it was safe to go back to the water... which is unhelpful, because we're in space." - hive_fluff_string = "The mass seems to be able to attack with stealth causing massive damage." + miner_fluff_string = "You encounter... Glass, a sharp, fragile attacker." toggle_button_type = /obj/screen/guardian/ToggleMode/Assassin var/toggle = FALSE var/stealthcooldown = 160 diff --git a/code/modules/mob/living/simple_animal/guardian/types/charger.dm b/code/modules/mob/living/simple_animal/guardian/types/charger.dm index 12463e0bc6c..93b0c555fbe 100644 --- a/code/modules/mob/living/simple_animal/guardian/types/charger.dm +++ b/code/modules/mob/living/simple_animal/guardian/types/charger.dm @@ -11,7 +11,7 @@ magic_fluff_string = "..And draw the Hunter, an alien master of rapid assault." tech_fluff_string = "Boot sequence complete. Charge modules loaded. Holoparasite swarm online." carp_fluff_string = "CARP CARP CARP! Caught one! It's a charger carp, that likes running at people. But it doesn't have any legs..." - hive_fluff_string = "The mass seems to have primal senses, rapidly assaulting its' enemies." + miner_fluff_string = "You encounter... Titanium, a lightweight, agile fighter." var/charging = 0 var/obj/screen/alert/chargealert diff --git a/code/modules/mob/living/simple_animal/guardian/types/dextrous.dm b/code/modules/mob/living/simple_animal/guardian/types/dextrous.dm index 182f45703c0..d07fb00c619 100644 --- a/code/modules/mob/living/simple_animal/guardian/types/dextrous.dm +++ b/code/modules/mob/living/simple_animal/guardian/types/dextrous.dm @@ -7,7 +7,7 @@ magic_fluff_string = "..And draw the Drone, a dextrous master of construction and repair." tech_fluff_string = "Boot sequence complete. Dextrous combat modules loaded. Holoparasite swarm online." carp_fluff_string = "CARP CARP CARP! You caught one! It can hold stuff in its fins, sort of." - hive_fluff_string = "The mass seems to be able to... hold stuff?" + miner_fluff_string = "You encounter... Gold, a malleable constructor." dextrous = TRUE held_items = list(null, null) var/obj/item/internal_storage //what we're storing within ourself diff --git a/code/modules/mob/living/simple_animal/guardian/types/explosive.dm b/code/modules/mob/living/simple_animal/guardian/types/explosive.dm index f1e38dabbb4..3a317b4143d 100644 --- a/code/modules/mob/living/simple_animal/guardian/types/explosive.dm +++ b/code/modules/mob/living/simple_animal/guardian/types/explosive.dm @@ -14,7 +14,7 @@ magic_fluff_string = "..And draw the Scientist, master of explosive death." tech_fluff_string = "Boot sequence complete. Explosive modules active. Holoparasite swarm online." carp_fluff_string = "CARP CARP CARP! Caught one! It's an explosive carp! Boom goes the fishy." - hive_fluff_string = "The mass seems to generate explosive energy, destroying everything in its' path." + miner_fluff_string = "You encounter... Gibtonite, an explosive fighter." var/bomb_cooldown = 0 var/static/list/boom_signals = list(COMSIG_PARENT_ATTACKBY, COMSIG_ATOM_BUMPED, COMSIG_ATOM_ATTACK_HAND) diff --git a/code/modules/mob/living/simple_animal/guardian/types/fire.dm b/code/modules/mob/living/simple_animal/guardian/types/fire.dm index 641e9664e94..1b50d1ad95c 100644 --- a/code/modules/mob/living/simple_animal/guardian/types/fire.dm +++ b/code/modules/mob/living/simple_animal/guardian/types/fire.dm @@ -12,7 +12,7 @@ magic_fluff_string = "..And draw the Wizard, bringer of endless chaos!" tech_fluff_string = "Boot sequence complete. Crowd control modules activated. Holoparasite swarm online." carp_fluff_string = "CARP CARP CARP! You caught one! OH GOD, EVERYTHING'S ON FIRE. Except you and the fish." - hive_fluff_string = "The mass seems to generate lots of energy, causing everything except its' owner to burn to ash." + miner_fluff_string = "You encounter... Plasma, the bringer of fire." /mob/living/simple_animal/hostile/guardian/fire/Life() . = ..() diff --git a/code/modules/mob/living/simple_animal/guardian/types/gravitokinetic.dm b/code/modules/mob/living/simple_animal/guardian/types/gravitokinetic.dm index 32ec8e5f55a..b8a8bbb5436 100644 --- a/code/modules/mob/living/simple_animal/guardian/types/gravitokinetic.dm +++ b/code/modules/mob/living/simple_animal/guardian/types/gravitokinetic.dm @@ -7,7 +7,7 @@ magic_fluff_string = "..And draw the Singularity, an anomalous force of terror." tech_fluff_string = "Boot sequence complete. Gravitokinetic modules loaded. Holoparasite swarm online." carp_fluff_string = "CARP CARP CARP! Caught one! It's a gravitokinetic carp! Now do you understand the gravity of the situation?" - hive_fluff_string = "The mass seems to be extremely heavy, and able to relay the heaviness to others." + miner_fluff_string = "You encounter... Bananium, a master of gravity business." var/list/gravito_targets = list() var/gravity_power_range = 10 //how close the stand must stay to the target to keep the heavy gravity diff --git a/code/modules/mob/living/simple_animal/guardian/types/lightning.dm b/code/modules/mob/living/simple_animal/guardian/types/lightning.dm index 62eb1a54300..a70bf4edae2 100644 --- a/code/modules/mob/living/simple_animal/guardian/types/lightning.dm +++ b/code/modules/mob/living/simple_animal/guardian/types/lightning.dm @@ -16,7 +16,7 @@ magic_fluff_string = "..And draw the Tesla, a shocking, lethal source of power." tech_fluff_string = "Boot sequence complete. Lightning modules active. Holoparasite swarm online." carp_fluff_string = "CARP CARP CARP! Caught one! It's a lightning carp! Everyone else goes zap zap." - hive_fluff_string = "The mass seems to cause lots of thunder strikes around itself." + miner_fluff_string = "You encounter... Iron, a conductive master of lightning." var/datum/beam/summonerchain var/list/enemychains = list() var/successfulshocks = 0 diff --git a/code/modules/mob/living/simple_animal/guardian/types/protector.dm b/code/modules/mob/living/simple_animal/guardian/types/protector.dm index b90e99de0e2..bb2682c464d 100644 --- a/code/modules/mob/living/simple_animal/guardian/types/protector.dm +++ b/code/modules/mob/living/simple_animal/guardian/types/protector.dm @@ -8,7 +8,7 @@ magic_fluff_string = "..And draw the Guardian, a stalwart protector that never leaves the side of its charge." tech_fluff_string = "Boot sequence complete. Protector modules loaded. Holoparasite swarm online." carp_fluff_string = "CARP CARP CARP! You caught one! Wait, no... it caught you! The fisher has become the fishy." - hive_fluff_string = "The mass seems to be extremely resistant to damage and have a special connection with the owner." + miner_fluff_string = "You encounter... Uranium, a very resistant guardian." toggle_button_type = /obj/screen/guardian/ToggleMode var/toggle = FALSE diff --git a/code/modules/mob/living/simple_animal/guardian/types/ranged.dm b/code/modules/mob/living/simple_animal/guardian/types/ranged.dm index 996b21e8eb4..17018e55266 100644 --- a/code/modules/mob/living/simple_animal/guardian/types/ranged.dm +++ b/code/modules/mob/living/simple_animal/guardian/types/ranged.dm @@ -22,7 +22,7 @@ magic_fluff_string = "..And draw the Sentinel, an alien master of ranged combat." tech_fluff_string = "Boot sequence complete. Ranged combat modules active. Holoparasite swarm online." carp_fluff_string = "CARP CARP CARP! Caught one, it's a ranged carp. This fishy can watch people pee in the ocean." - hive_fluff_string = "The mass seems to be able to create more mass and also hide at will." + miner_fluff_string = "You encounter... Diamond, a powerful projectile thrower." see_invisible = SEE_INVISIBLE_LIVING see_in_dark = 8 toggle_button_type = /obj/screen/guardian/ToggleMode @@ -112,6 +112,7 @@ /obj/effect/snare/Crossed(AM as mob|obj) + . = ..() if(isliving(AM) && spawner && spawner.summoner && AM != spawner && !spawner.hasmatchingsummoner(AM)) to_chat(spawner.summoner, "[AM] has crossed surveillance snare, [name].") var/list/guardians = spawner.summoner.hasparasites() diff --git a/code/modules/mob/living/simple_animal/guardian/types/standard.dm b/code/modules/mob/living/simple_animal/guardian/types/standard.dm index 357c593695b..43b741b2fa4 100644 --- a/code/modules/mob/living/simple_animal/guardian/types/standard.dm +++ b/code/modules/mob/living/simple_animal/guardian/types/standard.dm @@ -9,7 +9,7 @@ magic_fluff_string = "..And draw the Assistant, faceless and generic, but never to be underestimated." tech_fluff_string = "Boot sequence complete. Standard combat modules loaded. Holoparasite swarm online." carp_fluff_string = "CARP CARP CARP! You caught one! It's really boring and standard. Better punch some walls to ease the tension." - hive_fluff_string = "The mass seems to have immense strength and increased agility." + miner_fluff_string = "You encounter... Adamantine, a powerful attacker." var/battlecry = "AT" /mob/living/simple_animal/hostile/guardian/punch/verb/Battlecry() diff --git a/code/modules/mob/living/simple_animal/guardian/types/support.dm b/code/modules/mob/living/simple_animal/guardian/types/support.dm index 4cc09b47598..368a993ed8b 100644 --- a/code/modules/mob/living/simple_animal/guardian/types/support.dm +++ b/code/modules/mob/living/simple_animal/guardian/types/support.dm @@ -11,7 +11,7 @@ magic_fluff_string = "..And draw the CMO, a potent force of life... and death." carp_fluff_string = "CARP CARP CARP! You caught a support carp. It's a kleptocarp!" tech_fluff_string = "Boot sequence complete. Support modules active. Holoparasite swarm online." - hive_fluff_string = "The mass seems to have regenerative powers, while also possessing strength." + miner_fluff_string = "You encounter... Bluespace, the master of support." toggle_button_type = /obj/screen/guardian/ToggleMode var/obj/structure/receiving_pad/beacon var/beacon_cooldown = 0 diff --git a/code/modules/mob/living/simple_animal/hostile/cockroach.dm b/code/modules/mob/living/simple_animal/hostile/cockroach.dm index f55fa50b2b5..cc57f2534cf 100644 --- a/code/modules/mob/living/simple_animal/hostile/cockroach.dm +++ b/code/modules/mob/living/simple_animal/hostile/cockroach.dm @@ -62,6 +62,7 @@ ..() /mob/living/simple_animal/hostile/cockroach/Crossed(var/atom/movable/AM) + . = ..() if(ismob(AM)) if(isliving(AM)) var/mob/living/A = AM diff --git a/code/modules/mob/living/simple_animal/hostile/retaliate/frog.dm b/code/modules/mob/living/simple_animal/hostile/retaliate/frog.dm index 8f9a9ad597e..a2bea19e534 100644 --- a/code/modules/mob/living/simple_animal/hostile/retaliate/frog.dm +++ b/code/modules/mob/living/simple_animal/hostile/retaliate/frog.dm @@ -42,6 +42,7 @@ butcher_results = list(/obj/item/reagent_containers/food/snacks/nugget = 5) /mob/living/simple_animal/hostile/retaliate/frog/Crossed(AM as mob|obj) + . = ..() if(!stat && isliving(AM)) var/mob/living/L = AM if(L.mob_size > MOB_SIZE_TINY) diff --git a/code/modules/mob/living/simple_animal/hostile/venus_human_trap.dm b/code/modules/mob/living/simple_animal/hostile/venus_human_trap.dm index 393690cfcf7..9e5be8dcb68 100644 --- a/code/modules/mob/living/simple_animal/hostile/venus_human_trap.dm +++ b/code/modules/mob/living/simple_animal/hostile/venus_human_trap.dm @@ -38,6 +38,7 @@ /obj/effect/ebeam/vine/Crossed(atom/movable/AM) + . = ..() if(isliving(AM)) var/mob/living/L = AM if(!("vines" in L.faction)) diff --git a/code/modules/mob/living/simple_animal/simple_animal.dm b/code/modules/mob/living/simple_animal/simple_animal.dm index ac06c131aa6..329af982d56 100644 --- a/code/modules/mob/living/simple_animal/simple_animal.dm +++ b/code/modules/mob/living/simple_animal/simple_animal.dm @@ -616,18 +616,12 @@ /mob/living/simple_animal/update_inv_hands() if(client && hud_used && hud_used.hud_version != HUD_STYLE_NOHUD) - var/obj/item/l_hand = get_item_for_held_index(1) - var/obj/item/r_hand = get_item_for_held_index(2) - if(r_hand) - r_hand.layer = ABOVE_HUD_LAYER - r_hand.plane = ABOVE_HUD_PLANE - r_hand.screen_loc = ui_hand_position(get_held_index_of_item(r_hand)) - client.screen |= r_hand - if(l_hand) - l_hand.layer = ABOVE_HUD_LAYER - l_hand.plane = ABOVE_HUD_PLANE - l_hand.screen_loc = ui_hand_position(get_held_index_of_item(l_hand)) - client.screen |= l_hand + for(var/obj/item/I in held_items) + var/index = get_held_index_of_item(I) + I.layer = ABOVE_HUD_LAYER + I.plane = ABOVE_HUD_PLANE + I.screen_loc = ui_hand_position(index) + client.screen |= I //ANIMAL RIDING diff --git a/code/modules/modular_computers/computers/item/laptop.dm b/code/modules/modular_computers/computers/item/laptop.dm index 73cf9c62f48..3ec5bddfad5 100644 --- a/code/modules/modular_computers/computers/item/laptop.dm +++ b/code/modules/modular_computers/computers/item/laptop.dm @@ -40,9 +40,8 @@ . = ..() /obj/item/modular_computer/laptop/update_overlays() - . = ..() if(screen_on) - ..() + return ..() else cut_overlays() icon_state = icon_state_closed diff --git a/code/modules/modular_computers/file_system/programs/arcade.dm b/code/modules/modular_computers/file_system/programs/arcade.dm index 17db77381a2..ca19c80a9f2 100644 --- a/code/modules/modular_computers/file_system/programs/arcade.dm +++ b/code/modules/modular_computers/file_system/programs/arcade.dm @@ -27,6 +27,7 @@ /datum/computer_file/program/arcade/proc/game_check(mob/user) sleep(5) + user?.mind?.adjust_experience(/datum/skill/gaming, 1) if(boss_hp <= 0) heads_up = "You have crushed [boss_name]! Rejoice!" playsound(computer.loc, 'sound/arcade/win.ogg', 50, TRUE, extrarange = -3, falloff = 10) @@ -35,8 +36,8 @@ if(istype(computer)) computer.update_icon() ticket_count += 1 + user?.mind?.adjust_experience(/datum/skill/gaming, 50) sleep(10) - return else if(player_hp <= 0 || player_mp <= 0) heads_up = "You have been defeated... how will the station survive?" playsound(computer.loc, 'sound/arcade/lose.ogg', 50, TRUE, extrarange = -3, falloff = 10) @@ -44,9 +45,8 @@ program_icon_state = "arcade_off" if(istype(computer)) computer.update_icon() + user?.mind?.adjust_experience(/datum/skill/gaming, 10) sleep(10) - return - return /datum/computer_file/program/arcade/proc/enemy_check(mob/user) var/boss_attackamt = 0 //Spam protection from boss attacks as well. @@ -101,11 +101,13 @@ if(computer) printer = computer.all_components[MC_PRINT] + var/gamerSkillLevel = user.mind?.get_skill_level(/datum/skill/gaming) + var/gamerSkill = usr.mind?.get_skill_modifier(/datum/skill/gaming, SKILL_RANDS_MODIFIER) switch(action) if("Attack") var/attackamt = 0 //Spam prevention. if(pause_state == FALSE) - attackamt = rand(2,6) + attackamt = rand(2,6) + rand(0, gamerSkill) pause_state = TRUE heads_up = "You attack for [attackamt] damage." playsound(computer.loc, 'sound/arcade/hit.ogg', 50, TRUE, extrarange = -3, falloff = 10) @@ -118,8 +120,11 @@ var/healamt = 0 //More Spam Prevention. var/healcost = 0 if(pause_state == FALSE) - healamt = rand(6,8) - healcost = rand(1,3) + healamt = rand(6,8) + rand(0, gamerSkill) + var/maxPointCost = 3 + if(gamerSkillLevel >= SKILL_LEVEL_JOURNEYMAN) + maxPointCost = 2 + healcost = rand(1, maxPointCost) pause_state = TRUE heads_up = "You heal for [healamt] damage." playsound(computer.loc, 'sound/arcade/heal.ogg', 50, TRUE, extrarange = -3, falloff = 10) @@ -132,7 +137,7 @@ if("Recharge_Power") var/rechargeamt = 0 //As above. if(pause_state == FALSE) - rechargeamt = rand(4,7) + rechargeamt = rand(4,7) + rand(0, gamerSkill) pause_state = TRUE heads_up = "You regain [rechargeamt] magic power." playsound(computer.loc, 'sound/arcade/mana.ogg', 50, TRUE, extrarange = -3, falloff = 10) diff --git a/code/modules/paperwork/handlabeler.dm b/code/modules/paperwork/handlabeler.dm index d22cd747ca7..10def176c53 100644 --- a/code/modules/paperwork/handlabeler.dm +++ b/code/modules/paperwork/handlabeler.dm @@ -1,6 +1,6 @@ /obj/item/hand_labeler name = "hand labeler" - desc = "A combined label printer and applicator in a portable device, designed to be easy to operate and use." + desc = "A combined label printer, applicator, and remover, all in a single portable device. Designed to be easy to operate and use." icon = 'icons/obj/bureaucracy.dmi' icon_state = "labeler0" item_state = "flight" @@ -55,9 +55,10 @@ to_chat(user, "You can't label creatures!") // use a collar return - user.visible_message("[user] labels [A] as [label].", \ - "You label [A] as [label].") - A.name = "[A.name] ([label])" + user.visible_message("[user] labels [A] with \"[label]\".", \ + "You label [A] with \"[label]\".") + A.AddComponent(/datum/component/label, label) + playsound(A, 'sound/items/handling/component_pickup.ogg', 20, TRUE) labels_left-- diff --git a/code/modules/power/floodlight.dm b/code/modules/power/floodlight.dm index 3aa7bef97d3..e112b38f2fd 100644 --- a/code/modules/power/floodlight.dm +++ b/code/modules/power/floodlight.dm @@ -128,7 +128,6 @@ else current-- change_setting(current, user) - ..() /obj/machinery/power/floodlight/obj_break(damage_flag) . = ..() diff --git a/code/modules/power/multiz.dm b/code/modules/power/multiz.dm index 6ad239d3b88..3ad0d8be6df 100644 --- a/code/modules/power/multiz.dm +++ b/code/modules/power/multiz.dm @@ -28,31 +28,29 @@ if(default_unfasten_wrench(user, I)) if(!anchored && broken_status == RELAY_OK) break_connections() - return return FALSE - . = ..() - if(istype(I, /obj/item/stack/cable_coil) && broken_status == RELAY_ADD_CABLE) + + else if(istype(I, /obj/item/stack/cable_coil) && broken_status == RELAY_ADD_CABLE) var/obj/item/stack/C = I if(C.use(15)) to_chat(user, "You fix the frayed wires inside [src].") icon_state = "cablerelay-broken-cable" broken_status = RELAY_ADD_METAL - return else to_chat(user, "You need 15 cables to rewire [src].") - return - if(istype(I, /obj/item/stack/sheet/metal) && broken_status == RELAY_ADD_METAL) + + else if(istype(I, /obj/item/stack/sheet/metal) && broken_status == RELAY_ADD_METAL) var/obj/item/stack/S = I if(S.use(10)) to_chat(user, "You reseal the insulation for [src].") icon_state = "cablerelay" broken_status = RELAY_OK obj_integrity = max_integrity - return else to_chat(user, "You need 10 metal to mend [src].") - return - . = ..() + + else + return ..() /obj/machinery/power/deck_relay/obj_break() ..() diff --git a/code/modules/power/singularity/containment_field.dm b/code/modules/power/singularity/containment_field.dm index 5900286f860..71c899b7198 100644 --- a/code/modules/power/singularity/containment_field.dm +++ b/code/modules/power/singularity/containment_field.dm @@ -65,6 +65,7 @@ return ..() /obj/machinery/field/containment/Crossed(atom/movable/AM) + . = ..() if(isliving(AM)) shock(AM) diff --git a/code/modules/power/singularity/particle_accelerator/particle.dm b/code/modules/power/singularity/particle_accelerator/particle.dm index 57f4a77fc2c..050d31b37c2 100644 --- a/code/modules/power/singularity/particle_accelerator/particle.dm +++ b/code/modules/power/singularity/particle_accelerator/particle.dm @@ -44,6 +44,7 @@ movement_range = 0 /obj/effect/accelerated_particle/Crossed(atom/A) + . = ..() if(isliving(A)) toxmob(A) diff --git a/code/modules/projectiles/guns/energy/special.dm b/code/modules/projectiles/guns/energy/special.dm index d8d45e093c8..8fd73a90cc1 100644 --- a/code/modules/projectiles/guns/energy/special.dm +++ b/code/modules/projectiles/guns/energy/special.dm @@ -133,14 +133,13 @@ usesound = list('sound/items/welder.ogg', 'sound/items/welder2.ogg') tool_behaviour = TOOL_WELDER toolspeed = 0.7 //plasmacutters can be used as welders, and are faster than standard welders - var/progress_flash_divisor = 10 //copypasta is best pasta - var/light_intensity = 1 var/charge_weld = 25 //amount of charge used up to start action (multiplied by amount) and per progress_flash_divisor ticks of welding /obj/item/gun/energy/plasmacutter/ComponentInitialize() . = ..() AddComponent(/datum/component/butchering, 25, 105, 0, 'sound/weapons/plasma_cutter.ogg') AddElement(/datum/element/update_icon_blocker) + AddElement(/datum/element/tool_flash, 1) /obj/item/gun/energy/plasmacutter/examine(mob/user) . = ..() @@ -163,13 +162,6 @@ else ..() -// Tool procs, in case plasma cutter is used as welder -// Can we start welding? -/obj/item/gun/energy/plasmacutter/tool_start_check(mob/living/user, amount) - . = tool_use_check(user, amount) - if(. && user) - user.flash_act(light_intensity) - // Can we weld? Plasma cutter does not use charge continuously. // Amount cannot be defaulted to 1: most of the code specifies 0 in the call. /obj/item/gun/energy/plasmacutter/tool_use_check(mob/living/user, amount) @@ -188,17 +180,6 @@ /obj/item/gun/energy/plasmacutter/use(amount) return (!QDELETED(cell) && cell.use(amount ? amount * charge_weld : charge_weld)) -// This only gets called by use_tool(delay > 0) -// It's also supposed to not get overridden in the first place. -/obj/item/gun/energy/plasmacutter/tool_check_callback(mob/living/user, amount, datum/callback/extra_checks) - . = ..() //return tool_use_check(user, amount) && (!extra_checks || extra_checks.Invoke()) - if(. && user) - if (progress_flash_divisor == 0) - user.flash_act(min(light_intensity,1)) - progress_flash_divisor = initial(progress_flash_divisor) - else - progress_flash_divisor-- - /obj/item/gun/energy/plasmacutter/use_tool(atom/target, mob/living/user, delay, amount=1, volume=0, datum/callback/extra_checks) if(amount) . = ..() diff --git a/code/modules/reagents/chemistry/reagents/drink_reagents.dm b/code/modules/reagents/chemistry/reagents/drink_reagents.dm index 55d0c5c207a..5754b2f7c5a 100644 --- a/code/modules/reagents/chemistry/reagents/drink_reagents.dm +++ b/code/modules/reagents/chemistry/reagents/drink_reagents.dm @@ -487,8 +487,17 @@ glass_name = "glass of Pwr Game" glass_desc = "Goes well with a Vlad's salad." +/datum/reagent/consumable/pwr_game/reaction_mob(mob/living/C, method=TOUCH, reac_volume) + ..() + if(C?.mind?.get_skill_level(/datum/skill/gaming) >= SKILL_LEVEL_LEGENDARY && method==INGEST && !HAS_TRAIT(C, TRAIT_GAMERGOD)) + ADD_TRAIT(C, TRAIT_GAMERGOD, "pwr_game") + to_chat(C, "As you imbibe the Pwr Game, your gamer third eye opens... \ + You feel as though a great secret of the universe has been made known to you...") + /datum/reagent/consumable/pwr_game/on_mob_life(mob/living/carbon/M) M.adjust_bodytemperature(-8 * TEMPERATURE_DAMAGE_COEFFICIENT, M.get_body_temp_normal()) + if(prob(10)) + M?.mind.adjust_experience(/datum/skill/gaming, 5) ..() /datum/reagent/consumable/shamblers diff --git a/code/modules/research/designs/autolathe_designs.dm b/code/modules/research/designs/autolathe_designs.dm index dc173641add..3cc1f7d40b5 100644 --- a/code/modules/research/designs/autolathe_designs.dm +++ b/code/modules/research/designs/autolathe_designs.dm @@ -20,6 +20,15 @@ category = list("initial","Tools","Tool Designs") departmental_flags = DEPARTMENTAL_FLAG_SERVICE +/datum/design/broom + name="Push Broom" + id="pushbroom" + build_type = AUTOLATHE | PROTOLATHE + materials = list(/datum/material/iron = 2000) + build_path = /obj/item/pushbroom + category = list("initial","Tools","Tool Designs") + departmental_flags = DEPARTMENTAL_FLAG_SERVICE + /datum/design/crowbar name = "Pocket Crowbar" id = "crowbar" diff --git a/code/modules/research/designs/medical_designs.dm b/code/modules/research/designs/medical_designs.dm index 4d568a13b18..17e907becf8 100644 --- a/code/modules/research/designs/medical_designs.dm +++ b/code/modules/research/designs/medical_designs.dm @@ -720,13 +720,6 @@ surgery = /datum/surgery/healing/combo/upgraded/femto id = "surgery_heal_combo_upgrade_femto" -/datum/design/surgery/revival - name = "Revival" - desc = "An experimental surgical procedure which involves reconstruction and reactivation of the patient's brain even long after death. The body must still be able to sustain life." - id = "surgery_revival" - surgery = /datum/surgery/advanced/revival - research_icon_state = "surgery_head" - /datum/design/surgery/brainwashing name = "Brainwashing" desc = "A surgical procedure which directly implants a directive into the patient's brain, making it their absolute priority. It can be cleared using a mindshield implant." diff --git a/code/modules/research/nanites/nanite_programs.dm b/code/modules/research/nanites/nanite_programs.dm index 50ff6f4a846..d480ec0a146 100644 --- a/code/modules/research/nanites/nanite_programs.dm +++ b/code/modules/research/nanites/nanite_programs.dm @@ -48,7 +48,7 @@ //Extra settings ///Don't ever override this or I will come to your house and stand menacingly behind a bush - var/list/extra_settings = list() + VAR_FINAL/list/extra_settings = list() //Rules //Rules that automatically manage if the program's active without requiring separate sensor programs diff --git a/code/modules/research/techweb/all_nodes.dm b/code/modules/research/techweb/all_nodes.dm index 9ca804ad89b..e1b6897e00a 100644 --- a/code/modules/research/techweb/all_nodes.dm +++ b/code/modules/research/techweb/all_nodes.dm @@ -103,7 +103,7 @@ display_name = "Advanced Surgery" description = "When simple medicine doesn't cut it." prereq_ids = list("imp_wt_surgery") - design_ids = list("surgery_lobotomy", "surgery_heal_brute_upgrade_femto", "surgery_heal_burn_upgrade_femto","surgery_heal_combo", "surgery_revival","surgery_adv_dissection") + design_ids = list("surgery_lobotomy", "surgery_heal_brute_upgrade_femto", "surgery_heal_burn_upgrade_femto","surgery_heal_combo","surgery_adv_dissection") research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 1500) export_price = 4000 diff --git a/code/modules/research/xenobiology/xenobiology.dm b/code/modules/research/xenobiology/xenobiology.dm index 3853f076cdb..46b6713bf1b 100644 --- a/code/modules/research/xenobiology/xenobiology.dm +++ b/code/modules/research/xenobiology/xenobiology.dm @@ -932,7 +932,7 @@ return if(C.max_heat_protection_temperature >= FIRE_IMMUNITY_MAX_TEMP_PROTECT) to_chat(user, "The [C] is already fireproof!") - return ..() + return to_chat(user, "You slather the blue gunk over the [C], fireproofing it.") C.name = "fireproofed [C.name]" C.remove_atom_colour(WASHABLE_COLOUR_PRIORITY) diff --git a/code/modules/ruins/objects_and_mobs/necropolis_gate.dm b/code/modules/ruins/objects_and_mobs/necropolis_gate.dm index ef8a53ea4c5..82e34607e02 100644 --- a/code/modules/ruins/objects_and_mobs/necropolis_gate.dm +++ b/code/modules/ruins/objects_and_mobs/necropolis_gate.dm @@ -264,6 +264,7 @@ GLOBAL_DATUM(necropolis_gate, /obj/structure/necropolis_gate/legion_gate) return /obj/structure/stone_tile/Crossed(atom/movable/AM) + . = ..() if(falling || fallen) return var/turf/T = get_turf(src) diff --git a/code/modules/shuttle/special.dm b/code/modules/shuttle/special.dm index 90ac6ac5d54..11c438b622d 100644 --- a/code/modules/shuttle/special.dm +++ b/code/modules/shuttle/special.dm @@ -233,7 +233,7 @@ if(!isliving(mover)) //No stowaways return FALSE -/obj/machinery/scanner_gate/luxury_shuttle/Crossed(atom/movable/AM) +/obj/machinery/scanner_gate/luxury_shuttle/auto_scan(atom/movable/AM) return /obj/machinery/scanner_gate/luxury_shuttle/attackby(obj/item/W, mob/user, params) diff --git a/code/modules/spells/spell_types/spacetime_distortion.dm b/code/modules/spells/spell_types/spacetime_distortion.dm index aaa9c2fc8ef..2c3254b8daf 100644 --- a/code/modules/spells/spell_types/spacetime_distortion.dm +++ b/code/modules/spells/spell_types/spacetime_distortion.dm @@ -102,6 +102,7 @@ busy = FALSE /obj/effect/cross_action/spacetime_dist/Crossed(atom/movable/AM) + . = ..() if(!busy) walk_link(AM) diff --git a/code/modules/surgery/bodyparts/bodyparts.dm b/code/modules/surgery/bodyparts/bodyparts.dm index e6836c403c9..a36d91334a2 100644 --- a/code/modules/surgery/bodyparts/bodyparts.dm +++ b/code/modules/surgery/bodyparts/bodyparts.dm @@ -87,14 +87,16 @@ var/mob/living/carbon/human/H = C if(HAS_TRAIT(C, TRAIT_LIMBATTACHMENT)) if(!H.get_bodypart(body_zone) && !animal_origin) + user.temporarilyRemoveItemFromInventory(src, TRUE) + if(!attach_limb(C)) + to_chat(user, "[H]'s body rejects [src]!") + forceMove(H.loc) if(H == user) H.visible_message("[H] jams [src] into [H.p_their()] empty socket!",\ "You force [src] into your empty socket, and it locks into place!") else H.visible_message("[user] jams [src] into [H]'s empty socket!",\ "[user] forces [src] into your empty socket, and it locks into place!") - user.temporarilyRemoveItemFromInventory(src, TRUE) - attach_limb(C) return ..() diff --git a/code/modules/surgery/bodyparts/dismemberment.dm b/code/modules/surgery/bodyparts/dismemberment.dm index d58499279a6..13b48fceeb7 100644 --- a/code/modules/surgery/bodyparts/dismemberment.dm +++ b/code/modules/surgery/bodyparts/dismemberment.dm @@ -259,23 +259,25 @@ /obj/item/bodypart/proc/replace_limb(mob/living/carbon/C, special) if(!istype(C)) return - var/obj/item/bodypart/O = C.get_bodypart(body_zone) + var/obj/item/bodypart/O = C.get_bodypart(body_zone) //needs to happen before attach because multiple limbs in same zone breaks helpers + if(!attach_limb(C, special))//we can attach this limb and drop the old after because of our robust bodyparts system. you know, just for a sec. + return if(O) O.drop_limb(1) - attach_limb(C, special) /obj/item/bodypart/head/replace_limb(mob/living/carbon/C, special) if(!istype(C)) return var/obj/item/bodypart/head/O = C.get_bodypart(body_zone) + if(!attach_limb(C, special)) + return if(O) - if(!special) - return - else - O.drop_limb(1) - attach_limb(C, special) + O.drop_limb(1) /obj/item/bodypart/proc/attach_limb(mob/living/carbon/C, special) + if(SEND_SIGNAL(C, COMSIG_LIVING_ATTACH_LIMB, src, special) & COMPONENT_NO_ATTACH) + return FALSE + . = TRUE moveToNullspace() owner = C C.bodyparts += src @@ -312,7 +314,10 @@ C.update_mobility() -/obj/item/bodypart/head/attach_limb(mob/living/carbon/C, special) +/obj/item/bodypart/head/attach_limb(mob/living/carbon/C, special = FALSE, abort = FALSE) + . = ..() + if(!.) + return . //Transfer some head appearance vars over if(brain) if(brainmob) @@ -350,19 +355,22 @@ AP.Grant(C) break - ..() - + C.updatehealth() + C.update_body() + C.update_hair() + C.update_damage_overlays() + C.update_mobility() //Regenerates all limbs. Returns amount of limbs regenerated -/mob/living/proc/regenerate_limbs(noheal = FALSE, list/excluded_limbs = list()) - SEND_SIGNAL(src, COMSIG_LIVING_REGENERATE_LIMBS, noheal, excluded_limbs) +/mob/living/proc/regenerate_limbs(noheal = FALSE, list/excluded_zones = list()) + SEND_SIGNAL(src, COMSIG_LIVING_REGENERATE_LIMBS, noheal, excluded_zones) -/mob/living/carbon/regenerate_limbs(noheal = FALSE, list/excluded_limbs = list()) +/mob/living/carbon/regenerate_limbs(noheal = FALSE, list/excluded_zones = list()) . = ..() - var/list/limb_list = list(BODY_ZONE_HEAD, BODY_ZONE_CHEST, BODY_ZONE_R_ARM, BODY_ZONE_L_ARM, BODY_ZONE_R_LEG, BODY_ZONE_L_LEG) - if(length(excluded_limbs)) - limb_list -= excluded_limbs - for(var/Z in limb_list) + var/list/zone_list = list(BODY_ZONE_HEAD, BODY_ZONE_CHEST, BODY_ZONE_R_ARM, BODY_ZONE_L_ARM, BODY_ZONE_R_LEG, BODY_ZONE_L_LEG) + if(length(excluded_zones)) + zone_list -= excluded_zones + for(var/Z in zone_list) . += regenerate_limb(Z, noheal) /mob/living/proc/regenerate_limb(limb_zone, noheal) @@ -371,7 +379,7 @@ /mob/living/carbon/regenerate_limb(limb_zone, noheal) var/obj/item/bodypart/L if(get_bodypart(limb_zone)) - return 0 + return FALSE L = newBodyPart(limb_zone, 0, 0) if(L) if(!noheal) @@ -380,5 +388,7 @@ L.brutestate = 0 L.burnstate = 0 - L.attach_limb(src, 1) - return 1 + if(!L.attach_limb(src, 1)) + qdel(L) + return FALSE + return TRUE diff --git a/code/modules/surgery/bodyparts/helpers.dm b/code/modules/surgery/bodyparts/helpers.dm index 2837155191e..ea1298c3661 100644 --- a/code/modules/surgery/bodyparts/helpers.dm +++ b/code/modules/surgery/bodyparts/helpers.dm @@ -290,7 +290,7 @@ body_plan_changed = TRUE O.drop_limb(1) qdel(O) - N.attach_limb(src) + N.attach_limb(src) //no sanity for if this fails here because we just dropped out a limb of the same zone, SHOULD be okay if(body_plan_changed && ishuman(src)) var/mob/living/carbon/human/H = src if(H.w_uniform) diff --git a/code/modules/surgery/organs/appendix.dm b/code/modules/surgery/organs/appendix.dm index 89937e7b5fc..8945bac1507 100644 --- a/code/modules/surgery/organs/appendix.dm +++ b/code/modules/surgery/organs/appendix.dm @@ -28,6 +28,9 @@ if(M) M.adjustToxLoss(4, TRUE, TRUE) //forced to ensure people don't use it to gain tox as slime person +/obj/item/organ/appendix/get_availability(datum/species/S) + return !(TRAIT_NOHUNGER in S.species_traits) + /obj/item/organ/appendix/Remove(mob/living/carbon/M, special = 0) for(var/datum/disease/appendicitis/A in M.diseases) A.cure() diff --git a/code/modules/surgery/organs/eyes.dm b/code/modules/surgery/organs/eyes.dm index e0808c33c44..c29b4842a6b 100644 --- a/code/modules/surgery/organs/eyes.dm +++ b/code/modules/surgery/organs/eyes.dm @@ -83,7 +83,6 @@ C.clear_fullscreen("eye_damage") return - /obj/item/organ/eyes/night_vision name = "shadow eyes" desc = "A spooky set of eyes that can see in the dark." diff --git a/code/modules/surgery/organs/heart.dm b/code/modules/surgery/organs/heart.dm index 311b14e9585..11019c4b64d 100644 --- a/code/modules/surgery/organs/heart.dm +++ b/code/modules/surgery/organs/heart.dm @@ -91,6 +91,9 @@ owner.set_heartattack(TRUE) failed = TRUE +/obj/item/organ/heart/get_availability(datum/species/S) + return !(NOBLOOD in S.species_traits) + /obj/item/organ/heart/cursed name = "cursed heart" desc = "A heart that, when inserted, will force you to pump it manually." diff --git a/code/modules/surgery/organs/helpers.dm b/code/modules/surgery/organs/helpers.dm index 35144c73bdf..a1accce86d2 100644 --- a/code/modules/surgery/organs/helpers.dm +++ b/code/modules/surgery/organs/helpers.dm @@ -17,10 +17,10 @@ /mob/proc/getorganszone(zone) return /** - * Get an organ relating to a specific slot + * Returns a list of all organs in specified slot * * Arguments: - * * slot Slot to get the organ from + * * slot Slot to get the organs from */ /mob/proc/getorganslot(slot) return diff --git a/code/modules/surgery/organs/liver.dm b/code/modules/surgery/organs/liver.dm index fca2b6092a7..1e3e3b7cf87 100755 --- a/code/modules/surgery/organs/liver.dm +++ b/code/modules/surgery/organs/liver.dm @@ -58,6 +58,9 @@ #undef HAS_NO_TOXIN #undef HAS_PAINFUL_TOXIN +/obj/item/organ/liver/get_availability(datum/species/S) + return !(TRAIT_NOMETABOLISM in S.species_traits) + /obj/item/organ/liver/fly name = "insectoid liver" icon_state = "liver-x" //xenomorph liver? It's just a black liver so it fits. diff --git a/code/modules/surgery/organs/lungs.dm b/code/modules/surgery/organs/lungs.dm index 3cd63729c54..e00987960e5 100644 --- a/code/modules/surgery/organs/lungs.dm +++ b/code/modules/surgery/organs/lungs.dm @@ -409,6 +409,8 @@ owner.visible_message("[owner] grabs [owner.p_their()] throat, struggling for breath!", "You suddenly feel like you can't breathe!") failed = TRUE +/obj/item/organ/lungs/get_availability(datum/species/S) + return !(TRAIT_NOBREATH in S.species_traits) /obj/item/organ/lungs/plasmaman name = "plasma filter" diff --git a/code/modules/surgery/organs/organ_internal.dm b/code/modules/surgery/organs/organ_internal.dm index 3c0c658a572..98500fe422c 100644 --- a/code/modules/surgery/organs/organ_internal.dm +++ b/code/modules/surgery/organs/organ_internal.dm @@ -203,3 +203,15 @@ if(!getorganslot(ORGAN_SLOT_EARS)) var/obj/item/organ/ears/ears = new() ears.Insert(src) + + +/** get_availability + * returns whether the species should innately have this organ. + * + * regenerate organs works with generic organs, so we need to get whether it can accept certain organs just by what this returns. + * This is set to return true or false, depending on if a species has a specific organless trait. stomach for example checks if the species has NOSTOMACH and return based on that. + * Arguments: + * S - species, needed to return whether the species has an organ specific trait + */ +/obj/item/organ/proc/get_availability(datum/species/S) + return TRUE diff --git a/code/modules/surgery/organs/stomach.dm b/code/modules/surgery/organs/stomach.dm index 6757d141031..4d817a6f732 100755 --- a/code/modules/surgery/organs/stomach.dm +++ b/code/modules/surgery/organs/stomach.dm @@ -42,6 +42,9 @@ H.vomit(damage) to_chat(H, "Your stomach reels in pain as you're incapable of holding down all that food!") +/obj/item/organ/stomach/get_availability(datum/species/S) + return !(NOSTOMACH in S.species_traits) + /obj/item/organ/stomach/proc/handle_disgust(mob/living/carbon/human/H) if(H.disgust) var/pukeprob = 5 + 0.05 * H.disgust diff --git a/code/modules/surgery/prosthetic_replacement.dm b/code/modules/surgery/prosthetic_replacement.dm index c4bf477872d..d55598eb38f 100644 --- a/code/modules/surgery/prosthetic_replacement.dm +++ b/code/modules/surgery/prosthetic_replacement.dm @@ -72,7 +72,11 @@ tool = tool.contents[1] if(istype(tool, /obj/item/bodypart) && user.temporarilyRemoveItemFromInventory(tool)) var/obj/item/bodypart/L = tool - L.attach_limb(target) + if(!L.attach_limb(target)) + display_results(user, target, "You fail in replacing [target]'s [parse_zone(target_zone)]! Their body has rejected [L]!", + "[user] fails to replace [target]'s [parse_zone(target_zone)]!", + "[user] fails to replaces [target]'s [parse_zone(target_zone)]!") + return if(organ_rejection_dam) target.adjustToxLoss(organ_rejection_dam) experience_given -= (round(organ_rejection_dam/10)) @@ -83,7 +87,12 @@ else var/obj/item/bodypart/L = target.newBodyPart(target_zone, FALSE, FALSE) L.is_pseudopart = TRUE - L.attach_limb(target) + if(!L.attach_limb(target)) + display_results(user, target, "You fail in attaching [target]'s [parse_zone(target_zone)]! Their body has rejected [L]!", + "[user] fails to attach [target]'s [parse_zone(target_zone)]!", + "[user] fails to attach [target]'s [parse_zone(target_zone)]!") + L.forceMove(target.loc) + return user.visible_message("[user] finishes attaching [tool]!", "You attach [tool].") display_results(user, target, "You attach [tool].", "[user] finishes attaching [tool]!", diff --git a/code/modules/surgery/advanced/revival.dm b/code/modules/surgery/revival.dm similarity index 97% rename from code/modules/surgery/advanced/revival.dm rename to code/modules/surgery/revival.dm index e5a69a9361f..53573176e2c 100644 --- a/code/modules/surgery/advanced/revival.dm +++ b/code/modules/surgery/revival.dm @@ -1,4 +1,4 @@ -/datum/surgery/advanced/revival +/datum/surgery/revival name = "Revival" desc = "An experimental surgical procedure which involves reconstruction and reactivation of the patient's brain even long after death. The body must still be able to sustain life." steps = list(/datum/surgery_step/incise, @@ -13,7 +13,7 @@ possible_locs = list(BODY_ZONE_HEAD) requires_bodypart_type = 0 -/datum/surgery/advanced/revival/can_start(mob/user, mob/living/carbon/target) +/datum/surgery/revival/can_start(mob/user, mob/living/carbon/target) if(!..()) return FALSE if(target.stat != DEAD) diff --git a/code/modules/vehicles/vehicle_key.dm b/code/modules/vehicles/vehicle_key.dm index 0847512f094..0909618720f 100644 --- a/code/modules/vehicles/vehicle_key.dm +++ b/code/modules/vehicles/vehicle_key.dm @@ -9,10 +9,57 @@ desc = "A keyring with a small steel key, and a rubber stun baton accessory." icon_state = "keysec" +/obj/item/key/security/suicide_act(mob/living/carbon/user) + if(!user.emote("spin")) //In the off chance that someone attempts this suicide while under the effects of mime's bane they deserve the silliness. + user.visible_message("[user] is putting \the [src] in [user.p_their()] ear and starts [user.p_their()] motor! It looks like [user.p_theyre()] trying to commit suicide... But [user.p_they()] sputters and stalls out! ") + playsound(src, 'sound/misc/sadtrombone.ogg', 50, TRUE, -1) + return SHAME + user.visible_message("[user] is putting \the [src] in [user.p_their()] ear and starts [user.p_their()] motor! It looks like [user.p_theyre()] trying to commit suicide!") + user.say("Vroom vroom!!", forced="secway key suicide") //Not doing a shamestate here, because even if they fail to speak they're spinning. + addtimer(CALLBACK(user, /mob/living/.proc/gib), 20) + return MANUAL_SUICIDE + /obj/item/key/janitor desc = "A keyring with a small steel key, and a pink fob reading \"Pussy Wagon\"." icon_state = "keyjanitor" +/obj/item/key/janitor/suicide_act(mob/living/carbon/user) + switch(user.mind.get_skill_level(/datum/skill/cleaning)) + if(SKILL_LEVEL_NONE to SKILL_LEVEL_NOVICE) //Their mind is too weak to ascend as a janny + user.visible_message("[user] is putting \the [src] in [user.p_their()] mouth and is trying to become one with the janicart, but has no idea where to start! It looks like [user.p_theyre()] trying to commit suicide!") + user.gib() + return MANUAL_SUICIDE + if(SKILL_LEVEL_APPRENTICE to SKILL_LEVEL_JOURNEYMAN) //At least they tried + user.visible_message("[user] is putting \the [src] in [user.p_their()] mouth and has inefficiently become one with the janicart! It looks like [user.p_theyre()] trying to commit suicide!") + user.AddElement(/datum/element/cleaning) + addtimer(CALLBACK(src, .proc/manual_suicide, user), 51) + return MANUAL_SUICIDE + if(SKILL_LEVEL_EXPERT to SKILL_LEVEL_MASTER) //They are worthy enough, but can it go even further beyond? + user.visible_message("[user] is putting \the [src] in [user.p_their()] mouth and has skillfully become one with the janicart! It looks like [user.p_theyre()] trying to commit suicide!") + user.AddElement(/datum/element/cleaning) + for(var/i in 1 to 100) + addtimer(CALLBACK(user, /atom/proc/add_atom_colour, (i % 2)? "#a245bb" : "#7a7d82", ADMIN_COLOUR_PRIORITY), i) + addtimer(CALLBACK(src, .proc/manual_suicide, user), 101) + return MANUAL_SUICIDE + if(SKILL_LEVEL_LEGENDARY to INFINITY) //Holy shit, look at that janny go! + user.visible_message("[user] is putting \the [src] in [user.p_their()] mouth and has epically become one with the janicart, and they're even in overdrive mode! It looks like [user.p_theyre()] trying to commit suicide!") + user.AddElement(/datum/element/cleaning) + playsound(src, 'sound//magic/lightning_chargeup.ogg', 50, TRUE, -1) + user.reagents.add_reagent(/datum/reagent/drug/methamphetamine, 10) //Gotta go fast! + for(var/i in 1 to 150) + addtimer(CALLBACK(user, /atom/proc/add_atom_colour, (i % 2)? "#a245bb" : "#7a7d82", ADMIN_COLOUR_PRIORITY), i) + addtimer(CALLBACK(src, .proc/manual_suicide, user), 151) + return MANUAL_SUICIDE + +/obj/item/key/proc/manual_suicide(mob/living/user) + if(user) + user.remove_atom_colour(ADMIN_COLOUR_PRIORITY) + user.visible_message("[user] forgot [user.p_they()] isn't actually a janicart! That's a paddlin'!") + if(user.mind.get_skill_level(/datum/skill/cleaning) >= SKILL_LEVEL_LEGENDARY) //Janny janny janny janny janny + playsound(src, 'sound/effects/adminhelp.ogg', 50, TRUE, -1) + user.adjustOxyLoss(200) + user.death(0) + /obj/item/key/lasso name = "bone lasso" desc = "Perfect for taming all kinds of supernatural beasts! (Warning: only perfect for taming one kind of supernatural beast.)" diff --git a/code/modules/vending/wardrobes.dm b/code/modules/vending/wardrobes.dm index 362ea6b5b28..1fc45d053a2 100644 --- a/code/modules/vending/wardrobes.dm +++ b/code/modules/vending/wardrobes.dm @@ -284,7 +284,7 @@ /obj/item/clothing/under/rank/civilian/janitor/skirt = 2, /obj/item/clothing/gloves/color/black = 2, /obj/item/clothing/head/soft/purple = 2, - /obj/item/broom = 2, + /obj/item/pushbroom = 2, /obj/item/paint/paint_remover = 2, /obj/item/melee/flyswatter = 2, /obj/item/flashlight = 2, diff --git a/dependencies.sh b/dependencies.sh index be5a3204285..947120ac571 100755 --- a/dependencies.sh +++ b/dependencies.sh @@ -24,3 +24,6 @@ export PHP_VERSION=5.6 # SpacemanDMM git tag export SPACEMAN_DMM_VERSION=suite-1.3 + +# SpacemanDMM commit hash +export SPACEMAN_DMM_COMMIT_HASH=3cd3c402af04e6deedc9149caf5c5b0dfd44ad3b diff --git a/html/browser/scannernew.css b/html/browser/scannernew.css index 9e9f8ce1f48..25d4994bd5a 100644 --- a/html/browser/scannernew.css +++ b/html/browser/scannernew.css @@ -14,6 +14,15 @@ font-family: Fixed, monospace; float: left; } +a.incompleteBlock +{ + background: #8a4040; +} +a.incompleteBlock:hover +{ + color: #40628a; + background: #ffffff; +} img.selected { border: 1px solid blue; diff --git a/html/changelogs/AutoChangeLog-pr-49062.yml b/html/changelogs/AutoChangeLog-pr-49062.yml new file mode 100644 index 00000000000..c0cc19a3a95 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-49062.yml @@ -0,0 +1,4 @@ +author: "tralezab" +delete-after: True +changes: + - rscadd: "Martyrdom and HADS are in the pool!" diff --git a/html/changelogs/AutoChangeLog-pr-49433.yml b/html/changelogs/AutoChangeLog-pr-49433.yml new file mode 100644 index 00000000000..3bfaed5316e --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-49433.yml @@ -0,0 +1,5 @@ +author: "bobbahbrown" +delete-after: True +changes: + - rscadd: "Nanotrasen has recently retrofitted all disposal bins with built-in vacuum units, allowing brooms to sweep garbage into them!" + - rscadd: "Push brooms can now be manufactured in the service protolathe and any autolathe." diff --git a/html/changelogs/AutoChangeLog-pr-49489.yml b/html/changelogs/AutoChangeLog-pr-49489.yml new file mode 100644 index 00000000000..18f519318e4 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-49489.yml @@ -0,0 +1,4 @@ +author: "ATHATH" +delete-after: True +changes: + - balance: "The revival surgery is now a basic surgery instead of an advanced one, so you can now perform it without needing an operating computer (or the Advanced Surgery tech)." diff --git a/html/changelogs/AutoChangeLog-pr-49498.yml b/html/changelogs/AutoChangeLog-pr-49498.yml new file mode 100644 index 00000000000..81a086d5d2b --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-49498.yml @@ -0,0 +1,4 @@ +author: "ArcaneMusic" +delete-after: True +changes: + - rscadd: "Cargo can now sell more advanced tools from RnD, for a higher profit." diff --git a/html/changelogs/AutoChangeLog-pr-49557.yml b/html/changelogs/AutoChangeLog-pr-49557.yml new file mode 100644 index 00000000000..af3e11d73da --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-49557.yml @@ -0,0 +1,6 @@ +author: "Fikou" +delete-after: True +changes: + - rscadd: "hivelord stands are replaced with new mining ones, they spin!" + - bugfix: "fixed being able to change your stand name/color on every reconnect" + - imagedel: "removed most of the old holopara/guardian spirit sprites except for 2 example ones since they aren't used anymore" diff --git a/html/changelogs/AutoChangeLog-pr-49618.yml b/html/changelogs/AutoChangeLog-pr-49618.yml new file mode 100644 index 00000000000..dbd9605dd4a --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-49618.yml @@ -0,0 +1,4 @@ +author: "PKPenguin321" +delete-after: True +changes: + - rscadd: "Gaming skill has been added, level it by playing video games. Are you a bad enough dude to become a legendary gamer?" diff --git a/html/changelogs/AutoChangeLog-pr-49675.yml b/html/changelogs/AutoChangeLog-pr-49675.yml new file mode 100644 index 00000000000..cc2dcdc91a1 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-49675.yml @@ -0,0 +1,4 @@ +author: "4dplanner" +delete-after: True +changes: + - bugfix: "dextrous simple animal hud works with > 2 hands" diff --git a/html/changelogs/AutoChangeLog-pr-49677.yml b/html/changelogs/AutoChangeLog-pr-49677.yml new file mode 100644 index 00000000000..e0f1a3c4c76 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-49677.yml @@ -0,0 +1,5 @@ +author: "cacogen" +delete-after: True +changes: + - bugfix: "Removes two Box chem factory cameras from xeno and RD networks" + - tweak: "Adds Box chem factory, pharmacy and med sec post to medbay network (listed on CMO telescreen)" diff --git a/html/changelogs/AutoChangeLog-pr-49681.yml b/html/changelogs/AutoChangeLog-pr-49681.yml new file mode 100644 index 00000000000..56982c96bb5 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-49681.yml @@ -0,0 +1,5 @@ +author: "ArcaneDefence" +delete-after: True +changes: + - rscadd: "The secway key now has a unique suicide" + - rscadd: "The janicart key now has a uniquer suicide that respects janitorial skill" diff --git a/html/changelogs/AutoChangeLog-pr-49684.yml b/html/changelogs/AutoChangeLog-pr-49684.yml new file mode 100644 index 00000000000..cea57dbfac1 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-49684.yml @@ -0,0 +1,6 @@ +author: "zxaber" +delete-after: True +changes: + - rscadd: "Drones and pAI holoforms are now suitable borg hats (though they require a humanoid's help to get there)." + - bugfix: "Fixed drones not being equip-able as hats." + - bugfix: "Fixed pAIs returning to card form when being held or on someone's head leaving a phantom chassis behind." diff --git a/html/changelogs/AutoChangeLog-pr-49689.yml b/html/changelogs/AutoChangeLog-pr-49689.yml new file mode 100644 index 00000000000..6e875d2e625 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-49689.yml @@ -0,0 +1,4 @@ +author: "emptyexpression" +delete-after: True +changes: + - rscadd: "Added simple indicator for incomplete DNA blocks" diff --git a/html/changelogs/AutoChangeLog-pr-49690.yml b/html/changelogs/AutoChangeLog-pr-49690.yml new file mode 100644 index 00000000000..e88f9bf809c --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-49690.yml @@ -0,0 +1,4 @@ +author: "ArcaneMusic" +delete-after: True +changes: + - bugfix: "Fixed several issues with the Heck Factory ruin." diff --git a/html/changelogs/AutoChangeLog-pr-49696.yml b/html/changelogs/AutoChangeLog-pr-49696.yml new file mode 100644 index 00000000000..3bd7d00c5fe --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-49696.yml @@ -0,0 +1,4 @@ +author: "Luduk" +delete-after: True +changes: + - bugfix: "Bookmanagement console shows the correct amount of popups(precisely one)" diff --git a/html/changelogs/AutoChangeLog-pr-49700.yml b/html/changelogs/AutoChangeLog-pr-49700.yml new file mode 100644 index 00000000000..7221af36b65 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-49700.yml @@ -0,0 +1,8 @@ +author: "SteelSlayer" +delete-after: True +changes: + - code_imp: "Adds the label component, which gets added to objects you label with the hand labeler. It is used to keep track of the label that was applied to it can be removed later on." + - soundadd: "Adds a sound for labeling an object with the hand labeler" + - soundadd: "Adds a sound for removing a label from an object with the hand labeler" + - tweak: "Limits the amount of labels an object can have to one." + - tweak: "You can now remove labels from objects, by hitting it with the hand labeler, while it's off." diff --git a/html/changelogs/AutoChangeLog-pr-49709.yml b/html/changelogs/AutoChangeLog-pr-49709.yml new file mode 100644 index 00000000000..84050d16d3b --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-49709.yml @@ -0,0 +1,4 @@ +author: "Dennok" +delete-after: True +changes: + - tweak: "Now RCD constructing effect unclickable." diff --git a/html/changelogs/AutoChangeLog-pr-49710.yml b/html/changelogs/AutoChangeLog-pr-49710.yml new file mode 100644 index 00000000000..2d6c5726776 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-49710.yml @@ -0,0 +1,5 @@ +author: "Mickyan" +delete-after: True +changes: + - tweak: "You can now use the strip menu to adjust the jumpsuit style of other people" + - bugfix: "Humans with robot torsos can have their belt, ID, pockets slots correctly accessed through the strip menu" diff --git a/html/changelogs/AutoChangeLog-pr-49713.yml b/html/changelogs/AutoChangeLog-pr-49713.yml new file mode 100644 index 00000000000..ed0a9497106 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-49713.yml @@ -0,0 +1,4 @@ +author: "TheVekter" +delete-after: True +changes: + - tweak: "Made it more apparent when someone is using the wrong item to finish the Phazon mech's construction." diff --git a/html/changelogs/AutoChangeLog-pr-49717.yml b/html/changelogs/AutoChangeLog-pr-49717.yml new file mode 100644 index 00000000000..d210ca9abba --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-49717.yml @@ -0,0 +1,4 @@ +author: "qustinnus" +delete-after: True +changes: + - bugfix: "you can actually make the hygienebot now" diff --git a/html/changelogs/AutoChangeLog-pr-49725.yml b/html/changelogs/AutoChangeLog-pr-49725.yml new file mode 100644 index 00000000000..a40fa1eb713 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-49725.yml @@ -0,0 +1,4 @@ +author: "Mickyan" +delete-after: True +changes: + - bugfix: "Deltastation library windoors now correctly require library access" diff --git a/html/changelogs/AutoChangeLog-pr-49728.yml b/html/changelogs/AutoChangeLog-pr-49728.yml new file mode 100644 index 00000000000..00c894ffee7 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-49728.yml @@ -0,0 +1,4 @@ +author: "Mickyan" +delete-after: True +changes: + - bugfix: "Fixed Pubbystation private art exhibit overpressurizing" diff --git a/icons/mob/guardian.dmi b/icons/mob/guardian.dmi index cce3aa7f01c..4f2a5ed58d6 100644 Binary files a/icons/mob/guardian.dmi and b/icons/mob/guardian.dmi differ diff --git a/icons/obj/lavaland/artefacts.dmi b/icons/obj/lavaland/artefacts.dmi index e0aa1183cf8..292bc9c5493 100644 Binary files a/icons/obj/lavaland/artefacts.dmi and b/icons/obj/lavaland/artefacts.dmi differ diff --git a/tgstation.dme b/tgstation.dme index 394c10cbc08..b12a58a2755 100644 --- a/tgstation.dme +++ b/tgstation.dme @@ -401,6 +401,7 @@ #include "code\datums\components\jousting.dm" #include "code\datums\components\knockback.dm" #include "code\datums\components\knockoff.dm" +#include "code\datums\components\label.dm" #include "code\datums\components\lifesteal.dm" #include "code\datums\components\lockon_aiming.dm" #include "code\datums\components\magnetic_catch.dm" @@ -533,6 +534,7 @@ #include "code\datums\elements\selfknockback.dm" #include "code\datums\elements\snail_crawl.dm" #include "code\datums\elements\squish.dm" +#include "code\datums\elements\tool_flash.dm" #include "code\datums\elements\update_icon_blocker.dm" #include "code\datums\elements\update_icon_updates_onmob.dm" #include "code\datums\elements\waddling.dm" @@ -592,6 +594,7 @@ #include "code\datums\ruins\space.dm" #include "code\datums\skills\_skill.dm" #include "code\datums\skills\cleaning.dm" +#include "code\datums\skills\gaming.dm" #include "code\datums\skills\medical.dm" #include "code\datums\skills\mining.dm" #include "code\datums\status_effects\buffs.dm" @@ -2893,6 +2896,7 @@ #include "code\modules\surgery\plastic_surgery.dm" #include "code\modules\surgery\prosthetic_replacement.dm" #include "code\modules\surgery\remove_embedded_object.dm" +#include "code\modules\surgery\revival.dm" #include "code\modules\surgery\stomachpump.dm" #include "code\modules\surgery\surgery.dm" #include "code\modules\surgery\surgery_helpers.dm" @@ -2902,7 +2906,6 @@ #include "code\modules\surgery\advanced\lobotomy.dm" #include "code\modules\surgery\advanced\necrotic_revival.dm" #include "code\modules\surgery\advanced\pacification.dm" -#include "code\modules\surgery\advanced\revival.dm" #include "code\modules\surgery\advanced\viral_bonding.dm" #include "code\modules\surgery\advanced\bioware\bioware.dm" #include "code\modules\surgery\advanced\bioware\bioware_surgery.dm" diff --git a/tools/travis/build_spaceman_dmm.sh b/tools/travis/build_spaceman_dmm.sh new file mode 100755 index 00000000000..d63aeac2cc8 --- /dev/null +++ b/tools/travis/build_spaceman_dmm.sh @@ -0,0 +1,19 @@ +#!/bin/bash +set -euo pipefail + +source dependencies.sh + +cd $HOME/SpacemanDMM + +if [ ! -d .git ] +then + git init + git remote add origin https://github.com/SpaceManiac/SpacemanDMM.git +fi + +git fetch origin --depth=1 $SPACEMAN_DMM_COMMIT_HASH +git reset --hard FETCH_HEAD + +cargo build --release --bin $1 +cp target/release/$1 ~ +~/$1 --version diff --git a/tools/travis/install_spaceman_dmm.sh b/tools/travis/install_spaceman_dmm.sh deleted file mode 100755 index 39464193f88..00000000000 --- a/tools/travis/install_spaceman_dmm.sh +++ /dev/null @@ -1,8 +0,0 @@ -#!/bin/bash -set -euo pipefail - -source dependencies.sh - -wget -O ~/$1 "https://github.com/SpaceManiac/SpacemanDMM/releases/download/$SPACEMAN_DMM_VERSION/$1" -chmod +x ~/$1 -~/$1 --version