diff --git a/_maps/map_files220/cyberiad/cyberiad.dmm b/_maps/map_files220/cyberiad/cyberiad.dmm index d546b6196d69..54ee58a736bc 100644 --- a/_maps/map_files220/cyberiad/cyberiad.dmm +++ b/_maps/map_files220/cyberiad/cyberiad.dmm @@ -891,7 +891,7 @@ "aeV" = ( /obj/machinery/computer/security{ dir = 8; - network = list("SS13","Research Outpost","Mining Outpost") + network = list("SS13","Research Outpost","Mining Outpost") }, /obj/item/radio/intercom/custom{ dir = 8; @@ -2546,6 +2546,8 @@ d2 = 8; icon_state = "4-8" }, +/obj/structure/bed/dogbed, +/mob/living/simple_animal/pet/dog/security/warden, /turf/simulated/floor/plasteel{ dir = 1; icon_state = "darkred" @@ -3403,7 +3405,7 @@ "apk" = ( /obj/machinery/computer/security{ dir = 8; - network = list("SS13","Research Outpost","Mining Outpost") + network = list("SS13","Research Outpost","Mining Outpost") }, /turf/simulated/floor/plasteel{ dir = 6; @@ -3700,6 +3702,7 @@ dir = 8 }, /obj/machinery/light/small/directional/east, +/mob/living/simple_animal/mouse/rat, /turf/simulated/floor/plating, /area/station/maintenance/fore) "aqu" = ( @@ -3919,7 +3922,7 @@ "arl" = ( /obj/machinery/computer/security{ dir = 4; - network = list("SS13","Research Outpost","Mining Outpost") + network = list("SS13","Research Outpost","Mining Outpost") }, /turf/simulated/floor/plasteel{ dir = 8; @@ -5565,7 +5568,11 @@ /obj/effect/turf_decal/siding/white{ dir = 4 }, -/obj/machinery/light/nightshifted/east, +/obj/machinery/light{ + dir = 4; + nightshift_allowed = 0; + nightshift_enabled = 1 + }, /turf/simulated/floor/beach/water{ icon_state = "seadeep" }, @@ -7847,6 +7854,7 @@ "aDY" = ( /obj/item/stack/tile/plasteel, /obj/effect/decal/cleanable/dust, +/mob/living/simple_animal/mouse/rat, /turf/simulated/floor/plating, /area/station/maintenance/abandonedbar) "aDZ" = ( @@ -7913,7 +7921,7 @@ "aEp" = ( /obj/item/radio/intercom/directional/east, /obj/machinery/computer/security/wooden_tv{ - network = list("SS13","Research Outpost","Mining Outpost") + network = list("SS13","Research Outpost","Mining Outpost") }, /obj/machinery/button/windowtint/north{ id = "Detective"; @@ -8037,6 +8045,7 @@ /area/station/maintenance/fpmaint2) "aEK" = ( /obj/structure/chair, +/mob/living/simple_animal/mouse/rat, /turf/simulated/floor/wood, /area/station/maintenance/fpmaint2) "aEL" = ( @@ -8775,6 +8784,7 @@ "aHd" = ( /obj/effect/decal/cleanable/dirt, /obj/machinery/atmospherics/pipe/simple/hidden/cyan, +/mob/living/simple_animal/mouse/rat, /turf/simulated/floor/plasteel{ icon_state = "stage_bleft" }, @@ -9751,6 +9761,10 @@ }, /turf/simulated/floor/carpet/arcade, /area/station/public/arcade) +"aKM" = ( +/mob/living/simple_animal/pet/cat/spacecat/Musya, +/turf/simulated/floor/plating/airless, +/area/station/science/toxins/test) "aKO" = ( /obj/structure/closet/lasertag/blue, /obj/machinery/light/directional/east, @@ -12702,7 +12716,7 @@ "aWf" = ( /obj/structure/reagent_dispensers/peppertank/north, /obj/machinery/computer/security{ - network = list("SS13","Research Outpost","Mining Outpost") + network = list("SS13","Research Outpost","Mining Outpost") }, /turf/simulated/floor/plasteel{ dir = 1; @@ -17011,7 +17025,9 @@ /turf/simulated/floor/wood, /area/station/service/library) "bmE" = ( -/obj/machinery/light/small/directional/south, +/obj/machinery/light/small, +/mob/living/simple_animal/pet/dog/bullterrier/Genn, +/obj/structure/bed/dogbed, /turf/simulated/floor/plasteel{ icon_state = "cult" }, @@ -18041,7 +18057,7 @@ c_tag = "Bridge West" }, /obj/machinery/computer/security{ - network = list("SS13","Research Outpost","Mining Outpost","Telecomms") + network = list("SS13","Research Outpost","Mining Outpost","Telecomms") }, /obj/machinery/computer/security/telescreen/entertainment/directional/north, /turf/simulated/floor/plasteel{ @@ -28153,6 +28169,7 @@ /obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ dir = 4 }, +/mob/living/simple_animal/pet/dog/pug/Frank, /turf/simulated/floor/engine, /area/station/science/explab/chamber) "ckk" = ( @@ -28656,6 +28673,8 @@ /turf/simulated/floor/plasteel, /area/station/engineering/atmos) "clR" = ( +/obj/structure/bed/dogbed/pet, +/mob/living/simple_animal/pet/cat/Floppa, /turf/simulated/floor/wood, /area/station/command/office/blueshield) "clU" = ( @@ -28694,7 +28713,7 @@ /area/station/command/office/rd) "clZ" = ( /obj/machinery/computer/general_air_control{ - autolink_sensors = list("mair_in_meter"="Mixed Air In","air_sensor"="Mixed Air Supply Tank","mair_out_meter"="Mixed Air Out","dloop_atm_meter"="Distribution Loop","wloop_atm_meter"="Waste Loop"); + autolink_sensors = list("mair_in_meter"="Mixed Air In","air_sensor"="Mixed Air Supply Tank","mair_out_meter"="Mixed Air Out","dloop_atm_meter"="Distribution Loop","wloop_atm_meter"="Waste Loop"); dir = 8; level = 3; name = "Distribution and Waste Monitor" @@ -29057,6 +29076,8 @@ /obj/machinery/atmospherics/unary/vent_scrubber/on{ dir = 8 }, +/mob/living/simple_animal/mouse/hamster/Representative, +/obj/structure/bed/dogbed/pet, /turf/simulated/floor/carpet/royalblack, /area/station/command/office/ntrep) "cnv" = ( @@ -32194,6 +32215,7 @@ /obj/structure/sign/nosmoking_2{ pixel_x = -28 }, +/mob/living/simple_animal/mouse/rat, /turf/simulated/floor/plating, /area/station/maintenance/incinerator) "czJ" = ( @@ -37944,7 +37966,7 @@ /obj/machinery/keycard_auth/south, /obj/machinery/computer/security/engineering{ dir = 1; - network = list("Power Alarms","Atmosphere Alarms","Fire Alarms","Engineering","Singularity","engine") + network = list("Power Alarms","Atmosphere Alarms","Fire Alarms","Engineering","Singularity","engine") }, /turf/simulated/floor/plasteel{ dir = 8; @@ -38982,7 +39004,7 @@ "cXS" = ( /obj/machinery/computer/security/engineering{ dir = 1; - network = list("Power Alarms","Atmosphere Alarms","Fire Alarms","Singularity") + network = list("Power Alarms","Atmosphere Alarms","Fire Alarms","Singularity") }, /turf/simulated/floor/plasteel{ icon_state = "darkyellowfull" @@ -40964,6 +40986,7 @@ pixel_x = -32 }, /obj/machinery/atmospherics/pipe/simple/hidden/supply, +/obj/effect/decal/remains/mouse, /turf/simulated/floor/plating, /area/station/aisat/hall) "deL" = ( @@ -41103,6 +41126,7 @@ d2 = 4; icon_state = "2-4" }, +/obj/effect/decal/remains/mouse, /turf/simulated/floor/plating, /area/station/maintenance/starboardsolar) "dfb" = ( @@ -49104,7 +49128,7 @@ /area/station/service/chapel) "fbT" = ( /obj/machinery/computer/general_air_control{ - autolink_sensors = list("mair_in_meter"="Mixed Air In","air_sensor"="Mixed Air Supply Tank","mair_out_meter"="Mixed Air Out","dloop_atm_meter"="Distribution Loop","wloop_atm_meter"="Waste Loop"); + autolink_sensors = list("mair_in_meter"="Mixed Air In","air_sensor"="Mixed Air Supply Tank","mair_out_meter"="Mixed Air Out","dloop_atm_meter"="Distribution Loop","wloop_atm_meter"="Waste Loop"); dir = 1; level = 3; name = "Distribution and Waste Monitor" @@ -51673,6 +51697,7 @@ d2 = 8; icon_state = "2-8" }, +/obj/effect/decal/remains/mouse, /turf/simulated/floor/plating/airless, /area/station/science/toxins/test) "fZu" = ( @@ -54499,6 +54524,7 @@ /obj/structure/railing/cap/reversed{ dir = 4 }, +/obj/effect/decal/remains/mouse, /turf/simulated/floor/plasteel{ icon_state = "showroomfloor" }, @@ -55322,6 +55348,7 @@ dir = 6 }, /obj/effect/decal/cleanable/dust, +/obj/effect/decal/remains/mouse, /turf/simulated/floor/beach/water{ icon_state = "seadeep" }, @@ -55352,6 +55379,10 @@ icon_state = "darkbluecorners" }, /area/station/turret_protected/aisat/interior) +"hmS" = ( +/obj/effect/decal/remains/mouse, +/turf/simulated/floor/plating, +/area/station/maintenance/fore) "hnb" = ( /obj/machinery/ai_status_display/south, /turf/simulated/floor/plasteel{ @@ -55895,6 +55926,13 @@ }, /turf/simulated/floor/plating, /area/station/maintenance/apmaint) +"hwW" = ( +/obj/effect/decal/cleanable/dust, +/mob/living/simple_animal/mouse/rat, +/turf/simulated/floor/plasteel{ + icon_state = "dark" + }, +/area/station/security/interrogation) "hxx" = ( /obj/structure/table/wood, /obj/item/flashlight/lamp{ @@ -56304,6 +56342,7 @@ /obj/machinery/atmospherics/pipe/simple/heat_exchanging{ dir = 5 }, +/obj/effect/decal/remains/mouse/Pinkie, /turf/simulated/floor/engine, /area/station/science/toxins/mixing) "hDR" = ( @@ -56888,7 +56927,7 @@ }, /area/station/medical/cloning) "hOf" = ( -/mob/living/simple_animal/pig, +/mob/living/simple_animal/pig/Sanya, /turf/simulated/floor/plasteel{ icon_state = "hydrofloor" }, @@ -56949,6 +56988,10 @@ icon_state = "1-2" }, /obj/effect/decal/cleanable/dirt, +/mob/living/simple_animal/mothroach{ + name = "Сеньйор"; + desc = "Мотылёк. Обожает светочи. Знает всю атмосферику, но из-за своего скверного характера не расскажет, даже если бы мог говорить." + }, /turf/simulated/floor/plasteel, /area/station/maintenance/turbine) "hOJ" = ( @@ -57273,6 +57316,11 @@ name = "Prison Intercom (General)"; pixel_y = 24 }, +/mob/living/simple_animal/frog/scream{ + real_name = "лягушка-нонконформист"; + name = "лягушка-нонконформист"; + desc = "Кто-нибудь, заткните её пожалуйста!" + }, /turf/simulated/floor/plasteel{ icon_state = "freezerfloor" }, @@ -58725,6 +58773,10 @@ icon_state = "purplecorner" }, /area/station/hallway/secondary/exit) +"iBM" = ( +/mob/living/simple_animal/mouse/rat, +/turf/simulated/floor/plating, +/area/station/maintenance/asmaint) "iBP" = ( /obj/structure/disposalpipe/segment, /obj/structure/cable{ @@ -58775,6 +58827,7 @@ "iCD" = ( /obj/machinery/light_construct/small/east, /obj/item/trash/chips, +/mob/living/simple_animal/moth, /turf/simulated/floor/carpet, /area/station/maintenance/fsmaint) "iDd" = ( @@ -58993,6 +59046,10 @@ /obj/effect/decal/cleanable/dirt, /turf/simulated/floor/plating, /area/station/maintenance/asmaint2) +"iFW" = ( +/mob/living/simple_animal/mouse/rat, +/turf/simulated/floor/wood, +/area/station/maintenance/aft) "iGq" = ( /obj/machinery/atmospherics/unary/vent_pump/on{ dir = 8 @@ -60055,6 +60112,13 @@ icon_state = "yellow" }, /area/station/maintenance/fsmaint) +"jbh" = ( +/obj/effect/decal/cleanable/dust, +/mob/living/simple_animal/hostile/lizard/croco/Gena, +/turf/simulated/floor/beach/water{ + icon_state = "seadeep" + }, +/area/station/maintenance/abandonedbar) "jbt" = ( /obj/effect/decal/warning_stripes/north, /obj/structure/cable/yellow{ @@ -60506,6 +60570,10 @@ icon_state = "darkyellowcorners" }, /area/station/engineering/equipmentstorage) +"jmB" = ( +/mob/living/simple_animal/mouse/rat, +/turf/simulated/floor/grass, +/area/station/security/permabrig) "jmU" = ( /obj/effect/decal/remains/human, /obj/effect/decal/cleanable/dirt, @@ -60834,6 +60902,10 @@ /obj/item/storage/box/monkeycubes/wolpincubes, /turf/simulated/floor/plating, /area/station/maintenance/asmaint) +"jrA" = ( +/mob/living/simple_animal/mouse/rat, +/turf/simulated/floor/plasteel, +/area/station/maintenance/aft) "jrD" = ( /obj/effect/decal/cleanable/dust, /obj/machinery/atmospherics/unary/vent_pump/on{ @@ -62203,6 +62275,13 @@ icon_state = "dark" }, /area/station/security/armory/secure) +"jUn" = ( +/obj/machinery/atmospherics/pipe/simple/hidden/cyan{ + dir = 4 + }, +/mob/living/simple_animal/mouse/rat, +/turf/simulated/floor/wood, +/area/station/maintenance/abandonedbar) "jUq" = ( /obj/item/flag/mime, /turf/simulated/floor/mineral/tranquillite, @@ -64940,6 +65019,7 @@ d2 = 8; icon_state = "1-8" }, +/mob/living/simple_animal/mouse/rat, /turf/simulated/floor/plasteel{ icon_state = "dark" }, @@ -65483,6 +65563,12 @@ icon_state = "showroomfloor" }, /area/station/public/toilet) +"lhl" = ( +/obj/item/trash/pistachios, +/obj/effect/decal/cleanable/dirt, +/mob/living/simple_animal/mouse/rat, +/turf/simulated/floor/plating, +/area/station/maintenance/asmaint) "lhs" = ( /obj/machinery/atmospherics/pipe/simple/hidden/supply, /obj/effect/decal/warning_stripes/southwestcorner, @@ -66977,6 +67063,7 @@ /area/station/maintenance/turbine) "lMP" = ( /obj/structure/sign/poster/contraband/random/north, +/mob/living/simple_animal/mouse/rat, /turf/simulated/floor/wood, /area/station/maintenance/aft) "lNb" = ( @@ -69334,6 +69421,7 @@ /obj/machinery/atmospherics/unary/vent_pump/on{ dir = 8 }, +/mob/living/simple_animal/moth, /turf/simulated/floor/carpet, /area/station/maintenance/fsmaint) "mDx" = ( @@ -69556,6 +69644,19 @@ icon_state = "neutralcorner" }, /area/station/public/dorms) +"mHb" = ( +/obj/effect/decal/cleanable/dirt, +/obj/structure/cable{ + d1 = 4; + d2 = 8; + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/simple/hidden/cyan{ + dir = 4 + }, +/mob/living/simple_animal/mouse/rat, +/turf/simulated/floor/plating, +/area/station/maintenance/fpmaint2) "mHh" = ( /obj/effect/spawner/window/reinforced/polarized{ id = "hos_room" @@ -71463,6 +71564,10 @@ icon_state = "darkred" }, /area/station/security/brig) +"nte" = ( +/mob/living/simple_animal/mouse/rat, +/turf/simulated/floor/plating, +/area/station/maintenance/aft) "ntg" = ( /mob/living/simple_animal/hostile/retaliate/goat{ name = "Pete"; @@ -75451,6 +75556,13 @@ /obj/structure/disposalpipe/segment, /turf/simulated/floor/plasteel, /area/station/science/toxins/mixing) +"oSm" = ( +/obj/effect/decal/cleanable/dirt, +/mob/living/simple_animal/mouse/rat/irish/Remi, +/turf/simulated/floor/plasteel{ + icon_state = "bar" + }, +/area/station/security/permabrig) "oSt" = ( /obj/machinery/atmospherics/pipe/simple/hidden/supply{ dir = 4 @@ -76592,6 +76704,11 @@ icon_state = "dark" }, /area/station/security/interrogation) +"pnE" = ( +/obj/effect/decal/cleanable/dirt, +/mob/living/simple_animal/mouse/rat, +/turf/simulated/floor/plating, +/area/station/maintenance/aft) "pnG" = ( /obj/structure/disposalpipe/segment{ dir = 4; @@ -76962,6 +77079,7 @@ /obj/effect/turf_decal/siding/white{ dir = 4 }, +/mob/living/simple_animal/chicken/Wife, /turf/simulated/floor/plasteel{ icon_state = "asteroid" }, @@ -77843,6 +77961,10 @@ /obj/effect/spawner/random_spawners/wall_rusted_probably, /turf/simulated/wall, /area/station/maintenance/electrical) +"pMM" = ( +/obj/effect/decal/remains/mouse, +/turf/simulated/floor/plating, +/area/station/aisat/hall) "pMP" = ( /obj/machinery/atmospherics/pipe/simple/hidden/supply, /obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, @@ -77939,6 +78061,16 @@ }, /turf/simulated/floor/bluegrid, /area/station/science/robotics/chargebay) +"pOo" = ( +/obj/effect/turf_decal/siding/white{ + dir = 1 + }, +/obj/effect/decal/cleanable/dust, +/obj/effect/decal/remains/mouse, +/turf/simulated/floor/beach/water{ + icon_state = "seadeep" + }, +/area/station/maintenance/abandonedbar) "pOt" = ( /obj/structure/rack, /obj/item/poster/random_contraband, @@ -78318,7 +78450,7 @@ /area/station/engineering/supermatter_room) "pUZ" = ( /obj/machinery/computer/general_air_control{ - autolink_sensors = list("n2_sensor"="Nitrogen","o2_sensor"="Oxygen","co2_sensor"="Carbon Dioxide","tox_sensor"="Toxins","n2o_sensor"="Nitrous Oxide","waste_sensor"="Gas Mix Tank"); + autolink_sensors = list("n2_sensor"="Nitrogen","o2_sensor"="Oxygen","co2_sensor"="Carbon Dioxide","tox_sensor"="Toxins","n2o_sensor"="Nitrous Oxide","waste_sensor"="Gas Mix Tank"); dir = 1; name = "Tank Monitor" }, @@ -79183,7 +79315,7 @@ dir = 4 }, /obj/machinery/computer/general_air_control{ - autolink_sensors = list("burn_sensor"="Burn Mix"); + autolink_sensors = list("burn_sensor"="Burn Mix"); name = "Bomb Mix Monitor" }, /obj/machinery/door_control/shutter/north{ @@ -80016,6 +80148,17 @@ /obj/effect/spawner/random_spawners/cobweb_right_rare, /turf/simulated/floor/plasteel, /area/station/maintenance/fpmaint) +"qCJ" = ( +/obj/structure/curtain/open/shower, +/obj/effect/decal/cleanable/dirt, +/obj/machinery/shower{ + pixel_y = 20 + }, +/mob/living/simple_animal/mouse/rat, +/turf/simulated/floor/plasteel{ + icon_state = "freezerfloor" + }, +/area/station/maintenance/disposal) "qCO" = ( /obj/effect/decal/cleanable/dirt, /obj/machinery/atmospherics/pipe/simple/visible/cyan{ @@ -81971,6 +82114,11 @@ }, /turf/simulated/floor/plating, /area/station/maintenance/fpmaint) +"rmu" = ( +/obj/machinery/light/small/directional/east, +/obj/effect/decal/remains/mouse, +/turf/simulated/floor/plating, +/area/station/maintenance/storage) "rmH" = ( /obj/structure/bed, /obj/effect/decal/cleanable/dirt, @@ -82997,6 +83145,7 @@ /obj/machinery/atmospherics/pipe/simple/hidden/cyan{ dir = 5 }, +/mob/living/simple_animal/mouse/rat, /turf/simulated/floor/plasteel, /area/station/maintenance/disposal) "rMq" = ( @@ -83688,7 +83837,7 @@ /area/station/medical/chemistry) "rZM" = ( /obj/structure/bed/dogbed, -/mob/living/simple_animal/pet/dog/pug, +/mob/living/simple_animal/pet/dog/brittany/Psycho, /turf/simulated/floor/wood{ icon_state = "fancy-wood-cherry" }, @@ -84228,6 +84377,7 @@ /area/station/maintenance/asmaint) "sln" = ( /obj/structure/bed/dogbed, +/mob/living/simple_animal/pet/dog/security, /turf/simulated/floor/plasteel, /area/station/security/main) "slo" = ( @@ -84670,6 +84820,7 @@ "ssL" = ( /obj/effect/spawner/lootdrop/maintenance/three, /obj/item/clothing/gloves/color/blue, +/mob/living/simple_animal/mouse/rat, /turf/simulated/floor/plasteel{ icon_state = "freezerfloor" }, @@ -85128,6 +85279,13 @@ }, /turf/simulated/floor/wood, /area/station/public/vacant_office) +"sAy" = ( +/obj/machinery/atmospherics/pipe/simple/hidden/cyan{ + dir = 4 + }, +/mob/living/simple_animal/mouse/rat, +/turf/simulated/floor/plating, +/area/station/maintenance/fpmaint2) "sAB" = ( /obj/effect/decal/cleanable/dirt, /obj/effect/decal/cleanable/blood, @@ -85485,7 +85643,7 @@ /area/station/science/hallway) "sFl" = ( /obj/machinery/computer/general_air_control{ - autolink_sensors = list("n2_sensor"="Nitrogen","o2_sensor"="Oxygen","co2_sensor"="Carbon Dioxide","tox_sensor"="Toxins","n2o_sensor"="Nitrous Oxide","waste_sensor"="Gas Mix Tank"); + autolink_sensors = list("n2_sensor"="Nitrogen","o2_sensor"="Oxygen","co2_sensor"="Carbon Dioxide","tox_sensor"="Toxins","n2o_sensor"="Nitrous Oxide","waste_sensor"="Gas Mix Tank"); dir = 4; name = "Tank Monitor" }, @@ -86820,6 +86978,11 @@ }, /turf/simulated/floor/plating, /area/station/maintenance/fpmaint2) +"tga" = ( +/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/remains/mouse, +/turf/simulated/floor/plating, +/area/station/maintenance/asmaint) "tgb" = ( /obj/effect/decal/cleanable/dirt, /obj/machinery/atmospherics/pipe/simple/hidden/cyan{ @@ -87169,6 +87332,11 @@ /obj/machinery/atmospherics/pipe/simple/hidden/supply, /turf/simulated/floor/plasteel, /area/station/hallway/primary/central/sw) +"tkN" = ( +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, +/mob/living/simple_animal/mouse/rat, +/turf/simulated/floor/plating, +/area/station/maintenance/aft) "tkW" = ( /obj/machinery/atmospherics/pipe/manifold/hidden/supply, /obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ @@ -90626,6 +90794,7 @@ dir = 1 }, /obj/effect/decal/cleanable/dirt, +/mob/living/simple_animal/mouse/rat, /turf/simulated/floor/plating, /area/station/maintenance/disposal) "uAb" = ( @@ -90956,6 +91125,13 @@ icon_state = "dark" }, /area/station/engineering/hallway) +"uFC" = ( +/obj/effect/decal/cleanable/dirt, +/mob/living/simple_animal/mouse/rat/Ratatui, +/turf/simulated/floor/plasteel{ + icon_state = "bar" + }, +/area/station/security/permabrig) "uGf" = ( /obj/structure/table/reinforced, /obj/item/reagent_containers/food/snacks/grilledcheese{ @@ -92188,6 +92364,11 @@ icon_state = "rampbottom" }, /area/station/service/bar/atrium) +"veM" = ( +/obj/effect/decal/cleanable/dirt, +/mob/living/simple_animal/mouse/rat, +/turf/simulated/floor/plating, +/area/station/maintenance/asmaint) "veP" = ( /obj/structure/closet/secure_closet/clown, /obj/machinery/camera{ @@ -93030,7 +93211,7 @@ /obj/structure/window/reinforced{ dir = 8 }, -/mob/living/simple_animal/chicken/clucky, +/mob/living/simple_animal/cock/Clucky, /turf/simulated/floor/grass, /area/station/service/hydroponics) "vws" = ( @@ -94093,6 +94274,15 @@ icon_state = "whitebluefull" }, /area/station/medical/storage) +"vON" = ( +/obj/machinery/shower{ + dir = 4 + }, +/mob/living/simple_animal/mouse/rat, +/turf/simulated/floor/plasteel{ + icon_state = "freezerfloor" + }, +/area/station/security/permabrig) "vPr" = ( /obj/machinery/door/airlock/maintenance, /obj/machinery/atmospherics/pipe/simple/hidden/cyan, @@ -94175,6 +94365,7 @@ autolink_id = "fpmaint_vent"; dir = 1 }, +/obj/effect/decal/remains/mouse, /turf/simulated/floor/plating, /area/station/maintenance/apmaint) "vQw" = ( @@ -95934,11 +96125,13 @@ dir = 8 }, /obj/effect/decal/cleanable/dust, +/mob/living/simple_animal/moth, /turf/simulated/floor/plating, /area/station/maintenance/fsmaint) "wAW" = ( /obj/structure/sink/directional/east, /obj/effect/decal/cleanable/dirt, +/mob/living/simple_animal/mouse/rat, /turf/simulated/floor/plating, /area/station/maintenance/apmaint) "wBf" = ( @@ -97945,6 +98138,7 @@ /obj/effect/turf_decal/siding/white/corner{ dir = 8 }, +/obj/effect/decal/remains/mouse, /turf/simulated/floor/beach/water{ icon_state = "seadeep" }, @@ -98687,6 +98881,7 @@ dir = 10 }, /obj/effect/decal/cleanable/dust, +/mob/living/simple_animal/frog/Wednesday, /turf/simulated/floor/beach/water{ icon_state = "seadeep" }, @@ -99086,6 +99281,7 @@ dir = 6 }, /obj/effect/spawner/random_spawners/blood_maybe, +/mob/living/simple_animal/mouse/rat, /turf/simulated/floor/plating, /area/station/maintenance/fsmaint) "xLj" = ( @@ -100394,7 +100590,7 @@ /obj/machinery/firealarm/directional/east, /obj/machinery/computer/security/engineering{ dir = 1; - network = list("Power Alarms","Atmosphere Alarms","Fire Alarms","Engineering") + network = list("Power Alarms","Atmosphere Alarms","Fire Alarms","Engineering") }, /turf/simulated/floor/plasteel{ icon_state = "dark" @@ -116202,7 +116398,7 @@ aJY aIK aGn aHS -miW +mHb aGn aKW aRp @@ -117716,7 +117912,7 @@ aaa abN qXR qQy -yiL +uFC vSi lXd vSi @@ -117973,7 +118169,7 @@ aaa abN ppV yiL -yiL +oSm oEG jLf oEG @@ -118771,7 +118967,7 @@ oxe wwc uJB uKQ -jjl +sAy aHS aHS aHl @@ -118832,7 +119028,7 @@ puo vKe fGI bCf -kwZ +qCJ dTL cwx cyc @@ -119017,7 +119213,7 @@ uVr rAe luh luh -luh +vON xPE aaa aaa @@ -121074,7 +121270,7 @@ atS avm jkw eES -xBl +jmB sDL aAr twu @@ -124015,7 +124211,7 @@ qVp cSU bQq ujG -skh +rmu xvS dgS dgS @@ -138022,7 +138218,7 @@ rlu qFK xHC pTX -pTX +hwW pTX rlu qom @@ -139577,7 +139773,7 @@ qtm atG aup avq -avq +hmS atG sHt sHt @@ -140489,7 +140685,7 @@ cVd cVd dkX dkX -dkX +pMM dkX cAO cAO @@ -141741,7 +141937,7 @@ xlg sDr chf csK -cyJ +pnE bDr cyJ cAe @@ -141994,7 +142190,7 @@ eGC sug vbQ wtp -wtp +tkN pmR cuc csK @@ -143057,7 +143253,7 @@ cVd cVd cVd cVd -dkX +pMM dkX dkX dkX @@ -143288,7 +143484,7 @@ cep cDm mlC cep -cep +nte cAv cep czq @@ -144314,12 +144510,12 @@ cyJ uqE qiB chf -czq +jrA eZo qTA eMZ dbr -cyJ +pnE sAB czr mgJ @@ -144821,10 +145017,10 @@ cJK cJK gGQ cxO -cep +nte bop mmB -cyJ +pnE cyJ xxd chf @@ -145860,7 +146056,7 @@ fbp uGf guQ mrc -cIm +iFW cep cIm chf @@ -146110,7 +146306,7 @@ cyJ hbP cDm vNo -cyJ +pnE uqE chf ntr @@ -146879,7 +147075,7 @@ cJK oJr cQC fyM -csL +iBM ciY ciY vMe @@ -148157,7 +148353,7 @@ vum ojz dci lon -cga +veM xsx reO rCg @@ -148171,7 +148367,7 @@ hyk csL ciY vZV -csL +iBM cHf cBQ aaa @@ -148668,7 +148864,7 @@ osm oJr ksj mdX -cga +veM ciY hWu xvs @@ -149088,7 +149284,7 @@ aab aab aAf aBe -aVD +jUn aBg aBg aFa @@ -149180,7 +149376,7 @@ ciY vBC ePu lcL -ijg +lhl iPb skT xII @@ -151147,8 +151343,8 @@ xPw tbW eQY aCN -moA -qAn +pOo +jbh uXy aMq aMq @@ -151708,7 +151904,7 @@ ciY rng csL cga -csL +iBM pZe ciY ciY @@ -152479,7 +152675,7 @@ ciY csL bUx ciY -cga +tga dzN ciY xKa @@ -153276,7 +153472,7 @@ ciY csL fmn qth -csL +iBM oXK isD ciY @@ -158926,7 +159122,7 @@ cie cie clA lNG -cjZ +aKM cie aaa aaa diff --git a/code/modules/mob/living/living_defense.dm b/code/modules/mob/living/living_defense.dm index fd31b22d414e..050b1ba9783c 100644 --- a/code/modules/mob/living/living_defense.dm +++ b/code/modules/mob/living/living_defense.dm @@ -275,7 +275,10 @@ for(var/obj/item/grab/G in grabbed_by) if(G.assailant == user) - to_chat(user, "You already grabbed [src].") + if(holder_type) // SS220 EDIT START + get_scooped(user) + else + to_chat(user, "Вы уже схватили [src.name].") // SS220 EDIT END return add_attack_logs(user, src, "Grabbed passively", ATKLOG_ALL) diff --git a/code/modules/mob/living/simple_animal/animal_defense.dm b/code/modules/mob/living/simple_animal/animal_defense.dm index 69079d0bcdd6..6f42e128fc5e 100644 --- a/code/modules/mob/living/simple_animal/animal_defense.dm +++ b/code/modules/mob/living/simple_animal/animal_defense.dm @@ -15,7 +15,10 @@ playsound(loc, 'sound/weapons/thudswoosh.ogg', 50, 1, -1) if(INTENT_GRAB) - grabbedby(M) + if(holder_type) // SS220 EDIT START + get_scooped(M) + else + grabbedby(M) // SS220 EDIT END if(INTENT_HARM, INTENT_DISARM) if(HAS_TRAIT(M, TRAIT_PACIFISM)) diff --git a/code/modules/mob/mob.dm b/code/modules/mob/mob.dm index 17ccb549f0f6..a5191c114e06 100644 --- a/code/modules/mob/mob.dm +++ b/code/modules/mob/mob.dm @@ -1218,7 +1218,7 @@ GLOBAL_LIST_INIT(slot_equipment_priority, list( \ to_chat(src, "Unable to find any unwelded vents to spawn mice at.") return FALSE var/obj/vent_found = pick(found_vents) - var/mob/living/simple_animal/mouse/host = new(vent_found.loc) + var/mob/living/simple_animal/mouse/host = prob(20) ? new /mob/living/simple_animal/mouse/rat(vent_found.loc) : new(vent_found.loc) // SS220 EDIT host.ckey = src.ckey to_chat(host, "You are now a mouse. Try to avoid interaction with players, and do not give hints away that you are more than a simple rodent.") host.forceMove(vent_found) diff --git a/modular_ss220/events/_events.dm b/modular_ss220/events/_events.dm index 9e38e87f6379..170ad50db032 100644 --- a/modular_ss220/events/_events.dm +++ b/modular_ss220/events/_events.dm @@ -1,4 +1,4 @@ /datum/modpack/events name = "Кастомные ивенты" desc = "Добавление новых ивентов" - author = "dj-34" + author = "dj-34, PhantomRU" diff --git a/modular_ss220/events/_events.dme b/modular_ss220/events/_events.dme index 967093b11acb..85d3a02f16e5 100644 --- a/modular_ss220/events/_events.dme +++ b/modular_ss220/events/_events.dme @@ -1,3 +1,5 @@ #include "_events.dm" #include "code/new_space_laws.dm" +#include "code/headcrabs.dm" +#include "code/infestation_extended.dm" diff --git a/modular_ss220/events/code/headcrabs.dm b/modular_ss220/events/code/headcrabs.dm new file mode 100644 index 000000000000..357e3d8cea44 --- /dev/null +++ b/modular_ss220/events/code/headcrabs.dm @@ -0,0 +1,72 @@ +#define HEADCRAB_NORMAL 0 +#define HEADCRAB_FASTMIX 1 +#define HEADCRAB_FAST 2 +#define HEADCRAB_POISONMIX 3 +#define HEADCRAB_POISON 4 +#define HEADCRAB_SPAWNER 5 + +/datum/event/headcrabs + announceWhen = 10 + endWhen = 11 + var/locstring + var/headcrab_type + +/datum/event/headcrabs/start() + var/list/availableareas = list() + for(var/area/station/maintenance/A in world) + availableareas += A + var/area/randomarea = pick(availableareas) + var/list/turf/simulated/floor/turfs = list() + for(var/turf/simulated/floor/F in randomarea) + if(turf_clear(F)) + turfs += F + var/list/spawn_types = list() + var/max_number + headcrab_type = rand(0, 5) + switch(headcrab_type) + if(HEADCRAB_NORMAL) + spawn_types = list(/mob/living/simple_animal/hostile/headcrab) + max_number = 6 + if(HEADCRAB_FASTMIX) + spawn_types = list(/mob/living/simple_animal/hostile/headcrab, /mob/living/simple_animal/hostile/headcrab/fast) + max_number = 8 + if(HEADCRAB_FAST) + spawn_types = list(/mob/living/simple_animal/hostile/headcrab/fast) + max_number = 6 + if(HEADCRAB_POISONMIX) + spawn_types = list(/mob/living/simple_animal/hostile/headcrab, /mob/living/simple_animal/hostile/headcrab/poison) + max_number = 4 + if(HEADCRAB_POISON) + spawn_types = list(/mob/living/simple_animal/hostile/headcrab/poison) + max_number = 3 + if(HEADCRAB_SPAWNER) + spawn_types = list(/obj/structure/spawner/headcrab) + max_number = 2 + + + var/num = rand(2,max_number) + + while(turfs.len > 0 && num > 0) + var/turf/simulated/floor/T = pick(turfs) + turfs.Remove(T) + num-- + var/spawn_type = pick(spawn_types) + new spawn_type(T) + + if(prob(15)) + var/turf/simulated/floor/T = pick(turfs) + new /obj/structure/spawner/headcrab(T) + +/datum/event/headcrabs/announce() + GLOB.major_announcement.Announce("Биосканеры фиксируют размножение хедкрабов на борту станции. Избавьтесь от них, прежде чем это начнет влиять на продуктивность станции", "ВНИМАНИЕ: НЕОПОЗНАННЫЕ ФОРМЫ ЖИЗНИ.") + +/datum/event_container/mundane/New() + . = ..() + available_events |= new /datum/event_meta(EVENT_LEVEL_MUNDANE, "Headcrab Infestation", /datum/event/headcrabs, 100, list(ASSIGNMENT_SECURITY = 30), TRUE) + +#undef HEADCRAB_NORMAL +#undef HEADCRAB_FASTMIX +#undef HEADCRAB_FAST +#undef HEADCRAB_POISONMIX +#undef HEADCRAB_POISON +#undef HEADCRAB_SPAWNER diff --git a/modular_ss220/events/code/infestation_extended.dm b/modular_ss220/events/code/infestation_extended.dm new file mode 100644 index 000000000000..b86b6fca1209 --- /dev/null +++ b/modular_ss220/events/code/infestation_extended.dm @@ -0,0 +1,123 @@ +#define VERM_RATS 0 +#define VERM_AXOLOTL 1 +#define VERM_FROGS 2 +#define VERM_IGUANAS 3 +#define VERM_SNAKES 4 +#define VERM_MOTH 5 +#define VERM_MOTHROACH 6 + +/datum/event/infestation/extended + announceWhen = 10 + endWhen = 11 + var/static/list/spawn_areas_extended = list( + /area/station/service/chapel, + /area/station/service/library, + /area/station/service/hydroponics, + /area/station/service/cafeteria, + /area/station/service/hydroponics, + /area/station/service/bar, + /area/station/service/kitchen, + /area/station/service/janitor, + /area/station/public/construction, + /area/station/public/arcade, + /area/station/public/toilet, + /area/station/public/fitness, + /area/station/engineering/atmos, + /area/station/engineering/tech_storage, + /area/station/security/armory/secure, + /area/station/security/permabrig, + /area/station/security/lobby, + /area/station/security/prison/cell_block/A, + /area/station/security/prison/cell_block/B, + /area/station/security/prison/cell_block/C, + ) + +/datum/event/infestation/extended/start() + var/list/turf/simulated/floor/turfs = list() + spawn_area_type = pick(spawn_areas_extended) + for(var/areapath in typesof(spawn_area_type)) + var/area/A = locate(areapath) + if(!A) + log_debug("Failed to locate area for extended infestation event!") + kill() + return + for(var/turf/simulated/floor/F in A.contents) + if(turf_clear(F)) + turfs += F + + var/list/spawn_types = list() + var/max_number + vermin = rand(0, 6) + switch(vermin) + if(VERM_RATS) + max_number = 12 + var/possible_vermin = rand(0, 2) + switch(possible_vermin) + if(0) + spawn_types = list(/mob/living/simple_animal/mouse/rat) + vermstring = "крыс" + if(1) + spawn_types = list(/mob/living/simple_animal/mouse/rat/irish) + vermstring = "ирландских крыс борцов за независимость" + if(2) + spawn_types = list(/mob/living/simple_animal/mouse/rat/white) + vermstring = "лабораторных крыс" + if(VERM_AXOLOTL) + spawn_types = list(/mob/living/simple_animal/lizard/axolotl) + max_number = 9 + vermstring = "аксолотлей" + if(VERM_IGUANAS) + spawn_types = list(/mob/living/simple_animal/hostile/lizard) + max_number = 5 + vermstring = "игуанн" + if(prob(10)) + spawn_types = list(/mob/living/simple_animal/hostile/lizard/gator) + max_number = 3 + vermstring = "аллигаторов" + if(VERM_SNAKES) + spawn_types = list(/mob/living/simple_animal/hostile/poison_snake) + max_number = 9 + vermstring = "ядовитых змей" + if(VERM_MOTH) + spawn_types = list(/mob/living/simple_animal/moth) + max_number = 5 + vermstring = "молей" + if(VERM_MOTHROACH) + spawn_types = list(/mob/living/simple_animal/mothroach) + max_number = 5 + vermstring = "молетараканов" + var/amount_to_spawn = rand(2, max_number) + while(length(turfs) && amount_to_spawn > 0) + var/turf/simulated/floor/T = pick_n_take(turfs) + amount_to_spawn-- + var/spawn_type = pick(spawn_types) + new spawn_type(T) + + +/datum/event/infestation/extended/announce(false_alarm) + var/vermin_chosen = vermstring || pick("неопознанных форм жизни", "золотых жуков", "ошибок", "насекомых", "тараканов", "муравьев", "щиткьюров", "ассистентов", "экипажа", "вульпканинов", "таяринов", "слаймов", "слаймоменов") + if(!spawn_area_type) + if(false_alarm) + spawn_area_type = pick(spawn_areas + spawn_areas_extended) + else + log_debug("Extended Infestation Event didn't provide an area to announce(), something is likely broken.") + kill() + + GLOB.minor_announcement.Announce("Биосканеры фиксируют размножение [vermin_chosen] в [initial(spawn_area_type.name)]. Избавьтесь от них, прежде чем это начнет влиять на продуктивность станции.", "ВНИМАНИЕ: НЕОПОЗНАННЫЕ ФОРМЫ ЖИЗНИ.") + spawn_area_type = null + +/datum/event/falsealarm/start() + possible_event_types |= /datum/event/infestation/extended + . = ..() + +/datum/event_container/mundane/New() + . = ..() + available_events |= new /datum/event_meta(EVENT_LEVEL_MUNDANE, "Vermin Infestation Extended", /datum/event/infestation/extended, 10, list(ASSIGNMENT_JANITOR = 100, ASSIGNMENT_SECURITY = 30)) + +#undef VERM_RATS +#undef VERM_AXOLOTL +#undef VERM_FROGS +#undef VERM_IGUANAS +#undef VERM_SNAKES +#undef VERM_MOTH +#undef VERM_MOTHROACH diff --git a/modular_ss220/mobs/_mobs.dm b/modular_ss220/mobs/_mobs.dm new file mode 100644 index 000000000000..a121601ad900 --- /dev/null +++ b/modular_ss220/mobs/_mobs.dm @@ -0,0 +1,4 @@ +/datum/modpack/mobs + name = "Мобы" + desc = "Пак животных, питомцев, холдеров для их держания и изменения." + author = "PhantomRU, dj-34" diff --git a/modular_ss220/mobs/_mobs.dme b/modular_ss220/mobs/_mobs.dme new file mode 100644 index 000000000000..f6946674aac3 --- /dev/null +++ b/modular_ss220/mobs/_mobs.dme @@ -0,0 +1,37 @@ +#include "_mobs.dm" + +#include "code/simple_animal/friendly/crab.dm" +#include "code/simple_animal/friendly/farm_animals.dm" +#include "code/simple_animal/friendly/frog.dm" +#include "code/simple_animal/friendly/hamster.dm" +#include "code/simple_animal/friendly/lizard.dm" +#include "code/simple_animal/friendly/moth.dm" +#include "code/simple_animal/friendly/mouse.dm" +#include "code/simple_animal/friendly/possum.dm" +#include "code/simple_animal/friendly/rat.dm" +#include "code/simple_animal/friendly/snail.dm" +#include "code/simple_animal/hostile/alien.dm" +#include "code/simple_animal/hostile/bear.dm" +#include "code/simple_animal/hostile/headcrab.dm" +#include "code/simple_animal/hostile/lizard.dm" +#include "code/simple_animal/hostile/snake.dm" +#include "code/simple_animal/hostile/spider.dm" +#include "code/simple_animal/hostile/syndi_rat.dm" +#include "code/simple_animal/hostile/undead.dm" +#include "code/simple_animal/pets/cat.dm" +#include "code/simple_animal/pets/dog.dm" +#include "code/simple_animal/pets/fashion.dm" +#include "code/simple_animal/pets/fox.dm" +#include "code/simple_animal/pets/pet.dm" +#include "code/simple_animal/pets/rouge.dm" +#include "code/simple_animal/pets/security_dogs.dm" +#include "code/simple_animal/pets/slugcat.dm" +#include "code/simple_animal/items.dm" +#include "code/simple_animal/mobs.dm" +#include "code/simple_animal/named_animals.dm" +#include "code/simple_animal/overrides.dm" +#include "code/supplypacks/crittercrate.dm" +#include "code/supplypacks/pack_animals.dm" +#include "code/mob_holder.dm" +#include "code/mob_spawner.dm" +#include "code/pet_carrier.dm" diff --git a/modular_ss220/mobs/code/mob_holder.dm b/modular_ss220/mobs/code/mob_holder.dm new file mode 100644 index 000000000000..bbfabc512007 --- /dev/null +++ b/modular_ss220/mobs/code/mob_holder.dm @@ -0,0 +1,365 @@ +// \code\modules\mob\mob_holder.dm +/obj/item/holder + icon_override = 'modular_ss220/mobs/icons/mob/inhead/head.dmi' + lefthand_file = 'modular_ss220/mobs/icons/mob/inhands/mobs_lefthand.dmi' + righthand_file = 'modular_ss220/mobs/icons/mob/inhands/mobs_righthand.dmi' + origin_tech = "biotech=2" + slot_flags = SLOT_HEAD + +/mob/living/simple_animal/attackby(obj/item/O, mob/living/user) + if(user.a_intent == INTENT_HELP || user.a_intent == INTENT_GRAB) + if(istype(O, /obj/item/pet_carrier)) + var/obj/item/pet_carrier/C = O + if(C.put_in_carrier(src, user)) + return + return ..() + + + + + + + + +//!!!!!!!!!! Проверить работу без этого прока, а потом с этим при захвате ПИИ, мышей, Куриц разных цветов +// /mob/living/proc/get_scooped(mob/living/carbon/grabber, has_variant = FALSE) +// . = ..() +// if(.) +// H.icon = icon +// H.icon_state = icon_state + +/mob/living/get_scooped(mob/living/carbon/grabber, has_variant = FALSE) + var/obj/item/holder/H = ..() + if(!H) + return FALSE + + switch(mob_size) + if(MOB_SIZE_TINY) + H.w_class = WEIGHT_CLASS_TINY + if(MOB_SIZE_SMALL) + H.w_class = WEIGHT_CLASS_SMALL + if(MOB_SIZE_HUMAN) + H.w_class = WEIGHT_CLASS_NORMAL + if(MOB_SIZE_LARGE) + H.w_class = WEIGHT_CLASS_HUGE + + return H + + +/obj/item/holder/diona + name = "diona nymph" + desc = "It's a tiny plant critter." + icon_state = "nymph" + origin_tech = "biotech=5" + slot_flags = SLOT_HEAD|SLOT_EARS + +/obj/item/holder/pai + name = "pAI" + desc = "It's a little robot." + icon_state = "pai" + origin_tech = "materials=3;programming=4;engineering=4" + slot_flags = SLOT_HEAD|SLOT_EARS + +/obj/item/holder/bunny + slot_flags = SLOT_HEAD|SLOT_EARS + +/obj/item/holder/mouse + name = "mouse" + desc = "It's a small, disease-ridden rodent." + icon = 'modular_ss220/mobs/icons/mob/animal.dmi' + icon_state = "mouse_gray" + slot_flags = SLOT_HEAD|SLOT_EARS + +/obj/item/holder/drone + name = "maintenance drone" + desc = "It's a small maintenance robot." + icon_state = "drone" + origin_tech = "materials=3;programming=4;powerstorage=3;engineering=4" + +/obj/item/holder/drone/emagged + name = "maintenance drone" + icon_state = "drone-emagged" + origin_tech = "materials=3;programming=4;powerstorage=3;engineering=4;syndicate=3" + +/obj/item/holder/cogscarab + name = "cogscarab" + desc = "A strange, drone-like machine. It constantly emits the hum of gears." + icon_state = "cogscarab" + origin_tech = "materials=3;magnets=4;powerstorage=9;bluespace=4" + +/obj/item/holder/monkey + name = "monkey" + desc = "It's a monkey" + icon_state = "monkey" + origin_tech = "biotech=3" + +/obj/item/holder/farwa + name = "farwa" + desc = "It's a farwa" + icon_state = "farwa" + origin_tech = "biotech=3" + +/obj/item/holder/stok + name = "stok" + desc = "It's a stok" + icon_state = "stok" + origin_tech = "biotech=3" + +/obj/item/holder/neara + name = "neara" + desc = "It's a neara" + icon_state = "neara" + origin_tech = "biotech=3" + +/obj/item/holder/corgi + name = "pet" + desc = "It's a pet" + icon = 'modular_ss220/mobs/icons/mob/pets.dmi' + icon_state = "corgi" + +/obj/item/holder/lisa + name = "pet" + desc = "It's a pet" + icon = 'modular_ss220/mobs/icons/mob/pets.dmi' + icon_state = "lisa" + +/obj/item/holder/old_corgi + name = "pet" + desc = "It's a pet" + icon = 'modular_ss220/mobs/icons/mob/pets.dmi' + icon_state = "old_corgi" + +/obj/item/holder/borgi + name = "pet" + desc = "It's a pet" + icon = 'modular_ss220/mobs/icons/mob/pets.dmi' + icon_state = "borgi" + +/obj/item/holder/void_puppy + name = "pet" + desc = "It's a pet" + icon = 'modular_ss220/mobs/icons/mob/pets.dmi' + icon_state = "void_puppy" + origin_tech = "biotech=4;bluespace=5" + +/obj/item/holder/slime_puppy + name = "pet" + desc = "It's a pet" + icon = 'modular_ss220/mobs/icons/mob/pets.dmi' + icon_state = "slime_puppy" + origin_tech = "biotech=6" + +/obj/item/holder/narsian + name = "pet" + desc = "It's a pet" + icon = 'modular_ss220/mobs/icons/mob/pets.dmi' + icon_state = "narsian" + slot_flags = null + origin_tech = "bluespace=10" + +/obj/item/holder/pug + name = "pet" + desc = "It's a pet" + icon = 'modular_ss220/mobs/icons/mob/pets.dmi' + icon_state = "pug" + +/obj/item/holder/fox + name = "pet" + desc = "It's a pet" + icon = 'modular_ss220/mobs/icons/mob/pets.dmi' + icon_state = "fox" + +/obj/item/holder/sloth + name = "pet" + desc = "It's a pet" + icon = 'modular_ss220/mobs/icons/mob/pets.dmi' + icon_state = "sloth" + slot_flags = null + +/obj/item/holder/cat + name = "pet" + desc = "It's a pet" + icon = 'modular_ss220/mobs/icons/mob/pets.dmi' + icon_state = "cat" + +/obj/item/holder/cat2 + name = "pet" + desc = "It's a pet" + icon = 'modular_ss220/mobs/icons/mob/pets.dmi' + icon_state = "cat2" + +/obj/item/holder/cak + name = "pet" + desc = "It's a pet" + icon = 'modular_ss220/mobs/icons/mob/pets.dmi' + icon_state = "cak" + origin_tech = "biotech=5" + +/obj/item/holder/fatcat + name = "pet" + desc = "It's a pet" + icon = 'modular_ss220/mobs/icons/mob/pets.dmi' + icon_state = "iriska" + origin_tech = "biotech=5" + slot_flags = null + +/obj/item/holder/crusher + name = "pet" + desc = "It's a pet" + icon = 'modular_ss220/mobs/icons/mob/pets.dmi' + icon_state = "crusher" + +/obj/item/holder/original + name = "pet" + desc = "It's a pet" + icon = 'modular_ss220/mobs/icons/mob/pets.dmi' + icon_state = "original" + +/obj/item/holder/spacecat + name = "pet" + desc = "It's a pet" + icon = 'modular_ss220/mobs/icons/mob/pets.dmi' + icon_state = "spacecat" + +/obj/item/holder/bullterrier + name = "pet" + desc = "It's a pet" + icon = 'modular_ss220/mobs/icons/mob/pets.dmi' + icon_state = "bullterrier" + slot_flags = null + +/obj/item/holder/crab + name = "pet" + desc = "It's a pet" + icon = 'modular_ss220/mobs/icons/mob/animal.dmi' + icon_state = "crab" + +/obj/item/holder/evilcrab + name = "pet" + desc = "It's a pet" + icon = 'modular_ss220/mobs/icons/mob/animal.dmi' + icon_state = "evilcrab" + +/obj/item/holder/snake + name = "pet" + desc = "It's a pet" + icon_state = "snake" + +/obj/item/holder/parrot + name = "pet" + desc = "It's a pet" + icon = 'modular_ss220/mobs/icons/mob/animal.dmi' + icon_state = "parrot_fly" + +/obj/item/holder/axolotl + name = "pet" + desc = "It's a pet" + icon = 'modular_ss220/mobs/icons/mob/animal.dmi' + icon_state = "axolotl" + +/obj/item/holder/lizard + name = "pet" + desc = "It's a pet" + icon = 'modular_ss220/mobs/icons/mob/animal.dmi' + icon_state = "lizard" + +/obj/item/holder/chick + name = "pet" + desc = "It's a small chicken" + icon = 'modular_ss220/mobs/icons/mob/animal.dmi' + icon_state = "chick" + +/obj/item/holder/chicken + name = "pet" + desc = "It's a chicken" + icon = 'modular_ss220/mobs/icons/mob/animal.dmi' + icon_state = "chicken_brown" + slot_flags = null + +/obj/item/holder/cock + name = "pet" + desc = "It's a pet" + icon = 'modular_ss220/mobs/icons/mob/animal.dmi' + icon_state = "cock" + slot_flags = null + +/obj/item/holder/hamster + name = "pet" + desc = "It's a pet" + icon = 'modular_ss220/mobs/icons/mob/animal.dmi' + icon_state = "hamster" + +/obj/item/holder/hamster_rep + name = "Представитель Алексей" + desc = "Уважаемый хомяк" + icon = 'modular_ss220/mobs/icons/mob/animal.dmi' + icon_state = "hamster_rep" + +/obj/item/holder/fennec + name = "fennec" + desc = "It's a fennec. Yiff!" + icon_state = "fennec" + origin_tech = "biotech=4" + +/obj/item/holder/mothroach + name = "mothroach" + desc = "Bzzzz" + icon = 'modular_ss220/mobs/icons/mob/pets.dmi' + icon_state = "mothroach" + origin_tech = "biotech=4" + +/obj/item/holder/moth + name = "moth" + desc = "Bzzzz" + icon = 'modular_ss220/mobs/icons/mob/animal.dmi' + icon_state = "moth" + origin_tech = "biotech=4" + +/obj/item/holder/headslug + name = "headslug" + desc = "It's a headslug. Ewwww..." + icon = 'modular_ss220/mobs/icons/mob/animal.dmi' + icon_state = "headslug" + origin_tech = "biotech=6" + +/obj/item/holder/possum + name = "possum" + desc = "It's a possum. Ewwww..." + icon = 'modular_ss220/mobs/icons/mob/pets.dmi' + icon_state = "possum" + origin_tech = "biotech=3" + +/obj/item/holder/possum/poppy + name = "poppy" + desc = "It's a possum Poppy. Ewwww..." + icon = 'modular_ss220/mobs/icons/mob/pets.dmi' + icon_state = "possum_poppy" + +/obj/item/holder/frog + name = "frog" + desc = "It's a wednesday, my dudes." + icon = 'modular_ss220/mobs/icons/mob/animal.dmi' + icon_state = "frog" + +/obj/item/holder/frog/toxic + name = "rare frog" + desc = "It's a toxic wednesday, my dudes." + icon_state = "rare_frog" + +/obj/item/holder/snail + name = "snail" + desc = "Slooooow" + icon = 'modular_ss220/mobs/icons/mob/animal.dmi' + icon_state = "snail" + +/obj/item/holder/turtle + name = "yeeslow" + desc = "Slooooow" + icon = 'modular_ss220/mobs/icons/mob/animal.dmi' + icon_state = "yeeslow" + +/obj/item/holder/clowngoblin + name = "clowngoblin" + desc = "Honk honk" + icon = 'modular_ss220/mobs/icons/mob/animal.dmi' + icon_state = "clowngoblin" diff --git a/modular_ss220/mobs/code/mob_spawner.dm b/modular_ss220/mobs/code/mob_spawner.dm new file mode 100644 index 000000000000..c0c8d4798e25 --- /dev/null +++ b/modular_ss220/mobs/code/mob_spawner.dm @@ -0,0 +1,20 @@ +/obj/structure/spawner/headcrab + name = "headcrab nest" + desc = "A living nest for headcrabs. It is moving ominously." + icon_state = "headcrab_nest" + icon = 'modular_ss220/mobs/icons/mob/headcrab.dmi' + max_integrity = 200 + max_mobs = 15 + spawn_time = 600 + mob_types = list(/mob/living/simple_animal/hostile/headcrab, /mob/living/simple_animal/hostile/headcrab/fast, /mob/living/simple_animal/hostile/headcrab/poison) + spawn_text = "crawls out of" + faction = list("hostile") + +// Headcrab corpse +/obj/effect/mob_spawn/headcrab + mob_type = /mob/living/simple_animal/hostile/headcrab + death = TRUE + name = "Dead headcrab" + desc = "A small dead parasitic creature that would like to connect with your brain stem." + icon = 'modular_ss220/mobs/icons/mob/headcrab.dmi' + icon_state = "headcrab_dead" diff --git a/modular_ss220/mobs/code/pet_carrier.dm b/modular_ss220/mobs/code/pet_carrier.dm new file mode 100644 index 000000000000..11e03c0f14d4 --- /dev/null +++ b/modular_ss220/mobs/code/pet_carrier.dm @@ -0,0 +1,268 @@ +/obj/item/pet_carrier + name = "маленькая переноска" + desc = "Переноска для маленьких животных. " + icon = 'modular_ss220/mobs/icons/pet_carrier.dmi' + icon_state = "pet_carrier" + item_state = "pet_carrier" + max_integrity = 100 + w_class = WEIGHT_CLASS_SMALL + var/mob_size = MOB_SIZE_SMALL + + var/list/possible_skins = list("black", "blue", "red", "yellow", "green", "purple") + var/color_skin + + var/opened = TRUE + var/contains_pet = FALSE + var/contains_pet_color_open = "#d8d8d8ff" + var/contains_pet_color_close = "#949494ff" + +/obj/item/pet_carrier/normal + name = "переноска" + desc = "Переноска для небольших животных. " + icon_state = "pet_carrier_normal" + item_state = "pet_carrier_normal" + max_integrity = 200 + w_class = WEIGHT_CLASS_NORMAL + mob_size = MOB_SIZE_LARGE + + +/obj/item/pet_carrier/Initialize(mapload) + . = ..() + if(!color_skin) + color_skin = pick(possible_skins) + update_icon() + +/obj/item/pet_carrier/Destroy() + free_content() + . = ..() + +/obj/item/pet_carrier/attack_self(mob/user) + ..() + change_state() + +/obj/item/pet_carrier/attackby(obj/item/I, mob/user, params) + if(istype(I, /obj/item/holder)) + var/obj/item/holder/H = I + for(var/mob/M in H.contents) + if(put_in_carrier(M, user)) + qdel(H) + return TRUE + return FALSE + . = ..() + +/obj/item/pet_carrier/emp_act(intensity) + for(var/mob/living/M in contents) + M.emp_act(intensity) + +/obj/item/pet_carrier/ex_act(intensity) + for(var/mob/living/M in contents) + M.ex_act(intensity) + +/obj/item/pet_carrier/AltClick(mob/user) + if(ishuman(user) && Adjacent(user) && !user.incapacitated(FALSE, TRUE, TRUE)) + try_free_content(user = user) + +/obj/item/pet_carrier/proc/put_in_carrier(mob/living/target, mob/living/user) + if(!opened) + to_chat(user, "Ваша переноска закрыта!") + return FALSE + if(contains_pet) + to_chat(user, "Ваша переноска заполнена!") + return FALSE + if(target.mob_size > mob_size) + to_chat(user, "Ваша переноска слишком мала!") + return FALSE + //if(target.mob_size < mob_size) + // to_chat(user, "Ваша переноска слишком большая!") + // return FALSE + + target.forceMove(src) + name += " ([target.name])" + if(target.desc) + desc += "\n\nВнутри [target.name]\n" + desc += target.desc + contains_pet = TRUE + + to_chat(user, "Вы поместили [target.name] в [src.name].") + to_chat(target, "[user.name] поместил[user.gender == FEMALE ? "" : "а"] вас в [src.name].") + update_icon() + return TRUE + +/obj/item/pet_carrier/proc/try_free_content(atom/new_location, mob/user) + if(!opened) + if(user) + to_chat(user, "Ваша переноска закрыта! Содержимое невозможно выгрузить!") + return FALSE + free_content(new_location) + +/obj/item/pet_carrier/proc/free_content(atom/new_location) + if(istype(loc,/turf) || length(contents)) + for(var/mob/M in contents) + var/atom/movable/mob_container + mob_container = M + mob_container.forceMove(new_location ? new_location : get_turf(src)) + contains_pet = FALSE + name = initial(name) + desc = initial(desc) + update_icon() + return TRUE + return FALSE + +/obj/item/pet_carrier/proc/change_state() + opened = !opened + update_icon() + +/obj/item/pet_carrier/update_icon() + overlays.Cut() + if(contains_pet) + var/mob/living/M + for(var/mob/living/temp_M in contents) + M = temp_M + break + var/image/I = image(M.icon, icon_state = M.icon_state) + I.color = opened ? contains_pet_color_open : contains_pet_color_close + I.pixel_y = M.mob_size <= MOB_SIZE_TINY ? 6 : 3 + overlays += I + + if(!opened) + var/image/I = image(icon, icon_state = "[icon_state]_door") + overlays += I + + if(color_skin) + var/image/I = image(icon, icon_state = "[icon_state]_[color_skin]") + overlays += I + + return ..() + +/obj/item/pet_carrier/emp_act(intensity) + for(var/mob/living/M in contents) + M.emp_act(intensity) + +/obj/item/pet_carrier/ex_act(intensity) + for(var/mob/living/M in contents) + M.ex_act(intensity) + +/obj/item/pet_carrier/container_resist(mob/living/L) + var/breakout_time = 60 SECONDS //1 minute + var/breakout_time_open = 5 SECONDS //for escape + + if(do_after(L,(breakout_time_open/2), target = src)) + to_chat(L, "ТЕСТ 1 - Вы начали вылезать из переноски (это займет [breakout_time_open] секунд, не двигайтесь)") + + if(do_after(L,(breakout_time_open/2))) + to_chat(L, "ТЕСТ 2 - Вы начали вылезать из переноски (это займет [breakout_time_open] секунд, не двигайтесь)") + + if(do_after(L,(breakout_time_open/2), target = loc)) + to_chat(L, "ТЕСТ 3 - Вы начали вылезать из переноски (это займет [breakout_time_open] секунд, не двигайтесь)") + + if(do_after(L,(breakout_time_open/2), target = src.loc)) + to_chat(L, "ТЕСТ 4 - Вы начали вылезать из переноски (это займет [breakout_time_open] секунд, не двигайтесь)") + + if(do_after(L,(breakout_time_open/2), target = L)) + to_chat(L, "ТЕСТ 5 - Вы начали вылезать из переноски (это займет [breakout_time_open] секунд, не двигайтесь)") + + if(do_after(L,(breakout_time_open/2), target = L.loc)) + to_chat(L, "ТЕСТ 6 - Вы начали вылезать из переноски (это займет [breakout_time_open] секунд, не двигайтесь)") + + + + if(opened && L.loc == src) + to_chat(L, "Вы начали вылезать из переноски (это займет [breakout_time_open] секунд, не двигайтесь)") + spawn(0) + if(do_after(L,(breakout_time_open), target = src)) + if(!src || !L || L.stat != CONSCIOUS || L.loc != src || !opened) + to_chat(L, "Побег прерван!") + return + + free_content() + visible_message("[L.name] вылез из переноски.") + return + + to_chat(L, "Вы начали ломиться в закрытую дверцу переноски и пытаетесь её выбить или открыть. (это займет [breakout_time] секунд, не двигайтесь)") + for(var/mob/O in viewers(usr.loc)) + O.show_message("[src.name] начинает трястись!", 1) + + spawn(0) + if(do_after(L,(breakout_time), target = src)) + if(!src || !L || L.stat != CONSCIOUS || L.loc != src || opened) //closet/user destroyed OR user dead/unconcious OR user no longer in closet OR closet opened + to_chat(L, "Побег прерван!") + return + + var/mob/M = src.loc + if(istype(M)) + to_chat(M, "[src.name] вырывается из вашей переноски!") + to_chat(L, "Вы вырываетесь из переноски [M.name]!") + else + to_chat(L, "Вы выбираетесь из переноски.") + + //Free & open + free_content() + change_state() + return + +/obj/item/pet_carrier/verb/open_close() + set name = "Открыть/закрыть переноску" + set desc = "Меняет состояние дверцы переноски, блокируя или разблокируя возможность достать содержимое." + set category = "Object" + + if(usr.stat || !ishuman(usr) || usr.restrained()) + return + + change_state() + +/obj/item/pet_carrier/verb/unload_content() + set name = "Опустошить переноску" + set desc = "Вытаскивает животное из переноски." + set category = "Object" + + if(usr.stat || !ishuman(usr) || usr.restrained()) + return + + try_free_content(user = usr) + +/obj/item/pet_carrier/MouseDrop(obj/over_object) + if(ishuman(usr)) + var/mob/M = usr + + if(istype(M.loc,/obj/mecha) || M.incapacitated(FALSE, TRUE, TRUE)) // Stops inventory actions in a mech as well as while being incapacitated + return + + if(over_object == M && Adjacent(M)) // this must come before the screen objects only block + try_free_content(M, M) + return + + if((istype(over_object, /obj/structure/table) || istype(over_object, /turf/simulated/floor)) \ + && length(contents) && loc == usr && !usr.stat && !usr.restrained() && over_object.Adjacent(usr)) + var/turf/T = get_turf(over_object) + if(istype(over_object, /turf/simulated/floor)) + if(get_turf(usr) != T) + return // Can only empty containers onto the floor under you + if("Да" != alert(usr,"Вытащить питомца из [src.name] на [T.name]?","Подтверждение","Да","Нет")) + return + if(!(usr && over_object && contents.len && loc == usr && !usr.stat && !usr.restrained() && get_turf(usr) == T)) + return // Something happened while the player was thinking + + usr.face_atom(over_object) + usr.visible_message("[usr] вытащил питомца из [src.name] на [over_object.name].", + "Вы вытащили питомца из [src.name] на [over_object.name].") + + try_free_content(T, usr) + return TRUE + + if(!(istype(over_object, /obj/screen))) + return ..() + if(!(loc == usr) || (loc && loc.loc == usr)) + return + playsound(loc, "rustle", 50, TRUE, -5) + if(!(M.restrained()) && !(M.stat)) + switch(over_object.name) + if("r_hand") + if(!M.unEquip(src)) + return + M.put_in_r_hand(src) + if("l_hand") + if(!M.unEquip(src)) + return + M.put_in_l_hand(src) + add_fingerprint(usr) + return diff --git a/modular_ss220/mobs/code/simple_animal/friendly/crab.dm b/modular_ss220/mobs/code/simple_animal/friendly/crab.dm new file mode 100644 index 000000000000..55d032eb578c --- /dev/null +++ b/modular_ss220/mobs/code/simple_animal/friendly/crab.dm @@ -0,0 +1,38 @@ +/mob/living/simple_animal/crab + death_sound = 'modular_ss220/mobs/sound/creatures/crack_death2.ogg' + mob_size = MOB_SIZE_SMALL + response_help = "гладит" + response_disarm = "отталкивает" + response_harm = "щипает" + holder_type = /obj/item/holder/crab + +/mob/living/simple_animal/crab/sea + name = "морской краб" + desc = "Кто проживает на дне океана?" + icon = 'modular_ss220/mobs/icons/mob/animal.dmi' + icon_state = "bluecrab" + icon_living = "bluecrab" + icon_dead = "bluecrab_dead" + response_help = "гладит" + response_disarm = "отталкивает" + response_harm = "щипает" + health = 50 + maxHealth = 50 + butcher_results = list(/obj/item/reagent_containers/food/snacks/meat = 3) + +/mob/living/simple_animal/crab/royal + name = "королевский краб" + desc = "Величественный королевский краб." + icon = 'modular_ss220/mobs/icons/mob/animal.dmi' + icon_state = "royalcrab" + icon_living = "royalcrab" + icon_dead = "royalcrab_dead" + response_help = "с уважением гладит" + response_disarm = "с уважением отталкивает" + response_harm = "щипает без уважения" + health = 50 + maxHealth = 50 + butcher_results = list(/obj/item/reagent_containers/food/snacks/meat = 5) + +/mob/living/simple_animal/crab/evil + holder_type = /obj/item/holder/evilcrab diff --git a/modular_ss220/mobs/code/simple_animal/friendly/farm_animals.dm b/modular_ss220/mobs/code/simple_animal/friendly/farm_animals.dm new file mode 100644 index 000000000000..5386a7a522be --- /dev/null +++ b/modular_ss220/mobs/code/simple_animal/friendly/farm_animals.dm @@ -0,0 +1,129 @@ +/mob/living/simple_animal/hostile/retaliate/goat + tts_seed = "Muradin" + + attacktext = "бодает" + death_sound = 'modular_ss220/mobs/sound/creatures/goat_death.ogg' + +/mob/living/simple_animal/cow + tts_seed = "Cairne" + + attacktext = "бодает" + death_sound = 'modular_ss220/mobs/sound/creatures/cow_death.ogg' + damaged_sound = list('modular_ss220/mobs/sound/creatures/cow_damaged.ogg') + talk_sound = list('modular_ss220/mobs/sound/creatures/cow_talk1.ogg', 'modular_ss220/mobs/sound/creatures/cow_talk2.ogg') + +/mob/living/simple_animal/chicken + name = "курица" + desc = "Гордая несушка. Яички должны быть хороши!" + tts_seed = "Windranger" + death_sound = 'modular_ss220/mobs/sound/creatures/chicken_death.ogg' + damaged_sound = list('modular_ss220/mobs/sound/creatures/chicken_damaged1.ogg', 'modular_ss220/mobs/sound/creatures/chicken_damaged2.ogg') + talk_sound = list('modular_ss220/mobs/sound/creatures/chicken_talk.ogg') + holder_type = /obj/item/holder/chicken + +/mob/living/simple_animal/chick + name = "цыпленок" + desc = "Маленькая прелесть! Но пока что маловата..." + tts_seed = "Meepo" + attacktext = "клюёт" + death_sound = 'modular_ss220/mobs/sound/creatures/mouse_squeak.ogg' + holder_type = /obj/item/holder/chick + +/mob/living/simple_animal/chick/Life(seconds, times_fired) + if(amount_grown >= 100 && prob(20)) + var/mob/living/simple_animal/C = new /mob/living/simple_animal/cock(loc) + if(mind) + mind.transfer_to(C) + qdel(src) + . = ..() + +/mob/living/simple_animal/cock + name = "петух" + desc = "Гордый и важный вид." + gender = MALE + icon = 'modular_ss220/mobs/icons/mob/animal.dmi' + icon_state = "cock" + icon_living = "cock" + icon_dead = "cock_dead" + speak = list("Cluck!","BWAAAAARK BWAK BWAK BWAK!","Bwaak bwak.") + speak_emote = list("clucks","croons") + emote_hear = list("clucks") + emote_see = list("pecks at the ground","flaps its wings viciously") + tts_seed = "pantheon" + density = 0 + speak_chance = 2 + turns_per_move = 3 + butcher_results = list(/obj/item/reagent_containers/food/snacks/meat = 4) + response_help = "pets the" + response_disarm = "gently pushes aside the" + response_harm = "kicks the" + melee_damage_type = STAMINA + melee_damage_lower = 2 + melee_damage_upper = 6 + attacktext = "клюёт" + death_sound = 'modular_ss220/mobs/sound/creatures/chicken_death.ogg' + damaged_sound = list('modular_ss220/mobs/sound/creatures/chicken_damaged1.ogg', 'modular_ss220/mobs/sound/creatures/chicken_damaged2.ogg') + talk_sound = list('modular_ss220/mobs/sound/creatures/chicken_talk.ogg') + health = 30 + maxHealth = 30 + ventcrawler = 2 + pass_flags = PASSTABLE | PASSMOB + mob_size = MOB_SIZE_SMALL + can_hide = 1 + can_collar = 1 + gold_core_spawnable = FRIENDLY_SPAWN + footstep_type = FOOTSTEP_MOB_CLAW + holder_type = /obj/item/holder/cock + +/mob/living/simple_animal/cock/npc_safe(mob/user) + return TRUE + +/mob/living/simple_animal/pig + name = "свинья" + tts_seed = "Anubarak" + attacktext = "лягает" + death_sound = 'modular_ss220/mobs/sound/creatures/pig_death.ogg' + talk_sound = list('modular_ss220/mobs/sound/creatures/pig_talk1.ogg', 'modular_ss220/mobs/sound/creatures/pig_talk2.ogg') + damaged_sound = list() + +/mob/living/simple_animal/pig/npc_safe(mob/user) + return TRUE + +/mob/living/simple_animal/turkey + name = "индюшка" + desc = "И не благодари." + death_sound = 'modular_ss220/mobs/sound/creatures/duck_quak1.ogg' + + +/mob/living/simple_animal/goose + name = "гусь" + desc = "Прекрасная птица для набива подушек и страха детишек." + icon_resting = "goose_rest" + melee_damage_type = STAMINA + melee_damage_lower = 2 + melee_damage_upper = 8 + attacktext = "щипает" + death_sound = 'modular_ss220/mobs/sound/creatures/duck_quak1.ogg' + talk_sound = list('modular_ss220/mobs/sound/creatures/duck_talk1.ogg', 'modular_ss220/mobs/sound/creatures/duck_talk2.ogg', 'modular_ss220/mobs/sound/creatures/duck_talk3.ogg', 'modular_ss220/mobs/sound/creatures/duck_quak1.ogg', 'modular_ss220/mobs/sound/creatures/duck_quak2.ogg', 'modular_ss220/mobs/sound/creatures/duck_quak3.ogg') + damaged_sound = list('modular_ss220/mobs/sound/creatures/duck_aggro1.ogg', 'modular_ss220/mobs/sound/creatures/duck_aggro2.ogg') + +/mob/living/simple_animal/goose/npc_safe(mob/user) + return TRUE + +/mob/living/simple_animal/goose/gosling + name = "гусенок" + desc = "Симпатичный гусенок. Скоро он станей грозой всей станции." + icon = 'modular_ss220/mobs/icons/mob/animal.dmi' + icon_state = "gosling" + icon_living = "gosling" + icon_dead = "gosling_dead" + icon_resting = "gosling_rest" + butcher_results = list(/obj/item/reagent_containers/food/snacks/meat = 3) + melee_damage_lower = 0 + melee_damage_upper = 0 + health = 20 + maxHealth = 20 + +/mob/living/simple_animal/seal + tts_seed = "Narrator" + death_sound = 'modular_ss220/mobs/sound/creatures/seal_death.ogg' diff --git a/modular_ss220/mobs/code/simple_animal/friendly/frog.dm b/modular_ss220/mobs/code/simple_animal/friendly/frog.dm new file mode 100644 index 000000000000..5f0fc7aa4c52 --- /dev/null +++ b/modular_ss220/mobs/code/simple_animal/friendly/frog.dm @@ -0,0 +1,148 @@ +/mob/living/simple_animal/frog + name = "лягушка" + real_name = "лягушка" + desc = "Выглядит грустным не по средам и когда её не целуют." + icon = 'modular_ss220/mobs/icons/mob/animal.dmi' + icon_state = "frog" + icon_living = "frog" + icon_dead = "frog_dead" + icon_resting = "frog" + speak = list("Квак!","КУААК!","Квуак!") + speak_emote = list("квак","куак","квуак") + emote_hear = list("квак","куак","квуак") + emote_see = list("лежит расслабленная", "издает гортанные звуки", "лупает глазками") + var/scream_sound = list ('modular_ss220/mobs/sound/creatures/frog_scream_1.ogg','modular_ss220/mobs/sound/creatures/frog_scream_2.ogg','modular_ss220/mobs/sound/creatures/frog_scream_3.ogg') + talk_sound = list('modular_ss220/mobs/sound/creatures/frog_talk1.ogg', 'modular_ss220/mobs/sound/creatures/frog_talk2.ogg') + damaged_sound = list('modular_ss220/mobs/sound/creatures/frog_damaged.ogg') + death_sound = 'modular_ss220/mobs/sound/creatures/frog_death.ogg' + tts_seed = "pantheon" + speak_chance = 1 + turns_per_move = 5 + see_in_dark = 10 + maxHealth = 10 + health = 10 + blood_volume = BLOOD_VOLUME_SURVIVE + butcher_results = list(/obj/item/reagent_containers/food/snacks/monstermeat/lizardmeat = 1) + response_help = "pets" + response_disarm = "gently pushes aside" + response_harm = "stamps on" + density = 0 + ventcrawler = 2 + pass_flags = PASSTABLE | PASSGRILLE | PASSMOB + mob_size = MOB_SIZE_TINY + layer = MOB_LAYER + atmos_requirements = list("min_oxy" = 16, "max_oxy" = 0, "min_tox" = 0, "max_tox" = 1, "min_co2" = 0, "max_co2" = 5, "min_n2" = 0, "max_n2" = 0) + minbodytemp = 223 // Below -50 Degrees Celcius + maxbodytemp = 323 // Above 50 Degrees Celcius + universal_speak = 0 + can_hide = 1 + holder_type = /obj/item/holder/frog + can_collar = 1 + gold_core_spawnable = FRIENDLY_SPAWN + +/mob/living/simple_animal/frog/toxic + name = "яркая лягушка" + real_name = "яркая лягушка" + desc = "Уникальная токсичная раскраска. Лучше не трогать голыми руками." + icon_state = "rare_frog" + icon_living = "rare_frog" + icon_dead = "rare_frog_dead" + icon_resting = "rare_frog" + var/toxin_per_touch = 2.5 + var/toxin_type = "toxin" + gold_core_spawnable = HOSTILE_SPAWN + holder_type = /obj/item/holder/frog/toxic + +/mob/living/simple_animal/frog/scream + name = "орущая лягушка" + real_name = "орущая лягушка" + desc = "Не любит когда на неё наступают. Используется в качестве наказания за проступки" + var/squeak_sound = list ('modular_ss220/mobs/sound/creatures/frog_scream1.ogg','modular_ss220/mobs/sound/creatures/frog_scream2.ogg') + gold_core_spawnable = NO_SPAWN + +// Frog procs +/mob/living/simple_animal/frog/attack_hand(mob/living/carbon/human/M as mob) + if(M.a_intent == INTENT_HELP) + get_scooped(M) + ..() + +/mob/living/simple_animal/frog/Crossed(AM as mob|obj, oldloc) + if(ishuman(AM)) + if(!stat) + var/mob/M = AM + to_chat(M, "[bicon(src)] квакнул!") + ..() + +// Toxic frog procs +/mob/living/simple_animal/frog/toxic/attack_hand(mob/living/carbon/human/H as mob) + if(ishuman(H)) + if(!istype(H.gloves, /obj/item/clothing/gloves)) + for(var/obj/item/organ/external/A in H.bodyparts) + if(!A.is_robotic()) + if((A.body_part == HAND_LEFT) || (A.body_part == HAND_RIGHT)) + to_chat(H, "Дотронувшись до [src.name], ваша кожа начинает чесаться!") + toxin_affect(H) + if(H.a_intent == INTENT_DISARM || H.a_intent == INTENT_HARM) + ..() + ..() + +/mob/living/simple_animal/frog/toxic/Crossed(AM as mob|obj, oldloc) + if(ishuman(AM)) + var/mob/living/carbon/human/H = AM + if(!istype(H.shoes, /obj/item/clothing/shoes)) + for(var/obj/item/organ/external/F in H.bodyparts) + if(!F.is_robotic()) + if((F.body_part == FOOT_LEFT) || (F.body_part == FOOT_RIGHT)) + toxin_affect(H) + to_chat(H, "Ваши ступни начинают чесаться!") + ..() + +/mob/living/simple_animal/frog/toxic/proc/toxin_affect(mob/living/carbon/human/M as mob) + if(M.reagents && !toxin_per_touch == 0) + M.reagents.add_reagent(toxin_type, toxin_per_touch) + +// Scream frog procs +/mob/living/simple_animal/frog/scream/Initialize(mapload) + . = ..() + AddComponent(/datum/component/squeak, squeak_sound, 50, extrarange = SHORT_RANGE_SOUND_EXTRARANGE) //as quiet as a frog or whatever + +/mob/living/simple_animal/frog/toxic/scream + var/squeak_sound = list ('modular_ss220/mobs/sound/creatures/frog_scream1.ogg','modular_ss220/mobs/sound/creatures/frog_scream2.ogg') + gold_core_spawnable = NO_SPAWN + +/mob/living/simple_animal/frog/toxic/scream/Initialize(mapload) + . = ..() + AddComponent(/datum/component/squeak, squeak_sound, 50, extrarange = SHORT_RANGE_SOUND_EXTRARANGE) //as quiet as a frog or whatever + +// Additional procs +/mob/living/simple_animal/frog/handle_automated_movement() + . = ..() + if(!resting && !buckled) + if(prob(1)) + custom_emote(1,"издаёт боевой клич!") + playsound(src, pick(src.scream_sound), 50, TRUE) + +/mob/living/simple_animal/frog/emote(act, m_type = 1, message = null, intentional, force) + if(incapacitated()) + return + + var/on_CD = 0 + act = lowertext(act) + switch(act) + if("warcry") + on_CD = start_audio_emote_cooldown() + else + on_CD = 0 + + if(!force && on_CD == 1) + return + + switch(act) + if("warcry") + message = "издаёт боевой клич!" + m_type = 2 //audible + playsound(src, pick(src.scream_sound), 50, TRUE) + if("help") + to_chat(src, "warcry") + ..() + diff --git a/modular_ss220/mobs/code/simple_animal/friendly/hamster.dm b/modular_ss220/mobs/code/simple_animal/friendly/hamster.dm new file mode 100644 index 000000000000..e959237219ab --- /dev/null +++ b/modular_ss220/mobs/code/simple_animal/friendly/hamster.dm @@ -0,0 +1,93 @@ +/mob/living/simple_animal/mouse/hamster + name = "хомяк" + real_name = "хомяк" + desc = "С надутыми щечками." + icon = 'modular_ss220/mobs/icons/mob/animal.dmi' + icon_state = "hamster" + icon_living = "hamster" + icon_dead = "hamster_dead" + icon_resting = "hamster_rest" + gender = MALE + non_standard = TRUE + speak_chance = 0 + childtype = list(/mob/living/simple_animal/mouse/hamster/baby) + animal_species = /mob/living/simple_animal/mouse/hamster + holder_type = /obj/item/holder/hamster + gold_core_spawnable = FRIENDLY_SPAWN + tts_seed = "Gyro" + maxHealth = 10 + health = 10 + + +/mob/living/simple_animal/mouse/hamster/baby + name = "хомячок" + real_name = "хомячок" + desc = "Очень миленький! Какие у него пушистые щечки!" + tts_seed = "Meepo" + turns_per_move = 2 + response_help = "полапал" + response_disarm = "аккуратно отодвинул" + response_harm = "пихнул" + attacktext = "толкается" + transform = matrix(0.7, 0, 0, 0, 0.7, 0) + health = 3 + maxHealth = 3 + var/amount_grown = 0 + can_hide = 1 + can_collar = 0 + holder_type = /obj/item/holder/hamster + +// Hamster procs +#define MAX_HAMSTER 20 +GLOBAL_VAR_INIT(hamster_count, 0) + +/mob/living/simple_animal/mouse/hamster/color_pick() + reinitial() + return + +/mob/living/simple_animal/mouse/hamster/New() + gender = prob(80) ? MALE : FEMALE + desc += MALE ? " Самец!" : " Самочка! Ох... Нет... " + GLOB.hamster_count++ + . = ..() + +/mob/living/simple_animal/mouse/hamster/Destroy() + GLOB.hamster_count-- + . = ..() + +/mob/living/simple_animal/mouse/hamster/death(gibbed) + if(!gibbed) + GLOB.hamster_count-- + . = ..() + +/mob/living/simple_animal/mouse/hamster/pull_constraint(atom/movable/AM, show_message = FALSE) + return TRUE + +/mob/living/simple_animal/mouse/hamster/Life(seconds, times_fired) + ..() + if(GLOB.hamster_count < MAX_HAMSTER) + make_babies() + +/mob/living/simple_animal/mouse/hamster/baby/start_pulling(atom/movable/AM, state, force = pull_force, show_message = FALSE) + if(show_message) + to_chat(src, "Вы слишком малы чтобы что-то тащить.") + return + +/mob/living/simple_animal/mouse/hamster/baby/Life(seconds, times_fired) + . =..() + if(.) + amount_grown++ + if(amount_grown >= 100) + var/mob/living/simple_animal/A = new /mob/living/simple_animal/mouse/hamster(loc) + if(mind) + mind.transfer_to(A) + qdel(src) + +/mob/living/simple_animal/mouse/hamster/baby/Crossed(AM as mob|obj, oldloc) + if(ishuman(AM)) + if(!stat) + var/mob/M = AM + to_chat(M, "[bicon(src)] раздавлен!") + death() + splat(user = AM) + ..() diff --git a/modular_ss220/mobs/code/simple_animal/friendly/lizard.dm b/modular_ss220/mobs/code/simple_animal/friendly/lizard.dm new file mode 100644 index 000000000000..4d80124152d1 --- /dev/null +++ b/modular_ss220/mobs/code/simple_animal/friendly/lizard.dm @@ -0,0 +1,14 @@ +/mob/living/simple_animal/lizard + tts_seed = "Ladyvashj" + death_sound = 'modular_ss220/mobs/sound/creatures/lizard_death.ogg' + +/mob/living/simple_animal/lizard/axolotl + name = "Аксолотль" + desc = "Маленький милый аксолотль." + icon = 'modular_ss220/mobs/icons/mob/animal.dmi' + icon_state = "axolotl" + icon_living = "axolotl" + icon_dead = "axolotl_dead" + holder_type = /obj/item/holder/axolotl + + diff --git a/modular_ss220/mobs/code/simple_animal/friendly/moth.dm b/modular_ss220/mobs/code/simple_animal/friendly/moth.dm new file mode 100644 index 000000000000..eee8153c18c6 --- /dev/null +++ b/modular_ss220/mobs/code/simple_animal/friendly/moth.dm @@ -0,0 +1,54 @@ +/mob/living/simple_animal/moth + name = "моль" + desc = "Смотря на эту моль становится понятно куда пропали шубы перевозимые СССП." + icon = 'modular_ss220/mobs/icons/mob/animal.dmi' + icon_state = "moth" + icon_living = "moth" + icon_dead = "moth_dead" + turns_per_move = 1 + emote_see = list("flutters") + response_help = "shoos" + response_disarm = "brushes aside" + response_harm = "squashes" + speak_chance = 0 + maxHealth = 15 + health = 15 + see_in_dark = 100 + friendly = "nudges" + density = 0 + flying = TRUE + pass_flags = PASSTABLE | PASSGRILLE | PASSMOB + ventcrawler = 2 + mob_size = MOB_SIZE_TINY + butcher_results = list(/obj/item/reagent_containers/food/snacks/monstermeat/xenomeat = 1) + gold_core_spawnable = FRIENDLY_SPAWN + holder_type = /obj/item/holder/moth + tts_seed = "Tychus" + +/mob/living/simple_animal/mothroach + name = "mothroach" + desc = "Мотылёк. Обожает светочи." + icon = 'modular_ss220/mobs/icons/mob/pets.dmi' + icon_state = "mothroach" + icon_living = "mothroach" + icon_dead = "mothroach_dead" + icon_resting = "mothroach_sleep" + response_help = "pets" + response_disarm = "bops" + response_harm = "kicks" + faction = list("neutral") + maxHealth = 15 + health = 15 + see_in_dark = 30 + turns_per_move = 10 + emote_see = list("flutters") + response_help = "shoos" + response_disarm = "brushes aside" + response_harm = "squashes" + friendly = "nudges" + density = 0 + gold_core_spawnable = FRIENDLY_SPAWN + footstep_type = FOOTSTEP_MOB_BAREFOOT + butcher_results = list(/obj/item/reagent_containers/food/snacks/monstermeat/xenomeat = 1) + holder_type = /obj/item/holder/mothroach + tts_seed = "Tychus" diff --git a/modular_ss220/mobs/code/simple_animal/friendly/mouse.dm b/modular_ss220/mobs/code/simple_animal/friendly/mouse.dm new file mode 100644 index 000000000000..e5d81a187e73 --- /dev/null +++ b/modular_ss220/mobs/code/simple_animal/friendly/mouse.dm @@ -0,0 +1,96 @@ +/mob/living/simple_animal/mouse + var/non_standard = FALSE // for no "mouse_" with mouse_color + icon = 'modular_ss220/mobs/icons/mob/animal.dmi' + death_sound = 'modular_ss220/mobs/sound/creatures/rat_death.ogg' + talk_sound = list('modular_ss220/mobs/sound/creatures/rat_talk.ogg') + damaged_sound = list('modular_ss220/mobs/sound/creatures/rat_wound.ogg') + blood_volume = BLOOD_VOLUME_SURVIVE + butcher_results = list(/obj/item/reagent_containers/food/snacks/meat/mouse) + tts_seed = "Gyro" + +/mob/living/simple_animal/mouse/Initialize(mapload) + . = ..() + AddComponent(/datum/component/squeak, list("[squeak_sound]" = 1), 100, extrarange = SHORT_RANGE_SOUND_EXTRARANGE) //as quiet as a mouse or whatever + +/mob/living/simple_animal/mouse/New() + ..() + pixel_x = rand(-6, 6) + pixel_y = rand(0, 10) + + mouse_color = initial(mouse_color) // сбрасываем из-за наследования чтобы своим проком переписать + color_pick() + +/mob/living/simple_animal/mouse/proc/color_pick() + if(!mouse_color) + mouse_color = pick( list("brown","gray","white") ) + icon_state = "mouse_[mouse_color]" + icon_living = "mouse_[mouse_color]" + icon_dead = "mouse_[mouse_color]_dead" + icon_resting = "mouse_[mouse_color]_sleep" + update_appearance(UPDATE_DESC) + +/mob/living/simple_animal/mouse/proc/reinitial() + mouse_color = initial(mouse_color) + icon_state = initial(icon_state) + icon_living = initial(icon_living) + icon_dead = initial(icon_dead) + icon_resting = initial(icon_resting) + +/mob/living/simple_animal/mouse/splat(obj/item/item = null, mob/living/user = null) + if(non_standard) + var/temp_state = initial(icon_state) + icon_dead = "[temp_state]_splat" + icon_state = "[temp_state]_splat" + else + ..() + + if(prob(50)) + var/turf/location = get_turf(src) + add_splatter_floor(location) + if(item) + item.add_mob_blood(src) + if(user) + user.add_mob_blood(src) + +/mob/living/simple_animal/mouse/death(gibbed) + if(gibbed) + make_remains() + . = ..(gibbed) + +/mob/living/simple_animal/mouse/proc/make_remains() + var/obj/effect/decal/remains = new /obj/effect/decal/remains/mouse(src.loc) + remains.pixel_x = pixel_x + remains.pixel_y = pixel_y + + +// /mob/living/simple_animal/mouse/emote(act, m_type = 1, message = null, force) + +// if("help") +// to_chat(src, "scream, squeak") +// playsound(src, damaged_sound, 40, 1) + +/mob/living/simple_animal/mouse/white + tts_seed = "Meepo" + +/mob/living/simple_animal/mouse/brown + tts_seed = "Clockwerk" + +/mob/living/simple_animal/mouse/brown/Tom + tts_seed = "Arthas" + maxHealth = 10 + health = 10 + +/mob/living/simple_animal/mouse/fluff/clockwork + name = "Chip" + real_name = "Chip" + mouse_color = "clockwork" + icon_state = "mouse_clockwork" + response_help = "pets" + response_disarm = "gently pushes aside" + response_harm = "stamps on" + gold_core_spawnable = NO_SPAWN + can_collar = 0 + butcher_results = list(/obj/item/stack/sheet/metal = 1) + maxHealth = 20 + health = 20 + tts_seed = "Clockwerk" diff --git a/modular_ss220/mobs/code/simple_animal/friendly/possum.dm b/modular_ss220/mobs/code/simple_animal/friendly/possum.dm new file mode 100644 index 000000000000..763cdf16fad9 --- /dev/null +++ b/modular_ss220/mobs/code/simple_animal/friendly/possum.dm @@ -0,0 +1,51 @@ +/mob/living/simple_animal/possum + name = "possum" + desc = "The opossum is a small, scavenging marsupial of the order Didelphimorphia, previously \ + endemic to the Americas of Earth, but now inexplicably found across settled space. Nobody is \ + entirely sure how they travel to such disparate locations, with the leading theories including \ + smuggling, cargo stowaways, fungal spore reproduction, teleportation, or unknown quantum effects." + icon = 'modular_ss220/mobs/icons/mob/pets.dmi' + icon_state = "possum" + icon_living = "possum" + icon_dead = "possum_dead" + icon_resting = "possum_sleep" + var/icon_harm = "possum_aaa" + response_help = "pets" + response_disarm = "bops" + response_harm = "kicks" + speak = list("Hsss...", "Hisss...") + speak_emote = list("Hsss", "Hisss") + emote_hear = list("Aaaaa!", "Ahhss!") + emote_see = list("shakes its head.", "chases its tail.", "shivers.") + tts_seed = "Clockwerk" + faction = list("neutral") + maxHealth = 30 + health = 30 + mob_size = MOB_SIZE_SMALL + pass_flags = PASSTABLE + ventcrawler = VENTCRAWLER_ALWAYS + blood_volume = BLOOD_VOLUME_NORMAL + melee_damage_type = STAMINA + melee_damage_lower = 3 + melee_damage_upper = 8 + attacktext = "кусает" + attack_sound = 'sound/weapons/bite.ogg' + see_in_dark = 5 + speak_chance = 1 + turns_per_move = 10 + gold_core_spawnable = FRIENDLY_SPAWN + footstep_type = FOOTSTEP_MOB_CLAW + butcher_results = list(/obj/item/reagent_containers/food/snacks/meat = 2) + holder_type = /obj/item/holder/possum + +/mob/living/simple_animal/possum/attackby(obj/item/O, mob/living/user) + icon_state = icon_harm + . = ..() + +/mob/living/simple_animal/possum/attack_hand(mob/living/carbon/human/M) + switch(M.a_intent) + if(INTENT_HELP) + icon_state = initial(icon_state) + if(INTENT_HARM, INTENT_DISARM, INTENT_GRAB) + icon_state = icon_harm + . = ..() diff --git a/modular_ss220/mobs/code/simple_animal/friendly/rat.dm b/modular_ss220/mobs/code/simple_animal/friendly/rat.dm new file mode 100644 index 000000000000..40b37f87c136 --- /dev/null +++ b/modular_ss220/mobs/code/simple_animal/friendly/rat.dm @@ -0,0 +1,49 @@ +/mob/living/simple_animal/mouse/rat + name = "rat" + real_name = "rat" + desc = "Серая крыса. Не яркий представитель своего вида." + icon = 'modular_ss220/mobs/icons/mob/animal.dmi' + squeak_sound = 'modular_ss220/mobs/sound/creatures/rat_squeak.ogg' + icon_state = "rat_gray" + icon_living = "rat_gray" + icon_dead = "rat_gray_dead" + icon_resting = "rat_gray_sleep" + non_standard = TRUE + mouse_color = null + maxHealth = 15 + health = 15 + mob_size = MOB_SIZE_SMALL + butcher_results = list(/obj/item/reagent_containers/food/snacks/meat/mouse = 2) + +/mob/living/simple_animal/mouse/rat/white + name = "white rat" + real_name = "white rat" + desc = "Типичный представитель лабораторных крыс." + icon_state = "rat_white" + icon_living = "rat_white" + icon_dead = "rat_white_dead" + icon_resting = "rat_white_sleep" + mouse_color = "white" + +/mob/living/simple_animal/mouse/rat/irish + name = "irish rat" + real_name = "irish rat" + desc = "Ирландская крыса, борец за независимость. На космической станции?! На этот раз им точно некуда бежать!" + icon_state = "rat_irish" + icon_living = "rat_irish" + icon_dead = "rat_irish_dead" + icon_resting = "rat_irish_sleep" + mouse_color = "irish" + +/mob/living/simple_animal/mouse/rat/color_pick() + if(!mouse_color) + mouse_color = pick(list("gray","white","irish")) + icon_state = "rat_[mouse_color]" + icon_living = "rat_[mouse_color]" + icon_dead = "rat_[mouse_color]_dead" + icon_resting = "rat_[mouse_color]_sleep" + +/mob/living/simple_animal/mouse/rat/pull_constraint(atom/movable/AM, show_message = FALSE) + return TRUE + + diff --git a/modular_ss220/mobs/code/simple_animal/friendly/snail.dm b/modular_ss220/mobs/code/simple_animal/friendly/snail.dm new file mode 100644 index 000000000000..70188814923a --- /dev/null +++ b/modular_ss220/mobs/code/simple_animal/friendly/snail.dm @@ -0,0 +1,87 @@ +/mob/living/simple_animal/snail + name = "space snail" + desc = "Маленькая космо-улиточка со своим космо-домиком. Прочная, тихая и медленная." + icon = 'modular_ss220/mobs/icons/mob/animal.dmi' + icon_state = "snail" + icon_living = "snail" + icon_dead = "snail_dead" + speak = list("Uhh.", "Hurrr.") + tts_seed = "Ladyvashj" + health = 100 + maxHealth = 100 + speed = 10 + attacktext = "толкает" + death_sound = 'modular_ss220/mobs/sound/creatures/crack_death1.ogg' + response_help = "pets" + response_disarm = "shoos" + response_harm = "stomps on" + ventcrawler = 2 + density = 0 + pass_flags = PASSTABLE | PASSMOB + mob_size = MOB_SIZE_SMALL + gender = NEUTER + can_hide = 1 + butcher_results = list(/obj/item/reagent_containers/food/snacks/salmonmeat/snailmeat = 1, /obj/item/stack/ore/tranquillite = 1) + can_collar = 1 + gold_core_spawnable = FRIENDLY_SPAWN + stop_automated_movement_when_pulled = 0 + atmos_requirements = list("min_oxy" = 0, "max_oxy" = 0, "min_tox" = 0, "max_tox" = 0, "min_co2" = 0, "max_co2" = 0, "min_n2" = 0, "max_n2" = 0) + minbodytemp = 0 + faction = list("slime", "neutral") + reagents = new() + holder_type = /obj/item/holder/snail + +/mob/living/simple_animal/snail/Process_Spacemove(movement_dir = 0) + return 1 + +/mob/living/simple_animal/snail/Move(atom/newloc, direct, movetime) + var/oldLoc = src.loc + . = ..() + if(.) + if(stat != DEAD) + make_wet_floor(oldLoc) + +/mob/living/simple_animal/snail/proc/make_wet_floor(atom/oldLoc) + if(oldLoc != src.loc) + reagents.add_reagent("water",10) + reagents.reaction(oldLoc, REAGENT_TOUCH, 10) //10 is the multiplier for the reaction effect. probably needed to wet the floor properly. + reagents.remove_any(10) + +/mob/living/simple_animal/snail/lube + name = "space snail" + desc = "Маленькая космо-улиточка со своим космо-домиком. Прочная, тихая и медленная. И очень склизкая." + gold_core_spawnable = HOSTILE_SPAWN + faction = list("slime", "hostile") + +/mob/living/simple_animal/snail/lube/make_wet_floor(atom/oldLoc) + if(oldLoc != src.loc) + reagents.add_reagent("lube",10) + reagents.reaction(oldLoc, REAGENT_TOUCH, 10) + reagents.remove_any(10) + +/mob/living/simple_animal/turtle + name = "черепаха" + desc = "Большая космочерепаха. Прочная, тихая и медленная." + icon = 'modular_ss220/mobs/icons/mob/animal.dmi' + icon_state = "yeeslow" + icon_living = "yeeslow" + icon_dead = "yeeslow_dead" + icon_resting = "yeeslow_scared" + speak = list("Uhh.", "Hurrr.") + tts_seed = "Ladyvashj" + health = 500 + maxHealth = 500 + speed = 20 + attacktext = "толкает" + death_sound = 'modular_ss220/mobs/sound/creatures/crack_death1.ogg' + response_help = "pets" + response_disarm = "shoos" + response_harm = "stomps on" + ventcrawler = 0 + density = 1 + pass_flags = PASSTABLE | PASSGRILLE + status_flags = CANPARALYSE | CANPUSH + mob_size = MOB_SIZE_SMALL + butcher_results = list(/obj/item/reagent_containers/food/snacks/salmonmeat/turtlemeat = 10, /obj/item/stack/ore/tranquillite = 5) + footstep_type = FOOTSTEP_MOB_SLIME + holder_type = /obj/item/holder/turtle diff --git a/modular_ss220/mobs/code/simple_animal/hostile/alien.dm b/modular_ss220/mobs/code/simple_animal/hostile/alien.dm new file mode 100644 index 000000000000..be6b4f7b2791 --- /dev/null +++ b/modular_ss220/mobs/code/simple_animal/hostile/alien.dm @@ -0,0 +1,12 @@ +/mob/living/simple_animal/hostile/alien + attacktext = "кромсает" + tts_seed = "Ladyvashj" + +/mob/living/simple_animal/hostile/alien/queen + tts_seed = "Queen" + +/mob/living/carbon/alien + tts_seed = "Ladyvashj" + +/mob/living/carbon/alien/humanoid/queen + tts_seed = "Queen" diff --git a/modular_ss220/mobs/code/simple_animal/hostile/bear.dm b/modular_ss220/mobs/code/simple_animal/hostile/bear.dm new file mode 100644 index 000000000000..a974d7d1a268 --- /dev/null +++ b/modular_ss220/mobs/code/simple_animal/hostile/bear.dm @@ -0,0 +1,54 @@ +/mob/living/simple_animal/hostile/bear + name = "космический медведь" + desc = "Вам не нужно быть быстрее медведя, вам нужно быть быстрее напарников." + blood_volume = BLOOD_VOLUME_NORMAL + attacktext = "терзает" + death_sound = 'modular_ss220/mobs/sound/creatures/bear_death.ogg' + talk_sound = list('modular_ss220/mobs/sound/creatures/bear_talk1.ogg', 'modular_ss220/mobs/sound/creatures/bear_talk2.ogg', 'modular_ss220/mobs/sound/creatures/bear_talk3.ogg') + damaged_sound = list('modular_ss220/mobs/sound/creatures/bear_onerawr1.ogg', 'modular_ss220/mobs/sound/creatures/bear_onerawr2.ogg', 'modular_ss220/mobs/sound/creatures/bear_onerawr3.ogg') + var/trigger_sound = 'modular_ss220/mobs/sound/creatures/bear_rawr.ogg' + +/mob/living/simple_animal/hostile/bear/handle_automated_movement() + if(..()) + playsound(src, src.trigger_sound, 40, 1) + +// /mob/living/simple_animal/hostile/bear/Move() +// icon_state = "[icon_living]" +// icon_state = "[icon_living]floor" + +/mob/living/simple_animal/hostile/bear/brown + name = "бурый медведь" + desc = "Не такой уж и плюшевый" + icon = 'modular_ss220/mobs/icons/mob/animal.dmi' + icon_state = "brownbear" + icon_living = "brownbear" + icon_dead = "brownbear_dead" + icon_gib = "brownbear_gib" + +/mob/living/simple_animal/hostile/bear/snow + name = "снежный медведь" + desc = "Не любит гостей в своей берлоге." + icon = 'modular_ss220/mobs/icons/mob/animal.dmi' + icon_state = "snowbear" + icon_living = "snowbear" + icon_dead = "snowbear_dead" + icon_gib = "snowbear_gib" + +/mob/living/simple_animal/hostile/bear/combat + name = "боевой медведь" + desc = "Боевая машина для убийств." + icon = 'modular_ss220/mobs/icons/mob/animal.dmi' + icon_state = "combatbear" + icon_living = "combatbear" + icon_dead = "combatbear_dead" + icon_gib = "combatbear_gib" + + maxHealth = 200 + health = 200 + obj_damage = 80 + melee_damage_lower = 30 + melee_damage_upper = 80 + + speed = 2 + blood_volume = BLOOD_VOLUME_NORMAL + attacktext = "терзает" diff --git a/modular_ss220/mobs/code/simple_animal/hostile/headcrab.dm b/modular_ss220/mobs/code/simple_animal/hostile/headcrab.dm new file mode 100644 index 000000000000..8d401c8a5e86 --- /dev/null +++ b/modular_ss220/mobs/code/simple_animal/hostile/headcrab.dm @@ -0,0 +1,194 @@ +// port old headcrabs +/mob/living/simple_animal/hostile/headcrab + name = "headcrab" + desc = "A small parasitic creature that would like to connect with your brain stem." + icon = 'modular_ss220/mobs/icons/mob/headcrab.dmi' + icon_state = "headcrab" + icon_living = "headcrab" + icon_dead = "headcrab_dead" + health = 60 + maxHealth = 60 + dodging = 1 + melee_damage_lower = 5 + melee_damage_upper = 10 + ranged = 1 + ranged_message = "leaps" + ranged_cooldown_time = 40 + var/jumpdistance = 4 + var/jumpspeed = 1 + attacktext = "грызёт" + attack_sound = 'modular_ss220/mobs/sound/creatures/headcrab_attack.ogg' + speak_emote = list("hisses") + var/is_zombie = 0 + stat_attack = DEAD // Necessary for them to attack (zombify) dead humans + robust_searching = 1 + var/host_species = "" + var/list/human_overlays = list() + +/mob/living/simple_animal/hostile/headcrab/Life(seconds, times_fired) + if(..() && !stat) + if(!is_zombie && isturf(src.loc)) + for(var/mob/living/carbon/human/H in oview(src, 1)) //Only for corpse right next to/on same tile + if(H.stat == DEAD || (!H.check_death_method() && H.health <= HEALTH_THRESHOLD_DEAD)) + Zombify(H) + break + if(times_fired % 4 == 0) + for(var/mob/living/simple_animal/K in oview(src, 1)) //Only for corpse right next to/on same tile + if(K.stat == DEAD || (!K.check_death_method() && K.health <= HEALTH_THRESHOLD_DEAD)) + visible_message("[src] consumes [K] whole!") + if(health < maxHealth) + health += 10 + qdel(K) + break + +/mob/living/simple_animal/hostile/headcrab/OpenFire(atom/A) + if(check_friendly_fire) + for(var/turf/T in getline(src,A)) // Not 100% reliable but this is faster than simulating actual trajectory + for(var/mob/living/L in T) + if(L == src || L == A) + continue + if(faction_check_mob(L) && !attack_same) + return + visible_message("[src] [ranged_message] at [A]!") + throw_at(A, jumpdistance, jumpspeed, spin = FALSE, diagonals_first = TRUE) + ranged_cooldown = world.time + ranged_cooldown_time + +/mob/living/simple_animal/hostile/headcrab/proc/Zombify(mob/living/carbon/human/H) + if(!H.check_death_method()) + H.death() + var/obj/item/organ/external/head/head_organ = H.get_organ("head") + is_zombie = TRUE + if(H.wear_suit) + var/obj/item/clothing/suit/armor/A = H.wear_suit + if(A.armor && A.armor.getRating("melee")) + maxHealth += A.armor.getRating("melee") //That zombie's got armor, I want armor! + maxHealth += 200 + health = maxHealth + name = "zombie" + desc = "A corpse animated by the alien being on its head." + melee_damage_lower = 10 + melee_damage_upper = 15 + ranged = 0 + stat_attack = CONSCIOUS // Disables their targeting of dead mobs once they're already a zombie + icon = H.icon + speak = list('modular_ss220/mobs/sound/creatures/zombie_idle1.ogg','modular_ss220/mobs/sound/creatures/zombie_idle2.ogg','modular_ss220/mobs/sound/creatures/zombie_idle3.ogg') + speak_chance = 50 + speak_emote = list("groans") + attacktext = "грызёт" + attack_sound = 'modular_ss220/mobs/sound/creatures/zombie_attack.ogg' + icon_state = "zombie2_s" + if(head_organ) + head_organ.h_style = null + H.update_hair() + host_species = H.dna.species.name + human_overlays = H.overlays + update_icons() + H.forceMove(src) + visible_message("The corpse of [H.name] suddenly rises!") + +/mob/living/simple_animal/hostile/headcrab/death() + ..() + if(is_zombie) + qdel(src) + +/mob/living/simple_animal/hostile/headcrab/handle_automated_speech() // This way they have different screams when attacking, sometimes. Might be seen as sphagetthi code though. + if(speak_chance) + if(rand(0,200) < speak_chance) + if(speak && speak.len) + playsound(get_turf(src), pick(speak), 200, 1) + +/mob/living/simple_animal/hostile/headcrab/Destroy() + if(contents) + for(var/mob/M in contents) + M.loc = get_turf(src) + return ..() + +/mob/living/simple_animal/hostile/headcrab/update_icons() + . = ..() + if(is_zombie) + overlays.Cut() + overlays = human_overlays + var/image/I = image('modular_ss220/mobs/icons/mob/headcrab.dmi', icon_state = "headcrabpod") + if(host_species == "Vox") + I = image('modular_ss220/mobs/icons/mob/headcrab.dmi', icon_state = "headcrabpod_vox") + else if(host_species == "Gray") + I = image('modular_ss220/mobs/icons/mob/headcrab.dmi', icon_state = "headcrabpod_gray") + overlays += I + +/mob/living/simple_animal/hostile/headcrab/CanAttack(atom/the_target) + if(stat_attack == DEAD && isliving(the_target) && !ishuman(the_target)) + var/mob/living/L = the_target + if(L.stat == DEAD) + // Override default behavior of stat_attack, to stop headcrabs targeting dead mobs they cannot infect, such as silicons. + return FALSE + return ..() + +/mob/living/simple_animal/hostile/headcrab/fast + name = "fast headcrab" + desc = "A fast parasitic creature that would like to connect with your brain stem." + icon = 'modular_ss220/mobs/icons/mob/headcrab.dmi' + icon_state = "fast_headcrab" + icon_living = "fast_headcrab" + icon_dead = "fast_headcrab_dead" + health = 40 + maxHealth = 40 + ranged_cooldown_time = 30 + jumpdistance = 8 + jumpspeed = 2 + speak_emote = list("screech") + +/mob/living/simple_animal/hostile/headcrab/fast/update_icons() + . = ..() + if(is_zombie) + overlays.Cut() + overlays = human_overlays + var/image/I = image('modular_ss220/mobs/icons/mob/headcrab.dmi', icon_state = "fast_headcrabpod") + if(host_species == "Vox") + I = image('modular_ss220/mobs/icons/mob/headcrab.dmi', icon_state = "fast_headcrabpod_vox") + else if(host_species == "Gray") + I = image('modular_ss220/mobs/icons/mob/headcrab.dmi', icon_state = "fast_headcrabpod_gray") + overlays += I + +/mob/living/simple_animal/hostile/headcrab/fast/Zombify(mob/living/carbon/human/H) + . = ..() + speak = list('modular_ss220/mobs/sound/creatures/fast_zombie_idle1.ogg','modular_ss220/mobs/sound/creatures/fast_zombie_idle2.ogg','modular_ss220/mobs/sound/creatures/fast_zombie_idle3.ogg') + +/mob/living/simple_animal/hostile/headcrab/poison + name = "poison headcrab" + desc = "A poison parasitic creature that would like to connect with your brain stem." + icon = 'modular_ss220/mobs/icons/mob/headcrab.dmi' + icon_state = "poison_headcrab" + icon_living = "poison_headcrab" + icon_dead = "poison_headcrab_dead" + health = 80 + maxHealth = 80 + ranged_cooldown_time = 50 + jumpdistance = 3 + jumpspeed = 1 + melee_damage_lower = 8 + melee_damage_upper = 20 + attack_sound = 'modular_ss220/mobs/sound/creatures/ph_scream1.ogg' + speak_emote = list("screech") + +/mob/living/simple_animal/hostile/headcrab/poison/update_icons() + . = ..() + if(is_zombie) + overlays.Cut() + overlays = human_overlays + var/image/I = image('modular_ss220/mobs/icons/mob/headcrab.dmi', icon_state = "poison_headcrabpod") + if(host_species == "Vox") + I = image('modular_ss220/mobs/icons/mob/headcrab.dmi', icon_state = "poison_headcrabpod_vox") + else if(host_species == "Gray") + I = image('modular_ss220/mobs/icons/mob/headcrab.dmi', icon_state = "poison_headcrabpod_gray") + overlays += I + + +/mob/living/simple_animal/hostile/headcrab/poison/AttackingTarget() + . = ..() + if(iscarbon(target) && target.reagents) + var/inject_target = pick("chest", "head") + var/mob/living/carbon/C = target + if(C.IsStunned() || C.can_inject(null, FALSE, inject_target, FALSE)) + if(C.AmountEyeBlurry() < 60) + C.AdjustEyeBlurry(10) + visible_message("[src] buries its fangs deep into the [inject_target] of [target]!") diff --git a/modular_ss220/mobs/code/simple_animal/hostile/lizard.dm b/modular_ss220/mobs/code/simple_animal/hostile/lizard.dm new file mode 100644 index 000000000000..33dba1c9cb24 --- /dev/null +++ b/modular_ss220/mobs/code/simple_animal/hostile/lizard.dm @@ -0,0 +1,72 @@ +/mob/living/simple_animal/hostile/lizard + name = "игуана" + desc = "Грациозный предок космодраконов. Её взгляд не вызывает никаких враждебных подозрений... Но она по прежнему хочет съесть вас." + icon = 'modular_ss220/mobs/icons/mob/animal.dmi' + icon_state = "iguana" + icon_living = "iguana" + icon_dead = "iguana_dead" + speak = list("RAWR!","Rawr!","GRR!","Growl!") + speak_emote = list("growls", "roars") + emote_hear = list("rawrs","grumbles","grawls") + emote_see = list("stares ferociously", "stomps") + tts_seed = "Shaker" + speak_chance = 1 + turns_per_move = 5 + see_in_dark = 6 + butcher_results = list(/obj/item/reagent_containers/food/snacks/monstermeat/lizardmeat = 3, /obj/item/stack/sheet/animalhide/lizard = 1) + response_help = "погладил" + response_disarm = "аккуратно оттолкнул" + response_harm = "ударил" + stop_automated_movement_when_pulled = 0 + speed = 2 + maxHealth = 40 + health = 40 + blood_volume = BLOOD_VOLUME_NORMAL + obj_damage = 60 + melee_damage_lower = 20 + melee_damage_upper = 30 + attacktext = "терзает" + attack_sound = 'sound/weapons/bite.ogg' + death_sound = 'modular_ss220/mobs/sound/creatures/lizard_death_big.ogg' + talk_sound = list('modular_ss220/mobs/sound/creatures/lizard_angry1.ogg', 'modular_ss220/mobs/sound/creatures/lizard_angry2.ogg', 'modular_ss220/mobs/sound/creatures/lizard_angry3.ogg') + damaged_sound = list('modular_ss220/mobs/sound/creatures/lizard_damaged.ogg') + footstep_type = FOOTSTEP_MOB_CLAW + + minbodytemp = 250 //Weak to cold + maxbodytemp = T0C + 200 + + gold_core_spawnable = HOSTILE_SPAWN + +/mob/living/simple_animal/hostile/lizard/gator + name = "аллигатор" + desc = "Величавый аллигатор, так и норовящийся оторвать от вас самый лакомый кусочек. Или кусок. Не путать с крокодилом!" + icon_state = "gator" + icon_living = "gator" + icon_dead = "gator_dead" + butcher_results = list(/obj/item/reagent_containers/food/snacks/monstermeat/lizardmeat = 7, /obj/item/stack/sheet/animalhide/lizard = 5) + speed = 4 + maxHealth = 200 + health = 200 + obj_damage = 80 + melee_damage_lower = 30 + melee_damage_upper = 80 + +/mob/living/simple_animal/hostile/lizard/croco + name = "крокодил" + desc = "Не стоит сувать голову ему в пасть! Это негативно сказывается на умственных способностях" + icon_state = "steppy" + icon_living = "steppy" + icon_dead = "steppy_dead" + butcher_results = list(/obj/item/reagent_containers/food/snacks/monstermeat/lizardmeat = 5, /obj/item/stack/sheet/animalhide/lizard = 3) + maxHealth = 100 + health = 100 + obj_damage = 80 + melee_damage_lower = 20 + melee_damage_upper = 50 + + + + + + + diff --git a/modular_ss220/mobs/code/simple_animal/hostile/snake.dm b/modular_ss220/mobs/code/simple_animal/hostile/snake.dm new file mode 100644 index 000000000000..16d3c6995ba9 --- /dev/null +++ b/modular_ss220/mobs/code/simple_animal/hostile/snake.dm @@ -0,0 +1,6 @@ +/mob/living/simple_animal/hostile/retaliate/poison/snake + attacktext = "кусает" + attack_sound = 'sound/weapons/bite.ogg' + death_sound = 'modular_ss220/mobs/sound/creatures/snake_death.ogg' + tts_seed = "Ladyvashj" + holder_type = /obj/item/holder/snake diff --git a/modular_ss220/mobs/code/simple_animal/hostile/spider.dm b/modular_ss220/mobs/code/simple_animal/hostile/spider.dm new file mode 100644 index 000000000000..bf603a4dd122 --- /dev/null +++ b/modular_ss220/mobs/code/simple_animal/hostile/spider.dm @@ -0,0 +1,63 @@ +//Giants + +/mob/living/simple_animal/hostile/poison/giant_spider + death_sound = 'modular_ss220/mobs/sound/creatures/spider_death.ogg' + talk_sound = list('modular_ss220/mobs/sound/creatures/spider_talk1.ogg', 'modular_ss220/mobs/sound/creatures/spider_talk2.ogg') + damaged_sound = list('modular_ss220/mobs/sound/creatures/spider_attack1.ogg', 'modular_ss220/mobs/sound/creatures/spider_attack2.ogg') + attacktext = "кусает" + response_help = "лапает" + response_disarm = "осторожно отталкивает" + friendly = "осторожно проводит лапками по" + tts_seed = "Anubarak" + + +// Terrors + +/mob/living/simple_animal/hostile/poison/terror_spider + response_help = "лапает" + response_disarm = "осторожно отталкивает" + friendly = "осторожно проводит лапками по" + death_sound = 'modular_ss220/mobs/sound/creatures/spider_death.ogg' + talk_sound = list('modular_ss220/mobs/sound/creatures/spider_talk1.ogg', 'modular_ss220/mobs/sound/creatures/spider_talk2.ogg') + damaged_sound = list('modular_ss220/mobs/sound/creatures/spider_attack1.ogg', 'modular_ss220/mobs/sound/creatures/spider_attack2.ogg') + attacktext = "кусает" + response_help = "лапает" + response_disarm = "осторожно отталкивает" + friendly = "осторожно проводит лапками по" + tts_seed = "Anubarak" + +/mob/living/simple_animal/hostile/poison/terror_spider/mother + tts_seed = "Deathwhisper" + +/mob/living/simple_animal/hostile/poison/terror_spider/queen/princess + tts_seed = "Lissandra" + +/mob/living/simple_animal/hostile/poison/terror_spider/queen + tts_seed = "Anivia" + +/mob/living/simple_animal/hostile/poison/terror_spider/queen/empress + tts_seed = "Queen" + +/mob/living/simple_animal/hostile/poison/terror_spider/prince + tts_seed = "Alduin" + +/mob/living/simple_animal/hostile/poison/terror_spider/red + tts_seed = "Chu" + +/mob/living/simple_animal/hostile/poison/terror_spider/green + tts_seed = "Myra" + +/mob/living/simple_animal/hostile/poison/terror_spider/gray + tts_seed = "Cassiopeia" + +/mob/living/simple_animal/hostile/poison/terror_spider/brown + tts_seed = "Zuljin" + +/mob/living/simple_animal/hostile/poison/terror_spider/purple + tts_seed = "Avozu" + +/mob/living/simple_animal/hostile/poison/terror_spider/black + tts_seed = "Karastamper" + +/mob/living/simple_animal/hostile/poison/terror_spider/white + tts_seed = "F_darkelf" diff --git a/modular_ss220/mobs/code/simple_animal/hostile/syndi_rat.dm b/modular_ss220/mobs/code/simple_animal/hostile/syndi_rat.dm new file mode 100644 index 000000000000..f7f42612a359 --- /dev/null +++ b/modular_ss220/mobs/code/simple_animal/hostile/syndi_rat.dm @@ -0,0 +1,118 @@ +/mob/living/simple_animal/hostile/retaliate/syndirat + name = "Синди-мышь" + desc = "Мышь на службе синдиката?" + icon = 'modular_ss220/mobs/icons/mob/animal.dmi' + icon_state = "syndirat" + icon_living = "syndirat" + icon_dead = "syndirat_dead" + icon_resting = "syndirat_sleep" + response_help = "pets the" + response_disarm = "gently pushes aside the" + response_harm = "stamps on the" + health = 50 + maxHealth = 50 + speak_chance = 2 + turns_per_move = 5 + pull_force = 1000 + density = 0 + ventcrawler = 2 + can_hide = 1 + can_collar = 1 + pass_flags = PASSTABLE | PASSGRILLE | PASSMOB + see_in_dark = 6 + speak = list("Слава Синдикату!","Смерть НаноТрейзен!", "У вас есть сыр?") + speak_emote = list("squeeks","squeaks","squiks") + emote_hear = list("squeeks","squeaks","squiks") + emote_see = list("runs in a circle", "shakes", "scritches at something") + + mob_size = MOB_SIZE_TINY // If theyre not at least small it doesnt seem like the treadmill works or makes sound + pass_flags = PASSTABLE + stop_automated_movement = 1 + + atmos_requirements = list("min_oxy" = 0, "max_oxy" = 0, "min_tox" = 0, "max_tox" = 0, "min_co2" = 0, "max_co2" = 0, "min_n2" = 0, "max_n2" = 0) + minbodytemp = 0 + + ranged = 1 + projectiletype = /obj/item/projectile/beam/disabler + + attack_sound = 'sound/weapons/punch1.ogg' + talk_sound = list('modular_ss220/mobs/sound/creatures/rat_talk.ogg') + damaged_sound = list('modular_ss220/mobs/sound/creatures/rat_wound.ogg') + death_sound = 'modular_ss220/mobs/sound/creatures/rat_death.ogg' + + harm_intent_damage = 5 + melee_damage_lower = 5 + melee_damage_upper = 5 + var/chew_probability = 1 + var/squeak_sound = 'sound/creatures/mousesqueak.ogg' + +/mob/living/simple_animal/hostile/retaliate/syndirat/Initialize(mapload) + . = ..() + AddComponent(/datum/component/squeak, list('sound/creatures/mousesqueak.ogg' = 1), 100, extrarange = SHORT_RANGE_SOUND_EXTRARANGE) //as quiet as a mouse or whatever + +/mob/living/simple_animal/hostile/retaliate/syndirat/handle_automated_action() + if(prob(chew_probability) && isturf(loc)) + var/turf/simulated/floor/F = get_turf(src) + if(istype(F) && !F.intact) + var/obj/structure/cable/C = locate() in F + if(C && prob(15)) + if(C.get_available_power() && !HAS_TRAIT(src, TRAIT_SHOCKIMMUNE)) + visible_message("[src] chews through [C]. It's toast!") + playsound(src, 'sound/effects/sparks2.ogg', 100, 1) + toast() // mmmm toasty. + else + visible_message("[src] chews through [C].") + investigate_log("was chewed through by a mouse at [COORD(F)]", "wires") + C.deconstruct() + +/mob/living/simple_animal/hostile/retaliate/syndirat/proc/toast() + add_atom_colour("#3A3A3A", FIXED_COLOUR_PRIORITY) + desc = "It's toast." + death() + +/mob/living/simple_animal/hostile/retaliate/syndirat/handle_automated_speech() + ..() + if(prob(speak_chance) && !incapacitated()) + playsound(src, squeak_sound, 100, 1) + +/mob/living/simple_animal/hostile/retaliate/syndirat/handle_automated_movement() + . = ..() + if(resting) + if(prob(1)) + on_standing_up() + else if(prob(5)) + custom_emote(2, "snuffles") + else if(prob(0.5)) + on_lying_down() + +/mob/living/simple_animal/hostile/retaliate/syndirat/Crossed(AM as mob|obj, oldloc) + if(ishuman(AM)) + if(!stat) + var/mob/M = AM + to_chat(M, "[bicon(src)] Squeek!") + ..() + +/mob/living/simple_animal/hostile/retaliate/syndirat/emote(act, m_type = 1, message = null, intentional, force) + if(stat != CONSCIOUS) + return + + var/on_CD = 0 + act = lowertext(act) + switch(act) + if("squeak") //Mouse time + on_CD = start_audio_emote_cooldown() + else + on_CD = 0 + + if(!force && on_CD == 1) + return + + switch(act) + if("squeak") + message = "[pick(emote_hear)]!" + m_type = 2 //audible + playsound(src, squeak_sound, 40, 1) + if("help") + to_chat(src, "scream, squeak") + + ..() diff --git a/modular_ss220/mobs/code/simple_animal/hostile/undead.dm b/modular_ss220/mobs/code/simple_animal/hostile/undead.dm new file mode 100644 index 000000000000..7a9db442d4cd --- /dev/null +++ b/modular_ss220/mobs/code/simple_animal/hostile/undead.dm @@ -0,0 +1,12 @@ +/mob/living/simple_animal/hostile/undead + attacktext = "бьет" + attack_sound = 'modular_ss220/mobs/sound/creatures/zombie_attack.ogg' + death_sound = 'modular_ss220/mobs/sound/creatures/zombie_idle2.ogg' + talk_sound = list('modular_ss220/mobs/sound/creatures/zombie_idle1.ogg', 'modular_ss220/mobs/sound/creatures/zombie_idle3.ogg') + damaged_sound = list('modular_ss220/mobs/sound/creatures/zombie_idle1.ogg', 'modular_ss220/mobs/sound/creatures/zombie_idle2.ogg', 'modular_ss220/mobs/sound/creatures/zombie_idle3.ogg') + +/mob/living/simple_animal/hostile/undead/zombie/fast + death_sound = 'modular_ss220/mobs/sound/creatures/fast_zombie_idle3.ogg' + talk_sound = list('modular_ss220/mobs/sound/creatures/fast_zombie_idle1.ogg', 'modular_ss220/mobs/sound/creatures/fast_zombie_idle2.ogg') + damaged_sound = list('modular_ss220/mobs/sound/creatures/fast_zombie_idle1.ogg') + diff --git a/modular_ss220/mobs/code/simple_animal/items.dm b/modular_ss220/mobs/code/simple_animal/items.dm new file mode 100644 index 000000000000..dfb46832a8f6 --- /dev/null +++ b/modular_ss220/mobs/code/simple_animal/items.dm @@ -0,0 +1,56 @@ +// Meat +/obj/item/reagent_containers/food/snacks/meat/dog + name = "dog meat" + desc = "Не слишком питательно. Но говорят деликатес космокорейцев." + list_reagents = list("protein" = 2, "epinephrine" = 2) + +/obj/item/reagent_containers/food/snacks/meat/security + name = "security meat" + desc = "Мясо наполненное чувством мужества и долга." + list_reagents = list("protein" = 3, "epinephrine" = 5) + +/obj/item/reagent_containers/food/snacks/meat/pug + name = "pug meat" + desc = "Чуть менее очарователен в нарезке." + list_reagents = list("protein" = 2, "epinephrine" = 2) + +/obj/item/reagent_containers/food/snacks/meat/ham/old + name = "жесткая ветчина" + desc = "Мясо почтенного хряка." + list_reagents = list("protein" = 2, "porktonium" = 10) + +/obj/item/reagent_containers/food/snacks/meat/mouse + name = "мышатина" + desc = "На безрыбье и мышь мясо. Кто знает чем питался этот грызун до его подачи к столу." + icon = 'modular_ss220/mobs/icons/items.dmi' + icon_state = "meat_clear" + list_reagents = list("nutriment" = 2, "blood" = 3, "toxin" = 1) + +/obj/item/reagent_containers/food/snacks/salmonmeat/snailmeat + name = "snail meat" + desc = "Сырая космо-улитка в собственном соку." + filling_color = "#6bb4a8" + list_reagents = list("protein" = 5, "vitamin" = 5) + +/obj/item/reagent_containers/food/snacks/salmonmeat/turtlemeat + name = "snail meat" + desc = "Сырая космо-улитка в собственном соку." + filling_color = "#2fa24c" + list_reagents = list("protein" = 10, "vitamin" = 8) + +/obj/structure/bed/dogbed/pet + name = "Удобная лежанка" + desc = "Комфортная лежанка для любимейшего питомца отдела." + anchored = TRUE + +// Останки +/obj/effect/decal/remains/mouse + name = "remains" + desc = "Некогда бывшая мышь. Её останки. Больше не будет пищать..." + icon = 'modular_ss220/mobs/icons/items.dmi' + icon_state = "mouse_skeleton" + anchored = FALSE + move_resist = MOVE_FORCE_EXTREMELY_WEAK + +/obj/effect/decal/remains/mouse/water_act(volume, temperature, source, method) + . = ..() diff --git a/modular_ss220/mobs/code/simple_animal/mobs.dm b/modular_ss220/mobs/code/simple_animal/mobs.dm new file mode 100644 index 000000000000..1decab575cf3 --- /dev/null +++ b/modular_ss220/mobs/code/simple_animal/mobs.dm @@ -0,0 +1,16 @@ +/mob/living/simple_animal/cockroach + death_sound = 'modular_ss220/mobs/sound/creatures/crack_death2.ogg' + +/mob/living/simple_animal/hostile/feral_cat + blood_volume = BLOOD_VOLUME_NORMAL + attacktext = "рвёт" + +/mob/living/simple_animal/hostile/headslug + attacktext = "грызёт" + holder_type = /obj/item/holder/headslug + +/mob/living/simple_animal/hostile/retaliate/clown/goblin + holder_type = /obj/item/holder/clowngoblin + +/mob/living/simple_animal/parrot + holder_type = /obj/item/holder/parrot diff --git a/modular_ss220/mobs/code/simple_animal/named_animals.dm b/modular_ss220/mobs/code/simple_animal/named_animals.dm new file mode 100644 index 000000000000..53c5c1199de8 --- /dev/null +++ b/modular_ss220/mobs/code/simple_animal/named_animals.dm @@ -0,0 +1,144 @@ +/mob/living/simple_animal/pig/Sanya + name = "Саня" + desc = "Старый добрый хряк с сединой. Слегка подслеповат, но нюх и харизма по прежнему с ним. Чудом не пущен на мясо и дожил до почтенного возраста." + icon = 'modular_ss220/mobs/icons/mob/animal.dmi' + icon_state = "pig_old" + icon_living = "pig_old" + icon_dead = "pig_old_dead" + butcher_results = list(/obj/item/reagent_containers/food/snacks/meat/ham/old = 10) + unique_pet = TRUE + gold_core_spawnable = NO_SPAWN + maxHealth = 80 + health = 80 + +/mob/living/simple_animal/pig/Sanya/npc_safe(mob/user) // depriving the chef of his animals is not cool + return FALSE + +/mob/living/simple_animal/cow/betsy + name = "Бетси" + desc = "Старая добрая старушка. Нескончаемый источник природного молока без ГМО. Ну почти без ГМО..." + gold_core_spawnable = NO_SPAWN + +/mob/living/simple_animal/chicken/Wife + name = "Галя" + desc = "Почетная наседка. Жена Коммандора, следующая за ним в коммандировки по космическим станциям." + icon_state = "chicken_white" + icon_living = "chicken_white" + icon_dead = "chicken_white_dead" + unique_pet = TRUE + gold_core_spawnable = NO_SPAWN + maxHealth = 20 + health = 20 + +/mob/living/simple_animal/chicken/Wife/npc_safe(mob/user) // depriving the chef of his animals is not cool + return FALSE + +/mob/living/simple_animal/cock/Clucky + name = "Коммандор Клакки" + desc = "Его великая армия бесчисленна. Ко-ко-ко." + icon = 'modular_ss220/mobs/icons/mob/animal.dmi' + unique_pet = TRUE + gold_core_spawnable = NO_SPAWN + maxHealth = 40 // Veteran + health = 40 + +/mob/living/simple_animal/cock/Clucky/npc_safe(mob/user) // depriving the chef of his animals is not cool + return FALSE + +/mob/living/simple_animal/goose/Scientist + name = "Гуськор" + desc = "Учёный Гусь. Везде учусь. Крайне умная и задиристая птица. Обожает генетику. Надеемся это не бывший пропавший генетик..." + icon = 'modular_ss220/mobs/icons/mob/animal.dmi' + icon_state = "goose_labcoat" + icon_living = "goose_labcoat" + icon_dead = "goose_labcoat_dead" + icon_resting = "goose_labcoat_rest" + attacktext = "умно щипает" + unique_pet = TRUE + gold_core_spawnable = NO_SPAWN + maxHealth = 80 + health = 80 + resting = TRUE + +/mob/living/simple_animal/goose/Scientist/npc_safe(mob/user) + return FALSE + +/mob/living/simple_animal/hostile/lizard/croco/Gena + name = "Гена" + desc = "Крокодил обожающий музыкальные инструменты и плюшевые игрушки. Пожевать." + faction = list("neutral") + +// rats +/mob/living/simple_animal/mouse/rat/Ratatui + name = "Рататуй" + real_name = "Рататуй" + desc = "Личная крыса шеф повара, помогающая ему при готовке наиболее изысканных блюд. До момента пока он не пропадет и повар не начнет готовить что-то новенькое..." + unique_pet = TRUE + gold_core_spawnable = NO_SPAWN + maxHealth = 20 + health = 20 + +/mob/living/simple_animal/mouse/rat/irish/Remi + name = "Реми" + real_name = "Реми" + desc = "Близкий друг Рататуя. Не любимец повара, но пока тот не мешает на кухне, ему разрешили здесь остаться. Очень толстая крыса." + unique_pet = TRUE + gold_core_spawnable = NO_SPAWN + maxHealth = 25 + health = 25 + transform = matrix(1.250, 0, 0, 0, 1, 0) // Толстячок на +2 пикселя + +/mob/living/simple_animal/mouse/rat/white/Brain + name = "Брейн" + real_name = "Брейн" + desc = "Сообразительная личная лабораторная крыса директора исследований, даже освоившая речь. Настолько часто сбегал, что его перестали помещать в клетку. Он явно хочет захватить мир. Где-то спрятался его напарник..." + unique_pet = TRUE + gold_core_spawnable = NO_SPAWN + maxHealth = 20 + health = 20 + universal_speak = 1 + resting = TRUE + +/obj/effect/decal/remains/mouse/Pinkie + name = "Пинки" + desc = "Когда-то это был напарник самой сообразительной крысы в мире. К сожалению он таковым не являлся..." + anchored = TRUE + +// hamster +/mob/living/simple_animal/mouse/hamster/Representative + name = "представитель Алексей" + desc = "Представитель федерации хомяков. Проявите уважение при его виде, ведь он с позитивным исходом решил немало дипломатических вопросов между федерацией мышей, республикой крыс и корпорацией Нанотрейзен. Да и кто вообще хомяка так назвал?!" + icon = 'modular_ss220/mobs/icons/mob/animal.dmi' + icon_state = "hamster_rep" + icon_living = "hamster_rep" + icon_dead = "hamster_rep_dead" + icon_resting = "hamster_rep_rest" + unique_pet = TRUE + gold_core_spawnable = NO_SPAWN + holder_type = /obj/item/holder/hamster_rep + maxHealth = 20 + health = 20 + resting = TRUE + +/mob/living/simple_animal/possum/Poppy + name = "Ключик" + desc = "Маленький работяга. Его жилетка подчеркивает его рабочие... лапы. Тот еще трудяга. Очень не любит ассистентов в инженерном отделе. И Полли. Интересно, почему?" + icon_state = "possum_poppy" + icon_living = "possum_poppy" + icon_dead = "possum_poppy_dead" + icon_resting = "possum_poppy_sleep" + icon_harm = "possum_poppy_aaa" + maxHealth = 50 + health = 50 + unique_pet = TRUE + gold_core_spawnable = NO_SPAWN + holder_type = /obj/item/holder/possum/poppy + +/mob/living/simple_animal/frog/Wednesday + name = "Среда" + real_name = "Среда" + desc = "Это Среда, мои чуваки!" + maxHealth = 20 + health = 20 + unique_pet = TRUE + gold_core_spawnable = NO_SPAWN diff --git a/modular_ss220/mobs/code/simple_animal/overrides.dm b/modular_ss220/mobs/code/simple_animal/overrides.dm new file mode 100644 index 000000000000..09f35d7bcce4 --- /dev/null +++ b/modular_ss220/mobs/code/simple_animal/overrides.dm @@ -0,0 +1,108 @@ +/mob/living/simple_animal + response_help = "тычет" + response_disarm = "толкает" + response_harm = "пихает" + attacktext = "атакует" + attack_sound = null + friendly = "утыкается в" //If the mob does no damage with it's attack + + tts_seed = "Kleiner" + var/list/damaged_sound = null // The sound played when player hits animal + var/list/talk_sound = null // The sound played when talk + + +/mob/living/simple_animal/say(message, verb, sanitize, ignore_speech_problems, ignore_atmospherics) + . = ..() + if(. && length(src.talk_sound)) + playsound(src, pick(src.talk_sound), 75, TRUE) + +/mob/living/simple_animal/attacked_by(obj/item/I, mob/living/user) + . = ..() + if(. && length(src.damaged_sound) && src.stat != DEAD) + playsound(src, pick(src.damaged_sound), 40, 1) + +/mob/living/simple_animal/attack_hand(mob/living/carbon/human/M) + . = ..() + if(. && length(src.damaged_sound) && src.stat != DEAD) + playsound(src, pick(src.damaged_sound), 40, 1) + +/mob/living/simple_animal/attack_animal(mob/living/simple_animal/M) + . = ..() + if(. && length(src.damaged_sound) && src.stat != DEAD) + playsound(src, pick(src.damaged_sound), 40, 1) + +/mob/living/simple_animal/attack_alien(mob/living/carbon/alien/humanoid/M) + . = ..() + if(. && length(src.damaged_sound) && src.stat != DEAD) + playsound(src, pick(src.damaged_sound), 40, 1) + +/mob/living/simple_animal/attack_larva(mob/living/carbon/alien/larva/L) + . = ..() + if(. && length(src.damaged_sound) && src.stat != DEAD) + playsound(src, pick(src.damaged_sound), 40, 1) + +/mob/living/simple_animal/attack_slime(mob/living/simple_animal/slime/M) + . = ..() + if(. && length(src.damaged_sound) && src.stat != DEAD) + playsound(src, pick(src.damaged_sound), 40, 1) + +/mob/living/simple_animal/attack_robot(mob/living/user) + . = ..() + if(. && length(src.damaged_sound) && src.stat != DEAD) + playsound(src, pick(src.damaged_sound), 40, 1) + + +// Simple animal procs +/mob/living/simple_animal/start_pulling(atom/movable/AM, state, force = pull_force, show_message = FALSE) + if(pull_constraint(AM, show_message)) + return ..() + +/mob/living/simple_animal/proc/pull_constraint(atom/movable/AM, show_message = FALSE) + return TRUE + + +// Animals additions + +/* Megafauna */ +/mob/living/simple_animal/hostile/megafauna/legion + death_sound = 'modular_ss220/mobs/sound/creatures/legion_death.ogg' + +/mob/living/simple_animal/hostile/megafauna/legion/death(gibbed) + for(var/area/lavaland/L in world) + SEND_SOUND(L, sound('modular_ss220/mobs/sound/creatures/legion_death_far.ogg')) + . = ..() + +/* Nar Sie */ +/obj/singularity/narsie/large/Destroy() + SEND_SOUND(world, sound('modular_ss220/mobs/sound/creatures/narsie_rises.ogg')) + . = ..() + + +/* Loot Drops */ +/obj/effect/spawner/lootdrop/bluespace_tap/organic/Initialize(mapload) + . = ..() + LAZYADD(loot, list( + //mob/living/simple_animal/pet/dog/corgi = 5, + + /mob/living/simple_animal/pet/dog/brittany = 2, + /mob/living/simple_animal/pet/dog/german = 2, + /mob/living/simple_animal/pet/dog/tamaskan = 2, + /mob/living/simple_animal/pet/dog/bullterrier = 2, + + //mob/living/simple_animal/pet/cat = 5, + + /mob/living/simple_animal/pet/cat/cak = 2, + /mob/living/simple_animal/pet/cat/fat = 2, + /mob/living/simple_animal/pet/cat/white = 2, + /mob/living/simple_animal/pet/cat/birman = 2, + /mob/living/simple_animal/pet/cat/spacecat = 2, + + //mob/living/simple_animal/pet/dog/fox = 5, + + /mob/living/simple_animal/pet/dog/fox/forest = 2, + /mob/living/simple_animal/pet/dog/fox/fennec = 2, + /mob/living/simple_animal/possum = 2, + + /mob/living/simple_animal/pet/penguin = 5, + //mob/living/simple_animal/pig = 5, + )) diff --git a/modular_ss220/mobs/code/simple_animal/pets/cat.dm b/modular_ss220/mobs/code/simple_animal/pets/cat.dm new file mode 100644 index 000000000000..9f314db19422 --- /dev/null +++ b/modular_ss220/mobs/code/simple_animal/pets/cat.dm @@ -0,0 +1,125 @@ +/mob/living/simple_animal/pet/cat + icon = 'modular_ss220/mobs/icons/mob/pets.dmi' + holder_type = /obj/item/holder/cat2 + +/mob/living/simple_animal/pet/cat/Runtime + holder_type = /obj/item/holder/cat + +/mob/living/simple_animal/pet/cat/cak + holder_type = /obj/item/holder/cak + +/mob/living/simple_animal/pet/cat/fat + name = "fat cat" + desc = "Упитана. Счастлива." + icon = 'modular_ss220/mobs/icons/mob/pets.dmi' + icon_state = "iriska" + icon_living = "iriska" + icon_dead = "iriska_dead" + icon_resting = "iriska" + gender = FEMALE + mob_size = MOB_SIZE_LARGE // THICK!!! + //canmove = FALSE + butcher_results = list(/obj/item/reagent_containers/food/snacks/meat = 8) + tts_seed = "Huntress" + maxHealth = 40 // Sooooo faaaat... + health = 40 + speed = 10 // TOO FAT + wander = 0 // LAZY + can_hide = 0 + resting = TRUE + holder_type = /obj/item/holder/fatcat + +/mob/living/simple_animal/pet/cat/fat/handle_automated_action() + return + +/mob/living/simple_animal/pet/cat/white + name = "white cat" + desc = "Белоснежная шерстка. Плохо различается на белой плитке, зато отлично виден в темноте!" + icon = 'modular_ss220/mobs/icons/mob/pets.dmi' + icon_state = "penny" + icon_living = "penny" + icon_dead = "penny_dead" + icon_resting = "penny_rest" + gender = MALE + holder_type = /obj/item/holder/cak + +/mob/living/simple_animal/pet/cat/birman + name = "birman cat" + real_name = "birman cat" + desc = "Священная порода Бирма." + icon = 'modular_ss220/mobs/icons/mob/pets.dmi' + icon_state = "crusher" + icon_living = "crusher" + icon_dead = "crusher_dead" + icon_resting = "crusher_rest" + gender = MALE + holder_type = /obj/item/holder/crusher + + +/mob/living/simple_animal/pet/cat/black + name = "black cat" + real_name = "black cat" + desc = "Он ужас летящий на крыльях ночи! Он - тыгыдык и спотыкание во тьме ночной! Бойся не заметить черного кота в тени!" + icon = 'modular_ss220/mobs/icons/mob/pets.dmi' + icon_state = "salem" + icon_living = "salem" + icon_dead = "salem_dead" + icon_resting = "salem_rest" + gender = MALE + holder_type = /obj/item/holder/cat + +/mob/living/simple_animal/pet/cat/spacecat + name = "spacecat" + desc = "Space Kitty!!" + icon_state = "spacecat" + icon_living = "spacecat" + icon_dead = "spacecat_dead" + icon_resting = "spacecat_rest" + unsuitable_atmos_damage = 0 + minbodytemp = TCMB + maxbodytemp = T0C + 40 + holder_type = /obj/item/holder/spacecat + +//named +/mob/living/simple_animal/pet/cat/Floppa + name = "Большой Шлёпа" + desc = "Он выглядит так, будто собирается совершить военное преступление." + icon = 'modular_ss220/mobs/icons/mob/pets.dmi' + icon_state = "floppa" + icon_living = "floppa" + icon_dead = "floppa_dead" + icon_resting = "floppa_rest" + tts_seed = "Uther" + unique_pet = TRUE + +/mob/living/simple_animal/pet/cat/fat/Iriska + name = "Ириска" + desc = "Упитана. Счастлива. Бюрократы её обожают. И похоже даже черезчур сильно." + icon = 'modular_ss220/mobs/icons/mob/pets.dmi' + unique_pet = TRUE + gold_core_spawnable = NO_SPAWN + +/mob/living/simple_animal/pet/cat/white/Penny + name = "Копейка" + desc = "Любит таскать монетки и мелкие предметы. Успевайте прятать их!" + icon = 'modular_ss220/mobs/icons/mob/pets.dmi' + unique_pet = TRUE + gold_core_spawnable = NO_SPAWN + resting = TRUE + +/mob/living/simple_animal/pet/cat/birman/Crusher + name = "Бедокур" + desc = "Любит крушить всё что не прикручено. Нужно вовремя прибираться." + icon = 'modular_ss220/mobs/icons/mob/pets.dmi' + unique_pet = TRUE + gold_core_spawnable = NO_SPAWN + resting = TRUE + +/mob/living/simple_animal/pet/cat/spacecat/Musya + name = "Муся" + desc = "Любимая почтенная кошка отдела токсинов. Всегда готова к вылетам!" + +/mob/living/simple_animal/pet/cat/black/Salem + name = "Салем" + real_name = "Салем" + desc = "Говорят что это бывший колдун, лишенный всех своих сил и превратившейся в черного кота Советом Колдунов из-за попытки захватить мир, а в руки НТ попал чтобы отбывать своё наказание. Судя по его скверному нраву, это может быть похоже на правду." diff --git a/modular_ss220/mobs/code/simple_animal/pets/dog.dm b/modular_ss220/mobs/code/simple_animal/pets/dog.dm new file mode 100644 index 000000000000..259600f7b1ff --- /dev/null +++ b/modular_ss220/mobs/code/simple_animal/pets/dog.dm @@ -0,0 +1,176 @@ +/mob/living/simple_animal/pet/dog + icon = 'modular_ss220/mobs/icons/mob/pets.dmi' + tts_seed = "Stetmann" + maxHealth = 50 + health = 50 + melee_damage_type = STAMINA + melee_damage_lower = 6 + melee_damage_upper = 10 + attacktext = "кусает" + var/growl_sound = list('modular_ss220/mobs/sound/creatures/dog_grawl1.ogg','modular_ss220/mobs/sound/creatures/dog_grawl2.ogg') //Used in emote. + + butcher_results = list(/obj/item/reagent_containers/food/snacks/meat/dog = 4) + collar_type = "dog" + +/mob/living/simple_animal/pet/dog/wuv(change, mob/M) + . = ..() + if(change) + if(change < 0) + if(M && stat != DEAD) // Same check here, even though emote checks it as well (poor form to check it only in the help case) + playsound(src, pick(src.growl_sound), 75, TRUE) + + +/mob/living/simple_animal/pet/dog/corgi + holder_type = /obj/item/holder/corgi + +/mob/living/simple_animal/pet/dog/corgi/Ian/persistent_load() + . = ..() + if(age == record_age) + holder_type = /obj/item/holder/old_corgi + +/mob/living/simple_animal/pet/dog/corgi/narsie + holder_type = /obj/item/holder/narsian + maxHealth = 300 + health = 300 + melee_damage_type = STAMINA //Пади ниц! + melee_damage_lower = 50 + melee_damage_upper = 100 + tts_seed = "Mannoroth" + +/* // При добавлении Ратвара +/mob/living/simple_animal/pet/dog/corgi/ratvar + name = "Cli-k" + desc = "It's a coolish Ian that clicks!" + icon = 'icons/mob/clockwork_mobs.dmi' + icon_state = "clik" + icon_living = "clik" + icon_dead = "clik_dead" + faction = list("neutral", "clockwork_cult") + gold_core_spawnable = NO_SPAWN + nofur = TRUE + unique_pet = TRUE + maxHealth = 100 + health = 100 + tts_seed = "Clockwerk" + +/mob/living/simple_animal/pet/dog/corgi/ratvar/update_corgi_fluff() + ..() + speak = list("V'z fuvavat jneevbe!", "CLICK!", "KL-KL-KLIK") + speak_emote = list("growls", "barks ominously") + emote_hear = list("barks echoingly!", "woofs hauntingly!", "yaps in an judicial manner.", "mutters something unspeakable.") + emote_see = list("communes with the unnameable.", "seeks the light in souls.", "shakes.") + +/mob/living/simple_animal/pet/dog/corgi/ratvar/ratvar_act() + adjustBruteLoss(-maxHealth) +*/ + +/mob/living/simple_animal/pet/dog/corgi/puppy + maxHealth = 20 + health = 20 + butcher_results = list(/obj/item/reagent_containers/food/snacks/meat/corgi = 1) + tts_seed = "Jaina" + +/mob/living/simple_animal/pet/dog/corgi/puppy/void + maxHealth = 60 + health = 60 + tts_seed = "Kael" + holder_type = /obj/item/holder/void_puppy + +/mob/living/simple_animal/pet/dog/corgi/puppy/slime + name = "\improper slime puppy" + real_name = "slimy" + desc = "Крайне склизкий. Но прикольный!" + icon_state = "slime_puppy" + icon_living = "slime_puppy" + icon_dead = "slime_puppy_dead" + nofur = TRUE + holder_type = /obj/item/holder/slime_puppy + minbodytemp = 250 //Weak to cold + maxbodytemp = INFINITY + +/mob/living/simple_animal/pet/dog/corgi/Lisa + tts_seed = "Luna" + holder_type = /obj/item/holder/lisa + +/mob/living/simple_animal/pet/dog/corgi/borgi + tts_seed = "Glados" + holder_type = /obj/item/holder/borgi + +/mob/living/simple_animal/pet/dog/pug + tts_seed = "Kleiner" + holder_type = /obj/item/holder/pug + maxHealth = 30 + health = 30 + +/mob/living/simple_animal/pet/dog/bullterrier + name = "bullterrier" + real_name = "bullterrier" + desc = "Кого-то его мордочка напоминает..." + icon = 'modular_ss220/mobs/icons/mob/pets.dmi' + icon_state = "bullterrier" + icon_living = "bullterrier" + icon_dead = "bullterrier_dead" + tts_seed = "Kleiner" + holder_type = /obj/item/holder/bullterrier + +/mob/living/simple_animal/pet/dog/tamaskan + name = "tamaskan" + real_name = "tamaskan" + desc = "Хорошая семейная собака. Уживается с другими собаками и ассистентами." + icon = 'modular_ss220/mobs/icons/mob/pets.dmi' + icon_state = "tamaskan" + icon_living = "tamaskan" + icon_dead = "tamaskan_dead" + holder_type = /obj/item/holder/bullterrier + tts_seed = "Kleiner" + +/mob/living/simple_animal/pet/dog/german + name = "german" + real_name = "german" + desc = "Немецкая овчарка с помесью двортерьера. Судя по крупу - явно не породистый." + icon = 'modular_ss220/mobs/icons/mob/pets.dmi' + icon_state = "german" + icon_living = "german" + icon_dead = "german_dead" + tts_seed = "Kleiner" + +/mob/living/simple_animal/pet/dog/brittany + name = "brittany" + real_name = "brittany" + desc = "Старая порода, которую любят аристократы." + icon = 'modular_ss220/mobs/icons/mob/pets.dmi' + icon_state = "brittany" + icon_living = "brittany" + icon_dead = "brittany_dead" + + + +// named +/mob/living/simple_animal/pet/dog/brittany/Psycho + name = "Перрито" + real_name = "Перрито" + desc = "Собака, обожающая котов, особенно в сапогах, прекрасно лающая на Испанском, прошла терапевтические курсы, готова выслушать все ваши проблемы и выдать вам целебных объятий с завершением в виде почесыванием животика." + icon = 'modular_ss220/mobs/icons/mob/pets.dmi' + resting = TRUE + unique_pet = TRUE + gold_core_spawnable = NO_SPAWN + +/mob/living/simple_animal/pet/dog/pug/Frank + name = "Фрэнк" + real_name = "Фрэнк" + desc = "Мопс полученный в результате эксперимента ученых в черном. Почему его не забрали интересный вопрос. Похоже он всем надоел своей болтовней, после чего его лишили дара речи." + resting = TRUE + unique_pet = TRUE + gold_core_spawnable = NO_SPAWN + + +/mob/living/simple_animal/pet/dog/bullterrier/Genn + name = "Геннадий" + desc = "Собачий аристократ. Выглядит очень важным и начитанным. Доброжелательный любимец ассистентов." + icon = 'modular_ss220/mobs/icons/mob/pets.dmi' + unique_pet = TRUE + gold_core_spawnable = NO_SPAWN + maxHealth = 5 + health = 5 + resting = TRUE + diff --git a/modular_ss220/mobs/code/simple_animal/pets/fashion.dm b/modular_ss220/mobs/code/simple_animal/pets/fashion.dm new file mode 100644 index 000000000000..c6d6e0829149 --- /dev/null +++ b/modular_ss220/mobs/code/simple_animal/pets/fashion.dm @@ -0,0 +1,131 @@ +/obj/item + var/datum/muhtar_fashion/muhtar_fashion = null + var/datum/snake_fashion/snake_fashion = null + +/// Muhtar fashion +/datum/muhtar_fashion + var/name + var/desc + var/emote_see + var/emote_hear + var/speak + var/speak_emote + + // This isn't applied to the dog, but stores the icon_state of the + // sprite that the associated item uses + var/icon_file + var/obj_icon_state + var/obj_alpha + var/obj_color + +/datum/muhtar_fashion/New(mob/M) + name = replacetext(name, "REAL_NAME", M.real_name) + desc = replacetext(desc, "NAME", name) + +/datum/muhtar_fashion/proc/apply(mob/living/simple_animal/pet/dog/D) + if(name) + D.name = name + if(desc) + D.desc = desc + if(emote_see) + D.emote_see = emote_see + if(emote_hear) + D.emote_hear = emote_hear + if(speak) + D.speak = speak + if(speak_emote) + D.speak_emote = speak_emote + +/datum/muhtar_fashion/proc/get_overlay(dir) + if(icon_file && obj_icon_state) + var/image/muhtar = image(icon_file, obj_icon_state, dir = dir) + muhtar.alpha = obj_alpha + muhtar.color = obj_color + return muhtar + +// Item datums +/datum/muhtar_fashion/head + icon_file = 'modular_ss220/mobs/icons/muhtar_accessories.dmi' + +/datum/muhtar_fashion/mask + icon_file = 'modular_ss220/mobs/icons/muhtar_accessories.dmi' + +/datum/muhtar_fashion/head/detective + name = "Детектив REAL_NAME" + desc = "NAME sees through your lies..." + emote_see = list("investigates the area.","sniffs around for clues.","searches for scooby snacks.","takes a candycorn from the hat.") + +/datum/muhtar_fashion/mask/cigar + obj_icon_state = "cigar" + +/datum/muhtar_fashion/head/beret + name = "Лейтенант REAL_NAME" + obj_icon_state = "beret" + +// Muhtar items +/obj/item/clothing/mask/cigarette/cigar + muhtar_fashion = /datum/muhtar_fashion/mask/cigar + +/obj/item/clothing/head/det_hat + muhtar_fashion = /datum/muhtar_fashion/head/detective + +/obj/item/clothing/head/beret/sec + muhtar_fashion = /datum/muhtar_fashion/head/beret + +/// Snake fashion +/datum/snake_fashion + var/name + var/desc + var/emote_see + var/emote_hear + var/speak + var/speak_emote + + // This isn't applied to the snake, but stores the icon_state of the + // sprite that the associated item uses + var/icon_file + var/obj_icon_state + var/icon_state + var/icon_living + var/icon_dead + var/obj_alpha + var/obj_color + +/datum/snake_fashion/New(mob/M) + name = replacetext(name, "REAL_NAME", M.real_name) + desc = replacetext(desc, "NAME", name) + +/datum/snake_fashion/proc/apply(mob/living/simple_animal/hostile/retaliate/poison/snake/rouge/D) + if(name) + D.name = name + if(desc) + D.desc = desc + if(emote_see) + D.emote_see = emote_see + if(emote_hear) + D.emote_hear = emote_hear + if(speak) + D.speak = speak + if(speak_emote) + D.speak_emote = speak_emote + +/datum/snake_fashion/proc/get_overlay() + if(icon_file && obj_icon_state) + var/image/snek = image(icon_file, obj_icon_state) + snek.alpha = obj_alpha + snek.color = obj_color + return snek + +// Item datums +/datum/snake_fashion/head + icon_file = 'modular_ss220/mobs/icons/rouge_accessories.dmi' + +/datum/snake_fashion/head/beret_hos_black + name = "Ля Руж" + desc = "Mon Dieu! C'est un serpent à trois têtes!" + speak = list("le shhh!") + emote_see = list("трясётся в наигранном страхе.", "сдаётся.","устраивает тихую битву между своими головами.", "притворяется мёртвой.","ведёт себя так будто перед ней невидимая стенка.") + +// Rouge items +/obj/item/clothing/head/HoS/beret + snake_fashion = /datum/snake_fashion/head/beret_hos_black diff --git a/modular_ss220/mobs/code/simple_animal/pets/fox.dm b/modular_ss220/mobs/code/simple_animal/pets/fox.dm new file mode 100644 index 000000000000..7771955a4d93 --- /dev/null +++ b/modular_ss220/mobs/code/simple_animal/pets/fox.dm @@ -0,0 +1,58 @@ +/mob/living/simple_animal/pet/dog/fox + tts_seed = "Barney" + yelp_sound = 'modular_ss220/mobs/sound/creatures/fox_yelp.ogg' //Used on death. + holder_type = /obj/item/holder/fox + icon = 'modular_ss220/mobs/icons/mob/pets.dmi' + +/mob/living/simple_animal/pet/dog/fox/fennec + name = "fennec" + real_name = "fennec" + desc = "Миниатюрная лисичка с очень большими ушами. Фенек, фенек, зачем тебе такие большие уши? Чтобы избегать дормитория?" + icon = 'modular_ss220/mobs/icons/mob/pets.dmi' + icon_state = "fennec" + icon_living = "fennec" + icon_dead = "fennec_dead" + icon_resting = "fennec_rest" + see_in_dark = 10 + holder_type = /obj/item/holder/fennec + +/mob/living/simple_animal/pet/dog/fox/forest + name = "forest fox" + real_name = "forest fox" + desc = "Лесная дикая лисица. Может укусить." + icon = 'modular_ss220/mobs/icons/mob/pets.dmi' + icon_state = "fox_forest" + icon_living = "fox_forest" + icon_dead = "fox_forest_dead" + icon_resting = "fox_forest_rest" + melee_damage_type = BRUTE + melee_damage_lower = 6 + melee_damage_upper = 12 + + + +// named + +/mob/living/simple_animal/pet/dog/fox/alisa + name = "Алиса" + desc = "Алиса, любимый питомец любого Офицера Специальных Операций. Интересно, что она говорит?" + icon = 'modular_ss220/mobs/icons/mob/pets.dmi' + icon_state = "alisa" + icon_living = "alisa" + icon_dead = "alisa_dead" + icon_resting = "alisa_rest" + faction = list("nanotrasen") + unique_pet = TRUE + gold_core_spawnable = NO_SPAWN + atmos_requirements = list("min_oxy" = 0, "max_oxy" = 0, "min_tox" = 0, "max_tox" = 0, "min_co2" = 0, "max_co2" = 0, "min_n2" = 0, "max_n2" = 0) + minbodytemp = 0 + melee_damage_lower = 10 + melee_damage_upper = 20 + +/mob/living/simple_animal/pet/dog/fox/fennec/fenya + name = "Феня" + desc = "Миниатюрная лисичка c важным видом и очень большими ушами. Был пойман во время разливания огромного мороженого по формочкам и теперь Магистрат держит его при себе и следит за ним. Но похоже что ему даже нравится быть частью правосудия." + icon = 'modular_ss220/mobs/icons/mob/pets.dmi' + resting = TRUE + unique_pet = TRUE + gold_core_spawnable = NO_SPAWN diff --git a/modular_ss220/mobs/code/simple_animal/pets/pet.dm b/modular_ss220/mobs/code/simple_animal/pets/pet.dm new file mode 100644 index 000000000000..60a549b67ffd --- /dev/null +++ b/modular_ss220/mobs/code/simple_animal/pets/pet.dm @@ -0,0 +1,18 @@ + +/mob/living/simple_animal/pet + attacktext = "кусает" + attack_sound = 'sound/weapons/bite.ogg' + +/mob/living/simple_animal/pet/sloth + tts_seed = "Peon" + holder_type = /obj/item/holder/sloth + +/mob/living/simple_animal/pet/sloth/paperwork + name = "Пэйперворк" // Бумажник + desc = "Любимец Карго - ленивец. Примерно так же полезен, как и остальные каргонцы." + icon = 'modular_ss220/mobs/icons/mob/pets.dmi' + icon_state = "cool_sloth" + icon_living = "cool_sloth" + icon_dead = "cool_sloth_dead" + unique_pet = TRUE + gold_core_spawnable = NO_SPAWN diff --git a/modular_ss220/mobs/code/simple_animal/pets/rouge.dm b/modular_ss220/mobs/code/simple_animal/pets/rouge.dm new file mode 100644 index 000000000000..3d24b2c219fb --- /dev/null +++ b/modular_ss220/mobs/code/simple_animal/pets/rouge.dm @@ -0,0 +1,278 @@ +//Уникальный питомец Офицера Телекомов. Спрайты от Элл Гуда +/mob/living/simple_animal/hostile/retaliate/poison/snake/rouge + name = "Руж" + desc = "Уникальная трёхголовая змея Офицера Телекоммуникаций синдиката. Выращена в лаборатории. У каждой головы свой характер!" + icon = 'modular_ss220/mobs/icons/mob/pets.dmi' + mob_size = MOB_SIZE_SMALL + blood_volume = BLOOD_VOLUME_NORMAL + can_collar = TRUE + gender = FEMALE + icon_state = "rouge" + icon_living = "rouge" + icon_dead = "rouge_dead" + icon_resting = "rouge_rest" + speak_chance = 5 + speak = list("Шшш", "Тсс!", "Тц тц тц!", "ШШшшШШшшШ!") + speak_emote = list("hisses") + emote_hear = list("Зевает", "Шипит", "Дурачится", "Толкается") + emote_see = list("Высовывает язык", "Кружится", "Трясёт хвостом") + tts_seed = "Ladyvashj" + health = 20 + maxHealth = 20 + attacktext = "кусает" + melee_damage_lower = 5 + melee_damage_upper = 6 + response_help = "pets" + var/rest = FALSE + response_disarm = "shoos" + response_harm = "steps on" + var/obj/item/inventory_head + faction = list("neutral", "syndicate") + gold_core_spawnable = NO_SPAWN + unique_pet = TRUE + can_hide = 1 + +/mob/living/simple_animal/hostile/retaliate/poison/snake/rouge/verb/chasetail() + set name = "Chase your tail" + set desc = "d'awwww." + set category = "Animal" + visible_message("[src] [pick("dances around", "chases [p_their()] tail")].", "[pick("You dance around", "You chase your tail")].") + spin(20, 1) + +/mob/living/simple_animal/hostile/retaliate/poison/snake/rouge/emote(act, m_type = 1, message = null, intentional, force) + if(incapacitated()) + return + + act = lowertext(act) + if(!force && act == "hiss" && start_audio_emote_cooldown()) + return + + switch(act) + if("hiss") + message = "[src] [pick(src.speak_emote)]!" + ..() + +/mob/living/simple_animal/hostile/retaliate/poison/snake/rouge/attack_hand(mob/living/carbon/human/M) + . = ..() + switch(M.a_intent) + if(INTENT_HELP) + shh(1, M) + if(INTENT_HARM) + shh(-1, M) + +/mob/living/simple_animal/hostile/retaliate/poison/snake/rouge/on_lying_down(updating = 1) + ..() + if(icon_resting && stat != DEAD) + icon_state = icon_resting + rest = TRUE + if(collar_type) + collar_type = "[initial(collar_type)]_rest" + regenerate_icons() + if(inventory_head) + regenerate_icons() + +/mob/living/simple_animal/hostile/retaliate/poison/snake/rouge/on_standing_up(updating = 1) + ..() + if(icon_resting && stat != DEAD) + icon_state = icon_living + rest = FALSE + if(collar_type) + collar_type = "[initial(collar_type)]" + regenerate_icons() + if(inventory_head) + regenerate_icons() + +/mob/living/simple_animal/hostile/retaliate/poison/snake/rouge/proc/shh(change, mob/M) + if(!M || stat) + return + if(change > 0) + new /obj/effect/temp_visual/heart(loc) + custom_emote(1, "hisses happily!") + else + custom_emote(1, "hisses angrily!") + +/mob/living/simple_animal/hostile/retaliate/poison/snake/rouge/Initialize(mapload) + . = ..() + regenerate_icons() + +/mob/living/simple_animal/hostile/retaliate/poison/snake/rouge/Destroy() + QDEL_NULL(inventory_head) + return ..() + +/mob/living/simple_animal/hostile/retaliate/poison/snake/rouge/handle_atom_del(atom/A) + if(A == inventory_head) + inventory_head = null + regenerate_icons() + return ..() + +/mob/living/simple_animal/hostile/retaliate/poison/snake/rouge/Life(seconds, times_fired) + . = ..() + regenerate_icons() + +/mob/living/simple_animal/hostile/retaliate/poison/snake/rouge/death(gibbed) + ..(gibbed) + regenerate_icons() + +/mob/living/simple_animal/hostile/retaliate/poison/snake/rouge/show_inv(mob/user) + if(user.incapacitated() || !Adjacent(user)) + return + user.set_machine(src) + + var/dat = {"
Inventory of [name]

"} + dat += "
Head: [inventory_head]" : "add_inv=head'>Nothing"]" + dat += "
Collar: [pcollar]" : "add_inv=collar'>Nothing"]" + + var/datum/browser/popup = new(user, "mob[UID()]", "[src]", 440, 250) + popup.set_content(dat) + popup.open() + +/mob/living/simple_animal/hostile/retaliate/poison/snake/rouge/getarmor(def_zone, type) + var/armorval = inventory_head?.armor.getRating(type) + if(!def_zone) + armorval *= 0.5 + else if(def_zone != "head") + armorval = 0 + return armorval + +/mob/living/simple_animal/hostile/retaliate/poison/snake/rouge/Topic(href, href_list) + if(!(iscarbon(usr) || isrobot(usr)) || usr.incapacitated() || !Adjacent(usr)) + usr << browse(null, "window=mob[UID()]") + usr.unset_machine() + return + + //Removing from inventory + if(href_list["remove_inv"]) + var/remove_from = href_list["remove_inv"] + switch(remove_from) + if("head") + if(inventory_head) + if(inventory_head.flags & NODROP) + to_chat(usr, "\The [inventory_head] is stuck too hard to [src] for you to remove!") + return + drop_item(inventory_head) + usr.put_in_hands(inventory_head) + inventory_head = null + update_snek_fluff() + regenerate_icons() + else + to_chat(usr, "There is nothing to remove from its [remove_from].") + return + if("collar") + if(pcollar) + var/the_collar = pcollar + drop_item(pcollar) + usr.put_in_hands(the_collar) + pcollar = null + update_snek_fluff() + regenerate_icons() + + show_inv(usr) + + //Adding things to inventory + else if(href_list["add_inv"]) + var/add_to = href_list["add_inv"] + + switch(add_to) + if("collar") + add_collar(usr.get_active_hand(), usr) + update_snek_fluff() + + if("head") + place_on_head(usr.get_active_hand(),usr) + + show_inv(usr) + else + return ..() + + +/mob/living/simple_animal/hostile/retaliate/poison/snake/rouge/proc/place_on_head(obj/item/item_to_add, mob/user) + + if(istype(item_to_add, /obj/item/grenade/plastic/c4)) // last thing she ever wears, I guess + item_to_add.afterattack(src,user,1) + return + + if(inventory_head) + if(user) + to_chat(user, "You can't put more than one hat on [src]!") + return + if(!item_to_add) + user.visible_message("[user] pets [src].", "You rest your hand on [src]'s head for a moment.") + if(flags_2 & HOLOGRAM_2) + return + return + + if(user && !user.unEquip(item_to_add)) + to_chat(user, "\The [item_to_add] is stuck to your hand, you cannot put it on [src]'s head!") + return 0 + + var/valid = FALSE + if(ispath(item_to_add.snake_fashion, /datum/snake_fashion/head)) + valid = TRUE + + if(valid) + if(health <= 0) + to_chat(user, "Безжизненный взгляд в глазах [real_name] никак не меняется, когда вы надеваете [item_to_add] на неё.") + else if(user) + user.visible_message("[user] надевает [item_to_add] на центральную голову [real_name]. [src] смотрит на [user] и довольно шипит.", + "Вы надеваете [item_to_add] на голову [real_name]. [src] озадачено смотрит на вас, пока другие головы смотрят на центральную с завистью.", + "Вы слышите дружелюбное шипение.") + item_to_add.forceMove(src) + inventory_head = item_to_add + update_snek_fluff() + regenerate_icons() + else + to_chat(user, "Вы надеваете [item_to_add] на голову [src], но она скидывает [item_to_add] с себя!") + item_to_add.forceMove(drop_location()) + if(prob(25)) + step_rand(item_to_add) + for(var/i in list(1,2,4,8,4,8,4,dir)) + setDir(i) + sleep(1) + + return valid + +/mob/living/simple_animal/hostile/retaliate/poison/snake/rouge/proc/update_snek_fluff() //имя, описание, эмоуты + // First, change back to defaults + name = real_name + desc = initial(desc) + // BYOND/DM doesn't support the use of initial on lists. + speak = list("Шшш", "Тсс!", "Тц тц тц!", "ШШшшШШшшШ!") + speak_emote = list("hisses") + emote_hear = list("Зевает", "Шипит", "Дурачится", "Толкается") + emote_see = list("Высовывает язык", "Кружится", "Трясёт хвостом") + +///Этот код скопирован с кода для корги и обнуляет показатели которые ему даёт риг. Если когда нибудь змейке дадут риг, раскомментируете/// +/* + set_light(0) + atmos_requirements = list("min_oxy" = 5, "max_oxy" = 0, "min_tox" = 0, "max_tox" = 1, "min_co2" = 0, "max_co2" = 5, "min_n2" = 0, "max_n2" = 0) + mutations.Remove(BREATHLESS) + minbodytemp = initial(minbodytemp) +*/ + if(inventory_head?.snake_fashion) + var/datum/snake_fashion/SF = new inventory_head.snake_fashion(src) + SF.apply(src) + +/mob/living/simple_animal/hostile/retaliate/poison/snake/rouge/regenerate_icons() // оверлей + ..() + if(inventory_head) + var/image/head_icon + var/datum/snake_fashion/SF = new inventory_head.snake_fashion(src) + + if(!SF.obj_icon_state) + SF.obj_icon_state = inventory_head.icon_state + if(src.rest || stat == DEAD) + SF.obj_icon_state += "_rest" + if(!SF.obj_alpha) + SF.obj_alpha = inventory_head.alpha + if(!SF.obj_color) + SF.obj_color = inventory_head.color + + if(stat || src.rest) //без сознания или отдыхает + head_icon = SF.get_overlay() + if(stat) + head_icon.pixel_y = -2 + head_icon.pixel_x = -2 + else + head_icon = SF.get_overlay() + + add_overlay(head_icon) diff --git a/modular_ss220/mobs/code/simple_animal/pets/security_dogs.dm b/modular_ss220/mobs/code/simple_animal/pets/security_dogs.dm new file mode 100644 index 000000000000..cc8161fc931c --- /dev/null +++ b/modular_ss220/mobs/code/simple_animal/pets/security_dogs.dm @@ -0,0 +1,344 @@ +/mob/living/simple_animal/pet/dog/security + name = "Мухтар" + real_name = "Мухтар" + desc = "Верный служебный пес. Он гордо несёт бремя хорошего мальчика." + icon = 'modular_ss220/mobs/icons/mob/pets.dmi' + icon_state = "german_shep" + icon_living = "german_shep" + icon_resting = "german_shep_rest" + icon_dead = "german_shep_dead" + health = 35 + maxHealth = 35 + melee_damage_type = STAMINA + melee_damage_lower = 8 + melee_damage_upper = 10 + attacktext = "кусает" + var/obj/item/inventory_head + var/obj/item/inventory_mask + footstep_type = FOOTSTEP_MOB_CLAW + butcher_results = list(/obj/item/reagent_containers/food/snacks/meat/security = 3) + tts_seed = "Furion" + +/mob/living/simple_animal/pet/dog/security/ranger + name = "Ranger" + real_name = "Ranger" + desc = "That's Ranger, your friendly and fierce k9. He has seen the terror of Xenomorphs, so it's best to be nice to him. RANGER LEAD THE WAY!" + icon_state = "ranger" + icon_living = "ranger" + icon_resting = "ranger_rest" + icon_dead = "ranger_dead" + tts_seed = "Pudge" + +/mob/living/simple_animal/pet/dog/security/warden + name = "Джульбарс" + real_name = "Джульбарс" + desc = "Мудрый служебный пес, названный в честь единственной собаки удостоившийся боевой награды." + icon_state = "german_shep2" + icon_living = "german_shep2" + icon_resting = "german_shep2_rest" + icon_dead = "german_shep2_dead" + tts_seed = "pantheon" + +/mob/living/simple_animal/pet/dog/security/detective + name = "Гав-Гавыч" + desc = "Старый служебный пёс. Он давно потерял нюх, однако детектив по-прежнему содержит и заботится о нём." + icon_state = "blackdog" + icon_living = "blackdog" + icon_dead = "blackdog_dead" + icon_resting = "blackdog_rest" + tts_seed = "Thrall" + +/mob/living/simple_animal/pet/dog/security/detective/show_inv(mob/user) + return + +/mob/living/simple_animal/pet/dog/security/show_inv(mob/user) + if(user.incapacitated() || !Adjacent(user)) + return + user.set_machine(src) + + var/dat = {"

Inventory of [name]

"} + dat += "
Head: [inventory_head]" : "add_inv=head'>Nothing"]" + dat += "
Mask: [inventory_mask]" : "add_inv=mask'>Nothing"]" + dat += "
Collar: [pcollar]" : "add_inv=collar'>Nothing"]" + + var/datum/browser/popup = new(user, "mob[UID()]", "[src]", 440, 250) + popup.set_content(dat) + popup.open() + +/mob/living/simple_animal/pet/dog/security/ranger/show_inv(mob/user) + if(user.incapacitated() || !Adjacent(user)) + return + user.set_machine(src) + + var/dat = {"

Inventory of [name]

"} + dat += "
Mask: [inventory_mask]" : "add_inv=mask'>Nothing"]" + dat += "
Collar: [pcollar]" : "add_inv=collar'>Nothing"]" + + var/datum/browser/popup = new(user, "mob[UID()]", "[src]", 440, 250) + popup.set_content(dat) + popup.open() + +/mob/living/simple_animal/pet/dog/security/on_lying_down(new_lying_angle) + ..() + if(icon_resting && stat != DEAD) + icon_state = icon_resting + regenerate_icons() + if(collar_type) + collar_type = "[initial(collar_type)]_rest" + regenerate_icons() + +/mob/living/simple_animal/pet/dog/security/on_standing_up(updating = 1) + ..() + if(icon_resting && stat != DEAD) + icon_state = icon_living + regenerate_icons() + if(collar_type) + collar_type = "[initial(collar_type)]" + regenerate_icons() + + +/mob/living/simple_animal/pet/dog/security/Initialize(mapload) + . = ..() + regenerate_icons() + +/mob/living/simple_animal/pet/dog/security/Destroy() + QDEL_NULL(inventory_head) + QDEL_NULL(inventory_mask) + return ..() + +/mob/living/simple_animal/pet/dog/security/handle_atom_del(atom/A) + if(A == inventory_head) + inventory_head = null + regenerate_icons() + if(A == inventory_mask) + inventory_mask = null + regenerate_icons() + return ..() + +/mob/living/simple_animal/pet/dog/security/Life(seconds, times_fired) + . = ..() + regenerate_icons() + +/mob/living/simple_animal/pet/dog/security/death(gibbed) + ..(gibbed) + regenerate_icons() + +/mob/living/simple_animal/pet/dog/security/Topic(href, href_list) + if(!(iscarbon(usr) || isrobot(usr)) || usr.incapacitated() || !Adjacent(usr)) + usr << browse(null, "window=mob[UID()]") + usr.unset_machine() + return + + //Removing from inventory + if(href_list["remove_inv"]) + var/remove_from = href_list["remove_inv"] + switch(remove_from) + if("head") + if(inventory_head) + if(inventory_head.flags & NODROP) + to_chat(usr, "\The [inventory_head] is stuck too hard to [src] for you to remove!") + return + drop_item(inventory_head) + usr.put_in_hands(inventory_head) + inventory_head = null + update_muhtar_fluff() + regenerate_icons() + else + to_chat(usr, "There is nothing to remove from its [remove_from].") + return + if("mask") + if(inventory_mask) + if(inventory_mask.flags & NODROP) + to_chat(usr, "\The [inventory_head] is stuck too hard to [src] for you to remove!") + return + drop_item(inventory_mask) + usr.put_in_hands(inventory_mask) + inventory_mask = null + update_muhtar_fluff() + regenerate_icons() + else + to_chat(usr, "There is nothing to remove from its [remove_from].") + return + if("collar") + if(pcollar) + var/the_collar = pcollar + drop_item(pcollar) + usr.put_in_hands(the_collar) + pcollar = null + update_muhtar_fluff() + regenerate_icons() + + show_inv(usr) + + //Adding things to inventory + else if(href_list["add_inv"]) + var/add_to = href_list["add_inv"] + + switch(add_to) + if("collar") + add_collar(usr.get_active_hand(), usr) + update_muhtar_fluff() + + if("head") + place_on_head(usr.get_active_hand(),usr) + + if("mask") + if(inventory_mask) + to_chat(usr, "It's already wearing something!") + return + else + var/obj/item/item_to_add = usr.get_active_hand() + + if(!item_to_add) + usr.visible_message("[usr] pets [src].", "You rest your hand on [src]'s face for a moment.") + return + + if(!usr.drop_item(item_to_add)) + to_chat(usr, "\The [item_to_add] is stuck to your hand, you cannot put it on [src]'s face!") + return + + if(istype(item_to_add, /obj/item/grenade/plastic/c4)) // last thing he ever wears, I guess + item_to_add.afterattack(src,usr,1) + return + + //The objects that secdogs can wear on their faces. + var/allowed = FALSE + if(ispath(item_to_add.muhtar_fashion, /datum/muhtar_fashion/mask)) + allowed = TRUE + + if(!allowed) + to_chat(usr, "You set [item_to_add] on [src]'s face, but it falls off!") + item_to_add.forceMove(drop_location()) + if(prob(25)) + step_rand(item_to_add) + for(var/i in list(1,2,4,8,4,8,4,dir)) + setDir(i) + sleep(1) + return + + item_to_add.forceMove(src) + inventory_mask = item_to_add + update_muhtar_fluff() + regenerate_icons() + + show_inv(usr) + else + return ..() + +/mob/living/simple_animal/pet/dog/security/proc/place_on_head(obj/item/item_to_add, mob/user) + + if(istype(item_to_add, /obj/item/grenade/plastic/c4)) // last thing he ever wears, I guess + item_to_add.afterattack(src,user,1) + return + + if(inventory_head) + if(user) + to_chat(user, "You can't put more than one hat on [src]!") + return + if(!item_to_add) + user.visible_message("[user] pets [src].", "You rest your hand on [src]'s head for a moment.") + if(flags_2 & HOLOGRAM_2) + return + return + + if(user && !user.unEquip(item_to_add)) + to_chat(user, "\The [item_to_add] is stuck to your hand, you cannot put it on [src]'s head!") + return 0 + + var/valid = FALSE + if(ispath(item_to_add.muhtar_fashion, /datum/muhtar_fashion/head)) + valid = TRUE + + //Various hats and items (worn on his head) change muhtar's behaviour. His attributes are reset when a hat is removed. + + if(valid) + if(health <= 0) + to_chat(user, "There is merely a dull, lifeless look in [real_name]'s eyes as you put the [item_to_add] on [p_them()].") + else if(user) + user.visible_message("[user] puts [item_to_add] on [real_name]'s head. [src] looks at [user] and barks once.", + "You put [item_to_add] on [real_name]'s head. [src] gives you a peculiar look, then wags [p_their()] tail once and barks.", + "You hear a friendly-sounding bark.") + item_to_add.forceMove(src) + inventory_head = item_to_add + update_muhtar_fluff() + regenerate_icons() + else + to_chat(user, "You set [item_to_add] on [src]'s head, but it falls off!") + item_to_add.forceMove(drop_location()) + if(prob(25)) + step_rand(item_to_add) + for(var/i in list(1,2,4,8,4,8,4,dir)) + setDir(i) + sleep(1) + + return valid + +/mob/living/simple_animal/pet/dog/security/proc/update_muhtar_fluff() + // First, change back to defaults + name = real_name + desc = initial(desc) + // BYOND/DM doesn't support the use of initial on lists. + speak = list("YAP", "Woof!", "Bark!", "AUUUUUU") + speak_emote = list("barks", "woofs") + emote_hear = list("barks!", "woofs!", "yaps.","pants.") + emote_see = list("shakes its head.", "chases its tail.","shivers.") + desc = initial(desc) + + if(inventory_head && inventory_head.muhtar_fashion) + var/datum/muhtar_fashion/DF = new inventory_head.muhtar_fashion(src) + DF.apply(src) + + if(inventory_mask && inventory_mask.muhtar_fashion) + var/datum/muhtar_fashion/DF = new inventory_mask.muhtar_fashion(src) + DF.apply(src) + +/mob/living/simple_animal/pet/dog/security/regenerate_icons() + ..() + if(inventory_head) + var/image/head_icon + var/datum/muhtar_fashion/DF = new inventory_head.muhtar_fashion(src) + + if(!DF.obj_icon_state) + DF.obj_icon_state = inventory_head.icon_state + if(!DF.obj_alpha) + DF.obj_alpha = inventory_head.alpha + if(!DF.obj_color) + DF.obj_color = inventory_head.color + + + if (icon_state == icon_resting) + head_icon = DF.get_overlay() + head_icon.pixel_y = -2 + else + head_icon = DF.get_overlay() + + if(health <= 0) + head_icon = DF.get_overlay(dir = EAST) + head_icon.pixel_y = -8 + head_icon.transform = turn(head_icon.transform, 180) + + add_overlay(head_icon) + + if(inventory_mask) + var/image/mask_icon + var/datum/muhtar_fashion/DF = new inventory_mask.muhtar_fashion(src) + + if(!DF.obj_icon_state) + DF.obj_icon_state = inventory_mask.icon_state + if(!DF.obj_alpha) + DF.obj_alpha = inventory_mask.alpha + if(!DF.obj_color) + DF.obj_color = inventory_mask.color + + if(icon_state == icon_resting) + mask_icon = DF.get_overlay() + mask_icon.pixel_y = -2 + else + mask_icon = DF.get_overlay() + + if(health <= 0) + mask_icon = DF.get_overlay(dir = EAST) + mask_icon.pixel_y = -11 + mask_icon.transform = turn(mask_icon.transform, 180) + + add_overlay(mask_icon) diff --git a/modular_ss220/mobs/code/simple_animal/pets/slugcat.dm b/modular_ss220/mobs/code/simple_animal/pets/slugcat.dm new file mode 100644 index 000000000000..61ae441463eb --- /dev/null +++ b/modular_ss220/mobs/code/simple_animal/pets/slugcat.dm @@ -0,0 +1,345 @@ +/mob/living/simple_animal/pet/slugcat + name = "слизнекот" + desc = "Удивительное существо, напоминающая кота и слизня в одном обличии. Но это не слизь, а иной вид существа. Гордость ксенобиологии. Крайне ловкое и умное, родом с планеты с опасной средой обитания. Обожает копья, не стоит давать ему его в лапки. На нем отлично смотрятся шляпы." + icon = 'modular_ss220/mobs/icons/mob/pets.dmi' + icon_state = "slugcat" + icon_living = "slugcat" + icon_dead = "slugcat_dead" + icon_resting = "slugcat_rest" + speak = list("Furrr.","Uhh.", "Hurrr.") + gender = MALE + turns_per_move = 5 + see_in_dark = 8 + health = 100 + maxHealth = 100 + blood_volume = BLOOD_VOLUME_NORMAL + melee_damage_type = STAMINA + melee_damage_lower = 0 + melee_damage_upper = 0 + attacktext = "бьет" + mob_size = MOB_SIZE_SMALL + pass_flags = PASSTABLE + ventcrawler = VENTCRAWLER_ALWAYS + can_collar = 1 + butcher_results = list(/obj/item/reagent_containers/food/snacks/meat = 5) + response_help = "pets" + response_disarm = "gently pushes aside" + response_harm = "kicks" + gold_core_spawnable = FRIENDLY_SPAWN + footstep_type = FOOTSTEP_MOB_SLIME + tts_seed = "Narrator" + faction = list("slime","neutral") + //holder_type = /obj/item/holder/cat2 + + //Шляпы для слизнекота! + var/obj/item/inventory_head + var/obj/item/inventory_hand + + var/hat_offset_y = -8 + var/hat_offset_y_rest = -19 + var/hat_icon_file = 'icons/mob/clothing/head.dmi' + var/hat_icon_state + var/hat_alpha + var/hat_color + + var/is_pacifist = FALSE + var/is_reduce_damage = TRUE + +/mob/living/simple_animal/pet/slugcat/monk + name = "слизнекот-монах" + desc = "Удивительное существо, напоминающая кота и слизня в одном обличии. Но это не слизь, а иной вид существа. Гордость ксенобиологии. Крайне ловкое и умное, родом с планеты с опасной средой обитания. Не любит охоту и не умеет пользоваться копьями. На нем отлично смотрятся шляпы." + icon_state = "slugcat_monk" + icon_living = "slugcat_monk" + icon_dead = "slugcat_monk_dead" + icon_resting = "slugcat_monk_rest" + is_pacifist = TRUE + gold_core_spawnable = FRIENDLY_SPAWN + health = 80 + maxHealth = 80 + +/mob/living/simple_animal/pet/slugcat/hunter + name = "слизнекот-охотник" + desc = "Удивительное существо, напоминающая кота и слизня в одном обличии. Но это не слизь, а иной вид существа. Гордость ксенобиологии. Крайне ловкое и умное, родом с планеты с опасной средой обитания. Обожает копья и умело управляется ими, не стоит давать ему его в лапки. На нем отлично смотрятся шляпы." + icon_state = "slugcat_hunter" + icon_living = "slugcat_hunter" + icon_dead = "slugcat_hunter_dead" + icon_resting = "slugcat_hunter_rest" + is_pacifist = FALSE + is_reduce_damage = FALSE + faction = list("slime","neutral","hostile") + gold_core_spawnable = HOSTILE_SPAWN + health = 150 + maxHealth = 150 + +/mob/living/simple_animal/pet/slugcat/gold //for admins + name = "золотой слизнекот" + desc = "Уникальный золотой слизнекот полученный чудотворным путём." + icon_state = "slugcat_gold" + icon_living = "slugcat_gold" + icon_dead = "slugcat_gold_dead" + icon_resting = "slugcat_gold_rest" + is_pacifist = FALSE + is_reduce_damage = FALSE + gold_core_spawnable = NO_SPAWN + health = 300 + maxHealth = 300 + +/mob/living/simple_animal/pet/slugcat/New() + ..() + regenerate_icons() + + +/mob/living/simple_animal/pet/slugcat/attackby(obj/item/W, mob/user, params) + if(stat != DEAD) + if(istype(W, /obj/item/clothing/head) && user.a_intent == INTENT_HELP) + place_on_head(user.get_active_hand(), user) + return + if(istype(W, /obj/item/spear) && user.a_intent != INTENT_HARM) + place_to_hand(user.get_active_hand(), user) + return + + . = ..() + +/mob/living/simple_animal/pet/slugcat/death(gibbed) + drop_hat() + drop_hand() + . = ..() + +/mob/living/simple_animal/pet/slugcat/Topic(href, href_list) + if(..()) + return 1 + + if(!(iscarbon(usr) || usr.incapacitated() || !Adjacent(usr))) + usr << browse(null, "window=mob[UID()]") + usr.unset_machine() + return + + if (stat == DEAD) + return 0 + + if(href_list["remove_inv"]) + var/remove_from = href_list["remove_inv"] + switch(remove_from) + if("head") + remove_from_head(usr) + if("hand") + remove_from_hand(usr) + show_inv(usr) + + else if(href_list["add_inv"]) + var/add_to = href_list["add_inv"] + switch(add_to) + if("head") + place_on_head(usr.get_active_hand(), usr) + if("hand") + place_to_hand(usr.get_active_hand(), usr) + show_inv(usr) + + if(usr != src) + return 1 + +/mob/living/simple_animal/pet/slugcat/regenerate_icons() + overlays.Cut() + ..() + + if(inventory_hand) + if(istype(inventory_hand, /obj/item/spear)) + speared() + + if(inventory_head) + var/image/head_icon + + if(!hat_icon_state) + hat_icon_state = inventory_head.icon_state + if(!hat_alpha) + hat_alpha = inventory_head.alpha + if(!hat_color) + hat_color = inventory_head.color + + head_icon = get_hat_overlay() + + add_overlay(head_icon) + +/mob/living/simple_animal/pet/slugcat/on_lying_down(updating = 1) + if(inventory_head || inventory_hand) + hat_offset_y = hat_offset_y_rest + drop_hand() + regenerate_icons() + . = ..() + +/mob/living/simple_animal/pet/slugcat/on_standing_up(updating = 1) + if(inventory_head) + hat_offset_y = initial(hat_offset_y) + regenerate_icons() + . = ..() + +/mob/living/simple_animal/pet/slugcat/proc/speared() + icon_state = "[initial(icon_state)]_spear" + + var/obj/item/spear/spear = inventory_hand + + attacktext = "бьет копьем" + attack_sound = 'sound/weapons/bladeslice.ogg' + melee_damage_type = BRUTE + melee_damage_lower = round(spear.force_unwielded / (is_reduce_damage ? 2 : 1)) + melee_damage_upper = round(spear.force_wielded / (is_reduce_damage ? 2 : 1)) + obj_damage = spear.force + +/mob/living/simple_animal/pet/slugcat/proc/unspeared() + icon_state = initial(icon_state) + attacktext = initial(attacktext) + attack_sound = initial(attack_sound) + melee_damage_type = initial(melee_damage_type) + melee_damage_lower = initial(melee_damage_lower) + melee_damage_upper = initial(melee_damage_upper) + obj_damage = initial(obj_damage) + +/mob/living/simple_animal/pet/slugcat/proc/get_hat_overlay() + if(hat_icon_file && hat_icon_state) + var/image/slugI = image(hat_icon_file, hat_icon_state) + slugI.alpha = hat_alpha + slugI.color = hat_color + slugI.pixel_y = hat_offset_y + //slugI.transform = matrix(1, 0, 1, 0, 1, 0) + return slugI + +/mob/living/simple_animal/pet/slugcat/show_inv(mob/user) + if(user.incapacitated() || !Adjacent(user)) + return + user.set_machine(src) + + var/dat = {"

Inventory of [name]

"} + dat += "
Head: [inventory_head]" : "add_inv=head'>Nothing"]" + dat += "
Hand: [inventory_hand]" : "add_inv=hand'>Nothing"]" + + var/datum/browser/popup = new(user, "mob[UID()]", "[src]", 440, 250) + popup.set_content(dat) + popup.open() + +/mob/living/simple_animal/pet/slugcat/proc/place_on_head(obj/item/item_to_add, mob/user) + if(!item_to_add) + user.visible_message("[user] похлопывает по голове [src.name].", "Вы положили руку на голову [src.name].") + if(flags_2 & HOLOGRAM_2) + return 0 + return 0 + + if(!istype(item_to_add, /obj/item/clothing/head)) + to_chat(user, "[item_to_add.name] нельзя надеть на голову [src.name]!") + return 0 + + if(inventory_head) + if(user) + to_chat(user, "Нельзя надеть больше одного головного убора на голову [src.name]!") + return 0 + + if(user && !user.unEquip(item_to_add)) + to_chat(user, "[item_to_add.name] застрял в ваших руках, вы не можете его надеть на голову [src.name]!") + return 0 + + user.visible_message("[user] надевает [item_to_add].name на голову [real_name].", + "Вы надеваете [item_to_add.name] на голову [real_name].", + "Вы слышите как что-то нацепили.") + inventory_head = item_to_add + regenerate_icons() + + return 1 + +/mob/living/simple_animal/pet/slugcat/proc/remove_from_head(mob/user) + if(inventory_head) + if(inventory_head.flags & NODROP) + to_chat(user, "[inventory_head.name] застрял на голове [src.name]! Его невозможно снять!") + return TRUE + + to_chat(user, "Вы сняли [inventory_head.name] с головы [src.name].") + drop_item(inventory_head) + user.put_in_hands(inventory_head) + + null_hat() + + regenerate_icons() + else + to_chat(user, "На голове [src.name] нет головного убора!") + return FALSE + + return TRUE + +/mob/living/simple_animal/pet/slugcat/proc/drop_hat() + if(inventory_head) + drop_item(inventory_head) + null_hat() + regenerate_icons() + +/mob/living/simple_animal/pet/slugcat/proc/null_hat() + inventory_head = null + hat_icon_state = null + hat_alpha = null + hat_color = null + +/mob/living/simple_animal/pet/slugcat/proc/place_to_hand(obj/item/item_to_add, mob/user) + if(!item_to_add) + user.visible_message("[user] пощупал лапки [src].", "Вы пощупали лапки [src].") + if(flags_2 & HOLOGRAM_2) + return 0 + return 0 + + if(resting) + to_chat(user, "[src.name] спит и не принимает [item_to_add.name]!") + return 0 + + if(!istype(item_to_add, /obj/item/spear)) + to_chat(user, "[src.name] не принимает [item_to_add.name]!") + return 0 + + if(inventory_hand) + if(user) + to_chat(user, "Лапки [src.name] заняты [inventory_hand.name]!") + return 0 + + if(user && !user.drop_item(item_to_add)) + to_chat(user, "[item_to_add.name] застрял в ваших руках, вы не можете его дать [src.name]!") + return 0 + + if(is_pacifist) + to_chat(user, "[src.name] пацифист и не пользуется [item_to_add.name]!") + return 0 + + user.visible_message("[real_name] выхватывает [item_to_add] с рук [user].", + "[real_name] выхватывает [item_to_add] с ваших рук.", + "Вы видите довольные глаза.") + move_item_to_hand(item_to_add) + + return 1 + +/mob/living/simple_animal/pet/slugcat/proc/move_item_to_hand(obj/item/item_to_add) + item_to_add.forceMove(src) + inventory_hand = item_to_add + regenerate_icons() + +/mob/living/simple_animal/pet/slugcat/proc/remove_from_hand(mob/user) + if(inventory_hand) + if(inventory_hand.flags & NODROP) + to_chat(user, "[inventory_hand.name] застрял в лапах [src]! Его невозможно отнять!") + return TRUE + + to_chat(user, "Вы забрали [inventory_hand.name] с лап [src].") + drop_item(inventory_hand) + user.put_in_hands(inventory_hand) + + null_hand() + + regenerate_icons() + else + to_chat(user, "В лапах [src] нечего отбирать!") + return FALSE + + return TRUE + +/mob/living/simple_animal/pet/slugcat/proc/drop_hand() + if(inventory_hand) + drop_item(inventory_hand) + null_hand() + regenerate_icons() + +/mob/living/simple_animal/pet/slugcat/proc/null_hand() + unspeared() + inventory_hand = null diff --git a/modular_ss220/mobs/code/supplypacks/crittercrate.dm b/modular_ss220/mobs/code/supplypacks/crittercrate.dm new file mode 100644 index 000000000000..bb706cf08260 --- /dev/null +++ b/modular_ss220/mobs/code/supplypacks/crittercrate.dm @@ -0,0 +1,159 @@ +//dogs +/obj/structure/closet/critter/corgi + name = "dog corgi crate" + +/obj/structure/closet/critter/pug + name = "dog pug crate" + +/obj/structure/closet/critter/dog_bullterrier + name = "dog bullterrier crate" + content_mob = /mob/living/simple_animal/pet/dog/bullterrier + +/obj/structure/closet/critter/dog_tamaskan + name = "dog tamaskan crate" + content_mob = /mob/living/simple_animal/pet/dog/tamaskan + +/obj/structure/closet/critter/dog_german + name = "dog german crate" + content_mob = /mob/living/simple_animal/pet/dog/german + +/obj/structure/closet/critter/dog_brittany + name = "dog brittany crate" + content_mob = /mob/living/simple_animal/pet/dog/brittany + + +// cats +/obj/structure/closet/critter/cat/populate_contents() + . = ..() + if(prob(5)) + content_mob = /mob/living/simple_animal/pet/cat/fat + +/obj/structure/closet/critter/cat_white + name = "white cat crate" + content_mob = /mob/living/simple_animal/pet/cat/white + +/obj/structure/closet/critter/cat_birman + name = "birman cat crate" + content_mob = /mob/living/simple_animal/pet/cat/birman + +// fox +/obj/structure/closet/critter/fox/populate_contents() + . = ..() + if(prob(30)) + content_mob = /mob/living/simple_animal/pet/dog/fox/forest + +/obj/structure/closet/critter/fennec + name = "fennec crate" + content_mob = /mob/living/simple_animal/pet/dog/fox/fennec + +// amphibians +/obj/structure/closet/critter/frog + name = "frog crate" + content_mob = /mob/living/simple_animal/frog + +/obj/structure/closet/critter/frog/populate_contents() + amount = rand(1, 3) + +/obj/structure/closet/critter/frog/toxic + name = "frog crate" + content_mob = /mob/living/simple_animal/frog/toxic + +/obj/structure/closet/critter/frog/toxic/populate_contents() + . = ..() + if(prob(25)) + content_mob = /mob/living/simple_animal/frog/toxic/scream + +/obj/structure/closet/critter/frog/scream + name = "frog crate" + content_mob = /mob/living/simple_animal/frog/scream + +/obj/structure/closet/critter/snail + name = "snail crate" + content_mob = /mob/living/simple_animal/snail + +/obj/structure/closet/critter/snail/populate_contents() + amount = rand(1, 5) + +/obj/structure/closet/critter/turtle + name = "turtle crate" + content_mob = /mob/living/simple_animal/turtle + +// lizards +/obj/structure/closet/critter/iguana + name = "iguana crate" + content_mob = /mob/living/simple_animal/hostile/lizard + +/obj/structure/closet/critter/gator + name = "gator crate" + content_mob = /mob/living/simple_animal/hostile/lizard/gator + +/obj/structure/closet/critter/croco + name = "croco crate" + content_mob = /mob/living/simple_animal/hostile/lizard/croco + +//misc +/obj/structure/closet/critter/sloth + name = "sloth crate" + content_mob = /mob/living/simple_animal/pet/sloth + +/obj/structure/closet/critter/goose + name = "goose crate" + content_mob = /mob/living/simple_animal/goose + +/obj/structure/closet/critter/gosling + name = "gosling crate" + content_mob = /mob/living/simple_animal/goose/gosling + +/obj/structure/closet/critter/gosling/populate_contents() + amount = rand(1, 3) + +/obj/structure/closet/critter/hamster + name = "hamster crate" + content_mob = /mob/living/simple_animal/mouse/hamster + +/obj/structure/closet/critter/hamster/populate_contents() + amount = rand(1, 5) + +/obj/structure/closet/critter/possum + name = "possum crate" + content_mob = /mob/living/simple_animal/possum + +/obj/structure/closet/critter/possum/populate_contents() + amount = rand(1, 5) + +/obj/structure/closet/critter/moth //ящик дорогих шуб поели моли. Увынск. + name = "ящик дорогих шуб" + content_mob = /mob/living/simple_animal/moth + var/static/prob_clothes = 50 + var/static/possible_clothes_list = list( + /obj/item/clothing/suit/pimpcoat = 50, + + /obj/item/clothing/suit/tailcoat = 25, + /obj/item/clothing/suit/victcoat = 25, + /obj/item/clothing/suit/victcoat/red = 25, + /obj/item/clothing/suit/draculacoat = 25, + /obj/item/clothing/suit/browntrenchcoat = 25, + /obj/item/clothing/suit/neocoat = 25, + /obj/item/clothing/suit/blacktrenchcoat = 25, + + /obj/item/clothing/suit/storage/blueshield = 5, + /obj/item/clothing/suit/sovietcoat = 5, + + /obj/item/clothing/suit/armor/vest/capcarapace/jacket = 1, + /obj/item/clothing/suit/armor/vest/capcarapace/jacket/tunic = 1, + /obj/item/clothing/suit/armor/vest/capcarapace/coat = 1, + /obj/item/clothing/suit/armor/vest/capcarapace/coat/white = 1, + ) + +/obj/structure/closet/critter/moth/populate_contents() + amount = rand(1, 5) + if(prob(50)) + content_mob = /mob/living/simple_animal/mothroach + + if(prob(prob_clothes)) + //contains = list() + var/clothes_amount = rand(1, 8) + for(var/i in 1 to clothes_amount) + var/picked = pick(possible_clothes_list) + new picked(src) + //contains.add(picked) diff --git a/modular_ss220/mobs/code/supplypacks/pack_animals.dm b/modular_ss220/mobs/code/supplypacks/pack_animals.dm new file mode 100644 index 000000000000..2558d2b1c1f3 --- /dev/null +++ b/modular_ss220/mobs/code/supplypacks/pack_animals.dm @@ -0,0 +1,142 @@ +//dogs +/datum/supply_packs/organic/corgi + name = "Dog Corgi Crate" + +/datum/supply_packs/organic/pug + name = "Dog Pug Crate" + cost = 300 + containertype = /obj/structure/closet/critter/pug + containername = "dog pug crate" + +/datum/supply_packs/organic/dog_bullterrier + name = "Dog Bullterrie Crate" + cost = 300 + containertype = /obj/structure/closet/critter/dog_bullterrier + containername = "dog bullterrie crate" + +/datum/supply_packs/organic/dog_tamaskan + name = "Dog Tamaskan Crate" + cost = 300 + containertype = /obj/structure/closet/critter/dog_tamaskan + containername = "dog tamaskan crate" + +/datum/supply_packs/organic/dog_german + name = "Dog German Crate" + cost = 300 + containertype = /obj/structure/closet/critter/dog_german + containername = "dog german crate" + +/datum/supply_packs/organic/dog_brittany + name = "Dog Brittany Crate" + cost = 300 + containertype = /obj/structure/closet/critter/dog_brittany + containername = "dog brittany crate" + +//cats +/datum/supply_packs/organic/cat/white + name = "White Cat Crate" + cost = 400 + containername = "white crate" + containertype = /obj/structure/closet/critter/cat_white + +/datum/supply_packs/organic/cat/birman + name = "Birman Cat Crate" + cost = 500 + containername = "birman crate" + containertype = /obj/structure/closet/critter/cat_birman + +//fox +/datum/supply_packs/organic/fennec + name = "Fennec Crate" + cost = 500 + containertype = /obj/structure/closet/critter/fennec + containername = "fennec crate" + +//amphibia +/datum/supply_packs/organic/frog + name = "Frog Crate" + cost = 250 + containertype = /obj/structure/closet/critter/frog + containername = "frog crate" + +/datum/supply_packs/organic/frog/toxic + name = "ERROR frog Crate" + cost = 1500 + containertype = /obj/structure/closet/critter/frog/toxic + containername = "ERROR frog crate" + hidden = 1 + +/datum/supply_packs/organic/frog/toxic + name = "LOUD frog Crate" + cost = 1000 + containertype = /obj/structure/closet/critter/frog/scream + containername = "LOUD frog crate" + hidden = 1 + +/datum/supply_packs/organic/snail + name = "Snail Crate" + cost = 600 + containertype = /obj/structure/closet/critter/snail + containername = "snail crate" + +/datum/supply_packs/organic/turtle + name = "Turtle Crate" + cost = 400 + containertype = /obj/structure/closet/critter/turtle + containername = "turtle crate" + +//lizards +/datum/supply_packs/organic/iguana + name = "Iguana Crate" + cost = 550 + containertype = /obj/structure/closet/critter/iguana + containername = "iguana crate" + +/datum/supply_packs/organic/gator + name = "Gator Crate" + cost = 1000 //most dangerous + containertype = /obj/structure/closet/critter/gator + containername = "gator crate" + +/datum/supply_packs/organic/croco + name = "Croco Crate" + cost = 850 + containertype = /obj/structure/closet/critter/croco + containername = "croco crate" + +//misc +/datum/supply_packs/organic/sloth + name = "Sloth Crate" + cost = 500 + containertype = /obj/structure/closet/critter/sloth + containername = "sloth crate" + +/datum/supply_packs/organic/goose + name = "Goose Crate" + cost = 250 + containertype = /obj/structure/closet/critter/goose + containername = "goose crate" + +/datum/supply_packs/organic/gosling + name = "Gosling Crate" + cost = 50 + containertype = /obj/structure/closet/critter/gosling + containername = "gosling crate" + +/datum/supply_packs/organic/hamster + name = "Hamster Crate" + cost = 150 + containertype = /obj/structure/closet/critter/hamster + containername = "hamster crate" + +/datum/supply_packs/organic/possum + name = "Possum Crate" + cost = 200 + containertype = /obj/structure/closet/critter/possum + containername = "possum crate" + +/datum/supply_packs/misc/moth + name = "ящик дорогих шуб" + cost = 2000 + containertype = /obj/structure/closet/critter/moth + containername = "fur crate" diff --git a/modular_ss220/mobs/icons/items.dmi b/modular_ss220/mobs/icons/items.dmi new file mode 100644 index 000000000000..24d56208221a Binary files /dev/null and b/modular_ss220/mobs/icons/items.dmi differ diff --git a/modular_ss220/mobs/icons/mob/animal.dmi b/modular_ss220/mobs/icons/mob/animal.dmi new file mode 100644 index 000000000000..94b3966a89f6 Binary files /dev/null and b/modular_ss220/mobs/icons/mob/animal.dmi differ diff --git a/modular_ss220/mobs/icons/mob/headcrab.dmi b/modular_ss220/mobs/icons/mob/headcrab.dmi new file mode 100644 index 000000000000..a1081b398350 Binary files /dev/null and b/modular_ss220/mobs/icons/mob/headcrab.dmi differ diff --git a/modular_ss220/mobs/icons/mob/inhands/mobs_lefthand.dmi b/modular_ss220/mobs/icons/mob/inhands/mobs_lefthand.dmi new file mode 100644 index 000000000000..f62231afbc2c Binary files /dev/null and b/modular_ss220/mobs/icons/mob/inhands/mobs_lefthand.dmi differ diff --git a/modular_ss220/mobs/icons/mob/inhands/mobs_righthand.dmi b/modular_ss220/mobs/icons/mob/inhands/mobs_righthand.dmi new file mode 100644 index 000000000000..b6947c613fcd Binary files /dev/null and b/modular_ss220/mobs/icons/mob/inhands/mobs_righthand.dmi differ diff --git a/modular_ss220/mobs/icons/mob/inhead/ears.dmi b/modular_ss220/mobs/icons/mob/inhead/ears.dmi new file mode 100644 index 000000000000..7876fe6d7c53 Binary files /dev/null and b/modular_ss220/mobs/icons/mob/inhead/ears.dmi differ diff --git a/modular_ss220/mobs/icons/mob/inhead/head.dmi b/modular_ss220/mobs/icons/mob/inhead/head.dmi new file mode 100644 index 000000000000..e08634fcd4dd Binary files /dev/null and b/modular_ss220/mobs/icons/mob/inhead/head.dmi differ diff --git a/modular_ss220/mobs/icons/mob/pets.dmi b/modular_ss220/mobs/icons/mob/pets.dmi new file mode 100644 index 000000000000..658e677ded5a Binary files /dev/null and b/modular_ss220/mobs/icons/mob/pets.dmi differ diff --git a/modular_ss220/mobs/icons/mob/unsorted.dmi b/modular_ss220/mobs/icons/mob/unsorted.dmi new file mode 100644 index 000000000000..2fc6c72b9a1c Binary files /dev/null and b/modular_ss220/mobs/icons/mob/unsorted.dmi differ diff --git a/modular_ss220/mobs/icons/muhtar_accessories.dmi b/modular_ss220/mobs/icons/muhtar_accessories.dmi new file mode 100644 index 000000000000..bad7da59ddc8 Binary files /dev/null and b/modular_ss220/mobs/icons/muhtar_accessories.dmi differ diff --git a/modular_ss220/mobs/icons/pet_carrier.dmi b/modular_ss220/mobs/icons/pet_carrier.dmi new file mode 100644 index 000000000000..927532ff3316 Binary files /dev/null and b/modular_ss220/mobs/icons/pet_carrier.dmi differ diff --git a/modular_ss220/mobs/icons/rouge_accessories.dmi b/modular_ss220/mobs/icons/rouge_accessories.dmi new file mode 100644 index 000000000000..118748c522d9 Binary files /dev/null and b/modular_ss220/mobs/icons/rouge_accessories.dmi differ diff --git a/modular_ss220/mobs/sound/creatures/bear_death.ogg b/modular_ss220/mobs/sound/creatures/bear_death.ogg new file mode 100644 index 000000000000..8b5717ae9c79 Binary files /dev/null and b/modular_ss220/mobs/sound/creatures/bear_death.ogg differ diff --git a/modular_ss220/mobs/sound/creatures/bear_onerawr1.ogg b/modular_ss220/mobs/sound/creatures/bear_onerawr1.ogg new file mode 100644 index 000000000000..3b68421ad61e Binary files /dev/null and b/modular_ss220/mobs/sound/creatures/bear_onerawr1.ogg differ diff --git a/modular_ss220/mobs/sound/creatures/bear_onerawr2.ogg b/modular_ss220/mobs/sound/creatures/bear_onerawr2.ogg new file mode 100644 index 000000000000..98d71af8f0ee Binary files /dev/null and b/modular_ss220/mobs/sound/creatures/bear_onerawr2.ogg differ diff --git a/modular_ss220/mobs/sound/creatures/bear_onerawr3.ogg b/modular_ss220/mobs/sound/creatures/bear_onerawr3.ogg new file mode 100644 index 000000000000..1e2b0ef5a1d0 Binary files /dev/null and b/modular_ss220/mobs/sound/creatures/bear_onerawr3.ogg differ diff --git a/modular_ss220/mobs/sound/creatures/bear_rawr.ogg b/modular_ss220/mobs/sound/creatures/bear_rawr.ogg new file mode 100644 index 000000000000..61565198f46f Binary files /dev/null and b/modular_ss220/mobs/sound/creatures/bear_rawr.ogg differ diff --git a/modular_ss220/mobs/sound/creatures/bear_talk1.ogg b/modular_ss220/mobs/sound/creatures/bear_talk1.ogg new file mode 100644 index 000000000000..bb6815c20487 Binary files /dev/null and b/modular_ss220/mobs/sound/creatures/bear_talk1.ogg differ diff --git a/modular_ss220/mobs/sound/creatures/bear_talk2.ogg b/modular_ss220/mobs/sound/creatures/bear_talk2.ogg new file mode 100644 index 000000000000..ae3dbf335758 Binary files /dev/null and b/modular_ss220/mobs/sound/creatures/bear_talk2.ogg differ diff --git a/modular_ss220/mobs/sound/creatures/bear_talk3.ogg b/modular_ss220/mobs/sound/creatures/bear_talk3.ogg new file mode 100644 index 000000000000..a8f28d93075d Binary files /dev/null and b/modular_ss220/mobs/sound/creatures/bear_talk3.ogg differ diff --git a/modular_ss220/mobs/sound/creatures/bee.ogg b/modular_ss220/mobs/sound/creatures/bee.ogg new file mode 100644 index 000000000000..ea8dcc2b369b Binary files /dev/null and b/modular_ss220/mobs/sound/creatures/bee.ogg differ diff --git a/modular_ss220/mobs/sound/creatures/cat_meow.ogg b/modular_ss220/mobs/sound/creatures/cat_meow.ogg new file mode 100644 index 000000000000..f52cbd2a172f Binary files /dev/null and b/modular_ss220/mobs/sound/creatures/cat_meow.ogg differ diff --git a/modular_ss220/mobs/sound/creatures/caw.ogg b/modular_ss220/mobs/sound/creatures/caw.ogg new file mode 100644 index 000000000000..dc199f7f4fe6 Binary files /dev/null and b/modular_ss220/mobs/sound/creatures/caw.ogg differ diff --git a/modular_ss220/mobs/sound/creatures/chicken_damaged1.ogg b/modular_ss220/mobs/sound/creatures/chicken_damaged1.ogg new file mode 100644 index 000000000000..6cc8e63e1511 Binary files /dev/null and b/modular_ss220/mobs/sound/creatures/chicken_damaged1.ogg differ diff --git a/modular_ss220/mobs/sound/creatures/chicken_damaged2.ogg b/modular_ss220/mobs/sound/creatures/chicken_damaged2.ogg new file mode 100644 index 000000000000..01a4308d53dc Binary files /dev/null and b/modular_ss220/mobs/sound/creatures/chicken_damaged2.ogg differ diff --git a/modular_ss220/mobs/sound/creatures/chicken_death.ogg b/modular_ss220/mobs/sound/creatures/chicken_death.ogg new file mode 100644 index 000000000000..989c35b9d472 Binary files /dev/null and b/modular_ss220/mobs/sound/creatures/chicken_death.ogg differ diff --git a/modular_ss220/mobs/sound/creatures/chicken_talk.ogg b/modular_ss220/mobs/sound/creatures/chicken_talk.ogg new file mode 100644 index 000000000000..2f38d2e6c7dc Binary files /dev/null and b/modular_ss220/mobs/sound/creatures/chicken_talk.ogg differ diff --git a/modular_ss220/mobs/sound/creatures/cow_damaged.ogg b/modular_ss220/mobs/sound/creatures/cow_damaged.ogg new file mode 100644 index 000000000000..7ba82ddb8f4e Binary files /dev/null and b/modular_ss220/mobs/sound/creatures/cow_damaged.ogg differ diff --git a/modular_ss220/mobs/sound/creatures/cow_death.ogg b/modular_ss220/mobs/sound/creatures/cow_death.ogg new file mode 100644 index 000000000000..00555ec9b620 Binary files /dev/null and b/modular_ss220/mobs/sound/creatures/cow_death.ogg differ diff --git a/modular_ss220/mobs/sound/creatures/cow_talk1.ogg b/modular_ss220/mobs/sound/creatures/cow_talk1.ogg new file mode 100644 index 000000000000..1a1f03b69351 Binary files /dev/null and b/modular_ss220/mobs/sound/creatures/cow_talk1.ogg differ diff --git a/modular_ss220/mobs/sound/creatures/cow_talk2.ogg b/modular_ss220/mobs/sound/creatures/cow_talk2.ogg new file mode 100644 index 000000000000..3ad84c9134f6 Binary files /dev/null and b/modular_ss220/mobs/sound/creatures/cow_talk2.ogg differ diff --git a/modular_ss220/mobs/sound/creatures/crack_death1.ogg b/modular_ss220/mobs/sound/creatures/crack_death1.ogg new file mode 100644 index 000000000000..bad0933700b7 Binary files /dev/null and b/modular_ss220/mobs/sound/creatures/crack_death1.ogg differ diff --git a/modular_ss220/mobs/sound/creatures/crack_death2.ogg b/modular_ss220/mobs/sound/creatures/crack_death2.ogg new file mode 100644 index 000000000000..8c9ed6aa56a5 Binary files /dev/null and b/modular_ss220/mobs/sound/creatures/crack_death2.ogg differ diff --git a/modular_ss220/mobs/sound/creatures/dog_bark1.ogg b/modular_ss220/mobs/sound/creatures/dog_bark1.ogg new file mode 100644 index 000000000000..809f3897c889 Binary files /dev/null and b/modular_ss220/mobs/sound/creatures/dog_bark1.ogg differ diff --git a/modular_ss220/mobs/sound/creatures/dog_bark2.ogg b/modular_ss220/mobs/sound/creatures/dog_bark2.ogg new file mode 100644 index 000000000000..e4e27b0f8628 Binary files /dev/null and b/modular_ss220/mobs/sound/creatures/dog_bark2.ogg differ diff --git a/modular_ss220/mobs/sound/creatures/dog_grawl1.ogg b/modular_ss220/mobs/sound/creatures/dog_grawl1.ogg new file mode 100644 index 000000000000..1e55c9b09c4d Binary files /dev/null and b/modular_ss220/mobs/sound/creatures/dog_grawl1.ogg differ diff --git a/modular_ss220/mobs/sound/creatures/dog_grawl2.ogg b/modular_ss220/mobs/sound/creatures/dog_grawl2.ogg new file mode 100644 index 000000000000..33b51191149e Binary files /dev/null and b/modular_ss220/mobs/sound/creatures/dog_grawl2.ogg differ diff --git a/modular_ss220/mobs/sound/creatures/dog_yelp.ogg b/modular_ss220/mobs/sound/creatures/dog_yelp.ogg new file mode 100644 index 000000000000..22f1586014dc Binary files /dev/null and b/modular_ss220/mobs/sound/creatures/dog_yelp.ogg differ diff --git a/modular_ss220/mobs/sound/creatures/duck_aggro1.ogg b/modular_ss220/mobs/sound/creatures/duck_aggro1.ogg new file mode 100644 index 000000000000..9c65adb557aa Binary files /dev/null and b/modular_ss220/mobs/sound/creatures/duck_aggro1.ogg differ diff --git a/modular_ss220/mobs/sound/creatures/duck_aggro2.ogg b/modular_ss220/mobs/sound/creatures/duck_aggro2.ogg new file mode 100644 index 000000000000..2f70b7724dfb Binary files /dev/null and b/modular_ss220/mobs/sound/creatures/duck_aggro2.ogg differ diff --git a/modular_ss220/mobs/sound/creatures/duck_quak1.ogg b/modular_ss220/mobs/sound/creatures/duck_quak1.ogg new file mode 100644 index 000000000000..a21e1022690e Binary files /dev/null and b/modular_ss220/mobs/sound/creatures/duck_quak1.ogg differ diff --git a/modular_ss220/mobs/sound/creatures/duck_quak2.ogg b/modular_ss220/mobs/sound/creatures/duck_quak2.ogg new file mode 100644 index 000000000000..c841535916c0 Binary files /dev/null and b/modular_ss220/mobs/sound/creatures/duck_quak2.ogg differ diff --git a/modular_ss220/mobs/sound/creatures/duck_quak3.ogg b/modular_ss220/mobs/sound/creatures/duck_quak3.ogg new file mode 100644 index 000000000000..c985b116279c Binary files /dev/null and b/modular_ss220/mobs/sound/creatures/duck_quak3.ogg differ diff --git a/modular_ss220/mobs/sound/creatures/duck_talk1.ogg b/modular_ss220/mobs/sound/creatures/duck_talk1.ogg new file mode 100644 index 000000000000..9c38a1220d19 Binary files /dev/null and b/modular_ss220/mobs/sound/creatures/duck_talk1.ogg differ diff --git a/modular_ss220/mobs/sound/creatures/duck_talk2.ogg b/modular_ss220/mobs/sound/creatures/duck_talk2.ogg new file mode 100644 index 000000000000..43302c82dc1f Binary files /dev/null and b/modular_ss220/mobs/sound/creatures/duck_talk2.ogg differ diff --git a/modular_ss220/mobs/sound/creatures/duck_talk3.ogg b/modular_ss220/mobs/sound/creatures/duck_talk3.ogg new file mode 100644 index 000000000000..c511727a9d6b Binary files /dev/null and b/modular_ss220/mobs/sound/creatures/duck_talk3.ogg differ diff --git a/modular_ss220/mobs/sound/creatures/fast_zombie_idle1.ogg b/modular_ss220/mobs/sound/creatures/fast_zombie_idle1.ogg new file mode 100644 index 000000000000..373df5f68acb Binary files /dev/null and b/modular_ss220/mobs/sound/creatures/fast_zombie_idle1.ogg differ diff --git a/modular_ss220/mobs/sound/creatures/fast_zombie_idle2.ogg b/modular_ss220/mobs/sound/creatures/fast_zombie_idle2.ogg new file mode 100644 index 000000000000..54d7a5890665 Binary files /dev/null and b/modular_ss220/mobs/sound/creatures/fast_zombie_idle2.ogg differ diff --git a/modular_ss220/mobs/sound/creatures/fast_zombie_idle3.ogg b/modular_ss220/mobs/sound/creatures/fast_zombie_idle3.ogg new file mode 100644 index 000000000000..f9f97049c9a5 Binary files /dev/null and b/modular_ss220/mobs/sound/creatures/fast_zombie_idle3.ogg differ diff --git a/modular_ss220/mobs/sound/creatures/fox_yelp.ogg b/modular_ss220/mobs/sound/creatures/fox_yelp.ogg new file mode 100644 index 000000000000..83c60317f65e Binary files /dev/null and b/modular_ss220/mobs/sound/creatures/fox_yelp.ogg differ diff --git a/modular_ss220/mobs/sound/creatures/frog_damaged.ogg b/modular_ss220/mobs/sound/creatures/frog_damaged.ogg new file mode 100644 index 000000000000..0a5096e51f8f Binary files /dev/null and b/modular_ss220/mobs/sound/creatures/frog_damaged.ogg differ diff --git a/modular_ss220/mobs/sound/creatures/frog_death.ogg b/modular_ss220/mobs/sound/creatures/frog_death.ogg new file mode 100644 index 000000000000..c5afa7145b84 Binary files /dev/null and b/modular_ss220/mobs/sound/creatures/frog_death.ogg differ diff --git a/modular_ss220/mobs/sound/creatures/frog_scream1.ogg b/modular_ss220/mobs/sound/creatures/frog_scream1.ogg new file mode 100644 index 000000000000..9be0bebcfbd8 Binary files /dev/null and b/modular_ss220/mobs/sound/creatures/frog_scream1.ogg differ diff --git a/modular_ss220/mobs/sound/creatures/frog_scream2.ogg b/modular_ss220/mobs/sound/creatures/frog_scream2.ogg new file mode 100644 index 000000000000..6a635f5a676b Binary files /dev/null and b/modular_ss220/mobs/sound/creatures/frog_scream2.ogg differ diff --git a/modular_ss220/mobs/sound/creatures/frog_scream_1.ogg b/modular_ss220/mobs/sound/creatures/frog_scream_1.ogg new file mode 100644 index 000000000000..0c397369b4fe Binary files /dev/null and b/modular_ss220/mobs/sound/creatures/frog_scream_1.ogg differ diff --git a/modular_ss220/mobs/sound/creatures/frog_scream_2.ogg b/modular_ss220/mobs/sound/creatures/frog_scream_2.ogg new file mode 100644 index 000000000000..25dd16c0f7b5 Binary files /dev/null and b/modular_ss220/mobs/sound/creatures/frog_scream_2.ogg differ diff --git a/modular_ss220/mobs/sound/creatures/frog_scream_3.ogg b/modular_ss220/mobs/sound/creatures/frog_scream_3.ogg new file mode 100644 index 000000000000..232f32bd50d1 Binary files /dev/null and b/modular_ss220/mobs/sound/creatures/frog_scream_3.ogg differ diff --git a/modular_ss220/mobs/sound/creatures/frog_talk1.ogg b/modular_ss220/mobs/sound/creatures/frog_talk1.ogg new file mode 100644 index 000000000000..eb34774607a1 Binary files /dev/null and b/modular_ss220/mobs/sound/creatures/frog_talk1.ogg differ diff --git a/modular_ss220/mobs/sound/creatures/frog_talk2.ogg b/modular_ss220/mobs/sound/creatures/frog_talk2.ogg new file mode 100644 index 000000000000..f905914a3b00 Binary files /dev/null and b/modular_ss220/mobs/sound/creatures/frog_talk2.ogg differ diff --git a/modular_ss220/mobs/sound/creatures/goat_death.ogg b/modular_ss220/mobs/sound/creatures/goat_death.ogg new file mode 100644 index 000000000000..630d1ac75d50 Binary files /dev/null and b/modular_ss220/mobs/sound/creatures/goat_death.ogg differ diff --git a/modular_ss220/mobs/sound/creatures/headcrab_attack.ogg b/modular_ss220/mobs/sound/creatures/headcrab_attack.ogg new file mode 100644 index 000000000000..4f6d114aa757 Binary files /dev/null and b/modular_ss220/mobs/sound/creatures/headcrab_attack.ogg differ diff --git a/modular_ss220/mobs/sound/creatures/hoot.ogg b/modular_ss220/mobs/sound/creatures/hoot.ogg new file mode 100644 index 000000000000..a1b6b5f18fa4 Binary files /dev/null and b/modular_ss220/mobs/sound/creatures/hoot.ogg differ diff --git a/modular_ss220/mobs/sound/creatures/legion_death.ogg b/modular_ss220/mobs/sound/creatures/legion_death.ogg new file mode 100644 index 000000000000..fdcf9c8a6596 Binary files /dev/null and b/modular_ss220/mobs/sound/creatures/legion_death.ogg differ diff --git a/modular_ss220/mobs/sound/creatures/legion_death_far.ogg b/modular_ss220/mobs/sound/creatures/legion_death_far.ogg new file mode 100644 index 000000000000..3e3261687c3b Binary files /dev/null and b/modular_ss220/mobs/sound/creatures/legion_death_far.ogg differ diff --git a/modular_ss220/mobs/sound/creatures/legion_spawn.ogg b/modular_ss220/mobs/sound/creatures/legion_spawn.ogg new file mode 100644 index 000000000000..9fce6dec4c6c Binary files /dev/null and b/modular_ss220/mobs/sound/creatures/legion_spawn.ogg differ diff --git a/modular_ss220/mobs/sound/creatures/lizard_angry1.ogg b/modular_ss220/mobs/sound/creatures/lizard_angry1.ogg new file mode 100644 index 000000000000..0d73ac0d7fcd Binary files /dev/null and b/modular_ss220/mobs/sound/creatures/lizard_angry1.ogg differ diff --git a/modular_ss220/mobs/sound/creatures/lizard_angry2.ogg b/modular_ss220/mobs/sound/creatures/lizard_angry2.ogg new file mode 100644 index 000000000000..56f1f311ae90 Binary files /dev/null and b/modular_ss220/mobs/sound/creatures/lizard_angry2.ogg differ diff --git a/modular_ss220/mobs/sound/creatures/lizard_angry3.ogg b/modular_ss220/mobs/sound/creatures/lizard_angry3.ogg new file mode 100644 index 000000000000..c68ec9e56078 Binary files /dev/null and b/modular_ss220/mobs/sound/creatures/lizard_angry3.ogg differ diff --git a/modular_ss220/mobs/sound/creatures/lizard_damaged.ogg b/modular_ss220/mobs/sound/creatures/lizard_damaged.ogg new file mode 100644 index 000000000000..aeb97e6de64d Binary files /dev/null and b/modular_ss220/mobs/sound/creatures/lizard_damaged.ogg differ diff --git a/modular_ss220/mobs/sound/creatures/lizard_death.ogg b/modular_ss220/mobs/sound/creatures/lizard_death.ogg new file mode 100644 index 000000000000..300e36a33fd1 Binary files /dev/null and b/modular_ss220/mobs/sound/creatures/lizard_death.ogg differ diff --git a/modular_ss220/mobs/sound/creatures/lizard_death_big.ogg b/modular_ss220/mobs/sound/creatures/lizard_death_big.ogg new file mode 100644 index 000000000000..aeb97e6de64d Binary files /dev/null and b/modular_ss220/mobs/sound/creatures/lizard_death_big.ogg differ diff --git a/modular_ss220/mobs/sound/creatures/mouse_squeak.ogg b/modular_ss220/mobs/sound/creatures/mouse_squeak.ogg new file mode 100644 index 000000000000..7b413d6da2a0 Binary files /dev/null and b/modular_ss220/mobs/sound/creatures/mouse_squeak.ogg differ diff --git a/modular_ss220/mobs/sound/creatures/narsie_rises.ogg b/modular_ss220/mobs/sound/creatures/narsie_rises.ogg new file mode 100644 index 000000000000..ccd10cf115fa Binary files /dev/null and b/modular_ss220/mobs/sound/creatures/narsie_rises.ogg differ diff --git a/modular_ss220/mobs/sound/creatures/nymphchirp.ogg b/modular_ss220/mobs/sound/creatures/nymphchirp.ogg new file mode 100644 index 000000000000..e0e573d497d6 Binary files /dev/null and b/modular_ss220/mobs/sound/creatures/nymphchirp.ogg differ diff --git a/modular_ss220/mobs/sound/creatures/ph_scream1.ogg b/modular_ss220/mobs/sound/creatures/ph_scream1.ogg new file mode 100644 index 000000000000..857cf11b0a21 Binary files /dev/null and b/modular_ss220/mobs/sound/creatures/ph_scream1.ogg differ diff --git a/modular_ss220/mobs/sound/creatures/pig_death.ogg b/modular_ss220/mobs/sound/creatures/pig_death.ogg new file mode 100644 index 000000000000..0b83fd283627 Binary files /dev/null and b/modular_ss220/mobs/sound/creatures/pig_death.ogg differ diff --git a/modular_ss220/mobs/sound/creatures/pig_talk1.ogg b/modular_ss220/mobs/sound/creatures/pig_talk1.ogg new file mode 100644 index 000000000000..0763252277d8 Binary files /dev/null and b/modular_ss220/mobs/sound/creatures/pig_talk1.ogg differ diff --git a/modular_ss220/mobs/sound/creatures/pig_talk2.ogg b/modular_ss220/mobs/sound/creatures/pig_talk2.ogg new file mode 100644 index 000000000000..ec5a425459df Binary files /dev/null and b/modular_ss220/mobs/sound/creatures/pig_talk2.ogg differ diff --git a/modular_ss220/mobs/sound/creatures/rat_death.ogg b/modular_ss220/mobs/sound/creatures/rat_death.ogg new file mode 100644 index 000000000000..47021115d4aa Binary files /dev/null and b/modular_ss220/mobs/sound/creatures/rat_death.ogg differ diff --git a/modular_ss220/mobs/sound/creatures/rat_squeak.ogg b/modular_ss220/mobs/sound/creatures/rat_squeak.ogg new file mode 100644 index 000000000000..99bbbbe731e9 Binary files /dev/null and b/modular_ss220/mobs/sound/creatures/rat_squeak.ogg differ diff --git a/modular_ss220/mobs/sound/creatures/rat_talk.ogg b/modular_ss220/mobs/sound/creatures/rat_talk.ogg new file mode 100644 index 000000000000..e120c9a33336 Binary files /dev/null and b/modular_ss220/mobs/sound/creatures/rat_talk.ogg differ diff --git a/modular_ss220/mobs/sound/creatures/rat_wound.ogg b/modular_ss220/mobs/sound/creatures/rat_wound.ogg new file mode 100644 index 000000000000..d92c85978870 Binary files /dev/null and b/modular_ss220/mobs/sound/creatures/rat_wound.ogg differ diff --git a/modular_ss220/mobs/sound/creatures/seal_death.ogg b/modular_ss220/mobs/sound/creatures/seal_death.ogg new file mode 100644 index 000000000000..ba40ebc441a8 Binary files /dev/null and b/modular_ss220/mobs/sound/creatures/seal_death.ogg differ diff --git a/modular_ss220/mobs/sound/creatures/snake_death.ogg b/modular_ss220/mobs/sound/creatures/snake_death.ogg new file mode 100644 index 000000000000..a4104f994f8c Binary files /dev/null and b/modular_ss220/mobs/sound/creatures/snake_death.ogg differ diff --git a/modular_ss220/mobs/sound/creatures/space_dragon_roar.ogg b/modular_ss220/mobs/sound/creatures/space_dragon_roar.ogg new file mode 100644 index 000000000000..f7f4503b8946 Binary files /dev/null and b/modular_ss220/mobs/sound/creatures/space_dragon_roar.ogg differ diff --git a/modular_ss220/mobs/sound/creatures/spider_attack1.ogg b/modular_ss220/mobs/sound/creatures/spider_attack1.ogg new file mode 100644 index 000000000000..15d275799502 Binary files /dev/null and b/modular_ss220/mobs/sound/creatures/spider_attack1.ogg differ diff --git a/modular_ss220/mobs/sound/creatures/spider_attack2.ogg b/modular_ss220/mobs/sound/creatures/spider_attack2.ogg new file mode 100644 index 000000000000..c7d66176dd0a Binary files /dev/null and b/modular_ss220/mobs/sound/creatures/spider_attack2.ogg differ diff --git a/modular_ss220/mobs/sound/creatures/spider_death.ogg b/modular_ss220/mobs/sound/creatures/spider_death.ogg new file mode 100644 index 000000000000..405b4f4842ec Binary files /dev/null and b/modular_ss220/mobs/sound/creatures/spider_death.ogg differ diff --git a/modular_ss220/mobs/sound/creatures/spider_talk1.ogg b/modular_ss220/mobs/sound/creatures/spider_talk1.ogg new file mode 100644 index 000000000000..e51baac6b528 Binary files /dev/null and b/modular_ss220/mobs/sound/creatures/spider_talk1.ogg differ diff --git a/modular_ss220/mobs/sound/creatures/spider_talk2.ogg b/modular_ss220/mobs/sound/creatures/spider_talk2.ogg new file mode 100644 index 000000000000..634d89c2d0ad Binary files /dev/null and b/modular_ss220/mobs/sound/creatures/spider_talk2.ogg differ diff --git a/modular_ss220/mobs/sound/creatures/zombie_attack.ogg b/modular_ss220/mobs/sound/creatures/zombie_attack.ogg new file mode 100644 index 000000000000..1e9b2a630241 Binary files /dev/null and b/modular_ss220/mobs/sound/creatures/zombie_attack.ogg differ diff --git a/modular_ss220/mobs/sound/creatures/zombie_idle1.ogg b/modular_ss220/mobs/sound/creatures/zombie_idle1.ogg new file mode 100644 index 000000000000..851c88deff49 Binary files /dev/null and b/modular_ss220/mobs/sound/creatures/zombie_idle1.ogg differ diff --git a/modular_ss220/mobs/sound/creatures/zombie_idle2.ogg b/modular_ss220/mobs/sound/creatures/zombie_idle2.ogg new file mode 100644 index 000000000000..04e75da9b226 Binary files /dev/null and b/modular_ss220/mobs/sound/creatures/zombie_idle2.ogg differ diff --git a/modular_ss220/mobs/sound/creatures/zombie_idle3.ogg b/modular_ss220/mobs/sound/creatures/zombie_idle3.ogg new file mode 100644 index 000000000000..b4cd26007570 Binary files /dev/null and b/modular_ss220/mobs/sound/creatures/zombie_idle3.ogg differ diff --git a/modular_ss220/mobs/tests/animal.dmi b/modular_ss220/mobs/tests/animal.dmi new file mode 100644 index 000000000000..78de6fd28b2a Binary files /dev/null and b/modular_ss220/mobs/tests/animal.dmi differ diff --git a/modular_ss220/mobs/tests/animal_test.dmi b/modular_ss220/mobs/tests/animal_test.dmi new file mode 100644 index 000000000000..6853c25994d1 Binary files /dev/null and b/modular_ss220/mobs/tests/animal_test.dmi differ diff --git a/modular_ss220/mobs/tests/pets.dmi b/modular_ss220/mobs/tests/pets.dmi new file mode 100644 index 000000000000..11c449b23252 Binary files /dev/null and b/modular_ss220/mobs/tests/pets.dmi differ diff --git a/modular_ss220/mobs/tests/pets_test.dmi b/modular_ss220/mobs/tests/pets_test.dmi new file mode 100644 index 000000000000..5018766ad374 Binary files /dev/null and b/modular_ss220/mobs/tests/pets_test.dmi differ diff --git a/modular_ss220/modular_ss220.dme b/modular_ss220/modular_ss220.dme index 8ea441971a75..1a850a726aa8 100644 --- a/modular_ss220/modular_ss220.dme +++ b/modular_ss220/modular_ss220.dme @@ -51,6 +51,7 @@ #include "keybindings/_keybindings.dme" #include "loadout/_loadout.dme" #include "logs/_logs.dme" +#include "mobs/_mobs.dme" #include "pixel_shift/_pixel_shift.dme" #include "radio_sound/radio_sound.dme" #include "screentip_change/_screentip_change.dme" diff --git a/modular_ss220/text_to_speech/code/base_seeds/mobs/pets.dm b/modular_ss220/text_to_speech/code/base_seeds/mobs/pets.dm index 0ec65ab066ee..fee24cc4f0fd 100644 --- a/modular_ss220/text_to_speech/code/base_seeds/mobs/pets.dm +++ b/modular_ss220/text_to_speech/code/base_seeds/mobs/pets.dm @@ -1,7 +1,7 @@ //All named pets -/mob/living/basic/giant_spider/sgt_araneus +/mob/living/simple_animal/hostile/retaliate/araneus tts_seed = "Anubarak" -/mob/living/simple_animal/parrot/poly +/mob/living/simple_animal/parrot/Poly tts_seed = "Gyro"