diff --git a/.vscode/settings.json b/.vscode/settings.json index af7daeb66..69761b02a 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -5,7 +5,5 @@ "workbench.editorAssociations": { "*.dmi": "imagePreview.previewEditor" - }, - "files.eol": "\n", - "files.insertFinalNewline": true, -} + } +} \ No newline at end of file diff --git a/_maps/RandomRuins/SpaceRuins/spacehermit.dmm b/_maps/RandomRuins/SpaceRuins/spacehermit.dmm index 25c093c8c..31d83c730 100644 --- a/_maps/RandomRuins/SpaceRuins/spacehermit.dmm +++ b/_maps/RandomRuins/SpaceRuins/spacehermit.dmm @@ -6,13 +6,11 @@ /turf/closed/mineral/random/low_chance, /area/ruin/unpowered) "ac" = ( -/obj/machinery/hydroponics/soil, -/turf/open/floor/plating/asteroid/spacehermit, +/turf/open/floor/plating/asteroid, /area/ruin/unpowered) "ad" = ( -/obj/structure/table/wood, -/obj/item/shovel, -/turf/open/floor/plating/asteroid/spacehermit, +/obj/machinery/hydroponics/soil, +/turf/open/floor/plating/asteroid, /area/ruin/unpowered) "ae" = ( /turf/closed/wall/mineral/titanium, @@ -28,7 +26,9 @@ /turf/closed/wall/mineral/titanium, /area/ruin/powered) "ah" = ( -/turf/open/floor/plating/asteroid/spacehermit, +/obj/structure/table/wood, +/obj/item/shovel, +/turf/open/floor/plating/asteroid, /area/ruin/unpowered) "ai" = ( /obj/structure/lattice, @@ -47,10 +47,9 @@ /turf/closed/wall/mineral/titanium, /area/ruin/powered) "am" = ( -/obj/item/seeds/tower, -/obj/item/seeds/tower, -/obj/item/seeds/tower, -/turf/open/floor/plating/asteroid/spacehermit, +/obj/item/circuitboard/computer/rdconsole, +/obj/item/circuitboard/machine/protolathe/department/science, +/turf/open/floor/plating/asteroid, /area/ruin/unpowered) "an" = ( /turf/open/floor/mineral/titanium, @@ -92,52 +91,61 @@ /turf/closed/wall/mineral/titanium, /area/ruin/powered) "au" = ( -/obj/item/stack/sheet/mineral/wood, -/obj/item/stack/sheet/mineral/wood, -/obj/item/stack/sheet/mineral/wood, -/obj/item/stack/sheet/mineral/wood, -/obj/item/stack/sheet/mineral/wood, -/turf/open/floor/plating/asteroid/spacehermit, +/obj/item/seeds/tower, +/obj/item/seeds/tower, +/obj/item/seeds/tower, +/turf/open/floor/plating/asteroid, /area/ruin/unpowered) "av" = ( -/obj/item/twohanded/spear, -/turf/open/floor/plating/asteroid/spacehermit, +/obj/structure/table/wood, +/obj/item/paper/crumpled{ + info = "

So this is it, I guess.. Always thought I'd go out doing something stupid, but.. not like this.
Should anyone find this note, tell Jeremy Clarke he can kiss my ass. Launching the pod unprepared like that..
Well. Now that I'm keeling over here, I guess I should write how I came to be the last one standing here.
Four of us took this pod.. only three of us woke up though.. fourth pod is locked from the inside, we couldn't figure out how to get it open.
Me and the clown set up a farm s'we can survive at least a while.. though, he didn't seem to understand that man cannot live on banana alone.
Had a bunch of circuits on him for some reason when he eventually passed, whispered to me something about a chem dispenser.. I.. don't know what he meant by that. I was never good with machinary. Maybe he wanted space lube?
The assistant that we gave the space suit to go out and find help never came back.. I'm betting he found salvation and left us behind.. never can trust those grubby greytiders." + }, +/obj/item/pen, +/obj/item/bluespace_thread{ + pixel_x = -1; + pixel_y = 1 + }, +/turf/open/floor/plating/asteroid, /area/ruin/unpowered) "aw" = ( -/obj/item/grown/log, -/obj/item/grown/log, -/turf/open/floor/plating/asteroid/spacehermit, +/obj/item/stack/sheet/mineral/wood, +/obj/item/stack/sheet/mineral/wood, +/obj/item/stack/sheet/mineral/wood, +/obj/item/stack/sheet/mineral/wood, +/obj/item/stack/sheet/mineral/wood, +/turf/open/floor/plating/asteroid, /area/ruin/unpowered) "ax" = ( -/obj/structure/table/wood, -/obj/item/storage/bag/plants/portaseeder, -/turf/open/floor/plating/asteroid/spacehermit, +/obj/item/twohanded/spear, +/turf/open/floor/plating/asteroid, /area/ruin/unpowered) "ay" = ( -/obj/item/flashlight/lamp/bananalamp, -/turf/open/floor/plating/asteroid/spacehermit, +/obj/item/grown/log, +/obj/item/grown/log, +/turf/open/floor/plating/asteroid, /area/ruin/unpowered) "az" = ( -/obj/item/seeds/banana, -/obj/item/seeds/banana, -/turf/open/floor/plating/asteroid/spacehermit, +/obj/structure/table/wood, +/obj/item/storage/bag/plants/portaseeder, +/turf/open/floor/plating/asteroid, /area/ruin/unpowered) "aA" = ( /turf/open/floor/plating/asteroid/airless, /area/ruin/unpowered) "aB" = ( -/obj/effect/mob_spawn/human/clown/corpse, -/obj/structure/fans/tiny/invisible, -/turf/open/floor/plating/asteroid/spacehermit, +/obj/item/seeds/banana, +/obj/item/seeds/banana, +/turf/open/floor/plating/asteroid, /area/ruin/unpowered) "aC" = ( -/obj/item/mining_scanner, -/turf/open/floor/plating/asteroid/spacehermit, +/obj/effect/mob_spawn/human/clown/corpse, +/obj/structure/fans/tiny/invisible, +/turf/open/floor/plating/asteroid, /area/ruin/unpowered) "aD" = ( -/obj/item/circuitboard/computer/rdconsole, -/obj/item/circuitboard/machine/protolathe/department/science, -/turf/open/floor/plating/asteroid/spacehermit, +/obj/item/mining_scanner, +/turf/open/floor/plating/asteroid, /area/ruin/unpowered) "aE" = ( /obj/machinery/status_display/shuttle, @@ -145,16 +153,16 @@ /area/ruin/unpowered) "aF" = ( /obj/item/pickaxe/emergency, -/turf/open/floor/plating/asteroid/spacehermit, +/turf/open/floor/plating/asteroid, /area/ruin/unpowered) "aG" = ( /obj/structure/sink/puddle, -/turf/open/floor/plating/asteroid/spacehermit, +/turf/open/floor/plating/asteroid, /area/ruin/unpowered) "aH" = ( /obj/structure/table/wood, /obj/item/storage/firstaid/regular, -/turf/open/floor/plating/asteroid/spacehermit, +/turf/open/floor/plating/asteroid, /area/ruin/unpowered) "aI" = ( /obj/effect/mob_spawn/human/corpse/assistant, @@ -163,17 +171,17 @@ "aJ" = ( /obj/structure/table/wood, /obj/item/storage/bag/ore, -/turf/open/floor/plating/asteroid/spacehermit, +/turf/open/floor/plating/asteroid, /area/ruin/unpowered) "aK" = ( /obj/structure/reagent_dispensers/fueltank, -/turf/open/floor/plating/asteroid/spacehermit, +/turf/open/floor/plating/asteroid, /area/ruin/unpowered) "aL" = ( /obj/structure/table/wood, /obj/item/storage/toolbox/mechanical, /obj/item/clothing/head/welding, -/turf/open/floor/plating/asteroid/spacehermit, +/turf/open/floor/plating/asteroid, /area/ruin/unpowered) "aM" = ( /mob/living/simple_animal/hostile/carp, @@ -181,7 +189,7 @@ /area/template_noop) "aN" = ( /obj/structure/mineral_door/sandstone, -/turf/open/floor/plating/asteroid/spacehermit, +/turf/open/floor/plating/asteroid, /area/ruin/unpowered) "aO" = ( /mob/living/simple_animal/hostile/carp, @@ -189,17 +197,17 @@ /area/ruin/unpowered) "aP" = ( /obj/item/stack/ore/gold, -/turf/open/floor/plating/asteroid/spacehermit, +/turf/open/floor/plating/asteroid, /area/ruin/unpowered) "aQ" = ( /obj/item/stack/ore/gold, /obj/item/stack/ore/gold, /obj/item/stack/ore/gold, -/turf/open/floor/plating/asteroid/spacehermit, +/turf/open/floor/plating/asteroid, /area/ruin/unpowered) "aR" = ( /obj/item/stack/ore/iron, -/turf/open/floor/plating/asteroid/spacehermit, +/turf/open/floor/plating/asteroid, /area/ruin/unpowered) "aS" = ( /turf/closed/wall/mineral/iron, @@ -207,12 +215,12 @@ "aT" = ( /obj/item/stack/ore/iron, /obj/item/stack/ore/iron, -/turf/open/floor/plating/asteroid/spacehermit, +/turf/open/floor/plating/asteroid, /area/ruin/unpowered) "aU" = ( /obj/item/flashlight/lamp, /obj/structure/table/wood, -/turf/open/floor/plating/asteroid/spacehermit, +/turf/open/floor/plating/asteroid, /area/ruin/unpowered) "aV" = ( /obj/item/clothing/suit/space/orange, @@ -247,100 +255,92 @@ /turf/closed/wall/mineral/titanium, /area/ruin/unpowered) "bc" = ( -/obj/structure/table/wood, -/obj/item/paper/crumpled{ - info = "

So this is it, I guess.. Always thought I'd go out doing something stupid, but.. not like this.
Should anyone find this note, tell Jeremy Clarke he can kiss my ass. Launching the pod unprepared like that..
Well. Now that I'm keeling over here, I guess I should write how I came to be the last one standing here.
Four of us took this pod.. only three of us woke up though.. fourth pod is locked from the inside, we couldn't figure out how to get it open.
Me and the clown set up a farm s'we can survive at least a while.. though, he didn't seem to understand that man cannot live on banana alone.
Had a bunch of circuits on him for some reason when he eventually passed, whispered to me something about a chem dispenser.. I.. don't know what he meant by that. I was never good with machinary. Maybe he wanted space lube?
The assistant that we gave the space suit to go out and find help never came back.. I'm betting he found salvation and left us behind.. never can trust those grubby greytiders." - }, -/obj/item/pen, -/obj/item/bluespace_thread{ - pixel_x = -1; - pixel_y = 1 - }, -/turf/open/floor/plating/asteroid/spacehermit, +/obj/item/circuitboard/machine/circuit_imprinter, +/turf/open/floor/plating/asteroid, /area/ruin/unpowered) "bd" = ( -/obj/item/circuitboard/machine/circuit_imprinter, -/turf/open/floor/plating/asteroid/spacehermit, +/obj/item/grown/bananapeel, +/turf/open/floor/plating/asteroid, /area/ruin/unpowered) "be" = ( -/obj/item/grown/bananapeel, -/turf/open/floor/plating/asteroid/spacehermit, -/area/ruin/unpowered) -"bf" = ( /obj/effect/mob_spawn/human/corpse/cargo_tech, /obj/structure/fans/tiny/invisible, /obj/effect/decal/cleanable/vomit, -/turf/open/floor/plating/asteroid/spacehermit, +/turf/open/floor/plating/asteroid, +/area/ruin/unpowered) +"bf" = ( +/obj/item/clothing/glasses/meson, +/turf/open/floor/plating/asteroid, /area/ruin/unpowered) "bg" = ( -/obj/item/clothing/glasses/meson, -/turf/open/floor/plating/asteroid/spacehermit, +/obj/item/stock_parts/matter_bin, +/turf/open/floor/plating/asteroid, /area/ruin/unpowered) "bh" = ( /obj/item/circuitboard/machine/autolathe, /turf/open/floor/mineral/titanium, /area/ruin/powered) "bi" = ( -/obj/item/stock_parts/matter_bin, -/turf/open/floor/plating/asteroid/spacehermit, +/obj/item/stock_parts/manipulator, +/turf/open/floor/plating/asteroid, /area/ruin/unpowered) "bj" = ( -/obj/item/stock_parts/manipulator, -/turf/open/floor/plating/asteroid/spacehermit, +/obj/item/holosign_creator/atmos, +/turf/open/floor/plating/asteroid, /area/ruin/unpowered) "bk" = ( /obj/structure/holosign/barrier/atmos, /turf/open/floor/plating/asteroid, /area/ruin/unpowered) "bl" = ( -/obj/item/holosign_creator/atmos, -/turf/open/floor/plating/asteroid/spacehermit, -/area/ruin/unpowered) -"bm" = ( /obj/machinery/power/floodlight, /obj/structure/cable{ icon_state = "0-2" }, -/turf/open/floor/plating/asteroid/spacehermit, +/turf/open/floor/plating/asteroid, /area/ruin/unpowered) -"bn" = ( +"bm" = ( /obj/structure/cable{ icon_state = "1-4" }, -/turf/open/floor/plating/asteroid/spacehermit, +/turf/open/floor/plating/asteroid, /area/ruin/unpowered) -"bo" = ( +"bn" = ( /obj/structure/cable{ icon_state = "2-8" }, -/turf/open/floor/plating/asteroid/spacehermit, +/turf/open/floor/plating/asteroid, /area/ruin/unpowered) -"bp" = ( +"bo" = ( /obj/structure/cable{ icon_state = "1-2" }, -/turf/open/floor/plating/asteroid/spacehermit, +/turf/open/floor/plating/asteroid, +/area/ruin/unpowered) +"bp" = ( +/obj/item/stack/ore/iron, +/obj/item/stack/ore/iron, +/obj/item/stack/ore/iron, +/turf/open/floor/plating/asteroid, /area/ruin/unpowered) "bq" = ( -/obj/item/stack/ore/iron, -/obj/item/stack/ore/iron, -/obj/item/stack/ore/iron, -/turf/open/floor/plating/asteroid/spacehermit, -/area/ruin/unpowered) -"br" = ( /obj/structure/cable, /obj/machinery/power/port_gen/pacman{ active = 1; anchored = 1; sheets = 10 }, -/turf/open/floor/plating/asteroid/spacehermit, +/turf/open/floor/plating/asteroid, /area/ruin/unpowered) -"bs" = ( +"br" = ( /obj/item/stack/ore/iron, /obj/item/stack/sheet/mineral/plasma, /obj/item/stack/sheet/mineral/plasma, -/turf/open/floor/plating/asteroid/spacehermit, +/turf/open/floor/plating/asteroid, +/area/ruin/unpowered) +"bs" = ( +/obj/item/flashlight/lamp/bananalamp, +/turf/open/floor/plating/asteroid, /area/ruin/unpowered) "bt" = ( /obj/structure/fluff/empty_cryostasis_sleeper, @@ -349,9 +349,6 @@ }, /turf/open/floor/mineral/titanium, /area/ruin/powered) -"bu" = ( -/turf/closed/mineral/random/spacehermit, -/area/ruin/unpowered) (1,1,1) = {" aa @@ -489,11 +486,11 @@ ab ab ab ab -bu -bu -bu -bu -bu +ab +ab +ab +ab +ab ab ab ab @@ -535,20 +532,20 @@ ab ab ab ab -bu -bu -bu -bu -bu -bu -bu -bu -bu -bu -bu -bu -bu -bu +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab ab ab ab @@ -584,25 +581,25 @@ aA aA ab ab -bu -bu -bu -bu -bu -bu -bu -bu -bu -bu -bu -bu -bu -bu -bu -bu -bu -bu -bu +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab ab ab aA @@ -635,27 +632,27 @@ ab aA ab ab -bu -bu -bu -bu -bu -bu -bu -bu -bu -bu -bu -bu -bu -bu -bu -bu -bu -bu -bu -bu -bu +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab ab ab aA @@ -681,34 +678,34 @@ aa aA ab ab -bu -bu ab ab ab -bu -bu -bu -bu -bu -bu -bu -bu -bu -bu -bu -bu -bu -bu -bu -bu -bu -bu -bu -bu -bu -bu -bu +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 ab ab aA @@ -732,36 +729,36 @@ aa aa aA ab -bu -bu -bu -bu -bu -bu -bu -bu -bu -bu -bu -bu -bu -bu -bu -bu -bu -bu -bu -bu -bu +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab ae af ae -bu -bu -bu -bu -bu -bu +ab +ab +ab +ab +ab +ab ab ab aA @@ -784,37 +781,37 @@ aa aa aA ab -bu -bu -bu -bu -bu -bu -bu -bu -bu -bu -bu -bu -bu -bu -bu -bu -bu -bu -bu -bu -bu +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab af aq af -bu -bu -bu -bu -bu -bu -bu +ab +ab +ab +ab +ab +ab +ab ab ab aA @@ -836,38 +833,38 @@ aa aA aA ab -bu -bu -bu -bu -bu -bu -bu -bu -bu -bu -bu -bu -bu -bu -bu -bu -bu -bu -bu -bu +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab ae ae ao ae ae -bu -bu -bu -bu -bu -bu -bu +ab +ab +ab +ab +ab +ab +ab ab aA aa @@ -889,37 +886,37 @@ aA aA ab ab -bu -bu -bu -bu -bu -bu -bu -bu -bu -bu -bu -bu -bu -bu -bu -bu -bu -bu -bu +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab af an an an af -bu -bu -bu -bu -bu -bu -bu +ab +ab +ab +ab +ab +ab +ab ab ab aA @@ -941,24 +938,24 @@ aA aA aA ab -bu -bu -bu -bu -bu -bu -bu -bu -bu -bu -bu -bu -bu -bu -bu -bu -bu -bu +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab ae ae bh @@ -966,13 +963,13 @@ an an ae aZ -bu -bu -bu -bu -bu -bu -bu +ab +ab +ab +ab +ab +ab +ab ab aA aa @@ -993,24 +990,24 @@ aA aA aA ab -bu -bu -bu -bu -bu -bu -bu -bu -bu -bu -bu -bu -bu -bu -bu -bu -bu -bu +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab af aY ao @@ -1018,13 +1015,13 @@ ao ao ak ba -bu -bu -bu -bu -bu -bu -bu +ab +ab +ab +ab +ab +ab +ab ab aA aa @@ -1045,24 +1042,24 @@ aA aA aA ab -bu -bu -bu -bu -bu -bu -bu -bu -bu -bu -bu -bu -bu -bu -bu -bu -bu -bu +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab al aj ap @@ -1070,13 +1067,13 @@ an as aj aE -bu -bu -bu -bu -bu -bu -bu +ab +ab +ab +ab +ab +ab +ab ab aA aa @@ -1097,24 +1094,24 @@ aA aA aA ab -bu -bu -bu -bu -bu -bu -bu -bu -bu -bu -bu -bu -bu -bu -bu -bu -bu -bu +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab af bt ao @@ -1122,13 +1119,13 @@ ao ao bt ba -ah -bu -bu -bu -bu -bu -bu +ac +ab +ab +ab +ab +ab +ab ab aA aa @@ -1149,23 +1146,23 @@ aA aA ab ab -bu -bu -bu -bu -bu -bu -bu -ad -ax -bu -bu -bu -bu -bu -bu -bu -bu +ab +ab +ab +ab +ab +ab +ab +ah +az +ab +ab +ab +ab +ab +ab +ab +ab aR ae ae @@ -1174,13 +1171,13 @@ an an ae aZ -ah -bu -bu -bu -bu -bu -bu +ac +ab +ab +ab +ab +ab +ab ab aA aM @@ -1200,24 +1197,24 @@ aa aA aA ab -bu -bu -bu -bu -bu -bu -bu -bu -ah -ah -bu -bu -bu -bu -bu -bu -bu -bu +ab +ab +ab +ab +ab +ab +ab +ab +ac +ac +ab +ab +ab +ab +ab +ab +ab +ab aR ag ag @@ -1226,13 +1223,13 @@ ar af at bb -ah -bu -bu -bu -bu -bu -bu +ac +ab +ab +ab +ab +ab +ab ab aA aa @@ -1252,39 +1249,39 @@ aa aA aA ab -bu -bu -bu -bu -bu -bu -bu +ab +ab +ab +ab +ab +ab +ab +ad ac -ah -ah -ah -ah -bu +ac +ac +ac +ab aH aJ aL -bu -bu +ab +ab aT -ah -ah -ah -ah -ah -ah -ah +ac +ac +ac +ac +ac +ac +ac aR -bu -bu -bu -bu -bu -bu +ab +ab +ab +ab +ab +ab ab aA aa @@ -1304,39 +1301,39 @@ aA aA ab ab -bu -bu -bu -bu -bu -bu -bu +ab +ab +ab +ab +ab +ab +ab +ad +au ac +aB am -ah -az -aD -ah -ah -ah -ah -bu -bu -ah -ah -ah -ah -ah -ah -ah -ah -bi -bu -bu -bu -bu -bu -bu +ac +ac +ac +ac +ab +ab +ac +ac +ac +ac +ac +ac +ac +ac +bg +ab +ab +ab +ab +ab +ab ab aA aa @@ -1355,40 +1352,40 @@ aa aA aA ab -bu -bu -bu -bu -bu -bu -bu -bu +ab +ab +ab +ab +ab +ab +ab +ab +ad +aw +bs +aC ac -au -ay -aB -ah -ah -ah -ah -ah -bu -bu -bu -ah -ah -ah -ah -ah -ah -ah -bu -bu -bu -bu -bu -bu -bu +ac +ac +ac +ac +ab +ab +ab +ac +ac +ac +ac +ac +ac +ac +ab +ab +ab +ab +ab +ab +ab ab aA aa @@ -1407,40 +1404,40 @@ aa aA aA ab -bu -bu -bu -bu -bu -bu -bu -bu +ab +ab +ab +ab +ab +ab +ab +ab +ad +ax ac -av -ah -aC +aD aF -ah -ah -ah -bu -bu -bu +ac +ac +ac +ab +ab +ab aU -be -ah -ah +bd +ac +ac +bl bm -bn -ah -ah -bu -bu -bu -bu -bu -bu -bu +ac +ac +ab +ab +ab +ab +ab +ab +ab ab aA aa @@ -1459,39 +1456,39 @@ aa aA aA ab -bu -bu -bu -bu -bu -bu -bu -bu +ab +ab +ab +ab +ab +ab +ab +ab +ad +ay +ac +ac ac -aw -ah -ah -ah aG -ah -ah -bu -bu -bu -bc -bf -ah -ah -ah +ac +ac +ab +ab +ab +av +be +ac +ac +ac +bn bo -bp -bp -br -bu -bu -bu -bu -bu +bo +bq +ab +ab +ab +ab +ab ab ab aA @@ -1511,39 +1508,39 @@ aa aA ab ab -bu -bu -bu -bu -bu -bu -bu -bu -bu -ah -ah -ah -ah -ah -ah -ah -bu -bu -bu -bd -bg -ah -ah -ah -ah -ah -ah -bs -bu -bu -bu -bu -bu +ab +ab +ab +ab +ab +ab +ab +ab +ab +ac +ac +ac +ac +ac +ac +ac +ab +ab +ab +bc +bf +ac +ac +ac +ac +ac +ac +br +ab +ab +ab +ab +ab ab aA aa @@ -1562,39 +1559,39 @@ aa aA aA ab -bu -bu -bu -bu -bu -bu -bu -bu -bu -bu -bu -ah -bu -ah -ah -ah -ah -ah -bu -bu -ah -ah -ah -ah -ah -ah -ah -ah -ah -bu -bu -bu -bu +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ac +ab +ac +ac +ac +ac +ac +ab +ab +ac +ac +ac +ac +ac +ac +ac +ac +ac +ab +ab +ab +ab ab ab aA @@ -1614,39 +1611,39 @@ aa aA ab ab -bu -bu -bu -bu -bu -bu -bu -bu -bu -bu -bu -bu -bu -ah -ah -ah -ah -ah +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ac +ac +ac +ac +ac aN -ah -ah -ah -ah +ac +ac +ac +ac aR -ah -ah -ah -ah -bu -bu -bu -bu -bu +ac +ac +ac +ac +ab +ab +ab +ab +ab ab aA aa @@ -1665,39 +1662,39 @@ aa aa aA ab -bu -bu -bu -bu -bu -bu -bu -bu -bu -bu -bu -bu -bu -bu -bu -ah -ah -ah -bu -bu -ah -ah -ah -ah -ah -ah -ah -ah -ah -ah -ah -bu -bu +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ac +ac +ac +ab +ab +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ab +ab ab ab aa @@ -1718,38 +1715,38 @@ aa aA ab ab -bu -bu -bu -bu -bu -bu -bu -bu -bu -bu -bu -bu -bu -bu -bu -bu +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab aK -bu -bu -ah -ah -ah -ah -ah -ah -ah -bq -ah -ah +ab +ab +ac +ac +ac +ac +ac +ac +ac +bp +ac +ac aR -bu -bu +ab +ab ab aA aa @@ -1770,38 +1767,38 @@ aa aa aA ab -bu -bu -bu -bu -bu -bu -bu -bu -bu -bu -bu -bu -bu -bu -bu -bu -bu -bu -bu +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab aP -ah -ah -ah -ah -ah -ah -ah -ah -ah +ac +ac +ac +ac +ac +ac +ac +ac +ac aR -bu -bu +ab +ab ab aA aa @@ -1822,38 +1819,38 @@ aa aa aA ab -bu -bu -bu -bu -bu -bu -bu -bu -bu -bu -bu -bu -bu -bu -bu -bu -bu -bu -bu +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab aQ aP -ah -ah +ac +ac aR -ah -ah -ah -ah -bu -ah -bu -bu +ac +ac +ac +ac +ab +ac +ab +ab ab aA aa @@ -1874,37 +1871,37 @@ aa aa aA ab -bu -bu -bu -bu -bu -bu -bu -bu -bu -bu -bu -bu -bu -bu -bu -bu -bu -bu -bu -bu -bu -ah -ah -ah -ah +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ac +ac +ac +ac aP -ah -bi -bu -bu -bu +ac +bg +ab +ab +ab ab ab aa @@ -1928,35 +1925,35 @@ aA ab ab ab -bu -bu -bu -bu -bu -bu -bu -bu -bu -bu -bu -bu -bu -bu -bu -bu -bu -bu -bu -ah -ah -ah -ah -ah -ah +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ac +ac +ac +ac +ac +ac aS -bu -bu -bu +ab +ab +ab ab aA aa @@ -1980,35 +1977,35 @@ aa aA aA ab -bu -bu -bu -bu -bu -bu -bu -bu -bu -bu -bu -bu -bu -bu -bu -bu -bu -bu -bu -bi -ah -ah -ah -ah -ah +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +bg +ac +ac +ac +ac +ac aS -bu -bu -bu +ab +ab +ab ab aA aa @@ -2033,34 +2030,34 @@ aa aA ab ab -bu -bu -bu -bu -bu -bu -bu -bu -bu -bu -bu -bu -bu -bu -bu -bu -bu -bu -ah -ah -bl -ah -ah -ah +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ac +ac +bj +ac +ac +ac aS -bu -bu -bu +ab +ab +ab ab aA aa @@ -2086,32 +2083,32 @@ aa aA ab ab -bu -bu -bu -bu -bu -bu -bu -bu -bu -bu -bu -bu -bu -bu -bu -bu +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab ab aS -bj -ah -ah -ah +bi +ac +ac +ac aS aS -bu -bu +ab +ab ab ab aA @@ -2138,32 +2135,32 @@ aM aa aA ab -bu -bu -bu -bu -bu -bu -bu -bu -bu -bu -bu -bu -bu -bu +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab ab ab ab aS -ah -ah -ah -ah +ac +ac +ac +ac aS aS -bu -bu +ab +ab ab aA aa @@ -2191,18 +2188,18 @@ aa aA ab ab -bu -bu -bu -bu -bu -bu -bu -bu -bu -bu -bu -bu +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab ab ab aA @@ -2244,17 +2241,17 @@ aA aA ab ab -bu -bu -bu -bu -bu -bu -bu -bu -bu -bu -bu +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab ab aA aA @@ -2297,16 +2294,16 @@ aA aA ab ab -bu -bu -bu -bu -bu -bu -bu -bu -bu -bu +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab ab aA aA @@ -2350,15 +2347,15 @@ aA aA ab ab -bu -bu -bu -bu -bu -bu -bu -bu -bu +ab +ab +ab +ab +ab +ab +ab +ab +ab ab aA aa @@ -2403,14 +2400,14 @@ aA aA ab ab -bu -bu -bu -bu -bu -bu -bu -bu +ab +ab +ab +ab +ab +ab +ab +ab ab ab ab diff --git a/code/__DEFINES/DNA.dm b/code/__DEFINES/DNA.dm index fdaf578cd..9a0664933 100644 --- a/code/__DEFINES/DNA.dm +++ b/code/__DEFINES/DNA.dm @@ -64,7 +64,7 @@ //DNA - Because fuck you and your magic numbers being all over the codebase. #define DNA_BLOCK_SIZE 3 -#define DNA_UNI_IDENTITY_BLOCKS 20 +#define DNA_UNI_IDENTITY_BLOCKS 14 #define DNA_HAIR_COLOR_BLOCK 1 #define DNA_FACIAL_HAIR_COLOR_BLOCK 2 #define DNA_SKIN_TONE_BLOCK 3 @@ -80,14 +80,6 @@ #define DNA_MUTANTMARKING_BLOCK 13 #define DNA_TAUR_BLOCK 14 -// hyper edit -#define DNA_COSMETIC_HEAD_BLOCK 15 -#define DNA_COSMETIC_CHEST_BLOCK 16 -#define DNA_COSMETIC_L_ARM_BLOCK 17 -#define DNA_COSMETIC_R_ARM_BLOCK 18 -#define DNA_COSMETIC_L_LEG_BLOCK 19 -#define DNA_COSMETIC_R_LEG_BLOCK 20 - #define DNA_SEQUENCE_LENGTH 4 #define DNA_MUTATION_BLOCKS 8 #define DNA_UNIQUE_ENZYMES_LEN 32 @@ -126,9 +118,6 @@ #define MARKINGS 17 #define WINGCOLOR 18 -#define NOMOUTH 19 - - //organ slots #define ORGAN_SLOT_BRAIN "brain" #define ORGAN_SLOT_APPENDIX "appendix" diff --git a/code/__DEFINES/dcs/signals.dm b/code/__DEFINES/dcs/signals.dm index 635b50025..ef8fd6748 100644 --- a/code/__DEFINES/dcs/signals.dm +++ b/code/__DEFINES/dcs/signals.dm @@ -705,11 +705,6 @@ ///(obj/item/insertion_candidate, mob/user, silent) - returns bool #define COMSIG_TRY_STORAGE_CAN_INSERT "storage_can_equip" -//from base of atom/movable/on_enter_storage(): (datum/component/storage/concrete/master_storage) -#define COMSIG_STORAGE_ENTERED "storage_entered" -//from base of atom/movable/on_exit_storage(): (datum/component/storage/concrete/master_storage) -#define COMSIG_STORAGE_EXITED "storage_exited" - // /datum/component/two_handed signals ///from base of datum/component/two_handed/proc/wield(mob/living/carbon/user): (/mob/user) diff --git a/code/__DEFINES/hyper_arousal.dm b/code/__DEFINES/hyper_arousal.dm index a0450b138..bedb5c860 100644 --- a/code/__DEFINES/hyper_arousal.dm +++ b/code/__DEFINES/hyper_arousal.dm @@ -5,9 +5,4 @@ #define BELLY_STRETCH_SIZE 6 // for flavor text #define BUTT_MIN_SIZE 0 -#define BUTT_MAX_SIZE_SELECTABLE 5 -#define BUTT_MAX_SIZE 8 - -#define GENITALS_HIDDEN "hidden" -#define GENITALS_CLOTHES "clothes" -#define GENITALS_VISIBLE "visible" +#define BUTT_MAX_SIZE 5 \ No newline at end of file diff --git a/code/__DEFINES/is_helpers.dm b/code/__DEFINES/is_helpers.dm index 363d4c38b..c91c0fda4 100644 --- a/code/__DEFINES/is_helpers.dm +++ b/code/__DEFINES/is_helpers.dm @@ -60,8 +60,6 @@ GLOBAL_LIST_INIT(turfs_without_ground, typecacheof(list( #define isbrain(A) (istype(A, /mob/living/brain)) -#define isnoncarbon(A) (isliving(A) && !iscarbon(A)) - //Carbon mobs #define iscarbon(A) (istype(A, /mob/living/carbon)) diff --git a/code/__DEFINES/melee.dm b/code/__DEFINES/melee.dm index e0eace8db..cb4a43321 100644 --- a/code/__DEFINES/melee.dm +++ b/code/__DEFINES/melee.dm @@ -7,5 +7,4 @@ #define MARTIALART_MUSHPUNCH "mushroom punch" #define MARTIALART_KRAVMAGA "krav maga" #define MARTIALART_CQC "CQC" -#define MARTIALART_PLASMAFIST "plasma fist" -#define MARTIALART_KNS_CQC "KNS CQC" +#define MARTIALART_PLASMAFIST "plasma fist" \ No newline at end of file diff --git a/code/__DEFINES/mobs.dm b/code/__DEFINES/mobs.dm index 43f7dffb4..d45280be4 100644 --- a/code/__DEFINES/mobs.dm +++ b/code/__DEFINES/mobs.dm @@ -151,7 +151,6 @@ //Nutrition levels for humans #define NUTRITION_LEVEL_FAT 600 #define NUTRITION_LEVEL_FULL 550 -#define NUTRITION_LEVEL_ALMOST_FULL 535 #define NUTRITION_LEVEL_WELL_FED 450 #define NUTRITION_LEVEL_FED 350 #define NUTRITION_LEVEL_HUNGRY 250 diff --git a/code/__DEFINES/vv.dm b/code/__DEFINES/vv.dm index 2b3aae449..f1ac56206 100644 --- a/code/__DEFINES/vv.dm +++ b/code/__DEFINES/vv.dm @@ -120,6 +120,7 @@ #define VV_HK_PURRBATION "purrbation" // misc -#define VV_HK_WEAKREF_RESOLVE "weakref_resolve" #define VV_HK_SPACEVINE_PURGE "spacevine_purge" + +// paintings #define VV_HK_REMOVE_PAINTING "remove_painting" diff --git a/code/__HELPERS/_hyper_helpers.dm b/code/__HELPERS/_hyper_helpers.dm deleted file mode 100644 index 5e23e5857..000000000 --- a/code/__HELPERS/_hyper_helpers.dm +++ /dev/null @@ -1,10 +0,0 @@ -GLOBAL_LIST_EMPTY(cosmetic_heads) -GLOBAL_LIST_EMPTY(cosmetic_chests) -GLOBAL_LIST_EMPTY(cosmetic_arms) -GLOBAL_LIST_EMPTY(cosmetic_legs) - -/proc/init_cosmetic_parts(datum/cosmetic_part/type, list/global_list) - for(var/subtype in subtypesof(type)) - var/datum/cosmetic_part/part = new subtype() - global_list[part.id] = part - return global_list \ No newline at end of file diff --git a/code/__HELPERS/global_lists.dm b/code/__HELPERS/global_lists.dm index 62c6cdfbe..9b5ac9395 100644 --- a/code/__HELPERS/global_lists.dm +++ b/code/__HELPERS/global_lists.dm @@ -54,14 +54,6 @@ init_sprite_accessory_subtypes(/datum/sprite_accessory/vagina, GLOB.vagina_shapes_list) init_sprite_accessory_subtypes(/datum/sprite_accessory/breasts, GLOB.breasts_shapes_list) - - // hyper: cosmetic parts - init_cosmetic_parts(/datum/cosmetic_part/head, GLOB.cosmetic_heads) - init_cosmetic_parts(/datum/cosmetic_part/chest, GLOB.cosmetic_chests) - init_cosmetic_parts(/datum/cosmetic_part/arms, GLOB.cosmetic_arms) - init_cosmetic_parts(/datum/cosmetic_part/legs, GLOB.cosmetic_legs) - // end cosmetic parts - GLOB.breasts_size_list = list ("a", "b", "c", "d", "e", "f", "g", "h", "i", "j", "k", "l", "m", "n", "o") //We need the list to choose from initialized, but it's no longer a sprite_accessory thing. GLOB.genital_fluids_list = list ("Milk", "Water", "Semen", "Femcum", "Honey") GLOB.gentlemans_organ_names = list("phallus", "willy", "dick", "prick", "member", "tool", "gentleman's organ", "cock", "wang", "knob", "dong", "joystick", "pecker", "johnson", "weenie", "tadger", "schlong", "thirsty ferret", "baloney pony", "schlanger") diff --git a/code/__HELPERS/mobs.dm b/code/__HELPERS/mobs.dm index ae5638d48..ed0434f2f 100644 --- a/code/__HELPERS/mobs.dm +++ b/code/__HELPERS/mobs.dm @@ -136,27 +136,15 @@ var/datum/sprite_accessory/S = instance if(!S.ckeys_allowed) snowflake_mam_snouts_list[S.name] = mspath - var/list/snowflake_ipc_antenna_list = list() for(var/mspath in GLOB.ipc_antennas_list) - var/datum/sprite_accessory/antenna/instance = GLOB.ipc_antennas_list[mspath] + var/datum/sprite_accessory/mam_snouts/instance = GLOB.ipc_antennas_list[mspath] if(istype(instance, /datum/sprite_accessory)) var/datum/sprite_accessory/S = instance if(intendedspecies && S.recommended_species && !S.recommended_species.Find(intendedspecies)) continue if(!S.ckeys_allowed) snowflake_ipc_antenna_list[S.name] = mspath - - var/list/snowflake_ipc_screen_list = list() - for(var/mspath in GLOB.ipc_screens_list) - var/datum/sprite_accessory/screen/instance = GLOB.ipc_screens_list[mspath] - if(istype(instance, /datum/sprite_accessory)) - var/datum/sprite_accessory/S = instance - if(intendedspecies && S.recommended_species && !S.recommended_species.Find(intendedspecies)) - continue - if(!S.ckeys_allowed) - snowflake_ipc_screen_list[S.name] = mspath - var/color1 = random_short_color() var/color2 = random_short_color() var/color3 = random_short_color() @@ -245,17 +233,11 @@ "womb_cum_mult" = CUM_RATE_MULT, "womb_efficiency" = CUM_EFFICIENCY, "womb_fluid" = "femcum", - "ipc_screen" = snowflake_ipc_screen_list ? pick(snowflake_ipc_screen_list) : "None", - "ipc_antenna" = snowflake_ipc_antenna_list ? pick(snowflake_ipc_antenna_list) : "None", + "ipc_screen" = snowflake_ipc_antenna_list ? pick(snowflake_ipc_antenna_list) : "None", + "ipc_antenna" = "None", "flavor_text" = "", "silicon_flavor_text" = "", - "ooc_text" = "", - "cosmetic_head" = GLOB.cosmetic_heads["default"], - "cosmetic_chest" = GLOB.cosmetic_chests["default"], - "cosmetic_l_arm" = GLOB.cosmetic_arms["default"], - "cosmetic_r_arm" = GLOB.cosmetic_arms["default"], - "cosmetic_l_leg" = GLOB.cosmetic_legs["default"], - "cosmetic_r_leg" = GLOB.cosmetic_legs["default"])) + "ooc_text" = "")) /proc/random_hair_style(gender) switch(gender) diff --git a/code/controllers/subsystem/processing/chemistry.dm b/code/controllers/subsystem/processing/chemistry.dm index cc9a8b8e9..da31d65fb 100644 --- a/code/controllers/subsystem/processing/chemistry.dm +++ b/code/controllers/subsystem/processing/chemistry.dm @@ -1,4 +1,5 @@ PROCESSING_SUBSYSTEM_DEF(chemistry) - name = "Chemistry" wait = 5 flags = SS_KEEP_TIMING + + diff --git a/code/datums/dna.dm b/code/datums/dna.dm index f28b66435..ae9ac3826 100644 --- a/code/datums/dna.dm +++ b/code/datums/dna.dm @@ -132,12 +132,6 @@ if(!GLOB.taur_list.len) init_sprite_accessory_subtypes(/datum/sprite_accessory/taur, GLOB.taur_list) L[DNA_TAUR_BLOCK] = construct_block(GLOB.taur_list.Find(features["taur"]), GLOB.taur_list.len) - L[DNA_COSMETIC_HEAD_BLOCK] = construct_block(GLOB.cosmetic_heads.Find(features["cosmetic_head"]), GLOB.cosmetic_heads.len) - L[DNA_COSMETIC_CHEST_BLOCK] = construct_block(GLOB.cosmetic_chests.Find(features["cosmetic_chest"]), GLOB.cosmetic_chests.len) - L[DNA_COSMETIC_L_ARM_BLOCK] = construct_block(GLOB.cosmetic_arms.Find(features["cosmetic_l_arm"]), GLOB.cosmetic_arms.len) - L[DNA_COSMETIC_R_ARM_BLOCK] = construct_block(GLOB.cosmetic_arms.Find(features["cosmetic_r_arm"]), GLOB.cosmetic_arms.len) - L[DNA_COSMETIC_L_LEG_BLOCK] = construct_block(GLOB.cosmetic_legs.Find(features["cosmetic_l_leg"]), GLOB.cosmetic_legs.len) - L[DNA_COSMETIC_R_LEG_BLOCK] = construct_block(GLOB.cosmetic_legs.Find(features["cosmetic_r_leg"]), GLOB.cosmetic_legs.len) for(var/i=1, i<=DNA_UNI_IDENTITY_BLOCKS, i++) if(L[i]) @@ -233,18 +227,6 @@ construct_block(GLOB.mam_body_markings_list.Find(features["mam_body_markings"]), GLOB.mam_body_markings_list.len) if(DNA_TAUR_BLOCK) construct_block(GLOB.taur_list.Find(features["taur"]), GLOB.taur_list.len) - if(DNA_COSMETIC_HEAD_BLOCK) - construct_block(GLOB.cosmetic_heads.Find(features["cosmetic_head"]), GLOB.cosmetic_heads.len) - if(DNA_COSMETIC_CHEST_BLOCK) - construct_block(GLOB.cosmetic_chests.Find(features["cosmetic_chest"]), GLOB.cosmetic_chests.len) - if(DNA_COSMETIC_L_ARM_BLOCK) - construct_block(GLOB.cosmetic_arms.Find(features["cosmetic_l_arm"]), GLOB.cosmetic_arms.len) - if(DNA_COSMETIC_R_ARM_BLOCK) - construct_block(GLOB.cosmetic_arms.Find(features["cosmetic_r_arm"]), GLOB.cosmetic_arms.len) - if(DNA_COSMETIC_L_LEG_BLOCK) - construct_block(GLOB.cosmetic_legs.Find(features["cosmetic_l_leg"]), GLOB.cosmetic_legs.len) - if(DNA_COSMETIC_R_LEG_BLOCK) - construct_block(GLOB.cosmetic_legs.Find(features["cosmetic_r_leg"]), GLOB.cosmetic_legs.len) //Please use add_mutation or activate_mutation instead /datum/dna/proc/force_give(datum/mutation/human/HM) diff --git a/code/datums/elements/item_scaling.dm b/code/datums/elements/item_scaling.dm deleted file mode 100644 index a847f30f0..000000000 --- a/code/datums/elements/item_scaling.dm +++ /dev/null @@ -1,39 +0,0 @@ -/** - * Element for making items change scaling depending on if they appear in the world or in a storage container. - * - * For context, overworld items are anything on a turf, storage scaling includes anywhere that the item is used as a UI element. - * Scaling should affect the target's icon and any affecting overlays - */ -/datum/element/item_scaling - element_flags = ELEMENT_BESPOKE - id_arg_index = 2 - /// Value to scale the target by when it's in the overworld (on a turf) - var/overworld_scaling = 1 - /// Value to scale the target by when it's in a storage component or inventory slot - var/storage_scaling = 1 - -/datum/element/item_scaling/Attach(datum/target, overworld_scaling = 1, storage_scaling = 1) - . = ..() - if(!isatom(target)) - return ELEMENT_INCOMPATIBLE - - src.overworld_scaling = overworld_scaling - src.storage_scaling = storage_scaling - - scale(target, overworld_scaling) - - RegisterSignal(target, list(COMSIG_ITEM_DROPPED, COMSIG_STORAGE_EXITED), .proc/scale_overworld) - RegisterSignal(target, list(COMSIG_ITEM_EQUIPPED, COMSIG_STORAGE_ENTERED), .proc/scale_storage) - -//scale :) -/datum/element/item_scaling/proc/scale(atom/source, scaling) - var/matrix/M = matrix() - source.transform = M.Scale(scaling) - -/// Signal handler for when the item is dropped -/datum/element/item_scaling/proc/scale_overworld(datum/source) - scale(source, overworld_scaling) - -/// Signal handler for when the item is picked up -/datum/element/item_scaling/proc/scale_storage(datum/source) - scale(source, storage_scaling) diff --git a/code/datums/martial/kinaris.dm b/code/datums/martial/kinaris.dm deleted file mode 100644 index 2bbe2540c..000000000 --- a/code/datums/martial/kinaris.dm +++ /dev/null @@ -1,143 +0,0 @@ -#define KNS_KICK_COMBO "DG" -#define KNS_RESTRAIN_COMBO "GG" - -/datum/martial_art/kinaris - name = "KNS CQC" - id = MARTIALART_KNS_CQC - help_verb = /mob/living/carbon/human/proc/KNS_CQC_help - block_chance = 75 - -/datum/martial_art/kinaris/proc/drop_restraining() - restraining = FALSE - -/datum/martial_art/kinaris/proc/check_streak(mob/living/carbon/human/A, mob/living/carbon/human/D) - if(!can_use(A)) - return FALSE - if(findtext(streak,KNS_KICK_COMBO)) - streak = "" - Kick(A,D) - return TRUE - if(findtext(streak,KNS_RESTRAIN_COMBO)) - streak = "" - Restrain(A,D) - return TRUE - return FALSE - -/datum/martial_art/kinaris/proc/Kick(mob/living/carbon/human/A, mob/living/carbon/human/D) - if(!can_use(A)) - return FALSE - if(!D.stat || !D.IsKnockdown()) - D.visible_message("[A] kicks [D] back!", \ - "[A] kicks you back!") - playsound(get_turf(A), 'sound/weapons/cqchit1.ogg', 50, 1, -1) - var/atom/throw_target = get_edge_target_turf(D, A.dir) - D.throw_at(throw_target, 1, 14, A) - D.apply_damage(10, BRUTE) - log_combat(A, D, "kicked (KNS CQC)") - if(D.IsKnockdown() && !D.stat) - D.visible_message("[A] kicks [D]'s head, knocking [D.p_them()] out!", \ - "[A] kicks your head, knocking you out!") - playsound(get_turf(A), 'sound/weapons/genhit1.ogg', 50, 1, -1) - D.SetSleeping(300) - D.adjustOrganLoss(ORGAN_SLOT_BRAIN, 15, 150) - return TRUE - -/datum/martial_art/kinaris/proc/Restrain(mob/living/carbon/human/A, mob/living/carbon/human/D) - if(restraining) - return - if(!can_use(A)) - return FALSE - if(!D.stat) - D.visible_message("[A] locks [D] into a restraining position!", \ - "[A] locks you into a restraining position!") - D.adjustStaminaLoss(20) - D.Stun(100) - restraining = TRUE - addtimer(CALLBACK(src, .proc/drop_restraining), 50, TIMER_UNIQUE) - return TRUE - -/datum/martial_art/kinaris/grab_act(mob/living/carbon/human/A, mob/living/carbon/human/D) - if(!can_use(A)) - return FALSE - add_to_streak("G",D) - if(check_streak(A,D)) - return TRUE - if(A.grab_state >= GRAB_AGGRESSIVE) - D.grabbedby(A, 1) - else - A.start_pulling(D, 1) - if(A.pulling) - D.stop_pulling() - log_combat(A, D, "grabbed", addition="aggressively") - A.grab_state = GRAB_AGGRESSIVE //Instant aggressive grab - return TRUE - -/datum/martial_art/kinaris/disarm_act(mob/living/carbon/human/A, mob/living/carbon/human/D) - if(!can_use(A)) - return FALSE - add_to_streak("D",D) - var/obj/item/I = null - if(check_streak(A,D)) - return TRUE - if(prob(65)) - if(!D.stat || !D.IsKnockdown() || !restraining) - I = D.get_active_held_item() - D.visible_message("[A] strikes [D]'s jaw with their hand!", \ - "[A] strikes your jaw, disorienting you!") - playsound(get_turf(D), 'sound/weapons/cqchit1.ogg', 50, 1, -1) - if(I && D.temporarilyRemoveItemFromInventory(I)) - A.put_in_hands(I) - D.Jitter(2) - D.apply_damage(5, BRUTE) - else - D.visible_message("[A] attempted to disarm [D]!", \ - "[A] attempted to disarm [D]!") - playsound(D, 'sound/weapons/punchmiss.ogg', 25, 1, -1) - log_combat(A, D, "disarmed (KNS CQC)", "[I ? " grabbing \the [I]" : ""]") - if(restraining && A.pulling == D) - D.visible_message("[A] puts [D] into a chokehold!", \ - "[A] puts you into a chokehold!") - D.SetSleeping(400) - restraining = FALSE - if(A.grab_state < GRAB_NECK) - A.grab_state = GRAB_NECK - else - restraining = FALSE - return FALSE - return TRUE - -/datum/martial_art/kinaris/harm_act(mob/living/carbon/human/A, mob/living/carbon/human/D) - if(!can_use(A)) - return FALSE - log_combat(A, D, "attacked (KNS CQC)") - A.do_attack_animation(D) - var/picked_hit_type = pick("CQC'd", "Big Bossed") - var/bonus_damage = 13 - if(D.IsKnockdown() || D.resting || D.lying) - bonus_damage += 5 - picked_hit_type = "stomps on" - D.apply_damage(bonus_damage, PAIN) - if(picked_hit_type == "kicks" || picked_hit_type == "stomps on") - playsound(get_turf(D), 'sound/weapons/cqchit2.ogg', 50, 1, -1) - else - playsound(get_turf(D), 'sound/weapons/cqchit1.ogg', 50, 1, -1) - D.visible_message("[A] [picked_hit_type] [D]!", \ - "[A] [picked_hit_type] you!") - log_combat(A, D, "[picked_hit_type] (KNS CQC)") - if(A.resting && !D.stat && !D.IsKnockdown()) - D.visible_message("[A] leg sweeps [D]!", \ - "[A] leg sweeps you!") - playsound(get_turf(A), 'sound/effects/hit_kick.ogg', 50, 1, -1) - D.apply_damage(10, PAIN) - D.Knockdown(60) - log_combat(A, D, "sweeped (KNS CQC)") - return TRUE - -/mob/living/carbon/human/proc/KNS_CQC_help() - set name = "Remember The Basics" - set desc = "You try to remember some of the basics of training." - set category = "KNS CQC" - to_chat(usr, "You try to remember some of your training, undertaken when entering Kinaris employ.") - - to_chat(usr, "CQC Kick: Disarm Grab. Knocks opponent away. Knocks out stunned or knocked down opponents.") - to_chat(usr, "Restrain: Grab Grab. Locks opponents into a restraining position, disarm to knock them out with a choke hold.") diff --git a/code/datums/weakrefs.dm b/code/datums/weakrefs.dm index e21bc9f4d..fbe9036ea 100644 --- a/code/datums/weakrefs.dm +++ b/code/datums/weakrefs.dm @@ -1,7 +1,3 @@ -/* - * Creates a weakref to the given input. - * See /datum/weakref's documentation for more information. - */ /proc/WEAKREF(datum/input) if(istype(input) && !QDELETED(input)) if(istype(input, /datum/weakref)) @@ -14,80 +10,16 @@ /datum/proc/create_weakref() //Forced creation for admin proccalls return WEAKREF(src) -/** - * A weakref holds a non-owning reference to a datum. - * The datum can be referenced again using `resolve()`. - * - * To figure out why this is important, you must understand how deletion in - * BYOND works. - * - * Imagine a datum as a TV in a living room. When one person enters to watch - * TV, they turn it on. Others can come into the room and watch the TV. - * When the last person leaves the room, they turn off the TV because it's - * no longer being used. - * - * A datum being deleted tells everyone who's watching the TV to stop. - * If everyone leaves properly (AKA cleaning up their references), then the - * last person will turn off the TV, and everything is well. - * However, if someone is resistant (holds a hard reference after deletion), - * then someone has to walk in, drag them away, and turn off the TV forecefully. - * This process is very slow, and it's known as hard deletion. - * - * This is where weak references come in. Weak references don't count as someone - * watching the TV. Thus, when what it's referencing is destroyed, it will - * hopefully clean up properly, and limit hard deletions. - * - * A common use case for weak references is holding onto what created itself. - * For example, if a machine wanted to know what its last user was, it might - * create a `var/mob/living/last_user`. However, this is a strong reference to - * the mob, and thus will force a hard deletion when that mob is deleted. - * It is often better in this case to instead create a weakref to the user, - * meaning this type definition becomes `var/datum/weakref/last_user`. - * - * A good rule of thumb is that you should hold strong references to things - * that you *own*. For example, a dog holding a chew toy would be the owner - * of that chew toy, and thus a `var/obj/item/chew_toy` reference is fine - * (as long as it is cleaned up properly). - * However, a chew toy does not own its dog, so a `var/mob/living/dog/owner` - * might be inferior to a weakref. - * This is also a good rule of thumb to avoid circular references, such as the - * chew toy example. A circular reference that doesn't clean itself up properly - * will always hard delete. - */ /datum/weakref var/reference /datum/weakref/New(datum/thing) reference = REF(thing) -/datum/weakref/Destroy(force) - var/datum/target = resolve() - qdel(target) +/datum/weakref/Destroy() + return QDEL_HINT_LETMELIVE //Let BYOND autoGC thiswhen nothing is using it anymore. - if(!force) - return QDEL_HINT_LETMELIVE //Let BYOND autoGC thiswhen nothing is using it anymore. - target?.weak_reference = null - return ..() - -/** - * Retrieves the datum that this weakref is referencing. - * - * This will return `null` if the datum was deleted. This MUST be respected. - */ /datum/weakref/proc/resolve() var/datum/D = locate(reference) return (!QDELETED(D) && D.weak_reference == src) ? D : null - -/datum/weakref/vv_get_dropdown() - . = ..() - VV_DROPDOWN_OPTION(VV_HK_WEAKREF_RESOLVE, "Go to reference") - -/datum/weakref/vv_do_topic(list/href_list) - . = ..() - if(href_list[VV_HK_WEAKREF_RESOLVE]) - if(!check_rights(NONE)) - return - var/datum/R = resolve() - if(R) - usr.client.debug_variables(R) diff --git a/code/game/atoms_movable.dm b/code/game/atoms_movable.dm index 0bfb9ce0e..0331e5aab 100644 --- a/code/game/atoms_movable.dm +++ b/code/game/atoms_movable.dm @@ -699,11 +699,11 @@ // called when this atom is removed from a storage item, which is passed on as S. The loc variable is already set to the new destination before this is called. /atom/movable/proc/on_exit_storage(datum/component/storage/concrete/S) - SEND_SIGNAL(src, COMSIG_STORAGE_EXITED, S) + return // called when this atom is added into a storage item, which is passed on as S. The loc variable is already set to the storage item. /atom/movable/proc/on_enter_storage(datum/component/storage/concrete/S) - SEND_SIGNAL(src, COMSIG_STORAGE_ENTERED, S) + return /atom/movable/proc/get_spacemove_backup() var/atom/movable/dense_object_backup diff --git a/code/game/machinery/teleporter.dm b/code/game/machinery/teleporter.dm index 3a265a548..244aee056 100644 --- a/code/game/machinery/teleporter.dm +++ b/code/game/machinery/teleporter.dm @@ -76,23 +76,11 @@ if(!calibrated && iscarbon(M) && prob(30 - ((accuracy) * 10))) //oh dear a problem var/mob/living/carbon/C = M - - //Rework to teleporter mishap - log_game("[C] ([key_name(C)]) had a teleporter mishap") - - - to_chat(C, "You feel the world contort and twist....") //idk a good line - C.adjustCloneLoss( rand(40,75) ) - C.apply_effect((rand(120 - accuracy * 40, 180 - accuracy * 60)), EFFECT_IRRADIATE, 0) //recycling this for some extra spice - - //Oh yea, random limb removal, adjust/comment out if too harsh a punishment - - for( var/obj/item/bodypart/BP in C.bodyparts ) - if( BP.body_part != CHEST ) //I am not ready to find out what happens if your chest is missing - if(prob(50)) - - BP.dismember() - + if(C.dna?.species && C.dna.species.id != "fly" && !HAS_TRAIT(C, TRAIT_RADIMMUNE)) + to_chat(C, "You hear a buzzing in your ears.") + C.set_species(/datum/species/fly) + log_game("[C] ([key_name(C)]) was turned into a fly person") + C.apply_effect((rand(120 - accuracy * 40, 180 - accuracy * 60)), EFFECT_IRRADIATE, 0) calibrated = FALSE return diff --git a/code/game/objects/items/devices/dogborg_sleeper.dm b/code/game/objects/items/devices/dogborg_sleeper.dm index 1741f4db2..1ec48ba52 100644 --- a/code/game/objects/items/devices/dogborg_sleeper.dm +++ b/code/game/objects/items/devices/dogborg_sleeper.dm @@ -86,11 +86,11 @@ to_chat(user, "Your [src] is already occupied.") return - user.visible_message("[hound.name] is carefully inserting [target.name] into their [src].", + user.visible_message("[hound.name] is carefully inserting [target.name] into their [src].", "You start placing [target] into your [src]...") if(!patient && iscarbon(target) && !target.buckled && do_after (user, 100, target = target)) - if(!in_range(src, target)) + if(!in_range(src, target)) return if(patient) return @@ -217,7 +217,7 @@ data["occupant"]["fireLoss"] = mob_occupant.getFireLoss() data["occupant"]["cloneLoss"] = mob_occupant.getCloneLoss() data["occupant"]["brainLoss"] = mob_occupant.getOrganLoss(ORGAN_SLOT_BRAIN) - + if(mob_occupant.reagents.reagent_list.len) for(var/datum/reagent/R in mob_occupant.reagents.reagent_list) chemical_list += list(list("name" = R.name, "volume" = R.volume)) @@ -393,7 +393,7 @@ H.playsound_local(source, null, 45, falloff = 0, S = pred_digest) else if(H in contents) H.playsound_local(source, null, 65, falloff = 0, S = prey_digest) - + UpdateGut(hound) if(cleaning) addtimer(CALLBACK(src, .proc/clean_cycle, hound), 50) @@ -515,7 +515,7 @@ trashman.reset_perspective(src) user.visible_message("[hound.name]'s garbage processor groans lightly as [trashman] slips inside.", "Your garbage compactor groans lightly as [trashman] slips inside.") playsound(hound, 'sound/effects/bin_close.ogg', 80, 1) - + UpdateGut(hound) @@ -523,11 +523,4 @@ var/current_belly = ..() if(length(contents) > 11) current_belly = BORGBELLY_RED - return current_belly - - -/obj/item/dogborg/sleeper/compactor/ore//identical to janihound for moment - name = "ore processor" - desc = "A mounted compactor unit with fuel processor." - icon = 'icons/mob/dogborg.dmi' - icon_state = "compactorb"//needs its own icon + return current_belly \ No newline at end of file diff --git a/code/game/objects/items/devices/radio/radio.dm b/code/game/objects/items/devices/radio/radio.dm index adcffbc80..7b6b6edc5 100644 --- a/code/game/objects/items/devices/radio/radio.dm +++ b/code/game/objects/items/devices/radio/radio.dm @@ -67,12 +67,6 @@ syndie = TRUE if(keyslot.independent) independent = TRUE - //Skyrat edit start - if(extra_channels) - for(var/ch_name in extra_channels) - if(!(ch_name in channels)) - channels[ch_name] = extra_channels[ch_name] - //Skyrat edit end for(var/ch_name in channels) secure_radio_connections[ch_name] = add_radio(src, GLOB.radiochannels[ch_name]) diff --git a/code/game/objects/items/implants/implant_kinaris.dm b/code/game/objects/items/implants/implant_kinaris.dm deleted file mode 100644 index 3a2039ab8..000000000 --- a/code/game/objects/items/implants/implant_kinaris.dm +++ /dev/null @@ -1,38 +0,0 @@ -/obj/item/implant/kinaris - name = "KNS ENH implant" - desc = "Enables enhanced reflexes, permitting the user to deploy specialised training." - icon = 'icons/obj/implants.dmi' - icon_state ="adrenal" - activated = 1 - var/datum/martial_art/kinaris/style = new - -/obj/item/implant/kinaris/get_data() - var/dat = {"Implant Specifications:
- Name: KNS ENH Implant
- Life: Roughly twelve hours after death of host
- Implant Details:
- Function: Forces certain sections of the brain and body into a state of higher function, permitting the user to deploy specialised training."} - return dat - -/obj/item/implant/kinaris/activate() - . = ..() - var/mob/living/carbon/human/H = imp_in - if(!ishuman(H)) - return - if(!H.mind) - return - if(H.mind.has_martialart(MARTIALART_KNS_CQC)) - style.remove(H) - to_chat(H, "You disable your reflex implant.") - else - style.teach(H,1) - to_chat(H, "You feel your body burn briefly as you enable your reflex implant.") - -/obj/item/implanter/kinaris - name = "implanter (KNS ENH)" - imp_type = /obj/item/implant/kinaris - -/obj/item/implantcase/kinaris - name = "implant case - 'KNS ENH'" - desc = "A glass case containing an implant that can enhance the body of the user." - imp_type = /obj/item/implant/kinaris diff --git a/code/game/objects/items/robot/robot_upgrades.dm b/code/game/objects/items/robot/robot_upgrades.dm index 08f6bc002..47974b466 100644 --- a/code/game/objects/items/robot/robot_upgrades.dm +++ b/code/game/objects/items/robot/robot_upgrades.dm @@ -150,7 +150,7 @@ desc = "A diamond drill replacement for the mining module's standard drill." icon_state = "cyborg_upgrade3" require_module = 1 - module_type = list(/obj/item/robot_module/miner, /obj/item/robot_module/orepup) + module_type = /obj/item/robot_module/miner /obj/item/borg/upgrade/ddrill/action(mob/living/silicon/robot/R, user = usr) . = ..() @@ -182,7 +182,7 @@ desc = "A satchel of holding replacement for mining cyborg's ore satchel module." icon_state = "cyborg_upgrade3" require_module = 1 - module_type = list(/obj/item/robot_module/miner, /obj/item/robot_module/orepup) + module_type = /obj/item/robot_module/miner /obj/item/borg/upgrade/soh/action(mob/living/silicon/robot/R) . = ..() @@ -285,7 +285,7 @@ icon_state = "ash_plating" resistance_flags = LAVA_PROOF | FIRE_PROOF require_module = 1 - module_type = list(/obj/item/robot_module/miner, /obj/item/robot_module/orepup) + module_type = /obj/item/robot_module/miner /obj/item/borg/upgrade/lavaproof/action(mob/living/silicon/robot/R, user = usr) . = ..() @@ -417,7 +417,7 @@ module_type = list( /obj/item/robot_module/medical, /obj/item/robot_module/medihound) - + var/list/additional_reagents = list() /obj/item/borg/upgrade/hypospray/action(mob/living/silicon/robot/R, user = usr) diff --git a/code/game/objects/items/stacks/sheets/sheet_types.dm b/code/game/objects/items/stacks/sheets/sheet_types.dm index 309b74539..9840dad1b 100644 --- a/code/game/objects/items/stacks/sheets/sheet_types.dm +++ b/code/game/objects/items/stacks/sheets/sheet_types.dm @@ -481,11 +481,6 @@ GLOBAL_LIST_INIT(cardboard_recipes, list ( \ new /datum/stack_recipe("donk-pockets teriyaki box", /obj/item/storage/box/donkpockets/donkpocketteriyaki), \ new /datum/stack_recipe("donk-pockets pizza box", /obj/item/storage/box/donkpockets/donkpocketpizza), \ new /datum/stack_recipe("donk-pockets berry box", /obj/item/storage/box/donkpockets/donkpocketberry), \ - new /datum/stack_recipe("donk-pockets taco box", /obj/item/storage/box/donkpockets/donkpockettaco), \ - new /datum/stack_recipe("donk-pockets plasma box", /obj/item/storage/box/donkpockets/donkpocketplasma), \ - new /datum/stack_recipe("donk-pockets breakfast box", /obj/item/storage/box/donkpockets/donkpocketbreakfast), \ - new /datum/stack_recipe("donk-pockets moth box", /obj/item/storage/box/donkpockets/donkpocketmoth), \ - new /datum/stack_recipe("donk-pockets vegan box", /obj/item/storage/box/donkpockets/donkpocketvegan), \ new /datum/stack_recipe("donk-pockets honk box", /obj/item/storage/box/donkpockets/donkpockethonk), \ new /datum/stack_recipe("monkey cube box", /obj/item/storage/box/monkeycubes), null, \ diff --git a/code/game/objects/items/storage/boxes.dm b/code/game/objects/items/storage/boxes.dm index 899617fd1..278ecb93e 100644 --- a/code/game/objects/items/storage/boxes.dm +++ b/code/game/objects/items/storage/boxes.dm @@ -437,36 +437,6 @@ donktype = /obj/item/reagent_containers/food/snacks/donkpocket/spicy warmtype = /obj/item/reagent_containers/food/snacks/donkpocket/warm/spicy -/obj/item/storage/box/donkpockets/donkpockettaco //Property of Angel's Donk Co. subsidary Not'cho Corp. "They're mine! Not yo's." - name = "box of taco-flavoured donk-pockets" - icon_state = "donkpocketboxtaco" - donktype = /obj/item/reagent_containers/food/snacks/donkpocket/taco - warmtype = /obj/item/reagent_containers/food/snacks/donkpocket/warm/taco - -/obj/item/storage/box/donkpockets/donkpocketplasma - name = "box of toxic-flavoured donk-pockets" - icon_state = "donkpocketboxplasma" - donktype = /obj/item/reagent_containers/food/snacks/donkpocket/plasma - warmtype = /obj/item/reagent_containers/food/snacks/donkpocket/warm/plasma - -/obj/item/storage/box/donkpockets/donkpocketbreakfast - name = "box of breakfast-flavoured donk-pockets" - icon_state = "donkpocketboxbreakfast" - donktype = /obj/item/reagent_containers/food/snacks/donkpocket/breakfast - warmtype = /obj/item/reagent_containers/food/snacks/donkpocket/warm/breakfast - -/obj/item/storage/box/donkpockets/donkpocketmoth - name = "box of cloth-flavoured donk-pockets" - icon_state = "donkpocketboxmoth" - donktype = /obj/item/reagent_containers/food/snacks/donkpocket/moth - warmtype = /obj/item/reagent_containers/food/snacks/donkpocket/warm/moth - -/obj/item/storage/box/donkpockets/donkpocketvegan - name = "box of veggie-flavoured donk-pockets" - icon_state = "donkpocketboxvegan" - donktype = /obj/item/reagent_containers/food/snacks/donkpocket/vegan - warmtype = /obj/item/reagent_containers/food/snacks/donkpocket/warm/vegan - /obj/item/storage/box/donkpockets/donkpocketteriyaki name = "box of teriyaki-flavoured donk-pockets" icon_state = "donkpocketboxteriyaki" @@ -1355,4 +1325,4 @@ /obj/item/storage/box/marshmallow/PopulateContents() for (var/i in 1 to 5) - new /obj/item/reagent_containers/food/snacks/marshmallow(src) + new /obj/item/reagent_containers/food/snacks/marshmallow(src) diff --git a/code/game/turfs/simulated/floor/plating/asteroid.dm b/code/game/turfs/simulated/floor/plating/asteroid.dm index ede13468f..3aabfe2a3 100644 --- a/code/game/turfs/simulated/floor/plating/asteroid.dm +++ b/code/game/turfs/simulated/floor/plating/asteroid.dm @@ -123,9 +123,8 @@ planetary_atmos = TRUE baseturfs = /turf/open/lava/smooth/lava_land_surface -/turf/open/floor/plating/asteroid/spacehermit - initial_gas_mix = OPENTURF_DEFAULT_ATMOS - baseturfs = /turf/open/floor/plating/asteroid/spacehermit + + /turf/open/floor/plating/asteroid/airless initial_gas_mix = AIRLESS_ATMOS diff --git a/code/game/turfs/simulated/minerals.dm b/code/game/turfs/simulated/minerals.dm index 53f9874f4..58c72cf90 100644 --- a/code/game/turfs/simulated/minerals.dm +++ b/code/game/turfs/simulated/minerals.dm @@ -221,22 +221,6 @@ /turf/closed/mineral/iron/volcanic = 95) -//For spacehermit stuff - - -/turf/closed/mineral/random/spacehermit - icon_state = "rock" - turf_type = /turf/open/floor/plating/asteroid/spacehermit - baseturfs = /turf/open/floor/plating/asteroid/spacehermit - initial_gas_mix = OPENTURF_DEFAULT_ATMOS - defer_change = 1 - mineralChance = 6 - mineralSpawnChanceList = list( - /turf/closed/mineral/uranium = 2, /turf/closed/mineral/diamond = 1, /turf/closed/mineral/gold = 4, /turf/closed/mineral/titanium = 4, - /turf/closed/mineral/silver = 6, /turf/closed/mineral/plasma = 15, /turf/closed/mineral/iron = 40, - /turf/closed/mineral/gibtonite = 2, /turf/closed/mineral/bscrystal = 1) - -//end of spacehermit stuff /turf/closed/mineral/iron mineralType = /obj/item/stack/ore/iron diff --git a/code/modules/cargo/bounties/medical.dm b/code/modules/cargo/bounties/medical.dm index 4af80c400..95ed7a987 100644 --- a/code/modules/cargo/bounties/medical.dm +++ b/code/modules/cargo/bounties/medical.dm @@ -58,15 +58,12 @@ reward = 3000 wanted_types = list(/obj/item/organ/tail/cat) - -/* /datum/bounty/item/medical/blood name = "Generic Blood" description = "The Kinaris annual blood drive is back up to full speed, following the garlic incident. Good blood in good volumes accepted for Credit returns." reward = 3500 required_count = 600 wanted_types = list(/datum/reagent/blood) -*/ /* If anyone wants to try and fix/work, go for it /datum/bounty/item/medical/medibot // Mob so this dosn't work yet* diff --git a/code/modules/cargo/bounties/reagent.dm b/code/modules/cargo/bounties/reagent.dm index 8657717f5..35bd95c1a 100644 --- a/code/modules/cargo/bounties/reagent.dm +++ b/code/modules/cargo/bounties/reagent.dm @@ -105,6 +105,7 @@ datum/bounty/reagent/complex_drink/New() /datum/reagent/consumable/ethanol/hearty_punch,\ /datum/reagent/consumable/ethanol/manhattan_proj,\ /datum/reagent/consumable/ethanol/narsour,\ + /datum/reagent/consumable/ethanol/neurotoxin,\ /datum/reagent/consumable/ethanol/patron,\ /datum/reagent/consumable/ethanol/quadruple_sec,\ /datum/reagent/consumable/ethanol/quintuple_sec,\ @@ -169,15 +170,3 @@ datum/bounty/reagent/chemical/New() description = "CentCom is in desperate need of the chemical [name]. Ship a container of it to be rewarded." reward += rand(0, 4) * 500 -/datum/bounty/reagent/blood - name = "Blood Drive" - reward = 3500 - required_volume = 600 - -/datum/bounty/reagent/blood/New() - - var/reagent_type = /datum/reagent/blood - wanted_reagent = new reagent_type - name = wanted_reagent.name - description = "The Kinaris annual blood drive is back up to full speed, following the garlic incident. Good blood in good volumes accepted for Credit returns." - reward += rand(0, 2) * 300 diff --git a/code/modules/cargo/bounty.dm b/code/modules/cargo/bounty.dm index 3fc070efd..8736bb96a 100644 --- a/code/modules/cargo/bounty.dm +++ b/code/modules/cargo/bounty.dm @@ -75,7 +75,7 @@ GLOBAL_LIST_EMPTY(bounties_list) // Returns a new bounty of random type, but does not add it to GLOB.bounties_list. /proc/random_bounty() - switch(rand(1, 15)) + switch(rand(1, 14)) if(1) var/subtype = pick(subtypesof(/datum/bounty/item/assistant)) return new subtype @@ -118,8 +118,6 @@ GLOBAL_LIST_EMPTY(bounties_list) if(14) var/subtype = pick(subtypesof(/datum/bounty/lewd)) return new subtype - if(15) - return new /datum/bounty/reagent/blood // Called lazily at startup to populate GLOB.bounties_list with random bounties. /proc/setup_bounties() @@ -146,8 +144,7 @@ GLOBAL_LIST_EMPTY(bounties_list) /********************************Strict Type Gens********************************/ var/list/easy_add_list_strict_types = list(/datum/bounty/reagent/simple_drink = 1, /datum/bounty/reagent/complex_drink = 1, - /datum/bounty/reagent/chemical = 1, - /datum/bounty/reagent/blood = 1) + /datum/bounty/reagent/chemical = 1) for(var/the_strict_type in easy_add_list_strict_types) for(var/i in 1 to easy_add_list_strict_types[the_strict_type]) diff --git a/code/modules/client/preferences.dm b/code/modules/client/preferences.dm index 592b84942..34f5c5158 100644 --- a/code/modules/client/preferences.dm +++ b/code/modules/client/preferences.dm @@ -108,6 +108,7 @@ GLOBAL_LIST_EMPTY(preferences_datums) var/roleplayroles = FALSE //for the roleplay roles var/importantroles = FALSE //for things that define as important. + var/datum/species/pref_species = new /datum/species/human() //Mutant race var/list/features = list("mcolor" = "FFF", "tail_lizard" = "Smooth", @@ -195,14 +196,7 @@ GLOBAL_LIST_EMPTY(preferences_datums) "flavor_text" = "", "silicon_flavor_text" = "", "ooc_text" = "", - "front_genitals_over_hair" = FALSE, - "cosmetic_head" = /datum/cosmetic_part/head/default, - "cosmetic_chest" = /datum/cosmetic_part/chest/default, - "cosmetic_l_arm" = /datum/cosmetic_part/arms/default, - "cosmetic_r_arm" = /datum/cosmetic_part/arms/default, - "cosmetic_l_leg" = /datum/cosmetic_part/legs/default, - "cosmetic_r_leg" = /datum/cosmetic_part/legs/default, - "cosmetic_markings" = FALSE + "front_genitals_over_hair" = FALSE ) /// Security record note section @@ -277,6 +271,7 @@ GLOBAL_LIST_EMPTY(preferences_datums) /datum/preferences/New(client/C) parent = C + clientfps = world.fps*2 for(var/custom_name_id in GLOB.preferences_custom_names) custom_names[custom_name_id] = get_default_name(custom_name_id) @@ -444,7 +439,7 @@ GLOBAL_LIST_EMPTY(preferences_datums) dat += "Custom Species Name:[custom_species ? custom_species : "None"]
" dat += "Random Body
" dat += "Always Random Body:[be_random_body ? "Yes" : "No"]
" - dat += "
Select background:[bgstate]
" + dat += "
Cycle background:[bgstate]
" dat += "Render front genitals over hair:[features["front_genitals_over_hair"] ? "Yes" : "No"]
" var/use_skintones = pref_species.use_skintones @@ -829,55 +824,8 @@ GLOBAL_LIST_EMPTY(preferences_datums) mutant_category = 0 dat += "" + dat += "" - - // HYPER EDIT: Cosmetic body parts - - var/datum/cosmetic_part/cosmetic_head = features["cosmetic_head"] - var/datum/cosmetic_part/cosmetic_chest = features["cosmetic_chest"] - var/datum/cosmetic_part/cosmetic_arms = features["cosmetic_l_arm"] - var/datum/cosmetic_part/cosmetic_legs = features["cosmetic_l_leg"] - - dat += "
" - dat += "

Cosmetic Parts

" - dat += "Use markings on cosmetic parts? " - dat += "[features["cosmetic_markings"] ? "Yes" : "No"]" - dat += "
" - dat += "
" - dat += "

Head

" - dat += "There are no valid alt heads for this species!") - var/new_cosmetic_part - var/question = "Choose your character's alt head style:" - new_cosmetic_part = input(user, question, "Character Preference") as null|anything in selectable_parts - if(new_cosmetic_part) - features["cosmetic_head"] = GLOB.cosmetic_heads[selectable_parts[new_cosmetic_part]] - update_preview_icon() - - if("cosmetic_chest") - var/list/selectable_parts = list() - for(var/path in GLOB.cosmetic_chests) - var/datum/cosmetic_part/possible_part = GLOB.cosmetic_chests[path] - var/list/supported_species = possible_part.supported_species - if(!show_mismatched_markings && supported_species && !supported_species.Find(pref_species.id)) - continue - selectable_parts[possible_part.name] = path - if(!selectable_parts.len) - to_chat(user, "There are no valid alt chests for this species!") - var/new_cosmetic_part - var/question = "Choose your character's alt chest style:" - new_cosmetic_part = input(user, question, "Character Preference") as null|anything in selectable_parts - if(new_cosmetic_part) - features["cosmetic_chest"] = GLOB.cosmetic_chests[selectable_parts[new_cosmetic_part]] - update_preview_icon() - - // currently symmetrical - if("cosmetic_arms") - var/list/selectable_parts = list() - for(var/path in GLOB.cosmetic_arms) - var/datum/cosmetic_part/possible_part = GLOB.cosmetic_arms[path] - var/list/supported_species = possible_part.supported_species - if(!show_mismatched_markings && supported_species && !supported_species.Find(pref_species.id)) - continue - selectable_parts[possible_part.name] = path - if(!selectable_parts.len) - to_chat(user, "There are no valid alt arms for this species!") - var/new_cosmetic_part - var/question = "Choose your character's alt arms style:" - new_cosmetic_part = input(user, question, "Character Preference") as null|anything in selectable_parts - if(new_cosmetic_part) - features["cosmetic_l_arm"] = GLOB.cosmetic_arms[selectable_parts[new_cosmetic_part]] - features["cosmetic_r_arm"] = GLOB.cosmetic_arms[selectable_parts[new_cosmetic_part]] - update_preview_icon() - - if("cosmetic_legs") - var/list/selectable_parts = list() - for(var/path in GLOB.cosmetic_legs) - var/datum/cosmetic_part/possible_part = GLOB.cosmetic_legs[path] - var/list/supported_species = possible_part.supported_species - if(!show_mismatched_markings && supported_species && !supported_species.Find(pref_species.id)) - continue - selectable_parts[possible_part.name] = path - if(!selectable_parts.len) - to_chat(user, "There are no valid alt legs for this species!") - var/new_cosmetic_part - var/question = "Choose your character's alt legs style:" - new_cosmetic_part = input(user, question, "Character Preference") as null|anything in selectable_parts - if(new_cosmetic_part) - features["cosmetic_l_leg"] = GLOB.cosmetic_legs[selectable_parts[new_cosmetic_part]] - features["cosmetic_r_leg"] = GLOB.cosmetic_legs[selectable_parts[new_cosmetic_part]] - update_preview_icon() - - // End hyper edit - //Genital code if("cock_color") var/new_cockcolor = input(user, "Penis color:", "Character Preference") as color|null @@ -2569,10 +2440,9 @@ GLOBAL_LIST_EMPTY(preferences_datums) features["belly_size"] = clamp(new_bellysize, BELLY_MIN_SIZE, BELLY_MAX_SIZE) if("butt_size") - var/new_buttsize = input(user, "Butt size :\n([BUTT_MIN_SIZE]-[BUTT_MAX_SIZE_SELECTABLE])", "Character Preference") as num|null + var/new_buttsize = input(user, "Butt size :\n([BUTT_MIN_SIZE]-[BUTT_MAX_SIZE])", "Character Preference") as num|null if(new_buttsize != null) - features["butt_size"] = clamp(new_buttsize, BUTT_MIN_SIZE, BUTT_MAX_SIZE_SELECTABLE) - //Restricted to 5 in menu, because we have chems to make them big IC, like with breasts and what not. + features["butt_size"] = clamp(new_buttsize, BUTT_MIN_SIZE, BUTT_MAX_SIZE) if("vag_shape") var/new_shape @@ -2822,9 +2692,6 @@ GLOBAL_LIST_EMPTY(preferences_datums) if("all") be_random_body = !be_random_body - if("cosmetic_markings") - features["cosmetic_markings"] = !features["cosmetic_markings"] - if("hear_midis") toggles ^= SOUND_MIDI diff --git a/code/modules/client/preferences_savefile.dm b/code/modules/client/preferences_savefile.dm index a77f504f8..80fab69e6 100644 --- a/code/modules/client/preferences_savefile.dm +++ b/code/modules/client/preferences_savefile.dm @@ -576,7 +576,6 @@ SAVEFILE UPDATING/VERSIONING - 'Simplified', or rather, more coder-friendly ~Car all_quirks -= V cit_character_pref_load(S) - hyper_character_pref_load(S) return 1 @@ -672,7 +671,6 @@ SAVEFILE UPDATING/VERSIONING - 'Simplified', or rather, more coder-friendly ~Car WRITE_FILE(S["all_quirks"] , all_quirks) cit_character_pref_save(S) - hyper_character_pref_save(S) return 1 diff --git a/code/modules/clothing/suits/miscellaneous.dm b/code/modules/clothing/suits/miscellaneous.dm index b56cb7a95..6e002119b 100644 --- a/code/modules/clothing/suits/miscellaneous.dm +++ b/code/modules/clothing/suits/miscellaneous.dm @@ -28,6 +28,46 @@ allowed = list (/obj/item/gun/energy/laser/redtag) resistance_flags = NONE +/* + * Posshim's Corpus atire + */ +/obj/item/clothing/suit/hooded/corpus/ + name = "Standard Voidsuit" + desc = "Standard issue voidsuit in the name of Grofit!" + icon_state = "corpus" + item_state = "armor" + body_parts_covered = CHEST|GROIN|LEGS|ARMS|FEET|HANDS + hoodtype = /obj/item/clothing/head/hooded/corpus + flags_inv = HIDEGLOVES|HIDESHOES|HIDEJUMPSUIT //"Hide shoes" but digi shoes dont get hidden, too bad! + min_cold_protection_temperature = FIRE_SUIT_MIN_TEMP_PROTECT + mutantrace_variation = NO_MUTANTRACE_VARIATION //There is no need for a digi variant, it's a costume + +/obj/item/clothing/suit/hooded/corpus/s //sec + name = "Enforcer Voidsuit" + desc = "Delux issue grofit voidsuit. Let the middle class know You're in charge." + icon_state = "corpuss" + hoodtype = /obj/item/clothing/head/hooded/corpus/s //Enjoy this nice red outfit Kinaris! There is NO NEED for a pink one! xoxo -VivI Fanteriso + +/obj/item/clothing/suit/hooded/corpus/c //command + name = "Commander Voidsuit" + desc = "Premium issue correctional worker attire. Grease the gears of production." + icon_state = "corpusc" + hoodtype = /obj/item/clothing/head/hooded/corpus/c + +/obj/item/clothing/head/hooded/corpus + name = "Voidsuit helmet" + desc = "galvanized reinforced helm to protect against the elements" + icon_state = "corpus" + body_parts_covered = HEAD + flags_inv = HIDEHAIR|HIDEEARS|HIDEFACIALHAIR|HIDEFACE|HIDEMASK|HIDESNOUT|HIDENECK //hide your ugly face with this one simple trick! + min_cold_protection_temperature = FIRE_SUIT_MIN_TEMP_PROTECT + +/obj/item/clothing/head/hooded/corpus/s //sec + icon_state = "corpuss" + +/obj/item/clothing/head/hooded/corpus/c //command + icon_state = "corpusc" + /* * Costume */ diff --git a/code/modules/food_and_drinks/food/snacks_pastry.dm b/code/modules/food_and_drinks/food/snacks_pastry.dm index 7e0d0a31a..e01b770ba 100644 --- a/code/modules/food_and_drinks/food/snacks_pastry.dm +++ b/code/modules/food_and_drinks/food/snacks_pastry.dm @@ -461,120 +461,6 @@ tastes = list("meat" = 2, "dough" = 2, "laziness" = 1) foodtype = GRAIN | ANTITOXIC -/obj/item/reagent_containers/food/snacks/donkpocket/taco - name = "\improper Taco-pocket" - desc = "Es hora de adentrarse en el espacio de bolsillo más salvaje jamás conocido. ¡jajaja!" - icon_state = "donkpockettaco" - list_reagents = list(/datum/reagent/consumable/nutriment = 4, /datum/reagent/consumable/capsaicin = 2) - cooked_type = /obj/item/reagent_containers/food/snacks/donkpocket/warm/taco - filling_color = "#CD853F" - tastes = list("meat" = 2, "dough" = 2, "spice" = 2, "vegetables" = 2, "cheese" = 2) - foodtype = GRAIN | VEGETABLES | MEAT - -/obj/item/reagent_containers/food/snacks/donkpocket/warm/taco - name = "warm Taco-pocket" - desc = "Es hora de adentrarse en el espacio de bolsillo más salvaje jamás conocido. ¡jajaja!" - icon_state = "donkpockettaco" - bonus_reagents = list(/datum/reagent/medicine/omnizine = 1) - list_reagents = list(/datum/reagent/consumable/nutriment = 4, /datum/reagent/consumable/capsaicin = 2) - tastes = list("meat" = 2, "dough" = 2, "spice" = 2, "vegetables" = 2, "cheese" = 2) - foodtype = GRAIN | VEGETABLES | MEAT - -/obj/item/reagent_containers/food/snacks/donkpocket/plasma - name = "\improper Poison-pocket" - desc = "NOTE: WARNING. For slime species consumption only. Call ###-##-### if injested" - icon_state = "donkpocketplasma" - list_reagents = list(/datum/reagent/toxin/carpotoxin = 2, /datum/reagent/toxin/plasma = 2, /datum/reagent/fuel = 2) - cooked_type = /obj/item/reagent_containers/food/snacks/donkpocket/warm/plasma - filling_color = "#CD853F" - tastes = list("meat" = 2, "dough" = 2, "poison" = 2, "welding fuel" = 2) - foodtype = GRAIN | TOXIC | MEAT - -/obj/item/reagent_containers/food/snacks/donkpocket/warm/plasma - name = "warm Poison-pocket" - desc = "NOTE: WARNING. For slime species consumption only. Call ###-##-### if injested" - icon_state = "donkpocketplasma" - bonus_reagents = list(/datum/reagent/toxin/carpotoxin = 2, /datum/reagent/toxin/plasma = 2, /datum/reagent/fuel = 2) - list_reagents = list(/datum/reagent/consumable/nutriment = 4) - tastes = list("meat" = 2, "dough" = 2, "poison" = 2, "welding fuel" = 2) - foodtype = GRAIN | TOXIC | MEAT - -/obj/item/reagent_containers/food/snacks/donkpocket/breakfast - name = "\improper Breakfast-pocket" - desc = "Now for all you early morning Joes!." - icon_state = "donkpocketbreakfast" - list_reagents = list(/datum/reagent/consumable/nutriment = 4) - cooked_type = /obj/item/reagent_containers/food/snacks/donkpocket/warm/breakfast - filling_color = "#CD853F" - tastes = list("meat" = 2, "dough" = 2, "eggs" =2, "bacon" =2) - foodtype = GRAIN | DAIRY | MEAT | BREAKFAST - -/obj/item/reagent_containers/food/snacks/donkpocket/warm/breakfast //IT'S BEEN ELEVEN FUCKING HOURS I HATE BYOND I HATE BYOND I HATE BEYOND!!! - name = "warm Breakfast-pocket" - desc = "Now for all you early morning Joes!." - icon_state = "donkpocketbreakfast" - bonus_reagents = list(/datum/reagent/medicine/omnizine = 1) - list_reagents = list(/datum/reagent/consumable/nutriment = 4) - tastes = list("meat" = 2, "dough" = 2, "eggs" = 2, "bacon" = 2) - foodtype = GRAIN | DAIRY | MEAT | BREAKFAST | ANTITOXIC - -/obj/item/reagent_containers/food/snacks/donkpocket/moth - name = "\improper Moth-pocket" - desc = "Donk Corp is now reaching out to all species! Dig in moths one and all." - icon_state = "donkpocketmoth" - list_reagents = list(/datum/reagent/consumable/nutriment = 4) - cooked_type = /obj/item/reagent_containers/food/snacks/donkpocket/warm/moth - filling_color = "#CD853F" - tastes = list("lint" = 2, "dough" = 2, "felt" = 2) - foodtype = GRAIN | DAIRY | CLOTH - -/obj/item/reagent_containers/food/snacks/donkpocket/warm/moth - name = "warm Moth-pocket" - desc = "Donk Corp is now reaching out to all species! Dig in moths one and all." - icon_state = "donkpocketmoth" - bonus_reagents = list(/datum/reagent/medicine/omnizine = 1) - list_reagents = list(/datum/reagent/consumable/nutriment = 4) - tastes = list("lint" = 2, "dough" = 2, "felt" = 2) - foodtype = GRAIN | DAIRY | CLOTH - -/obj/item/reagent_containers/food/snacks/donkpocket/vegan - name = "\improper Vegan-pocket" - desc = "For all you Animal Rights Consortium members out there!." - icon_state = "donkpocketvegan" - list_reagents = list(/datum/reagent/consumable/nutriment = 2) - cooked_type = /obj/item/reagent_containers/food/snacks/donkpocket/warm/vegan - filling_color = "#CD853F" - tastes = list("vegetables" = 2, "dough" = 2) - foodtype = GRAIN | VEGETABLES - -/obj/item/reagent_containers/food/snacks/donkpocket/warm/vegan - name = "warm Vegan-pocket" - desc = "For all you Animal Rights Consortium members out there!." - icon_state = "donkpocketvegan" - bonus_reagents = list(/datum/reagent/medicine/omnizine = 1) - list_reagents = list(/datum/reagent/consumable/nutriment = 3) - tastes = list("vegetables" = 2, "dough" = 2) - foodtype = GRAIN | VEGETABLES - -/obj/item/reagent_containers/food/snacks/donkpocket/sm - name = "\improper Super-pocket" - desc = "You're probably not in a good spot if you're laying eyes on this." - icon_state = "donkpocketsm" - list_reagents = list(/datum/reagent/consumable/nutriment = 99) - cooked_type = /obj/item/reagent_containers/food/snacks/donkpocket/warm/sm - filling_color = "#CD853F" - tastes = list("white-noise" = 2) - foodtype = TOXIC - -/obj/item/reagent_containers/food/snacks/donkpocket/warm/sm - name = "warm Super-pocket" - desc = "You're probably not in a good spot if you're laying eyes on this." - icon_state = "donkpocketsm" - bonus_reagents = list(/datum/reagent/medicine/omnizine = 1) - list_reagents = list(/datum/reagent/consumable/nutriment = 99) - tastes = list("white-noise" = 2) - foodtype = TOXIC - /obj/item/reagent_containers/food/snacks/dankpocket name = "\improper Dank-pocket" desc = "The food of choice for the seasoned botanist." @@ -668,7 +554,7 @@ cooked_type = /obj/item/reagent_containers/food/snacks/donkpocket/warm/berry filling_color = "#CD853F" tastes = list("dough" = 2, "jam" = 2) - foodtype = GRAIN | SUGAR + foodtype = GRAIN /obj/item/reagent_containers/food/snacks/donkpocket/warm/berry name = "warm Berry-pocket" @@ -677,7 +563,7 @@ bonus_reagents = list(/datum/reagent/medicine/omnizine = 1) list_reagents = list(/datum/reagent/consumable/nutriment = 4, /datum/reagent/medicine/omnizine = 1, /datum/reagent/consumable/berryjuice = 3) tastes = list("dough" = 2, "warm jam" = 2) - foodtype = GRAIN | SUGAR + foodtype = GRAIN /obj/item/reagent_containers/food/snacks/donkpocket/gondola name = "\improper Gondola-pocket" diff --git a/code/modules/food_and_drinks/recipes/tablecraft/recipes_pastry.dm b/code/modules/food_and_drinks/recipes/tablecraft/recipes_pastry.dm index 9100bab34..7c34fc8c2 100644 --- a/code/modules/food_and_drinks/recipes/tablecraft/recipes_pastry.dm +++ b/code/modules/food_and_drinks/recipes/tablecraft/recipes_pastry.dm @@ -362,159 +362,6 @@ datum/crafting_recipe/food/donut/meat tastes = list("meat" = 2, "dough" = 2) foodtype = GRAIN | VEGETABLES -/datum/crafting_recipe/food/donkpocket/taco - time = 15 - name = "Taco-pocket" - reqs = list( - /obj/item/reagent_containers/food/snacks/pastrybase = 1, - /obj/item/reagent_containers/food/snacks/meatball = 1, - /obj/item/reagent_containers/food/snacks/grown/carrot = 1, - /obj/item/reagent_containers/food/snacks/grown/citrus/lime = 1, - ) - result = /obj/item/reagent_containers/food/snacks/donkpocket/taco - subcategory = CAT_PASTRY - -/obj/item/reagent_containers/food/snacks/donkpocket/taco - name = "\improper Taco-pocket" - desc = "Es hora de adentrarse en el espacio de bolsillo más salvaje jamás conocido. ¡jajaja!" - icon_state = "donkpockettaco" - list_reagents = list(/datum/reagent/consumable/nutriment = 4, /datum/reagent/consumable/capsaicin = 2) - cooked_type = /obj/item/reagent_containers/food/snacks/donkpocket/warm/taco - filling_color = "#CD853F" - tastes = list("meat" = 2, "dough" = 2, "spice" = 2, "vegetables" = 2, "cheese" = 2) - foodtype = GRAIN | VEGETABLES | MEAT - -/obj/item/reagent_containers/food/snacks/donkpocket/warm/taco - name = "warm Taco-pocket" - desc = "Es hora de adentrarse en el espacio de bolsillo más salvaje jamás conocido. ¡jajaja!" - icon_state = "donkpockettaco" - bonus_reagents = list(/datum/reagent/medicine/omnizine = 1) - list_reagents = list(/datum/reagent/consumable/nutriment = 4, /datum/reagent/consumable/capsaicin = 2) - tastes = list("meat" = 2, "dough" = 2, "spice" = 2, "vegetables" = 2, "cheese" = 2) - foodtype = GRAIN | VEGETABLES | MEAT - -/datum/crafting_recipe/food/donkpocket/plasma - time = 15 - name = "Plasma-pocket" - reqs = list( - /obj/item/reagent_containers/food/snacks/pastrybase = 1, - /obj/item/reagent_containers/food/snacks/meatball = 1, - /datum/reagent/fuel = 1, - /datum/reagent/toxin/plasma = 1, - ) - result = /obj/item/reagent_containers/food/snacks/donkpocket/plasma - subcategory = CAT_PASTRY - -/obj/item/reagent_containers/food/snacks/donkpocket/plasma - name = "\improper Poison-pocket" - desc = "NOTE: WARNING. For slime species consumption only. Call ###-##-### if injested" - icon_state = "donkpocketplasma" - list_reagents = list(/datum/reagent/toxin/carpotoxin = 2, /datum/reagent/toxin/plasma = 2, /datum/reagent/fuel = 2) - cooked_type = /obj/item/reagent_containers/food/snacks/donkpocket/warm/plasma - filling_color = "#CD853F" - tastes = list("meat" = 2, "dough" = 2, "poison" = 2, "welding fuel" = 2) - foodtype = GRAIN | TOXIC | MEAT - -/obj/item/reagent_containers/food/snacks/donkpocket/warm/plasma - name = "warm Poison-pocket" - desc = "NOTE: WARNING. For slime species consumption only. Call ###-##-### if injested" - icon_state = "donkpocketplasma" - bonus_reagents = list(/datum/reagent/toxin/carpotoxin = 2, /datum/reagent/toxin/plasma = 2, /datum/reagent/fuel = 2) - list_reagents = list(/datum/reagent/consumable/nutriment = 4) - tastes = list("meat" = 2, "dough" = 2, "poison" = 2, "welding fuel" = 2) - foodtype = GRAIN | TOXIC | MEAT - -/datum/crafting_recipe/food/donkpocket/breakfast - time = 15 - name = "Breakfast-pocket" - reqs = list( - /obj/item/reagent_containers/food/snacks/pastrybase = 1, - /obj/item/reagent_containers/food/snacks/cheesewedge = 1, - /obj/item/reagent_containers/food/snacks/friedegg = 1, - /obj/item/reagent_containers/food/snacks/meat/cutlet = 1, - ) - result = /obj/item/reagent_containers/food/snacks/donkpocket/breakfast - subcategory = CAT_PASTRY - -/obj/item/reagent_containers/food/snacks/donkpocket/breakfast - name = "\improper Breakfast-pocket" - desc = "Now for all you early morning Joes!." - icon_state = "donkpocketbreakfast" - list_reagents = list(/datum/reagent/consumable/nutriment = 4) - cooked_type = /obj/item/reagent_containers/food/snacks/donkpocket/warm/breakfast - filling_color = "#CD853F" - tastes = list("meat" = 2, "dough" = 2, "eggs" = 2, "bacon" = 2) - foodtype = GRAIN | DAIRY | MEAT | BREAKFAST - -/obj/item/reagent_containers/food/snacks/donkpocket/warm/breakfast - name = "warm Breakfast-pocket" - desc = "Now for all you early morning Joes!." - icon_state = "donkpocketbreakfast" - bonus_reagents = list(/datum/reagent/medicine/omnizine = 1) - list_reagents = list(/datum/reagent/consumable/nutriment = 4) - tastes = list("meat" = 2, "dough" = 2, "eggs" = 2, "bacon" = 2) - foodtype = GRAIN | DAIRY | MEAT | BREAKFAST | ANTITOXIC - -/datum/crafting_recipe/food/donkpocket/moth - time = 15 - name = "Moth-pocket" - reqs = list( - /obj/item/reagent_containers/food/snacks/pastrybase = 1, - /obj/item/reagent_containers/food/snacks/cheesewedge = 1, - /obj/item/stack/sheet/cloth = 1, - ) - result = /obj/item/reagent_containers/food/snacks/donkpocket/moth - subcategory = CAT_PASTRY - -/obj/item/reagent_containers/food/snacks/donkpocket/moth - name = "\improper Moth-pocket" - desc = "Donk Corp is now reaching out to all species! Dig in moths one and all." - icon_state = "donkpocketmoth" - list_reagents = list(/datum/reagent/consumable/nutriment = 4) - cooked_type = /obj/item/reagent_containers/food/snacks/donkpocket/warm/moth - filling_color = "#CD853F" - tastes = list("lint" = 2, "dough" = 2, "felt" = 2) - foodtype = GRAIN | DAIRY | CLOTH - -/obj/item/reagent_containers/food/snacks/donkpocket/warm/moth - name = "warm Moth-pocket" - desc = "Donk Corp is now reaching out to all species! Dig in moths one and all." - icon_state = "donkpocketmoth" - bonus_reagents = list(/datum/reagent/medicine/omnizine = 1) - list_reagents = list(/datum/reagent/consumable/nutriment = 4) - tastes = list("lint" = 2, "dough" = 2, "felt" = 2) - foodtype = GRAIN | DAIRY | CLOTH - -/datum/crafting_recipe/food/donkpocket/vegan - time = 15 - name = "Vegan-pocket" - reqs = list( - /obj/item/reagent_containers/food/snacks/pastrybase = 1, - /obj/item/reagent_containers/food/snacks/grown/cabbage = 1, - /obj/item/reagent_containers/food/snacks/grown/mushroom/chanterelle = 1, - ) - result = /obj/item/reagent_containers/food/snacks/donkpocket/vegan - subcategory = CAT_PASTRY - -/obj/item/reagent_containers/food/snacks/donkpocket/vegan - name = "\improper Vegan-pocket" - desc = "For all you Animal Rights Consortium members out there!." - icon_state = "donkpocketvegan" - list_reagents = list(/datum/reagent/consumable/nutriment = 2) - cooked_type = /obj/item/reagent_containers/food/snacks/donkpocket/warm/vegan - filling_color = "#CD853F" - tastes = list("vegetables" = 2, "dough" = 2) - foodtype = GRAIN | VEGETABLES - -/obj/item/reagent_containers/food/snacks/donkpocket/warm/vegan - name = "warm Vegan-pocket" - desc = "For all you Animal Rights Consortium members out there!." - icon_state = "donkpocketvegan" - bonus_reagents = list(/datum/reagent/medicine/omnizine = 1) - list_reagents = list(/datum/reagent/consumable/nutriment = 3) - tastes = list("vegetables" = 2, "dough" = 2) - foodtype = GRAIN | VEGETABLES - /datum/crafting_recipe/food/donkpocket/spicy time = 15 name = "Spicy-pocket" diff --git a/code/modules/hydroponics/grown.dm b/code/modules/hydroponics/grown.dm index 330744ebf..5895c6de3 100644 --- a/code/modules/hydroponics/grown.dm +++ b/code/modules/hydroponics/grown.dm @@ -33,9 +33,6 @@ // This is for adminspawn or map-placed growns. They get the default stats of their seed type. seed = new seed() seed.adjust_potency(50-seed.potency) - else if(!seed) - stack_trace("Grown initialized without seed. Okay.") - return INITIALIZE_HINT_QDEL pixel_x = rand(-5, 5) pixel_y = rand(-5, 5) @@ -43,11 +40,13 @@ if(dried_type == -1) dried_type = src.type - for(var/datum/plant_gene/trait/T in seed.genes) - T.on_new(src, loc) - seed.prepare_result(src) - AddElement(/datum/element/item_scaling, TRANSFORM_USING_VARIABLE(seed.potency, 100) + 0.5, 1) //Makes the resulting produce's sprite larger or smaller based on potency! - add_juice() + if(seed) + for(var/datum/plant_gene/trait/T in seed.genes) + T.on_new(src, loc) + seed.prepare_result(src) + transform *= TRANSFORM_USING_VARIABLE(seed.potency, 100) + 0.5 //Makes the resulting produce's sprite larger or smaller based on potency! + add_juice() + /obj/item/reagent_containers/food/snacks/grown/proc/add_juice() diff --git a/code/modules/jobs/job_types/captain.dm b/code/modules/jobs/job_types/captain.dm index 61e7d291f..92652190c 100644 --- a/code/modules/jobs/job_types/captain.dm +++ b/code/modules/jobs/job_types/captain.dm @@ -65,7 +65,7 @@ Captain satchel = /obj/item/storage/backpack/satchel/cap duffelbag = /obj/item/storage/backpack/duffelbag/captain - implants = list(/obj/item/implant/mindshield, /obj/item/implant/kinaris) + implants = list(/obj/item/implant/mindshield) accessory = /obj/item/clothing/accessory/medal/gold/captain chameleon_extras = list(/obj/item/gun/energy/e_gun, /obj/item/stamp/captain) diff --git a/code/modules/jobs/job_types/security.dm b/code/modules/jobs/job_types/security.dm index 94bd75059..0a0c83508 100644 --- a/code/modules/jobs/job_types/security.dm +++ b/code/modules/jobs/job_types/security.dm @@ -62,7 +62,7 @@ Head of Security duffelbag = /obj/item/storage/backpack/duffelbag/sec box = /obj/item/storage/box/security - implants = list(/obj/item/implant/mindshield, /obj/item/implant/kinaris) + implants = list(/obj/item/implant/mindshield) chameleon_extras = list(/obj/item/gun/energy/e_gun/hos, /obj/item/stamp/hos) diff --git a/code/modules/mob/dead/new_player/login.dm b/code/modules/mob/dead/new_player/login.dm index c691b799d..acd966416 100644 --- a/code/modules/mob/dead/new_player/login.dm +++ b/code/modules/mob/dead/new_player/login.dm @@ -43,14 +43,7 @@ S.cd = "/" var/slot S["default_slot"] >> slot - var/differing_version_notification = 0 if(slot) S.cd = "/character[slot]" - var/slot_version = 0 - S["version"] >> slot_version - if(slot_version && slot_version < SAVEFILE_VERSION_MAX) - S.cd = "/" - S["new_differences_notification"] >> differing_version_notification - if(!differing_version_notification || differing_version_notification <= slot_version) - S["new_differences_notification"] << slot_version - to_chat(src, "There were recent changes with characters, and your savefiles are outdated. Your characters may not look the same depending on what changed.") + if(S["version"] < SAVEFILE_VERSION_MAX) + to_chat(src, "Your characters are outdated from recent updates. Please make sure if everything is within reasonable levels.") diff --git a/code/modules/mob/living/carbon/carbon.dm b/code/modules/mob/living/carbon/carbon.dm index c436e5808..168b31410 100644 --- a/code/modules/mob/living/carbon/carbon.dm +++ b/code/modules/mob/living/carbon/carbon.dm @@ -487,9 +487,6 @@ if(HAS_TRAIT(src, TRAIT_NOHUNGER)) return 1 - if(!has_mouth()) - return 1 - if(nutrition < 100 && !blood) if(message) visible_message("[src] dry heaves!", \ diff --git a/code/modules/mob/living/carbon/human/human.dm b/code/modules/mob/living/carbon/human/human.dm index 1765e6873..92ad4fa08 100644 --- a/code/modules/mob/living/carbon/human/human.dm +++ b/code/modules/mob/living/carbon/human/human.dm @@ -5,24 +5,30 @@ icon_state = "caucasian_m" appearance_flags = KEEP_TOGETHER|TILE_BOUND|PIXEL_SCALE|LONG_GLIDE - /mob/living/carbon/human/Initialize() add_verb(src, /mob/living/proc/mob_sleep) add_verb(src, /mob/living/proc/lay_down) time_initialized = world.time + //initialize limbs first create_bodyparts() + //initialize dna. for spawned humans; overwritten by other code create_dna(src) randomize_human(src) dna.initialize_dna() + if(dna.species) set_species(dna.species.type) + //initialise organs create_internal_organs() //most of it is done in set_species now, this is only for parent call physiology = new() + AddComponent(/datum/component/personal_crafting) + . = ..() + RegisterSignal(src, COMSIG_COMPONENT_CLEAN_ACT, /mob/living/carbon/human/clean_blood) diff --git a/code/modules/mob/living/carbon/human/species.dm b/code/modules/mob/living/carbon/human/species.dm index 287dd4d29..a036dbb7f 100644 --- a/code/modules/mob/living/carbon/human/species.dm +++ b/code/modules/mob/living/carbon/human/species.dm @@ -318,24 +318,15 @@ GLOBAL_LIST_EMPTY(roundstart_races) var/mob/living/carbon/human/H = C if(NOGENITALS in H.dna.species.species_traits) H.give_genitals(TRUE) //call the clean up proc to delete anything on the mob then return. + // EDIT ENDS - if(NOMOUTH in species_traits) - for(var/obj/item/bodypart/head/head in C.bodyparts) - head.mouth = FALSE - - /datum/species/proc/on_species_loss(mob/living/carbon/human/C, datum/species/new_species, pref_load) if(C.dna.species.exotic_bloodtype) if(!new_species.exotic_bloodtype) C.dna.blood_type = random_blood_type() else C.dna.blood_type = new_species.exotic_bloodtype - - if(NOMOUTH in species_traits) - for(var/obj/item/bodypart/head/head in C.bodyparts) - head.mouth = TRUE - if(DIGITIGRADE in species_traits) C.Digitigrade_Leg_Swap(TRUE) for(var/X in inherent_traits) @@ -511,7 +502,6 @@ GLOBAL_LIST_EMPTY(roundstart_races) var/list/standing = list() var/obj/item/bodypart/head/HD = H.get_bodypart(BODY_ZONE_HEAD) - H.handle_cosmetic_parts() if(HD && !(HAS_TRAIT(H, TRAIT_HUSK))) // lipstick @@ -604,7 +594,6 @@ GLOBAL_LIST_EMPTY(roundstart_races) //CITADEL EDIT - Do not forget to add this to relevent_layers list just above too! H.remove_overlay(BODY_TAUR_LAYER) //END EDIT - H.handle_cosmetic_parts() if(!mutant_bodyparts) return @@ -689,17 +678,21 @@ GLOBAL_LIST_EMPTY(roundstart_races) if("mam_tail" in mutant_bodyparts) if(H.wear_suit && (H.wear_suit.flags_inv & HIDETAUR) || (!H.dna.features["taur"] == "None")) bodyparts_to_add -= "mam_tail" + if("mam_waggingtail" in mutant_bodyparts) if(H.wear_suit && (H.wear_suit.flags_inv & HIDETAUR) || (!H.dna.features["taur"] == "None")) bodyparts_to_add -= "mam_waggingtail" else if ("mam_tail" in mutant_bodyparts) bodyparts_to_add -= "mam_waggingtail" + if("mam_ears" in mutant_bodyparts) if(!H.dna.features["mam_ears"] || H.dna.features["mam_ears"] == "None" || H.head && (H.head.flags_inv & HIDEEARS) || (H.wear_mask && (H.wear_mask.flags_inv & HIDEEARS)) || !HD || HD.status == BODYPART_ROBOTIC) bodyparts_to_add -= "mam_ears" + if("mam_snouts" in mutant_bodyparts) //Take a closer look at that snout! if((H.wear_mask && (H.wear_mask.flags_inv & HIDESNOUT)) || (H.head && (H.head.flags_inv & HIDESNOUT)) || !HD || HD.status == BODYPART_ROBOTIC) bodyparts_to_add -= "mam_snouts" + if("taur" in mutant_bodyparts) if(!H.dna.features["taur"] || H.dna.features["taur"] == "None" || (H.wear_suit && (H.wear_suit.flags_inv & HIDETAUR))) bodyparts_to_add -= "taur" @@ -1654,8 +1647,8 @@ GLOBAL_LIST_EMPTY(roundstart_races) ) if (target.canbearoused) target.adjustArousalLoss(5) - if (HAS_TRAIT(target, TRAIT_MASO)) - target.mob_climax_instant() + if (target.getArousalLoss() >= 100 && ishuman(target) && HAS_TRAIT(target, TRAIT_MASO) && target.has_dna()) + target.mob_climax(forced_climax=TRUE) if (!HAS_TRAIT(target, TRAIT_NYMPHO)) stop_wagging_tail(target) @@ -2012,7 +2005,8 @@ GLOBAL_LIST_EMPTY(roundstart_races) H.update_damage_overlays() if(HAS_TRAIT(H, TRAIT_MASO)) H.adjustArousalLoss(damage * brutemod * H.physiology.brute_mod) - H.mob_climax_instant() + if (H.getArousalLoss() >= 100 && ishuman(H) && H.has_dna()) + H.mob_climax(forced_climax=TRUE) else//no bodypart, we deal damage with a more general method. H.adjustBruteLoss(damage * hit_percent * brutemod * H.physiology.brute_mod) diff --git a/code/modules/mob/living/carbon/human/update_icons.dm b/code/modules/mob/living/carbon/human/update_icons.dm index 6b68f3b8a..4c224a515 100644 --- a/code/modules/mob/living/carbon/human/update_icons.dm +++ b/code/modules/mob/living/carbon/human/update_icons.dm @@ -690,8 +690,6 @@ generate/load female uniform sprites matching all previously decided variables . += "-[BP.digitigrade_type]" if(BP.dmg_overlay_type) . += "-[BP.dmg_overlay_type]" - if(BP.cosmetic_icon) - . += "-cosm[BP.cosmetic_icon]" if(BP.body_markings) . += "-[BP.body_markings]" else diff --git a/code/modules/mob/living/carbon/life.dm b/code/modules/mob/living/carbon/life.dm index fc3c25c15..ca11c14d0 100644 --- a/code/modules/mob/living/carbon/life.dm +++ b/code/modules/mob/living/carbon/life.dm @@ -77,7 +77,8 @@ var/mob/living/carbon/human/B = src if(HAS_TRAIT(B, TRAIT_CHOKE_SLUT)) B.adjustArousalLoss(7) - B.mob_climax_instant() + if (B.getArousalLoss() >= 100 && ishuman(B) && B.has_dna()) + B.mob_climax(forced_climax=TRUE) else SEND_SIGNAL(src, COMSIG_ADD_MOOD_EVENT, "suffocation", /datum/mood_event/suffocation) else diff --git a/code/modules/mob/living/silicon/robot/robot_modules.dm b/code/modules/mob/living/silicon/robot/robot_modules.dm index cfafd99e9..585a882bb 100644 --- a/code/modules/mob/living/silicon/robot/robot_modules.dm +++ b/code/modules/mob/living/silicon/robot/robot_modules.dm @@ -200,10 +200,6 @@ INVOKE_ASYNC(RM, .proc/do_transform_animation) SEND_SIGNAL(R, COMSIG_CYBORG_MODULE_CHANGE) //hyperstation edit qdel(src) - //Skyrat change start - R.radio.extra_channels = RM.added_channels - R.radio.recalculateChannels() - //Skyrat change stop return RM /obj/item/robot_module/proc/be_transformed_to(obj/item/robot_module/old_module) diff --git a/code/modules/mob/login.dm b/code/modules/mob/login.dm index 3fc7e3c11..0d37b98c1 100644 --- a/code/modules/mob/login.dm +++ b/code/modules/mob/login.dm @@ -57,9 +57,7 @@ var/datum/callback/CB = foo CB.Invoke() - if(client.prefs) - mind?.hide_ckey = client.prefs.hide_ckey - client.fps = client.prefs.clientfps + mind?.hide_ckey = client?.prefs?.hide_ckey log_message("Client [key_name(src)] has taken ownership of mob [src]([src.type])", LOG_OWNERSHIP) SEND_SIGNAL(src, COMSIG_MOB_CLIENT_LOGIN, client) client.init_verbs() diff --git a/code/modules/power/apc.dm b/code/modules/power/apc.dm index ac9a37eb2..b291a295c 100644 --- a/code/modules/power/apc.dm +++ b/code/modules/power/apc.dm @@ -104,8 +104,6 @@ var/icon_update_needed = FALSE var/obj/machinery/computer/apc_control/remote_control = null - var/obj/effect/light/lighteffect //light effect - /obj/machinery/power/apc/unlocked locked = FALSE @@ -187,8 +185,6 @@ addtimer(CALLBACK(src, .proc/update), 5) /obj/machinery/power/apc/Destroy() - if(lighteffect) - lighteffect.Del() GLOB.apcs_list -= src if(malfai && operating) @@ -324,13 +320,6 @@ // And now, separately for cleanness, the lighting changing if(update_state & UPSTATE_ALLGOOD) - if(!lighteffect)//make the light - lighteffect = new/obj/effect/light - lighteffect.loc = src.loc - lighteffect.alpha = 50 - lighteffect.pixel_x = pixel_x - lighteffect.pixel_y = pixel_y - switch(charging) if(APC_NOT_CHARGING) light_color = LIGHT_COLOR_RED @@ -339,7 +328,6 @@ if(APC_FULLY_CHARGED) light_color = LIGHT_COLOR_GREEN set_light(lon_range) - lighteffect.color = light_color else if(update_state & UPSTATE_BLUESCREEN) light_color = LIGHT_COLOR_BLUE set_light(lon_range) @@ -348,10 +336,6 @@ icon_update_needed = FALSE -/obj/machinery/power/apc/Move() - if(lighteffect) - lighteffect.loc = src.loc //move the light overlay - /obj/machinery/power/apc/proc/check_updates() var/last_update_state = update_state var/last_update_overlay = update_overlay diff --git a/code/modules/power/lighting.dm b/code/modules/power/lighting.dm index 0db3695fc..39072d5b4 100644 --- a/code/modules/power/lighting.dm +++ b/code/modules/power/lighting.dm @@ -223,9 +223,6 @@ var/bulb_emergency_pow_mul = 0.75 // the multiplier for determining the light's power in emergency mode var/bulb_emergency_pow_min = 0.5 // the minimum value for the light's power in emergency mode - var/obj/effect/light/lighteffect //light effect - - /obj/machinery/light/broken status = LIGHT_BROKEN icon_state = "tube-broken" @@ -245,8 +242,6 @@ icon_state = "bulb-broken" /obj/machinery/light/Move() - if(lighteffect) - lighteffect.loc = src.loc if(status != LIGHT_BROKEN) break_light_tube(1) return ..() @@ -290,8 +285,6 @@ /obj/machinery/light/Destroy() var/area/A = get_area(src) - if(lighteffect) - lighteffect.Del() if(A) on = FALSE // A.update_lights() @@ -299,35 +292,24 @@ return ..() /obj/machinery/light/update_icon() - if(!lighteffect) //dont have a light bloom, make it. - lighteffect = new/obj/effect/light/large - lighteffect.loc = src.loc cut_overlays() switch(status) // set icon_states if(LIGHT_OK) var/area/A = get_area(src) if(emergency_mode || (A && A.fire)) icon_state = "[base_state]_emergency" - lighteffect.alpha = 0 else icon_state = "[base_state]" if(on) - lighteffect.alpha = CLAMP(light_power*35, 5, 100) - lighteffect.color = light_color var/mutable_appearance/glowybit = mutable_appearance(overlayicon, base_state, ABOVE_LIGHTING_LAYER, ABOVE_LIGHTING_PLANE) glowybit.alpha = CLAMP(light_power*250, 30, 200) add_overlay(glowybit) if(LIGHT_EMPTY) icon_state = "[base_state]-empty" - lighteffect.alpha = 0 if(LIGHT_BURNED) icon_state = "[base_state]-burned" - lighteffect.alpha = 0 if(LIGHT_BROKEN) icon_state = "[base_state]-broken" - lighteffect.alpha = 0 - if(!on) - lighteffect.alpha = 0 return // update the icon_state and luminosity of the light depending on its state diff --git a/code/modules/projectiles/guns/energy/kinetic_accelerator.dm b/code/modules/projectiles/guns/energy/kinetic_accelerator.dm index a3fe88a39..66073dbd1 100644 --- a/code/modules/projectiles/guns/energy/kinetic_accelerator.dm +++ b/code/modules/projectiles/guns/energy/kinetic_accelerator.dm @@ -266,7 +266,7 @@ icon_state = "modkit" w_class = WEIGHT_CLASS_SMALL require_module = 1 - module_type = list(/obj/item/robot_module/miner, /obj/item/robot_module/orepup) + module_type = /obj/item/robot_module/miner var/denied_type = null var/maximum_of_type = 1 var/cost = 30 diff --git a/code/modules/projectiles/projectile.dm b/code/modules/projectiles/projectile.dm index 65b86570c..63bd0bc52 100644 --- a/code/modules/projectiles/projectile.dm +++ b/code/modules/projectiles/projectile.dm @@ -197,10 +197,7 @@ L.visible_message("[L] is hit by \a [src][organ_hit_text]!", \ "[L] is hit by \a [src][organ_hit_text]!", null, COMBAT_MESSAGE_RANGE) if(candink && def_zone == BODY_ZONE_HEAD) - if(prob(2)) - playsound(src, 'hyperstation/sound/weapons/dinkalternate.ogg', 30, 0) - else - playsound(src, 'sound/weapons/dink.ogg', 30, 1) + playsound(src, 'sound/weapons/dink.ogg', 30, 1) L.on_hit(src) var/reagent_note diff --git a/code/modules/reagents/reagent_containers.dm b/code/modules/reagents/reagent_containers.dm index 150c9db70..6d93a5e13 100644 --- a/code/modules/reagents/reagent_containers.dm +++ b/code/modules/reagents/reagent_containers.dm @@ -65,12 +65,6 @@ var/who = (isnull(user) || eater == user) ? "your" : "[eater.p_their()]" to_chat(user, "You have to remove [who] [covered] first!") return 0 - if(!eater.has_mouth()) - if(eater == user) - to_chat(eater, "You have no mouth, and cannot eat.") - else - to_chat(user, "You can't feed [eater], because they have no mouth!") - return 0 return 1 /obj/item/reagent_containers/ex_act() diff --git a/code/modules/ruins/objects_and_mobs/sin_ruins.dm b/code/modules/ruins/objects_and_mobs/sin_ruins.dm index 5fba1aa4b..18e90b3a6 100644 --- a/code/modules/ruins/objects_and_mobs/sin_ruins.dm +++ b/code/modules/ruins/objects_and_mobs/sin_ruins.dm @@ -282,16 +282,16 @@ . = ..() if(.) return - if(chalice_taken) + if(chalice_taken == 1) to_chat(user, "You hear a voice in your head... \"My chalice has already been taken, dear. I cannot give you another...\"") return if(user.getArousalLoss() < 100) to_chat(user, "You hear a voice in your head... \"You are not horny enough to receive my blessing, dear~\"") return - var/mob/living/carbon/user_carbon = user - user_carbon.mob_climax_instant() - to_chat(user, "You hear a voice in your head... \"You are worthy of my blessing, dear~\"") - to_chat(user, "You feel overpowering pleasure surge through your entire body.") - var/A = new /obj/item/reagent_containers/chalice/lust - user.put_in_hands(A) - chalice_taken = TRUE \ No newline at end of file + if (ishuman(user) && user.has_dna()) + user.mob_climax(forced_climax=TRUE) + to_chat(user, "You hear a voice in your head... \"You are worth of my blessing dear~\"") + to_chat(user, "You feel overpowering pleasure surge through your entire body.") + var/A = new /obj/item/reagent_containers/chalice/lust + user.put_in_hands(A) + chalice_taken = 1 \ No newline at end of file diff --git a/code/modules/surgery/bodyparts/bodyparts.dm b/code/modules/surgery/bodyparts/bodyparts.dm index b0208f9db..4a1bc2113 100644 --- a/code/modules/surgery/bodyparts/bodyparts.dm +++ b/code/modules/surgery/bodyparts/bodyparts.dm @@ -44,13 +44,6 @@ var/skin_tone = "" var/body_gender = "" var/species_id = "" - /** - * HYPER: when getting the appearance of a limb, the game will check - * for `cosmetic_icon` first. if there is none, it will default back - * to `species_id`. this allows us to use custom body part types for - * each limb in character customization. - */ - var/datum/cosmetic_part/cosmetic_icon var/color_src var/base_bp_icon //Overrides the icon being used for this limb. This is mainly for downstreams, implemented and maintained as a favor in return for implementing synths. And also because should_draw_* for icon overrides was pretty messy. You're welcome. var/should_draw_gender = FALSE @@ -398,22 +391,12 @@ else body_markings = "plain" auxmarking = "plain" + markings_color = list(colorlist) + else body_markings = null auxmarking = null - if(cosmetic_icon && is_organic_limb()) - if(cosmetic_icon.icon) - base_bp_icon = cosmetic_icon.icon - use_digitigrade = cosmetic_icon.support_digitigrade ? use_digitigrade : NOT_DIGITIGRADE - color_src = cosmetic_icon.color_src ? cosmetic_icon.color_src : MUTCOLORS - if(!H.dna.features["cosmetic_markings"]) - body_markings = null - auxmarking = null - - if((MUTCOLORS in S.species_traits) || (MUTCOLORS_PARTSONLY in S.species_traits)) - markings_color = list(colorlist) - if(!dropping_limb && H.dna.check_mutation(HULK)) mutation_color = "00aa00" else @@ -453,11 +436,6 @@ var/image_dir = 0 var/icon_gender = (body_gender == FEMALE) ? "f" : "m" //gender of the icon, if applicable - var/is_husk = species_id == "husk" - - /// HYPER: allow for custom limb icons in character customization - var/has_cosmetic_state = !isnull(cosmetic_icon) && !isnull(cosmetic_icon.icon_state) - var/limb_style = has_cosmetic_state ? cosmetic_icon.icon_state : species_id if(dropped) image_dir = SOUTH @@ -486,7 +464,7 @@ if(animal_origin) if(is_organic_limb()) limb.icon = 'icons/mob/animal_parts.dmi' - if(is_husk) + if(species_id == "husk") limb.icon_state = "[animal_origin]_husk_[body_zone]" else limb.icon_state = "[animal_origin]_[body_zone]" @@ -501,21 +479,21 @@ if(is_organic_limb()) limb.icon = base_bp_icon || 'icons/mob/human_parts.dmi' if(should_draw_gender) - limb.icon_state = "[limb_style]_[body_zone]_[icon_gender]" + limb.icon_state = "[species_id]_[body_zone]_[icon_gender]" else if (use_digitigrade) if(base_bp_icon == DEFAULT_BODYPART_ICON_ORGANIC) //Compatibility hack for the current iconset. limb.icon_state = "digitigrade_[use_digitigrade]_[body_zone]" else - limb.icon_state = "[limb_style]_digitigrade_[use_digitigrade]_[body_zone]" + limb.icon_state = "[species_id]_digitigrade_[use_digitigrade]_[body_zone]" else - limb.icon_state = "[limb_style]_[body_zone]" + limb.icon_state = "[species_id]_[body_zone]" // Body markings if(body_markings) - if(is_husk) + if(species_id == "husk") marking = image('modular_citadel/icons/mob/markings_notmammals.dmi', "husk_[body_zone]", -MARKING_LAYER, image_dir) - else if(is_husk && use_digitigrade) + else if(species_id == "husk" && use_digitigrade) marking = image('modular_citadel/icons/mob/markings_notmammals.dmi', "husk_digitigrade_[use_digitigrade]_[body_zone]", -MARKING_LAYER, image_dir) else if(!use_digitigrade) @@ -530,10 +508,10 @@ // Citadel End if(aux_zone) - aux = image(limb.icon, "[limb_style]_[aux_zone]", -aux_layer, image_dir) + aux = image(limb.icon, "[species_id]_[aux_zone]", -aux_layer, image_dir) . += aux if(body_markings) - if(is_husk) + if(species_id == "husk") auxmarking = image('modular_citadel/icons/mob/markings_notmammals.dmi', "husk_[aux_zone]", -aux_layer, image_dir) else auxmarking = image(body_markings_icon, "[body_markings]_[aux_zone]", -aux_layer, image_dir) @@ -550,16 +528,16 @@ aux = image(limb.icon, "[aux_zone]", -aux_layer, image_dir) . += aux if(!isnull(auxmarking)) - if(is_husk) + if(species_id == "husk") auxmarking = image('modular_citadel/icons/mob/markings_notmammals.dmi', "husk_[aux_zone]", -aux_layer, image_dir) else auxmarking = image(body_markings_icon, "[body_markings]_[aux_zone]", -aux_layer, image_dir) . += auxmarking if(!isnull(body_markings)) - if(is_husk) + if(species_id == "husk") marking = image('modular_citadel/icons/mob/markings_notmammals.dmi', "husk_[body_zone]", -MARKING_LAYER, image_dir) - else if(is_husk && use_digitigrade) + else if(species_id == "husk" && use_digitigrade) marking = image('modular_citadel/icons/mob/markings_notmammals.dmi', "husk_digitigrade_[use_digitigrade]_[body_zone]", -MARKING_LAYER, image_dir) else if(!use_digitigrade) @@ -572,27 +550,20 @@ . += marking return - if(!color_src) - return - switch(color_src) - if(MUTCOLORS) - var/draw_color = mutation_color || species_color || (skin_tone && skintone2hex(skin_tone)) - if(draw_color) - limb.color = "#[draw_color]" - if(aux_zone) - aux.color = "#[draw_color]" - if(MATRIXED) - limb.color = list(markings_color) + if(color_src) //TODO - add color matrix support for base species limbs + var/draw_color = mutation_color || species_color || (skin_tone && skintone2hex(skin_tone)) + if(draw_color) + limb.color = "#[draw_color]" if(aux_zone) - aux.color = list(markings_color) + aux.color = "#[draw_color]" + if(!isnull(auxmarking)) + auxmarking.color = list(markings_color) - if(!isnull(auxmarking)) - auxmarking.color = list(markings_color) - if(!isnull(body_markings)) - if(is_husk) - marking.color = "#141414" - else - marking.color = list(markings_color) + if(!isnull(body_markings)) + if(species_id == "husk") + marking.color = "#141414" + else + marking.color = list(markings_color) /obj/item/bodypart/deconstruct(disassembled = TRUE) diff --git a/code/modules/surgery/bodyparts/head.dm b/code/modules/surgery/bodyparts/head.dm index 45f791b3c..a71cc199c 100644 --- a/code/modules/surgery/bodyparts/head.dm +++ b/code/modules/surgery/bodyparts/head.dm @@ -34,9 +34,6 @@ var/lip_color = "white" //If the head is a special sprite var/custom_head - - // if head has mouth; may depend on species - var/mouth = TRUE /obj/item/bodypart/head/can_dismember(obj/item/I) if(!((owner.stat == DEAD) || owner.InFullCritical())) diff --git a/code/modules/surgery/organs/stomach.dm b/code/modules/surgery/organs/stomach.dm index 1c45d5df6..afa991ca7 100644 --- a/code/modules/surgery/organs/stomach.dm +++ b/code/modules/surgery/organs/stomach.dm @@ -120,27 +120,6 @@ return owner.vomit(stun = FALSE) - -/obj/item/organ/stomach/synthliz - name = "synthliz stomach" +/obj/item/organ/stomach/ipc + name = "ipc stomach" icon_state = "stomach-ipc" - -// ipc power cell from oracle -/obj/item/organ/stomach/cell - name = "micro-cell" - icon_state = "microcell" - w_class = WEIGHT_CLASS_NORMAL - zone = BODY_ZONE_CHEST - slot = ORGAN_SLOT_STOMACH - status = ORGAN_ROBOTIC - attack_verb = list("assault and battery'd") - desc = "A micro-cell, for IPC use only. Do not swallow." - -/obj/item/organ/stomach/cell/emp_act(severity) - switch(severity) - if(1) - owner.nutrition = 50 - to_chat(owner, "Alert: Heavy EMP Detected. Rebooting power cell to prevent damage.") - if(2) - owner.nutrition = 250 - to_chat(owner, "Alert: EMP Detected. Cycling battery.") \ No newline at end of file diff --git a/code/modules/surgery/organs/vocal_cords.dm b/code/modules/surgery/organs/vocal_cords.dm index 7c6fe05ca..b2d19c586 100644 --- a/code/modules/surgery/organs/vocal_cords.dm +++ b/code/modules/surgery/organs/vocal_cords.dm @@ -581,7 +581,7 @@ for(var/V in listeners) var/mob/living/carbon/human/H = V if(H.canbearoused && H.has_dna() && HAS_TRAIT(H, TRAIT_NYMPHO)) // probably a redundant check but for good measure - H.mob_climax_instant() + H.mob_climax(forced_climax=TRUE) */ else if((findtext(message, family_friendly_words))) cooldown = COOLDOWN_MEME @@ -1123,7 +1123,7 @@ if(E.phase > 1) if(HAS_TRAIT(H, TRAIT_NYMPHO) && H.canbearoused && E.lewd) // probably a redundant check but for good measure addtimer(CALLBACK(GLOBAL_PROC, .proc/to_chat, H, "Your [E.enthrallGender] pushes you over the limit, overwhelming your body with pleasure."), 5) - H.mob_climax_instant() + H.mob_climax(forced_climax=TRUE) H.SetStun(20) H.setArousalLoss(H.min_arousal) E.resistanceTally = 0 //makes resistance 0, but resets arousal, resistance buildup is faster unaroused (massively so). diff --git a/code/modules/vending/autodrobe.dm b/code/modules/vending/autodrobe.dm index 4d8b21ac2..2dbaf5394 100644 --- a/code/modules/vending/autodrobe.dm +++ b/code/modules/vending/autodrobe.dm @@ -8,7 +8,8 @@ vend_reply = "Thank you for using AutoDrobe!" products = list(/obj/item/clothing/suit/chickensuit = 1, /obj/item/clothing/head/chicken = 1, - /obj/item/clothing/suit/hooded/wintercoat/corpus = 1, + /obj/item/clothing/suit/hooded/corpus = 1, + /obj/item/clothing/suit/hooded/corpus/c = 1, /obj/item/clothing/under/gladiator = 1, /obj/item/clothing/head/helmet/gladiator = 1, /obj/item/clothing/under/gimmick/rank/captain/suit = 1, @@ -111,9 +112,6 @@ /obj/item/clothing/head/wig/random = 3, /obj/item/clothing/suit/ran = 2, /obj/item/clothing/head/ran = 2, - /obj/item/clothing/suit/threepwoodjacket = 3, - /obj/item/clothing/under/threepwood = 2, - /obj/item/clothing/shoes/threepwoodboots = 1, /obj/item/clothing/under/vaultsuit = 3) contraband = list(/obj/item/clothing/suit/judgerobe = 1, /obj/item/clothing/head/powdered_wig = 1, @@ -122,26 +120,25 @@ /obj/item/clothing/glasses/sunglasses/blindfold = 1, /obj/item/clothing/mask/muzzle = 2) premium = list(/obj/item/clothing/suit/pirate/captain = 2, - /obj/item/clothing/head/pirate/captain = 2, - /obj/item/clothing/head/helmet/roman/fake = 1, - /obj/item/clothing/head/helmet/roman/legionnaire/fake = 1, - /obj/item/clothing/under/roman = 1, - /obj/item/clothing/shoes/roman = 1, - /obj/item/shield/riot/roman/fake = 1, - /obj/item/clothing/head/delinquent = 1, // One per vendor, please dear god don't mass produce these. - /obj/item/skub = 1, - /obj/item/clothing/under/lobster = 1, // CIT CHANGES - /obj/item/clothing/head/lobsterhat = 1, - /obj/item/clothing/head/drfreezehat = 1, - /obj/item/clothing/suit/dracula = 1, - /obj/item/clothing/suit/drfreeze_coat = 1, - /obj/item/clothing/suit/gothcoat = 2, - /obj/item/clothing/under/draculass = 1, - /obj/item/clothing/under/drfreeze = 1, //End of Cit Changes + /obj/item/clothing/head/pirate/captain = 2, + /obj/item/clothing/head/helmet/roman/fake = 1, + /obj/item/clothing/head/helmet/roman/legionnaire/fake = 1, + /obj/item/clothing/under/roman = 1, + /obj/item/clothing/shoes/roman = 1, + /obj/item/shield/riot/roman/fake = 1, + /obj/item/clothing/head/delinquent = 1, // One per vendor, please dear god don't mass produce these. + /obj/item/skub = 1, + /obj/item/clothing/under/lobster = 1, // CIT CHANGES + /obj/item/clothing/head/lobsterhat = 1, + /obj/item/clothing/head/drfreezehat = 1, + /obj/item/clothing/suit/dracula = 1, + /obj/item/clothing/suit/drfreeze_coat = 1, + /obj/item/clothing/suit/gothcoat = 2, + /obj/item/clothing/under/draculass = 1, + /obj/item/clothing/under/drfreeze = 1, //End of Cit Changes /obj/item/clothing/under/wedding_dress = 1, - /obj/item/clothing/under/tuxedo = 1, - /obj/item/clothing/suit/hooded/wintercoat/corpus/command = 1, - /obj/item/storage/belt/cummerbund = 1) + /obj/item/clothing/under/tuxedo = 1, + /obj/item/storage/belt/cummerbund = 1) refill_canister = /obj/item/vending_refill/autodrobe /obj/machinery/vending/autodrobe/all_access diff --git a/code/modules/vending/wardrobes.dm b/code/modules/vending/wardrobes.dm index 5f9dee9d4..0d1e1f3df 100644 --- a/code/modules/vending/wardrobes.dm +++ b/code/modules/vending/wardrobes.dm @@ -19,7 +19,7 @@ /obj/item/clothing/under/rank/security/skirt = 5, /obj/item/clothing/under/rank/security/grey = 5, /obj/item/clothing/under/pants/khaki = 5, - /obj/item/clothing/suit/hooded/wintercoat/corpus/sec = 5) + /obj/item/clothing/suit/hooded/corpus/s = 5) premium = list(/obj/item/clothing/under/rank/security/navyblue = 5, /obj/item/clothing/suit/security/officer = 5, /obj/item/clothing/head/beret/sec/navyofficer = 5, diff --git a/hyperstation/code/effects/lighting.dm b/hyperstation/code/effects/lighting.dm deleted file mode 100644 index 02e07bfcd..000000000 --- a/hyperstation/code/effects/lighting.dm +++ /dev/null @@ -1,18 +0,0 @@ -/obj/effect/light/ - name = "bloom" - icon = 'hyperstation/icons/effects/lighting.dmi' - icon_state = "light" - plane = ABOVE_LIGHTING_PLANE - blend_mode = BLEND_ADD - mouse_opacity = 0 - anchored = TRUE //no more flying around. - -/obj/effect/light/medium - icon = 'hyperstation/icons/effects/lightingmed.dmi' - pixel_x = -16 - pixel_y = -16 - -/obj/effect/light/large - icon = 'hyperstation/icons/effects/lightinglarge.dmi' - pixel_x = -48 - pixel_y = -48 \ No newline at end of file diff --git a/hyperstation/code/game/objects/items/devices/radio/radio.dm b/hyperstation/code/game/objects/items/devices/radio/radio.dm deleted file mode 100644 index 67ea054ff..000000000 --- a/hyperstation/code/game/objects/items/devices/radio/radio.dm +++ /dev/null @@ -1,2 +0,0 @@ -/obj/item/radio - var/list/extra_channels = list() //Allows indivudal channels, used for borgs diff --git a/hyperstation/code/game/objects/railings.dm b/hyperstation/code/game/objects/railings.dm index 8140ad908..2c01a1721 100644 --- a/hyperstation/code/game/objects/railings.dm +++ b/hyperstation/code/game/objects/railings.dm @@ -16,7 +16,6 @@ var/heat_resistance = 800 var/health = 70 var/maxhealth = 70 - layer = BELOW_MOB_LAYER resistance_flags = ACID_PROOF @@ -165,14 +164,6 @@ usr.visible_message("[user] climbed over \the [src]!") usr.do_twist(targetangle = 45, timer = 8) -/obj/structure/railing/Initialize(mapload) //mobs will show under the south railing sprite, thanks Cyanosis for helping with the fix - . = ..() - if(!mapload) - return - if(!(dir & SOUTH)) - return - layer = ABOVE_MOB_LAYER - /obj/structure/railing/handrail name = "handrail" desc = "A waist high handrail, perhaps you could climb over it." diff --git a/hyperstation/code/modules/arousal/arousalhud.dm b/hyperstation/code/modules/arousal/arousalhud.dm index 318edefd0..509438813 100644 --- a/hyperstation/code/modules/arousal/arousalhud.dm +++ b/hyperstation/code/modules/arousal/arousalhud.dm @@ -11,15 +11,7 @@ for(var/obj/item/organ/genital/G in U.internal_organs) if(!G.nochange) if(!G.dontlist) - var/genital_visibility = "[G.name] (Visible)" - switch(G.mode) - if(GENITALS_HIDDEN) - genital_visibility = "[G.name] (Hidden)" - if(GENITALS_CLOTHES) - genital_visibility = "[G.name] (Hidden by Clothes)" - if(GENITALS_VISIBLE) - genital_visibility = "[G.name] (Visible)" - dat += "[genital_visibility]
" + dat += "[G.mode == "hidden" ? "[G.name] (Hidden)" : (G.mode == "clothes" ? "[G.name] (Hidden by Clothes)" : (G.mode == "visable" ? "[G.name] (Visable)" : "[G.name] (Visable)"))]
" dat += {"
Contexual Options

"} var/obj/item/organ/genital/penis/P = user.getorganslot("penis") @@ -53,17 +45,20 @@ if(Belly.inflatable) dat += "Deflate belly" dat += "(Shrink your belly down a size)
" - - if(user.pulling && !isnoncarbon(user.pulling)) // do not fuck animals + + + if(user.pulling) dat += "Climax over [user.pulling]" //you can cum on objects if you really want... dat += "(Orgasm over a person or object.)
" - if(iscarbon(user.pulling)) - dat += "Climax with [user.pulling]" - dat += {"(Orgasm with another person.)
"} - var/mob/living/carbon/human/H = user.pulling - if(H && H.breedable && P) - dat += "Impregnate [U.pulling] ([clamp(U.impregchance,0,100)]%)" - dat += "(Climax inside another person, and attempt to knock them up.)
" + if(isliving(user.pulling)) + if(iscarbon(user.pulling)) + dat += "Climax with [user.pulling]" + dat += {"(Orgasm with another person.)
"} + + var/mob/living/carbon/human/H = user.pulling + if(H.breedable && P && H) + dat += "Impregnate [U.pulling] ([clamp(U.impregchance,0,100)]%)" + dat += "(Climax inside another person, and attempt to knock them up.)
" else dat += "Climax over" dat += "(Requires a partner)
" @@ -86,9 +81,11 @@ dat += "Old Menu" dat += "Toggle Undergarments " dat += "
" + var/datum/browser/popup = new(user, "arousal", "Arousal Panel") popup.set_content(dat) popup.set_title_image(user.browse_rsc_icon(icon, icon_state), 500,600) + popup.open() @@ -143,7 +140,7 @@ T.toggle_visibility(picked_visibility) if(href_list["masturbate"]) - if (H.isPercentAroused(33)) //requires 33% arousal. + if (H.arousalloss >= (H.max_arousal / 100) * 33) //requires 33% arousal. H.solomasturbate() return else @@ -151,7 +148,7 @@ return if(href_list["container"]) - if (H.isPercentAroused(33)) //requires 33% arousal. + if (H.arousalloss >= (H.max_arousal / 100) * 33) //requires 33% arousal. H.cumcontainer() return else @@ -159,7 +156,7 @@ return if(href_list["clothesplosion"]) - if (H.isPercentAroused(33)) //Requires 33% arousal. + if (H.arousalloss >= (H.max_arousal / 100) * 33) //Requires 33% arousal. H.clothesplosion() return else @@ -167,7 +164,7 @@ return if(href_list["climaxself"]) - if (H.isPercentAroused(33)) //requires 33% arousal. + if (H.arousalloss >= (H.max_arousal / 100) * 33) //requires 33% arousal. H.climaxself() return else @@ -175,7 +172,7 @@ return if(href_list["climax"]) - if (H.isPercentAroused(33)) //requires 33% arousal. + if (H.arousalloss >= (H.max_arousal / 100) * 33) //requires 33% arousal. H.climaxalone(FALSE) return else @@ -183,7 +180,7 @@ return if(href_list["climaxover"]) - if (H.isPercentAroused(33)) //requires 33% arousal. + if (H.arousalloss >= (H.max_arousal / 100) * 33) //requires 33% arousal. H.climaxover(usr.pulling) return else @@ -191,7 +188,7 @@ return if(href_list["climaxwith"]) - if (H.isPercentAroused(33)) //requires 33% arousal. + if (H.arousalloss >= (H.max_arousal / 100) * 33) //requires 33% arousal. H.climaxwith(usr.pulling) return else @@ -199,7 +196,7 @@ return if(href_list["impreg"]) - if (H.isPercentAroused(33)) //requires 33% arousal. + if (H.arousalloss >= (H.max_arousal / 100) * 33) //requires 33% arousal. H.impregwith(usr.pulling) return else @@ -334,7 +331,7 @@ obj/screen/arousal/proc/kiss() return //We got hands, let's pick an organ var/obj/item/organ/genital/picked_organ - picked_organ = pick_climax_genitals(masturbation=TRUE, title="Masturbation") + picked_organ = pick_masturbate_genitals() if(picked_organ) src << browse(null, "window=arousal") //closes the window mob_masturbate(picked_organ) @@ -368,31 +365,55 @@ obj/screen/arousal/proc/kiss() to_chat(src, "You cannot climax without choosing genitals.") return -/mob/living/carbon/human/proc/climaxwith(mob/living/carbon/human/partner) - if(!partner) - to_chat(src, "You cannot do this alone.") - return +/mob/living/carbon/human/proc/climaxwith(mob/living/T) + + var/mob/living/carbon/human/L = pick_partner() var/obj/item/organ/genital/picked_organ picked_organ = pick_climax_genitals() - if(!picked_organ) + if(picked_organ) + var/mob/living/partner = L + if(partner) + src << browse(null, "window=arousal") //alls fine, we can close the window now. + var/obj/item/organ/genital/penis/P = picked_organ + var/spillage = "No" //default to no, just incase player has items on to prevent climax + if(!P.condom == 1&&!P.sounding == 1) //you cant climax with a condom on or sounding in. + spillage = input(src, "Would your fluids spill outside?", "Choose overflowing option", "Yes") as anything in list("Yes", "No") + if(spillage == "Yes") + mob_climax_partner(picked_organ, partner, TRUE, FALSE, FALSE) + else + mob_climax_partner(picked_organ, partner, FALSE, FALSE, FALSE) + else + to_chat(src, "You cannot do this alone.") + return + else //They either lack organs that can masturbate, or they didn't pick one. to_chat(src, "You cannot climax without choosing genitals.") return - src << browse(null, "window=arousal") // close arousal window - mob_climax_inside_spillage(picked_organ, partner, impreg=FALSE) -/mob/living/carbon/human/proc/climaxover(atom/partner) + +/mob/living/carbon/human/proc/climaxover(mob/living/T) + + var/mob/living/carbon/human/L = T var/obj/item/organ/genital/picked_organ picked_organ = pick_climax_genitals() - if(!picked_organ) + if(picked_organ) + src << browse(null, "window=arousal") //alls fine, we can close the window now. + var/mob/living/partner = L + if(partner) + var/obj/item/organ/genital/penis/P = picked_organ + if(P.condom == 1) + to_chat(src, "You cannot do this action with a condom on.") + return + if(P.sounding == 1) + to_chat(src, "You cannot do this action with a sounding in.") + return + mob_climax_partner(picked_organ, partner, FALSE, FALSE, TRUE) + else + to_chat(src, "You cannot do this alone.") + return + else //They either lack organs that can masturbate, or they didn't pick one. to_chat(src, "You cannot climax without choosing genitals.") return - src << browse(null, "window=arousal") //alls fine, we can close the window now. - if(!partner || isnoncarbon(partner)) - to_chat(src, "You cannot do this alone.") - return - mob_climax_cover(picked_organ, partner) - /mob/living/carbon/human/proc/clothesplosion() if(usr.restrained(TRUE)) @@ -407,29 +428,39 @@ obj/screen/arousal/proc/kiss() H.visible_message("[H] explodes out of their clothes!'") -/mob/living/carbon/human/proc/impregwith(mob/living/carbon/T) - var/mob/living/carbon/human/partner = pick_partner() - var/obj/item/organ/genital/penis/picked_organ = src.getorganslot("penis") - // wow that is a lot of conditionals huh - if(!picked_organ) // no penis :( - to_chat(src, "You cannot impregnate someone without a penis.") - return - if(!partner) - to_chat(src, "You cannot do this alone.") - return - if(!partner.breedable) //check if impregable. - to_chat(src, "Your partner cannot be impregnated.") - //some fuckery happening, you shouldnt even get to this point tbh. - return - if(picked_organ.condom) - to_chat(src, "You cannot impregnate someone with a condom on.") - return - if(picked_organ.sounding) - to_chat(src, "You cannot impregnate someone with a sounding rod in.") - return - src << browse(null, "window=arousal") //alls fine, we can close the window now. - mob_climax_inside_spillage(picked_organ, partner, impreg=TRUE) +/mob/living/carbon/human/proc/impregwith(mob/living/T) + + var/mob/living/carbon/human/L = pick_partner() + var/obj/item/organ/genital/picked_organ + picked_organ = src.getorganslot("penis") //Impregnation must be done with a penis. + if(picked_organ) + var/mob/living/partner = L + if(partner) + if(!partner.breedable)//check if impregable. + to_chat(src, "Your partner cannot be impregnated.")//some fuckary happening, you shouldnt even get to this point tbh. + return + var/obj/item/organ/genital/penis/P = picked_organ + //you cant impreg with a condom on or sounding in. + if(P.condom == 1) + to_chat(src, "You cannot do this action with a condom on.") + return + if(P.sounding == 1) + to_chat(src, "You cannot do this action with a sounding in.") + return + src << browse(null, "window=arousal") //alls fine, we can close the window now. + //Keeping this for messy fun + var/spillage = input(src, "Would your fluids spill outside?", "Choose overflowing option", "Yes") as anything in list("Yes", "No") + if(spillage == "Yes") + mob_climax_partner(picked_organ, partner, TRUE, TRUE, FALSE) + else + mob_climax_partner(picked_organ, partner, FALSE, TRUE, FALSE) + else + to_chat(src, "You cannot do this alone.") + return + else //no penis :( + to_chat(src, "You cannot impregnate without a penis.") + return /mob/living/carbon/human/proc/cumcontainer(mob/living/T) //We'll need hands and no restraints. @@ -469,11 +500,6 @@ obj/screen/arousal/proc/kiss() cum_splatter_icon.Blend(icon('hyperstation/icons/effects/cumoverlay.dmi', "cum_obj"), ICON_MULTIPLY) add_overlay(cum_splatter_icon) -/mob/living/carbon/add_cum_overlay(type="normal") - var/mutable_appearance/cumoverlay = mutable_appearance('hyperstation/icons/effects/cumoverlay.dmi') - cumoverlay.icon_state = "cum_[type]" - add_overlay(cumoverlay) - /atom/proc/wash_cum() cut_overlay(mutable_appearance('hyperstation/icons/effects/cumoverlay.dmi', "cum_normal")) cut_overlay(mutable_appearance('hyperstation/icons/effects/cumoverlay.dmi', "cum_large")) @@ -497,7 +523,7 @@ obj/screen/arousal/proc/kiss() return //We got hands, let's pick an organ var/obj/item/organ/genital/picked_organ - picked_organ = pick_climax_genitals(masturbation=TRUE, title="Masturbation") + picked_organ = pick_masturbate_genitals() if(picked_organ) src << browse(null, "window=arousal") //closes the window mob_masturbate(picked_organ, cover = TRUE) diff --git a/hyperstation/code/modules/arousal/organs/genitals.dm b/hyperstation/code/modules/arousal/organs/genitals.dm deleted file mode 100644 index 9da552021..000000000 --- a/hyperstation/code/modules/arousal/organs/genitals.dm +++ /dev/null @@ -1,6 +0,0 @@ -/obj/item/organ/genital/proc/get_fluid_source() - if(producing) - return src.reagents - if(linked_organ && linked_organ.producing) - return linked_organ.reagents - return null \ No newline at end of file diff --git a/hyperstation/code/modules/cargo/packs/misc.dm b/hyperstation/code/modules/cargo/packs/misc.dm index 21eb315b2..d1b88903f 100644 --- a/hyperstation/code/modules/cargo/packs/misc.dm +++ b/hyperstation/code/modules/cargo/packs/misc.dm @@ -5,31 +5,3 @@ contains = list(/obj/item/polepack/, /obj/item/wrench/) crate_name = "stripper pole crate" - -/datum/supply_pack/organic/donkpockets - name = "Donkpocket Shipment" - desc = "We at Donk corp provide a wide five selection of holovid ready dinner pockets for all your dietary needs from extra-cheese to vegan to even mothpeople. Product of Donk co." - cost = 1500 - contains = list() - crate_name = "Donk Crate" - crate_type = /obj/structure/closet/crate/freezer - var/num_contained = 5 - //Put the types you want to contain inside this list below. - var/can_contain = list( /obj/item/storage/box/donkpockets, - /obj/item/storage/box/donkpockets/donkpockettaco, - /obj/item/storage/box/donkpockets/donkpocketplasma, - /obj/item/storage/box/donkpockets/donkpocketbreakfast, - /obj/item/storage/box/donkpockets/donkpocketmoth, - /obj/item/storage/box/donkpockets/donkpocketvegan, - /obj/item/storage/box/donkpockets/donkpocketspicy, - /obj/item/storage/box/donkpockets/donkpocketteriyaki, - /obj/item/storage/box/donkpockets/donkpocketpizza, - /obj/item/storage/box/donkpockets/donkpocketberry, - /obj/item/storage/box/donkpockets/donkpockethonk - ) - -/datum/supply_pack/organic/donkpockets/fill(obj/structure/closet/crate/C) - contains = list() - for(var/i = 0; i < num_contained; i++) - contains += pick(can_contain) - . = ..() \ No newline at end of file diff --git a/hyperstation/code/modules/client/hyper_pref_savefile.dm b/hyperstation/code/modules/client/hyper_pref_savefile.dm deleted file mode 100644 index a0a71216b..000000000 --- a/hyperstation/code/modules/client/hyper_pref_savefile.dm +++ /dev/null @@ -1,36 +0,0 @@ -/datum/preferences/proc/hyper_character_pref_load(savefile/S) - S["feature_cosmetic_head"] >> features["cosmetic_head"] - S["feature_cosmetic_chest"] >> features["cosmetic_chest"] - S["feature_cosmetic_l_arm"] >> features["cosmetic_l_arm"] - S["feature_cosmetic_r_arm"] >> features["cosmetic_r_arm"] - S["feature_cosmetic_l_leg"] >> features["cosmetic_l_leg"] - S["feature_cosmetic_r_leg"] >> features["cosmetic_r_leg"] - S["cosmetic_markings"] >> features["cosmetic_markings"] - var/cosmetic_head = sanitize_inlist(features["cosmetic_head"], GLOB.cosmetic_heads, "default") - var/cosmetic_chest = sanitize_inlist(features["cosmetic_chest"], GLOB.cosmetic_chests, "default") - var/cosmetic_l_arm = sanitize_inlist(features["cosmetic_l_arm"], GLOB.cosmetic_arms, "default") - var/cosmetic_r_arm = sanitize_inlist(features["cosmetic_r_arm"], GLOB.cosmetic_arms, "default") - var/cosmetic_l_leg = sanitize_inlist(features["cosmetic_l_leg"], GLOB.cosmetic_legs, "default") - var/cosmetic_r_leg = sanitize_inlist(features["cosmetic_r_leg"], GLOB.cosmetic_legs, "default") - features["cosmetic_head"] = GLOB.cosmetic_heads[cosmetic_head] - features["cosmetic_chest"] = GLOB.cosmetic_chests[cosmetic_chest] - features["cosmetic_l_arm"] = GLOB.cosmetic_arms[cosmetic_l_arm] - features["cosmetic_r_arm"] = GLOB.cosmetic_arms[cosmetic_r_arm] - features["cosmetic_l_leg"] = GLOB.cosmetic_legs[cosmetic_l_leg] - features["cosmetic_r_leg"] = GLOB.cosmetic_legs[cosmetic_r_leg] - - -/datum/preferences/proc/hyper_character_pref_save(savefile/S) - var/datum/cosmetic_part/head = features["cosmetic_head"] - var/datum/cosmetic_part/chest = features["cosmetic_chest"] - var/datum/cosmetic_part/l_arm = features["cosmetic_l_arm"] - var/datum/cosmetic_part/r_arm = features["cosmetic_r_arm"] - var/datum/cosmetic_part/l_leg = features["cosmetic_l_leg"] - var/datum/cosmetic_part/r_leg = features["cosmetic_r_leg"] - WRITE_FILE(S["feature_cosmetic_head"], head.id) - WRITE_FILE(S["feature_cosmetic_chest"], chest.id) - WRITE_FILE(S["feature_cosmetic_l_arm"], l_arm.id) - WRITE_FILE(S["feature_cosmetic_r_arm"], r_arm.id) - WRITE_FILE(S["feature_cosmetic_l_leg"], l_leg.id) - WRITE_FILE(S["feature_cosmetic_r_leg"], r_leg.id) - WRITE_FILE(S["cosmetic_markings"], features["cosmetic_markings"]) \ No newline at end of file diff --git a/hyperstation/code/modules/clothing/suits/misc.dm b/hyperstation/code/modules/clothing/suits/misc.dm index 0793aaa26..31ef1643f 100644 --- a/hyperstation/code/modules/clothing/suits/misc.dm +++ b/hyperstation/code/modules/clothing/suits/misc.dm @@ -21,43 +21,4 @@ name = "\improper Hellraider's Vest" desc = "An open leather vest with battlescarred metal shoulderpads, discovered in a dimensional anomaly. Smells of gunpowder and plasma." icon_state = "guncaster_alt" - item_state = "guncaster_alt" - -/* - * Posshim's Corpus atire - */ - //Making this a subset of wintercoats/winterhoods since poss intends it to have wintercoat stats --Archie - -/obj/item/clothing/suit/hooded/wintercoat/corpus - name = "Standard Voidsuit" - desc = "Standard issue voidsuit in the name of Grofit!" - icon_state = "corpus" - item_state = "armor" - body_parts_covered = CHEST|GROIN|LEGS|ARMS|FEET|HANDS - hoodtype = /obj/item/clothing/head/hooded/winterhood/corpus - flags_inv = HIDEGLOVES|HIDESHOES|HIDEJUMPSUIT //"Hide shoes" but digi shoes dont get hidden, too bad! - mutantrace_variation = NO_MUTANTRACE_VARIATION //There is no need for a digi variant, it's a costume - -/obj/item/clothing/suit/hooded/wintercoat/corpus/sec - name = "Enforcer Voidsuit" - desc = "Delux issue grofit voidsuit. Let the middle class know You're in charge." - icon_state = "corpuss" - hoodtype = /obj/item/clothing/head/hooded/winterhood/corpus/sec //Enjoy this nice red outfit Kinaris! There is NO NEED for a pink one! xoxo -VivI Fanteriso - -/obj/item/clothing/suit/hooded/wintercoat/corpus/command - name = "Commander Voidsuit" - desc = "Premium issue correctional worker attire. Grease the gears of production." - icon_state = "corpusc" - hoodtype = /obj/item/clothing/head/hooded/winterhood/corpus/command - -/obj/item/clothing/head/hooded/winterhood/corpus - name = "Voidsuit helmet" - desc = "galvanized reinforced helm to protect against the elements" - icon_state = "corpus" - flags_inv = HIDEHAIR|HIDEEARS|HIDEFACIALHAIR|HIDEFACE|HIDEMASK|HIDESNOUT|HIDENECK //hide your ugly face with this one simple trick! - -/obj/item/clothing/head/hooded/winterhood/corpus/sec - icon_state = "corpuss" - -/obj/item/clothing/head/hooded/winterhood/corpus/command - icon_state = "corpusc" \ No newline at end of file + item_state = "guncaster_alt" \ No newline at end of file diff --git a/hyperstation/code/modules/mob/dead/new_player/cosmetic_parts.dm b/hyperstation/code/modules/mob/dead/new_player/cosmetic_parts.dm deleted file mode 100644 index a08db8726..000000000 --- a/hyperstation/code/modules/mob/dead/new_player/cosmetic_parts.dm +++ /dev/null @@ -1,154 +0,0 @@ -/* -COSMETIC PARTS - -this system allows you to change the _base_ appearance of a limb independent -of species or markings. this, for example, allows us to create "hybrids" like a -mammal with avian legs. - -keep in mind that this does not change the species of a leg! in the above example, -the mammal's bird-legs are still mammal legs. this matters in some places, like -body part transplants; mis-matched species will cause extra damage if the surgery -fails and the part is rejected. so you can't attach mammal-bird legs to avians -safely. -*/ - -/datum/cosmetic_part - /** A unique string that is used to identify this part for save files. Allows name changes without breaking saves */ - var/id - /** The name of the cosmetic part. This shows up in the preferences dropdown. */ - var/name - var/icon = 'hyperstation/icons/mob/char_parts.dmi' - var/icon_state - /** How colors are determined for this part. MUTCOLORS for base color, MATRIXED to allow multiple channels. */ - var/color_src = MUTCOLORS - /** Whether or not this cosmetic part has an alternate form for digitigrade legs. */ - var/support_digitigrade = TRUE - /** Species IDs that support this cosmetic part. Bypassed with "show mismatched markings" option. */ - var/list/supported_species - -/datum/cosmetic_part/head -/datum/cosmetic_part/chest -/datum/cosmetic_part/arms -/datum/cosmetic_part/legs - -// HEADS -// ========================================= - -/datum/cosmetic_part/head/default - id = "default" - name = "default" - icon = null - -/datum/cosmetic_part/head/ipc_round - id = "ipc_round" - name = "round ipc head" - icon_state = "ipc_round" - supported_species = list("ipc") - - -// CHESTS -// ========================================= - -/datum/cosmetic_part/chest/default - id = "default" - name = "default" - icon = null - -/datum/cosmetic_part/chest/ipc_sleek - id = "ipc_sleek" - name = "sleek ipc chest" - icon_state = "ipc_sleek" - supported_species = list("ipc") - color_src = MATRIXED - -/datum/cosmetic_part/chest/ipc_jointed - id = "ipc_jointed" - name = "jointed ipc chest" - icon_state = "ipc_jointed" - supported_species = list("ipc") - color_src = MATRIXED - - -// ARMS -// ========================================= - -/datum/cosmetic_part/arms/default - id = "default" - name = "default" - icon = null - -/datum/cosmetic_part/arms/avian_alt - id = "avian_alt" - name = "avian claws" - icon_state = "avian_alt" - supported_species = list("mammal", "avian", "aquatic", "insect", "xeno", "synthliz") - -/datum/cosmetic_part/arms/insect - id = "insect" - name = "insect arms" - icon = 'modular_citadel/icons/mob/mutant_bodyparts.dmi' - icon_state = "insect" - supported_species = list("mammal", "avian", "aquatic", "insect", "xeno", "synthliz") - -/datum/cosmetic_part/arms/ipc_sleek - id = "ipc_sleek" - name = "sleek ipc arms" - icon_state = "ipc_sleek" - supported_species = list("ipc") - color_src = MATRIXED - -/datum/cosmetic_part/arms/ipc_jointed - id = "ipc_jointed" - name = "jointed ipc arms" - icon_state = "ipc_jointed" - supported_species = list("ipc") - color_src = MATRIXED - - -// LEGS -// ========================================= - -/datum/cosmetic_part/legs/default - id = "default" - name = "default" - icon = null - -/datum/cosmetic_part/legs/avian - id = "avian" - name = "avian legs" - icon = 'modular_citadel/icons/mob/mutant_bodyparts.dmi' - icon_state = "avian" - supported_species = list("mammal", "avian", "aquatic", "insect", "xeno", "synthliz") - support_digitigrade = FALSE - -/datum/cosmetic_part/legs/mammal - id = "mammal" - name = "mammal legs" - icon = 'modular_citadel/icons/mob/mutant_bodyparts.dmi' - icon_state = "mammal" - supported_species = list("mammal", "avian", "aquatic", "insect", "xeno", "synthliz") - support_digitigrade = TRUE - -/datum/cosmetic_part/legs/insect - id = "insect" - name = "insect legs" - icon = 'modular_citadel/icons/mob/mutant_bodyparts.dmi' - icon_state = "insect" - supported_species = list("mammal", "avian", "aquatic", "insect", "xeno", "synthliz") - support_digitigrade = TRUE - -/datum/cosmetic_part/legs/ipc_sleek - id = "ipc_sleek" - name = "sleek ipc legs" - icon_state = "ipc_sleek" - supported_species = list("ipc") - color_src = MATRIXED - support_digitigrade = FALSE - -/datum/cosmetic_part/legs/ipc_jointed - id = "ipc_jointed" - name = "jointed ipc legs" - icon_state = "ipc_jointed" - supported_species = list("ipc") - color_src = MATRIXED - support_digitigrade = FALSE \ No newline at end of file diff --git a/hyperstation/code/modules/mob/dead/new_player/sprite_accessories.dm b/hyperstation/code/modules/mob/dead/new_player/sprite_accessories.dm index 34dc50426..f76d2ddf0 100644 --- a/hyperstation/code/modules/mob/dead/new_player/sprite_accessories.dm +++ b/hyperstation/code/modules/mob/dead/new_player/sprite_accessories.dm @@ -87,11 +87,6 @@ SNOUTS icon_state = "feasterndnw" icon = 'hyperstation/icons/mob/char_snouts.dmi' -/datum/sprite_accessory/mam_snouts/knshuttle // Dahlular and Arcstaisia @ hyperstation, april 2022. Feel free to remove comment. Just remember this is snowflakey Kinaris stuff. - name = "Kinaris - Shuttle (Hyper)" - icon_state = "knshuttle" - icon = 'hyperstation/icons/mob/char_snouts.dmi' - /datum/sprite_accessory/mam_snouts/fchemlight name = "RadDog (Top) (Hyper)" icon_state = "fchemlight" @@ -148,11 +143,6 @@ EARS icon_state = "easternd" icon = 'hyperstation/icons/mob/char_ears.dmi' -/datum/sprite_accessory/mam_ears/knshuttle // Dahlular and Arcstaisia @ hyperstation, april 2022. Feel free to remove comment. Just remember this is snowflakey Kinaris stuff. - name = "Kinaris - Shuttle (Hyper)" - icon_state = "knshuttle" - icon = 'hyperstation/icons/mob/char_ears.dmi' - /datum/sprite_accessory/mam_ears/chemlight name = "RadDog (Hyper)" icon_state = "chemlight" @@ -195,13 +185,6 @@ WINGS icon_state = "insect" icon = 'hyperstation/icons/mob/char_wings.dmi' -/datum/sprite_accessory/deco_wings/knshuttle // Dahlular and Arcstaisia @ hyperstation, april 2022. Feel free to remove comment. Just remember this is snowflakey Kinaris stuff. - name = "Kinaris - Shuttle (Hyper)" - icon_state = "knshuttle" - icon = 'hyperstation/icons/mob/char_wings.dmi' - //recommended_species = list("synthliz") need to give synths a deco wing slot - color_src = MATRIXED - /datum/sprite_accessory/deco_wings/minibat // sarcoph @ hyperstation, march 2022 name = "Mini Bat (Hyper)" icon_state = "minibat" @@ -341,18 +324,6 @@ TAILS + ANIMATED TAILS icon_state = "easternd" icon = 'hyperstation/icons/mob/char_tails.dmi' -/datum/sprite_accessory/mam_tails/knshuttle // Dahlular and Arcstaisia @ hyperstation, april 2022. Feel free to remove comment. Just remember this is snowflakey Kinaris stuff. - name = "Kinaris - Shuttle (Hyper)" - icon_state = "knshuttle" - icon = 'hyperstation/icons/mob/char_tails.dmi' - recommended_species = list("synthliz") - -/datum/sprite_accessory/mam_tails_animated/knshuttle - name = "Kinaris - Shuttle (Hyper)" - icon_state = "knshuttle" - icon = 'hyperstation/icons/mob/char_tails.dmi' - recommended_species = list("synthliz") - /datum/sprite_accessory/mam_tails/chemlight name = "RadDog (Hyper)" icon_state = "chemlight" @@ -427,11 +398,6 @@ from modular_citadel/code/modules/mob/dead/new_player/sprite_accessories.dm: icon_state = "easternd" icon = 'hyperstation/icons/mob/char_markings.dmi' -/datum/sprite_accessory/mam_body_markings/knshuttle // Dahlular and Arcstaisia @ hyperstation, april 2022. Feel free to remove comment. Just remember this is snowflakey Kinaris stuff. - name = "Kinaris - Shuttle (Hyper)" - icon_state = "knshuttle" - icon = 'hyperstation/icons/mob/char_markings.dmi' - //doged was here /datum/sprite_accessory/mam_body_markings/chemlight name = "RadDog (Hyper)" @@ -475,92 +441,6 @@ from modular_citadel/code/modules/mob/dead/new_player/sprite_accessories.dm: taur_mode = PAW_TAURIC ckeys_allowed = list("chemlight") - -/* -IPCS -========================================================== -*/ - -/* -from modular_citadel/code/modules/mob/dead/new_player/sprite_accessories.dm: - -/datum/sprite_accessory/antenna - icon = 'modular_citadel/icons/mob/ipc_antennas.dmi' - color_src = MUTCOLORS3 - recommended_species = list("ipc") - -/datum/sprite_accessory/screen - icon = 'modular_citadel/icons/mob/ipc_screens.dmi' - color_src = null -*/ - -/datum/sprite_accessory/antenna/idog_down - name = "Dog, down (Hyper)" - icon_state = "idog_down" - color_src = MATRIXED - -/datum/sprite_accessory/antenna/idog_up - name = "Dog, up (Hyper)" - icon_state = "idog_up" - color_src = MATRIXED - -/datum/sprite_accessory/antenna/headset - name = "Headphones (Hyper)" - icon_state = "headset" - color_src = MATRIXED - -/datum/sprite_accessory/antenna/aquatic - name = "Fins (Hyper)" - icon_state = "aquatic" - color_src = MATRIXED - -/datum/sprite_accessory/screen/ghost - name = "Ghost (Hyper)" - icon_state = "ghost" - -/datum/sprite_accessory/screen/heartbeat - name = "Heartbeat (Hyper)" - icon_state = "heartbeat" - -/datum/sprite_accessory/screen/ocean - name = "Ocean (Hyper)" - icon_state = "ocean" - -/datum/sprite_accessory/antenna/catears - name = "Pointy Ears (Hyper)" - icon_state = "catears" - color_src = MATRIXED - -/datum/sprite_accessory/screen/valley - name = "Valley (Hyper)" - icon_state = "valley" - -/datum/sprite_accessory/screen/visor - name = "Black Visor (Hyper)" - icon = 'hyperstation/icons/mob/ipc_screen_visor.dmi' - icon_state = "visor_black" - -/datum/sprite_accessory/screen/visor/blue - name = "Blue Visor (Hyper)" - icon_state = "visor_blue" - -/datum/sprite_accessory/screen/visor/green - name = "Green Visor (Hyper)" - icon_state = "visor_green" - -/datum/sprite_accessory/screen/visor/red - name = "Red Visor (Hyper)" - icon_state = "visor_red" - -/datum/sprite_accessory/screen/visor/white - name = "White Visor (Hyper)" - icon_state = "visor_white" - -/datum/sprite_accessory/screen/visor/yellow - name = "Yellow Visor (Hyper)" - icon_state = "visor_yellow" - - /* HAIRSTYLES ========================================================== @@ -600,4 +480,4 @@ from code/modules/mob/dead/new_player/sprite_accessories/hair_head.dm: /datum/sprite_accessory/hair/emoh name = "Emo (Hyper)" - icon_state = "hair_emoh" + icon_state = "hair_emoh" \ No newline at end of file diff --git a/hyperstation/code/modules/mob/living/carbon/carbon.dm b/hyperstation/code/modules/mob/living/carbon/carbon.dm index 3af2e9447..ec2f69c1d 100644 --- a/hyperstation/code/modules/mob/living/carbon/carbon.dm +++ b/hyperstation/code/modules/mob/living/carbon/carbon.dm @@ -13,11 +13,6 @@ /mob/living/carbon/handle_status_effects() ..() handle_pain() - -/mob/living/carbon/has_mouth() - var/obj/item/bodypart/head/head = get_bodypart(BODY_ZONE_HEAD) - if(head && head.mouth) - return TRUE /mob/living/carbon/proc/handle_pain() var/pain_amount = 0 diff --git a/hyperstation/code/modules/mob/living/carbon/human/cosmetic_part_handler.dm b/hyperstation/code/modules/mob/living/carbon/human/cosmetic_part_handler.dm deleted file mode 100644 index 25b93526f..000000000 --- a/hyperstation/code/modules/mob/living/carbon/human/cosmetic_part_handler.dm +++ /dev/null @@ -1,17 +0,0 @@ -/obj/item/bodypart/proc/apply_cosmetic(datum/cosmetic_part/part) - if(!is_organic_limb() || animal_origin || !part) - return - cosmetic_icon = part - - -/mob/living/carbon/human/proc/handle_cosmetic_parts() - var/features = dna.features - var/list/body_zones = list(BODY_ZONE_HEAD, BODY_ZONE_CHEST, BODY_ZONE_L_ARM, BODY_ZONE_R_ARM, BODY_ZONE_L_LEG, BODY_ZONE_R_LEG) - for(var/zone in body_zones) - var/datum/cosmetic_part/cosmetic_pref = features["cosmetic_" + zone] - if(!istype(cosmetic_pref, /datum/cosmetic_part)) - continue - var/datum/cosmetic_part/part = cosmetic_pref - var/obj/item/bodypart/body_part = get_bodypart(zone) - if(body_part && part) - body_part.apply_cosmetic(part) \ No newline at end of file diff --git a/hyperstation/code/modules/mob/living/carbon/human/species_types/ipc.dm b/hyperstation/code/modules/mob/living/carbon/human/species_types/ipc.dm deleted file mode 100644 index b3e22f9ef..000000000 --- a/hyperstation/code/modules/mob/living/carbon/human/species_types/ipc.dm +++ /dev/null @@ -1,58 +0,0 @@ -// APC powercord: oracle port - -/obj/item/apc_powercord - name = "power cord" - desc = "An internal power cord hooked up to a battery. Useful if you run on electricity. Not so much otherwise." - icon = 'icons/obj/power.dmi' - icon_state = "wire1" - - -/obj/item/apc_powercord/afterattack(atom/target, mob/user, proximity_flag, click_parameters) - if(!istype(target, /obj/machinery/power/apc) || !ishuman(user) || !proximity_flag) - return ..() - user.changeNext_move(CLICK_CD_MELEE) - var/mob/living/carbon/human/H = user - var/obj/item/organ/stomach/cell/battery = H.getorganslot(ORGAN_SLOT_STOMACH) - if(!battery) - to_chat(H, "You try to siphon energy from \the [target], but your power cell is gone!") - return - - if(istype(H) && H.nutrition >= NUTRITION_LEVEL_ALMOST_FULL) - to_chat(user, "You are already fully charged!") - return - - if(istype(target, /obj/machinery/power/apc)) - var/obj/machinery/power/apc/A = target - if(A.cell && A.cell.charge > A.cell.maxcharge*0.25) - powerdraw_loop(A, H) - return - else - to_chat(user, "There is not enough charge to draw from that APC.") - return - - -/obj/item/apc_powercord/proc/powerdraw_loop(obj/machinery/power/apc/A, mob/living/carbon/human/H) - H.visible_message("[H] inserts a power connector into the [A].", "You begin to draw power from the [A].") - while(do_after(H, 10, target = A)) - if(!istype(A)) - return - if(loc != H) - to_chat(H, "You must keep your connector out while charging!") - break - if(A.cell.charge == 0) - to_chat(H, "The [A] doesn't have enough charge to spare.") - break - A.charging = 1 - if(A.cell.charge >= 500) - H.nutrition += 50 - A.cell.charge -= 250 - to_chat(H, "You siphon off some of the stored charge for your own use.") - else - H.nutrition += A.cell.charge/10 - A.cell.charge = 0 - to_chat(H, "You siphon off as much as the [A] can spare.") - break - if(H.nutrition > NUTRITION_LEVEL_WELL_FED) - to_chat(H, "You are now fully charged.") - break - H.visible_message("[H] unplugs from the [A].", "You unplug from the [A].") \ No newline at end of file diff --git a/hyperstation/code/modules/mob/living/silicon/robot/examine_vr.dm b/hyperstation/code/modules/mob/living/silicon/robot/examine_vr.dm deleted file mode 100644 index f3b04a440..000000000 --- a/hyperstation/code/modules/mob/living/silicon/robot/examine_vr.dm +++ /dev/null @@ -1,8 +0,0 @@ -/mob/living/silicon/robot/proc/examine_bellies_borg() - - var/message = "" - for(var/belly in vore_organs) - var/obj/belly/B = belly - message += B.get_examine_msg() - - return message diff --git a/hyperstation/code/modules/mob/living/silicon/robot/robot.dm b/hyperstation/code/modules/mob/living/silicon/robot/robot.dm index 20c7e7679..4752f0c95 100644 --- a/hyperstation/code/modules/mob/living/silicon/robot/robot.dm +++ b/hyperstation/code/modules/mob/living/silicon/robot/robot.dm @@ -1,3 +1,3 @@ //This file is empty right now, but leaves room for people to put shit here in the future for those who are lazy /mob/living/silicon/robot - var/datum/action/cyborg_small_sprite/small_sprite_action //This gets replaced every time the cyborg changes modules --Cyanosis + var/datum/action/cyborg_small_sprite/small_sprite_action //This gets replaced every time the cyborg changes modules --Cyanosis \ No newline at end of file diff --git a/hyperstation/code/modules/mob/living/silicon/robot/robot_modules.dm b/hyperstation/code/modules/mob/living/silicon/robot/robot_modules.dm index d42f3dbeb..dbef0ad93 100644 --- a/hyperstation/code/modules/mob/living/silicon/robot/robot_modules.dm +++ b/hyperstation/code/modules/mob/living/silicon/robot/robot_modules.dm @@ -1,60 +1,11 @@ //This file is empty right now, but leaves room for people to put shit here in the future for those who are lazy -/obj/item/robot_module - var/list/added_channels = list() //Borg radio stuffs - -//service -/obj/item/robot_module/butler - added_channels = list(RADIO_CHANNEL_SERVICE = 1) - -/obj/item/robot_module/clown - added_channels = list(RADIO_CHANNEL_SERVICE = 1) - -/obj/item/robot_module/janitor - added_channels = list(RADIO_CHANNEL_SERVICE = 1) - -//engineering -/obj/item/robot_module/engineering - added_channels = list(RADIO_CHANNEL_ENGINEERING = 1) - -//medical -/obj/item/robot_module/medical - added_channels = list(RADIO_CHANNEL_MEDICAL = 1) - -//security -/obj/item/robot_module/peacekeeper - added_channels = list(RADIO_CHANNEL_SECURITY = 1) - -/obj/item/robot_module/security - added_channels = list(RADIO_CHANNEL_SECURITY = 1) - -//supply -/obj/item/robot_module/miner - added_channels = list(RADIO_CHANNEL_SUPPLY = 1) // Probably already handled by other code when spawned with pre-set module, but whatever. - -//dogborgs -/obj/item/robot_module/k9 - added_channels = list(RADIO_CHANNEL_SECURITY = 1) - -/obj/item/robot_module/medihound - added_channels = list(RADIO_CHANNEL_MEDICAL = 1) - -/obj/item/robot_module/scrubpup - added_channels = list(RADIO_CHANNEL_SERVICE = 1) - -/obj/item/robot_module/borgi - added_channels = list(RADIO_CHANNEL_SERVICE = 1) - -/obj/item/robot_module/orepup - added_channels = list(RADIO_CHANNEL_SUPPLY = 1) - - //This proc gets called whenever a new robot module is being applied --Cyanosis /obj/item/robot_module/proc/handle_sprite_action(mob/living/silicon/robot/R, is_huge = FALSE) ASSERT(istype(R)) if(R.small_sprite_action) QDEL_NULL(R.small_sprite_action) - if(!is_huge) //only from the expander upgrade. The borg won't have an action if they don't have the expander upgrade + if(!is_huge) //only from the expander upgrade. The borg won't have an action if they don't have the expander upgrade return for(var/P in typesof(/datum/action/cyborg_small_sprite)) var/datum/action/cyborg_small_sprite/action = P diff --git a/hyperstation/code/modules/mob/living/simple_animal/friendly/farm_animals.dm b/hyperstation/code/modules/mob/living/simple_animal/friendly/farm_animals.dm index f5c7df2e2..3d12f301b 100644 --- a/hyperstation/code/modules/mob/living/simple_animal/friendly/farm_animals.dm +++ b/hyperstation/code/modules/mob/living/simple_animal/friendly/farm_animals.dm @@ -241,6 +241,6 @@ /mob/living/simple_animal/chicken/examine() . = ..() - . += "This one is [gender]." + . += "this one is [gender]." if(happiness<20) . += "It looks stressed." diff --git a/hyperstation/code/modules/mob/mob_helpers.dm b/hyperstation/code/modules/mob/mob_helpers.dm index 0a47f7b0a..00f9c8631 100644 --- a/hyperstation/code/modules/mob/mob_helpers.dm +++ b/hyperstation/code/modules/mob/mob_helpers.dm @@ -27,7 +27,3 @@ mob/proc/checkloadappearance() else to_chat(H, "You either took too long or chose not to change. Alrighty. Remember, you have 90 seconds from spawn to get to a mirror and still do it if you wish.") return - -// oracle port -/mob/proc/has_mouth() - return FALSE \ No newline at end of file diff --git a/hyperstation/code/modules/research/designs/medical_designs.dm b/hyperstation/code/modules/research/designs/medical_designs.dm deleted file mode 100644 index 825bcd2a2..000000000 --- a/hyperstation/code/modules/research/designs/medical_designs.dm +++ /dev/null @@ -1,69 +0,0 @@ -/datum/design/ipc_liver - name = "IPC Reagent Processor" - id = "ipc_liver" - build_type = PROTOLATHE - materials = list(MAT_METAL = 2000, MAT_GLASS = 1000) - build_path = /obj/item/organ/liver/ipc - category = list("Medical Designs") - departmental_flags = DEPARTMENTAL_FLAG_MEDICAL - construction_time = 100 - -/datum/design/ipc_eyes - name = "IPC Eyes" - id = "ipc_eyes" - build_type = PROTOLATHE - materials = list(MAT_METAL = 1000, MAT_GLASS = 2000) - build_path = /obj/item/organ/eyes/ipc - category = list("Medical Designs") - departmental_flags = DEPARTMENTAL_FLAG_MEDICAL - construction_time = 100 - -/datum/design/ipc_tongue - name = "Positronic Voicebox" - id = "ipc_tongue" - build_type = PROTOLATHE - materials = list(MAT_METAL = 2000, MAT_GLASS = 1000) - build_path = /obj/item/organ/tongue/robot/ipc - category = list("Medical Designs") - departmental_flags = DEPARTMENTAL_FLAG_MEDICAL - construction_time = 100 - -/datum/design/ipc_stomach - name = "Micro-cell" - id = "ipc_stomach" - build_type = PROTOLATHE - materials = list(MAT_METAL = 2000, MAT_GLASS = 1000, MAT_PLASMA = 200) - build_path = /obj/item/organ/stomach/cell - category = list("Medical Designs") - departmental_flags = DEPARTMENTAL_FLAG_MEDICAL - construction_time = 100 - -/datum/design/synthliz_stomach - name = "Synthetic Lizardperson Stomach" - id = "synthliz_stomach" - build_type = PROTOLATHE - materials = list(MAT_METAL = 2000, MAT_GLASS = 1000) - build_path = /obj/item/organ/stomach/synthliz - category = list("Medical Designs") - departmental_flags = DEPARTMENTAL_FLAG_MEDICAL - construction_time = 100 - -/datum/design/power_cord - name = "IPC Power Cord" - id = "power_cord" - build_type = PROTOLATHE - materials = list(MAT_METAL = 2000, MAT_GLASS = 1000) - build_path = /obj/item/organ/cyberimp/arm/power_cord - category = list("Medical Designs") - departmental_flags = DEPARTMENTAL_FLAG_MEDICAL - construction_time = 100 - - -/datum/techweb_node/ipc_organs - id = "ipc_organs" - display_name = "IPC Parts" - description = "We have the technology to replace him." - prereq_ids = list("cyber_organs","robotics") - design_ids = list("ipc_liver", "ipc_eyes", "ipc_tongue", "ipc_stomach", "synthliz_stomach", "power_cord") - research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 1500) - export_price = 5000 diff --git a/hyperstation/code/modules/surgery/organs/augments_arms.dm b/hyperstation/code/modules/surgery/organs/augments_arms.dm index 933b584eb..8430fcac5 100644 --- a/hyperstation/code/modules/surgery/organs/augments_arms.dm +++ b/hyperstation/code/modules/surgery/organs/augments_arms.dm @@ -23,11 +23,3 @@ w_class = WEIGHT_CLASS_BULKY sharpness = IS_SHARP_ACCURATE attack_verb = list("slashed", "cut") - - -// oracle port -/obj/item/organ/cyberimp/arm/power_cord - name = "power cord implant" - desc = "An internal power cord hooked up to a battery. Useful if you run on volts." - contents = newlist(/obj/item/apc_powercord) - zone = "l_arm" \ No newline at end of file diff --git a/hyperstation/code/obj/condom.dm b/hyperstation/code/obj/condom.dm index 2c3122fe2..727ff4739 100644 --- a/hyperstation/code/obj/condom.dm +++ b/hyperstation/code/obj/condom.dm @@ -115,6 +115,7 @@ obj/item/condom/update_icon() return if(!P.condom) return + var/obj/item/condom/filled/C = new P.linked_organ.reagents.trans_to(C, P.linked_organ.reagents.total_volume) C.loc = loc diff --git a/hyperstation/code/obj/farming/farming.dm b/hyperstation/code/obj/farming/farming.dm index ad4671774..8c203d78d 100644 --- a/hyperstation/code/obj/farming/farming.dm +++ b/hyperstation/code/obj/farming/farming.dm @@ -1,5 +1,5 @@ -/obj/item/reagent_containers/food/snacks/grown/wheat - var/stacktype = /obj/item/stack/tile/hay +/obj/item/reagent_containers/food/snacks/grown/wheat/ + var stacktype = /obj/item/stack/tile/hay var/tile_coefficient = 0.02 // same as grass /obj/item/reagent_containers/food/snacks/grown/wheat/attack_self(mob/user) diff --git a/hyperstation/code/obj/fleshlight.dm b/hyperstation/code/obj/fleshlight.dm index 421cfb8f6..125c7ec34 100644 --- a/hyperstation/code/obj/fleshlight.dm +++ b/hyperstation/code/obj/fleshlight.dm @@ -45,9 +45,11 @@ inuse = 1 if(!(C == user)) //if we are targeting someone else. C.visible_message("[user] is trying to use [src] on [C]'s penis.", "[user] is trying to use [src] on your penis.") + if(!do_mob(user, C, 3 SECONDS)) //3 second delay inuse = 0 return + //checked if not used on yourself, if not, carry on. playsound(src, 'sound/lewd/slaps.ogg', 30, 1, -1) //slapping sound inuse = 0 @@ -55,22 +57,27 @@ C.visible_message("[user] pumps [src] on [C]'s penis.", "[user] pumps [src] up and down on your penis.") else user.visible_message("[user] pumps [src] on their penis.", "You pump the fleshlight on your penis.") + if(prob(30)) //30% chance to make them moan. C.emote("moan") + C.do_jitter_animation() C.adjustArousalLoss(20) //make the target more aroused. - if(C.can_orgasm() && ishuman(C)) - var/mob/living/carbon/human/user_human = C - user_human.mob_climax_outside(P, mb_time=0) // instant, because we already did a warmup + if (C.getArousalLoss() >= 100 && ishuman(C) && C.has_dna()) + C.mob_climax(forced_climax=TRUE) //make them cum if they are over the edge. + return + else to_chat(user, "You don't see anywhere to use this on.") + inuse = 0 ..() //Hyperstation 13 portal fleshlight //kinky! + /obj/item/portallight name = "portal fleshlight" desc = "A silver love(TM) fleshlight, used to stimulate someones penis, with bluespace tech that allows lovers to hump at a distance." @@ -88,6 +95,7 @@ var/paired = 0 var/obj/item/portalunderwear var/useable = FALSE + var/option = "" /obj/item/portallight/examine(mob/user) . = ..() @@ -96,109 +104,136 @@ else . += "The device is paired, and awaiting input. " -/obj/item/portallight/attack(mob/living/carbon/user, mob/living/holder) +/obj/item/portallight/attack(mob/living/carbon/C, mob/living/user) //use portallight! nearly the same as the fleshlight apart from you have a buddy! + var/obj/item/organ/genital/penis/P = C.getorganslot("penis") + if(inuse) //just to stop stacking and causing people to cum instantly return - if(!UpdateUsability()) - to_chat(holder, "\The [src] appears to be currently unusable.") - return - var/option = "Fuck" - if(user == holder) + if(!useable) + to_chat(user, "It seems the device has failed or your partner is not wearing their device.") + + if(C == user)//if your using it on yourself, more options! otherwise, just fuck. option = input(usr, "Choose action", "Portal Fleshlight", "Fuck") in list("Fuck", "Lick", "Touch") - var/obj/item/organ/genital/target_genital = portalunderwear.loc - var/mob/living/carbon/human/target = target_genital.owner - var/obj/item/organ/genital/penis/P = user.getorganslot("penis") - if(option == "Fuck" && !P.is_exposed()) - to_chat(holder, "You don't see anywhere to use this on.") + else + option = "Fuck" + + var/obj/item/organ/genital/G + if(istype(portalunderwear.loc, /obj/item/organ/genital)) //Sanity check. Without this it will runtime error. + G = portalunderwear.loc + if(!G) return - /* - WARMUP START - prevents spam/instant climax - */ - inuse = TRUE - if(user != holder) - user.visible_message("[holder] is trying to use [src] on [user]'s penis.",\ - "[holder] is trying to use [src] on your penis.") - if(!do_mob(holder, user, 3 SECONDS)) - inuse = FALSE + var/mob/living/carbon/human/M = G.owner + + if(option == "Fuck"&&!P.is_exposed()) //we are trying to fuck with no penis! + to_chat(user, "You don't see anywhere to use this on.") + return + else //other options dont need checks + inuse = 1 + if(!(C == user)) //if we are targeting someone else. + C.visible_message("[user] is trying to use [src] on [C]'s penis.", "[user] is trying to use [src] on your penis.") + + if(!do_mob(user, C, 3 SECONDS)) //3 second delay + inuse = 0 + return + + //checked if not used on yourself, if not, carry on. + if(option == "Fuck") + playsound(src, 'sound/lewd/slaps.ogg', 30, 1, -1) //slapping sound for fuck. + + inuse = 0 + if(!(C == user)) + C.visible_message("[user] pumps [src] on [C]'s penis.", "[user] pumps [src] up and down on your penis.") + else + if(option == "Fuck") + user.visible_message("[user] pumps [src] on their penis.", "You pump the fleshlight on your penis.") + if(option == "Lick") + user.visible_message("[user] licks into [src].", "You lick into [src].") + if(option == "Touch") + user.visible_message("[user] touches softly against [src].", "You touch softly on [src].") + + + if(prob(30)) //30% chance to make your partner moan. + M.emote("moan") + + if(option == "Fuck")// normal fuck + to_chat(M, "You feel a [P.length] inch, [P.shape] shaped penis pumping through the portal into your [G.name].")//message your partner, and kinky! + if(prob(30)) //30% chance to make them moan. + C.emote("moan") + if(prob(30)) //30% chance to make your partner moan. + M.emote("moan") + C.adjustArousalLoss(20) + M.adjustArousalLoss(20) + M.do_jitter_animation() //make your partner shake too! + + if (M.getArousalLoss() >= 100 && ishuman(M) && prob(5))//Why not have a probability to cum when someone's getting nailed with max arousal?~ + if(G.is_exposed()) //Oh yea, if vagina is not exposed, the climax will not cause a spill + M.mob_climax_outside(G, spillage = TRUE) + else + M.mob_climax_outside(G, spillage = FALSE) + + if (C.getArousalLoss() >= 100 && ishuman(C) && C.has_dna()) + var/mob/living/carbon/human/O = C + + if( (P.condom == 1) || (P.sounding == 1)) //If coundomed and/or sounded, do not fire impreg chance + O.mob_climax_partner(P, M, FALSE, FALSE, FALSE, TRUE) + else //Else, fire impreg chance + if(G.name == "vagina") //no more spontaneous impregnations through the butt! + O.mob_climax_partner(P, M, FALSE, TRUE, FALSE, TRUE) + else + O.mob_climax_partner(P, M, FALSE, FALSE, FALSE, TRUE) + + if(option == "Lick") + to_chat(M, "You feel a tongue lick you through the portal against your [G.name].") + M.adjustArousalLoss(10) + if(option == "Touch") + to_chat(M, "You feel someone touching your [G.name] through the portal.") + M.adjustArousalLoss(5) + return - inuse = FALSE - /* - WARMUP END - proceed with the action - */ - switch(option) - if("Fuck") - playsound(src, 'sound/lewd/slaps.ogg', 30, 1, -1) - if(user == holder) - holder.visible_message("[holder] pumps [src] on their penis.", - "You pump the fleshlight on your penis.") - else - user.visible_message("[holder] pumps [src] on [user]'s penis.",\ - "[holder] pumps [src] up and down on your penis.") - to_chat(target, "You feel a [P.length] inch, [P.shape] shaped penis pumping through the portal into your [target_genital.name].") - if(prob(30)) - user.emote("moan") - user.adjustArousalLoss(20) - target.adjustArousalLoss(20) - target.do_jitter_animation() - if(target.can_orgasm() && prob(5)) - target.mob_climax_outside(target_genital, spillage=target_genital.is_exposed()) - if(user.can_orgasm()) - var/mob/living/carbon/human/O = user - var/impreg_chance = target_genital.name == "vagina" && !P.condom && !P.sounding - if(O.mob_climax_in_partner(P, target, spillage=FALSE, remote=TRUE) && impreg_chance) - target.impregnate(by=O) - if("Lick") - holder.visible_message("[holder] licks into [src].",\ - "You lick into [src].") - to_chat(target, "You feel a tongue lick you through the portal against your [target_genital.name].") - target.adjustArousalLoss(10) - if("Touch") - holder.visible_message("[holder] touches softly against [src].",\ - "You touch softly on [src].") - to_chat(target, "You feel someone touching your [target_genital.name] through the portal.") - target.adjustArousalLoss(5) - if(prob(30)) - target.emote("moan") ..() /obj/item/portallight/proc/updatesleeve() //get their looks and vagina colour! - cut_overlays() - if(!UpdateUsability()) + cut_overlays()//remove current overlays + + var/obj/item/organ/genital/G + if(istype(portalunderwear.loc, /obj/item/organ/genital)) //Sanity check. Without this it will runtime. + G = portalunderwear.loc + if(!G) + useable = FALSE return - var/obj/item/organ/genital/G = portalunderwear.loc - var/mob/living/carbon/human/H = G.owner // H is verified by UpdateUsability() - var/sleeve_species = "normal" - switch(H.dna.species.name) - if("Lizardperson") - sleeve_species = "lizard" - if("Slimeperson") - sleeve_species = "slime" - if("Avian") - sleeve_species = "avian" - sleeve = mutable_appearance('hyperstation/icons/obj/fleshlight.dmi', "portal_sleeve_[sleeve_species]") - sleeve.color = "#" + H.dna.features["mcolor"] - add_overlay(sleeve) - if(G.name == "vagina") - organ = mutable_appearance('hyperstation/icons/obj/fleshlight.dmi', "portal_vag") - organ.color = portalunderwear.loc.color - if(G.name == "anus") - organ = mutable_appearance('hyperstation/icons/obj/fleshlight.dmi', "portal_anus") - organ.color = "#" + H.dna.features["mcolor"] - add_overlay(organ) -/obj/item/portallight/proc/UpdateUsability() - var/useable = FALSE - if(portalunderwear && istype(portalunderwear.loc, /obj/item/organ/genital)) - var/obj/item/organ/genital/loc_genitals = portalunderwear.loc - if(loc_genitals.owner && ishuman(loc_genitals.owner)) - useable = TRUE - src.useable = useable - return useable + var/mob/living/carbon/human/H = G.owner + if(H) //if the portal panties are on someone. + sleeve = mutable_appearance('hyperstation/icons/obj/fleshlight.dmi', "portal_sleeve_normal") + if(H.dna.species.name == "Lizardperson") // lizard nerd + sleeve = mutable_appearance('hyperstation/icons/obj/fleshlight.dmi', "portal_sleeve_lizard") + + if(H.dna.species.name == "Slimeperson") // slime nerd + sleeve = mutable_appearance('hyperstation/icons/obj/fleshlight.dmi', "portal_sleeve_slime") + + if(H.dna.species.name == "Avian") // bird nerd + sleeve = mutable_appearance('hyperstation/icons/obj/fleshlight.dmi', "portal_sleeve_avian") + + sleeve.color = "#" + H.dna.features["mcolor"] + add_overlay(sleeve) + + if(G.name == "vagina") + organ = mutable_appearance('hyperstation/icons/obj/fleshlight.dmi', "portal_vag") + organ.color = portalunderwear.loc.color + if(G.name == "anus") + organ = mutable_appearance('hyperstation/icons/obj/fleshlight.dmi', "portal_anus") + organ.color = "#" + H.dna.features["mcolor"] + + useable = TRUE + add_overlay(organ) + else + useable = FALSE //Hyperstation 13 portal underwear //can be attached to vagina or anus, just like the vibrator, still requires pairing with the portallight + /obj/item/portalpanties name = "portal panties" desc = "A silver love(TM) pair of portal underwear, with bluespace tech allows lovers to hump at a distance. Needs to be paired with a portal fleshlight before use." @@ -217,6 +252,7 @@ else . += "The device is paired, and awaiting attachment. " + /obj/item/portalpanties/attackby(obj/item/I, mob/living/user) //pairing if(istype(I, /obj/item/portallight)) var/obj/item/portallight/P = I @@ -232,9 +268,11 @@ ..() //just allows people to hit it with other objects, if they so wished. /obj/item/portalpanties/attack(mob/living/carbon/C, mob/living/user) + if(!portallight) //we arent paired yet! noobie trap, let them know. to_chat(user, "[src] can only be attached once paired with a portal fleshlight.") return + var/obj/item/organ/genital/picked_organ var/mob/living/carbon/human/S = user var/mob/living/carbon/human/T = C @@ -244,17 +282,21 @@ "[user] is trying to put [src] on you!") if(!do_mob(user, C, 3 SECONDS))//warn them and have a delay of 5 seconds to apply. return + if((picked_organ.name == "vagina")||(picked_organ.name == "anus")) //only fits on a vagina or anus + src.shapetype = picked_organ.name if(!picked_organ.equipment) to_chat(user, "You wrap [src] around [T]'s [picked_organ.name].") else to_chat(user, "They already have [picked_organ.equipment.name] there.") return + if(!user.transferItemToLoc(src, picked_organ)) //check if you can put it in return src.attached = TRUE picked_organ.equipment = src + var/obj/item/portallight/P = portallight //now we need to send what they look like, but saddly if the person changes colour for what ever reason, it wont update. but dont tell people shh. if(P) //just to make sure @@ -270,7 +312,6 @@ var/obj/item/portallight/P = portallight P.updatesleeve() - /obj/item/storage/box/portallight name = "Portal Fleshlight and Underwear" icon = 'hyperstation/icons/obj/fleshlight.dmi' diff --git a/hyperstation/code/obj/kinkyclothes.dm b/hyperstation/code/obj/kinkyclothes.dm index e7be65751..3a5e44318 100644 --- a/hyperstation/code/obj/kinkyclothes.dm +++ b/hyperstation/code/obj/kinkyclothes.dm @@ -160,6 +160,9 @@ obj/item/clothing/neck/stole/black var/firstpickup = TRUE var/pickupsound = TRUE +/obj/item/clothing/under/vaultsuit/no_sound + pickupsound = FALSE + /obj/item/clothing/under/vaultsuit/equipped(mob/user, slot) . = ..() if(!pickupsound) @@ -195,44 +198,3 @@ obj/item/clothing/neck/stole/black body_parts_covered = CHEST|LEGS|ARMS min_cold_protection_temperature = FIRE_SUIT_MIN_TEMP_PROTECT -/obj/item/clothing/suit/threepwoodjacket - name = "threepwood's jacket" - desc = "A jacket fit for a Mighty Pirate!" - icon = 'hyperstation/icons/obj/clothing/suits.dmi' - icon_state = "threepwoodjacket" - alternate_worn_icon = 'hyperstation/icons/mobs/suits.dmi' - item_state = "b_suit" - var/firstpickup = TRUE - var/pickupsound = TRUE - -/obj/item/clothing/suit/threepwoodjacket/equipped(mob/user, slot) - . = ..() - if(!pickupsound) - return - if(!ishuman(user)) - return - if(slot == SLOT_WEAR_SUIT) - if(!firstpickup) - SEND_SOUND(user, sound('hyperstation/sound/effects/vaultsuit/FalloutEXPUp.ogg', volume = 00)) - else - firstpickup = FALSE - SEND_SOUND(user, sound('hyperstation/sound/effects/vaultsuit/bartandfink.ogg', volume = 60)) - return - -/obj/item/clothing/under/threepwood - name = "threepwood's outfit" - desc = "An outfit fit for a Mighty Pirate!." - icon = 'hyperstation/icons/obj/clothing/uniforms.dmi' - icon_state = "threepwood" - alternate_worn_icon = 'hyperstation/icons/mobs/uniforms.dmi' - item_state = "w_suit" - can_adjust = FALSE - -/obj/item/clothing/shoes/threepwoodboots - name = "threepwood's boots" - desc = "A pair of boots fit for a Mighty Pirate!." - icon = 'hyperstation/icons/obj/clothing/shoes.dmi' - icon_state = "threepwoodboots" - alternate_worn_icon = 'hyperstation/icons/obj/clothing/shoes.dmi' - item_state = "threepwoodboots" - alternate_worn_icon = 'hyperstation/icons/mobs/feet.dmi' \ No newline at end of file diff --git a/hyperstation/code/obj/pregnancytester.dm b/hyperstation/code/obj/pregnancytester.dm index d08610271..974fda3ab 100644 --- a/hyperstation/code/obj/pregnancytester.dm +++ b/hyperstation/code/obj/pregnancytester.dm @@ -8,6 +8,7 @@ var/results = "null" w_class = WEIGHT_CLASS_TINY + /obj/item/pregnancytest/attack_self(mob/user) if(QDELETED(src)) return @@ -15,26 +16,28 @@ return if(isAI(user)) return - if(user.stat > CONSCIOUS)//unconscious or dead + if(user.stat > 0)//unconscious or dead return - Test(user) + if(status == 1) + return //Already been used once, pregnancy tests only work once. + test(user) + +/obj/item/pregnancytest/proc/force(mob/living/user) + //Force it negative + icon_state = "negative" + name = "[results] pregnancy test" + status = 1 + to_chat(user, "You use the pregnancy test, the display reads negative!") + + +/obj/item/pregnancytest/proc/test(mob/living/user) -/obj/item/pregnancytest/proc/Test(mob/living/user) - if(status) - return - var/_results = FALSE var/obj/item/organ/genital/womb/W = user.getorganslot("womb") - if(!W) - return // no reason to waste the single-use on them - if(W.pregnant) - _results = TRUE - UpdateResult(user, _results) - -/obj/item/pregnancytest/proc/UpdateResult(mob/living/user, results) - var/result_text = results ? "positive" : "negative" - src.results = result_text - icon_state = result_text - name = "[results] preganancy test" - status = TRUE - if(user) - to_chat(user, "You use the pregnancy test, the display reads [results]!") \ No newline at end of file + if(W.pregnant == 1) + results = "positive" + icon_state = "positive" + name = "[results] pregnancy test" + status = 1 + to_chat(user, "You use the pregnancy test, the display reads positive!") + else + force(user) \ No newline at end of file diff --git a/hyperstation/code/obj/vibrator.dm b/hyperstation/code/obj/vibrator.dm index 40e1446e9..51f495945 100644 --- a/hyperstation/code/obj/vibrator.dm +++ b/hyperstation/code/obj/vibrator.dm @@ -132,13 +132,14 @@ Code: if(2) //med, can make you cum to_chat(U, "You feel intense pleasure surge through your [G.name]") U.do_jitter_animation() - U.mob_climax_instant() + if (U.getArousalLoss() >= 100 && ishuman(U) && U.has_dna()) + U.mob_climax(forced_climax=TRUE) if(3) //high, makes you stun to_chat(U, "You feel overpowering pleasure surge through your [G.name]") U.Jitter(3) U.Stun(30) - if (U.can_orgasm()) - U.mob_climax_instant() + if (U.getArousalLoss() >= 100 && ishuman(U) && U.has_dna()) + U.mob_climax(forced_climax=TRUE) if(prob(50)) U.emote("moan") diff --git a/hyperstation/icons/effects/lighting.dmi b/hyperstation/icons/effects/lighting.dmi deleted file mode 100644 index 3f59b47d2..000000000 Binary files a/hyperstation/icons/effects/lighting.dmi and /dev/null differ diff --git a/hyperstation/icons/effects/lightinglarge.dmi b/hyperstation/icons/effects/lightinglarge.dmi deleted file mode 100644 index fb1eeebc8..000000000 Binary files a/hyperstation/icons/effects/lightinglarge.dmi and /dev/null differ diff --git a/hyperstation/icons/effects/lightingmed.dmi b/hyperstation/icons/effects/lightingmed.dmi deleted file mode 100644 index 0b87ce7dc..000000000 Binary files a/hyperstation/icons/effects/lightingmed.dmi and /dev/null differ diff --git a/hyperstation/icons/mob/char_ears.dmi b/hyperstation/icons/mob/char_ears.dmi index b4b572a05..bf248620b 100644 Binary files a/hyperstation/icons/mob/char_ears.dmi and b/hyperstation/icons/mob/char_ears.dmi differ diff --git a/hyperstation/icons/mob/char_markings.dmi b/hyperstation/icons/mob/char_markings.dmi index 916587c6b..e311b1d0f 100644 Binary files a/hyperstation/icons/mob/char_markings.dmi and b/hyperstation/icons/mob/char_markings.dmi differ diff --git a/hyperstation/icons/mob/char_parts.dmi b/hyperstation/icons/mob/char_parts.dmi deleted file mode 100644 index 4982376a0..000000000 Binary files a/hyperstation/icons/mob/char_parts.dmi and /dev/null differ diff --git a/hyperstation/icons/mob/char_snouts.dmi b/hyperstation/icons/mob/char_snouts.dmi index 92c21d9c1..06ce5d3be 100644 Binary files a/hyperstation/icons/mob/char_snouts.dmi and b/hyperstation/icons/mob/char_snouts.dmi differ diff --git a/hyperstation/icons/mob/char_tails.dmi b/hyperstation/icons/mob/char_tails.dmi index 0695ae639..6e2005e12 100644 Binary files a/hyperstation/icons/mob/char_tails.dmi and b/hyperstation/icons/mob/char_tails.dmi differ diff --git a/hyperstation/icons/mob/char_wings.dmi b/hyperstation/icons/mob/char_wings.dmi index 8384776ec..2a7b34cf1 100644 Binary files a/hyperstation/icons/mob/char_wings.dmi and b/hyperstation/icons/mob/char_wings.dmi differ diff --git a/hyperstation/icons/mob/ipc_screen_visor.dmi b/hyperstation/icons/mob/ipc_screen_visor.dmi deleted file mode 100644 index 1bf897228..000000000 Binary files a/hyperstation/icons/mob/ipc_screen_visor.dmi and /dev/null differ diff --git a/hyperstation/icons/obj/genitals/belly.dmi b/hyperstation/icons/obj/genitals/belly.dmi index af5d45f1c..3324744b7 100644 Binary files a/hyperstation/icons/obj/genitals/belly.dmi and b/hyperstation/icons/obj/genitals/belly.dmi differ diff --git a/hyperstation/icons/obj/genitals/butt.dmi b/hyperstation/icons/obj/genitals/butt.dmi index d5d8ee53e..55f746287 100644 Binary files a/hyperstation/icons/obj/genitals/butt.dmi and b/hyperstation/icons/obj/genitals/butt.dmi differ diff --git a/hyperstation/icons/obj/railings.dmi b/hyperstation/icons/obj/railings.dmi index 2bccd88f7..1604e6bdd 100644 Binary files a/hyperstation/icons/obj/railings.dmi and b/hyperstation/icons/obj/railings.dmi differ diff --git a/hyperstation/sound/effects/vaultsuit/bartandfink.ogg b/hyperstation/sound/effects/vaultsuit/bartandfink.ogg deleted file mode 100644 index 9b76713f2..000000000 Binary files a/hyperstation/sound/effects/vaultsuit/bartandfink.ogg and /dev/null differ diff --git a/hyperstation/sound/weapons/dinkalternate.ogg b/hyperstation/sound/weapons/dinkalternate.ogg deleted file mode 100644 index e7d00f8b6..000000000 Binary files a/hyperstation/sound/weapons/dinkalternate.ogg and /dev/null differ diff --git a/icons/mob/dogborg.dmi b/icons/mob/dogborg.dmi index 3aaaa0493..ec63120ae 100644 Binary files a/icons/mob/dogborg.dmi and b/icons/mob/dogborg.dmi differ diff --git a/icons/obj/clothing/shoes.dmi b/icons/obj/clothing/shoes.dmi index b0150ed51..7815d52d6 100644 Binary files a/icons/obj/clothing/shoes.dmi and b/icons/obj/clothing/shoes.dmi differ diff --git a/icons/obj/food/food.dmi b/icons/obj/food/food.dmi index 88607735c..bd4b429fc 100644 Binary files a/icons/obj/food/food.dmi and b/icons/obj/food/food.dmi differ diff --git a/icons/obj/surgery.dmi b/icons/obj/surgery.dmi index 3cf1c4bc1..b0e6ab7bf 100644 Binary files a/icons/obj/surgery.dmi and b/icons/obj/surgery.dmi differ diff --git a/modular_citadel/code/datums/status_effects/chems.dm b/modular_citadel/code/datums/status_effects/chems.dm index 433c20135..92aa3b21b 100644 --- a/modular_citadel/code/datums/status_effects/chems.dm +++ b/modular_citadel/code/datums/status_effects/chems.dm @@ -620,7 +620,7 @@ else if (lowertext(customTriggers[trigger]) == "cum")//aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa if (HAS_TRAIT(C, TRAIT_NYMPHO) && lewd) if (C.getArousalLoss() > 80) - C.mob_climax_instant() + C.mob_climax(forced_climax=TRUE) C.SetStun(10)//We got your stun effects in somewhere, Kev. else C.adjustArousalLoss(10) diff --git a/modular_citadel/code/modules/arousal/arousal.dm b/modular_citadel/code/modules/arousal/arousal.dm index 8b8780b46..5e37cbbe7 100644 --- a/modular_citadel/code/modules/arousal/arousal.dm +++ b/modular_citadel/code/modules/arousal/arousal.dm @@ -11,6 +11,7 @@ /mob/living/carbon/human canbearoused = TRUE + var/saved_underwear = ""//saves their underwear so it can be toggled later var/saved_undershirt = "" var/saved_socks = "" @@ -61,6 +62,7 @@ /mob/living/proc/handle_arousal() + /mob/living/carbon/handle_arousal() if(canbearoused && dna) var/datum/species/S @@ -108,11 +110,8 @@ if(updating_arousal) updatearousal() -/** - * despite the name of this, it actually returns a number between 0 and 100 - */ /mob/living/proc/getPercentAroused() - var/percentage = ((arousalloss / max_arousal) * 100) + var/percentage = ((100 / max_arousal) * arousalloss) return percentage /mob/living/proc/isPercentAroused(percentage)//returns true if the mob's arousal (measured in a percent of 100) is greater than the arg percentage. @@ -128,25 +127,26 @@ /mob/living/carbon/updatearousal() . = ..() - for(var/obj/item/organ/genital/genital in internal_organs) - if(istype(genital)) + + for(var/obj/item/organ/genital/G in internal_organs) + if(istype(G)) var/datum/sprite_accessory/S - switch(genital.type) + switch(G.type) if(/obj/item/organ/genital/penis) - S = GLOB.cock_shapes_list[genital.shape] + S = GLOB.cock_shapes_list[G.shape] if(/obj/item/organ/genital/testicles) - S = GLOB.balls_shapes_list[genital.shape] + S = GLOB.balls_shapes_list[G.shape] if(/obj/item/organ/genital/vagina) - S = GLOB.vagina_shapes_list[genital.shape] + S = GLOB.vagina_shapes_list[G.shape] if(/obj/item/organ/genital/breasts) - S = GLOB.breasts_shapes_list[genital.shape] + S = GLOB.breasts_shapes_list[G.shape] if(S?.alt_aroused) - genital.aroused_state = isPercentAroused(genital.aroused_amount) - if(getArousalLoss() >= isPercentAroused(33)) - genital.aroused_state = TRUE + G.aroused_state = isPercentAroused(G.aroused_amount) + if(getArousalLoss() >= ((max_arousal / 100) * 33)) + G.aroused_state = TRUE else - genital.aroused_state = FALSE - genital.update_appearance() + G.aroused_state = FALSE + G.update_appearance() @@ -166,13 +166,41 @@ return FALSE else if(hud_used.arousal) - var/arousal_state = "arousal0" - if(stat != DEAD) - var/arousal_percent = getPercentAroused() - var/arousal_rounded = FLOOR(arousal_percent, 10) - arousal_state = "arousal[arousal_rounded]" - hud_used.arousal.icon_state = arousal_state - return TRUE + if(stat == DEAD) + hud_used.arousal.icon_state = "arousal0" + return TRUE + if(getArousalLoss() == max_arousal) + hud_used.arousal.icon_state = "arousal100" + return TRUE + if(getArousalLoss() >= (max_arousal / 100) * 90)//M O D U L A R , W O W + hud_used.arousal.icon_state = "arousal90" + return TRUE + if(getArousalLoss() >= (max_arousal / 100) * 80)//M O D U L A R , W O W + hud_used.arousal.icon_state = "arousal80" + return TRUE + if(getArousalLoss() >= (max_arousal / 100) * 70)//M O D U L A R , W O W + hud_used.arousal.icon_state = "arousal70" + return TRUE + if(getArousalLoss() >= (max_arousal / 100) * 60)//M O D U L A R , W O W + hud_used.arousal.icon_state = "arousal60" + return TRUE + if(getArousalLoss() >= (max_arousal / 100) * 50)//M O D U L A R , W O W + hud_used.arousal.icon_state = "arousal50" + return TRUE + if(getArousalLoss() >= (max_arousal / 100) * 40)//M O D U L A R , W O W + hud_used.arousal.icon_state = "arousal40" + return TRUE + if(getArousalLoss() >= (max_arousal / 100) * 30)//M O D U L A R , W O W + hud_used.arousal.icon_state = "arousal30" + return TRUE + if(getArousalLoss() >= (max_arousal / 100) * 20)//M O D U L A R , W O W + hud_used.arousal.icon_state = "arousal10" + return TRUE + if(getArousalLoss() >= (max_arousal / 100) * 10)//M O D U L A R , W O W + hud_used.arousal.icon_state = "arousal10" + return TRUE + else + hud_used.arousal.icon_state = "arousal0" /obj/screen/arousal name = "arousal" @@ -189,654 +217,637 @@ if(M.canbearoused) ui_interact(usr) -/** - * Checks if this mob can orgasm. Criteria includes: - * - Mob is human - * - Mob is capable of arousal - * - Mob has DNA - * - Mob is aroused past a certain threshold - * - * Arguments: - * - `arousal` - The minimum arousal needed to pass the check. Default is `100`. - * - * Returns: `TRUE`/`FALSE` - Whether or not the mob passes all of the above checks. - */ -/mob/living/proc/can_orgasm(arousal=100) - if(src.canbearoused && src.getArousalLoss() >= arousal && ishuman(src) && src.has_dna()) - return TRUE - return FALSE - - -/mob/living/proc/mob_climax() +/mob/living/proc/mob_climax()//This is just so I can test this shit without being forced to add actual content to get rid of arousal. Will be a very basic proc for a while. set name = "Masturbate" set category = "IC" if(canbearoused && !restrained() && !stat) if(mb_cd_timer <= world.time) //start the cooldown even if it fails mb_cd_timer = world.time + mb_cd_length - if(isPercentAroused(33))//33% arousal or greater required + if(getArousalLoss() >= ((max_arousal / 100) * 33))//33% arousal or greater required src.visible_message("[src] starts masturbating!", \ - "You start masturbating.") + "You start masturbating.") if(do_after(src, 30, target = src)) src.visible_message("[src] relieves [p_them()]self!", \ - "You have relieved yourself.") + "You have relieved yourself.") SEND_SIGNAL(src, COMSIG_ADD_MOOD_EVENT, "orgasm", /datum/mood_event/orgasm) setArousalLoss(min_arousal) else to_chat(src, "You aren't aroused enough for that.") -/** - * Arguments: - * - `genital`: Genitals being used for this interaction. - * - `cover`: Whether or not the mob is climaxing over themselves. - * - `mb_time`: Warm-up time for this interaction. - */ -/mob/living/carbon/human/proc/mob_masturbate(obj/item/organ/genital/genital, cover=FALSE, mb_time=3 SECONDS) +//These are various procs that we'll use later, split up for readability instead of having one, huge proc. +//For all of these, we assume the arguments given are proper and have been checked beforehand. +/mob/living/carbon/human/proc/mob_masturbate(obj/item/organ/genital/G, cover = FALSE, mb_time = 30) //Masturbation, keep it gender-neutral var/total_fluids = 0 - var/datum/reagents/fluid_source = genital.get_fluid_source() - var/condomed = FALSE - var/sounded = FALSE - if(genital.name == "penis") + var/datum/reagents/fluid_source = null + var/condomed = 0 + var/sounded = 0 + + if(G.name == "penis")//if the select organ is a penis var/obj/item/organ/genital/penis/P = src.getorganslot("penis") - condomed = P.condom - sounded = P.sounding - if(!fluid_source) - to_chat(src, "Your [genital.name] is unable to produce it's own fluids, it's missing the organs for it.") - return + if(P.condom) //if the penis is condomed + condomed = 1 + if(P.sounding) + sounded = 1 + if(G.producing) //Can it produce its own fluids, such as breasts? + fluid_source = G.reagents + else + if(!G.linked_organ) + to_chat(src, "Your [G.name] is unable to produce it's own fluids, it's missing the organs for it.") + return + fluid_source = G.linked_organ.reagents total_fluids = fluid_source.total_volume if(mb_time) - src.visible_message("[src] starts to [genital.masturbation_verb] [p_their()] [genital.name].", \ - "You start to [genital.masturbation_verb] your [genital.name].", \ - "You start to [genital.masturbation_verb] your [genital.name].") + src.visible_message("[src] starts to [G.masturbation_verb] [p_their()] [G.name].", \ + "You start to [G.masturbation_verb] your [G.name].", \ + "You start to [G.masturbation_verb] your [G.name].") + if(do_after(src, mb_time, target = src)) if(total_fluids > 5 &&!condomed &&!sounded) fluid_source.reaction(src.loc, TOUCH, 1, 0) fluid_source.clear_reagents() - if(!condomed && !sounded)//For when you want to make a mess of yourself. - if(cover) - fluid_source.trans_to(src, total_fluids*genital.fluid_transfer_factor) - total_fluids -= total_fluids*genital.fluid_transfer_factor - if(total_fluids > 80) // now thats a big cum! - src.add_cum_overlay("large") - if(total_fluids > 5) - fluid_source.reaction(src.loc, TOUCH, 1, 0) - var/mob/living/carbon/human/H = src - if(H && genital.name == "penis") - H.cumdrip_rate += rand(5,10) - fluid_source.clear_reagents() - src.visible_message("[src] climaxes over [p_their()] self, using [p_their()] [genital.name]!", \ - "You orgasm over yourself, using your [genital.name].", \ - "You have climaxed over something, using your [genital.name].") - src.add_cum_overlay() - else - src.visible_message("[src] orgasms, cumming[istype(src.loc, /turf/open/floor) ? " onto [src.loc]" : ""]!", \ - "You cum[istype(src.loc, /turf/open/floor) ? " onto [src.loc]" : ""].", \ - "You have relieved yourself.") - if(condomed) //condomed - src.visible_message("[src] orgasms, climaxing into [p_their()] condom!", \ - "You cum into your condom.", \ - "You have relieved yourself.") - if(sounded) //sounded - src.visible_message("[src] orgasms, but the rod blocks anything from leaking out!", \ - "You cum with the rod inside.", \ - "You don't quite feel totally relieved.") - if(total_fluids > 0 && condomed && !sounded) - src.condomclimax() - SEND_SIGNAL(src, COMSIG_ADD_MOOD_EVENT, "orgasm", /datum/mood_event/orgasm) - if(genital.can_climax) - setArousalLoss(min_arousal) + if(!condomed && !sounded && !cover) + src.visible_message("[src] orgasms, cumming[istype(src.loc, /turf/open/floor) ? " onto [src.loc]" : ""]!", \ + "You cum[istype(src.loc, /turf/open/floor) ? " onto [src.loc]" : ""].", \ + "You have relieved yourself.") + if(!condomed &&!sounded && cover)//For when you want to make a mess of yourself. + fluid_source.trans_to(src, total_fluids*G.fluid_transfer_factor) + total_fluids -= total_fluids*G.fluid_transfer_factor + if(total_fluids > 80) // now thats a big cum! + if(isliving(src)) + var/mutable_appearance/cumoverlaylarge = mutable_appearance('hyperstation/icons/effects/cumoverlay.dmi') + cumoverlaylarge.icon_state = "cum_large" + src.add_overlay(cumoverlaylarge) -/** - * Mob climaxes using provided genitals without a partner. This is in contrast with `mob_climax_instant()`, - * which does not have a warm-up time and uses all genitals at once to climax. - * - * Arguments: - * - `genital`: The selected genitals for this interaction. Determines fluid type. - * - `mb_time`: The warm-up time for this interaction. - * - `spillage`: Whether or not climaxing causes this mob to spill fluids on the floor. - */ -/mob/living/carbon/human/proc/mob_climax_outside(obj/item/organ/genital/genital, spillage=TRUE, mb_time=3 SECONDS) - var/total_fluids = 0 - var/datum/reagents/fluid_source = genital.get_fluid_source() - var/unable_to_come = FALSE - if(fluid_source) - total_fluids = fluid_source.total_volume - else - unable_to_come = TRUE - if(unable_to_come) - src.visible_message("[src] shudders, their [genital.name] unable to cum.", \ - "Your [genital.name] cannot cum, giving no relief.", \ - "Your [genital.name] cannot cum, giving no relief.") - return - total_fluids = fluid_source.total_volume - if(mb_time) //as long as it's not instant, give a warning - src.visible_message("[src] looks like they're about to cum.", \ - "You feel yourself about to orgasm.", \ - "You feel yourself about to orgasm.") - if(do_after(src, mb_time, target = src)) - if(spillage) if(total_fluids > 5) fluid_source.reaction(src.loc, TOUCH, 1, 0) + var/mob/living/carbon/human/H = src + if(H && G.name == "penis") + H.cumdrip_rate += rand(5,10) fluid_source.clear_reagents() - src.visible_message("[src] orgasms[istype(src.loc, /turf/open/floor) ? ", spilling onto [src.loc]" : ""], with [p_their()] [genital.name]!", \ - "You climax[istype(src.loc, /turf/open/floor) ? ", spilling onto [src.loc]" : ""] with your [genital.name].", \ - "You climax using your [genital.name].") - else - src.visible_message("[src] orgasms with [p_their()] [genital.name]!", \ - "You climax with your [genital.name].", \ - "You climax using your [genital.name].") + src.visible_message("[src] climaxes over [p_their()] self, using [p_their()] [G.name]!", \ + "You orgasm over yourself, using your [G.name].", \ + "You have climaxed over something, using your [G.name].") + if(isliving(src)) + var/mutable_appearance/cumoverlay = mutable_appearance('hyperstation/icons/effects/cumoverlay.dmi') + cumoverlay.icon_state = "cum_normal" + src.add_overlay(cumoverlay) + else + src.add_cum_overlay() + + if(condomed) //condomed + src.visible_message("[src] orgasms, climaxing into [p_their()] condom ", \ + "You cum into your condom.", \ + "You have relieved yourself.") + if(sounded) //sounded + src.visible_message("[src] orgasms, but the rod blocks anything from leaking out!", \ + "You cum with the rod inside.", \ + "You don't quite feel totally relieved.") + if(total_fluids > 0 &&condomed &&!sounded) + src.condomclimax() + SEND_SIGNAL(src, COMSIG_ADD_MOOD_EVENT, "orgasm", /datum/mood_event/orgasm) - if(genital.can_climax) + if(G.can_climax) setArousalLoss(min_arousal) -/** - * Climax over a partner with a selected organ. This is external and creates spills on the partner/floor, - * and does not have a chance to impregnate. For this interaction, the partner may be an object instead of - * a person (but it cannot be an animal). - * - * Arguments: - * - `genital`: The genital being used for this interaction. Determines fluid type and volume. - * - `partner`: The thing being used as a partner. Generally an object or a person. - * - `mb_time`: The warm-up time for this interaction. Default is 3 seconds - */ -/mob/living/carbon/human/proc/mob_climax_cover(obj/item/organ/genital/genital, atom/partner, mb_time=3 SECONDS) - if(isnoncarbon(partner)) // deny animals - return FALSE - if(istype(genital, /obj/item/organ/genital/penis)) - var/obj/item/organ/genital/penis/P = genital - if(P.condom) - to_chat(src, "You cannot do this action with a condom on.") - return - if(P.sounding) - to_chat(src, "You cannot do this action with a sounding in.") - return +/mob/living/carbon/human/proc/mob_climax_outside(obj/item/organ/genital/G, mb_time = 30, spillage = TRUE) //This is used for forced orgasms and other hands-free climaxes var/total_fluids = 0 - var/datum/reagents/fluid_source = genital.get_fluid_source() - if(!fluid_source) - to_chat(src, "Your [genital.name] is unable to produce it's own fluids, it's missing the organs for it.") - return - total_fluids = fluid_source.total_volume - if(mb_time) - src.visible_message("[src] is about to climax with [partner]!", \ - "You're about to climax with [partner]!", \ - "You're preparing to climax with something!") - if(!do_after(src, mb_time, target = src)) - return - if(!in_range(src, partner)) - return - var/transferred_units = total_fluids * genital.fluid_transfer_factor - fluid_source.trans_to(partner, transferred_units) - total_fluids -= transferred_units - if(total_fluids > 5) - fluid_source.reaction(partner.loc, TOUCH, 1, 0) - fluid_source.clear_reagents() - if(ismob(partner)) - var/mob/living/carbon/partner_carbon = partner - if(partner_carbon) - var/cum_overlay = "normal" - if(total_fluids > 80) - cum_overlay = "large" - partner_carbon.add_cum_overlay(cum_overlay) - var/mob/living/carbon/human/partner_human = partner_carbon - if(partner_human) - partner_human.cumdrip_rate += rand(5,10) + var/datum/reagents/fluid_source = null + var/unable_to_come = FALSE + + if(G.producing) //Can it produce its own fluids, such as breasts? + fluid_source = G.reagents + total_fluids = fluid_source.total_volume else - partner.add_cum_overlay() - src.visible_message("[src] climaxes over [partner], using [p_their()] [genital.name]!", \ - "You orgasm over [partner], using your [genital.name].", \ - "You have climaxed over something, using your [genital.name].") - SEND_SIGNAL(src, COMSIG_ADD_MOOD_EVENT, "orgasm", /datum/mood_event/orgasm) - setArousalLoss(min_arousal) + if(!G.linked_organ) + unable_to_come = TRUE + else + fluid_source = G.linked_organ.reagents + total_fluids = fluid_source.total_volume + + if(unable_to_come) + src.visible_message("[src] shudders, their [G.name] unable to cum.", \ + "Your [G.name] cannot cum, giving no relief.", \ + "Your [G.name] cannot cum, giving no relief.") + else + total_fluids = fluid_source.total_volume + if(mb_time) //as long as it's not instant, give a warning + src.visible_message("[src] looks like they're about to cum.", \ + "You feel yourself about to orgasm.", \ + "You feel yourself about to orgasm.") + if(do_after(src, mb_time, target = src)) + if(spillage) + if(total_fluids > 5) + fluid_source.reaction(src.loc, TOUCH, 1, 0) + + fluid_source.clear_reagents() + src.visible_message("[src] orgasms[istype(src.loc, /turf/open/floor) ? ", spilling onto [src.loc]" : ""], with [p_their()] [G.name]!", \ + "You climax[istype(src.loc, /turf/open/floor) ? ", spilling onto [src.loc]" : ""] with your [G.name].", \ + "You climax using your [G.name].") + else //Else from spillage check, also note subtle text change + src.visible_message("[src] orgasms with [p_their()] [G.name]!", \ + "You climax with your [G.name].", \ + "You climax using your [G.name].") + + SEND_SIGNAL(src, COMSIG_ADD_MOOD_EVENT, "orgasm", /datum/mood_event/orgasm) + if(G.can_climax) + setArousalLoss(min_arousal) -/** - * Climax inside a partner using a selected organ. - * - * Arguments: - * - `genital`: The genital being used for this interaction. Determines type/volume of fluids. - * - `partner`: The person that this mob is climaxing in. - * - `spillage`: Whether or not the fluids will spill on the ground. - * - `remote`: Whether or not this interaction is being triggered long-distance. - * - `mb_time`: Warm-up time for this interaction. - * - * Returns: `TRUE`/`FALSE` - whether or not this interaction succeeded. - */ -/mob/living/carbon/human/proc/mob_climax_in_partner(obj/item/organ/genital/genital, mob/living/carbon/partner, spillage=TRUE, remote=FALSE, mb_time=3 SECONDS) - if(isnoncarbon(partner)) // deny animals - return FALSE +/mob/living/carbon/human/proc/mob_climax_partner(obj/item/organ/genital/G, mob/living/L, spillage = TRUE, impreg = FALSE,cover = FALSE,remote = FALSE, mb_time = 30) //Used for climaxing with any living thing var/total_fluids = 0 - var/datum/reagents/fluid_source = genital.get_fluid_source() - if(!fluid_source) - to_chat(src, "Your [genital.name] is unable to produce it's own fluids, it's missing the organs for it.") - return FALSE + var/datum/reagents/fluid_source = null + + if(G.producing) //Can it produce its own fluids, such as breasts? + fluid_source = G.reagents + else + if(!G.linked_organ) + to_chat(src, "Your [G.name] is unable to produce it's own fluids, it's missing the organs for it.") + return + fluid_source = G.linked_organ.reagents total_fluids = fluid_source.total_volume - var/partner_text = partner + + if(mb_time && !remote) //Skip warning if this is an instant climax. + src.visible_message("[src] is about to climax with [L]!", \ + "You're about to climax with [L]!", \ + "You're preparing to climax with something!") if(remote) - partner_text = "someone" - src.visible_message("[src] is about to climax with [partner_text]!", \ - "You're about to climax with [partner_text]!", \ - "You're preparing to climax with something!") - if(!do_after(src, mb_time, target = src)) - return FALSE - if(!remote && !in_range(src, partner)) - return FALSE - if(spillage) - fluid_source.trans_to(partner, total_fluids*genital.fluid_transfer_factor) - total_fluids -= total_fluids*genital.fluid_transfer_factor - if(total_fluids > 5) - fluid_source.reaction(partner.loc, TOUCH, 1, 0) - var/mob/living/carbon/human/H = partner - if(H) - H.cumdrip_rate += rand(5,10) - fluid_source.clear_reagents() - src.visible_message("[src] climaxes with [partner], overflowing and spilling, using [p_their()] [genital.name]!",\ - "You orgasm with [partner], spilling out of them, using your [genital.name].",\ - "You have climaxed with someone, spilling out of them, using your [genital.name].") - SEND_SIGNAL(src, COMSIG_ADD_MOOD_EVENT, "orgasm", /datum/mood_event/orgasm) - SEND_SIGNAL(partner, COMSIG_ADD_MOOD_EVENT, "orgasm", /datum/mood_event/orgasm) + src.visible_message("[src] is about to climax with someone!", \ + "You're about to climax with someone!", \ + "You're preparing to climax with something!") + + if(cover)//covering the partner in cum, this overrides other options. + if(do_after(src, mb_time, target = src) && in_range(src, L)) + fluid_source.trans_to(L, total_fluids*G.fluid_transfer_factor) + total_fluids -= total_fluids*G.fluid_transfer_factor + if(total_fluids > 80) // now thats a big cum! + if(isliving(L)) + var/mutable_appearance/cumoverlaylarge = mutable_appearance('hyperstation/icons/effects/cumoverlay.dmi') + cumoverlaylarge.icon_state = "cum_large" + L.add_overlay(cumoverlaylarge) + + if(total_fluids > 5) + fluid_source.reaction(L.loc, TOUCH, 1, 0) + var/mob/living/carbon/human/H = L + if(H) + H.cumdrip_rate += rand(5,10) + fluid_source.clear_reagents() + src.visible_message("[src] climaxes over [L], using [p_their()] [G.name]!", \ + "You orgasm over [L], using your [G.name].", \ + "You have climaxed over something, using your [G.name].") + SEND_SIGNAL(src, COMSIG_ADD_MOOD_EVENT, "orgasm", /datum/mood_event/orgasm) + + if(isliving(L)) + var/mutable_appearance/cumoverlay = mutable_appearance('hyperstation/icons/effects/cumoverlay.dmi') + cumoverlay.icon_state = "cum_normal" + L.add_overlay(cumoverlay) + else + L.add_cum_overlay() + + setArousalLoss(min_arousal) + if(G.can_climax) + setArousalLoss(min_arousal) + + if(spillage && !cover) + if(do_after(src, mb_time, target = src)) + if(!in_range(src, L) && !remote) + return + fluid_source.trans_to(L, total_fluids*G.fluid_transfer_factor) + total_fluids -= total_fluids*G.fluid_transfer_factor + if(total_fluids > 5) + fluid_source.reaction(L.loc, TOUCH, 1, 0) + var/mob/living/carbon/human/H = L + if(H) + H.cumdrip_rate += rand(5,10) + fluid_source.clear_reagents() + src.visible_message("[src] climaxes with [L][spillage ? ", overflowing and spilling":""], using [p_their()] [G.name]!", \ + "You orgasm with [L][spillage ? ", spilling out of them":""], using your [G.name].", \ + "You have climaxed with someone[spillage ? ", spilling out of them":""], using your [G.name].") + SEND_SIGNAL(src, COMSIG_ADD_MOOD_EVENT, "orgasm", /datum/mood_event/orgasm) + SEND_SIGNAL(L, COMSIG_ADD_MOOD_EVENT, "orgasm", /datum/mood_event/orgasm) + + if(G.can_climax) + setArousalLoss(min_arousal) + else //knots, portal fleshlights, and other non-spilling orgasms - var/can_inflate = TRUE - if(istype(genital, /obj/item/organ/genital/penis)) - var/obj/item/organ/genital/penis/P = genital - if(P.condom)//condomed. - can_inflate = FALSE - src.condomclimax() - if(can_inflate) - fluid_source.trans_to(partner, total_fluids) - if(!spillage && total_fluids > 80) // hyper - cum inflation, ONLY if not wearing a condom - partner.expand_belly(1) - src.visible_message("[src] climaxes with [partner_text], [p_their()] [genital.name] spilling nothing!", \ - "You ejaculate with [partner_text], your [genital.name] spilling nothing.", \ - "You have climaxed inside someone, your [genital.name] spilling nothing.") - if(remote) - to_chat(partner, "You feel someone ejaculate inside you.") - SEND_SIGNAL(src, COMSIG_ADD_MOOD_EVENT, "orgasm", /datum/mood_event/orgasm) - SEND_SIGNAL(partner, COMSIG_ADD_MOOD_EVENT, "orgasm", /datum/mood_event/orgasm) - if(genital.can_climax) - setArousalLoss(min_arousal) + if(!cover) + if(!remote && !in_range(src, L)) + return + if(do_after(src, mb_time, target = src)) + var/mob/living/carbon/H = L + if(!spillage && total_fluids > 80) //hyper inflation; requires a big cumshot to expand + H.expand_belly(1) + var/obj/item/organ/genital/penis/P = G + if (P.condom)//condomed. + src.condomclimax() + else + fluid_source.trans_to(L, total_fluids) + total_fluids = 0 + if(!remote) + src.visible_message("[src] climaxes with [L], [p_their()] [G.name] spilling nothing!", \ + "You ejaculate with [L], your [G.name] spilling nothing.", \ + "You have climaxed inside someone, your [G.name] spilling nothing.") + else + src.visible_message("[src] climaxes with someone, using [p_their()] [G.name]!", \ + "You ejaculate with someone, using your [G.name].", \ + "You have climaxed inside someone, using your [G.name].") + to_chat(L, "You feel someone ejaculate inside you.") + + SEND_SIGNAL(src, COMSIG_ADD_MOOD_EVENT, "orgasm", /datum/mood_event/orgasm) + SEND_SIGNAL(L, COMSIG_ADD_MOOD_EVENT, "orgasm", /datum/mood_event/orgasm) + + if(G.can_climax) + setArousalLoss(min_arousal) + //Hyper - antag code - var/mob/living/carbon/partner_carbon = partner if(src.mind.special_role == ROLE_LEWD_TRAITOR) for(var/datum/objective/obj in src.mind.objectives) - if (partner_carbon.mind == obj.target) - partner_carbon.mind.sexed = TRUE //sexed + if (L.mind == obj.target) + L.mind.sexed = TRUE //sexed to_chat(src, "You feel deep satisfaction with yourself.") - return TRUE + + //Hyper - impreg + if(impreg) + //Role them odds, only people with the dicks can send the chance to the person with the settings enabled at the momment. + if(prob(L.impregchance)) + var/obj/item/organ/genital/womb/W = L.getorganslot("womb") + if(W) //check if they have a womb. + if (L.breedable == 1 && W.pregnant == 0) //Dont get pregnant again, if you are pregnant. + log_game("Debug: [L] has been impregnated by [src]") + to_chat(L, "You feel your hormones change, and a motherly instinct take over.") //leting them know magic has happened. + W.pregnant = 1 + if (HAS_TRAIT(L, TRAIT_HEAT)) + SEND_SIGNAL(L, COMSIG_ADD_MOOD_EVENT, "heat", /datum/mood_event/heat) //well done you perv. + REMOVE_TRAIT(L, TRAIT_HEAT, ROUNDSTART_TRAIT) //take the heat away, you satisfied it! + + //Make breasts produce quicker. + var/obj/item/organ/genital/breasts/B = L.getorganslot("breasts") + if (B.fluid_mult < 0.5 && B) + B.fluid_mult = 0.5 -/** - * User chooses whether or not their climax will spill outside of their partner. - * - * Arguments: - * - `picked_organ`: The user's genital being used. - * - `partner`: This mob's partner for the interaction. - * - `impreg`: Whether or not this interaction has a chance to impregnate. - */ -/mob/living/carbon/human/proc/mob_climax_inside_spillage(obj/item/organ/genital/picked_organ, mob/living/carbon/partner, impreg=FALSE) - var/obj/item/organ/genital/penis/_penis = picked_organ - if(picked_organ.name != "penis" || _penis.sounding || _penis.condom) - mob_climax_in_partner(picked_organ, partner, spillage=FALSE) - return - var/_question = "Would your fluids spill outside?" - var/_title = "Choose overflowing option" - var/spillage = input(src, _question, _title, "Yes") as anything in list("Yes", "No") - if(mob_climax_in_partner(picked_organ, partner, spillage == "Yes") && impreg) - partner.impregnate(by=src) +/mob/living/carbon/human/proc/mob_fill_container(obj/item/organ/genital/G, obj/item/reagent_containers/container, mb_time = 30) //For beaker-filling, beware the bartender + var/total_fluids = 0 + var/datum/reagents/fluid_source = null -/** - * Attempt to climax into a container it, filling it with whatever fluids are - * associated to the selected genitals. - * - * Arguments: - * - `genital`: The genital being used for climax. - * - `container`: The container being targeted. - * - `mb_time`: The warm-up time for this interaction. - */ -/mob/living/carbon/human/proc/mob_fill_container(obj/item/organ/genital/genital, obj/item/reagent_containers/container, mb_time=3 SECONDS) + if(G.name == "penis")//if the select organ is a penis + var/obj/item/organ/genital/penis/P = src.getorganslot("penis") + if(P.condom) //if the penis is condomed + to_chat(src, "You cannot fill containers when there is a condom over your [G.name].") + return + if(P.sounding) //if the penis is sounded + to_chat(src, "You cannot fill containers when there is a rod inside your [G.name].") + return + if(G.producing) //Can it produce its own fluids, such as breasts? + fluid_source = G.reagents + else + if(!G.linked_organ) + to_chat(src, "Your [G.name] is unable to produce it's own fluids, it's missing the organs for it.") + return + fluid_source = G.linked_organ.reagents + total_fluids = fluid_source.total_volume + if(!container) //Something weird happened to_chat(src, "You need a container to do this!") return - var/total_fluids = 0 - var/datum/reagents/fluid_source = genital.get_fluid_source() - if(!fluid_source) - to_chat(src, "Your [genital.name] is unable to produce it's own fluids, it's missing the organs for it.") - return - total_fluids = fluid_source.total_volume - if(genital.name == "penis") - var/obj/item/organ/genital/penis/P = src.getorganslot("penis") - if(P.condom) - to_chat(src, "You cannot fill containers when there is a condom over your [genital.name].") - return - if(P.sounding) - to_chat(src, "You cannot fill containers when there is a rod inside your [genital.name].") - return - src.visible_message("[src] starts to [genital.masturbation_verb] their [genital.name] over [container].", \ - "You start to [genital.masturbation_verb] your [genital.name] over [container].", \ - "You start to [genital.masturbation_verb] your [genital.name] over something.") + + src.visible_message("[src] starts to [G.masturbation_verb] their [G.name] over [container].", \ + "You start to [G.masturbation_verb] your [G.name] over [container].", \ + "You start to [G.masturbation_verb] your [G.name] over something.") if(do_after(src, mb_time, target = src) && in_range(src, container)) fluid_source.trans_to(container, total_fluids) - src.visible_message("[src] uses [p_their()] [genital.name] to fill [container]!", \ - "You used your [genital.name] and fill [container] with a total of [total_fluids]u's.", \ - "You have relieved some pressure.") + src.visible_message("[src] uses [p_their()] [G.name] to fill [container]!", \ + "You used your [G.name] and fill [container] with a total of [total_fluids]u's.", \ + "You have relieved some pressure.") SEND_SIGNAL(src, COMSIG_ADD_MOOD_EVENT, "orgasm", /datum/mood_event/orgasm) container.add_cum_overlay() //your aim is bad... - if(genital.can_climax) + if(G.can_climax) setArousalLoss(min_arousal) -/** - * Prompts the user to select one of their target's genitals to interact with. - * The target must have their genitals visible to be selectable. - * - * Returns: `null`|`obj/item/organ/genital`: The selected genital. - */ -/mob/living/carbon/human/proc/target_genitals(mob/living/carbon/human/T) +/mob/living/carbon/human/proc/pick_masturbate_genitals() var/obj/item/organ/genital/ret_organ var/list/genitals_list = list() - for(var/obj/item/organ/genital/genital in T.internal_organs) - if(genital.is_exposed() && !genital.dontlist) - genitals_list += genital + var/list/worn_stuff = get_equipped_items() + + for(var/obj/item/organ/genital/G in internal_organs) + if(G.can_masturbate_with) //filter out what you can't masturbate with + if(G.is_exposed(worn_stuff)) //Nude or through_clothing + if(!G.dontlist) + genitals_list += G + if(genitals_list.len) + ret_organ = input(src, "with what?", "Masturbate", null) as null|obj in genitals_list + return ret_organ + return null //error stuff + +/mob/living/carbon/human/proc/target_genitals(mob/living/carbon/human/T) //used for targeting others + var/obj/item/organ/genital/ret_organ + var/list/genitals_list = list() + var/list/worn_stuff = get_equipped_items() + + for(var/obj/item/organ/genital/G in T.internal_organs) + if(G.is_exposed(worn_stuff)) //Nude or through_clothing + if(!G.dontlist) + genitals_list += G if(genitals_list.len) ret_organ = input(src, "", "Genitals", null) as null|obj in genitals_list return ret_organ return null //error stuff - -/** - * Prompts the user to select genitals. The genitals must be exposed to be selectable. - * - * Arguments: - * - `masturbation`: Whether or not this is being used for masturbation interactions. - * - `title`: The title of the prompt window. - * - * Returns: `null`|`obj/item/organ/genital`: The selected genital. - */ -/mob/living/carbon/human/proc/pick_climax_genitals(masturbation=FALSE, title="Climax") +/mob/living/carbon/human/proc/pick_climax_genitals() var/obj/item/organ/genital/ret_organ var/list/genitals_list = list() - for(var/obj/item/organ/genital/genital in internal_organs) - if(genital.can_climax && genital.is_exposed() && !genital.dontlist) - if(!masturbation || genital.can_masturbate_with) - genitals_list += genital + var/list/worn_stuff = get_equipped_items() + + for(var/obj/item/organ/genital/G in internal_organs) + if(G.can_climax) //filter out what you can't masturbate with + if(G.is_exposed(worn_stuff)) //Nude or through_clothing + if(!G.dontlist) + genitals_list += G if(genitals_list.len) - ret_organ = input(src, "with what?", title, null) as null|obj in genitals_list + ret_organ = input(src, "with what?", "Climax", null) as null|obj in genitals_list return ret_organ return null //error stuff - -/** - * Prompts the user to select a mob that they are either pulling or being pulled by. - * - * Arguments: - * - `needs_exposed`: Whether or not the partner must have exposed genitals. - * Returns: `null`|`mob/living/carbon`: The selected mob. - */ -/mob/living/carbon/human/proc/pick_partner(needs_exposed=TRUE) - var/list/partners = list(src.pulling, src.pulledby) +/mob/living/carbon/human/proc/pick_partner_overide() //used for cumming on people without genitals exposed + var/list/partners = list() + if(src.pulling) + partners += src.pulling //Yes, even objects for now + if(src.pulledby) + partners += src.pulledby + //Now we got both of them, let's check if they're proper for(var/I in partners) - if(!iscarbon(I)) - partners -= I - continue - if(!needs_exposed) - continue - var/mob/living/carbon/C = I - if(!C.exposed_genitals.len && !C.is_groin_exposed() && !C.is_chest_exposed()) - partners -= I + if(isliving(I)) + else + partners -= I //No fucking objects + //NOW the list should only contain correct partners if(!partners.len) - return null - return input(src, "With whom?", "Sexual partner", null) as null|mob in partners + return null //No one left. + return input(src, "With whom?", "Sexual partner", null) in partners //pick one, default to null +/mob/living/carbon/human/proc/pick_partner() + var/list/partners = list() + if(src.pulling) + partners += src.pulling //Yes, even objects for now + if(src.pulledby) + partners += src.pulledby + //Now we got both of them, let's check if they're proper + for(var/I in partners) + if(isliving(I)) + if(iscarbon(I)) + var/mob/living/carbon/C = I + if(!C.exposed_genitals.len) //Nothing through_clothing + if(!C.is_groin_exposed()) //No pants undone + if(!C.is_chest_exposed()) //No chest exposed + partners -= I //Then not proper, remove them + else + partners -= I //No fucking objects + //NOW the list should only contain correct partners + if(!partners.len) + return null //No one left. + return input(src, "With whom?", "Sexual partner", null) in partners //pick one, default to null -/** - * Prompts the user to provide a container (or food item) based on what's in their hands. - * - * Returns: `null`|`obj/item/reagent_containers` - The selected container. - */ /mob/living/carbon/human/proc/pick_climax_container() var/obj/item/reagent_containers/SC = null var/list/containers_list = list() + for(var/obj/item/reagent_containers/container in held_items) if(container.is_open_container() || istype(container, /obj/item/reagent_containers/food/snacks)) containers_list += container + if(containers_list.len) - SC = input(src, "Into or onto what? (Cancel for nowhere)", null) as null|obj in containers_list + SC = input(src, "Into or onto what?(Cancel for nowhere)", null) as null|obj in containers_list if(SC) if(in_range(src, SC)) return SC - return null + return null //If nothing correct, give null. -/** - * The old arousal menu. This shows a BYOND-style input selection menu that - * emulates the same functionality as the newer one. - */ -/mob/living/carbon/human/mob_climax() - if(!canbearoused || !has_dna()) +//Here's the main proc itself +/mob/living/carbon/human/mob_climax(forced_climax=FALSE) //Forced is instead of the other proc, makes you cum if you have the tools for it, ignoring restraints + if(stat == DEAD) //corpses can't cum return if(mb_cd_timer > world.time) - to_chat(src, "You need to wait [DisplayTimeText((mb_cd_timer - world.time), TRUE)] before you can do that again!") + if(!forced_climax) //Don't spam the message to the victim if forced to come too fast + to_chat(src, "You need to wait [DisplayTimeText((mb_cd_timer - world.time), TRUE)] before you can do that again!") return mb_cd_timer = (world.time + mb_cd_length) - if(stat == DEAD) - to_chat(src, "You can't do that while dead!") - return - if(stat == UNCONSCIOUS) - to_chat(src, "You must be conscious to do that!") - return - if(getArousalLoss() < 33) - to_chat(src, "You aren't aroused enough for that!") - return - var/list/choices = list("Masturbate", "Climax alone", "Climax with partner","Climax over partner", "Fill container", "Remove condom", "Remove sounding rod") - var/choice = input(src, "Select sexual activity", "Sexual activity:") as null|anything in choices - switch(choice) - if("Remove sounding rod") - if(restrained(TRUE)) //TRUE ignores grabs - to_chat(src, "You can't do that while restrained!") - return - var/free_hands = get_num_arms() - if(!free_hands) - to_chat(src, "You need at least one free arm.") - return - var/obj/item/organ/genital/penis/P = src.getorganslot("penis") - if(!P.sounding) - to_chat(src, "You don't have a rod inside!") - return - if(P.sounding) - to_chat(src, "You pull the rod off from the tip of your penis!") - src.removesounding() - return + + + if(canbearoused && has_dna()) + if(stat==2) + to_chat(src, "You can't do that while dead!") + return + if(forced_climax) //Something forced us to cum, this is not a masturbation thing and does not progress to the other checks + for(var/obj/item/organ/O in internal_organs) + if(istype(O, /obj/item/organ/genital)) + var/obj/item/organ/genital/G = O + if(!G.can_climax) //Skip things like wombs and testicles + continue + var/mob/living/partner + var/check_target + var/list/worn_stuff = get_equipped_items() + + if(G.is_exposed(worn_stuff)) + if(src.pulling) //Are we pulling someone? Priority target, we can't be making option menus for this, has to be quick + if(isliving(src.pulling)) //Don't fuck objects + check_target = src.pulling + if(src.pulledby && !check_target) //prioritise pulled over pulledby + if(isliving(src.pulledby)) + check_target = src.pulledby + //Now we should have a partner, or else we have to come alone + if(check_target) + if(iscarbon(check_target)) //carbons can have clothes + var/mob/living/carbon/C = check_target + if(C.exposed_genitals.len || C.is_groin_exposed() || C.is_chest_exposed()) //Are they naked enough? + partner = C + if(partner) //Did they pass the clothing checks? + mob_climax_partner(G, partner, mb_time = 0) //Instant climax due to forced + continue //You've climaxed once with this organ, continue on + //not exposed OR if no partner was found while exposed, climax alone + mob_climax_outside(G, mb_time = 0) //removed climax timer for sudden, forced orgasms + //Now all genitals that could climax, have. + //Since this was a forced climax, we do not need to continue with the other stuff + return + //If we get here, then this is not a forced climax and we gotta check a few things. + + if(stat==1) //No sleep-masturbation, you're unconscious. + to_chat(src, "You must be conscious to do that!") + return + if(getArousalLoss() < 33) //flat number instead of percentage + to_chat(src, "You aren't aroused enough for that!") return - if("Remove condom") - if(restrained(TRUE)) //TRUE ignores grabs - to_chat(src, "You can't do that while restrained!") - return - var/free_hands = get_num_arms() - if(!free_hands) - to_chat(src, "You need at least one free arm.") - return - var/obj/item/organ/genital/penis/P = src.getorganslot("penis") - if(!P.condom) - to_chat(src, "You don't have a condom on!") - return - if(P.condom) - to_chat(src, "You tug the condom off the end of your penis!") - src.removecondom() - return - return + //Ok, now we check what they want to do. + var/choice = input(src, "Select sexual activity", "Sexual activity:") in list("Masturbate", "Climax alone", "Climax with partner","Climax over partner", "Fill container", "Remove condom", "Remove sounding rod") - if("Masturbate") - if(restrained(TRUE)) //TRUE ignores grabs - to_chat(src, "You can't do that while restrained!") - return - var/free_hands = get_num_arms() - if(!free_hands) - to_chat(src, "You need at least one free arm.") - return - for(var/helditem in held_items)//how many hands are free - if(isobj(helditem)) - free_hands-- - if(free_hands <= 0) - to_chat(src, "You're holding too many things.") - return - //We got hands, let's pick an organ - var/obj/item/organ/genital/picked_organ - picked_organ = pick_climax_genitals(masturbation=TRUE, title="Masturbation") - if(picked_organ) - mob_masturbate(picked_organ) - return - else //They either lack organs that can masturbate, or they didn't pick one. - to_chat(src, "You cannot masturbate without choosing genitals.") - return - - if("Climax alone") - if(restrained(TRUE)) //TRUE ignores grabs - to_chat(src, "You can't do that while restrained!") - return - var/free_hands = get_num_arms() - if(!free_hands) - to_chat(src, "You need at least one free arm.") - return - for(var/helditem in held_items)//how many hands are free - if(isobj(helditem)) - free_hands-- - if(free_hands <= 0) - to_chat(src, "You're holding too many things.") - return - //We got hands, let's pick an organ - var/obj/item/organ/genital/picked_organ - picked_organ = pick_climax_genitals() - if(picked_organ) - mob_climax_outside(picked_organ) - return - else //They either lack organs that can masturbate, or they didn't pick one. - to_chat(src, "You cannot climax without choosing genitals.") - return - - if("Climax with partner") - //We need no hands, we can be restrained and so on, so let's pick an organ - var/obj/item/organ/genital/picked_organ - picked_organ = pick_climax_genitals() - if(!picked_organ) - to_chat(src, "You cannot climax without choosing genitals.") - return - var/mob/living/carbon/partner = pick_partner() //Get someone - if(!partner) - to_chat(src, "You cannot do this alone.") - return - var/obj/item/organ/genital/penis/P = picked_organ - var/impreg = "No" - if(partner.breedable && picked_organ.name == "penis" && !P.condom && !P.sounding) - var/impreg_question = "Would this action carry the risk of pregnancy?" - var/impreg_title = "Choose a option" - impreg = input(src, impreg_question, impreg_title, "Yes") as anything in list("Yes", "No") - mob_climax_inside_spillage(picked_organ, partner, impreg == "Yes") - - if("Climax over partner") - var/obj/item/organ/genital/picked_organ - picked_organ = pick_climax_genitals() - if(picked_organ) - var/mob/living/carbon/partner = pick_partner(needs_exposed=FALSE) //Get your partner, clothed or not. - if(partner) - mob_climax_cover(picked_organ, partner) - else - to_chat(src, "You cannot do this alone.") - - if("Fill container") - //We'll need hands and no restraints. - if(restrained(TRUE)) //TRUE ignores grabs - to_chat(src, "You can't do that while restrained!") - return - var/free_hands = get_num_arms() - if(!free_hands) - to_chat(src, "You need at least one free arm.") - return - for(var/helditem in held_items)//how many hands are free - if(isobj(helditem)) - free_hands-- - if(free_hands <= 0) - to_chat(src, "You're holding too many things.") - return - //We got hands, let's pick an organ - var/obj/item/organ/genital/picked_organ - picked_organ = pick_climax_genitals() //Gotta be climaxable, not just masturbation, to fill with fluids. - if(picked_organ) - //Good, got an organ, time to pick a container - var/obj/item/reagent_containers/fluid_container = pick_climax_container() - if(fluid_container) - mob_fill_container(picked_organ, fluid_container) + switch(choice) + if("Remove sounding rod") + if(restrained(TRUE)) //TRUE ignores grabs + to_chat(src, "You can't do that while restrained!") return - else - to_chat(src, "You cannot do this without anything to fill.") + var/free_hands = get_num_arms() + if(!free_hands) + to_chat(src, "You need at least one free arm.") + return + var/obj/item/organ/genital/penis/P = src.getorganslot("penis") + if(!P.sounding) + to_chat(src, "You don't have a rod inside!") + return + if(P.sounding) + to_chat(src, "You pull the rod off from the tip of your penis!") + src.removesounding() return - else //They either lack organs that can climax, or they didn't pick one. - to_chat(src, "You cannot fill anything without choosing genitals.") return - else //Somehow another option was taken, maybe something interrupted the selection or it was cancelled - return //Just end it in that case. + if("Remove condom") + if(restrained(TRUE)) //TRUE ignores grabs + to_chat(src, "You can't do that while restrained!") + return + var/free_hands = get_num_arms() + if(!free_hands) + to_chat(src, "You need at least one free arm.") + return + var/obj/item/organ/genital/penis/P = src.getorganslot("penis") + if(!P.condom) + to_chat(src, "You don't have a condom on!") + return + if(P.condom) + to_chat(src, "You tug the condom off the end of your penis!") + src.removecondom() + return + return -/** - * Causes a mob to climax on the spot. There is no warmup time, nor a - * menu for selecting genitals. Instead, the mob will climax using all - * climaxable genitals, either onto their location (floor) or on whatever - * is pulling/being pulled by them. - */ -/mob/living/carbon/proc/mob_climax_instant(arousal=100) - if(stat == DEAD) //corpses can't cum - to_chat(src, "You can't do that while dead!") - return - if(!can_orgasm(arousal)) - return - var/mob/living/carbon/human/user_human = src - for(var/obj/item/organ/O in internal_organs) - if(!istype(O, /obj/item/organ/genital)) - continue - var/obj/item/organ/genital/current_genital = O - if(!current_genital.can_climax) - continue // no wombs or testicles - var/mob/living/carbon/partner - var/check_target - if(current_genital.is_exposed()) - if(src.pulling) - if(iscarbon(src.pulling)) - check_target = src.pulling - else if(src.pulledby) - if(iscarbon(src.pulledby)) - check_target = src.pulledby - if(check_target) - var/mob/living/carbon/C = check_target - if(C.exposed_genitals.len || C.is_groin_exposed() || C.is_chest_exposed()) - partner = C - if(partner) - user_human.mob_climax_in_partner(current_genital, partner, mb_time=0) - continue - user_human.mob_climax_outside(current_genital, mb_time=0) - return + if("Masturbate") + if(restrained(TRUE)) //TRUE ignores grabs + to_chat(src, "You can't do that while restrained!") + return + var/free_hands = get_num_arms() + if(!free_hands) + to_chat(src, "You need at least one free arm.") + return + for(var/helditem in held_items)//how many hands are free + if(isobj(helditem)) + free_hands-- + if(free_hands <= 0) + to_chat(src, "You're holding too many things.") + return + //We got hands, let's pick an organ + var/obj/item/organ/genital/picked_organ + picked_organ = pick_masturbate_genitals() + if(picked_organ) + mob_masturbate(picked_organ) + return + else //They either lack organs that can masturbate, or they didn't pick one. + to_chat(src, "You cannot masturbate without choosing genitals.") + return + if("Climax alone") + if(restrained(TRUE)) //TRUE ignores grabs + to_chat(src, "You can't do that while restrained!") + return + var/free_hands = get_num_arms() + if(!free_hands) + to_chat(src, "You need at least one free arm.") + return + for(var/helditem in held_items)//how many hands are free + if(isobj(helditem)) + free_hands-- + if(free_hands <= 0) + to_chat(src, "You're holding too many things.") + return + //We got hands, let's pick an organ + var/obj/item/organ/genital/picked_organ + picked_organ = pick_climax_genitals() + if(picked_organ) + mob_climax_outside(picked_organ) + return + else //They either lack organs that can masturbate, or they didn't pick one. + to_chat(src, "You cannot climax without choosing genitals.") + return + + if("Climax with partner") + //We need no hands, we can be restrained and so on, so let's pick an organ + var/obj/item/organ/genital/picked_organ + picked_organ = pick_climax_genitals() + if(picked_organ) + var/mob/living/partner = pick_partner() //Get someone + if(partner) + var/obj/item/organ/genital/penis/P = picked_organ + if(partner.breedable == 1 && picked_organ.name == "penis"&&!P.condom == 1&&!P.sounding == 1) + var/impreg = input(src, "Would this action carry the risk of pregnancy?", "Choose a option", "Yes") as anything in list("Yes", "No") + if(impreg == "Yes") //If we are impregging + var/spillage = input(src, "Would your fluids spill outside?", "Choose overflowing option", "Yes") as anything in list("Yes", "No") + if(spillage == "Yes") + mob_climax_partner(picked_organ, partner, TRUE, TRUE, FALSE) + else + mob_climax_partner(picked_organ, partner, FALSE, TRUE, FALSE) + else + var/spillage = input(src, "Would your fluids spill outside?", "Choose overflowing option", "Yes") as anything in list("Yes", "No") + if(spillage == "Yes") + mob_climax_partner(picked_organ, partner, TRUE, FALSE, FALSE) + else + mob_climax_partner(picked_organ, partner, FALSE, FALSE, FALSE) //Wow, im trash at coding, I need to find a better way of coding this, ill rewrite it later.-quote + return + + else //If we arent impregging + var/spillage = input(src, "Would your fluids spill outside?", "Choose overflowing option", "Yes") as anything in list("Yes", "No") + if(spillage == "Yes") + mob_climax_partner(picked_organ, partner, TRUE, FALSE, FALSE) + else + mob_climax_partner(picked_organ, partner, FALSE, FALSE, FALSE) + return + + else + to_chat(src, "You cannot do this alone.") + return + else //They either lack organs that can masturbate, or they didn't pick one. + to_chat(src, "You cannot climax without choosing genitals.") + return + if("Climax over partner") + var/obj/item/organ/genital/picked_organ + picked_organ = pick_climax_genitals() + if(picked_organ) + var/mob/living/partner = pick_partner_overide() //Get your partner, clothed or not. + if(partner) + mob_climax_partner(picked_organ, partner, FALSE, FALSE, TRUE) + else + to_chat(src, "You cannot do this alone.") + + if("Fill container") + //We'll need hands and no restraints. + if(restrained(TRUE)) //TRUE ignores grabs + to_chat(src, "You can't do that while restrained!") + return + var/free_hands = get_num_arms() + if(!free_hands) + to_chat(src, "You need at least one free arm.") + return + for(var/helditem in held_items)//how many hands are free + if(isobj(helditem)) + free_hands-- + if(free_hands <= 0) + to_chat(src, "You're holding too many things.") + return + //We got hands, let's pick an organ + var/obj/item/organ/genital/picked_organ + picked_organ = pick_climax_genitals() //Gotta be climaxable, not just masturbation, to fill with fluids. + if(picked_organ) + //Good, got an organ, time to pick a container + var/obj/item/reagent_containers/fluid_container = pick_climax_container() + if(fluid_container) + mob_fill_container(picked_organ, fluid_container) + return + else + to_chat(src, "You cannot do this without anything to fill.") + return + else //They either lack organs that can climax, or they didn't pick one. + to_chat(src, "You cannot fill anything without choosing genitals.") + return + else //Somehow another option was taken, maybe something interrupted the selection or it was cancelled + return //Just end it in that case. -/** - * Rolls a chance for the mob to get pregnant, assuming they are capable of doing so. - * - * Arguments: - * - `by` - The mob that is impregnating this one. - */ -/mob/living/carbon/proc/impregnate(mob/living/carbon/by) - var/obj/item/organ/genital/womb/W = getorganslot("womb") - if(!W || W.pregnant || !breedable) - return - if(!prob(impregchance)) - return - W.pregnant = TRUE - log_game("DEBUG: [src] has been impregnated by [by]") - to_chat(src, "You feel your hormones change, and a motherly instinct take over.") - if(HAS_TRAIT(src, TRAIT_HEAT)) - SEND_SIGNAL(src, COMSIG_ADD_MOOD_EVENT, "heat", /datum/mood_event/heat) - REMOVE_TRAIT(src, TRAIT_HEAT, ROUNDSTART_TRAIT) - var/obj/item/organ/genital/breasts/B = src.getorganslot("breasts") - if (B && B.fluid_mult < 0.5) - B.fluid_mult = 0.5 \ No newline at end of file diff --git a/modular_citadel/code/modules/arousal/organs/anus.dm b/modular_citadel/code/modules/arousal/organs/anus.dm index 73cedd56d..11a31bc68 100644 --- a/modular_citadel/code/modules/arousal/organs/anus.dm +++ b/modular_citadel/code/modules/arousal/organs/anus.dm @@ -36,12 +36,6 @@ size_name = "hefty" if(5) size_name = "godly" - if(6) - size_name = "gigantic" - if(7) - size_name = "unfathomably large" - if(8) - size_name = "absolute dumptruck" else size_name = "nonexistant" diff --git a/modular_citadel/code/modules/arousal/organs/genitals.dm b/modular_citadel/code/modules/arousal/organs/genitals.dm index 9edea910a..bdf4d7856 100644 --- a/modular_citadel/code/modules/arousal/organs/genitals.dm +++ b/modular_citadel/code/modules/arousal/organs/genitals.dm @@ -78,21 +78,22 @@ if("Always visible") through_clothes = TRUE hidden = FALSE - mode = GENITALS_VISIBLE + mode = "visible" if(!(src in owner.exposed_genitals)) owner.exposed_genitals += src if("Hidden by clothes") through_clothes = FALSE hidden = FALSE - mode = GENITALS_CLOTHES + mode = "clothes" if(src in owner.exposed_genitals) owner.exposed_genitals -= src if("Always hidden") through_clothes = FALSE hidden = TRUE - mode = GENITALS_HIDDEN + mode = "hidden" if(src in owner.exposed_genitals) owner.exposed_genitals -= src + if(ishuman(owner)) //recast to use update genitals proc var/mob/living/carbon/human/H = owner H.update_genitals() diff --git a/modular_citadel/code/modules/client/loadout/shoes.dm b/modular_citadel/code/modules/client/loadout/shoes.dm index 284a9afde..d4da69d2c 100644 --- a/modular_citadel/code/modules/client/loadout/shoes.dm +++ b/modular_citadel/code/modules/client/loadout/shoes.dm @@ -111,9 +111,4 @@ /datum/gear/cowboyboots/black name = "Cowboy Boots, Black" category = SLOT_SHOES - path = /obj/item/clothing/shoes/cowboyboots/black - -/datum/gear/threepwoodboots - name = "theepwood's boots" - category = SLOT_SHOES - path = /obj/item/clothing/shoes/threepwoodboots + path = /obj/item/clothing/shoes/cowboyboots/black diff --git a/modular_citadel/code/modules/client/loadout/suit.dm b/modular_citadel/code/modules/client/loadout/suit.dm index eb02a07db..7797e1f7b 100644 --- a/modular_citadel/code/modules/client/loadout/suit.dm +++ b/modular_citadel/code/modules/client/loadout/suit.dm @@ -259,8 +259,3 @@ name = "Bathrobe" category = SLOT_WEAR_SUIT path = /obj/item/clothing/suit/bathrobe - -/datum/gear/uniform/threepwoodjacket - name = "threepwood's jacket" - category = SLOT_WEAR_SUIT - path = /obj/item/clothing/suit/threepwoodjacket diff --git a/modular_citadel/code/modules/client/loadout/uniform.dm b/modular_citadel/code/modules/client/loadout/uniform.dm index d688ee979..fcc6846c2 100644 --- a/modular_citadel/code/modules/client/loadout/uniform.dm +++ b/modular_citadel/code/modules/client/loadout/uniform.dm @@ -541,10 +541,4 @@ name = "vault jumpsuit" category = SLOT_W_UNIFORM path = /obj/item/clothing/under/vaultsuit - cost = 1 - -/datum/gear/threepwood - name = "threepwood's outfit" - category = SLOT_W_UNIFORM - path = /obj/item/clothing/under/threepwood cost = 1 \ No newline at end of file diff --git a/modular_citadel/code/modules/client/preferences_savefile.dm b/modular_citadel/code/modules/client/preferences_savefile.dm index 3067e680a..fae7e9e0d 100644 --- a/modular_citadel/code/modules/client/preferences_savefile.dm +++ b/modular_citadel/code/modules/client/preferences_savefile.dm @@ -2,9 +2,9 @@ //ipcs S["feature_ipc_screen"] >> features["ipc_screen"] S["feature_ipc_antenna"] >> features["ipc_antenna"] + features["ipc_screen"] = sanitize_inlist(features["ipc_screen"], GLOB.ipc_screens_list) features["ipc_antenna"] = sanitize_inlist(features["ipc_antenna"], GLOB.ipc_antennas_list) - //Citadel features["flavor_text"] = sanitize_text(features["flavor_text"], initial(features["flavor_text"])) features["ooc_text"] = sanitize_text(features["ooc_text"], initial(features["ooc_text"])) @@ -35,7 +35,6 @@ LAZYADD(chosen_gear, path) gear_points -= initial(path.cost) - /datum/preferences/proc/cit_character_pref_save(savefile/S) //ipcs WRITE_FILE(S["feature_ipc_screen"], features["ipc_screen"]) diff --git a/modular_citadel/code/modules/integrated_electronics/subtypes/manipulation.dm b/modular_citadel/code/modules/integrated_electronics/subtypes/manipulation.dm index e3eab59c5..547c1a576 100644 --- a/modular_citadel/code/modules/integrated_electronics/subtypes/manipulation.dm +++ b/modular_citadel/code/modules/integrated_electronics/subtypes/manipulation.dm @@ -25,12 +25,12 @@ if(ismob(M) && M.canbearoused && arousal_gain != 0) var/orgasm = FALSE if(arousal_gain > 0) - if(M.can_orgasm()) + if(M.getArousalLoss() >= 100 && ishuman(M) && M.has_dna()) var/mob/living/carbon/human/H = M var/orgasm_message = pick("A sharp pulse of electricity pushes you to orgasm!", "You feel a jolt of electricity force you into orgasm!") H.visible_message("\The [assembly] electrodes shock [H]!", "[orgasm_message]") playsound(src, "sound/effects/light_flicker.ogg", 30, 1) - H.mob_climax_instant() + H.mob_climax(forced_climax=TRUE) orgasm = TRUE else M.adjustArousalLoss(arousal_gain) 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 5002d4f52..c2f6f2e58 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 @@ -2121,7 +2121,7 @@ datum/sprite_accessory/ears/human/gret /datum/sprite_accessory/antenna icon = 'modular_citadel/icons/mob/ipc_antennas.dmi' - color_src = MUTCOLORS3 + color_src = MUTCOLORS2 recommended_species = list("ipc") /datum/sprite_accessory/antenna/none diff --git a/modular_citadel/code/modules/mob/living/carbon/human/species_types/furrypeople.dm b/modular_citadel/code/modules/mob/living/carbon/human/species_types/furrypeople.dm index fe0e28949..2aa99b95a 100644 --- a/modular_citadel/code/modules/mob/living/carbon/human/species_types/furrypeople.dm +++ b/modular_citadel/code/modules/mob/living/carbon/human/species_types/furrypeople.dm @@ -261,7 +261,7 @@ mutant_heart = /obj/item/organ/heart/ipc mutantlungs = /obj/item/organ/lungs/ipc mutantliver = /obj/item/organ/liver/ipc - mutantstomach = /obj/item/organ/stomach/synthliz + mutantstomach = /obj/item/organ/stomach/ipc mutanteyes = /obj/item/organ/eyes/ipc exotic_bloodtype = "SY" diff --git a/modular_citadel/code/modules/mob/living/carbon/human/species_types/ipc.dm b/modular_citadel/code/modules/mob/living/carbon/human/species_types/ipc.dm index be91215e9..f1f7c07a3 100644 --- a/modular_citadel/code/modules/mob/living/carbon/human/species_types/ipc.dm +++ b/modular_citadel/code/modules/mob/living/carbon/human/species_types/ipc.dm @@ -6,8 +6,7 @@ icon_limbs = DEFAULT_BODYPART_ICON_CITADEL blacklisted = 0 sexes = 0 - species_traits = list(MUTCOLORS,NOEYES,NOTRANSSTING,NOMOUTH) - inherent_traits = list(TRAIT_NOTHIRST) + species_traits = list(MUTCOLORS,NOEYES,NOTRANSSTING) inherent_biotypes = MOB_ROBOTIC|MOB_HUMANOID mutant_bodyparts = list("ipc_screen", "ipc_antenna") default_features = list("ipc_screen" = "Blank", "ipc_antenna" = "None") @@ -17,9 +16,8 @@ mutant_heart = /obj/item/organ/heart/ipc mutantlungs = /obj/item/organ/lungs/ipc mutantliver = /obj/item/organ/liver/ipc - mutantstomach = /obj/item/organ/stomach/cell + mutantstomach = /obj/item/organ/stomach/ipc mutanteyes = /obj/item/organ/eyes/ipc - mutant_organs = list(/obj/item/organ/cyberimp/arm/power_cord) // oracle port exotic_bloodtype = "HF" diff --git a/modular_citadel/code/modules/mob/living/silicon/robot/robot_modules.dm b/modular_citadel/code/modules/mob/living/silicon/robot/robot_modules.dm index 39684f180..cce251f72 100644 --- a/modular_citadel/code/modules/mob/living/silicon/robot/robot_modules.dm +++ b/modular_citadel/code/modules/mob/living/silicon/robot/robot_modules.dm @@ -10,9 +10,6 @@ /mob/living/silicon/robot/modules/borgi set_module = /obj/item/robot_module/borgi -/mob/living/silicon/robot/modules/orepup - set_module = /obj/item/robot_module/orepup - /mob/living/silicon/robot/proc/get_cit_modules() var/list/modulelist = list() modulelist["MediHound"] = /obj/item/robot_module/medihound @@ -20,7 +17,6 @@ modulelist["Security K-9"] = /obj/item/robot_module/k9 modulelist["Scrub Puppy"] = /obj/item/robot_module/scrubpup modulelist["Borgi"] = /obj/item/robot_module/borgi - modulelist["Orepup"] = /obj/item/robot_module/orepup return modulelist /obj/item/robot_module @@ -265,13 +261,14 @@ cyborg_icon_override = 'modular_citadel/icons/mob/robots.dmi' has_snowflake_deadsprite = TRUE +/* /obj/item/robot_module/orepup name = "Ore Pup" basic_modules = list( /obj/item/storage/bag/ore/cyborg, /obj/item/analyzer/nose, /obj/item/storage/bag/borgdelivery, - /obj/item/dogborg/sleeper/compactor/ore, + /obj/item/dogborg/sleeper/ore, /obj/item/pickaxe/drill/cyborg, /obj/item/shovel, /obj/item/crowbar/cyborg, @@ -285,33 +282,20 @@ /obj/item/clockwork/slab/cyborg/miner, /obj/item/clockwork/weapon/ratvarian_spear, /obj/item/borg/sight/xray/truesight_lens) - cyborg_base_icon = "blade" - moduleselect_icon = "miner" - sleeper_overlay = "bladesleeper" + cyborg_base_icon = "orepup" + moduleselect_icon = "orepup" + sleeper_overlay = "osleeper" cyborg_icon_override = 'modular_citadel/icons/mob/widerobot.dmi' has_snowflake_deadsprite = TRUE cyborg_pixel_offset = -16 - -/obj/item/robot_module/orepup/be_transformed_to(obj/item/robot_module/old_module) +/obj/item/robot_module/miner/do_transform_animation() var/mob/living/silicon/robot/R = loc - var/static/list/orepup_models - if(!orepup_models) - orepup_models = list( - "blade" = image(icon = 'modular_citadel/icons/mob/widerobot.dmi', icon_state = "blade"), - "vale" = image(icon = 'modular_citadel/icons/mob/widerobot.dmi', icon_state = "valemine") - ) - orepup_models = sortList(orepup_models) - var/orepup_borg_icon = show_radial_menu(R, R , orepup_models, custom_check = CALLBACK(src, .proc/check_menu, R), radius = 42, require_near = TRUE, tooltips = TRUE) - if(!orepup_borg_icon) - return - switch(orepup_borg_icon) - if("blade") - cyborg_base_icon = "blade" - if("vale") - cyborg_base_icon = "valemine" - sleeper_overlay = "valeminesleeper" - has_snowflake_deadsprite = TRUE - return ..() + R.cut_overlays() + R.setDir(SOUTH) + flick("orepup_transform", R) + do_transform_delay() + R.update_headlamp() +*/ /obj/item/robot_module/medical/be_transformed_to(obj/item/robot_module/old_module) var/mob/living/silicon/robot/R = loc @@ -369,7 +353,7 @@ cyborg_base_icon = "haydeemedical" cyborg_icon_override = 'modular_citadel/icons/mob/robots.dmi' hat_offset = 3 - + if("qualified_doctor") cyborg_base_icon = "qualified_doctor" cyborg_icon_override = 'modular_citadel/icons/mob/robots.dmi' diff --git a/modular_citadel/code/modules/reagents/reagents/cit_reagents.dm b/modular_citadel/code/modules/reagents/reagents/cit_reagents.dm index 30c528cc0..324b44db3 100644 --- a/modular_citadel/code/modules/reagents/reagents/cit_reagents.dm +++ b/modular_citadel/code/modules/reagents/reagents/cit_reagents.dm @@ -197,7 +197,7 @@ /datum/reagent/drug/aphrodisiacplus/overdose_process(mob/living/M) if(M && M.canbearoused && !(M.client?.prefs.cit_toggles & NO_APHRO) && prob(33)) - if(prob(5) && M.can_orgasm()) + if(prob(5) && M.getArousalLoss() >= 100 && ishuman(M) && M.has_dna()) if(prob(5)) //Less spam to_chat(M, "Your libido is going haywire!") if(M.min_arousal < 50) diff --git a/modular_citadel/icons/mob/ipc_antennas.dmi b/modular_citadel/icons/mob/ipc_antennas.dmi index 77c4930ef..9f20aa442 100644 Binary files a/modular_citadel/icons/mob/ipc_antennas.dmi and b/modular_citadel/icons/mob/ipc_antennas.dmi differ diff --git a/modular_citadel/icons/mob/ipc_screens.dmi b/modular_citadel/icons/mob/ipc_screens.dmi index 938cfe555..c7d44da5a 100644 Binary files a/modular_citadel/icons/mob/ipc_screens.dmi and b/modular_citadel/icons/mob/ipc_screens.dmi differ diff --git a/modular_citadel/icons/mob/mutant_bodyparts.dmi b/modular_citadel/icons/mob/mutant_bodyparts.dmi index 7b9b87f50..b4fad43ba 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/widerobot.dmi b/modular_citadel/icons/mob/widerobot.dmi index 50c29bb75..4ff89322d 100644 Binary files a/modular_citadel/icons/mob/widerobot.dmi and b/modular_citadel/icons/mob/widerobot.dmi differ diff --git a/modular_citadel/icons/obj/genitals/breasts_onmob.dmi b/modular_citadel/icons/obj/genitals/breasts_onmob.dmi index e8573ec54..cd960abbc 100644 Binary files a/modular_citadel/icons/obj/genitals/breasts_onmob.dmi and b/modular_citadel/icons/obj/genitals/breasts_onmob.dmi differ diff --git a/modular_citadel/icons/obj/genitals/hud.dmi b/modular_citadel/icons/obj/genitals/hud.dmi index e090dbd84..bf2adcb1f 100644 Binary files a/modular_citadel/icons/obj/genitals/hud.dmi and b/modular_citadel/icons/obj/genitals/hud.dmi differ