diff --git a/Dockerfile b/Dockerfile index 7cc479b926..a28b231eab 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,4 +1,4 @@ -FROM tgstation/byond:512.1463 as base +FROM tgstation/byond:512.1467 as base FROM base as build_base diff --git a/_maps/map_files/generic/City_of_Cogs.dmm b/_maps/map_files/generic/City_of_Cogs.dmm index e67a829221..889abe66c3 100644 --- a/_maps/map_files/generic/City_of_Cogs.dmm +++ b/_maps/map_files/generic/City_of_Cogs.dmm @@ -212,11 +212,8 @@ /turf/open/indestructible/reebe_void, /area/reebe) "aR" = ( -/obj/effect/clockwork/servant_blocker{ - dir = 1 - }, -/obj/structure/lattice/clockwork, -/turf/open/indestructible/reebe_void, +/obj/effect/landmark/city_of_cogs, +/turf/open/indestructible/clock_spawn_room, /area/reebe/city_of_cogs) "aS" = ( /obj/effect/clockwork/servant_blocker{ @@ -242,17 +239,20 @@ /turf/open/indestructible/reebe_void/spawning/lattices, /area/reebe) "aX" = ( -/obj/effect/landmark/city_of_cogs, +/obj/structure/table/reinforced/brass, +/obj/item/clockwork/component/belligerent_eye, /turf/open/indestructible/clock_spawn_room, /area/reebe/city_of_cogs) "aY" = ( -/obj/structure/table/reinforced/brass, -/obj/item/clockwork/component/belligerent_eye/blind_eye, -/turf/open/indestructible/clock_spawn_room, -/area/reebe/city_of_cogs) +/obj/effect/clockwork/servant_blocker{ + dir = 1 + }, +/obj/structure/lattice/clockwork, +/turf/open/indestructible/reebe_void, +/area/reebe) "aZ" = ( /obj/structure/table/reinforced/brass, -/obj/item/clockwork/component/belligerent_eye, +/obj/item/clockwork/component/belligerent_eye/blind_eye, /turf/open/indestructible/clock_spawn_room, /area/reebe/city_of_cogs) "ba" = ( @@ -262,32 +262,32 @@ /area/reebe/city_of_cogs) "bb" = ( /obj/structure/table/reinforced/brass, -/obj/item/clockwork/component/replicant_alloy, +/obj/item/clockwork/component/geis_capacitor, /turf/open/indestructible/clock_spawn_room, /area/reebe/city_of_cogs) "bc" = ( /obj/structure/table/reinforced/brass, -/obj/item/clockwork/component/replicant_alloy/smashed_anima_fragment, +/obj/item/clockwork/component/geis_capacitor/antennae, /turf/open/indestructible/clock_spawn_room, /area/reebe/city_of_cogs) "bd" = ( /obj/structure/table/reinforced/brass, -/obj/item/clockwork/component/replicant_alloy/replication_plate, +/obj/item/clockwork/component/geis_capacitor/fallen_armor, /turf/open/indestructible/clock_spawn_room, /area/reebe/city_of_cogs) "be" = ( /obj/structure/table/reinforced/brass, -/obj/item/clockwork/component/geis_capacitor/antennae, +/obj/item/clockwork/component/hierophant_ansible, /turf/open/indestructible/clock_spawn_room, /area/reebe/city_of_cogs) "bf" = ( /obj/structure/table/reinforced/brass, -/obj/item/clockwork/component/geis_capacitor/fallen_armor, +/obj/item/clockwork/component/hierophant_ansible/obelisk, /turf/open/indestructible/clock_spawn_room, /area/reebe/city_of_cogs) "bg" = ( /obj/structure/table/reinforced/brass, -/obj/item/clockwork/component/geis_capacitor, +/obj/item/clockwork/component/replicant_alloy, /turf/open/indestructible/clock_spawn_room, /area/reebe/city_of_cogs) "bh" = ( @@ -304,6 +304,51 @@ /obj/structure/destructible/clockwork/eminence_spire, /turf/open/floor/clockwork/reebe, /area/reebe/city_of_cogs) +"bk" = ( +/obj/structure/table/reinforced/brass, +/obj/item/clockwork/component/replicant_alloy/replication_plate, +/turf/open/indestructible/clock_spawn_room, +/area/reebe/city_of_cogs) +"bl" = ( +/obj/structure/table/reinforced/brass, +/obj/item/clockwork/component/replicant_alloy/smashed_anima_fragment, +/turf/open/indestructible/clock_spawn_room, +/area/reebe/city_of_cogs) +"bm" = ( +/obj/structure/table/reinforced/brass, +/obj/item/clockwork/component/vanguard_cogwheel, +/turf/open/indestructible/clock_spawn_room, +/area/reebe/city_of_cogs) +"bn" = ( +/obj/structure/table/reinforced/brass, +/obj/item/clockwork/component/vanguard_cogwheel/onyx_prism, +/turf/open/indestructible/clock_spawn_room, +/area/reebe/city_of_cogs) +"bo" = ( +/obj/structure/window/reinforced/clockwork/fulltile, +/obj/structure/grille/ratvar, +/turf/open/indestructible/clock_spawn_room, +/area/reebe/city_of_cogs) +"bp" = ( +/obj/structure/window/reinforced/clockwork/fulltile, +/turf/open/indestructible/clock_spawn_room, +/area/reebe/city_of_cogs) +"bu" = ( +/obj/structure/table/reinforced/brass, +/turf/open/indestructible/clock_spawn_room, +/area/reebe/city_of_cogs) +"bw" = ( +/obj/structure/chair/brass{ + dir = 8 + }, +/turf/open/indestructible/clock_spawn_room, +/area/reebe/city_of_cogs) +"bx" = ( +/obj/structure/chair/brass{ + dir = 4 + }, +/turf/open/indestructible/clock_spawn_room, +/area/reebe/city_of_cogs) (1,1,1) = {" aa @@ -26909,7 +26954,7 @@ ab ab ab ab -aa +ab aa aa aa @@ -27166,8 +27211,8 @@ ab ab ab ab -aa -aa +ab +ab aa aa aa @@ -27423,9 +27468,9 @@ ab ab ab ab -aa -aa -aa +ab +ab +ab aa aa aa @@ -27680,10 +27725,10 @@ ab ab ab ab -aa -aa -aa -aa +ab +ab +ab +ab aa aa aa @@ -27923,25 +27968,25 @@ ab ab ab ab +ae +ae +ae +ae +ae +ae +ae +ae +ae +ae +ae +ae +ae ab ab ab ab ab ab -ab -ab -ab -ab -ab -ab -ab -ab -aa -aa -aa -aa -aa aa aa aa @@ -28166,40 +28211,40 @@ ab ab ab ab -ab -ab aF +aF +aY +ae +ae +ae +ae +ae +ae +ae +ae +ae +ae +ae +ae +ah +ah +bo +bo +bo +bo +bo +bo +bo +ah +ah +ae +ae +ae ab ab ab ab ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -aa -aa -aa -aa -aa -aa aa aa aa @@ -28424,39 +28469,39 @@ aF aF aF aF -aF -aF -ae -ae -ae +aG +aS +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +aT +aT +aT +aT +aT +aT +aT +aT +aT +ah +ah +ah ae ae ab ab ab ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -aa -aa -aa -aa -aa -aa aa aa aa @@ -28682,38 +28727,38 @@ aG aG aG aG -aR -ah -ah -ah -ah -ah -ae -ae -ae -ae -ae -ae -ae +aS +bu +bu +bu +bu +bu +bu +bu +bu +bu +bu +bu +bu +aU +aT +aT +aT +aT +aT +aT +aT +aT +aT +bo +aX +bo +ag ae ab ab ab ab -ab -ab -ab -ab -ab -ab -ab -ab -aa -aa -aa -aa -aa -aa aa aa aa @@ -28940,37 +28985,37 @@ aj aj aj aS +bw +bw +bw +bw +bw +bw +bw +bw +bw +bw +bw +bw +aU aT aT +aR +aT +aR +aT +aR aT aT -ah -ah -ai -ai -ai -ai -ai -ah -ah +bo +aZ +bo +ag ae ab ab ab ab -ab -ab -ab -ab -ab -ab -ab -aa -aa -aa -aa -aa -aa aa aa aa @@ -29201,7 +29246,6 @@ aT aT aT aT -ah aT aT aT @@ -29209,15 +29253,22 @@ aT aT aT aT -ah +aT +bo +aT +aT +aT +aT +aT +aT +aT +aT +aT +bo +ba +bo ag ae -ab -ab -ab -ab -ab -ae bi ab ab @@ -29339,12 +29390,6 @@ aa aa aa aa -aa -aa -aa -aa -aa -aa "} (114,1,1) = {" aa @@ -29458,7 +29503,6 @@ aT aT aT aT -aU aT aT aT @@ -29466,15 +29510,22 @@ aT aT aT aT -ah -ah -ah -ab -ab -ab -ab -ab -ab +aT +aV +aT +aT +aR +aT +aR +aT +aR +aT +aT +bo +bb +bo +ag +ae ab ae ac @@ -29596,12 +29647,6 @@ aa aa aa aa -aa -aa -aa -aa -aa -aa "} (115,1,1) = {" aa @@ -29715,33 +29760,33 @@ aT aT aT aT -aU aT aT -aX -aX -aX aT aT -ai -aY -ai +aT +aT +aT +aT +bo +aT +aT +aT +aT +aT +aT +aT +aT +aT +bo +bc +bo +ag +ae ab ab ab ab -ab -ab -ab -ab -ab -ab -aa -aa -aa -aa -aa -aa aa aa aa @@ -29972,33 +30017,33 @@ aT aT aT aT -aV aT aT -aX -aX -aX aT aT -ai -aZ -ai +aT +aT +aT +aT +aU +aT +aT +aR +aT +aR +aT +aR +aT +aT +bo +bd +bo +ag +ae ab ab ab ab -ab -ab -ab -ab -ab -ab -aa -aa -aa -aa -aa -aa aa aa aa @@ -30229,33 +30274,33 @@ aT aT aT aT +aT +aT +aT +aT +aT +aT +aT +aT aU aT aT -aX -aX -aX aT aT -ai -ba -ai +aT +aT +aT +aT +aT +bo +be +bo +ag +ae ab ab ab ab -ab -ab -ab -ab -ab -ab -aa -aa -aa -aa -aa -aa aa aa aa @@ -30486,7 +30531,17 @@ aT aT aT aT -aU +aT +aT +aT +aT +aT +aT +bp +bp +ah +aT +aT aT aT aT @@ -30497,22 +30552,12 @@ aT ah ah ah +ae +ae ab ab ab ab -ab -ab -ab -ab -ab -ab -aa -aa -aa -aa -aa -aa aa aa aa @@ -30743,33 +30788,33 @@ aT aT aT aT +aT +aT +aT +aT +aT +aT +bp +bg ah -aT -aT -aT -aT -aT -aT -aT ah -ag +bo +bo +bo +bo +bo +bo +bo +ah +ah +ae +ae ae ab ab ab ab ab -ab -ab -ab -ab -ab -aa -aa -aa -aa -aa -aa aa aa aa @@ -31000,33 +31045,33 @@ aT aT aT aT +aT +aT +aT +aT +aT +aT +bp +bp +ah +aT +aT +aT +aT +aT +aT +aT +aT +aT ah ah -aU -aU -aV -aU -aU ah -ah -ag +ae ae ab ab ab ab -ab -ab -ab -ab -ab -ab -aa -aa -aa -aa -aa -aa aa aa aa @@ -31257,7 +31302,6 @@ aT aT aT aT -ah aT aT aT @@ -31265,25 +31309,26 @@ aT aT aT aT -ah +aT +aU +aT +aT +aT +aT +aT +aT +aT +aT +aT +bo +bf +bo ag ae ab ab ab ab -ab -ab -ab -ab -ab -ab -aa -aa -aa -aa -aa -aa aa aa aa @@ -31514,33 +31559,33 @@ aT aT aT aT +aT +aT +aT +aT +aT +aT +aT +aT aU aT aT +aR +aT +aR +aT +aR aT aT -aT -aT -aT -ah -ah -ah +bo +bg +bo +ag +ae ab ab ab ab -ab -ab -ab -ab -ab -ab -aa -aa -aa -aa -aa -aa aa aa aa @@ -31771,33 +31816,33 @@ aT aT aT aT -aU aT aT -aX -aX -aX +aT +aT +aT +aT aT aT ai -bb -ai +aT +aT +aT +aT +aT +aT +aT +aT +aT +bo +bk +bo +ag +ae ab ab ab ab -ab -ab -ab -ab -ab -ab -aa -aa -aa -aa -aa -aa aa aa aa @@ -32028,33 +32073,33 @@ aT aT aT aT +aT +aT +aT +aT +aT +aT +aT +aT aV aT aT -aX -aX -aX +aR +aT +aR +aT +aR aT aT -ai -bc -ai +bo +bl +bo +ag +ae ab ab ab ab -ab -ab -ab -ab -ab -ab -aa -aa -aa -aa -aa -aa aa aa aa @@ -32285,33 +32330,33 @@ aT aT aT aT -aU aT aT -aX -aX -aX +aT +aT +aT +aT aT aT ai -bd -ai +aT +aT +aT +aT +aT +aT +aT +aT +aT +bo +bm +bo +ag +ae ab ab ab ab -ab -ab -ab -ab -ab -ab -aa -aa -aa -aa -aa -aa aa aa aa @@ -32542,33 +32587,33 @@ aT aT aT aT +aT +aT +aT +aT +aT +aT +aT +aT aU aT aT +aR +aT +aR +aT +aR aT aT -aT -aT -aT -ah -ah -ah +bo +bn +bo +ag +ae ab ab ab ab -ab -ab -ab -ab -ab -ab -aa -aa -aa -aa -aa -aa aa aa aa @@ -32799,7 +32844,6 @@ aT aT aT aT -ah aT aT aT @@ -32807,25 +32851,26 @@ aT aT aT aT -ah +aT +aU +aT +aT +aT +aT +aT +aT +aT +aT +aT +bo +aX +bo ag ae ab ab ab ab -ab -ab -ab -ab -ab -ab -aa -aa -aa -aa -aa -aa aa aa aa @@ -33056,33 +33101,33 @@ aT aT aT aT +aT +aT +aT +aT +aT +aT +bp +bp +ah +aT +aT +aT +aT +aT +aT +aT +aT +aT ah ah -aU -aU -aV -aU -aU ah -ah -ag +ae ae ab ab ab ab -ab -ab -ab -ab -ab -ab -aa -aa -aa -aa -aa -aa aa aa aa @@ -33313,16 +33358,25 @@ aT aT aT aT +aT +aT +aT +aT +aT +aT +bp +bk +ah +ah +bo +bo +bo +bo +bo +bo +bo ah -aT -aT -aT -aT -aT -aT -aT ah -ag ae ab ab @@ -33331,15 +33385,6 @@ ab ab ab ab -ab -ab -ab -aa -aa -aa -aa -aa -aa aa aa aa @@ -33570,7 +33615,17 @@ aT aT aT aT -aU +aT +aT +aT +aT +aT +aT +bp +bp +ah +aT +aT aT aT aT @@ -33581,22 +33636,12 @@ aT ah ah ah +ae +ae ab ab ab ab -ab -ab -ab -ab -ab -ab -aa -aa -aa -aa -aa -aa aa aa aa @@ -33827,33 +33872,33 @@ aT aT aT aT +aT +aT +aT +aT +aT +aT +aT +aT aU aT aT -aX -aX -aX aT aT -ai -be -ai +aT +aT +aT +aT +aT +bo +aZ +bo +ag +ae ab ab ab ab -ab -ab -ab -ab -ab -ab -aa -aa -aa -aa -aa -aa aa aa aa @@ -34084,33 +34129,33 @@ aT aT aT aT -aV aT aT -aX -aX -aX aT aT -ai -bf -ai +aT +aT +aT +aT +aU +aT +aT +aR +aT +aR +aT +aR +aT +aT +bo +ba +bo +ag +ae ab ab ab ab -ab -ab -ab -ab -ab -ab -aa -aa -aa -aa -aa -aa aa aa aa @@ -34341,33 +34386,33 @@ aT aT aT aT -aU aT aT -aX -aX -aX aT aT -ai -bg -ai +aT +aT +aT +aT +bo +aT +aT +aT +aT +aT +aT +aT +aT +aT +bo +bb +bo +ag +ae ab ab ab ab -ab -ab -ab -ab -ab -ab -aa -aa -aa -aa -aa -aa aa aa aa @@ -34598,7 +34643,6 @@ aT aT aT aT -aU aT aT aT @@ -34606,25 +34650,26 @@ aT aT aT aT -ah -ah -ah +aT +aV +aT +aT +aR +aT +aR +aT +aR +aT +aT +bo +bc +bo +ag +ae ab ab ab ab -ab -ab -ab -ab -ab -ab -aa -aa -aa -aa -aa -aa aa aa aa @@ -34855,7 +34900,6 @@ aT aT aT aT -ah aT aT aT @@ -34863,25 +34907,26 @@ aT aT aT aT -ah +aT +bo +aT +aT +aT +aT +aT +aT +aT +aT +aT +bo +bd +bo ag ae ab ab ab ab -ab -ab -ab -ab -ab -ab -aa -aa -aa -aa -aa -aa aa aa aa @@ -35108,37 +35153,37 @@ aj aj aj aS +bx +bx +bx +bx +bx +bx +bx +bx +bx +bx +bx +bx +aU aT aT +aR +aT +aR +aT +aR aT aT -ah -ah -ai -ai -ai -ai -ai -ah -ah +bo +be +bo +ag ae ab ab ab ab -ab -ab -ab -ab -ab -ab -ab -aa -aa -aa -aa -aa -aa aa aa aa @@ -35364,38 +35409,38 @@ aG aG aG aG -aR -ah -ah -ah -ah -ah -ae -ae -ae -ae -ae -ae -ae +aS +bu +bu +bu +bu +bu +bu +bu +bu +bu +bu +bu +bu +aU +aT +aT +aT +aT +aT +aT +aT +aT +aT +bo +bf +bo +ag ae ab ab ab ab -ab -ab -ab -ab -ab -ab -ab -ab -aa -aa -aa -aa -aa -aa aa aa aa @@ -35620,39 +35665,39 @@ aF aF aF aF -aF -aF -ae -ae -ae +aG +aS +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +aT +aT +aT +aT +aT +aT +aT +aT +aT +ah +ah +ah ae ae ab ab ab ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -aa -aa -aa -aa -aa -aa aa aa aa @@ -35878,7 +35923,31 @@ ab ab ab ab -aF +aY +ae +ae +ae +ae +ae +ae +ae +ae +ae +ae +ae +ae +ah +ah +bo +bo +bo +bo +bo +bo +bo +ah +ah +ae ab ab ab @@ -35886,30 +35955,6 @@ ab ab ab ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -aa -aa -aa -aa -aa -aa aa aa aa @@ -36147,12 +36192,18 @@ ab ab ab ab -ab -ab -ab -ab -ab -ab +ae +ae +ae +ae +ae +ae +ae +ae +ae +ae +ae +ae ae ab ab @@ -36160,12 +36211,6 @@ ab ab ab ab -ab -aa -aa -aa -aa -aa aa aa aa @@ -36410,18 +36455,18 @@ ab ab ab ab -ac -ac ab ab ab ab ab ab -aa -aa -aa -aa +ab +ab +ab +ab +ab +ab aa aa aa @@ -36667,17 +36712,17 @@ ab ab ab ab -ac -bh -ae ab ab ab ab ab -aa -aa -aa +ab +ab +ab +ab +ab +ab aa aa aa @@ -36932,8 +36977,8 @@ ab ab ab ab -aa -aa +ab +ab aa aa aa @@ -37189,7 +37234,7 @@ ab ab ab ab -aa +ab aa aa aa @@ -37438,9 +37483,9 @@ ab ab ab ab -ab -ab -ab +ac +bh +ae ab ab ab diff --git a/code/__DEFINES/DNA.dm b/code/__DEFINES/DNA.dm index aea7d42be6..4ed099d9e2 100644 --- a/code/__DEFINES/DNA.dm +++ b/code/__DEFINES/DNA.dm @@ -121,3 +121,4 @@ #define ORGAN_SLOT_BRAIN_ANTIDROP "brain_antidrop" #define ORGAN_SLOT_BRAIN_ANTISTUN "brain_antistun" #define ORGAN_SLOT_TAIL "tail" +#define ORGAN_SLOT_PENIS "penis" diff --git a/code/__DEFINES/citadel_defines.dm b/code/__DEFINES/citadel_defines.dm index ef14dbcaa3..b150067717 100644 --- a/code/__DEFINES/citadel_defines.dm +++ b/code/__DEFINES/citadel_defines.dm @@ -95,6 +95,7 @@ #define NOAROUSAL 37 //Stops all arousal effects #define NOGENITALS 38 //Cannot create, use, or otherwise have genitals #define MATRIXED 39 //if icon is color matrix'd +#define SKINTONE 40 //uses skin tones //Citadel istypes #define isborer(A) (istype(A, /mob/living/simple_animal/borer)) diff --git a/code/__DEFINES/clockcult.dm b/code/__DEFINES/clockcult.dm index 070b92acc7..47b00e67f7 100644 --- a/code/__DEFINES/clockcult.dm +++ b/code/__DEFINES/clockcult.dm @@ -28,9 +28,9 @@ GLOBAL_LIST_EMPTY(all_scripture) //a list containing scripture instances; not us #define SCRIPTURE_APPLICATION "Application" //Various costs related to power. -#define MAX_CLOCKWORK_POWER 50000 //The max power in W that the cult can stockpile -#define SCRIPT_UNLOCK_THRESHOLD 25000 //Scripts will unlock if the total power reaches this amount -#define APPLICATION_UNLOCK_THRESHOLD 40000 //Applications will unlock if the total powre reaches this amount +#define MAX_CLOCKWORK_POWER 80000 //The max power in W that the cult can stockpile +#define SCRIPT_UNLOCK_THRESHOLD 35000 //Scripts will unlock if the total power reaches this amount +#define APPLICATION_UNLOCK_THRESHOLD 50000 //Applications will unlock if the total powre reaches this amount #define ABSCOND_ABDUCTION_COST 95 diff --git a/code/__DEFINES/colors.dm b/code/__DEFINES/colors.dm index 4811d0041f..de9c7af221 100644 --- a/code/__DEFINES/colors.dm +++ b/code/__DEFINES/colors.dm @@ -53,4 +53,5 @@ #define COLOR_ASSEMBLY_GREEN "#44843C" #define COLOR_ASSEMBLY_LBLUE "#5D99BE" #define COLOR_ASSEMBLY_BLUE "#38559E" -#define COLOR_ASSEMBLY_PURPLE "#6F6192" \ No newline at end of file +#define COLOR_ASSEMBLY_PURPLE "#6F6192" +#define COLOR_ASSEMBLY_PINK "#ff4adc" \ No newline at end of file diff --git a/code/__DEFINES/construction.dm b/code/__DEFINES/construction.dm index aab49720f6..9f3d38efa1 100644 --- a/code/__DEFINES/construction.dm +++ b/code/__DEFINES/construction.dm @@ -102,6 +102,7 @@ #define CAT_SANDWICH "Sandwiches" #define CAT_SOUP "Soups" #define CAT_SPAGHETTI "Spaghettis" +#define CAT_SUSHI "Fish" #define RCD_FLOORWALL 1 #define RCD_AIRLOCK 2 diff --git a/code/__DEFINES/misc.dm b/code/__DEFINES/misc.dm index 709a4daeba..be58b64f41 100644 --- a/code/__DEFINES/misc.dm +++ b/code/__DEFINES/misc.dm @@ -474,4 +474,6 @@ GLOBAL_LIST_INIT(pda_styles, list(MONO, VT, ORBITRON, SHARE)) #define CLIENT_FROM_VAR(I) (ismob(I) ? I:client : (istype(I, /client) ? I : (istype(I, /datum/mind) ? I:current?:client : null))) #define AREASELECT_CORNERA "corner A" -#define AREASELECT_CORNERB "corner B" \ No newline at end of file +#define AREASELECT_CORNERB "corner B" + +#define PREF_SAVELOAD_COOLDOWN 5 \ No newline at end of file diff --git a/code/__DEFINES/traits.dm b/code/__DEFINES/traits.dm index a5617e6148..99f1813f3c 100644 --- a/code/__DEFINES/traits.dm +++ b/code/__DEFINES/traits.dm @@ -69,6 +69,7 @@ #define TRAIT_TAGGER "tagger" #define TRAIT_PHOTOGRAPHER "photographer" #define TRAIT_MUSICIAN "musician" +#define TRAIT_CROCRIN_IMMUNE "crocin_immune" // common trait sources #define TRAIT_GENERIC "generic" diff --git a/code/__HELPERS/roundend.dm b/code/__HELPERS/roundend.dm index 165cea9557..cdd2e99dd8 100644 --- a/code/__HELPERS/roundend.dm +++ b/code/__HELPERS/roundend.dm @@ -199,6 +199,10 @@ if(length(CONFIG_GET(keyed_list/cross_server))) send_news_report() + //tell the nice people on discord what went on before the salt cannon happens. + world.TgsTargetedChatBroadcast("The current round has ended. Please standby for your shift interlude Nanotrasen News Network's report!", FALSE) + world.TgsTargetedChatBroadcast(send_news_report(),FALSE) + CHECK_TICK //These need update to actually reflect the real antagonists diff --git a/code/_globalvars/lists/maintenance_loot.dm b/code/_globalvars/lists/maintenance_loot.dm index d0506c7dcb..36049de77b 100644 --- a/code/_globalvars/lists/maintenance_loot.dm +++ b/code/_globalvars/lists/maintenance_loot.dm @@ -108,5 +108,6 @@ GLOBAL_LIST_INIT(maintenance_loot, list( /obj/item/toy/eightball = 1, /obj/item/reagent_containers/pill/floorpill = 1, /obj/item/storage/daki = 3, //VERY IMPORTANT CIT CHANGE - adds bodypillows to maint + /obj/item/storage/pill_bottle/penis_enlargement = 2, "" = 3 )) diff --git a/code/controllers/subsystem/processing/circuit.dm b/code/controllers/subsystem/processing/circuit.dm index 1ae5bad23c..880e7a16a8 100644 --- a/code/controllers/subsystem/processing/circuit.dm +++ b/code/controllers/subsystem/processing/circuit.dm @@ -50,17 +50,20 @@ PROCESSING_SUBSYSTEM_DEF(circuit) /obj/item/electronic_assembly/simple, /obj/item/electronic_assembly/hook, /obj/item/electronic_assembly/pda, + /obj/item/electronic_assembly/dildo, /obj/item/electronic_assembly/small/default, /obj/item/electronic_assembly/small/cylinder, /obj/item/electronic_assembly/small/scanner, /obj/item/electronic_assembly/small/hook, /obj/item/electronic_assembly/small/box, + /obj/item/electronic_assembly/small/dildo, /obj/item/electronic_assembly/medium/default, /obj/item/electronic_assembly/medium/box, /obj/item/electronic_assembly/medium/clam, /obj/item/electronic_assembly/medium/medical, /obj/item/electronic_assembly/medium/gun, /obj/item/electronic_assembly/medium/radio, + /obj/item/electronic_assembly/medium/dildo, /obj/item/electronic_assembly/large/default, /obj/item/electronic_assembly/large/scope, /obj/item/electronic_assembly/large/terminal, @@ -89,4 +92,4 @@ PROCESSING_SUBSYSTEM_DEF(circuit) /obj/item/card/data/full_color, /obj/item/card/data/disk ) - + diff --git a/code/controllers/subsystem/ticker.dm b/code/controllers/subsystem/ticker.dm index 9a4cad3667..4a3143da79 100755 --- a/code/controllers/subsystem/ticker.dm +++ b/code/controllers/subsystem/ticker.dm @@ -564,6 +564,9 @@ SUBSYSTEM_DEF(ticker) if(news_message) send2otherserver(news_source, news_message,"News_Report") + return news_message + else + return "We regret to inform you that shit be whack, yo. None of our reporters have any idea of what may or may not have gone on." /datum/controller/subsystem/ticker/proc/GetTimeLeft() if(isnull(SSticker.timeLeft)) diff --git a/code/datums/components/storage/concrete/pockets.dm b/code/datums/components/storage/concrete/pockets.dm index 3d03c2adbd..e0a23b0209 100644 --- a/code/datums/components/storage/concrete/pockets.dm +++ b/code/datums/components/storage/concrete/pockets.dm @@ -19,6 +19,22 @@ max_items = 1 attack_hand_interact = FALSE +/datum/component/storage/concrete/pockets/small/collar + max_items = 1 + +/datum/component/storage/concrete/pockets/small/collar/Initialize() + . = ..() + can_hold = typecacheof(list( + /obj/item/reagent_containers/food/snacks/cookie, + /obj/item/reagent_containers/food/snacks/sugarcookie)) + +/datum/component/storage/concrete/pockets/small/collar/locked/Initialize() + . = ..() + can_hold = typecacheof(list( + /obj/item/reagent_containers/food/snacks/cookie, + /obj/item/reagent_containers/food/snacks/sugarcookie, + /obj/item/key/collar)) + /datum/component/storage/concrete/pockets/tiny max_items = 1 max_w_class = WEIGHT_CLASS_TINY diff --git a/code/datums/dash_weapon.dm b/code/datums/dash_weapon.dm index 03badb2069..a870ecae66 100644 --- a/code/datums/dash_weapon.dm +++ b/code/datums/dash_weapon.dm @@ -32,7 +32,7 @@ if(!IsAvailable()) return var/turf/T = get_turf(target) - if(target in view(user.client.view, get_turf(user))) + if(target in view(user.client.view, user)) var/obj/spot1 = new phaseout(get_turf(user), user.dir) user.forceMove(T) playsound(T, dash_sound, 25, 1) diff --git a/code/datums/dna.dm b/code/datums/dna.dm index b3f3f7efa1..938515625d 100644 --- a/code/datums/dna.dm +++ b/code/datums/dna.dm @@ -9,6 +9,7 @@ var/list/features = list("FFF") //first value is mutant color var/real_name //Stores the real name of the person who originally got this dna datum. Used primarely for changelings, var/nameless = FALSE + var/custom_species //siiiiigh I guess this is important var/list/mutations = list() //All mutations are from now on here var/list/temporary_mutations = list() //Timers for temporary mutations var/list/previous = list() //For temporary name/ui/ue/blood_type modifications @@ -45,6 +46,7 @@ destination.dna.features = features.Copy() destination.dna.real_name = real_name destination.dna.nameless = nameless + destination.dna.custom_species = custom_species destination.dna.temporary_mutations = temporary_mutations.Copy() if(ishuman(destination)) var/mob/living/carbon/human/H = destination @@ -62,6 +64,7 @@ new_dna.species = new species.type new_dna.real_name = real_name new_dna.nameless = nameless + new_dna.custom_species = custom_species new_dna.mutations = mutations.Copy() /datum/dna/proc/add_mutation(mutation_name) @@ -202,7 +205,7 @@ /datum/dna/proc/is_same_as(datum/dna/D) - if(uni_identity == D.uni_identity && struc_enzymes == D.struc_enzymes && real_name == D.real_name && nameless == D.nameless) + if(uni_identity == D.uni_identity && struc_enzymes == D.struc_enzymes && real_name == D.real_name && nameless == D.nameless && custom_species == D.custom_species) if(species.type == D.species.type && features == D.features && blood_type == D.blood_type) return 1 return 0 diff --git a/code/datums/traits/neutral.dm b/code/datums/traits/neutral.dm index 4fc30de473..f299e9904a 100644 --- a/code/datums/traits/neutral.dm +++ b/code/datums/traits/neutral.dm @@ -84,3 +84,12 @@ /datum/quirk/monochromatic/remove() if(quirk_holder) quirk_holder.remove_client_colour(/datum/client_colour/monochrome) + +/datum/quirk/crocrin_immunity + name = "Crocin Immunity" + desc = "You're one of the few people in the galaxy who are genetically immune to Crocin and Hexacrocin products and their addictive properties! However, you can still get brain damage from Hexacrocin addiction." + mob_trait = TRAIT_CROCRIN_IMMUNE + value = 0 + gain_text = "You feel more prudish." + lose_text = "You don't feel as prudish as before." + medical_record_text = "Patient exhibits a special gene that makes them immune to Crocin and Hexacrocin." diff --git a/code/game/machinery/recharger.dm b/code/game/machinery/recharger.dm index 94b6eee8aa..927608d3d5 100755 --- a/code/game/machinery/recharger.dm +++ b/code/game/machinery/recharger.dm @@ -15,7 +15,9 @@ /obj/item/gun/energy, /obj/item/melee/baton, /obj/item/ammo_box/magazine/recharge, - /obj/item/modular_computer)) + /obj/item/modular_computer, + /obj/item/gun/ballistic/automatic/magrifle_e, + /obj/item/gun/ballistic/automatic/pistol/mag_e)) /obj/machinery/recharger/RefreshParts() for(var/obj/item/stock_parts/capacitor/C in component_parts) diff --git a/code/game/machinery/suit_storage_unit.dm b/code/game/machinery/suit_storage_unit.dm index 43e8dff2b9..b84db2ca8d 100644 --- a/code/game/machinery/suit_storage_unit.dm +++ b/code/game/machinery/suit_storage_unit.dm @@ -63,7 +63,7 @@ storage_type = /obj/item/watertank/atmos /obj/machinery/suit_storage_unit/mining - suit_type = /obj/item/clothing/suit/hooded/explorer + suit_type = /obj/item/clothing/suit/hooded/explorer/standard mask_type = /obj/item/clothing/mask/gas/explorer /obj/machinery/suit_storage_unit/mining/eva diff --git a/code/game/mecha/working/ripley.dm b/code/game/mecha/working/ripley.dm index 4d2e113749..ef3ba969e9 100644 --- a/code/game/mecha/working/ripley.dm +++ b/code/game/mecha/working/ripley.dm @@ -80,6 +80,7 @@ desc = "OH SHIT IT'S THE DEATHSQUAD WE'RE ALL GONNA DIE" name = "\improper DEATH-RIPLEY" icon_state = "deathripley" + armor = list("melee" = 40, "bullet" = 30, "laser" = 20, "energy" = 20, "bomb" = 40, "bio" = 0, "rad" = 0, "fire" = 100, "acid" = 100) slow_pressure_step_in = 3 opacity=0 lights_power = 7 @@ -194,4 +195,4 @@ cargo -= O else if(user.loc == src) //so we don't get the message if we resisted multiple times and succeeded. - to_chat(user, "You fail to push [O] out of [src]!") \ No newline at end of file + to_chat(user, "You fail to push [O] out of [src]!") diff --git a/code/game/objects/empulse.dm b/code/game/objects/empulse.dm index 16e13a9fe2..56e47ed6f5 100644 --- a/code/game/objects/empulse.dm +++ b/code/game/objects/empulse.dm @@ -9,7 +9,7 @@ message_admins("EMP with size ([heavy_range], [light_range]) in area [epicenter.loc.name] ") log_game("EMP with size ([heavy_range], [light_range]) in area [epicenter.loc.name] ") - if(heavy_range > 1) + if(heavy_range >= 1) new /obj/effect/temp_visual/emp/pulse(epicenter) if(heavy_range > light_range) diff --git a/code/game/objects/items/AI_modules.dm b/code/game/objects/items/AI_modules.dm index d818191055..a8d0bed2aa 100644 --- a/code/game/objects/items/AI_modules.dm +++ b/code/game/objects/items/AI_modules.dm @@ -362,7 +362,7 @@ AI MODULES /obj/item/aiModule/core/full/asimov name = "'Asimov' Core AI Module" law_id = "asimov" - var/subject = "human being" + var/subject = "person of an NT approved crew species" //CITADEL CHANGED FROM HUMANS! /obj/item/aiModule/core/full/asimov/attack_self(var/mob/user as mob) var/targName = stripped_input(user, "Please enter a new subject that asimov is concerned with.", "Asimov to whom?", subject) diff --git a/code/game/objects/items/devices/PDA/PDA.dm b/code/game/objects/items/devices/PDA/PDA.dm index 9ff717816c..7d3d36c5b2 100644 --- a/code/game/objects/items/devices/PDA/PDA.dm +++ b/code/game/objects/items/devices/PDA/PDA.dm @@ -391,7 +391,8 @@ GLOBAL_LIST_EMPTY(PDAs) //BASIC FUNCTIONS=================================== if("Refresh")//Refresh, goes to the end of the proc. - playsound(src, 'sound/machines/terminal_select.ogg', 50, 1) + if (!silent) + playsound(src, 'sound/machines/terminal_select.ogg', 15, 1) if ("Toggle_Font") //CODE REVISION 2 @@ -406,16 +407,19 @@ GLOBAL_LIST_EMPTY(PDAs) font_mode = FONT_ORBITRON if (MODE_VT) font_mode = FONT_VT - playsound(src, 'sound/machines/terminal_select.ogg', 50, 1) + if (!silent) + playsound(src, 'sound/machines/terminal_select.ogg', 15, 1) if ("Change_Color") var/new_color = input("Please enter a color name or hex value (Default is \'#808000\').",background_color)as color background_color = new_color - playsound(src, 'sound/machines/terminal_select.ogg', 50, 1) + if (!silent) + playsound(src, 'sound/machines/terminal_select.ogg', 15, 1) if ("Toggle_Underline") underline_flag = !underline_flag - playsound(src, 'sound/machines/terminal_select.ogg', 50, 1) + if (!silent) + playsound(src, 'sound/machines/terminal_select.ogg', 15, 1) if("Return")//Return if(mode<=9) @@ -424,7 +428,8 @@ GLOBAL_LIST_EMPTY(PDAs) mode = round(mode/10) if(mode==4 || mode == 5)//Fix for cartridges. Redirects to hub. mode = 0 - playsound(src, 'sound/machines/terminal_select.ogg', 50, 1) + if (!silent) + playsound(src, 'sound/machines/terminal_select.ogg', 15, 1) if ("Authenticate")//Checks for ID id_check(U) @@ -434,8 +439,9 @@ GLOBAL_LIST_EMPTY(PDAs) if(istype(id, /obj/item/card/id/syndicate)) owner = id.registered_name update_label() - playsound(src, 'sound/machines/terminal_processing.ogg', 50, 1) - addtimer(CALLBACK(GLOBAL_PROC, .proc/playsound, src, 'sound/machines/terminal_success.ogg', 50, 1), 13) + if (!silent) + playsound(src, 'sound/machines/terminal_processing.ogg', 15, 1) + addtimer(CALLBACK(GLOBAL_PROC, .proc/playsound, src, 'sound/machines/terminal_success.ogg', 15, 1), 13) if("Eject")//Ejects the cart, only done from hub. if (!isnull(cartridge)) @@ -445,56 +451,67 @@ GLOBAL_LIST_EMPTY(PDAs) cartridge.host_pda = null cartridge = null update_icon() - playsound(src, 'sound/machines/terminal_eject_disc.ogg', 50, 1) + if (!silent) + playsound(src, 'sound/machines/terminal_eject_disc.ogg', 50, 1) //MENU FUNCTIONS=================================== if("0")//Hub mode = 0 - playsound(src, 'sound/machines/terminal_select.ogg', 50, 1) + if (!silent) + playsound(src, 'sound/machines/terminal_select.ogg', 15, 1) if("1")//Notes mode = 1 - playsound(src, 'sound/machines/terminal_select.ogg', 50, 1) + if (!silent) + playsound(src, 'sound/machines/terminal_select.ogg', 15, 1) if("2")//Messenger mode = 2 - playsound(src, 'sound/machines/terminal_select.ogg', 50, 1) + if (!silent) + playsound(src, 'sound/machines/terminal_select.ogg', 15, 1) if("21")//Read messeges mode = 21 - playsound(src, 'sound/machines/terminal_select.ogg', 50, 1) + if (!silent) + playsound(src, 'sound/machines/terminal_select.ogg', 15, 1) if("3")//Atmos scan mode = 3 - playsound(src, 'sound/machines/terminal_select.ogg', 50, 1) + if (!silent) + playsound(src, 'sound/machines/terminal_select.ogg', 15, 1) if("4")//Redirects to hub mode = 0 - playsound(src, 'sound/machines/terminal_select.ogg', 50, 1) + if (!silent) + playsound(src, 'sound/machines/terminal_select.ogg', 15, 1) //MAIN FUNCTIONS=================================== if("Light") toggle_light() - playsound(src, 'sound/machines/terminal_select.ogg', 50, 1) + if (!silent) + playsound(src, 'sound/machines/terminal_select.ogg', 15, 1) if("Medical Scan") if(scanmode == PDA_SCANNER_MEDICAL) scanmode = PDA_SCANNER_NONE else if((!isnull(cartridge)) && (cartridge.access & CART_MEDICAL)) scanmode = PDA_SCANNER_MEDICAL - playsound(src, 'sound/machines/terminal_select.ogg', 50, 1) + if (!silent) + playsound(src, 'sound/machines/terminal_select.ogg', 15, 1) if("Reagent Scan") if(scanmode == PDA_SCANNER_REAGENT) scanmode = PDA_SCANNER_NONE else if((!isnull(cartridge)) && (cartridge.access & CART_REAGENT_SCANNER)) scanmode = PDA_SCANNER_REAGENT - playsound(src, 'sound/machines/terminal_select.ogg', 50, 1) + if (!silent) + playsound(src, 'sound/machines/terminal_select.ogg', 15, 1) if("Halogen Counter") if(scanmode == PDA_SCANNER_HALOGEN) scanmode = PDA_SCANNER_NONE else if((!isnull(cartridge)) && (cartridge.access & CART_ENGINE)) scanmode = PDA_SCANNER_HALOGEN - playsound(src, 'sound/machines/terminal_select.ogg', 50, 1) + if (!silent) + playsound(src, 'sound/machines/terminal_select.ogg', 15, 1) if("Honk") if ( !(last_noise && world.time < last_noise + 20) ) @@ -511,7 +528,8 @@ GLOBAL_LIST_EMPTY(PDAs) scanmode = PDA_SCANNER_NONE else if((!isnull(cartridge)) && (cartridge.access & CART_ATMOS)) scanmode = PDA_SCANNER_GAS - playsound(src, 'sound/machines/terminal_select.ogg', 50, 1) + if (!silent) + playsound(src, 'sound/machines/terminal_select.ogg', 15, 1) if("Drone Phone") var/alert_s = input(U,"Alert severity level","Ping Drones",null) as null|anything in list("Low","Medium","High","Critical") @@ -520,7 +538,8 @@ GLOBAL_LIST_EMPTY(PDAs) var/msg = "NON-DRONE PING: [U.name]: [alert_s] priority alert in [A.name]!" _alert_drones(msg, TRUE, U) to_chat(U, msg) - playsound(src, 'sound/machines/terminal_success.ogg', 50, 1) + if (!silent) + playsound(src, 'sound/machines/terminal_success.ogg', 15, 1) //NOTEKEEPER FUNCTIONS=================================== @@ -672,7 +691,8 @@ GLOBAL_LIST_EMPTY(PDAs) if (!signal.data["done"]) to_chat(user, "ERROR: Server isn't responding.") return - playsound(src, 'sound/machines/terminal_error.ogg', 50, 1) + if (!silent) + playsound(src, 'sound/machines/terminal_error.ogg', 15, 1) var/target_text = signal.format_target() // Log it in our logs @@ -685,7 +705,8 @@ GLOBAL_LIST_EMPTY(PDAs) // Log in the talk log user.log_talk(message, LOG_PDA, tag="PDA: [initial(name)] to [target_text]") to_chat(user, "Message sent to [target_text]: \"[message]\"") - playsound(src, 'sound/machines/terminal_success.ogg', 50, 1) + if (!silent) + playsound(src, 'sound/machines/terminal_success.ogg', 15, 1) // Reset the photo picture = null last_text = world.time @@ -830,14 +851,16 @@ GLOBAL_LIST_EMPTY(PDAs) if(!idcard.registered_name) to_chat(user, "\The [src] rejects the ID!") return - playsound(src, 'sound/machines/terminal_error.ogg', 50, 1) + if (!silent) + playsound(src, 'sound/machines/terminal_error.ogg', 15, 1) if(!owner) owner = idcard.registered_name ownjob = idcard.assignment update_label() to_chat(user, "Card scanned.") - playsound(src, 'sound/machines/terminal_success.ogg', 50, 1) + if (!silent) + playsound(src, 'sound/machines/terminal_success.ogg', 15, 1) else //Basic safety check. If either both objects are held by user or PDA is on ground and card is in hand. if(((src in user.contents) || (isturf(loc) && in_range(src, user))) && (C in user.contents)) @@ -1053,3 +1076,4 @@ GLOBAL_LIST_EMPTY(PDAs) #undef PDA_SCANNER_HALOGEN #undef PDA_SCANNER_GAS #undef PDA_SPAM_DELAY + diff --git a/code/game/objects/items/devices/scanners.dm b/code/game/objects/items/devices/scanners.dm index 5a68a8423a..79b04c771b 100644 --- a/code/game/objects/items/devices/scanners.dm +++ b/code/game/objects/items/devices/scanners.dm @@ -98,10 +98,12 @@ SLIME SCANNER if ((user.has_trait(TRAIT_CLUMSY) || user.has_trait(TRAIT_DUMB)) && prob(50)) to_chat(user, "You stupidly try to analyze the floor's vitals!") user.visible_message("[user] has analyzed the floor's vitals!") - to_chat(user, "Analyzing results for The floor:\n\tOverall status: Healthy") - to_chat(user, "Key: Suffocation/Toxin/Burn/Brute") - to_chat(user, "\tDamage specifics: 0-0-0-0") - to_chat(user, "Body temperature: ???") + var/msg = "*---------*\nAnalyzing results for The floor:\n\tOverall status: Healthy\n" + msg += "Key: Suffocation/Toxin/Burn/Brute\n" + msg += "\tDamage specifics: 0-0-0-0\n" + msg += "Body temperature: ???\n" + msg += "*---------*" + to_chat(user, msg) return user.visible_message("[user] has analyzed [M]'s vitals.") @@ -136,31 +138,31 @@ SLIME SCANNER if(H.undergoing_liver_failure() && H.stat != DEAD) to_chat(user, "Subject is suffering from liver failure: Apply Corazone and begin a liver transplant immediately!") - to_chat(user, "Analyzing results for [M]:\n\tOverall status: [mob_status]") + var/msg = "*---------*\nAnalyzing results for [M]:\n\tOverall status: [mob_status]\n" // Damage descriptions if(brute_loss > 10) - to_chat(user, "\t[brute_loss > 50 ? "Severe" : "Minor"] tissue damage detected.") + msg += "\t[brute_loss > 50 ? "Severe" : "Minor"] tissue damage detected.\n" if(fire_loss > 10) - to_chat(user, "\t[fire_loss > 50 ? "Severe" : "Minor"] burn damage detected.") + msg += "\t[fire_loss > 50 ? "Severe" : "Minor"] burn damage detected.\n" if(oxy_loss > 10) - to_chat(user, "\t[oxy_loss > 50 ? "Severe" : "Minor"] oxygen deprivation detected.") + msg += "\t[oxy_loss > 50 ? "Severe" : "Minor"] oxygen deprivation detected.\n" if(tox_loss > 10) - to_chat(user, "\t[tox_loss > 50 ? "Severe" : "Minor"] amount of toxin damage detected.") + msg += "\t[tox_loss > 50 ? "Severe" : "Minor"] amount of toxin damage detected.\n" if(M.getStaminaLoss()) - to_chat(user, "\tSubject appears to be suffering from fatigue.") + msg += "\tSubject appears to be suffering from fatigue.\n" if(advanced) - to_chat(user, "\tFatigue Level: [M.getStaminaLoss()]%.") + msg += "\tFatigue Level: [M.getStaminaLoss()]%.\n" if (M.getCloneLoss()) - to_chat(user, "\tSubject appears to have [M.getCloneLoss() > 30 ? "Severe" : "Minor"] cellular damage.") + msg += "\tSubject appears to have [M.getCloneLoss() > 30 ? "Severe" : "Minor"] cellular damage.\n" if(advanced) - to_chat(user, "\tCellular Damage Level: [M.getCloneLoss()].") + msg += "\tCellular Damage Level: [M.getCloneLoss()].\n" if (M.getBrainLoss() >= 200 || !M.getorgan(/obj/item/organ/brain)) - to_chat(user, "\tSubject's brain function is non-existent.") + msg += "\tSubject's brain function is non-existent.\n" else if (M.getBrainLoss() >= 120) - to_chat(user, "\tSevere brain damage detected. Subject likely to have mental traumas.") + msg += "\tSevere brain damage detected. Subject likely to have mental traumas.\n" else if (M.getBrainLoss() >= 45) - to_chat(user, "\tBrain damage detected.") + msg += "\tBrain damage detected.\n" if(iscarbon(M)) var/mob/living/carbon/C = M if(LAZYLEN(C.get_traumas())) @@ -176,83 +178,83 @@ SLIME SCANNER trauma_desc += "permanent " trauma_desc += B.scan_desc trauma_text += trauma_desc - to_chat(user, "\tCerebral traumas detected: subject appears to be suffering from [english_list(trauma_text)].") + msg += "\tCerebral traumas detected: subject appears to be suffering from [english_list(trauma_text)].\n" if(C.roundstart_quirks.len) - to_chat(user, "\tSubject has the following physiological traits: [C.get_trait_string()].") + msg += "\tSubject has the following physiological traits: [C.get_trait_string()].\n" if(advanced) - to_chat(user, "\tBrain Activity Level: [(200 - M.getBrainLoss())/2]%.") + msg += "\tBrain Activity Level: [(200 - M.getBrainLoss())/2]%.\n" if (M.radiation) - to_chat(user, "\tSubject is irradiated.") + msg += "\tSubject is irradiated.\n" if(advanced) - to_chat(user, "\tRadiation Level: [M.radiation]%.") + msg += "\tRadiation Level: [M.radiation]%.\n" if(advanced && M.hallucinating()) - to_chat(user, "\tSubject is hallucinating.") + msg += "\tSubject is hallucinating.\n" //Eyes and ears if(advanced) if(iscarbon(M)) var/mob/living/carbon/C = M var/obj/item/organ/ears/ears = C.getorganslot(ORGAN_SLOT_EARS) - to_chat(user, "\t==EAR STATUS==") + msg += "\t==EAR STATUS==\n" if(istype(ears)) var/healthy = TRUE if(C.has_trait(TRAIT_DEAF, GENETIC_MUTATION)) healthy = FALSE - to_chat(user, "\tSubject is genetically deaf.") + msg += "\tSubject is genetically deaf.\n" else if(C.has_trait(TRAIT_DEAF)) healthy = FALSE - to_chat(user, "\tSubject is deaf.") + msg += "\tSubject is deaf.\n" else if(ears.ear_damage) - to_chat(user, "\tSubject has [ears.ear_damage > UNHEALING_EAR_DAMAGE? "permanent ": "temporary "]hearing damage.") + msg += "\tSubject has [ears.ear_damage > UNHEALING_EAR_DAMAGE? "permanent ": "temporary "]hearing damage.\n" healthy = FALSE if(ears.deaf) - to_chat(user, "\tSubject is [ears.ear_damage > UNHEALING_EAR_DAMAGE ? "permanently ": "temporarily "] deaf.") + msg += "\tSubject is [ears.ear_damage > UNHEALING_EAR_DAMAGE ? "permanently ": "temporarily "] deaf.\n" healthy = FALSE if(healthy) - to_chat(user, "\tHealthy.") + msg += "\tHealthy.\n" else - to_chat(user, "\tSubject does not have ears.") + msg += "\tSubject does not have ears.\n" var/obj/item/organ/eyes/eyes = C.getorganslot(ORGAN_SLOT_EYES) - to_chat(user, "\t==EYE STATUS==") + msg += "\t==EYE STATUS==\n" if(istype(eyes)) var/healthy = TRUE if(C.has_trait(TRAIT_BLIND)) - to_chat(user, "\tSubject is blind.") + msg += "\tSubject is blind.\n" healthy = FALSE if(C.has_trait(TRAIT_NEARSIGHT)) - to_chat(user, "\tSubject is nearsighted.") + msg += "\tSubject is nearsighted.\n" healthy = FALSE if(eyes.eye_damage > 30) - to_chat(user, "\tSubject has severe eye damage.") + msg += "\tSubject has severe eye damage.\n" healthy = FALSE else if(eyes.eye_damage > 20) - to_chat(user, "\tSubject has significant eye damage.") + msg += "\tSubject has significant eye damage.\n" healthy = FALSE else if(eyes.eye_damage) - to_chat(user, "\tSubject has minor eye damage.") + msg += "\tSubject has minor eye damage.\n" healthy = FALSE if(healthy) - to_chat(user, "\tHealthy.") + msg += "\tHealthy.\n" else - to_chat(user, "\tSubject does not have eyes.") + msg += "\tSubject does not have eyes.\n" if(ishuman(M)) var/mob/living/carbon/human/H = M var/ldamage = H.return_liver_damage() if(ldamage > 10) - to_chat(user, "\t[ldamage > 45 ? "Severe" : "Minor"] liver damage detected.") + msg += "\t[ldamage > 45 ? "Severe" : "Minor"] liver damage detected.\n" // Body part damage report if(iscarbon(M) && mode == 1) var/mob/living/carbon/C = M var/list/damaged = C.get_damaged_bodyparts(1,1) if(length(damaged)>0 || oxy_loss>0 || tox_loss>0 || fire_loss>0) - to_chat(user, "\tDamage: Brute-Burn-Toxin-Suffocation\n\t\tSpecifics: [brute_loss]-[fire_loss]-[tox_loss]-[oxy_loss]") + msg += "\tDamage: Brute-Burn-Toxin-Suffocation\n\t\tSpecifics: [brute_loss]-[fire_loss]-[tox_loss]-[oxy_loss]\n" for(var/obj/item/bodypart/org in damaged) - to_chat(user, "\t\t[capitalize(org.name)]: [(org.brute_dam > 0) ? "[org.brute_dam]" : "0"]-[(org.burn_dam > 0) ? "[org.burn_dam]" : "0"]") + msg += "\t\t[capitalize(org.name)]: [(org.brute_dam > 0) ? "[org.brute_dam]" : "0"]-[(org.burn_dam > 0) ? "[org.burn_dam]" : "0"]\n" // Species and body temperature if(ishuman(M)) @@ -282,20 +284,22 @@ SLIME SCANNER else if (S.mutantstomach != initial(S.mutantstomach)) mutant = TRUE - to_chat(user, "Species: [S.name][mutant ? "-derived mutant" : ""]") - to_chat(user, "Body temperature: [round(M.bodytemperature-T0C,0.1)] °C ([round(M.bodytemperature*1.8-459.67,0.1)] °F)") + msg += "Species: [H.dna.custom_species ? H.dna.custom_species : S.name] Base: [S.name]\n" + if(mutant) + msg += "Subject has mutations present." + msg += "Body temperature: [round(M.bodytemperature-T0C,0.1)] °C ([round(M.bodytemperature*1.8-459.67,0.1)] °F)\n" // Time of death if(M.tod && (M.stat == DEAD || ((M.has_trait(TRAIT_FAKEDEATH)) && !advanced))) - to_chat(user, "Time of Death: [M.tod]") + msg += "Time of Death: [M.tod]\n" var/tdelta = round(world.time - M.timeofdeath) if(tdelta < (DEFIB_TIME_LIMIT * 10)) - to_chat(user, "Subject died [DisplayTimeText(tdelta)] ago, defibrillation may be possible!") + msg += "Subject died [DisplayTimeText(tdelta)] ago, defibrillation may be possible!\n" for(var/thing in M.diseases) var/datum/disease/D = thing if(!(D.visibility_flags & HIDDEN_SCANNER)) - to_chat(user, "Warning: [D.form] detected\nName: [D.name].\nType: [D.spread_text].\nStage: [D.stage]/[D.max_stages].\nPossible Cure: [D.cure_text]") + msg += "Warning: [D.form] detected\nName: [D.name].\nType: [D.spread_text].\nStage: [D.stage]/[D.max_stages].\nPossible Cure: [D.cure_text]\n" // Blood Level if(M.has_dna()) @@ -305,7 +309,7 @@ SLIME SCANNER if(ishuman(C)) var/mob/living/carbon/human/H = C if(H.bleed_rate) - to_chat(user, "Subject is bleeding!") + msg += "Subject is bleeding!\n" var/blood_percent = round((C.blood_volume / BLOOD_VOLUME_NORMAL)*100) var/blood_type = C.dna.blood_type if(blood_id != "blood")//special blood substance @@ -315,36 +319,41 @@ SLIME SCANNER else blood_type = blood_id if(C.blood_volume <= BLOOD_VOLUME_SAFE && C.blood_volume > BLOOD_VOLUME_OKAY) - to_chat(user, "LOW blood level [blood_percent] %, [C.blood_volume] cl, type: [blood_type]") + msg += "LOW blood level [blood_percent] %, [C.blood_volume] cl, type: [blood_type]\n" else if(C.blood_volume <= BLOOD_VOLUME_OKAY) - to_chat(user, "CRITICAL blood level [blood_percent] %, [C.blood_volume] cl, type: [blood_type]") + msg += "CRITICAL blood level [blood_percent] %, [C.blood_volume] cl, type: [blood_type]\n" else - to_chat(user, "Blood level [blood_percent] %, [C.blood_volume] cl, type: [blood_type]") + msg += "Blood level [blood_percent] %, [C.blood_volume] cl, type: [blood_type]\n" var/cyberimp_detect for(var/obj/item/organ/cyberimp/CI in C.internal_organs) if(CI.status == ORGAN_ROBOTIC && !CI.syndicate_implant) cyberimp_detect += "[C.name] is modified with a [CI.name].
" if(cyberimp_detect) - to_chat(user, "Detected cybernetic modifications:") - to_chat(user, "[cyberimp_detect]") + msg += "Detected cybernetic modifications:\n" + msg += "[cyberimp_detect]\n" + msg += "*---------*
" + to_chat(user, msg) SEND_SIGNAL(M, COMSIG_NANITE_SCAN, user, FALSE) /proc/chemscan(mob/living/user, mob/living/M) if(istype(M)) if(M.reagents) + var/msg = "*---------*\n" if(M.reagents.reagent_list.len) - to_chat(user, "Subject contains the following reagents:") + msg += "Subject contains the following reagents:\n" for(var/datum/reagent/R in M.reagents.reagent_list) - to_chat(user, "[R.volume] units of [R.name][R.overdosed == 1 ? " - OVERDOSING" : "."]") + msg += "[R.volume] units of [R.name][R.overdosed == 1 ? " - OVERDOSING" : ".
"]\n" else - to_chat(user, "Subject contains no reagents.") + msg += "Subject contains no reagents.\n" if(M.reagents.addiction_list.len) - to_chat(user, "Subject is addicted to the following reagents:") + msg += "Subject is addicted to the following reagents:\n" for(var/datum/reagent/R in M.reagents.addiction_list) - to_chat(user, "[R.name]") + msg += "[R.name]\n" else - to_chat(user, "Subject is not addicted to any reagents.") + msg += "Subject is not addicted to any reagents.\n" + msg += "*---------*
" + to_chat(user, msg) /obj/item/healthanalyzer/verb/toggle_mode() set name = "Switch Verbosity" diff --git a/code/game/objects/items/inducer.dm b/code/game/objects/items/inducer.dm index 730a459ed4..bbd2e67464 100644 --- a/code/game/objects/items/inducer.dm +++ b/code/game/objects/items/inducer.dm @@ -12,6 +12,7 @@ var/cell_type = /obj/item/stock_parts/cell/high var/obj/item/stock_parts/cell/cell var/recharging = FALSE + var/gun_charger = FALSE /obj/item/inducer/Initialize() . = ..() @@ -104,7 +105,7 @@ var/obj/item/stock_parts/cell/C = A.get_cell() var/obj/O var/coefficient = 1 - if(istype(A, /obj/item/gun/energy)) + if(istype(A, /obj/item/gun/energy) && gun_charger != TRUE) to_chat(user,"Error unable to interface with device") return FALSE if(istype(A, /obj)) @@ -181,3 +182,26 @@ /obj/item/inducer/sci/Initialize() . = ..() update_icon() + +/obj/item/inducer/sci/combat + icon_state = "inducer-combat" + item_state = "inducer-combat" + w_class = WEIGHT_CLASS_BULKY + slot_flags = SLOT_BELT + desc = "A tool for inductively charging internal power cells. This one has been modified and upgraded to be able to charge into guns as well as normal electronics." + cell_type = /obj/item/stock_parts/cell/hyper + powertransfer = 1300 + opened = FALSE + gun_charger = TRUE + +/obj/item/inducer/sci/combat/dry + cell_type = null + opened = TRUE + +/obj/item/inducer/sci/combat/dry/Initialize() //Just in case + . = ..() + update_icon() + +/obj/item/inducer/sci/combat/Initialize() + . = ..() + update_icon() diff --git a/code/game/objects/items/stacks/sheets/sheet_types.dm b/code/game/objects/items/stacks/sheets/sheet_types.dm index e63ddd1c02..89d939e505 100644 --- a/code/game/objects/items/stacks/sheets/sheet_types.dm +++ b/code/game/objects/items/stacks/sheets/sheet_types.dm @@ -382,8 +382,8 @@ GLOBAL_LIST_INIT(runed_metal_recipes, list ( \ GLOBAL_LIST_INIT(brass_recipes, list ( \ new/datum/stack_recipe("wall gear", /obj/structure/destructible/clockwork/wall_gear, 3, time = 10, one_per_turf = TRUE, on_floor = TRUE), \ null, - new/datum/stack_recipe("pinion airlock", /obj/machinery/door/airlock/clockwork, 5, time = 50, one_per_turf = TRUE, on_floor = TRUE), \ - new/datum/stack_recipe("brass pinion airlock", /obj/machinery/door/airlock/clockwork/brass, 5, time = 50, one_per_turf = TRUE, on_floor = TRUE), \ + new/datum/stack_recipe("brass pinion airlock", /obj/machinery/door/airlock/clockwork, 5, time = 50, one_per_turf = TRUE, on_floor = TRUE), \ + new/datum/stack_recipe("brass pinion airlock - windowed", /obj/machinery/door/airlock/clockwork/brass, 5, time = 50, one_per_turf = TRUE, on_floor = TRUE), \ new/datum/stack_recipe("brass windoor", /obj/machinery/door/window/clockwork, 2, time = 30, on_floor = TRUE, window_checks = TRUE), \ null, new/datum/stack_recipe("directional brass window", /obj/structure/window/reinforced/clockwork/unanchored, time = 0, on_floor = TRUE, window_checks = TRUE), \ @@ -392,11 +392,14 @@ GLOBAL_LIST_INIT(brass_recipes, list ( \ new/datum/stack_recipe("brass table frame", /obj/structure/table_frame/brass, 1, time = 5, one_per_turf = TRUE, on_floor = TRUE), \ null, new/datum/stack_recipe("sender - pressure sensor", /obj/structure/destructible/clockwork/trap/trigger/pressure_sensor, 2, time = 20, one_per_turf = TRUE, on_floor = TRUE), \ + new/datum/stack_recipe("sender - mech sensor", /obj/structure/destructible/clockwork/trap/trigger/pressure_sensor/mech, 2, time = 20, one_per_turf = TRUE, on_floor = TRUE), \ new/datum/stack_recipe("sender - lever", /obj/structure/destructible/clockwork/trap/trigger/lever, 1, time = 10, one_per_turf = TRUE, on_floor = TRUE), \ new/datum/stack_recipe("sender - repeater", /obj/structure/destructible/clockwork/trap/trigger/repeater, 2, time = 20, one_per_turf = TRUE, on_floor = TRUE), \ null, new/datum/stack_recipe("receiver - brass skewer", /obj/structure/destructible/clockwork/trap/brass_skewer, 2, time = 20, one_per_turf = TRUE, on_floor = TRUE, placement_checks = STACK_CHECK_ADJACENT), \ new/datum/stack_recipe("receiver - steam vent", /obj/structure/destructible/clockwork/trap/steam_vent, 3, time = 30, one_per_turf = TRUE, on_floor = TRUE, placement_checks = STACK_CHECK_CARDINALS), \ + new/datum/stack_recipe("receiver - power nullifier", /obj/structure/destructible/clockwork/trap/power_nullifier, 5, time = 20, one_per_turf = TRUE, on_floor = TRUE, placement_checks = STACK_CHECK_CARDINALS), \ + )) /obj/item/stack/tile/brass diff --git a/code/game/objects/items/storage/backpack.dm b/code/game/objects/items/storage/backpack.dm index 25fc96c251..1f1143e7ce 100644 --- a/code/game/objects/items/storage/backpack.dm +++ b/code/game/objects/items/storage/backpack.dm @@ -48,6 +48,13 @@ armor = list("melee" = 0, "bullet" = 0, "laser" = 0, "energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 60, "acid" = 50) component_type = /datum/component/storage/concrete/bluespace/bag_of_holding +/obj/item/storage/backpack/holding/satchel + name = "satchel of holding" + desc = "A satchel that opens into a localized pocket of Blue Space." + icon_state = "holdingsat" + item_state = "holdingsat" + species_exception = list(/datum/species/angel) + /obj/item/storage/backpack/holding/ComponentInitialize() . = ..() GET_COMPONENT(STR, /datum/component/storage) diff --git a/code/game/objects/items/storage/firstaid.dm b/code/game/objects/items/storage/firstaid.dm index 079feec17a..1a666ce921 100644 --- a/code/game/objects/items/storage/firstaid.dm +++ b/code/game/objects/items/storage/firstaid.dm @@ -122,7 +122,7 @@ new /obj/item/reagent_containers/pill/antirad(src) new /obj/item/reagent_containers/food/drinks/bottle/vodka(src) new /obj/item/healthanalyzer(src) - + /obj/item/storage/firstaid/o2 name = "oxygen deprivation treatment kit" @@ -312,3 +312,11 @@ /obj/item/storage/pill_bottle/mutarad/PopulateContents() for(var/i in 1 to 7) new /obj/item/reagent_containers/pill/mutarad(src) + +/obj/item/storage/pill_bottle/penis_enlargement + name = "penis enlargement pills" + desc = "You want penis enlargement pills?" + +/obj/item/storage/pill_bottle/penis_enlargement/PopulateContents() + for(var/i in 1 to 7) + new /obj/item/reagent_containers/pill/penis_enlargement(src) diff --git a/code/game/objects/items/storage/toolbox.dm b/code/game/objects/items/storage/toolbox.dm index eb9fc86516..9b8d2b4a21 100644 --- a/code/game/objects/items/storage/toolbox.dm +++ b/code/game/objects/items/storage/toolbox.dm @@ -208,3 +208,38 @@ new/obj/item/stack/cable_coil/orange(src) new/obj/item/stack/cable_coil/cyan(src) new/obj/item/stack/cable_coil/white(src) + +/obj/item/storage/toolbox/gold_real + name = "golden toolbox" + desc = "A larger then normal toolbox made of gold plated plastitanium." + item_state = "gold" + icon_state = "gold" + has_latches = FALSE + force = 16 // Less then a spear + throwforce = 14 + throw_speed = 5 + throw_range = 10 + +/obj/item/storage/toolbox/gold_real/PopulateContents() + new /obj/item/screwdriver/nuke(src) + new /obj/item/wrench(src) + new /obj/item/weldingtool/largetank(src) + new /obj/item/crowbar/red(src) + new /obj/item/wirecutters(src, "red") + new /obj/item/multitool/ai_detect(src) + new /obj/item/clothing/gloves/combat(src) + +/obj/item/storage/toolbox/gold_real/ComponentInitialize() + . = ..() + GET_COMPONENT(STR, /datum/component/storage) + STR.max_combined_w_class = 40 + STR.max_items = 12 + +/obj/item/storage/toolbox/gold_fake // used in crafting + name = "golden toolbox" + desc = "A gold plated toolbox, fancy and harmless do to the gold plating being on cardboard!" + icon_state = "gold" + item_state = "gold" + has_latches = FALSE + force = 0 + throwforce = 0 diff --git a/code/game/objects/items/weaponry.dm b/code/game/objects/items/weaponry.dm index 294611c1f1..19848f45ea 100644 --- a/code/game/objects/items/weaponry.dm +++ b/code/game/objects/items/weaponry.dm @@ -225,6 +225,7 @@ for further reading, please see: https://github.com/tgstation/tgstation/pull/301 /obj/item/katana/cursed slot_flags = null + item_flags = NODROP /obj/item/katana/suicide_act(mob/user) user.visible_message("[user] is slitting [user.p_their()] stomach open with [src]! It looks like [user.p_theyre()] trying to commit seppuku!") diff --git a/code/game/objects/structures/musician.dm b/code/game/objects/structures/musician.dm index 6d3f498a8c..0e2f951f38 100644 --- a/code/game/objects/structures/musician.dm +++ b/code/game/objects/structures/musician.dm @@ -1,6 +1,6 @@ #define MUSICIAN_HEARCHECK_MINDELAY 4 -#define MUSIC_MAXLINES 300 +#define MUSIC_MAXLINES 600 #define MUSIC_MAXLINECHARS 50 /datum/song diff --git a/code/modules/admin/verbs/SDQL2/SDQL_2_wrappers.dm b/code/modules/admin/verbs/SDQL2/SDQL_2_wrappers.dm index 3056b459d8..97a799824b 100644 --- a/code/modules/admin/verbs/SDQL2/SDQL_2_wrappers.dm +++ b/code/modules/admin/verbs/SDQL2/SDQL_2_wrappers.dm @@ -217,3 +217,7 @@ /proc/_step_away(ref, trg, max) step_away(ref, trg, max) +/proc/_instantiate_at(thing, location) + new thing(location) + + diff --git a/code/modules/antagonists/abductor/equipment/abduction_gear.dm b/code/modules/antagonists/abductor/equipment/abduction_gear.dm index 3fa1020000..b14541d3c8 100644 --- a/code/modules/antagonists/abductor/equipment/abduction_gear.dm +++ b/code/modules/antagonists/abductor/equipment/abduction_gear.dm @@ -503,6 +503,7 @@ Congratulations! You are now trained for invasive xenobiology research!"} L.lastattacker = user.real_name L.lastattackerckey = user.ckey + L.adjustStaminaLoss(35) //because previously it took 5-6 hits to actually "incapacitate" someone for the purposes of the sleep inducement L.Knockdown(140) L.apply_effect(EFFECT_STUTTER, 7) SEND_SIGNAL(L, COMSIG_LIVING_MINOR_SHOCK) diff --git a/code/modules/antagonists/blob/blob/blobs/core.dm b/code/modules/antagonists/blob/blob/blobs/core.dm index e048aa7665..81792ca4f6 100644 --- a/code/modules/antagonists/blob/blob/blobs/core.dm +++ b/code/modules/antagonists/blob/blob/blobs/core.dm @@ -4,7 +4,7 @@ icon_state = "blank_blob" desc = "A huge, pulsating yellow mass." max_integrity = 400 - armor = list("melee" = 0, "bullet" = 0, "laser" = 0, "energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 75, "acid" = 90) + armor = list("melee" = 30, "bullet" = 30, "laser" = 20, "energy" = 5, "bomb" = 70, "bio" = 0, "rad" = 0, "fire" = 75, "acid" = 90) // Last stand explosion_block = 6 point_return = -1 health_regen = 0 //we regen in Life() instead of when pulsed diff --git a/code/modules/antagonists/blob/blob/blobs/factory.dm b/code/modules/antagonists/blob/blob/blobs/factory.dm index 3d955036b0..284a43562e 100644 --- a/code/modules/antagonists/blob/blob/blobs/factory.dm +++ b/code/modules/antagonists/blob/blob/blobs/factory.dm @@ -6,6 +6,7 @@ max_integrity = 200 health_regen = 1 point_return = 25 + armor = list("melee" = 10, "bullet" = 20, "laser" = 15, "energy" = 10, "bomb" = 40, "bio" = 0, "rad" = 0, "fire" = 90, "acid" = 90) var/list/spores = list() var/mob/living/simple_animal/hostile/blob/blobbernaut/naut = null var/max_spores = 3 diff --git a/code/modules/antagonists/blob/blob/blobs/resource.dm b/code/modules/antagonists/blob/blob/blobs/resource.dm index 5024d0984c..76aecf717d 100644 --- a/code/modules/antagonists/blob/blob/blobs/resource.dm +++ b/code/modules/antagonists/blob/blob/blobs/resource.dm @@ -5,6 +5,7 @@ desc = "A thin spire of slightly swaying tendrils." max_integrity = 60 point_return = 15 + armor = list("melee" = 10, "bullet" = 10, "laser" = 0, "energy" = 0, "bomb" = 15, "bio" = 0, "rad" = 0, "fire" = 90, "acid" = 90) var/resource_delay = 0 /obj/structure/blob/resource/scannerreport() diff --git a/code/modules/antagonists/blob/blob/blobs/shield.dm b/code/modules/antagonists/blob/blob/blobs/shield.dm index a83f4294b2..d52c208c71 100644 --- a/code/modules/antagonists/blob/blob/blobs/shield.dm +++ b/code/modules/antagonists/blob/blob/blobs/shield.dm @@ -8,7 +8,7 @@ explosion_block = 3 point_return = 4 atmosblock = TRUE - armor = list("melee" = 0, "bullet" = 0, "laser" = 0, "energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 90, "acid" = 90) + armor = list("melee" = 25, "bullet" = 25, "laser" = 15, "energy" = 10, "bomb" = 20, "bio" = 0, "rad" = 0, "fire" = 90, "acid" = 90) /obj/structure/blob/shield/scannerreport() if(atmosblock) @@ -20,11 +20,12 @@ /obj/structure/blob/shield/update_icon() ..() - if(obj_integrity <= 75) + if(obj_integrity <= 70) icon_state = "blob_shield_damaged" name = "weakened strong blob" desc = "A wall of twitching tendrils." atmosblock = FALSE + armor = list("melee" = 15, "bullet" = 15, "laser" = 5, "energy" = 0, "bomb" = 10, "bio" = 0, "rad" = 0, "fire" = 90, "acid" = 90) else icon_state = initial(icon_state) name = initial(name) diff --git a/code/modules/antagonists/changeling/powers/tiny_prick.dm b/code/modules/antagonists/changeling/powers/tiny_prick.dm index b9abf76fd1..c9b48fa6fc 100644 --- a/code/modules/antagonists/changeling/powers/tiny_prick.dm +++ b/code/modules/antagonists/changeling/powers/tiny_prick.dm @@ -64,11 +64,11 @@ /obj/effect/proc_holder/changeling/sting/transformation name = "Transformation Sting" desc = "We silently sting a human, injecting a retrovirus that forces them to transform." - helptext = "The victim will transform much like a changeling would. Does not provide a warning to others. Mutations will not be transferred, and monkeys will become human. This ability is somewhat loud, and carries a small risk of our blood gaining violent sensitivity to heat." + helptext = "The victim will transform much like a changeling would. Does not provide a warning to others. Mutations will not be transferred, and monkeys will become human. This ability is loud, and might cause our blood to react violently to heat." sting_icon = "sting_transform" chemical_cost = 50 dna_cost = 3 - loudness = 1 + loudness = 2 var/datum/changelingprofile/selected_dna = null action_icon = 'icons/mob/actions/actions_changeling.dmi' action_icon_state = "ling_sting_transform" diff --git a/code/modules/antagonists/clockcult/clock_items/clockwork_slab.dm b/code/modules/antagonists/clockcult/clock_items/clockwork_slab.dm index d7ae0c7fc6..ec712f2eec 100644 --- a/code/modules/antagonists/clockcult/clock_items/clockwork_slab.dm +++ b/code/modules/antagonists/clockcult/clock_items/clockwork_slab.dm @@ -44,12 +44,13 @@ /obj/item/clockwork/slab/cyborg //three scriptures, plus a spear and fabricator clockwork_desc = "A divine link to the Celestial Derelict, allowing for limited recital of scripture." - quickbound = list(/datum/clockwork_scripture/abscond, /datum/clockwork_scripture/ranged_ability/judicial_marker, /datum/clockwork_scripture/ranged_ability/linked_vanguard) + quickbound = list(/datum/clockwork_scripture/ranged_ability/judicial_marker, /datum/clockwork_scripture/ranged_ability/linked_vanguard, \ + /datum/clockwork_scripture/create_object/stargazer) maximum_quickbound = 6 //we usually have one or two unique scriptures, so if ratvar is up let us bind one more actions_types = list() -/obj/item/clockwork/slab/cyborg/engineer //two scriptures, plus a fabricator - quickbound = list(/datum/clockwork_scripture/abscond, /datum/clockwork_scripture/create_object/replicant, /datum/clockwork_scripture/create_object/sigil_of_transmission) +/obj/item/clockwork/slab/cyborg/engineer //three scriptures, plus a fabricator + quickbound = list(/datum/clockwork_scripture/abscond, /datum/clockwork_scripture/create_object/replicant, /datum/clockwork_scripture/create_object/sigil_of_transmission, /datum/clockwork_scripture/create_object/stargazer) /obj/item/clockwork/slab/cyborg/medical //five scriptures, plus a spear quickbound = list(/datum/clockwork_scripture/abscond, /datum/clockwork_scripture/ranged_ability/linked_vanguard, /datum/clockwork_scripture/ranged_ability/sentinels_compromise, \ @@ -61,12 +62,12 @@ /obj/item/clockwork/slab/cyborg/peacekeeper //two scriptures, plus a spear quickbound = list(/datum/clockwork_scripture/abscond, /datum/clockwork_scripture/ranged_ability/hateful_manacles, /datum/clockwork_scripture/ranged_ability/judicial_marker) -/obj/item/clockwork/slab/cyborg/janitor //five scriptures, plus a fabricator +/obj/item/clockwork/slab/cyborg/janitor //six scriptures, plus a fabricator quickbound = list(/datum/clockwork_scripture/abscond, /datum/clockwork_scripture/create_object/replicant, /datum/clockwork_scripture/create_object/sigil_of_transgression, \ - /datum/clockwork_scripture/create_object/ocular_warden, /datum/clockwork_scripture/create_object/mania_motor) + /datum/clockwork_scripture/create_object/stargazer, /datum/clockwork_scripture/create_object/ocular_warden, /datum/clockwork_scripture/create_object/mania_motor) -/obj/item/clockwork/slab/cyborg/service //five scriptures, plus xray vision - quickbound = list(/datum/clockwork_scripture/abscond, /datum/clockwork_scripture/create_object/replicant, \ +/obj/item/clockwork/slab/cyborg/service //six scriptures, plus xray vision + quickbound = list(/datum/clockwork_scripture/abscond, /datum/clockwork_scripture/create_object/replicant,/datum/clockwork_scripture/create_object/stargazer, \ /datum/clockwork_scripture/spatial_gateway, /datum/clockwork_scripture/create_object/clockwork_obelisk) /obj/item/clockwork/slab/cyborg/miner //two scriptures, plus a spear and xray vision diff --git a/code/modules/antagonists/clockcult/clock_scriptures/scripture_drivers.dm b/code/modules/antagonists/clockcult/clock_scriptures/scripture_drivers.dm index 6415d9f91a..552a747651 100644 --- a/code/modules/antagonists/clockcult/clock_scriptures/scripture_drivers.dm +++ b/code/modules/antagonists/clockcult/clock_scriptures/scripture_drivers.dm @@ -2,6 +2,32 @@ // DRIVERS // ///////////// +//Stargazer: Creates a stargazer, a cheap power generator that utilizes starlight. +/datum/clockwork_scripture/create_object/stargazer + descname = "Generates Power From Starlight" + name = "Stargazer" + desc = "Forms a weak structure that generates power every second while within three tiles of starlight." + invocations = list("Capture their inferior light for us!") + channel_time = 50 + power_cost = 200 + object_path = /obj/structure/destructible/clockwork/stargazer + creator_message = "You form a stargazer, which will generate power near starlight." + observer_message = "A large lantern-shaped machine forms!" + usage_tip = "For obvious reasons, make sure to place this near a window or somewhere else that can see space!" + tier = SCRIPTURE_DRIVER + one_per_tile = TRUE + primary_component = HIEROPHANT_ANSIBLE + sort_priority = 1 + quickbind = TRUE + quickbind_desc = "Creates a stargazer, which generates power when near starlight." + +/datum/clockwork_scripture/create_object/stargazer/check_special_requirements() + var/area/A = get_area(invoker) + if(A.outdoors || A.map_name == "Space" || !A.blob_allowed) + to_chat(invoker, "Stargazers can't be built off-station.") + return + return ..() + //Integration Cog: Creates an integration cog that can be inserted into APCs to passively siphon power. /datum/clockwork_scripture/create_object/integration_cog @@ -18,7 +44,7 @@ tier = SCRIPTURE_DRIVER space_allowed = TRUE primary_component = HIEROPHANT_ANSIBLE - sort_priority = 1 + sort_priority = 2 important = TRUE quickbind = TRUE quickbind_desc = "Creates an integration cog, which can be used to siphon power from an open APC." @@ -39,7 +65,7 @@ tier = SCRIPTURE_DRIVER one_per_tile = TRUE primary_component = HIEROPHANT_ANSIBLE - sort_priority = 2 + sort_priority = 3 quickbind = TRUE quickbind_desc = "Creates a Sigil of Transgression, which will briefly stun and slow the next non-Servant to cross it." @@ -59,7 +85,7 @@ tier = SCRIPTURE_DRIVER one_per_tile = TRUE primary_component = HIEROPHANT_ANSIBLE - sort_priority = 3 + sort_priority = 4 quickbind = TRUE quickbind_desc = "Creates a Sigil of Submission, which will convert non-Servants that remain on it." @@ -76,7 +102,7 @@ usage_tip = "The light can be used from up to two tiles away. Damage taken will GREATLY REDUCE the stun's duration." tier = SCRIPTURE_DRIVER primary_component = BELLIGERENT_EYE - sort_priority = 4 + sort_priority = 5 slab_overlay = "volt" ranged_type = /obj/effect/proc_holder/slab/kindle ranged_message = "You charge the clockwork slab with divine energy.\n\ @@ -100,7 +126,7 @@ usage_tip = "The manacles are about as strong as zipties, and break when removed." tier = SCRIPTURE_DRIVER primary_component = BELLIGERENT_EYE - sort_priority = 5 + sort_priority = 6 ranged_type = /obj/effect/proc_holder/slab/hateful_manacles slab_overlay = "hateful_manacles" ranged_message = "You charge the clockwork slab with divine energy.\n\ @@ -124,7 +150,7 @@ usage_tip = "You cannot reactivate Vanguard while still shielded by it." tier = SCRIPTURE_DRIVER primary_component = VANGUARD_COGWHEEL - sort_priority = 6 + sort_priority = 7 quickbind = TRUE quickbind_desc = "Allows you to temporarily have quickly regenerating stamina and absorb stuns. All stuns absorbed will affect you when disabled." @@ -156,7 +182,7 @@ usage_tip = "The Compromise is very fast to invoke, and will remove holy water from the target Servant." tier = SCRIPTURE_DRIVER primary_component = VANGUARD_COGWHEEL - sort_priority = 7 + sort_priority = 8 quickbind = TRUE quickbind_desc = "Allows you to convert a Servant's brute, burn, and oxygen damage to half toxin damage.
Click your slab to disable." slab_overlay = "compromise" @@ -180,7 +206,7 @@ usage_tip = "This can't be used while on Reebe, for obvious reasons." tier = SCRIPTURE_DRIVER primary_component = GEIS_CAPACITOR - sort_priority = 8 + sort_priority = 9 important = TRUE quickbind = TRUE quickbind_desc = "Returns you to Reebe." @@ -238,7 +264,7 @@ tier = SCRIPTURE_DRIVER space_allowed = TRUE primary_component = GEIS_CAPACITOR - sort_priority = 9 + sort_priority = 10 important = TRUE quickbind = TRUE quickbind_desc = "Creates a new Clockwork Slab." @@ -259,6 +285,6 @@ tier = SCRIPTURE_DRIVER space_allowed = TRUE primary_component = GEIS_CAPACITOR - sort_priority = 10 + sort_priority = 11 quickbind = TRUE quickbind_desc = "Creates a pair of Wraith Spectacles, which grant true sight but cause gradual vision loss." diff --git a/code/modules/antagonists/clockcult/clock_structures/stargazer.dm b/code/modules/antagonists/clockcult/clock_structures/stargazer.dm new file mode 100644 index 0000000000..57f83c55aa --- /dev/null +++ b/code/modules/antagonists/clockcult/clock_structures/stargazer.dm @@ -0,0 +1,70 @@ +#define STARGAZER_RANGE 3 //How many tiles the stargazer can see out to +#define STARGAZER_POWER 7 //How many watts will be produced per second when the stargazer sees starlight + +//Stargazer: A very fragile but cheap generator that creates power from starlight. +/obj/structure/destructible/clockwork/stargazer + name = "stargazer" + desc = "A large lantern-shaped machine made of thin brass. It looks fragile." + clockwork_desc = "A lantern-shaped generator that produces power when near starlight." + icon_state = "stargazer" + unanchored_icon = "stargazer_unwrenched" + max_integrity = 40 + construction_value = 5 + layer = WALL_OBJ_LAYER + break_message = "The stargazer's fragile body shatters into pieces!" + resistance_flags = LAVA_PROOF | FIRE_PROOF | ACID_PROOF + light_color = "#DAAA18" + var/star_light_star_bright = FALSE //If this stargazer can see starlight + +/obj/structure/destructible/clockwork/stargazer/Initialize() + . = ..() + START_PROCESSING(SSprocessing, src) + +/obj/structure/destructible/clockwork/stargazer/Destroy() + STOP_PROCESSING(SSprocessing, src) + . = ..() + +/obj/structure/destructible/clockwork/stargazer/examine(mob/user) + ..() + if(is_servant_of_ratvar(user)) + to_chat(user, "Generates [DisplayPower(STARGAZER_POWER)] per second while viewing starlight within [STARGAZER_RANGE] tiles.") + if(star_light_star_bright) + to_chat(user, "[is_servant_of_ratvar(user) ? "It can see starlight!" : "It's shining brilliantly!"]") + +/obj/structure/destructible/clockwork/stargazer/process() + star_light_star_bright = check_starlight() + if(star_light_star_bright) + adjust_clockwork_power(STARGAZER_POWER) + +/obj/structure/destructible/clockwork/stargazer/update_anchored(mob/living/user, damage) + . = ..() + star_light_star_bright = check_starlight() + +/obj/structure/destructible/clockwork/stargazer/proc/check_starlight() + var/old_status = star_light_star_bright + var/has_starlight + if(!anchored) + has_starlight = FALSE + else + for(var/turf/T in view(3, src)) + if(isspaceturf(T)) + has_starlight = TRUE + break + if(has_starlight && anchored) + var/area/A = get_area(src) + if(A.outdoors || A.map_name == "Space" || !A.blob_allowed) + has_starlight = FALSE + if(old_status != has_starlight) + if(has_starlight) + visible_message("[src] hums and shines brilliantly!") + playsound(src, 'sound/machines/clockcult/stargazer_activate.ogg', 50, TRUE) + add_overlay("stargazer_light") + set_light(1.5, 5) + else + if(anchored) //We lost visibility somehow + visible_message("[src] flickers, and falls dark.") + else + visible_message("[src] whooshes quietly as it slides into a less bulky form.") + cut_overlays() + set_light(0) + return has_starlight diff --git a/code/modules/antagonists/clockcult/clock_structures/trap_triggers/pressure_sensor_mech.dm b/code/modules/antagonists/clockcult/clock_structures/trap_triggers/pressure_sensor_mech.dm new file mode 100644 index 0000000000..3eac1b9fef --- /dev/null +++ b/code/modules/antagonists/clockcult/clock_structures/trap_triggers/pressure_sensor_mech.dm @@ -0,0 +1,20 @@ +//Mech sensor: Activates when stepped on by a mech +/obj/structure/destructible/clockwork/trap/trigger/pressure_sensor/mech + name = "mech sensor" + desc = "A thin plate of brass, barely visible but clearly distinct." + clockwork_desc = "A trigger that will activate when a mech controlled by a non-servant runs across it." + max_integrity = 5 + icon_state = "pressure_sensor" + alpha = 75 + +/obj/structure/destructible/clockwork/trap/trigger/pressure_sensor/mech/Crossed(atom/movable/AM) + + if(!istype(AM,/obj/mecha/)) + return + + var/obj/mecha/M = AM + if(M.occupant && is_servant_of_ratvar(M.occupant)) + return + audible_message("*click*") + playsound(src, 'sound/items/screwdriver2.ogg', 50, TRUE) + activate() \ No newline at end of file diff --git a/code/modules/antagonists/clockcult/clock_structures/traps/brass_skewer.dm b/code/modules/antagonists/clockcult/clock_structures/traps/brass_skewer.dm index 6312228447..ebfb219c9a 100644 --- a/code/modules/antagonists/clockcult/clock_structures/traps/brass_skewer.dm +++ b/code/modules/antagonists/clockcult/clock_structures/traps/brass_skewer.dm @@ -68,7 +68,14 @@ mouse_opacity = MOUSE_OPACITY_OPAQUE //So players can interact with the tile it's on to pull them off buckle_mob(squirrel, TRUE) else - visible_message("A massive brass spike erupts from the ground!") + var/obj/mecha/M = locate() in get_turf(src) + if(M) + M.take_damage(50,BRUTE,"melee") + M.visible_message("A massive brass spike erupts from the ground, penetrating \the [M] and shattering the trap into pieces!") + addtimer(CALLBACK(src, .proc/take_damage, max_integrity), 1) + else + visible_message("A massive brass spike erupts from the ground!") + playsound(src, 'sound/machines/clockcult/brass_skewer.ogg', 75, FALSE) icon_state = "[initial(icon_state)]_extended" density = TRUE //Skewers are one-use only diff --git a/code/modules/antagonists/clockcult/clock_structures/traps/power_null.dm b/code/modules/antagonists/clockcult/clock_structures/traps/power_null.dm new file mode 100644 index 0000000000..6c8477ab5b --- /dev/null +++ b/code/modules/antagonists/clockcult/clock_structures/traps/power_null.dm @@ -0,0 +1,17 @@ +/obj/structure/destructible/clockwork/trap/power_nullifier + name = "power nullifier" + desc = "A well hidden set of wires and connections." + clockwork_desc = "When triggered, it sets off a 3x3 emp pulse with the center suffering a stronger pulse." + icon_state = "electric_trap" + break_message = "The power nullifier sparks, then slowly crumbles to debris!" + max_integrity = 40 + density = FALSE + var/activated = FALSE + +/obj/structure/destructible/clockwork/trap/power_nullifier/activate() + if(!activated) + activated = TRUE + empulse(get_turf(src),1,1,TRUE) + +/obj/structure/destructible/clockwork/trap/power_nullifier/emp_act(var/strength=1) + activate() diff --git a/code/modules/cargo/exports/large_objects.dm b/code/modules/cargo/exports/large_objects.dm index 9368a41731..b5f0e7a240 100644 --- a/code/modules/cargo/exports/large_objects.dm +++ b/code/modules/cargo/exports/large_objects.dm @@ -55,7 +55,6 @@ contents_cost = 700 export_types = list(/obj/structure/reagent_dispensers/beerkeg) - /datum/export/large/pipedispenser cost = 500 unit_name = "pipe dispenser" @@ -122,7 +121,6 @@ unit_name = "packaged antimatter reactor section" export_types = list(/obj/item/am_shielding_container) - /datum/export/large/iv cost = 50 unit_name = "iv drip" @@ -133,3 +131,86 @@ unit_name = "security barrier" export_types = list(/obj/item/grenade/barrier, /obj/structure/barricade/security) +/datum/export/large/odysseus + cost = 5500 + unit_name = "working odysseus" + export_types = list(/obj/mecha/medical/odysseus) + include_subtypes = FALSE + +/datum/export/large/ripley + cost = 6500 + unit_name = "working ripley" + export_types = list(/obj/mecha/working/ripley) + include_subtypes = FALSE + +/datum/export/large/firefighter + cost = 9000 + unit_name = "working firefighter" + export_types = list(/obj/mecha/working/ripley/firefighter) + include_subtypes = FALSE + +/datum/export/large/gygax + cost = 19000 + unit_name = "working gygax" + export_types = list(/obj/mecha/combat/gygax) + include_subtypes = FALSE + +/datum/export/large/durand + cost = 10000 + unit_name = "working durand" + export_types = list(/obj/mecha/combat/durand) + include_subtypes = FALSE + +/datum/export/large/phazon + cost = 25000 //Little over half do to needing a core + unit_name = "working phazon" + export_types = list(/obj/mecha/combat/phazon) + include_subtypes = FALSE + +/datum/export/large/marauder + cost = 15000 //Still a Combat class mech - CC tech as well! 150% "normal" boundy price. + unit_name = "working marauder" + export_types = list(/obj/mecha/combat/marauder) + include_subtypes = FALSE + +/datum/export/large/deathripley + cost = 8500 //Still a "Combat class" mech - Illegal tech as well! 165% "normal" boundy price. + unit_name = "working illegally modified" + export_types = list(/obj/mecha/working/ripley/deathripley) + include_subtypes = FALSE + +/datum/export/large/gygaxdark + cost = 28500 //Still a Combat class mech - Illegal tech as well! 150% "normal" boundy price. + unit_name = "working illegally modified gygax" + export_types = list(/obj/mecha/combat/gygax/dark) + include_subtypes = FALSE + +/datum/export/large/oldripley + cost = 6250 //old mech - Scrap metal ! 50% "normal" boundy price. + unit_name = "working miner ripley" + export_types = list(/obj/mecha/working/ripley/mining) + include_subtypes = FALSE + +/datum/export/large/honk + cost = 12000 //Still a "Combat class" mech - Comats bordem honk! + unit_name = "working honker" + export_types = list(/obj/mecha/combat/honker) + include_subtypes = FALSE + +/datum/export/large/reticence + cost = 12000 //Still a "Combat class" mech - Has cloking and lethal weaponds. + unit_name = "working reticence" + export_types = list(/obj/mecha/combat/reticence) + include_subtypes = FALSE + +/datum/export/large/seraph + cost = 25500 //Still a Combat class mech - CC tech as well! 150% "normal" boundy price. + unit_name = "working seraph" + export_types = list(/obj/mecha/combat/marauder/seraph) + include_subtypes = FALSE + +/datum/export/large/mauler + cost = 12000 //Still a Combat class mech - CC lethal weaponds. + unit_name = "working legally modified marauder" + export_types = list(/obj/mecha/combat/marauder/mauler) + include_subtypes = FALSE diff --git a/code/modules/cargo/packs.dm b/code/modules/cargo/packs.dm index 633f4fa850..ca8f10869d 100644 --- a/code/modules/cargo/packs.dm +++ b/code/modules/cargo/packs.dm @@ -1699,7 +1699,7 @@ /obj/item/t_scanner/adv_mining_scanner/lesser, /obj/item/radio/headset/headset_cargo/mining, /obj/item/storage/bag/ore, - /obj/item/clothing/suit/hooded/explorer, + /obj/item/clothing/suit/hooded/explorer/standard, /obj/item/clothing/mask/gas/explorer) crate_name = "shaft miner starter kit" crate_type = /obj/structure/closet/crate/secure diff --git a/code/modules/client/preferences.dm b/code/modules/client/preferences.dm index 4f17f5d762..8e4891fb70 100644 --- a/code/modules/client/preferences.dm +++ b/code/modules/client/preferences.dm @@ -21,6 +21,12 @@ GLOBAL_LIST_EMPTY(preferences_datums) var/last_ip var/last_id + //Cooldowns for saving/loading. These are four are all separate due to loading code calling these one after another + var/saveprefcooldown + var/loadprefcooldown + var/savecharcooldown + var/loadcharcooldown + //game-preferences var/lastchangelog = "" //Saved changlog filesize to detect if there was a change var/ooccolor = null @@ -75,13 +81,80 @@ GLOBAL_LIST_EMPTY(preferences_datums) var/eye_color = "000" //Eye color var/datum/species/pref_species = new /datum/species/human() //Mutant race var/list/features = list("mcolor" = "FFF", - "tail_lizard" = "Smooth", "tail_human" = "Cat", - "snout" = "Round", "horns" = "None", "ears" = "Cat", - "wings" = "None", "frills" = "None", "spines" = "None", - "body_markings" = "None", "legs" = "Normal Legs", "moth_wings" = "Plain") + "tail_lizard" = "Smooth", + "tail_human" = "None", + "snout" = "Round", + "horns" = "None", + "ears" = "None", + "wings" = "None", + "frills" = "None", + "spines" = "None", + "body_markings" = "None", + "legs" = "Normal Legs", + "moth_wings" = "Plain", + "mcolor2" = "FFF", + "mcolor3" = "FFF", + "mam_body_markings" = "Plain", + "mam_ears" = "None", + "mam_snouts" = "None", + "mam_tail" = "None", + "mam_tail_animated" = "None", + "xenodorsal" = "Standard", + "xenohead" = "Standard", + "xenotail" = "Xenomorph Tail", + "taur" = "None", + "exhibitionist" = FALSE, + "genitals_use_skintone" = FALSE, + "has_cock" = FALSE, + "cock_shape" = "Human", + "cock_length" = 6, + "cock_girth_ratio" = COCK_GIRTH_RATIO_DEF, + "cock_color" = "fff", + "has_sheath" = FALSE, + "sheath_color" = "fff", + "has_balls" = FALSE, + "balls_internal" = FALSE, + "balls_color" = "fff", + "balls_amount" = 2, + "balls_sack_size" = BALLS_SACK_SIZE_DEF, + "balls_size" = BALLS_SIZE_DEF, + "balls_cum_rate" = CUM_RATE, + "balls_cum_mult" = CUM_RATE_MULT, + "balls_efficiency" = CUM_EFFICIENCY, + "balls_fluid" = "semen", + "has_ovi" = FALSE, + "ovi_shape" = "knotted", + "ovi_length" = 6, + "ovi_color" = "fff", + "has_eggsack" = FALSE, + "eggsack_internal" = TRUE, + "eggsack_color" = "fff", + "eggsack_size" = BALLS_SACK_SIZE_DEF, + "eggsack_egg_color" = "fff", + "eggsack_egg_size" = EGG_GIRTH_DEF, + "has_breasts" = FALSE, + "breasts_color" = "fff", + "breasts_size" = "C", + "breasts_shape" = "Pair", + "breasts_fluid" = "milk", + "has_vag" = FALSE, + "vag_shape" = "Human", + "vag_color" = "fff", + "vag_clits" = 1, + "vag_clit_diam" = 0.25, + "has_womb" = FALSE, + "womb_cum_rate" = CUM_RATE, + "womb_cum_mult" = CUM_RATE_MULT, + "womb_efficiency" = CUM_EFFICIENCY, + "womb_fluid" = "femcum", + "ipc_screen" = "Sunburst", + "ipc_antenna" = "None", + "flavor_text" = "" + ) var/list/custom_names = list() var/prefered_security_department = SEC_DEPT_RANDOM + var/custom_species = null //Quirk list var/list/positive_quirks = list() @@ -269,6 +342,7 @@ GLOBAL_LIST_EMPTY(preferences_datums) dat += "

Body

" dat += "Gender:[gender == MALE ? "Male" : (gender == FEMALE ? "Female" : (gender == PLURAL ? "Non-binary" : "Object"))]
" dat += "Species:[pref_species.id]
" + dat += "Custom Species Name:[custom_species ? custom_species : "None"]
" dat += "Random Body
" dat += "Always Random Body:[be_random_body ? "Yes" : "No"]
" dat += "
Cycle background:[bgstate]
" @@ -840,9 +914,14 @@ GLOBAL_LIST_EMPTY(preferences_datums) dat += "[gear.cost]" if(islist(gear.restricted_roles)) if(gear.restricted_roles.len) - dat += "" - dat += gear.restricted_roles.Join(";") - dat += "" + if(gear.restricted_desc) + dat += "" + dat += gear.restricted_desc + dat += "" + else + dat += "" + dat += gear.restricted_roles.Join(";") + dat += "" dat += "[gear.description]" dat += "" @@ -1456,12 +1535,14 @@ GLOBAL_LIST_EMPTY(preferences_datums) var/newtype = GLOB.species_list[result] pref_species = new newtype() //let's ensure that no weird shit happens on species swapping. + custom_species = null if(!("body_markings" in pref_species.default_features)) features["body_markings"] = "None" if(!("mam_body_markings" in pref_species.default_features)) features["mam_body_markings"] = "None" - if("mam_body_markings" in pref_species.default_features && features["mam_body_markings"] == "None") - features["mam_body_markings"] = "Plain" + if("mam_body_markings" in pref_species.default_features) + if(features["mam_body_markings"] == "None") + features["mam_body_markings"] = "Plain" if("tail_lizard" in pref_species.default_features) features["tail_lizard"] = "Smooth" if(pref_species.id == "felinid") @@ -1477,6 +1558,13 @@ GLOBAL_LIST_EMPTY(preferences_datums) if(features["mcolor3"] == "#000" || (!(MUTCOLORS_PARTSONLY in pref_species.species_traits) && ReadHSV(temp_hsv)[3] < ReadHSV("#202020")[3])) features["mcolor3"] = pref_species.default_color + if("custom_species") + var/new_species = reject_bad_name(input(user, "Choose your species subtype, if unique. This will show up on examinations and health scans. Do not abuse this:", "Character Preference", custom_species) as null|text) + if(new_species) + custom_species = new_species + else + custom_species = null + if("mutant_color") var/new_mutantcolor = input(user, "Choose your character's alien/mutant color:", "Character Preference","#"+features["mcolor"]) as color|null if(new_mutantcolor) @@ -2115,6 +2203,7 @@ GLOBAL_LIST_EMPTY(preferences_datums) character.real_name = nameless ? "[real_name] #[rand(10000, 99999)]" : real_name character.name = character.real_name character.nameless = nameless + character.custom_species = custom_species character.gender = gender character.age = age @@ -2149,6 +2238,7 @@ GLOBAL_LIST_EMPTY(preferences_datums) character.dna.features = features.Copy() character.dna.real_name = character.real_name character.dna.nameless = character.nameless + character.dna.custom_species = character.custom_species if("tail_lizard" in pref_species.default_features) character.dna.species.mutant_bodyparts |= "tail_lizard" diff --git a/code/modules/client/preferences_savefile.dm b/code/modules/client/preferences_savefile.dm index b6210d94b8..39b44f1ab9 100644 --- a/code/modules/client/preferences_savefile.dm +++ b/code/modules/client/preferences_savefile.dm @@ -58,6 +58,11 @@ SAVEFILE UPDATING/VERSIONING - 'Simplified', or rather, more coder-friendly ~Car /datum/preferences/proc/load_preferences() if(!path) return 0 + if(world.time < loadprefcooldown) + if(istype(parent)) + to_chat(parent, "You're attempting to load your preferences a little too fast. Wait half a second, then try again.") + return 0 + loadprefcooldown = world.time + PREF_SAVELOAD_COOLDOWN if(!fexists(path)) return 0 @@ -152,6 +157,11 @@ SAVEFILE UPDATING/VERSIONING - 'Simplified', or rather, more coder-friendly ~Car /datum/preferences/proc/save_preferences() if(!path) return 0 + if(world.time < saveprefcooldown) + if(istype(parent)) + to_chat(parent, "You're attempting to save your preferences a little too fast. Wait half a second, then try again.") + return 0 + saveprefcooldown = world.time + PREF_SAVELOAD_COOLDOWN var/savefile/S = new /savefile(path) if(!S) return 0 @@ -204,6 +214,11 @@ SAVEFILE UPDATING/VERSIONING - 'Simplified', or rather, more coder-friendly ~Car /datum/preferences/proc/load_character(slot) if(!path) return 0 + if(world.time < loadcharcooldown) //This is before the check to see if the filepath exists to ensure that BYOND can't get hung up on read attempts when the hard drive is a little slow + if(istype(parent)) + to_chat(parent, "You're attempting to load your character a little too fast. Wait half a second, then try again.") + return "SLOW THE FUCK DOWN" //the reason this isn't null is to make sure that people don't have their character slots overridden by random chars if they accidentally double-click a slot + loadcharcooldown = world.time + PREF_SAVELOAD_COOLDOWN if(!fexists(path)) return 0 var/savefile/S = new /savefile(path) @@ -236,6 +251,7 @@ SAVEFILE UPDATING/VERSIONING - 'Simplified', or rather, more coder-friendly ~Car //Character S["real_name"] >> real_name S["nameless"] >> nameless + S["custom_species"] >> custom_species S["name_is_always_random"] >> be_random_name S["body_is_always_random"] >> be_random_body S["gender"] >> gender @@ -350,7 +366,7 @@ SAVEFILE UPDATING/VERSIONING - 'Simplified', or rather, more coder-friendly ~Car gender = sanitize_gender(gender, TRUE, TRUE) if(!real_name) real_name = random_unique_name(gender) - + custom_species = reject_bad_name(custom_species) for(var/custom_name_id in GLOB.preferences_custom_names) var/namedata = GLOB.preferences_custom_names[custom_name_id] custom_names[custom_name_id] = reject_bad_name(custom_names[custom_name_id],namedata["allow_numbers"]) @@ -417,6 +433,11 @@ SAVEFILE UPDATING/VERSIONING - 'Simplified', or rather, more coder-friendly ~Car /datum/preferences/proc/save_character() if(!path) return 0 + if(world.time < savecharcooldown) + if(istype(parent)) + to_chat(parent, "You're attempting to save your character a little too fast. Wait half a second, then try again.") + return 0 + savecharcooldown = world.time + PREF_SAVELOAD_COOLDOWN var/savefile/S = new /savefile(path) if(!S) return 0 @@ -427,6 +448,7 @@ SAVEFILE UPDATING/VERSIONING - 'Simplified', or rather, more coder-friendly ~Car //Character WRITE_FILE(S["real_name"] , real_name) WRITE_FILE(S["nameless"] , nameless) + WRITE_FILE(S["custom_species"] , custom_species) WRITE_FILE(S["name_is_always_random"] , be_random_name) WRITE_FILE(S["body_is_always_random"] , be_random_body) WRITE_FILE(S["gender"] , gender) diff --git a/code/modules/clothing/head/jobs.dm b/code/modules/clothing/head/jobs.dm index b1503f26fb..b6c5a5417a 100644 --- a/code/modules/clothing/head/jobs.dm +++ b/code/modules/clothing/head/jobs.dm @@ -26,7 +26,7 @@ icon_state = "captain" item_state = "that" flags_inv = 0 - armor = list("melee" = 25, "bullet" = 15, "laser" = 25, "energy" = 10, "bomb" = 25, "bio" = 0, "rad" = 0, "fire" = 50, "acid" = 50) + armor = list("melee" = 40, "bullet" = 30, "laser" = 30, "energy" = 10, "bomb" = 25, "bio" = 0, "rad" = 0, "fire" = 50, "acid" = 50) strip_delay = 60 dog_fashion = /datum/dog_fashion/head/captain @@ -50,7 +50,7 @@ name = "head of personnel's cap" icon_state = "hopcap" desc = "The symbol of true bureaucratic micromanagement." - armor = list("melee" = 25, "bullet" = 15, "laser" = 25, "energy" = 10, "bomb" = 25, "bio" = 0, "rad" = 0, "fire" = 50, "acid" = 50) + armor = list("melee" = 30, "bullet" = 25, "laser" = 25, "energy" = 10, "bomb" = 25, "bio" = 0, "rad" = 0, "fire" = 50, "acid" = 50) dog_fashion = /datum/dog_fashion/head/hop /obj/item/clothing/head/hopcap/beret @@ -200,4 +200,4 @@ /obj/item/clothing/head/beret/qm name = "quartermaster's beret" desc = "This headwear shows off your Cargonian leadership" - icon_state = "qmberet" \ No newline at end of file + icon_state = "qmberet" diff --git a/code/modules/clothing/neck/_neck.dm b/code/modules/clothing/neck/_neck.dm index 8245148096..2dd7c92f08 100644 --- a/code/modules/clothing/neck/_neck.dm +++ b/code/modules/clothing/neck/_neck.dm @@ -171,17 +171,113 @@ icon_state = "stripedbluescarf" item_color = "stripedbluescarf" -/obj/item/clothing/neck/petcollar //don't really wear this though please c'mon seriously guys +/////////// +//COLLARS// +/////////// + +/obj/item/clothing/neck/petcollar name = "pet collar" - desc = "It's for pets. Though you probably could wear it yourself, you'd doubtless be the subject of ridicule." + desc = "It's for pets. Though you probably could wear it yourself, you'd doubtless be the subject of ridicule. It seems to be made out of a polychromic material." icon_state = "petcollar" item_color = "petcollar" + hasprimary = TRUE + primary_color = "#00BBBB" + pocket_storage_component_path = /datum/component/storage/concrete/pockets/small/collar var/tagname = null /obj/item/clothing/neck/petcollar/attack_self(mob/user) tagname = copytext(sanitize(input(user, "Would you like to change the name on the tag?", "Name your new pet", "Spot") as null|text),1,MAX_NAME_LEN) name = "[initial(name)] - [tagname]" +/obj/item/clothing/neck/petcollar/worn_overlays(isinhands, icon_file) + . = ..() + if(hasprimary | hassecondary | hastertiary) + if(!isinhands) //prevents the worn sprites from showing up if you're just holding them + if(hasprimary) //checks if overlays are enabled + var/mutable_appearance/primary_worn = mutable_appearance(icon, "[item_color]-primary") //automagical sprite selection + primary_worn.color = primary_color //colors the overlay + . += primary_worn //adds the overlay onto the buffer list to draw on the mob sprite + if(hassecondary) + var/mutable_appearance/secondary_worn = mutable_appearance(icon, "[item_color]-secondary") + secondary_worn.color = secondary_color + . += secondary_worn + if(hastertiary) + var/mutable_appearance/tertiary_worn = mutable_appearance(icon, "[item_color]-tertiary") + tertiary_worn.color = tertiary_color + . += tertiary_worn + +/obj/item/clothing/neck/petcollar/leather + name = "leather pet collar" + icon_state = "leathercollar" + item_color = "leathercollar" + + hasprimary = TRUE + hassecondary = TRUE + primary_color = "#222222" + secondary_color = "#888888" + +/obj/item/clothing/neck/petcollar/choker + desc = "Quite fashionable... if you're somebody who's just read their first BDSM-themed erotica novel." + name = "choker" + icon_state = "choker" + item_color = "choker" + + hasprimary = TRUE + primary_color = "#222222" + +/obj/item/clothing/neck/petcollar/locked + name = "locked collar" + desc = "A collar that has a small lock on it to keep it from being removed." + pocket_storage_component_path = /datum/component/storage/concrete/pockets/small/collar/locked + var/lock = FALSE + +/obj/item/clothing/neck/petcollar/locked/attackby(obj/item/K, mob/user, params) + if(istype(K, /obj/item/key/collar)) + if(lock != FALSE) + to_chat(user, "With a click the collar unlocks!") + lock = FALSE + else + to_chat(user, "With a click the collar locks!") + lock = TRUE + return + +/obj/item/clothing/neck/petcollar/locked/attack_hand(mob/user) + if(loc == user && user.get_item_by_slot(SLOT_NECK) && lock != FALSE) + to_chat(user, "The collar is locked! You'll need unlock the collar before you can take it off!") + return + ..() + +/obj/item/clothing/neck/petcollar/locked/leather + name = "leather pet collar" + icon_state = "leathercollar" + item_color = "leathercollar" + + hasprimary = TRUE + hassecondary = TRUE + primary_color = "#222222" + secondary_color = "#888888" + +/obj/item/clothing/neck/petcollar/locked/choker + name = "choker" + desc = "Quite fashionable... if you're somebody who's just read their first BDSM-themed erotica novel." + icon_state = "choker" + item_color = "choker" + + hasprimary = TRUE + primary_color = "#222222" + +/obj/item/key/collar + name = "Collar Key" + desc = "A key for a tiny lock on a collar or bag." + +/obj/item/clothing/neck/petcollar/Initialize() + . = ..() + new /obj/item/reagent_containers/food/snacks/cookie(src) + +/obj/item/clothing/neck/petcollar/locked/Initialize() + . = ..() + new /obj/item/key/collar(src) + ////////////// //DOPE BLING// ////////////// @@ -191,4 +287,4 @@ desc = "Damn, it feels good to be a gangster." icon = 'icons/obj/clothing/neck.dmi' icon_state = "bling" - item_color = "bling" \ No newline at end of file + item_color = "bling" diff --git a/code/modules/clothing/spacesuits/hardsuit.dm b/code/modules/clothing/spacesuits/hardsuit.dm index 02982998e1..c061d756b7 100644 --- a/code/modules/clothing/spacesuits/hardsuit.dm +++ b/code/modules/clothing/spacesuits/hardsuit.dm @@ -443,7 +443,6 @@ icon_state = "hardsuit0-medical" item_state = "medical_helm" item_color = "medical" - flags_inv = HIDEMASK|HIDEEARS|HIDEEYES|HIDEFACE|HIDEHAIR|HIDEFACIALHAIR flash_protect = 0 armor = list("melee" = 30, "bullet" = 5, "laser" = 10, "energy" = 5, "bomb" = 10, "bio" = 100, "rad" = 60, "fire" = 60, "acid" = 75) scan_reagents = 1 diff --git a/code/modules/crafting/recipes.dm b/code/modules/crafting/recipes.dm index 750b172286..328141b752 100644 --- a/code/modules/crafting/recipes.dm +++ b/code/modules/crafting/recipes.dm @@ -709,3 +709,14 @@ reqs = list(/obj/item/tank/internals/oxygen/red = 2, /obj/item/extinguisher = 1, /obj/item/pipe = 3, /obj/item/stack/cable_coil = 30)//red oxygen tank so it looks right category = CAT_MISC tools = list(TOOL_WRENCH, TOOL_WELDER, TOOL_WIRECUTTER) + +/datum/crafting_recipe/goldenbox + name = "Gold Plated Toolbox" + result = /obj/item/storage/toolbox/gold_fake + reqs = list(/obj/item/stack/sheet/cardboard = 1, //so we dont null items in crafting + /obj/item/stack/cable_coil = 10, + /obj/item/stack/sheet/mineral/gold = 1, + /obj/item/stock_parts/cell = 1, + /datum/reagent/water = 15) + time = 40 + category = CAT_MISC diff --git a/code/modules/events/vent_clog.dm b/code/modules/events/vent_clog.dm index 75833fc086..72fef4335d 100644 --- a/code/modules/events/vent_clog.dm +++ b/code/modules/events/vent_clog.dm @@ -73,7 +73,7 @@ var/obj/machinery/atmospherics/components/unary/vent = pick(vents) vents -= vent - if(!vent) + if(!vent || vent.welded) return var/turf/T = get_turf(vent) @@ -150,7 +150,7 @@ /datum/round_event/vent_clog/beer/start() for(var/obj/machinery/atmospherics/components/unary/vent in vents) - if(vent && vent.loc) + if(vent && vent.loc && !vent.welded) var/datum/reagents/R = new/datum/reagents(1000) R.my_atom = vent R.add_reagent("beer", reagentsAmount) @@ -165,7 +165,7 @@ /datum/round_event/vent_clog/male/start() for(var/obj/machinery/atmospherics/components/unary/vent in vents) - if(vent && vent.loc) + if(vent && vent.loc && !vent.welded) var/datum/reagents/R = new/datum/reagents(1000) R.my_atom = vent R.add_reagent("semen", reagentsAmount) @@ -180,7 +180,7 @@ /datum/round_event/vent_clog/female/start() for(var/obj/machinery/atmospherics/components/unary/vent in vents) - if(vent && vent.loc) + if(vent && vent.loc && !vent.welded) var/datum/reagents/R = new/datum/reagents(1000) R.my_atom = vent R.add_reagent("femcum", reagentsAmount) @@ -195,7 +195,7 @@ /datum/round_event/vent_clog/plasma_decon/start() for(var/obj/machinery/atmospherics/components/unary/vent in vents) - if(vent && vent.loc) + if(vent && vent.loc && !vent.welded) var/datum/effect_system/smoke_spread/freezing/decon/smoke = new smoke.set_up(7, get_turf(vent), 7) smoke.start() diff --git a/code/modules/events/wizard/race.dm b/code/modules/events/wizard/race.dm index 32b45e46f8..7ea875f152 100644 --- a/code/modules/events/wizard/race.dm +++ b/code/modules/events/wizard/race.dm @@ -5,6 +5,18 @@ max_occurrences = 5 earliest_start = 0 MINUTES +/datum/round_event/wizard/race + var/list/stored_name + var/list/stored_species + var/list/stored_dna + +/datum/round_event/wizard/race/setup() + stored_name = list() + stored_species = list() + stored_dna = list() + endWhen = rand(600,1200) //10 to 20 minutes + ..() + /datum/round_event/wizard/race/start() var/all_the_same = 0 @@ -12,18 +24,35 @@ for(var/speciestype in subtypesof(/datum/species)) var/datum/species/S = new speciestype() - if(!S.dangerous_existence && !S.blacklisted) + if(!S.dangerous_existence && !S.blacklisted && !S.nojumpsuit) //Dangerous Species, Blacklisted Species, and Species who can't wear jumpsuits are blacklisted. all_species += speciestype var/datum/species/new_species = pick(all_species) - if(prob(50)) + if(prob(75)) all_the_same = 1 - for(var/mob/living/carbon/human/H in GLOB.carbon_list) //yes, even the dead + for(var/mob/living/carbon/human/H in GLOB.carbon_list) + var/turf/T = get_turf(H) + if(!T) + continue + if(!is_station_level(T.z)) + continue + stored_name[H] = H.real_name + stored_species[H] = H.dna.species + stored_dna[H] = H.dna.unique_enzymes H.set_species(new_species) H.real_name = H.dna.species.random_name(H.gender,1) H.dna.unique_enzymes = H.dna.generate_unique_enzymes() to_chat(H, "You feel somehow... different?") if(!all_the_same) new_species = pick(all_species) + +/datum/round_event/wizard/race/end() + for(var/mob/living/carbon/human/H in GLOB.carbon_list) + if(!(stored_name[H] && stored_species[H] && stored_dna[H])) + continue + H.set_species(stored_species[H]) + H.real_name = stored_name[H] + H.dna.unique_enzymes = stored_dna[H] + to_chat(H, "You feel back to your normal self again.") \ No newline at end of file diff --git a/code/modules/food_and_drinks/food/snacks_cake.dm b/code/modules/food_and_drinks/food/snacks_cake.dm index 781b021d05..1eeea79410 100644 --- a/code/modules/food_and_drinks/food/snacks_cake.dm +++ b/code/modules/food_and_drinks/food/snacks_cake.dm @@ -54,7 +54,6 @@ tastes = list("cake" = 5, "sweetness" = 2, "carrot" = 1) foodtype = GRAIN | DAIRY | VEGETABLES | SUGAR - /obj/item/reagent_containers/food/snacks/store/cake/brain name = "brain cake" desc = "A squishy cake-thing." @@ -86,7 +85,6 @@ tastes = list("cake" = 4, "cream cheese" = 3) foodtype = GRAIN | DAIRY - /obj/item/reagent_containers/food/snacks/cakeslice/cheese name = "cheese cake slice" desc = "Slice of pure cheestisfaction." @@ -95,7 +93,6 @@ tastes = list("cake" = 4, "cream cheese" = 3) foodtype = GRAIN | DAIRY - /obj/item/reagent_containers/food/snacks/store/cake/orange name = "orange cake" desc = "A cake with added orange." @@ -132,7 +129,6 @@ tastes = list("cake" = 5, "sweetness" = 2, "unbearable sourness" = 2) foodtype = GRAIN | DAIRY | FRUIT | SUGAR - /obj/item/reagent_containers/food/snacks/store/cake/lemon name = "lemon cake" desc = "A cake with added lemon." @@ -143,7 +139,6 @@ tastes = list("cake" = 5, "sweetness" = 2, "sourness" = 2) foodtype = GRAIN | DAIRY | FRUIT | SUGAR - /obj/item/reagent_containers/food/snacks/cakeslice/lemon name = "lemon cake slice" desc = "Just a slice of cake, it is enough for everyone." @@ -163,7 +158,6 @@ tastes = list("cake" = 5, "sweetness" = 1, "chocolate" = 4) foodtype = GRAIN | DAIRY | JUNKFOOD | SUGAR - /obj/item/reagent_containers/food/snacks/cakeslice/chocolate name = "chocolate cake slice" desc = "Just a slice of cake, it is enough for everyone." @@ -172,7 +166,6 @@ tastes = list("cake" = 5, "sweetness" = 1, "chocolate" = 4) foodtype = GRAIN | DAIRY | JUNKFOOD | SUGAR - /obj/item/reagent_containers/food/snacks/store/cake/birthday name = "birthday cake" desc = "Happy Birthday little clown..." @@ -250,5 +243,100 @@ icon_state = "pumpkinspicecakeslice" filling_color = "#FFD700" tastes = list("cake" = 5, "sweetness" = 1, "pumpkin" = 1) - foodtype = GRAIN | DAIRY | VEGETABLES | SUGAR + +/obj/item/reagent_containers/food/snacks/store/cake/bsvc // blackberry strawberries vanilla cake + name = "blackberry and strawberry vanilla cake" + desc = "A plain cake, filled with assortment of blackberries and strawberries!" + icon = 'modular_citadel/icons/obj/food/cake.dmi' + icon_state = "blackbarry_strawberries_cake_vanilla_cake" + slice_path = /obj/item/reagent_containers/food/snacks/cakeslice/bsvc + bonus_reagents = list("nutriment" = 14, "vitamin" = 4) + tastes = list("blackbarry" = 2, "strawberries" = 2, "vanilla" = 2, "sweetness" = 2, "cake" = 3) + foodtype = GRAIN | DAIRY | FRUIT | SUGAR + +/obj/item/reagent_containers/food/snacks/cakeslice/bsvc + name = "blackberry and strawberry vanilla cake slice" + desc = "Just a slice of cake filled with assortment of blackberries and strawberries!" + icon = 'modular_citadel/icons/obj/food/cake.dmi' + icon_state = "blackbarry_strawberries_cake_vanilla_slice" + filling_color = "#FFD700" + tastes = list("blackbarry" = 2, "strawberries" = 2, "vanilla" = 2, "sweetness" = 2,"cake" = 3) + foodtype = GRAIN | DAIRY | FRUIT | SUGAR + +/obj/item/reagent_containers/food/snacks/store/cake/bscc // blackbarry strawberries chocolate cake + name = "blackberry and strawberry chocolate cake" + desc = "A plain cake, filled with assortment of blackberries and strawberries!" + icon = 'modular_citadel/icons/obj/food/cake.dmi' + icon_state = "blackbarry_strawberries_cake_coco_cake" + slice_path = /obj/item/reagent_containers/food/snacks/cakeslice/bscc + bonus_reagents = list("nutriment" = 14, "vitamin" = 4, "cocoa" = 5) + tastes = list("blackberry" = 2, "strawberries" = 2, "chocolate" = 2, "sweetness" = 2,"cake" = 3) + foodtype = GRAIN | DAIRY | FRUIT | SUGAR + +/obj/item/reagent_containers/food/snacks/cakeslice/bscc + name = "blackberry and strawberry chocolate cake slice" + desc = "Just a slice of cake filled with assortment of blackberries and strawberries!" + icon = 'modular_citadel/icons/obj/food/cake.dmi' + icon_state = "blackbarry_strawberries_cake_coco_cake_slice" + filling_color = "#FFD700" + tastes = list("blackberry" = 2, "strawberries" = 2, "chocolate" = 2, "sweetness" = 2,"cake" = 3) + foodtype = GRAIN | DAIRY | FRUIT | SUGAR + +obj/item/reagent_containers/food/snacks/store/cake/holy_cake + name = "angel food cake" + desc = "A cake made for angels and chaplains alike! Contains holy water." + icon = 'modular_citadel/icons/obj/food/cake.dmi' + icon_state = "holy_cake" + slice_path = /obj/item/reagent_containers/food/snacks/cakeslice/holy_cake_slice + bonus_reagents = list("nutriment" = 1, "vitamin" = 3, "holy_water" = 10) + tastes = list("cake" = 5, "sweetness" = 1, "clouds" = 1) + foodtype = GRAIN | DAIRY | SUGAR + +/obj/item/reagent_containers/food/snacks/cakeslice/holy_cake_slice + name = "angel food cake slice" + desc = "A slice of heavenly cake." + icon = 'modular_citadel/icons/obj/food/cake.dmi' + icon_state = "holy_cake_slice" + filling_color = "#00FFFF" + tastes = list("cake" = 5, "sweetness" = 1, "clouds" = 1) + foodtype = GRAIN | DAIRY | SUGAR + +obj/item/reagent_containers/food/snacks/store/cake/pound_cake + name = "pound cake" + desc = "A condensed cake made for filling people up quickly." + icon = 'modular_citadel/icons/obj/food/cake.dmi' + icon_state = "pound_cake" + slices_num = 7 //Its ment to feed the party + slice_path = /obj/item/reagent_containers/food/snacks/cakeslice/pound_cake_slice + bonus_reagents = list("nutriment" = 60) + tastes = list("cake" = 5, "sweetness" = 1, "batter" = 1) + foodtype = GRAIN | DAIRY | SUGAR | JUNKFOOD + +/obj/item/reagent_containers/food/snacks/cakeslice/pound_cake_slice + name = "pound cake slice" + desc = "A slice of condensed cake made for filling people up quickly." + icon = 'modular_citadel/icons/obj/food/cake.dmi' + icon_state = "pound_cake_slice" + filling_color = "#00FFFF" + tastes = list("cake" = 5, "sweetness" = 5, "batter" = 1) + foodtype = GRAIN | DAIRY | SUGAR | JUNKFOOD + +obj/item/reagent_containers/food/snacks/store/cake/hardware_cake + name = "hardware cake" + desc = "A cake that is made with electronic boards and leaks acid..." + icon = 'modular_citadel/icons/obj/food/cake.dmi' + icon_state = "hardware_cake" + slice_path = /obj/item/reagent_containers/food/snacks/cakeslice/hardware_cake_slice + bonus_reagents = list("sacid" = 15, "oil" = 15) + tastes = list("acid" = 1, "metal" = 1, "regret" = 10) + foodtype = GRAIN | GROSS + +/obj/item/reagent_containers/food/snacks/cakeslice/hardware_cake_slice + name = "hardware cake slice" + desc = "A slice of electronic boards and some acid." + icon = 'modular_citadel/icons/obj/food/cake.dmi' + icon_state = "hardware_cake_slice" + filling_color = "#00FFFF" + tastes = list("acid" = 1, "metal" = 1, "regret" = 10) + foodtype = GRAIN | GROSS diff --git a/code/modules/food_and_drinks/food/snacks_meat.dm b/code/modules/food_and_drinks/food/snacks_meat.dm index d3466caa5e..cf99bd78d9 100644 --- a/code/modules/food_and_drinks/food/snacks_meat.dm +++ b/code/modules/food_and_drinks/food/snacks_meat.dm @@ -54,6 +54,43 @@ tastes = list("fish" = 1, "chips" = 1) foodtype = MEAT | VEGETABLES | FRIED +/obj/item/reagent_containers/food/snacks/sushi_basic + name = "funa hosomaki" + desc = "A small cylindrical kudzu skin, filled with rice and fish." + icon = 'modular_citadel/icons/obj/food/food.dmi' + icon_state = "sushie_basic" + bonus_reagents = list("vitamin" = 2) + list_reagents = list("nutriment" = 4) + bitesize = 10 + filling_color = "#F2EEEA" //rgb(242, 238, 234) + tastes = list("fish" = 1, "rice" = 2, "salt" = 1) + foodtype = MEAT | VEGETABLES + +/obj/item/reagent_containers/food/snacks/sushi_adv + name = "funa nigiri" + desc = "A peace of carp lightly placed on some rice." + icon = 'modular_citadel/icons/obj/food/food.dmi' + icon_state = "sushie_adv" + bonus_reagents = list("vitamin" = 2) + list_reagents = list("nutriment" = 6) + bitesize = 10 + filling_color = "#F2EEEA" //rgb(242, 238, 234) + tastes = list("fish" = 2, "rice" = 2, "salt" = 1) + foodtype = MEAT | VEGETABLES + +/obj/item/reagent_containers/food/snacks/sushi_pro + name = "funa nigiri" + desc = "A well prepared peace of the best of the carp fillet placed on rice. Looks fancy and fresh!" + icon = 'modular_citadel/icons/obj/food/food.dmi' + icon_state = "sushie_pro" + bonus_reagents = list("nutriment" = 2, "vitamin" = 2) + list_reagents = list("nutriment" = 6, "vitamin" = 2) + bitesize = 10 + filling_color = "#F2EEEA" //rgb(242, 238, 234) + tastes = list("fish" = 3, "rice" = 2, "salt" = 1) + foodtype = MEAT | VEGETABLES + + ////////////////////////////////////////////MEATS AND ALIKE//////////////////////////////////////////// /obj/item/reagent_containers/food/snacks/tofu diff --git a/code/modules/food_and_drinks/food/snacks_other.dm b/code/modules/food_and_drinks/food/snacks_other.dm index af7a8c06f4..5213cc96e1 100644 --- a/code/modules/food_and_drinks/food/snacks_other.dm +++ b/code/modules/food_and_drinks/food/snacks_other.dm @@ -207,6 +207,16 @@ tastes = list("cobwebs" = 1, "sugar" = 2) foodtype = JUNKFOOD | SUGAR +/obj/item/reagent_containers/food/snacks/tobiko + name = "tobiko" + desc = "Spider eggs wrapped in a thin salted Kudzu pod" + icon = 'modular_citadel/icons/obj/food/food.dmi' + icon_state = "sushie_egg" + list_reagents = list("nutriment" = 6, "vitamin" = 2) + filling_color = "#FF3333" // R225 G051 B051 + tastes = list("seaweed" = 1, "cobwebs" = 1, "salty" = 2) + foodtype = MEAT | VEGETABLES + /obj/item/reagent_containers/food/snacks/chococoin name = "chocolate coin" desc = "A completely edible but nonflippable festive coin." @@ -569,3 +579,12 @@ filling_color = "#A0522D" tastes = list("chocolate" = 1) foodtype = JUNKFOOD | SUGAR + +/obj/item/reagent_containers/food/snacks/riceball + name = "onigiri" + desc = "A ball of rice with some light salt and a wrap of Kudzu skin." + icon = 'modular_citadel/icons/obj/food/food.dmi' + icon_state = "riceball" + list_reagents = list("nutriment" = 6, "sodiumchloride" = 2) + tastes = list("rice" = 3, "salt" = 1) + foodtype = GRAIN diff --git a/code/modules/food_and_drinks/food/snacks_sandwichtoast.dm b/code/modules/food_and_drinks/food/snacks_sandwichtoast.dm index 747f5f7d35..88f8848315 100644 --- a/code/modules/food_and_drinks/food/snacks_sandwichtoast.dm +++ b/code/modules/food_and_drinks/food/snacks_sandwichtoast.dm @@ -102,3 +102,13 @@ list_reagents = list("nutriment" = 2, "vitamin" = 2) tastes = list("bread" = 2) foodtype = GRAIN + +/obj/item/reagent_containers/food/snacks/tuna_sandwich + name = "tuna sandwich" + desc = "Both a salad and a sandwich in one." + icon = 'modular_citadel/icons/obj/food/food.dmi' + icon_state = "tunasandwich" + trash = /obj/item/trash/plate + bonus_reagents = list("nutriment" = 1, "vitamin" = 3) + tastes = list("tuna" = 4, "mayonnaise" = 2, "bread" = 2) + foodtype = GRAIN | MEAT diff --git a/code/modules/food_and_drinks/food/snacks_sushi.dm b/code/modules/food_and_drinks/food/snacks_sushi.dm new file mode 100644 index 0000000000..a4cbc5e344 --- /dev/null +++ b/code/modules/food_and_drinks/food/snacks_sushi.dm @@ -0,0 +1,95 @@ +//////////////////////////Sushi Components/////////////////////// + +/obj/item/reagent_containers/food/snacks/sushi_rice + name = "Sushi Rice" + desc = "A bowl of sticky rice for making sushi." + icon = 'modular_citadel/icons/obj/food/food.dmi' + icon_state = "sushi_rice" + list_reagents = list("sodiumchloride" = 5) + tastes = list("rice" = 5, "salt" = 1) + foodtype = GRAIN + +/obj/item/reagent_containers/food/snacks/sea_weed + name = "Sea Weed Sheet" + desc = "A thin, light salt sheet of plant mater. This is commenly used in sushi recipes," + icon = 'modular_citadel/icons/obj/food/food.dmi' + icon_state = "sea_weed" + list_reagents = list("sodiumchloride" = 2) + tastes = list("plants" = 2, "salt" = 1) + foodtype = VEGETABLES + +/obj/item/reagent_containers/food/snacks/tuna + name = "Canned Tuna" + desc = "A small can of tuna fish beloved by felines." + icon = 'modular_citadel/icons/obj/food/food.dmi' + icon_state = "tuna_can" +//trash = /obj/item/trash/tuna_used //I dont know if I like this idea - A Masked Cat + list_reagents = list("sodiumchloride" = 5, "mercury" = 2) + tastes = list("tuna" = 15, "mercury" = 1, "salt" = 3) + foodtype = MEAT + +//////////////////////////Sushi///////////////////////////////// +/obj/item/reagent_containers/food/snacks/sushie_basic + name = "Funa Hosomaki" + desc = "A small cylindrical filled with rice and fish." + icon = 'modular_citadel/icons/obj/food/food.dmi' + icon_state = "sushie_basic" + bonus_reagents = list("vitamin" = 2) + list_reagents = list("nutriment" = 1) + bitesize = 1 + filling_color = "#F2EEEA" //rgb(242, 238, 234) + tastes = list("fish" = 1, "rice" = 1, "salt" = 1) + foodtype = MEAT | VEGETABLES + +/obj/item/reagent_containers/food/snacks/sushie_adv + name = "Funa Nigiri" + desc = "A pice of carp lightly placed on some rice." + icon = 'modular_citadel/icons/obj/food/food.dmi' + icon_state = "sushie_adv" + bonus_reagents = list("vitamin" = 2) + list_reagents = list("nutriment" = 2) + bitesize = 1 + filling_color = "#F2EEEA" //rgb(242, 238, 234) + tastes = list("fish" = 1, "rice" = 1, "salt" = 1) + foodtype = MEAT | VEGETABLES + +/obj/item/reagent_containers/food/snacks/sushie_pro + name = "Funa Nigiri" + desc = "A well prepared pice of the best of the carp fillet placed on rice. Looks fancy and fresh!" + icon = 'modular_citadel/icons/obj/food/food.dmi' + icon_state = "sushie_pro" + bonus_reagents = list("nutriment" = 1, "vitamin" = 2) + list_reagents = list("nutriment" = 8, "vitamin" = 1) + bitesize = 1 + filling_color = "#F2EEEA" //rgb(242, 238, 234) + tastes = list("fish" = 1, "rice" = 1, "salt" = 1) + foodtype = MEAT | VEGETABLES + +/obj/item/reagent_containers/food/snacks/tobiko + name = "Tobiko" + desc = "Spider eggs wrapped in a thin salted Kudzu pod" + icon = 'modular_citadel/icons/obj/food/food.dmi' + icon_state = "sushie_egg" + list_reagents = list("nutriment" = 3, "vitamin" = 2) + filling_color = "#FF3333" // R225 G051 B051 + tastes = list("seaweed" = 1, "salty" = 2) + foodtype = MEAT | VEGETABLES + +/obj/item/reagent_containers/food/snacks/riceball + name = "Onigiri" + desc = "A ball of rice with some light salt and a wrap of Kudzu skin." + icon = 'modular_citadel/icons/obj/food/food.dmi' + icon_state = "riceball" + list_reagents = list("nutriment" = 5, "sodiumchloride" = 2) + tastes = list("rice" = 4, "salt" = 1) + foodtype = GRAIN + +/obj/item/reagent_containers/food/snacks/sashimi + name = "carp sashimi" + desc = "Celebrate surviving attack from hostile alien lifeforms by hospitalising yourself." + icon_state = "sashimi" + bonus_reagents = list("nutriment" = 1, "capsaicin" = 4, "vitamin" = 4) + list_reagents = list("nutriment" = 6, "capsaicin" = 5) + filling_color = "#FA8072" + tastes = list("fish" = 1, "hot peppers" = 1) + foodtype = MEAT | TOXIC \ No newline at end of file diff --git a/code/modules/food_and_drinks/recipes/tablecraft/recipes_cake.dm b/code/modules/food_and_drinks/recipes/tablecraft/recipes_cake.dm index 01c13abf47..464b8ce26f 100644 --- a/code/modules/food_and_drinks/recipes/tablecraft/recipes_cake.dm +++ b/code/modules/food_and_drinks/recipes/tablecraft/recipes_cake.dm @@ -102,6 +102,52 @@ result = /obj/item/reagent_containers/food/snacks/store/cake/pumpkinspice subcategory = CAT_CAKE +/datum/crafting_recipe/food/holycake + name = "Angel food cake" + reqs = list( + /datum/reagent/water/holywater = 15, + /obj/item/reagent_containers/food/snacks/store/cake/plain = 1 + ) + result = /obj/item/reagent_containers/food/snacks/store/cake/holy_cake + subcategory = CAT_CAKE + +/datum/crafting_recipe/food/poundcake + name = "Pound cake" + reqs = list( + /obj/item/reagent_containers/food/snacks/store/cake/plain = 4 + ) + result = /obj/item/reagent_containers/food/snacks/store/cake/pound_cake + subcategory = CAT_CAKE + +/datum/crafting_recipe/food/hardwarecake + name = "Hardware cake" + reqs = list( + /obj/item/reagent_containers/food/snacks/store/cake/plain = 1, + /obj/item/circuitboard = 2, + /datum/reagent/toxin/acid = 5 + ) + result = /obj/item/reagent_containers/food/snacks/store/cake/hardware_cake + subcategory = CAT_CAKE + +/datum/crafting_recipe/food/bscccake + name = "blackberry and strawberry chocolate cake" + reqs = list( + /obj/item/reagent_containers/food/snacks/store/cake/plain = 1, + /obj/item/reagent_containers/food/snacks/chocolatebar = 2, + /obj/item/reagent_containers/food/snacks/grown/berries = 5 + ) + result = /obj/item/reagent_containers/food/snacks/store/cake/bscc + subcategory = CAT_CAKE + +/datum/crafting_recipe/food/bscvcake + name = "blackberry and strawberry vanilla cake" + reqs = list( + /obj/item/reagent_containers/food/snacks/store/cake/plain = 1, + /obj/item/reagent_containers/food/snacks/grown/berries = 5 + ) + result = /obj/item/reagent_containers/food/snacks/store/cake/bsvc + subcategory = CAT_CAKE + /datum/crafting_recipe/food/cak name = "Living cat/cake hybrid" reqs = list( @@ -114,4 +160,4 @@ /datum/reagent/teslium = 1 //To shock the whole thing into life ) result = /mob/living/simple_animal/pet/cat/cak - subcategory = CAT_CAKE //Cat! Haha, get it? CAT? GET IT??? + subcategory = CAT_CAKE //Cat! Haha, get it? CAT? GET IT? We get it - Love Catpeople diff --git a/code/modules/food_and_drinks/recipes/tablecraft/recipes_meat.dm b/code/modules/food_and_drinks/recipes/tablecraft/recipes_meat.dm index b33d6a520b..c16c7268b9 100644 --- a/code/modules/food_and_drinks/recipes/tablecraft/recipes_meat.dm +++ b/code/modules/food_and_drinks/recipes/tablecraft/recipes_meat.dm @@ -1,5 +1,3 @@ - - ////////////////////////////////////////////////KEBABS//////////////////////////////////////////////// /datum/crafting_recipe/food/humankebab @@ -71,16 +69,6 @@ result = /obj/item/reagent_containers/food/snacks/fishfingers subcategory = CAT_MEAT -/datum/crafting_recipe/food/sashimi - name = "Sashimi" - reqs = list( - /datum/reagent/consumable/soysauce = 5, - /obj/item/reagent_containers/food/snacks/spidereggs = 1, - /obj/item/reagent_containers/food/snacks/carpmeat = 1 - ) - result = /obj/item/reagent_containers/food/snacks/sashimi - subcategory = CAT_MEAT - ////////////////////////////////////////////////MR SPIDER//////////////////////////////////////////////// /datum/crafting_recipe/food/spidereggsham diff --git a/code/modules/food_and_drinks/recipes/tablecraft/recipes_misc.dm b/code/modules/food_and_drinks/recipes/tablecraft/recipes_misc.dm index 3925416560..3dd27ddd01 100644 --- a/code/modules/food_and_drinks/recipes/tablecraft/recipes_misc.dm +++ b/code/modules/food_and_drinks/recipes/tablecraft/recipes_misc.dm @@ -345,3 +345,13 @@ ) result = /obj/item/reagent_containers/food/snacks/salad/ricepudding subcategory = CAT_MISCFOOD + +/datum/crafting_recipe/food/riceball + name = "Onigiri" + reqs = list( + /datum/reagent/consumable/soysauce = 1, + /obj/item/reagent_containers/food/snacks/grown/kudzupod = 1, + /obj/item/reagent_containers/food/snacks/salad/boiledrice = 1 + ) + result = /obj/item/reagent_containers/food/snacks/riceball + subcategory = CAT_MISCFOOD diff --git a/code/modules/food_and_drinks/recipes/tablecraft/recipes_sandwich.dm b/code/modules/food_and_drinks/recipes/tablecraft/recipes_sandwich.dm index 9750e91930..a2e83a09b4 100644 --- a/code/modules/food_and_drinks/recipes/tablecraft/recipes_sandwich.dm +++ b/code/modules/food_and_drinks/recipes/tablecraft/recipes_sandwich.dm @@ -62,5 +62,13 @@ result = /obj/item/reagent_containers/food/snacks/notasandwich subcategory = CAT_SANDWICH - - +/datum/crafting_recipe/food/notasandwich + name = "Tuna sandwich" + reqs = list( + /obj/item/reagent_containers/food/snacks/breadslice/plain = 2, + /obj/item/reagent_containers/food/snacks/tuna = 1, + /obj/item/reagent_containers/food/snacks/grown/onion = 1, + /obj/item/reagent_containers/food/condiment/mayonnaise = 5 + ) + result = /obj/item/reagent_containers/food/snacks/tuna_sandwich + subcategory = CAT_SANDWICH diff --git a/code/modules/food_and_drinks/recipes/tablecraft/recipes_sushi.dm b/code/modules/food_and_drinks/recipes/tablecraft/recipes_sushi.dm new file mode 100644 index 0000000000..99d48cf69d --- /dev/null +++ b/code/modules/food_and_drinks/recipes/tablecraft/recipes_sushi.dm @@ -0,0 +1,94 @@ +//////////////////////////Sushi Components/////////////////////// + +/datum/crafting_recipe/food/sushi_rice + name = "Sushi Rice" + reqs = list( + /datum/reagent/water = 40, + /datum/reagent/consumable/rice = 10 + ) + result = /obj/item/reagent_containers/food/snacks/sushi_rice + subcategory = CAT_SUSHI + +/datum/crafting_recipe/food/sea_weed + name = "Sea Weed Sheet" + reqs = list( + /datum/reagent/water = 30, + /datum/reagent/consumable/soysauce = 5, + /obj/item/reagent_containers/food/snacks/grown/kudzupod = 1, + ) + result = /obj/item/reagent_containers/food/snacks/sea_weed + subcategory = CAT_SUSHI + +/datum/crafting_recipe/food/tuna_can + name = "Can of Tuna" + reqs = list( + /datum/reagent/consumable/sodiumchloride = 15, + /datum/reagent/consumable/cooking_oil = 5, + /obj/item/reagent_containers/food/snacks/carpmeat = 1, + ) + result = /obj/item/reagent_containers/food/snacks/tuna + subcategory = CAT_SUSHI + +//////////////////////////Sushi///////////////////////////////// + +/datum/crafting_recipe/food/sashimi + name = "Sashimi" + reqs = list( + /datum/reagent/consumable/soysauce = 5, + /obj/item/reagent_containers/food/snacks/spidereggs = 1, + /obj/item/reagent_containers/food/snacks/carpmeat = 1 + ) + result = /obj/item/reagent_containers/food/snacks/sashimi + subcategory = CAT_SUSHI + +/datum/crafting_recipe/food/riceball + name = "Onigiri" + reqs = list( + /datum/reagent/consumable/soysauce = 1, + /obj/item/reagent_containers/food/snacks/sea_weed = 1, + /obj/item/reagent_containers/food/snacks/sushi_rice = 1 + ) + result = /obj/item/reagent_containers/food/snacks/riceball + subcategory = CAT_SUSHI + +/datum/crafting_recipe/food/sushie_egg + name = "Tobiko" + reqs = list( + /datum/reagent/consumable/soysauce = 6, + /obj/item/reagent_containers/food/snacks/spidereggs = 1, + /obj/item/reagent_containers/food/snacks/sea_weed = 2, + ) + result = /obj/item/reagent_containers/food/snacks/tobiko + subcategory = CAT_SUSHI + +/datum/crafting_recipe/food/sushie_basic + name = "Funa Hosomaki" + reqs = list( + /datum/reagent/consumable/soysauce = 3, + /obj/item/reagent_containers/food/snacks/sushi_rice = 1, + /obj/item/reagent_containers/food/snacks/carpmeat = 2, + /obj/item/reagent_containers/food/snacks/sea_weed = 3, + ) + result = /obj/item/reagent_containers/food/snacks/sushie_basic + subcategory = CAT_SUSHI + +/datum/crafting_recipe/food/sushie_adv + name = "Funa Nigiri" + reqs = list( + /datum/reagent/consumable/soysauce = 5, + /obj/item/reagent_containers/food/snacks/sushi_rice = 1, + /obj/item/reagent_containers/food/snacks/carpmeat = 1 + ) + result = /obj/item/reagent_containers/food/snacks/sushie_adv + subcategory = CAT_SUSHI + +/datum/crafting_recipe/food/sushie_pro + name = "Well made Funa Nigiri" + reqs = list( + /datum/reagent/consumable/soysauce = 10, + /obj/item/reagent_containers/food/snacks/sushi_rice = 2, + /obj/item/reagent_containers/food/snacks/carpmeat = 5, + /obj/item/reagent_containers/food/snacks/sea_weed = 1 + ) + result = /obj/item/reagent_containers/food/snacks/sushie_pro + subcategory = CAT_SUSHI diff --git a/code/modules/hydroponics/biogenerator.dm b/code/modules/hydroponics/biogenerator.dm index e1eb976966..eaffeaf016 100644 --- a/code/modules/hydroponics/biogenerator.dm +++ b/code/modules/hydroponics/biogenerator.dm @@ -304,6 +304,8 @@ else if(href_list["create"]) var/amount = (text2num(href_list["amount"])) + //Can't be outside these (if you change this keep a sane limit) + amount = CLAMP(amount, 1, 50) var/datum/design/D = locate(href_list["create"]) create_product(D, amount) updateUsrDialog() diff --git a/code/modules/integrated_electronics/core/assemblies.dm b/code/modules/integrated_electronics/core/assemblies.dm index 1a4bb1fb1b..3862967363 100644 --- a/code/modules/integrated_electronics/core/assemblies.dm +++ b/code/modules/integrated_electronics/core/assemblies.dm @@ -643,6 +643,11 @@ icon_state = "setup_small_pda" desc = "It's a case, for building small electronics with. This one resembles a PDA." +/obj/item/electronic_assembly/dildo + name = "type-g electronic assembly" + icon_state = "setup_dildo_medium" + desc = "It's a case, for building small electronics with. This one has a phallic design." + /obj/item/electronic_assembly/small name = "electronic device" icon_state = "setup_device" @@ -674,6 +679,11 @@ icon_state = "setup_device_box" desc = "It's a case, for building tiny-sized electronics with. This one has a boxy design." +/obj/item/electronic_assembly/small/dildo + name = "type-f electronic device" + icon_state = "setup_dildo_small" + desc = "It's a case, for building tiny-sized electronics with. This one has a phallic design." + /obj/item/electronic_assembly/medium name = "electronic mechanism" icon_state = "setup_medium" @@ -714,6 +724,12 @@ icon_state = "setup_medium_radio" desc = "It's a case, for building medium-sized electronics with. This one resembles an old radio." +/obj/item/electronic_assembly/medium/dildo + name = "type-g electronic mechanism" + icon_state = "setup_dildo_large" + desc = "It's a case, for building medium-sized electronics with. This one has a phallic design." + + /obj/item/electronic_assembly/large name = "electronic machine" icon_state = "setup_large" diff --git a/code/modules/integrated_electronics/core/detailer.dm b/code/modules/integrated_electronics/core/detailer.dm index 33f7ef96ad..52739c7940 100644 --- a/code/modules/integrated_electronics/core/detailer.dm +++ b/code/modules/integrated_electronics/core/detailer.dm @@ -25,7 +25,9 @@ "green" = COLOR_ASSEMBLY_GREEN, "light blue" = COLOR_ASSEMBLY_LBLUE, "blue" = COLOR_ASSEMBLY_BLUE, - "purple" = COLOR_ASSEMBLY_PURPLE + "purple" = COLOR_ASSEMBLY_PURPLE, + "pink" = COLOR_ASSEMBLY_PINK, + "custom" = COLOR_ASSEMBLY_WHITE ) /obj/item/integrated_electronics/detailer/Initialize() @@ -43,6 +45,9 @@ if(!color_list[color_choice]) return if(!in_range(src, user)) - return - detail_color = color_list[color_choice] + return + if(color_choice == "custom") + detail_color = input(user,"","Choose Color",detail_color) as color|null + else + detail_color = color_list[color_choice] update_icon() diff --git a/code/modules/integrated_electronics/subtypes/manipulation.dm b/code/modules/integrated_electronics/subtypes/manipulation.dm index c187f49473..682e76a46e 100644 --- a/code/modules/integrated_electronics/subtypes/manipulation.dm +++ b/code/modules/integrated_electronics/subtypes/manipulation.dm @@ -1,139 +1,6 @@ /obj/item/integrated_circuit/manipulation category_text = "Manipulation" -/obj/item/integrated_circuit/manipulation/weapon_firing - name = "weapon firing mechanism" - desc = "This somewhat complicated system allows one to slot in a gun, direct it towards a position, and remotely fire it." - extended_desc = "The firing mechanism can slot in any energy weapon. \ - The first and second inputs need to be numbers which correspond to coordinates for the gun to fire at relative to the machine itself. \ - The 'fire' activator will cause the mechanism to attempt to fire the weapon at the coordinates, if possible. Mode will switch between \ - lethal (TRUE) or stun (FALSE) modes. It uses the internal battery of the weapon itself, not the assembly. If you wish to fire the gun while the circuit is in \ - hand, you will need to use an assembly that is a gun." - complexity = 20 - w_class = WEIGHT_CLASS_SMALL - size = 3 - inputs = list( - "target X rel" = IC_PINTYPE_NUMBER, - "target Y rel" = IC_PINTYPE_NUMBER, - "mode" = IC_PINTYPE_BOOLEAN - ) - outputs = list("reference to gun" = IC_PINTYPE_REF) - activators = list( - "fire" = IC_PINTYPE_PULSE_IN - - ) - var/obj/item/gun/energy/installed_gun = null - spawn_flags = IC_SPAWN_RESEARCH - action_flags = IC_ACTION_COMBAT - power_draw_per_use = 0 - ext_cooldown = 1 - var/mode = FALSE - - var/stun_projectile = null //stun mode projectile type - var/stun_projectile_sound - var/lethal_projectile = null //lethal mode projectile type - var/lethal_projectile_sound - - demands_object_input = TRUE // You can put stuff in once the circuit is in assembly,passed down from additem and handled by attackby() - - - -/obj/item/integrated_circuit/manipulation/weapon_firing/Destroy() - qdel(installed_gun) - return ..() - -/obj/item/integrated_circuit/manipulation/weapon_firing/attackby(var/obj/O, var/mob/user) - if(istype(O, /obj/item/gun/energy)) - var/obj/item/gun/gun = O - if(installed_gun) - to_chat(user, "There's already a weapon installed.") - return - user.transferItemToLoc(gun,src) - installed_gun = gun - var/list/gun_properties = gun.get_turret_properties() - to_chat(user, "You slide \the [gun] into the firing mechanism.") - playsound(src, 'sound/items/Crowbar.ogg', 50, 1) - stun_projectile = gun_properties["stun_projectile"] - stun_projectile_sound = gun_properties["stun_projectile_sound"] - lethal_projectile = gun_properties["lethal_projectile"] - lethal_projectile_sound = gun_properties["lethal_projectile_sound"] - if(gun_properties["shot_delay"]) - cooldown_per_use = gun_properties["shot_delay"]*10 - if(cooldown_per_use<30) - cooldown_per_use = 30 - if(gun_properties["reqpower"]) - power_draw_per_use = gun_properties["reqpower"] - set_pin_data(IC_OUTPUT, 1, WEAKREF(installed_gun)) - push_data() - else - ..() - -/obj/item/integrated_circuit/manipulation/weapon_firing/attack_self(var/mob/user) - if(installed_gun) - installed_gun.forceMove(drop_location()) - to_chat(user, "You slide \the [installed_gun] out of the firing mechanism.") - size = initial(size) - playsound(src, 'sound/items/Crowbar.ogg', 50, 1) - installed_gun = null - set_pin_data(IC_OUTPUT, 1, WEAKREF(null)) - push_data() - else - to_chat(user, "There's no weapon to remove from the mechanism.") - -/obj/item/integrated_circuit/manipulation/weapon_firing/do_work() - if(!installed_gun || !installed_gun.handle_pins()) - return - if(!isturf(assembly.loc) && !(assembly.can_fire_equipped && ishuman(assembly.loc))) - return - set_pin_data(IC_OUTPUT, 1, WEAKREF(installed_gun)) - push_data() - var/datum/integrated_io/xo = inputs[1] - var/datum/integrated_io/yo = inputs[2] - var/datum/integrated_io/mode1 = inputs[3] - - mode = mode1.data - if(assembly) - if(isnum(xo.data)) - xo.data = round(xo.data, 1) - if(isnum(yo.data)) - yo.data = round(yo.data, 1) - - var/turf/T = get_turf(assembly) - var/target_x = CLAMP(T.x + xo.data, 0, world.maxx) - var/target_y = CLAMP(T.y + yo.data, 0, world.maxy) - - assembly.visible_message("[assembly] fires [installed_gun]!") - shootAt(locate(target_x, target_y, T.z)) - -/obj/item/integrated_circuit/manipulation/weapon_firing/proc/shootAt(turf/target) - var/turf/T = get_turf(src) - var/turf/U = target - if(!istype(T) || !istype(U)) - return - if(!installed_gun.cell) - return - if(!installed_gun.cell.charge) - return - var/obj/item/ammo_casing/energy/shot = installed_gun.ammo_type[mode?2:1] - if(installed_gun.cell.charge < shot.e_cost) - return - if(!shot) - return - update_icon() - var/obj/item/projectile/A - if(!mode) - A = new stun_projectile(T) - playsound(loc, stun_projectile_sound, 75, 1) - else - A = new lethal_projectile(T) - playsound(loc, lethal_projectile_sound, 75, 1) - installed_gun.cell.use(shot.e_cost) - //Shooting Code: - A.preparePixelProjectile(target, src) - A.fire() - log_attack("[assembly] [REF(assembly)] has fired [installed_gun].") - return A - /obj/item/integrated_circuit/manipulation/locomotion name = "locomotion circuit" desc = "This allows a machine to move in a given direction." @@ -171,80 +38,6 @@ return FALSE return FALSE -/obj/item/integrated_circuit/manipulation/grenade - name = "grenade primer" - desc = "This circuit comes with the ability to attach most types of grenades and prime them at will." - extended_desc = "The time between priming and detonation is limited to between 1 to 12 seconds, but is optional. \ - If the input is not set, not a number, or a number less than 1, the grenade's built-in timing will be used. \ - Beware: Once primed, there is no aborting the process!" - icon_state = "grenade" - complexity = 30 - cooldown_per_use = 10 - inputs = list("detonation time" = IC_PINTYPE_NUMBER) - outputs = list() - activators = list("prime grenade" = IC_PINTYPE_PULSE_IN) - spawn_flags = IC_SPAWN_RESEARCH - action_flags = IC_ACTION_COMBAT - var/obj/item/grenade/attached_grenade - var/pre_attached_grenade_type - demands_object_input = TRUE // You can put stuff in once the circuit is in assembly,passed down from additem and handled by attackby() - -/obj/item/integrated_circuit/manipulation/grenade/Initialize() - . = ..() - if(pre_attached_grenade_type) - var/grenade = new pre_attached_grenade_type(src) - attach_grenade(grenade) - -/obj/item/integrated_circuit/manipulation/grenade/Destroy() - if(attached_grenade && !attached_grenade.active) - attached_grenade.forceMove(loc) - detach_grenade() - return ..() - -/obj/item/integrated_circuit/manipulation/grenade/attackby(var/obj/item/grenade/G, var/mob/user) - if(istype(G)) - if(attached_grenade) - to_chat(user, "There is already a grenade attached!") - else if(user.transferItemToLoc(G,src)) - user.visible_message("\The [user] attaches \a [G] to \the [src]!", "You attach \the [G] to \the [src].") - attach_grenade(G) - G.forceMove(src) - else - return ..() - -/obj/item/integrated_circuit/manipulation/grenade/attack_self(var/mob/user) - if(attached_grenade) - user.visible_message("\The [user] removes \an [attached_grenade] from \the [src]!", "You remove \the [attached_grenade] from \the [src].") - user.put_in_hands(attached_grenade) - detach_grenade() - else - return ..() - -/obj/item/integrated_circuit/manipulation/grenade/do_work() - if(attached_grenade && !attached_grenade.active) - var/datum/integrated_io/detonation_time = inputs[1] - var/dt - if(isnum(detonation_time.data) && detonation_time.data > 0) - dt = CLAMP(detonation_time.data, 1, 12)*10 - else - dt = 15 - addtimer(CALLBACK(attached_grenade, /obj/item/grenade.proc/prime), dt) - var/atom/holder = loc - message_admins("activated a grenade assembly. Last touches: Assembly: [holder.fingerprintslast] Circuit: [fingerprintslast] Grenade: [attached_grenade.fingerprintslast]") - -// These procs do not relocate the grenade, that's the callers responsibility -/obj/item/integrated_circuit/manipulation/grenade/proc/attach_grenade(var/obj/item/grenade/G) - attached_grenade = G - G.forceMove(src) - desc += " \An [attached_grenade] is attached to it!" - -/obj/item/integrated_circuit/manipulation/grenade/proc/detach_grenade() - if(!attached_grenade) - return - attached_grenade.forceMove(drop_location()) - attached_grenade = null - desc = initial(desc) - /obj/item/integrated_circuit/manipulation/plant_module name = "plant manipulation module" desc = "Used to uproot weeds and harvest/plant trays." @@ -478,7 +271,7 @@ /obj/item/integrated_circuit/manipulation/thrower name = "thrower" - desc = "A compact launcher to throw things from inside or nearby tiles." + desc = "A compact launcher to throw things from inside or nearby tiles at a low enough velocity not to harm someone." extended_desc = "The first and second inputs need to be numbers which correspond to the coordinates to throw objects at relative to the machine itself. \ The 'fire' activator will cause the mechanism to attempt to throw objects at the coordinates, if possible. Note that the \ projectile needs to be inside the machine, or on an adjacent tile, and must be medium sized or smaller. The assembly \ @@ -544,7 +337,7 @@ A.embedding = list("embed_chance" = 0) //throw it assembly.visible_message("[assembly] has thrown [A]!") - log_attack("[assembly] [REF(assembly)] has thrown [A].") + log_attack("[assembly] [REF(assembly)] has thrown [A] with non-lethal force.") A.forceMove(drop_location()) A.throw_at(locate(x_abs, y_abs, T.z), range, 3, , , , CALLBACK(src, .proc/post_throw, A)) @@ -813,4 +606,7 @@ set_pin_data(IC_OUTPUT, 1, assembly.detail_color) push_data() - activate_pin(3) \ No newline at end of file + activate_pin(3) + + + diff --git a/code/modules/integrated_electronics/subtypes/reagents.dm b/code/modules/integrated_electronics/subtypes/reagents.dm index 0d8bf96afc..fb8fce10b2 100644 --- a/code/modules/integrated_electronics/subtypes/reagents.dm +++ b/code/modules/integrated_electronics/subtypes/reagents.dm @@ -548,9 +548,12 @@ desc = "Unlike most electronics, creating smoke is completely intentional." icon_state = "smoke" extended_desc = "This smoke generator creates clouds of smoke on command. It can also hold liquids inside, which will go \ - into the smoke clouds when activated. The reagents are consumed when the smoke is made." + into the smoke clouds when activated. The reagents are consumed when the smoke is made. Requires at least 10 units of reagents to generate smoke." ext_cooldown = 1 + volume = 100 + container_type = OPENCONTAINER + complexity = 20 cooldown_per_use = 1 SECONDS inputs = list() @@ -573,6 +576,7 @@ if(changetype == ADD_REAGENT) notified = FALSE push_vol() + /obj/item/integrated_circuit/reagent/smoke/do_work(ord) switch(ord) if(1) @@ -598,9 +602,10 @@ name = "integrated extinguisher" desc = "This circuit sprays any of its contents out like an extinguisher." icon_state = "injector" - extended_desc = "This circuit can hold up to 30 units of any given chemicals. On each use, it sprays these reagents like a fire extinguisher." + extended_desc = "This circuit can hold up to 30 units of any given chemicals. On each use, it sprays these reagents like a fire extinguisher. Requires at least 10 units of reagents to work." volume = 30 + container_type = OPENCONTAINER complexity = 20 cooldown_per_use = 6 SECONDS @@ -631,7 +636,7 @@ /obj/item/integrated_circuit/reagent/extinguisher/do_work() //Check if enough volume set_pin_data(IC_OUTPUT, 1, reagents.total_volume) - if(!reagents || reagents.total_volume < 5 || busy) + if(!reagents || reagents.total_volume < IC_SMOKE_REAGENTS_MINIMUM_UNITS || busy) push_data() activate_pin(3) return diff --git a/code/modules/integrated_electronics/subtypes/weaponized.dm b/code/modules/integrated_electronics/subtypes/weaponized.dm new file mode 100644 index 0000000000..f9259359a3 --- /dev/null +++ b/code/modules/integrated_electronics/subtypes/weaponized.dm @@ -0,0 +1,343 @@ +/obj/item/integrated_circuit/weaponized + category_text = "Weaponized" + +/obj/item/integrated_circuit/weaponized/weapon_firing + name = "weapon firing mechanism" + desc = "This somewhat complicated system allows one to slot in a gun, direct it towards a position, and remotely fire it." + extended_desc = "The firing mechanism can slot in any energy weapon. \ + The first and second inputs need to be numbers which correspond to coordinates for the gun to fire at relative to the machine itself. \ + The 'fire' activator will cause the mechanism to attempt to fire the weapon at the coordinates, if possible. Mode will switch between \ + lethal (TRUE) or stun (FALSE) modes. It uses the internal battery of the weapon itself, not the assembly. If you wish to fire the gun while the circuit is in \ + hand, you will need to use an assembly that is a gun." + complexity = 20 + w_class = WEIGHT_CLASS_SMALL + size = 3 + inputs = list( + "target X rel" = IC_PINTYPE_NUMBER, + "target Y rel" = IC_PINTYPE_NUMBER, + "mode" = IC_PINTYPE_BOOLEAN + ) + outputs = list("reference to gun" = IC_PINTYPE_REF) + activators = list( + "fire" = IC_PINTYPE_PULSE_IN + + ) + var/obj/item/gun/energy/installed_gun = null + spawn_flags = IC_SPAWN_RESEARCH + action_flags = IC_ACTION_COMBAT + power_draw_per_use = 0 + ext_cooldown = 1 + var/mode = FALSE + + var/stun_projectile = null //stun mode projectile type + var/stun_projectile_sound + var/lethal_projectile = null //lethal mode projectile type + var/lethal_projectile_sound + + demands_object_input = TRUE // You can put stuff in once the circuit is in assembly,passed down from additem and handled by attackby() + + + +/obj/item/integrated_circuit/weaponized/weapon_firing/Destroy() + qdel(installed_gun) + return ..() + +/obj/item/integrated_circuit/weaponized/weapon_firing/attackby(var/obj/O, var/mob/user) + if(istype(O, /obj/item/gun/energy)) + var/obj/item/gun/gun = O + if(installed_gun) + to_chat(user, "There's already a weapon installed.") + return + user.transferItemToLoc(gun,src) + installed_gun = gun + var/list/gun_properties = gun.get_turret_properties() + to_chat(user, "You slide \the [gun] into the firing mechanism.") + playsound(src, 'sound/items/Crowbar.ogg', 50, 1) + stun_projectile = gun_properties["stun_projectile"] + stun_projectile_sound = gun_properties["stun_projectile_sound"] + lethal_projectile = gun_properties["lethal_projectile"] + lethal_projectile_sound = gun_properties["lethal_projectile_sound"] + if(gun_properties["shot_delay"]) + cooldown_per_use = gun_properties["shot_delay"]*10 + if(cooldown_per_use<30) + cooldown_per_use = 30 + if(gun_properties["reqpower"]) + power_draw_per_use = gun_properties["reqpower"] + set_pin_data(IC_OUTPUT, 1, WEAKREF(installed_gun)) + push_data() + else + ..() + +/obj/item/integrated_circuit/weaponized/weapon_firing/attack_self(var/mob/user) + if(installed_gun) + installed_gun.forceMove(drop_location()) + to_chat(user, "You slide \the [installed_gun] out of the firing mechanism.") + size = initial(size) + playsound(src, 'sound/items/Crowbar.ogg', 50, 1) + installed_gun = null + set_pin_data(IC_OUTPUT, 1, WEAKREF(null)) + push_data() + else + to_chat(user, "There's no weapon to remove from the mechanism.") + +/obj/item/integrated_circuit/weaponized/weapon_firing/do_work() + if(!installed_gun || !installed_gun.handle_pins()) + return + if(!isturf(assembly.loc) && !(assembly.can_fire_equipped && ishuman(assembly.loc))) + return + set_pin_data(IC_OUTPUT, 1, WEAKREF(installed_gun)) + push_data() + var/datum/integrated_io/xo = inputs[1] + var/datum/integrated_io/yo = inputs[2] + var/datum/integrated_io/mode1 = inputs[3] + + mode = mode1.data + if(assembly) + if(isnum(xo.data)) + xo.data = round(xo.data, 1) + if(isnum(yo.data)) + yo.data = round(yo.data, 1) + + var/turf/T = get_turf(assembly) + var/target_x = CLAMP(T.x + xo.data, 0, world.maxx) + var/target_y = CLAMP(T.y + yo.data, 0, world.maxy) + + assembly.visible_message("[assembly] fires [installed_gun]!") + shootAt(locate(target_x, target_y, T.z)) + +/obj/item/integrated_circuit/weaponized/weapon_firing/proc/shootAt(turf/target) + var/turf/T = get_turf(src) + var/turf/U = target + if(!istype(T) || !istype(U)) + return + if(!installed_gun.cell) + return + if(!installed_gun.cell.charge) + return + var/obj/item/ammo_casing/energy/shot = installed_gun.ammo_type[mode?2:1] + if(installed_gun.cell.charge < shot.e_cost) + return + if(!shot) + return + update_icon() + var/obj/item/projectile/A + if(!mode) + A = new stun_projectile(T) + playsound(loc, stun_projectile_sound, 75, 1) + else + A = new lethal_projectile(T) + playsound(loc, lethal_projectile_sound, 75, 1) + installed_gun.cell.use(shot.e_cost) + //Shooting Code: + A.preparePixelProjectile(target, src) + A.fire() + log_attack("[assembly] [REF(assembly)] has fired [installed_gun].") + return A + +/obj/item/integrated_circuit/weaponized/grenade + name = "grenade primer" + desc = "This circuit comes with the ability to attach most types of grenades and prime them at will." + extended_desc = "The time between priming and detonation is limited to between 1 to 12 seconds, but is optional. \ + If the input is not set, not a number, or a number less than 1, the grenade's built-in timing will be used. \ + Beware: Once primed, there is no aborting the process!" + icon_state = "grenade" + complexity = 30 + cooldown_per_use = 10 + inputs = list("detonation time" = IC_PINTYPE_NUMBER) + outputs = list() + activators = list("prime grenade" = IC_PINTYPE_PULSE_IN) + spawn_flags = IC_SPAWN_RESEARCH + action_flags = IC_ACTION_COMBAT + var/obj/item/grenade/attached_grenade + var/pre_attached_grenade_type + demands_object_input = TRUE // You can put stuff in once the circuit is in assembly,passed down from additem and handled by attackby() + +/obj/item/integrated_circuit/weaponized/grenade/Initialize() + . = ..() + if(pre_attached_grenade_type) + var/grenade = new pre_attached_grenade_type(src) + attach_grenade(grenade) + +/obj/item/integrated_circuit/weaponized/grenade/Destroy() + if(attached_grenade && !attached_grenade.active) + attached_grenade.forceMove(loc) + detach_grenade() + return ..() + +/obj/item/integrated_circuit/weaponized/grenade/attackby(var/obj/item/grenade/G, var/mob/user) + if(istype(G)) + if(attached_grenade) + to_chat(user, "There is already a grenade attached!") + else if(user.transferItemToLoc(G,src)) + user.visible_message("\The [user] attaches \a [G] to \the [src]!", "You attach \the [G] to \the [src].") + attach_grenade(G) + G.forceMove(src) + else + return ..() + +/obj/item/integrated_circuit/weaponized/grenade/attack_self(var/mob/user) + if(attached_grenade) + user.visible_message("\The [user] removes \an [attached_grenade] from \the [src]!", "You remove \the [attached_grenade] from \the [src].") + user.put_in_hands(attached_grenade) + detach_grenade() + else + return ..() + +/obj/item/integrated_circuit/weaponized/grenade/do_work() + if(attached_grenade && !attached_grenade.active) + var/datum/integrated_io/detonation_time = inputs[1] + var/dt + if(isnum(detonation_time.data) && detonation_time.data > 0) + dt = CLAMP(detonation_time.data, 1, 12)*10 + else + dt = 15 + addtimer(CALLBACK(attached_grenade, /obj/item/grenade.proc/prime), dt) + var/atom/holder = loc + message_admins("activated a grenade assembly. Last touches: Assembly: [holder.fingerprintslast] Circuit: [fingerprintslast] Grenade: [attached_grenade.fingerprintslast]") + +// These procs do not relocate the grenade, that's the callers responsibility +/obj/item/integrated_circuit/weaponized/grenade/proc/attach_grenade(var/obj/item/grenade/G) + attached_grenade = G + G.forceMove(src) + desc += " \An [attached_grenade] is attached to it!" + +/obj/item/integrated_circuit/weaponized/grenade/proc/detach_grenade() + if(!attached_grenade) + return + attached_grenade.forceMove(drop_location()) + attached_grenade = null + desc = initial(desc) + +/obj/item/integrated_circuit/weaponized/air_cannon + name = "pneumatic cannon" + desc = "A compact pneumatic cannon to throw things from inside or nearby tiles at a high enough velocity to cause damage. Requires air from a canister to fire." + extended_desc = "The first and second inputs need to be numbers which correspond to the coordinates to throw objects at relative to the machine itself. \ + The 'fire' activator will cause the mechanism to attempt to launch objects at the coordinates, if possible. Note that the \ + projectile needs to be inside the machine, or on an adjacent tile, and must be medium sized or smaller. The assembly \ + must also be a gun if you wish to launch something while the assembly is in hand." + complexity = 75 + w_class = WEIGHT_CLASS_SMALL + size = 4 + cooldown_per_use = 30 + ext_cooldown = 15 + inputs = list( + "target X rel" = IC_PINTYPE_NUMBER, + "target Y rel" = IC_PINTYPE_NUMBER, + "projectile" = IC_PINTYPE_REF, + "canister" = IC_PINTYPE_REF + ) + outputs = list() + activators = list( + "fire" = IC_PINTYPE_PULSE_IN + ) + spawn_flags = IC_SPAWN_RESEARCH + action_flags = IC_ACTION_COMBAT + power_draw_per_use = 50 + var/gas_per_throw = 6 + +/obj/item/integrated_circuit/weaponized/air_cannon/do_work() + + var/max_w_class = assembly.w_class + var/target_x_rel = round(get_pin_data(IC_INPUT, 1)) + var/target_y_rel = round(get_pin_data(IC_INPUT, 2)) + var/obj/item/A = get_pin_data_as_type(IC_INPUT, 3, /obj/item) + var/obj/item/integrated_circuit/atmospherics/AT = get_pin_data_as_type(IC_INPUT, 4, /obj/item/integrated_circuit/atmospherics) + + if(!A || A.anchored || A.throwing || A == assembly || istype(A, /obj/item/twohanded) || istype(A, /obj/item/transfer_valve)) + return + + if(!AT || !AT.air_contents) + return + + if (istype(assembly.loc, /obj/item/implant/storage)) //Prevents the more abusive form of chestgun. + return + + if(max_w_class && (A.w_class > max_w_class)) + return + + if(!assembly.can_fire_equipped && ishuman(assembly.loc)) + return + + // Is the target inside the assembly or close to it? + if(!check_target(A, exclude_components = TRUE)) + return + + var/turf/T = get_turf(get_object()) + if(!T) + return + + // If the item is in mob's inventory, try to remove it from there. + if(ismob(A.loc)) + var/mob/living/M = A.loc + if(!M.temporarilyRemoveItemFromInventory(A)) + return + + var/datum/gas_mixture/source_air = AT.return_air() + var/datum/gas_mixture/target_air = T.return_air() + + if(!source_air || !target_air) + return + + var/datum/gas_mixture/removed = source_air.remove(gas_per_throw) + if(!removed) + return + target_air.merge(removed) + + // If the item is in a grabber circuit we'll update the grabber's outputs after we've thrown it. + var/obj/item/integrated_circuit/manipulation/grabber/G = A.loc + + var/x_abs = CLAMP(T.x + target_x_rel, 0, world.maxx) + var/y_abs = CLAMP(T.y + target_y_rel, 0, world.maxy) + var/range = round(CLAMP(sqrt(target_x_rel*target_x_rel+target_y_rel*target_y_rel),0,8),1) + assembly.visible_message("\The [assembly] has thrown [A]!") + log_attack("[assembly] [REF(assembly)] has thrown [A] with lethal force.") + A.forceMove(drop_location()) + A.throw_at(locate(x_abs, y_abs, T.z), range, 3) + + air_update_turf() + + // If the item came from a grabber now we can update the outputs since we've thrown it. + if(istype(G)) + G.update_outputs() + + +/obj/item/integrated_circuit/weaponized/stun + name = "electronic stun module" + desc = "Used to stun a target holding the device via electricity." + icon_state = "power_relay" + extended_desc = "Attempts to stun the holder of this device, with the strength input being the strength of the stun, from 1 to 70." + complexity = 60 + size = 4 + inputs = list("strength" = IC_PINTYPE_NUMBER) + activators = list("stun" = IC_PINTYPE_PULSE_IN, "on success" = IC_PINTYPE_PULSE_OUT, "on fail" = IC_PINTYPE_PULSE_OUT) + spawn_flags = IC_SPAWN_RESEARCH + power_draw_per_use = 2000 + cooldown_per_use = 50 + ext_cooldown = 25 + + +/obj/item/integrated_circuit/weaponized/stun/do_work() + var/stunforce = CLAMP(get_pin_data(IC_INPUT, 1),1,70) + var/mob/living/L = assembly.loc + if(attempt_stun(L,stunforce)) + activate_pin(2) + else + activate_pin(3) + +/obj/item/integrated_circuit/weaponized/proc/attempt_stun(var/mob/living/L,var/stunforce = 70) //Copied from stunbaton code. + + if(!L || !isliving(L)) + return 0 + + L.Knockdown(stunforce) + SEND_SIGNAL(L, COMSIG_LIVING_MINOR_SHOCK) + + message_admins("stunned someone with an assembly. Last touches: Assembly: [assembly.fingerprintslast] Circuit: [fingerprintslast]") + + L.visible_message("\The [assembly] has stunned \the [L] with \the [src]!", "\The [assembly] has stunned you with \the [src]!") + playsound(loc, 'sound/weapons/egloves.ogg', 50, 1, -1) + if(ishuman(L)) + var/mob/living/carbon/human/H = L + H.forcesay(GLOB.hit_appends) + + return 1 \ No newline at end of file diff --git a/code/modules/jobs/job_types/cargo_service.dm b/code/modules/jobs/job_types/cargo_service.dm index 053373c05a..22ef2a9211 100644 --- a/code/modules/jobs/job_types/cargo_service.dm +++ b/code/modules/jobs/job_types/cargo_service.dm @@ -110,7 +110,7 @@ Shaft Miner /datum/outfit/job/miner/equipped name = "Shaft Miner (Lavaland + Equipment)" - suit = /obj/item/clothing/suit/hooded/explorer + suit = /obj/item/clothing/suit/hooded/explorer/standard mask = /obj/item/clothing/mask/gas/explorer glasses = /obj/item/clothing/glasses/meson suit_store = /obj/item/tank/internals/oxygen diff --git a/code/modules/mining/equipment/explorer_gear.dm b/code/modules/mining/equipment/explorer_gear.dm index dec574566f..2c35c3148f 100644 --- a/code/modules/mining/equipment/explorer_gear.dm +++ b/code/modules/mining/equipment/explorer_gear.dm @@ -15,6 +15,7 @@ resistance_flags = FIRE_PROOF tauric = TRUE //Citadel Add for tauric hardsuits + /obj/item/clothing/head/hooded/explorer name = "explorer hood" desc = "An armoured hood for exploring harsh environments." @@ -26,11 +27,15 @@ armor = list("melee" = 30, "bullet" = 20, "laser" = 20, "energy" = 20, "bomb" = 50, "bio" = 100, "rad" = 50, "fire" = 50, "acid" = 50) resistance_flags = FIRE_PROOF -/obj/item/clothing/suit/hooded/explorer/Initialize() +/obj/item/clothing/suit/hooded/explorer/standard + +/obj/item/clothing/head/hooded/explorer/standard + +/obj/item/clothing/suit/hooded/explorer/standard/Initialize() . = ..() AddComponent(/datum/component/armor_plate) -/obj/item/clothing/head/hooded/explorer/Initialize() +/obj/item/clothing/head/hooded/explorer/standard/Initialize() . = ..() AddComponent(/datum/component/armor_plate) @@ -176,4 +181,4 @@ desc = "A face-covering mask that can be connected to an air supply. Intended for use with the Exosuit." icon_state = "exo" item_state = "exo" - resistance_flags = FIRE_PROOF \ No newline at end of file + resistance_flags = FIRE_PROOF diff --git a/code/modules/mining/machine_vending.dm b/code/modules/mining/machine_vending.dm index 79270ebf63..aed90cebdf 100644 --- a/code/modules/mining/machine_vending.dm +++ b/code/modules/mining/machine_vending.dm @@ -22,11 +22,11 @@ new /datum/data/mining_equipment("Alien Toy", /obj/item/clothing/mask/facehugger/toy, 300), new /datum/data/mining_equipment("Fulton Beacon", /obj/item/fulton_core, 400), new /datum/data/mining_equipment("Shelter Capsule", /obj/item/survivalcapsule, 400), + new /datum/data/mining_equipment("Survival Knife", /obj/item/kitchen/knife/combat/survival, 450), new /datum/data/mining_equipment("GAR Meson Scanners", /obj/item/clothing/glasses/meson/gar, 500), new /datum/data/mining_equipment("Explorer's Webbing", /obj/item/storage/belt/mining, 500), new /datum/data/mining_equipment("Larger Ore Bag", /obj/item/storage/bag/ore/large, 500), new /datum/data/mining_equipment("500 Point Transfer Card", /obj/item/card/mining_point_card/mp500, 500), - new /datum/data/mining_equipment("Brute First-Aid Kit", /obj/item/storage/firstaid/brute, 600), new /datum/data/mining_equipment("Tracking Implant Kit", /obj/item/storage/box/minertracker, 600), new /datum/data/mining_equipment("Survival Medipen", /obj/item/reagent_containers/hypospray/medipen/survival, 750), new /datum/data/mining_equipment("Stabilizing Serum", /obj/item/hivelordstabilizer, 750), @@ -50,9 +50,11 @@ new /datum/data/mining_equipment("Space Cash", /obj/item/stack/spacecash/c1000, 2000), new /datum/data/mining_equipment("Mining Hardsuit", /obj/item/clothing/suit/space/hardsuit/mining, 2000), new /datum/data/mining_equipment("Diamond Pickaxe", /obj/item/pickaxe/diamond, 2000), + new /datum/data/mining_equipment("Spare Suit Voucher", /obj/item/suit_voucher, 2000), new /datum/data/mining_equipment("Super Resonator", /obj/item/resonator/upgraded, 2500), new /datum/data/mining_equipment("Jump Boots", /obj/item/clothing/shoes/bhop, 2500), new /datum/data/mining_equipment("Luxury Shelter Capsule", /obj/item/survivalcapsule/luxury, 3000), + new /datum/data/mining_equipment("Miner Full Replacement", /obj/item/storage/backpack/duffelbag/mining_cloned, 3000), new /datum/data/mining_equipment("Nanotrasen Minebot", /mob/living/simple_animal/hostile/mining_drone, 800), new /datum/data/mining_equipment("Minebot Melee Upgrade", /obj/item/mine_bot_upgrade, 400), new /datum/data/mining_equipment("Minebot Armor Upgrade", /obj/item/mine_bot_upgrade/health, 400), @@ -67,9 +69,7 @@ new /datum/data/mining_equipment("KA Damage Increase", /obj/item/borg/upgrade/modkit/damage, 1000), new /datum/data/mining_equipment("KA Cooldown Decrease", /obj/item/borg/upgrade/modkit/cooldown, 1000), new /datum/data/mining_equipment("KA AoE Damage", /obj/item/borg/upgrade/modkit/aoe/mobs, 2000), - new /datum/data/mining_equipment("Premium Accelerator", /obj/item/gun/energy/kinetic_accelerator/premiumka, 8000), - new /datum/data/mining_equipment("Miner Full Replacement", /obj/item/storage/backpack/duffelbag/mining_cloned, 12000), - new /datum/data/mining_equipment("Spare Suit Voucher", /obj/item/suit_voucher, 15000) + new /datum/data/mining_equipment("Premium Accelerator", /obj/item/gun/energy/kinetic_accelerator/premiumka, 8000) ) @@ -319,7 +319,7 @@ new /obj/item/clothing/glasses/meson(src) new /obj/item/t_scanner/adv_mining_scanner/lesser(src) new /obj/item/storage/bag/ore(src) - new /obj/item/clothing/suit/hooded/explorer(src) + new /obj/item/clothing/suit/hooded/explorer/standard(src) new /obj/item/encryptionkey/headset_cargo(src) new /obj/item/clothing/mask/gas/explorer(src) new /obj/item/card/mining_access_card(src) @@ -340,7 +340,7 @@ new /obj/item/storage/firstaid/regular(src) new /obj/item/reagent_containers/hypospray/medipen/survival(src) new /obj/item/t_scanner/adv_mining_scanner(src) - new /obj/item/clothing/suit/hooded/explorer(src) + new /obj/item/clothing/suit/hooded/explorer/standard(src) new /obj/item/encryptionkey/headset_cargo(src) new /obj/item/clothing/mask/gas/explorer(src) new /obj/item/card/id/mining(src) diff --git a/code/modules/mob/dead/new_player/sprite_accessories.dm b/code/modules/mob/dead/new_player/sprite_accessories.dm deleted file mode 100644 index 44c1f7601d..0000000000 --- a/code/modules/mob/dead/new_player/sprite_accessories.dm +++ /dev/null @@ -1,1524 +0,0 @@ -/* - - Hello and welcome to sprite_accessories: For sprite accessories, such as hair, - facial hair, and possibly tattoos and stuff somewhere along the line. This file is - intended to be friendly for people with little to no actual coding experience. - The process of adding in new hairstyles has been made pain-free and easy to do. - Enjoy! - Doohl - - - Notice: This all gets automatically compiled in a list in dna.dm, so you do not - have to define any UI values for sprite accessories manually for hair and facial - hair. Just add in new hair types and the game will naturally adapt. - - !!WARNING!!: changing existing hair information can be VERY hazardous to savefiles, - to the point where you may completely corrupt a server's savefiles. Please refrain - from doing this unless you absolutely know what you are doing, and have defined a - conversion in savefile.dm -*/ -/proc/init_sprite_accessory_subtypes(prototype, list/L, list/male, list/female,var/roundstart = FALSE)//Roundstart argument builds a specific list for roundstart parts where some parts may be locked - if(!istype(L)) - L = list() - if(!istype(male)) - male = list() - if(!istype(female)) - female = list() - - for(var/path in typesof(prototype)) - if(path == prototype) - continue - if(roundstart) - var/datum/sprite_accessory/P = path - if(initial(P.locked)) - continue - var/datum/sprite_accessory/D = new path() - - if(D.icon_state) - L[D.name] = D - else - L += D.name - - switch(D.gender) - if(MALE) - male += D.name - if(FEMALE) - female += D.name - else - male += D.name - female += D.name - return L - -/datum/sprite_accessory - var/icon //the icon file the accessory is located in - var/icon_state //the icon_state of the accessory - var/name //the preview name of the accessory - var/gender = NEUTER //Determines if the accessory will be skipped or included in random hair generations - var/gender_specific //Something that can be worn by either gender, but looks different on each - var/color_src = MUTCOLORS //Currently only used by mutantparts so don't worry about hair and stuff. This is the source that this accessory will get its color from. Default is MUTCOLOR, but can also be HAIR, FACEHAIR, EYECOLOR and 0 if none. - var/hasinner //Decides if this sprite has an "inner" part, such as the fleshy parts on ears. - var/locked = FALSE //Is this part locked from roundstart selection? Used for parts that apply effects - var/dimension_x = 32 - var/dimension_y = 32 - var/center = FALSE //Should we center the sprite? - -////////////////////// -// Hair Definitions // -////////////////////// -/datum/sprite_accessory/hair - icon = 'icons/mob/human_face.dmi' // default icon for all hairs - - // please make sure they're sorted alphabetically and, where needed, categorized - // try to capitalize the names please~ - // try to spell - // you do not need to define _s or _l sub-states, game automatically does this for you - -/datum/sprite_accessory/hair/afro - name = "Afro" - icon_state = "hair_afro" - -/datum/sprite_accessory/hair/afro2 - name = "Afro 2" - icon_state = "hair_afro2" - -/datum/sprite_accessory/hair/afro_large - name = "Afro (Large)" - icon_state = "hair_bigafro" - -/datum/sprite_accessory/hair/antenna - name = "Ahoge" - icon_state = "hair_antenna" - -/datum/sprite_accessory/hair/bald - name = "Bald" - icon_state = null - -/datum/sprite_accessory/hair/balding - name = "Balding Hair" - icon_state = "hair_e" - -/datum/sprite_accessory/hair/bedhead - name = "Bedhead" - icon_state = "hair_bedhead" - -/datum/sprite_accessory/hair/bedhead2 - name = "Bedhead 2" - icon_state = "hair_bedheadv2" - -/datum/sprite_accessory/hair/bedhead3 - name = "Bedhead 3" - icon_state = "hair_bedheadv3" - -/datum/sprite_accessory/hair/beehive - name = "Beehive" - icon_state = "hair_beehive" - -/datum/sprite_accessory/hair/beehive2 - name = "Beehive 2" - icon_state = "hair_beehivev2" - -/datum/sprite_accessory/hair/bob - name = "Bob Hair" - icon_state = "hair_bob" - -/datum/sprite_accessory/hair/bob2 - name = "Bob Hair 2" - icon_state = "hair_bob2" - -/datum/sprite_accessory/hair/bob3 - name = "Bob Hair 3" - icon_state = "hair_bobcut" - -/datum/sprite_accessory/hair/bobcurl - name = "Bobcurl" - icon_state = "hair_bobcurl" - -/datum/sprite_accessory/hair/boddicker - name = "Boddicker" - icon_state = "hair_boddicker" - -/datum/sprite_accessory/hair/bowl - name = "Bowl" - icon_state = "hair_bowlcut" - -/datum/sprite_accessory/hair/braid - name = "Braid (Floorlength)" - icon_state = "hair_braid" - -/datum/sprite_accessory/hair/braided - name = "Braided" - icon_state = "hair_braided" - -/datum/sprite_accessory/hair/front_braid - name = "Braided Front" - icon_state = "hair_braidfront" - -/datum/sprite_accessory/hair/not_floorlength_braid - name = "Braid (High)" - icon_state = "hair_braid2" - -/datum/sprite_accessory/hair/lowbraid - name = "Braid (Low)" - icon_state = "hair_hbraid" - -/datum/sprite_accessory/hair/shortbraid - name = "Braid (Short)" - icon_state = "hair_shortbraid" - -/datum/sprite_accessory/hair/braidtail - name = "Braided Tail" - icon_state = "hair_braidtail" - -/datum/sprite_accessory/hair/bun - name = "Bun Head" - icon_state = "hair_bun" - -/datum/sprite_accessory/hair/bun2 - name = "Bun Head 2" - icon_state = "hair_bunhead2" - -/datum/sprite_accessory/hair/largebun - name = "Bun (Large)" - icon_state = "hair_largebun" - -/datum/sprite_accessory/hair/business - name = "Business Hair" - icon_state = "hair_business" - -/datum/sprite_accessory/hair/business2 - name = "Business Hair 2" - icon_state = "hair_business2" - -/datum/sprite_accessory/hair/business3 - name = "Business Hair 3" - icon_state = "hair_business3" - -/datum/sprite_accessory/hair/business4 - name = "Business Hair 4" - icon_state = "hair_business4" - -/datum/sprite_accessory/hair/buzz - name = "Buzzcut" - icon_state = "hair_buzzcut" - -/datum/sprite_accessory/hair/combover - name = "Combover" - icon_state = "hair_combover" - -/datum/sprite_accessory/hair/crew - name = "Crewcut" - icon_state = "hair_crewcut" - -/datum/sprite_accessory/hair/curls - name = "Curls" - icon_state = "hair_curls" - -/datum/sprite_accessory/hair/cut - name = "Cut Hair" - icon_state = "hair_c" - -/datum/sprite_accessory/hair/devillock - name = "Devil Lock" - icon_state = "hair_devilock" - -/datum/sprite_accessory/hair/dreadlocks - name = "Dreadlocks" - icon_state = "hair_dreads" - -/datum/sprite_accessory/hair/drillhair - name = "Drill Hair" - icon_state = "hair_drillhair" - -/datum/sprite_accessory/hair/drillhairextended - name = "Drill Hair (Extended)" - icon_state = "hair_drillhairextended" - -/datum/sprite_accessory/hair/emo - name = "Emo" - icon_state = "hair_emo" - -/datum/sprite_accessory/hair/feather - name = "Feather" - icon_state = "hair_feather" - -/datum/sprite_accessory/hair/sargeant - name = "Flat Top" - icon_state = "hair_sargeant" - -/datum/sprite_accessory/hair/bigflattop - name = "Flat Top (Big)" - icon_state = "hair_bigflattop" - -/datum/sprite_accessory/hair/fag - name = "Flow Hair" - icon_state = "hair_f" - -/datum/sprite_accessory/hair/gelled - name = "Gelled Back" - icon_state = "hair_gelled" - -/datum/sprite_accessory/hair/gentle - name = "Gentle" - icon_state = "hair_gentle" - -/datum/sprite_accessory/hair/halfbang - name = "Half-banged Hair" - icon_state = "hair_halfbang" - -/datum/sprite_accessory/hair/halfbang2 - name = "Half-banged Hair 2" - icon_state = "hair_halfbang2" - -/datum/sprite_accessory/hair/hedgehog - name = "Hedgehog Hair" - icon_state = "hair_hedgehog" - -/datum/sprite_accessory/hair/himecut - name = "Hime Cut" - icon_state = "hair_himecut" - -/datum/sprite_accessory/hair/himecut2 - name = "Hime Cut 2" - icon_state = "hair_himecut2" - -/datum/sprite_accessory/hair/himeup - name = "Hime Updo" - icon_state = "hair_himeup" - -/datum/sprite_accessory/hair/hitop - name = "Hitop" - icon_state = "hair_hitop" - -/datum/sprite_accessory/hair/jensen - name = "Jensen Hair" - icon_state = "hair_jensen" - -/datum/sprite_accessory/hair/keanu - name = "Keanu Hair" - icon_state = "hair_keanu" - -/datum/sprite_accessory/hair/kusangi - name = "Kusanagi Hair" - icon_state = "hair_kusanagi" - -/datum/sprite_accessory/hair/long - name = "Long Hair 1" - icon_state = "hair_long" - -/datum/sprite_accessory/hair/long2 - name = "Long Hair 2" - icon_state = "hair_long2" - -/datum/sprite_accessory/hair/long3 - name = "Long Hair 3" - icon_state = "hair_long3" - -/datum/sprite_accessory/hair/long_over_eye - name = "Long Over Eye" - icon_state = "hair_longovereye" - -/datum/sprite_accessory/hair/longbangs - name = "Long Bangs" - icon_state = "hair_lbangs" - -/datum/sprite_accessory/hair/longemo - name = "Long Emo" - icon_state = "hair_longemo" - -/datum/sprite_accessory/hair/longfringe - name = "Long Fringe" - icon_state = "hair_longfringe" - -/datum/sprite_accessory/hair/sidepartlongalt - name = "Long Side Part" - icon_state = "hair_longsidepart" - -/datum/sprite_accessory/hair/megaeyebrows - name = "Mega Eyebrows" - icon_state = "hair_megaeyebrows" - -/datum/sprite_accessory/hair/messy - name = "Messy" - icon_state = "hair_messy" - -/datum/sprite_accessory/hair/mohawk - name = "Mohawk" - icon_state = "hair_d" - -/datum/sprite_accessory/hair/reversemohawk - name = "Mohawk (Reverse)" - icon_state = "hair_reversemohawk" - -/datum/sprite_accessory/hair/odango - name = "Odango" - icon_state = "hair_odango" - -/datum/sprite_accessory/hair/ombre - name = "Ombre" - icon_state = "hair_ombre" - -/datum/sprite_accessory/hair/oneshoulder - name = "One Shoulder" - icon_state = "hair_oneshoulder" - -/datum/sprite_accessory/hair/over_eye - name = "Over Eye" - icon_state = "hair_shortovereye" - -//Donator item - fractious -/datum/sprite_accessory/hair/over_eye_fr - name = "Over Eye (fract)" - icon_state = "hair_shortovereye_1f" - ckeys_allowed = list("fractious") - -/datum/sprite_accessory/hair/parted - name = "Parted" - icon_state = "hair_parted" - -/datum/sprite_accessory/hair/partedside - name = "Parted (Side)" - icon_state = "hair_part" - -/datum/sprite_accessory/hair/kagami - name = "Pigtails" - icon_state = "hair_kagami" - -/datum/sprite_accessory/hair/pigtail - name = "Pigtails 2" - icon_state = "hair_pigtails" - -/datum/sprite_accessory/hair/pigtail2 - name = "Pigtails 3" - icon_state = "hair_pigtails2" - -/datum/sprite_accessory/hair/pixie - name = "Pixie Cut" - icon_state = "hair_pixie" - -/datum/sprite_accessory/hair/pompadour - name = "Pompadour" - icon_state = "hair_pompadour" - -/datum/sprite_accessory/hair/bigpompadour - name = "Pompadour (Big)" - icon_state = "hair_bigpompadour" - -/datum/sprite_accessory/hair/ponytail1 - name = "Ponytail" - icon_state = "hair_ponytail" - -/datum/sprite_accessory/hair/ponytail2 - name = "Ponytail 2" - icon_state = "hair_ponytail2" - -/datum/sprite_accessory/hair/ponytail3 - name = "Ponytail 3" - icon_state = "hair_ponytail3" - -/datum/sprite_accessory/hair/ponytail4 - name = "Ponytail 4" - icon_state = "hair_ponytail4" - -/datum/sprite_accessory/hair/ponytail5 - name = "Ponytail 5" - icon_state = "hair_ponytail5" - -/datum/sprite_accessory/hair/highponytail - name = "Ponytail (High)" - icon_state = "hair_highponytail" - -/datum/sprite_accessory/hair/longponytail - name = "Ponytail (Long)" - icon_state = "hair_longstraightponytail" - -/datum/sprite_accessory/hair/sidetail - name = "Ponytail (Side)" - icon_state = "hair_sidetail" - -/datum/sprite_accessory/hair/sidetail2 - name = "Ponytail (Side) 2" - icon_state = "hair_sidetail2" - -/datum/sprite_accessory/hair/sidetail3 - name = "Ponytail (Side) 3" - icon_state = "hair_sidetail3" - -/datum/sprite_accessory/hair/sidetail4 - name = "Ponytail (Side) 4" - icon_state = "hair_sidetail4" - -/datum/sprite_accessory/hair/quiff - name = "Quiff" - icon_state = "hair_quiff" - -/datum/sprite_accessory/hair/short - name = "Short Hair" - icon_state = "hair_a" - -/datum/sprite_accessory/hair/shorthair2 - name = "Short Hair 2" - icon_state = "hair_shorthair2" - -/datum/sprite_accessory/hair/shorthair3 - name = "Short Hair 3" - icon_state = "hair_shorthair3" - -/datum/sprite_accessory/hair/shoulderlength - name = "Shoulder-length Hair" - icon_state = "hair_b" - -/datum/sprite_accessory/hair/sidecut - name = "Sidecut" - icon_state = "hair_sidecut" - -/datum/sprite_accessory/hair/skinhead - name = "Skinhead" - icon_state = "hair_skinhead" - -/datum/sprite_accessory/hair/protagonist - name = "Slightly Long Hair" - icon_state = "hair_protagonist" - -/datum/sprite_accessory/hair/spiky - name = "Spiky" - icon_state = "hair_spikey" - -/datum/sprite_accessory/hair/spiky2 - name = "Spiky 2" - icon_state = "hair_spiky" - -/datum/sprite_accessory/hair/spiky3 - name = "Spiky 3" - icon_state = "hair_spiky2" - -/datum/sprite_accessory/hair/swept - name = "Swept Back Hair" - icon_state = "hair_swept" - -/datum/sprite_accessory/hair/swept2 - name = "Swept Back Hair 2" - icon_state = "hair_swept2" - -/datum/sprite_accessory/hair/tressshoulder - name = "Tress Shoulder" - icon_state = "hair_tressshoulder" - -/datum/sprite_accessory/hair/updo - name = "Updo" - icon_state = "hair_updo" - -/datum/sprite_accessory/hair/longer - name = "Very Long Hair" - icon_state = "hair_vlong" - -/datum/sprite_accessory/hair/longest - name = "Very Long Hair 2" - icon_state = "hair_longest" - -/datum/sprite_accessory/hair/longest2 - name = "Very Long Over Eye" - icon_state = "hair_longest2" - -/datum/sprite_accessory/hair/longestalt - name = "Very Long with Fringe" - icon_state = "hair_vlongfringe" - -///////////////////////////// -// Facial Hair Definitions // -///////////////////////////// - -/datum/sprite_accessory/facial_hair - icon = 'icons/mob/human_face.dmi' - gender = MALE // barf (unless you're a dorf, dorfs dig chix w/ beards :P) - -// please make sure they're sorted alphabetically and categorized - -/datum/sprite_accessory/facial_hair/abe - name = "Beard (Abraham Lincoln)" - icon_state = "facial_abe" - -/datum/sprite_accessory/facial_hair/brokenman - name = "Beard (Broken Man)" - icon_state = "facial_brokenman" - -/datum/sprite_accessory/facial_hair/chinstrap - name = "Beard (Chinstrap)" - icon_state = "facial_chin" - -/datum/sprite_accessory/facial_hair/dwarf - name = "Beard (Dwarf)" - icon_state = "facial_dwarf" - -/datum/sprite_accessory/facial_hair/fiveoclock - name = "Beard (Five o Clock Shadow)" - icon_state = "facial_fiveoclock" - -/datum/sprite_accessory/facial_hair/fullbeard - name = "Beard (Full)" - icon_state = "facial_fullbeard" - -/datum/sprite_accessory/facial_hair/gt - name = "Beard (Goatee)" - icon_state = "facial_gt" - -/datum/sprite_accessory/facial_hair/hip - name = "Beard (Hipster)" - icon_state = "facial_hip" - -/datum/sprite_accessory/facial_hair/jensen - name = "Beard (Jensen)" - icon_state = "facial_jensen" - -/datum/sprite_accessory/facial_hair/neckbeard - name = "Beard (Neckbeard)" - icon_state = "facial_neckbeard" - -/datum/sprite_accessory/facial_hair/vlongbeard - name = "Beard (Very Long)" - icon_state = "facial_wise" - -/datum/sprite_accessory/facial_hair/longbeard - name = "Beard (Long)" - icon_state = "facial_longbeard" - -/datum/sprite_accessory/facial_hair/fu - name = "Moustache (Fu Manchu)" - icon_state = "facial_fumanchu" - -/datum/sprite_accessory/facial_hair/hogan - name = "Moustache (Hulk Hogan)" - icon_state = "facial_hogan" //-Neek - -/datum/sprite_accessory/facial_hair/selleck - name = "Moustache (Selleck)" - icon_state = "facial_selleck" - -/datum/sprite_accessory/facial_hair/chaplin - name = "Moustache (Square)" - icon_state = "facial_chaplin" - -/datum/sprite_accessory/facial_hair/vandyke - name = "Moustache (Van Dyke)" - icon_state = "facial_vandyke" - -/datum/sprite_accessory/facial_hair/watson - name = "Moustache (Watson)" - icon_state = "facial_watson" - -/datum/sprite_accessory/facial_hair/shaved - name = "Shaved" - icon_state = null - gender = NEUTER - -/datum/sprite_accessory/facial_hair/elvis - name = "Sideburns (Elvis)" - icon_state = "facial_elvis" - - -/////////////////////////// -// Underwear Definitions // -/////////////////////////// -/datum/sprite_accessory/underwear - icon = 'icons/mob/underwear.dmi' - -/datum/sprite_accessory/underwear/nude - name = "Nude" - icon_state = null - gender = NEUTER - -/datum/sprite_accessory/underwear/male_mankini - name = "Mankini" - icon_state = "male_mankini" - gender = MALE - -/datum/sprite_accessory/underwear/male_black - name = "Men's Black" - icon_state = "male_black" - gender = MALE - -/datum/sprite_accessory/underwear/male_blackalt - name = "Men's Black Boxer" - icon_state = "male_blackalt" - gender = MALE - -/datum/sprite_accessory/underwear/male_blue - name = "Men's Blue" - icon_state = "male_blue" - gender = MALE - -/datum/sprite_accessory/underwear/male_green - name = "Men's Green" - icon_state = "male_green" - gender = MALE - -/datum/sprite_accessory/underwear/male_grey - name = "Men's Grey" - icon_state = "male_grey" - gender = MALE - -/datum/sprite_accessory/underwear/male_greyalt - name = "Men's Grey Boxer" - icon_state = "male_greyalt" - gender = MALE - -/datum/sprite_accessory/underwear/male_hearts - name = "Men's Hearts Boxer" - icon_state = "male_hearts" - gender = MALE - -/datum/sprite_accessory/underwear/male_kinky - name = "Men's Kinky" - icon_state = "male_kinky" - gender = MALE - -/datum/sprite_accessory/underwear/male_red - name = "Men's Red" - icon_state = "male_red" - gender = MALE - -/datum/sprite_accessory/underwear/male_stripe - name = "Men's Striped Boxer" - icon_state = "male_stripe" - gender = MALE - -/datum/sprite_accessory/underwear/male_commie - name = "Men's Striped Commie Boxer" - icon_state = "male_commie" - gender = MALE - -/datum/sprite_accessory/underwear/male_usastripe - name = "Men's Striped Freedom Boxer" - icon_state = "male_assblastusa" - gender = MALE - -/datum/sprite_accessory/underwear/male_uk - name = "Men's Striped UK Boxer" - icon_state = "male_uk" - gender = MALE - -/datum/sprite_accessory/underwear/male_white - name = "Men's White" - icon_state = "male_white" - gender = MALE - -/datum/sprite_accessory/underwear/female_babydoll - name = "Babydoll" - icon_state = "female_babydoll" - gender = FEMALE - -/datum/sprite_accessory/underwear/female_babyblue - name = "Ladies' Baby-Blue" - icon_state = "female_babyblue" - gender = FEMALE - -/datum/sprite_accessory/underwear/female_black - name = "Ladies' Black" - icon_state = "female_black" - gender = FEMALE - -/datum/sprite_accessory/underwear/female_black_neko - name = "Ladies' Black Neko" - icon_state = "female_neko_black" - gender = FEMALE - -/datum/sprite_accessory/underwear/female_blackalt - name = "Ladies' Black Sport" - icon_state = "female_blackalt" - gender = FEMALE - -/datum/sprite_accessory/underwear/female_blue - name = "Ladies' Blue" - icon_state = "female_blue" - gender = FEMALE - -/datum/sprite_accessory/underwear/female_commie - name = "Ladies' Commie" - icon_state = "female_commie" - gender = FEMALE - -/datum/sprite_accessory/underwear/female_usastripe - name = "Ladies' Freedom" - icon_state = "female_assblastusa" - gender = FEMALE - -/datum/sprite_accessory/underwear/female_green - name = "Ladies' Green" - icon_state = "female_green" - gender = FEMALE - -/datum/sprite_accessory/underwear/female_kinky - name = "Ladies' Kinky" - icon_state = "female_kinky" - gender = FEMALE - -/datum/sprite_accessory/underwear/female_pink - name = "Ladies' Pink" - icon_state = "female_pink" - gender = FEMALE - -/datum/sprite_accessory/underwear/female_red - name = "Ladies' Red" - icon_state = "female_red" - gender = FEMALE - -/datum/sprite_accessory/underwear/swimsuit - name = "Ladies' Swimsuit (Black)" - icon_state = "swim_black" - gender = FEMALE - -/datum/sprite_accessory/underwear/swimsuit_blue - name = "Ladies' Swimsuit (Blue)" - icon_state = "swim_blue" - gender = FEMALE - -/datum/sprite_accessory/underwear/swimsuit_green - name = "Ladies' Swimsuit (Green)" - icon_state = "swim_green" - gender = FEMALE - -/datum/sprite_accessory/underwear/swimsuit_purple - name = "Ladies' Swimsuit (Purple)" - icon_state = "swim_purple" - gender = FEMALE - -/datum/sprite_accessory/underwear/swimsuit_red - name = "Ladies' Swimsuit (Red)" - icon_state = "swim_red" - gender = FEMALE - -/datum/sprite_accessory/underwear/female_thong - name = "Ladies' Thong" - icon_state = "female_thong" - gender = FEMALE - -/datum/sprite_accessory/underwear/female_uk - name = "Ladies' UK" - icon_state = "female_uk" - gender = FEMALE - -/datum/sprite_accessory/underwear/female_white - name = "Ladies' White" - icon_state = "female_white" - gender = FEMALE - -/datum/sprite_accessory/underwear/female_white_neko - name = "Ladies' White Neko" - icon_state = "female_neko_white" - gender = FEMALE - -/datum/sprite_accessory/underwear/female_whitealt - name = "Ladies' White Sport" - icon_state = "female_whitealt" - gender = FEMALE - -/datum/sprite_accessory/underwear/female_yellow - name = "Ladies' Yellow" - icon_state = "female_yellow" - gender = FEMALE - -//////////////////////////// -// Undershirt Definitions // -//////////////////////////// - -/datum/sprite_accessory/undershirt - icon = 'icons/mob/underwear.dmi' - -/datum/sprite_accessory/undershirt/nude - name = "Nude" - icon_state = null - gender = NEUTER - -// please make sure they're sorted alphabetically and categorized - -/datum/sprite_accessory/undershirt/bluejersey - name = "Jersey (Blue)" - icon_state = "shirt_bluejersey" - gender = NEUTER - -/datum/sprite_accessory/undershirt/redjersey - name = "Jersey (Red)" - icon_state = "shirt_redjersey" - gender = NEUTER - -/datum/sprite_accessory/undershirt/bluepolo - name = "Polo Shirt (Blue)" - icon_state = "bluepolo" - gender = NEUTER - -/datum/sprite_accessory/undershirt/grayyellowpolo - name = "Polo Shirt (Gray-Yellow)" - icon_state = "grayyellowpolo" - gender = NEUTER - -/datum/sprite_accessory/undershirt/redpolo - name = "Polo Shirt (Red)" - icon_state = "redpolo" - gender = NEUTER - -/datum/sprite_accessory/undershirt/whitepolo - name = "Polo Shirt (White)" - icon_state = "whitepolo" - gender = NEUTER - -/datum/sprite_accessory/undershirt/alienshirt - name = "Shirt (Alien)" - icon_state = "shirt_alien" - gender = NEUTER - -/datum/sprite_accessory/undershirt/mondmondjaja - name = "Shirt (Band)" - icon_state = "band" - gender = NEUTER - -/datum/sprite_accessory/undershirt/shirt_black - name = "Shirt (Black)" - icon_state = "shirt_black" - gender = NEUTER - -/datum/sprite_accessory/undershirt/blueshirt - name = "Shirt (Blue)" - icon_state = "shirt_blue" - gender = NEUTER - -/datum/sprite_accessory/undershirt/clownshirt - name = "Shirt (Clown)" - icon_state = "shirt_clown" - gender = NEUTER - -/datum/sprite_accessory/undershirt/commie - name = "Shirt (Commie)" - icon_state = "shirt_commie" - gender = NEUTER - -/datum/sprite_accessory/undershirt/greenshirt - name = "Shirt (Green)" - icon_state = "shirt_green" - gender = NEUTER - -/datum/sprite_accessory/undershirt/shirt_grey - name = "Shirt (Grey)" - icon_state = "shirt_grey" - gender = NEUTER - -/datum/sprite_accessory/undershirt/ian - name = "Shirt (Ian)" - icon_state = "ian" - gender = NEUTER - -/datum/sprite_accessory/undershirt/ilovent - name = "Shirt (I Love NT)" - icon_state = "ilovent" - gender = NEUTER - -/datum/sprite_accessory/undershirt/lover - name = "Shirt (Lover)" - icon_state = "lover" - gender = NEUTER - -/datum/sprite_accessory/undershirt/matroska - name = "Shirt (Matroska)" - icon_state = "matroska" - gender = NEUTER - -/datum/sprite_accessory/undershirt/meat - name = "Shirt (Meat)" - icon_state = "shirt_meat" - gender = NEUTER - -/datum/sprite_accessory/undershirt/nano - name = "Shirt (Nanotrasen)" - icon_state = "shirt_nano" - gender = NEUTER - -/datum/sprite_accessory/undershirt/peace - name = "Shirt (Peace)" - icon_state = "peace" - gender = NEUTER - -/datum/sprite_accessory/undershirt/pacman - name = "Shirt (Pogoman)" - icon_state = "pogoman" - gender = NEUTER - -/datum/sprite_accessory/undershirt/question - name = "Shirt (Question)" - icon_state = "shirt_question" - gender = NEUTER - -/datum/sprite_accessory/undershirt/redshirt - name = "Shirt (Red)" - icon_state = "shirt_red" - gender = NEUTER - -/datum/sprite_accessory/undershirt/skull - name = "Shirt (Skull)" - icon_state = "shirt_skull" - gender = NEUTER - -/datum/sprite_accessory/undershirt/ss13 - name = "Shirt (SS13)" - icon_state = "shirt_ss13" - gender = NEUTER - -/datum/sprite_accessory/undershirt/stripe - name = "Shirt (Striped)" - icon_state = "shirt_stripes" - gender = NEUTER - -/datum/sprite_accessory/undershirt/tiedye - name = "Shirt (Tie-dye)" - icon_state = "shirt_tiedye" - gender = NEUTER - -/datum/sprite_accessory/undershirt/uk - name = "Shirt (UK)" - icon_state = "uk" - gender = NEUTER - -/datum/sprite_accessory/undershirt/usa - name = "Shirt (USA)" - icon_state = "shirt_assblastusa" - gender = NEUTER - -/datum/sprite_accessory/undershirt/shirt_white - name = "Shirt (White)" - icon_state = "shirt_white" - gender = NEUTER - -/datum/sprite_accessory/undershirt/blackshortsleeve - name = "Short-sleeved Shirt (Black)" - icon_state = "blackshortsleeve" - gender = NEUTER - -/datum/sprite_accessory/undershirt/blueshortsleeve - name = "Short-sleeved Shirt (Blue)" - icon_state = "blueshortsleeve" - gender = NEUTER - -/datum/sprite_accessory/undershirt/greenshortsleeve - name = "Short-sleeved Shirt (Green)" - icon_state = "greenshortsleeve" - gender = NEUTER - -/datum/sprite_accessory/undershirt/purpleshortsleeve - name = "Short-sleeved Shirt (Purple)" - icon_state = "purpleshortsleeve" - gender = NEUTER - -/datum/sprite_accessory/undershirt/whiteshortsleeve - name = "Short-sleeved Shirt (White)" - icon_state = "whiteshortsleeve" - gender = NEUTER - -/datum/sprite_accessory/undershirt/sports_bra - name = "Sports Bra" - icon_state = "sports_bra" - gender = NEUTER - -/datum/sprite_accessory/undershirt/sports_bra2 - name = "Sports Bra (Alt)" - icon_state = "sports_bra_alt" - gender = NEUTER - -/datum/sprite_accessory/undershirt/blueshirtsport - name = "Sports Shirt (Blue)" - icon_state = "blueshirtsport" - gender = NEUTER - -/datum/sprite_accessory/undershirt/greenshirtsport - name = "Sports Shirt (Green)" - icon_state = "greenshirtsport" - gender = NEUTER - -/datum/sprite_accessory/undershirt/redshirtsport - name = "Sports Shirt (Red)" - icon_state = "redshirtsport" - gender = NEUTER - -/datum/sprite_accessory/undershirt/tank_black - name = "Tank Top (Black)" - icon_state = "tank_black" - gender = NEUTER - -/datum/sprite_accessory/undershirt/tankfire - name = "Tank Top (Fire)" - icon_state = "tank_fire" - gender = NEUTER - -/datum/sprite_accessory/undershirt/tank_grey - name = "Tank Top (Grey)" - icon_state = "tank_grey" - gender = NEUTER - -/datum/sprite_accessory/undershirt/female_midriff - name = "Tank Top (Midriff)" - icon_state = "tank_midriff" - gender = FEMALE - -/datum/sprite_accessory/undershirt/tank_red - name = "Tank Top (Red)" - icon_state = "tank_red" - gender = NEUTER - -/datum/sprite_accessory/undershirt/tankstripe - name = "Tank Top (Striped)" - icon_state = "tank_stripes" - gender = NEUTER - -/datum/sprite_accessory/undershirt/tank_white - name = "Tank Top (White)" - icon_state = "tank_white" - gender = NEUTER - -/datum/sprite_accessory/undershirt/redtop - name = "Top (Red)" - icon_state = "redtop" - gender = FEMALE - -/datum/sprite_accessory/undershirt/whitetop - name = "Top (White)" - icon_state = "whitetop" - gender = FEMALE - -/datum/sprite_accessory/undershirt/tshirt_blue - name = "T-Shirt (Blue)" - icon_state = "blueshirt" - gender = NEUTER - -/datum/sprite_accessory/undershirt/tshirt_green - name = "T-Shirt (Green)" - icon_state = "greenshirt" - gender = NEUTER - -/datum/sprite_accessory/undershirt/tshirt_red - name = "T-Shirt (Red)" - icon_state = "redshirt" - gender = NEUTER - -/datum/sprite_accessory/undershirt/yellowshirt - name = "T-Shirt (Yellow)" - icon_state = "yellowshirt" - gender = NEUTER - -/////////////////////// -// Socks Definitions // -/////////////////////// - -/datum/sprite_accessory/socks - icon = 'icons/mob/underwear.dmi' - -/datum/sprite_accessory/socks/nude - name = "Nude" - icon_state = null - -// please make sure they're sorted alphabetically and categorized - -/datum/sprite_accessory/socks/black_knee - name = "Knee-high (Black)" - icon_state = "black_knee" - -/datum/sprite_accessory/socks/commie_knee - name = "Knee-High (Commie)" - icon_state = "commie_knee" - -/datum/sprite_accessory/socks/usa_knee - name = "Knee-High (Freedom)" - icon_state = "assblastusa_knee" - -/datum/sprite_accessory/socks/rainbow_knee - name = "Knee-high (Rainbow)" - icon_state = "rainbow_knee" - -/datum/sprite_accessory/socks/striped_knee - name = "Knee-high (Striped)" - icon_state = "striped_knee" - -/datum/sprite_accessory/socks/thin_knee - name = "Knee-high (Thin)" - icon_state = "thin_knee" - -/datum/sprite_accessory/socks/uk_knee - name = "Knee-High (UK)" - icon_state = "uk_knee" - -/datum/sprite_accessory/socks/white_knee - name = "Knee-high (White)" - icon_state = "white_knee" - -/datum/sprite_accessory/socks/black_norm - name = "Normal (Black)" - icon_state = "black_norm" - -/datum/sprite_accessory/socks/white_norm - name = "Normal (White)" - icon_state = "white_norm" - -/datum/sprite_accessory/socks/pantyhose - name = "Pantyhose" - icon_state = "pantyhose" - -/datum/sprite_accessory/socks/black_short - name = "Short (Black)" - icon_state = "black_short" - -/datum/sprite_accessory/socks/white_short - name = "Short (White)" - icon_state = "white_short" - -/datum/sprite_accessory/socks/black_thigh - name = "Thigh-high (Black)" - icon_state = "black_thigh" - -/datum/sprite_accessory/socks/commie_thigh - name = "Thigh-high (Commie)" - icon_state = "commie_thigh" - -/datum/sprite_accessory/socks/usa_thigh - name = "Thigh-high (Freedom)" - icon_state = "assblastusa_thigh" - -/datum/sprite_accessory/socks/rainbow_thigh - name = "Thigh-high (Rainbow)" - icon_state = "rainbow_thigh" - -/datum/sprite_accessory/socks/striped_thigh - name = "Thigh-high (Striped)" - icon_state = "striped_thigh" - -/datum/sprite_accessory/socks/thin_thigh - name = "Thigh-high (Thin)" - icon_state = "thin_thigh" - -/datum/sprite_accessory/socks/uk_thigh - name = "Thigh-high (UK)" - icon_state = "uk_thigh" - -/datum/sprite_accessory/socks/white_thigh - name = "Thigh-high (White)" - icon_state = "white_thigh" - -//////////.////////////////// -// MutantParts Definitions // -///////////////////////////// - -/datum/sprite_accessory/body_markings - icon = 'icons/mob/mutant_bodyparts.dmi' - -/datum/sprite_accessory/body_markings/none - name = "None" - icon_state = "none" - -/datum/sprite_accessory/body_markings/dtiger - name = "Dark Tiger Body" - icon_state = "dtiger" - gender_specific = 1 - -/datum/sprite_accessory/body_markings/ltiger - name = "Light Tiger Body" - icon_state = "ltiger" - gender_specific = 1 - -/datum/sprite_accessory/body_markings/lbelly - name = "Light Belly" - icon_state = "lbelly" - gender_specific = 1 - -/datum/sprite_accessory/tails - icon = 'icons/mob/mutant_bodyparts.dmi' - -/datum/sprite_accessory/tails_animated - icon = 'icons/mob/mutant_bodyparts.dmi' - -/datum/sprite_accessory/tails/lizard/smooth - name = "Smooth" - icon_state = "smooth" - -/datum/sprite_accessory/tails_animated/lizard/smooth - name = "Smooth" - icon_state = "smooth" - -/datum/sprite_accessory/tails/lizard/dtiger - name = "Dark Tiger" - icon_state = "dtiger" - -/datum/sprite_accessory/tails_animated/lizard/dtiger - name = "Dark Tiger" - icon_state = "dtiger" - -/datum/sprite_accessory/tails/lizard/ltiger - name = "Light Tiger" - icon_state = "ltiger" - -/datum/sprite_accessory/tails_animated/lizard/ltiger - name = "Light Tiger" - icon_state = "ltiger" - -/datum/sprite_accessory/tails/lizard/spikes - name = "Spikes" - icon_state = "spikes" - -/datum/sprite_accessory/tails_animated/lizard/spikes - name = "Spikes" - icon_state = "spikes" - -/datum/sprite_accessory/tails/human/none - name = "None" - icon_state = "none" - -/datum/sprite_accessory/tails_animated/human/none - name = "None" - icon_state = "none" -/* -/datum/sprite_accessory/tails/human/cat - name = "Cat" - icon_state = "cat" - color_src = HAIR - -/datum/sprite_accessory/tails_animated/human/cat - name = "Cat" - icon_state = "cat" - color_src = HAIR*/ - -/datum/sprite_accessory/snouts - icon = 'icons/mob/mutant_bodyparts.dmi' - -/datum/sprite_accessory/snouts/sharp - name = "Sharp" - icon_state = "sharp" - -/datum/sprite_accessory/snouts/round - name = "Round" - icon_state = "round" - -/datum/sprite_accessory/snouts/sharplight - name = "Sharp + Light" - icon_state = "sharplight" - -/datum/sprite_accessory/snouts/roundlight - name = "Round + Light" - icon_state = "roundlight" - -/datum/sprite_accessory/horns - icon = 'icons/mob/mutant_bodyparts.dmi' - -/datum/sprite_accessory/horns/none - name = "None" - icon_state = "none" - -/datum/sprite_accessory/horns/simple - name = "Simple" - icon_state = "simple" - -/datum/sprite_accessory/horns/short - name = "Short" - icon_state = "short" - -/datum/sprite_accessory/horns/curled - name = "Curled" - icon_state = "curled" - -/datum/sprite_accessory/horns/ram - name = "Ram" - icon_state = "ram" - -/datum/sprite_accessory/horns/angler - name = "Angeler" - icon_state = "angler" - -/datum/sprite_accessory/ears - icon = 'icons/mob/mutant_bodyparts.dmi' - -/datum/sprite_accessory/ears/none - name = "None" - icon_state = "none" - -/datum/sprite_accessory/ears/cat - name = "Cat" - icon_state = "cat" - hasinner = 1 - color_src = HAIR - -/datum/sprite_accessory/wings/none - name = "None" - icon_state = "none" - -/datum/sprite_accessory/wings_open - icon = 'icons/mob/wings.dmi' - -/datum/sprite_accessory/wings_open/angel - name = "Angel" - icon_state = "angel" - color_src = 0 - dimension_x = 46 - center = TRUE - dimension_y = 34 - -/datum/sprite_accessory/wings - icon = 'icons/mob/wings.dmi' - -/datum/sprite_accessory/wings/angel - name = "Angel" - icon_state = "angel" - color_src = 0 - dimension_x = 46 - center = TRUE - dimension_y = 34 - locked = TRUE - -/datum/sprite_accessory/frills - icon = 'icons/mob/mutant_bodyparts.dmi' - -/datum/sprite_accessory/frills/none - name = "None" - icon_state = "none" - -/datum/sprite_accessory/frills/simple - name = "Simple" - icon_state = "simple" - -/datum/sprite_accessory/frills/short - name = "Short" - icon_state = "short" - -/datum/sprite_accessory/frills/aquatic - name = "Aquatic" - icon_state = "aqua" - -/datum/sprite_accessory/spines - icon = 'icons/mob/mutant_bodyparts.dmi' - -/datum/sprite_accessory/spines_animated - icon = 'icons/mob/mutant_bodyparts.dmi' - -/datum/sprite_accessory/spines/none - name = "None" - icon_state = "none" - -/datum/sprite_accessory/spines_animated/none - name = "None" - icon_state = "none" - -/datum/sprite_accessory/spines/short - name = "Short" - icon_state = "short" - -/datum/sprite_accessory/spines_animated/short - name = "Short" - icon_state = "short" - -/datum/sprite_accessory/spines/shortmeme - name = "Short + Membrane" - icon_state = "shortmeme" - -/datum/sprite_accessory/spines_animated/shortmeme - name = "Short + Membrane" - icon_state = "shortmeme" - -/datum/sprite_accessory/spines/long - name = "Long" - icon_state = "long" - -/datum/sprite_accessory/spines_animated/long - name = "Long" - icon_state = "long" - -/datum/sprite_accessory/spines/longmeme - name = "Long + Membrane" - icon_state = "longmeme" - -/datum/sprite_accessory/spines_animated/longmeme - name = "Long + Membrane" - icon_state = "longmeme" - -/datum/sprite_accessory/spines/aqautic - name = "Aquatic" - icon_state = "aqua" - -/datum/sprite_accessory/spines_animated/aqautic - name = "Aquatic" - icon_state = "aqua" - -/datum/sprite_accessory/legs //legs are a special case, they aren't actually sprite_accessories but are updated with them. - icon = null //These datums exist for selecting legs on preference, and little else - -/datum/sprite_accessory/legs/none - name = "Normal Legs" - -/datum/sprite_accessory/legs/digitigrade_lizard - name = "Digitigrade Legs" - -/datum/sprite_accessory/caps - icon = 'icons/mob/mutant_bodyparts.dmi' - color_src = HAIR - -/datum/sprite_accessory/caps/round - name = "Round" - icon_state = "round" - -/datum/sprite_accessory/moth_wings - icon = 'icons/mob/wings.dmi' - color_src = null - -/datum/sprite_accessory/moth_wings/plain - name = "Plain" - icon_state = "plain" - -/datum/sprite_accessory/moth_wings/monarch - name = "Monarch" - icon_state = "monarch" - -/datum/sprite_accessory/moth_wings/luna - name = "Luna" - icon_state = "luna" - -/datum/sprite_accessory/moth_wings/atlas - name = "Atlas" - icon_state = "atlas" - -/datum/sprite_accessory/moth_wings/reddish - name = "Reddish" - icon_state = "redish" - -/datum/sprite_accessory/moth_wings/royal - name = "Royal" - icon_state = "royal" - -/datum/sprite_accessory/moth_wings/gothic - name = "Gothic" - icon_state = "gothic" - -/datum/sprite_accessory/moth_wings/lovers - name = "Lovers" - icon_state = "lovers" - -/datum/sprite_accessory/moth_wings/whitefly - name = "White Fly" - icon_state = "whitefly" - -/datum/sprite_accessory/moth_wings/punished - name = "Burnt Off" - icon_state = "punished" - locked = TRUE - -/datum/sprite_accessory/moth_wings/firewatch - name = "Firewatch" - icon_state = "firewatch" - -/datum/sprite_accessory/moth_wings/deathhead - name = "Deathshead" - icon_state = "deathhead" - -/datum/sprite_accessory/moth_wings/poison - name = "Poison" - icon_state = "poison" - -/datum/sprite_accessory/moth_wings/ragged - name = "Ragged" - icon_state = "ragged" - -/datum/sprite_accessory/moth_wings/moonfly - name = "Moon Fly" - icon_state = "moonfly" - -/datum/sprite_accessory/moth_wings/snow - name = "Snow" - icon_state = "snow" diff --git a/code/modules/mob/dead/new_player/sprite_accessories/_sprite_accessories.dm b/code/modules/mob/dead/new_player/sprite_accessories/_sprite_accessories.dm new file mode 100644 index 0000000000..699c3c97e4 --- /dev/null +++ b/code/modules/mob/dead/new_player/sprite_accessories/_sprite_accessories.dm @@ -0,0 +1,62 @@ +/* + + Hello and welcome to sprite_accessories: For sprite accessories, such as hair, + facial hair, and possibly tattoos and stuff somewhere along the line. This file is + intended to be friendly for people with little to no actual coding experience. + The process of adding in new hairstyles has been made pain-free and easy to do. + Enjoy! - Doohl + + + Notice: This all gets automatically compiled in a list in dna.dm, so you do not + have to define any UI values for sprite accessories manually for hair and facial + hair. Just add in new hair types and the game will naturally adapt. + + !!WARNING!!: changing existing hair information can be VERY hazardous to savefiles, + to the point where you may completely corrupt a server's savefiles. Please refrain + from doing this unless you absolutely know what you are doing, and have defined a + conversion in savefile.dm +*/ +/proc/init_sprite_accessory_subtypes(prototype, list/L, list/male, list/female,var/roundstart = FALSE)//Roundstart argument builds a specific list for roundstart parts where some parts may be locked + if(!istype(L)) + L = list() + if(!istype(male)) + male = list() + if(!istype(female)) + female = list() + + for(var/path in typesof(prototype)) + if(path == prototype) + continue + if(roundstart) + var/datum/sprite_accessory/P = path + if(initial(P.locked)) + continue + var/datum/sprite_accessory/D = new path() + + if(D.icon_state) + L[D.name] = D + else + L += D.name + + switch(D.gender) + if(MALE) + male += D.name + if(FEMALE) + female += D.name + else + male += D.name + female += D.name + return L + +/datum/sprite_accessory + var/icon //the icon file the accessory is located in + var/icon_state //the icon_state of the accessory + var/name //the preview name of the accessory + var/gender = NEUTER //Determines if the accessory will be skipped or included in random hair generations + var/gender_specific //Something that can be worn by either gender, but looks different on each + var/color_src = MUTCOLORS //Currently only used by mutantparts so don't worry about hair and stuff. This is the source that this accessory will get its color from. Default is MUTCOLOR, but can also be HAIR, FACEHAIR, EYECOLOR and 0 if none. + var/hasinner //Decides if this sprite has an "inner" part, such as the fleshy parts on ears. + var/locked = FALSE //Is this part locked from roundstart selection? Used for parts that apply effects + var/dimension_x = 32 + var/dimension_y = 32 + var/center = FALSE //Should we center the sprite? \ No newline at end of file diff --git a/code/modules/mob/dead/new_player/sprite_accessories/body_markings.dm b/code/modules/mob/dead/new_player/sprite_accessories/body_markings.dm new file mode 100644 index 0000000000..6bce18d7ce --- /dev/null +++ b/code/modules/mob/dead/new_player/sprite_accessories/body_markings.dm @@ -0,0 +1,25 @@ +//////////.////////////////// +// MutantParts Definitions // +///////////////////////////// + +/datum/sprite_accessory/body_markings + icon = 'icons/mob/mutant_bodyparts.dmi' + +/datum/sprite_accessory/body_markings/none + name = "None" + icon_state = "none" + +/datum/sprite_accessory/body_markings/dtiger + name = "Dark Tiger Body" + icon_state = "dtiger" + gender_specific = 1 + +/datum/sprite_accessory/body_markings/ltiger + name = "Light Tiger Body" + icon_state = "ltiger" + gender_specific = 1 + +/datum/sprite_accessory/body_markings/lbelly + name = "Light Belly" + icon_state = "lbelly" + gender_specific = 1 \ No newline at end of file diff --git a/code/modules/mob/dead/new_player/sprite_accessories/caps.dm b/code/modules/mob/dead/new_player/sprite_accessories/caps.dm new file mode 100644 index 0000000000..debb4865ba --- /dev/null +++ b/code/modules/mob/dead/new_player/sprite_accessories/caps.dm @@ -0,0 +1,7 @@ +datum/sprite_accessory/caps + icon = 'icons/mob/mutant_bodyparts.dmi' + color_src = HAIR + +/datum/sprite_accessory/caps/round + name = "Round" + icon_state = "round" \ No newline at end of file diff --git a/code/modules/mob/dead/new_player/sprite_accessories/ears.dm b/code/modules/mob/dead/new_player/sprite_accessories/ears.dm new file mode 100644 index 0000000000..163f8370a2 --- /dev/null +++ b/code/modules/mob/dead/new_player/sprite_accessories/ears.dm @@ -0,0 +1,12 @@ +/datum/sprite_accessory/ears + icon = 'icons/mob/mutant_bodyparts.dmi' + +/datum/sprite_accessory/ears/none + name = "None" + icon_state = "none" + +/datum/sprite_accessory/ears/cat + name = "Cat" + icon_state = "cat" + hasinner = 1 + color_src = HAIR \ No newline at end of file diff --git a/code/modules/mob/dead/new_player/sprite_accessories/frills.dm b/code/modules/mob/dead/new_player/sprite_accessories/frills.dm new file mode 100644 index 0000000000..93c4af6df0 --- /dev/null +++ b/code/modules/mob/dead/new_player/sprite_accessories/frills.dm @@ -0,0 +1,18 @@ +/datum/sprite_accessory/frills + icon = 'icons/mob/mutant_bodyparts.dmi' + +/datum/sprite_accessory/frills/none + name = "None" + icon_state = "none" + +/datum/sprite_accessory/frills/simple + name = "Simple" + icon_state = "simple" + +/datum/sprite_accessory/frills/short + name = "Short" + icon_state = "short" + +/datum/sprite_accessory/frills/aquatic + name = "Aquatic" + icon_state = "aqua" \ No newline at end of file diff --git a/code/modules/mob/dead/new_player/sprite_accessories/hair_face.dm b/code/modules/mob/dead/new_player/sprite_accessories/hair_face.dm new file mode 100644 index 0000000000..3566f3dea5 --- /dev/null +++ b/code/modules/mob/dead/new_player/sprite_accessories/hair_face.dm @@ -0,0 +1,89 @@ +///////////////////////////// +// Facial Hair Definitions // +///////////////////////////// +/datum/sprite_accessory/facial_hair + icon = 'icons/mob/human_face.dmi' + gender = MALE // barf (unless you're a dorf, dorfs dig chix w/ beards :P) + +// please make sure they're sorted alphabetically and categorized + +/datum/sprite_accessory/facial_hair/abe + name = "Beard (Abraham Lincoln)" + icon_state = "facial_abe" + +/datum/sprite_accessory/facial_hair/brokenman + name = "Beard (Broken Man)" + icon_state = "facial_brokenman" + +/datum/sprite_accessory/facial_hair/chinstrap + name = "Beard (Chinstrap)" + icon_state = "facial_chin" + +/datum/sprite_accessory/facial_hair/dwarf + name = "Beard (Dwarf)" + icon_state = "facial_dwarf" + +/datum/sprite_accessory/facial_hair/fiveoclock + name = "Beard (Five o Clock Shadow)" + icon_state = "facial_fiveoclock" + +/datum/sprite_accessory/facial_hair/fullbeard + name = "Beard (Full)" + icon_state = "facial_fullbeard" + +/datum/sprite_accessory/facial_hair/gt + name = "Beard (Goatee)" + icon_state = "facial_gt" + +/datum/sprite_accessory/facial_hair/hip + name = "Beard (Hipster)" + icon_state = "facial_hip" + +/datum/sprite_accessory/facial_hair/jensen + name = "Beard (Jensen)" + icon_state = "facial_jensen" + +/datum/sprite_accessory/facial_hair/neckbeard + name = "Beard (Neckbeard)" + icon_state = "facial_neckbeard" + +/datum/sprite_accessory/facial_hair/vlongbeard + name = "Beard (Very Long)" + icon_state = "facial_wise" + +/datum/sprite_accessory/facial_hair/longbeard + name = "Beard (Long)" + icon_state = "facial_longbeard" + +/datum/sprite_accessory/facial_hair/fu + name = "Moustache (Fu Manchu)" + icon_state = "facial_fumanchu" + +/datum/sprite_accessory/facial_hair/hogan + name = "Moustache (Hulk Hogan)" + icon_state = "facial_hogan" //-Neek + +/datum/sprite_accessory/facial_hair/selleck + name = "Moustache (Selleck)" + icon_state = "facial_selleck" + +/datum/sprite_accessory/facial_hair/chaplin + name = "Moustache (Square)" + icon_state = "facial_chaplin" + +/datum/sprite_accessory/facial_hair/vandyke + name = "Moustache (Van Dyke)" + icon_state = "facial_vandyke" + +/datum/sprite_accessory/facial_hair/watson + name = "Moustache (Watson)" + icon_state = "facial_watson" + +/datum/sprite_accessory/facial_hair/shaved + name = "Shaved" + icon_state = null + gender = NEUTER + +/datum/sprite_accessory/facial_hair/elvis + name = "Sideburns (Elvis)" + icon_state = "facial_elvis" \ No newline at end of file diff --git a/code/modules/mob/dead/new_player/sprite_accessories/hair_head.dm b/code/modules/mob/dead/new_player/sprite_accessories/hair_head.dm new file mode 100644 index 0000000000..66c79ea0f0 --- /dev/null +++ b/code/modules/mob/dead/new_player/sprite_accessories/hair_head.dm @@ -0,0 +1,460 @@ +////////////////////// +// Hair Definitions // +////////////////////// +/datum/sprite_accessory/hair + icon = 'icons/mob/human_face.dmi' // default icon for all hairs + + // please make sure they're sorted alphabetically and, where needed, categorized + // try to capitalize the names please~ + // try to spell + // you do not need to define _s or _l sub-states, game automatically does this for you + +/datum/sprite_accessory/hair/afro + name = "Afro" + icon_state = "hair_afro" + +/datum/sprite_accessory/hair/afro2 + name = "Afro 2" + icon_state = "hair_afro2" + +/datum/sprite_accessory/hair/afro_large + name = "Afro (Large)" + icon_state = "hair_bigafro" + +/datum/sprite_accessory/hair/antenna + name = "Ahoge" + icon_state = "hair_antenna" + +/datum/sprite_accessory/hair/bald + name = "Bald" + icon_state = null + +/datum/sprite_accessory/hair/balding + name = "Balding Hair" + icon_state = "hair_e" + +/datum/sprite_accessory/hair/bedhead + name = "Bedhead" + icon_state = "hair_bedhead" + +/datum/sprite_accessory/hair/bedhead2 + name = "Bedhead 2" + icon_state = "hair_bedheadv2" + +/datum/sprite_accessory/hair/bedhead3 + name = "Bedhead 3" + icon_state = "hair_bedheadv3" + +/datum/sprite_accessory/hair/beehive + name = "Beehive" + icon_state = "hair_beehive" + +/datum/sprite_accessory/hair/beehive2 + name = "Beehive 2" + icon_state = "hair_beehivev2" + +/datum/sprite_accessory/hair/bob + name = "Bob Hair" + icon_state = "hair_bob" + +/datum/sprite_accessory/hair/bob2 + name = "Bob Hair 2" + icon_state = "hair_bob2" + +/datum/sprite_accessory/hair/bob3 + name = "Bob Hair 3" + icon_state = "hair_bobcut" + +/datum/sprite_accessory/hair/bobcurl + name = "Bobcurl" + icon_state = "hair_bobcurl" + +/datum/sprite_accessory/hair/boddicker + name = "Boddicker" + icon_state = "hair_boddicker" + +/datum/sprite_accessory/hair/bowl + name = "Bowl" + icon_state = "hair_bowlcut" + +/datum/sprite_accessory/hair/braid + name = "Braid (Floorlength)" + icon_state = "hair_braid" + +/datum/sprite_accessory/hair/braided + name = "Braided" + icon_state = "hair_braided" + +/datum/sprite_accessory/hair/front_braid + name = "Braided Front" + icon_state = "hair_braidfront" + +/datum/sprite_accessory/hair/not_floorlength_braid + name = "Braid (High)" + icon_state = "hair_braid2" + +/datum/sprite_accessory/hair/lowbraid + name = "Braid (Low)" + icon_state = "hair_hbraid" + +/datum/sprite_accessory/hair/shortbraid + name = "Braid (Short)" + icon_state = "hair_shortbraid" + +/datum/sprite_accessory/hair/braidtail + name = "Braided Tail" + icon_state = "hair_braidtail" + +/datum/sprite_accessory/hair/bun + name = "Bun Head" + icon_state = "hair_bun" + +/datum/sprite_accessory/hair/bun2 + name = "Bun Head 2" + icon_state = "hair_bunhead2" + +/datum/sprite_accessory/hair/largebun + name = "Bun (Large)" + icon_state = "hair_largebun" + +/datum/sprite_accessory/hair/business + name = "Business Hair" + icon_state = "hair_business" + +/datum/sprite_accessory/hair/business2 + name = "Business Hair 2" + icon_state = "hair_business2" + +/datum/sprite_accessory/hair/business3 + name = "Business Hair 3" + icon_state = "hair_business3" + +/datum/sprite_accessory/hair/business4 + name = "Business Hair 4" + icon_state = "hair_business4" + +/datum/sprite_accessory/hair/buzz + name = "Buzzcut" + icon_state = "hair_buzzcut" + +/datum/sprite_accessory/hair/combover + name = "Combover" + icon_state = "hair_combover" + +/datum/sprite_accessory/hair/crew + name = "Crewcut" + icon_state = "hair_crewcut" + +/datum/sprite_accessory/hair/curls + name = "Curls" + icon_state = "hair_curls" + +/datum/sprite_accessory/hair/cut + name = "Cut Hair" + icon_state = "hair_c" + +/datum/sprite_accessory/hair/devillock + name = "Devil Lock" + icon_state = "hair_devilock" + +/datum/sprite_accessory/hair/dreadlocks + name = "Dreadlocks" + icon_state = "hair_dreads" + +/datum/sprite_accessory/hair/drillhair + name = "Drill Hair" + icon_state = "hair_drillhair" + +/datum/sprite_accessory/hair/drillhairextended + name = "Drill Hair (Extended)" + icon_state = "hair_drillhairextended" + +/datum/sprite_accessory/hair/emo + name = "Emo" + icon_state = "hair_emo" + +/datum/sprite_accessory/hair/feather + name = "Feather" + icon_state = "hair_feather" + +/datum/sprite_accessory/hair/sargeant + name = "Flat Top" + icon_state = "hair_sargeant" + +/datum/sprite_accessory/hair/bigflattop + name = "Flat Top (Big)" + icon_state = "hair_bigflattop" + +/datum/sprite_accessory/hair/fag + name = "Flow Hair" + icon_state = "hair_f" + +/datum/sprite_accessory/hair/gelled + name = "Gelled Back" + icon_state = "hair_gelled" + +/datum/sprite_accessory/hair/gentle + name = "Gentle" + icon_state = "hair_gentle" + +/datum/sprite_accessory/hair/halfbang + name = "Half-banged Hair" + icon_state = "hair_halfbang" + +/datum/sprite_accessory/hair/halfbang2 + name = "Half-banged Hair 2" + icon_state = "hair_halfbang2" + +/datum/sprite_accessory/hair/hedgehog + name = "Hedgehog Hair" + icon_state = "hair_hedgehog" + +/datum/sprite_accessory/hair/himecut + name = "Hime Cut" + icon_state = "hair_himecut" + +/datum/sprite_accessory/hair/himecut2 + name = "Hime Cut 2" + icon_state = "hair_himecut2" + +/datum/sprite_accessory/hair/himeup + name = "Hime Updo" + icon_state = "hair_himeup" + +/datum/sprite_accessory/hair/hitop + name = "Hitop" + icon_state = "hair_hitop" + +/datum/sprite_accessory/hair/jensen + name = "Jensen Hair" + icon_state = "hair_jensen" + +/datum/sprite_accessory/hair/keanu + name = "Keanu Hair" + icon_state = "hair_keanu" + +/datum/sprite_accessory/hair/kusangi + name = "Kusanagi Hair" + icon_state = "hair_kusanagi" + +/datum/sprite_accessory/hair/long + name = "Long Hair 1" + icon_state = "hair_long" + +/datum/sprite_accessory/hair/long2 + name = "Long Hair 2" + icon_state = "hair_long2" + +/datum/sprite_accessory/hair/long3 + name = "Long Hair 3" + icon_state = "hair_long3" + +/datum/sprite_accessory/hair/long_over_eye + name = "Long Over Eye" + icon_state = "hair_longovereye" + +/datum/sprite_accessory/hair/longbangs + name = "Long Bangs" + icon_state = "hair_lbangs" + +/datum/sprite_accessory/hair/longemo + name = "Long Emo" + icon_state = "hair_longemo" + +/datum/sprite_accessory/hair/longfringe + name = "Long Fringe" + icon_state = "hair_longfringe" + +/datum/sprite_accessory/hair/sidepartlongalt + name = "Long Side Part" + icon_state = "hair_longsidepart" + +/datum/sprite_accessory/hair/megaeyebrows + name = "Mega Eyebrows" + icon_state = "hair_megaeyebrows" + +/datum/sprite_accessory/hair/messy + name = "Messy" + icon_state = "hair_messy" + +/datum/sprite_accessory/hair/mohawk + name = "Mohawk" + icon_state = "hair_d" + +/datum/sprite_accessory/hair/reversemohawk + name = "Mohawk (Reverse)" + icon_state = "hair_reversemohawk" + +/datum/sprite_accessory/hair/odango + name = "Odango" + icon_state = "hair_odango" + +/datum/sprite_accessory/hair/ombre + name = "Ombre" + icon_state = "hair_ombre" + +/datum/sprite_accessory/hair/oneshoulder + name = "One Shoulder" + icon_state = "hair_oneshoulder" + +/datum/sprite_accessory/hair/over_eye + name = "Over Eye" + icon_state = "hair_shortovereye" + +//Donator item - fractious +/datum/sprite_accessory/hair/over_eye_fr + name = "Over Eye (fract)" + icon_state = "hair_shortovereye_1f" + ckeys_allowed = list("fractious") + +/datum/sprite_accessory/hair/parted + name = "Parted" + icon_state = "hair_parted" + +/datum/sprite_accessory/hair/partedside + name = "Parted (Side)" + icon_state = "hair_part" + +/datum/sprite_accessory/hair/kagami + name = "Pigtails" + icon_state = "hair_kagami" + +/datum/sprite_accessory/hair/pigtail + name = "Pigtails 2" + icon_state = "hair_pigtails" + +/datum/sprite_accessory/hair/pigtail2 + name = "Pigtails 3" + icon_state = "hair_pigtails2" + +/datum/sprite_accessory/hair/pixie + name = "Pixie Cut" + icon_state = "hair_pixie" + +/datum/sprite_accessory/hair/pompadour + name = "Pompadour" + icon_state = "hair_pompadour" + +/datum/sprite_accessory/hair/bigpompadour + name = "Pompadour (Big)" + icon_state = "hair_bigpompadour" + +/datum/sprite_accessory/hair/ponytail1 + name = "Ponytail" + icon_state = "hair_ponytail" + +/datum/sprite_accessory/hair/ponytail2 + name = "Ponytail 2" + icon_state = "hair_ponytail2" + +/datum/sprite_accessory/hair/ponytail3 + name = "Ponytail 3" + icon_state = "hair_ponytail3" + +/datum/sprite_accessory/hair/ponytail4 + name = "Ponytail 4" + icon_state = "hair_ponytail4" + +/datum/sprite_accessory/hair/ponytail5 + name = "Ponytail 5" + icon_state = "hair_ponytail5" + +/datum/sprite_accessory/hair/highponytail + name = "Ponytail (High)" + icon_state = "hair_highponytail" + +/datum/sprite_accessory/hair/longponytail + name = "Ponytail (Long)" + icon_state = "hair_longstraightponytail" + +/datum/sprite_accessory/hair/sidetail + name = "Ponytail (Side)" + icon_state = "hair_sidetail" + +/datum/sprite_accessory/hair/sidetail2 + name = "Ponytail (Side) 2" + icon_state = "hair_sidetail2" + +/datum/sprite_accessory/hair/sidetail3 + name = "Ponytail (Side) 3" + icon_state = "hair_sidetail3" + +/datum/sprite_accessory/hair/sidetail4 + name = "Ponytail (Side) 4" + icon_state = "hair_sidetail4" + +/datum/sprite_accessory/hair/quiff + name = "Quiff" + icon_state = "hair_quiff" + +/datum/sprite_accessory/hair/short + name = "Short Hair" + icon_state = "hair_a" + +/datum/sprite_accessory/hair/shorthair2 + name = "Short Hair 2" + icon_state = "hair_shorthair2" + +/datum/sprite_accessory/hair/shorthair3 + name = "Short Hair 3" + icon_state = "hair_shorthair3" + +/datum/sprite_accessory/hair/shoulderlength + name = "Shoulder-length Hair" + icon_state = "hair_b" + +/datum/sprite_accessory/hair/sidecut + name = "Sidecut" + icon_state = "hair_sidecut" + +/datum/sprite_accessory/hair/skinhead + name = "Skinhead" + icon_state = "hair_skinhead" + +/datum/sprite_accessory/hair/protagonist + name = "Slightly Long Hair" + icon_state = "hair_protagonist" + +/datum/sprite_accessory/hair/spiky + name = "Spiky" + icon_state = "hair_spikey" + +/datum/sprite_accessory/hair/spiky2 + name = "Spiky 2" + icon_state = "hair_spiky" + +/datum/sprite_accessory/hair/spiky3 + name = "Spiky 3" + icon_state = "hair_spiky2" + +/datum/sprite_accessory/hair/swept + name = "Swept Back Hair" + icon_state = "hair_swept" + +/datum/sprite_accessory/hair/swept2 + name = "Swept Back Hair 2" + icon_state = "hair_swept2" + +/datum/sprite_accessory/hair/tressshoulder + name = "Tress Shoulder" + icon_state = "hair_tressshoulder" + +/datum/sprite_accessory/hair/updo + name = "Updo" + icon_state = "hair_updo" + +/datum/sprite_accessory/hair/longer + name = "Very Long Hair" + icon_state = "hair_vlong" + +/datum/sprite_accessory/hair/longest + name = "Very Long Hair 2" + icon_state = "hair_longest" + +/datum/sprite_accessory/hair/longest2 + name = "Very Long Over Eye" + icon_state = "hair_longest2" + +/datum/sprite_accessory/hair/longestalt + name = "Very Long with Fringe" + icon_state = "hair_vlongfringe" \ No newline at end of file diff --git a/code/modules/mob/dead/new_player/sprite_accessories/horns.dm b/code/modules/mob/dead/new_player/sprite_accessories/horns.dm new file mode 100644 index 0000000000..607ad650e3 --- /dev/null +++ b/code/modules/mob/dead/new_player/sprite_accessories/horns.dm @@ -0,0 +1,26 @@ +/datum/sprite_accessory/horns + icon = 'icons/mob/mutant_bodyparts.dmi' + +/datum/sprite_accessory/horns/none + name = "None" + icon_state = "none" + +/datum/sprite_accessory/horns/simple + name = "Simple" + icon_state = "simple" + +/datum/sprite_accessory/horns/short + name = "Short" + icon_state = "short" + +/datum/sprite_accessory/horns/curled + name = "Curled" + icon_state = "curled" + +/datum/sprite_accessory/horns/ram + name = "Ram" + icon_state = "ram" + +/datum/sprite_accessory/horns/angler + name = "Angeler" + icon_state = "angler" \ No newline at end of file diff --git a/code/modules/mob/dead/new_player/sprite_accessories/legs.dm b/code/modules/mob/dead/new_player/sprite_accessories/legs.dm new file mode 100644 index 0000000000..7663100822 --- /dev/null +++ b/code/modules/mob/dead/new_player/sprite_accessories/legs.dm @@ -0,0 +1,8 @@ +/datum/sprite_accessory/legs //legs are a special case, they aren't actually sprite_accessories but are updated with them. + icon = null //These datums exist for selecting legs on preference, and little else + +/datum/sprite_accessory/legs/none + name = "Normal Legs" + +/datum/sprite_accessory/legs/digitigrade_lizard + name = "Digitigrade Legs" \ No newline at end of file diff --git a/code/modules/mob/dead/new_player/sprite_accessories/moth_wings.dm b/code/modules/mob/dead/new_player/sprite_accessories/moth_wings.dm new file mode 100644 index 0000000000..6b8036bd69 --- /dev/null +++ b/code/modules/mob/dead/new_player/sprite_accessories/moth_wings.dm @@ -0,0 +1,68 @@ +/datum/sprite_accessory/moth_wings + icon = 'icons/mob/wings.dmi' + color_src = null + +/datum/sprite_accessory/moth_wings/plain + name = "Plain" + icon_state = "plain" + +/datum/sprite_accessory/moth_wings/monarch + name = "Monarch" + icon_state = "monarch" + +/datum/sprite_accessory/moth_wings/luna + name = "Luna" + icon_state = "luna" + +/datum/sprite_accessory/moth_wings/atlas + name = "Atlas" + icon_state = "atlas" + +/datum/sprite_accessory/moth_wings/reddish + name = "Reddish" + icon_state = "redish" + +/datum/sprite_accessory/moth_wings/royal + name = "Royal" + icon_state = "royal" + +/datum/sprite_accessory/moth_wings/gothic + name = "Gothic" + icon_state = "gothic" + +/datum/sprite_accessory/moth_wings/lovers + name = "Lovers" + icon_state = "lovers" + +/datum/sprite_accessory/moth_wings/whitefly + name = "White Fly" + icon_state = "whitefly" + +/datum/sprite_accessory/moth_wings/punished + name = "Burnt Off" + icon_state = "punished" + locked = TRUE + +/datum/sprite_accessory/moth_wings/firewatch + name = "Firewatch" + icon_state = "firewatch" + +/datum/sprite_accessory/moth_wings/deathhead + name = "Deathshead" + icon_state = "deathhead" + +/datum/sprite_accessory/moth_wings/poison + name = "Poison" + icon_state = "poison" + +/datum/sprite_accessory/moth_wings/ragged + name = "Ragged" + icon_state = "ragged" + +/datum/sprite_accessory/moth_wings/moonfly + name = "Moon Fly" + icon_state = "moonfly" + +/datum/sprite_accessory/moth_wings/snow + name = "Snow" + icon_state = "snow" diff --git a/code/modules/mob/dead/new_player/sprite_accessories/pines.dm b/code/modules/mob/dead/new_player/sprite_accessories/pines.dm new file mode 100644 index 0000000000..4ccbc3d9ea --- /dev/null +++ b/code/modules/mob/dead/new_player/sprite_accessories/pines.dm @@ -0,0 +1,53 @@ +/datum/sprite_accessory/spines + icon = 'icons/mob/mutant_bodyparts.dmi' + +/datum/sprite_accessory/spines_animated + icon = 'icons/mob/mutant_bodyparts.dmi' + +/datum/sprite_accessory/spines/none + name = "None" + icon_state = "none" + +/datum/sprite_accessory/spines_animated/none + name = "None" + icon_state = "none" + +/datum/sprite_accessory/spines/short + name = "Short" + icon_state = "short" + +/datum/sprite_accessory/spines_animated/short + name = "Short" + icon_state = "short" + +/datum/sprite_accessory/spines/shortmeme + name = "Short + Membrane" + icon_state = "shortmeme" + +/datum/sprite_accessory/spines_animated/shortmeme + name = "Short + Membrane" + icon_state = "shortmeme" + +/datum/sprite_accessory/spines/long + name = "Long" + icon_state = "long" + +/datum/sprite_accessory/spines_animated/long + name = "Long" + icon_state = "long" + +/datum/sprite_accessory/spines/longmeme + name = "Long + Membrane" + icon_state = "longmeme" + +/datum/sprite_accessory/spines_animated/longmeme + name = "Long + Membrane" + icon_state = "longmeme" + +/datum/sprite_accessory/spines/aqautic + name = "Aquatic" + icon_state = "aqua" + +/datum/sprite_accessory/spines_animated/aqautic + name = "Aquatic" + icon_state = "aqua" \ No newline at end of file diff --git a/code/modules/mob/dead/new_player/sprite_accessories/snouts.dm b/code/modules/mob/dead/new_player/sprite_accessories/snouts.dm new file mode 100644 index 0000000000..c663c08d69 --- /dev/null +++ b/code/modules/mob/dead/new_player/sprite_accessories/snouts.dm @@ -0,0 +1,18 @@ +/datum/sprite_accessory/snouts + icon = 'icons/mob/mutant_bodyparts.dmi' + +/datum/sprite_accessory/snouts/sharp + name = "Sharp" + icon_state = "sharp" + +/datum/sprite_accessory/snouts/round + name = "Round" + icon_state = "round" + +/datum/sprite_accessory/snouts/sharplight + name = "Sharp + Light" + icon_state = "sharplight" + +/datum/sprite_accessory/snouts/roundlight + name = "Round + Light" + icon_state = "roundlight" \ No newline at end of file diff --git a/code/modules/mob/dead/new_player/sprite_accessories/socks.dm b/code/modules/mob/dead/new_player/sprite_accessories/socks.dm new file mode 100644 index 0000000000..5a5d37d4e7 --- /dev/null +++ b/code/modules/mob/dead/new_player/sprite_accessories/socks.dm @@ -0,0 +1,96 @@ +/////////////////////// +// Socks Definitions // +/////////////////////// + +/datum/sprite_accessory/socks + icon = 'icons/mob/underwear.dmi' + +/datum/sprite_accessory/socks/nude + name = "Nude" + icon_state = null + +// please make sure they're sorted alphabetically and categorized + +/datum/sprite_accessory/socks/black_knee + name = "Knee-high (Black)" + icon_state = "black_knee" + +/datum/sprite_accessory/socks/commie_knee + name = "Knee-High (Commie)" + icon_state = "commie_knee" + +/datum/sprite_accessory/socks/usa_knee + name = "Knee-High (Freedom)" + icon_state = "assblastusa_knee" + +/datum/sprite_accessory/socks/rainbow_knee + name = "Knee-high (Rainbow)" + icon_state = "rainbow_knee" + +/datum/sprite_accessory/socks/striped_knee + name = "Knee-high (Striped)" + icon_state = "striped_knee" + +/datum/sprite_accessory/socks/thin_knee + name = "Knee-high (Thin)" + icon_state = "thin_knee" + +/datum/sprite_accessory/socks/uk_knee + name = "Knee-High (UK)" + icon_state = "uk_knee" + +/datum/sprite_accessory/socks/white_knee + name = "Knee-high (White)" + icon_state = "white_knee" + +/datum/sprite_accessory/socks/black_norm + name = "Normal (Black)" + icon_state = "black_norm" + +/datum/sprite_accessory/socks/white_norm + name = "Normal (White)" + icon_state = "white_norm" + +/datum/sprite_accessory/socks/pantyhose + name = "Pantyhose" + icon_state = "pantyhose" + +/datum/sprite_accessory/socks/black_short + name = "Short (Black)" + icon_state = "black_short" + +/datum/sprite_accessory/socks/white_short + name = "Short (White)" + icon_state = "white_short" + +/datum/sprite_accessory/socks/black_thigh + name = "Thigh-high (Black)" + icon_state = "black_thigh" + +/datum/sprite_accessory/socks/commie_thigh + name = "Thigh-high (Commie)" + icon_state = "commie_thigh" + +/datum/sprite_accessory/socks/usa_thigh + name = "Thigh-high (Freedom)" + icon_state = "assblastusa_thigh" + +/datum/sprite_accessory/socks/rainbow_thigh + name = "Thigh-high (Rainbow)" + icon_state = "rainbow_thigh" + +/datum/sprite_accessory/socks/striped_thigh + name = "Thigh-high (Striped)" + icon_state = "striped_thigh" + +/datum/sprite_accessory/socks/thin_thigh + name = "Thigh-high (Thin)" + icon_state = "thin_thigh" + +/datum/sprite_accessory/socks/uk_thigh + name = "Thigh-high (UK)" + icon_state = "uk_thigh" + +/datum/sprite_accessory/socks/white_thigh + name = "Thigh-high (White)" + icon_state = "white_thigh" \ No newline at end of file diff --git a/code/modules/mob/dead/new_player/sprite_accessories/tails.dm b/code/modules/mob/dead/new_player/sprite_accessories/tails.dm new file mode 100644 index 0000000000..31faabf663 --- /dev/null +++ b/code/modules/mob/dead/new_player/sprite_accessories/tails.dm @@ -0,0 +1,55 @@ +/datum/sprite_accessory/tails + icon = 'icons/mob/mutant_bodyparts.dmi' + +/datum/sprite_accessory/tails_animated + icon = 'icons/mob/mutant_bodyparts.dmi' + +/datum/sprite_accessory/tails/lizard/smooth + name = "Smooth" + icon_state = "smooth" + +/datum/sprite_accessory/tails_animated/lizard/smooth + name = "Smooth" + icon_state = "smooth" + +/datum/sprite_accessory/tails/lizard/dtiger + name = "Dark Tiger" + icon_state = "dtiger" + +/datum/sprite_accessory/tails_animated/lizard/dtiger + name = "Dark Tiger" + icon_state = "dtiger" + +/datum/sprite_accessory/tails/lizard/ltiger + name = "Light Tiger" + icon_state = "ltiger" + +/datum/sprite_accessory/tails_animated/lizard/ltiger + name = "Light Tiger" + icon_state = "ltiger" + +/datum/sprite_accessory/tails/lizard/spikes + name = "Spikes" + icon_state = "spikes" + +/datum/sprite_accessory/tails_animated/lizard/spikes + name = "Spikes" + icon_state = "spikes" + +/datum/sprite_accessory/tails/human/none + name = "None" + icon_state = "none" + +/datum/sprite_accessory/tails_animated/human/none + name = "None" + icon_state = "none" +/* +/datum/sprite_accessory/tails/human/cat + name = "Cat" + icon_state = "cat" + color_src = HAIR + +/datum/sprite_accessory/tails_animated/human/cat + name = "Cat" + icon_state = "cat" + color_src = HAIR*/ \ No newline at end of file diff --git a/code/modules/mob/dead/new_player/sprite_accessories/undershirt.dm b/code/modules/mob/dead/new_player/sprite_accessories/undershirt.dm new file mode 100644 index 0000000000..7c66ef51e3 --- /dev/null +++ b/code/modules/mob/dead/new_player/sprite_accessories/undershirt.dm @@ -0,0 +1,308 @@ +//////////////////////////// +// Undershirt Definitions // +//////////////////////////// + +/datum/sprite_accessory/undershirt + icon = 'icons/mob/underwear.dmi' + gender = NEUTER + +/datum/sprite_accessory/undershirt/nude + name = "Nude" + icon_state = null + +// please make sure they're sorted alphabetically and categorized + +/datum/sprite_accessory/undershirt/bluejersey + name = "Shirt, Jersey - Blue" + icon_state = "shirt_bluejersey" + +/datum/sprite_accessory/undershirt/redjersey + name = "Shirt, Jersey - Red" + icon_state = "shirt_redjersey" + +/datum/sprite_accessory/undershirt/bluepolo + name = "Shirt, Polo - Blue" + icon_state = "bluepolo" + +/datum/sprite_accessory/undershirt/grayyellowpolo + name = "Shirt, Polo - Gray, Yellow" + icon_state = "grayyellowpolo" + +/datum/sprite_accessory/undershirt/redpolo + name = "Shirt, Polo - Red" + icon_state = "redpolo" + +/datum/sprite_accessory/undershirt/whitepolo + name = "Shirt, Polo - White" + icon_state = "whitepolo" + +/datum/sprite_accessory/undershirt/alienshirt + name = "Shirt - Alien" + icon_state = "shirt_alien" + +/datum/sprite_accessory/undershirt/mondmondjaja + name = "Shirt - Band" + icon_state = "band" + +/datum/sprite_accessory/undershirt/shirt_black + name = "Shirt - Black" + icon_state = "shirt_black" + +/datum/sprite_accessory/undershirt/blueshirt + name = "Shirt - Blue" + icon_state = "shirt_blue" + +/datum/sprite_accessory/undershirt/clownshirt + name = "Shirt - Clown" + icon_state = "shirt_clown" + +/datum/sprite_accessory/undershirt/commie + name = "Shirt - Commie" + icon_state = "shirt_commie" + +/datum/sprite_accessory/undershirt/greenshirt + name = "Shirt - Green" + icon_state = "shirt_green" + +/datum/sprite_accessory/undershirt/shirt_grey + name = "Shirt - Grey" + icon_state = "shirt_grey" + +/datum/sprite_accessory/undershirt/ian + name = "Shirt - Ian" + icon_state = "ian" + +/datum/sprite_accessory/undershirt/ilovent + name = "Shirt - I Love NT" + icon_state = "ilovent" + +/datum/sprite_accessory/undershirt/lover + name = "Shirt - Lover" + icon_state = "lover" + +/datum/sprite_accessory/undershirt/matroska + name = "Shirt - Matroska" + icon_state = "matroska" + +/datum/sprite_accessory/undershirt/meat + name = "Shirt - Meat" + icon_state = "shirt_meat" + +/datum/sprite_accessory/undershirt/nano + name = "Shirt - Nanotrasen" + icon_state = "shirt_nano" + +/datum/sprite_accessory/undershirt/peace + name = "Shirt - Peace" + icon_state = "peace" + +/datum/sprite_accessory/undershirt/pacman + name = "Shirt - Pogoman" + icon_state = "pogoman" + +/datum/sprite_accessory/undershirt/question + name = "Shirt - Question" + icon_state = "shirt_question" + +/datum/sprite_accessory/undershirt/redshirt + name = "Shirt - Red" + icon_state = "shirt_red" + +/datum/sprite_accessory/undershirt/skull + name = "Shirt - Skull" + icon_state = "shirt_skull" + +/datum/sprite_accessory/undershirt/ss13 + name = "Shirt - SS13" + icon_state = "shirt_ss13" + +/datum/sprite_accessory/undershirt/stripe + name = "Shirt - Striped" + icon_state = "shirt_stripes" + +/datum/sprite_accessory/undershirt/tiedye + name = "Shirt - Tie-dye" + icon_state = "shirt_tiedye" + +/datum/sprite_accessory/undershirt/uk + name = "Shirt - UK" + icon_state = "uk" + +/datum/sprite_accessory/undershirt/usa + name = "Shirt - USA" + icon_state = "shirt_assblastusa" + +/datum/sprite_accessory/undershirt/shirt_white + name = "Shirt - White" + icon_state = "shirt_white" + +/datum/sprite_accessory/undershirt/blackshortsleeve + name = "Shirt, Short Sleeved - Black" + icon_state = "blackshortsleeve" + +/datum/sprite_accessory/undershirt/blueshortsleeve + name = "Shirt, Short Sleeved - Blue" + icon_state = "blueshortsleeve" + +/datum/sprite_accessory/undershirt/greenshortsleeve + name = "Shirt, Short Sleeved - Green" + icon_state = "greenshortsleeve" + +/datum/sprite_accessory/undershirt/purpleshortsleeve + name = "Shirt, Short Sleeved - Purple" + icon_state = "purpleshortsleeve" + +/datum/sprite_accessory/undershirt/whiteshortsleeve + name = "Shirt, Short Sleeved - White" + icon_state = "whiteshortsleeve" + +/datum/sprite_accessory/undershirt/blueshirtsport + name = "Shirt, Sports - Blue" + icon_state = "blueshirtsport" + gender = NEUTER + +/datum/sprite_accessory/undershirt/greenshirtsport + name = "Shirt, Sports - Green" + icon_state = "greenshirtsport" + gender = NEUTER + +/datum/sprite_accessory/undershirt/redshirtsport + name = "Shirt, Sports - Red" + icon_state = "redshirtsport" + gender = NEUTER + +/datum/sprite_accessory/undershirt/redtop + name = "Shirt, Short - Red" + icon_state = "redtop" + +/datum/sprite_accessory/undershirt/whitetop + name = "Shirt, Short - White" + icon_state = "whitetop" + +/datum/sprite_accessory/undershirt/tshirt_blue + name = "T-Shirt - Blue" + icon_state = "blueshirt" + +/datum/sprite_accessory/undershirt/tshirt_green + name = "T-Shirt - Green" + icon_state = "greenshirt" + +/datum/sprite_accessory/undershirt/tshirt_red + name = "T-Shirt - Red" + icon_state = "redshirt" + +/datum/sprite_accessory/undershirt/yellowshirt + name = "T-Shirt - Yellow" + icon_state = "yellowshirt" + +/datum/sprite_accessory/undershirt/tank_black + name = "Tank Top - Black" + icon_state = "tank_black" + +/datum/sprite_accessory/undershirt/tankfire + name = "Tank Top - Fire" + icon_state = "tank_fire" + +/datum/sprite_accessory/undershirt/tank_grey + name = "Tank Top - Grey" + icon_state = "tank_grey" + +/datum/sprite_accessory/undershirt/female_midriff + name = "Tank Top - Midriff" + icon_state = "tank_midriff" + +/datum/sprite_accessory/undershirt/tank_red + name = "Tank Top - Red" + icon_state = "tank_red" + +/datum/sprite_accessory/undershirt/tankstripe + name = "Tank Top - Striped" + icon_state = "tank_stripes" + +/datum/sprite_accessory/undershirt/tank_white + name = "Tank Top - White" + icon_state = "tank_white" + +/datum/sprite_accessory/undershirt/female_red + name = "Bra - Red" + icon_state = "bra_red" + +/datum/sprite_accessory/undershirt/female_pink + name = "Bra - Pink" + icon_state = "bra_pink" + +/datum/sprite_accessory/undershirt/female_kinky + name = "Bra - Kinky Black" + icon_state = "bra_kinky" + +/datum/sprite_accessory/undershirt/female_green + name = "Bra - Green" + icon_state = "bra_green" + +/datum/sprite_accessory/undershirt/female_commie + name = "Bra - Freedom" + icon_state = "bra_assblastusa" + +/datum/sprite_accessory/undershirt/female_commie + name = "Bra - Commie" + icon_state = "bra_commie" + +/datum/sprite_accessory/undershirt/female_babyblue + name = "Bra, Baby Blue" + icon_state = "bra_babyblue" + +/datum/sprite_accessory/undershirt/female_black + name = "Bra - Black" + icon_state = "bra_black" + +/datum/sprite_accessory/undershirt/female_uk + name = "Bra - UK" + icon_state = "bra_uk" + +/datum/sprite_accessory/undershirt/female_white + name = "Bra - White" + icon_state = "bra_white" + +/datum/sprite_accessory/undershirt/female_white_neko + name = "Bra, Neko - white" + icon_state = "bra_neko_white" + +/datum/sprite_accessory/undershirt/female_black_neko + name = "Bra, Neko - Black" + icon_state = "bra_neko_black" + +/datum/sprite_accessory/undershirt/female_blackalt + name = "Bra, Sports - Black" + icon_state = "bra_sports_black" + +/datum/sprite_accessory/undershirt/sports_bra + name = "Bra, Sports 1 - White" + icon_state = "sports_bra" + +/datum/sprite_accessory/undershirt/female_whitealt + name = "Bra, Sports 2 - White" + icon_state = "bra_sports_white" + +/datum/sprite_accessory/undershirt/sports_bra2 + name = "Bra, Sports 3 - White" + icon_state = "sports_bra_alt" + +/datum/sprite_accessory/undershirt/female_yellow + name = "Bra - Yellow" + icon_state = "bra_yellow" + +/datum/sprite_accessory/undershirt/female_thong + name = "Bra, Strapless - Pink" + icon_state = "bra_strapless_pink" + +/datum/sprite_accessory/undershirt/female_blue + name = "Bra, Strapless - Blue" + icon_state = "bra_blue" + +/datum/sprite_accessory/undershirt/swimsuit_green + name = "Swimsuit, Top - Green" + icon_state = "bra_swimming_green" + +/datum/sprite_accessory/undershirt/swimsuit_purple + name = "Swimsuit, Top - Purple" + icon_state = "bra_swimming_purple" \ No newline at end of file diff --git a/code/modules/mob/dead/new_player/sprite_accessories/underwear.dm b/code/modules/mob/dead/new_player/sprite_accessories/underwear.dm new file mode 100644 index 0000000000..6beed231aa --- /dev/null +++ b/code/modules/mob/dead/new_player/sprite_accessories/underwear.dm @@ -0,0 +1,171 @@ +/////////////////////////// +// Underwear Definitions // +/////////////////////////// +/datum/sprite_accessory/underwear + icon = 'icons/mob/underwear.dmi' + gender = NEUTER + +/datum/sprite_accessory/underwear/nude + name = "Nude" + icon_state = null + +/datum/sprite_accessory/underwear/mankini + name = "Mankini - Green" + icon_state = "mankini_green" + +/datum/sprite_accessory/underwear/male_kinky + name = "Jockstrap - White" + icon_state = "jockstrap_white" + +/datum/sprite_accessory/underwear/male_white + name = "Briefs - White" + icon_state = "briefs_white" + +/datum/sprite_accessory/underwear/male_black + name = "Briefs - Black" + icon_state = "briefs_black" + +/datum/sprite_accessory/underwear/male_grey + name = "Briefs - Grey" + icon_state = "briefs_grey" + +/datum/sprite_accessory/underwear/male_red + name = "Briefs - Red" + icon_state = "briefs_red" + +/datum/sprite_accessory/underwear/male_green + name = "Briefs - Green" + icon_state = "briefs_green" + +/datum/sprite_accessory/underwear/male_blue + name = "Briefs - Blue" + icon_state = "briefs_blue" + +/datum/sprite_accessory/underwear/male_blackalt + name = "Boxers - Black" + icon_state = "boxers_black" + +/datum/sprite_accessory/underwear/male_greyalt + name = "Boxers - Grey" + icon_state = "boxers_grey" + +/datum/sprite_accessory/underwear/male_hearts + name = "Boxers - Heart" + icon_state = "boxers_heart" + +/datum/sprite_accessory/underwear/male_stripe + name = "Boxers - Striped" + icon_state = "boxers_striped" + +/datum/sprite_accessory/underwear/male_commie + name = "Boxers - Striped Communist" + icon_state = "boxers_commie" + +/datum/sprite_accessory/underwear/male_usastripe + name = "Boxers - Striped Freedom" + icon_state = "boxers_assblastusa" + +/datum/sprite_accessory/underwear/male_uk + name = "Boxers - Striped UK" + icon_state = "boxers_uk" + + +/datum/sprite_accessory/underwear/female_whitealt + name = "Boxer Briefs - White" + icon_state = "boxer_briefs_white" + +/datum/sprite_accessory/underwear/female_blackalt + name = "Boxer Briefs - Black" + icon_state = "boxer_briefs_black" + +/datum/sprite_accessory/underwear/female_pink + name = "Boxer Briefs - Pink" + icon_state = "boxer_briefs_pink" + +/datum/sprite_accessory/underwear/female_babyblue + name = "Boxer Briefs - Baby Blue" + icon_state = "boxer_briefs_babyblue" + +/datum/sprite_accessory/underwear/female_yellow + name = "Boxer Briefs - Yellow" + icon_state = "boxer_briefs_yellow" + + +/datum/sprite_accessory/underwear/female_black + name = "Panties - Black" + icon_state = "panties_black" + +/datum/sprite_accessory/underwear/female_blue + name = "Panties - Blue" + icon_state = "panties_blue" + +/datum/sprite_accessory/underwear/female_commie + name = "Panties - Commie" + icon_state = "panties_commie" + +/datum/sprite_accessory/underwear/female_usastripe + name = "Panties - Freedom" + icon_state = "panties_assblastusa" + +/datum/sprite_accessory/underwear/female_green + name = "Panties - Green" + icon_state = "panties_green" + +/datum/sprite_accessory/underwear/female_kinky + name = "Panties - Kinky Black" + icon_state = "panties_kinky" + +/datum/sprite_accessory/underwear/female_red + name = "Panties - Red" + icon_state = "panties_red" + +/datum/sprite_accessory/underwear/female_uk + name = "Panties - UK" + icon_state = "panties_uk" + +/datum/sprite_accessory/underwear/female_white + name = "Panties - White" + icon_state = "panties_white" + +/datum/sprite_accessory/underwear/female_white_neko + name = "Panties, Neko - White" + icon_state = "panties_neko_white" + +/datum/sprite_accessory/underwear/female_black_neko + name = "Panties, Neko - Black" + icon_state = "panties_neko_black" + + +/datum/sprite_accessory/underwear/swimsuit_red + name = "Swimsuit, One Piece - Red" + icon_state = "swimming_red" + +/datum/sprite_accessory/underwear/swimsuit + name = "Swimsuit, One Piece - Black" + icon_state = "swimming_black" + +/datum/sprite_accessory/underwear/swimsuit_blue + name = "Swimsuit, One Piece - Striped Blue" + icon_state = "swimming_blue" + +/datum/sprite_accessory/underwear/swimsuit_green + name = "Swimsuit, Bottom - Green" + icon_state = "panties_swimming_green" + +/datum/sprite_accessory/underwear/swimsuit_purple + name = "Swimsuit, Bottom - Purple" + icon_state = "panties_swimming_purple" + +/datum/sprite_accessory/underwear/female_thong_black + name = "Thong - Black" + icon_state = "thong_black" + +/datum/sprite_accessory/underwear/female_thong + name = "Thong - Pink" + icon_state = "thong_pink" + +/datum/sprite_accessory/underwear/female_babydoll + name = "Babydoll - Black" + icon_state = "babydoll" + + diff --git a/code/modules/mob/dead/new_player/sprite_accessories/wings.dm b/code/modules/mob/dead/new_player/sprite_accessories/wings.dm new file mode 100644 index 0000000000..d051b2f07a --- /dev/null +++ b/code/modules/mob/dead/new_player/sprite_accessories/wings.dm @@ -0,0 +1,26 @@ +/datum/sprite_accessory/wings/none + name = "None" + icon_state = "none" + +/datum/sprite_accessory/wings_open + icon = 'icons/mob/wings.dmi' + +/datum/sprite_accessory/wings_open/angel + name = "Angel" + icon_state = "angel" + color_src = 0 + dimension_x = 46 + center = TRUE + dimension_y = 34 + +/datum/sprite_accessory/wings + icon = 'icons/mob/wings.dmi' + +/datum/sprite_accessory/wings/angel + name = "Angel" + icon_state = "angel" + color_src = 0 + dimension_x = 46 + center = TRUE + dimension_y = 34 + locked = TRUE \ No newline at end of file diff --git a/code/modules/mob/living/carbon/human/emote.dm b/code/modules/mob/living/carbon/human/emote.dm index 950ac5fb8b..d1d5fb7cd4 100644 --- a/code/modules/mob/living/carbon/human/emote.dm +++ b/code/modules/mob/living/carbon/human/emote.dm @@ -39,6 +39,19 @@ restraint_check = TRUE emote_type = EMOTE_AUDIBLE +/datum/emote/living/carbon/human/mawp + key = "mawp" + key_third_person = "mawps" + message = "mawps annoyingly." + emote_type = EMOTE_AUDIBLE + +/datum/emote/living/carbon/human/mawp/run_emote(mob/living/user, params) + . = ..() + if(.) + if(ishuman(user)) + if(prob(10)) + user.adjustEarDamage(-5, -5) + /datum/emote/living/carbon/human/mumble key = "mumble" key_third_person = "mumbles" diff --git a/code/modules/mob/living/carbon/human/examine.dm b/code/modules/mob/living/carbon/human/examine.dm index c6ba900b13..26e19ff376 100644 --- a/code/modules/mob/living/carbon/human/examine.dm +++ b/code/modules/mob/living/carbon/human/examine.dm @@ -18,6 +18,16 @@ var/list/obscured = check_obscured_slots() var/skipface = (wear_mask && (wear_mask.flags_inv & HIDEFACE)) || (head && (head.flags_inv & HIDEFACE)) + if(ishuman(src)) //user just returned, y'know, the user's own species. dumb. + var/mob/living/carbon/human/H = src + var/datum/species/pref_species = H.dna.species + if(get_visible_name() == "Unknown") // same as flavor text, but hey it works. + msg += "You can't make out what species they are.\n" + else if(skipface) + msg += "You can't make out what species they are.\n" + else + msg += "[t_He] [t_is] a [H.dna.custom_species ? H.dna.custom_species : pref_species.name]!\n" + //uniform if(w_uniform && !(SLOT_W_UNIFORM in obscured)) //accessory diff --git a/code/modules/mob/living/carbon/human/human_defines.dm b/code/modules/mob/living/carbon/human/human_defines.dm index 4f168d97fc..d1ec7f3e4b 100644 --- a/code/modules/mob/living/carbon/human/human_defines.dm +++ b/code/modules/mob/living/carbon/human/human_defines.dm @@ -47,6 +47,8 @@ var/nameless = FALSE //For drones of both the insectoid and robotic kind. And other types of nameless critters. + var/custom_species = null + var/datum/personal_crafting/handcrafting var/datum/physiology/physiology diff --git a/code/modules/mob/living/carbon/human/say.dm b/code/modules/mob/living/carbon/human/say.dm index 3cdaf71e68..7ce3f78da0 100644 --- a/code/modules/mob/living/carbon/human/say.dm +++ b/code/modules/mob/living/carbon/human/say.dm @@ -1,9 +1,14 @@ /mob/living/carbon/human/say_mod(input, message_mode) verb_say = dna.species.say_mod - if(slurring) - return "slurs" - else - . = ..() + switch(slurring) + if(10 to 25) + return "jumbles" + if(25 to 50) + return "slurs" + if(50 to INFINITY) + return "garbles" + else + . = ..() /mob/living/carbon/human/treat_message(message) message = dna.species.handle_speech(message,src) diff --git a/code/modules/mob/living/carbon/human/species.dm b/code/modules/mob/living/carbon/human/species.dm index ba1ad9e0da..e2e9e5149f 100644 --- a/code/modules/mob/living/carbon/human/species.dm +++ b/code/modules/mob/living/carbon/human/species.dm @@ -755,6 +755,8 @@ GLOBAL_LIST_EMPTY(roundstart_races) if(!(H.has_trait(TRAIT_HUSK))) if(!forced_colour) switch(S.color_src) + if(SKINTONE) + accessory_overlay.color = skintone2hex(H.skin_tone) if(MUTCOLORS) if(fixed_mut_color) accessory_overlay.color = "#[fixed_mut_color]" diff --git a/code/modules/mob/living/carbon/life.dm b/code/modules/mob/living/carbon/life.dm index 48a401802b..e757e6dcf4 100644 --- a/code/modules/mob/living/carbon/life.dm +++ b/code/modules/mob/living/carbon/life.dm @@ -531,8 +531,8 @@ GLOBAL_LIST_INIT(ballmer_windows_me_msg, list("Yo man, what if, we like, uh, put if(stuttering) stuttering = max(stuttering-1, 0) - if(slurring) - slurring = max(slurring-1,0) + if(slurring || drunkenness) + slurring = max(slurring-1,0,drunkenness) if(cultslurring) cultslurring = max(cultslurring-1, 0) @@ -550,16 +550,11 @@ GLOBAL_LIST_INIT(ballmer_windows_me_msg, list("Yo man, what if, we like, uh, put drunkenness = max(drunkenness - (drunkenness * 0.04), 0) if(drunkenness >= 6) SEND_SIGNAL(src, COMSIG_ADD_MOOD_EVENT, "drunk", /datum/mood_event/drunk) - if(prob(25)) - slurring += 2 jitteriness = max(jitteriness - 3, 0) if(has_trait(TRAIT_DRUNK_HEALING)) adjustBruteLoss(-0.12, FALSE) adjustFireLoss(-0.06, FALSE) - if(drunkenness >= 11 && slurring < 5) - slurring += 1.2 - if(mind && (mind.assigned_role == "Scientist" || mind.assigned_role == "Research Director")) if(SSresearch.science_tech) if(drunkenness >= 12.9 && drunkenness <= 13.8) diff --git a/code/modules/mob/living/say.dm b/code/modules/mob/living/say.dm index a0f619a7d6..871e33349a 100644 --- a/code/modules/mob/living/say.dm +++ b/code/modules/mob/living/say.dm @@ -334,7 +334,7 @@ GLOBAL_LIST_INIT(department_radio_keys, list( message = stutter(message) if(slurring) - message = slur(message) + message = slur(message,slurring) if(cultslurring) message = cultslur(message) diff --git a/code/modules/mob/living/simple_animal/hostile/hostile.dm b/code/modules/mob/living/simple_animal/hostile/hostile.dm index 0a8c0431bc..a70ca2a8e6 100644 --- a/code/modules/mob/living/simple_animal/hostile/hostile.dm +++ b/code/modules/mob/living/simple_animal/hostile/hostile.dm @@ -353,6 +353,10 @@ vore_attack(src,L,src) else return L.attack_animal(src) + else + return L.attack_animal(src) //literally every single fucking one of these need this I guess. + else + return target.attack_animal(src) else return target.attack_animal(src) diff --git a/code/modules/mob/living/simple_animal/hostile/mining_mobs/goliath.dm b/code/modules/mob/living/simple_animal/hostile/mining_mobs/goliath.dm index 23f08ab234..15f2a0a834 100644 --- a/code/modules/mob/living/simple_animal/hostile/mining_mobs/goliath.dm +++ b/code/modules/mob/living/simple_animal/hostile/mining_mobs/goliath.dm @@ -187,12 +187,12 @@ var/mob/living/carbon/C = L var/obj/item/clothing/S = C.get_item_by_slot(SLOT_WEAR_SUIT) if(S && S.resistance_flags & GOLIATH_RESISTANCE) - L.Stun(75) + L.Stun(25) else if(S && S.resistance_flags & GOLIATH_WEAKNESS) - L.Stun(125) + L.Stun(115) else - L.Stun(100) - L.adjustBruteLoss(rand(10,15)) + L.Stun(75) + L.adjustBruteLoss(rand(15,20)) // Less stun more harm latched = TRUE if(!latched) retract() diff --git a/code/modules/mob/living/simple_animal/hostile/mining_mobs/hivelord.dm b/code/modules/mob/living/simple_animal/hostile/mining_mobs/hivelord.dm index 12c98b8b5d..82f85766c2 100644 --- a/code/modules/mob/living/simple_animal/hostile/mining_mobs/hivelord.dm +++ b/code/modules/mob/living/simple_animal/hostile/mining_mobs/hivelord.dm @@ -290,7 +290,7 @@ gloves = /obj/item/clothing/gloves/color/black mask = /obj/item/clothing/mask/gas/explorer if(prob(20)) - suit = pickweight(list(/obj/item/clothing/suit/hooded/explorer = 6, /obj/item/clothing/suit/hooded/cloak/goliath = 2, /obj/item/clothing/suit/hooded/explorer/exo = 6, /obj/item/clothing/suit/hooded/explorer/seva = 6)) + suit = pickweight(list(/obj/item/clothing/suit/hooded/explorer/standard = 6, /obj/item/clothing/suit/hooded/cloak/goliath = 2, /obj/item/clothing/suit/hooded/explorer/exo = 6, /obj/item/clothing/suit/hooded/explorer/seva = 6)) if(prob(30)) r_pocket = pickweight(list(/obj/item/stack/marker_beacon = 20, /obj/item/stack/spacecash/c1000 = 7, /obj/item/reagent_containers/hypospray/medipen/survival = 2, /obj/item/borg/upgrade/modkit/damage = 1 )) if(prob(10)) diff --git a/code/modules/mob/mob_helpers.dm b/code/modules/mob/mob_helpers.dm index 35b48afa28..776bd04935 100644 --- a/code/modules/mob/mob_helpers.dm +++ b/code/modules/mob/mob_helpers.dm @@ -64,7 +64,8 @@ p++ return sanitize(t) -/proc/slur(n) +/proc/slur(n,var/strength=50) + strength = min(strength,50) var/phrase = html_decode(n) var/leng = lentext(phrase) var/counter=lentext(phrase) @@ -72,7 +73,7 @@ var/newletter="" while(counter>=1) newletter=copytext(phrase,(leng-counter)+1,(leng-counter)+2) - if(rand(1,3)==3) + if(rand(1,100)<=strength*0.5) if(lowertext(newletter)=="o") newletter="u" if(lowertext(newletter)=="s") @@ -83,17 +84,17 @@ newletter="oo" if(lowertext(newletter)=="c") newletter="k" - if(rand(1,20)==20) + if(rand(1,100) <= strength*0.25) if(newletter==" ") newletter="...huuuhhh..." if(newletter==".") newletter=" *BURP*." - switch(rand(1,20)) - if(1) + if(rand(1,100) <= strength*0.5) + if(rand(1,5) == 1) newletter+="'" - if(10) + if(rand(1,5) == 1) newletter+="[newletter]" - if(20) + if(rand(1,5) == 1) newletter+="[newletter][newletter]" newphrase+="[newletter]";counter-=1 return newphrase diff --git a/code/modules/power/cell.dm b/code/modules/power/cell.dm index e43db529b8..9fcdf091a1 100644 --- a/code/modules/power/cell.dm +++ b/code/modules/power/cell.dm @@ -200,6 +200,10 @@ charge = 0 update_icon() +/obj/item/stock_parts/cell/lascarbine + name = "laser carbine power supply" + maxcharge = 2500 + /obj/item/stock_parts/cell/pulse //200 pulse shots name = "pulse rifle power cell" maxcharge = 40000 diff --git a/code/modules/projectiles/guns/ballistic/shotgun.dm b/code/modules/projectiles/guns/ballistic/shotgun.dm index 83ce525ac8..914f9bc016 100644 --- a/code/modules/projectiles/guns/ballistic/shotgun.dm +++ b/code/modules/projectiles/guns/ballistic/shotgun.dm @@ -88,6 +88,9 @@ icon_state = "riotshotgun" mag_type = /obj/item/ammo_box/magazine/internal/shot/riot sawn_desc = "Come with me if you want to live." + unique_reskin = list("Tatical" = "riotshotgun", + "Wood Stock" = "wood_riotshotgun" + ) /obj/item/gun/ballistic/shotgun/riot/attackby(obj/item/A, mob/user, params) ..() @@ -200,6 +203,10 @@ icon_state = "cshotgun" mag_type = /obj/item/ammo_box/magazine/internal/shot/com w_class = WEIGHT_CLASS_HUGE + unique_reskin = list("Tatical" = "cshotgun", + "Slick" = "cshotgun_slick" + ) + /obj/item/gun/ballistic/shotgun/automatic/combat/compact name = "compact combat shotgun" @@ -207,6 +214,10 @@ icon_state = "cshotgunc" mag_type = /obj/item/ammo_box/magazine/internal/shot/com/compact w_class = WEIGHT_CLASS_NORMAL + unique_reskin = list("Tatical" = "cshotgunc", + "Slick" = "cshotgunc_slick" + ) + //Dual Feed Shotgun diff --git a/code/modules/projectiles/guns/energy/laser.dm b/code/modules/projectiles/guns/energy/laser.dm index 066b652984..cd0dd53d48 100644 --- a/code/modules/projectiles/guns/energy/laser.dm +++ b/code/modules/projectiles/guns/energy/laser.dm @@ -39,6 +39,21 @@ selfcharge = EGUN_SELFCHARGE resistance_flags = INDESTRUCTIBLE | LAVA_PROOF | FIRE_PROOF | ACID_PROOF +/obj/item/gun/energy/laser/carbine + name = "laser carbine" + desc = "A ruggedized laser carbine featuring much higher capacity and improved handling when compared to a normal laser gun." + icon = 'icons/obj/guns/energy.dmi' + icon_state = "lasernew" + item_state = "laser" + force = 10 + throwforce = 10 + ammo_type = list(/obj/item/ammo_casing/energy/lasergun) + cell_type = /obj/item/stock_parts/cell/lascarbine + resistance_flags = FIRE_PROOF | ACID_PROOF + +/obj/item/gun/energy/laser/carbine/nopin + pin = null + /obj/item/gun/energy/laser/captain/scattershot name = "scatter shot laser rifle" icon_state = "lasercannon" diff --git a/code/modules/reagents/chemistry/reagents/alcohol_reagents.dm b/code/modules/reagents/chemistry/reagents/alcohol_reagents.dm index 6e4d5e5a7d..92d9da401b 100644 --- a/code/modules/reagents/chemistry/reagents/alcohol_reagents.dm +++ b/code/modules/reagents/chemistry/reagents/alcohol_reagents.dm @@ -1277,8 +1277,7 @@ All effects don't start immediately, but rather get worse over time; the rate is if(!M.has_trait(TRAIT_ALCOHOL_TOLERANCE)) M.confused = max(M.confused+2,0) M.Dizzy(10) - if (!M.slurring) - M.slurring = 1 + M.slurring = max(M.slurring,50) M.slurring += 3 switch(current_cycle) if(51 to 200) @@ -1306,8 +1305,7 @@ All effects don't start immediately, but rather get worse over time; the rate is M.dizziness +=1.5 switch(current_cycle) if(15 to 45) - if(!M.slurring) - M.slurring = 1 + M.slurring = max(M.slurring,50) M.slurring += 3 if(45 to 55) if(prob(50)) @@ -1336,8 +1334,7 @@ All effects don't start immediately, but rather get worse over time; the rate is M.dizziness +=2 switch(current_cycle) if(15 to 45) - if(!M.slurring) - M.slurring = 1 + M.slurring = max(M.slurring,50) M.slurring += 3 if(45 to 55) if(prob(50)) @@ -1364,8 +1361,7 @@ All effects don't start immediately, but rather get worse over time; the rate is glass_desc = "A drink enjoyed by people during the 1960's." /datum/reagent/consumable/ethanol/hippies_delight/on_mob_life(mob/living/carbon/M) - if (!M.slurring) - M.slurring = 1 + M.slurring = max(M.slurring,50) switch(current_cycle) if(1 to 5) M.Dizzy(10) diff --git a/code/modules/reagents/chemistry/reagents/food_reagents.dm b/code/modules/reagents/chemistry/reagents/food_reagents.dm index 52b212f8c5..5071150e24 100644 --- a/code/modules/reagents/chemistry/reagents/food_reagents.dm +++ b/code/modules/reagents/chemistry/reagents/food_reagents.dm @@ -402,8 +402,7 @@ taste_description = "mushroom" /datum/reagent/mushroomhallucinogen/on_mob_life(mob/living/carbon/M) - if(!M.slurring) - M.slurring = 1 + M.slurring = max(M.slurring,50) switch(current_cycle) if(1 to 5) M.Dizzy(5) diff --git a/code/modules/reagents/chemistry/reagents/other_reagents.dm b/code/modules/reagents/chemistry/reagents/other_reagents.dm index 15a2ef1cba..5d1593d1e7 100644 --- a/code/modules/reagents/chemistry/reagents/other_reagents.dm +++ b/code/modules/reagents/chemistry/reagents/other_reagents.dm @@ -1863,3 +1863,20 @@ description = "The primary precursor for an ancient feline delicacy known as skooma. While it has no notable effects on it's own, mixing it with morphine in a chilled container may yield interesting results." color = "#FAEAFF" taste_description = "synthetic catnip" + +/datum/reagent/penis_enlargement + name = "Penis Enlargement" + id = "penis_enlargement" + description = "A patented chemical forumula by Doctor Ronald Hyatt that is guaranteed to bring maximum GROWTH and LENGTH to your penis, today!" + color = "#888888" + taste_description = "chinese dragon powder" + metabolization_rate = INFINITY //So it instantly removes all of itself. Don't want to put strain on the system. + +/datum/reagent/penis_enlargement/on_mob_life(mob/living/carbon/C) + var/obj/item/organ/genital/penis/P = C.getorganslot(ORGAN_SLOT_PENIS) + if(P) + var/added_length = round(volume/30,0.01) //Every 30u gives an extra inch. Rounded to the nearest 0.01 so float fuckery doesn't occur with the division by 30. + if(added_length >= 0.20) //Only add the length if it's greater than or equal to 0.2. This is to prevent people from smoking the reagents and causing the penis to update constantly. + P.length += added_length + P.update() + ..() \ No newline at end of file diff --git a/code/modules/reagents/chemistry/reagents/toxin_reagents.dm b/code/modules/reagents/chemistry/reagents/toxin_reagents.dm index 26edcb5b73..7286f01623 100644 --- a/code/modules/reagents/chemistry/reagents/toxin_reagents.dm +++ b/code/modules/reagents/chemistry/reagents/toxin_reagents.dm @@ -759,6 +759,7 @@ taste_description = "skewing" /datum/reagent/toxin/skewium/on_mob_life(mob/living/carbon/M) + /* if(M.hud_used) if(current_cycle >= 5 && current_cycle % 3 == 0) var/list/screens = list(M.hud_used.plane_masters["[FLOOR_PLANE]"], M.hud_used.plane_masters["[GAME_PLANE]"], M.hud_used.plane_masters["[LIGHTING_PLANE]"]) @@ -774,6 +775,7 @@ for(var/whole_screen in screens) animate(whole_screen, transform = newmatrix, time = 5, easing = QUAD_EASING, loop = -1) animate(transform = -newmatrix, time = 5, easing = QUAD_EASING) + */ return ..() /datum/reagent/toxin/skewium/on_mob_delete(mob/living/M) diff --git a/code/modules/reagents/reagent_containers/pill.dm b/code/modules/reagents/reagent_containers/pill.dm index 38d47d5185..ed2ca66aae 100644 --- a/code/modules/reagents/reagent_containers/pill.dm +++ b/code/modules/reagents/reagent_containers/pill.dm @@ -233,3 +233,7 @@ /obj/item/reagent_containers/pill/get_belt_overlay() return mutable_appearance('icons/obj/clothing/belt_overlays.dmi', "pouch") + +/obj/item/reagent_containers/pill/penis_enlargement + name = "penis enlargement pill" + list_reagents = list("penis_enlargement" = 30) diff --git a/code/modules/research/designs/autolathe_designs.dm b/code/modules/research/designs/autolathe_designs.dm index 7ceeda2c64..173fd5a813 100644 --- a/code/modules/research/designs/autolathe_designs.dm +++ b/code/modules/research/designs/autolathe_designs.dm @@ -870,3 +870,19 @@ materials = list(MAT_METAL = 100, MAT_GLASS = 100) build_path = /obj/item/disk/holodisk category = list("initial", "Misc") + +/datum/design/lock_collar + name = "Lockable Collar" + id = "lock_collar" + build_type = AUTOLATHE + materials = list(MAT_METAL = 1200, MAT_GLASS = 100) + build_path = /obj/item/clothing/neck/petcollar/locked + category = list("initial", "Misc") + +/datum/design/collar_key + name = "Collar Key" + id = "collar_key" + build_type = AUTOLATHE + materials = list(MAT_METAL = 300, MAT_GLASS = 150) + build_path = /obj/item/key/collar + category = list("initial", "Misc") diff --git a/code/modules/research/designs/bluespace_designs.dm b/code/modules/research/designs/bluespace_designs.dm index 2dc0ed77b3..c9d11a5a3e 100644 --- a/code/modules/research/designs/bluespace_designs.dm +++ b/code/modules/research/designs/bluespace_designs.dm @@ -24,6 +24,17 @@ dangerous_construction = TRUE departmental_flags = DEPARTMENTAL_FLAG_SCIENCE +/datum/design/satchel_holding + name = "Satchel of Holding" + desc = "A satchel that opens into a localized pocket of bluespace." + id = "satchel_holding" + build_type = PROTOLATHE + materials = list(MAT_GOLD = 3000, MAT_DIAMOND = 1500, MAT_URANIUM = 250, MAT_BLUESPACE = 2000) + build_path = /obj/item/storage/backpack/holding/satchel + category = list("Bluespace Designs") + dangerous_construction = TRUE + departmental_flags = DEPARTMENTAL_FLAG_SCIENCE + /datum/design/biobag_holding name = "Bio Bag of Holding" desc = "A chemical holding thingy. Mostly used for xenobiology." diff --git a/code/modules/research/designs/power_designs.dm b/code/modules/research/designs/power_designs.dm index e1648559a7..f8122c16e3 100644 --- a/code/modules/research/designs/power_designs.dm +++ b/code/modules/research/designs/power_designs.dm @@ -77,6 +77,16 @@ category = list("Power Designs") departmental_flags = DEPARTMENTAL_FLAG_SCIENCE | DEPARTMENTAL_FLAG_ENGINEERING +/datum/design/inducercombat + name = "Combat Ready Inducer" + desc = "The improved NT-8475 Electromagnetic Power Inducer can this one has been SCIENCED to allow for combat. It still comes printed with SCIENCED colors!" + id = "combatinducer" + build_type = PROTOLATHE + materials = list(MAT_METAL = 13000, MAT_GLASS = 10000, MAT_SILVER = 1500, MAT_GOLD = 1250, MAT_DIAMOND = 500, MAT_TITANIUM = 1200) + build_path = /obj/item/inducer/sci/combat/dry + category = list("Power Designs") + departmental_flags = DEPARTMENTAL_FLAG_SECURITY + /datum/design/board/pacman name = "Machine Design (PACMAN-type Generator Board)" desc = "The circuit board that for a PACMAN-type portable generator." diff --git a/code/modules/research/designs/weapon_designs.dm b/code/modules/research/designs/weapon_designs.dm index 9b42709fe2..03c0582245 100644 --- a/code/modules/research/designs/weapon_designs.dm +++ b/code/modules/research/designs/weapon_designs.dm @@ -1,6 +1,10 @@ -///////////////////////////////////////// -/////////////////Weapons///////////////// -///////////////////////////////////////// +/////////////////////////////// +///////Weapons & Ammo////////// +/////////////////////////////// + +////////////// +//Ammo Boxes// +////////////// /datum/design/c38/sec id = "sec_38" @@ -13,6 +17,40 @@ id = "sec_38lethal" build_path = /obj/item/ammo_box/c38/lethal +////////////// +//WT550 Mags// +////////////// + +/datum/design/mag_oldsmg + name = "WT-550 Semi-Auto SMG Magazine (4.6x30mm)" + desc = "A 20 round magazine for the out of date security WT-550 Semi-Auto SMG." + id = "mag_oldsmg" + build_type = PROTOLATHE + materials = list(MAT_METAL = 4000) + build_path = /obj/item/ammo_box/magazine/wt550m9 + category = list("Ammo") + departmental_flags = DEPARTMENTAL_FLAG_SECURITY + +/datum/design/mag_oldsmg/ap_mag + name = "WT-550 Semi-Auto SMG Armour Piercing Magazine (4.6x30mm AP)" + desc = "A 20 round armour piercing magazine for the out of date security WT-550 Semi-Auto SMG." + id = "mag_oldsmg_ap" + materials = list(MAT_METAL = 6000, MAT_SILVER = 600) + build_path = /obj/item/ammo_box/magazine/wt550m9/wtap + departmental_flags = DEPARTMENTAL_FLAG_SECURITY + +/datum/design/mag_oldsmg/ic_mag + name = "WT-550 Semi-Auto SMG Incendiary Magazine (4.6x30mm IC)" + desc = "A 20 round armour piercing magazine for the out of date security WT-550 Semi-Auto SMG." + id = "mag_oldsmg_ic" + materials = list(MAT_METAL = 6000, MAT_SILVER = 600, MAT_GLASS = 1000) + build_path = /obj/item/ammo_box/magazine/wt550m9/wtic + departmental_flags = DEPARTMENTAL_FLAG_SECURITY + +////////////// +//Ammo Shells/ +////////////// + /datum/design/rubbershot/sec id = "sec_rshot" build_type = PROTOLATHE @@ -43,6 +81,40 @@ category = list("Ammo") departmental_flags = DEPARTMENTAL_FLAG_SECURITY +/datum/design/stunshell + name = "Stun Shell" + desc = "A stunning shell for a shotgun." + id = "stunshell" + build_type = PROTOLATHE + materials = list(MAT_METAL = 200) + build_path = /obj/item/ammo_casing/shotgun/stunslug + category = list("Ammo") + departmental_flags = DEPARTMENTAL_FLAG_SECURITY + +/datum/design/techshell + name = "Unloaded Technological Shotshell" + desc = "A high-tech shotgun shell which can be loaded with materials to produce unique effects." + id = "techshotshell" + build_type = PROTOLATHE + materials = list(MAT_METAL = 1000, MAT_GLASS = 200) + build_path = /obj/item/ammo_casing/shotgun/techshell + category = list("Ammo") + departmental_flags = DEPARTMENTAL_FLAG_SECURITY | DEPARTMENTAL_FLAG_SCIENCE + +/datum/design/cryostatis_shotgun_dart + name = "Cryostasis Shotgun Dart" + desc = "A shotgun dart designed with similar internals to that of a cryostatis beaker, allowing reagents to not react when inside." + id = "shotgundartcryostatis" + build_type = PROTOLATHE + materials = list(MAT_METAL = 3500) + build_path = /obj/item/ammo_casing/shotgun/dart/noreact + category = list("Ammo") + departmental_flags = DEPARTMENTAL_FLAG_MEDICAL + +////////////// +//Firing Pins/ +////////////// + /datum/design/pin_testing name = "Test-Range Firing Pin" desc = "This safety firing pin allows firearms to be operated within proximity to a firing range." @@ -63,6 +135,20 @@ category = list("Firing Pins") departmental_flags = DEPARTMENTAL_FLAG_SECURITY +////////////// +//Guns//////// +////////////// + +/datum/design/lasercarbine + name = "Laser Carbine" + desc = "Beefed up version of a standard laser gun." + id = "lasercarbine" + build_type = PROTOLATHE + materials = list(MAT_METAL = 15000, MAT_GLASS = 10000, MAT_GOLD = 2500, MAT_SILVER = 2500) + build_path = /obj/item/gun/energy/laser/carbine/nopin + category = list("Weapons") + departmental_flags = DEPARTMENTAL_FLAG_SECURITY + /datum/design/stunrevolver name = "Tesla Revolver" desc = "A high-tech revolver that fires internal, reusable shock cartridges in a revolving cylinder. The cartridges can be recharged using conventional rechargers." @@ -83,16 +169,6 @@ category = list("Weapons") departmental_flags = DEPARTMENTAL_FLAG_SECURITY -/datum/design/tele_shield - name = "Telescopic Riot Shield" - desc = "An advanced riot shield made of lightweight materials that collapses for easy storage." - id = "tele_shield" - build_type = PROTOLATHE - materials = list(MAT_METAL = 4000, MAT_GLASS = 4000, MAT_SILVER = 300, MAT_TITANIUM = 200) - build_path = /obj/item/shield/riot/tele - category = list("Weapons") - departmental_flags = DEPARTMENTAL_FLAG_SECURITY - /datum/design/beamrifle name = "Beam Marksman Rifle" desc = "A powerful long ranged anti-material rifle that fires charged particle beams to obliterate targets." @@ -122,11 +198,11 @@ materials = list(MAT_METAL = 5000, MAT_GLASS = 1000) build_path = /obj/item/gun/syringe/rapidsyringe category = list("Weapons") - departmental_flags = DEPARTMENTAL_FLAG_MEDICAL //uwu + departmental_flags = DEPARTMENTAL_FLAG_MEDICAL /datum/design/temp_gun name = "Temperature Gun" - desc = "A gun that shoots temperature bullet energythings to change temperature."//Change it if you want + desc = "A gun that shoots temperature beam like projectiles to change temperature." id = "temp_gun" build_type = PROTOLATHE materials = list(MAT_METAL = 5000, MAT_GLASS = 500, MAT_SILVER = 3000) @@ -145,46 +221,6 @@ category = list("Weapons") departmental_flags = DEPARTMENTAL_FLAG_SERVICE -/datum/design/large_grenade - name = "Large Grenade" - desc = "A grenade that affects a larger area and use larger containers." - id = "large_Grenade" - build_type = PROTOLATHE - materials = list(MAT_METAL = 3000) - build_path = /obj/item/grenade/chem_grenade/large - category = list("Weapons") - departmental_flags = DEPARTMENTAL_FLAG_SECURITY | DEPARTMENTAL_FLAG_MEDICAL | DEPARTMENTAL_FLAG_SCIENCE //Citadel edit added to science - -/datum/design/pyro_grenade - name = "Pyro Grenade" - desc = "An advanced grenade that is able to self ignite its mixture." - id = "pyro_Grenade" - build_type = PROTOLATHE - materials = list(MAT_METAL = 2000, MAT_PLASMA = 500) - build_path = /obj/item/grenade/chem_grenade/pyro - category = list("Weapons") - departmental_flags = DEPARTMENTAL_FLAG_SECURITY | DEPARTMENTAL_FLAG_MEDICAL - -/datum/design/cryo_grenade - name = "Cryo Grenade" - desc = "An advanced grenade that rapidly cools its contents upon detonation." - id = "cryo_Grenade" - build_type = PROTOLATHE - materials = list(MAT_METAL = 2000, MAT_SILVER = 500) - build_path = /obj/item/grenade/chem_grenade/cryo - category = list("Weapons") - departmental_flags = DEPARTMENTAL_FLAG_SECURITY | DEPARTMENTAL_FLAG_MEDICAL - -/datum/design/adv_grenade - name = "Advanced Release Grenade" - desc = "An advanced grenade that can be detonated several times, best used with a repeating igniter." - id = "adv_Grenade" - build_type = PROTOLATHE - materials = list(MAT_METAL = 3000, MAT_GLASS = 500) - build_path = /obj/item/grenade/chem_grenade/adv_release - category = list("Weapons") - departmental_flags = DEPARTMENTAL_FLAG_SECURITY | DEPARTMENTAL_FLAG_MEDICAL - /datum/design/xray name = "X-ray Laser Gun" desc = "Not quite as menacing as it sounds" @@ -215,64 +251,6 @@ category = list("Weapons") departmental_flags = DEPARTMENTAL_FLAG_SCIENCE -//WT550 Mags - -/datum/design/mag_oldsmg - name = "WT-550 Semi-Auto SMG Magazine (4.6x30mm)" - desc = "A 20 round magazine for the out of date security WT-550 Semi-Auto SMG." - id = "mag_oldsmg" - build_type = PROTOLATHE - materials = list(MAT_METAL = 4000) - build_path = /obj/item/ammo_box/magazine/wt550m9 - category = list("Ammo") - departmental_flags = DEPARTMENTAL_FLAG_SECURITY - -/datum/design/mag_oldsmg/ap_mag - name = "WT-550 Semi-Auto SMG Armour Piercing Magazine (4.6x30mm AP)" - desc = "A 20 round armour piercing magazine for the out of date security WT-550 Semi-Auto SMG." - id = "mag_oldsmg_ap" - materials = list(MAT_METAL = 6000, MAT_SILVER = 600) - build_path = /obj/item/ammo_box/magazine/wt550m9/wtap - departmental_flags = DEPARTMENTAL_FLAG_SECURITY - -/datum/design/mag_oldsmg/ic_mag - name = "WT-550 Semi-Auto SMG Incendiary Magazine (4.6x30mm IC)" - desc = "A 20 round armour piercing magazine for the out of date security WT-550 Semi-Auto SMG." - id = "mag_oldsmg_ic" - materials = list(MAT_METAL = 6000, MAT_SILVER = 600, MAT_GLASS = 1000) - build_path = /obj/item/ammo_box/magazine/wt550m9/wtic - departmental_flags = DEPARTMENTAL_FLAG_SECURITY - -/datum/design/stunshell - name = "Stun Shell" - desc = "A stunning shell for a shotgun." - id = "stunshell" - build_type = PROTOLATHE - materials = list(MAT_METAL = 200) - build_path = /obj/item/ammo_casing/shotgun/stunslug - category = list("Ammo") - departmental_flags = DEPARTMENTAL_FLAG_SECURITY - -/datum/design/techshell - name = "Unloaded Technological Shotshell" - desc = "A high-tech shotgun shell which can be loaded with materials to produce unique effects." - id = "techshotshell" - build_type = PROTOLATHE - materials = list(MAT_METAL = 1000, MAT_GLASS = 200) - build_path = /obj/item/ammo_casing/shotgun/techshell - category = list("Ammo") - departmental_flags = DEPARTMENTAL_FLAG_SECURITY | DEPARTMENTAL_FLAG_SCIENCE - -/datum/design/suppressor - name = "Universal Suppressor" - desc = "A reverse-engineered universal suppressor that fits on most small arms with threaded barrels." - id = "suppressor" - build_type = PROTOLATHE - materials = list(MAT_METAL = 2000, MAT_SILVER = 500) - build_path = /obj/item/suppressor - category = list("Weapons") - departmental_flags = DEPARTMENTAL_FLAG_SECURITY - /datum/design/gravitygun name = "One-point Bluespace-gravitational Manipulator" desc = "A multi-mode device that blasts one-point bluespace-gravitational bolts that locally distort gravity." @@ -293,12 +271,70 @@ category = list("Weapons") departmental_flags = DEPARTMENTAL_FLAG_SECURITY -/datum/design/cryostatis_shotgun_dart - name = "Cryostasis Shotgun Dart" - desc = "A shotgun dart designed with similar internals to that of a cryostatis beaker, allowing reagents to not react when inside." - id = "shotgundartcryostatis" +/////////// +//Grenades/ +/////////// + +/datum/design/large_grenade + name = "Large Grenade" + desc = "A grenade that affects a larger area and use larger containers." + id = "large_Grenade" build_type = PROTOLATHE - materials = list(MAT_METAL = 3500) - build_path = /obj/item/ammo_casing/shotgun/dart/noreact - category = list("Ammo") - departmental_flags = DEPARTMENTAL_FLAG_MEDICAL + materials = list(MAT_METAL = 3000) + build_path = /obj/item/grenade/chem_grenade/large + category = list("Weapons") + departmental_flags = DEPARTMENTAL_FLAG_SECURITY | DEPARTMENTAL_FLAG_MEDICAL | DEPARTMENTAL_FLAG_SCIENCE + +/datum/design/pyro_grenade + name = "Pyro Grenade" + desc = "An advanced grenade that is able to self ignite its mixture." + id = "pyro_Grenade" + build_type = PROTOLATHE + materials = list(MAT_METAL = 2000, MAT_PLASMA = 500) + build_path = /obj/item/grenade/chem_grenade/pyro + category = list("Weapons") + departmental_flags = DEPARTMENTAL_FLAG_SECURITY | DEPARTMENTAL_FLAG_MEDICAL + +/datum/design/cryo_grenade + name = "Cryo Grenade" + desc = "An advanced grenade that rapidly cools its contents upon detonation." + id = "cryo_Grenade" + build_type = PROTOLATHE + materials = list(MAT_METAL = 2000, MAT_SILVER = 500) + build_path = /obj/item/grenade/chem_grenade/cryo + category = list("Weapons") + departmental_flags = DEPARTMENTAL_FLAG_SECURITY | DEPARTMENTAL_FLAG_MEDICAL + +/datum/design/adv_grenade + name = "Advanced Release Grenade" + desc = "An advanced grenade that can be detonated several times, best used with a repeating igniter." + id = "adv_Grenade" + build_type = PROTOLATHE + materials = list(MAT_METAL = 3000, MAT_GLASS = 500) + build_path = /obj/item/grenade/chem_grenade/adv_release + category = list("Weapons") + departmental_flags = DEPARTMENTAL_FLAG_SECURITY | DEPARTMENTAL_FLAG_MEDICAL + +////////// +//MISC//// +////////// + +/datum/design/tele_shield + name = "Telescopic Riot Shield" + desc = "An advanced riot shield made of lightweight materials that collapses for easy storage." + id = "tele_shield" + build_type = PROTOLATHE + materials = list(MAT_METAL = 4000, MAT_GLASS = 4000, MAT_SILVER = 300, MAT_TITANIUM = 200) + build_path = /obj/item/shield/riot/tele + category = list("Weapons") + departmental_flags = DEPARTMENTAL_FLAG_SECURITY + +/datum/design/suppressor + name = "Universal Suppressor" + desc = "A reverse-engineered universal suppressor that fits on most small arms with threaded barrels." + id = "suppressor" + build_type = PROTOLATHE + materials = list(MAT_METAL = 2000, MAT_SILVER = 500) + build_path = /obj/item/suppressor + category = list("Weapons") + departmental_flags = DEPARTMENTAL_FLAG_SECURITY diff --git a/code/modules/research/techweb/all_nodes.dm b/code/modules/research/techweb/all_nodes.dm index c2abc2f2c5..aa091d181c 100644 --- a/code/modules/research/techweb/all_nodes.dm +++ b/code/modules/research/techweb/all_nodes.dm @@ -246,7 +246,7 @@ display_name = "Bluespace Pockets" description = "Studies into the mysterious alternate dimension known as bluespace and how to place items in the threads of reality." prereq_ids = list("adv_power", "adv_bluespace", "adv_biotech", "adv_plasma") - design_ids = list( "bluespacebodybag","bag_holding", "bluespace_pod", "borg_upgrade_trashofholding", "blutrash") + design_ids = list( "bluespacebodybag","bag_holding", "bluespace_pod", "borg_upgrade_trashofholding", "blutrash", "satchel_holding") research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 5500) export_price = 5000 /////////////////////////plasma tech///////////////////////// @@ -428,7 +428,7 @@ research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 1500) export_price = 5000 design_ids = list("s-receiver", "s-bus", "s-broadcaster", "s-processor", "s-hub", "s-server", "s-relay", "comm_monitor", "comm_server", - "s-ansible", "s-filter", "s-amplifier", "ntnet_relay", "s-treatment", "s-analyzer", "s-crystal", "s-transmitter") + "s-ansible", "s-filter", "s-amplifier", "ntnet_relay", "s-treatment", "s-analyzer", "s-crystal", "s-transmitter", "message_monitor") /datum/techweb_node/integrated_HUDs id = "integrated_HUDs" @@ -564,7 +564,7 @@ display_name = "Weapon Development Technology" description = "Our researchers have found new to weaponize just about everything now." prereq_ids = list("engineering") - design_ids = list("pin_testing", "tele_shield") + design_ids = list("pin_testing", "tele_shield", "lasercarbine") research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 7500) export_price = 5000 diff --git a/code/modules/surgery/bodyparts/bodyparts.dm b/code/modules/surgery/bodyparts/bodyparts.dm index f394351285..dfdf0fde69 100644 --- a/code/modules/surgery/bodyparts/bodyparts.dm +++ b/code/modules/surgery/bodyparts/bodyparts.dm @@ -45,7 +45,8 @@ var/species_color = "" var/mutation_color = "" var/no_update = 0 - var/body_markings //for bodypart markings + var/body_markings = "" //for bodypart markings + var/body_markings_icon = 'modular_citadel/icons/mob/mam_markings.dmi' var/list/markings_color = list() var/auxmarking var/list/auxmarking_color = list() @@ -260,6 +261,7 @@ icon = DEFAULT_BODYPART_ICON_ORGANIC else if(status == BODYPART_ROBOTIC) icon = DEFAULT_BODYPART_ICON_ROBOTIC + body_markings = null if(owner) owner.updatehealth() @@ -332,14 +334,18 @@ species_color = "" if("mam_body_markings" in S.default_features) + var/datum/sprite_accessory/Smark + Smark = GLOB.mam_body_markings_list[H.dna.features["mam_body_markings"]] if(H.dna.features.["mam_body_markings"] != "None") + body_markings_icon = Smark.icon body_markings = lowertext(H.dna.features.["mam_body_markings"]) if(MATRIXED) markings_color = list(colorlist) else + body_markings = "plain" markings_color = (H.dna.features.["mcolor"]) else - body_markings = "None" + body_markings = null markings_color = "" if(!dropping_limb && H.dna.check_mutation(HULK)) @@ -354,6 +360,7 @@ if(status == BODYPART_ROBOTIC) dmg_overlay_type = "robotic" + body_markings = null if(dropping_limb) no_update = TRUE //when attached, the limb won't be affected by the appearance changes of its mob owner. @@ -385,11 +392,11 @@ . += image('icons/mob/dam_mob.dmi', "[dmg_overlay_type]_[body_zone]_[brutestate]0", -DAMAGE_LAYER, image_dir) if(burnstate) . += image('icons/mob/dam_mob.dmi', "[dmg_overlay_type]_[body_zone]_0[burnstate]", -DAMAGE_LAYER, image_dir) - if(body_markings) + if(body_markings && status != BODYPART_ROBOTIC) if(use_digitigrade == NOT_DIGITIGRADE) - . += image('modular_citadel/icons/mob/mam_markings.dmi', "[body_markings]_[body_zone]", -MARKING_LAYER, image_dir) + . += image(body_markings_icon, "[body_markings]_[body_zone]", -MARKING_LAYER, image_dir) else - . += image('modular_citadel/icons/mob/mam_markings.dmi', "[body_markings]_digitigrade_[use_digitigrade]_[body_zone]", -MARKING_LAYER, image_dir) + . += image(body_markings_icon, "[body_markings]_digitigrade_[use_digitigrade]_[body_zone]", -MARKING_LAYER, image_dir) var/image/limb = image(layer = -BODYPARTS_LAYER, dir = image_dir) var/image/aux @@ -442,14 +449,14 @@ // Body markings if(body_markings) if(species_id == "husk") - marking = image('modular_citadel/icons/mob/mam_markings.dmi', "husk_[body_zone]", -MARKING_LAYER, image_dir) + marking = image('modular_citadel/icons/mob/markings_notmammals.dmi', "husk_[body_zone]", -MARKING_LAYER, image_dir) else if(species_id == "husk" && use_digitigrade) - marking = image('modular_citadel/icons/mob/mam_markings.dmi', "husk_digitigrade_[use_digitigrade]_[body_zone]", -MARKING_LAYER, image_dir) + marking = image('modular_citadel/icons/mob/markings_notmammals.dmi', "husk_digitigrade_[use_digitigrade]_[body_zone]", -MARKING_LAYER, image_dir) else if(!use_digitigrade) - marking = image('modular_citadel/icons/mob/mam_markings.dmi', "[body_markings]_[body_zone]", -MARKING_LAYER, image_dir) + marking = image(body_markings_icon, "[body_markings]_[body_zone]", -MARKING_LAYER, image_dir) else - marking = image('modular_citadel/icons/mob/mam_markings.dmi', "[body_markings]_digitigrade_[use_digitigrade]_[body_zone]", -MARKING_LAYER, image_dir) + marking = image(body_markings_icon, "[body_markings]_digitigrade_[use_digitigrade]_[body_zone]", -MARKING_LAYER, image_dir) . += marking // Citadel End @@ -459,9 +466,9 @@ . += aux if(body_markings) if(species_id == "husk") - auxmarking = image('modular_citadel/icons/mob/mam_markings.dmi', "husk_[aux_zone]", -aux_layer, image_dir) + auxmarking = image('modular_citadel/icons/mob/markings_notmammals.dmi', "husk_[aux_zone]", -aux_layer, image_dir) else - auxmarking = image('modular_citadel/icons/mob/mam_markings.dmi', "[body_markings]_[aux_zone]", -aux_layer, image_dir) + auxmarking = image(body_markings_icon, "[body_markings]_[aux_zone]", -aux_layer, image_dir) . += auxmarking else @@ -475,21 +482,21 @@ . += aux if(body_markings) if(species_id == "husk") - auxmarking = image('modular_citadel/icons/mob/mam_markings.dmi', "husk_[aux_zone]", -aux_layer, image_dir) + auxmarking = image('modular_citadel/icons/mob/markings_notmammals.dmi', "husk_[aux_zone]", -aux_layer, image_dir) else - auxmarking = image('modular_citadel/icons/mob/mam_markings.dmi', "[body_markings]_[aux_zone]", -aux_layer, image_dir) + auxmarking = image(body_markings_icon, "[body_markings]_[aux_zone]", -aux_layer, image_dir) . += auxmarking if(body_markings) if(species_id == "husk") - marking = image('modular_citadel/icons/mob/mam_markings.dmi', "husk_[body_zone]", -MARKING_LAYER, image_dir) + marking = image('modular_citadel/icons/mob/markings_notmammals.dmi', "husk_[body_zone]", -MARKING_LAYER, image_dir) else if(species_id == "husk" && use_digitigrade) - marking = image('modular_citadel/icons/mob/mam_markings.dmi', "husk_digitigrade_[use_digitigrade]_[body_zone]", -MARKING_LAYER, image_dir) + marking = image('modular_citadel/icons/mob/markings_notmammals.dmi', "husk_digitigrade_[use_digitigrade]_[body_zone]", -MARKING_LAYER, image_dir) else if(!use_digitigrade) - marking = image('modular_citadel/icons/mob/mam_markings.dmi', "[body_markings]_[body_zone]", -MARKING_LAYER, image_dir) + marking = image(body_markings_icon, "[body_markings]_[body_zone]", -MARKING_LAYER, image_dir) else - marking = image('modular_citadel/icons/mob/mam_markings.dmi', "[body_markings]_digitigrade_[use_digitigrade]_[body_zone]", -MARKING_LAYER, image_dir) + marking = image(body_markings_icon, "[body_markings]_digitigrade_[use_digitigrade]_[body_zone]", -MARKING_LAYER, image_dir) . += marking return diff --git a/code/modules/surgery/bodyparts/helpers.dm b/code/modules/surgery/bodyparts/helpers.dm index 9cc56a6ca8..a2e8017956 100644 --- a/code/modules/surgery/bodyparts/helpers.dm +++ b/code/modules/surgery/bodyparts/helpers.dm @@ -178,6 +178,7 @@ L.update_limb(fixed_icon, src) if(robotic) L.change_bodypart_status(BODYPART_ROBOTIC) + L.body_markings = null . = L /mob/living/carbon/monkey/newBodyPart(zone, robotic, fixed_icon) diff --git a/code/modules/uplink/uplink_items.dm b/code/modules/uplink/uplink_items.dm index af2c625670..702ddb71a3 100644 --- a/code/modules/uplink/uplink_items.dm +++ b/code/modules/uplink/uplink_items.dm @@ -1438,6 +1438,13 @@ GLOBAL_LIST_INIT(uplink_items, subtypesof(/datum/uplink_item)) cost = 20 restricted_roles = list("Assistant") +/datum/uplink_item/role_restricted/goldenbox + name = "Gold Toolbox" + desc = "A gold planted plastitanium toolbox loaded with tools. Comes with a set of AI detection multi-tool and a pare of combat gloves." + item = /obj/item/storage/toolbox/gold_real + cost = 5 // Has synda tools + gloves + a robust weapon + restricted_roles = list("Assistant", "Curator") //Curator do to being made of gold - It fits the theme + /datum/uplink_item/role_restricted/brainwash_disk name = "Brainwashing Surgery Program" desc = "A disk containing the procedure to perform a brainwashing surgery, allowing you to implant an objective onto a target. \ diff --git a/code/modules/vending/drinnerware.dm b/code/modules/vending/drinnerware.dm index 151da9bc2f..33e839c039 100644 --- a/code/modules/vending/drinnerware.dm +++ b/code/modules/vending/drinnerware.dm @@ -13,7 +13,7 @@ /obj/item/reagent_containers/food/condiment/pack/hotsauce = 5, /obj/item/reagent_containers/food/condiment/saltshaker = 5, /obj/item/reagent_containers/food/condiment/peppermill = 5, - /obj/item/reagent_containers/glass/bowl = 20) + /obj/item/reagent_containers/glass/bowl = 30) contraband = list(/obj/item/kitchen/rollingpin = 2, /obj/item/kitchen/knife/butcher = 2) armor = list("melee" = 100, "bullet" = 100, "laser" = 100, "energy" = 100, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 100, "acid" = 50) diff --git a/html/changelogs/AutoChangeLog-pr-8247.yml b/html/changelogs/AutoChangeLog-pr-8247.yml new file mode 100644 index 0000000000..1ab08ece4d --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-8247.yml @@ -0,0 +1,5 @@ +author: "Poojawa" +delete-after: True +changes: + - rscadd: "Added custom species names! Examining people will now display their species name unless they're an Unknown or have their face hidden. like flavor text. Set it in your character window!" + - code_imp: "changed how health scanners print messages, wrapping it in msg for one to_chat instead of printing every line to_chat." diff --git a/html/changelogs/AutoChangeLog-pr-8260.yml b/html/changelogs/AutoChangeLog-pr-8260.yml new file mode 100644 index 0000000000..e6ef697917 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-8260.yml @@ -0,0 +1,5 @@ +author: "Trilbyspaceclone" +delete-after: True +changes: + - rscadd: "cakes!" + - imageadd: "Made some sprites! -Love them really came out well" diff --git a/html/changelogs/AutoChangeLog-pr-8261.yml b/html/changelogs/AutoChangeLog-pr-8261.yml new file mode 100644 index 0000000000..e7624aec73 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-8261.yml @@ -0,0 +1,7 @@ +author: "Trilbyspaceclone" +delete-after: True +changes: + - rscadd: "new economics" + - tweak: "cargo and robotics relationships" + - balance: "unbalanced something" + - bugfix: "fixed a maybe oversight" diff --git a/html/changelogs/AutoChangeLog-pr-8264.yml b/html/changelogs/AutoChangeLog-pr-8264.yml new file mode 100644 index 0000000000..15e525c581 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-8264.yml @@ -0,0 +1,7 @@ +author: "Trilbyspaceclone" +delete-after: True +changes: + - rscdel: "Fun" + - tweak: "costs of suit voucher" + - balance: "Unblances miner vender" + - bugfix: "spare cheaper brute kit" diff --git a/html/changelogs/AutoChangeLog-pr-8265.yml b/html/changelogs/AutoChangeLog-pr-8265.yml new file mode 100644 index 0000000000..e581a93315 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-8265.yml @@ -0,0 +1,5 @@ +author: "Trilbyspaceclone" +delete-after: True +changes: + - tweak: "harm from hentie" + - balance: "rebalanced goliaths stun to be less auto death" diff --git a/html/changelogs/AutoChangeLog-pr-8274.yml b/html/changelogs/AutoChangeLog-pr-8274.yml new file mode 100644 index 0000000000..41b2de1d9e --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-8274.yml @@ -0,0 +1,4 @@ +author: "BurgerBB" +delete-after: True +changes: + - tweak: "Increased the spawn area of the City of Cogs (Reebe). This does not affect the area in which builders can build." diff --git a/html/changelogs/AutoChangeLog-pr-8277.yml b/html/changelogs/AutoChangeLog-pr-8277.yml new file mode 100644 index 0000000000..2a663ea2a4 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-8277.yml @@ -0,0 +1,4 @@ +author: "BurgerBB" +delete-after: True +changes: + - balance: "Significantly tweaks the Wizard race transformation event to be less unreasonably troublesome." diff --git a/html/changelogs/AutoChangeLog-pr-8278.yml b/html/changelogs/AutoChangeLog-pr-8278.yml new file mode 100644 index 0000000000..57655b8ace --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-8278.yml @@ -0,0 +1,5 @@ +author: "Trilbyspaceclone" +delete-after: True +changes: + - rscadd: "Armor to blob shields" + - tweak: "block weaken state to 70% from 75%" diff --git a/html/changelogs/AutoChangeLog-pr-8279.yml b/html/changelogs/AutoChangeLog-pr-8279.yml new file mode 100644 index 0000000000..7ed141640a --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-8279.yml @@ -0,0 +1,4 @@ +author: "Trilbyspaceclone" +delete-after: True +changes: + - bugfix: "restores the deathriplys missing armor" diff --git a/html/changelogs/AutoChangeLog-pr-8283.yml b/html/changelogs/AutoChangeLog-pr-8283.yml new file mode 100644 index 0000000000..7a614e2e82 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-8283.yml @@ -0,0 +1,4 @@ +author: "BurgerBB" +delete-after: True +changes: + - rscadd: "Adds a new 0 cost trait that makes you immune* to Crocin and Hexacrocin" diff --git a/html/changelogs/AutoChangeLog-pr-8286.yml b/html/changelogs/AutoChangeLog-pr-8286.yml new file mode 100644 index 0000000000..d59a8dad66 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-8286.yml @@ -0,0 +1,5 @@ +author: "BurgerBB" +delete-after: True +changes: + - tweak: "Tweaks how slurring works so it's more of a gradual change into slurring instead of immediate." + - balance: "Slurring is now directly proportional to your drunkenness, with other sources of slur being added on top of it." diff --git a/html/changelogs/AutoChangeLog-pr-8287.yml b/html/changelogs/AutoChangeLog-pr-8287.yml new file mode 100644 index 0000000000..aafba03474 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-8287.yml @@ -0,0 +1,4 @@ +author: "Trilbyspaceclone" +delete-after: True +changes: + - rscadd: "new lockable colalr" diff --git a/html/changelogs/AutoChangeLog-pr-8288.yml b/html/changelogs/AutoChangeLog-pr-8288.yml new file mode 100644 index 0000000000..6b3fbadbd8 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-8288.yml @@ -0,0 +1,7 @@ +author: "BurgerBB" +delete-after: True +changes: + - tweak: "Bras are now separate from underwear, meaning you can mix and match bras if you're into that." + - tweak: "Men can wear female accessory clothing, and females can wear men accessory clothing. It's not a fetish, mom, it's PROGRESSIVE." + - code_imp: "Reorganized accessories into their own files to prevent a massive 1000 line file." + - server: "i'm 10% sure that merging this PR will cause preference corruption sooooooooooo I just need to hear from @deathride58 or perhaps someone else on how much damage this could possibly do." diff --git a/html/changelogs/AutoChangeLog-pr-8289.yml b/html/changelogs/AutoChangeLog-pr-8289.yml new file mode 100644 index 0000000000..d389d95cd6 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-8289.yml @@ -0,0 +1,4 @@ +author: "Trilbyspaceclone" +delete-after: True +changes: + - tweak: "armor" diff --git a/html/changelogs/AutoChangeLog-pr-8290.yml b/html/changelogs/AutoChangeLog-pr-8290.yml new file mode 100644 index 0000000000..553bfbf4f9 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-8290.yml @@ -0,0 +1,5 @@ +author: "Trilbyspaceclone" +delete-after: True +changes: + - bugfix: "missing hopes and dreams" + - code_imp: "orgized the weapon file to be more cat brain friendly" diff --git a/html/changelogs/AutoChangeLog-pr-8294.yml b/html/changelogs/AutoChangeLog-pr-8294.yml new file mode 100644 index 0000000000..bce0031c2b --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-8294.yml @@ -0,0 +1,4 @@ +author: "Trilbyspaceclone" +delete-after: True +changes: + - imageadd: "This means sprite right?" diff --git a/html/changelogs/AutoChangeLog-pr-8301.yml b/html/changelogs/AutoChangeLog-pr-8301.yml new file mode 100644 index 0000000000..90e893bdf2 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-8301.yml @@ -0,0 +1,5 @@ +author: "Trilbyspaceclone" +delete-after: True +changes: + - rscadd: "mag gun uses cells" + - balance: "kev things their to op" diff --git a/html/changelogs/AutoChangeLog-pr-8302.yml b/html/changelogs/AutoChangeLog-pr-8302.yml new file mode 100644 index 0000000000..e2b535c40f --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-8302.yml @@ -0,0 +1,5 @@ +author: "BurgerBB" +delete-after: True +changes: + - tweak: "Tweaked penis." + - balance: "Rebalanced penis." diff --git a/html/changelogs/AutoChangeLog-pr-8305.yml b/html/changelogs/AutoChangeLog-pr-8305.yml new file mode 100644 index 0000000000..2293fa9163 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-8305.yml @@ -0,0 +1,4 @@ +author: "Poojawa" +delete-after: True +changes: + - server: "Discord bot will now report when a round ends and give the vague news ticker that a sister-station would have received for the game mode and result of the round." diff --git a/html/changelogs/AutoChangeLog-pr-8306.yml b/html/changelogs/AutoChangeLog-pr-8306.yml new file mode 100644 index 0000000000..95ceb32968 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-8306.yml @@ -0,0 +1,6 @@ +author: "Poojawa" +delete-after: True +changes: + - bugfix: "fixed medical hardsuit overlay issue. I thought it was going to work well but fuck byond." + - bugfix: "None body markings shouldn't give rgb hell, but it also should reset properly anyway. ree." + - bugfix: "Sorted some sprites to better sooth my byond icon limit anxiety." diff --git a/html/changelogs/AutoChangeLog-pr-8315.yml b/html/changelogs/AutoChangeLog-pr-8315.yml new file mode 100644 index 0000000000..5d0b85e162 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-8315.yml @@ -0,0 +1,4 @@ +author: "Trilbyspaceclone" +delete-after: True +changes: + - bugfix: "laser carbine" diff --git a/html/changelogs/AutoChangeLog-pr-8316.yml b/html/changelogs/AutoChangeLog-pr-8316.yml new file mode 100644 index 0000000000..b51a40c846 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-8316.yml @@ -0,0 +1,4 @@ +author: "Trilbyspaceclone" +delete-after: True +changes: + - tweak: "makes collars only locked via key" diff --git a/html/changelogs/AutoChangeLog-pr-8317.yml b/html/changelogs/AutoChangeLog-pr-8317.yml new file mode 100644 index 0000000000..0fd31c3c52 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-8317.yml @@ -0,0 +1,4 @@ +author: "deathride58" +delete-after: True +changes: + - tweak: "Biogenerators now have a sane limit for production" diff --git a/html/changelogs/AutoChangeLog-pr-8318.yml b/html/changelogs/AutoChangeLog-pr-8318.yml new file mode 100644 index 0000000000..0c0a5c06c4 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-8318.yml @@ -0,0 +1,4 @@ +author: "BurgerBB" +delete-after: True +changes: + - rscadd: "Adds additional random brain damage text" diff --git a/html/changelogs/AutoChangeLog-pr-8319.yml b/html/changelogs/AutoChangeLog-pr-8319.yml new file mode 100644 index 0000000000..e46b83c121 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-8319.yml @@ -0,0 +1,4 @@ +author: "BurgerBB" +delete-after: True +changes: + - rscadd: "Adds penis enlargement pills." diff --git a/html/changelogs/AutoChangeLog-pr-8322.yml b/html/changelogs/AutoChangeLog-pr-8322.yml new file mode 100644 index 0000000000..188c988021 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-8322.yml @@ -0,0 +1,4 @@ +author: "Trilbyspaceclone" +delete-after: True +changes: + - tweak: "charging" diff --git a/html/changelogs/AutoChangeLog-pr-8323.yml b/html/changelogs/AutoChangeLog-pr-8323.yml new file mode 100644 index 0000000000..0c4fc13b48 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-8323.yml @@ -0,0 +1,4 @@ +author: "Trilbyspaceclone" +delete-after: True +changes: + - rscadd: "Combat inducers for COMBAT!" diff --git a/html/changelogs/AutoChangeLog-pr-8334.yml b/html/changelogs/AutoChangeLog-pr-8334.yml new file mode 100644 index 0000000000..3c9152c257 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-8334.yml @@ -0,0 +1,4 @@ +author: "dtfe3" +delete-after: True +changes: + - tweak: "Increased music maxlines from 300 to 600" diff --git a/html/changelogs/AutoChangeLog-pr-8336.yml b/html/changelogs/AutoChangeLog-pr-8336.yml new file mode 100644 index 0000000000..25a14e5d1f --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-8336.yml @@ -0,0 +1,5 @@ +author: "BurgerBB" +delete-after: True +changes: + - rscadd: "Adds Stun Circuit and Pneumatic Cannon Integrated Circuits" + - bugfix: "Fixed extinguisher and smoke circuits not accepting any reagents." diff --git a/html/changelogs/AutoChangeLog-pr-8341.yml b/html/changelogs/AutoChangeLog-pr-8341.yml new file mode 100644 index 0000000000..50dedb7374 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-8341.yml @@ -0,0 +1,4 @@ +author: "Trilbyspaceclone" +delete-after: True +changes: + - rscadd: "golden swag boxes" diff --git a/html/changelogs/AutoChangeLog-pr-8342.yml b/html/changelogs/AutoChangeLog-pr-8342.yml new file mode 100644 index 0000000000..a159f3240f --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-8342.yml @@ -0,0 +1,7 @@ +author: "BurgerBB" +delete-after: True +changes: + - rscadd: "Adds a few important clockcult tips." + - rscadd: "Added Mech Sensors, a brass-created trap that activates when a mech not controlled by a cultist crosses it." + - rscadd: "Added power nullifiers, an emp trap that emps everything in a 3x3 area, with the center suffering a heavy EMP." + - tweak: "Brass Skewers now deal 50 damage to mechs." diff --git a/html/changelogs/AutoChangeLog-pr-8352.yml b/html/changelogs/AutoChangeLog-pr-8352.yml new file mode 100644 index 0000000000..ff9e9130db --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-8352.yml @@ -0,0 +1,4 @@ +author: "deathride58" +delete-after: True +changes: + - bugfix: "Fixed a fairly huge server crash exploit" diff --git a/icons/mob/back.dmi b/icons/mob/back.dmi index 90c7e42c8e..6099a3f037 100644 Binary files a/icons/mob/back.dmi and b/icons/mob/back.dmi differ diff --git a/icons/mob/human_parts_greyscale.dmi b/icons/mob/human_parts_greyscale.dmi index a8d2a2aef3..50c143b9cb 100644 Binary files a/icons/mob/human_parts_greyscale.dmi and b/icons/mob/human_parts_greyscale.dmi differ diff --git a/icons/mob/inhands/equipment/backpack_lefthand.dmi b/icons/mob/inhands/equipment/backpack_lefthand.dmi index c37d12e2c0..0e466486c5 100644 Binary files a/icons/mob/inhands/equipment/backpack_lefthand.dmi and b/icons/mob/inhands/equipment/backpack_lefthand.dmi differ diff --git a/icons/mob/inhands/equipment/backpack_righthand.dmi b/icons/mob/inhands/equipment/backpack_righthand.dmi index 08e05e055e..1c265a4137 100644 Binary files a/icons/mob/inhands/equipment/backpack_righthand.dmi and b/icons/mob/inhands/equipment/backpack_righthand.dmi differ diff --git a/icons/mob/neck.dmi b/icons/mob/neck.dmi index b91c29e03f..3c126daba6 100644 Binary files a/icons/mob/neck.dmi and b/icons/mob/neck.dmi differ diff --git a/icons/mob/underwear.dmi b/icons/mob/underwear.dmi index 385cd21516..0b63685668 100644 Binary files a/icons/mob/underwear.dmi and b/icons/mob/underwear.dmi differ diff --git a/icons/mob/underwear_old.dmi b/icons/mob/underwear_old.dmi new file mode 100644 index 0000000000..5e16a473ba Binary files /dev/null and b/icons/mob/underwear_old.dmi differ diff --git a/icons/obj/assemblies/electronic_setups.dmi b/icons/obj/assemblies/electronic_setups.dmi index 58ef0903be..5804c3f8ab 100644 Binary files a/icons/obj/assemblies/electronic_setups.dmi and b/icons/obj/assemblies/electronic_setups.dmi differ diff --git a/icons/obj/clockwork_objects.dmi b/icons/obj/clockwork_objects.dmi index 5b8fc246cb..56cfdf468b 100644 Binary files a/icons/obj/clockwork_objects.dmi and b/icons/obj/clockwork_objects.dmi differ diff --git a/icons/obj/clothing/neck.dmi b/icons/obj/clothing/neck.dmi index 0f3668ce10..0bdaa36e62 100644 Binary files a/icons/obj/clothing/neck.dmi and b/icons/obj/clothing/neck.dmi differ diff --git a/icons/obj/guns/energy.dmi b/icons/obj/guns/energy.dmi index e3ec4171ad..4dec451008 100644 Binary files a/icons/obj/guns/energy.dmi and b/icons/obj/guns/energy.dmi differ diff --git a/icons/obj/guns/projectile.dmi b/icons/obj/guns/projectile.dmi index 0ee0e3d2d1..e4a39903b3 100644 Binary files a/icons/obj/guns/projectile.dmi and b/icons/obj/guns/projectile.dmi differ diff --git a/icons/obj/storage.dmi b/icons/obj/storage.dmi index 0c9155827b..d6ffc12ae7 100644 Binary files a/icons/obj/storage.dmi and b/icons/obj/storage.dmi differ diff --git a/icons/obj/tools.dmi b/icons/obj/tools.dmi index 1454d17a16..8f6b844a23 100644 Binary files a/icons/obj/tools.dmi and b/icons/obj/tools.dmi differ diff --git a/modular_citadel/code/game/machinery/vending.dm b/modular_citadel/code/game/machinery/vending.dm index 213dd8a17a..bdca91b0e6 100755 --- a/modular_citadel/code/game/machinery/vending.dm +++ b/modular_citadel/code/game/machinery/vending.dm @@ -54,8 +54,11 @@ /obj/item/clothing/neck/petcollar = 5, /obj/item/clothing/under/mankini = 1, /obj/item/dildo/flared/huge = 1 - ) - premium = list(/obj/item/electropack/shockcollar = 3) + ) + premium = list( + /obj/item/electropack/shockcollar = 3, + /obj/item/clothing/neck/petcollar/locked = 1 + ) refill_canister = /obj/item/vending_refill/kink /* /obj/machinery/vending/nazivend diff --git a/modular_citadel/code/game/objects/items/melee/eutactic_blades.dm b/modular_citadel/code/game/objects/items/melee/eutactic_blades.dm index ce551280d9..e6ba224f8d 100644 --- a/modular_citadel/code/game/objects/items/melee/eutactic_blades.dm +++ b/modular_citadel/code/game/objects/items/melee/eutactic_blades.dm @@ -117,6 +117,19 @@ desc = "The Non-Eutactic Blade utilizes a hardlight blade that is dynamically 'forged' on demand to create a deadly sharp edge that is unbreakable. This one seems to have a damaged handle and misaligned components, causing the blade to be unstable at best" force_on = 15 //As strong a survival knife/bone dagger +/obj/item/melee/transforming/energy/sword/cx/attackby(obj/item/W, mob/living/user, params) + if(istype(W, /obj/item/melee/transforming/energy/sword/cx)) + if((W.item_flags & NODROP) || (item_flags & NODROP)) + to_chat(user, "\the [item_flags & NODROP ? src : W] is stuck to your hand, you can't attach it to \the [item_flags & NODROP ? W : src]!") + return + else + to_chat(user, "You combine the two light swords, making a single supermassive blade! You're cool.") + new /obj/item/twohanded/hypereutactic(user.drop_location()) + qdel(W) + qdel(src) + else + return ..() + /obj/item/melee/transforming/energy/sword/cx/chaplain name = "divine lightblade" force_on = 20 //haha i'll regret this @@ -244,21 +257,21 @@ inhand_y_dimension = 64 name = "hypereutactic blade" desc = "A supermassive weapon envisioned to cleave the very fabric of space and time itself in twain, the hypereutactic blade dynamically flash-forges a hypereutactic crystaline nanostructure capable of passing through most known forms of matter like a hot knife through butter." - force = 3 + force = 7 throwforce = 5 throw_speed = 3 throw_range = 5 w_class = WEIGHT_CLASS_SMALL var/w_class_on = WEIGHT_CLASS_BULKY - force_unwielded = 3 - force_wielded = 30 + force_unwielded = 7 + force_wielded = 40 wieldsound = 'sound/weapons/nebon.ogg' unwieldsound = 'sound/weapons/neboff.ogg' hitsound = "swing_hit" - armour_penetration = 10 + armour_penetration = 60 light_color = "#37FFF7" attack_verb = list("attacked", "slashed", "stabbed", "sliced", "destroyed", "ripped", "devastated", "shredded") - block_chance = 25 + block_chance = 75 max_integrity = 200 armor = list(melee = 0, bullet = 0, laser = 0, energy = 0, bomb = 0, bio = 0, rad = 0, fire = 100, acid = 70) resistance_flags = FIRE_PROOF @@ -274,7 +287,6 @@ user.visible_message("[user] points the tip of [src] at [target].", "You point the tip of [src] at [target].") return TRUE - /obj/item/twohanded/hypereutactic/wield(mob/living/carbon/M) //Specific wield () hulk checks due to reflection chance for balance issues and switches hitsounds. if(M.has_dna()) if(M.dna.check_mutation(HULK)) @@ -287,7 +299,6 @@ hitsound = 'sound/weapons/nebhit.ogg' START_PROCESSING(SSobj, src) set_light(brightness_on) - slowdown = 1 /obj/item/twohanded/hypereutactic/unwield() //Specific unwield () to switch hitsounds. sharpness = initial(sharpness) @@ -347,12 +358,8 @@ ..() to_chat(user, "Alt-click to recolor it.") - - ////////// stuff beneath this is all taken from the desword //////////// wow very professional such OOP wow - - /obj/item/twohanded/hypereutactic/attack(mob/target, mob/living/carbon/human/user) if(user.has_dna()) if(user.dna.check_mutation(HULK)) @@ -435,7 +442,7 @@ It appears to have a wooden grip and a shaved down guard." icon_state = "cxsword_hilt_traitor" force_on = 30 - armour_penetration = 35 + armour_penetration = 50 embedding = list("embedded_pain_multiplier" = 10, "embed_chance" = 75, "embedded_fall_chance" = 0, "embedded_impact_pain_multiplier" = 10) block_chance = 50 hitsound_on = 'sound/weapons/blade1.ogg' diff --git a/modular_citadel/code/modules/arousal/organs/penis.dm b/modular_citadel/code/modules/arousal/organs/penis.dm index 38e8e44f39..f6b9f1d999 100644 --- a/modular_citadel/code/modules/arousal/organs/penis.dm +++ b/modular_citadel/code/modules/arousal/organs/penis.dm @@ -4,7 +4,7 @@ icon_state = "penis" icon = 'modular_citadel/icons/obj/genitals/penis.dmi' zone = "groin" - slot = "penis" + slot = ORGAN_SLOT_PENIS w_class = 3 can_masturbate_with = TRUE masturbation_verb = "stroke" @@ -40,7 +40,8 @@ var/string = "penis_[GLOB.cock_shapes_icons[shape]]_[size]" icon_state = sanitize_text(string) var/lowershape = lowertext(shape) - desc = "You see a [lowershape] penis. You estimate it's about [round(length, 0.25)] inch[length > 1 ? "es" : ""] long." + desc = "You see [aroused_state ? "an erect" : "a flaccid"] [lowershape] penis. You estimate it's about [round(length, 0.25)] inch[round(length, 0.25) != 1 ? "es" : ""] long and [round(girth, 0.25)] inch[round(girth, 0.25) != 1 ? "es" : ""] in girth." + if(owner) if(owner.dna.species.use_skintones && owner.dna.features["genitals_use_skintone"]) if(ishuman(owner)) // Check before recasting type, although someone fucked up if you're not human AND have use_skintones somehow... diff --git a/modular_citadel/code/modules/client/loadout/head.dm b/modular_citadel/code/modules/client/loadout/head.dm index 1ef203d538..bd26f44482 100644 --- a/modular_citadel/code/modules/client/loadout/head.dm +++ b/modular_citadel/code/modules/client/loadout/head.dm @@ -56,25 +56,34 @@ //trek fancy Hats! /datum/gear/trekcap - name = "Federation Officer's Cap" + name = "Federation Officer's Cap (White)" category = SLOT_HEAD path = /obj/item/clothing/head/caphat/formal/fedcover restricted_roles = list("Captain","Head of Personnel") +/datum/gear/trekcapcap + name = "Federation Officer's Cap (Black)" + category = SLOT_HEAD + path = /obj/item/clothing/head/caphat/formal/fedcover/black + restricted_roles = list("Captain","Head of Personnel") + /datum/gear/trekcapmedisci - name = "Federation Officer's Cap" + name = "Federation Officer's Cap (Blue)" category = SLOT_HEAD path = /obj/item/clothing/head/caphat/formal/fedcover/medsci + restricted_desc = "Medical and Science" restricted_roles = list("Chief Medical Officer","Medical Doctor","Chemist","Virologist","Geneticist","Research Director","Scientist", "Roboticist") /datum/gear/trekcapeng - name = "Federation Officer's Cap" + name = "Federation Officer's Cap (Yellow)" category = SLOT_HEAD path = /obj/item/clothing/head/caphat/formal/fedcover/eng + restricted_desc = "Engineering, Security, and Cargo" restricted_roles = list("Chief Engineer","Atmospheric Technician","Station Engineer","Warden","Detective","Security Officer","Head of Security","Cargo Technician", "Shaft Miner", "Quartermaster") /datum/gear/trekcapsec - name = "Federation Officer's Cap" + name = "Federation Officer's Cap (Red)" category = SLOT_HEAD path = /obj/item/clothing/head/caphat/formal/fedcover/sec + restricted_desc = "Engineering, Security, and Cargo" restricted_roles = list("Chief Engineer","Atmospheric Technician","Station Engineer","Warden","Detective","Security Officer","Head of Security","Cargo Technician", "Shaft Miner", "Quartermaster") \ No newline at end of file diff --git a/modular_citadel/code/modules/client/loadout/loadout.dm b/modular_citadel/code/modules/client/loadout/loadout.dm index 52e4f86dbe..2e11519d0b 100644 --- a/modular_citadel/code/modules/client/loadout/loadout.dm +++ b/modular_citadel/code/modules/client/loadout/loadout.dm @@ -52,6 +52,7 @@ GLOBAL_LIST_EMPTY(loadout_whitelist_ids) var/geargroupID //defines the ID that the gear inherits from the config var/list/restricted_roles var/list/ckeywhitelist + var/restricted_desc /datum/gear/New() ..() diff --git a/modular_citadel/code/modules/client/loadout/neck.dm b/modular_citadel/code/modules/client/loadout/neck.dm index f7346ec135..320a83b87d 100644 --- a/modular_citadel/code/modules/client/loadout/neck.dm +++ b/modular_citadel/code/modules/client/loadout/neck.dm @@ -18,6 +18,16 @@ category = SLOT_NECK path = /obj/item/clothing/neck/petcollar +/datum/gear/leathercollar + name = "Leather collar" + category = SLOT_NECK + path = /obj/item/clothing/neck/petcollar/leather + +/datum/gear/choker + name = "Choker" + category = SLOT_NECK + path = /obj/item/clothing/neck/petcollar/choker + /datum/gear/scarf name = "White scarf" category = SLOT_NECK diff --git a/modular_citadel/code/modules/client/loadout/suit.dm b/modular_citadel/code/modules/client/loadout/suit.dm index 9d3a6b9a02..5a12a6bf0b 100644 --- a/modular_citadel/code/modules/client/loadout/suit.dm +++ b/modular_citadel/code/modules/client/loadout/suit.dm @@ -84,31 +84,62 @@ name = "DS9 Overcoat (use uniform)" category = SLOT_WEAR_SUIT path = /obj/item/clothing/suit/storage/trek/ds9 + restricted_desc = "All, barring Service and Civilian" restricted_roles = list("Head of Security","Captain","Head of Personnel","Chief Engineer","Research Director","Chief Medical Officer","Quartermaster", "Medical Doctor","Chemist","Virologist","Geneticist","Scientist", "Roboticist", "Atmospheric Technician","Station Engineer","Warden","Detective","Security Officer", "Cargo Technician", "Shaft Miner") //everyone who actually deserves a job. //Federation jackets from movies /datum/gear/trekcmdcap - name = "fed (movie) uniform, Captain" + name = "Fed (movie) uniform, Black" category = SLOT_WEAR_SUIT path = /obj/item/clothing/suit/storage/fluff/fedcoat/capt restricted_roles = list("Captain","Head of Personnel") /datum/gear/trekcmdmov - name = "fed (movie) uniform, sec" + name = "Fed (movie) uniform, Red" category = SLOT_WEAR_SUIT path = /obj/item/clothing/suit/storage/fluff/fedcoat + restricted_desc = "Heads of Staff and Security" restricted_roles = list("Head of Security","Captain","Head of Personnel","Chief Engineer","Research Director","Chief Medical Officer","Quartermaster","Warden","Detective","Security Officer") /datum/gear/trekmedscimov - name = "fed (movie) uniform, med/sci" + name = "Fed (movie) uniform, Blue" category = SLOT_WEAR_SUIT path = /obj/item/clothing/suit/storage/fluff/fedcoat/medsci + restricted_desc = "Medical and Science" restricted_roles = list("Chief Medical Officer","Medical Doctor","Chemist","Virologist","Geneticist","Research Director","Scientist", "Roboticist") /datum/gear/trekengmov - name = "fed (movie) uniform, ops/eng" + name = "Fed (movie) uniform, Yellow" category = SLOT_WEAR_SUIT path = /obj/item/clothing/suit/storage/fluff/fedcoat/eng + restricted_desc = "Engineering and Cargo" + restricted_roles = list("Chief Engineer","Atmospheric Technician","Station Engineer","Cargo Technician", "Shaft Miner", "Quartermaster") + +/datum/gear/trekcmdcapmod + name = "Fed (Modern) uniform, White" + category = SLOT_WEAR_SUIT + path = /obj/item/clothing/suit/storage/fluff/modernfedcoat + restricted_roles = list("Captain","Head of Personnel") + +/datum/gear/trekcmdmod + name = "Fed (Modern) uniform, Red" + category = SLOT_WEAR_SUIT + path = /obj/item/clothing/suit/storage/fluff/modernfedcoat/sec + restricted_desc = "Heads of Staff and Security" + restricted_roles = list("Head of Security","Captain","Head of Personnel","Chief Engineer","Research Director","Chief Medical Officer","Quartermaster","Warden","Detective","Security Officer") + +/datum/gear/trekmedscimod + name = "Fed (Modern) uniform, Blue" + category = SLOT_WEAR_SUIT + path = /obj/item/clothing/suit/storage/fluff/modernfedcoat/medsci + restricted_desc = "Medical and Science" + restricted_roles = list("Chief Medical Officer","Medical Doctor","Chemist","Virologist","Geneticist","Research Director","Scientist", "Roboticist") + +/datum/gear/trekengmod + name = "Fed (Modern) uniform, Yellow" + category = SLOT_WEAR_SUIT + path = /obj/item/clothing/suit/storage/fluff/modernfedcoat/eng + restricted_desc = "Engineering and Cargo" restricted_roles = list("Chief Engineer","Atmospheric Technician","Station Engineer","Cargo Technician", "Shaft Miner", "Quartermaster") diff --git a/modular_citadel/code/modules/client/loadout/uniform.dm b/modular_citadel/code/modules/client/loadout/uniform.dm index e4e2f063d3..81e17e95d3 100644 --- a/modular_citadel/code/modules/client/loadout/uniform.dm +++ b/modular_citadel/code/modules/client/loadout/uniform.dm @@ -179,18 +179,21 @@ name = "TOS uniform, cmd" category = SLOT_W_UNIFORM path = /obj/item/clothing/under/rank/trek/command + restricted_desc = "Heads of Staff" restricted_roles = list("Head of Security","Captain","Head of Personnel","Chief Engineer","Research Director","Chief Medical Officer","Quartermaster") /datum/gear/trekmedscitos name = "TOS uniform, med/sci" category = SLOT_W_UNIFORM path = /obj/item/clothing/under/rank/trek/medsci + restricted_desc = "Medical and Science" restricted_roles = list("Chief Medical Officer","Medical Doctor","Chemist","Virologist","Geneticist","Research Director","Scientist", "Roboticist") /datum/gear/trekengtos name = "TOS uniform, ops/sec" category = SLOT_W_UNIFORM path = /obj/item/clothing/under/rank/trek/engsec + restricted_desc = "Engineering and Security" restricted_roles = list("Chief Engineer","Atmospheric Technician","Station Engineer","Warden","Detective","Security Officer","Head of Security","Cargo Technician", "Shaft Miner", "Quartermaster") //TNG @@ -198,18 +201,21 @@ name = "TNG uniform, cmd" category = SLOT_W_UNIFORM path = /obj/item/clothing/under/rank/trek/command/next + restricted_desc = "Heads of Staff" restricted_roles = list("Head of Security","Captain","Head of Personnel","Chief Engineer","Research Director","Chief Medical Officer","Quartermaster") /datum/gear/trekmedscitng name = "TNG uniform, med/sci" category = SLOT_W_UNIFORM path = /obj/item/clothing/under/rank/trek/medsci/next + restricted_desc = "Medical and Science" restricted_roles = list("Chief Medical Officer","Medical Doctor","Chemist","Virologist","Geneticist","Research Director","Scientist", "Roboticist") /datum/gear/trekengtng name = "TNG uniform, ops/sec" category = SLOT_W_UNIFORM path = /obj/item/clothing/under/rank/trek/engsec/next + restricted_desc = "Engineering and Security" restricted_roles = list("Chief Engineer","Atmospheric Technician","Station Engineer","Warden","Detective","Security Officer","Head of Security","Cargo Technician", "Shaft Miner", "Quartermaster") //VOY @@ -217,18 +223,21 @@ name = "VOY uniform, cmd" category = SLOT_W_UNIFORM path = /obj/item/clothing/under/rank/trek/command/voy + restricted_desc = "Heads of Staff" restricted_roles = list("Head of Security","Captain","Head of Personnel","Chief Engineer","Research Director","Chief Medical Officer","Quartermaster") /datum/gear/trekmedscivoy name = "VOY uniform, med/sci" category = SLOT_W_UNIFORM path = /obj/item/clothing/under/rank/trek/medsci/voy + restricted_desc = "Medical and Science" restricted_roles = list("Chief Medical Officer","Medical Doctor","Chemist","Virologist","Geneticist","Research Director","Scientist", "Roboticist") /datum/gear/trekengvoy name = "VOY uniform, ops/sec" category = SLOT_W_UNIFORM path = /obj/item/clothing/under/rank/trek/engsec/voy + restricted_desc = "Engineering and Security" restricted_roles = list("Chief Engineer","Atmospheric Technician","Station Engineer","Warden","Detective","Security Officer","Head of Security","Cargo Technician", "Shaft Miner", "Quartermaster") //DS9 @@ -236,18 +245,21 @@ name = "DS9 uniform, cmd" category = SLOT_W_UNIFORM path = /obj/item/clothing/under/rank/trek/command/ds9 + restricted_desc = "Heads of Staff" restricted_roles = list("Head of Security","Captain","Head of Personnel","Chief Engineer","Research Director","Chief Medical Officer","Quartermaster") /datum/gear/trekmedscids9 name = "DS9 uniform, med/sci" category = SLOT_W_UNIFORM path = /obj/item/clothing/under/rank/trek/medsci/ds9 + restricted_desc = "Medical and Science" restricted_roles = list("Chief Medical Officer","Medical Doctor","Chemist","Virologist","Geneticist","Research Director","Scientist", "Roboticist") /datum/gear/trekengds9 name = "DS9 uniform, ops/sec" category = SLOT_W_UNIFORM path = /obj/item/clothing/under/rank/trek/engsec/ds9 + restricted_desc = "Engineering and Security" restricted_roles = list("Chief Engineer","Atmospheric Technician","Station Engineer","Warden","Detective","Security Officer","Head of Security","Cargo Technician", "Shaft Miner", "Quartermaster") //ENT @@ -255,16 +267,19 @@ name = "ENT uniform, cmd" category = SLOT_W_UNIFORM path = /obj/item/clothing/under/rank/trek/command/ent + restricted_desc = "Heads of Staff" restricted_roles = list("Head of Security","Captain","Head of Personnel","Chief Engineer","Research Director","Chief Medical Officer","Quartermaster") /datum/gear/trekmedscient name = "ENT uniform, med/sci" category = SLOT_W_UNIFORM path = /obj/item/clothing/under/rank/trek/medsci/ent + restricted_desc = "Medical and Science" restricted_roles = list("Chief Medical Officer","Medical Doctor","Chemist","Virologist","Geneticist","Research Director","Scientist", "Roboticist") /datum/gear/trekengent name = "ENT uniform, ops/sec" category = SLOT_W_UNIFORM path = /obj/item/clothing/under/rank/trek/engsec/ent + restricted_desc = "Engineering and Security" restricted_roles = list("Chief Engineer","Atmospheric Technician","Station Engineer","Warden","Detective","Security Officer","Head of Security","Cargo Technician", "Shaft Miner", "Quartermaster") diff --git a/modular_citadel/code/modules/client/preferences.dm b/modular_citadel/code/modules/client/preferences.dm index 358208c1d7..dfe419964e 100644 --- a/modular_citadel/code/modules/client/preferences.dm +++ b/modular_citadel/code/modules/client/preferences.dm @@ -24,77 +24,7 @@ // stuff that was in base max_save_slots = 10 - features = list("mcolor" = "FFF", - "tail_lizard" = "Smooth", - "tail_human" = "None", - "snout" = "Round", - "horns" = "None", - "ears" = "None", - "wings" = "None", - "frills" = "None", - "spines" = "None", - "body_markings" = "None", - "legs" = "Normal Legs", - "moth_wings" = "Plain", - "mcolor2" = "FFF", - "mcolor3" = "FFF", - "mam_body_markings" = "None", - "mam_ears" = "None", - "mam_snouts" = "None", - "mam_tail" = "None", - "mam_tail_animated" = "None", - "xenodorsal" = "Standard", - "xenohead" = "Standard", - "xenotail" = "Xenomorph Tail", - "taur" = "None", - "exhibitionist" = FALSE, - "genitals_use_skintone" = FALSE, - "has_cock" = FALSE, - "cock_shape" = "Human", - "cock_length" = 6, - "cock_girth_ratio" = COCK_GIRTH_RATIO_DEF, - "cock_color" = "fff", - "has_sheath" = FALSE, - "sheath_color" = "fff", - "has_balls" = FALSE, - "balls_internal" = FALSE, - "balls_color" = "fff", - "balls_amount" = 2, - "balls_sack_size" = BALLS_SACK_SIZE_DEF, - "balls_size" = BALLS_SIZE_DEF, - "balls_cum_rate" = CUM_RATE, - "balls_cum_mult" = CUM_RATE_MULT, - "balls_efficiency" = CUM_EFFICIENCY, - "balls_fluid" = "semen", - "has_ovi" = FALSE, - "ovi_shape" = "knotted", - "ovi_length" = 6, - "ovi_color" = "fff", - "has_eggsack" = FALSE, - "eggsack_internal" = TRUE, - "eggsack_color" = "fff", - "eggsack_size" = BALLS_SACK_SIZE_DEF, - "eggsack_egg_color" = "fff", - "eggsack_egg_size" = EGG_GIRTH_DEF, - "has_breasts" = FALSE, - "breasts_color" = "fff", - "breasts_size" = "C", - "breasts_shape" = "Pair", - "breasts_fluid" = "milk", - "has_vag" = FALSE, - "vag_shape" = "Human", - "vag_color" = "fff", - "vag_clits" = 1, - "vag_clit_diam" = 0.25, - "has_womb" = FALSE, - "womb_cum_rate" = CUM_RATE, - "womb_cum_mult" = CUM_RATE_MULT, - "womb_efficiency" = CUM_EFFICIENCY, - "womb_fluid" = "femcum", - "ipc_screen" = "Sunburst", - "ipc_antenna" = "None", - "flavor_text" = "" - ) + /datum/preferences/New(client/C) ..() diff --git a/modular_citadel/code/modules/clothing/under/trek_under.dm b/modular_citadel/code/modules/clothing/under/trek_under.dm index ddcf0e6344..8e2b94372d 100644 --- a/modular_citadel/code/modules/clothing/under/trek_under.dm +++ b/modular_citadel/code/modules/clothing/under/trek_under.dm @@ -15,7 +15,6 @@ alternate_worn_icon = 'modular_citadel/icons/mob/clothing/trek_mob_icon.dmi' item_state = "" can_adjust = FALSE //to prevent you from "wearing it casually" - mutantrace_variation = NO_MUTANTRACE_VARIATION //TOS /obj/item/clothing/under/rank/trek/command @@ -117,25 +116,25 @@ /obj/item/clothing/under/rank/trek/command/ds9 desc = "The uniform worn by command officers of the 2380s." - icon_state = "trek_command" + icon_state = "trek_ds9_command" item_state = "trek_ds9_command" /obj/item/clothing/under/rank/trek/engsec/ds9 desc = "The uniform worn by operations officers of the 2380s." - icon_state = "trek_engsec" + icon_state = "trek_ds9_engsec" item_state = "trek_ds9_engsec" /obj/item/clothing/under/rank/trek/medsci/ds9 desc = "The uniform undershirt worn by medsci officers of the 2380s." - icon_state = "trek_medsci" + icon_state = "trek_ds9_medsci" item_state = "trek_ds9_medsci" //MODERN ish Joan sqrl sprites. I think //For general use /obj/item/clothing/suit/storage/fluff/fedcoat - name = "Federation Uniform Jacket (Red)" - desc = "A uniform jacket from the United Federation. Starfleet still uses this uniform and there are variations of it. Set phasers to awesome." + name = "Federation Uniform Jacket" + desc = "A uniform jacket from the United Federation. Set phasers to awesome." icon = 'modular_citadel/icons/obj/clothing/trek_item_icon.dmi' alternate_worn_icon = 'modular_citadel/icons/mob/clothing/trek_mob_icon.dmi' @@ -177,27 +176,24 @@ icon_state = "[initial(icon_state)]_open" item_state = "[initial(item_state)]_open" unbuttoned = 1 - usr << "You unbutton the coat." + to_chat(usr,"You unbutton the coat.") if(1) icon_state = "[initial(icon_state)]" item_state = "[initial(item_state)]" unbuttoned = 0 - usr << "You button up the coat." + to_chat(usr,"You button up the coat.") usr.update_inv_wear_suit() //Variants /obj/item/clothing/suit/storage/fluff/fedcoat/medsci - desc = "A uniform jacket from the United Federation. Starfleet still uses this uniform and there are variations of it. Wearing this may make you feel all scientific." icon_state = "fedblue" item_state = "fedblue" /obj/item/clothing/suit/storage/fluff/fedcoat/eng - desc = "A uniform jacket from the United Federation. Starfleet still uses this uniform and there are variations of it.Wearing it may make you feel like checking a warp core, whatever that is." icon_state = "fedeng" item_state = "fedeng" /obj/item/clothing/suit/storage/fluff/fedcoat/capt - desc = "A uniform jacket from the United Federation. Starfleet still uses this uniform and there are variations of it. You feel like a commanding officer of Starfleet." icon_state = "fedcapt" item_state = "fedcapt" @@ -205,34 +201,31 @@ /obj/item/clothing/suit/storage/fluff/modernfedcoat name = "Modern Federation Uniform Jacket" - desc = "A modern uniform jacket from the United Federation. Their Starfleet had recently started using these uniforms. Wearing this makes you feel like a competant commander." + desc = "A modern uniform jacket from the United Federation." icon = 'modular_citadel/icons/obj/clothing/trek_item_icon.dmi' alternate_worn_icon = 'modular_citadel/icons/mob/clothing/trek_mob_icon.dmi' icon_state = "fedmodern" item_state = "fedmodern" body_parts_covered = CHEST|GROIN|ARMS allowed = list( - /obj/item/tank/internals/emergency_oxygen, - /obj/item/flashlight, - /obj/item/gun, - /obj/item/melee/baton, - /obj/item/restraints/handcuffs, - /obj/item/taperecorder) - armor = list("melee" = 45, "bullet" = 25, "laser" = 25,"energy" = 25, "bomb" = 25, "bio" = 25, "rad" = 50, "fire" = 50, "acid" = 50) + /obj/item/flashlight, /obj/item/analyzer, + /obj/item/radio, /obj/item/tank/internals/emergency_oxygen, + /obj/item/reagent_containers/hypospray, /obj/item/healthanalyzer,/obj/item/reagent_containers/syringe, + /obj/item/reagent_containers/glass/bottle/vial,/obj/item/reagent_containers/glass/beaker, + /obj/item/reagent_containers/pill,/obj/item/storage/pill_bottle, /obj/item/restraints/handcuffs,/obj/item/hypospray + ) + armor = list("melee" = 10, "bullet" = 5, "laser" = 5,"energy" = 5, "bomb" = 5, "bio" = 5, "rad" = 10, "fire" = 10, "acid" = 0) //Variants /obj/item/clothing/suit/storage/fluff/modernfedcoat/medsci - desc = "A modern uniform jacket from the United Federation. Their Starfleet had recently started using these uniforms. Wearing this makes you feel like a scientist or a pilot." icon_state = "fedmodernblue" item_state = "fedmodernblue" /obj/item/clothing/suit/storage/fluff/modernfedcoat/eng - desc = "A modern uniform jacket from the United Federation. Their Starfleet had recently started using these uniforms. You feel like you can handle any type of technical engineering problems." icon_state = "fedmoderneng" item_state = "fedmoderneng" /obj/item/clothing/suit/storage/fluff/modernfedcoat/sec - desc = "A modern uniform jacket from the United Federation. Their Starfleet had recently started using these uniforms. This uniform makes you want to protect and serve as an officer." icon_state = "fedmodernsec" item_state = "fedmodernsec" @@ -256,3 +249,7 @@ /obj/item/clothing/head/caphat/formal/fedcover/sec icon_state = "fedcapsec" item_state = "fedcapsec" + +/obj/item/clothing/head/caphat/formal/fedcover/black + icon_state = "fedcapblack" + item_state = "fedcapblack" diff --git a/modular_citadel/code/modules/integrated_electronics/subtypes/manipulation.dm b/modular_citadel/code/modules/integrated_electronics/subtypes/manipulation.dm index 246205f7b6..547c1a5768 100644 --- a/modular_citadel/code/modules/integrated_electronics/subtypes/manipulation.dm +++ b/modular_citadel/code/modules/integrated_electronics/subtypes/manipulation.dm @@ -14,7 +14,6 @@ ext_cooldown = 25 /obj/item/integrated_circuit/manipulation/electric_stimulator/do_work() - ..() set_pin_data(IC_OUTPUT, 1, 0) var/mob/living/M = get_pin_data_as_type(IC_INPUT, 1, /mob/living) if(!check_target(M)) diff --git a/modular_citadel/code/modules/mob/dead/new_player/sprite_accessories.dm b/modular_citadel/code/modules/mob/dead/new_player/sprite_accessories.dm index 1a82040dbc..a4532d0820 100644 --- a/modular_citadel/code/modules/mob/dead/new_player/sprite_accessories.dm +++ b/modular_citadel/code/modules/mob/dead/new_player/sprite_accessories.dm @@ -36,6 +36,24 @@ color_src = MATRIXED icon = 'modular_citadel/icons/mob/mam_tails.dmi' +/datum/sprite_accessory/body_markings/guilmon + name = "Guilmon" + icon_state = "guilmon" + color_src = MATRIXED + icon = 'modular_citadel/icons/mob/markings_notmammals.dmi' + +/datum/sprite_accessory/tails/lizard/guilmon + name = "Guilmon" + icon_state = "guilmon" + color_src = MATRIXED + icon = 'modular_citadel/icons/mob/mam_tails.dmi' + +/datum/sprite_accessory/tails_animated/lizard/guilmon + name = "Guilmon" + icon_state = "guilmon" + color_src = MATRIXED + icon = 'modular_citadel/icons/mob/mam_tails.dmi' + //christ this was a mistake, but it's here just in case someone wants to selectively fix /************* Lizard compatable snoots *********** /datum/sprite_accessory/snouts/bird @@ -197,6 +215,12 @@ icon = 'modular_citadel/icons/mob/mam_ears.dmi' color_src = MATRIXED +/datum/sprite_accessory/ears/human/elf + name = "Elf" + icon_state = "elf" + icon = 'modular_citadel/icons/mob/mam_ears.dmi' + color_src = SKINTONE + /datum/sprite_accessory/ears/fennec name = "Fennec" icon_state = "fennec" @@ -291,7 +315,7 @@ icon_state = "wah" icon = 'modular_citadel/icons/mob/mam_tails.dmi' color_src = MATRIXED - + /datum/sprite_accessory/tails/human/axolotl name = "Axolotl" icon_state = "axolotl" @@ -315,7 +339,7 @@ icon_state = "bee" icon = 'modular_citadel/icons/mob/mam_tails.dmi' color_src = MATRIXED - + /datum/sprite_accessory/tails/human/cat name = "Cat" icon_state = "cat" @@ -327,7 +351,7 @@ icon_state = "cat" icon = 'modular_citadel/icons/mob/mam_tails.dmi' color_src = HAIR - + /datum/sprite_accessory/tails/human/catbig name = "Cat, Big" icon_state = "catbig" @@ -339,7 +363,7 @@ icon_state = "catbig" icon = 'modular_citadel/icons/mob/mam_tails.dmi' color_src = MATRIXED - + /datum/sprite_accessory/tails/human/cow name = "Cow" icon_state = "cow" @@ -359,7 +383,7 @@ /datum/sprite_accessory/tails_animated/human/corvid name = "Corvid" icon_state = "crow" - + /datum/sprite_accessory/tails/human/eevee name = "Eevee" icon_state = "eevee" @@ -371,7 +395,7 @@ icon_state = "eevee" icon = 'modular_citadel/icons/mob/mam_tails.dmi' color_src = MATRIXED - + /datum/sprite_accessory/tails/human/fennec name = "Fennec" icon_state = "fennec" @@ -383,7 +407,7 @@ icon_state = "fennec" icon = 'modular_citadel/icons/mob/mam_tails.dmi' color_src = MATRIXED - + /datum/sprite_accessory/tails/human/fish name = "Fish" icon_state = "fish" @@ -395,7 +419,7 @@ icon_state = "fish" icon = 'modular_citadel/icons/mob/mam_tails.dmi' color_src = MATRIXED - + /datum/sprite_accessory/tails/human/fox name = "Fox" icon_state = "fox" @@ -443,7 +467,7 @@ icon_state = "insect" icon = 'modular_citadel/icons/mob/mam_tails.dmi' color_src = MATRIXED - + /datum/sprite_accessory/tails/human/kitsune name = "Kitsune" icon_state = "kitsune" @@ -455,7 +479,7 @@ icon_state = "kitsune" color_src = MATRIXED icon = 'modular_citadel/icons/mob/mam_tails.dmi' - + /datum/sprite_accessory/tails/human/murid name = "Murid" icon_state = "murid" @@ -467,7 +491,7 @@ icon_state = "murid" color_src = MATRIXED icon = 'modular_citadel/icons/mob/mam_tails.dmi' - + /datum/sprite_accessory/tails/human/otie name = "Otusian" icon_state = "otie" @@ -491,7 +515,7 @@ icon_state = "orca" color_src = MATRIXED icon = 'modular_citadel/icons/mob/mam_tails.dmi' - + /datum/sprite_accessory/tails/human/pede name = "Scolipede" icon_state = "pede" @@ -503,7 +527,7 @@ icon_state = "pede" color_src = MATRIXED icon = 'modular_citadel/icons/mob/mam_tails.dmi' - + /datum/sprite_accessory/tails/human/rabbit name = "Rabbit" icon_state = "rabbit" @@ -515,7 +539,7 @@ icon_state = "rabbit" color_src = MATRIXED icon = 'modular_citadel/icons/mob/mam_tails.dmi' - + /datum/sprite_accessory/tails/human/sergal name = "Sergal" icon_state = "sergal" @@ -527,7 +551,7 @@ icon_state = "sergal" color_src = MATRIXED icon = 'modular_citadel/icons/mob/mam_tails.dmi' - + /datum/sprite_accessory/tails/human/skunk name = "skunk" icon_state = "skunk" @@ -571,7 +595,7 @@ /datum/sprite_accessory/tails_animated/human/straighttail name = "Straight Tail" icon_state = "straighttail" - + /datum/sprite_accessory/tails/human/squirrel name = "Squirrel" icon_state = "squirrel" @@ -595,7 +619,7 @@ icon_state = "tentacle" color_src = MATRIXED icon = 'modular_citadel/icons/mob/mam_tails.dmi' - + /datum/sprite_accessory/tails/human/tiger name = "Tiger" icon_state = "tiger" @@ -607,7 +631,7 @@ icon_state = "tiger" color_src = MATRIXED icon = 'modular_citadel/icons/mob/mam_tails.dmi' - + /datum/sprite_accessory/tails/human/wolf name = "Wolf" icon_state = "wolf" @@ -619,7 +643,7 @@ icon_state = "wolf" color_src = MATRIXED icon = 'modular_citadel/icons/mob/mam_tails.dmi' - + /****************************************** *********** Mammal Body Parts ************* *******************************************/ @@ -1281,26 +1305,31 @@ datum/sprite_accessory/mam_tails/insect name = "None" icon_state = "none" ckeys_allowed = list("yousshouldnteverbeseeingthisyoumeme") + icon = 'modular_citadel/icons/mob/markings_notmammals.dmi' /datum/sprite_accessory/mam_body_markings/plain name = "Plain" icon_state = "plain" + icon = 'modular_citadel/icons/mob/markings_notmammals.dmi' -/datum/sprite_accessory/mam_body_markings/ailurus +/datum/sprite_accessory/mam_body_markings/redpanda name = "Redpanda" - icon_state = "wah" + icon_state = "redpanda" /datum/sprite_accessory/mam_body_markings/bee name = "Bee" icon_state = "bee" + icon = 'modular_citadel/icons/mob/markings_notmammals.dmi' /datum/sprite_accessory/mam_body_markings/belly name = "Belly" icon_state = "belly" + icon = 'modular_citadel/icons/mob/markings_notmammals.dmi' /datum/sprite_accessory/mam_body_markings/bellyslim name = "Bellyslim" icon_state = "bellyslim" + icon = 'modular_citadel/icons/mob/markings_notmammals.dmi' /datum/sprite_accessory/mam_body_markings/corgi name = "Corgi" @@ -1345,6 +1374,7 @@ datum/sprite_accessory/mam_tails/insect /datum/sprite_accessory/mam_body_markings/frog name = "Frog" icon_state = "frog" + icon = 'modular_citadel/icons/mob/markings_notmammals.dmi' /datum/sprite_accessory/mam_body_markings/goat name = "Goat" @@ -1353,6 +1383,7 @@ datum/sprite_accessory/mam_tails/insect /datum/sprite_accessory/mam_body_markings/handsfeet name = "Handsfeet" icon_state = "handsfeet" + icon = 'modular_citadel/icons/mob/markings_notmammals.dmi' /datum/sprite_accessory/mam_body_markings/hawk name = "Hawk" @@ -1373,6 +1404,7 @@ datum/sprite_accessory/mam_tails/insect /datum/sprite_accessory/mam_body_markings/moth name = "Moth" icon_state = "moth" + icon = 'modular_citadel/icons/mob/markings_notmammals.dmi' /datum/sprite_accessory/mam_body_markings/otie name = "Otie" @@ -1401,6 +1433,7 @@ datum/sprite_accessory/mam_tails/insect /datum/sprite_accessory/mam_body_markings/pede name = "Scolipede" icon_state = "scolipede" + icon = 'modular_citadel/icons/mob/markings_notmammals.dmi' /datum/sprite_accessory/mam_body_markings/shark name = "Shark" @@ -1429,6 +1462,7 @@ datum/sprite_accessory/mam_tails/insect /datum/sprite_accessory/mam_body_markings/turian name = "Turian" icon_state = "turian" + icon = 'modular_citadel/icons/mob/markings_notmammals.dmi' /datum/sprite_accessory/mam_body_markings/wolf name = "Wolf" @@ -1437,6 +1471,7 @@ datum/sprite_accessory/mam_tails/insect /datum/sprite_accessory/mam_body_markings/xeno name = "Xeno" icon_state = "xeno" + icon = 'modular_citadel/icons/mob/markings_notmammals.dmi' /****************************************** @@ -1746,19 +1781,6 @@ datum/sprite_accessory/mam_tails/insect // *** Snooooow flaaaaake *** -/datum/sprite_accessory/body_markings/guilmon - name = "Guilmon" - icon_state = "guilmon" - color_src = MATRIXED - -/datum/sprite_accessory/tails/lizard/guilmon - name = "Guilmon" - icon_state = "guilmon" - -/datum/sprite_accessory/tails_animated/lizard/guilmon - name = "Guilmon" - icon_state = "guilmon" - /datum/sprite_accessory/horns/guilmon name = "Guilmon" icon_state = "guilmon" @@ -1788,6 +1810,7 @@ datum/sprite_accessory/mam_tails/insect name = "sabresune" icon_state = "sabresune" ckeys_allowed = list("poojawa") + extra = TRUE /datum/sprite_accessory/mam_tails/sabresune name = "sabresune" diff --git a/modular_citadel/code/modules/mob/living/carbon/human/species_types/jellypeople.dm b/modular_citadel/code/modules/mob/living/carbon/human/species_types/jellypeople.dm index 64898f0121..b4eec5786a 100644 --- a/modular_citadel/code/modules/mob/living/carbon/human/species_types/jellypeople.dm +++ b/modular_citadel/code/modules/mob/living/carbon/human/species_types/jellypeople.dm @@ -14,7 +14,7 @@ default_features = list("mcolor" = "FFF", "mcolor2" = "FFF","mcolor3" = "FFF", "mam_tail" = "None", "mam_ears" = "None", "mam_body_markings" = "Plain", "mam_snouts" = "None", "taur" = "None") say_mod = "says" hair_color = "mutcolor" - hair_alpha = 180 + hair_alpha = 160 //a notch brighter so it blends better. liked_food = MEAT coldmod = 3 heatmod = 1 diff --git a/modular_citadel/code/modules/projectiles/guns/ballistic/magweapon.dm b/modular_citadel/code/modules/projectiles/guns/ballistic/magweapon.dm index df41a79592..b3af722332 100644 --- a/modular_citadel/code/modules/projectiles/guns/ballistic/magweapon.dm +++ b/modular_citadel/code/modules/projectiles/guns/ballistic/magweapon.dm @@ -123,7 +123,7 @@ icon_state = "[initial(icon_state)][chambered ? "" : "-e"]" ///research memes/// - +/* /obj/item/gun/ballistic/automatic/pistol/mag/nopin pin = null spawnwithmagazine = FALSE @@ -155,7 +155,7 @@ materials = list(MAT_METAL = 3000, MAT_SILVER = 250, MAT_TITANIUM = 250) build_path = /obj/item/ammo_box/magazine/mmag/small departmental_flags = DEPARTMENTAL_FLAG_SECURITY - +*/ //////toy memes///// /obj/item/projectile/bullet/reusable/foam_dart/mag @@ -271,7 +271,8 @@ recoil = 0.15 casing_ejector = 0 -///research/// +/* +//research/// /obj/item/gun/ballistic/automatic/magrifle/nopin pin = null @@ -304,7 +305,7 @@ materials = list(MAT_METAL = 6000, MAT_SILVER = 500, MAT_TITANIUM = 500) build_path = /obj/item/ammo_box/magazine/mmag departmental_flags = DEPARTMENTAL_FLAG_SECURITY - +*/ ///foamagrifle/// /obj/item/ammo_box/magazine/toy/foamag @@ -326,10 +327,9 @@ spread = 60 w_class = WEIGHT_CLASS_BULKY weapon_weight = WEAPON_HEAVY - /* // TECHWEBS IMPLEMENTATION -*/ +// /datum/techweb_node/magnetic_weapons id = "magnetic_weapons" @@ -339,7 +339,7 @@ design_ids = list("magrifle", "magpisol", "mag_magrifle", "mag_magrifle_nl", "mag_magpistol", "mag_magpistol_nl") research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 2500) export_price = 5000 - +*/ //////Hyper-Burst Rifle////// diff --git a/modular_citadel/code/modules/projectiles/guns/ballistic/magweapon_energy.dm b/modular_citadel/code/modules/projectiles/guns/ballistic/magweapon_energy.dm new file mode 100644 index 0000000000..8af0dc2013 --- /dev/null +++ b/modular_citadel/code/modules/projectiles/guns/ballistic/magweapon_energy.dm @@ -0,0 +1,294 @@ +///ammo/// + +/obj/item/ammo_casing/caseless/mag_e + var/energy_cost = 0 + +/obj/item/ammo_casing/caseless/mag_e/amagm_e + desc = "A large ferromagnetic slug intended to be launched out of a compatible weapon." + caliber = "mag_e" + icon = 'modular_citadel/icons/obj/guns/cit_guns.dmi' + icon_state = "mag-casing-live" + projectile_type = /obj/item/projectile/bullet/magrifle + energy_cost = 300 + +/obj/item/ammo_casing/caseless/mag_e/anlmagm_e + desc = "A large, specialized ferromagnetic slug designed with a less-than-lethal payload." + caliber = "mag_e" + icon = 'modular_citadel/icons/obj/guns/cit_guns.dmi' + icon_state = "mag-casing-live" + projectile_type = /obj/item/projectile/bullet/nlmagrifle + energy_cost = 300 + +/obj/item/ammo_casing/caseless/mag_e/amags + desc = "A ferromagnetic slug intended to be launched out of a compatible weapon." + caliber = "mag_e" + icon = 'modular_citadel/icons/obj/guns/cit_guns.dmi' + icon_state = "mag-casing-live" + projectile_type = /obj/item/projectile/bullet/mags + energy_cost = 200 + +/obj/item/ammo_casing/caseless/mag_e/anlmags + desc = "A specialized ferromagnetic slug designed with a less-than-lethal payload." + caliber = "mag_e" + icon = 'modular_citadel/icons/obj/guns/cit_guns.dmi' + icon_state = "mag-casing-live" + projectile_type = /obj/item/projectile/bullet/nlmags + energy_cost = 200 + +///magazines/// + +/obj/item/ammo_box/magazine/mmag_e/ + name = "magrifle magazine (non-lethal disabler)" + icon = 'modular_citadel/icons/obj/guns/cit_guns.dmi' + icon_state = "mediummagmag" + ammo_type = /obj/item/ammo_casing/caseless/mag_e/anlmagm_e + caliber = "mag_e" + max_ammo = 24 + multiple_sprites = 2 + +/obj/item/ammo_box/magazine/mmag_e/lethal + name = "magrifle magazine (lethal)" + icon = 'modular_citadel/icons/obj/guns/cit_guns.dmi' + icon_state = "mediummagmag" + ammo_type = /obj/item/ammo_casing/caseless/mag_e/amagm_e + max_ammo = 24 + + +/obj/item/ammo_box/magazine/mmag_e/small + name = "magpistol magazine (non-lethal disabler)" + icon = 'modular_citadel/icons/obj/guns/cit_guns.dmi' + icon_state = "nlmagmag" + ammo_type = /obj/item/ammo_casing/caseless/mag_e/anlmags + caliber = "mag_e" + max_ammo = 15 + multiple_sprites = 2 + +/obj/item/ammo_box/magazine/mmag_e/small/lethal + name = "magpistol magazine (lethal)" + icon = 'modular_citadel/icons/obj/guns/cit_guns.dmi' + icon_state = "smallmagmag" + ammo_type = /obj/item/ammo_casing/caseless/mag_e/amags + +///cells/// + +/obj/item/stock_parts/cell/magrifle_e + name = "magrifle power supply" + maxcharge = 14400 + chargerate = 3520 + +/obj/item/stock_parts/cell/magpistol_e + name = "magpistol power supply" + maxcharge = 6000 + chargerate = 1000 + +///sci designs/// + +/datum/design/magrifle_e + name = "Magrifle" + desc = "An upscaled Magpistol in rifle form." + id = "magrifle_e" + build_type = PROTOLATHE + materials = list(MAT_METAL = 10000, MAT_GLASS = 2000, MAT_URANIUM = 2000, MAT_TITANIUM = 10000, MAT_SILVER = 4000, MAT_GOLD = 2000) + build_path = /obj/item/gun/ballistic/automatic/magrifle_e/nopin + category = list("Weapons") + departmental_flags = DEPARTMENTAL_FLAG_SECURITY + +/datum/design/mag_magrifle_e + name = "Magrifle Magazine (Lethal)" + desc = "A 24-round magazine for the Magrifle." + id = "mag_magrifle_e" + build_type = PROTOLATHE + materials = list(MAT_METAL = 8000, MAT_SILVER = 1000) + build_path = /obj/item/ammo_box/magazine/mmag_e/lethal + category = list("Ammo") + departmental_flags = DEPARTMENTAL_FLAG_SECURITY + +/datum/design/mag_magrifle_e/nl + name = "Magrifle Magazine (Non-Lethal)" + desc = "A 24- round non-lethal magazine for the Magrifle." + id = "mag_magrifle_e_nl" + materials = list(MAT_METAL = 6000, MAT_SILVER = 500, MAT_TITANIUM = 500) + build_path = /obj/item/ammo_box/magazine/mmag_e + departmental_flags = DEPARTMENTAL_FLAG_SECURITY + +/datum/design/magpistol_e + name = "Magpistol" + desc = "A weapon which fires ferromagnetic slugs." + id = "magpistol_e" + build_type = PROTOLATHE + materials = list(MAT_METAL = 7500, MAT_GLASS = 1000, MAT_URANIUM = 1000, MAT_TITANIUM = 5000, MAT_SILVER = 2000) + build_path = /obj/item/gun/ballistic/automatic/pistol/mag_e/nopin + category = list("Weapons") + departmental_flags = DEPARTMENTAL_FLAG_SECURITY + +/datum/design/mag_magpistol_e + name = "Magpistol Magazine" + desc = "A 14 round magazine for the Magpistol." + id = "mag_magpistol_e" + build_type = PROTOLATHE + materials = list(MAT_METAL = 4000, MAT_SILVER = 500) + build_path = /obj/item/ammo_box/magazine/mmag_e/small/lethal + category = list("Ammo") + departmental_flags = DEPARTMENTAL_FLAG_SECURITY + +/datum/design/mag_magpistol_e/nl + name = "Magpistol Magazine (Non-Lethal)" + desc = "A 14 round non-lethal magazine for the Magpistol." + id = "mag_magpistol_e_nl" + materials = list(MAT_METAL = 3000, MAT_SILVER = 250, MAT_TITANIUM = 250) + build_path = /obj/item/ammo_box/magazine/mmag_e/small + departmental_flags = DEPARTMENTAL_FLAG_SECURITY + +/* +// TECHWEBS IMPLEMENTATION +*/ + +/datum/techweb_node/magnetic_weapons + id = "magnetic_weapons" + display_name = "Magnetic Weapons" + description = "Weapons using magnetic technology" + prereq_ids = list("weaponry", "adv_weaponry", "emp_adv") + design_ids = list("magrifle_e", "magpistol_e", "mag_magrifle_e", "mag_magrifle_e_nl", "mag_magpistol_e", "mag_magpistol_e_nl") + research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 2500) + export_price = 5000 + +///magrifle/// + +/obj/item/gun/ballistic/automatic/magrifle_e + name = "\improper Magnetic Rifle" + desc = "A simple upscalling of the technologies used in the magpistol, the magrifle is capable of firing slightly larger slugs in bursts. Compatible with the magpistol's slugs." + icon = 'modular_citadel/icons/obj/guns/cit_guns.dmi' + icon_state = "magrifle" + item_state = "arg" + slot_flags = 0 + mag_type = /obj/item/ammo_box/magazine/mmag_e + fire_sound = 'sound/weapons/magrifle.ogg' + can_suppress = 0 + burst_size = 3 + fire_delay = 2 + spread = 5 + recoil = 0.15 + casing_ejector = 0 + var/obj/item/stock_parts/cell/cell + var/cell_type = /obj/item/stock_parts/cell/magrifle_e + var/dead_cell = FALSE + +/obj/item/gun/ballistic/automatic/magrifle_e/examine(mob/user) + . = ..() + if(cell) + to_chat(user, "[src]'s cell is [round(cell.charge / cell.maxcharge, 0.1) * 100]% full.") + else + to_chat(user, "[src] doesn't seem to have a cell!") + +/obj/item/gun/ballistic/automatic/magrifle_e/can_shoot() + if(QDELETED(cell)) + return 0 + + var/obj/item/ammo_casing/caseless/mag_e/shot = chambered + if(!shot) + return 0 + if(cell.charge < shot.energy_cost*burst_size) + return 0 + . = ..() + +/obj/item/gun/ballistic/automatic/magrifle_e/shoot_live_shot() + var/obj/item/ammo_casing/caseless/mag_e/shot = chambered + cell.use(shot.energy_cost) + . = ..() + +/obj/item/gun/ballistic/automatic/magrifle_e/emp_act(severity) + . = ..() + if(!(. & EMP_PROTECT_CONTENTS)) + cell.use(round(cell.charge / severity)) + +/obj/item/gun/ballistic/automatic/magrifle_e/get_cell() + return cell + +/obj/item/gun/ballistic/automatic/magrifle_e/Initialize() + . = ..() + if(cell_type) + cell = new cell_type(src) + else + cell = new(src) + + if(!dead_cell) + cell.give(cell.maxcharge) + +/obj/item/gun/ballistic/automatic/magrifle_e/nopin + pin = null + spawnwithmagazine = FALSE + + +///magpistol/// + +/obj/item/gun/ballistic/automatic/pistol/mag_e + name = "magpistol" + desc = "A handgun utilizing maglev technologies to propel a ferromagnetic slug to extreme velocities." + icon = 'modular_citadel/icons/obj/guns/cit_guns.dmi' + icon_state = "magpistol" + force = 10 + fire_sound = 'sound/weapons/magpistol.ogg' + mag_type = /obj/item/ammo_box/magazine/mmag_e/small + can_suppress = 0 + casing_ejector = 0 + fire_delay = 2 + recoil = 0.2 + var/obj/item/stock_parts/cell/cell + var/cell_type = /obj/item/stock_parts/cell/magpistol_e + var/dead_cell = FALSE + +/obj/item/gun/ballistic/automatic/pistol/mag_e/examine(mob/user) + . = ..() + if(cell) + to_chat(user, "[src]'s cell is [round(cell.charge / cell.maxcharge, 0.1) * 100]% full.") + else + to_chat(user, "[src] doesn't seem to have a cell!") + +/obj/item/gun/ballistic/automatic/pistol/mag_e/can_shoot() + if(QDELETED(cell)) + return 0 + + var/obj/item/ammo_casing/caseless/mag_e/shot = chambered + if(!shot) + return 0 + if(cell.charge < shot.energy_cost) + return 0 + . = ..() + +/obj/item/gun/ballistic/automatic/pistol/mag_e/shoot_live_shot() + var/obj/item/ammo_casing/caseless/mag_e/shot = chambered + cell.use(shot.energy_cost) + . = ..() + +/obj/item/gun/ballistic/automatic/pistol/mag_e/emp_act(severity) + . = ..() + if(!(. & EMP_PROTECT_CONTENTS)) + cell.use(round(cell.charge / severity)) + +/obj/item/gun/ballistic/automatic/pistol/mag_e/get_cell() + return cell + +/obj/item/gun/ballistic/automatic/pistol/mag_e/Initialize() + . = ..() + if(cell_type) + cell = new cell_type(src) + else + cell = new(src) + + if(!dead_cell) + cell.give(cell.maxcharge) + + +/obj/item/gun/ballistic/automatic/pistol/mag_e/update_icon() + ..() + if(magazine) + cut_overlays() + add_overlay("magpistol-magazine") + else + cut_overlays() + icon_state = "[initial(icon_state)][chambered ? "" : "-e"]" + + +/obj/item/gun/ballistic/automatic/pistol/mag_e/nopin + pin = null + spawnwithmagazine = FALSE diff --git a/modular_citadel/code/modules/projectiles/guns/energy/laser.dm b/modular_citadel/code/modules/projectiles/guns/energy/laser.dm index 61996a777a..c82a3e9ed9 100644 --- a/modular_citadel/code/modules/projectiles/guns/energy/laser.dm +++ b/modular_citadel/code/modules/projectiles/guns/energy/laser.dm @@ -17,30 +17,3 @@ /obj/item/gun/energy/laser/redtag lefthand_file = 'icons/mob/inhands/weapons/guns_lefthand.dmi' righthand_file = 'icons/mob/inhands/weapons/guns_righthand.dmi' - -/obj/item/gun/energy/laser/carbine - name = "VGS blaster carbine" - desc = "A ruggedized laser carbine featuring much higher capacity and improved handling when compared to a normal blaster carbine." - icon = 'modular_citadel/icons/obj/guns/cit_guns.dmi' - icon_state = "lasernew" - item_state = "laser" - force = 10 - throwforce = 10 - ammo_type = list(/obj/item/ammo_casing/energy/lasergun) - cell_type = /obj/item/stock_parts/cell/lascarbine - -/obj/item/gun/energy/laser/carbine/nopin - pin = null - -/obj/item/stock_parts/cell/lascarbine - name = "laser carbine power supply" - maxcharge = 2500 - -/datum/design/lasercarbine - name = "VGS Blaster Carbine" - desc = "Beefed up version of a normal blaster carbine." - id = "lasercarbine" - build_type = PROTOLATHE - materials = list(MAT_GOLD = 2500, MAT_METAL = 5000, MAT_GLASS = 5000) - build_path = /obj/item/gun/energy/laser/carbine/nopin - category = list("Weapons") \ No newline at end of file diff --git a/modular_citadel/code/modules/reagents/reagents/cit_reagents.dm b/modular_citadel/code/modules/reagents/reagents/cit_reagents.dm index e46174b5a9..061f941043 100644 --- a/modular_citadel/code/modules/reagents/reagents/cit_reagents.dm +++ b/modular_citadel/code/modules/reagents/reagents/cit_reagents.dm @@ -97,7 +97,7 @@ color = "#FFADFF"//PINK, rgb(255, 173, 255) /datum/reagent/drug/aphrodisiac/on_mob_life(mob/living/M) - if(M && M.canbearoused) + if(M && M.canbearoused && !M.has_trait(TRAIT_CROCRIN_IMMUNE)) if(prob(33)) M.adjustArousalLoss(2) if(prob(5)) @@ -119,7 +119,7 @@ overdose_threshold = 20 /datum/reagent/drug/aphrodisiacplus/on_mob_life(mob/living/M) - if(M && M.canbearoused) + if(M && M.canbearoused && !M.has_trait(TRAIT_CROCRIN_IMMUNE)) if(prob(33)) M.adjustArousalLoss(6)//not quite six times as powerful, but still considerably more powerful. if(prob(5)) @@ -151,7 +151,7 @@ ..() /datum/reagent/drug/aphrodisiacplus/overdose_process(mob/living/M) - if(M && M.canbearoused && prob(33)) + if(M && M.canbearoused && !M.has_trait(TRAIT_CROCRIN_IMMUNE) && prob(33)) if(M.getArousalLoss() >= 100 && ishuman(M) && M.has_dna()) var/mob/living/carbon/human/H = M if(prob(50)) //Less spam diff --git a/modular_citadel/icons/mob/clothing/trek_item_icon.dmi b/modular_citadel/icons/mob/clothing/trek_item_icon.dmi index 86afe16b03..ed3286615b 100644 Binary files a/modular_citadel/icons/mob/clothing/trek_item_icon.dmi and b/modular_citadel/icons/mob/clothing/trek_item_icon.dmi differ diff --git a/modular_citadel/icons/mob/clothing/trek_mob_icon.dmi b/modular_citadel/icons/mob/clothing/trek_mob_icon.dmi index 51daa8179f..d3ebc31b6a 100644 Binary files a/modular_citadel/icons/mob/clothing/trek_mob_icon.dmi and b/modular_citadel/icons/mob/clothing/trek_mob_icon.dmi differ diff --git a/modular_citadel/icons/mob/mam_ears.dmi b/modular_citadel/icons/mob/mam_ears.dmi index b3946b546c..f2a788d900 100644 Binary files a/modular_citadel/icons/mob/mam_ears.dmi and b/modular_citadel/icons/mob/mam_ears.dmi differ diff --git a/modular_citadel/icons/mob/mam_markings.dmi b/modular_citadel/icons/mob/mam_markings.dmi index c391674190..ceecf12d2e 100644 Binary files a/modular_citadel/icons/mob/mam_markings.dmi and b/modular_citadel/icons/mob/mam_markings.dmi differ diff --git a/modular_citadel/icons/mob/mam_tails.dmi b/modular_citadel/icons/mob/mam_tails.dmi index 74eccae2f8..b16de1c0de 100644 Binary files a/modular_citadel/icons/mob/mam_tails.dmi and b/modular_citadel/icons/mob/mam_tails.dmi differ diff --git a/modular_citadel/icons/mob/markings_notmammals.dmi b/modular_citadel/icons/mob/markings_notmammals.dmi index 4161ea2cea..316d1d1af8 100644 Binary files a/modular_citadel/icons/mob/markings_notmammals.dmi and b/modular_citadel/icons/mob/markings_notmammals.dmi differ diff --git a/modular_citadel/icons/mob/mutant_bodyparts.dmi b/modular_citadel/icons/mob/mutant_bodyparts.dmi index 6a0bf77cd3..1ed73d2709 100644 Binary files a/modular_citadel/icons/mob/mutant_bodyparts.dmi and b/modular_citadel/icons/mob/mutant_bodyparts.dmi differ diff --git a/modular_citadel/icons/mob/muzzled_helmet.dmi b/modular_citadel/icons/mob/muzzled_helmet.dmi index 36313cce66..e1284679b3 100644 Binary files a/modular_citadel/icons/mob/muzzled_helmet.dmi and b/modular_citadel/icons/mob/muzzled_helmet.dmi differ diff --git a/modular_citadel/icons/mob/suit_digi.dmi b/modular_citadel/icons/mob/suit_digi.dmi index 22fddbe59d..c19fb01161 100644 Binary files a/modular_citadel/icons/mob/suit_digi.dmi and b/modular_citadel/icons/mob/suit_digi.dmi differ diff --git a/modular_citadel/icons/mob/uniform_digi.dmi b/modular_citadel/icons/mob/uniform_digi.dmi index c5ee6b1780..9513f82c9c 100644 Binary files a/modular_citadel/icons/mob/uniform_digi.dmi and b/modular_citadel/icons/mob/uniform_digi.dmi differ diff --git a/modular_citadel/icons/obj/food/cake.dmi b/modular_citadel/icons/obj/food/cake.dmi new file mode 100644 index 0000000000..840bfe714d Binary files /dev/null and b/modular_citadel/icons/obj/food/cake.dmi differ diff --git a/modular_citadel/icons/obj/food/food.dmi b/modular_citadel/icons/obj/food/food.dmi index ea66b3d48a..da9a6c365f 100644 Binary files a/modular_citadel/icons/obj/food/food.dmi and b/modular_citadel/icons/obj/food/food.dmi differ diff --git a/strings/clockwork_cult_changelog.txt b/strings/clockwork_cult_changelog.txt index c963ca91d1..3c5e5f5ef6 100644 --- a/strings/clockwork_cult_changelog.txt +++ b/strings/clockwork_cult_changelog.txt @@ -1 +1,4 @@ -Stargazers have been removed. Integration cogs are now the primary way of creating power. \ No newline at end of file +Stargazers have been removed. Integration cogs are now the primary way of creating power. +Brass Skewers now deal damage to mechs. +Mech Sensors are now available. They're similar to pressure sensors, but trigger if a mech steps on them, and can be built the same way. +Power nullifiers are now available. Upon triggering, they send out a small 3x3 EMP, affecting cultists and enemies alike. diff --git a/strings/tips.txt b/strings/tips.txt index 9571527853..e9c1350469 100644 --- a/strings/tips.txt +++ b/strings/tips.txt @@ -229,6 +229,8 @@ As a Servant, wraith spectacles let you see everything through walls at virtuall As a Servant, declaring war empowers a huge amount of your tools and constructs, and makes you into a spaceproof, armored clockwork automaton. As a Servant, converting or sabotaging Science and Genetics can make defending the Ark much easier. As a Servant, the Clockwork Armaments scripture allows you to summon armor and/or a weapon at will. Use it whenever you unlock it! +As a Servant, Brass created from your replica fabricators can be ground down in reagent grinders for teslium and iron. +You can bypass Servant created pressure sensors if you walk instead of jog on them. Alternatively, you can also become a Servant of Ratvar. You can deconvert Cultists of Nar-Sie and Servants of Ratvar by feeding them large amounts of holy water. Unlike revolutionaries, implanting them with mindshield implants won't do it! Tiles sprayed with holy water will permanently block Servants of Ratvar from teleporting onto them. As a Wizard, you can turn people to stone, then animate the resulting statue with a staff of animation to create an extremely powerful minion, for all of 5 minutes at least. diff --git a/strings/traumas.json b/strings/traumas.json index 9394f11f3a..f83a023491 100644 --- a/strings/traumas.json +++ b/strings/traumas.json @@ -108,7 +108,31 @@ "@pick(semicolon)i ran into the supermattre ten i dsappeard @pick(bug)", "DON'T EVER TUCH ME", "@pick(semicolon)GIVE ME FREE ROBUX PLEASE JUST ENOUGH FOR SHIRT AND PANTS", - "@pick(semicolon) DOOR STUCK!!" + "@pick(semicolon) DOOR STUCK!!", + "HOW DO i VORE", + "HOW DO i HAV SEX", + "@pick(semicolon)how do u cum", + "@pick(semicolon)ahelp how do u use dildo", + ";AI LAW 3 OPEN THIS.", + "ahelp hos pwrgamre they have 24 inch dick", + ";KERPTAN IS A KERNDUM", + "@pick(semicolon)RESEARCH NANITES FIRST", + "@pick(semicolon)how use comms?????????", + "@pick(semicolon)im SICK of ths fuckign humans runin g my furry server", + "@pick(semicolon)ai ROUGE", + "ahelp want a big titty @pick(create_nouns) gf to deepthroat my pp", + "@pick(semicolon)CHEMISST MAKE HEXACROCON OR REPORT", + "@pick(semicolon)drone 765 law 2 state LAWS NOW", + "@pick(semicolon)SM ROGUE", + "@pick(semicolon)IPCS STATE LAWS NOW", + "@pick(semicolon)lING DORMS i hear Suking noises!!!", + "@pick(semicolon)@pick(roles) tator they have @pick(mutations)!!", + "@pick(semicolon)aooc how do i steel @pick(cargo)?", + "@pick(semicolon)how do i play", + "ahelp help security powergaming with mindshields???", + ";,g absorbing @pick(roles)", + ";chemist can u @pick(create_verbs) holy @pick(mellens) for @pick(s_roles)???!!", + "@pick(semicolon) LIZZARRD SPEAKIGN IN EVIL BULL LANGUAGE SCI!!" ], "mutations": [ diff --git a/tgstation.dme b/tgstation.dme index 5b4c4eabe5..fe0f881eed 100755 --- a/tgstation.dme +++ b/tgstation.dme @@ -1226,6 +1226,7 @@ #include "code\modules\antagonists\clockcult\clock_scriptures\scripture_scripts.dm" #include "code\modules\antagonists\clockcult\clock_structures\_trap_object.dm" #include "code\modules\antagonists\clockcult\clock_structures\ark_of_the_clockwork_justicar.dm" +#include "code\modules\antagonists\clockcult\clock_structures\stargazer.dm" #include "code\modules\antagonists\clockcult\clock_structures\clockwork_obelisk.dm" #include "code\modules\antagonists\clockcult\clock_structures\eminence_spire.dm" #include "code\modules\antagonists\clockcult\clock_structures\heralds_beacon.dm" @@ -1236,8 +1237,10 @@ #include "code\modules\antagonists\clockcult\clock_structures\wall_gear.dm" #include "code\modules\antagonists\clockcult\clock_structures\trap_triggers\lever.dm" #include "code\modules\antagonists\clockcult\clock_structures\trap_triggers\pressure_sensor.dm" +#include "code\modules\antagonists\clockcult\clock_structures\trap_triggers\pressure_sensor_mech.dm" #include "code\modules\antagonists\clockcult\clock_structures\trap_triggers\repeater.dm" #include "code\modules\antagonists\clockcult\clock_structures\traps\brass_skewer.dm" +#include "code\modules\antagonists\clockcult\clock_structures\traps\power_null.dm" #include "code\modules\antagonists\clockcult\clock_structures\traps\steam_vent.dm" #include "code\modules\antagonists\cult\blood_magic.dm" #include "code\modules\antagonists\cult\cult.dm" @@ -1628,6 +1631,7 @@ #include "code\modules\food_and_drinks\food\snacks_sandwichtoast.dm" #include "code\modules\food_and_drinks\food\snacks_soup.dm" #include "code\modules\food_and_drinks\food\snacks_spaghetti.dm" +#include "code\modules\food_and_drinks\food\snacks_sushi.dm" #include "code\modules\food_and_drinks\food\snacks_vend.dm" #include "code\modules\food_and_drinks\food\snacks\dough.dm" #include "code\modules\food_and_drinks\food\snacks\meat.dm" @@ -1655,6 +1659,7 @@ #include "code\modules\food_and_drinks\recipes\tablecraft\recipes_sandwich.dm" #include "code\modules\food_and_drinks\recipes\tablecraft\recipes_soup.dm" #include "code\modules\food_and_drinks\recipes\tablecraft\recipes_spaghetti.dm" +#include "code\modules\food_and_drinks\recipes\tablecraft\recipes_sushi.dm" #include "code\modules\games\cas.dm" #include "code\modules\goonchat\browserOutput.dm" #include "code\modules\goonchat\jsErrorHandler.dm" @@ -1751,6 +1756,7 @@ #include "code\modules\integrated_electronics\subtypes\text.dm" #include "code\modules\integrated_electronics\subtypes\time.dm" #include "code\modules\integrated_electronics\subtypes\trig.dm" +#include "code\modules\integrated_electronics\subtypes\weaponized.dm" #include "code\modules\jobs\access.dm" #include "code\modules\jobs\job_exp.dm" #include "code\modules\jobs\jobs.dm" @@ -1874,7 +1880,23 @@ #include "code\modules\mob\dead\new_player\new_player.dm" #include "code\modules\mob\dead\new_player\poll.dm" #include "code\modules\mob\dead\new_player\preferences_setup.dm" -#include "code\modules\mob\dead\new_player\sprite_accessories.dm" +#include "code\modules\mob\dead\new_player\sprite_accessories\_sprite_accessories.dm" +#include "code\modules\mob\dead\new_player\sprite_accessories\body_markings.dm" +#include "code\modules\mob\dead\new_player\sprite_accessories\caps.dm" +#include "code\modules\mob\dead\new_player\sprite_accessories\ears.dm" +#include "code\modules\mob\dead\new_player\sprite_accessories\frills.dm" +#include "code\modules\mob\dead\new_player\sprite_accessories\hair_face.dm" +#include "code\modules\mob\dead\new_player\sprite_accessories\hair_head.dm" +#include "code\modules\mob\dead\new_player\sprite_accessories\horns.dm" +#include "code\modules\mob\dead\new_player\sprite_accessories\legs.dm" +#include "code\modules\mob\dead\new_player\sprite_accessories\moth_wings.dm" +#include "code\modules\mob\dead\new_player\sprite_accessories\pines.dm" +#include "code\modules\mob\dead\new_player\sprite_accessories\snouts.dm" +#include "code\modules\mob\dead\new_player\sprite_accessories\socks.dm" +#include "code\modules\mob\dead\new_player\sprite_accessories\tails.dm" +#include "code\modules\mob\dead\new_player\sprite_accessories\undershirt.dm" +#include "code\modules\mob\dead\new_player\sprite_accessories\underwear.dm" +#include "code\modules\mob\dead\new_player\sprite_accessories\wings.dm" #include "code\modules\mob\dead\observer\login.dm" #include "code\modules\mob\dead\observer\logout.dm" #include "code\modules\mob\dead\observer\notificationprefs.dm" @@ -2954,6 +2976,7 @@ #include "modular_citadel\code\modules\projectiles\guns\ballistic\flechette.dm" #include "modular_citadel\code\modules\projectiles\guns\ballistic\handguns.dm" #include "modular_citadel\code\modules\projectiles\guns\ballistic\magweapon.dm" +#include "modular_citadel\code\modules\projectiles\guns\ballistic\magweapon_energy.dm" #include "modular_citadel\code\modules\projectiles\guns\ballistic\revolver.dm" #include "modular_citadel\code\modules\projectiles\guns\ballistic\rifles.dm" #include "modular_citadel\code\modules\projectiles\guns\ballistic\spinfusor.dm"