[MIRROR] Makes dog a basic mob [MDB IGNORE] [MDB IGNORE] (#17930)

* Makes dog a basic mob [MDB IGNORE]

* conflict

* map updatepaths

* minor banana spider improvement

* unnecessary SR edit, minor path stuff

* chadian, borgi

* tram conflict

* fixes after testing

Co-authored-by: Tastyfish <crazychris32@gmail.com>
This commit is contained in:
SkyratBot
2022-12-12 22:45:23 +01:00
committed by GitHub
parent 275cdeddea
commit 565af6876b
67 changed files with 5834 additions and 5312 deletions
@@ -227,7 +227,7 @@
dir = 4
},
/obj/item/pressure_plate/hologrid{
reward = /mob/living/simple_animal/pet/dog/bullterrier
reward = /mob/living/basic/pet/dog/bullterrier
},
/turf/open/floor/plating,
/area/ruin/powered/mailroom)
@@ -55,12 +55,6 @@
/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden,
/turf/open/floor/iron/dark,
/area/ruin/space/has_grav/cargodise_freighter/bridge)
"bk" = (
/obj/structure/table/reinforced,
/obj/item/modular_computer/pda/clear,
/obj/effect/turf_decal/tile/blue/fourcorners,
/turf/open/floor/iron/dark,
/area/ruin/space/has_grav/cargodise_freighter/bridge)
"bo" = (
/obj/machinery/light/directional/north,
/obj/machinery/atmospherics/components/unary/vent_pump/on{
@@ -1350,6 +1344,12 @@
/obj/effect/turf_decal/tile/blue/fourcorners,
/turf/open/floor/iron/dark,
/area/ruin/space/has_grav/cargodise_freighter/bridge)
"wb" = (
/obj/structure/table/reinforced,
/obj/item/modular_computer/pda/engineering,
/obj/effect/turf_decal/tile/blue/fourcorners,
/turf/open/floor/iron/dark,
/area/ruin/space/has_grav/cargodise_freighter/bridge)
"wd" = (
/obj/structure/table/reinforced,
/obj/item/paper_bin{
@@ -1783,15 +1783,6 @@
/obj/machinery/portable_atmospherics/pump,
/turf/open/floor/plating,
/area/ruin/space/has_grav/cargodise_freighter/utility)
"BM" = (
/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden,
/mob/living/simple_animal/pet/dog/dobermann{
desc = "The freighter's loyal, canine companion!";
dir = 8;
name = "Ace"
},
/turf/open/floor/carpet,
/area/ruin/space/has_grav/cargodise_freighter/quarters)
"BN" = (
/obj/item/storage/cans/sixsoda,
/obj/structure/cable,
@@ -2430,6 +2421,15 @@
},
/turf/open/floor/plating,
/area/ruin/space/has_grav/cargodise_freighter/utility)
"Mx" = (
/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden,
/mob/living/basic/pet/dog/dobermann{
desc = "The freighter's loyal, canine companion!";
dir = 8;
name = "Ace"
},
/turf/open/floor/carpet,
/area/ruin/space/has_grav/cargodise_freighter/quarters)
"Mz" = (
/obj/effect/spawner/structure/window/reinforced,
/turf/open/floor/plating,
@@ -2502,6 +2502,12 @@
/obj/effect/turf_decal/tile/brown/fourcorners,
/turf/open/floor/iron/dark,
/area/ruin/space/has_grav/cargodise_freighter/mining)
"Ng" = (
/obj/structure/table/reinforced,
/obj/item/modular_computer/pda/clear,
/obj/effect/turf_decal/tile/blue/fourcorners,
/turf/open/floor/iron/dark,
/area/ruin/space/has_grav/cargodise_freighter/bridge)
"Nk" = (
/obj/machinery/atmospherics/components/unary/vent_pump/on{
dir = 8
@@ -3151,12 +3157,6 @@
/obj/effect/spawner/random/engineering/flashlight,
/turf/open/floor/iron/dark,
/area/ruin/space/has_grav/cargodise_freighter/primaryhall)
"UM" = (
/obj/structure/table/reinforced,
/obj/item/modular_computer/pda/engineering,
/obj/effect/turf_decal/tile/blue/fourcorners,
/turf/open/floor/iron/dark,
/area/ruin/space/has_grav/cargodise_freighter/bridge)
"UX" = (
/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden,
/obj/effect/turf_decal/tile/brown/fourcorners,
@@ -3971,7 +3971,7 @@ Zy
qq
eb
lV
BM
Mx
su
su
ZU
@@ -5094,9 +5094,9 @@ wd
GT
PC
GT
UM
wb
GT
bk
Ng
Yp
PK
lp
@@ -31,7 +31,7 @@
/turf/open/misc/beach/sand,
/area/ruin/space/has_grav/powered)
"H" = (
/mob/living/simple_animal/pet/dog/corgi{
/mob/living/basic/pet/dog/corgi{
anchored = 1
},
/obj/structure/bed/dogbed,
File diff suppressed because it is too large Load Diff
+269 -269
View File
@@ -145,6 +145,11 @@
/obj/effect/decal/cleanable/dirt/dust,
/turf/open/floor/iron/dark,
/area/station/service/chapel/office)
"acP" = (
/obj/structure/chair/sofa/corner/brown,
/obj/structure/cable,
/turf/open/floor/carpet/blue,
/area/station/security/prison/work)
"adr" = (
/obj/effect/turf_decal/tile/yellow,
/obj/effect/turf_decal/tile/yellow{
@@ -4008,15 +4013,6 @@
/obj/machinery/vending/dinnerware,
/turf/open/floor/iron/kitchen/diagonal,
/area/station/service/kitchen)
"bms" = (
/obj/machinery/computer/order_console/mining,
/obj/machinery/light/small/directional/south,
/obj/machinery/light_switch/directional/south,
/obj/machinery/newscaster/directional/east,
/turf/open/floor/iron/dark/side{
dir = 4
},
/area/mine/production)
"bmv" = (
/obj/structure/cable,
/turf/open/floor/iron,
@@ -4252,17 +4248,6 @@
},
/turf/open/floor/iron/dark,
/area/station/ai_monitored/command/storage/eva)
"bps" = (
/obj/effect/turf_decal/siding/wood{
dir = 8
},
/obj/structure/chair/sofa/left/brown{
desc = "Hey, did you know you can get a pineapple on your burger here?";
dir = 1;
name = "The Regular's Sofa"
},
/turf/open/floor/stone,
/area/station/commons/lounge)
"bpD" = (
/obj/machinery/newscaster/directional/south,
/obj/structure/closet/firecloset,
@@ -4504,6 +4489,17 @@
},
/turf/open/floor/iron/dark,
/area/station/science/genetics)
"bsR" = (
/obj/machinery/door/airlock/research/glass/incinerator/ordmix_interior{
name = "Burn Chamber Interior Airlock"
},
/obj/effect/mapping_helpers/airlock/locked,
/obj/machinery/airlock_controller/incinerator_ordmix{
pixel_x = 24
},
/obj/effect/mapping_helpers/airlock/access/all/science/ordnance,
/turf/open/floor/engine,
/area/station/science/ordnance/burnchamber)
"bsV" = (
/obj/structure/window/reinforced{
dir = 1
@@ -7394,12 +7390,6 @@
/obj/effect/turf_decal/bot,
/turf/open/floor/iron,
/area/station/cargo/storage)
"cih" = (
/obj/structure/chair/sofa/left/brown,
/obj/machinery/light/directional/north,
/obj/effect/landmark/start/psychologist,
/turf/open/floor/carpet/blue,
/area/station/medical/psychology)
"cin" = (
/obj/effect/turf_decal/stripes/line,
/turf/open/floor/iron,
@@ -7442,6 +7432,17 @@
/obj/effect/spawner/random/trash/cigbutt,
/turf/open/floor/iron/dark,
/area/station/science/breakroom)
"cjd" = (
/obj/effect/turf_decal/tile/brown,
/obj/effect/turf_decal/tile/brown{
dir = 8
},
/obj/machinery/light/small/directional/south,
/obj/structure/chair/sofa/left/brown{
dir = 1
},
/turf/open/floor/iron/white,
/area/station/medical/break_room)
"cjj" = (
/obj/machinery/holopad,
/turf/open/floor/wood/parquet,
@@ -8112,6 +8113,14 @@
},
/turf/open/floor/iron,
/area/station/engineering/main)
"cuh" = (
/obj/structure/chair/sofa/left/brown{
dir = 8
},
/obj/machinery/light/directional/east,
/obj/structure/cable,
/turf/open/floor/carpet/blue,
/area/station/security/prison/work)
"cum" = (
/obj/effect/spawner/structure/window/hollow/reinforced/middle{
dir = 1
@@ -11847,32 +11856,6 @@
/obj/structure/cable,
/turf/open/floor/iron,
/area/station/hallway/primary/central)
"dyO" = (
/obj/structure/table,
/obj/item/storage/box/monkeycubes{
pixel_x = 6;
pixel_y = 7
},
/obj/item/storage/box/monkeycubes{
pixel_x = -5
},
/obj/item/storage/box/bodybags{
pixel_x = -1;
pixel_y = 6
},
/obj/item/storage/box/disks{
pixel_x = 1;
pixel_y = 5
},
/obj/item/storage/box/monkeycubes{
pixel_x = 6;
pixel_y = 7
},
/obj/item/storage/box/monkeycubes{
pixel_x = -5
},
/turf/open/floor/iron/dark,
/area/station/science/genetics)
"dyQ" = (
/obj/machinery/power/apc/auto_name/directional/south,
/obj/machinery/light/directional/south,
@@ -12882,6 +12865,13 @@
/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
/turf/open/floor/iron/dark,
/area/mine/storage)
"dOt" = (
/obj/structure/chair/sofa/right/brown,
/obj/item/toy/plush/moth{
name = "Dr. Moff"
},
/turf/open/floor/carpet/blue,
/area/station/medical/psychology)
"dOw" = (
/obj/structure/cable,
/turf/open/floor/iron,
@@ -15148,6 +15138,13 @@
/obj/machinery/firealarm/directional/south,
/turf/open/floor/iron/dark,
/area/station/ai_monitored/turret_protected/ai)
"eAI" = (
/obj/structure/bed/dogbed/ian,
/mob/living/basic/pet/dog/corgi/ian{
dir = 8
},
/turf/open/floor/iron,
/area/station/command/heads_quarters/hop)
"eAS" = (
/obj/structure/cable,
/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2,
@@ -18953,16 +18950,6 @@
/obj/effect/turf_decal/tile/blue/full,
/turf/open/floor/iron/large,
/area/station/medical/treatment_center)
"fIv" = (
/obj/machinery/door/airlock/public/glass/incinerator/atmos_interior,
/obj/effect/mapping_helpers/airlock/cyclelink_helper,
/obj/effect/mapping_helpers/airlock/locked,
/obj/machinery/airlock_controller/incinerator_atmos{
pixel_x = -24
},
/obj/effect/mapping_helpers/airlock/access/all/engineering/atmos,
/turf/open/floor/engine,
/area/station/maintenance/disposal/incinerator)
"fIH" = (
/obj/structure/closet/lasertag/red,
/obj/effect/spawner/random/contraband/permabrig_gear,
@@ -19341,15 +19328,6 @@
},
/turf/open/floor/iron/white,
/area/station/medical/chemistry)
"fPs" = (
/obj/machinery/computer/order_console/mining,
/obj/effect/turf_decal/tile/brown{
dir = 4
},
/obj/effect/turf_decal/tile/brown,
/obj/machinery/light_switch/directional/north,
/turf/open/floor/iron/dark,
/area/station/cargo/miningdock)
"fPt" = (
/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2,
@@ -19579,15 +19557,6 @@
},
/turf/open/floor/iron/white,
/area/station/science/xenobiology)
"fTu" = (
/obj/structure/chair/sofa/right/brown{
desc = "Hey, did you know you can get a pineapple on your burger here?";
dir = 1;
name = "The Regular's Sofa"
},
/obj/effect/landmark/start/hangover,
/turf/open/floor/stone,
/area/station/commons/lounge)
"fTx" = (
/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{
dir = 4
@@ -21850,6 +21819,19 @@
},
/turf/open/misc/asteroid/snow/icemoon,
/area/icemoon/surface/outdoors/nospawn)
"gEl" = (
/obj/structure/chair/sofa/right/brown{
dir = 4
},
/obj/effect/turf_decal/tile/bar,
/obj/effect/turf_decal/tile/bar{
dir = 1
},
/obj/effect/turf_decal/siding/white{
dir = 4
},
/turf/open/floor/iron,
/area/station/hallway/secondary/service)
"gEn" = (
/obj/structure/cable,
/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2,
@@ -22465,13 +22447,6 @@
/obj/effect/spawner/structure/window/reinforced,
/turf/open/floor/plating,
/area/station/command/heads_quarters/cmo)
"gOc" = (
/obj/structure/window/reinforced{
dir = 8
},
/obj/structure/chair/sofa/right/brown,
/turf/open/floor/carpet/blue,
/area/station/security/prison/work)
"gOx" = (
/obj/effect/turf_decal/loading_area,
/obj/effect/turf_decal/tile/neutral/half/contrasted,
@@ -23749,6 +23724,17 @@
/obj/machinery/rnd/production/circuit_imprinter/department/science,
/turf/open/floor/iron/white,
/area/station/science/robotics/lab)
"hiB" = (
/obj/effect/turf_decal/siding/wood{
dir = 1
},
/obj/structure/chair/sofa/right/brown{
dir = 1
},
/obj/machinery/computer/security/telescreen/entertainment/directional/south,
/obj/machinery/airalarm/directional/east,
/turf/open/floor/iron/grimy,
/area/station/commons/lounge)
"hiF" = (
/obj/machinery/light/floor,
/turf/open/floor/iron/white,
@@ -23880,6 +23866,10 @@
/obj/item/bikehorn/rubberducky,
/turf/open/floor/iron/freezer,
/area/station/commons/toilet/locker)
"hlz" = (
/obj/structure/chair/sofa/middle/brown,
/turf/open/floor/carpet/blue,
/area/station/security/prison/work)
"hlJ" = (
/obj/machinery/light/directional/west,
/obj/effect/turf_decal/stripes/line{
@@ -24308,14 +24298,6 @@
},
/turf/open/floor/iron/dark,
/area/station/command/heads_quarters/cmo)
"hsE" = (
/obj/structure/chair/sofa/left/brown{
dir = 8
},
/obj/machinery/light/directional/east,
/obj/structure/cable,
/turf/open/floor/carpet/blue,
/area/station/security/prison/work)
"hsI" = (
/turf/closed/wall,
/area/station/construction/mining/aux_base)
@@ -24716,17 +24698,6 @@
/obj/structure/sink/directional/south,
/turf/open/floor/iron/dark,
/area/station/medical/morgue)
"hyS" = (
/obj/effect/turf_decal/tile/brown,
/obj/effect/turf_decal/tile/brown{
dir = 8
},
/obj/machinery/light/small/directional/south,
/obj/structure/chair/sofa/left/brown{
dir = 1
},
/turf/open/floor/iron/white,
/area/station/medical/break_room)
"hyV" = (
/turf/closed/wall/r_wall,
/area/station/science/ordnance/testlab)
@@ -26099,19 +26070,6 @@
/obj/structure/cable,
/turf/open/floor/carpet/red,
/area/station/security/prison/work)
"hXp" = (
/obj/structure/chair/sofa/right/brown{
dir = 4
},
/obj/effect/turf_decal/tile/bar,
/obj/effect/turf_decal/tile/bar{
dir = 1
},
/obj/effect/turf_decal/siding/white{
dir = 4
},
/turf/open/floor/iron,
/area/station/hallway/secondary/service)
"hXU" = (
/obj/machinery/newscaster/directional/east,
/obj/machinery/atmospherics/pipe/smart/manifold4w/cyan/visible,
@@ -27730,13 +27688,6 @@
},
/turf/open/floor/iron/white,
/area/station/medical/cryo)
"ixm" = (
/obj/structure/chair/sofa/right/brown,
/obj/item/toy/plush/moth{
name = "Dr. Moff"
},
/turf/open/floor/carpet/blue,
/area/station/medical/psychology)
"ixu" = (
/obj/machinery/camera/directional/north{
c_tag = "Teleporter"
@@ -27766,6 +27717,13 @@
},
/turf/open/floor/iron/large,
/area/station/engineering/main)
"ixV" = (
/obj/structure/bed/dogbed/mcgriff,
/obj/item/food/beef_wellington_slice,
/obj/structure/cable,
/mob/living/basic/pet/dog/pug/mcgriff,
/turf/open/floor/iron/showroomfloor,
/area/station/security/warden)
"ixZ" = (
/obj/machinery/door/airlock/command/glass{
name = "Chief Engineer"
@@ -28216,13 +28174,6 @@
/obj/structure/cable,
/turf/open/floor/iron/dark/smooth_half,
/area/station/security/prison/work)
"iFg" = (
/obj/structure/bed/dogbed/mcgriff,
/obj/item/food/beef_wellington_slice,
/obj/structure/cable,
/mob/living/simple_animal/pet/dog/pug/mcgriff,
/turf/open/floor/iron/showroomfloor,
/area/station/security/warden)
"iFm" = (
/obj/effect/decal/cleanable/glass,
/obj/effect/decal/cleanable/dirt/dust,
@@ -29742,6 +29693,17 @@
/obj/structure/chair/comfy/beige,
/turf/open/floor/iron/grimy,
/area/station/hallway/secondary/entry)
"jbn" = (
/obj/effect/turf_decal/siding/wood{
dir = 8
},
/obj/structure/chair/sofa/left/brown{
desc = "Hey, did you know you can get a pineapple on your burger here?";
dir = 1;
name = "The Regular's Sofa"
},
/turf/open/floor/stone,
/area/station/commons/lounge)
"jbt" = (
/obj/machinery/light/directional/north,
/obj/structure/extinguisher_cabinet/directional/north,
@@ -32708,13 +32670,6 @@
/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
/turf/open/floor/plating,
/area/station/ai_monitored/turret_protected/aisat/hallway)
"jXB" = (
/obj/structure/bed/dogbed/ian,
/mob/living/simple_animal/pet/dog/corgi/ian{
dir = 8
},
/turf/open/floor/iron,
/area/station/command/heads_quarters/hop)
"jXD" = (
/obj/machinery/light/directional/north,
/turf/open/floor/iron,
@@ -37441,17 +37396,6 @@
dir = 8
},
/area/station/maintenance/port/fore)
"lsl" = (
/obj/effect/turf_decal/siding/wood{
dir = 1
},
/obj/structure/chair/sofa/right/brown{
dir = 1
},
/obj/machinery/computer/security/telescreen/entertainment/directional/south,
/obj/machinery/airalarm/directional/east,
/turf/open/floor/iron/grimy,
/area/station/commons/lounge)
"lso" = (
/turf/open/floor/iron,
/area/station/hallway/primary/starboard)
@@ -37686,15 +37630,6 @@
"lwR" = (
/turf/closed/wall/r_wall,
/area/mine/living_quarters)
"lwS" = (
/obj/machinery/computer/order_console/cook{
dir = 1
},
/obj/effect/turf_decal/stripes/line{
dir = 1
},
/turf/open/floor/plating,
/area/station/hallway/secondary/service)
"lxc" = (
/obj/machinery/door/firedoor,
/obj/machinery/door/airlock/public/glass{
@@ -38414,14 +38349,6 @@
},
/turf/open/floor/iron/dark/textured,
/area/station/security/prison)
"lKf" = (
/obj/machinery/computer/order_console/mining,
/obj/effect/turf_decal/tile/brown{
dir = 4
},
/obj/effect/turf_decal/tile/brown,
/turf/open/floor/iron/dark,
/area/station/cargo/miningdock)
"lKk" = (
/obj/machinery/disposal/bin,
/obj/structure/disposalpipe/trunk{
@@ -39984,6 +39911,13 @@
},
/turf/open/floor/iron,
/area/station/commons/dorms)
"mmN" = (
/obj/structure/window/reinforced{
dir = 8
},
/obj/structure/chair/sofa/right/brown,
/turf/open/floor/carpet/blue,
/area/station/security/prison/work)
"mmR" = (
/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2,
/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
@@ -41928,6 +41862,14 @@
/obj/effect/mapping_helpers/airlock/access/any/science/maintenance,
/turf/open/floor/plating,
/area/station/maintenance/starboard/aft)
"mVT" = (
/obj/machinery/computer/order_console/mining,
/obj/effect/turf_decal/tile/brown{
dir = 4
},
/obj/effect/turf_decal/tile/brown,
/turf/open/floor/iron/dark,
/area/station/cargo/miningdock)
"mVY" = (
/obj/effect/turf_decal/tile/neutral/diagonal_edge,
/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{
@@ -44681,6 +44623,17 @@
/obj/structure/grille,
/turf/open/floor/plating,
/area/station/maintenance/department/medical/morgue)
"nJi" = (
/obj/effect/turf_decal/siding/wood{
dir = 1
},
/obj/structure/chair/sofa/left/brown{
dir = 1
},
/obj/effect/landmark/start/hangover,
/obj/machinery/light/directional/south,
/turf/open/floor/iron/grimy,
/area/station/commons/lounge)
"nJm" = (
/obj/structure/fluff/fokoff_sign,
/turf/open/misc/asteroid/snow/icemoon,
@@ -46758,6 +46711,16 @@
/obj/structure/cable,
/turf/open/floor/iron,
/area/station/hallway/primary/port)
"ont" = (
/obj/machinery/door/airlock/public/glass/incinerator/atmos_interior,
/obj/effect/mapping_helpers/airlock/cyclelink_helper,
/obj/effect/mapping_helpers/airlock/locked,
/obj/machinery/airlock_controller/incinerator_atmos{
pixel_x = -24
},
/obj/effect/mapping_helpers/airlock/access/all/engineering/atmos,
/turf/open/floor/engine,
/area/station/maintenance/disposal/incinerator)
"onv" = (
/obj/effect/spawner/structure/window/reinforced,
/obj/machinery/door/poddoor/shutters/preopen{
@@ -48139,6 +48102,15 @@
},
/turf/open/floor/iron/dark,
/area/station/ai_monitored/turret_protected/ai_upload)
"oJU" = (
/obj/machinery/computer/order_console/mining,
/obj/effect/turf_decal/tile/brown{
dir = 4
},
/obj/effect/turf_decal/tile/brown,
/obj/machinery/light_switch/directional/north,
/turf/open/floor/iron/dark,
/area/station/cargo/miningdock)
"oKv" = (
/obj/item/trash/popcorn,
/turf/open/floor/plating,
@@ -53741,6 +53713,12 @@
/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
/turf/open/floor/plating,
/area/station/maintenance/port/aft)
"qAO" = (
/obj/structure/chair/sofa/left/brown,
/obj/machinery/light/directional/north,
/obj/effect/landmark/start/psychologist,
/turf/open/floor/carpet/blue,
/area/station/medical/psychology)
"qAQ" = (
/turf/open/floor/engine/vacuum,
/area/station/engineering/atmos)
@@ -55541,11 +55519,6 @@
},
/turf/open/floor/iron/dark,
/area/station/security/checkpoint/science)
"raG" = (
/obj/machinery/dna_infuser,
/obj/item/infuser_book,
/turf/open/floor/iron/dark,
/area/station/science/genetics)
"raH" = (
/obj/effect/spawner/random/structure/crate,
/obj/effect/mapping_helpers/broken_floor,
@@ -56445,11 +56418,6 @@
},
/turf/open/floor/glass/reinforced,
/area/station/hallway/primary/starboard)
"rrv" = (
/obj/structure/chair/sofa/corner/brown,
/obj/structure/cable,
/turf/open/floor/carpet/blue,
/area/station/security/prison/work)
"rrx" = (
/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2,
/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
@@ -57454,6 +57422,17 @@
/obj/effect/turf_decal/trimline/blue/filled/line,
/turf/open/floor/iron/white,
/area/station/medical/medbay/aft)
"rHF" = (
/obj/machinery/computer/order_console/mining,
/obj/effect/decal/cleanable/dirt,
/obj/machinery/camera{
c_tag = "Mining Bunks";
dir = 6
},
/turf/open/floor/iron/dark/side{
dir = 4
},
/area/mine/production)
"rHH" = (
/obj/structure/table,
/obj/effect/spawner/random/food_or_drink/snack/lizard,
@@ -58474,6 +58453,32 @@
/obj/machinery/holopad,
/turf/open/floor/iron,
/area/station/hallway/secondary/entry)
"rZC" = (
/obj/structure/table,
/obj/item/storage/box/monkeycubes{
pixel_x = 6;
pixel_y = 7
},
/obj/item/storage/box/monkeycubes{
pixel_x = -5
},
/obj/item/storage/box/bodybags{
pixel_x = -1;
pixel_y = 6
},
/obj/item/storage/box/disks{
pixel_x = 1;
pixel_y = 5
},
/obj/item/storage/box/monkeycubes{
pixel_x = 6;
pixel_y = 7
},
/obj/item/storage/box/monkeycubes{
pixel_x = -5
},
/turf/open/floor/iron/dark,
/area/station/science/genetics)
"rZE" = (
/obj/machinery/atmospherics/components/binary/pump{
dir = 8
@@ -58705,6 +58710,19 @@
/obj/structure/sign/poster/contraband/random/directional/south,
/turf/open/floor/plating,
/area/station/maintenance/port/greater)
"sdk" = (
/obj/structure/chair/sofa/left/brown{
dir = 4
},
/obj/effect/turf_decal/tile/bar,
/obj/effect/turf_decal/tile/bar{
dir = 1
},
/obj/effect/turf_decal/siding/white{
dir = 4
},
/turf/open/floor/iron,
/area/station/hallway/secondary/service)
"sdl" = (
/obj/machinery/atmospherics/pipe/smart/simple/yellow/visible{
dir = 5
@@ -58876,6 +58894,22 @@
dir = 5
},
/area/station/science/research)
"sgt" = (
/obj/effect/turf_decal/tile/brown,
/obj/effect/turf_decal/tile/brown{
dir = 4
},
/obj/effect/turf_decal/tile/brown{
dir = 8
},
/obj/machinery/airalarm/directional/south,
/obj/effect/decal/cleanable/dirt/dust,
/obj/structure/chair/sofa/right/brown{
dir = 1
},
/obj/machinery/newscaster/directional/east,
/turf/open/floor/iron/white,
/area/station/medical/break_room)
"sgA" = (
/obj/effect/turf_decal/box,
/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
@@ -60234,17 +60268,6 @@
/obj/machinery/chem_mass_spec,
/turf/open/floor/iron/white,
/area/station/medical/pharmacy)
"sAU" = (
/obj/machinery/computer/order_console/mining,
/obj/effect/decal/cleanable/dirt,
/obj/machinery/camera{
c_tag = "Mining Bunks";
dir = 6
},
/turf/open/floor/iron/dark/side{
dir = 4
},
/area/mine/production)
"sAV" = (
/obj/machinery/firealarm/directional/west,
/obj/effect/turf_decal/stripes/line{
@@ -64224,6 +64247,15 @@
/obj/machinery/light/directional/west,
/turf/open/floor/iron,
/area/mine/laborcamp)
"tMC" = (
/obj/machinery/computer/order_console/mining,
/obj/machinery/light/small/directional/south,
/obj/machinery/light_switch/directional/south,
/obj/machinery/newscaster/directional/east,
/turf/open/floor/iron/dark/side{
dir = 4
},
/area/mine/production)
"tMD" = (
/obj/effect/turf_decal/stripes/line{
dir = 9
@@ -64546,19 +64578,6 @@
},
/turf/open/floor/iron/dark,
/area/station/science/robotics/lab)
"tSj" = (
/obj/structure/chair/sofa/left/brown{
dir = 4
},
/obj/effect/turf_decal/tile/bar,
/obj/effect/turf_decal/tile/bar{
dir = 1
},
/obj/effect/turf_decal/siding/white{
dir = 4
},
/turf/open/floor/iron,
/area/station/hallway/secondary/service)
"tSs" = (
/obj/item/flashlight/lantern{
on = 1
@@ -66161,6 +66180,15 @@
/obj/structure/disposalpipe/segment,
/turf/open/floor/iron/white,
/area/station/science/research)
"urO" = (
/obj/machinery/computer/order_console/cook{
dir = 1
},
/obj/effect/turf_decal/stripes/line{
dir = 1
},
/turf/open/floor/plating,
/area/station/hallway/secondary/service)
"uso" = (
/obj/structure/closet/crate/trashcart,
/obj/effect/spawner/random/contraband/prison,
@@ -69109,17 +69137,6 @@
},
/turf/open/floor/plating/snowed/icemoon,
/area/icemoon/surface/outdoors/nospawn)
"vpK" = (
/obj/effect/turf_decal/siding/wood{
dir = 1
},
/obj/structure/chair/sofa/left/brown{
dir = 1
},
/obj/effect/landmark/start/hangover,
/obj/machinery/light/directional/south,
/turf/open/floor/iron/grimy,
/area/station/commons/lounge)
"vpR" = (
/obj/effect/decal/cleanable/dirt,
/turf/open/floor/iron/dark,
@@ -70670,10 +70687,6 @@
/obj/machinery/duct,
/turf/open/floor/plating,
/area/station/maintenance/department/medical/morgue)
"vOJ" = (
/obj/structure/chair/sofa/middle/brown,
/turf/open/floor/carpet/blue,
/area/station/security/prison/work)
"vPh" = (
/obj/machinery/light/directional/north,
/turf/open/floor/iron,
@@ -71017,17 +71030,6 @@
/obj/structure/closet/firecloset,
/turf/open/floor/plating,
/area/station/maintenance/starboard/lesser)
"vTB" = (
/obj/machinery/door/airlock/research/glass/incinerator/ordmix_interior{
name = "Burn Chamber Interior Airlock"
},
/obj/effect/mapping_helpers/airlock/locked,
/obj/machinery/airlock_controller/incinerator_ordmix{
pixel_x = 24
},
/obj/effect/mapping_helpers/airlock/access/all/science/ordnance,
/turf/open/floor/engine,
/area/station/science/ordnance/burnchamber)
"vTJ" = (
/obj/structure/table,
/obj/item/toy/plush/slimeplushie{
@@ -74828,22 +74830,6 @@
"wZj" = (
/turf/open/floor/iron/dark/textured,
/area/station/security/warden)
"wZl" = (
/obj/effect/turf_decal/tile/brown,
/obj/effect/turf_decal/tile/brown{
dir = 4
},
/obj/effect/turf_decal/tile/brown{
dir = 8
},
/obj/machinery/airalarm/directional/south,
/obj/effect/decal/cleanable/dirt/dust,
/obj/structure/chair/sofa/right/brown{
dir = 1
},
/obj/machinery/newscaster/directional/east,
/turf/open/floor/iron/white,
/area/station/medical/break_room)
"wZp" = (
/obj/item/storage/toolbox/electrical{
pixel_x = 4;
@@ -76020,6 +76006,11 @@
/obj/effect/mapping_helpers/airlock/access/all/service/general,
/turf/open/floor/iron/dark/textured,
/area/station/hallway/secondary/service)
"xqN" = (
/obj/machinery/dna_infuser,
/obj/item/infuser_book,
/turf/open/floor/iron/dark,
/area/station/science/genetics)
"xqY" = (
/obj/machinery/firealarm/directional/east,
/turf/open/floor/iron/dark,
@@ -78475,6 +78466,15 @@
/obj/machinery/computer/holodeck,
/turf/open/floor/iron,
/area/station/commons/fitness)
"yfZ" = (
/obj/structure/chair/sofa/right/brown{
desc = "Hey, did you know you can get a pineapple on your burger here?";
dir = 1;
name = "The Regular's Sofa"
},
/obj/effect/landmark/start/hangover,
/turf/open/floor/stone,
/area/station/commons/lounge)
"ygd" = (
/obj/machinery/atmospherics/pipe/smart/simple/yellow/visible{
dir = 4
@@ -164037,8 +164037,8 @@ pve
vSi
kZu
pAT
sAU
bms
rHF
tMC
kZu
aNg
kzH
@@ -169345,7 +169345,7 @@ iDt
hPs
gBX
hPs
gOc
mmN
vxM
vnT
una
@@ -169602,7 +169602,7 @@ iDt
iDt
iDt
oqL
vOJ
hlz
gBc
erY
clR
@@ -169859,8 +169859,8 @@ iDt
iDt
iDt
oqL
rrv
hsE
acP
cuh
pdT
klv
cIc
@@ -179409,8 +179409,8 @@ udC
udC
xMq
mdZ
tSj
hXp
sdk
gEl
mdZ
oGR
pIQ
@@ -179681,7 +179681,7 @@ ydZ
jBU
mqr
mqr
vpK
nJi
dMS
rZN
cjK
@@ -179938,7 +179938,7 @@ lrN
jBU
eDi
doJ
lsl
hiB
dMS
dre
dMS
@@ -181736,7 +181736,7 @@ hzQ
hzQ
nro
hzQ
bps
jbn
dMS
dEB
dMS
@@ -181993,7 +181993,7 @@ wun
dOQ
lZG
fDt
fTu
yfZ
dMS
dEB
dMS
@@ -193848,7 +193848,7 @@ sDA
mYd
mIC
aWs
vTB
bsR
qSk
qSk
rEh
@@ -229568,8 +229568,8 @@ ajw
maT
maT
qjQ
fPs
lKf
oJU
mVT
qjQ
fZb
qjQ
@@ -236444,7 +236444,7 @@ cMA
wkr
eRO
ven
iFg
ixV
kyy
kTz
lbk
@@ -236756,7 +236756,7 @@ cqQ
jRC
nvs
edW
jXB
eAI
cpm
bHy
ylU
@@ -245979,7 +245979,7 @@ gzw
kiB
kQX
xLn
lwS
urO
mdZ
rth
hid
@@ -248620,7 +248620,7 @@ uqH
qXk
qSC
ldr
fIv
ont
mgD
pmb
hPD
@@ -249112,7 +249112,7 @@ tQc
tQc
qQp
hRA
ixm
dOt
rkL
cga
rTv
@@ -249369,7 +249369,7 @@ iML
iML
nHX
hRA
cih
qAO
rkL
uFz
kJC
@@ -250912,7 +250912,7 @@ dpr
klk
vxE
hyd
hyS
cjd
tMO
jYy
sZF
@@ -251169,7 +251169,7 @@ aFR
lVR
rbK
tsY
wZl
sgt
tMO
cAA
sZF
@@ -258858,7 +258858,7 @@ pUy
eSJ
pUy
mzG
dyO
rZC
sca
xiC
ciS
@@ -259372,7 +259372,7 @@ ouX
ero
itj
fXu
raG
xqN
mEJ
oXJ
fbl
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
@@ -56,7 +56,7 @@
/turf/closed/mineral/random/stationside/asteroid/porus,
/area/station/maintenance/department/crew_quarters/dorms)
"fL" = (
/mob/living/simple_animal/pet/dog/bullterrier{
/mob/living/basic/pet/dog/bullterrier{
desc = "walter";
name = "walter"
},
File diff suppressed because it is too large Load Diff
+9
View File
@@ -165,6 +165,7 @@
#define BB_DOG_PLAYING_DEAD "BB_DOG_PLAYING_DEAD"
#define BB_DOG_HARASS_TARGET "BB_DOG_HARASS_TARGET"
#define BB_DOG_HARASS_FRUSTRATION "BB_DOG_HARASS_FRUSTRATION"
#define BB_DOG_IS_SLOW "BB_DOG_IS_SLOW"
/// Basically, what is our vision/hearing range for picking up on things to fetch/
#define AI_DOG_VISION_RANGE 10
@@ -222,6 +223,14 @@
///list of foods this mob likes
#define BB_BASIC_FOODS "BB_basic_foods"
///Baby-making blackboard
///Types of animal we can make babies with.
#define BB_BABIES_PARTNER_TYPES "BB_babies_partner"
///Types of animal that we make as a baby.
#define BB_BABIES_CHILD_TYPES "BB_babies_child"
///Current partner target
#define BB_BABIES_TARGET "BB_babies_target"
///Bileworm AI keys
#define BB_BILEWORM_SPEW_BILE "BB_bileworm_spew_bile"
@@ -40,6 +40,8 @@
#define COMSIG_LIVING_TRY_SYRINGE "living_try_syringe"
///From living/Life(). (deltatime, times_fired)
#define COMSIG_LIVING_LIFE "living_life"
///From living/set_resting(): (new_resting, silent, instant)
#define COMSIG_LIVING_RESTING "living_resting"
///from base of element/bane/activate(): (item/weapon, mob/user)
#define COMSIG_LIVING_BANED "living_baned"
@@ -47,6 +49,10 @@
///from base of mob/living/death(): (gibbed)
#define COMSIG_LIVING_DEATH "living_death"
///from base of mob/living/gib(): (no_brain, no_organs, no_bodyparts)
///Note that it is fired regardless of whether the mob was dead beforehand or not.
#define COMSIG_LIVING_GIBBED "living_gibbed"
///from base of mob/living/Write_Memory(): (dead, gibbed)
#define COMSIG_LIVING_WRITE_MEMORY "living_write_memory"
#define COMPONENT_DONT_WRITE_MEMORY (1<<0)
+2 -2
View File
@@ -148,9 +148,9 @@ GLOBAL_LIST_INIT(turfs_openspace, typecacheof(list(
#define iscat(A) (istype(A, /mob/living/simple_animal/pet/cat))
#define isdog(A) (istype(A, /mob/living/simple_animal/pet/dog))
#define isdog(A) (istype(A, /mob/living/basic/pet/dog))
#define iscorgi(A) (istype(A, /mob/living/simple_animal/pet/dog/corgi))
#define iscorgi(A) (istype(A, /mob/living/basic/pet/dog/corgi))
#define ishostile(A) (istype(A, /mob/living/simple_animal/hostile))
+1 -1
View File
@@ -18,7 +18,7 @@
#define STRIPPABLE_ITEM_RHAND "right_hand"
#define STRIPPABLE_ITEM_HANDCUFFS "handcuffs"
#define STRIPPABLE_ITEM_LEGCUFFS "legcuffs"
#define STRIPPABLE_ITEM_CORGI_COLLAR "corgi_collar"
#define STRIPPABLE_ITEM_PET_COLLAR "pet_collar"
#define STRIPPABLE_ITEM_PARROT_HEADSET "parrot_headset"
/// This slot is not obscured.
+77
View File
@@ -0,0 +1,77 @@
/**
* Find a compatible, living partner, if we're also alone.
*/
/datum/ai_behavior/find_partner
action_cooldown = 40 SECONDS
/// Range to look.
var/range = 7
/// Maximum number of children
var/max_children = 3
/datum/ai_behavior/find_partner/perform(delta_time, datum/ai_controller/controller, target_key, partner_types_key, child_types_key)
. = ..()
var/mob/pawn_mob = controller.pawn
var/list/partner_types = controller.blackboard[partner_types_key]
var/list/child_types = controller.blackboard[child_types_key]
var/mob/living/partner
var/children = 0
for(var/mob/other in oview(range, pawn_mob))
if(other.stat != CONSCIOUS) //Check if it's conscious FIRST.
continue
var/is_child = is_type_in_list(other, child_types)
if(is_child) //Check for children SECOND.
children++
else if(is_type_in_list(other, partner_types))
if(other.ckey)
continue
else if(!is_child && other.gender == MALE && !(other.flags_1 & HOLOGRAM_1)) //Better safe than sorry ;_;
partner = other
//shyness check. we're not shy in front of things that share a faction with us.
else if(isliving(other) && !pawn_mob.faction_check_mob(other))
finish_action(controller, FALSE)
return
if(partner && children < max_children)
controller.blackboard[target_key] = WEAKREF(partner)
finish_action(controller, TRUE)
/**
* Reproduce.
*/
/datum/ai_behavior/make_babies
action_cooldown = 40 SECONDS
behavior_flags = AI_BEHAVIOR_REQUIRE_MOVEMENT
/datum/ai_behavior/make_babies/setup(datum/ai_controller/controller, target_key, child_types_key)
var/datum/weakref/weak_target = controller.blackboard[target_key]
var/atom/target = weak_target?.resolve()
if(!target)
return FALSE
controller.current_movement_target = target
return TRUE
/datum/ai_behavior/make_babies/perform(delta_time, datum/ai_controller/controller, target_key, child_types_key)
. = ..()
var/datum/weakref/weak_target = controller.blackboard[target_key]
var/mob/target = weak_target?.resolve()
if(!target || target.stat != CONSCIOUS)
finish_action(controller, FALSE, target_key)
return
var/child_type = pick_weight(controller.blackboard[child_types_key])
var/turf/turf_loc = get_turf(controller.pawn.loc)
if(turf_loc)
new child_type(turf_loc)
finish_action(controller, TRUE, target_key)
/datum/ai_behavior/make_babies/finish_action(datum/ai_controller/controller, succeeded, target_key)
. = ..()
controller.blackboard -= target_key
+34
View File
@@ -0,0 +1,34 @@
/**
* Reproduce with a similar mob.
*/
/datum/ai_planning_subtree/make_babies
var/chance = 5
/datum/ai_planning_subtree/make_babies/SelectBehaviors(datum/ai_controller/controller, delta_time)
. = ..()
if(controller.pawn.gender != FEMALE || !DT_PROB(chance, delta_time))
return
var/partner_types = controller.blackboard[BB_BABIES_PARTNER_TYPES]
var/baby_types = controller.blackboard[BB_BABIES_CHILD_TYPES]
if(!partner_types || !baby_types)
return
// Baby can't reproduce
if(is_type_in_list(controller.pawn, baby_types))
return
var/datum/weakref/weak_target = controller.blackboard[BB_BABIES_TARGET]
var/atom/target = weak_target?.resolve()
// Find target
if(!target || QDELETED(target))
controller.queue_behavior(/datum/ai_behavior/find_partner, BB_BABIES_TARGET, BB_BABIES_PARTNER_TYPES, BB_BABIES_CHILD_TYPES)
return
// Do target
if(target)
controller.queue_behavior(/datum/ai_behavior/make_babies, BB_BABIES_TARGET, BB_BABIES_CHILD_TYPES)
return SUBTREE_RETURN_FINISH_PLANNING
@@ -89,3 +89,16 @@
/datum/ai_planning_subtree/random_speech/cow/wisdom/New()
. = ..()
speak = GLOB.wisdoms //Done here so it's setup properly
/datum/ai_planning_subtree/random_speech/dog
speech_chance = 1
/datum/ai_planning_subtree/random_speech/dog/SelectBehaviors(datum/ai_controller/controller, delta_time)
if(!isdog(controller.pawn))
return
// Stay in sync with dog fashion.
var/mob/living/basic/pet/dog/dog_pawn = controller.pawn
dog_pawn.update_dog_speech(src)
return ..()
+51 -19
View File
@@ -1,17 +1,22 @@
/datum/ai_controller/dog
blackboard = list(\
BB_SIMPLE_CARRY_ITEM = null,\
BB_FETCH_TARGET = null,\
BB_FETCH_DELIVER_TO = null,\
BB_DOG_FRIENDS = list(),\
BB_FETCH_IGNORE_LIST = list(),\
BB_DOG_ORDER_MODE = DOG_COMMAND_NONE,\
BB_DOG_PLAYING_DEAD = FALSE,\
BB_DOG_HARASS_TARGET = null,\
BB_DOG_HARASS_FRUSTRATION = null,\
BB_VISION_RANGE = AI_DOG_VISION_RANGE)
blackboard = list(
BB_SIMPLE_CARRY_ITEM = null,
BB_FETCH_TARGET = null,
BB_FETCH_DELIVER_TO = null,
BB_DOG_FRIENDS = list(),
BB_FETCH_IGNORE_LIST = list(),
BB_DOG_ORDER_MODE = DOG_COMMAND_NONE,
BB_DOG_PLAYING_DEAD = FALSE,
BB_DOG_HARASS_TARGET = null,
BB_DOG_HARASS_FRUSTRATION = null,
BB_VISION_RANGE = AI_DOG_VISION_RANGE,
)
ai_movement = /datum/ai_movement/jps
planning_subtrees = list(/datum/ai_planning_subtree/dog)
idle_behavior = /datum/idle_behavior/idle_dog
planning_subtrees = list(
/datum/ai_planning_subtree/random_speech/dog,
/datum/ai_planning_subtree/dog,
)
COOLDOWN_DECLARE(heel_cooldown)
COOLDOWN_DECLARE(command_cooldown)
@@ -51,13 +56,6 @@
return FALSE
return ..()
/datum/ai_controller/dog/get_access()
var/mob/living/simple_animal/simple_pawn = pawn
if(!istype(simple_pawn))
return
return simple_pawn.access_card
/// Someone has thrown something, see if it's someone we care about and start listening to the thrown item so we can see if we want to fetch it when it lands
/datum/ai_controller/dog/proc/listened_throw(datum/source, mob/living/carbon/carbon_thrower)
SIGNAL_HANDLER
@@ -285,3 +283,37 @@
if(living_pawn.buckled)
queue_behavior(/datum/ai_behavior/resist)//in case they are in bed or something
queue_behavior(/datum/ai_behavior/harass)
/**
* Same thing but with make tiny corgis and use access cards.
*/
/datum/ai_controller/dog/corgi
blackboard = list(
BB_SIMPLE_CARRY_ITEM = null,
BB_FETCH_TARGET = null,
BB_FETCH_DELIVER_TO = null,
BB_DOG_FRIENDS = list(),
BB_FETCH_IGNORE_LIST = list(),
BB_DOG_ORDER_MODE = DOG_COMMAND_NONE,
BB_DOG_PLAYING_DEAD = FALSE,
BB_DOG_HARASS_TARGET = null,
BB_DOG_HARASS_FRUSTRATION = null,
BB_VISION_RANGE = AI_DOG_VISION_RANGE,
BB_BABIES_PARTNER_TYPES = list(/mob/living/basic/pet/dog),
BB_BABIES_CHILD_TYPES = list(/mob/living/basic/pet/dog/corgi/puppy = 95, /mob/living/basic/pet/dog/corgi/puppy/void = 5),
)
planning_subtrees = list(
/datum/ai_planning_subtree/random_speech/dog,
/datum/ai_planning_subtree/make_babies,
/datum/ai_planning_subtree/dog,
)
/datum/ai_controller/dog/corgi/get_access()
var/mob/living/basic/pet/dog/corgi/corgi_pawn = pawn
if(!istype(corgi_pawn))
return
return corgi_pawn.access_card
+6 -3
View File
@@ -13,9 +13,12 @@
var/obj/item/carry_item = controller.blackboard[BB_SIMPLE_CARRY_ITEM]
living_pawn.visible_message(span_notice("[living_pawn] gently teethes on \the [carry_item] in [living_pawn.p_their()] mouth."), vision_distance=COMBAT_MESSAGE_RANGE)
if(DT_PROB(5, delta_time) && (living_pawn.mobility_flags & MOBILITY_MOVE))
// Custom movement rate, for old corgis, etc.
var/move_chance = controller.blackboard[BB_DOG_IS_SLOW] ? 2.5 : 5
if(DT_PROB(move_chance, delta_time) && (living_pawn.mobility_flags & MOBILITY_MOVE))
var/move_dir = pick(GLOB.alldirs)
living_pawn.Move(get_step(living_pawn, move_dir), move_dir)
else if(DT_PROB(10, delta_time))
living_pawn.manual_emote(pick("dances around.","chases [living_pawn.p_their()] tail!"))
else if(DT_PROB(2, delta_time))
living_pawn.manual_emote(pick("dances around.", "chases [living_pawn.p_their()] tail!"))
living_pawn.AddComponent(/datum/component/spinny)
+1 -1
View File
@@ -170,7 +170,7 @@
for(var/mob/M in oview(owner, 7))
if(!isliving(M)) //ghosts ain't people
continue
if((istype(M, /mob/living/simple_animal/pet)) || M.ckey)
if(istype(M, /mob/living/simple_animal/pet) || istype(M, /mob/living/basic/pet) || M.ckey)
return FALSE
return TRUE
+1 -1
View File
@@ -1,6 +1,6 @@
GLOBAL_LIST_INIT(creamable, typecacheof(list(
/mob/living/carbon/human,
/mob/living/simple_animal/pet/dog/corgi,
/mob/living/basic/pet/dog/corgi,
/mob/living/silicon/ai)))
/**
+1 -1
View File
@@ -268,7 +268,7 @@
stage3 = list("<span class='danger'>Must... eat... chocolate....</span>", "<span class='danger'>YAP</span>")
stage4 = list("<span class='danger'>Visions of washing machines assail your mind!</span>")
stage5 = list("<span class='danger'>AUUUUUU!!!</span>")
new_form = /mob/living/simple_animal/pet/dog/corgi
new_form = /mob/living/basic/pet/dog/corgi
/datum/disease/transformation/corgi/stage_act(delta_time, times_fired)
+9 -7
View File
@@ -17,20 +17,22 @@
name = replacetext(name, "REAL_NAME", M.real_name)
desc = replacetext(desc, "NAME", name)
/datum/dog_fashion/proc/apply(mob/living/simple_animal/pet/dog/D)
/datum/dog_fashion/proc/apply(mob/living/basic/pet/dog/D)
if(name)
D.name = name
if(desc)
D.desc = desc
if(emote_see)
D.emote_see = string_list(emote_see)
if(emote_hear)
D.emote_hear = string_list(emote_hear)
if(speak)
D.speak = string_list(speak)
if(speak_emote)
D.speak_emote = string_list(speak_emote)
/datum/dog_fashion/proc/apply_to_speech(datum/ai_planning_subtree/random_speech/speech)
if(emote_see)
speech.emote_see = string_list(emote_see)
if(emote_hear)
speech.emote_hear = string_list(emote_hear)
if(speak)
speech.speak = string_list(speak)
/datum/dog_fashion/proc/get_overlay(dir)
if(icon_file && obj_icon_state)
var/image/corgI = image(icon_file, obj_icon_state, dir = dir)
+1 -1
View File
@@ -377,7 +377,7 @@
nonhuman_mobtype = /mob/living/simple_animal/hostile/gorilla
/datum/preset_holoimage/corgi
nonhuman_mobtype = /mob/living/simple_animal/pet/dog/corgi
nonhuman_mobtype = /mob/living/basic/pet/dog/corgi
/datum/preset_holoimage/clown
outfit_type = /datum/outfit/job/clown
+3 -3
View File
@@ -66,9 +66,9 @@
/mob/living/simple_animal/hostile/megafauna/dragon/lesser,
/mob/living/simple_animal/hostile/gorilla,
/mob/living/simple_animal/parrot,
/mob/living/simple_animal/pet/dog/corgi,
/mob/living/basic/pet/dog/corgi,
/mob/living/simple_animal/crab,
/mob/living/simple_animal/pet/dog/pug,
/mob/living/basic/pet/dog/pug,
/mob/living/simple_animal/pet/cat,
/mob/living/basic/mouse,
/mob/living/simple_animal/chicken,
@@ -77,7 +77,7 @@
/mob/living/simple_animal/pet/fox,
/mob/living/simple_animal/butterfly,
/mob/living/simple_animal/pet/cat/cak,
/mob/living/simple_animal/pet/dog/breaddog,
/mob/living/basic/pet/dog/breaddog,
/mob/living/simple_animal/chick,
/mob/living/basic/cow/wisdom,
/obj/item/skub,
+3 -3
View File
@@ -43,8 +43,8 @@
report_message = "Ian has gone exploring somewhere in the station."
/datum/station_trait/ian_adventure/on_round_start()
for(var/mob/living/simple_animal/pet/dog/corgi/dog in GLOB.mob_list)
if(!(istype(dog, /mob/living/simple_animal/pet/dog/corgi/ian) || istype(dog, /mob/living/simple_animal/pet/dog/corgi/puppy/ian)))
for(var/mob/living/basic/pet/dog/corgi/dog in GLOB.mob_list)
if(!(istype(dog, /mob/living/basic/pet/dog/corgi/ian) || istype(dog, /mob/living/basic/pet/dog/corgi/puppy/ian)))
continue
// Makes this station trait more interesting. Ian probably won't go anywhere without a little external help.
@@ -64,7 +64,7 @@
do_smoke(location=adventure_turf)
/// Moves the new dog somewhere safe, equips it with the old one's inventory and makes it deadchat_playable.
/datum/station_trait/ian_adventure/proc/do_corgi_respawn(mob/living/simple_animal/pet/dog/corgi/old_dog, mob/living/simple_animal/pet/dog/corgi/new_dog, gibbed, lives_left)
/datum/station_trait/ian_adventure/proc/do_corgi_respawn(mob/living/basic/pet/dog/corgi/old_dog, mob/living/basic/pet/dog/corgi/new_dog, gibbed, lives_left)
SIGNAL_HANDLER
var/turf/current_turf = get_turf(new_dog)
+5 -1
View File
@@ -276,6 +276,10 @@ GLOBAL_LIST_INIT(dye_registry, list(
investigate_log("has been gibbed by a washing machine.", INVESTIGATE_DEATHS)
gib()
/mob/living/basic/pet/machine_wash(obj/machinery/washing_machine/washer)
washer.bloody_mess = TRUE
gib()
/obj/item/machine_wash(obj/machinery/washing_machine/washer)
if(washer.color_source)
dye_item(washer.color_source.dye_color)
@@ -369,7 +373,7 @@ GLOBAL_LIST_INIT(dye_registry, list(
if(L.buckled || L.has_buckled_mobs())
return
if(state_open)
if(istype(L, /mob/living/simple_animal/pet))
if(istype(L, /mob/living/simple_animal/pet) || istype(L, /mob/living/basic/pet))
L.forceMove(src)
update_appearance()
return
@@ -69,7 +69,7 @@
return ..()
/obj/effect/gibspawner/generic/animal
gib_mob_type = /mob/living/simple_animal/pet
gib_mob_type = /mob/living/basic/pet
@@ -98,7 +98,7 @@
S.add_atom_colour(newcolor, FIXED_COLOUR_PRIORITY)
return TRUE
/mob/living/simple_animal/pet/dog/corgi/petrify(statue_timer)
/mob/living/basic/pet/dog/corgi/petrify(statue_timer)
if(!isturf(loc))
return FALSE
var/obj/structure/statue/petrified/S = new (loc, src, statue_timer)
@@ -12,7 +12,7 @@
possible_shapes = list(
/mob/living/basic/mouse,
/mob/living/simple_animal/pet/dog/corgi,
/mob/living/basic/pet/dog/corgi,
/mob/living/simple_animal/hostile/carp,
/mob/living/simple_animal/bot/secbot,
/mob/living/simple_animal/pet/fox,
@@ -19,8 +19,8 @@
/// Possible heads mapped to their pet type. Can be a list of possible pets
var/list/possible_heads = list(
JOB_HEAD_OF_PERSONNEL = list(
/mob/living/simple_animal/pet/dog/corgi/ian,
/mob/living/simple_animal/pet/dog/corgi/puppy/ian
/mob/living/basic/pet/dog/corgi/ian,
/mob/living/basic/pet/dog/corgi/puppy/ian
),
JOB_CAPTAIN = /mob/living/simple_animal/pet/fox/renault,
JOB_CHIEF_MEDICAL_OFFICER = /mob/living/simple_animal/pet/cat/runtime,
@@ -57,7 +57,7 @@
/mob/living/simple_animal/hostile/retaliate/bat/sgt_araneus
),
JOB_WARDEN = list(
/mob/living/simple_animal/pet/dog/pug/mcgriff
/mob/living/basic/pet/dog/pug/mcgriff
)
)
+6 -6
View File
@@ -61,7 +61,7 @@
one dog from the millions of Ian's noble bloodline. Comes with a cute collar!"
cost = CARGO_CRATE_VALUE * 10
access_view = ACCESS_HOP
contains = list(/mob/living/simple_animal/pet/dog/corgi,
contains = list(/mob/living/basic/pet/dog/corgi,
/obj/item/clothing/neck/petcollar,
)
crate_name = "corgi crate"
@@ -69,10 +69,10 @@
/datum/supply_pack/critter/corgi/generate()
. = ..()
if(prob(50))
var/mob/living/simple_animal/pet/dog/corgi/D = locate() in .
var/mob/living/basic/pet/dog/corgi/D = locate() in .
if(D.gender == FEMALE)
qdel(D)
new /mob/living/simple_animal/pet/dog/corgi/lisa(.)
new /mob/living/basic/pet/dog/corgi/lisa(.)
/datum/supply_pack/critter/cow
name = "Cow Crate"
@@ -123,7 +123,7 @@
desc = "Corgi fit for a king, this corgi comes in a unique color to signify their superiority. \
Comes with a cute collar!"
cost = CARGO_CRATE_VALUE * 11
contains = list(/mob/living/simple_animal/pet/dog/corgi/exoticcorgi,
contains = list(/mob/living/basic/pet/dog/corgi/exoticcorgi,
/obj/item/clothing/neck/petcollar,
)
crate_name = "exotic corgi crate"
@@ -166,7 +166,7 @@
name = "Pug Crate"
desc = "Like a normal dog, but... squished. Contains one pug. Comes with a nice collar!"
cost = CARGO_CRATE_VALUE * 10
contains = list(/mob/living/simple_animal/pet/dog/pug,
contains = list(/mob/living/basic/pet/dog/pug,
/obj/item/clothing/neck/petcollar,
)
crate_name = "pug crate"
@@ -176,7 +176,7 @@
desc = "Like a normal dog, but with a head the shape of an egg. Contains one bull terrier. \
Comes with a nice collar!"
cost = CARGO_CRATE_VALUE * 10
contains = list(/mob/living/simple_animal/pet/dog/bullterrier,
contains = list(/mob/living/basic/pet/dog/bullterrier,
/obj/item/clothing/neck/petcollar,
)
crate_name = "bull terrier crate"
@@ -1,4 +1,5 @@
GLOBAL_LIST_INIT(high_priority_sentience, typecacheof(list(
/mob/living/basic/pet,
/mob/living/simple_animal/pet,
/mob/living/simple_animal/parrot,
/mob/living/simple_animal/hostile/lizard,
+1 -1
View File
@@ -16,7 +16,7 @@
if(b)
new /obj/item/storage/spooky(b)
for(var/mob/living/simple_animal/pet/dog/corgi/ian/Ian in GLOB.mob_living_list)
for(var/mob/living/basic/pet/dog/corgi/ian/Ian in GLOB.mob_living_list)
Ian.place_on_head(new /obj/item/bedsheet(Ian))
for(var/mob/living/simple_animal/parrot/poly/Poly in GLOB.mob_living_list)
new /mob/living/simple_animal/parrot/poly/ghost(Poly.loc)
@@ -39,7 +39,7 @@
description = "We need to see how the body functions from the earliest moments. Some cytology experiments will help us gain this understanding."
total_requirement = 3
max_requirement_per_type = 2
possible_types = list(/mob/living/simple_animal/hostile/carp, /mob/living/simple_animal/hostile/retaliate/snake, /mob/living/simple_animal/pet/cat, /mob/living/simple_animal/pet/dog/corgi, /mob/living/basic/cow, /mob/living/simple_animal/chicken)
possible_types = list(/mob/living/simple_animal/hostile/carp, /mob/living/simple_animal/hostile/retaliate/snake, /mob/living/simple_animal/pet/cat, /mob/living/basic/pet/dog/corgi, /mob/living/basic/cow, /mob/living/simple_animal/chicken)
/datum/experiment/scanning/random/cytology/medium/one
name = "Advanced Cytology Scanning Experiment One"
+1 -1
View File
@@ -95,7 +95,7 @@ GLOBAL_LIST_INIT(adventure_loot_generator_index,generate_generator_index())
/datum/adventure_loot_generator/pet
id = "pets"
var/carrier_type = /obj/item/pet_carrier/biopod
var/list/possible_pets = list(/mob/living/simple_animal/pet/cat/space,/mob/living/simple_animal/pet/dog/corgi,/mob/living/simple_animal/pet/penguin/baby,/mob/living/simple_animal/pet/dog/pug)
var/list/possible_pets = list(/mob/living/simple_animal/pet/cat/space,/mob/living/basic/pet/dog/corgi,/mob/living/simple_animal/pet/penguin/baby,/mob/living/basic/pet/dog/pug)
/datum/adventure_loot_generator/pet/generate()
var/obj/item/pet_carrier/carrier = new carrier_type()
@@ -142,7 +142,7 @@
/datum/reagent/blood = 30,
/datum/reagent/teslium = 1 //To shock the whole thing into life
)
result = /mob/living/simple_animal/pet/dog/breaddog
result = /mob/living/basic/pet/dog/breaddog
subcategory = CAT_BREAD
////////////////////////////////////////////////TOAST////////////////////////////////////////////////
+1 -1
View File
@@ -758,7 +758,7 @@
for(var/obj/machinery/computer/security/telescreen/entertainment/Monitor in GLOB.machines)
Monitor.icon_state_on = "entertainment_xmas"
for(var/mob/living/simple_animal/pet/dog/corgi/ian/Ian in GLOB.mob_living_list)
for(var/mob/living/basic/pet/dog/corgi/ian/Ian in GLOB.mob_living_list)
Ian.place_on_head(new /obj/item/clothing/head/helmet/space/santahat(Ian))
+3 -3
View File
@@ -88,9 +88,9 @@
/mob/living/basic/rabbit,
)
mobtype += pick(
/mob/living/simple_animal/pet/dog/corgi,
/mob/living/simple_animal/pet/dog/corgi/puppy,
/mob/living/simple_animal/pet/dog/pug,
/mob/living/basic/pet/dog/corgi,
/mob/living/basic/pet/dog/corgi/puppy,
/mob/living/basic/pet/dog/pug,
)
mobtype += pick(
/mob/living/simple_animal/pet/cat,
@@ -83,7 +83,7 @@
/datum/job/head_of_personnel/get_mail_goodies(mob/recipient)
. = ..()
// Strange Reagent if the pet is dead.
for(var/mob/living/simple_animal/pet/dog/corgi/ian/staff_pet in GLOB.dead_mob_list)
for(var/mob/living/basic/pet/dog/corgi/ian/staff_pet in GLOB.dead_mob_list)
. += list(/datum/reagent/medicine/strange_reagent = 20)
break
@@ -1,6 +1,6 @@
//Dogs.
/mob/living/simple_animal/pet/dog
/mob/living/basic/pet/dog
mob_biotypes = MOB_ORGANIC|MOB_BEAST
response_help_continuous = "pets"
response_help_simple = "pet"
@@ -8,33 +8,30 @@
response_disarm_simple = "bop"
response_harm_continuous = "kicks"
response_harm_simple = "kick"
speak = list("YAP", "Woof!", "Bark!", "AUUUUUU")
speak_emote = list("barks", "woofs")
emote_hear = list("barks!", "woofs!", "yaps.","pants.")
emote_see = list("shakes their head.", "chases their tail.","shivers.")
faction = list("neutral")
see_in_dark = 5
speak_chance = 1
turns_per_move = 10
can_be_held = TRUE
ai_controller = /datum/ai_controller/dog
stop_automated_movement = TRUE
///In the case 'melee_damage_upper' is somehow raised above 0
attack_verb_continuous = "bites"
attack_verb_simple = "bite"
attack_sound = 'sound/weapons/bite.ogg'
attack_vis_effect = ATTACK_EFFECT_BITE
footstep_type = FOOTSTEP_MOB_CLAW
/mob/living/simple_animal/pet/dog/Initialize(mapload)
/mob/living/basic/pet/dog/Initialize(mapload)
. = ..()
AddElement(/datum/element/pet_bonus, "woofs happily!")
add_cell_sample()
AddElement(/datum/element/footstep, FOOTSTEP_MOB_CLAW)
/mob/living/basic/pet/dog/proc/update_dog_speech(datum/ai_planning_subtree/random_speech/speech)
speech.speak = string_list(list("YAP", "Woof!", "Bark!", "AUUUUUU"))
speech.emote_hear = string_list(list("barks!", "woofs!", "yaps.","pants."))
speech.emote_see = string_list(list("shakes [p_their()] head.", "chases [p_their()] tail.","shivers."))
//Corgis and pugs are now under one dog subtype
/mob/living/simple_animal/pet/dog/corgi
/mob/living/basic/pet/dog/corgi
name = "\improper corgi"
real_name = "corgi"
desc = "They're a corgi."
@@ -43,35 +40,39 @@
icon_dead = "corgi_dead"
held_state = "corgi"
butcher_results = list(/obj/item/food/meat/slab/corgi = 3, /obj/item/stack/sheet/animalhide/corgi = 1)
childtype = list(/mob/living/simple_animal/pet/dog/corgi/puppy = 95, /mob/living/simple_animal/pet/dog/corgi/puppy/void = 5)
animal_species = /mob/living/simple_animal/pet/dog
gold_core_spawnable = FRIENDLY_SPAWN
collar_type = "corgi"
collar_icon_state = "corgi"
ai_controller = /datum/ai_controller/dog/corgi
var/obj/item/inventory_head
var/obj/item/inventory_back
/// Access card for Ian.
var/obj/item/card/id/access_card = null
var/shaved = FALSE
var/nofur = FALSE //Corgis that have risen past the material plane of existence.
/// Is this corgi physically slow due to age, etc?
var/is_slow = FALSE
/mob/living/simple_animal/pet/dog/corgi/add_cell_sample()
AddElement(/datum/element/swabable, CELL_LINE_TABLE_CORGI, CELL_VIRUS_TABLE_GENERIC_MOB, 1, 5)
/mob/living/simple_animal/pet/dog/corgi/Destroy()
/mob/living/basic/pet/dog/corgi/Destroy()
QDEL_NULL(inventory_head)
QDEL_NULL(inventory_back)
QDEL_NULL(access_card)
return ..()
/mob/living/simple_animal/pet/dog/corgi/gib()
/mob/living/basic/pet/dog/corgi/gib()
if(inventory_head)
inventory_head.forceMove(drop_location())
inventory_head = null
if(inventory_back)
inventory_back.forceMove(drop_location())
inventory_back = null
if(access_card)
access_card.forceMove(drop_location())
access_card = null
return ..()
/mob/living/simple_animal/pet/dog/corgi/deadchat_plays(mode = ANARCHY_MODE, cooldown = 12 SECONDS)
/mob/living/basic/pet/dog/corgi/deadchat_plays(mode = ANARCHY_MODE, cooldown = 12 SECONDS)
. = AddComponent(/datum/component/deadchat_control/cardinal_movement, mode, list(
"speak" = CALLBACK(src, PROC_REF(handle_automated_speech), TRUE),
"speak" = CALLBACK(src, PROC_REF(bork)),
"wear_hat" = CALLBACK(src, PROC_REF(find_new_hat)),
"drop_hat" = CALLBACK(src, PROC_REF(drop_hat)),
"spin" = CALLBACK(src, TYPE_PROC_REF(/mob, emote), "spin")), cooldown, CALLBACK(src, PROC_REF(stop_deadchat_plays)))
@@ -79,10 +80,17 @@
if(. == COMPONENT_INCOMPATIBLE)
return
stop_automated_movement = TRUE
// Stop all automated behavior.
QDEL_NULL(ai_controller)
///Deadchat bark.
/mob/living/basic/pet/dog/corgi/proc/bork()
var/emote = pick("barks!", "woofs!", "yaps.","pants.")
manual_emote(emote)
///Deadchat plays command that picks a new hat for Ian.
/mob/living/simple_animal/pet/dog/corgi/proc/find_new_hat()
/mob/living/basic/pet/dog/corgi/proc/find_new_hat()
if(!isturf(loc))
return
var/list/possible_headwear = list()
@@ -102,7 +110,7 @@
visible_message(span_notice("[src] puts [inventory_head] on [p_their()] own head, somehow."))
///Deadchat plays command that drops the current hat off Ian.
/mob/living/simple_animal/pet/dog/corgi/proc/drop_hat()
/mob/living/basic/pet/dog/corgi/proc/drop_hat()
if(!inventory_head)
return
visible_message(span_notice("[src] vigorously shakes [p_their()] head, dropping [inventory_head] to the ground."))
@@ -111,7 +119,13 @@
update_corgi_fluff()
regenerate_icons()
/mob/living/simple_animal/pet/dog/corgi/handle_atom_del(atom/A)
///Turn AI back on.
/mob/living/basic/pet/dog/corgi/proc/stop_deadchat_plays()
var/controller_type = initial(ai_controller)
ai_controller = new controller_type(src)
ai_controller?.blackboard[BB_DOG_IS_SLOW] = is_slow
/mob/living/basic/pet/dog/corgi/handle_atom_del(atom/A)
if(A == inventory_head)
inventory_head = null
update_corgi_fluff()
@@ -122,7 +136,7 @@
regenerate_icons()
return ..()
/mob/living/simple_animal/pet/dog/pug
/mob/living/basic/pet/dog/pug
name = "\improper pug"
real_name = "pug"
desc = "They're a pug."
@@ -132,19 +146,21 @@
icon_dead = "pug_dead"
butcher_results = list(/obj/item/food/meat/slab/pug = 3)
gold_core_spawnable = FRIENDLY_SPAWN
collar_type = "pug"
collar_icon_state = "pug"
held_state = "pug"
/mob/living/simple_animal/pet/dog/pug/add_cell_sample()
/mob/living/basic/pet/dog/pug/Initialize(mapload)
. = ..()
AddElement(/datum/element/swabable, CELL_LINE_TABLE_PUG, CELL_VIRUS_TABLE_GENERIC_MOB, 1, 5)
/mob/living/simple_animal/pet/dog/pug/mcgriff
/mob/living/basic/pet/dog/pug/mcgriff
name = "McGriff"
desc = "This dog can tell something smells around here, and that something is CRIME!"
gold_core_spawnable = NO_SPAWN
unique_pet = TRUE
/mob/living/simple_animal/pet/dog/bullterrier
/mob/living/basic/pet/dog/bullterrier
name = "\improper bull terrier"
real_name = "bull terrier"
desc = "They're a bull terrier."
@@ -154,44 +170,53 @@
icon_dead = "bullterrier_dead"
butcher_results = list(/obj/item/food/meat/slab/corgi = 3) // Would feel redundant to add more new dog meats.
gold_core_spawnable = FRIENDLY_SPAWN
collar_type = "bullterrier"
collar_icon_state = "bullterrier"
held_state = "bullterrier"
/mob/living/simple_animal/pet/dog/corgi/exoticcorgi
/mob/living/basic/pet/dog/corgi/exoticcorgi
name = "Exotic Corgi"
desc = "As cute as they are colorful!"
icon = 'icons/mob/simple/pets.dmi'
icon_state = "corgigrey"
icon_living = "corgigrey"
icon_dead = "corgigrey_dead"
animal_species = /mob/living/simple_animal/pet/dog/corgi/exoticcorgi
nofur = TRUE
/mob/living/simple_animal/pet/dog/Initialize(mapload)
/mob/living/basic/pet/dog/Initialize(mapload)
. = ..()
var/dog_area = get_area(src)
for(var/obj/structure/bed/dogbed/D in dog_area)
if(D.update_owner(src)) //No muscling in on my turf you fucking parrot
break
/mob/living/simple_animal/pet/dog/corgi/Initialize(mapload)
/mob/living/basic/pet/dog/corgi/Initialize(mapload)
. = ..()
regenerate_icons()
AddElement(/datum/element/strippable, GLOB.strippable_corgi_items)
AddElement(/datum/element/swabable, CELL_LINE_TABLE_CORGI, CELL_VIRUS_TABLE_GENERIC_MOB, 1, 5)
RegisterSignal(src, COMSIG_MOB_TRIED_ACCESS, PROC_REF(on_tried_access))
/mob/living/simple_animal/pet/dog/corgi/exoticcorgi/Initialize(mapload)
/**
* Handler for COMSIG_MOB_TRIED_ACCESS
*/
/mob/living/basic/pet/dog/corgi/proc/on_tried_access(mob/accessor, obj/locked_thing)
SIGNAL_HANDLER
return locked_thing?.check_access(access_card) ? ACCESS_ALLOWED : ACCESS_DISALLOWED
/mob/living/basic/pet/dog/corgi/exoticcorgi/Initialize(mapload)
. = ..()
var/newcolor = rgb(rand(0, 255), rand(0, 255), rand(0, 255))
add_atom_colour(newcolor, FIXED_COLOUR_PRIORITY)
/mob/living/simple_animal/pet/dog/corgi/death(gibbed)
/mob/living/basic/pet/dog/corgi/death(gibbed)
..(gibbed)
regenerate_icons()
GLOBAL_LIST_INIT(strippable_corgi_items, create_strippable_list(list(
/datum/strippable_item/corgi_head,
/datum/strippable_item/corgi_back,
/datum/strippable_item/corgi_collar,
/datum/strippable_item/pet_collar,
/datum/strippable_item/corgi_id,
)))
@@ -199,21 +224,21 @@ GLOBAL_LIST_INIT(strippable_corgi_items, create_strippable_list(list(
key = STRIPPABLE_ITEM_HEAD
/datum/strippable_item/corgi_head/get_item(atom/source)
var/mob/living/simple_animal/pet/dog/corgi/corgi_source = source
var/mob/living/basic/pet/dog/corgi/corgi_source = source
if (!istype(corgi_source))
return
return corgi_source.inventory_head
/datum/strippable_item/corgi_head/finish_equip(atom/source, obj/item/equipping, mob/user)
var/mob/living/simple_animal/pet/dog/corgi/corgi_source = source
var/mob/living/basic/pet/dog/corgi/corgi_source = source
if (!istype(corgi_source))
return
corgi_source.place_on_head(equipping, user)
/datum/strippable_item/corgi_head/finish_unequip(atom/source, mob/user)
var/mob/living/simple_animal/pet/dog/corgi/corgi_source = source
var/mob/living/basic/pet/dog/corgi/corgi_source = source
if (!istype(corgi_source))
return
@@ -222,11 +247,47 @@ GLOBAL_LIST_INIT(strippable_corgi_items, create_strippable_list(list(
corgi_source.update_corgi_fluff()
corgi_source.regenerate_icons()
/datum/strippable_item/pet_collar
key = STRIPPABLE_ITEM_PET_COLLAR
/datum/strippable_item/pet_collar/get_item(atom/source)
var/mob/living/basic/pet/pet_source = source
if (!istype(pet_source))
return
return pet_source.collar
/datum/strippable_item/pet_collar/try_equip(atom/source, obj/item/equipping, mob/user)
. = ..()
if (!.)
return FALSE
if (!istype(equipping, /obj/item/clothing/neck/petcollar))
to_chat(user, span_warning("That's not a collar."))
return FALSE
return TRUE
/datum/strippable_item/pet_collar/finish_equip(atom/source, obj/item/equipping, mob/user)
var/mob/living/basic/pet/pet_source = source
if (!istype(pet_source))
return
pet_source.add_collar(equipping, user)
/datum/strippable_item/pet_collar/finish_unequip(atom/source, mob/user)
var/mob/living/basic/pet/pet_source = source
if (!istype(pet_source))
return
var/obj/collar = pet_source.remove_collar(user.drop_location())
user.put_in_hands(collar)
/datum/strippable_item/corgi_back
key = STRIPPABLE_ITEM_BACK
/datum/strippable_item/corgi_back/get_item(atom/source)
var/mob/living/simple_animal/pet/dog/corgi/corgi_source = source
var/mob/living/basic/pet/dog/corgi/corgi_source = source
if (!istype(corgi_source))
return
@@ -249,7 +310,7 @@ GLOBAL_LIST_INIT(strippable_corgi_items, create_strippable_list(list(
return TRUE
/datum/strippable_item/corgi_back/finish_equip(atom/source, obj/item/equipping, mob/user)
var/mob/living/simple_animal/pet/dog/corgi/corgi_source = source
var/mob/living/basic/pet/dog/corgi/corgi_source = source
if (!istype(corgi_source))
return
@@ -259,7 +320,7 @@ GLOBAL_LIST_INIT(strippable_corgi_items, create_strippable_list(list(
corgi_source.regenerate_icons()
/datum/strippable_item/corgi_back/finish_unequip(atom/source, mob/user)
var/mob/living/simple_animal/pet/dog/corgi/corgi_source = source
var/mob/living/basic/pet/dog/corgi/corgi_source = source
if (!istype(corgi_source))
return
@@ -268,50 +329,11 @@ GLOBAL_LIST_INIT(strippable_corgi_items, create_strippable_list(list(
corgi_source.update_corgi_fluff()
corgi_source.regenerate_icons()
/datum/strippable_item/corgi_collar
key = STRIPPABLE_ITEM_CORGI_COLLAR
/datum/strippable_item/corgi_collar/get_item(atom/source)
var/mob/living/simple_animal/pet/dog/corgi/corgi_source = source
if (!istype(corgi_source))
return
return corgi_source.pcollar
/datum/strippable_item/corgi_collar/try_equip(atom/source, obj/item/equipping, mob/user)
. = ..()
if (!.)
return FALSE
if (!istype(equipping, /obj/item/clothing/neck/petcollar))
to_chat(user, span_warning("That's not a collar."))
return FALSE
return TRUE
/datum/strippable_item/corgi_collar/finish_equip(atom/source, obj/item/equipping, mob/user)
var/mob/living/simple_animal/pet/dog/corgi/corgi_source = source
if (!istype(corgi_source))
return
corgi_source.add_collar(equipping, user)
corgi_source.update_corgi_fluff()
/datum/strippable_item/corgi_collar/finish_unequip(atom/source, mob/user)
var/mob/living/simple_animal/pet/dog/corgi/corgi_source = source
if (!istype(corgi_source))
return
user.put_in_hands(corgi_source.pcollar)
corgi_source.pcollar = null
corgi_source.update_corgi_fluff()
corgi_source.regenerate_icons()
/datum/strippable_item/corgi_id
key = STRIPPABLE_ITEM_ID
/datum/strippable_item/corgi_id/get_item(atom/source)
var/mob/living/simple_animal/pet/dog/corgi/corgi_source = source
var/mob/living/basic/pet/dog/corgi/corgi_source = source
if (!istype(corgi_source))
return
@@ -329,7 +351,7 @@ GLOBAL_LIST_INIT(strippable_corgi_items, create_strippable_list(list(
return TRUE
/datum/strippable_item/corgi_id/finish_equip(atom/source, obj/item/equipping, mob/user)
var/mob/living/simple_animal/pet/dog/corgi/corgi_source = source
var/mob/living/basic/pet/dog/corgi/corgi_source = source
if (!istype(corgi_source))
return
@@ -337,7 +359,7 @@ GLOBAL_LIST_INIT(strippable_corgi_items, create_strippable_list(list(
corgi_source.access_card = equipping
/datum/strippable_item/corgi_id/finish_unequip(atom/source, mob/user)
var/mob/living/simple_animal/pet/dog/corgi/corgi_source = source
var/mob/living/basic/pet/dog/corgi/corgi_source = source
if (!istype(corgi_source))
return
@@ -346,7 +368,7 @@ GLOBAL_LIST_INIT(strippable_corgi_items, create_strippable_list(list(
corgi_source.update_corgi_fluff()
corgi_source.regenerate_icons()
/mob/living/simple_animal/pet/dog/corgi/getarmor(def_zone, type)
/mob/living/basic/pet/dog/corgi/getarmor(def_zone, type)
var/armorval = 0
if(def_zone)
@@ -364,7 +386,7 @@ GLOBAL_LIST_INIT(strippable_corgi_items, create_strippable_list(list(
armorval += inventory_back.armor.getRating(type)
return armorval*0.5
/mob/living/simple_animal/pet/dog/corgi/attackby(obj/item/O, mob/user, params)
/mob/living/basic/pet/dog/corgi/attackby(obj/item/O, mob/user, params)
if (istype(O, /obj/item/razor))
if (shaved)
to_chat(user, span_warning("You can't shave this corgi, [p_they()] has already been shaved!"))
@@ -392,7 +414,7 @@ GLOBAL_LIST_INIT(strippable_corgi_items, create_strippable_list(list(
//Many hats added, Some will probably be removed, just want to see which ones are popular.
// > some will probably be removed
/mob/living/simple_animal/pet/dog/corgi/proc/place_on_head(obj/item/item_to_add, mob/living/user)
/mob/living/basic/pet/dog/corgi/proc/place_on_head(obj/item/item_to_add, mob/living/user)
if(inventory_head)
if(user)
to_chat(user, span_warning("You can't put more than one hat on [src]!"))
@@ -434,15 +456,12 @@ GLOBAL_LIST_INIT(strippable_corgi_items, create_strippable_list(list(
return valid
/mob/living/simple_animal/pet/dog/corgi/proc/update_corgi_fluff()
/mob/living/basic/pet/dog/corgi/proc/update_corgi_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 [p_their()] head.", "chases [p_their()] tail.","shivers.")
desc = initial(desc)
set_light(0)
@@ -454,13 +473,23 @@ GLOBAL_LIST_INIT(strippable_corgi_items, create_strippable_list(list(
var/datum/dog_fashion/DF = new inventory_back.dog_fashion(src)
DF.apply(src)
/mob/living/basic/pet/dog/corgi/update_dog_speech(datum/ai_planning_subtree/random_speech/speech)
..()
if(inventory_head?.dog_fashion)
var/datum/dog_fashion/DF = new inventory_head.dog_fashion(src)
DF.apply_to_speech(speech)
if(inventory_back?.dog_fashion)
var/datum/dog_fashion/DF = new inventory_back.dog_fashion(src)
DF.apply_to_speech(speech)
//IAN! SQUEEEEEEEEE~
/mob/living/simple_animal/pet/dog/corgi/ian
/mob/living/basic/pet/dog/corgi/ian
name = "Ian"
real_name = "Ian" //Intended to hold the name without altering it.
gender = MALE
desc = "He's the HoP's beloved corgi."
icon = 'modular_skyrat/modules/chadian/icons/ian.dmi' //SKYRAT EDIT CHANGE
response_help_continuous = "pets"
response_help_simple = "pet"
response_disarm_continuous = "bops"
@@ -474,7 +503,7 @@ GLOBAL_LIST_INIT(strippable_corgi_items, create_strippable_list(list(
var/memory_saved = FALSE
var/saved_head //path
/mob/living/simple_animal/pet/dog/corgi/ian/Initialize(mapload)
/mob/living/basic/pet/dog/corgi/ian/Initialize(mapload)
. = ..()
//parent call must happen first to ensure IAN
//is not in nullspace when child puppies spawn
@@ -482,7 +511,7 @@ GLOBAL_LIST_INIT(strippable_corgi_items, create_strippable_list(list(
if(age == 0)
var/turf/target = get_turf(loc)
if(target)
new /mob/living/simple_animal/pet/dog/corgi/puppy/ian(target)
new /mob/living/basic/pet/dog/corgi/puppy/ian(target)
Write_Memory(FALSE)
return INITIALIZE_HINT_QDEL
else if(age == record_age)
@@ -491,24 +520,21 @@ GLOBAL_LIST_INIT(strippable_corgi_items, create_strippable_list(list(
held_state = "old_corgi"
icon_dead = "old_corgi_dead"
desc = "At a ripe old age of [record_age], Ian's not as spry as he used to be, but he'll always be the HoP's beloved corgi." //RIP
turns_per_move = 20
ai_controller?.blackboard[BB_DOG_IS_SLOW] = TRUE
is_slow = TRUE
old = TRUE //SKYRAT EDIT ADDITION
/* SKYRAT EDIT REMOVAL
/mob/living/simple_animal/pet/dog/corgi/ian/Life(delta_time = SSMOBS_DT, times_fired)
/mob/living/basic/pet/dog/corgi/ian/Life(delta_time = SSMOBS_DT, times_fired)
if(!stat && SSticker.current_state == GAME_STATE_FINISHED && !memory_saved)
Write_Memory(FALSE)
memory_saved = TRUE
..()
*/
/mob/living/simple_animal/pet/dog/corgi/ian/death()
/mob/living/basic/pet/dog/corgi/ian/death()
if(!memory_saved)
Write_Memory(TRUE)
..()
/mob/living/simple_animal/pet/dog/corgi/ian/proc/Read_Memory()
/mob/living/basic/pet/dog/corgi/ian/proc/Read_Memory()
if(fexists("data/npc_saves/Ian.sav")) //legacy compatability to convert old format to new
var/savefile/S = new /savefile("data/npc_saves/Ian.sav")
S["age"] >> age
@@ -530,7 +556,7 @@ GLOBAL_LIST_INIT(strippable_corgi_items, create_strippable_list(list(
if(saved_head)
place_on_head(new saved_head)
/mob/living/simple_animal/pet/dog/corgi/ian/Write_Memory(dead, gibbed)
/mob/living/basic/pet/dog/corgi/ian/Write_Memory(dead, gibbed)
. = ..()
if(!.)
return
@@ -553,14 +579,14 @@ GLOBAL_LIST_INIT(strippable_corgi_items, create_strippable_list(list(
fdel(json_file)
WRITE_FILE(json_file, json_encode(file_data))
/mob/living/simple_animal/pet/dog/corgi/ian/narsie_act()
/mob/living/basic/pet/dog/corgi/ian/narsie_act()
playsound(src, 'sound/magic/demon_dies.ogg', 75, TRUE)
var/mob/living/simple_animal/pet/dog/corgi/narsie/N = new(loc)
var/mob/living/basic/pet/dog/corgi/narsie/N = new(loc)
N.setDir(dir)
investigate_log("has been gibbed by Nar'Sie.", INVESTIGATE_DEATHS)
gib()
/mob/living/simple_animal/pet/dog/corgi/narsie
/mob/living/basic/pet/dog/corgi/narsie
name = "Nars-Ian"
desc = "Ia! Ia!"
icon_state = "narsian"
@@ -572,10 +598,17 @@ GLOBAL_LIST_INIT(strippable_corgi_items, create_strippable_list(list(
unique_pet = TRUE
held_state = "narsian"
/mob/living/simple_animal/pet/dog/corgi/narsie/Life(delta_time = SSMOBS_DT, times_fired)
/mob/living/basic/pet/dog/corgi/narsie/Life(delta_time = SSMOBS_DT, times_fired)
..()
for(var/mob/living/simple_animal/pet/P in range(1, src))
if(P != src && !istype(P,/mob/living/simple_animal/pet/dog/corgi/narsie))
if(P != src && !istype(P,/mob/living/basic/pet/dog/corgi/narsie))
visible_message(span_warning("[src] devours [P]!"), \
"<span class='cult big bold'>DELICIOUS SOULS</span>")
playsound(src, 'sound/magic/demon_attack1.ogg', 75, TRUE)
narsie_act()
P.gib()
for(var/mob/living/basic/pet/P in range(1, src))
if(P != src && !istype(P,/mob/living/basic/pet/dog/corgi/narsie))
visible_message(span_warning("[src] devours [P]!"), \
"<span class='cult big bold'>DELICIOUS SOULS</span>")
playsound(src, 'sound/magic/demon_attack1.ogg', 75, TRUE)
@@ -583,18 +616,20 @@ GLOBAL_LIST_INIT(strippable_corgi_items, create_strippable_list(list(
P.investigate_log("has been gibbed by [src].", INVESTIGATE_DEATHS)
P.gib()
/mob/living/simple_animal/pet/dog/corgi/narsie/update_corgi_fluff()
/mob/living/basic/pet/dog/corgi/narsie/update_corgi_fluff()
..()
speak = list("Tari'karat-pasnar!", "IA! IA!", "BRRUUURGHGHRHR")
speak_emote = list("growls", "barks ominously")
emote_hear = list("barks echoingly!", "woofs hauntingly!", "yaps in an eldritch manner.", "mutters something unspeakable.")
emote_see = list("communes with the unnameable.", "ponders devouring some souls.", "shakes.")
/mob/living/simple_animal/pet/dog/corgi/narsie/narsie_act()
/mob/living/basic/pet/dog/corgi/narsie/update_dog_speech(datum/ai_planning_subtree/random_speech/speech)
speech.speak = string_list(list("Tari'karat-pasnar!", "IA! IA!", "BRRUUURGHGHRHR"))
speech.emote_hear = string_list(list("barks echoingly!", "woofs hauntingly!", "yaps in an eldritch manner.", "mutters something unspeakable."))
speech.emote_see = string_list(list("communes with the unnameable.", "ponders devouring some souls.", "shakes."))
/mob/living/basic/pet/dog/corgi/narsie/narsie_act()
adjustBruteLoss(-maxHealth)
/mob/living/simple_animal/pet/dog/corgi/regenerate_icons()
/mob/living/basic/pet/dog/corgi/regenerate_icons()
..()
if(inventory_head)
var/image/head_icon
@@ -639,7 +674,7 @@ GLOBAL_LIST_INIT(strippable_corgi_items, create_strippable_list(list(
/mob/living/simple_animal/pet/dog/corgi/puppy
/mob/living/basic/pet/dog/corgi/puppy
name = "\improper corgi puppy"
real_name = "corgi"
desc = "They're a corgi puppy!"
@@ -649,24 +684,24 @@ GLOBAL_LIST_INIT(strippable_corgi_items, create_strippable_list(list(
density = FALSE
pass_flags = PASSMOB
mob_size = MOB_SIZE_SMALL
collar_type = "puppy"
collar_icon_state = "puppy"
//puppies cannot wear anything.
/mob/living/simple_animal/pet/dog/corgi/puppy/Topic(href, href_list)
/mob/living/basic/pet/dog/corgi/puppy/Topic(href, href_list)
if(href_list["remove_inv"] || href_list["add_inv"])
to_chat(usr, span_warning("You can't fit this on [src], [p_they()] [p_are()] too small!"))
return
..()
//PUPPY IAN! SQUEEEEEEEEE~
/mob/living/simple_animal/pet/dog/corgi/puppy/ian
/mob/living/basic/pet/dog/corgi/puppy/ian
name = "Ian"
real_name = "Ian"
gender = MALE
desc = "He's the HoP's beloved corgi puppy."
/mob/living/simple_animal/pet/dog/corgi/puppy/void //Tribute to the corgis born in nullspace
/mob/living/basic/pet/dog/corgi/puppy/void //Tribute to the corgis born in nullspace
name = "\improper void puppy"
real_name = "voidy"
desc = "A corgi puppy that has been infused with deep space energy. It's staring back..."
@@ -675,20 +710,20 @@ GLOBAL_LIST_INIT(strippable_corgi_items, create_strippable_list(list(
icon_living = "void_puppy"
icon_dead = "void_puppy_dead"
nofur = TRUE
unsuitable_atmos_damage = 0
minbodytemp = TCMB
maxbodytemp = T0C + 40
held_state = "void_puppy"
/mob/living/simple_animal/pet/dog/corgi/puppy/void/Initialize(mapload)
/mob/living/basic/pet/dog/corgi/puppy/void/Initialize(mapload)
. = ..()
ADD_TRAIT(src, TRAIT_AI_BAGATTACK, INNATE_TRAIT)
RemoveElement(/datum/element/atmos_requirements)
RemoveElement(/datum/element/basic_body_temp_sensitive)
AddElement(/datum/element/basic_body_temp_sensitive, TCMB, T0C + 40)
/mob/living/simple_animal/pet/dog/corgi/puppy/void/Process_Spacemove(movement_dir = 0, continuous_move = FALSE)
/mob/living/basic/pet/dog/corgi/puppy/void/Process_Spacemove(movement_dir = 0, continuous_move = FALSE)
return 1 //Void puppies can navigate space.
//LISA! SQUEEEEEEEEE~
/mob/living/simple_animal/pet/dog/corgi/lisa
/mob/living/basic/pet/dog/corgi/lisa
name = "Lisa"
real_name = "Lisa"
gender = FEMALE
@@ -708,17 +743,13 @@ GLOBAL_LIST_INIT(strippable_corgi_items, create_strippable_list(list(
var/puppies = 0
//Lisa already has a cute bow!
/mob/living/simple_animal/pet/dog/corgi/lisa/Topic(href, href_list)
/mob/living/basic/pet/dog/corgi/lisa/Topic(href, href_list)
if(href_list["remove_inv"] || href_list["add_inv"])
to_chat(usr, span_warning("[src] already has a cute bow!"))
return
..()
/mob/living/simple_animal/pet/dog/corgi/lisa/Life(delta_time = SSMOBS_DT, times_fired)
. = ..()
make_babies()
/mob/living/simple_animal/pet/dog/breaddog //Most of the code originates from Cak
/mob/living/basic/pet/dog/breaddog //Most of the code originates from Cak
name = "Kobun"
desc = "It is a dog made out of bread. 'The universe is definitely half full'."
icon_state = "breaddog"
@@ -728,7 +759,7 @@ GLOBAL_LIST_INIT(strippable_corgi_items, create_strippable_list(list(
health = 50
maxHealth = 50
gender = NEUTER
harm_intent_damage = 10
damage_coeff = list(BRUTE = 3, BURN = 3, TOX = 1, CLONE = 1, STAMINA = 0, OXY = 1)
butcher_results = list(/obj/item/organ/internal/brain = 1, /obj/item/organ/internal/heart = 1, /obj/item/food/breadslice = 3, \
/obj/item/food/meat/slab = 2)
response_harm_continuous = "takes a bite out of"
@@ -737,10 +768,7 @@ GLOBAL_LIST_INIT(strippable_corgi_items, create_strippable_list(list(
held_state = "breaddog"
worn_slot_flags = ITEM_SLOT_HEAD
/mob/living/simple_animal/pet/dog/breaddog/add_cell_sample()
return
/mob/living/simple_animal/pet/dog/breaddog/CheckParts(list/parts)
/mob/living/basic/pet/dog/breaddog/CheckParts(list/parts)
..()
var/obj/item/organ/internal/brain/candidate = locate(/obj/item/organ/internal/brain) in contents
if(!candidate || !candidate.brainmob || !candidate.brainmob.mind)
@@ -755,7 +783,7 @@ GLOBAL_LIST_INIT(strippable_corgi_items, create_strippable_list(list(
to_chat(src, span_notice("Your name is now <b>[new_name]</b>!"))
name = new_name
/mob/living/simple_animal/pet/dog/breaddog/Life(delta_time = SSMOBS_DT, times_fired)
/mob/living/basic/pet/dog/breaddog/Life(delta_time = SSMOBS_DT, times_fired)
..()
if(stat)
return
@@ -766,7 +794,7 @@ GLOBAL_LIST_INIT(strippable_corgi_items, create_strippable_list(list(
for(var/mob/living/carbon/humanoid_entities in view(3, src)) //Mood aura which stay as long you do not wear Sanallite as hat or carry(I will try to make it work with hat someday(obviously weaker than normal one))
humanoid_entities.add_mood_event("kobun", /datum/mood_event/kobun)
/mob/living/simple_animal/pet/dog/breaddog/attack_hand(mob/living/user, list/modifiers)
/mob/living/basic/pet/dog/breaddog/attack_hand(mob/living/user, list/modifiers)
..()
if(user.combat_mode && user.reagents && !stat)
user.reagents.add_reagent(/datum/reagent/consumable/nutriment, 0.4)
+150
View File
@@ -0,0 +1,150 @@
/mob/living/basic/pet
icon = 'icons/mob/simple/pets.dmi'
mob_size = MOB_SIZE_SMALL
mob_biotypes = MOB_ORGANIC|MOB_BEAST
blood_volume = BLOOD_VOLUME_NORMAL
/// if the mob is protected from being renamed by collars.
var/unique_pet = FALSE
/// If the mob has collar sprites, this is the base of the icon states.
var/collar_icon_state = null
/// We have a seperate _rest collar icon state when the pet is resting.
var/has_collar_resting_icon_state = FALSE
/// Our collar
var/obj/item/clothing/neck/petcollar/collar
/mob/living/basic/pet/Initialize(mapload)
. = ..()
// String assoc list returns a cached list, so this is like a static list to pass into the element below.
var/static/list/habitable_atmos = list(
"min_oxy" = 5,
"max_oxy" = 0,
"min_plas" = 0,
"max_plas" = 1,
"min_co2" = 0,
"max_co2" = 5,
"min_n2" = 0,
"max_n2" = 0,
)
AddElement(/datum/element/atmos_requirements, atmos_requirements = habitable_atmos, unsuitable_atmos_damage = 1)
AddElement(/datum/element/basic_body_temp_sensitive)
/// Can set the collar var beforehand to start the pet with a collar.
if(collar)
collar = new(src)
update_icon(UPDATE_OVERLAYS)
/mob/living/basic/pet/Destroy()
. = ..()
QDEL_NULL(collar)
/mob/living/basic/pet/attackby(obj/item/thing, mob/user, params)
if(istype(thing, /obj/item/clothing/neck/petcollar) && !collar)
add_collar(thing, user)
return TRUE
if(istype(thing, /obj/item/newspaper) && !stat)
user.visible_message(span_notice("[user] baps [name] on the nose with the rolled up [thing]."))
dance_rotate(src)
return TRUE
return ..()
/mob/living/basic/pet/update_overlays()
. = ..()
if(!collar || !collar_icon_state)
return
// Determine which status tag to add to the middle of the icon state.
var/dead_tag = stat == DEAD ? "_dead" : null
var/rest_tag = has_collar_resting_icon_state && resting ? "_rest" : null
var/stat_tag = dead_tag || rest_tag || ""
. += mutable_appearance(icon, "[collar_icon_state][stat_tag]collar")
. += mutable_appearance(icon, "[collar_icon_state][stat_tag]tag")
/mob/living/basic/pet/gib()
. = ..()
remove_collar(drop_location(), update_visuals = FALSE)
/mob/living/basic/pet/revive(full_heal_flags = NONE, excess_healing = 0, force_grab_ghost = FALSE)
. = ..()
if(!.)
return
update_icon(UPDATE_OVERLAYS)
/mob/living/basic/pet/death(gibbed)
. = ..()
add_memory_in_range(src, 7, MEMORY_PET_DEAD, list(DETAIL_DEUTERAGONIST = src), story_value = STORY_VALUE_AMAZING, memory_flags = MEMORY_CHECK_BLIND_AND_DEAF) //Protagonist is the person memorizing it
/mob/living/basic/pet/handle_atom_del(atom/deleting_atom)
. = ..()
if(deleting_atom != collar)
return
collar = null
if(QDELETED(src))
return
update_icon(UPDATE_OVERLAYS)
/mob/living/basic/pet/update_stat()
. = ..()
update_icon(UPDATE_OVERLAYS)
/mob/living/basic/pet/set_resting(new_resting, silent, instant)
. = ..()
if(!has_collar_resting_icon_state)
return
update_icon(UPDATE_OVERLAYS)
/**
* Add a collar to the pet.
*
* Arguments:
* * new_collar - the collar.
* * user - the user that did it.
*/
/mob/living/basic/pet/proc/add_collar(obj/item/clothing/neck/petcollar/new_collar, mob/user)
if(QDELETED(new_collar) || collar)
return
if(!user.transferItemToLoc(new_collar, src))
return
collar = new_collar
if(collar_icon_state)
update_icon(UPDATE_OVERLAYS)
to_chat(user, span_notice("You put [new_collar] around [src]'s neck."))
if(new_collar.tagname && !unique_pet)
fully_replace_character_name(null, "\proper [new_collar.tagname]")
/**
* Remove the collar from the pet.
*/
/mob/living/basic/pet/proc/remove_collar(atom/new_loc, update_visuals = TRUE)
if(!collar)
return
var/obj/old_collar = collar
collar.forceMove(new_loc)
collar = null
if(collar_icon_state && update_visuals)
update_icon(UPDATE_OVERLAYS)
return old_collar
+1
View File
@@ -20,6 +20,7 @@
spread_bodyparts(no_brain, no_organs)
spawn_gibs(no_bodyparts)
SEND_SIGNAL(src, COMSIG_LIVING_GIBBED, no_brain, no_organs, no_bodyparts)
qdel(src)
/mob/living/proc/gib_animation()
+4 -3
View File
@@ -615,6 +615,7 @@
to_chat(src, "<span class='notice'>You stand up.</span>")*/
get_up(instant)
SEND_SIGNAL(src, COMSIG_LIVING_RESTING, new_resting, silent, instant)
update_resting()
@@ -1423,9 +1424,9 @@
/mob/living/simple_animal/hostile/megafauna/dragon/lesser,
/mob/living/simple_animal/hostile/gorilla,
/mob/living/simple_animal/parrot,
/mob/living/simple_animal/pet/dog/corgi,
/mob/living/basic/pet/dog/corgi,
/mob/living/simple_animal/crab,
/mob/living/simple_animal/pet/dog/pug,
/mob/living/basic/pet/dog/pug,
/mob/living/simple_animal/pet/cat,
/mob/living/basic/mouse,
/mob/living/simple_animal/chicken,
@@ -1434,7 +1435,7 @@
/mob/living/simple_animal/pet/fox,
/mob/living/simple_animal/butterfly,
/mob/living/simple_animal/pet/cat/cak,
/mob/living/simple_animal/pet/dog/breaddog,
/mob/living/basic/pet/dog/breaddog,
/mob/living/simple_animal/chick,
)
new_mob = new picked_animal(loc)
@@ -31,7 +31,8 @@
mobility_flags = MOBILITY_FLAGS_REST_CAPABLE_DEFAULT
var/mob/living/basic/mouse/movement_target
gold_core_spawnable = FRIENDLY_SPAWN
collar_type = "cat"
collar_icon_state = "cat"
has_collar_resting_icon_state = TRUE
can_be_held = TRUE
held_state = "cat2"
///only for attacking rats
@@ -72,7 +73,7 @@
icon_state = "breadcat"
icon_living = "breadcat"
icon_dead = "breadcat_dead"
collar_type = null
collar_icon_state = null
held_state = "breadcat"
butcher_results = list(/obj/item/food/meat/slab = 2, /obj/item/organ/internal/ears/cat = 1, /obj/item/organ/external/tail/cat = 1, /obj/item/food/breadslice/plain = 1)
@@ -86,12 +87,13 @@
icon_state = "original"
icon_living = "original"
icon_dead = "original_dead"
collar_type = null
collar_icon_state = null
unique_pet = TRUE
held_state = "original"
/mob/living/simple_animal/pet/cat/original/add_cell_sample()
return
/mob/living/simple_animal/pet/cat/kitten
name = "kitten"
desc = "D'aaawwww."
@@ -101,7 +103,7 @@
density = FALSE
pass_flags = PASSMOB
mob_size = MOB_SIZE_SMALL
collar_type = "kitten"
collar_icon_state = "kitten"
//RUNTIME IS ALIVE! SQUEEEEEEEE~
/mob/living/simple_animal/pet/cat/runtime
@@ -199,11 +201,8 @@
return
if (resting)
icon_state = "[icon_living]_rest"
collar_type = "[initial(collar_type)]_rest"
else
icon_state = "[icon_living]"
collar_type = "[initial(collar_type)]"
regenerate_icons()
/mob/living/simple_animal/pet/cat/Life(delta_time = SSMOBS_DT, times_fired)
@@ -215,7 +214,7 @@
manual_emote(pick("sits down.", "crouches on [p_their()] hind legs.", "looks alert."))
set_resting(TRUE)
icon_state = "[icon_living]_sit"
collar_type = "[initial(collar_type)]_sit"
cut_overlays() // No collar support in sitting state
else if(DT_PROB(0.5, delta_time))
if (resting)
manual_emote(pick("gets up and meows.", "walks around.", "stops resting."))
@@ -63,10 +63,6 @@
/mob/living/simple_animal/pet/gondola/can_speak(allow_mimes = FALSE)
return FALSE // Gondolas are the silent walker.
/// Special handling for gondolas, as they don't use icon_states and instead rely on overlays. The parent of this proc deletes all our overlays, so we're overriding it.
/mob/living/simple_animal/pet/gondola/regenerate_icons()
return
#undef GONDOLA_HEIGHT
#undef GONDOLA_COLOR
#undef GONDOLA_MOUSTACHE
@@ -3,77 +3,138 @@
mob_size = MOB_SIZE_SMALL
mob_biotypes = MOB_ORGANIC|MOB_BEAST
blood_volume = BLOOD_VOLUME_NORMAL
var/unique_pet = FALSE // if the mob can be renamed
var/obj/item/clothing/neck/petcollar/pcollar
var/collar_type //if the mob has collar sprites, define them.
/mob/living/simple_animal/pet/handle_atom_del(atom/A)
if(A == pcollar)
pcollar = null
return ..()
/// if the mob is protected from being renamed by collars.
var/unique_pet = FALSE
/// If the mob has collar sprites, this is the base of the icon states.
var/collar_icon_state
/// We have a seperate _rest collar icon state when the pet is resting.
var/has_collar_resting_icon_state = FALSE
/mob/living/simple_animal/pet/proc/add_collar(obj/item/clothing/neck/petcollar/P, mob/user)
if(QDELETED(P) || pcollar)
return
if(!user.transferItemToLoc(P, src))
return
pcollar = P
regenerate_icons()
to_chat(user, span_notice("You put the [P] around [src]'s neck."))
if(P.tagname && !unique_pet)
fully_replace_character_name(null, "\proper [P.tagname]")
/mob/living/simple_animal/pet/attackby(obj/item/O, mob/user, params)
if(istype(O, /obj/item/clothing/neck/petcollar) && !pcollar)
add_collar(O, user)
return
if(istype(O, /obj/item/newspaper))
if(!stat)
user.visible_message(span_notice("[user] baps [name] on the nose with the rolled up [O]."))
dance_rotate(src)
else
..()
/// Our collar
var/obj/item/clothing/neck/petcollar/collar
/mob/living/simple_animal/pet/Initialize(mapload)
. = ..()
if(pcollar)
pcollar = new(src)
regenerate_icons()
/// Can set the collar var beforehand to start the pet with a collar.
if(collar)
collar = new(src)
update_icon(UPDATE_OVERLAYS)
/mob/living/simple_animal/pet/Destroy()
QDEL_NULL(pcollar)
. = ..()
QDEL_NULL(collar)
QDEL_NULL(access_card)
/mob/living/simple_animal/pet/attackby(obj/item/thing, mob/user, params)
if(istype(thing, /obj/item/clothing/neck/petcollar) && !collar)
add_collar(thing, user)
return TRUE
if(istype(thing, /obj/item/newspaper) && !stat)
user.visible_message(span_notice("[user] baps [name] on the nose with the rolled up [thing]."))
dance_rotate(src)
return TRUE
return ..()
/mob/living/simple_animal/pet/update_overlays()
. = ..()
if(!collar || !collar_icon_state)
return
// Determine which status tag to add to the middle of the icon state.
var/dead_tag = stat == DEAD ? "_dead" : null
var/rest_tag = has_collar_resting_icon_state && resting ? "_rest" : null
var/stat_tag = dead_tag || rest_tag || ""
. += mutable_appearance(icon, "[collar_icon_state][stat_tag]collar")
. += mutable_appearance(icon, "[collar_icon_state][stat_tag]tag")
/mob/living/simple_animal/pet/gib()
if(pcollar)
pcollar.forceMove(drop_location())
pcollar = null
. = ..()
if(access_card)
access_card.forceMove(drop_location())
access_card = null
return ..()
remove_collar(drop_location(), update_visuals = FALSE)
/mob/living/simple_animal/pet/revive(full_heal_flags = NONE, excess_healing = 0, force_grab_ghost = FALSE)
. = ..()
if(!.)
return
if(collar_type)
collar_type = "[initial(collar_type)]"
regenerate_icons()
update_icon(UPDATE_OVERLAYS)
/mob/living/simple_animal/pet/death(gibbed)
. = ..()
if(collar_type)
collar_type = "[initial(collar_type)]_dead"
regenerate_icons()
add_memory_in_range(src, 7, MEMORY_PET_DEAD, list(DETAIL_DEUTERAGONIST = src), story_value = STORY_VALUE_AMAZING, memory_flags = MEMORY_CHECK_BLIND_AND_DEAF) //Protagonist is the person memorizing it
/mob/living/simple_animal/pet/regenerate_icons()
cut_overlays()
if(pcollar && collar_type)
add_overlay("[collar_type]collar")
add_overlay("[collar_type]tag")
/mob/living/simple_animal/pet/handle_atom_del(atom/deleting_atom)
. = ..()
if(deleting_atom != collar)
return
collar = null
if(QDELETED(src))
return
update_icon(UPDATE_OVERLAYS)
/mob/living/simple_animal/pet/update_stat()
. = ..()
update_icon(UPDATE_OVERLAYS)
/mob/living/simple_animal/pet/set_resting(new_resting, silent, instant)
. = ..()
if(!has_collar_resting_icon_state)
return
update_icon(UPDATE_OVERLAYS)
/**
* Add a collar to the pet.
*
* Arguments:
* * new_collar - the collar.
* * user - the user that did it.
*/
/mob/living/simple_animal/pet/proc/add_collar(obj/item/clothing/neck/petcollar/new_collar, mob/user)
if(QDELETED(new_collar) || collar)
return
if(!user.transferItemToLoc(new_collar, src))
return
collar = new_collar
if(collar_icon_state)
update_icon(UPDATE_OVERLAYS)
to_chat(user, span_notice("You put [new_collar] around [src]'s neck."))
if(new_collar.tagname && !unique_pet)
fully_replace_character_name(null, "\proper [new_collar.tagname]")
/**
* Remove the collar from the pet.
*/
/mob/living/simple_animal/pet/proc/remove_collar(atom/new_loc, update_visuals = TRUE)
if(!collar)
return
var/obj/old_collar = collar
collar.forceMove(new_loc)
collar = null
if(collar_icon_state && update_visuals)
update_icon(UPDATE_OVERLAYS)
return old_collar
+2 -2
View File
@@ -264,7 +264,7 @@
for(var/t in bodyparts) //this really should not be necessary
qdel(t)
var/mob/living/simple_animal/pet/dog/corgi/new_corgi = new /mob/living/simple_animal/pet/dog/corgi (loc)
var/mob/living/basic/pet/dog/corgi/new_corgi = new /mob/living/basic/pet/dog/corgi (loc)
new_corgi.set_combat_mode(TRUE)
new_corgi.key = key
@@ -368,7 +368,7 @@
//Good mobs!
if(ispath(MP, /mob/living/simple_animal/pet/cat))
return TRUE
if(ispath(MP, /mob/living/simple_animal/pet/dog/corgi))
if(ispath(MP, /mob/living/basic/pet/dog/corgi))
return TRUE
if(ispath(MP, /mob/living/simple_animal/crab))
return TRUE
@@ -562,7 +562,7 @@
/datum/chemical_reaction/corgium/on_reaction(datum/reagents/holder, datum/equilibrium/reaction, created_volume)
var/location = get_turf(holder.my_atom)
for(var/i in rand(1, created_volume) to created_volume) // More lulz.
new /mob/living/simple_animal/pet/dog/corgi(location)
new /mob/living/basic/pet/dog/corgi(location)
..()
//monkey powder heehoo
+6 -6
View File
@@ -94,7 +94,7 @@
/obj/machinery/rnd/experimentor/Initialize(mapload)
. = ..()
tracked_ian_ref = WEAKREF(locate(/mob/living/simple_animal/pet/dog/corgi/ian) in GLOB.mob_living_list)
tracked_ian_ref = WEAKREF(locate(/mob/living/basic/pet/dog/corgi/ian) in GLOB.mob_living_list)
tracked_runtime_ref = WEAKREF(locate(/mob/living/simple_animal/pet/cat/runtime) in GLOB.mob_living_list)
critical_items_typecache = typecacheof(list(
@@ -498,7 +498,7 @@
tracked_ian.forceMove(loc)
investigate_log("Experimentor has stolen Ian!", INVESTIGATE_EXPERIMENTOR) //...if anyone ever fixes it...
else
new /mob/living/simple_animal/pet/dog/corgi(loc)
new /mob/living/basic/pet/dog/corgi(loc)
investigate_log("Experimentor has spawned a new corgi.", INVESTIGATE_EXPERIMENTOR)
ejectItem(TRUE)
if(globalMalf > 36 && globalMalf < 50)
@@ -616,8 +616,8 @@
/obj/item/relic/proc/corgicannon(mob/user)
playsound(src, SFX_SPARKS, rand(25,50), TRUE, SHORT_RANGE_SOUND_EXTRARANGE)
var/mob/living/simple_animal/pet/dog/corgi/C = new/mob/living/simple_animal/pet/dog/corgi(get_turf(user))
C.throw_at(pick(oview(10,user)), 10, rand(3,8), callback = CALLBACK(src, PROC_REF(throwSmoke), C))
var/mob/living/basic/pet/dog/corgi/sad_corgi = new(get_turf(user))
sad_corgi.throw_at(pick(oview(10,user)), 10, rand(3,8), callback = CALLBACK(src, PROC_REF(throwSmoke), sad_corgi))
warn_admins(user, "Corgi Cannon", 0)
/obj/item/relic/proc/clean(mob/user)
@@ -642,12 +642,12 @@
/mob/living/simple_animal/parrot/natural,
/mob/living/simple_animal/butterfly,
/mob/living/simple_animal/pet/cat,
/mob/living/simple_animal/pet/dog/corgi,
/mob/living/basic/pet/dog/corgi,
/mob/living/basic/pet/dog/pug,
/mob/living/simple_animal/crab,
/mob/living/simple_animal/pet/fox,
/mob/living/simple_animal/hostile/lizard,
/mob/living/basic/mouse,
/mob/living/simple_animal/pet/dog/pug,
/mob/living/simple_animal/hostile/bear,
/mob/living/simple_animal/hostile/bee,
/mob/living/simple_animal/hostile/carp,
@@ -38,7 +38,7 @@ Slimecrossing Mobs
return
//Slime corgi - Chilling Pink
/mob/living/simple_animal/pet/dog/corgi/puppy/slime
/mob/living/basic/pet/dog/corgi/puppy/slime
name = "\improper slime corgi puppy"
real_name = "slime corgi puppy"
desc = "An unbearably cute pink slime corgi puppy."
@@ -48,5 +48,8 @@ Slimecrossing Mobs
nofur = TRUE
gold_core_spawnable = NO_SPAWN
speak_emote = list("blorbles", "bubbles", "borks")
emote_hear = list("bubbles!", "splorts.", "splops!")
emote_see = list("gets goop everywhere.", "flops.", "jiggles!")
/mob/living/basic/pet/dog/corgi/puppy/slime/update_dog_speech(datum/ai_planning_subtree/random_speech/speech)
speech.speak = string_list(list())
speech.emote_hear = string_list(list("bubbles!", "splorts.", "splops!"))
speech.emote_see = string_list(list("gets goop everywhere.", "flops.", "jiggles!"))
@@ -269,7 +269,7 @@ Chilling extracts:
/obj/item/slimecross/chilling/pink/do_effect(mob/user)
user.visible_message(span_notice("[src] cracks like an egg, and an adorable puppy comes tumbling out!"))
new /mob/living/simple_animal/pet/dog/corgi/puppy/slime(get_turf(user))
new /mob/living/basic/pet/dog/corgi/puppy/slime(get_turf(user))
..()
/obj/item/slimecross/chilling/gold
@@ -128,7 +128,7 @@
/datum/reagent/consumable/coco = -2)
virus_suspectibility = 1
resulting_atoms = list(/mob/living/simple_animal/pet/dog/corgi = 1)
resulting_atoms = list(/mob/living/basic/pet/dog/corgi = 1)
/datum/micro_organism/cell_line/pug
desc = "Squat canid cells"
@@ -146,7 +146,7 @@
/datum/reagent/consumable/coco = -2)
virus_suspectibility = 3
resulting_atoms = list(/mob/living/simple_animal/pet/dog/pug = 1)
resulting_atoms = list(/mob/living/basic/pet/dog/pug = 1)
/datum/micro_organism/cell_line/bear //bears can't really compete directly with more powerful creatures, so i made it possible to grow them real fast.
desc = "Ursine cells"
@@ -12,7 +12,7 @@
possible_shapes = list(
/mob/living/basic/mouse,
/mob/living/simple_animal/pet/dog/corgi,
/mob/living/basic/pet/dog/corgi,
/mob/living/simple_animal/hostile/carp/ranged/chaos,
/mob/living/simple_animal/bot/secbot/ed209,
/mob/living/simple_animal/hostile/giant_spider/viper/wizard,
+1 -2
View File
@@ -5,9 +5,8 @@
/datum/unit_test/actions_moved_on_mind_transfer
/datum/unit_test/actions_moved_on_mind_transfer/Run()
var/mob/living/carbon/human/wizard = allocate(/mob/living/carbon/human/consistent)
var/mob/living/simple_animal/pet/dog/corgi/wizard_dog = allocate(/mob/living/simple_animal/pet/dog/corgi)
var/mob/living/basic/pet/dog/corgi/wizard_dog = allocate(/mob/living/basic/pet/dog/corgi)
wizard.mind_initialize()
var/datum/action/cooldown/spell/pointed/projectile/fireball/fireball = new(wizard.mind)
@@ -356,20 +356,6 @@
/mob/living/simple_animal/pet/cat/original,
/mob/living/simple_animal/pet/cat/runtime,
/mob/living/simple_animal/pet/cat/space,
/mob/living/simple_animal/pet/dog,
/mob/living/simple_animal/pet/dog/breaddog,
/mob/living/simple_animal/pet/dog/bullterrier,
/mob/living/simple_animal/pet/dog/corgi,
/mob/living/simple_animal/pet/dog/corgi/exoticcorgi,
/mob/living/simple_animal/pet/dog/corgi/ian,
/mob/living/simple_animal/pet/dog/corgi/lisa,
/mob/living/simple_animal/pet/dog/corgi/narsie,
/mob/living/simple_animal/pet/dog/corgi/puppy,
/mob/living/simple_animal/pet/dog/corgi/puppy/ian,
/mob/living/simple_animal/pet/dog/corgi/puppy/slime,
/mob/living/simple_animal/pet/dog/corgi/puppy/void,
/mob/living/simple_animal/pet/dog/pug,
/mob/living/simple_animal/pet/dog/pug/mcgriff,
/mob/living/simple_animal/pet/fox,
/mob/living/simple_animal/pet/fox/renault,
/mob/living/simple_animal/pet/gondola,
@@ -497,10 +483,6 @@
/mob/living/simple_animal/hostile/zombie/cheesezombie,
/mob/living/simple_animal/hostile/zombie/nocorpse,
/mob/living/simple_animal/pet/bumbles,
/mob/living/simple_animal/pet/dog/corgi/borgi,
/mob/living/simple_animal/pet/dog/dobermann,
/mob/living/simple_animal/pet/dog/dobermann/walter,
/mob/living/simple_animal/pet/dog/markus,
/mob/living/simple_animal/pet/gondola/funky,
/mob/living/simple_animal/pet/poppy,
+1 -1
View File
@@ -59,5 +59,5 @@
ADD_TRAIT(rouny, TRAIT_PRESERVE_UI_WITHOUT_CLIENT, TRAIT_SOURCE_UNIT_TESTS)
TEST_ASSERT_EQUAL(strip_menu.ui_status(rouny, ui_state), UI_INTERACTIVE, "Being within range as a xeno was not interactive.")
var/mob/living/simple_animal/pet/dog/corgi/corgi = allocate(/mob/living/simple_animal/pet/dog/corgi, run_loc_floor_bottom_left)
var/mob/living/basic/pet/dog/corgi/corgi = allocate(/mob/living/basic/pet/dog/corgi, run_loc_floor_bottom_left)
TEST_ASSERT_EQUAL(strip_menu.ui_status(corgi, ui_state), UI_UPDATE, "Being within range as a corgi was not update-only.")
@@ -2,8 +2,8 @@
/datum/traitor_objective/kill_pet
possible_heads = list(
JOB_HEAD_OF_PERSONNEL = list(
/mob/living/simple_animal/pet/dog/corgi/ian,
/mob/living/simple_animal/pet/dog/corgi/puppy/ian
/mob/living/basic/pet/dog/corgi/ian,
/mob/living/basic/pet/dog/corgi/puppy/ian
),
JOB_CAPTAIN = /mob/living/simple_animal/pet/fox/renault,
JOB_CHIEF_MEDICAL_OFFICER = /mob/living/simple_animal/pet/cat/runtime,
@@ -15,7 +15,7 @@
),
// Non-heads like the warden, these are automatically medium-risk at minimum
// They are also the only two modular additions so far
JOB_ROBOTICIST = /mob/living/simple_animal/pet/dog/corgi/borgi,
JOB_ROBOTICIST = /mob/living/basic/pet/dog/corgi/borgi,
JOB_STATION_ENGINEER = /mob/living/simple_animal/pet/poppy,
)
@@ -43,7 +43,7 @@
succeed_signals = list(COMSIG_PARENT_QDELETING)) // Until dusting gets its own component, this has to make do
// Emag E-N so it overloads
if(istype(target_pet, /mob/living/simple_animal/pet/dog/corgi/borgi))
if(istype(target_pet, /mob/living/basic/pet/dog/corgi/borgi))
name = "Emag the roboticist's most-prized borgi, E-N"
description = "We received an untracable contract from someone addressed 'ianfan2489@solfed.nt', they want the robotic clone of Ian dead- and it has to be dramatic. We will supply you with a cryptographic sequencer from our basic loadout options to shortcircuit E-N's safety, it will give you a single attempt to use it. Oh, and remember to run like hell when you do... "
telecrystal_reward = 3 // Because these are more complicated than 'kill the pet', the reward is bigger
@@ -88,7 +88,7 @@
// Handle the UI button, this is currently just generated by a modular objective
/datum/traitor_objective/kill_pet/generate_ui_buttons(mob/user)
var/list/buttons = list()
if(istype(target_pet, /mob/living/simple_animal/pet/dog/corgi/borgi)) // Target has to be E-N
if(istype(target_pet, /mob/living/basic/pet/dog/corgi/borgi)) // Target has to be E-N
if(!one_shot_emag)
buttons += add_ui_button("", "Pressing this will materialize a single-use cryptographic sequencer in your hand, which you can use to shortcircuit E-N.", "bolt", "summon_emag")
return buttons
@@ -1,4 +1,4 @@
/mob/living/simple_animal/pet/dog/markus
/mob/living/basic/pet/dog/markus
name = "\proper Markus"
real_name = "Markus"
gender = MALE
@@ -7,14 +7,20 @@
icon_state = "markus"
icon_dead = "markus_dead"
icon_living = "markus"
speak = list("Borf!", "Boof!", "Bork!", "Bowwow!", "Burg?")
var/static/list/markus_speak = list("Borf!", "Boof!", "Bork!", "Bowwow!", "Burg?")
butcher_results = list(/obj/item/food/burger/cheese = 1, /obj/item/food/meat/slab = 2, /obj/item/trash/syndi_cakes = 1)
animal_species = /mob/living/simple_animal/pet/dog
ai_controller = /datum/ai_controller/dog/corgi
gender = MALE
can_be_held = FALSE
gold_core_spawnable = FRIENDLY_SPAWN
/mob/living/simple_animal/pet/dog/markus/treat_message(message)
return client ? pick(speak) : message // markus only talks business
/mob/living/basic/pet/dog/markus/treat_message(message)
return client ? pick(markus_speak) : message // markus only talks business
/mob/living/basic/pet/dog/markus/update_dog_speech(datum/ai_planning_subtree/random_speech/speech)
. = ..()
speech.speak = markus_speak
/datum/chemical_reaction/mark_reaction
results = list(/datum/reagent/liquidgibs = 15)
@@ -32,10 +38,10 @@
/datum/chemical_reaction/mark_reaction/on_reaction(datum/reagents/holder, datum/equilibrium/reaction, created_volume)
. = ..()
var/location = get_turf(holder.my_atom)
new /mob/living/simple_animal/pet/dog/markus(location)
new /mob/living/basic/pet/dog/markus(location)
playsound(location, 'modular_skyrat/master_files/sound/effects/dorime.ogg', 100, 0, 7)
/mob/living/simple_animal/pet/dog/corgi/borgi
/mob/living/basic/pet/dog/corgi/borgi
name = "E-N"
real_name = "E-N" // Intended to hold the name without altering it.
gender = NEUTER
@@ -48,17 +54,12 @@
can_be_held = FALSE
maxHealth = 150
health = 150
var/emagged = 0
turns_per_move = 10
stop_automated_movement = 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
loot = list(/obj/effect/decal/cleanable/oil/slippery)
butcher_results = list(/obj/item/clothing/head/corgi/en = 1, /obj/item/clothing/suit/corgisuit/en = 1)
death_message = "beeps, its mechanical parts hissing before the chassis collapses in a loud thud."
gold_core_spawnable = NO_SPAWN
animal_species = /mob/living/simple_animal/pet/dog/corgi
nofur = TRUE
ai_controller = /datum/ai_controller/dog/borgi
// These lights enable when E-N is emagged
light_system = MOVABLE_LIGHT_DIRECTIONAL
light_color = COLOR_RED
@@ -66,8 +67,17 @@
light_power = 0.8
light_on = FALSE
/mob/living/simple_animal/pet/dog/corgi/borgi/Initialize(mapload)
var/emagged = 0
/mob/living/basic/pet/dog/corgi/borgi/Initialize(mapload)
. = ..()
RemoveElement(/datum/element/atmos_requirements)
RemoveElement(/datum/element/basic_body_temp_sensitive)
AddElement(/datum/element/basic_body_temp_sensitive, min_body_temp = 0)
var/static/list/borgi_drops = list(/obj/effect/decal/cleanable/oil/slippery)
AddElement(/datum/element/death_drops, borgi_drops)
var/datum/component/overlay_lighting/lighting_object = src.GetComponent(/datum/component/overlay_lighting)
var/image/cone = lighting_object.cone
cone.transform = cone.transform.Translate(0, -8)
@@ -79,55 +89,78 @@
// For traitor objectives
RegisterSignal(src, COMSIG_ATOM_EMAG_ACT, PROC_REF(on_emag_act))
/mob/living/simple_animal/pet/dog/corgi/borgi/proc/on_attack_hand(datum/source, mob/living/target)
if(target.combat_mode && health > 0)
shootAt(target)
var/datum/ai_controller/dog/EN = ai_controller
if(health <= 30 && !(WEAKREF(target) in EN.blackboard[BB_DOG_FRIENDS]))
EN.current_movement_target = target
EN.blackboard[BB_DOG_HARASS_TARGET] = WEAKREF(target)
EN.current_behaviors += GET_AI_BEHAVIOR(/datum/ai_behavior/harass)
/**
* Try to harass a target, considering if they are a friend.
*
* Arguments:
* * target - the target to harrass
* * always_shoot - always shoot the target, as opposed to only if not a friend.
*/
/mob/living/basic/pet/dog/corgi/borgi/proc/harass_target(mob/living/target, always_shoot = FALSE)
var/datum/ai_controller/dog/EN = ai_controller
if(!EN)
return
/mob/living/simple_animal/pet/dog/corgi/borgi/proc/on_attackby(datum/source, obj/item/used_item, mob/living/target)
if(used_item.force && used_item.damtype != STAMINA && health > 0)
shootAt(target)
var/datum/ai_controller/dog/EN = ai_controller
if(health <= 30 && !(WEAKREF(target) in EN.blackboard[BB_DOG_FRIENDS]))
EN.current_movement_target = target
EN.blackboard[BB_DOG_HARASS_TARGET] = WEAKREF(target)
EN.current_behaviors += GET_AI_BEHAVIOR(/datum/ai_behavior/harass)
var/is_friend = EN.blackboard[BB_DOG_FRIENDS][WEAKREF(target)]
/mob/living/simple_animal/pet/dog/corgi/borgi/proc/on_hitby(datum/source, atom/movable/AM)
if(istype(AM, /obj/item))
var/obj/item/used_item = AM
var/mob/thrown_by = used_item.thrownby?.resolve()
if(used_item.throwforce >= 5 && ishuman(thrown_by) && health > 0)
var/mob/living/carbon/human/target = thrown_by
var/datum/ai_controller/dog/EN = ai_controller
if(!(WEAKREF(target) in EN.blackboard[BB_DOG_FRIENDS]))
shootAt(target)
if(health <= 30)
EN.current_movement_target = target
EN.blackboard[BB_DOG_HARASS_TARGET] = WEAKREF(target)
EN.current_behaviors += GET_AI_BEHAVIOR(/datum/ai_behavior/harass)
if(always_shoot || !is_friend)
INVOKE_ASYNC(src, PROC_REF(shoot_at), target)
/mob/living/simple_animal/pet/dog/corgi/borgi/bullet_act(obj/projectile/proj)
if(istype(proj, /obj/projectile/beam) || istype(proj, /obj/projectile/bullet))
var/mob/living/carbon/human/target = proj.firer
if(!proj.nodamage && proj.damage >= 10)
if((proj.damage_type == BRUTE || proj.damage_type == BURN))
adjustBruteLoss(proj.damage)
if(isliving(target) && health > 0)
shootAt(target)
var/datum/ai_controller/dog/EN = ai_controller
EN.current_movement_target = target
EN.blackboard[BB_DOG_HARASS_TARGET] = WEAKREF(target)
EN.current_behaviors += GET_AI_BEHAVIOR(/datum/ai_behavior/harass)
else
shootToyAt(target)
return BULLET_ACT_HIT
if(health > 30 || is_friend)
return
/mob/living/simple_animal/pet/dog/corgi/borgi/proc/shootAt(atom/movable/target)
EN.set_movement_target(target)
EN.blackboard[BB_DOG_HARASS_TARGET] = WEAKREF(target)
EN.queue_behavior(/datum/ai_behavior/harass)
/mob/living/basic/pet/dog/corgi/borgi/proc/on_attack_hand(datum/source, mob/living/target)
SIGNAL_HANDLER
if(!target.combat_mode || health <= 0)
return
harass_target(target, always_shoot = TRUE)
/mob/living/basic/pet/dog/corgi/borgi/proc/on_attackby(datum/source, obj/item/used_item, mob/living/target)
SIGNAL_HANDLER
if(!used_item.force || used_item.damtype == STAMINA || health <= 0)
return
harass_target(target, always_shoot = TRUE)
/mob/living/basic/pet/dog/corgi/borgi/proc/on_hitby(datum/source, obj/item/used_item)
SIGNAL_HANDLER
if(!istype(used_item) || used_item.throwforce < 5 || health <= 0)
return
var/mob/living/carbon/human/thrown_by = used_item.thrownby?.resolve()
if(!ishuman(thrown_by))
return
harass_target(thrown_by)
/mob/living/basic/pet/dog/corgi/borgi/bullet_act(obj/projectile/proj)
. = ..()
if(!istype(proj, /obj/projectile/beam) && !istype(proj, /obj/projectile/bullet))
return
var/mob/living/carbon/human/target = proj.firer
if(!proj.nodamage && proj.damage >= 10)
if(proj.damage_type != BRUTE && proj.damage_type != BURN)
return
adjustBruteLoss(proj.damage)
if(!isliving(target) || health <= 0)
return
harass_target(target)
else
shoot_toy_at(target)
/mob/living/basic/pet/dog/corgi/borgi/proc/shoot_at(atom/movable/target)
var/turf/source_turf = get_turf(src)
var/turf/target_turf = get_turf(target)
if(!source_turf || !target_turf)
@@ -141,7 +174,7 @@
laser.fired_from = src
laser.fire()
/mob/living/simple_animal/pet/dog/corgi/borgi/proc/shootToyAt(atom/movable/target)
/mob/living/basic/pet/dog/corgi/borgi/proc/shoot_toy_at(atom/movable/target)
var/turf/source_turf = get_turf(src)
var/turf/target_turf = get_turf(target)
if(!source_turf || !target_turf)
@@ -155,19 +188,14 @@
fired_dart.fired_from = src
fired_dart.fire()
/mob/living/simple_animal/pet/dog/corgi/borgi/Life(seconds, times_fired)
..()
/mob/living/basic/pet/dog/corgi/borgi/Life(seconds, times_fired)
. = ..()
// spark for no reason
if(prob(5))
do_sparks(3, 1, src)
/mob/living/simple_animal/pet/dog/corgi/borgi/handle_automated_action()
if(emagged && prob(33))
var/mob/living/carbon/target = locate() in view(10, src)
if(target)
shootAt(target)
/mob/living/simple_animal/pet/dog/corgi/borgi/death(gibbed)
/mob/living/basic/pet/dog/corgi/borgi/death(gibbed)
// Only execute the below if we successfully died
. = ..(gibbed)
if(!.)
@@ -182,31 +210,105 @@
var/datum/ai_controller/dog/EN = ai_controller
LAZYCLEARLIST(EN.current_behaviors)
/mob/living/simple_animal/pet/dog/corgi/borgi/proc/on_emag_act(mob/living/simple_animal/pet/dog/target, mob/user)
if(!emagged)
emagged = 1
/mob/living/basic/pet/dog/corgi/borgi/proc/on_emag_act(mob/living/basic/pet/dog/target, mob/user)
SIGNAL_HANDLER
emote("exclaim")
set_light_on(TRUE)
if(emagged)
return
add_fingerprint(user, TRUE)
investigate_log("has been gibbed due to being emagged by [user].", INVESTIGATE_DEATHS)
visible_message(span_boldwarning("[user] swipes a card through [target]!"), span_notice("You overload [target]s internal reactor..."))
emagged = 1
notify_ghosts("[user] has shortcircuited [target] to explode in 60 seconds!", source = target, action = NOTIFY_ORBIT, flashwindow = FALSE, header = "Borgi Emagged")
addtimer(CALLBACK(src, PROC_REF(explode_imminent)), 50 SECONDS)
// Emote sleeps.
INVOKE_ASYNC(src, PROC_REF(emote), "exclaim")
set_light_on(TRUE)
/mob/living/simple_animal/pet/dog/corgi/borgi/proc/explode_imminent()
add_fingerprint(user, TRUE)
investigate_log("has been gibbed due to being emagged by [user].", INVESTIGATE_DEATHS)
visible_message(span_boldwarning("[user] swipes a card through [target]!"), span_notice("You overload [target]s internal reactor..."))
notify_ghosts("[user] has shortcircuited [target] to explode in 60 seconds!", source = target, action = NOTIFY_ORBIT, flashwindow = FALSE, header = "Borgi Emagged")
addtimer(CALLBACK(src, PROC_REF(explode_imminent)), 50 SECONDS)
/mob/living/basic/pet/dog/corgi/borgi/proc/explode_imminent()
visible_message(span_bolddanger("[src] makes an odd whining noise!"))
do_jitter_animation(30)
addtimer(CALLBACK(src, PROC_REF(explode)), 10 SECONDS)
/mob/living/simple_animal/pet/dog/corgi/borgi/proc/explode()
/mob/living/basic/pet/dog/corgi/borgi/proc/explode()
explosion(get_turf(src), 1, 2, 4, 4, 6) // Should this be changed?
gib() // Yuck, robo-blood
/mob/living/simple_animal/pet/dog/dobermann
/// Dog controller but with emag attack support
/datum/ai_controller/dog/borgi
blackboard = list(
BB_SIMPLE_CARRY_ITEM = null,
BB_FETCH_TARGET = null,
BB_FETCH_DELIVER_TO = null,
BB_DOG_FRIENDS = list(),
BB_FETCH_IGNORE_LIST = list(),
BB_DOG_ORDER_MODE = DOG_COMMAND_NONE,
BB_DOG_PLAYING_DEAD = FALSE,
BB_DOG_HARASS_TARGET = null,
BB_DOG_HARASS_FRUSTRATION = null,
BB_VISION_RANGE = AI_DOG_VISION_RANGE,
BB_DOG_IS_SLOW = TRUE,
BB_TARGETTING_DATUM = new /datum/targetting_datum/basic(),
)
planning_subtrees = list(
/datum/ai_planning_subtree/emagged_borgi,
/datum/ai_planning_subtree/random_speech/dog,
/datum/ai_planning_subtree/dog,
)
/// Subtree that schedules borgi to randomly shoot if they're emagged.
/datum/ai_planning_subtree/emagged_borgi
/// Probability that emagged borgi will randomly attack.
var/chance = 33
/// Range to immediately target enemies
var/view_range = 10
/datum/ai_planning_subtree/emagged_borgi/SelectBehaviors(datum/ai_controller/controller, delta_time)
. = ..()
// Emagged borgi?
var/mob/living/basic/pet/dog/corgi/borgi/borgi_pawn = controller.pawn
if(!istype(borgi_pawn) || !borgi_pawn.emagged)
return
// Target if not already targetted and prob check passes.
var/datum/weakref/weak_target = controller.blackboard[BB_BASIC_MOB_CURRENT_TARGET]
var/atom/target = weak_target?.resolve()
if(QDELETED(target))
if(!DT_PROB(chance, delta_time))
return
controller.queue_behavior(/datum/ai_behavior/find_potential_targets, BB_BASIC_MOB_CURRENT_TARGET, BB_TARGETTING_DATUM, BB_BASIC_MOB_CURRENT_TARGET_HIDING_LOCATION)
return
// Attack.
controller.queue_behavior(/datum/ai_behavior/emagged_borgi_attack, BB_BASIC_MOB_CURRENT_TARGET)
return SUBTREE_RETURN_FINISH_PLANNING
/**
* Shoot a random target.
*/
/datum/ai_behavior/emagged_borgi_attack
action_cooldown = 3 SECONDS
/datum/ai_behavior/emagged_borgi_attack/perform(delta_time, datum/ai_controller/controller, target_key)
var/atom/target = controller.blackboard[target_key]
if(QDELETED(target))
return
var/mob/living/basic/pet/dog/corgi/borgi/borgi_pawn = controller.pawn
if(!istype(borgi_pawn))
return
borgi_pawn.shoot_at(target)
/mob/living/basic/pet/dog/dobermann
name = "\proper Dobermann"
gender = MALE
desc = "A larger breed of dog."
@@ -214,4 +316,3 @@
icon_state = "dobber"
icon_dead = "dobbydead"
icon_living = "dobber"
@@ -1,7 +1,7 @@
// Pets
/datum/area_spawn/markus
target_areas = list(/area/station/cargo/sorting, /area/station/cargo/storage, /area/station/cargo/office, /area/station/command/heads_quarters/qm)
desired_atom = /mob/living/simple_animal/pet/dog/markus
desired_atom = /mob/living/basic/pet/dog/markus
/datum/area_spawn/bumbles
target_areas = list(/area/station/service/hydroponics, /area/station/service/hydroponics/upper)
@@ -9,7 +9,7 @@
/datum/area_spawn/borgi
target_areas = list(/area/station/science/robotics, /area/station/science/robotics/mechbay, /area/station/science/robotics/lab)
desired_atom = /mob/living/simple_animal/pet/dog/corgi/borgi
desired_atom = /mob/living/basic/pet/dog/corgi/borgi
/datum/area_spawn/poppy
target_areas = list(/area/station/engineering/main, /area/station/engineering/break_room, /area/station/engineering/lobby, /area/station/engineering/supermatter/room)
@@ -23,7 +23,8 @@
/mob/living/basic/banana_spider/Initialize(mapload)
. = ..()
AddComponent(/datum/component/slippery, 40)
AddElement(/datum/element/death_drops, list(/obj/item/food/deadbanana_spider))
var/static/list/banana_drops = list(/obj/item/food/deadbanana_spider)
AddElement(/datum/element/death_drops, banana_drops)
AddElement(/datum/element/basic_body_temp_sensitive, 270, INFINITY)
AddComponent(/datum/component/squashable, squash_chance = 50, squash_damage = 1)
+49 -34
View File
@@ -2,53 +2,68 @@
#define RESTING_STATE_SIT 1
#define RESTING_STATE_REST 2
/mob/living/simple_animal/pet/dog/corgi/ian
/mob/living/basic/pet/dog/corgi/ian
icon = 'modular_skyrat/modules/chadian/icons/ian.dmi'
ai_controller = /datum/ai_controller/dog/corgi/chadian
var/resting_state = 0
var/old = FALSE
/mob/living/simple_animal/pet/dog/corgi/ian/Life(delta_time = SSMOBS_DT, times_fired)
if(!stat && SSticker.current_state == GAME_STATE_FINISHED && !memory_saved)
Write_Memory(FALSE)
memory_saved = TRUE
if(!stat && !buckled && !client && !inventory_head && !inventory_back)
if(DT_PROB(0.5, delta_time))
manual_emote(pick("flops forward laying flat.", "wags [p_their()] tail.", "lies down."))
set_rest_state(RESTING_STATE_REST)
else if(DT_PROB(0.5, delta_time))
manual_emote(pick("sits down.", "crouches on [p_their()] hind legs.", "looks alert."))
set_rest_state(RESTING_STATE_SIT)
else if(DT_PROB(0.5, delta_time))
if (resting_state)
manual_emote(pick("gets up and barks.", "walks around.", "stops resting."))
set_rest_state(RESTING_STATE_NONE)
else
manual_emote(pick("grooms [p_their()] fur.", "twitches [p_their()] ears.", "shakes [p_their()] fur."))
..()
/// AI controller that adds chad ian emotes
/datum/ai_controller/dog/corgi/chadian
idle_behavior = /datum/idle_behavior/idle_dog/chadian
/mob/living/simple_animal/pet/dog/corgi/ian/Moved(atom/old_loc, movement_dir, forced, list/old_locs, momentum_change = TRUE)
/// Actual idle behavior that adds chad ian emotes
/datum/idle_behavior/idle_dog/chadian/perform_idle_behavior(delta_time, datum/ai_controller/dog/controller)
. = ..()
var/mob/living/basic/pet/dog/corgi/ian/ian_pawn = controller.pawn
if(ian_pawn.buckled || ian_pawn.pulledby || ian_pawn.inventory_head || ian_pawn.inventory_back)
return
if(DT_PROB(0.5, delta_time))
ian_pawn.manual_emote(pick("flops forward laying flat.", "wags [p_their()] tail.", "lies down."))
ian_pawn.set_rest_state(RESTING_STATE_REST)
else if(DT_PROB(0.5, delta_time))
ian_pawn.manual_emote(pick("sits down.", "crouches on [p_their()] hind legs.", "looks alert."))
ian_pawn.set_rest_state(RESTING_STATE_SIT)
else if(DT_PROB(0.5, delta_time))
if (ian_pawn.resting_state)
ian_pawn.manual_emote(pick("gets up and barks.", "walks around.", "stops resting."))
ian_pawn.set_rest_state(RESTING_STATE_NONE)
else
ian_pawn.manual_emote(pick("grooms [p_their()] fur.", "twitches [p_their()] ears.", "shakes [p_their()] fur."))
/mob/living/basic/pet/dog/corgi/ian/Moved(atom/old_loc, movement_dir, forced, list/old_locs, momentum_change = TRUE)
. = ..()
if(resting_state)
manual_emote(pick("gets up and barks.", "walks around.", "stops resting."))
set_rest_state(RESTING_STATE_NONE)
/mob/living/simple_animal/pet/dog/corgi/ian/proc/set_rest_state(state)
/mob/living/basic/pet/dog/corgi/ian/proc/set_rest_state(state)
resting_state = state
update_icons()
/mob/living/simple_animal/pet/dog/corgi/ian/update_icons()
/mob/living/basic/pet/dog/corgi/ian/update_icons()
. = ..()
if(old && !stat)
// Dead
if(stat)
icon_state = "[initial(icon_state)][is_slow ? "_old" : ""][shaved ? "_shaved" : ""]_dead"
return
// Wheelchair
if(is_slow)
icon_state = "[initial(icon_state)]_old[shaved ? "_shaved" : ""]"
else if(!stat)
switch(resting_state)
if(RESTING_STATE_NONE)
icon_state = initial(icon_state)
if(RESTING_STATE_SIT)
icon_state = "[initial(icon_state)]_sit[shaved ? "_shaved" : ""]"
if(RESTING_STATE_REST)
icon_state = "[initial(icon_state)]_rest[shaved ? "_shaved" : ""]"
else
icon_state = icon_dead
return
switch(resting_state)
if(RESTING_STATE_NONE)
icon_state = initial(icon_state)
if(RESTING_STATE_SIT)
icon_state = "[initial(icon_state)]_sit[shaved ? "_shaved" : ""]"
if(RESTING_STATE_REST)
icon_state = "[initial(icon_state)]_rest[shaved ? "_shaved" : ""]"
#undef RESTING_STATE_NONE
#undef RESTING_STATE_SIT
Binary file not shown.

Before

Width:  |  Height:  |  Size: 5.1 KiB

After

Width:  |  Height:  |  Size: 17 KiB

@@ -71,7 +71,7 @@
desc = "Gondola is the silent walker. Having no hands he embodies the Taoist principle of wu-wei (non-action) while his smiling facial expression shows his utter and complete acceptance of the world as it is. Its hide is extremely valuable. This one seems a little skinny and attached to the Theater."
loot = list(/obj/effect/decal/cleanable/blood/gibs)
/mob/living/simple_animal/pet/dog/dobermann/walter
/mob/living/basic/pet/dog/dobermann/walter
name = "Walter"
real_name = "Walter"
desc = "It's Walter, he bites criminals just as well as he bites toddlers."
+4 -1
View File
@@ -781,6 +781,8 @@
#include "code\datums\ai\_ai_planning_subtree.dm"
#include "code\datums\ai\_item_behaviors.dm"
#include "code\datums\ai\telegraph_effects.dm"
#include "code\datums\ai\babies\babies_behaviors.dm"
#include "code\datums\ai\babies\babies_subtrees.dm"
#include "code\datums\ai\bane\bane_behaviors.dm"
#include "code\datums\ai\bane\bane_controller.dm"
#include "code\datums\ai\bane\bane_subtrees.dm"
@@ -3676,6 +3678,8 @@
#include "code\modules\mob\living\basic\lavaland\bileworm\bileworm_instrument.dm"
#include "code\modules\mob\living\basic\lavaland\bileworm\bileworm_loot.dm"
#include "code\modules\mob\living\basic\lavaland\bileworm\bileworm_vileworm.dm"
#include "code\modules\mob\living\basic\pets\dog.dm"
#include "code\modules\mob\living\basic\pets\pet.dm"
#include "code\modules\mob\living\basic\ruin_defender\stickman.dm"
#include "code\modules\mob\living\basic\vermin\axolotl.dm"
#include "code\modules\mob\living\basic\vermin\cockroach.dm"
@@ -3847,7 +3851,6 @@
#include "code\modules\mob\living\simple_animal\friendly\butterfly.dm"
#include "code\modules\mob\living\simple_animal\friendly\cat.dm"
#include "code\modules\mob\living\simple_animal\friendly\crab.dm"
#include "code\modules\mob\living\simple_animal\friendly\dog.dm"
#include "code\modules\mob\living\simple_animal\friendly\farm_animals.dm"
#include "code\modules\mob\living\simple_animal\friendly\fox.dm"
#include "code\modules\mob\living\simple_animal\friendly\gondola.dm"
+1 -1
View File
@@ -105,7 +105,7 @@ const SLOTS: Record<
image: 'inventory-mask.png',
},
corgi_collar: {
pet_collar: {
displayName: 'collar',
gridSpot: getGridSpotKey([1, 2]),
image: 'inventory-collar.png',
+1
View File
@@ -0,0 +1 @@
/mob/living/simple_animal/pet/dog/@SUBTYPES : /mob/living/basic/pet/dog/@SUBTYPES {@OLD}