Frankenstein Station 13: Introducing dissections and alien organs to xenobiology (#29093)
* ddsadsa ddsadsa * moderate again * revert * beginning with rebase * organssssssssss * organs now process! * analyzer finished! + mapping * tool bit implementation and quality * organs and fixes and reworks * more organ work * more organs done * more organ progress! * more organ work * MORE. ORGANS. * temp * more organsssss * ITS DONE!!!!!!!! * oops * also oops * linter stuff * forgot this + oops * linter * i forgot to save! * lots of improvements and tweaks * move icon over * icon tweaks * icon mistake * oops * dumb * more icon validations * i think thisll fix it? * Apply suggestions from code review Co-authored-by: PollardTheDragon <144391971+PollardTheDragon@users.noreply.github.com> Signed-off-by: Kyani <65205627+EmeraldCandy@users.noreply.github.com> * fixes * fixes+tweaks * fix * oops * linter * i didnt save.... * this should give -some- warning * forgot a span * Apply suggestions from code review Co-authored-by: 1080pCat <96908085+1080pCat@users.noreply.github.com> Signed-off-by: Kyani <65205627+EmeraldCandy@users.noreply.github.com> * Apply suggestions from code review Co-authored-by: 1080pCat <96908085+1080pCat@users.noreply.github.com> Signed-off-by: Kyani <65205627+EmeraldCandy@users.noreply.github.com> * beginning edits * more fixed and tweaks with cooldowns * Apply suggestions from code review Co-authored-by: Luc <89928798+lewcc@users.noreply.github.com> Signed-off-by: Kyani <65205627+EmeraldCandy@users.noreply.github.com> * lots of tweaks * more review changes * comment change * Apply suggestions from code review Co-authored-by: Luc <89928798+lewcc@users.noreply.github.com> Signed-off-by: Kyani <65205627+EmeraldCandy@users.noreply.github.com> * returns start back to gland * Apply suggestions from code review Co-authored-by: 1080pCat <96908085+1080pCat@users.noreply.github.com> Signed-off-by: Kyani <65205627+EmeraldCandy@users.noreply.github.com> * code review fixes * trying to make surgery work.... * might as well push this * perfection. now i need text * text + small tweaks and bugfixing * linting * forgot to implement this * deconflicting maps * modifying for xenos again * i guess this wasnt needed??? * added surgical belts to xeno * minor swap * quick fix * small tweaks * small tweak * tiny tweak * some slime updates * more tweaks * more updates * first batch of fixes * hiero audio fix * robotic fauna fixes * more rounds of bugfixes * prevents teleporting * tiny fix * makes sharp more common * misc fixes * surgery and revenant fixes + extractor * adds cursed organ logging * small bananium organ tweak * actually gives teleporter access * adds a message to the analyzer * can now drag naughts * slime behavior tweaks * headslug tweak, cant eat organs * Update code/datums/components/special_tastes.dm Co-authored-by: warriorstar-orion <orion@snowfrost.garden> Signed-off-by: Kyani <65205627+EmeraldCandy@users.noreply.github.com> * Update code/datums/components/special_tastes.dm Co-authored-by: warriorstar-orion <orion@snowfrost.garden> Signed-off-by: Kyani <65205627+EmeraldCandy@users.noreply.github.com> * Update code/datums/components/special_tastes.dm Co-authored-by: warriorstar-orion <orion@snowfrost.garden> Signed-off-by: Kyani <65205627+EmeraldCandy@users.noreply.github.com> * Update code/modules/mob/living/simple_animal/slime/slime_mob.dm Co-authored-by: warriorstar-orion <orion@snowfrost.garden> Signed-off-by: Kyani <65205627+EmeraldCandy@users.noreply.github.com> * Update code/modules/mob/living/simple_animal/slime/slime_mob.dm Co-authored-by: warriorstar-orion <orion@snowfrost.garden> Signed-off-by: Kyani <65205627+EmeraldCandy@users.noreply.github.com> * Update code/game/gamemodes/miniantags/revenant/revenant.dm Co-authored-by: warriorstar-orion <orion@snowfrost.garden> Signed-off-by: Kyani <65205627+EmeraldCandy@users.noreply.github.com> * Update code/datums/components/special_tastes.dm Co-authored-by: warriorstar-orion <orion@snowfrost.garden> Signed-off-by: Kyani <65205627+EmeraldCandy@users.noreply.github.com> * Update code/game/gamemodes/miniantags/abduction/gland.dm Co-authored-by: warriorstar-orion <orion@snowfrost.garden> Signed-off-by: Kyani <65205627+EmeraldCandy@users.noreply.github.com> * Update code/game/gamemodes/miniantags/abduction/gland.dm Co-authored-by: warriorstar-orion <orion@snowfrost.garden> Signed-off-by: Kyani <65205627+EmeraldCandy@users.noreply.github.com> * moved this * major rework prep * didnt save * rework done * small fix * makes aliens draggable by crew after death * shouldnt have cut this * xeno organ tweak + tips * oops * fixes and tweaks to slimes * not used * temp revert * rebase map files to master * re-applying changes * access fix * access tweak * big fix for new refactor * more refactoring * forgot a span * Update code/datums/components/surgery_initiator.dm Co-authored-by: warriorstar-orion <orion@snowfrost.garden> Signed-off-by: Kyani <65205627+EmeraldCandy@users.noreply.github.com> * hiero only doesnt target dead megafauna * various fixes * fix requests * fixed weird conflict markers * deconflict * deconflicting * antimagic flags * merge fixing * Update code/modules/mining/lavaland/loot/hierophant_loot.dm Signed-off-by: Burzah <116982774+Burzah@users.noreply.github.com> * regen mesh fix * small fixes * tick fix * Apply suggestions from code review Co-authored-by: Luc <89928798+lewcc@users.noreply.github.com> Signed-off-by: Kyani <65205627+EmeraldCandy@users.noreply.github.com> * grammar * Update code/modules/surgery/organs/organ_internal.dm Co-authored-by: Luc <89928798+lewcc@users.noreply.github.com> Signed-off-by: Kyani <65205627+EmeraldCandy@users.noreply.github.com> * Update code/modules/surgery/organs/organ_internal.dm Co-authored-by: Luc <89928798+lewcc@users.noreply.github.com> Signed-off-by: Kyani <65205627+EmeraldCandy@users.noreply.github.com> * Update code/modules/research/xenobiology/xenobiology_organs.dm Co-authored-by: Luc <89928798+lewcc@users.noreply.github.com> Signed-off-by: Kyani <65205627+EmeraldCandy@users.noreply.github.com> * Update code/modules/research/xenobiology/xenobiology_organs.dm Co-authored-by: Luc <89928798+lewcc@users.noreply.github.com> Signed-off-by: Kyani <65205627+EmeraldCandy@users.noreply.github.com> * Update code/modules/research/xenobiology/xenobiology_organs.dm Co-authored-by: Luc <89928798+lewcc@users.noreply.github.com> Signed-off-by: Kyani <65205627+EmeraldCandy@users.noreply.github.com> * tweaks --------- Signed-off-by: Kyani <65205627+EmeraldCandy@users.noreply.github.com> Signed-off-by: Burzah <116982774+Burzah@users.noreply.github.com> Co-authored-by: BeagleGaming1 <56142455+BeagleGaming1@users.noreply.github.com> Co-authored-by: PollardTheDragon <144391971+PollardTheDragon@users.noreply.github.com> Co-authored-by: 1080pCat <96908085+1080pCat@users.noreply.github.com> Co-authored-by: Luc <89928798+lewcc@users.noreply.github.com> Co-authored-by: warriorstar-orion <orion@snowfrost.garden> Co-authored-by: Burzah <116982774+Burzah@users.noreply.github.com>
@@ -25,6 +25,7 @@
|
||||
/area/ruin/powered/sloth)
|
||||
"f" = (
|
||||
/obj/structure/table/wood,
|
||||
/obj/item/organ/internal/kidneys/xenobiology/lethargic,
|
||||
/obj/item/food/grown/citrus/orange,
|
||||
/turf/simulated/floor/sepia{
|
||||
slowdown = 10
|
||||
|
||||
@@ -6052,6 +6052,7 @@
|
||||
pixel_x = -2;
|
||||
pixel_y = 1
|
||||
},
|
||||
/obj/item/dissector,
|
||||
/turf/simulated/floor/plasteel/freezer,
|
||||
/area/admin)
|
||||
"vl" = (
|
||||
@@ -6240,6 +6241,8 @@
|
||||
"vM" = (
|
||||
/obj/structure/table,
|
||||
/obj/item/storage/toolbox/syndicate,
|
||||
/obj/item/organ/internal/heart/xenobiology/cursed_bananium,
|
||||
/obj/item/organ/internal/heart/xenobiology/bananium,
|
||||
/turf/simulated/floor/plasteel/dark,
|
||||
/area/admin)
|
||||
"vN" = (
|
||||
@@ -6457,6 +6460,7 @@
|
||||
pixel_x = 5;
|
||||
pixel_y = 5
|
||||
},
|
||||
/obj/item/dissector/alien,
|
||||
/turf/simulated/floor/plasteel/freezer,
|
||||
/area/admin)
|
||||
"wA" = (
|
||||
|
||||
@@ -24059,7 +24059,7 @@
|
||||
/turf/simulated/floor/plasteel,
|
||||
/area/station/maintenance/apmaint)
|
||||
"bER" = (
|
||||
/obj/effect/landmark/start/scientist,
|
||||
/obj/effect/landmark/start/xenobiologist,
|
||||
/turf/simulated/floor/plasteel{
|
||||
icon_state = "white"
|
||||
},
|
||||
@@ -38115,6 +38115,9 @@
|
||||
/obj/effect/mapping_helpers/airlock/windoor/access/any/science/tox{
|
||||
dir = 1
|
||||
},
|
||||
/obj/effect/mapping_helpers/airlock/windoor/access/any/science/xenobio{
|
||||
dir = 1
|
||||
},
|
||||
/turf/simulated/floor/plasteel{
|
||||
dir = 10;
|
||||
icon_state = "whitepurple"
|
||||
@@ -40542,7 +40545,7 @@
|
||||
/turf/simulated/floor/plasteel,
|
||||
/area/station/engineering/atmos)
|
||||
"cSf" = (
|
||||
/obj/machinery/requests_console/directional/north,
|
||||
/obj/machinery/organ_analyzer,
|
||||
/turf/simulated/floor/plasteel{
|
||||
dir = 1;
|
||||
icon_state = "whitepurple"
|
||||
@@ -40555,6 +40558,12 @@
|
||||
/obj/item/clothing/glasses/science,
|
||||
/obj/structure/sign/poster/official/safety_eye_protection/directional/north,
|
||||
/obj/structure/shelf/science,
|
||||
/obj/machinery/camera{
|
||||
c_tag = "Xenobiology Module North";
|
||||
network = list("Research","SS13")
|
||||
},
|
||||
/obj/item/reagent_containers/glass/bottle/reagent/formaldehyde,
|
||||
/obj/item/reagent_containers/glass/bottle/reagent/formaldehyde,
|
||||
/turf/simulated/floor/plasteel{
|
||||
dir = 1;
|
||||
icon_state = "whitepurple"
|
||||
@@ -40676,22 +40685,6 @@
|
||||
/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,
|
||||
/turf/simulated/floor/plasteel,
|
||||
/area/station/command/office/ce)
|
||||
"cSH" = (
|
||||
/obj/machinery/processor{
|
||||
name = "Slime Processor"
|
||||
},
|
||||
/obj/machinery/camera{
|
||||
c_tag = "Xenobiology North";
|
||||
network = list("Research","SS13")
|
||||
},
|
||||
/obj/machinery/light{
|
||||
dir = 1
|
||||
},
|
||||
/turf/simulated/floor/plasteel{
|
||||
dir = 1;
|
||||
icon_state = "whitepurple"
|
||||
},
|
||||
/area/station/science/xenobiology)
|
||||
"cSI" = (
|
||||
/turf/simulated/floor/engine,
|
||||
/area/station/engineering/engine/supermatter)
|
||||
@@ -42422,18 +42415,26 @@
|
||||
/turf/simulated/floor/plating,
|
||||
/area/station/maintenance/apmaint2)
|
||||
"cZy" = (
|
||||
/obj/structure/table/glass,
|
||||
/obj/item/clothing/gloves/color/latex,
|
||||
/obj/machinery/optable,
|
||||
/turf/simulated/floor/plasteel{
|
||||
dir = 8;
|
||||
icon_state = "whitepurple"
|
||||
},
|
||||
/area/station/science/xenobiology)
|
||||
"cZz" = (
|
||||
/obj/structure/reagent_dispensers/watertank,
|
||||
/obj/machinery/power/apc/directional/east,
|
||||
/obj/structure/cable,
|
||||
/obj/structure/disposalpipe/segment,
|
||||
/obj/structure/table/glass,
|
||||
/obj/item/stack/sheet/mineral/plasma{
|
||||
pixel_x = -2;
|
||||
pixel_y = -2
|
||||
},
|
||||
/obj/item/stack/sheet/mineral/plasma,
|
||||
/obj/item/stack/sheet/mineral/plasma{
|
||||
pixel_x = 2;
|
||||
pixel_y = 2
|
||||
},
|
||||
/turf/simulated/floor/plasteel{
|
||||
dir = 4;
|
||||
icon_state = "whitepurple"
|
||||
@@ -47697,7 +47698,7 @@
|
||||
/obj/structure/chair{
|
||||
dir = 4
|
||||
},
|
||||
/obj/effect/landmark/start/scientist,
|
||||
/obj/effect/landmark/start/xenobiologist,
|
||||
/turf/simulated/floor/plasteel{
|
||||
icon_state = "whitepurplefull"
|
||||
},
|
||||
@@ -54999,6 +55000,16 @@
|
||||
icon_state = "white"
|
||||
},
|
||||
/area/station/science/toxins/mixing)
|
||||
"hhl" = (
|
||||
/obj/machinery/camera{
|
||||
c_tag = "Xenobiology Module East";
|
||||
dir = 1;
|
||||
network = list("Research","SS13")
|
||||
},
|
||||
/obj/machinery/alarm/directional/south,
|
||||
/obj/structure/reagent_dispensers/watertank,
|
||||
/turf/simulated/floor/plasteel,
|
||||
/area/station/science/xenobiology)
|
||||
"hhE" = (
|
||||
/obj/structure/mirror{
|
||||
pixel_x = -28
|
||||
@@ -55286,20 +55297,12 @@
|
||||
},
|
||||
/area/station/hallway/secondary/exit)
|
||||
"hqo" = (
|
||||
/obj/item/stack/sheet/mineral/plasma{
|
||||
pixel_x = -2;
|
||||
pixel_y = -2
|
||||
/obj/machinery/computer/operating{
|
||||
dir = 4;
|
||||
name = "dissection computer"
|
||||
},
|
||||
/obj/item/stack/sheet/mineral/plasma,
|
||||
/obj/item/stack/sheet/mineral/plasma{
|
||||
pixel_x = 2;
|
||||
pixel_y = 2
|
||||
},
|
||||
/obj/structure/table/glass,
|
||||
/obj/machinery/newscaster/directional/west,
|
||||
/turf/simulated/floor/plasteel{
|
||||
dir = 8;
|
||||
icon_state = "whitepurple"
|
||||
icon_state = "white"
|
||||
},
|
||||
/area/station/science/xenobiology)
|
||||
"hqx" = (
|
||||
@@ -56379,15 +56382,6 @@
|
||||
/obj/structure/flora/junglebush/large,
|
||||
/turf/simulated/floor/grass/jungle/no_creep,
|
||||
/area/station/command/bridge)
|
||||
"hTF" = (
|
||||
/obj/machinery/camera{
|
||||
c_tag = "Xenobiology East";
|
||||
dir = 1;
|
||||
network = list("Research","SS13")
|
||||
},
|
||||
/obj/machinery/alarm/directional/south,
|
||||
/turf/simulated/floor/plasteel,
|
||||
/area/station/science/xenobiology)
|
||||
"hTK" = (
|
||||
/obj/structure/sink/directional/east,
|
||||
/obj/structure/mirror{
|
||||
@@ -64945,7 +64939,6 @@
|
||||
/obj/machinery/door/airlock/research{
|
||||
name = "Test Lab"
|
||||
},
|
||||
/obj/effect/mapping_helpers/airlock/access/all/science/tox,
|
||||
/obj/machinery/atmospherics/pipe/simple/hidden/supply{
|
||||
dir = 4
|
||||
},
|
||||
@@ -64955,6 +64948,8 @@
|
||||
/obj/structure/disposalpipe/segment{
|
||||
dir = 4
|
||||
},
|
||||
/obj/effect/mapping_helpers/airlock/access/any/science/xenobio,
|
||||
/obj/effect/mapping_helpers/airlock/access/any/science/tox,
|
||||
/turf/simulated/floor/plasteel{
|
||||
icon_state = "white"
|
||||
},
|
||||
@@ -66928,11 +66923,12 @@
|
||||
/area/station/hallway/primary/starboard/west)
|
||||
"nqa" = (
|
||||
/obj/structure/window/reinforced,
|
||||
/obj/structure/table,
|
||||
/obj/item/storage/box/beakers{
|
||||
pixel_x = 2;
|
||||
pixel_y = 2
|
||||
},
|
||||
/obj/item/clothing/gloves/color/latex,
|
||||
/obj/structure/table/reinforced,
|
||||
/turf/simulated/floor/plasteel{
|
||||
dir = 10;
|
||||
icon_state = "whitepurple"
|
||||
@@ -68151,7 +68147,16 @@
|
||||
/area/station/public/dorms)
|
||||
"nXu" = (
|
||||
/obj/structure/window/reinforced,
|
||||
/obj/machinery/smithing/scientific_assembler,
|
||||
/obj/structure/table/reinforced,
|
||||
/obj/item/slime_scanner,
|
||||
/obj/item/slime_scanner,
|
||||
/obj/item/reagent_containers/spray/cleaner{
|
||||
pixel_x = 3;
|
||||
pixel_y = -4
|
||||
},
|
||||
/obj/item/reagent_containers/glass/bottle/reagent/morphine{
|
||||
pixel_x = -13
|
||||
},
|
||||
/turf/simulated/floor/plasteel{
|
||||
icon_state = "whitepurple"
|
||||
},
|
||||
@@ -69555,6 +69560,12 @@
|
||||
/obj/structure/cable{
|
||||
icon_state = "1-2"
|
||||
},
|
||||
/obj/structure/table/reinforced,
|
||||
/obj/item/extinguisher,
|
||||
/obj/item/extinguisher{
|
||||
pixel_x = 4;
|
||||
pixel_y = 4
|
||||
},
|
||||
/turf/simulated/floor/plasteel,
|
||||
/area/station/science/xenobiology)
|
||||
"oDG" = (
|
||||
@@ -69998,10 +70009,9 @@
|
||||
/area/station/supply/miningdock)
|
||||
"oLS" = (
|
||||
/obj/structure/window/reinforced,
|
||||
/obj/structure/table,
|
||||
/obj/item/reagent_containers/spray/cleaner{
|
||||
pixel_x = -3
|
||||
},
|
||||
/obj/structure/table/reinforced,
|
||||
/obj/item/storage/surgical_tray,
|
||||
/obj/item/dissector,
|
||||
/turf/simulated/floor/plasteel{
|
||||
icon_state = "whitepurple"
|
||||
},
|
||||
@@ -73907,12 +73917,12 @@
|
||||
/obj/effect/mapping_helpers/airlock/windoor/autoname/desk{
|
||||
dir = 4
|
||||
},
|
||||
/obj/effect/mapping_helpers/airlock/windoor/access/any/science/research{
|
||||
dir = 4
|
||||
},
|
||||
/obj/item/desk_bell{
|
||||
anchored = 1
|
||||
},
|
||||
/obj/effect/mapping_helpers/airlock/windoor/access/any/science/tox{
|
||||
dir = 4
|
||||
},
|
||||
/turf/simulated/floor/plasteel{
|
||||
icon_state = "whitepurplefull"
|
||||
},
|
||||
@@ -74162,6 +74172,8 @@
|
||||
int_button_link_id = "xeno_btn_int"
|
||||
},
|
||||
/obj/structure/disposalpipe/segment,
|
||||
/obj/structure/table/glass,
|
||||
/obj/item/storage/belt/medical/surgery,
|
||||
/turf/simulated/floor/plasteel{
|
||||
dir = 4;
|
||||
icon_state = "whitepurple"
|
||||
@@ -76300,6 +76312,22 @@
|
||||
},
|
||||
/turf/simulated/floor/bluegrid,
|
||||
/area/station/telecomms/chamber)
|
||||
"rTH" = (
|
||||
/obj/machinery/processor{
|
||||
name = "Slime Processor"
|
||||
},
|
||||
/obj/machinery/light{
|
||||
dir = 1
|
||||
},
|
||||
/obj/machinery/camera{
|
||||
c_tag = "Xenobiology North";
|
||||
network = list("Research","SS13")
|
||||
},
|
||||
/turf/simulated/floor/plasteel{
|
||||
dir = 1;
|
||||
icon_state = "whitepurple"
|
||||
},
|
||||
/area/station/science/xenobiology)
|
||||
"rUf" = (
|
||||
/obj/machinery/door/airlock/maintenance{
|
||||
electrified_until = -1;
|
||||
@@ -79142,13 +79170,9 @@
|
||||
/turf/simulated/floor/plating,
|
||||
/area/station/maintenance/apmaint2)
|
||||
"tAp" = (
|
||||
/obj/item/extinguisher,
|
||||
/obj/item/extinguisher{
|
||||
pixel_x = 4;
|
||||
pixel_y = 4
|
||||
},
|
||||
/obj/structure/table/glass,
|
||||
/obj/machinery/firealarm/directional/west,
|
||||
/obj/machinery/requests_console/directional/north,
|
||||
/obj/machinery/smithing/scientific_assembler,
|
||||
/turf/simulated/floor/plasteel{
|
||||
dir = 9;
|
||||
icon_state = "whitepurple"
|
||||
@@ -80635,9 +80659,10 @@
|
||||
/obj/machinery/door/airlock/research/glass{
|
||||
name = "Test Chamber"
|
||||
},
|
||||
/obj/effect/mapping_helpers/airlock/access/all/science/research,
|
||||
/obj/structure/disposalpipe/segment,
|
||||
/obj/machinery/door/firedoor,
|
||||
/obj/effect/mapping_helpers/airlock/access/any/science/tox,
|
||||
/obj/effect/mapping_helpers/airlock/access/any/science/xenobio,
|
||||
/turf/simulated/floor/plasteel{
|
||||
icon_state = "white"
|
||||
},
|
||||
@@ -80945,10 +80970,10 @@
|
||||
},
|
||||
/area/station/medical/medbay)
|
||||
"urf" = (
|
||||
/obj/effect/landmark/start/scientist,
|
||||
/obj/structure/chair{
|
||||
dir = 8
|
||||
},
|
||||
/obj/effect/landmark/start/xenobiologist,
|
||||
/turf/simulated/floor/plasteel{
|
||||
icon_state = "whitepurplefull"
|
||||
},
|
||||
@@ -82205,10 +82230,11 @@
|
||||
/obj/machinery/door/airlock/research{
|
||||
name = "Test Lab"
|
||||
},
|
||||
/obj/effect/mapping_helpers/airlock/access/all/science/tox,
|
||||
/obj/structure/cable{
|
||||
icon_state = "1-2"
|
||||
},
|
||||
/obj/effect/mapping_helpers/airlock/access/any/science/xenobio,
|
||||
/obj/effect/mapping_helpers/airlock/access/any/science/tox,
|
||||
/turf/simulated/floor/plasteel,
|
||||
/area/station/science/misc_lab)
|
||||
"vet" = (
|
||||
@@ -87689,15 +87715,7 @@
|
||||
},
|
||||
/area/station/science/xenobiology)
|
||||
"xUK" = (
|
||||
/obj/structure/table/glass,
|
||||
/obj/item/radio/intercom{
|
||||
name = "west bump";
|
||||
pixel_x = -28
|
||||
},
|
||||
/obj/item/slime_scanner,
|
||||
/obj/item/slime_scanner,
|
||||
/obj/item/hemostat,
|
||||
/obj/item/scalpel,
|
||||
/obj/machinery/newscaster/directional/west,
|
||||
/turf/simulated/floor/plasteel{
|
||||
dir = 8;
|
||||
icon_state = "whitepurple"
|
||||
@@ -134271,7 +134289,7 @@ lDG
|
||||
lJN
|
||||
cEH
|
||||
cNh
|
||||
hTF
|
||||
hhl
|
||||
cBR
|
||||
cBR
|
||||
cBR
|
||||
@@ -134780,7 +134798,7 @@ qZN
|
||||
cSf
|
||||
cEH
|
||||
cEH
|
||||
bER
|
||||
cEH
|
||||
oLS
|
||||
cKZ
|
||||
cVf
|
||||
@@ -135034,9 +135052,9 @@ cpR
|
||||
mLY
|
||||
bGG
|
||||
qZN
|
||||
cSH
|
||||
rTH
|
||||
cXA
|
||||
cEH
|
||||
bER
|
||||
cZv
|
||||
nXu
|
||||
sqC
|
||||
|
||||
@@ -2406,10 +2406,14 @@
|
||||
/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{
|
||||
dir = 4
|
||||
},
|
||||
/obj/structure/chair/office{
|
||||
dir = 4
|
||||
/obj/structure/table,
|
||||
/obj/item/clothing/gloves/color/latex,
|
||||
/obj/item/reagent_containers/spray/cleaner{
|
||||
pixel_x = -3
|
||||
},
|
||||
/obj/item/reagent_containers/spray/cleaner{
|
||||
pixel_x = 5
|
||||
},
|
||||
/obj/effect/landmark/start/scientist,
|
||||
/turf/simulated/floor/plasteel/white,
|
||||
/area/station/science/xenobiology)
|
||||
"arH" = (
|
||||
@@ -12476,6 +12480,7 @@
|
||||
/obj/structure/cable/orange{
|
||||
icon_state = "1-8"
|
||||
},
|
||||
/obj/effect/landmark/start/xenobiologist,
|
||||
/turf/simulated/floor/plasteel/white,
|
||||
/area/station/science/xenobiology)
|
||||
"bRE" = (
|
||||
@@ -15975,7 +15980,8 @@
|
||||
dir = 10
|
||||
},
|
||||
/obj/structure/table/glass,
|
||||
/obj/item/extinguisher,
|
||||
/obj/item/storage/surgical_tray,
|
||||
/obj/item/dissector,
|
||||
/turf/simulated/floor/plasteel{
|
||||
dir = 4;
|
||||
icon_state = "whitepurple"
|
||||
@@ -27180,8 +27186,9 @@
|
||||
pixel_y = 28;
|
||||
name = "custom placement"
|
||||
},
|
||||
/obj/structure/table/glass,
|
||||
/obj/item/stack/sheet/mineral/plasma,
|
||||
/obj/machinery/computer/operating{
|
||||
name = "dissection computer"
|
||||
},
|
||||
/turf/simulated/floor/plasteel{
|
||||
dir = 1;
|
||||
icon_state = "whitepurple"
|
||||
@@ -28465,13 +28472,14 @@
|
||||
/obj/machinery/door/airlock/maintenance{
|
||||
name = "Aft Asteroid Maintenance"
|
||||
},
|
||||
/obj/effect/mapping_helpers/airlock/access/all/science/tox,
|
||||
/obj/machinery/atmospherics/pipe/simple/hidden/supply,
|
||||
/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,
|
||||
/obj/effect/spawner/random/dirt/frequent,
|
||||
/obj/structure/cable/orange{
|
||||
icon_state = "1-2"
|
||||
},
|
||||
/obj/effect/mapping_helpers/airlock/access/any/science/xenobio,
|
||||
/obj/effect/mapping_helpers/airlock/access/any/science/tox,
|
||||
/turf/simulated/floor/plasteel/white,
|
||||
/area/station/science/test_chamber)
|
||||
"eGC" = (
|
||||
@@ -31226,28 +31234,6 @@
|
||||
icon_state = "neutralfull"
|
||||
},
|
||||
/area/station/hallway/primary/fore/east)
|
||||
"fmT" = (
|
||||
/obj/structure/cable/orange{
|
||||
icon_state = "4-8"
|
||||
},
|
||||
/obj/structure/cable/orange{
|
||||
icon_state = "1-8"
|
||||
},
|
||||
/obj/structure/cable/orange{
|
||||
icon_state = "2-8"
|
||||
},
|
||||
/obj/machinery/atmospherics/pipe/simple/hidden/supply{
|
||||
dir = 4
|
||||
},
|
||||
/obj/structure/chair/office{
|
||||
dir = 8
|
||||
},
|
||||
/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{
|
||||
dir = 4
|
||||
},
|
||||
/obj/effect/landmark/start/scientist,
|
||||
/turf/simulated/floor/plasteel/white,
|
||||
/area/station/science/xenobiology)
|
||||
"fnr" = (
|
||||
/obj/structure/sink/puddle,
|
||||
/turf/simulated/floor/plating/asteroid/ancient,
|
||||
@@ -46330,6 +46316,7 @@
|
||||
"iKf" = (
|
||||
/obj/structure/disposalpipe/segment,
|
||||
/obj/machinery/requests_console/directional/west,
|
||||
/obj/machinery/smithing/scientific_assembler,
|
||||
/turf/simulated/floor/plasteel{
|
||||
dir = 8;
|
||||
icon_state = "whitepurple"
|
||||
@@ -47779,7 +47766,8 @@
|
||||
/obj/machinery/door/airlock/research,
|
||||
/obj/effect/mapping_helpers/airlock/autoname,
|
||||
/obj/machinery/door/firedoor,
|
||||
/obj/effect/mapping_helpers/airlock/access/any/science/research,
|
||||
/obj/effect/mapping_helpers/airlock/access/any/science/xenobio,
|
||||
/obj/effect/mapping_helpers/airlock/access/any/science/tox,
|
||||
/turf/simulated/floor/plasteel{
|
||||
icon_state = "white"
|
||||
},
|
||||
@@ -49309,6 +49297,9 @@
|
||||
/obj/machinery/atmospherics/pipe/simple/hidden/supply{
|
||||
dir = 4
|
||||
},
|
||||
/obj/machinery/computer/camera_advanced/xenobio{
|
||||
dir = 8
|
||||
},
|
||||
/turf/simulated/floor/plasteel/white,
|
||||
/area/station/science/xenobiology)
|
||||
"jqB" = (
|
||||
@@ -54055,6 +54046,18 @@
|
||||
icon_state = "vault"
|
||||
},
|
||||
/area/station/security/armory/secure)
|
||||
"kpX" = (
|
||||
/obj/machinery/atmospherics/pipe/simple/hidden/supply{
|
||||
dir = 4
|
||||
},
|
||||
/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{
|
||||
dir = 4
|
||||
},
|
||||
/obj/structure/cable/orange{
|
||||
icon_state = "4-8"
|
||||
},
|
||||
/turf/simulated/floor/plasteel/white,
|
||||
/area/station/science/xenobiology)
|
||||
"kqa" = (
|
||||
/turf/simulated/floor/wood/nitrogen,
|
||||
/area/station/maintenance/abandonedbar)
|
||||
@@ -54598,21 +54601,6 @@
|
||||
},
|
||||
/turf/simulated/floor/plasteel/white,
|
||||
/area/station/science/hallway)
|
||||
"kvq" = (
|
||||
/obj/structure/chair/office{
|
||||
dir = 1
|
||||
},
|
||||
/obj/machinery/atmospherics/pipe/simple/hidden/supply{
|
||||
dir = 4
|
||||
},
|
||||
/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{
|
||||
dir = 4
|
||||
},
|
||||
/obj/structure/cable/orange{
|
||||
icon_state = "4-8"
|
||||
},
|
||||
/turf/simulated/floor/plasteel/white,
|
||||
/area/station/science/xenobiology)
|
||||
"kvs" = (
|
||||
/obj/effect/turf_decal/stripes/line,
|
||||
/turf/simulated/floor/plasteel{
|
||||
@@ -60033,7 +60021,12 @@
|
||||
/turf/simulated/floor/plasteel,
|
||||
/area/station/engineering/atmos)
|
||||
"lCN" = (
|
||||
/obj/machinery/smithing/scientific_assembler,
|
||||
/obj/structure/rack,
|
||||
/obj/item/extinguisher{
|
||||
pixel_x = 4;
|
||||
pixel_y = 4
|
||||
},
|
||||
/obj/item/extinguisher,
|
||||
/turf/simulated/floor/plasteel{
|
||||
icon_state = "whitepurple"
|
||||
},
|
||||
@@ -63902,6 +63895,7 @@
|
||||
icon_state = "4-8"
|
||||
},
|
||||
/obj/structure/disposalpipe/segment/corner,
|
||||
/obj/item/stack/sheet/mineral/plasma,
|
||||
/turf/simulated/floor/plasteel/white,
|
||||
/area/station/science/xenobiology)
|
||||
"muW" = (
|
||||
@@ -69274,6 +69268,9 @@
|
||||
pixel_x = 4;
|
||||
pixel_y = 4
|
||||
},
|
||||
/obj/item/reagent_containers/glass/bottle/reagent/morphine{
|
||||
pixel_y = -14
|
||||
},
|
||||
/turf/simulated/floor/plasteel{
|
||||
dir = 5;
|
||||
icon_state = "whitepurple"
|
||||
@@ -75585,6 +75582,22 @@
|
||||
icon_state = "cafeteria"
|
||||
},
|
||||
/area/station/medical/break_room)
|
||||
"pfY" = (
|
||||
/obj/structure/cable/orange{
|
||||
icon_state = "4-8"
|
||||
},
|
||||
/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{
|
||||
dir = 4
|
||||
},
|
||||
/obj/machinery/atmospherics/pipe/simple/hidden/supply{
|
||||
dir = 4
|
||||
},
|
||||
/obj/effect/landmark/start/xenobiologist,
|
||||
/obj/structure/chair/office{
|
||||
dir = 4
|
||||
},
|
||||
/turf/simulated/floor/plasteel/white,
|
||||
/area/station/science/xenobiology)
|
||||
"pga" = (
|
||||
/obj/structure/disposalpipe/segment,
|
||||
/obj/effect/spawner/random/dirt/often,
|
||||
@@ -81487,9 +81500,12 @@
|
||||
/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{
|
||||
dir = 4
|
||||
},
|
||||
/obj/machinery/computer/camera_advanced/xenobio{
|
||||
dir = 8
|
||||
/obj/structure/table,
|
||||
/obj/item/clothing/glasses/science{
|
||||
pixel_x = 2;
|
||||
pixel_y = 4
|
||||
},
|
||||
/obj/item/clothing/glasses/science,
|
||||
/turf/simulated/floor/plasteel/white,
|
||||
/area/station/science/xenobiology)
|
||||
"qxe" = (
|
||||
@@ -83971,6 +83987,13 @@
|
||||
},
|
||||
/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,
|
||||
/obj/machinery/atmospherics/pipe/simple/hidden/supply,
|
||||
/obj/structure/table/glass,
|
||||
/obj/item/storage/belt/medical/surgery{
|
||||
pixel_y = 10
|
||||
},
|
||||
/obj/item/stack/sheet/mineral/plasma,
|
||||
/obj/item/stack/sheet/mineral/plasma,
|
||||
/obj/item/stack/sheet/mineral/plasma,
|
||||
/turf/simulated/floor/plasteel{
|
||||
dir = 4;
|
||||
icon_state = "whitepurplecorner"
|
||||
@@ -92368,7 +92391,6 @@
|
||||
},
|
||||
/obj/structure/disposalpipe/segment,
|
||||
/obj/structure/table/reinforced,
|
||||
/obj/effect/mapping_helpers/airlock/windoor/access/any/science/research,
|
||||
/obj/machinery/door/window/classic/normal{
|
||||
name = "R&D Desk"
|
||||
},
|
||||
@@ -92387,6 +92409,7 @@
|
||||
pixel_y = 7;
|
||||
anchored = 1
|
||||
},
|
||||
/obj/effect/mapping_helpers/airlock/windoor/access/any/science/tox,
|
||||
/turf/simulated/floor/plasteel{
|
||||
icon_state = "purplefull"
|
||||
},
|
||||
@@ -93947,6 +93970,28 @@
|
||||
icon_state = "neutralcorner"
|
||||
},
|
||||
/area/station/hallway/primary/port/north)
|
||||
"tiC" = (
|
||||
/obj/structure/cable/orange{
|
||||
icon_state = "4-8"
|
||||
},
|
||||
/obj/structure/cable/orange{
|
||||
icon_state = "1-8"
|
||||
},
|
||||
/obj/structure/cable/orange{
|
||||
icon_state = "2-8"
|
||||
},
|
||||
/obj/machinery/atmospherics/pipe/simple/hidden/supply{
|
||||
dir = 4
|
||||
},
|
||||
/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{
|
||||
dir = 4
|
||||
},
|
||||
/obj/effect/landmark/start/xenobiologist,
|
||||
/obj/structure/chair/office{
|
||||
dir = 8
|
||||
},
|
||||
/turf/simulated/floor/plasteel/white,
|
||||
/area/station/science/xenobiology)
|
||||
"tiE" = (
|
||||
/obj/structure/chair{
|
||||
dir = 8
|
||||
@@ -95087,16 +95132,11 @@
|
||||
/turf/simulated/floor/wood,
|
||||
/area/station/maintenance/fore)
|
||||
"tvP" = (
|
||||
/obj/structure/table/glass,
|
||||
/obj/item/clothing/glasses/science{
|
||||
pixel_x = 2;
|
||||
pixel_y = 4
|
||||
},
|
||||
/obj/item/clothing/glasses/science,
|
||||
/obj/structure/cable/orange{
|
||||
icon_state = "0-2"
|
||||
},
|
||||
/obj/machinery/power/apc/directional/north,
|
||||
/obj/machinery/optable,
|
||||
/turf/simulated/floor/plasteel{
|
||||
dir = 1;
|
||||
icon_state = "whitepurple"
|
||||
@@ -95168,8 +95208,9 @@
|
||||
},
|
||||
/area/station/hallway/primary/fore/east)
|
||||
"twG" = (
|
||||
/obj/structure/table/glass,
|
||||
/obj/structure/shelf/science,
|
||||
/obj/item/book/manual/wiki/sop_science,
|
||||
/obj/item/reagent_containers/glass/bottle/reagent/formaldehyde,
|
||||
/turf/simulated/floor/plasteel{
|
||||
dir = 1;
|
||||
icon_state = "whitepurple"
|
||||
@@ -100075,10 +100116,7 @@
|
||||
/area/station/maintenance/fore)
|
||||
"uBC" = (
|
||||
/obj/structure/disposalpipe/segment,
|
||||
/obj/structure/extinguisher_cabinet{
|
||||
pixel_x = -24;
|
||||
name = "custom placement"
|
||||
},
|
||||
/obj/machinery/organ_analyzer,
|
||||
/turf/simulated/floor/plasteel{
|
||||
dir = 10;
|
||||
icon_state = "whitepurple"
|
||||
@@ -100603,7 +100641,8 @@
|
||||
/obj/structure/cable/orange{
|
||||
icon_state = "2-4"
|
||||
},
|
||||
/obj/effect/mapping_helpers/airlock/access/all/science/tox,
|
||||
/obj/effect/mapping_helpers/airlock/access/any/science/tox,
|
||||
/obj/effect/mapping_helpers/airlock/access/any/science/xenobio,
|
||||
/turf/simulated/floor/engine,
|
||||
/area/station/science/misc_lab)
|
||||
"uHD" = (
|
||||
@@ -101796,7 +101835,8 @@
|
||||
/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,
|
||||
/obj/effect/spawner/random/dirt/frequent,
|
||||
/obj/structure/disposalpipe/segment,
|
||||
/obj/effect/mapping_helpers/airlock/access/any/science/research,
|
||||
/obj/effect/mapping_helpers/airlock/access/any/science/tox,
|
||||
/obj/effect/mapping_helpers/airlock/access/any/science/xenobio,
|
||||
/turf/simulated/floor/plasteel/white,
|
||||
/area/station/science/misc_lab)
|
||||
"uWB" = (
|
||||
@@ -110335,6 +110375,10 @@
|
||||
/obj/item/storage/box/beakers{
|
||||
pixel_x = 10
|
||||
},
|
||||
/obj/structure/extinguisher_cabinet{
|
||||
name = "north bump";
|
||||
pixel_y = 30
|
||||
},
|
||||
/turf/simulated/floor/plasteel{
|
||||
dir = 1;
|
||||
icon_state = "whitepurple"
|
||||
@@ -138783,7 +138827,7 @@ cmZ
|
||||
wBr
|
||||
cGd
|
||||
erm
|
||||
kvq
|
||||
kpX
|
||||
wAG
|
||||
wAG
|
||||
meZ
|
||||
@@ -140329,7 +140373,7 @@ lSZ
|
||||
oDZ
|
||||
vMf
|
||||
wAG
|
||||
jqw
|
||||
pfY
|
||||
wAG
|
||||
rPK
|
||||
dko
|
||||
@@ -140843,7 +140887,7 @@ odF
|
||||
jtk
|
||||
btq
|
||||
wAG
|
||||
arw
|
||||
wdn
|
||||
wAG
|
||||
meZ
|
||||
jNL
|
||||
@@ -141357,7 +141401,7 @@ iZx
|
||||
oDZ
|
||||
vMf
|
||||
wAG
|
||||
wdn
|
||||
arw
|
||||
wAG
|
||||
rPK
|
||||
dko
|
||||
@@ -142128,7 +142172,7 @@ kII
|
||||
njH
|
||||
vld
|
||||
vld
|
||||
fmT
|
||||
tiC
|
||||
vld
|
||||
vld
|
||||
bYh
|
||||
|
||||
@@ -38864,6 +38864,8 @@
|
||||
"cOO" = (
|
||||
/obj/structure/table/reinforced,
|
||||
/obj/effect/turf_decal/delivery/hollow,
|
||||
/obj/item/folder/white,
|
||||
/obj/item/pen,
|
||||
/turf/simulated/floor/plasteel/white,
|
||||
/area/station/science/xenobiology)
|
||||
"cOP" = (
|
||||
@@ -38891,12 +38893,15 @@
|
||||
/turf/simulated/floor/plasteel/white,
|
||||
/area/station/science/xenobiology)
|
||||
"cOS" = (
|
||||
/obj/machinery/monkey_recycler,
|
||||
/obj/effect/turf_decal/delivery/hollow,
|
||||
/obj/structure/extinguisher_cabinet{
|
||||
name = "north bump";
|
||||
pixel_y = 30
|
||||
},
|
||||
/obj/machinery/processor{
|
||||
desc = "A machine used to process slimes and retrieve their extract.";
|
||||
name = "Slime Processor"
|
||||
},
|
||||
/turf/simulated/floor/plasteel{
|
||||
dir = 9;
|
||||
icon_state = "whitepurple"
|
||||
@@ -39578,7 +39583,6 @@
|
||||
/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{
|
||||
dir = 6
|
||||
},
|
||||
/obj/effect/landmark/start/scientist,
|
||||
/obj/structure/cable{
|
||||
icon_state = "2-4"
|
||||
},
|
||||
@@ -39588,6 +39592,7 @@
|
||||
/obj/structure/cable{
|
||||
icon_state = "4-8"
|
||||
},
|
||||
/obj/effect/landmark/start/xenobiologist,
|
||||
/turf/simulated/floor/plasteel/white,
|
||||
/area/station/science/xenobiology)
|
||||
"cRX" = (
|
||||
@@ -39669,7 +39674,7 @@
|
||||
/obj/machinery/atmospherics/pipe/simple/hidden/supply{
|
||||
dir = 10
|
||||
},
|
||||
/obj/effect/landmark/start/scientist,
|
||||
/obj/effect/landmark/start/xenobiologist,
|
||||
/turf/simulated/floor/plasteel{
|
||||
icon_state = "whitepurplefull"
|
||||
},
|
||||
@@ -40054,7 +40059,6 @@
|
||||
/turf/simulated/floor/plasteel/white,
|
||||
/area/station/science/xenobiology)
|
||||
"cTy" = (
|
||||
/obj/item/kirbyplants/large,
|
||||
/obj/machinery/light,
|
||||
/turf/simulated/floor/plasteel{
|
||||
icon_state = "whitepurple"
|
||||
@@ -40134,11 +40138,8 @@
|
||||
/turf/simulated/floor/plasteel/white,
|
||||
/area/station/science/xenobiology)
|
||||
"cTM" = (
|
||||
/obj/machinery/processor{
|
||||
desc = "A machine used to process slimes and retrieve their extract.";
|
||||
name = "Slime Processor"
|
||||
},
|
||||
/obj/effect/turf_decal/delivery/hollow,
|
||||
/obj/machinery/smithing/scientific_assembler,
|
||||
/turf/simulated/floor/plasteel{
|
||||
dir = 8;
|
||||
icon_state = "whitepurple"
|
||||
@@ -40531,7 +40532,7 @@
|
||||
},
|
||||
/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,
|
||||
/obj/machinery/atmospherics/pipe/simple/hidden/supply,
|
||||
/obj/effect/landmark/start/scientist,
|
||||
/obj/effect/landmark/start/xenobiologist,
|
||||
/turf/simulated/floor/plasteel{
|
||||
icon_state = "whitepurplefull"
|
||||
},
|
||||
@@ -40574,12 +40575,12 @@
|
||||
/obj/machinery/light{
|
||||
dir = 4
|
||||
},
|
||||
/obj/item/folder/white,
|
||||
/obj/item/pen,
|
||||
/obj/structure/cable{
|
||||
icon_state = "0-8"
|
||||
},
|
||||
/obj/effect/turf_decal/stripes/line,
|
||||
/obj/item/storage/surgical_tray,
|
||||
/obj/item/dissector,
|
||||
/turf/simulated/floor/plasteel,
|
||||
/area/station/science/xenobiology)
|
||||
"cVs" = (
|
||||
@@ -40893,13 +40894,14 @@
|
||||
},
|
||||
/area/station/science/rnd)
|
||||
"cWT" = (
|
||||
/obj/structure/table/reinforced,
|
||||
/obj/item/paper_bin,
|
||||
/obj/item/pen,
|
||||
/obj/item/storage/bag/bio,
|
||||
/obj/item/storage/bag/bio,
|
||||
/obj/machinery/firealarm/directional/west,
|
||||
/obj/effect/turf_decal/delivery/hollow,
|
||||
/obj/structure/shelf/science,
|
||||
/obj/item/storage/bag/bio,
|
||||
/obj/item/storage/bag/bio,
|
||||
/obj/item/slime_scanner,
|
||||
/obj/item/slime_scanner,
|
||||
/obj/item/clothing/gloves/color/latex,
|
||||
/turf/simulated/floor/plasteel{
|
||||
dir = 10;
|
||||
icon_state = "whitepurple"
|
||||
@@ -40912,31 +40914,34 @@
|
||||
},
|
||||
/area/station/science/xenobiology)
|
||||
"cWV" = (
|
||||
/obj/item/kirbyplants/large,
|
||||
/obj/effect/turf_decal/delivery/hollow,
|
||||
/obj/machinery/computer/operating{
|
||||
dir = 1;
|
||||
name = "dissection computer"
|
||||
},
|
||||
/turf/simulated/floor/plasteel{
|
||||
icon_state = "whitepurple"
|
||||
},
|
||||
/area/station/science/xenobiology)
|
||||
"cWW" = (
|
||||
/obj/structure/filingcabinet/chestdrawer,
|
||||
/obj/machinery/ai_status_display{
|
||||
pixel_y = -32
|
||||
},
|
||||
/obj/effect/turf_decal/delivery/hollow,
|
||||
/obj/machinery/optable,
|
||||
/turf/simulated/floor/plasteel{
|
||||
icon_state = "whitepurple"
|
||||
},
|
||||
/area/station/science/xenobiology)
|
||||
"cXa" = (
|
||||
/obj/structure/table/reinforced,
|
||||
/obj/item/clothing/gloves/color/latex,
|
||||
/obj/item/slime_scanner,
|
||||
/obj/item/radio/intercom{
|
||||
name = "south bump";
|
||||
pixel_y = -28
|
||||
},
|
||||
/obj/effect/turf_decal/delivery,
|
||||
/obj/item/storage/belt/medical/surgery,
|
||||
/obj/item/reagent_containers/glass/bottle/reagent/morphine,
|
||||
/turf/simulated/floor/plasteel{
|
||||
icon_state = "whitepurple"
|
||||
},
|
||||
@@ -41410,18 +41415,6 @@
|
||||
},
|
||||
/turf/simulated/floor/plasteel/white,
|
||||
/area/station/science/rnd)
|
||||
"cZC" = (
|
||||
/obj/structure/table/reinforced,
|
||||
/obj/machinery/camera{
|
||||
c_tag = "Xenobiology East";
|
||||
dir = 8;
|
||||
network = list("Research","SS13")
|
||||
},
|
||||
/obj/machinery/reagentgrinder,
|
||||
/obj/machinery/requests_console/directional/east,
|
||||
/obj/effect/turf_decal/delivery,
|
||||
/turf/simulated/floor/plasteel,
|
||||
/area/station/science/xenobiology)
|
||||
"cZF" = (
|
||||
/turf/simulated/floor/plasteel{
|
||||
dir = 1;
|
||||
@@ -51019,6 +51012,21 @@
|
||||
icon_state = "solarpanel"
|
||||
},
|
||||
/area/station/engineering/solar/aft_port)
|
||||
"dWe" = (
|
||||
/obj/structure/table/reinforced,
|
||||
/obj/machinery/camera{
|
||||
c_tag = "Xenobio East";
|
||||
dir = 8;
|
||||
network = list("Research","SS13")
|
||||
},
|
||||
/obj/machinery/reagentgrinder,
|
||||
/obj/machinery/requests_console/directional/east,
|
||||
/obj/effect/turf_decal/delivery,
|
||||
/obj/item/reagent_containers/glass/bottle/reagent/formaldehyde{
|
||||
pixel_x = -15
|
||||
},
|
||||
/turf/simulated/floor/plasteel,
|
||||
/area/station/science/xenobiology)
|
||||
"dWf" = (
|
||||
/obj/docking_port/stationary{
|
||||
dheight = 9;
|
||||
@@ -52271,7 +52279,8 @@
|
||||
/obj/structure/disposalpipe/segment{
|
||||
dir = 4
|
||||
},
|
||||
/obj/effect/mapping_helpers/airlock/access/all/science/tox,
|
||||
/obj/effect/mapping_helpers/airlock/access/any/science/xenobio,
|
||||
/obj/effect/mapping_helpers/airlock/access/any/science/tox,
|
||||
/turf/simulated/floor/plasteel/white,
|
||||
/area/station/science/misc_lab)
|
||||
"eky" = (
|
||||
@@ -72721,7 +72730,6 @@
|
||||
pixel_x = -6;
|
||||
pixel_y = 3
|
||||
},
|
||||
/obj/effect/mapping_helpers/airlock/windoor/access/any/science/research,
|
||||
/obj/effect/mapping_helpers/airlock/polarized{
|
||||
id = "rnd"
|
||||
},
|
||||
@@ -72733,6 +72741,7 @@
|
||||
id_tag = "researchdesk1";
|
||||
name = "Research and Development Front Desk Shutters"
|
||||
},
|
||||
/obj/effect/mapping_helpers/airlock/windoor/access/any/science/tox,
|
||||
/turf/simulated/floor/plasteel/white,
|
||||
/area/station/science/rnd)
|
||||
"nyr" = (
|
||||
@@ -75499,6 +75508,13 @@
|
||||
icon_state = "neutralcorner"
|
||||
},
|
||||
/area/station/hallway/primary/starboard/east)
|
||||
"oIS" = (
|
||||
/obj/structure/filingcabinet/chestdrawer,
|
||||
/turf/simulated/floor/plasteel{
|
||||
dir = 1;
|
||||
icon_state = "whitepurple"
|
||||
},
|
||||
/area/station/science/xenobiology)
|
||||
"oIT" = (
|
||||
/obj/machinery/door/firedoor,
|
||||
/obj/machinery/atmospherics/pipe/simple/hidden/supply,
|
||||
@@ -86235,7 +86251,7 @@
|
||||
/turf/simulated/floor/plating/airless,
|
||||
/area/station/engineering/control)
|
||||
"tgQ" = (
|
||||
/obj/machinery/smithing/scientific_assembler,
|
||||
/obj/machinery/organ_analyzer,
|
||||
/turf/simulated/floor/plasteel{
|
||||
dir = 1;
|
||||
icon_state = "whitepurple"
|
||||
@@ -91520,6 +91536,11 @@
|
||||
/obj/effect/spawner/random/maintenance,
|
||||
/turf/simulated/floor/plating,
|
||||
/area/station/maintenance/apmaint)
|
||||
"vpx" = (
|
||||
/obj/effect/turf_decal/delivery/hollow,
|
||||
/obj/machinery/monkey_recycler,
|
||||
/turf/simulated/floor/plasteel/white,
|
||||
/area/station/science/xenobiology)
|
||||
"vpS" = (
|
||||
/obj/structure/bookcase/random,
|
||||
/obj/effect/decal/cleanable/cobweb2,
|
||||
@@ -126823,7 +126844,7 @@ dWm
|
||||
cWA
|
||||
cTu
|
||||
cWA
|
||||
dWm
|
||||
vpx
|
||||
dWv
|
||||
dmq
|
||||
dhG
|
||||
@@ -131445,7 +131466,7 @@ eGq
|
||||
rkt
|
||||
oRX
|
||||
cIL
|
||||
cQP
|
||||
oIS
|
||||
cPe
|
||||
cTO
|
||||
cSg
|
||||
@@ -131705,7 +131726,7 @@ cIL
|
||||
cPb
|
||||
cQJ
|
||||
cSh
|
||||
cZC
|
||||
dWe
|
||||
cSh
|
||||
cVo
|
||||
cXa
|
||||
|
||||
@@ -3169,8 +3169,7 @@
|
||||
/obj/machinery/light{
|
||||
dir = 8
|
||||
},
|
||||
/obj/structure/table,
|
||||
/obj/item/clothing/gloves/color/latex,
|
||||
/obj/machinery/smithing/scientific_assembler,
|
||||
/turf/simulated/floor/plasteel{
|
||||
dir = 1;
|
||||
icon_state = "whitepurplecorner"
|
||||
@@ -17941,13 +17940,8 @@
|
||||
},
|
||||
/area/station/public/shops)
|
||||
"dDu" = (
|
||||
/obj/structure/reagent_dispensers/watertank,
|
||||
/obj/machinery/camera{
|
||||
c_tag = "Xenobiology Control";
|
||||
dir = 9;
|
||||
network = list("Research","SS13")
|
||||
},
|
||||
/obj/machinery/newscaster/directional/east,
|
||||
/obj/machinery/organ_analyzer,
|
||||
/turf/simulated/floor/plasteel{
|
||||
dir = 4;
|
||||
icon_state = "whitepurplecorner"
|
||||
@@ -21968,6 +21962,11 @@
|
||||
/obj/structure/cable{
|
||||
icon_state = "4-8"
|
||||
},
|
||||
/obj/item/extinguisher,
|
||||
/obj/item/extinguisher{
|
||||
pixel_x = 4;
|
||||
pixel_y = 4
|
||||
},
|
||||
/turf/simulated/floor/plasteel{
|
||||
icon_state = "whitepurplefull"
|
||||
},
|
||||
@@ -23088,7 +23087,17 @@
|
||||
/obj/structure/disposalpipe/segment{
|
||||
dir = 4
|
||||
},
|
||||
/obj/machinery/smithing/scientific_assembler,
|
||||
/obj/machinery/camera{
|
||||
c_tag = "Xenobiology Control";
|
||||
dir = 1;
|
||||
network = list("Research","SS13")
|
||||
},
|
||||
/obj/structure/shelf/science,
|
||||
/obj/item/reagent_containers/spray/cleaner,
|
||||
/obj/item/reagent_containers/spray/cleaner,
|
||||
/obj/item/reagent_containers/glass/bottle/reagent/formaldehyde,
|
||||
/obj/item/clothing/glasses/science,
|
||||
/obj/item/clothing/glasses/science,
|
||||
/turf/simulated/floor/plasteel{
|
||||
icon_state = "whitepurplecorner"
|
||||
},
|
||||
@@ -30838,6 +30847,7 @@
|
||||
/turf/simulated/floor/wood,
|
||||
/area/station/service/library)
|
||||
"gfL" = (
|
||||
/obj/effect/landmark/start/xenobiologist,
|
||||
/turf/simulated/floor/plasteel{
|
||||
dir = 1;
|
||||
icon_state = "whitepurplecorner"
|
||||
@@ -33833,13 +33843,7 @@
|
||||
/turf/simulated/floor/plasteel,
|
||||
/area/station/maintenance/apmaint2)
|
||||
"gLd" = (
|
||||
/obj/item/radio/intercom{
|
||||
name = "west bump";
|
||||
pixel_x = -28
|
||||
},
|
||||
/obj/machinery/processor{
|
||||
name = "Slime Processor"
|
||||
},
|
||||
/obj/structure/sink/directional/west,
|
||||
/turf/simulated/floor/plasteel{
|
||||
dir = 1;
|
||||
icon_state = "whitepurplecorner"
|
||||
@@ -35512,11 +35516,8 @@
|
||||
/turf/simulated/floor/plating,
|
||||
/area/station/maintenance/starboard)
|
||||
"hdD" = (
|
||||
/obj/structure/rack,
|
||||
/obj/item/storage/box/syringes,
|
||||
/obj/item/storage/box/beakers{
|
||||
pixel_x = 2;
|
||||
pixel_y = 2
|
||||
/obj/machinery/computer/operating{
|
||||
name = "dissection computer"
|
||||
},
|
||||
/turf/simulated/floor/plasteel{
|
||||
dir = 1;
|
||||
@@ -37064,10 +37065,10 @@
|
||||
/obj/structure/chair{
|
||||
dir = 4
|
||||
},
|
||||
/obj/effect/landmark/start/scientist,
|
||||
/obj/structure/cable{
|
||||
icon_state = "1-2"
|
||||
},
|
||||
/obj/effect/landmark/start/xenobiologist,
|
||||
/turf/simulated/floor/plasteel{
|
||||
dir = 10;
|
||||
icon_state = "whitepurple"
|
||||
@@ -38253,12 +38254,6 @@
|
||||
/turf/simulated/floor/plating,
|
||||
/area/station/maintenance/security/aft_port)
|
||||
"hCL" = (
|
||||
/obj/structure/table/glass,
|
||||
/obj/item/extinguisher{
|
||||
pixel_x = 4;
|
||||
pixel_y = 4
|
||||
},
|
||||
/obj/item/extinguisher,
|
||||
/obj/machinery/atmospherics/pipe/simple/hidden/supply{
|
||||
dir = 4
|
||||
},
|
||||
@@ -38268,6 +38263,7 @@
|
||||
/obj/structure/cable{
|
||||
icon_state = "4-8"
|
||||
},
|
||||
/obj/machinery/monkey_recycler,
|
||||
/turf/simulated/floor/plasteel{
|
||||
icon_state = "whitepurplefull"
|
||||
},
|
||||
@@ -48655,20 +48651,19 @@
|
||||
/turf/simulated/floor/plasteel,
|
||||
/area/station/hallway/secondary/exit)
|
||||
"jHf" = (
|
||||
/obj/item/stack/sheet/mineral/plasma{
|
||||
pixel_x = -2;
|
||||
pixel_y = -2
|
||||
},
|
||||
/obj/item/stack/sheet/mineral/plasma,
|
||||
/obj/item/stack/sheet/mineral/plasma{
|
||||
pixel_x = 2;
|
||||
pixel_y = 2
|
||||
},
|
||||
/obj/structure/table,
|
||||
/obj/machinery/power/apc/directional/east,
|
||||
/obj/structure/cable{
|
||||
icon_state = "0-8"
|
||||
},
|
||||
/obj/item/storage/box/beakers{
|
||||
pixel_x = 2;
|
||||
pixel_y = 2
|
||||
},
|
||||
/obj/item/storage/box/syringes,
|
||||
/obj/item/stack/sheet/mineral/plasma,
|
||||
/obj/item/stack/sheet/mineral/plasma,
|
||||
/obj/item/stack/sheet/mineral/plasma,
|
||||
/turf/simulated/floor/plasteel{
|
||||
dir = 4;
|
||||
icon_state = "whitepurplecorner"
|
||||
@@ -60623,7 +60618,9 @@
|
||||
/turf/simulated/floor/plasteel,
|
||||
/area/station/hallway/primary/central/sw)
|
||||
"mhu" = (
|
||||
/obj/machinery/monkey_recycler,
|
||||
/obj/machinery/processor{
|
||||
name = "Slime Processor"
|
||||
},
|
||||
/turf/simulated/floor/plasteel{
|
||||
dir = 1;
|
||||
icon_state = "whitepurplecorner"
|
||||
@@ -85567,6 +85564,7 @@
|
||||
/obj/structure/cable{
|
||||
icon_state = "1-2"
|
||||
},
|
||||
/obj/structure/reagent_dispensers/watertank,
|
||||
/turf/simulated/floor/plasteel{
|
||||
icon_state = "whitepurple"
|
||||
},
|
||||
@@ -91974,9 +91972,10 @@
|
||||
},
|
||||
/obj/machinery/atmospherics/pipe/simple/hidden/supply,
|
||||
/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,
|
||||
/obj/effect/mapping_helpers/airlock/access/all/science/tox,
|
||||
/obj/structure/disposalpipe/segment,
|
||||
/obj/machinery/door/firedoor,
|
||||
/obj/effect/mapping_helpers/airlock/access/any/science/xenobio,
|
||||
/obj/effect/mapping_helpers/airlock/access/any/science/tox,
|
||||
/turf/simulated/floor/plasteel{
|
||||
icon_state = "white"
|
||||
},
|
||||
@@ -98094,8 +98093,7 @@
|
||||
/turf/simulated/floor/plasteel,
|
||||
/area/station/public/locker)
|
||||
"tzh" = (
|
||||
/obj/structure/sink/directional/north,
|
||||
/obj/machinery/firealarm/directional/west,
|
||||
/obj/machinery/optable,
|
||||
/turf/simulated/floor/plasteel{
|
||||
dir = 1;
|
||||
icon_state = "whitepurplecorner"
|
||||
@@ -106023,6 +106021,12 @@
|
||||
/obj/machinery/disposal/delivery_chute{
|
||||
dir = 4
|
||||
},
|
||||
/obj/effect/mapping_helpers/airlock/windoor/access/any/science/tox{
|
||||
dir = 4
|
||||
},
|
||||
/obj/effect/mapping_helpers/airlock/windoor/access/any/science/xenobio{
|
||||
dir = 4
|
||||
},
|
||||
/turf/simulated/floor/plasteel{
|
||||
dir = 9;
|
||||
icon_state = "whitepurple"
|
||||
@@ -108546,19 +108550,15 @@
|
||||
/turf/simulated/floor/grass,
|
||||
/area/station/public/park)
|
||||
"vFk" = (
|
||||
/obj/structure/table,
|
||||
/obj/item/reagent_containers/spray/cleaner{
|
||||
pixel_x = -3
|
||||
},
|
||||
/obj/item/reagent_containers/spray/cleaner{
|
||||
pixel_x = 5
|
||||
},
|
||||
/obj/machinery/requests_console/directional/east,
|
||||
/obj/machinery/light_switch{
|
||||
name = "north bump";
|
||||
pixel_y = 24;
|
||||
pixel_x = 10
|
||||
},
|
||||
/obj/structure/table,
|
||||
/obj/item/storage/belt/medical/surgery,
|
||||
/obj/item/reagent_containers/glass/bottle/reagent/morphine,
|
||||
/turf/simulated/floor/plasteel{
|
||||
dir = 4;
|
||||
icon_state = "whitepurplecorner"
|
||||
@@ -111453,7 +111453,6 @@
|
||||
pixel_y = 8;
|
||||
anchored = 1
|
||||
},
|
||||
/obj/effect/mapping_helpers/airlock/windoor/access/all/science/research,
|
||||
/obj/machinery/door/firedoor,
|
||||
/obj/effect/mapping_helpers/airlock/windoor/autoname/desk,
|
||||
/obj/machinery/door/poddoor/preopen{
|
||||
@@ -111465,6 +111464,7 @@
|
||||
name = "Research and Development Lab Shutters";
|
||||
id_tag = "rndlab2"
|
||||
},
|
||||
/obj/effect/mapping_helpers/airlock/windoor/access/any/science/tox,
|
||||
/turf/simulated/floor/plasteel,
|
||||
/area/station/science/rnd)
|
||||
"wih" = (
|
||||
@@ -112063,7 +112063,7 @@
|
||||
/obj/structure/chair{
|
||||
dir = 8
|
||||
},
|
||||
/obj/effect/landmark/start/scientist,
|
||||
/obj/effect/landmark/start/xenobiologist,
|
||||
/turf/simulated/floor/plasteel{
|
||||
dir = 6;
|
||||
icon_state = "whitepurple"
|
||||
@@ -112703,8 +112703,9 @@
|
||||
icon_state = "1-2"
|
||||
},
|
||||
/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,
|
||||
/obj/effect/mapping_helpers/airlock/access/all/science/tox,
|
||||
/obj/machinery/door/firedoor,
|
||||
/obj/effect/mapping_helpers/airlock/access/any/science/tox,
|
||||
/obj/effect/mapping_helpers/airlock/access/any/science/xenobio,
|
||||
/turf/simulated/floor/engine,
|
||||
/area/station/science/misc_lab)
|
||||
"wvT" = (
|
||||
@@ -115664,9 +115665,6 @@
|
||||
/obj/machinery/computer/camera_advanced/xenobio{
|
||||
dir = 8
|
||||
},
|
||||
/obj/machinery/ai_status_display{
|
||||
pixel_y = -32
|
||||
},
|
||||
/turf/simulated/floor/plasteel{
|
||||
dir = 6;
|
||||
icon_state = "whitepurple"
|
||||
@@ -117142,12 +117140,19 @@
|
||||
},
|
||||
/area/station/security/prison/cell_block)
|
||||
"xrN" = (
|
||||
/obj/structure/table,
|
||||
/obj/item/clothing/glasses/science{
|
||||
pixel_y = 4
|
||||
},
|
||||
/obj/item/clothing/glasses/science,
|
||||
/obj/machinery/alarm/directional/west,
|
||||
/obj/structure/table/glass,
|
||||
/obj/item/storage/surgical_tray,
|
||||
/obj/item/dissector,
|
||||
/obj/machinery/camera{
|
||||
c_tag = "Xenobiology Control";
|
||||
dir = 6;
|
||||
network = list("Research","SS13")
|
||||
},
|
||||
/obj/item/radio/intercom{
|
||||
name = "north bump";
|
||||
pixel_y = 28
|
||||
},
|
||||
/turf/simulated/floor/plasteel{
|
||||
dir = 1;
|
||||
icon_state = "whitepurplecorner"
|
||||
@@ -120854,6 +120859,7 @@
|
||||
/area/station/service/kitchen)
|
||||
"yfA" = (
|
||||
/obj/structure/table/glass,
|
||||
/obj/item/clothing/gloves/color/latex,
|
||||
/obj/item/slime_scanner,
|
||||
/obj/item/slime_scanner{
|
||||
pixel_y = 4;
|
||||
|
||||
@@ -13263,6 +13263,7 @@
|
||||
/obj/structure/chair/comfy/black{
|
||||
dir = 4
|
||||
},
|
||||
/obj/effect/landmark/start/xenobiologist,
|
||||
/turf/simulated/floor/plasteel{
|
||||
dir = 1;
|
||||
icon_state = "purple"
|
||||
@@ -30966,7 +30967,8 @@
|
||||
/obj/structure/disposalpipe/segment{
|
||||
dir = 4
|
||||
},
|
||||
/obj/effect/mapping_helpers/airlock/access/all/science/research,
|
||||
/obj/effect/mapping_helpers/airlock/access/any/science/xenobio,
|
||||
/obj/effect/mapping_helpers/airlock/access/any/science/tox,
|
||||
/turf/simulated/floor/plasteel{
|
||||
icon_state = "whitepurplefull"
|
||||
},
|
||||
@@ -32016,25 +32018,13 @@
|
||||
/area/station/maintenance/asmaint)
|
||||
"ddz" = (
|
||||
/obj/machinery/alarm/directional/east,
|
||||
/obj/structure/rack,
|
||||
/obj/item/storage/box/beakers{
|
||||
pixel_x = 6;
|
||||
pixel_y = 10
|
||||
},
|
||||
/obj/item/storage/box/syringes{
|
||||
pixel_x = -4;
|
||||
pixel_y = 5
|
||||
},
|
||||
/obj/item/scalpel{
|
||||
pixel_y = -2
|
||||
},
|
||||
/obj/item/hemostat{
|
||||
pixel_x = 10
|
||||
},
|
||||
/obj/effect/turf_decal/stripes/line{
|
||||
dir = 5
|
||||
},
|
||||
/obj/machinery/requests_console/directional/north,
|
||||
/obj/machinery/computer/operating{
|
||||
name = "dissection computer"
|
||||
},
|
||||
/turf/simulated/floor/plasteel{
|
||||
icon_state = "white"
|
||||
},
|
||||
@@ -34816,6 +34806,15 @@
|
||||
icon_state = "red"
|
||||
},
|
||||
/area/station/security/warden)
|
||||
"dZQ" = (
|
||||
/obj/effect/landmark/start/xenobiologist,
|
||||
/obj/structure/chair/office{
|
||||
dir = 8
|
||||
},
|
||||
/turf/simulated/floor/plasteel{
|
||||
icon_state = "white"
|
||||
},
|
||||
/area/station/science/xenobiology)
|
||||
"dZZ" = (
|
||||
/obj/structure/closet/emcloset,
|
||||
/turf/simulated/floor/plasteel,
|
||||
@@ -36981,10 +36980,10 @@
|
||||
/turf/simulated/floor/plating,
|
||||
/area/station/maintenance/fsmaint)
|
||||
"eMG" = (
|
||||
/obj/structure/closet/l3closet/scientist,
|
||||
/obj/structure/cable{
|
||||
icon_state = "1-2"
|
||||
},
|
||||
/obj/machinery/organ_analyzer,
|
||||
/turf/simulated/floor/plasteel{
|
||||
dir = 1;
|
||||
icon_state = "purple"
|
||||
@@ -37249,6 +37248,7 @@
|
||||
/obj/structure/chair/comfy/black{
|
||||
dir = 4
|
||||
},
|
||||
/obj/effect/landmark/start/xenobiologist,
|
||||
/turf/simulated/floor/plasteel{
|
||||
icon_state = "purple"
|
||||
},
|
||||
@@ -40600,7 +40600,6 @@
|
||||
/turf/simulated/floor/wood,
|
||||
/area/station/public/mrchangs)
|
||||
"gbz" = (
|
||||
/obj/item/kirbyplants/large,
|
||||
/obj/machinery/light_switch{
|
||||
dir = 4;
|
||||
name = "custom placement";
|
||||
@@ -41512,6 +41511,9 @@
|
||||
/obj/machinery/disposal/delivery_chute{
|
||||
dir = 1
|
||||
},
|
||||
/obj/effect/mapping_helpers/airlock/windoor/access/any/science/xenobio{
|
||||
dir = 1
|
||||
},
|
||||
/turf/simulated/floor/plasteel{
|
||||
dir = 10;
|
||||
icon_state = "purple"
|
||||
@@ -42608,8 +42610,6 @@
|
||||
/area/station/maintenance/asmaint)
|
||||
"gMT" = (
|
||||
/obj/structure/table/glass,
|
||||
/obj/item/slime_scanner,
|
||||
/obj/item/slime_scanner,
|
||||
/obj/item/radio/intercom{
|
||||
name = "west bump";
|
||||
pixel_x = -28
|
||||
@@ -42617,6 +42617,10 @@
|
||||
/obj/machinery/light{
|
||||
dir = 8
|
||||
},
|
||||
/obj/item/storage/belt/medical/surgery,
|
||||
/obj/item/reagent_containers/glass/bottle/reagent/morphine{
|
||||
pixel_y = 16
|
||||
},
|
||||
/turf/simulated/floor/plasteel{
|
||||
dir = 8;
|
||||
icon_state = "whitepurple"
|
||||
@@ -46573,10 +46577,6 @@
|
||||
icon_state = "whitegreen"
|
||||
},
|
||||
/area/station/medical/virology)
|
||||
"inr" = (
|
||||
/obj/structure/chair/office,
|
||||
/turf/simulated/floor/wood,
|
||||
/area/station/public/vacant_office)
|
||||
"inv" = (
|
||||
/obj/machinery/atmospherics/pipe/simple/hidden/supply{
|
||||
dir = 4
|
||||
@@ -48656,6 +48656,19 @@
|
||||
/obj/machinery/atmospherics/pipe/simple/heat_exchanging,
|
||||
/turf/simulated/floor/bluegrid/telecomms,
|
||||
/area/station/science/xenobiology)
|
||||
"jba" = (
|
||||
/obj/structure/cable{
|
||||
icon_state = "1-2"
|
||||
},
|
||||
/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,
|
||||
/obj/machinery/atmospherics/pipe/manifold/hidden/supply{
|
||||
dir = 4
|
||||
},
|
||||
/obj/structure/chair/office{
|
||||
dir = 4
|
||||
},
|
||||
/turf/simulated/floor/wood,
|
||||
/area/station/public/vacant_office)
|
||||
"jbe" = (
|
||||
/obj/effect/spawner/window/reinforced,
|
||||
/turf/simulated/floor/plating,
|
||||
@@ -51960,43 +51973,6 @@
|
||||
icon_state = "redfull"
|
||||
},
|
||||
/area/station/security/permabrig)
|
||||
"kls" = (
|
||||
/obj/structure/table/glass,
|
||||
/obj/item/stack/sheet/mineral/plasma{
|
||||
pixel_x = -2;
|
||||
pixel_y = -2
|
||||
},
|
||||
/obj/item/stack/sheet/mineral/plasma,
|
||||
/obj/item/stack/sheet/mineral/plasma{
|
||||
pixel_x = 2;
|
||||
pixel_y = 2
|
||||
},
|
||||
/obj/item/reagent_containers/dropper,
|
||||
/obj/item/reagent_containers/glass/beaker/large{
|
||||
pixel_x = -3;
|
||||
pixel_y = 3
|
||||
},
|
||||
/obj/item/reagent_containers/glass/beaker{
|
||||
pixel_x = 8;
|
||||
pixel_y = 2
|
||||
},
|
||||
/obj/machinery/light_switch{
|
||||
dir = 4;
|
||||
name = "custom placement";
|
||||
pixel_x = -24;
|
||||
pixel_y = -6
|
||||
},
|
||||
/obj/machinery/camera{
|
||||
c_tag = "Xenobiology - Fore";
|
||||
dir = 4;
|
||||
network = list("Research","SS13")
|
||||
},
|
||||
/obj/machinery/firealarm/directional/west,
|
||||
/turf/simulated/floor/plasteel{
|
||||
dir = 8;
|
||||
icon_state = "whitepurple"
|
||||
},
|
||||
/area/station/science/xenobiology)
|
||||
"klS" = (
|
||||
/obj/structure/table,
|
||||
/obj/machinery/recharger{
|
||||
@@ -52410,7 +52386,6 @@
|
||||
/turf/simulated/floor/plasteel,
|
||||
/area/station/hallway/primary/central/north)
|
||||
"kvh" = (
|
||||
/obj/structure/closet/bombcloset,
|
||||
/obj/structure/extinguisher_cabinet{
|
||||
name = "west bump";
|
||||
pixel_x = -27
|
||||
@@ -54284,12 +54259,29 @@
|
||||
pixel_y = -24;
|
||||
req_access = list(55)
|
||||
},
|
||||
/obj/item/book/manual/wiki/sop_science{
|
||||
pixel_y = 4
|
||||
},
|
||||
/obj/effect/turf_decal/stripes/line{
|
||||
dir = 6
|
||||
},
|
||||
/obj/item/reagent_containers/glass/beaker/large{
|
||||
pixel_x = -3;
|
||||
pixel_y = 3
|
||||
},
|
||||
/obj/item/reagent_containers/glass/beaker{
|
||||
pixel_x = 8;
|
||||
pixel_y = 2
|
||||
},
|
||||
/obj/item/stack/sheet/mineral/plasma{
|
||||
pixel_x = 2;
|
||||
pixel_y = 2
|
||||
},
|
||||
/obj/item/stack/sheet/mineral/plasma{
|
||||
pixel_x = 2;
|
||||
pixel_y = 2
|
||||
},
|
||||
/obj/item/stack/sheet/mineral/plasma{
|
||||
pixel_x = 2;
|
||||
pixel_y = 2
|
||||
},
|
||||
/turf/simulated/floor/plasteel{
|
||||
icon_state = "white"
|
||||
},
|
||||
@@ -56278,6 +56270,31 @@
|
||||
/obj/effect/spawner/random/dirt/maybe,
|
||||
/turf/simulated/floor/wood,
|
||||
/area/station/hallway/primary/central/south)
|
||||
"lOM" = (
|
||||
/obj/machinery/light_switch{
|
||||
dir = 4;
|
||||
name = "custom placement";
|
||||
pixel_x = -24;
|
||||
pixel_y = -6
|
||||
},
|
||||
/obj/machinery/camera{
|
||||
c_tag = "Xenobiology Lab - Fore";
|
||||
dir = 4;
|
||||
network = list("Research","SS13")
|
||||
},
|
||||
/obj/machinery/firealarm/directional/west,
|
||||
/obj/structure/shelf/science,
|
||||
/obj/item/slime_scanner,
|
||||
/obj/item/slime_scanner,
|
||||
/obj/item/book/manual/wiki/sop_science{
|
||||
pixel_y = 4
|
||||
},
|
||||
/obj/item/clothing/gloves/color/latex,
|
||||
/turf/simulated/floor/plasteel{
|
||||
dir = 8;
|
||||
icon_state = "whitepurple"
|
||||
},
|
||||
/area/station/science/xenobiology)
|
||||
"lOU" = (
|
||||
/obj/machinery/atmospherics/pipe/simple/visible/cyan,
|
||||
/obj/effect/turf_decal/stripes/line{
|
||||
@@ -58072,6 +58089,22 @@
|
||||
/obj/structure/flora/ausbushes/fullgrass,
|
||||
/turf/simulated/floor/grass/no_creep,
|
||||
/area/station/science/research)
|
||||
"myY" = (
|
||||
/obj/effect/turf_decal/stripes/line,
|
||||
/obj/structure/table/glass,
|
||||
/obj/item/storage/box/beakers{
|
||||
pixel_x = 6;
|
||||
pixel_y = 10
|
||||
},
|
||||
/obj/item/storage/box/syringes{
|
||||
pixel_x = -4;
|
||||
pixel_y = 5
|
||||
},
|
||||
/obj/item/reagent_containers/dropper,
|
||||
/turf/simulated/floor/plasteel{
|
||||
icon_state = "white"
|
||||
},
|
||||
/area/station/science/xenobiology)
|
||||
"mzf" = (
|
||||
/obj/structure/window/plasmareinforced{
|
||||
dir = 1
|
||||
@@ -58824,19 +58857,6 @@
|
||||
/obj/machinery/atmospherics/meter,
|
||||
/turf/simulated/floor/plating,
|
||||
/area/station/maintenance/asmaint)
|
||||
"mOa" = (
|
||||
/obj/structure/cable{
|
||||
icon_state = "1-2"
|
||||
},
|
||||
/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,
|
||||
/obj/structure/chair/office{
|
||||
dir = 4
|
||||
},
|
||||
/obj/machinery/atmospherics/pipe/manifold/hidden/supply{
|
||||
dir = 4
|
||||
},
|
||||
/turf/simulated/floor/wood,
|
||||
/area/station/public/vacant_office)
|
||||
"mOc" = (
|
||||
/obj/structure/cable{
|
||||
icon_state = "1-2"
|
||||
@@ -60059,10 +60079,14 @@
|
||||
/area/station/hallway/secondary/entry/west)
|
||||
"nfR" = (
|
||||
/obj/structure/table/glass,
|
||||
/obj/item/clothing/gloves/color/latex,
|
||||
/obj/effect/turf_decal/stripes/line{
|
||||
dir = 1
|
||||
},
|
||||
/obj/item/storage/surgical_tray,
|
||||
/obj/item/dissector,
|
||||
/obj/item/reagent_containers/glass/bottle/reagent/formaldehyde{
|
||||
pixel_x = -15
|
||||
},
|
||||
/turf/simulated/floor/plasteel{
|
||||
icon_state = "white"
|
||||
},
|
||||
@@ -61306,6 +61330,12 @@
|
||||
},
|
||||
/turf/simulated/floor/plasteel,
|
||||
/area/station/public/dorms)
|
||||
"nEy" = (
|
||||
/obj/structure/chair/office{
|
||||
dir = 8
|
||||
},
|
||||
/turf/simulated/floor/wood,
|
||||
/area/station/public/vacant_office)
|
||||
"nEz" = (
|
||||
/obj/effect/spawner/airlock/s_to_n,
|
||||
/obj/effect/spawner/window/reinforced/grilled,
|
||||
@@ -70273,6 +70303,15 @@
|
||||
icon_state = "dark"
|
||||
},
|
||||
/area/station/security/armory/secure)
|
||||
"qWf" = (
|
||||
/obj/effect/turf_decal/stripes/line{
|
||||
dir = 1
|
||||
},
|
||||
/obj/machinery/optable,
|
||||
/turf/simulated/floor/plasteel{
|
||||
icon_state = "white"
|
||||
},
|
||||
/area/station/science/xenobiology)
|
||||
"qWm" = (
|
||||
/obj/structure/cable{
|
||||
icon_state = "0-4"
|
||||
@@ -70698,14 +70737,6 @@
|
||||
/obj/structure/reagent_dispensers/fueltank,
|
||||
/turf/simulated/floor/plating,
|
||||
/area/station/maintenance/starboard2)
|
||||
"rdg" = (
|
||||
/obj/structure/chair/office{
|
||||
dir = 8
|
||||
},
|
||||
/turf/simulated/floor/plasteel{
|
||||
icon_state = "white"
|
||||
},
|
||||
/area/station/science/xenobiology)
|
||||
"rdi" = (
|
||||
/obj/effect/decal/cleanable/dirt,
|
||||
/obj/structure/chair/wheelchair,
|
||||
@@ -76550,12 +76581,6 @@
|
||||
/obj/structure/lattice/catwalk,
|
||||
/turf/space,
|
||||
/area/station/engineering/solar/fore_port)
|
||||
"tpn" = (
|
||||
/obj/structure/chair/office{
|
||||
dir = 8
|
||||
},
|
||||
/turf/simulated/floor/wood,
|
||||
/area/station/public/vacant_office)
|
||||
"tpq" = (
|
||||
/obj/structure/lattice,
|
||||
/obj/structure/sign/electricshock{
|
||||
@@ -80195,7 +80220,10 @@
|
||||
/obj/structure/cable{
|
||||
icon_state = "1-2"
|
||||
},
|
||||
/obj/effect/mapping_helpers/airlock/windoor/access/all/science/tox{
|
||||
/obj/effect/mapping_helpers/airlock/windoor/access/any/science/xenobio{
|
||||
dir = 1
|
||||
},
|
||||
/obj/effect/mapping_helpers/airlock/windoor/access/any/science/tox{
|
||||
dir = 1
|
||||
},
|
||||
/turf/simulated/floor/plasteel,
|
||||
@@ -81955,6 +81983,10 @@
|
||||
/obj/machinery/atmospherics/pipe/simple/hidden/cyan,
|
||||
/turf/simulated/floor/plating,
|
||||
/area/station/maintenance/fore)
|
||||
"vvH" = (
|
||||
/obj/structure/chair/office,
|
||||
/turf/simulated/floor/wood,
|
||||
/area/station/public/vacant_office)
|
||||
"vvU" = (
|
||||
/obj/machinery/keycard_auth{
|
||||
pixel_y = -4;
|
||||
@@ -82294,12 +82326,13 @@
|
||||
/obj/machinery/door/airlock/research/glass{
|
||||
name = "Test Chamber"
|
||||
},
|
||||
/obj/effect/mapping_helpers/airlock/access/all/science/research,
|
||||
/obj/structure/disposalpipe/segment,
|
||||
/obj/machinery/door/firedoor,
|
||||
/obj/structure/cable{
|
||||
icon_state = "1-2"
|
||||
},
|
||||
/obj/effect/mapping_helpers/airlock/access/any/science/xenobio,
|
||||
/obj/effect/mapping_helpers/airlock/access/any/science/tox_storage,
|
||||
/turf/simulated/floor/plasteel{
|
||||
icon_state = "white"
|
||||
},
|
||||
@@ -84041,10 +84074,10 @@
|
||||
},
|
||||
/area/station/hallway/primary/fore/west)
|
||||
"wsf" = (
|
||||
/obj/item/kirbyplants/large/plant12,
|
||||
/obj/structure/window/reinforced{
|
||||
dir = 8
|
||||
},
|
||||
/obj/structure/closet/bombcloset,
|
||||
/turf/simulated/floor/plasteel{
|
||||
dir = 1;
|
||||
icon_state = "purple"
|
||||
@@ -85264,7 +85297,10 @@
|
||||
name = "Science Chemistry";
|
||||
dir = 1
|
||||
},
|
||||
/obj/effect/mapping_helpers/airlock/windoor/access/all/science/tox{
|
||||
/obj/effect/mapping_helpers/airlock/windoor/access/any/science/xenobio{
|
||||
dir = 1
|
||||
},
|
||||
/obj/effect/mapping_helpers/airlock/windoor/access/any/science/tox{
|
||||
dir = 1
|
||||
},
|
||||
/turf/simulated/floor/plasteel,
|
||||
@@ -86724,10 +86760,10 @@
|
||||
pixel_y = 8;
|
||||
anchored = 1
|
||||
},
|
||||
/obj/effect/mapping_helpers/airlock/windoor/access/any/science/research{
|
||||
/obj/structure/table/reinforced,
|
||||
/obj/effect/mapping_helpers/airlock/windoor/access/any/science/tox{
|
||||
dir = 4
|
||||
},
|
||||
/obj/structure/table/reinforced,
|
||||
/turf/simulated/floor/plasteel{
|
||||
icon_state = "whitepurplefull"
|
||||
},
|
||||
@@ -100577,7 +100613,7 @@ oJl
|
||||
eoq
|
||||
bHf
|
||||
bHf
|
||||
tpn
|
||||
nEy
|
||||
eoq
|
||||
bHf
|
||||
bFp
|
||||
@@ -100836,7 +100872,7 @@ vsf
|
||||
dNc
|
||||
vsf
|
||||
xyi
|
||||
inr
|
||||
vvH
|
||||
eyr
|
||||
bFp
|
||||
mbZ
|
||||
@@ -101088,7 +101124,7 @@ kOX
|
||||
yem
|
||||
rRg
|
||||
bHg
|
||||
mOa
|
||||
jba
|
||||
niq
|
||||
pCP
|
||||
mpH
|
||||
@@ -131229,7 +131265,7 @@ aaa
|
||||
uQm
|
||||
fcb
|
||||
gMT
|
||||
kls
|
||||
lOM
|
||||
xPh
|
||||
gbz
|
||||
kvh
|
||||
@@ -131485,12 +131521,12 @@ aaa
|
||||
aaa
|
||||
fvN
|
||||
nfR
|
||||
rdg
|
||||
dZQ
|
||||
cNz
|
||||
sFS
|
||||
cNz
|
||||
cNz
|
||||
kjo
|
||||
fbq
|
||||
fvN
|
||||
aaa
|
||||
aaa
|
||||
@@ -131741,13 +131777,13 @@ abf
|
||||
aaa
|
||||
aaa
|
||||
fvN
|
||||
iUe
|
||||
qWf
|
||||
cEA
|
||||
gZe
|
||||
deu
|
||||
sFX
|
||||
pNz
|
||||
fbq
|
||||
myY
|
||||
fvN
|
||||
aaa
|
||||
aaa
|
||||
|
||||
@@ -37,7 +37,7 @@
|
||||
#define JOB_ROBOTICIST (1<<8)
|
||||
#define JOB_PARAMEDIC (1<<9)
|
||||
#define JOB_CORONER (1<<10)
|
||||
|
||||
#define JOB_XENOBIOLOGIST (1<<15)
|
||||
|
||||
#define JOBCAT_SUPPORT (1<<2)
|
||||
|
||||
|
||||
@@ -744,6 +744,20 @@ do { \
|
||||
#define BANK_PIN_MIN 10000
|
||||
#define BANK_PIN_MAX 99999
|
||||
|
||||
/// Defines for hidden organ techs
|
||||
#define TECH_MATERIAL "material"
|
||||
#define TECH_ENGINEERING "engineering"
|
||||
#define TECH_PLASMA "plasma"
|
||||
#define TECH_POWER "power"
|
||||
#define TECH_BLUESPACE "bluespace"
|
||||
#define TECH_BIO "biotech"
|
||||
#define TECH_COMBAT "combat"
|
||||
#define TECH_MAGNETS "magnets"
|
||||
#define TECH_PROGRAM "programming"
|
||||
#define TECH_TOXINS "toxins"
|
||||
#define TECH_SYNDICATE "syndicate"
|
||||
#define TECH_ABDUCTOR "abductor"
|
||||
|
||||
//! The number of seconds between the start of the UNIX and BYOND epochs.
|
||||
#define BYOND_EPOCH_UNIX 946702800
|
||||
|
||||
|
||||
@@ -16,6 +16,11 @@
|
||||
#define ORGAN_DATUM_LUNGS "lungs"
|
||||
#define ORGAN_DATUM_BATTERY "battery"
|
||||
|
||||
// Organ quality datums.
|
||||
#define ORGAN_DAMAGED 1
|
||||
#define ORGAN_NORMAL 2
|
||||
#define ORGAN_PRISTINE 3
|
||||
|
||||
// For limb resistance flags
|
||||
#define CANNOT_BREAK (1 << 0)
|
||||
#define CANNOT_DISMEMBER (1 << 1)
|
||||
|
||||
@@ -26,6 +26,7 @@ GLOBAL_LIST_INIT(construction_tool_behaviors, list(
|
||||
#define TOOL_BONESET "bone setter"
|
||||
#define TOOL_BONEGEL "bone gel"
|
||||
#define TOOL_FIXOVEIN "fix-o-vein"
|
||||
#define TOOL_DISSECTOR "dissector"
|
||||
|
||||
GLOBAL_LIST_INIT(surgery_tool_behaviors, list(
|
||||
TOOL_RETRACTOR,
|
||||
@@ -36,7 +37,8 @@ GLOBAL_LIST_INIT(surgery_tool_behaviors, list(
|
||||
TOOL_SAW,
|
||||
TOOL_BONESET,
|
||||
TOOL_BONEGEL,
|
||||
TOOL_FIXOVEIN
|
||||
TOOL_FIXOVEIN,
|
||||
TOOL_DISSECTOR,
|
||||
))
|
||||
|
||||
#define MIN_TOOL_SOUND_DELAY 20
|
||||
|
||||
@@ -176,3 +176,18 @@ GLOBAL_DATUM(syndicate_code_response_regex, /regex)
|
||||
newKey += pick("diamond", "beer", "mushroom", "assistant", "clown", "captain", "twinkie", "security", "nuke", "small", "big", "escape", "yellow", "gloves", "monkey", "engine", "nuclear", "ai")
|
||||
newKey += pick("1", "2", "3", "4", "5", "6", "7", "8", "9", "0")
|
||||
return newKey
|
||||
|
||||
/proc/quality_to_string(quality, use_normal = FALSE)
|
||||
if(!quality)
|
||||
return
|
||||
switch(quality)
|
||||
if(ORGAN_DAMAGED)
|
||||
return "Damaged"
|
||||
if(ORGAN_NORMAL)
|
||||
if(use_normal)
|
||||
return "Normal"
|
||||
else
|
||||
return ""
|
||||
if(ORGAN_PRISTINE)
|
||||
return "Pristine"
|
||||
|
||||
|
||||
@@ -52,5 +52,6 @@
|
||||
TOOL_RETRACTOR,
|
||||
TOOL_SAW,
|
||||
TOOL_SCALPEL,
|
||||
TOOL_SCREWDRIVER
|
||||
TOOL_SCREWDRIVER,
|
||||
TOOL_DISSECTOR,
|
||||
)
|
||||
|
||||
@@ -340,6 +340,11 @@ Remember to update _globalvars/traits.dm if you're adding/removing/renaming trai
|
||||
/// Trait applied to a mob when it gets a required "operational datum" (components/elements). Sends out the source as the type of the element.
|
||||
#define TRAIT_SUBTREE_REQUIRED_OPERATIONAL_DATUM "element-required"
|
||||
|
||||
//****** ORGAN TRAITS *****//
|
||||
|
||||
/// Does this person produce loud runechat
|
||||
#define TRAIT_LOUD "loud"
|
||||
|
||||
//****** OBJ TRAITS *****//
|
||||
|
||||
///An /obj that should not increase the "depth" of the search for adjacency,
|
||||
@@ -378,6 +383,7 @@ Remember to update _globalvars/traits.dm if you're adding/removing/renaming trai
|
||||
#define EYES_OF_GOD "eyes_of_god"
|
||||
#define GHOSTED "isghost"
|
||||
#define GHOST_ROLE "ghost_role"
|
||||
#define ORGAN_TRAIT "organ"
|
||||
|
||||
// unique trait sources
|
||||
#define STATUE_MUTE "statue"
|
||||
|
||||
@@ -130,6 +130,7 @@ GLOBAL_LIST_INIT(maintenance_loot_tier_2, list(
|
||||
/obj/item/clothing/head/welding,
|
||||
/obj/item/crowbar/red,
|
||||
/obj/item/storage/belt/utility,
|
||||
/obj/item/dissector,
|
||||
/obj/effect/spawner/random/smithed_item/any,
|
||||
) = 45,
|
||||
|
||||
|
||||
@@ -35,3 +35,33 @@ GLOBAL_LIST_EMPTY(surgeries_list)
|
||||
GLOBAL_LIST_EMPTY(hear_radio_list) //Mobs that hear the radio even if there's no client
|
||||
|
||||
GLOBAL_LIST_EMPTY(emote_list)
|
||||
|
||||
// Dear God
|
||||
GLOBAL_LIST_INIT(migo_sounds, list(
|
||||
'sound/items/bubblewrap.ogg', 'sound/items/change_jaws.ogg', 'sound/items/crowbar.ogg', 'sound/items/drink.ogg',
|
||||
'sound/items/deconstruct.ogg', 'sound/items/change_drill.ogg', 'sound/items/dodgeball.ogg', 'sound/items/eatfood.ogg', 'sound/items/screwdriver.ogg',
|
||||
'sound/items/weeoo1.ogg', 'sound/items/wirecutter.ogg', 'sound/items/welder.ogg', 'sound/items/zip.ogg', 'sound/items/rped.ogg', 'sound/items/ratchet.ogg',
|
||||
'sound/items/polaroid1.ogg', 'sound/items/pshoom.ogg', 'sound/items/airhorn.ogg', 'sound/voice/bcreep.ogg', 'sound/voice/biamthelaw.ogg', 'sound/voice/ed209_20sec.ogg',
|
||||
'sound/voice/hiss3.ogg', 'sound/voice/hiss6.ogg', 'sound/voice/mpatchedup.ogg', 'sound/voice/mfeelbetter.ogg', 'sound/weapons/sear.ogg', 'sound/ambience/antag/tatoralert.ogg',
|
||||
'sound/mecha/nominal.ogg', 'sound/mecha/weapdestr.ogg', 'sound/mecha/critdestr.ogg', 'sound/mecha/imag_enh.ogg', 'sound/effects/adminhelp.ogg', 'sound/effects/alert.ogg',
|
||||
'sound/effects/attackblob.ogg', 'sound/effects/bamf.ogg', 'sound/effects/blobattack.ogg', 'sound/effects/break_stone.ogg', 'sound/effects/bubbles.ogg',
|
||||
'sound/effects/bubbles2.ogg', 'sound/effects/clang.ogg', 'sound/effects/clownstep2.ogg', 'sound/effects/dimensional_rend.ogg', 'sound/effects/doorcreaky.ogg',
|
||||
'sound/effects/empulse.ogg', 'sound/effects/explosionfar.ogg', 'sound/effects/explosion1.ogg', 'sound/effects/grillehit.ogg', 'sound/effects/genetics.ogg',
|
||||
'sound/effects/heartbeat.ogg', 'sound/effects/hyperspace_begin.ogg', 'sound/effects/hyperspace_end.ogg', 'sound/goonstation/effects/screech.ogg', 'sound/effects/phasein.ogg',
|
||||
'sound/effects/picaxe1.ogg', 'sound/effects/sparks1.ogg', 'sound/effects/smoke.ogg', 'sound/effects/splat.ogg', 'sound/effects/snap.ogg', 'sound/effects/tendril_destroyed.ogg',
|
||||
'sound/effects/supermatter.ogg', 'sound/misc/desceration-01.ogg', 'sound/misc/desceration-02.ogg', 'sound/misc/desceration-03.ogg', 'sound/misc/bloblarm.ogg',
|
||||
'sound/goonstation/misc/airraid_loop.ogg', 'sound/misc/interference.ogg', 'sound/misc/notice1.ogg', 'sound/misc/notice2.ogg', 'sound/misc/sadtrombone.ogg', 'sound/misc/slip.ogg',
|
||||
'sound/weapons/armbomb.ogg', 'sound/weapons/chainsaw.ogg', 'sound/weapons/emitter.ogg', 'sound/weapons/emitter2.ogg', 'sound/weapons/blade1.ogg', 'sound/weapons/bladeslice.ogg',
|
||||
'sound/weapons/blastcannon.ogg', 'sound/weapons/blaster.ogg', 'sound/weapons/bulletflyby3.ogg', 'sound/weapons/circsawhit.ogg', 'sound/weapons/cqchit2.ogg', 'sound/weapons/drill.ogg',
|
||||
'sound/weapons/genhit1.ogg', 'sound/weapons/gunshots/gunshot_silenced.ogg', 'sound/weapons/gunshots/gunshot.ogg', 'sound/weapons/handcuffs.ogg', 'sound/weapons/homerun.ogg',
|
||||
'sound/weapons/kenetic_accel.ogg','sound/machines/fryer/deep_fryer_emerge.ogg', 'sound/machines/airlock_alien_prying.ogg', 'sound/machines/airlock_close.ogg',
|
||||
'sound/machines/airlockforced.ogg', 'sound/machines/airlock_open.ogg', 'sound/machines/alarm.ogg', 'sound/machines/blender.ogg', 'sound/machines/boltsdown.ogg',
|
||||
'sound/machines/boltsup.ogg', 'sound/machines/buzz-sigh.ogg', 'sound/machines/buzz-two.ogg', 'sound/machines/chime.ogg', 'sound/machines/defib_charge.ogg',
|
||||
'sound/machines/defib_failed.ogg', 'sound/machines/defib_ready.ogg', 'sound/machines/defib_zap.ogg', 'sound/machines/deniedbeep.ogg', 'sound/machines/ding.ogg',
|
||||
'sound/machines/disposalflush.ogg', 'sound/machines/door_close.ogg', 'sound/machines/door_open.ogg', 'sound/machines/engine_alert1.ogg', 'sound/machines/engine_alert2.ogg',
|
||||
'sound/machines/hiss.ogg', 'sound/machines/honkbot_evil_laugh.ogg', 'sound/machines/juicer.ogg', 'sound/machines/ping.ogg', 'sound/ambience/signal.ogg', 'sound/machines/synth_no.ogg',
|
||||
'sound/machines/synth_yes.ogg', 'sound/machines/terminal_alert.ogg', 'sound/machines/twobeep.ogg', 'sound/machines/ventcrawl.ogg', 'sound/machines/warning-buzzer.ogg',
|
||||
'sound/ai/outbreak5.ogg', 'sound/ai/outbreak7.ogg', 'sound/ai/alert.ogg', 'sound/ai/radiation.ogg', 'sound/ai/eshuttle_call.ogg', 'sound/ai/eshuttle_dock.ogg',
|
||||
'sound/ai/eshuttle_recall.ogg', 'sound/ai/aimalf.ogg', 'sound/ambience/ambigen1.ogg', 'sound/ambience/ambigen3.ogg', 'sound/ambience/ambigen4.ogg', 'sound/ambience/ambigen5.ogg',
|
||||
'sound/ambience/ambigen6.ogg', 'sound/ambience/ambigen10.ogg', 'sound/hallucinations/over_here1.ogg', 'sound/hallucinations/over_here2.ogg', 'sound/hallucinations/over_here3.ogg',
|
||||
))
|
||||
|
||||
@@ -72,6 +72,9 @@ GLOBAL_VAR_INIT(sparks_active, 0)
|
||||
///Counter for the current amount of smoke
|
||||
GLOBAL_VAR_INIT(smokes_active, 0)
|
||||
|
||||
/// what xeno organs have been scanned today?
|
||||
GLOBAL_LIST_EMPTY(scanned_organs)
|
||||
|
||||
/// A list of types of objects we want to record in admin logs when
|
||||
/// a player starts pulling them.
|
||||
GLOBAL_LIST_INIT(log_pulltypes, list(
|
||||
|
||||
@@ -116,6 +116,7 @@ GLOBAL_LIST_INIT(traits_by_type, list(
|
||||
"TRAIT_EXAMINE_HALLUCINATING" = TRAIT_EXAMINE_HALLUCINATING,
|
||||
"TRAIT_SUBTREE_REQUIRED_OPERATIONAL_DATUM" = TRAIT_SUBTREE_REQUIRED_OPERATIONAL_DATUM,
|
||||
"TRAIT_RELAYING_ATTACKER" = TRAIT_RELAYING_ATTACKER,
|
||||
"TRAIT_LOUD" = TRAIT_LOUD,
|
||||
),
|
||||
|
||||
/datum/mind = list(
|
||||
|
||||
@@ -141,8 +141,11 @@
|
||||
symbol = null
|
||||
output_color = "#b826b3"
|
||||
else
|
||||
if(ishuman(target))
|
||||
var/mob/living/carbon/human/H = target
|
||||
if(HAS_TRAIT(H, TRAIT_LOUD))
|
||||
size = "big"
|
||||
symbol = null
|
||||
|
||||
// Approximate text height
|
||||
var/static/regex/html_metachars = new(@"&[A-Za-z]{1,7};", "g")
|
||||
var/complete_text = "<span class='center maptext[size ? " [size]" : ""]' style='[italics ? "font-style: italic; " : ""]color: [output_color]'>[symbol][text]</span>"
|
||||
|
||||
@@ -0,0 +1,76 @@
|
||||
/// Allows humanoids to eat arbitrary items
|
||||
/datum/component/special_tastes
|
||||
/// associated list of item to reagents and tastes
|
||||
/// Typepath = (list(reagents = list(reagents), tastes = list(tastes)); Ex: list(/obj/item/stack/sheet/mineral/silver = list("reagents" = list("nutriment" = 5, "vitamin" = 1), "tastes" = list("metal and blood" = 1)))
|
||||
var/list/obj/item/edible_items = list()
|
||||
|
||||
/datum/component/special_tastes/Initialize(list/edible_items)
|
||||
if(!length(edible_items))
|
||||
return COMPONENT_INCOMPATIBLE
|
||||
if(!ishuman(parent))
|
||||
return COMPONENT_INCOMPATIBLE
|
||||
for(var/obj/item/current_item as anything in edible_items)
|
||||
if(!islist(edible_items[current_item])) // if not a list of reagents
|
||||
return COMPONENT_INCOMPATIBLE
|
||||
src.edible_items = edible_items
|
||||
RegisterSignal(parent, COMSIG_ATTACK_BY, PROC_REF(attempt_ingest))
|
||||
|
||||
/// check if item is in the list of potential food
|
||||
/datum/component/special_tastes/proc/attempt_ingest(datum/source, obj/item/attacking_item, mob/living/carbon/human/attacker)
|
||||
SIGNAL_HANDLER // COMSIG_ATTACK_BY
|
||||
if(parent != attacker) // only if they attack themselves with it
|
||||
return
|
||||
var/is_edible = FALSE
|
||||
var/obj/item/similar_to
|
||||
for(var/potential_type in edible_items)
|
||||
if(istype(attacking_item, potential_type))
|
||||
is_edible = TRUE
|
||||
similar_to = potential_type
|
||||
break
|
||||
if(!is_edible)
|
||||
return
|
||||
attempt_to_eat(attacker, attacking_item, similar_to)
|
||||
return COMPONENT_SKIP_AFTERATTACK
|
||||
|
||||
/// Handle eating and nutrition gain from eating minerals
|
||||
/datum/component/special_tastes/proc/attempt_to_eat(mob/living/carbon/human/user, obj/item/attacking_item, obj/item/similar_to)
|
||||
if(istype(attacking_item, /obj/item/stack))
|
||||
var/obj/item/stack/stacked_item = attacking_item
|
||||
if(stacked_item.amount > 1)
|
||||
to_chat(user, "<span class='notice'>You can only eat one of [stacked_item] at a time.</span>")
|
||||
return
|
||||
var/obj/item/food/food = turn_into_food(attacking_item, similar_to)
|
||||
user.drop_item_to_ground(attacking_item, TRUE, TRUE)
|
||||
user.put_in_active_hand(food)
|
||||
var/fullness = user.nutrition + 10
|
||||
for(var/datum/reagent/consumable/chem in food.reagents.reagent_list)
|
||||
fullness += chem.nutriment_factor * chem.volume / (chem.metabolization_rate * user.metabolism_efficiency)
|
||||
if(!(fullness > (600 * (1 + user.overeatduration / 2000)))) // need to work around the sleep()'s in eat()
|
||||
user.consume(food)
|
||||
food.On_Consume(user, user)
|
||||
qdel(attacking_item)
|
||||
return // couldnt eat it, undo
|
||||
to_chat(user, "<span class='notice'>You are too full to eat [attacking_item].</span>")
|
||||
user.drop_item_to_ground(food, TRUE, TRUE)
|
||||
user.put_in_active_hand(attacking_item)
|
||||
qdel(food)
|
||||
|
||||
/// Turn the item into food, can only be eaten in 1 bite to prevent creating a half-eaten item that those without the trait can also eat.
|
||||
/datum/component/special_tastes/proc/turn_into_food(obj/item/future_food, obj/item/similar_to)
|
||||
var/obj/item/food/food = new
|
||||
food.name = future_food.name
|
||||
food.desc = future_food.desc
|
||||
food.icon = future_food.icon
|
||||
food.icon_state = future_food.icon_state
|
||||
var/list/food_info = edible_items[similar_to]
|
||||
var/list/chem_info = food_info["reagents"]
|
||||
var/list/taste_info = food_info["tastes"]
|
||||
for(var/reagent_id in chem_info)
|
||||
var/reagent_amount = chem_info[reagent_id]
|
||||
food.reagents.add_reagent(reagent_id, reagent_amount, taste_info.Copy())
|
||||
food.bitesize = food.reagents.total_volume
|
||||
return food
|
||||
|
||||
/datum/component/special_tastes/Destroy(force, silent)
|
||||
UnregisterSignal(parent, COMSIG_ATTACK_BY)
|
||||
return ..()
|
||||
@@ -82,7 +82,7 @@
|
||||
return
|
||||
if(!IS_HORIZONTAL(L) && !can_start_on_stander)
|
||||
return
|
||||
if(IS_HORIZONTAL(L) && !on_operable_surface(L))
|
||||
if(IS_HORIZONTAL(L) && !on_operable_surface(L) && !isanimal(L))
|
||||
return
|
||||
if(iscarbon(target))
|
||||
var/mob/living/carbon/C = target
|
||||
@@ -128,7 +128,7 @@
|
||||
var/datum/surgery/procedure
|
||||
|
||||
if(!length(available_surgeries))
|
||||
if(IS_HORIZONTAL(target))
|
||||
if(IS_HORIZONTAL(target) || isanimal(target))
|
||||
to_chat(user, "<span class='notice'>There aren't any surgeries you can perform there right now.</span>")
|
||||
else
|
||||
to_chat(user, "<span class='notice'>You can't perform any surgeries there while [target] is standing.</span>")
|
||||
@@ -209,8 +209,7 @@
|
||||
if(!affected)
|
||||
skip_surgery = TRUE
|
||||
|
||||
else
|
||||
// uh there's no reason this should be hit but let's be safe LOL
|
||||
else if(!isanimal(patient)) // surgery is base to living mobs now but we should still probably restrict this
|
||||
skip_surgery = TRUE
|
||||
|
||||
if(!skip_surgery)
|
||||
@@ -288,9 +287,15 @@
|
||||
|
||||
return
|
||||
|
||||
if(!isnull(affecting_limb) && (surgery.requires_organic_bodypart && affecting_limb.is_robotic()) || (!surgery.requires_organic_bodypart && !affecting_limb.is_robotic()))
|
||||
to_chat(user, "<span class='warning'>That's not the right type of limb for this operation!</span>")
|
||||
return
|
||||
if(iscarbon(target))
|
||||
if(!isnull(affecting_limb))
|
||||
if((surgery.requires_organic_bodypart && affecting_limb.is_robotic()) || (!surgery.requires_organic_bodypart && !affecting_limb.is_robotic()))
|
||||
to_chat(user, "<span class='warning'>That's not the right type of limb for this operation!</span>")
|
||||
return
|
||||
|
||||
if(surgery_needs_exposure(surgery, target))
|
||||
to_chat(user, "<span class='warning'>You have to expose [target.p_their()] [parse_zone(selected_zone)] first!</span>")
|
||||
return
|
||||
|
||||
if(surgery.lying_required && !on_operable_surface(target))
|
||||
to_chat(user, "<span class='notice'>Patient must be lying down for this operation.</span>")
|
||||
@@ -304,12 +309,16 @@
|
||||
to_chat(user, "<span class='warning'>Can't start the surgery!</span>")
|
||||
return
|
||||
|
||||
if(surgery_needs_exposure(surgery, target))
|
||||
to_chat(user, "<span class='warning'>You have to expose [target.p_their()] [parse_zone(selected_zone)] first!</span>")
|
||||
return
|
||||
|
||||
var/datum/surgery/procedure = new surgery.type(target, selected_zone, affecting_limb)
|
||||
|
||||
// Need to pass dissection its steps because it changes alot depending on the creature
|
||||
if(istype(procedure, /datum/surgery/dissect))
|
||||
if(isnull(target.surgery_container))
|
||||
log_debug("A dissection was started on [target] with contains_xeno_organ as TRUE, however its surgery_container was null!")
|
||||
CRASH("<span class='userdanger'>[target] does not have a dissection surgery information set to it. Please inform an admin or developer.</span>")
|
||||
if(ispath(target.surgery_container, /datum/xenobiology_surgery_container))
|
||||
target.surgery_container = new target.surgery_container
|
||||
procedure.steps = target.surgery_container.dissection_tool_step
|
||||
|
||||
RegisterSignal(procedure, COMSIG_SURGERY_BLOOD_SPLASH, PROC_REF(on_blood_splash))
|
||||
|
||||
@@ -382,7 +391,6 @@
|
||||
)
|
||||
return
|
||||
|
||||
|
||||
if(!isnull(surgery_start_sound))
|
||||
playsound(src, surgery_start_sound, 50, TRUE)
|
||||
|
||||
|
||||
@@ -193,6 +193,7 @@
|
||||
/datum/job/rd = /obj/item/organ/internal/cyberimp/eyes/hud/diagnostic,
|
||||
/datum/job/roboticist = /obj/item/organ/internal/cyberimp/eyes/hud/diagnostic,
|
||||
/datum/job/scientist = /obj/item/organ/internal/ears/cybernetic,
|
||||
/datum/job/xenobiologist = /obj/item/organ/internal/cyberimp/arm/surgery,
|
||||
/datum/job/officer = /obj/item/organ/internal/cyberimp/eyes/hud/security,
|
||||
/datum/job/mining = /obj/item/organ/internal/eyes/cybernetic/meson,
|
||||
/datum/job/engineer = /obj/item/organ/internal/eyes/cybernetic/shield,
|
||||
|
||||
@@ -1,3 +1,4 @@
|
||||
|
||||
///////////////////////////////////
|
||||
// POWERS
|
||||
///////////////////////////////////
|
||||
@@ -364,6 +365,24 @@
|
||||
..()
|
||||
block = GLOB.eatblock
|
||||
|
||||
// checks with those with the hungry organ from adding/removing matter eater
|
||||
/datum/mutation/grant_spell/mattereater/activate(mob/living/M)
|
||||
if(ishuman(M))
|
||||
var/mob/living/carbon/human/H = M
|
||||
var/obj/item/organ/internal/liver/xenobiology/hungry/O = H.get_int_organ(/obj/item/organ/internal/liver/xenobiology/hungry)
|
||||
if(O)
|
||||
return
|
||||
return ..()
|
||||
|
||||
/datum/mutation/grant_spell/mattereater/deactivate(mob/living/M)
|
||||
if(ishuman(M))
|
||||
var/mob/living/carbon/human/H = M
|
||||
var/obj/item/organ/internal/liver/xenobiology/hungry/O = H.get_int_organ(/obj/item/organ/internal/liver/xenobiology/hungry)
|
||||
if(O)
|
||||
return
|
||||
return ..()
|
||||
|
||||
|
||||
/datum/spell/eat
|
||||
name = "Eat"
|
||||
desc = "Eat just about anything!"
|
||||
|
||||
@@ -9,12 +9,18 @@
|
||||
organ_datums = list(/datum/organ/heart/always_beating, /datum/organ/battery) // alien glands are immune to stopping, and provide power to IPCs
|
||||
tough = TRUE //not easily broken by combat damage
|
||||
|
||||
var/cooldown_low = 300
|
||||
var/cooldown_high = 300
|
||||
var/next_activation = 0
|
||||
var/uses // -1 For inifinite
|
||||
var/human_only = FALSE
|
||||
/// Do these organs have an repeatable ongoing effects?
|
||||
var/has_ongoing_effect = TRUE
|
||||
/// Is this organ's effect currently active
|
||||
var/active = FALSE
|
||||
/// the low-end of random cooldown times between activations
|
||||
var/cooldown_low = 300
|
||||
/// the high-end of random cooldown times between activations
|
||||
var/cooldown_high = 300
|
||||
/// what time will the organ activate next
|
||||
var/next_activation = 0
|
||||
/// How many uses of this organ remain before it goes dormant; -1 for infinite uses
|
||||
var/uses
|
||||
|
||||
var/mind_control_uses = 1
|
||||
var/mind_control_duration = 1800
|
||||
@@ -23,13 +29,6 @@
|
||||
/obj/item/organ/internal/heart/gland/update_icon_state()
|
||||
return
|
||||
|
||||
/obj/item/organ/internal/heart/gland/proc/ownerCheck()
|
||||
if(ishuman(owner))
|
||||
return TRUE
|
||||
if(!human_only && iscarbon(owner))
|
||||
return TRUE
|
||||
return FALSE
|
||||
|
||||
/obj/item/organ/internal/heart/gland/proc/Start()
|
||||
active = TRUE
|
||||
next_activation = world.time + rand(cooldown_low,cooldown_high)
|
||||
@@ -46,7 +45,7 @@
|
||||
holder.icon_state = "hudgland_spent"
|
||||
|
||||
/obj/item/organ/internal/heart/gland/proc/mind_control(command, mob/living/user)
|
||||
if(!ownerCheck() || !mind_control_uses || active_mind_control)
|
||||
if(!owner_check() || !mind_control_uses || active_mind_control)
|
||||
return
|
||||
mind_control_uses--
|
||||
to_chat(owner, "<span class='userdanger'>You suddenly feel an irresistible compulsion to follow an order...</span>")
|
||||
@@ -61,14 +60,13 @@
|
||||
addtimer(CALLBACK(src, PROC_REF(clear_mind_control)), mind_control_duration)
|
||||
|
||||
/obj/item/organ/internal/heart/gland/proc/clear_mind_control()
|
||||
if(!ownerCheck() || !active_mind_control)
|
||||
if(!owner_check() || !active_mind_control)
|
||||
return
|
||||
to_chat(owner, "<span class='userdanger'>You feel the compulsion fade, and you completely forget about your previous orders.</span>")
|
||||
active_mind_control = FALSE
|
||||
update_gland_hud()
|
||||
|
||||
/obj/item/organ/internal/heart/gland/remove(mob/living/carbon/M, special = 0)
|
||||
active = FALSE
|
||||
if(initial(uses) == 1)
|
||||
uses = initial(uses)
|
||||
var/datum/atom_hud/abductor/hud = GLOB.huds[DATA_HUD_ABDUCTOR]
|
||||
@@ -85,19 +83,18 @@
|
||||
update_gland_hud()
|
||||
|
||||
/obj/item/organ/internal/heart/gland/on_life()
|
||||
if(!active)
|
||||
return
|
||||
if(!ownerCheck())
|
||||
active = FALSE
|
||||
return
|
||||
if(next_activation <= world.time)
|
||||
activate()
|
||||
uses--
|
||||
next_activation = world.time + rand(cooldown_low,cooldown_high)
|
||||
if(!uses)
|
||||
active = FALSE
|
||||
if(has_ongoing_effect && active)
|
||||
if(!owner_check())
|
||||
active = FALSE
|
||||
return
|
||||
if(next_activation <= world.time)
|
||||
trigger()
|
||||
uses--
|
||||
next_activation = world.time + rand(cooldown_low, cooldown_high)
|
||||
if(!uses)
|
||||
active = FALSE
|
||||
|
||||
/obj/item/organ/internal/heart/gland/proc/activate()
|
||||
/obj/item/organ/internal/heart/gland/proc/trigger()
|
||||
return
|
||||
|
||||
/obj/item/organ/internal/heart/gland/heals
|
||||
@@ -108,7 +105,7 @@
|
||||
mind_control_uses = 3
|
||||
mind_control_duration = 3000
|
||||
|
||||
/obj/item/organ/internal/heart/gland/heals/activate()
|
||||
/obj/item/organ/internal/heart/gland/heals/trigger()
|
||||
if(!(owner.mob_biotypes & MOB_ORGANIC))
|
||||
return
|
||||
to_chat(owner, "<span class='notice'>You feel curiously revitalized.</span>")
|
||||
@@ -130,7 +127,7 @@
|
||||
owner.faction |= "slime"
|
||||
owner.add_language("Bubblish")
|
||||
|
||||
/obj/item/organ/internal/heart/gland/slime/activate()
|
||||
/obj/item/organ/internal/heart/gland/slime/trigger()
|
||||
to_chat(owner, "<span class='warning'>You feel nauseous!</span>")
|
||||
owner.vomit(20)
|
||||
|
||||
@@ -145,7 +142,7 @@
|
||||
mind_control_uses = 1
|
||||
mind_control_duration = 6000
|
||||
|
||||
/obj/item/organ/internal/heart/gland/mindshock/activate()
|
||||
/obj/item/organ/internal/heart/gland/mindshock/trigger()
|
||||
to_chat(owner, "<span class='notice'>You get a headache.</span>")
|
||||
|
||||
var/turf/T = get_turf(owner)
|
||||
@@ -167,12 +164,11 @@
|
||||
cooldown_low = 900
|
||||
cooldown_high = 1800
|
||||
uses = -1
|
||||
human_only = TRUE
|
||||
icon_state = "species"
|
||||
mind_control_uses = 5
|
||||
mind_control_duration = 3000
|
||||
|
||||
/obj/item/organ/internal/heart/gland/pop/activate()
|
||||
/obj/item/organ/internal/heart/gland/pop/trigger()
|
||||
to_chat(owner, "<span class='notice'>You feel unlike yourself.</span>")
|
||||
var/species = pick(/datum/species/unathi, /datum/species/skrell, /datum/species/diona, /datum/species/tajaran, /datum/species/vulpkanin, /datum/species/kidan, /datum/species/grey)
|
||||
owner.set_species(species, keep_missing_bodyparts = TRUE)
|
||||
@@ -186,7 +182,7 @@
|
||||
mind_control_uses = 4
|
||||
mind_control_duration = 1800
|
||||
|
||||
/obj/item/organ/internal/heart/gland/ventcrawling/activate()
|
||||
/obj/item/organ/internal/heart/gland/ventcrawling/trigger()
|
||||
to_chat(owner, "<span class='notice'>You feel very stretchy.</span>")
|
||||
owner.ventcrawler = VENTCRAWLER_ALWAYS
|
||||
|
||||
@@ -199,7 +195,7 @@
|
||||
mind_control_uses = 1
|
||||
mind_control_duration = 1800
|
||||
|
||||
/obj/item/organ/internal/heart/gland/viral/activate()
|
||||
/obj/item/organ/internal/heart/gland/viral/trigger()
|
||||
to_chat(owner, "<span class='warning'>You feel sick.</span>")
|
||||
var/datum/disease/advance/A = random_virus(pick(2, 6), 6)
|
||||
A.carrier = TRUE
|
||||
@@ -236,7 +232,7 @@
|
||||
mind_control_uses = 3
|
||||
mind_control_duration = 1800
|
||||
|
||||
/obj/item/organ/internal/heart/gland/emp/activate()
|
||||
/obj/item/organ/internal/heart/gland/emp/trigger()
|
||||
to_chat(owner, "<span class='warning'>You feel a spike of pain in your head.</span>")
|
||||
empulse(get_turf(owner), 2, 5, 1)
|
||||
|
||||
@@ -248,7 +244,7 @@
|
||||
mind_control_uses = 2
|
||||
mind_control_duration = 2400
|
||||
|
||||
/obj/item/organ/internal/heart/gland/spiderman/activate()
|
||||
/obj/item/organ/internal/heart/gland/spiderman/trigger()
|
||||
to_chat(owner, "<span class='warning'>You feel something crawling in your skin.</span>")
|
||||
owner.faction |= "spiders"
|
||||
var/obj/structure/spider/spiderling/S = new(owner.loc)
|
||||
@@ -262,7 +258,7 @@
|
||||
mind_control_uses = 2
|
||||
mind_control_duration = 1800
|
||||
|
||||
/obj/item/organ/internal/heart/gland/egg/activate()
|
||||
/obj/item/organ/internal/heart/gland/egg/trigger()
|
||||
owner.visible_message("<span class='alertalien'>[owner] [pick(EGG_LAYING_MESSAGES)]</span>")
|
||||
new /obj/item/food/egg/gland(get_turf(owner))
|
||||
|
||||
@@ -287,7 +283,7 @@
|
||||
singlemutcheck(owner, GLOB.shockimmunityblock, MUTCHK_FORCED)
|
||||
return ..()
|
||||
|
||||
/obj/item/organ/internal/heart/gland/electric/activate()
|
||||
/obj/item/organ/internal/heart/gland/electric/trigger()
|
||||
owner.visible_message("<span class='danger'>[owner]'s skin starts emitting electric arcs!</span>",\
|
||||
"<span class='warning'>You feel electric energy building up inside you!</span>")
|
||||
playsound(get_turf(owner), "sparks", 100, TRUE, SHORT_RANGE_SOUND_EXTRARANGE)
|
||||
@@ -304,7 +300,7 @@
|
||||
mind_control_uses = 3
|
||||
mind_control_duration = 1200
|
||||
|
||||
/obj/item/organ/internal/heart/gland/chem/activate()
|
||||
/obj/item/organ/internal/heart/gland/chem/trigger()
|
||||
owner.reagents.add_reagent(get_random_reagent_id(), 2)
|
||||
owner.adjustToxLoss(-2)
|
||||
..()
|
||||
@@ -314,7 +310,7 @@
|
||||
cooldown_high = 400
|
||||
uses = -1
|
||||
|
||||
/obj/item/organ/internal/heart/gland/bloody/activate()
|
||||
/obj/item/organ/internal/heart/gland/bloody/trigger()
|
||||
owner.blood_volume = max(owner.blood_volume - 20, 0)
|
||||
owner.visible_message("<span class='danger'>[owner]'s skin erupts with blood!</span>",\
|
||||
"<span class='userdanger'>Blood pours from your skin!</span>")
|
||||
@@ -333,7 +329,7 @@
|
||||
mind_control_uses = 1
|
||||
mind_control_duration = 800
|
||||
|
||||
/obj/item/organ/internal/heart/gland/plasma/activate()
|
||||
/obj/item/organ/internal/heart/gland/plasma/trigger()
|
||||
spawn(0)
|
||||
to_chat(owner, "<span class='warning'>You feel bloated.</span>")
|
||||
sleep(150)
|
||||
|
||||
@@ -35,6 +35,8 @@
|
||||
attacktext = "glomps"
|
||||
attack_sound = 'sound/effects/blobattack.ogg'
|
||||
butcher_results = list(/obj/item/food/meat/slab = 2)
|
||||
contains_xeno_organ = TRUE
|
||||
surgery_container = /datum/xenobiology_surgery_container/morph
|
||||
|
||||
/// If the morph is disguised or not
|
||||
var/morphed = FALSE
|
||||
@@ -207,14 +209,36 @@
|
||||
. = ..()
|
||||
add_to_all_human_data_huds()
|
||||
if(stat == DEAD && gibbed)
|
||||
for(var/atom/movable/AM in src)
|
||||
AM.forceMove(loc)
|
||||
if(prob(90))
|
||||
step(AM, pick(GLOB.alldirs))
|
||||
eject_contents()
|
||||
// Only execute the below if we successfully died
|
||||
if(!.)
|
||||
return FALSE
|
||||
|
||||
/mob/living/simple_animal/hostile/morph/proc/eject_contents()
|
||||
for(var/atom/movable/AM in src)
|
||||
AM.forceMove(loc)
|
||||
if(prob(90))
|
||||
step(AM, pick(GLOB.alldirs))
|
||||
|
||||
/mob/living/simple_animal/hostile/morph/crowbar_act(mob/living/user, obj/item/I)
|
||||
if(stat != DEAD)
|
||||
return CONTINUE_ATTACK
|
||||
if(user.a_intent != INTENT_HELP)
|
||||
return CONTINUE_ATTACK
|
||||
if(!contents.len)
|
||||
to_chat(user, "<span class='warning'>[src] doesnt have anything left inside it!</span>")
|
||||
return ITEM_INTERACT_COMPLETE
|
||||
playsound(loc, 'sound/weapons/slice.ogg', 50, TRUE, -1)
|
||||
visible_message(
|
||||
"<span class='warning'>[src] begins to pry open the morph's massive jaws!</span>",
|
||||
"<span class='danger'>You begin to pry open the morph's massive jaws!</span>",
|
||||
"<span class='warning'>You hear wet, meaty tearing nearby!</span>"
|
||||
)
|
||||
if(do_after_once(user, 8 SECONDS, target = src))
|
||||
eject_contents()
|
||||
playsound(loc, 'sound/effects/splat.ogg', 50, TRUE, -1)
|
||||
return ITEM_INTERACT_COMPLETE
|
||||
|
||||
/mob/living/simple_animal/hostile/morph/attack_hand(mob/living/carbon/human/M)
|
||||
if(ambush_prepared)
|
||||
to_chat(M, "<span class='warning'>[src] feels a bit different from normal... it feels more.. </span><span class='userdanger'>SLIMEY?!</span>")
|
||||
@@ -222,6 +246,13 @@
|
||||
else
|
||||
return ..()
|
||||
|
||||
/mob/living/simple_animal/hostile/morph/examine(mob/user)
|
||||
. = ..()
|
||||
if(stat == DEAD)
|
||||
if(length(contents))
|
||||
. += "<span class='notice'>You can use <b>ALT + Click</b> to eject anything the morph may have eaten.</span>"
|
||||
else if(in_range(user, src))
|
||||
. += "<span class='warning'>\The [src] seems to have nothing left inside of it!</span>"
|
||||
#define MORPH_ATTACKED if((. = ..()) && morphed) mimic_spell.restore_form(src)
|
||||
|
||||
/mob/living/simple_animal/hostile/morph/attack_by(obj/item/O, mob/living/user, params)
|
||||
|
||||
@@ -12,8 +12,8 @@
|
||||
desc = "A malevolent spirit."
|
||||
icon = 'icons/mob/mob.dmi'
|
||||
icon_state = "revenant_idle"
|
||||
|
||||
mob_biotypes = MOB_SPIRIT
|
||||
sentience_type = SENTIENCE_BOSS // no reviving funny ghost
|
||||
incorporeal_move = INCORPOREAL_MOVE_HOLY_BLOCK
|
||||
see_invisible = INVISIBILITY_REVENANT
|
||||
invisibility = INVISIBILITY_REVENANT
|
||||
@@ -37,6 +37,9 @@
|
||||
pass_flags = PASSTABLE | PASSGRILLE | PASSMOB
|
||||
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)
|
||||
initial_traits = list(TRAIT_FLYING)
|
||||
contains_xeno_organ = TRUE
|
||||
ignore_generic_organs = TRUE
|
||||
surgery_container = /datum/xenobiology_surgery_container/revenant
|
||||
|
||||
/// The revenant's idle icon
|
||||
var/icon_idle = "revenant_idle"
|
||||
@@ -73,20 +76,23 @@
|
||||
var/list/drained_mobs = list()
|
||||
///How many perfect, regen-cap increasing souls the revenant has.
|
||||
var/perfectsouls = 0
|
||||
/// Are we currently dying? extra check against becomming incorporeal
|
||||
var/dying = FALSE
|
||||
|
||||
/mob/living/simple_animal/revenant/Life(seconds, times_fired)
|
||||
..()
|
||||
if(revealed && essence <= 0)
|
||||
dying = TRUE
|
||||
death()
|
||||
if(essence_regenerating && !inhibited && essence < essence_regen_cap) //While inhibited, essence will not regenerate
|
||||
essence = min(essence_regen_cap, essence+essence_regen_amount)
|
||||
if(unreveal_time && world.time >= unreveal_time)
|
||||
if(unreveal_time && world.time >= unreveal_time && !dying)
|
||||
unreveal_time = 0
|
||||
revealed = FALSE
|
||||
incorporeal_move = INCORPOREAL_MOVE_HOLY_BLOCK
|
||||
invisibility = INVISIBILITY_REVENANT
|
||||
to_chat(src, "<span class='revennotice bold'>You are once more concealed.</span>")
|
||||
if(unstun_time && world.time >= unstun_time)
|
||||
if(unstun_time && world.time >= unstun_time && !dying)
|
||||
unstun_time = 0
|
||||
notransform = FALSE
|
||||
to_chat(src, "<span class='revennotice bold'>You can move again!</span>")
|
||||
@@ -206,9 +212,13 @@
|
||||
icon_state = "revenant_draining"
|
||||
animate(src, alpha = 0, time = 3 SECONDS)
|
||||
visible_message("<span class='danger'>[src]'s body breaks apart into a fine pile of blue dust.</span>")
|
||||
new /obj/item/ectoplasm(get_turf(src))
|
||||
ghostize()
|
||||
qdel(src)
|
||||
ghostize(FALSE)
|
||||
name = "ectoplasm"
|
||||
desc = "A pile of clumpy dust from a restless spirit"
|
||||
alpha = 255
|
||||
icon_state = "revenant_ectoplasm"
|
||||
move_resist = null
|
||||
return ..()
|
||||
|
||||
/mob/living/simple_animal/revenant/attack_by(obj/item/W, mob/living/user, params)
|
||||
if(..())
|
||||
@@ -279,6 +289,9 @@
|
||||
update_spooky_icon()
|
||||
|
||||
/mob/living/simple_animal/revenant/proc/update_spooky_icon()
|
||||
if(dying)
|
||||
return
|
||||
|
||||
if(!revealed)
|
||||
icon_state = icon_idle
|
||||
return
|
||||
@@ -290,6 +303,7 @@
|
||||
if(draining)
|
||||
icon_state = icon_drain
|
||||
return
|
||||
|
||||
// No other state is happening, therefore we are stunned
|
||||
icon_state = icon_stun
|
||||
|
||||
@@ -338,6 +352,7 @@
|
||||
/datum/objective/revenant_fluff/check_completion()
|
||||
return TRUE
|
||||
|
||||
//no longer used
|
||||
/obj/item/ectoplasm
|
||||
name = "glimmering residue"
|
||||
desc = "A pile of fine blue dust. Small tendrils of violet mist swirl around it."
|
||||
|
||||
@@ -81,9 +81,8 @@
|
||||
ACCESS_RESEARCH,
|
||||
ACCESS_TOX_STORAGE,
|
||||
ACCESS_TOX,
|
||||
ACCESS_XENOBIOLOGY
|
||||
)
|
||||
alt_titles = list("Xenoarcheologist", "Anomalist", "Plasma Researcher", "Xenobiologist", "Chemical Researcher")
|
||||
alt_titles = list("Anomalist", "Plasma Researcher", "Chemical Researcher")
|
||||
minimal_player_age = 3
|
||||
exp_map = list(EXP_TYPE_CREW = 300)
|
||||
// All science-y guys get bonuses for maxing out their tech.
|
||||
@@ -108,6 +107,60 @@
|
||||
satchel = /obj/item/storage/backpack/satchel_tox
|
||||
dufflebag = /obj/item/storage/backpack/duffel/science
|
||||
|
||||
/datum/job/xenobiologist
|
||||
title = "Xenobiologist"
|
||||
flag = JOB_XENOBIOLOGIST
|
||||
department_flag = JOBCAT_MEDSCI
|
||||
total_positions = 2
|
||||
spawn_positions = 2
|
||||
job_department_flags = DEP_FLAG_SCIENCE
|
||||
supervisors = "the research director"
|
||||
department_head = list("Research Director")
|
||||
selection_color = "#ffeeff"
|
||||
access = list(
|
||||
ACCESS_MAINT_TUNNELS,
|
||||
ACCESS_MINERAL_STOREROOM,
|
||||
ACCESS_RESEARCH,
|
||||
ACCESS_XENOBIOLOGY,
|
||||
ACCESS_EVA,
|
||||
ACCESS_MINING,
|
||||
ACCESS_MINING_STATION,
|
||||
ACCESS_EXTERNAL_AIRLOCKS,
|
||||
ACCESS_TELEPORTER,
|
||||
)
|
||||
alt_titles = list("Xenoarcheologist", "Slime Cultivator", "Slime Rancher")
|
||||
minimal_player_age = 3
|
||||
exp_map = list(EXP_TYPE_CREW = 300)
|
||||
// All science-y guys get bonuses for maxing out their tech.
|
||||
required_objectives = list(
|
||||
/datum/job_objective/scan_organs,
|
||||
)
|
||||
|
||||
outfit = /datum/outfit/job/xenobiologist
|
||||
|
||||
/datum/outfit/job/xenobiologist
|
||||
name = "Xenobiologist"
|
||||
jobtype = /datum/job/xenobiologist
|
||||
|
||||
uniform = /obj/item/clothing/under/rank/rnd/scientist
|
||||
suit = /obj/item/clothing/suit/storage/labcoat/science
|
||||
shoes = /obj/item/clothing/shoes/white
|
||||
gloves = /obj/item/clothing/gloves/color/latex/nitrile
|
||||
glasses = /obj/item/clothing/glasses/science
|
||||
l_ear = /obj/item/radio/headset/headset_sci
|
||||
id = /obj/item/card/id/xenobiology
|
||||
pda = /obj/item/pda/toxins
|
||||
|
||||
backpack = /obj/item/storage/backpack/science
|
||||
satchel = /obj/item/storage/backpack/satchel_tox
|
||||
dufflebag = /obj/item/storage/backpack/duffel/science
|
||||
|
||||
backpack_contents = list(
|
||||
/obj/item/healthanalyzer = 1,
|
||||
/obj/item/storage/box/bodybags = 1,
|
||||
/obj/item/clipboard = 1,
|
||||
)
|
||||
|
||||
/datum/job/roboticist
|
||||
title = "Roboticist"
|
||||
flag = JOB_ROBOTICIST
|
||||
|
||||
@@ -53,6 +53,7 @@ GLOBAL_LIST_INIT(science_positions, list(
|
||||
"Research Director",
|
||||
"Scientist",
|
||||
"Geneticist", //Part of both medical and science
|
||||
"Xenobiologist",
|
||||
"Roboticist",
|
||||
))
|
||||
|
||||
|
||||
@@ -41,3 +41,19 @@
|
||||
|
||||
/datum/job_objective/make_ripley/check_for_completion()
|
||||
return completed
|
||||
|
||||
/datum/job_objective/scan_organs
|
||||
objective_name = "Scan Extraterrestrial Organs"
|
||||
description = "Scan alien organs via the organ analyzer to learn more about their local ecology."
|
||||
gives_payout = TRUE
|
||||
completion_payment = 200
|
||||
/// How many organs should be scanned to complete this goal
|
||||
var/amount_to_scan = 10
|
||||
|
||||
/datum/job_objective/scan_organs/check_for_completion()
|
||||
var/total_organs
|
||||
for(var/item in GLOB.scanned_organs)
|
||||
total_organs += GLOB.scanned_organs[item]
|
||||
if(total_organs >= amount_to_scan)
|
||||
return TRUE
|
||||
return FALSE
|
||||
|
||||
@@ -96,6 +96,8 @@
|
||||
"Scientist" = "sciradio",
|
||||
"Xenoarcheologist" = "sciradio",
|
||||
"Xenobiologist" = "sciradio",
|
||||
"Slime Cultivator" = "sciradio",
|
||||
"Slime Rancher" = "sciradio",
|
||||
// Security
|
||||
"Detective" = "secradio",
|
||||
"Forensic Technician" = "secradio",
|
||||
|
||||
@@ -422,6 +422,10 @@ INITIALIZE_IMMEDIATE(/obj/effect/landmark/newplayer_start) //Without this you sp
|
||||
name = "Scientist"
|
||||
icon_state = "Sci"
|
||||
|
||||
/obj/effect/landmark/start/xenobiologist
|
||||
name = "Xenobiologist"
|
||||
icon_state = "Sci"
|
||||
|
||||
/obj/effect/landmark/start/security_officer
|
||||
name = "Security Officer"
|
||||
icon_state = "Sec"
|
||||
|
||||
@@ -94,6 +94,8 @@
|
||||
// Xenobio
|
||||
/obj/item/slimepotion/sentience = 50, // Low-value, but we want to encourage getting more players back in the round.
|
||||
/obj/item/slimepotion/transference = 50,
|
||||
/obj/item/dissector/alien = 50,
|
||||
/obj/item/regen_mesh = 50,
|
||||
|
||||
// Might as well let AI be interested
|
||||
/obj/item/ai_upgrade/surveillance_upgrade = 25,
|
||||
|
||||
@@ -546,6 +546,12 @@
|
||||
icon_state = "research"
|
||||
access = list(ACCESS_ROBOTICS, ACCESS_TOX, ACCESS_TOX_STORAGE, ACCESS_RESEARCH, ACCESS_XENOBIOLOGY, ACCESS_MINERAL_STOREROOM)
|
||||
|
||||
/obj/item/card/id/xenobiology
|
||||
name = "Xenobiology ID"
|
||||
registered_name = "Xenobiologist"
|
||||
icon_state = "xenobiologist"
|
||||
access = list(ACCESS_MAINT_TUNNELS, ACCESS_MINERAL_STOREROOM, ACCESS_RESEARCH, ACCESS_XENOBIOLOGY, ACCESS_EVA, ACCESS_MINING, ACCESS_MINING_STATION, ACCESS_EXTERNAL_AIRLOCKS, ACCESS_TELEPORTER)
|
||||
|
||||
/obj/item/card/id/roboticist
|
||||
name = "Roboticist ID"
|
||||
registered_name = "Roboticist"
|
||||
|
||||
@@ -238,6 +238,7 @@
|
||||
/obj/item/fix_o_vein,
|
||||
/obj/item/surgicaldrill,
|
||||
/obj/item/cautery,
|
||||
/obj/item/dissector
|
||||
)
|
||||
|
||||
/obj/item/storage/belt/medical/surgery/loaded/populate_contents()
|
||||
|
||||
@@ -19,7 +19,8 @@
|
||||
/obj/item/bonesetter,
|
||||
/obj/item/stack/medical/bruise_pack,
|
||||
/obj/item/stack/medical/ointment,
|
||||
/obj/item/surgical_drapes
|
||||
/obj/item/surgical_drapes,
|
||||
/obj/item/dissector,
|
||||
)
|
||||
|
||||
/obj/item/storage/surgical_tray/Initialize(mapload)
|
||||
|
||||
@@ -181,6 +181,8 @@
|
||||
for(var/obj/structure/closet/closet in get_turf(src))
|
||||
if(closet != src && closet.anchored != 1)
|
||||
return FALSE
|
||||
for(var/mob/living/simple_animal/hostile/megafauna/M in get_turf(src))
|
||||
return FALSE
|
||||
return TRUE
|
||||
|
||||
/obj/structure/closet/proc/dump_contents()
|
||||
|
||||
@@ -11,6 +11,8 @@
|
||||
var/list/ui_users = list()
|
||||
var/broken_icon_state = "mirror_broke"
|
||||
|
||||
/obj/structure/mirror/organ
|
||||
|
||||
/obj/structure/mirror/Initialize(mapload, newdir = SOUTH, building = FALSE)
|
||||
. = ..()
|
||||
if(building)
|
||||
@@ -53,6 +55,10 @@
|
||||
broken = TRUE
|
||||
GLOB.mirrors -= src
|
||||
|
||||
/obj/structure/mirror/organ/obj_break(damage_flag, mapload)
|
||||
playsound(src, "shatter", 70, TRUE)
|
||||
qdel(src)
|
||||
|
||||
/obj/structure/mirror/screwdriver_act(mob/user, obj/item/I)
|
||||
. = TRUE
|
||||
if(!I.tool_use_check(user, 0))
|
||||
|
||||
@@ -9,7 +9,7 @@
|
||||
icon_living = "fleshling"
|
||||
attack_sound = 'sound/misc/demon_attack1.ogg'
|
||||
death_sound = 'sound/misc/demon_dies.ogg'
|
||||
icon_dead = ""
|
||||
icon_dead = "fleshling_dead"
|
||||
speed = 5
|
||||
move_to_delay = 4
|
||||
ranged = TRUE
|
||||
@@ -23,8 +23,7 @@
|
||||
sentience_type = SENTIENCE_BOSS
|
||||
a_intent = INTENT_HARM
|
||||
deathmessage = "collapses into a pile of gibs. From the looks of it this is the deadest it can get... "
|
||||
del_on_death = TRUE
|
||||
|
||||
butcher_results = list(/obj/item/regen_mesh)
|
||||
/// Is the boss charging right now?
|
||||
var/charging = FALSE
|
||||
/// Did our boss die?
|
||||
|
||||
@@ -1259,6 +1259,22 @@
|
||||
clothes_s.Blend(new /icon('icons/mob/clothing/back.dmi', "satchel-tox"), ICON_OVERLAY)
|
||||
if(4)
|
||||
clothes_s.Blend(new /icon('icons/mob/clothing/back.dmi', "satchel"), ICON_OVERLAY)
|
||||
if(JOB_XENOBIOLOGIST)
|
||||
clothes_s = new /icon('icons/mob/clothing/under/rnd.dmi', "science_s")
|
||||
clothes_s.Blend(new /icon('icons/mob/clothing/feet.dmi', "white"), ICON_UNDERLAY)
|
||||
clothes_s.Blend(new /icon('icons/mob/clothing/suit.dmi', "labcoat_tox_open"), ICON_OVERLAY)
|
||||
clothes_s.Blend(new /icon('icons/mob/clothing/hands.dmi', "nitrilegloves"), ICON_OVERLAY)
|
||||
if(prob(50))
|
||||
clothes_s.Blend(new /icon('icons/mob/clothing/mask.dmi', "sterile"), ICON_OVERLAY)
|
||||
if(prob(1))
|
||||
clothes_s.Blend(new /icon('icons/mob/clothing/head.dmi', "metroid"), ICON_OVERLAY)
|
||||
switch(backbag)
|
||||
if(2)
|
||||
clothes_s.Blend(new /icon('icons/mob/clothing/back.dmi', "backpack"), ICON_OVERLAY)
|
||||
if(3)
|
||||
clothes_s.Blend(new /icon('icons/mob/clothing/back.dmi', "satchel-tox"), ICON_OVERLAY)
|
||||
if(4)
|
||||
clothes_s.Blend(new /icon('icons/mob/clothing/back.dmi', "satchel"), ICON_OVERLAY)
|
||||
if(JOB_CHEMIST)
|
||||
clothes_s = new /icon('icons/mob/clothing/under/medical.dmi', "chemistry_s")
|
||||
clothes_s.Blend(new /icon('icons/mob/clothing/feet.dmi', "white"), ICON_UNDERLAY)
|
||||
|
||||
@@ -199,6 +199,8 @@
|
||||
lighting_alpha = LIGHTING_PLANE_ALPHA_MOSTLY_INVISIBLE
|
||||
move_resist = MOVE_FORCE_OVERPOWERING
|
||||
a_intent = INTENT_HARM
|
||||
contains_xeno_organ = TRUE
|
||||
surgery_container = /datum/xenobiology_surgery_container/blobbernaut
|
||||
|
||||
/mob/living/simple_animal/hostile/blob/blobbernaut/Initialize(mapload)
|
||||
. = ..()
|
||||
@@ -235,6 +237,7 @@
|
||||
. = ..()
|
||||
if(!.)
|
||||
return FALSE
|
||||
move_resist = null
|
||||
flick("blobbernaut_death", src)
|
||||
|
||||
/mob/living/simple_animal/hostile/blob/blobbernaut/proc/blob_talk()
|
||||
|
||||
@@ -73,6 +73,9 @@ GLOBAL_LIST_EMPTY(total_extraction_beacons)
|
||||
return ITEM_INTERACT_COMPLETE
|
||||
if(A.anchored || (A.move_resist > max_force_fulton))
|
||||
return ITEM_INTERACT_COMPLETE
|
||||
if(ismegafauna(A))
|
||||
to_chat(user, "<span class='warning'>[src] is too heavy to retrieve!</span>")
|
||||
return ITEM_INTERACT_COMPLETE
|
||||
to_chat(user, "<span class='notice'>You start attaching the pack to [A]...</span>")
|
||||
if(do_after(user, 50, target = A))
|
||||
to_chat(user, "<span class='notice'>You attach the pack to [A] and activate it.</span>")
|
||||
|
||||
@@ -224,6 +224,8 @@
|
||||
var/obj/effect/temp_visual/hierophant/blast/B = new /obj/effect/temp_visual/hierophant/blast(t, user, TRUE) //but absolutely will hurt enemies
|
||||
B.damage = 30
|
||||
for(var/mob/living/L in range(1, source))
|
||||
if(ismegafauna(L) && L.stat == DEAD)
|
||||
continue
|
||||
INVOKE_ASYNC(src, PROC_REF(teleport_mob), source, L, T, user) //regardless, take all mobs near us along
|
||||
sleep(6) //at this point the blasts detonate
|
||||
if(beacon)
|
||||
|
||||
@@ -22,6 +22,9 @@
|
||||
ventcrawler = VENTCRAWLER_ALWAYS
|
||||
var/death_message = "lets out a waning guttural screech, green blood bubbling from its maw..."
|
||||
var/death_sound = 'sound/voice/hiss6.ogg'
|
||||
ignore_generic_organs = TRUE
|
||||
contains_xeno_organ = TRUE
|
||||
surgery_container = /datum/xenobiology_surgery_container/alien
|
||||
|
||||
/mob/living/carbon/alien/Initialize(mapload)
|
||||
. = ..()
|
||||
@@ -31,6 +34,10 @@
|
||||
var/obj/item/organ/internal/organ = new organ_path()
|
||||
organ.insert(src)
|
||||
|
||||
/mob/living/carbon/alien/death(gibbed)
|
||||
move_resist = null
|
||||
return ..()
|
||||
|
||||
/// returns the list of type paths of the organs that we need to insert into
|
||||
/// this particular xeno upon its creation
|
||||
/mob/living/carbon/alien/proc/get_caste_organs()
|
||||
|
||||
@@ -4,6 +4,7 @@
|
||||
maxHealth = 150
|
||||
health = 150
|
||||
icon_state = "aliend_s"
|
||||
surgery_container = /datum/xenobiology_surgery_container/alien/drone
|
||||
|
||||
/mob/living/carbon/alien/humanoid/drone/Initialize(mapload)
|
||||
. = ..()
|
||||
|
||||
@@ -8,6 +8,7 @@
|
||||
var/leap_on_click = FALSE
|
||||
/// Are we on leap cooldown?
|
||||
var/on_leap_cooldown = FALSE
|
||||
surgery_container = /datum/xenobiology_surgery_container/alien/hunter
|
||||
|
||||
/mob/living/carbon/alien/humanoid/hunter/Initialize(mapload)
|
||||
. = ..()
|
||||
|
||||
@@ -4,6 +4,7 @@
|
||||
maxHealth = 175
|
||||
health = 175
|
||||
icon_state = "aliens_s"
|
||||
surgery_container = /datum/xenobiology_surgery_container/alien/sentinel
|
||||
|
||||
/mob/living/carbon/alien/humanoid/sentinel/large
|
||||
name = "alien praetorian"
|
||||
|
||||
@@ -12,6 +12,7 @@
|
||||
alien_disarm_damage = 60 //Queens do higher disarm stamina damage than normal aliens
|
||||
alien_slash_damage = 30 //Queens do higher slashing damage to people
|
||||
alien_movement_delay = 1 //This represents a movement delay of 1, or roughly 80% the movement speed of a normal carbon mob
|
||||
surgery_container = /datum/xenobiology_surgery_container/alien/queen
|
||||
|
||||
/mob/living/carbon/alien/humanoid/queen/Initialize(mapload)
|
||||
. = ..()
|
||||
|
||||
@@ -9,6 +9,7 @@
|
||||
health = 25
|
||||
butcher_results = list(/obj/item/food/monstermeat/xenomeat = 1)
|
||||
density = FALSE
|
||||
surgery_container = /datum/xenobiology_surgery_container/alien/larva
|
||||
|
||||
var/temperature_resistance = T0C+75
|
||||
var/amount_grown = 0
|
||||
|
||||
@@ -21,15 +21,6 @@
|
||||
if(volume > 10) // Anything over 10 volume will make the mob wetter.
|
||||
wetlevel = min(wetlevel + 1,5)
|
||||
|
||||
/mob/living/carbon/item_interaction(mob/living/user, obj/item/I, list/modifiers)
|
||||
if(length(surgeries))
|
||||
if(user.a_intent == INTENT_HELP)
|
||||
for(var/datum/surgery/S in surgeries)
|
||||
if(S.next_step(user, src))
|
||||
return ITEM_INTERACT_COMPLETE
|
||||
|
||||
return ..()
|
||||
|
||||
/mob/living/carbon/attack_hand(mob/living/carbon/human/user)
|
||||
if(!iscarbon(user))
|
||||
return
|
||||
|
||||
@@ -221,6 +221,30 @@
|
||||
AM.setDir(current_dir)
|
||||
now_pushing = FALSE
|
||||
|
||||
/mob/living/examine(mob/user)
|
||||
. = ..()
|
||||
if(stat != DEAD)
|
||||
return
|
||||
if(!user.reagent_vision())
|
||||
return
|
||||
var/datum/surgery/dissection
|
||||
for(var/datum/surgery/dissect/D in surgeries)
|
||||
dissection = D
|
||||
if(dissection)
|
||||
. += "<span class='notice'>You detect the next dissection step will be: [dissection.get_surgery_step()]</span>"
|
||||
if(surgery_container && !contains_xeno_organ)
|
||||
. += "<span class='warning'>[src] looks like [p_they()] [p_have()] had [p_their()] organs dissected!</span>"
|
||||
|
||||
|
||||
/mob/living/item_interaction(mob/living/user, obj/item/I, list/modifiers)
|
||||
if(length(surgeries))
|
||||
if(user.a_intent == INTENT_HELP)
|
||||
for(var/datum/surgery/S in surgeries)
|
||||
if(S.next_step(user, src))
|
||||
return ITEM_INTERACT_COMPLETE
|
||||
|
||||
return ..()
|
||||
|
||||
/mob/living/CanPathfindPass(to_dir, datum/can_pass_info/pass_info)
|
||||
return TRUE // Unless you're a mule, something's trying to run you over.
|
||||
|
||||
|
||||
@@ -110,6 +110,9 @@
|
||||
/// List of traits that should be applied on Initialize
|
||||
var/list/initial_traits = list()
|
||||
|
||||
/// Sets our icon to `null` when `gib()` is used
|
||||
var/gib_nullifies_icon = TRUE
|
||||
|
||||
/*
|
||||
Taste Vars
|
||||
*/
|
||||
@@ -119,5 +122,12 @@
|
||||
var/last_taste_text
|
||||
///If a creature gets to be super special and have extra range on their chat messages
|
||||
var/extra_message_range = 0
|
||||
/// Sets our icon to `null` when `gib()` is used
|
||||
var/gib_nullifies_icon = TRUE
|
||||
|
||||
/// Points to what specialized dissection information a mob gets.
|
||||
var/datum/xenobiology_surgery_container/surgery_container
|
||||
|
||||
/// Does this creature contain a xeno organ we can harvest?
|
||||
var/contains_xeno_organ = FALSE
|
||||
|
||||
/// The toggle for if this creature should ignore the rolls for generic organs upon dissection
|
||||
var/ignore_generic_organs = FALSE
|
||||
|
||||
@@ -167,6 +167,8 @@
|
||||
base_cooldown = 300
|
||||
clothes_req = FALSE
|
||||
aoe_range = 14
|
||||
/// Is this ability granted from a xenobiology organ? Causes user to spark.
|
||||
var/from_organ = FALSE
|
||||
|
||||
/datum/spell/aoe/flicker_lights/create_new_targeting()
|
||||
var/datum/spell_targeting/aoe/turf/targeting = new()
|
||||
@@ -177,6 +179,8 @@
|
||||
for(var/turf/T in targets)
|
||||
for(var/obj/machinery/light/L in T)
|
||||
L.forced_flicker()
|
||||
if(from_organ)
|
||||
do_sparks(3, FALSE, user)
|
||||
|
||||
//Blind AOE
|
||||
/datum/spell/aoe/blindness
|
||||
|
||||
@@ -143,6 +143,9 @@
|
||||
|
||||
var/regen_cooldown = 0
|
||||
|
||||
contains_xeno_organ = TRUE
|
||||
surgery_container = /datum/xenobiology_surgery_container/megacarp
|
||||
|
||||
/mob/living/simple_animal/hostile/carp/megacarp/Initialize(mapload)
|
||||
. = ..()
|
||||
name = "[pick(GLOB.megacarp_first_names)] [pick(GLOB.megacarp_last_names)]"
|
||||
|
||||
@@ -32,6 +32,8 @@
|
||||
attack_sound = 'sound/weapons/bite.ogg'
|
||||
gold_core_spawnable = HOSTILE_SPAWN
|
||||
var/venom_per_bite = 0 // While the /poison/ type path remains as-is for consistency reasons, we're really talking about venom, not poison.
|
||||
contains_xeno_organ = TRUE
|
||||
surgery_container = /datum/xenobiology_surgery_container/spider
|
||||
|
||||
/mob/living/simple_animal/hostile/poison/giant_spider/Initialize(mapload)
|
||||
. = ..()
|
||||
|
||||
@@ -31,6 +31,9 @@
|
||||
var/datum/mind/origin
|
||||
var/egg_layed = FALSE
|
||||
sentience_type = SENTIENCE_OTHER
|
||||
contains_xeno_organ = TRUE
|
||||
ignore_generic_organs = TRUE
|
||||
surgery_container = /datum/xenobiology_surgery_container/headslug
|
||||
|
||||
/mob/living/simple_animal/hostile/headslug/proc/Infect(mob/living/carbon/victim)
|
||||
var/obj/item/organ/internal/body_egg/changeling_egg/egg = new(victim)
|
||||
|
||||
@@ -34,6 +34,9 @@
|
||||
var/smoke_lastuse = 0
|
||||
var/smoke_freq = 300 // 30 seconds
|
||||
footstep_type = FOOTSTEP_MOB_CLAW
|
||||
contains_xeno_organ = TRUE
|
||||
ignore_generic_organs = TRUE
|
||||
surgery_container = /datum/xenobiology_surgery_container/hound
|
||||
|
||||
/mob/living/simple_animal/hostile/hellhound/Initialize(mapload)
|
||||
. = ..()
|
||||
|
||||
@@ -25,3 +25,5 @@
|
||||
minbodytemp = 150
|
||||
maxbodytemp = 500
|
||||
gold_core_spawnable = HOSTILE_SPAWN
|
||||
contains_xeno_organ = TRUE
|
||||
surgery_container = /datum/xenobiology_surgery_container/tomato
|
||||
|
||||
@@ -56,6 +56,7 @@ Difficulty: Hard
|
||||
icon = 'icons/mob/lavaland/64x64megafauna.dmi'
|
||||
icon_state = "ancient_robot"
|
||||
icon_living = "ancient_robot"
|
||||
icon_dead = "ancient_robot_dead"
|
||||
friendly = "stares down"
|
||||
speak_emote = list("BUZZES")
|
||||
universal_speak = TRUE
|
||||
@@ -69,7 +70,6 @@ Difficulty: Hard
|
||||
ranged = TRUE
|
||||
pixel_x = -16
|
||||
pixel_y = -16
|
||||
del_on_death = TRUE
|
||||
loot = list(/obj/item/pinpointer/tendril)
|
||||
crusher_loot = list(/obj/item/crusher_trophy/adaptive_intelligence_core)
|
||||
internal_gps = /obj/item/gps/internal/ancient
|
||||
@@ -78,6 +78,9 @@ Difficulty: Hard
|
||||
deathmessage = "explodes into a shower of alloys"
|
||||
footstep_type = FOOTSTEP_MOB_HEAVY //make stomp like bubble
|
||||
attack_action_types = list()
|
||||
contains_xeno_organ = TRUE
|
||||
ignore_generic_organs = TRUE
|
||||
surgery_container = /datum/xenobiology_surgery_container/vetus
|
||||
difficulty_ore_modifier = 4 //Vetus' whole deal was that it dropped ore before all megas did, so it gets a ton
|
||||
|
||||
var/charging = FALSE
|
||||
@@ -158,7 +161,17 @@ Difficulty: Hard
|
||||
invisibility = 100
|
||||
|
||||
/mob/living/simple_animal/hostile/megafauna/ancient_robot/death(gibbed, allowed = FALSE)
|
||||
icon = 'icons/mob/lavaland/corpses.dmi'
|
||||
if(allowed)
|
||||
overlays.Cut()
|
||||
underlays.Cut()
|
||||
QDEL_NULL(TR)
|
||||
QDEL_NULL(TL)
|
||||
QDEL_NULL(BR)
|
||||
QDEL_NULL(BL)
|
||||
QDEL_NULL(beam)
|
||||
body_shield_enabled = FALSE
|
||||
update_appearance(UPDATE_OVERLAYS)
|
||||
return ..()
|
||||
else if(exploding) //but it refused
|
||||
return
|
||||
@@ -169,9 +182,10 @@ Difficulty: Hard
|
||||
|
||||
/mob/living/simple_animal/hostile/megafauna/ancient_robot/Life(seconds, times_fired)
|
||||
..()
|
||||
if(!exploding)
|
||||
if(!exploding && stat != DEAD)
|
||||
return
|
||||
playsound(src, 'sound/items/timer.ogg', 70, 0)
|
||||
else if(stat != DEAD)
|
||||
playsound(src, 'sound/items/timer.ogg', 70, 0)
|
||||
|
||||
/mob/living/simple_animal/hostile/megafauna/ancient_robot/drop_loot()
|
||||
var/core_type = null
|
||||
@@ -601,6 +615,8 @@ Difficulty: Hard
|
||||
return
|
||||
|
||||
/mob/living/simple_animal/hostile/megafauna/ancient_robot/Moved(atom/OldLoc, Dir, Forced = FALSE)
|
||||
if(stat == DEAD || exploding == TRUE) // a check so it doesnt try to move after death
|
||||
return
|
||||
if(Dir)
|
||||
leg_walking_controler(Dir)
|
||||
if(charging)
|
||||
|
||||
@@ -37,7 +37,7 @@ Difficulty: Hard
|
||||
attack_sound = 'sound/misc/demon_attack1.ogg'
|
||||
icon_state = "bubblegum"
|
||||
icon_living = "bubblegum"
|
||||
icon_dead = ""
|
||||
icon_dead = "bubblegum_dead"
|
||||
friendly = "stares down"
|
||||
icon = 'icons/mob/lavaland/96x96megafauna.dmi'
|
||||
speak_emote = list("gurgles")
|
||||
@@ -52,7 +52,6 @@ Difficulty: Hard
|
||||
melee_queue_distance = 20 // as far as possible really, need this because of blood warp
|
||||
ranged = TRUE
|
||||
pixel_x = -32
|
||||
del_on_death = TRUE
|
||||
difficulty_ore_modifier = 3
|
||||
crusher_loot = list(/obj/item/crusher_trophy/demon_claws)
|
||||
loot = list(/obj/item/clothing/suit/space/hostile_environment,
|
||||
@@ -72,8 +71,12 @@ Difficulty: Hard
|
||||
internal_gps = /obj/item/gps/internal/bubblegum
|
||||
medal_type = BOSS_MEDAL_BUBBLEGUM
|
||||
score_type = BUBBLEGUM_SCORE
|
||||
deathmessage = "sinks into a pool of blood, fleeing the battle. You've won, for now... "
|
||||
deathmessage = "sinks into a pile of grotesque viscera, fleeing the battle. You've won, for now... "
|
||||
death_sound = 'sound/misc/enter_blood.ogg'
|
||||
contains_xeno_organ = TRUE
|
||||
ignore_generic_organs = TRUE
|
||||
surgery_container = /datum/xenobiology_surgery_container/bubblegum
|
||||
|
||||
attack_action_types = list(/datum/action/innate/megafauna_attack/triple_charge,
|
||||
/datum/action/innate/megafauna_attack/hallucination_charge,
|
||||
/datum/action/innate/megafauna_attack/hallucination_surround,
|
||||
@@ -150,15 +153,20 @@ Difficulty: Hard
|
||||
/mob/living/simple_animal/hostile/megafauna/bubblegum/death(gibbed)
|
||||
qdel(second_life_portal)
|
||||
if(enraged && !second_life)
|
||||
del_on_death = TRUE
|
||||
var/obj/structure/closet/crate/necropolis/bubblegum/bait/jebait = new /obj/structure/closet/crate/necropolis/bubblegum/bait(get_turf(src))
|
||||
var/obj/effect/bubblegum_trigger/great_chest_ahead = new /obj/effect/bubblegum_trigger(jebait, ListTargets())
|
||||
new /obj/effect/landmark/spawner/bubblegum_exit(get_turf(src))
|
||||
great_chest_ahead.forceMove(jebait)
|
||||
if(second_life)
|
||||
del_on_death = FALSE
|
||||
var/area/A = get_area(src)
|
||||
for(var/mob/M in A)
|
||||
to_chat(M, "<span class='colossus'><b>YOU FUCK... I... I'll... get you later. Enjoy the last few days of your life...</b></span>")
|
||||
new /obj/effect/bubblegum_exit(get_turf(src))
|
||||
name = "Fleshy Mass"
|
||||
desc = "Whatever this is, doesn't actually look like it comes from bubblegum, but many other entities. just thinking about how many creatures met their end to make this pile makes you shudder."
|
||||
icon = 'icons/mob/lavaland/corpses.dmi'
|
||||
return ..()
|
||||
|
||||
/mob/living/simple_animal/hostile/megafauna/bubblegum/drop_loot()
|
||||
@@ -663,6 +671,8 @@ Difficulty: Hard
|
||||
break
|
||||
RegisterSignal(src, COMSIG_HOSTILE_FOUND_TARGET, PROC_REF(i_see_you))
|
||||
for(var/mob/living/carbon/human/H in range(20))
|
||||
if(stat == DEAD)
|
||||
continue
|
||||
to_chat(H, "<span class='colossus'><b>MY HANDS WILL RELISH ENDING YOU... HERE AND NOW!</b></span>")
|
||||
FindTarget(list(H), 1)
|
||||
|
||||
|
||||
@@ -34,7 +34,7 @@ Difficulty: Very Hard
|
||||
attack_sound = 'sound/magic/ratvar_attack.ogg'
|
||||
icon_state = "eva"
|
||||
icon_living = "eva"
|
||||
icon_dead = ""
|
||||
icon_dead = "eva_dead"
|
||||
friendly = "stares down"
|
||||
icon = 'icons/mob/lavaland/96x96megafauna.dmi'
|
||||
speak_emote = list("roars")
|
||||
@@ -45,22 +45,25 @@ Difficulty: Very Hard
|
||||
move_to_delay = 10
|
||||
ranged = TRUE
|
||||
pixel_x = -32
|
||||
del_on_death = TRUE
|
||||
universal_speak = TRUE
|
||||
internal_gps = /obj/item/gps/internal/colossus
|
||||
medal_type = BOSS_MEDAL_COLOSSUS
|
||||
score_type = COLOSSUS_SCORE
|
||||
difficulty_ore_modifier = 3
|
||||
crusher_loot = list(/obj/item/crusher_trophy/blaster_tubes)
|
||||
deathmessage = "disintegrates, leaving a glowing core in its wake."
|
||||
deathmessage = "flakes away into innumerable pieces with the wind. It's metallic arm graft staying behind, falling to the ground with a loud thud."
|
||||
difficulty_ore_modifier = 3
|
||||
death_sound = 'sound/misc/demon_dies.ogg'
|
||||
enraged_loot = /obj/item/disk/fauna_research/colossus
|
||||
contains_xeno_organ = TRUE
|
||||
ignore_generic_organs = TRUE
|
||||
surgery_container = /datum/xenobiology_surgery_container/colossus
|
||||
/// Have we used our final attack yet?
|
||||
var/final_available = TRUE
|
||||
|
||||
attack_action_types = list(/datum/action/innate/megafauna_attack/spiral_attack,
|
||||
/datum/action/innate/megafauna_attack/aoe_attack,
|
||||
/datum/action/innate/megafauna_attack/shotgun,
|
||||
/datum/action/innate/megafauna_attack/alternating_cardinals)
|
||||
/// Have we used our final attack yet?
|
||||
var/final_available = TRUE
|
||||
|
||||
/mob/living/simple_animal/hostile/megafauna/colossus/Initialize(mapload)
|
||||
. = ..()
|
||||
@@ -71,6 +74,10 @@ Difficulty: Very Hard
|
||||
for(var/mob/living/simple_animal/hostile/megafauna/hierophant/H in GLOB.mob_list)
|
||||
H.RegisterSignal(src, COMSIG_MOB_APPLY_DAMAGE, TYPE_PROC_REF(/mob/living/simple_animal/hostile/megafauna/hierophant, easy_anti_cheese))
|
||||
|
||||
/mob/living/simple_animal/hostile/megafauna/colossus/death(gibbed)
|
||||
. = ..()
|
||||
icon = 'icons/mob/lavaland/corpses.dmi'
|
||||
|
||||
/datum/action/innate/megafauna_attack/spiral_attack
|
||||
name = "Spiral Shots"
|
||||
button_overlay_icon = 'icons/mob/actions/actions.dmi'
|
||||
|
||||
@@ -62,6 +62,10 @@ Difficulty: Medium
|
||||
death_sound = 'sound/misc/demon_dies.ogg'
|
||||
footstep_type = FOOTSTEP_MOB_HEAVY
|
||||
enraged_loot = /obj/item/disk/fauna_research/ash_drake
|
||||
contains_xeno_organ = TRUE
|
||||
ignore_generic_organs = TRUE
|
||||
surgery_container = /datum/xenobiology_surgery_container/drake
|
||||
|
||||
attack_action_types = list(/datum/action/innate/megafauna_attack/fire_cone,
|
||||
/datum/action/innate/megafauna_attack/fire_cone_meteors,
|
||||
/datum/action/innate/megafauna_attack/mass_fire,
|
||||
@@ -101,6 +105,13 @@ Difficulty: Medium
|
||||
desc = "Here there be dragons."
|
||||
invisibility = 100
|
||||
|
||||
/mob/living/simple_animal/hostile/megafauna/dragon/death(gibbed)
|
||||
move_force = MOVE_FORCE_OVERPOWERING
|
||||
move_resist = MOVE_FORCE_OVERPOWERING
|
||||
pull_force = MOVE_FORCE_OVERPOWERING
|
||||
mob_size = MOB_SIZE_LARGE
|
||||
return ..()
|
||||
|
||||
/mob/living/simple_animal/hostile/megafauna/dragon/OpenFire()
|
||||
if(swooping)
|
||||
return
|
||||
@@ -603,6 +614,7 @@ Difficulty: Medium
|
||||
crusher_loot = list()
|
||||
butcher_results = list(/obj/item/stack/ore/diamond = 5, /obj/item/stack/sheet/sinew = 5, /obj/item/stack/sheet/bone = 30)
|
||||
attack_action_types = list()
|
||||
contains_xeno_organ = FALSE
|
||||
|
||||
/mob/living/simple_animal/hostile/megafauna/dragon/lesser/generate_random_loot()
|
||||
return
|
||||
|
||||
@@ -43,6 +43,7 @@ Difficulty: Hard
|
||||
attack_sound = 'sound/weapons/sonic_jackhammer.ogg'
|
||||
icon_state = "hierophant"
|
||||
icon_living = "hierophant"
|
||||
icon_dead = "hierophant_dead"
|
||||
friendly = "stares down"
|
||||
icon = 'icons/mob/lavaland/hierophant_new.dmi'
|
||||
faction = list("boss") //asteroid mobs? get that shit out of my beautiful square house
|
||||
@@ -62,13 +63,11 @@ Difficulty: Hard
|
||||
internal_gps = /obj/item/gps/internal/hierophant
|
||||
medal_type = BOSS_MEDAL_HIEROPHANT
|
||||
score_type = HIEROPHANT_SCORE
|
||||
del_on_death = TRUE
|
||||
death_sound = 'sound/magic/repulse.ogg'
|
||||
enraged_loot = /obj/item/disk/fauna_research/hierophant
|
||||
attack_action_types = list(/datum/action/innate/megafauna_attack/blink,
|
||||
/datum/action/innate/megafauna_attack/chaser_swarm,
|
||||
/datum/action/innate/megafauna_attack/cross_blasts,
|
||||
/datum/action/innate/megafauna_attack/blink_spam)
|
||||
contains_xeno_organ = TRUE
|
||||
ignore_generic_organs = TRUE
|
||||
surgery_container = /datum/xenobiology_surgery_container/hierophant
|
||||
|
||||
var/burst_range = 3 //range on burst aoe
|
||||
var/beam_range = 5 //range on cross blast beams
|
||||
@@ -463,6 +462,8 @@ Difficulty: Hard
|
||||
set_stat(CONSCIOUS) // deathgasp wont run if dead, stupid
|
||||
for(var/turf/simulated/wall/indestructible/hierophant/T in GLOB.hierophant_walls)
|
||||
T.collapse()
|
||||
icon = 'icons/mob/lavaland/corpses.dmi'
|
||||
DeleteComponent(/datum/component/boss_music)
|
||||
..(/* force_grant = stored_nearby */)
|
||||
|
||||
/mob/living/simple_animal/hostile/megafauna/hierophant/Destroy()
|
||||
|
||||
@@ -22,6 +22,7 @@ Difficulty: Medium
|
||||
maxHealth = 2500
|
||||
icon_state = "mega_legion"
|
||||
icon_living = "mega_legion"
|
||||
icon_dead = "mega_legion_dead"
|
||||
desc = "One of many."
|
||||
icon = 'icons/mob/lavaland/96x96megafauna.dmi'
|
||||
attacktext = "chomps"
|
||||
@@ -33,7 +34,6 @@ Difficulty: Medium
|
||||
wander = FALSE
|
||||
speed = 2
|
||||
ranged = TRUE
|
||||
del_on_death = TRUE
|
||||
retreat_distance = 5
|
||||
minimum_distance = 5
|
||||
pixel_x = -32
|
||||
@@ -52,6 +52,9 @@ Difficulty: Medium
|
||||
mouse_opacity = MOUSE_OPACITY_ICON
|
||||
stat_attack = UNCONSCIOUS // Overriden from /tg/ - otherwise Legion starts chasing its minions
|
||||
appearance_flags = 512
|
||||
contains_xeno_organ = TRUE
|
||||
ignore_generic_organs = TRUE
|
||||
surgery_container = /datum/xenobiology_surgery_container/legion
|
||||
|
||||
/mob/living/simple_animal/hostile/megafauna/legion/Initialize(mapload)
|
||||
. = ..()
|
||||
@@ -91,6 +94,7 @@ Difficulty: Medium
|
||||
..()
|
||||
|
||||
/mob/living/simple_animal/hostile/megafauna/legion/death(gibbed)
|
||||
icon = 'icons/mob/lavaland/corpses.dmi'
|
||||
for(var/mob/living/simple_animal/hostile/megafauna/legion/other in GLOB.mob_list)
|
||||
if(other != src)
|
||||
other.loot = list(/obj/item/storm_staff) //Initial does not work with lists.
|
||||
|
||||
@@ -81,6 +81,9 @@
|
||||
|
||||
/mob/living/simple_animal/hostile/megafauna/death(gibbed)
|
||||
GLOB.alive_megafauna_list -= UID()
|
||||
// lets normalize the icons a bit
|
||||
pixel_x = 0
|
||||
pixel_y = 0
|
||||
// this happens before the parent call because `del_on_death` may be set
|
||||
if(can_die() && !admin_spawned)
|
||||
var/datum/status_effect/crusher_damage/C = has_status_effect(STATUS_EFFECT_CRUSHERDAMAGETRACKING)
|
||||
|
||||
@@ -31,6 +31,9 @@
|
||||
aggro_vision_range = 9
|
||||
turns_per_move = 5
|
||||
gold_core_spawnable = HOSTILE_SPAWN
|
||||
contains_xeno_organ = TRUE
|
||||
surgery_container = /datum/xenobiology_surgery_container/basilisk
|
||||
|
||||
loot = list(/obj/item/stack/ore/diamond{layer = ABOVE_MOB_LAYER},
|
||||
/obj/item/stack/ore/diamond{layer = ABOVE_MOB_LAYER})
|
||||
|
||||
@@ -86,6 +89,7 @@
|
||||
loot = list()
|
||||
butcher_results = list(/obj/item/stack/ore/diamond = 2, /obj/item/stack/sheet/sinew = 2, /obj/item/stack/sheet/bone = 1)
|
||||
initial_traits = list(TRAIT_FLYING)
|
||||
surgery_container = /datum/xenobiology_surgery_container/watcher
|
||||
|
||||
/mob/living/simple_animal/hostile/asteroid/basilisk/watcher/magmawing
|
||||
name = "magmawing watcher"
|
||||
|
||||
@@ -39,6 +39,9 @@
|
||||
mouse_opacity = MOUSE_OPACITY_ICON
|
||||
deathmessage = "explodes into gore!"
|
||||
loot_drop = /obj/item/crusher_trophy/broodmother_tongue
|
||||
contains_xeno_organ = TRUE
|
||||
ignore_generic_organs = TRUE
|
||||
surgery_container = /datum/xenobiology_surgery_container/goliath
|
||||
|
||||
attack_action_types = list(/datum/action/innate/elite_attack/tentacle_patch,
|
||||
/datum/action/innate/elite_attack/spawn_children,
|
||||
|
||||
@@ -41,7 +41,9 @@
|
||||
death_sound = 'sound/misc/demon_dies.ogg'
|
||||
deathmessage = "begins to shudder as it becomes transparent..."
|
||||
loot_drop = /obj/item/clothing/neck/cloak/herald_cloak
|
||||
|
||||
contains_xeno_organ = TRUE
|
||||
ignore_generic_organs = TRUE
|
||||
surgery_container = /datum/xenobiology_surgery_container/herald
|
||||
|
||||
attack_action_types = list(/datum/action/innate/elite_attack/herald_trishot,
|
||||
/datum/action/innate/elite_attack/herald_directionalshot,
|
||||
|
||||
@@ -40,6 +40,9 @@
|
||||
sight = SEE_MOBS // So it can see through smoke / charge through walls like the kool aid man.
|
||||
var/datum/effect_system/smoke_spread/bad/smoke
|
||||
loot_drop = /obj/item/crusher_trophy/legionnaire_spine
|
||||
contains_xeno_organ = TRUE
|
||||
ignore_generic_organs = TRUE
|
||||
surgery_container = /datum/xenobiology_surgery_container/legionnaire
|
||||
|
||||
attack_action_types = list(/datum/action/innate/elite_attack/legionnaire_charge,
|
||||
/datum/action/innate/elite_attack/head_detach,
|
||||
|
||||
@@ -41,6 +41,9 @@
|
||||
death_sound = 'sound/magic/repulse.ogg'
|
||||
deathmessage = "'s lights flicker, before its top part falls down."
|
||||
loot_drop = /obj/item/clothing/accessory/pandora_hope
|
||||
contains_xeno_organ = TRUE
|
||||
ignore_generic_organs = TRUE
|
||||
surgery_container = /datum/xenobiology_surgery_container/pandora
|
||||
|
||||
attack_action_types = list(/datum/action/innate/elite_attack/chaser_burst,
|
||||
/datum/action/innate/elite_attack/magic_box,
|
||||
|
||||
@@ -26,6 +26,8 @@
|
||||
deathmessage = "spits up the contents of its stomach before dying!"
|
||||
status_flags = CANPUSH
|
||||
search_objects = 1
|
||||
contains_xeno_organ = TRUE
|
||||
surgery_container = /datum/xenobiology_surgery_container/goldgrub
|
||||
wanted_objects = list(/obj/item/stack/ore/diamond, /obj/item/stack/ore/gold, /obj/item/stack/ore/silver,
|
||||
/obj/item/stack/ore/uranium)
|
||||
|
||||
|
||||
@@ -34,6 +34,8 @@
|
||||
var/pre_attack_icon = "Goliath_preattack"
|
||||
loot = list(/obj/item/stack/sheet/animalhide/goliath_hide)
|
||||
footstep_type = FOOTSTEP_MOB_HEAVY
|
||||
contains_xeno_organ = TRUE
|
||||
surgery_container = /datum/xenobiology_surgery_container/goliath
|
||||
|
||||
/mob/living/simple_animal/hostile/asteroid/goliath/Life()
|
||||
. = ..()
|
||||
|
||||
@@ -32,6 +32,8 @@
|
||||
pass_flags = PASSTABLE
|
||||
butcher_results = list(/obj/item/organ/internal/regenerative_core = 1)
|
||||
var/brood_type = /mob/living/simple_animal/hostile/asteroid/hivelordbrood
|
||||
contains_xeno_organ = TRUE
|
||||
surgery_container = /datum/xenobiology_surgery_container/hivelord
|
||||
|
||||
/mob/living/simple_animal/hostile/asteroid/hivelord/OpenFire(the_target)
|
||||
if(world.time >= ranged_cooldown)
|
||||
@@ -298,6 +300,7 @@
|
||||
sentience_type = SENTIENCE_BOSS
|
||||
attack_sound = 'sound/misc/demon_attack1.ogg'
|
||||
speed = 0
|
||||
butcher_results = list(/obj/item/regen_mesh)
|
||||
|
||||
/mob/living/simple_animal/hostile/asteroid/big_legion/AttackingTarget()
|
||||
if(!isliving(target))
|
||||
|
||||
@@ -16,6 +16,8 @@
|
||||
atmos_requirements = list("min_oxy" = 0, "max_oxy" = 0, "min_tox" = 0, "max_tox" = 0, "min_co2" = 0, "max_co2" = 0, "min_n2" = 0, "max_n2" = 0)
|
||||
minbodytemp = 0
|
||||
faction = list("nether")
|
||||
contains_xeno_organ = TRUE
|
||||
surgery_container = /datum/xenobiology_surgery_container/sweating
|
||||
|
||||
/mob/living/simple_animal/hostile/netherworld/migo
|
||||
name = "mi-go"
|
||||
@@ -26,19 +28,18 @@
|
||||
icon_dead = "mi-go-dead"
|
||||
attacktext = "lacerates"
|
||||
speed = -0.5
|
||||
var/static/list/migo_sounds
|
||||
deathmessage = "wails as its form turns into a pulpy mush."
|
||||
death_sound = 'sound/voice/hiss6.ogg'
|
||||
surgery_container = /datum/xenobiology_surgery_container/migo
|
||||
|
||||
/mob/living/simple_animal/hostile/netherworld/migo/Initialize(mapload)
|
||||
. = ..()
|
||||
migo_sounds = list('sound/items/bubblewrap.ogg', 'sound/items/change_jaws.ogg', 'sound/items/crowbar.ogg', 'sound/items/drink.ogg', 'sound/items/deconstruct.ogg', 'sound/items/change_drill.ogg', 'sound/items/dodgeball.ogg', 'sound/items/eatfood.ogg', 'sound/items/screwdriver.ogg', 'sound/items/weeoo1.ogg', 'sound/items/wirecutter.ogg', 'sound/items/welder.ogg', 'sound/items/zip.ogg', 'sound/items/rped.ogg', 'sound/items/ratchet.ogg', 'sound/items/polaroid1.ogg', 'sound/items/pshoom.ogg', 'sound/items/airhorn.ogg', 'sound/voice/bcreep.ogg', 'sound/voice/biamthelaw.ogg', 'sound/voice/ed209_20sec.ogg', 'sound/voice/hiss3.ogg', 'sound/voice/hiss6.ogg', 'sound/voice/mpatchedup.ogg', 'sound/voice/mfeelbetter.ogg', 'sound/weapons/sear.ogg', 'sound/ambience/antag/tatoralert.ogg', 'sound/mecha/nominal.ogg', 'sound/mecha/weapdestr.ogg', 'sound/mecha/critdestr.ogg', 'sound/mecha/imag_enh.ogg', 'sound/effects/adminhelp.ogg', 'sound/effects/alert.ogg', 'sound/effects/attackblob.ogg', 'sound/effects/bamf.ogg', 'sound/effects/blobattack.ogg', 'sound/effects/break_stone.ogg', 'sound/effects/bubbles.ogg', 'sound/effects/bubbles2.ogg', 'sound/effects/clang.ogg', 'sound/effects/clownstep2.ogg', 'sound/effects/dimensional_rend.ogg', 'sound/effects/doorcreaky.ogg', 'sound/effects/empulse.ogg', 'sound/effects/explosionfar.ogg', 'sound/effects/explosion1.ogg', 'sound/effects/grillehit.ogg', 'sound/effects/genetics.ogg', 'sound/effects/heartbeat.ogg', 'sound/effects/hyperspace_begin.ogg', 'sound/effects/hyperspace_end.ogg', 'sound/goonstation/effects/screech.ogg', 'sound/effects/phasein.ogg', 'sound/effects/picaxe1.ogg', 'sound/effects/sparks1.ogg', 'sound/effects/smoke.ogg', 'sound/effects/splat.ogg', 'sound/effects/snap.ogg', 'sound/effects/tendril_destroyed.ogg', 'sound/effects/supermatter.ogg', 'sound/misc/desceration-01.ogg', 'sound/misc/desceration-02.ogg', 'sound/misc/desceration-03.ogg', 'sound/misc/bloblarm.ogg', 'sound/goonstation/misc/airraid_loop.ogg', 'sound/misc/interference.ogg', 'sound/misc/notice1.ogg', 'sound/misc/notice2.ogg', 'sound/misc/sadtrombone.ogg', 'sound/misc/slip.ogg', 'sound/weapons/armbomb.ogg', 'sound/weapons/chainsaw.ogg', 'sound/weapons/emitter.ogg', 'sound/weapons/emitter2.ogg', 'sound/weapons/blade1.ogg', 'sound/weapons/bladeslice.ogg', 'sound/weapons/blastcannon.ogg', 'sound/weapons/blaster.ogg', 'sound/weapons/bulletflyby3.ogg', 'sound/weapons/circsawhit.ogg', 'sound/weapons/cqchit2.ogg', 'sound/weapons/drill.ogg', 'sound/weapons/genhit1.ogg', 'sound/weapons/gunshots/gunshot_silenced.ogg', 'sound/weapons/gunshots/gunshot.ogg', 'sound/weapons/handcuffs.ogg', 'sound/weapons/homerun.ogg', 'sound/weapons/kenetic_accel.ogg', 'sound/machines/fryer/deep_fryer_emerge.ogg', 'sound/machines/airlock_alien_prying.ogg', 'sound/machines/airlock_close.ogg', 'sound/machines/airlockforced.ogg', 'sound/machines/airlock_open.ogg', 'sound/machines/alarm.ogg', 'sound/machines/blender.ogg', 'sound/machines/boltsdown.ogg', 'sound/machines/boltsup.ogg', 'sound/machines/buzz-sigh.ogg', 'sound/machines/buzz-two.ogg', 'sound/machines/chime.ogg', 'sound/machines/defib_charge.ogg', 'sound/machines/defib_failed.ogg', 'sound/machines/defib_ready.ogg', 'sound/machines/defib_zap.ogg', 'sound/machines/deniedbeep.ogg', 'sound/machines/ding.ogg', 'sound/machines/disposalflush.ogg', 'sound/machines/door_close.ogg', 'sound/machines/door_open.ogg', 'sound/machines/engine_alert1.ogg', 'sound/machines/engine_alert2.ogg', 'sound/machines/hiss.ogg', 'sound/machines/honkbot_evil_laugh.ogg', 'sound/machines/juicer.ogg', 'sound/machines/ping.ogg', 'sound/ambience/signal.ogg', 'sound/machines/synth_no.ogg', 'sound/machines/synth_yes.ogg', 'sound/machines/terminal_alert.ogg', 'sound/machines/twobeep.ogg', 'sound/machines/ventcrawl.ogg', 'sound/machines/warning-buzzer.ogg', 'sound/ai/outbreak5.ogg', 'sound/ai/outbreak7.ogg', 'sound/ai/alert.ogg', 'sound/ai/radiation.ogg', 'sound/ai/eshuttle_call.ogg', 'sound/ai/eshuttle_dock.ogg', 'sound/ai/eshuttle_recall.ogg', 'sound/ai/aimalf.ogg', 'sound/ambience/ambigen1.ogg', 'sound/ambience/ambigen3.ogg', 'sound/ambience/ambigen4.ogg', 'sound/ambience/ambigen5.ogg', 'sound/ambience/ambigen6.ogg', 'sound/ambience/ambigen10.ogg', 'sound/hallucinations/over_here1.ogg', 'sound/hallucinations/over_here2.ogg', 'sound/hallucinations/over_here3.ogg') //hahahaha fuck you code divers
|
||||
|
||||
/mob/living/simple_animal/hostile/netherworld/migo/say(message, bubble_type, list/spans = list(), sanitize = TRUE, datum/language/language = null, ignore_spam = FALSE, forced = null)
|
||||
..()
|
||||
if(stat)
|
||||
return
|
||||
var/chosen_sound = pick(migo_sounds)
|
||||
var/chosen_sound = pick(GLOB.migo_sounds)
|
||||
playsound(src, chosen_sound, 50, TRUE)
|
||||
|
||||
/mob/living/simple_animal/hostile/netherworld/migo/Life()
|
||||
@@ -46,7 +47,7 @@
|
||||
if(stat)
|
||||
return
|
||||
if(prob(10))
|
||||
var/chosen_sound = pick(migo_sounds)
|
||||
var/chosen_sound = pick(GLOB.migo_sounds)
|
||||
playsound(src, chosen_sound, 50, TRUE)
|
||||
|
||||
/mob/living/simple_animal/hostile/netherworld/blankbody
|
||||
|
||||
@@ -31,6 +31,8 @@
|
||||
cold_damage_per_tick = 10 //same as heat_damage_per_tick, only if the bodytemperature it's lower than minbodytemp
|
||||
unsuitable_atmos_damage = 10
|
||||
footstep_type = FOOTSTEP_MOB_SHOE
|
||||
contains_xeno_organ = TRUE
|
||||
surgery_container = /datum/xenobiology_surgery_container/clown
|
||||
|
||||
/mob/living/simple_animal/hostile/retaliate/clown/goblin
|
||||
icon = 'icons/mob/animal.dmi'
|
||||
|
||||
@@ -8,7 +8,7 @@ GLOBAL_LIST_EMPTY(ts_spiderlist)
|
||||
GLOBAL_LIST_EMPTY(ts_egg_list)
|
||||
GLOBAL_LIST_EMPTY(ts_spiderling_list)
|
||||
GLOBAL_LIST_EMPTY(ts_infected_list)
|
||||
|
||||
#define DECOMPOSE_TIMER 5 MINUTES
|
||||
// --------------------------------------------------------------------------------
|
||||
// --------------------- TERROR SPIDERS: DEFAULTS ---------------------------------
|
||||
// --------------------------------------------------------------------------------
|
||||
@@ -19,6 +19,8 @@ GLOBAL_LIST_EMPTY(ts_infected_list)
|
||||
name = "terror spider"
|
||||
desc = "The generic parent of all other terror spider types. If you see this in-game, it is a bug."
|
||||
gender = FEMALE
|
||||
contains_xeno_organ = TRUE
|
||||
surgery_container = /datum/xenobiology_surgery_container/terror_spider
|
||||
|
||||
// Icons
|
||||
icon = 'icons/mob/terrorspider.dmi'
|
||||
@@ -314,26 +316,22 @@ GLOBAL_LIST_EMPTY(ts_infected_list)
|
||||
|
||||
/mob/living/simple_animal/hostile/poison/terror_spider/Life(seconds, times_fired)
|
||||
. = ..()
|
||||
if(stat == DEAD) // Can't use if(.) for this due to the fact it can sometimes return FALSE even when mob is alive.
|
||||
if(prob(2))
|
||||
// 2% chance every cycle to decompose
|
||||
visible_message("<span class='notice'>The dead body of [src] decomposes!</span>")
|
||||
gib()
|
||||
else
|
||||
if(degenerate)
|
||||
adjustToxLoss(rand(1, 10))
|
||||
if(regen_points < regen_points_max)
|
||||
regen_points += regen_points_per_tick
|
||||
if(getBruteLoss() || getFireLoss())
|
||||
if(regen_points > regen_points_per_hp)
|
||||
if(getBruteLoss())
|
||||
adjustBruteLoss(-1)
|
||||
regen_points -= regen_points_per_hp
|
||||
else if(getFireLoss())
|
||||
adjustFireLoss(-1)
|
||||
regen_points -= regen_points_per_hp
|
||||
if(prob(5)) // AA 2022-08-11 - This gives me prob(80) vibes. Should probably be refactored.
|
||||
CheckFaction()
|
||||
if(stat == DEAD)
|
||||
return
|
||||
if(degenerate)
|
||||
adjustToxLoss(rand(1, 10))
|
||||
if(regen_points < regen_points_max)
|
||||
regen_points += regen_points_per_tick
|
||||
if(getBruteLoss() || getFireLoss())
|
||||
if(regen_points > regen_points_per_hp)
|
||||
if(getBruteLoss())
|
||||
adjustBruteLoss(-1)
|
||||
regen_points -= regen_points_per_hp
|
||||
else if(getFireLoss())
|
||||
adjustFireLoss(-1)
|
||||
regen_points -= regen_points_per_hp
|
||||
if(prob(5)) // AA 2022-08-11 - This gives me prob(80) vibes. Should probably be refactored.
|
||||
CheckFaction()
|
||||
|
||||
/mob/living/simple_animal/hostile/poison/terror_spider/proc/handle_dying()
|
||||
if(!hasdied)
|
||||
@@ -353,9 +351,14 @@ GLOBAL_LIST_EMPTY(ts_infected_list)
|
||||
if(can_die())
|
||||
if(!gibbed)
|
||||
msg_terrorspiders("[src] has died in [get_area(src)].")
|
||||
addtimer(CALLBACK(src, PROC_REF(decompose_now)), DECOMPOSE_TIMER)
|
||||
handle_dying()
|
||||
return ..()
|
||||
|
||||
/mob/living/simple_animal/hostile/poison/terror_spider/proc/decompose_now()
|
||||
visible_message("<span class='notice'>The dead body of [src] decomposes!</span>")
|
||||
gib()
|
||||
|
||||
/mob/living/simple_animal/hostile/poison/terror_spider/proc/spider_special_action()
|
||||
return
|
||||
|
||||
@@ -476,3 +479,5 @@ GLOBAL_LIST_EMPTY(ts_infected_list)
|
||||
. = ..()
|
||||
if(pulling && !ismob(pulling) && pulling.density)
|
||||
. += 6 // Drastic move speed penalty for dragging anything that is not a mob or a non dense object
|
||||
|
||||
#undef DECOMPOSE_TIMER
|
||||
|
||||
@@ -7,6 +7,7 @@
|
||||
handle_feeding()
|
||||
if(stat == CONSCIOUS) // Slimes in stasis don't lose nutrition, don't change mood and don't respond to speech
|
||||
handle_nutrition()
|
||||
handle_organs()
|
||||
if(QDELETED(src)) // Stop if the slime split during handle_nutrition()
|
||||
return
|
||||
reagents.remove_all(0.5 * REAGENTS_METABOLISM * length(reagents.reagent_list)) //Slimes are such snowflakes
|
||||
@@ -269,7 +270,7 @@
|
||||
if(prob(60))
|
||||
rabid = FALSE
|
||||
|
||||
if(prob(10))
|
||||
if(prob(10) && !trained)
|
||||
Discipline--
|
||||
|
||||
if(!client && !stop_automated_movement)
|
||||
@@ -361,6 +362,8 @@
|
||||
newmood = ":3"
|
||||
else if(Target)
|
||||
newmood = "mischievous"
|
||||
else if(trained)
|
||||
newmood = ":33"
|
||||
|
||||
if(!newmood)
|
||||
if(Discipline && prob(25))
|
||||
@@ -476,3 +479,24 @@
|
||||
if(hunger == 2 || rabid || attacked)
|
||||
return TRUE
|
||||
return TRUE
|
||||
|
||||
// Handles xeno organ processing, and turns the unidentified organs into the true organ type.
|
||||
/mob/living/simple_animal/slime/proc/handle_organs()
|
||||
if(!holding_organ)
|
||||
return
|
||||
if(istype(loc, /obj/machinery/computer/camera_advanced/xenobio))
|
||||
return // no processing while in the computer
|
||||
if(!trained) // if we somehow untrain mid process
|
||||
say("BLECK!!", pick(speak_emote))
|
||||
eject_organ()
|
||||
if(organ_progress < 50)
|
||||
organ_progress += 1
|
||||
return
|
||||
organ_progress = 1
|
||||
say("All done!", pick(speak_emote))
|
||||
var/obj/item/organ/internal/finished_organ = new holding_organ.true_organ_type(src.loc)
|
||||
finished_organ.organ_quality = holding_organ.unknown_quality
|
||||
finished_organ.icon_state = holding_organ.icon_state
|
||||
finished_organ.name = "[quality_to_string(finished_organ.organ_quality, FALSE)] [finished_organ.name]"
|
||||
underlays.Cut()
|
||||
QDEL_NULL(holding_organ)
|
||||
|
||||
@@ -9,6 +9,7 @@
|
||||
var/is_adult = FALSE
|
||||
var/docile = FALSE
|
||||
faction = list("slime", "neutral")
|
||||
new_attack_chain = TRUE
|
||||
|
||||
harm_intent_damage = 5
|
||||
icon_living = "grey baby slime"
|
||||
@@ -49,7 +50,7 @@
|
||||
var/target_patience = 0 // AI variable, cooloff-ish for how long it's going to follow its target
|
||||
|
||||
var/mood = "" // To show its face
|
||||
var/mutator_used = FALSE //So you can't shove a dozen mutators into a single slime
|
||||
var/mutator_used = FALSE // So you can't shove a dozen mutators into a single slime
|
||||
var/force_stasis = FALSE
|
||||
|
||||
var/static/regex/slime_name_regex = new("\\w+ (baby|adult) slime \\(\\d+\\)")
|
||||
@@ -64,6 +65,12 @@
|
||||
var/Discipline = 0
|
||||
/// Stun variable
|
||||
var/SStun = 0
|
||||
// does this slime have a xeno organ inserted into it already?
|
||||
var/obj/item/xeno_organ/holding_organ
|
||||
// An elevated form of discipline. Is this slime trained and ready to begin organ therapy?
|
||||
var/trained = FALSE
|
||||
// how far along in the organ processing are we
|
||||
var/organ_progress = 0
|
||||
|
||||
///////////TIME FOR SUBSPECIES
|
||||
|
||||
@@ -111,6 +118,22 @@
|
||||
Target = null
|
||||
return ..()
|
||||
|
||||
/mob/living/simple_animal/slime/death()
|
||||
if(holding_organ)
|
||||
eject_organ()
|
||||
underlays.Cut()
|
||||
return ..()
|
||||
|
||||
/mob/living/simple_animal/slime/update_overlays()
|
||||
. = ..()
|
||||
if(stat != DEAD)
|
||||
. += "aslime-[mood]"
|
||||
if(holding_organ)
|
||||
var/mutable_appearance/underlay_appearance = mutable_appearance(layer = 3.9, plane = GAME_PLANE) // 3.9 so it wont potentially layer weird if someones laying below
|
||||
underlay_appearance.icon = icon = 'icons/mob/slimes.dmi'
|
||||
underlay_appearance.icon_state = "xeno_organ"
|
||||
underlays += underlay_appearance
|
||||
|
||||
/mob/living/simple_animal/slime/proc/set_colour(new_colour)
|
||||
colour = new_colour
|
||||
update_appearance(UPDATE_NAME)
|
||||
@@ -136,7 +159,7 @@
|
||||
if(stat != DEAD)
|
||||
icon_state = icon_text
|
||||
if(mood && stat == CONSCIOUS)
|
||||
add_overlay("aslime-[mood]")
|
||||
update_appearance(UPDATE_OVERLAYS)
|
||||
else
|
||||
icon_state = icon_dead
|
||||
|
||||
@@ -347,6 +370,11 @@
|
||||
for(var/datum/surgery/S in surgeries)
|
||||
if(S.next_step(M, src))
|
||||
return 1
|
||||
if(M.a_intent == INTENT_HELP)
|
||||
new /obj/effect/temp_visual/heart(src.loc)
|
||||
if(prob(4))
|
||||
discipline_slime(M, positive_reinforcement = TRUE)
|
||||
|
||||
if(..()) //successful attack
|
||||
attacked += 10
|
||||
|
||||
@@ -355,18 +383,43 @@
|
||||
attacked += 10
|
||||
discipline_slime(M)
|
||||
|
||||
|
||||
/mob/living/simple_animal/slime/item_interaction(mob/living/user, obj/item/I, list/modifiers)
|
||||
if(stat == DEAD && length(surgeries))
|
||||
if(user.a_intent == INTENT_HELP || user.a_intent == INTENT_DISARM)
|
||||
for(var/datum/surgery/S in surgeries)
|
||||
if(S.next_step(user, src))
|
||||
return ITEM_INTERACT_COMPLETE
|
||||
if(istype(I, /obj/item/xeno_organ) && stat == CONSCIOUS)
|
||||
if(!is_adult)
|
||||
to_chat(user, "<span class='notice'>The slime is not old enough yet to process organs!</span>")
|
||||
return ITEM_INTERACT_COMPLETE
|
||||
if(holding_organ)
|
||||
to_chat(user, "<span class='warning'>The slime is already processing an organ!</span>")
|
||||
return ITEM_INTERACT_COMPLETE
|
||||
if(trained)
|
||||
if(src.mind)
|
||||
src.visible_message("<span class='notice'>Sentient slimes are unable to process organs!</span>")
|
||||
return ITEM_INTERACT_COMPLETE
|
||||
if(user.transfer_item_to(I, src, force = TRUE))
|
||||
holding_organ = I
|
||||
src.visible_message("<span class='notice'>The slime gently pulls the offered organ into itself.</span>")
|
||||
update_appearance(UPDATE_OVERLAYS)
|
||||
return ITEM_INTERACT_COMPLETE
|
||||
else
|
||||
to_chat(user, "<span class='notice'>The slime seems puzzled at what you want it to do with the organ! It needs to be trained first.</span>")
|
||||
return ITEM_INTERACT_COMPLETE
|
||||
if(istype(I, /obj/item/stack/sheet/mineral/plasma) && stat == CONSCIOUS) //Let's you feed slimes plasma.
|
||||
to_chat(user, "<span class='notice'>You feed the slime the plasma. It chirps happily.</span>")
|
||||
var/obj/item/stack/sheet/mineral/plasma/S = I
|
||||
S.use(1)
|
||||
discipline_slime(user)
|
||||
if(S.amount < 5)
|
||||
to_chat(user, "<span class='notice'>You need at least five sheets of plasma to feed the slime!</span>")
|
||||
return ITEM_INTERACT_COMPLETE
|
||||
new /obj/effect/temp_visual/heart(loc)
|
||||
visible_message("<span class='notice'>[user] feeds the slime some plasma. It chirps happily!</span>", "<span class='notice'>[user] feeds you a few sheets of plasma! Yummy!!!</span>")
|
||||
S.use(5)
|
||||
if(Discipline)
|
||||
trained = TRUE
|
||||
else
|
||||
discipline_slime(user, positive_reinforcement = TRUE)
|
||||
return ITEM_INTERACT_COMPLETE
|
||||
if(I.force > 0)
|
||||
attacked += 10
|
||||
@@ -375,9 +428,12 @@
|
||||
user.changeNext_move(CLICK_CD_MELEE)
|
||||
to_chat(user, "<span class='danger'>[I] passes right through [src]!</span>")
|
||||
return ITEM_INTERACT_COMPLETE
|
||||
if(Discipline && prob(50)) // wow, buddy, why am I getting attacked??
|
||||
if(Discipline && prob(50) && !trained) // wow, buddy, why am I getting attacked??
|
||||
Discipline = 0
|
||||
return ITEM_INTERACT_COMPLETE
|
||||
if(trained && prob(20)) // trained slimes are more resistant to losing discipline
|
||||
trained = 0
|
||||
visible_message("<span class='warning'>[src] gets spooked and cowers from [user]!</span>")
|
||||
|
||||
/mob/living/simple_animal/slime/attacked_by(obj/item/I, mob/living/user)
|
||||
if(..())
|
||||
@@ -394,9 +450,18 @@
|
||||
. = ..()
|
||||
var/water_damage = rand(10, 15) * volume
|
||||
adjustBruteLoss(water_damage)
|
||||
// Extinguishers just piss them off more
|
||||
if(!client && istype(source, /obj/effect/particle_effect/water))
|
||||
adjustBruteLoss(5) // extra potent
|
||||
if(trained && prob(75))
|
||||
say("Ow! HEY!!!", pick(speak_emote))
|
||||
trained = FALSE
|
||||
rabid = TRUE
|
||||
if(!client && Target && volume >= 3) // Like cats
|
||||
Target = null
|
||||
++Discipline
|
||||
discipline_slime(FALSE)
|
||||
if(prob(5))
|
||||
say("Ow ow ow!", pick(speak_emote))
|
||||
|
||||
/mob/living/simple_animal/slime/examine(mob/user)
|
||||
. = ..()
|
||||
@@ -413,7 +478,8 @@
|
||||
else
|
||||
. += "<B>It has severe punctures and tears in its flesh!</B>"
|
||||
. += "</span>\n"
|
||||
|
||||
if(holding_organ)
|
||||
. += "It seems to be currently processing something inside of itself."
|
||||
switch(powerlevel)
|
||||
if(2 to 3)
|
||||
. += "It is flickering gently with a little electrical activity."
|
||||
@@ -429,23 +495,30 @@
|
||||
|
||||
. += "</span>"
|
||||
|
||||
/mob/living/simple_animal/slime/proc/discipline_slime(mob/user)
|
||||
/mob/living/simple_animal/slime/proc/discipline_slime(mob/user, positive_reinforcement = FALSE)
|
||||
if(stat)
|
||||
return
|
||||
|
||||
if(prob(80) && !client)
|
||||
if(!client)
|
||||
Discipline++
|
||||
|
||||
if(!is_adult)
|
||||
if(Discipline == 1)
|
||||
if(Discipline >= 1)
|
||||
attacked = 0
|
||||
|
||||
if(Target)
|
||||
if(trained && !positive_reinforcement)
|
||||
say("Sorry...", pick(speak_emote))
|
||||
Target = null
|
||||
|
||||
if(buckled)
|
||||
Feedstop(silent = TRUE) //we unbuckle the slime from the mob it latched onto.
|
||||
|
||||
SStun = world.time + rand(20,60)
|
||||
|
||||
if(positive_reinforcement)
|
||||
mood = ":33"
|
||||
regenerate_icons()
|
||||
return
|
||||
spawn(0)
|
||||
ADD_TRAIT(src, TRAIT_IMMOBILIZED, SLIME_TRAIT)
|
||||
if(user)
|
||||
@@ -480,3 +553,13 @@
|
||||
/mob/living/simple_animal/slime/unit_test_dummy
|
||||
wander = FALSE
|
||||
stop_automated_movement = TRUE
|
||||
|
||||
/mob/living/simple_animal/slime/proc/eject_organ()
|
||||
holding_organ.forceMove(loc)
|
||||
visible_message("<span class='notice'>[src] drops \the [holding_organ.name] as it splits!</span>")
|
||||
holding_organ = null
|
||||
update_appearance()
|
||||
|
||||
/mob/living/simple_animal/slime/sentience_act()
|
||||
. = ..()
|
||||
eject_organ()
|
||||
|
||||
@@ -167,7 +167,8 @@
|
||||
|
||||
if(istype(loc, /obj/machinery/computer/camera_advanced/xenobio))
|
||||
return //no you cannot split while you're in the matrix (this prevents GC issues and slimes disappearing)
|
||||
|
||||
if(holding_organ)
|
||||
eject_organ()
|
||||
var/list/babies = list()
|
||||
var/new_nutrition = round(nutrition * 0.9)
|
||||
var/new_powerlevel = round(powerlevel / 4)
|
||||
|
||||
@@ -720,3 +720,13 @@
|
||||
materials = list(MAT_GLASS = 1000)
|
||||
build_path = /obj/item/circuitboard/autochef
|
||||
category = list("Misc. Machinery")
|
||||
|
||||
/datum/design/organ_analyzer
|
||||
name = "Machine Design (Organ Analyzer)"
|
||||
desc = "The circuit board for an organ analyzer."
|
||||
id = "organ_analyzer"
|
||||
req_tech = list("programming" = 3, "bluespace" = 3, "materials" = 3)
|
||||
build_type = IMPRINTER
|
||||
materials = list(MAT_GLASS = 1000)
|
||||
build_path = /obj/item/circuitboard/organ_analyzer
|
||||
category = list("Research Machinery")
|
||||
|
||||
@@ -295,6 +295,37 @@
|
||||
materials = list(MAT_METAL = 2000, MAT_SILVER = 1500, MAT_PLASMA = 500, MAT_TITANIUM = 1500)
|
||||
category = list("Medical")
|
||||
|
||||
/datum/design/dissector
|
||||
name = "Dissection Manager"
|
||||
desc = "An advanced handheld device that assists with the preparation and removal of non-standard alien organs."
|
||||
id = "dissection_manager"
|
||||
req_tech = list("biotech" = 3, "materials" = 3, "programming" = 3)
|
||||
build_type = PROTOLATHE
|
||||
materials = list(MAT_METAL = 2000, MAT_GLASS = 1500)
|
||||
build_path = /obj/item/dissector
|
||||
category = list("Medical")
|
||||
|
||||
/datum/design/improved_dissector
|
||||
name = "Improved Dissection Manager"
|
||||
desc = "An advanced handheld device that assists with the preparation and removal of non-standard alien organs. This one has had several improvements applied to it."
|
||||
id = "dissection_manager_upgraded"
|
||||
req_tech = list("biotech" = 7, "materials" = 6, "engineering" = 6)
|
||||
build_type = PROTOLATHE
|
||||
materials = list(MAT_METAL = 4000, MAT_GLASS = 2000, MAT_SILVER = 1500, MAT_GOLD = 2000)
|
||||
build_path = /obj/item/dissector/upgraded
|
||||
category = list("Medical")
|
||||
|
||||
// allows for perfect dissections, should be very hard to obtain.
|
||||
/datum/design/alien_dissector
|
||||
name = "Alien Dissection Manager"
|
||||
desc = "A tool of alien origin, capable of near impossible levels of precision during dissections."
|
||||
id = "dissection_manager_alien"
|
||||
req_tech = list("biotech" = 7, "materials" = 7, "abductor" = 4)
|
||||
build_type = PROTOLATHE
|
||||
materials = list(MAT_METAL = 6000, MAT_GLASS = 4500, MAT_DIAMOND = 3000, MAT_TITANIUM = 4000, MAT_PLASMA = 4000)
|
||||
build_path = /obj/item/dissector/alien
|
||||
category = list("Medical")
|
||||
|
||||
/////////////////////////////////////////
|
||||
//////////Cybernetic Implants////////////
|
||||
/////////////////////////////////////////
|
||||
|
||||
@@ -0,0 +1,194 @@
|
||||
/obj/item/circuitboard/organ_analyzer
|
||||
board_name = "Organ Analyzer"
|
||||
icon_state = "science"
|
||||
build_path = /obj/machinery/organ_analyzer
|
||||
board_type = "machine"
|
||||
origin_tech = "biotech=2"
|
||||
|
||||
req_components = list(
|
||||
/obj/item/stock_parts/scanning_module = 2,
|
||||
/obj/item/stock_parts/manipulator = 1,
|
||||
)
|
||||
|
||||
/obj/machinery/organ_analyzer
|
||||
name = "Organ Analysis Chamber"
|
||||
desc = "A sophisticated machine made to break down and study samples of alien organs. Only revitalized organs are valid for analysis."
|
||||
density = TRUE
|
||||
anchored = TRUE
|
||||
icon = 'icons/obj/xeno_organs.dmi'
|
||||
icon_state = "organ_analyzer0"
|
||||
idle_power_consumption = 40
|
||||
layer = ABOVE_OBJ_LAYER
|
||||
resistance_flags = FIRE_PROOF|ACID_PROOF
|
||||
// what organ are we currently holding?
|
||||
var/obj/item/organ/internal/contains_organ
|
||||
// Are we actively taking apart an organ?
|
||||
var/processing_organ = FALSE
|
||||
// How long until the machine finishes?
|
||||
var/time_to_complete = 15 SECONDS
|
||||
// How good is the machine at giving credits for our work?
|
||||
var/reward_coeff
|
||||
|
||||
COOLDOWN_DECLARE(process_organ)
|
||||
|
||||
/obj/machinery/organ_analyzer/Initialize(mapload)
|
||||
. = ..()
|
||||
component_parts = list()
|
||||
component_parts += new /obj/item/circuitboard/organ_analyzer(null)
|
||||
component_parts += new /obj/item/stock_parts/scanning_module(null)
|
||||
component_parts += new /obj/item/stock_parts/scanning_module(null)
|
||||
component_parts += new /obj/item/stock_parts/manipulator(null)
|
||||
RefreshParts()
|
||||
update_appearance(UPDATE_OVERLAYS)
|
||||
|
||||
|
||||
/obj/machinery/organ_analyzer/update_overlays()
|
||||
underlays = null
|
||||
if(contains_organ)
|
||||
var/mutable_appearance/underlay_organ = mutable_appearance(layer = OBJ_LAYER, plane = GAME_PLANE)
|
||||
underlay_organ.icon = icon = 'icons/obj/xeno_organs.dmi'
|
||||
underlay_organ.icon_state = contains_organ.icon_state
|
||||
underlay_organ.pixel_y = -3
|
||||
underlays += underlay_organ
|
||||
var/mutable_appearance/underlay_base = mutable_appearance(layer = BELOW_OBJ_LAYER, plane = GAME_PLANE)
|
||||
underlay_base.icon = 'icons/obj/xeno_organs.dmi'
|
||||
if(processing_organ)
|
||||
underlay_base.icon_state += "organ_analyzer_on"
|
||||
else
|
||||
underlay_base.icon_state += "organ_analyzer_off"
|
||||
underlays += underlay_base
|
||||
|
||||
/obj/machinery/organ_analyzer/RefreshParts()
|
||||
reward_coeff = 0
|
||||
for(var/obj/item/stock_parts/scanning_module/S in component_parts)
|
||||
reward_coeff += S.rating
|
||||
reward_coeff = reward_coeff / 2 // average the parts
|
||||
|
||||
/obj/machinery/organ_analyzer/screwdriver_act(mob/user, obj/item/I)
|
||||
. = TRUE
|
||||
if(processing_organ || contains_organ)
|
||||
to_chat(user, "<span class='warning'>The machine cannot be opened while holding an organ! Remove it first.</span>")
|
||||
return TRUE
|
||||
default_deconstruction_screwdriver(user, "organ_analyzer1", "organ_analyzer0", I)
|
||||
|
||||
/obj/machinery/organ_analyzer/crowbar_act(mob/user, obj/item/I)
|
||||
if(!panel_open)
|
||||
return
|
||||
. = TRUE
|
||||
default_deconstruction_crowbar(user, I)
|
||||
|
||||
/obj/machinery/organ_analyzer/attack_hand(mob/user)
|
||||
if(panel_open)
|
||||
to_chat(user, "<span class='warning'>You can't interact with the machine while the panel is open!</span>")
|
||||
return
|
||||
if(stat & (NOPOWER|BROKEN))
|
||||
return
|
||||
if(contains_organ)
|
||||
if(processing_organ)
|
||||
to_chat(user, "<span class='warning'>The machine is already analyzing the organ!</span>")
|
||||
return
|
||||
else
|
||||
COOLDOWN_START(src, process_organ, time_to_complete)
|
||||
processing_organ = TRUE
|
||||
playsound(src, 'sound/machines/organ_analyzer.ogg', 60, FALSE)
|
||||
update_appearance(UPDATE_OVERLAYS)
|
||||
|
||||
/obj/machinery/organ_analyzer/item_interaction(mob/living/user, obj/item/used, list/modifiers)
|
||||
if(!istype(used, /obj/item/organ/internal))
|
||||
to_chat(user, "<span class='warning'>The machines rejects [used]; it finds no possible potential in it.</span>")
|
||||
return ITEM_INTERACT_COMPLETE
|
||||
if(panel_open)
|
||||
to_chat(user, "<span class='warning'>You can't interact with the machine while the panel is open!</span>")
|
||||
return ITEM_INTERACT_COMPLETE
|
||||
var/obj/item/organ/internal/organ = used
|
||||
if(organ.is_xeno_organ)
|
||||
if(organ.type in GLOB.scanned_organs)
|
||||
if(GLOB.scanned_organs[organ.type] >= 3) // No more than
|
||||
to_chat(user, "<span class='warning'>The analyzer rejects the organ. It's gotten as much data as it can from this type of organ.</span>")
|
||||
return ITEM_INTERACT_COMPLETE
|
||||
else
|
||||
GLOB.scanned_organs[organ.type]++
|
||||
else
|
||||
GLOB.scanned_organs += list(organ.type = 1)
|
||||
contains_organ = organ
|
||||
user.transfer_item_to(organ, src)
|
||||
src.visible_message("[user] inserts [organ] into the recepticle.")
|
||||
update_appearance(UPDATE_OVERLAYS)
|
||||
return ITEM_INTERACT_COMPLETE
|
||||
return ..()
|
||||
|
||||
/obj/machinery/organ_analyzer/AltClick(mob/user)
|
||||
if(panel_open)
|
||||
to_chat(user, "<span class='warning'>You can't interact with the machine while the panel is open!</span>")
|
||||
return
|
||||
if(processing_organ)
|
||||
to_chat(user, "<span class='warning'>You cannot remove an organ currently being processed!</span>")
|
||||
return
|
||||
if(contains_organ)
|
||||
user.put_in_hands(contains_organ)
|
||||
contains_organ = null
|
||||
update_appearance(UPDATE_OVERLAYS)
|
||||
|
||||
/obj/machinery/organ_analyzer/process()
|
||||
..()
|
||||
if(stat & (NOPOWER|BROKEN))
|
||||
processing_organ = FALSE
|
||||
update_appearance(UPDATE_OVERLAYS)
|
||||
return
|
||||
if(processing_organ && COOLDOWN_FINISHED(src, process_organ))
|
||||
complete_analysis()
|
||||
|
||||
/obj/machinery/organ_analyzer/proc/complete_analysis()
|
||||
playsound(src, 'sound/machines/ping.ogg', 50, FALSE)
|
||||
processing_organ = FALSE
|
||||
|
||||
if(contains_organ.hidden_origin_tech)
|
||||
handle_disk()
|
||||
|
||||
var/account = GLOB.station_money_database.get_account_by_department(DEPARTMENT_SCIENCE)
|
||||
var/datum/money_account_database/main_station/station_db = GLOB.station_money_database
|
||||
var/quality_modifier = 1
|
||||
if(contains_organ.organ_quality == ORGAN_PRISTINE)
|
||||
quality_modifier = 2
|
||||
if(contains_organ.organ_quality == ORGAN_DAMAGED)
|
||||
quality_modifier = 0.5
|
||||
var/final_value = round((contains_organ.analyzer_price * reward_coeff) * quality_modifier)
|
||||
station_db.credit_account(account, final_value, "Organ Analyzation Subsidy", "Xenobiology Organ Analyzer", FALSE)
|
||||
SSblackbox.record_feedback("amount", "Organ_Analyzer_Revenue", final_value)
|
||||
atom_say("Analysis complete. Depositing [final_value] credits into the science account.")
|
||||
qdel(contains_organ)
|
||||
contains_organ = null
|
||||
update_appearance(UPDATE_OVERLAYS)
|
||||
|
||||
/obj/machinery/organ_analyzer/proc/handle_disk()
|
||||
var/obj/item/disk/tech_disk/disk = new /obj/item/disk/tech_disk(src.loc)
|
||||
var/datum/tech/tech
|
||||
|
||||
switch(contains_organ.hidden_origin_tech)
|
||||
if(TECH_MATERIAL)
|
||||
tech = new /datum/tech/materials
|
||||
if(TECH_ENGINEERING)
|
||||
tech = new /datum/tech/engineering
|
||||
if(TECH_PLASMA)
|
||||
tech = new /datum/tech/plasmatech
|
||||
if(TECH_POWER)
|
||||
tech = new /datum/tech/powerstorage
|
||||
if(TECH_BLUESPACE)
|
||||
tech = new /datum/tech/bluespace
|
||||
if(TECH_BIO)
|
||||
tech = new /datum/tech/biotech
|
||||
if(TECH_COMBAT)
|
||||
tech = new /datum/tech/combat
|
||||
if(TECH_MAGNETS)
|
||||
tech = new /datum/tech/magnets
|
||||
if(TECH_PROGRAM)
|
||||
tech = new /datum/tech/programming
|
||||
if(TECH_TOXINS)
|
||||
tech = new /datum/tech/toxins
|
||||
if(TECH_SYNDICATE)
|
||||
tech = new /datum/tech/syndicate
|
||||
if(TECH_ABDUCTOR)
|
||||
tech = new /datum/tech/abductor
|
||||
|
||||
tech.level = contains_organ.hidden_tech_level
|
||||
disk.load_tech(tech)
|
||||
@@ -0,0 +1,838 @@
|
||||
/obj/item/dissector
|
||||
name = "\improper Dissection Manager"
|
||||
desc = "An advanced handheld device that assists with the preparation and removal of non-standard alien organs."
|
||||
icon = 'icons/obj/surgery.dmi'
|
||||
icon_state = "dissector"
|
||||
lefthand_file = 'icons/mob/inhands/equipment/medical_lefthand.dmi'
|
||||
righthand_file = 'icons/mob/inhands/equipment/medical_righthand.dmi'
|
||||
flags = CONDUCT
|
||||
w_class = WEIGHT_CLASS_SMALL
|
||||
tool_behaviour = TOOL_DISSECTOR
|
||||
|
||||
/obj/item/dissector/upgraded
|
||||
name = "\improper Improved Dissection Manager"
|
||||
desc = "An advanced handheld device that assists with the preparation and removal of non-standard alien organs. This one has had several improvements applied to it."
|
||||
icon_state = "dissector_upgrade"
|
||||
toolspeed = 0.6
|
||||
|
||||
// allows for perfect pristine organ extraction. Only available from non-lavaland abductor tech
|
||||
/obj/item/dissector/alien
|
||||
name = "\improper Alien Dissection Manager"
|
||||
desc = "A tool of alien origin, capable of near impossible levels of precision during dissections."
|
||||
icon_state = "dissector_alien"
|
||||
origin_tech = "abductor=3"
|
||||
toolspeed = 0.2
|
||||
|
||||
/obj/item/dissector/Initialize(mapload)
|
||||
. = ..()
|
||||
ADD_TRAIT(src, TRAIT_SURGICAL, ROUNDSTART_TRAIT)
|
||||
AddComponent(/datum/component/surgery_initiator)
|
||||
RegisterSignal(src, COMSIG_BIT_ATTACH, PROC_REF(add_bit))
|
||||
RegisterSignal(src, COMSIG_CLICK_ALT, PROC_REF(remove_bit))
|
||||
|
||||
/datum/surgery_step/generic/dissect
|
||||
name = "dissect"
|
||||
allowed_tools = list(
|
||||
/obj/item/dissector/alien = 100,
|
||||
/obj/item/dissector/upgraded = 70,
|
||||
/obj/item/organ_extractor = 60,
|
||||
TOOL_DISSECTOR = 40,
|
||||
/obj/item/scalpel/laser/manager = 10,
|
||||
/obj/item/scalpel = 5,
|
||||
/obj/item/wirecutters = 2,
|
||||
/obj/item/kitchen/utensil/fork = 1,
|
||||
)
|
||||
preop_sound = 'sound/surgery/organ1.ogg'
|
||||
success_sound = 'sound/surgery/organ2.ogg'
|
||||
failure_sound = 'sound/effects/bone_break_1.ogg'
|
||||
time = 1.5 SECONDS
|
||||
|
||||
/datum/surgery_step/generic/dissect/begin_step(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool, datum/surgery/surgery)
|
||||
if(istype(surgery, /datum/surgery/dissect))
|
||||
to_chat(user, "[target.surgery_container.dissection_text[surgery.step_number]]")
|
||||
return ..()
|
||||
|
||||
/datum/surgery_step/generic/dissect/end_step(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool, datum/surgery/surgery)
|
||||
if(istype(surgery, /datum/surgery/dissect))
|
||||
to_chat(user, "[target.surgery_container.dissection_success_text[surgery.step_number]]")
|
||||
if(length(surgery.steps) <= surgery.step_number) // only procs if its the finishing step
|
||||
if(isalien(target)) // xenos are special snowflakes
|
||||
var/picked = pick_organ(target)
|
||||
var/obj/item/organ/internal/alien/xeno = new picked(target.loc)
|
||||
xeno.organ_quality = pick_quality(tool, surgery.get_surgery_step())
|
||||
SSblackbox.record_feedback("nested tally", "xeno_organ_type", 1, list("[picked]", xeno.organ_quality))
|
||||
target.surgery_container.xeno_specialized_organs -= picked
|
||||
for(var/obj/item/organ/internal/alien/A in target.internal_organs)
|
||||
if(A.type == xeno)
|
||||
A.remove()
|
||||
if(istype(tool, /obj/item/organ_extractor))
|
||||
var/obj/item/organ_extractor/I = tool
|
||||
I.insert_internal_organ_in_extractor(xeno)
|
||||
else
|
||||
if(istype(tool, /obj/item/organ_extractor)) // lets directly insert it into an organ extractor
|
||||
var/obj/item/organ_extractor/I = tool
|
||||
var/organ_type = pick_organ(target)
|
||||
var/obj/item/organ/internal/organ = new organ_type(target.loc)
|
||||
organ.organ_quality = pick_quality(tool, surgery.get_surgery_step())
|
||||
SSblackbox.record_feedback("nested tally", "xeno_organ_type", 1, list("[organ.type]", organ.organ_quality))
|
||||
I.insert_internal_organ_in_extractor(organ)
|
||||
return SURGERY_STEP_CONTINUE
|
||||
var/obj/item/xeno_organ/new_organ = new /obj/item/xeno_organ(target.loc)
|
||||
if(length(target.surgery_container.custom_organ_states))
|
||||
new_organ.icon_state = pick(target.surgery_container.custom_organ_states)
|
||||
new_organ.true_organ_type = pick_organ(target)
|
||||
new_organ.unknown_quality = pick_quality(tool, surgery.get_surgery_step())
|
||||
user.put_in_inactive_hand(new_organ)
|
||||
SSblackbox.record_feedback("nested tally", "xeno_organ_type", 1, list("[new_organ.true_organ_type]", new_organ.unknown_quality))
|
||||
target.contains_xeno_organ = FALSE
|
||||
return SURGERY_STEP_CONTINUE
|
||||
|
||||
/datum/surgery_step/generic/dissect/fail_step(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool, datum/surgery/surgery)
|
||||
if(istype(surgery, /datum/surgery/dissect))
|
||||
to_chat(user, "[target.surgery_container.dissection_failure_text[surgery.step_number]]")
|
||||
return SURGERY_STEP_RETRY
|
||||
|
||||
/datum/surgery_step/generic/dissect/proc/pick_organ(mob/living/target)
|
||||
var/chosen_organ_type
|
||||
if(!target.ignore_generic_organs && (prob(75) || !target.surgery_container.xeno_specialized_organs)) //if it has no specialized organs always roll generic
|
||||
chosen_organ_type = pick(target.surgery_container.xeno_generic_organs)
|
||||
else
|
||||
chosen_organ_type = pick(target.surgery_container.xeno_specialized_organs)
|
||||
return chosen_organ_type
|
||||
|
||||
/// Decides the quality of the new organ based off tool efficiency and tool bit mods
|
||||
/datum/surgery_step/generic/dissect/proc/pick_quality(obj/item/I, datum/surgery_step/current_step)
|
||||
if(istype(I, /obj/item/dissector/alien))
|
||||
return ORGAN_PRISTINE
|
||||
var/quality_chance
|
||||
for(var/key in current_step.allowed_tools)
|
||||
if(ispath(key) && istype(I, key))
|
||||
quality_chance = allowed_tools[key]
|
||||
break
|
||||
else if(I.tool_behaviour == key)
|
||||
quality_chance = allowed_tools[key]
|
||||
break
|
||||
|
||||
var/inverted_chance = 100 - quality_chance
|
||||
quality_chance += ((inverted_chance * 0.66) * -(I.bit_efficiency_mod - 1))
|
||||
if(prob(quality_chance / 2)) // at best, ~50% chance
|
||||
return ORGAN_PRISTINE
|
||||
if(prob(quality_chance))
|
||||
return ORGAN_NORMAL
|
||||
return ORGAN_DAMAGED
|
||||
|
||||
// Dissections should always end in he dissect step for organ quality sake
|
||||
/datum/surgery/dissect
|
||||
name = "experimental dissection"
|
||||
requires_bodypart = FALSE // most simplemobs wont have limbs
|
||||
possible_locs = list(BODY_ZONE_CHEST)
|
||||
target_mobtypes = list(/mob/living)
|
||||
requires_organic_bodypart = FALSE
|
||||
lying_required = FALSE
|
||||
steps = list(
|
||||
/datum/surgery_step/generic/dissect,
|
||||
/datum/surgery_step/generic/cut_open,
|
||||
/datum/surgery_step/generic/clamp_bleeders,
|
||||
/datum/surgery_step/generic/retract_skin,
|
||||
/datum/surgery_step/generic/dissect,
|
||||
)
|
||||
|
||||
/datum/surgery/dissect/can_start(mob/user, mob/living/target)
|
||||
. = ..()
|
||||
if(!.)
|
||||
return FALSE
|
||||
if(target.stat == DEAD && target.contains_xeno_organ)
|
||||
return TRUE
|
||||
return FALSE
|
||||
|
||||
/datum/surgery_step/fake_robotics
|
||||
name = "fake robotics operations - do not use this parent object"
|
||||
allowed_tools = list()
|
||||
time = 10 SECONDS
|
||||
|
||||
/datum/surgery_step/fake_robotics/begin_step(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool, datum/surgery/surgery)
|
||||
if(istype(surgery, /datum/surgery/dissect))
|
||||
to_chat(user, "[target.surgery_container.dissection_text[surgery.step_number]]")
|
||||
if(tool && tool.tool_behaviour)
|
||||
tool.play_tool_sound(user, 30)
|
||||
return ..()
|
||||
|
||||
/datum/surgery_step/fake_robotics/end_step(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool, datum/surgery/surgery)
|
||||
if(istype(surgery, /datum/surgery/dissect))
|
||||
to_chat(user, "[target.surgery_container.dissection_success_text[surgery.step_number]]")
|
||||
if(tool && tool.tool_behaviour)
|
||||
tool.play_tool_sound(user, 30)
|
||||
return SURGERY_STEP_CONTINUE
|
||||
|
||||
/datum/surgery_step/fake_robotics/fail_step(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool, datum/surgery/surgery)
|
||||
if(istype(surgery, /datum/surgery/dissect))
|
||||
to_chat(user, "[target.surgery_container.dissection_failure_text[surgery.step_number]]")
|
||||
if(tool && tool.tool_behaviour)
|
||||
tool.play_tool_sound(user, 30)
|
||||
return SURGERY_STEP_RETRY
|
||||
|
||||
/datum/surgery_step/fake_robotics/unscrew_hatch
|
||||
name = "unscrew hatch"
|
||||
allowed_tools = list(
|
||||
TOOL_SCREWDRIVER = 100,
|
||||
/obj/item/coin = 50,
|
||||
/obj/item/kitchen/knife = 50
|
||||
)
|
||||
|
||||
time = 1.6 SECONDS
|
||||
|
||||
/datum/surgery_step/fake_robotics/open_hatch
|
||||
name = "open hatch"
|
||||
allowed_tools = list(
|
||||
TOOL_RETRACTOR = 100,
|
||||
TOOL_CROWBAR = 100,
|
||||
/obj/item/kitchen/utensil = 50
|
||||
)
|
||||
|
||||
time = 2.4 SECONDS
|
||||
|
||||
/datum/surgery_step/fake_robotics/amputate
|
||||
name = "remove component"
|
||||
|
||||
allowed_tools = list(
|
||||
TOOL_MULTITOOL = 100
|
||||
)
|
||||
|
||||
time = 5 SECONDS
|
||||
|
||||
/datum/xenobiology_surgery_container
|
||||
/// Does this organ have custom icon states it should be choosing from
|
||||
var/list/custom_organ_states = list()
|
||||
|
||||
/// Contains the results for any specialized organs this creature should have
|
||||
var/list/xeno_specialized_organs = list()
|
||||
|
||||
/// Holds the list of all generic non-specific organs
|
||||
var/static/list/xeno_generic_organs = list(
|
||||
/obj/item/organ/internal/liver/xenobiology/toxic,
|
||||
/obj/item/organ/internal/liver/xenobiology/detox,
|
||||
/obj/item/organ/internal/heart/xenobiology/vestigial,
|
||||
/obj/item/organ/internal/heart/xenobiology/incompatible,
|
||||
/obj/item/organ/internal/appendix/xenobiology/feverish,
|
||||
/obj/item/organ/internal/appendix/xenobiology/freezing,
|
||||
/obj/item/organ/internal/kidneys/xenobiology/lethargic,
|
||||
/obj/item/organ/internal/ears/xenobiology/colorful,
|
||||
)
|
||||
|
||||
/// Contains the list for which paths are needed at each dissection step.
|
||||
var/list/dissection_tool_step = list(
|
||||
/datum/surgery_step/generic/dissect,
|
||||
/datum/surgery_step/generic/cut_open,
|
||||
/datum/surgery_step/generic/clamp_bleeders,
|
||||
/datum/surgery_step/generic/retract_skin,
|
||||
/datum/surgery_step/generic/dissect,
|
||||
)
|
||||
|
||||
/// Contains specialty text for each dissection step.
|
||||
var/list/dissection_text = list(
|
||||
"<span class='notice'>You begin prepping the subject for dissection...</span>",
|
||||
"<span class='notice'>You begin to make a careful incision into the subject's corpse.</span>",
|
||||
"<span class='notice'>You begin clamping any cavities leaking fluids into the surgical site.</span>",
|
||||
"<span class='notice'>You begin forcing the dissection cavity open.</span>",
|
||||
"<span class='notice'>You begin removing an unidentifiable mass out of the subject!</span>",
|
||||
)
|
||||
/// Contains specialty text for dissection success steps
|
||||
var/list/dissection_success_text = list(
|
||||
"<span class='notice'>You successfully set up a dissection site.</span>",
|
||||
"<span class='notice'>You successfully make an incision into the dissection site.</span>",
|
||||
"<span class='notice'>You successfully clamp any leaking cavities.</span>",
|
||||
"<span class='notice'>You successfully force the dissection cavity open.</span>",
|
||||
"<span class='notice'>You remove some kind of unidentifiable mass from the subject!</span>",
|
||||
)
|
||||
/// Contains specialty text for dissection step failures
|
||||
var/list/dissection_failure_text = list(
|
||||
"<span class='warning'>The tool fails to get a grip on the corpse's surface!</span>",
|
||||
"<span class='warning'>Your hand slips, slicing open the corpse in a wrong spot with the tool!</span>",
|
||||
"<span class='warning'>Your hand slips, tearing some of the flesh from the subject and worsening the leakage!</span>",
|
||||
"<span class='warning'>Your hand slips, tearing the edges of incision!</span>",
|
||||
"<span class='warning'>The tool fails to remove the organ from the surrounding flesh!</span>",
|
||||
)
|
||||
|
||||
/datum/xenobiology_surgery_container/goliath
|
||||
xeno_specialized_organs = list(/obj/item/organ/internal/appendix/xenobiology/tendril)
|
||||
|
||||
/datum/xenobiology_surgery_container/megacarp
|
||||
xeno_specialized_organs = list(/obj/item/organ/internal/heart/xenobiology/megacarp)
|
||||
|
||||
/datum/xenobiology_surgery_container/morph
|
||||
xeno_specialized_organs = list(/obj/item/organ/internal/liver/xenobiology/hungry)
|
||||
|
||||
/datum/xenobiology_surgery_container/hound
|
||||
xeno_specialized_organs = list(/obj/item/organ/internal/liver/xenobiology/sharp)
|
||||
|
||||
/datum/xenobiology_surgery_container/sweating
|
||||
xeno_specialized_organs = list(/obj/item/organ/internal/kidneys/xenobiology/sweating)
|
||||
|
||||
/datum/xenobiology_surgery_container/watcher
|
||||
xeno_specialized_organs = list(/obj/item/organ/internal/kidneys/xenobiology/sinew)
|
||||
|
||||
/datum/xenobiology_surgery_container/migo
|
||||
xeno_specialized_organs = list(/obj/item/organ/internal/appendix/xenobiology/noisemaker)
|
||||
|
||||
/datum/xenobiology_surgery_container/spider
|
||||
xeno_specialized_organs = list(/obj/item/organ/internal/appendix/xenobiology/toxin_stinger)
|
||||
|
||||
/datum/xenobiology_surgery_container/hivelord
|
||||
xeno_specialized_organs = list(/obj/item/organ/internal/heart/xenobiology/hyperactive)
|
||||
|
||||
/datum/xenobiology_surgery_container/goldgrub
|
||||
xeno_specialized_organs = list(/obj/item/organ/internal/kidneys/xenobiology/metallic)
|
||||
|
||||
/datum/xenobiology_surgery_container/tomato
|
||||
xeno_specialized_organs = list(/obj/item/organ/internal/liver/xenobiology/soupy)
|
||||
|
||||
/datum/xenobiology_surgery_container/herald
|
||||
xeno_specialized_organs = list(/obj/item/organ/internal/lungs/xenobiology/mirror)
|
||||
|
||||
/datum/xenobiology_surgery_container/clown
|
||||
xeno_specialized_organs = list(
|
||||
/obj/item/organ/internal/heart/xenobiology/bananium,
|
||||
/obj/item/organ/internal/heart/xenobiology/cursed_bananium,
|
||||
)
|
||||
|
||||
/datum/xenobiology_surgery_container/revenant
|
||||
xeno_specialized_organs = list(/obj/item/organ/internal/appendix/xenobiology/electro_strands)
|
||||
|
||||
dissection_tool_step = list(
|
||||
/datum/surgery_step/generic/dissect,
|
||||
/datum/surgery_step/generic/retract_skin,
|
||||
/datum/surgery_step/generic/dissect,
|
||||
)
|
||||
|
||||
dissection_text = list(
|
||||
"<span class='notice'>You begin prepping the subject for dissection...</span>",
|
||||
"<span class='notice'>You begin to easily open up a surgical site from the ashen mound.</span>",
|
||||
"<span class='notice'>You begin removing an unidentifiable mass out of the subject!</span>",
|
||||
)
|
||||
dissection_success_text = list(
|
||||
"<span class='notice'>You successfully set up a dissection site.</span>",
|
||||
"<span class='notice'>You successfully force the dissection cavity open.</span>",
|
||||
"<span class='notice'>You remove some kind of unidentifiable mass from the subject!</span>",
|
||||
)
|
||||
dissection_failure_text = list(
|
||||
"<span class='warning'>The tool fails to get a grip on the nearly ashen pile!</span>",
|
||||
"<span class='warning'>You struggle to get the surgical site open as ash crumples back in on itself!</span>",
|
||||
"<span class='warning'>The tool fails to remove the organ from the surrounding flesh!</span>",
|
||||
)
|
||||
|
||||
/datum/xenobiology_surgery_container/colossus
|
||||
xeno_specialized_organs = list(/obj/item/organ/internal/cyberimp/mouth/xenobiology/vocal_remnants)
|
||||
|
||||
custom_organ_states = list("colossus1", "colossus2", "colossus3", "colossus4")
|
||||
|
||||
dissection_tool_step = list(
|
||||
/datum/surgery_step/generic/dissect,
|
||||
/datum/surgery_step/generic/cut_open,
|
||||
/datum/surgery_step/generic/clamp_bleeders,
|
||||
/datum/surgery_step/generic/retract_skin,
|
||||
/datum/surgery_step/generic/cut_open,
|
||||
/datum/surgery_step/generic/dissect,
|
||||
)
|
||||
|
||||
dissection_text = list(
|
||||
"<span class='notice'>You begin to prep the subject for dissection...</span>",
|
||||
"<span class='notice'>You make a careful incision into the subject's corpse.</span>",
|
||||
"<span class='notice'>You clamp any cavities leaking fluids into the surgical site.</span>",
|
||||
"<span class='notice'>You force the dissection cavity open.</span>",
|
||||
"<span class='notice'>You carefully begin severing the metal sections from the surrounding flesh.</span>",
|
||||
"<span class='notice'>You begin removing an unidentifiable mass out of the subject!</span>",
|
||||
)
|
||||
dissection_success_text = list(
|
||||
"<span class='notice'>You successfully set up a dissection site.</span>",
|
||||
"<span class='notice'>You successfully make an incision into the dissection site.</span>",
|
||||
"<span class='notice'>You successfully clamp any leaking cavities.</span>",
|
||||
"<span class='notice'>You successfully force the dissection cavity open.</span>",
|
||||
"<span class='notice'>You manage to cut away and seperate the metal from flesh.</span>",
|
||||
"<span class='notice'>You remove some kind of unidentifiable mass from the subject!</span>",
|
||||
)
|
||||
dissection_failure_text = list(
|
||||
"<span class='warning'>The tool fails to get a grip on the corpse's surface!</span>",
|
||||
"<span class='warning'>Your hand slips, slicing open the corpse in a wrong spot with the tool!</span>",
|
||||
"<span class='warning'>Your hand slips, tearing some of the flesh from the subject and worsening the leakage!</span>",
|
||||
"<span class='warning'>Your hand slips, tearing the edges of incision!</span>",
|
||||
"<span class='warning'>The mixture of metal and flesh seems impossible to distinguish in some places!</span>",
|
||||
"<span class='warning'>The tool fails to remove the organ from the surrounding flesh!</span>",
|
||||
)
|
||||
|
||||
/datum/xenobiology_surgery_container/pandora
|
||||
xeno_specialized_organs = list(/obj/item/organ/internal/heart/xenobiology/paradox)
|
||||
|
||||
custom_organ_states = list("hiero1", "hiero2")
|
||||
|
||||
dissection_tool_step = list(
|
||||
/datum/surgery_step/generic/dissect,
|
||||
/datum/surgery_step/fake_robotics/unscrew_hatch,
|
||||
/datum/surgery_step/fake_robotics/open_hatch,
|
||||
/datum/surgery_step/fake_robotics/amputate,
|
||||
/datum/surgery_step/generic/dissect,
|
||||
)
|
||||
|
||||
dissection_text = list(
|
||||
"<span class='notice'>You begin to prep the subject for dissection...</span>",
|
||||
"<span class='notice'>You begin to unscrew the coverings.</span>",
|
||||
"<span class='notice'>You begin prying open the loose panel from the machine.</span>",
|
||||
"<span class='notice'>You carefully begin to disconnect the core from the surrounding power network.</span>",
|
||||
"<span class='notice'>You begin removing the core from the metal housing surrounding it.</span>",
|
||||
)
|
||||
dissection_success_text = list(
|
||||
"<span class='notice'>You successfully set up a dissection site.</span>",
|
||||
"<span class='notice'>You successfully remove any screws keeping the panel shut.</span>",
|
||||
"<span class='notice'>You pry open the loose panels to expose the core within.</span>",
|
||||
"<span class='notice'>You successfully disconnect the core from the power connectors.</span>",
|
||||
"<span class='notice'>You remove the core from the metal housing!</span>",
|
||||
)
|
||||
dissection_failure_text = list(
|
||||
"<span class='warning'>You begin to prep the subject for dissection...</span>",
|
||||
"<span class='warning'>You cant get enough torque to unscrew the rusted fastenings off!</span>",
|
||||
"<span class='warning'>You fail to find enough leverage to get the panel off!</span>",
|
||||
"<span class='warning'>You cant find how to safely remove the core from its attached wiring!</span>",
|
||||
"<span class='warning'>The tool fails to remove the core from the metal housing!</span>",
|
||||
)
|
||||
|
||||
/datum/xenobiology_surgery_container/legionnaire
|
||||
xeno_specialized_organs = list(/obj/item/organ/internal/ears/xenobiology/sinister)
|
||||
|
||||
custom_organ_states = list("legion1", "legion2")
|
||||
|
||||
dissection_tool_step = list(
|
||||
/datum/surgery_step/generic/dissect,
|
||||
/datum/surgery_step/generic/amputate,
|
||||
/datum/surgery_step/generic/retract_skin,
|
||||
/datum/surgery_step/generic/dissect,
|
||||
)
|
||||
|
||||
dissection_text = list(
|
||||
"<span class='notice'>You begin to prep the subject for dissection...</span>",
|
||||
"<span class='notice'>You begin sawing through the dense bone obstructions.</span>",
|
||||
"<span class='notice'>With a sickening crunch, you begin forcing the dissection cavity open.</span>",
|
||||
"<span class='notice'>You begin removing an unidentifiable mass out of the subject!</span>"
|
||||
)
|
||||
dissection_success_text = list(
|
||||
"<span class='notice'>You successfully set up a dissection site.</span>",
|
||||
"<span class='notice'>You manage to detach the bones away from the dissection cavity.</span>",
|
||||
"<span class='notice'>You successfully force the dissection cavity open.</span>",
|
||||
"<span class='notice'>You remove some kind of unidentifiable mass from the subject!</span>"
|
||||
)
|
||||
dissection_failure_text = list(
|
||||
"<span class='notice'>The tool fails to get a grip on the corpse's surface!</span>",
|
||||
"<span class='notice'>Your saw fails to find purchase against the hardened bone!</span>",
|
||||
"<span class='notice'>The surrounding bone refuses to budge!</span>",
|
||||
"<span class='notice'>The tool fails to remove the organ from the surrounding skeletal structure!</span>"
|
||||
)
|
||||
|
||||
/datum/xenobiology_surgery_container/bubblegum
|
||||
xeno_specialized_organs = list(/obj/item/organ/internal/heart/xenobiology/bloody_sack)
|
||||
|
||||
custom_organ_states = list("bubblegum1", "bubblegum2", "bubblegum3", "bubblegum4")
|
||||
|
||||
dissection_tool_step = list(
|
||||
/datum/surgery_step/generic/dissect,
|
||||
/datum/surgery_step/generic/clamp_bleeders,
|
||||
/datum/surgery_step/generic/cut_open,
|
||||
/datum/surgery_step/generic/clamp_bleeders,
|
||||
/datum/surgery_step/generic/retract_skin,
|
||||
/datum/surgery_step/generic/dissect,
|
||||
)
|
||||
|
||||
dissection_text = list(
|
||||
"<span class='notice'>You begin to prep the corpse for dissection... If you can even call it that at this point</span>",
|
||||
"<span class='notice'>You begin removing shards and chunks of bone, clearing a spot to safely cut deeper.</span>",
|
||||
"<span class='notice'>You slowly cut your way into the pile, looking for anything other than formless flesh and bone...</span>",
|
||||
"<span class='notice'>You begin clamping the mass amount of leaking arteries in the surgical site.</span>",
|
||||
"<span class='notice'>You begin forcing the dissection cavity open.</span>",
|
||||
"<span class='notice'>You finally find something, and begin to remove a unidentifiable mass out of the mass!</span>",
|
||||
)
|
||||
dissection_success_text = list(
|
||||
"<span class='notice'>You successfully set up a dissection site.</span>",
|
||||
"<span class='notice'>You manage to clear out the dissection site of obstructive bone.</span>",
|
||||
"<span class='notice'>You manage to cut deep enough until something of signifigance seems to reveal.</span>",
|
||||
"<span class='notice'>You successfully clamp any leaking cavities.</span>",
|
||||
"<span class='notice'>You successfully force the dissection cavity open.</span>",
|
||||
"<span class='notice'>You remove some kind of unidentifiable mass from the subject!</span>",
|
||||
)
|
||||
dissection_failure_text = list(
|
||||
"<span class='warning'>The tool fails to get a grip on the corpse's surface!</span>",
|
||||
"<span class='warning'>You begin removing shards and chunks of bone, clearing a spot to safely cut deeper.</span>",
|
||||
"<span class='warning'>You slowly cut your way into the pile, looking for anything other than formless flesh and bone..</span>",
|
||||
"<span class='warning'>You clamp the mass amount of leaking arteries in the surgical site.</span>",
|
||||
"<span class='warning'>You force the dissection cavity open.</span>",
|
||||
"<span class='warning'>The tool fails to remove the organ from the surrounding flesh!</span>",
|
||||
)
|
||||
|
||||
/datum/xenobiology_surgery_container/alien
|
||||
xeno_specialized_organs = list(/obj/item/organ/internal/alien/hivenode)
|
||||
|
||||
dissection_tool_step = list(
|
||||
/datum/surgery_step/generic/dissect,
|
||||
/datum/surgery_step/saw_carapace,
|
||||
/datum/surgery_step/generic/clamp_bleeders,
|
||||
/datum/surgery_step/generic/retract_skin,
|
||||
/datum/surgery_step/generic/dissect,
|
||||
)
|
||||
|
||||
dissection_text = list(
|
||||
"<span class='notice'>You begin to prep the subject for dissection...</span>",
|
||||
"<span class='notice'>You begin sawing through the chitinous outer layer.</span>",
|
||||
"<span class='notice'>You begin clamping any cavities leaking fluids into the surgical site.</span>",
|
||||
"<span class='notice'>You begin forcing the dissection cavity open.</span>",
|
||||
"<span class='notice'>You begin removing an unidentifiable mass out of the subject!</span>",
|
||||
)
|
||||
dissection_success_text = list(
|
||||
"<span class='notice'>You successfully set up a dissection site.</span>",
|
||||
"<span class='notice'>You manage to saw through the armored exoskeleton.</span>",
|
||||
"<span class='notice'>You successfully clamp any leaking cavities.</span>",
|
||||
"<span class='notice'>You successfully force the dissection cavity open.</span>",
|
||||
"<span class='notice'>You remove some kind of unidentifiable mass from the subject!</span>",
|
||||
)
|
||||
dissection_failure_text = list(
|
||||
"<span class='warning'>The tool fails to get a grip on the corpse's surface!</span>",
|
||||
"<span class='warning'>You fail to get through the armored outer layer!</span>",
|
||||
"<span class='warning'>Your hand slips, tearing some of the flesh from the subject and worsening the leakage!</span>",
|
||||
"<span class='warning'>Your hand slips, tearing the edges of incision!</span>",
|
||||
"<span class='warning'>The tool fails to remove the organ from the surrounding flesh!</span>",
|
||||
)
|
||||
|
||||
/datum/xenobiology_surgery_container/alien/sentinel
|
||||
xeno_specialized_organs = list(
|
||||
/obj/item/organ/internal/alien/plasmavessel,
|
||||
/obj/item/organ/internal/alien/acidgland,
|
||||
/obj/item/organ/internal/alien/neurotoxin,
|
||||
/obj/item/organ/internal/alien/hivenode,
|
||||
)
|
||||
|
||||
/datum/xenobiology_surgery_container/alien/larva
|
||||
xeno_specialized_organs = list(
|
||||
/obj/item/organ/internal/alien/plasmavessel/larva,
|
||||
/obj/item/organ/internal/alien/acidgland,
|
||||
/obj/item/organ/internal/alien/neurotoxin,
|
||||
/obj/item/organ/internal/alien/hivenode,
|
||||
)
|
||||
|
||||
/datum/xenobiology_surgery_container/alien/queen
|
||||
xeno_specialized_organs = list(
|
||||
/obj/item/organ/internal/alien/plasmavessel/queen,
|
||||
/obj/item/organ/internal/alien/acidgland,
|
||||
/obj/item/organ/internal/alien/eggsac,
|
||||
/obj/item/organ/internal/alien/neurotoxin,
|
||||
/obj/item/organ/internal/alien/resinspinner,
|
||||
)
|
||||
|
||||
/datum/xenobiology_surgery_container/alien/drone
|
||||
xeno_specialized_organs = list(
|
||||
/obj/item/organ/internal/alien/plasmavessel/drone,
|
||||
/obj/item/organ/internal/alien/acidgland,
|
||||
/obj/item/organ/internal/alien/resinspinner,
|
||||
/obj/item/organ/internal/alien/hivenode,
|
||||
)
|
||||
|
||||
/datum/xenobiology_surgery_container/alien/hunter
|
||||
xeno_specialized_organs = list(
|
||||
/obj/item/organ/internal/alien/plasmavessel/hunter,
|
||||
/obj/item/organ/internal/alien/hivenode,
|
||||
/obj/item/organ/internal/alien/resinspinner,
|
||||
)
|
||||
|
||||
/datum/xenobiology_surgery_container/hierophant
|
||||
xeno_specialized_organs = list(/obj/item/organ/internal/eyes/cybernetic/xenobiology/glowing)
|
||||
|
||||
custom_organ_states = list("hiero1", "hiero2")
|
||||
|
||||
dissection_tool_step = list(
|
||||
/datum/surgery_step/generic/dissect,
|
||||
/datum/surgery_step/fake_robotics/unscrew_hatch,
|
||||
/datum/surgery_step/fake_robotics/open_hatch,
|
||||
/datum/surgery_step/fake_robotics/amputate,
|
||||
/datum/surgery_step/generic/dissect,
|
||||
)
|
||||
|
||||
dissection_text = list(
|
||||
"<span class='notice'>You begin to prep the subject for dissection...</span>",
|
||||
"<span class='notice'>You begin to unscrew the coverings.</span>",
|
||||
"<span class='notice'>You begin prying open the loose panel from the machine.</span>",
|
||||
"<span class='notice'>You carefully begin to disconnect the core from the surrounding power network.</span>",
|
||||
"<span class='notice'>You begin removing the core from the metal housing surrounding it.</span>",
|
||||
)
|
||||
dissection_success_text = list(
|
||||
"<span class='notice'>You successfully set up a dissection site.</span>",
|
||||
"<span class='notice'>You successfully remove any screws keeping the panel shut.</span>",
|
||||
"<span class='notice'>You pry open the loose panels to expose the core within.</span>",
|
||||
"<span class='notice'>You successfully disconnect the core from the power connectors.</span>",
|
||||
"<span class='notice'>You remove the core from the metal housing!</span>",
|
||||
)
|
||||
dissection_failure_text = list(
|
||||
"<span class='warning'>The tool fails to get a grip on the corpse's surface!</span>",
|
||||
"<span class='warning'>You cant get enough torque to unscrew the rusted fastenings off!</span>",
|
||||
"<span class='warning'>You fail to find enough leverage to get the panel off!</span>",
|
||||
"<span class='warning'>You cant find how to safely remove the core from its attached wiring!</span>",
|
||||
"<span class='warning'>The tool fails to remove the core from the metal housing!</span>",
|
||||
)
|
||||
|
||||
/datum/xenobiology_surgery_container/blobbernaut
|
||||
xeno_specialized_organs = list(/obj/item/organ/internal/eyes/xenobiology/receptors)
|
||||
|
||||
dissection_tool_step = list(
|
||||
/datum/surgery_step/generic/dissect,
|
||||
/datum/surgery_step/generic/retract_skin,
|
||||
/datum/surgery_step/generic/clamp_bleeders,
|
||||
/datum/surgery_step/generic/retract_skin,
|
||||
/datum/surgery_step/generic/clamp_bleeders,
|
||||
/datum/surgery_step/generic/retract_skin,
|
||||
/datum/surgery_step/generic/clamp_bleeders,
|
||||
/datum/surgery_step/generic/dissect,
|
||||
)
|
||||
|
||||
dissection_text = list(
|
||||
"<span class='notice'>You begin to prep the subject for dissection...</span>",
|
||||
"<span class='notice'>You begin forcing the dissection cavity open.</span>",
|
||||
"<span class='notice'>You begin closing off one of the many leaking fluid sacks in the corpse.</span>",
|
||||
"<span class='notice'>Your work area closed filled back in. You begin to re-open it.</span>",
|
||||
"<span class='notice'>You begin closing off more leaking sacks and fluid veins.</span>",
|
||||
"<span class='notice'>This damned dissection site <b>WON'T STOP CLOSING!</b></span>",
|
||||
"<span class='notice'>You begin once again closing off more fluid sacks and leaking cavities....</span>",
|
||||
"<span class='notice'>You at last begin to remove something from the cadaver...</span>",
|
||||
)
|
||||
dissection_success_text = list(
|
||||
"<span class='notice'>You successfully set up a dissection site.</span>",
|
||||
"<span class='notice'>You easily pry apart the semi-liquid corpse.</span>",
|
||||
"<span class='notice'>You close off one numerous leaking cavities.</span>",
|
||||
"<span class='notice'>You manage to get the dissection site back open</span>",
|
||||
"<span class='notice'>You close off more leaking sacks and fluid veins.</span>",
|
||||
"<span class='notice'>You manage to get the dissection site back open... again.</span>",
|
||||
"<span class='notice'>You finally get the leaking under control.</span>",
|
||||
"<span class='notice'>You remove some kind of unidentifiable mass from the subject!</span>",
|
||||
)
|
||||
dissection_failure_text = list(
|
||||
"<span class='warning'>The tool fails to get a grip on the corpse's surface!</span>",
|
||||
"<span class='warning'>The you fail to open the incision site, it simply closes back up!</span>",
|
||||
"<span class='warning'>The leakage is too intense, you cant get it under control!</span>",
|
||||
"<span class='warning'>The you fail to open the incision site, it simply closes back up!</span>",
|
||||
"<span class='warning'>The leakage is too intense, you cant get it under control!</span>",
|
||||
"<span class='warning'>The you fail to open the incision site, it simply closes back up!</span>",
|
||||
"<span class='warning'>The leakage is too intense, you cant get it under control!</span>",
|
||||
"<span class='warning'>The tool fails to remove the organ from the goopy flesh!</span>",
|
||||
)
|
||||
|
||||
/datum/xenobiology_surgery_container/terror_spider
|
||||
xeno_specialized_organs = list(/obj/item/organ/internal/appendix/xenobiology/toxin_stinger/terror)
|
||||
|
||||
dissection_tool_step = list(
|
||||
/datum/surgery_step/generic/dissect,
|
||||
/datum/surgery_step/generic/amputate,
|
||||
/datum/surgery_step/generic/clamp_bleeders,
|
||||
/datum/surgery_step/generic/retract_skin,
|
||||
/datum/surgery_step/generic/dissect,
|
||||
)
|
||||
|
||||
dissection_text = list(
|
||||
"<span class='notice'>You begin to prep the subject for dissection...</span>",
|
||||
"<span class='notice'>You begin sawing through the chitinout outer layer.</span>",
|
||||
"<span class='notice'>You begin clamping any cavities leaking fluids into the surgical site.</span>",
|
||||
"<span class='notice'>You begin forcing the dissection cavity open.</span>",
|
||||
"<span class='notice'>You begin removing an unidentifiable mass out of the subject!</span>",
|
||||
)
|
||||
dissection_success_text = list(
|
||||
"<span class='notice'>You begin to prep the subject for dissection...</span>",
|
||||
"<span class='notice'>You manage to saw through the hardened exoskeleton.</span>",
|
||||
"<span class='notice'>You clamp any cavities leaking fluids into the surgical site.</span>",
|
||||
"<span class='notice'>You force the dissection cavity open.</span>",
|
||||
"<span class='notice'>You remove some kind of unidentifiable mass from the subject!</span>",
|
||||
)
|
||||
dissection_failure_text = list(
|
||||
"<span class='warning'>You begin to prep the subject for dissection...</span>",
|
||||
"<span class='warning'>Your saw fails to find purchase against the reinforced exoskeleton!</span>",
|
||||
"<span class='warning'>Your hand slips, tearing some of the flesh from the subject and worsening the leakage!</span>",
|
||||
"<span class='warning'>Your hand slips, tearing the edges of incision!</span>",
|
||||
"<span class='warning'>The tool fails to remove the organ from the surrounding flesh!</span>",
|
||||
)
|
||||
|
||||
/datum/xenobiology_surgery_container/vetus
|
||||
xeno_specialized_organs = list(/obj/item/organ/internal/cell/xenobiology/supercharged)
|
||||
|
||||
custom_organ_states = list("vetus1", "vetus2")
|
||||
|
||||
dissection_tool_step = list(
|
||||
/datum/surgery_step/generic/dissect,
|
||||
/datum/surgery_step/fake_robotics/unscrew_hatch,
|
||||
/datum/surgery_step/fake_robotics/open_hatch,
|
||||
/datum/surgery_step/fake_robotics/amputate,
|
||||
/datum/surgery_step/generic/dissect,
|
||||
)
|
||||
|
||||
dissection_text = list(
|
||||
"<span class='notice'>You begin to prep the subject for dissection...</span>",
|
||||
"<span class='notice'>You begin to unscrew the coverings.</span>",
|
||||
"<span class='notice'>You begin prying open the loose panel from the machine.</span>",
|
||||
"<span class='notice'>You carefully begin to disconnect the core from the machinery without setting off any secondary explosions.</span>",
|
||||
"<span class='notice'>You begin removing the core from the metal housing surrounding it.</span>",
|
||||
)
|
||||
dissection_success_text = list(
|
||||
"<span class='notice'>You successfully set up a dissection site.</span>",
|
||||
"<span class='notice'>You successfully remove any screws keeping the panel shut.</span>",
|
||||
"<span class='notice'>You pry open the loose panels to expose the core within.</span>",
|
||||
"<span class='notice'>You successfully disconnect the core from the power connectors.</span>",
|
||||
"<span class='notice'>You remove the core from the metal housing!</span>",
|
||||
)
|
||||
dissection_failure_text = list(
|
||||
"<span class='warning'>You begin to prep the subject for dissection...</span>",
|
||||
"<span class='warning'>You cant get enough torque to unscrew the rusted fastenings off!</span>",
|
||||
"<span class='warning'>You fail to find enough leverage to get the panel off!</span>",
|
||||
"<span class='warning'>You cant find how to safely remove the core from its attached wiring!</span>",
|
||||
"<span class='warning'>The tool fails to remove the core from the metal housing!</span>",
|
||||
)
|
||||
|
||||
/datum/xenobiology_surgery_container/drake
|
||||
xeno_specialized_organs = list(/obj/item/organ/internal/lungs/xenobiology/flame_sack)
|
||||
|
||||
dissection_tool_step = list(
|
||||
/datum/surgery_step/generic/dissect,
|
||||
/datum/surgery_step/generic/amputate,
|
||||
/datum/surgery_step/generic/clamp_bleeders,
|
||||
/datum/surgery_step/generic/cut_open,
|
||||
/datum/surgery_step/generic/clamp_bleeders,
|
||||
/datum/surgery_step/generic/retract_skin,
|
||||
/datum/surgery_step/generic/dissect,
|
||||
)
|
||||
|
||||
dissection_text = list(
|
||||
"<span class='notice'>You begin to prep the subject for dissection...</span>",
|
||||
"<span class='notice'>You begin sawing through the hardened scales of the drake.</span>",
|
||||
"<span class='notice'>You carefully begin removing the scales from the corpse</span>",
|
||||
"<span class='notice'>You begin to make a careful incision into the subject's corpse.</span>",
|
||||
"<span class='notice'>You begin clamping any cavities leaking fluids into the surgical site.</span>",
|
||||
"<span class='notice'>You begin forcing the dissection cavity open.</span>",
|
||||
"<span class='notice'>You begin removing an unidentifiable mass out of the subject!</span>",
|
||||
)
|
||||
dissection_success_text = list(
|
||||
"<span class='notice'>You successfully set up a dissection site.</span>",
|
||||
"<span class='notice'>You feel the resistance of the hardened scales give away to the saw.</span>",
|
||||
"<span class='notice'>You pluck away the remaining scales from around the dissection site.</span>",
|
||||
"<span class='notice'>You successfully make an incision into the dissection site.</span>",
|
||||
"<span class='notice'>You successfully clamp any leaking cavities.</span>",
|
||||
"<span class='notice'>You force the dissection cavity open.</span>",
|
||||
"<span class='notice'>You remove some kind of unidentifiable mass from the subject!</span>",
|
||||
)
|
||||
dissection_failure_text = list(
|
||||
"<span class='warning'>The tool fails to get a grip on the corpse's surface!</span>",
|
||||
"<span class='warning'>You fail to find enough leverage to saw through the thick scales!</span>",
|
||||
"<span class='warning'>You cant get a good enough grip on the loosened scales to pluck them off!</span>",
|
||||
"<span class='warning'>Your hand slips, slicing open the corpse in a wrong spot with the tool!</span>",
|
||||
"<span class='warning'>Your hand slips, tearing some of the flesh from the subject and worsening the leakage!</span>",
|
||||
"<span class='warning'>Your hand slips, tearing the edges of incision!</span>",
|
||||
"<span class='warning'>The tool fails to remove the organ from the surrounding flesh!</span>",
|
||||
)
|
||||
|
||||
/datum/xenobiology_surgery_container/headslug
|
||||
xeno_specialized_organs = list(/obj/item/organ/internal/heart/xenobiology/contortion)
|
||||
|
||||
dissection_tool_step = list(
|
||||
/datum/surgery_step/generic/dissect,
|
||||
/datum/surgery_step/generic/cut_open,
|
||||
/datum/surgery_step/generic/dissect,
|
||||
)
|
||||
|
||||
dissection_text = list(
|
||||
"<span class='notice'>You begin to prep the subject for dissection...</span>",
|
||||
"<span class='notice'>You carefully begin making a tiny incision in the diminutive creature.</span>",
|
||||
"<span class='notice'>You begin removing an unidentifiable mass out of the subject!</span>",
|
||||
)
|
||||
dissection_success_text = list(
|
||||
"<span class='notice'>You successfully set up a dissection site.</span>",
|
||||
"<span class='notice'>You successfully make an incision into the tiny creature.</span>",
|
||||
"<span class='notice'>You remove some kind of unidentifiable mass from the subject!</span>",
|
||||
)
|
||||
dissection_failure_text = list(
|
||||
"<span class='warning'>The tool fails to get a grip on the corpse's surface!</span>",
|
||||
"<span class='warning'>Your hand slips, slicing open the corpse in a wrong spot with the tool!</span>",
|
||||
"<span class='warning'>The tool fails to remove the organ from the surrounding flesh!</span>",
|
||||
)
|
||||
|
||||
/datum/xenobiology_surgery_container/basilisk
|
||||
xeno_specialized_organs = list(/obj/item/organ/internal/kidneys/xenobiology/sweating)
|
||||
|
||||
dissection_tool_step = list(
|
||||
/datum/surgery_step/generic/dissect,
|
||||
/datum/surgery_step/generic/drill,
|
||||
/datum/surgery_step/generic/retract_skin,
|
||||
/datum/surgery_step/generic/clamp_bleeders,
|
||||
/datum/surgery_step/generic/cut_open,
|
||||
/datum/surgery_step/generic/clamp_bleeders,
|
||||
/datum/surgery_step/generic/retract_skin,
|
||||
/datum/surgery_step/generic/dissect,
|
||||
)
|
||||
|
||||
dissection_text = list(
|
||||
"<span class='notice'>You begin to prep the subject for dissection...</span>",
|
||||
"<span class='notice'>You begin drilling into the crystals to weakent he structure.</span>",
|
||||
"<span class='notice'>You begin breaking apart the crystals preventing access to the subject.</span>",
|
||||
"<span class='notice'>You begin removing the remaining pieces of obstructive material.</span>",
|
||||
"<span class='notice'>You begin to make a careful incision into the subject's corpse.</span>",
|
||||
"<span class='notice'>You begin clamping any cavities leaking fluids into the surgical site.</span>",
|
||||
"<span class='notice'>You begin forcing the dissection cavity open.</span>",
|
||||
"<span class='notice'>You begin removing an unidentifiable mass out of the subject!</span>",
|
||||
)
|
||||
dissection_success_text = list(
|
||||
"<span class='notice'>You successfully set up a dissection site.</span>",
|
||||
"<span class='notice'>You drill a series of holes into the crystalline carapace.</span>",
|
||||
"<span class='notice'>You crack open the crystalline lattice into many pieces.</span>",
|
||||
"<span class='notice'>You colelct and remove the myriad of loose crystals.</span>",
|
||||
"<span class='notice'>You successfully make an incision into the dissection site.</span>",
|
||||
"<span class='notice'>You successfully clamp any leaking cavities.</span>",
|
||||
"<span class='notice'>You successfully force the dissection cavity open.</span>",
|
||||
"<span class='notice'>You remove some kind of unidentifiable mass from the subject!</span>",
|
||||
)
|
||||
dissection_failure_text = list(
|
||||
"<span class='warning'>The tool fails to get a grip on the corpse's surface!</span>",
|
||||
"<span class='warning'>You fail to drill through the hardened crystals!</span>",
|
||||
"<span class='warning'>You fail to get enough leverage to break apart the crystal lattice!</span>",
|
||||
"<span class='warning'>You cant seem to get a good grip on the irregular chunks of material!</span>",
|
||||
"<span class='warning'>Your hand slips, slicing open the corpse in a wrong spot with the tool!</span>",
|
||||
"<span class='warning'>Your hand slips, tearing some of the flesh from the subject and worsening the leakage!</span>",
|
||||
"<span class='warning'>Your hand slips, tearing the edges of incision!</span>",
|
||||
"<span class='warning'>The tool fails to remove the organ from the surrounding flesh!</span>",
|
||||
)
|
||||
|
||||
/datum/xenobiology_surgery_container/legion
|
||||
xeno_specialized_organs = list(/obj/item/organ/internal/heart/xenobiology/squirming)
|
||||
custom_organ_states = list("legion1", "legion2")
|
||||
dissection_tool_step = list(
|
||||
/datum/surgery_step/generic/dissect,
|
||||
/datum/surgery_step/generic/amputate,
|
||||
/datum/surgery_step/generic/cut_open,
|
||||
/datum/surgery_step/generic/cut_open,
|
||||
/datum/surgery_step/generic/retract_skin,
|
||||
/datum/surgery_step/generic/cut_open,
|
||||
/datum/surgery_step/generic/dissect,
|
||||
)
|
||||
|
||||
dissection_text = list(
|
||||
"<span class='notice'>You begin to prep the subject for dissection...</span>",
|
||||
"<span class='notice'>You begin to saw through the thick skull plating.</span>",
|
||||
"<span class='notice'>You make a careful incision into the subject's corpse.</span>",
|
||||
"<span class='notice'>You begin cutting away at the small skulls continuing to bud up from the corpse.</span>",
|
||||
"<span class='notice'>You begin forcing the dissection cavity open.</span>",
|
||||
"<span class='notice'>You once again cut away at the budding skulls attempting to seal up the surgical site.</span>",
|
||||
"<span class='notice'>You begin removing an unidentifiable mass out of the subject!</span>"
|
||||
)
|
||||
dissection_success_text = list(
|
||||
"<span class='notice'>You successfully set up a dissection site.</span>",
|
||||
"<span class='notice'>You manage to crack through the thick skull plating.</span>",
|
||||
"<span class='notice'>You successfully make an incision into the dissection site</span>",
|
||||
"<span class='notice'>You manage to cut away and control the growing buds.</span>",
|
||||
"<span class='notice'>You force the dissection cavity open.</span>",
|
||||
"<span class='notice'>You again manage to cut away and control the growing buds.</span>",
|
||||
"<span class='notice'>You remove an unidentifiable mass out of the subject!</span>"
|
||||
)
|
||||
dissection_failure_text = list(
|
||||
"<span class='warning'>The tool fails to get a grip on the corpse's surface!</span>",
|
||||
"<span class='warning'>You cant get enough leverage to saw through the thick skull plating!</span>",
|
||||
"<span class='warning'>Your hand slips, slicing open the corpse in a wrong spot with the tool!</span>",
|
||||
"<span class='warning'>You fail to cut the buds away faster than they're regrowing!</span>",
|
||||
"<span class='warning'>Your hand slips, tearing the edges of incision!</span>",
|
||||
"<span class='warning'>You fail to cut the buds away faster than they're regrowing!</span>",
|
||||
"<span class='warning'>The tool fails to remove the organ from the surrounding flesh!</span>"
|
||||
)
|
||||
@@ -12,6 +12,7 @@
|
||||
allowed_tools = list(
|
||||
TOOL_SCALPEL = 100,
|
||||
/obj/item/kitchen/knife = 90,
|
||||
TOOL_DISSECTOR = 75,
|
||||
/obj/item/kitchen/knife/shiv = 70,
|
||||
/obj/item/shard = 60,
|
||||
TOOL_WIRECUTTER = 35,
|
||||
@@ -29,34 +30,43 @@
|
||||
time = 1.6 SECONDS
|
||||
|
||||
/datum/surgery_step/generic/cut_open/begin_step(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool, datum/surgery/surgery)
|
||||
var/obj/item/organ/external/affected = target.get_organ(target_zone)
|
||||
user.visible_message(
|
||||
"[user] starts the incision on [target]'s [affected.name] with [tool].",
|
||||
"You start the incision on [target]'s [affected.name] with [tool].",
|
||||
chat_message_type = MESSAGE_TYPE_COMBAT
|
||||
)
|
||||
affected.custom_pain("You feel a horrible pain as if from a sharp knife in your [affected.name]!")
|
||||
if(istype(surgery, /datum/surgery/dissect))
|
||||
to_chat(user, "[target.surgery_container.dissection_text[surgery.step_number]]")
|
||||
else
|
||||
var/obj/item/organ/external/affected = target.get_organ(target_zone)
|
||||
user.visible_message(
|
||||
"[user] starts the incision on [target]'s [affected.name] with [tool].",
|
||||
"You start the incision on [target]'s [affected.name] with [tool].",
|
||||
chat_message_type = MESSAGE_TYPE_COMBAT
|
||||
)
|
||||
affected.custom_pain("You feel a horrible pain as if from a sharp knife in your [affected.name]!")
|
||||
return ..()
|
||||
|
||||
/datum/surgery_step/generic/cut_open/end_step(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool, datum/surgery/surgery)
|
||||
var/obj/item/organ/external/affected = target.get_organ(target_zone)
|
||||
user.visible_message(
|
||||
if(istype(surgery, /datum/surgery/dissect))
|
||||
to_chat(user, "[target.surgery_container.dissection_success_text[surgery.step_number]]")
|
||||
else
|
||||
var/obj/item/organ/external/affected = target.get_organ(target_zone)
|
||||
user.visible_message(
|
||||
"<span class='notice'>[user] has made an incision on [target]'s [affected.name] with [tool].</span>",
|
||||
"<span class='notice'>You have made an incision on [target]'s [affected.name] with [tool].</span>",
|
||||
chat_message_type = MESSAGE_TYPE_COMBAT
|
||||
)
|
||||
affected.open = ORGAN_ORGANIC_OPEN
|
||||
target.resume_bleeding()
|
||||
)
|
||||
affected.open = ORGAN_ORGANIC_OPEN
|
||||
target.resume_bleeding()
|
||||
return SURGERY_STEP_CONTINUE
|
||||
|
||||
/datum/surgery_step/generic/cut_open/fail_step(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool, datum/surgery/surgery)
|
||||
var/obj/item/organ/external/affected = target.get_organ(target_zone)
|
||||
user.visible_message(
|
||||
"<span class='warning'>[user]'s hand slips, slicing open [target]'s [affected.name] in a wrong spot with [tool]!</span>",
|
||||
"<span class='warning'>Your hand slips, slicing open [target]'s [affected.name] in a wrong spot with [tool]!</span>",
|
||||
chat_message_type = MESSAGE_TYPE_COMBAT
|
||||
)
|
||||
affected.receive_damage(10)
|
||||
if(istype(surgery, /datum/surgery/dissect))
|
||||
to_chat(user, "[target.surgery_container.dissection_failure_text[surgery.step_number]]")
|
||||
else
|
||||
var/obj/item/organ/external/affected = target.get_organ(target_zone)
|
||||
user.visible_message(
|
||||
"<span class='warning'>[user]'s hand slips, slicing open [target]'s [affected.name] in a wrong spot with [tool]!</span>",
|
||||
"<span class='warning'>Your hand slips, slicing open [target]'s [affected.name] in a wrong spot with [tool]!</span>",
|
||||
chat_message_type = MESSAGE_TYPE_COMBAT
|
||||
)
|
||||
affected.receive_damage(10)
|
||||
return SURGERY_STEP_RETRY
|
||||
|
||||
/datum/surgery_step/generic/clamp_bleeders
|
||||
@@ -75,33 +85,42 @@
|
||||
|
||||
|
||||
/datum/surgery_step/generic/clamp_bleeders/begin_step(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool, datum/surgery/surgery)
|
||||
var/obj/item/organ/external/affected = target.get_organ(target_zone)
|
||||
user.visible_message(
|
||||
"[user] starts clamping bleeders in [target]'s [affected.name] with \the [tool].",
|
||||
"You start clamping bleeders in [target]'s [affected.name] with \the [tool].",
|
||||
chat_message_type = MESSAGE_TYPE_COMBAT
|
||||
)
|
||||
affected.custom_pain("The pain in your [affected.name] is maddening!")
|
||||
if(istype(surgery, /datum/surgery/dissect))
|
||||
to_chat(user, "[target.surgery_container.dissection_text[surgery.step_number]]")
|
||||
else
|
||||
var/obj/item/organ/external/affected = target.get_organ(target_zone)
|
||||
user.visible_message(
|
||||
"[user] starts clamping bleeders in [target]'s [affected.name] with \the [tool].",
|
||||
"You start clamping bleeders in [target]'s [affected.name] with \the [tool].",
|
||||
chat_message_type = MESSAGE_TYPE_COMBAT
|
||||
)
|
||||
affected.custom_pain("The pain in your [affected.name] is maddening!")
|
||||
return ..()
|
||||
|
||||
/datum/surgery_step/generic/clamp_bleeders/end_step(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool, datum/surgery/surgery)
|
||||
var/obj/item/organ/external/affected = target.get_organ(target_zone)
|
||||
user.visible_message(
|
||||
"<span class='notice'>[user] clamps bleeders in [target]'s [affected.name] with \the [tool].</span>",
|
||||
"<span class='notice'>You clamp bleeders in [target]'s [affected.name] with \the [tool].</span>",
|
||||
chat_message_type = MESSAGE_TYPE_COMBAT
|
||||
)
|
||||
spread_germs_to_organ(affected, user, tool)
|
||||
if(istype(surgery, /datum/surgery/dissect))
|
||||
to_chat(user, "[target.surgery_container.dissection_success_text[surgery.step_number]]")
|
||||
else
|
||||
var/obj/item/organ/external/affected = target.get_organ(target_zone)
|
||||
user.visible_message(
|
||||
"<span class='notice'>[user] clamps bleeders in [target]'s [affected.name] with \the [tool].</span>",
|
||||
"<span class='notice'>You clamp bleeders in [target]'s [affected.name] with \the [tool].</span>",
|
||||
chat_message_type = MESSAGE_TYPE_COMBAT
|
||||
)
|
||||
spread_germs_to_organ(affected, user, tool)
|
||||
return SURGERY_STEP_CONTINUE
|
||||
|
||||
/datum/surgery_step/generic/clamp_bleeders/fail_step(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool, datum/surgery/surgery)
|
||||
var/obj/item/organ/external/affected = target.get_organ(target_zone)
|
||||
user.visible_message(
|
||||
"<span class='warning'>[user]'s hand slips, tearing blood vessels and causing massive bleeding in [target]'s [affected.name] with \the [tool]!</span>",
|
||||
"<span class='warning'>Your hand slips, tearing blood vessels and causing massive bleeding in [target]'s [affected.name] with \the [tool]!</span>",
|
||||
chat_message_type = MESSAGE_TYPE_COMBAT
|
||||
)
|
||||
affected.receive_damage(10)
|
||||
if(istype(surgery, /datum/surgery/dissect))
|
||||
to_chat(user, "[target.surgery_container.dissection_failure_text[surgery.step_number]]")
|
||||
else
|
||||
var/obj/item/organ/external/affected = target.get_organ(target_zone)
|
||||
user.visible_message(
|
||||
"<span class='warning'>[user]'s hand slips, tearing blood vessels and causing massive bleeding in [target]'s [affected.name] with \the [tool]!</span>",
|
||||
"<span class='warning'>Your hand slips, tearing blood vessels and causing massive bleeding in [target]'s [affected.name] with \the [tool]!</span>",
|
||||
chat_message_type = MESSAGE_TYPE_COMBAT
|
||||
)
|
||||
affected.receive_damage(10)
|
||||
return SURGERY_STEP_RETRY
|
||||
|
||||
/datum/surgery_step/generic/retract_skin
|
||||
@@ -121,45 +140,54 @@
|
||||
time = 2.4 SECONDS
|
||||
|
||||
/datum/surgery_step/generic/retract_skin/begin_step(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool, datum/surgery/surgery)
|
||||
var/obj/item/organ/external/affected = target.get_organ(target_zone)
|
||||
var/msg = "[user] starts to pry open the incision on [target]'s [affected.name] with \the [tool]."
|
||||
var/self_msg = "You start to pry open the incision on [target]'s [affected.name] with \the [tool]."
|
||||
if(target_zone == BODY_ZONE_CHEST)
|
||||
msg = "[user] starts to separate the ribcage and rearrange the organs in [target]'s torso with \the [tool]."
|
||||
self_msg = "You start to separate the ribcage and rearrange the organs in [target]'s torso with \the [tool]."
|
||||
if(target_zone == BODY_ZONE_PRECISE_GROIN)
|
||||
msg = "[user] starts to pry open the incision and rearrange the organs in [target]'s lower abdomen with \the [tool]."
|
||||
self_msg = "You start to pry open the incision and rearrange the organs in [target]'s lower abdomen with \the [tool]."
|
||||
user.visible_message(msg, self_msg, chat_message_type = MESSAGE_TYPE_COMBAT)
|
||||
affected.custom_pain("It feels like the skin on your [affected.name] is on fire!")
|
||||
if(istype(surgery, /datum/surgery/dissect))
|
||||
to_chat(user, "[target.surgery_container.dissection_text[surgery.step_number]]")
|
||||
else
|
||||
var/obj/item/organ/external/affected = target.get_organ(target_zone)
|
||||
var/msg = "[user] starts to pry open the incision on [target]'s [affected.name] with \the [tool]."
|
||||
var/self_msg = "You start to pry open the incision on [target]'s [affected.name] with \the [tool]."
|
||||
if(target_zone == BODY_ZONE_CHEST)
|
||||
msg = "[user] starts to separate the ribcage and rearrange the organs in [target]'s torso with \the [tool]."
|
||||
self_msg = "You start to separate the ribcage and rearrange the organs in [target]'s torso with \the [tool]."
|
||||
if(target_zone == BODY_ZONE_PRECISE_GROIN)
|
||||
msg = "[user] starts to pry open the incision and rearrange the organs in [target]'s lower abdomen with \the [tool]."
|
||||
self_msg = "You start to pry open the incision and rearrange the organs in [target]'s lower abdomen with \the [tool]."
|
||||
user.visible_message(msg, self_msg, chat_message_type = MESSAGE_TYPE_COMBAT)
|
||||
affected.custom_pain("It feels like the skin on your [affected.name] is on fire!")
|
||||
return ..()
|
||||
|
||||
/datum/surgery_step/generic/retract_skin/end_step(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool, datum/surgery/surgery)
|
||||
var/obj/item/organ/external/affected = target.get_organ(target_zone)
|
||||
var/msg = "<span class='notice'>[user] keeps the incision open on [target]'s [affected.name] with \the [tool].</span>"
|
||||
var/self_msg = "<span class='notice'>You keep the incision open on [target]'s [affected.name] with \the [tool].</span>"
|
||||
if(target_zone == BODY_ZONE_CHEST)
|
||||
msg = "<span class='notice'>[user] keeps the ribcage open on [target]'s torso with \the [tool].</span>"
|
||||
self_msg = "<span class='notice'>You keep the ribcage open on [target]'s torso with \the [tool]."
|
||||
if(target_zone == BODY_ZONE_PRECISE_GROIN)
|
||||
msg = "<span class='notice'>[user] keeps the incision open on [target]'s lower abdomen with \the [tool].</span>"
|
||||
self_msg = "<span class='notice'>You keep the incision open on [target]'s lower abdomen with \the [tool].</span>"
|
||||
user.visible_message(msg, self_msg, chat_message_type = MESSAGE_TYPE_COMBAT)
|
||||
affected.open = ORGAN_ORGANIC_ENCASED_OPEN
|
||||
if(istype(surgery, /datum/surgery/dissect))
|
||||
to_chat(user, "[target.surgery_container.dissection_success_text[surgery.step_number]]")
|
||||
else
|
||||
var/obj/item/organ/external/affected = target.get_organ(target_zone)
|
||||
var/msg = "<span class='notice'>[user] keeps the incision open on [target]'s [affected.name] with \the [tool].</span>"
|
||||
var/self_msg = "<span class='notice'>You keep the incision open on [target]'s [affected.name] with \the [tool].</span>"
|
||||
if(target_zone == BODY_ZONE_CHEST)
|
||||
msg = "<span class='notice'>[user] keeps the ribcage open on [target]'s torso with \the [tool].</span>"
|
||||
self_msg = "<span class='notice'>You keep the ribcage open on [target]'s torso with \the [tool]."
|
||||
if(target_zone == BODY_ZONE_PRECISE_GROIN)
|
||||
msg = "<span class='notice'>[user] keeps the incision open on [target]'s lower abdomen with \the [tool].</span>"
|
||||
self_msg = "<span class='notice'>You keep the incision open on [target]'s lower abdomen with \the [tool].</span>"
|
||||
user.visible_message(msg, self_msg, chat_message_type = MESSAGE_TYPE_COMBAT)
|
||||
affected.open = ORGAN_ORGANIC_ENCASED_OPEN
|
||||
return SURGERY_STEP_CONTINUE
|
||||
|
||||
/datum/surgery_step/generic/retract_skin/fail_step(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool, datum/surgery/surgery)
|
||||
var/obj/item/organ/external/affected = target.get_organ(target_zone)
|
||||
var/msg = "<span class='warning'>[user]'s hand slips, tearing the edges of incision on [target]'s [affected.name] with \the [tool]!</span>"
|
||||
var/self_msg = "<span class='warning'>Your hand slips, tearing the edges of incision on [target]'s [affected.name] with \the [tool]!</span>"
|
||||
if(target_zone == BODY_ZONE_CHEST)
|
||||
msg = "<span class='warning'>[user]'s hand slips, damaging several organs [target]'s torso with \the [tool]!</span>"
|
||||
self_msg = "<span class='warning'>Your hand slips, damaging several organs [target]'s torso with \the [tool]!</span>"
|
||||
if(target_zone == BODY_ZONE_PRECISE_GROIN)
|
||||
msg = "<span class='warning'>[user]'s hand slips, damaging several organs [target]'s lower abdomen with \the [tool]</span>"
|
||||
self_msg = "<span class='warning'>Your hand slips, damaging several organs [target]'s lower abdomen with \the [tool]!</span>"
|
||||
user.visible_message(msg, self_msg, chat_message_type = MESSAGE_TYPE_COMBAT)
|
||||
target.apply_damage(12, BRUTE, affected, sharp = TRUE)
|
||||
if(istype(surgery, /datum/surgery/dissect))
|
||||
to_chat(user, "[target.surgery_container.dissection_failure_text[surgery.step_number]]")
|
||||
else
|
||||
var/obj/item/organ/external/affected = target.get_organ(target_zone)
|
||||
var/msg = "<span class='warning'>[user]'s hand slips, tearing the edges of incision on [target]'s [affected.name] with \the [tool]!</span>"
|
||||
var/self_msg = "<span class='warning'>Your hand slips, tearing the edges of incision on [target]'s [affected.name] with \the [tool]!</span>"
|
||||
if(target_zone == BODY_ZONE_CHEST)
|
||||
msg = "<span class='warning'>[user]'s hand slips, damaging several organs [target]'s torso with \the [tool]!</span>"
|
||||
self_msg = "<span class='warning'>Your hand slips, damaging several organs [target]'s torso with \the [tool]!</span>"
|
||||
if(target_zone == BODY_ZONE_PRECISE_GROIN)
|
||||
msg = "<span class='warning'>[user]'s hand slips, damaging several organs [target]'s lower abdomen with \the [tool]</span>"
|
||||
self_msg = "<span class='warning'>Your hand slips, damaging several organs [target]'s lower abdomen with \the [tool]!</span>"
|
||||
user.visible_message(msg, self_msg, chat_message_type = MESSAGE_TYPE_COMBAT)
|
||||
target.apply_damage(12, BRUTE, affected, sharp = TRUE)
|
||||
return SURGERY_STEP_RETRY
|
||||
|
||||
/datum/surgery_step/generic/cauterize
|
||||
@@ -187,34 +215,43 @@
|
||||
return TRUE
|
||||
|
||||
/datum/surgery_step/generic/cauterize/begin_step(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool, datum/surgery/surgery)
|
||||
var/obj/item/organ/external/affected = target.get_organ(target_zone)
|
||||
user.visible_message(
|
||||
"[user] is beginning to cauterize the incision on [target]'s [affected.name] with \the [tool].",
|
||||
"You are beginning to cauterize the incision on [target]'s [affected.name] with \the [tool].",
|
||||
chat_message_type = MESSAGE_TYPE_COMBAT
|
||||
)
|
||||
affected.custom_pain("Your [affected.name] is being burned!")
|
||||
if(istype(surgery, /datum/surgery/dissect))
|
||||
to_chat(user, "[target.surgery_container.dissection_text[surgery.step_number]]")
|
||||
else
|
||||
var/obj/item/organ/external/affected = target.get_organ(target_zone)
|
||||
user.visible_message(
|
||||
"[user] is beginning to cauterize the incision on [target]'s [affected.name] with \the [tool].",
|
||||
"You are beginning to cauterize the incision on [target]'s [affected.name] with \the [tool].",
|
||||
chat_message_type = MESSAGE_TYPE_COMBAT
|
||||
)
|
||||
affected.custom_pain("Your [affected.name] is being burned!")
|
||||
return ..()
|
||||
|
||||
/datum/surgery_step/generic/cauterize/end_step(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool, datum/surgery/surgery)
|
||||
var/obj/item/organ/external/affected = target.get_organ(target_zone)
|
||||
user.visible_message(
|
||||
"<span class='notice'>[user] cauterizes the incision on [target]'s [affected.name] with \the [tool].</span>",
|
||||
"<span class='notice'>You cauterize the incision on [target]'s [affected.name] with \the [tool].</span>",
|
||||
chat_message_type = MESSAGE_TYPE_COMBAT
|
||||
)
|
||||
affected.open = ORGAN_CLOSED
|
||||
affected.germ_level = max(affected.germ_level - 50, 0)
|
||||
if(istype(surgery, /datum/surgery/dissect))
|
||||
to_chat(user, "[target.surgery_container.dissection_success_text[surgery.step_number]]")
|
||||
else
|
||||
var/obj/item/organ/external/affected = target.get_organ(target_zone)
|
||||
user.visible_message(
|
||||
"<span class='notice'>[user] cauterizes the incision on [target]'s [affected.name] with \the [tool].</span>",
|
||||
"<span class='notice'>You cauterize the incision on [target]'s [affected.name] with \the [tool].</span>",
|
||||
chat_message_type = MESSAGE_TYPE_COMBAT
|
||||
)
|
||||
affected.open = ORGAN_CLOSED
|
||||
affected.germ_level = max(affected.germ_level - 50, 0)
|
||||
return SURGERY_STEP_CONTINUE
|
||||
|
||||
/datum/surgery_step/generic/cauterize/fail_step(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool, datum/surgery/surgery)
|
||||
var/obj/item/organ/external/affected = target.get_organ(target_zone)
|
||||
user.visible_message(
|
||||
"<span class='warning'>[user]'s hand slips, leaving a small burn on [target]'s [affected.name] with \the [tool]!</span>",
|
||||
"<span class='warning'>Your hand slips, leaving a small burn on [target]'s [affected.name] with \the [tool]!</span>",
|
||||
chat_message_type = MESSAGE_TYPE_COMBAT
|
||||
)
|
||||
target.apply_damage(3, BURN, affected)
|
||||
if(istype(surgery, /datum/surgery/dissect))
|
||||
to_chat(user, "[target.surgery_container.dissection_failure_text[surgery.step_number]]")
|
||||
else
|
||||
var/obj/item/organ/external/affected = target.get_organ(target_zone)
|
||||
user.visible_message(
|
||||
"<span class='warning'>[user]'s hand slips, leaving a small burn on [target]'s [affected.name] with \the [tool]!</span>",
|
||||
"<span class='warning'>Your hand slips, leaving a small burn on [target]'s [affected.name] with \the [tool]!</span>",
|
||||
chat_message_type = MESSAGE_TYPE_COMBAT
|
||||
)
|
||||
target.apply_damage(3, BURN, affected)
|
||||
return SURGERY_STEP_RETRY
|
||||
|
||||
/datum/surgery_step/generic/cauterize/premature
|
||||
@@ -254,26 +291,34 @@
|
||||
time = 3 SECONDS
|
||||
|
||||
/datum/surgery_step/generic/drill/begin_step(mob/living/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery)
|
||||
user.visible_message(
|
||||
"[user] begins to drill into the bone in [target]'s [parse_zone(target_zone)].",
|
||||
"<span class='notice'>You begin to drill into the bone in [target]'s [parse_zone(target_zone)]...</span>",
|
||||
chat_message_type = MESSAGE_TYPE_COMBAT
|
||||
)
|
||||
if(istype(surgery, /datum/surgery/dissect))
|
||||
to_chat(user, "[target.surgery_container.dissection_text[surgery.step_number]]")
|
||||
else
|
||||
user.visible_message(
|
||||
"[user] begins to drill into the bone in [target]'s [parse_zone(target_zone)].",
|
||||
"<span class='notice'>You begin to drill into the bone in [target]'s [parse_zone(target_zone)]...</span>",
|
||||
chat_message_type = MESSAGE_TYPE_COMBAT
|
||||
)
|
||||
return ..()
|
||||
|
||||
/datum/surgery_step/generic/drill/end_step(mob/living/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery)
|
||||
user.visible_message("[user] drills into [target]'s [parse_zone(target_zone)]!", "<span class='notice'>You drill into [target]'s [parse_zone(target_zone)].</span>")
|
||||
if(istype(surgery, /datum/surgery/dissect))
|
||||
to_chat(user, "[target.surgery_container.dissection_success_text[surgery.step_number]]")
|
||||
else
|
||||
user.visible_message("[user] drills into [target]'s [parse_zone(target_zone)]!", "<span class='notice'>You drill into [target]'s [parse_zone(target_zone)].</span>")
|
||||
return SURGERY_STEP_CONTINUE
|
||||
|
||||
/datum/surgery_step/generic/drill/fail_step(mob/living/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery)
|
||||
var/obj/item/organ/external/affected = target.get_organ(target_zone)
|
||||
user.visible_message(
|
||||
"<span class='warning'>[user]'s [tool] doesn't get a firm grip and tears at the bone in [target]'s [parse_zone(target_zone)]!</span>",
|
||||
"<span class='warning'>Your [tool] doesn't get a firm grip and tears at the bone in [target]'s [parse_zone(target_zone)]!</span>",
|
||||
chat_message_type = MESSAGE_TYPE_COMBAT
|
||||
)
|
||||
|
||||
affected.receive_damage(15)
|
||||
if(istype(surgery, /datum/surgery/dissect))
|
||||
to_chat(user, "[target.surgery_container.dissection_failure_text[surgery.step_number]]")
|
||||
else
|
||||
var/obj/item/organ/external/affected = target.get_organ(target_zone)
|
||||
user.visible_message(
|
||||
"<span class='warning'>[user]'s [tool] doesn't get a firm grip and tears at the bone in [target]'s [parse_zone(target_zone)]!</span>",
|
||||
"<span class='warning'>Your [tool] doesn't get a firm grip and tears at the bone in [target]'s [parse_zone(target_zone)]!</span>",
|
||||
chat_message_type = MESSAGE_TYPE_COMBAT
|
||||
)
|
||||
affected.receive_damage(15)
|
||||
return SURGERY_STEP_RETRY
|
||||
|
||||
|
||||
@@ -299,42 +344,51 @@
|
||||
time = 10 SECONDS
|
||||
|
||||
/datum/surgery_step/generic/amputate/begin_step(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool, datum/surgery/surgery)
|
||||
var/obj/item/organ/external/affected = target.get_organ(target_zone)
|
||||
user.visible_message(
|
||||
"[user] is beginning to amputate [target]'s [affected.name] with \the [tool].",
|
||||
"You are beginning to cut through [target]'s [affected.amputation_point] with \the [tool].",
|
||||
chat_message_type = MESSAGE_TYPE_COMBAT
|
||||
)
|
||||
affected.custom_pain("Your [affected.amputation_point] is being ripped apart!")
|
||||
if(istype(surgery, /datum/surgery/dissect))
|
||||
to_chat(user, "[target.surgery_container.dissection_text[surgery.step_number]]")
|
||||
else
|
||||
var/obj/item/organ/external/affected = target.get_organ(target_zone)
|
||||
user.visible_message(
|
||||
"[user] is beginning to amputate [target]'s [affected.name] with \the [tool].",
|
||||
"You are beginning to cut through [target]'s [affected.amputation_point] with \the [tool].",
|
||||
chat_message_type = MESSAGE_TYPE_COMBAT
|
||||
)
|
||||
affected.custom_pain("Your [affected.amputation_point] is being ripped apart!")
|
||||
return ..()
|
||||
|
||||
/datum/surgery_step/generic/amputate/end_step(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool, datum/surgery/surgery)
|
||||
var/obj/item/organ/external/affected = target.get_organ(target_zone)
|
||||
user.visible_message(
|
||||
"<span class='notice'>[user] amputates [target]'s [affected.name] at the [affected.amputation_point] with \the [tool].</span>",
|
||||
"<span class='notice'>You amputate [target]'s [affected.name] with \the [tool].</span>",
|
||||
chat_message_type = MESSAGE_TYPE_COMBAT
|
||||
)
|
||||
if(istype(surgery, /datum/surgery/dissect))
|
||||
to_chat(user, "[target.surgery_container.dissection_success_text[surgery.step_number]]")
|
||||
else
|
||||
var/obj/item/organ/external/affected = target.get_organ(target_zone)
|
||||
user.visible_message(
|
||||
"<span class='notice'>[user] amputates [target]'s [affected.name] at the [affected.amputation_point] with \the [tool].</span>",
|
||||
"<span class='notice'>You amputate [target]'s [affected.name] with \the [tool].</span>",
|
||||
chat_message_type = MESSAGE_TYPE_COMBAT
|
||||
)
|
||||
|
||||
add_attack_logs(user, target, "Surgically removed [affected.name]. INTENT: [uppertext(user.a_intent)]")//log it
|
||||
add_attack_logs(user, target, "Surgically removed [affected.name]. INTENT: [uppertext(user.a_intent)]")//log it
|
||||
|
||||
var/atom/movable/thing = affected.droplimb(1, DROPLIMB_SHARP)
|
||||
var/atom/movable/thing = affected.droplimb(1, DROPLIMB_SHARP)
|
||||
|
||||
if(istype(target) && target.can_feel_pain())
|
||||
// okay if you can feel your arm getting chopped off you aren't gonna be singing
|
||||
to_chat(target, "<span class='userdanger'>Your [affected] goes completely numb at the [affected.amputation_point]!</span>")
|
||||
target.emote("scream")
|
||||
if(isitem(thing))
|
||||
user.put_in_hands(thing)
|
||||
if(istype(target) && target.can_feel_pain())
|
||||
// okay if you can feel your arm getting chopped off you aren't gonna be singing
|
||||
to_chat(target, "<span class='userdanger'>Your [affected] goes completely numb at the [affected.amputation_point]!</span>")
|
||||
target.emote("scream")
|
||||
if(isitem(thing))
|
||||
user.put_in_hands(thing)
|
||||
return SURGERY_STEP_CONTINUE
|
||||
|
||||
/datum/surgery_step/generic/amputate/fail_step(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool, datum/surgery/surgery)
|
||||
var/obj/item/organ/external/affected = target.get_organ(target_zone)
|
||||
user.visible_message(
|
||||
"<span class='warning'>[user]'s hand slips, sawing through the bone in [target]'s [affected.name] with \the [tool]!</span>",
|
||||
"<span class='warning'>Your hand slips, sawing through the bone in [target]'s [affected.name] with \the [tool]!</span>",
|
||||
chat_message_type = MESSAGE_TYPE_COMBAT
|
||||
)
|
||||
affected.receive_damage(30)
|
||||
affected.fracture()
|
||||
if(istype(surgery, /datum/surgery/dissect))
|
||||
to_chat(user, "[target.surgery_container.dissection_failure_text[surgery.step_number]]")
|
||||
else
|
||||
var/obj/item/organ/external/affected = target.get_organ(target_zone)
|
||||
user.visible_message(
|
||||
"<span class='warning'>[user]'s hand slips, sawing through the bone in [target]'s [affected.name] with \the [tool]!</span>",
|
||||
"<span class='warning'>Your hand slips, sawing through the bone in [target]'s [affected.name] with \the [tool]!</span>",
|
||||
chat_message_type = MESSAGE_TYPE_COMBAT
|
||||
)
|
||||
affected.receive_damage(30)
|
||||
affected.fracture()
|
||||
return SURGERY_STEP_RETRY
|
||||
|
||||
@@ -257,7 +257,7 @@
|
||||
|
||||
//to add a splatter of blood or other mob liquid.
|
||||
/mob/living/proc/add_splatter_floor(turf/T, small_drip, shift_x, shift_y)
|
||||
if((get_blood_id() != "blood") && (get_blood_id() != "slimejelly"))//is it blood or welding fuel?
|
||||
if((get_blood_id() != "blood") && (get_blood_id() != "slimejelly") && (get_blood_id() != "tomatojuice"))//is it blood or welding fuel?
|
||||
return
|
||||
if(!T)
|
||||
T = get_turf(src)
|
||||
|
||||
@@ -65,6 +65,8 @@
|
||||
M.dna.SetSEState(GLOB.colourblindblock, FALSE)
|
||||
singlemutcheck(M, GLOB.colourblindblock, MUTCHK_FORCED)
|
||||
. = ..()
|
||||
if(!M)
|
||||
return
|
||||
M.update_tint()
|
||||
M.update_sight()
|
||||
|
||||
|
||||
@@ -9,6 +9,18 @@
|
||||
var/unremovable = FALSE //Whether it shows up as an option to remove during surgery.
|
||||
/// An associated list of organ datums that this organ has.
|
||||
var/list/datum/organ/organ_datums
|
||||
/// This contains the hidden RnD levels of an organ to prevent rnd from using it.
|
||||
var/hidden_origin_tech
|
||||
/// What is the level of tech for the hidden tech type?
|
||||
var/hidden_tech_level = 1
|
||||
/// How much is this organ worth in the xenobiology organ analyzer?
|
||||
var/analyzer_price = 10
|
||||
/// what quality is this organ? Only useful for xeno organs
|
||||
var/organ_quality = ORGAN_NORMAL
|
||||
/// Does this organ originate from the xenobiology dissection loop?
|
||||
var/is_xeno_organ = FALSE
|
||||
/// Does this organ give a warning upon being inserted?
|
||||
var/warning = FALSE
|
||||
|
||||
/obj/item/organ/internal/New(mob/living/carbon/holder)
|
||||
..()
|
||||
@@ -34,6 +46,11 @@
|
||||
QDEL_LIST_ASSOC_VAL(organ_datums) // The removal from internal_organ_datums should be handled when the organ is removed
|
||||
. = ..()
|
||||
|
||||
/obj/item/organ/internal/examine(mob/user)
|
||||
. = ..()
|
||||
if(is_xeno_organ)
|
||||
. += "<span class='info'>It looks like it would replace \the [slot]."
|
||||
|
||||
/obj/item/organ/internal/proc/insert(mob/living/carbon/M, special = 0, dont_remove_slot = 0)
|
||||
if(!iscarbon(M) || owner == M)
|
||||
return
|
||||
@@ -207,6 +224,9 @@
|
||||
/obj/item/organ/internal/attack__legacy__attackchain(mob/living/carbon/M, mob/user)
|
||||
if(M == user && ishuman(user))
|
||||
var/mob/living/carbon/human/H = user
|
||||
if(is_xeno_organ)
|
||||
to_chat(user, "<span class='warning'>It wouldnt be a very good idea to eat this.</span>")
|
||||
return ..()
|
||||
var/obj/item/food/S = prepare_eat()
|
||||
if(S)
|
||||
H.drop_item()
|
||||
@@ -394,3 +414,9 @@
|
||||
SIGNAL_HANDLER
|
||||
REMOVE_TRAIT(src, TRAIT_ORGAN_INSERTED_WHILE_DEAD, "[UID()]")
|
||||
UnregisterSignal(owner, COMSIG_LIVING_DEFIBBED)
|
||||
|
||||
/// Checks that the organ is inside of a host and that they are a valid recipient. Used for abductor glands
|
||||
/obj/item/organ/internal/proc/owner_check()
|
||||
if(ishuman(owner) || iscarbon(owner))
|
||||
return TRUE
|
||||
return FALSE
|
||||
|
||||
@@ -1,14 +1,16 @@
|
||||
/obj/item/organ/internal/alien
|
||||
origin_tech = "biotech=5"
|
||||
origin_tech = null
|
||||
icon_state = null
|
||||
var/list/alien_powers = list()
|
||||
var/list/human_powers = list()
|
||||
icon = 'icons/obj/xeno_organs.dmi'
|
||||
tough = TRUE
|
||||
sterile = TRUE
|
||||
/// Amount of credits that will be received by selling this in the cargo shuttle
|
||||
var/cargo_profit = 250
|
||||
/// Has this organ been hijacked? Can hijack via a hemostat
|
||||
var/hijacked = FALSE
|
||||
is_xeno_organ = TRUE
|
||||
|
||||
/// This adds and removes alien spells upon addition, if a noncarbon tries to do this well... I blame adminbus
|
||||
/obj/item/organ/internal/alien/insert(mob/living/carbon/M, special = 0)
|
||||
@@ -27,6 +29,10 @@
|
||||
else
|
||||
for(var/powers_to_remove in human_powers)
|
||||
M.RemoveSpell(new powers_to_remove)
|
||||
if(isalien(M))
|
||||
destroy_on_removal = TRUE
|
||||
else
|
||||
destroy_on_removal = FALSE
|
||||
. = ..()
|
||||
|
||||
/obj/item/organ/internal/alien/examine(mob/user)
|
||||
@@ -62,6 +68,8 @@
|
||||
slot = "plasmavessel"
|
||||
alien_powers = list(/datum/spell/alien_spell/plant_weeds, /datum/spell/alien_spell/transfer_plasma)
|
||||
human_powers = list(/datum/spell/alien_spell/syphon_plasma)
|
||||
hidden_origin_tech = TECH_PLASMA
|
||||
hidden_tech_level = 7
|
||||
|
||||
var/stored_plasma = 100
|
||||
var/max_plasma = 300
|
||||
@@ -132,6 +140,8 @@
|
||||
origin_tech = "biotech=5;materials=2;combat=2"
|
||||
alien_powers = list(/datum/spell/touch/alien_spell/corrosive_acid)
|
||||
human_powers = list(/datum/spell/touch/alien_spell/burning_touch)
|
||||
hidden_origin_tech = TECH_ENGINEERING
|
||||
hidden_tech_level = 6
|
||||
|
||||
/obj/item/organ/internal/alien/hivenode
|
||||
name = "xeno hive node"
|
||||
@@ -140,20 +150,24 @@
|
||||
origin_tech = "biotech=5;magnets=4;bluespace=3"
|
||||
w_class = WEIGHT_CLASS_TINY
|
||||
alien_powers = list(/datum/spell/alien_spell/whisper)
|
||||
hidden_origin_tech = TECH_BLUESPACE
|
||||
hidden_tech_level = 6
|
||||
|
||||
/obj/item/organ/internal/alien/hivenode/insert(mob/living/carbon/M, special = 0)
|
||||
..()
|
||||
M.faction |= "alien"
|
||||
M.add_language("Hivemind")
|
||||
M.add_language("Xenomorph")
|
||||
ADD_TRAIT(M, TRAIT_XENO_IMMUNE, "xeno immune")
|
||||
if(organ_quality == ORGAN_PRISTINE)
|
||||
M.add_language("Hivemind")
|
||||
M.add_language("Xenomorph")
|
||||
|
||||
/obj/item/organ/internal/alien/hivenode/remove(mob/living/carbon/M, special = 0)
|
||||
M.faction -= "alien"
|
||||
M.remove_language("Hivemind")
|
||||
M.remove_language("Xenomorph")
|
||||
REMOVE_TRAIT(M, TRAIT_XENO_IMMUNE, "xeno immune")
|
||||
. = ..()
|
||||
if(organ_quality == ORGAN_PRISTINE)
|
||||
M.remove_language("Hivemind")
|
||||
M.remove_language("Xenomorph")
|
||||
|
||||
/obj/item/organ/internal/alien/neurotoxin
|
||||
name = "xeno neurotoxin gland"
|
||||
@@ -162,6 +176,8 @@
|
||||
origin_tech = "biotech=5;combat=5"
|
||||
alien_powers = list(/datum/spell/alien_spell/neurotoxin)
|
||||
human_powers = list(/datum/spell/alien_spell/neurotoxin/death_to_xenos)
|
||||
hidden_origin_tech = TECH_BIO
|
||||
hidden_tech_level = 6
|
||||
|
||||
/obj/item/organ/internal/alien/resinspinner
|
||||
name = "xeno resin organ"
|
||||
@@ -170,6 +186,8 @@
|
||||
origin_tech = "biotech=5;materials=4"
|
||||
alien_powers = list(/datum/spell/alien_spell/build_resin)
|
||||
human_powers = list(/datum/spell/touch/alien_spell/consume_resin)
|
||||
hidden_origin_tech = TECH_MATERIAL
|
||||
hidden_tech_level = 7
|
||||
|
||||
/obj/item/organ/internal/alien/eggsac
|
||||
name = "xeno egg sac"
|
||||
@@ -180,3 +198,5 @@
|
||||
alien_powers = list(/datum/spell/alien_spell/plant_weeds/eggs)
|
||||
human_powers = list(/datum/spell/alien_spell/combust_facehuggers)
|
||||
cargo_profit = 1000
|
||||
hidden_origin_tech = TECH_BIO
|
||||
hidden_tech_level = 7
|
||||
|
||||
@@ -48,22 +48,6 @@
|
||||
)
|
||||
requires_organic_bodypart = TRUE
|
||||
|
||||
/datum/surgery/organ_manipulation/alien
|
||||
name = "Alien Organ Manipulation"
|
||||
requires_bodypart = FALSE // xenos just don't have "bodyparts"
|
||||
possible_locs = list(BODY_ZONE_CHEST, BODY_ZONE_HEAD, BODY_ZONE_PRECISE_GROIN, BODY_ZONE_PRECISE_EYES, BODY_ZONE_PRECISE_MOUTH, BODY_ZONE_L_ARM, BODY_ZONE_R_ARM)
|
||||
target_mobtypes = list(/mob/living/carbon/alien/humanoid)
|
||||
steps = list(
|
||||
/datum/surgery_step/saw_carapace,
|
||||
/datum/surgery_step/cut_carapace,
|
||||
/datum/surgery_step/retract_carapace,
|
||||
/datum/surgery_step/proxy/manipulate_organs/alien,
|
||||
/datum/surgery_step/generic/seal_carapace
|
||||
)
|
||||
|
||||
|
||||
|
||||
|
||||
/datum/surgery/organ_manipulation/can_start(mob/user, mob/living/carbon/target)
|
||||
. = ..()
|
||||
if(!.)
|
||||
@@ -132,12 +116,6 @@
|
||||
)
|
||||
|
||||
// have to redefine all of these because xenos don't technically have bodyparts.
|
||||
/datum/surgery/intermediate/manipulate/extract/xeno
|
||||
requires_bodypart = FALSE
|
||||
|
||||
/datum/surgery/intermediate/manipulate/implant/xeno
|
||||
requires_bodypart = FALSE
|
||||
|
||||
/datum/surgery/intermediate/manipulate/mend/xeno
|
||||
requires_bodypart = FALSE
|
||||
|
||||
@@ -147,10 +125,8 @@
|
||||
/datum/surgery_step/proxy/manipulate_organs/alien
|
||||
name = "Manipulate Organs Xeno (proxy)"
|
||||
branches = list(
|
||||
/datum/surgery/intermediate/manipulate/extract/xeno,
|
||||
/datum/surgery/intermediate/manipulate/implant/xeno,
|
||||
/datum/surgery/intermediate/manipulate/mend/xeno,
|
||||
/datum/surgery/intermediate/manipulate/clean/xeno
|
||||
/datum/surgery/intermediate/manipulate/clean/xeno,
|
||||
)
|
||||
|
||||
// Internal surgeries.
|
||||
@@ -438,6 +414,11 @@
|
||||
"You start transplanting [tool] into [target]'s [parse_zone(target_zone)].",
|
||||
chat_message_type = MESSAGE_TYPE_COMBAT
|
||||
)
|
||||
if(I.warning)
|
||||
if(tgui_alert(user, "This is a permanent action, guaranteeing this person will be removed from the round. Are you sure?", "Insert [I]", list("Yes", "No")) != "Yes")
|
||||
return
|
||||
log_admin("[key_name(user)] has inserted a [I] into [key_name(target)]!")
|
||||
log_attack(user, target, "Inserted [I]")
|
||||
return ..()
|
||||
|
||||
/datum/surgery_step/internal/manipulate_organs/implant/end_step(mob/living/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery)
|
||||
|
||||
@@ -119,31 +119,40 @@
|
||||
time = 1.6 SECONDS
|
||||
|
||||
/datum/surgery_step/robotics/external/unscrew_hatch/begin_step(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool, datum/surgery/surgery)
|
||||
var/obj/item/organ/external/affected = target.get_organ(target_zone)
|
||||
user.visible_message(
|
||||
"[user] starts to unscrew the maintenance hatch on [target]'s [affected.name] with \the [tool].",
|
||||
"You start to unscrew the maintenance hatch on [target]'s [affected.name] with \the [tool].",
|
||||
chat_message_type = MESSAGE_TYPE_COMBAT
|
||||
)
|
||||
if(istype(surgery, /datum/surgery/dissect))
|
||||
to_chat(user, "[target.surgery_container.dissection_text[surgery.step_number]]")
|
||||
else
|
||||
var/obj/item/organ/external/affected = target.get_organ(target_zone)
|
||||
user.visible_message(
|
||||
"[user] starts to unscrew the maintenance hatch on [target]'s [affected.name] with \the [tool].",
|
||||
"You start to unscrew the maintenance hatch on [target]'s [affected.name] with \the [tool].",
|
||||
chat_message_type = MESSAGE_TYPE_COMBAT
|
||||
)
|
||||
return ..()
|
||||
|
||||
/datum/surgery_step/robotics/external/unscrew_hatch/end_step(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool, datum/surgery/surgery)
|
||||
var/obj/item/organ/external/affected = target.get_organ(target_zone)
|
||||
user.visible_message(
|
||||
"<span class='notice'>[user] has opened the maintenance hatch on [target]'s [affected.name] with \the [tool].</span>",
|
||||
"<span class='notice'>You have opened the maintenance hatch on [target]'s [affected.name] with \the [tool].</span>",
|
||||
chat_message_type = MESSAGE_TYPE_COMBAT
|
||||
)
|
||||
affected.open = ORGAN_SYNTHETIC_LOOSENED
|
||||
if(istype(surgery, /datum/surgery/dissect))
|
||||
to_chat(user, "[target.surgery_container.dissection_success_text[surgery.step_number]]")
|
||||
else
|
||||
var/obj/item/organ/external/affected = target.get_organ(target_zone)
|
||||
user.visible_message(
|
||||
"<span class='notice'>[user] has opened the maintenance hatch on [target]'s [affected.name] with \the [tool].</span>",
|
||||
"<span class='notice'>You have opened the maintenance hatch on [target]'s [affected.name] with \the [tool].</span>",
|
||||
chat_message_type = MESSAGE_TYPE_COMBAT
|
||||
)
|
||||
affected.open = ORGAN_SYNTHETIC_LOOSENED
|
||||
return SURGERY_STEP_CONTINUE
|
||||
|
||||
/datum/surgery_step/robotics/external/unscrew_hatch/fail_step(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool, datum/surgery/surgery)
|
||||
var/obj/item/organ/external/affected = target.get_organ(target_zone)
|
||||
user.visible_message(
|
||||
"<span class='warning'>[user]'s [tool.name] slips, failing to unscrew [target]'s [affected.name].</span>",
|
||||
"<span class='warning'>Your [tool] slips, failing to unscrew [target]'s [affected.name].</span>",
|
||||
chat_message_type = MESSAGE_TYPE_COMBAT
|
||||
)
|
||||
if(istype(surgery, /datum/surgery/dissect))
|
||||
to_chat(user, "[target.surgery_container.dissection_failure_text[surgery.step_number]]")
|
||||
else
|
||||
var/obj/item/organ/external/affected = target.get_organ(target_zone)
|
||||
user.visible_message(
|
||||
"<span class='warning'>[user]'s [tool.name] slips, failing to unscrew [target]'s [affected.name].</span>",
|
||||
"<span class='warning'>Your [tool] slips, failing to unscrew [target]'s [affected.name].</span>",
|
||||
chat_message_type = MESSAGE_TYPE_COMBAT
|
||||
)
|
||||
return SURGERY_STEP_RETRY
|
||||
|
||||
/datum/surgery_step/robotics/external/open_hatch
|
||||
@@ -157,31 +166,40 @@
|
||||
time = 2.4 SECONDS
|
||||
|
||||
/datum/surgery_step/robotics/external/open_hatch/begin_step(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool, datum/surgery/surgery)
|
||||
var/obj/item/organ/external/affected = target.get_organ(target_zone)
|
||||
user.visible_message(
|
||||
"[user] starts to pry open the maintenance hatch on [target]'s [affected.name] with \the [tool].",
|
||||
"You start to pry open the maintenance hatch on [target]'s [affected.name] with \the [tool].",
|
||||
chat_message_type = MESSAGE_TYPE_COMBAT
|
||||
)
|
||||
if(istype(surgery, /datum/surgery/dissect))
|
||||
to_chat(user, "[target.surgery_container.dissection_text[surgery.step_number]]")
|
||||
else
|
||||
var/obj/item/organ/external/affected = target.get_organ(target_zone)
|
||||
user.visible_message(
|
||||
"[user] starts to pry open the maintenance hatch on [target]'s [affected.name] with \the [tool].",
|
||||
"You start to pry open the maintenance hatch on [target]'s [affected.name] with \the [tool].",
|
||||
chat_message_type = MESSAGE_TYPE_COMBAT
|
||||
)
|
||||
return ..()
|
||||
|
||||
/datum/surgery_step/robotics/external/open_hatch/end_step(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool, datum/surgery/surgery)
|
||||
var/obj/item/organ/external/affected = target.get_organ(target_zone)
|
||||
user.visible_message(
|
||||
"<span class='notice'>[user] opens the maintenance hatch on [target]'s [affected.name] with \the [tool].</span>",
|
||||
"<span class='notice'>You open the maintenance hatch on [target]'s [affected.name] with \the [tool].</span>",
|
||||
chat_message_type = MESSAGE_TYPE_COMBAT
|
||||
)
|
||||
affected.open = ORGAN_SYNTHETIC_OPEN
|
||||
if(istype(surgery, /datum/surgery/dissect))
|
||||
to_chat(user, "[target.surgery_container.dissection_success_text[surgery.step_number]]")
|
||||
else
|
||||
var/obj/item/organ/external/affected = target.get_organ(target_zone)
|
||||
user.visible_message(
|
||||
"<span class='notice'>[user] opens the maintenance hatch on [target]'s [affected.name] with \the [tool].</span>",
|
||||
"<span class='notice'>You open the maintenance hatch on [target]'s [affected.name] with \the [tool].</span>",
|
||||
chat_message_type = MESSAGE_TYPE_COMBAT
|
||||
)
|
||||
affected.open = ORGAN_SYNTHETIC_OPEN
|
||||
return SURGERY_STEP_CONTINUE
|
||||
|
||||
/datum/surgery_step/robotics/external/open_hatch/fail_step(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool, datum/surgery/surgery)
|
||||
var/obj/item/organ/external/affected = target.get_organ(target_zone)
|
||||
user.visible_message(
|
||||
"<span class='warning'>[user]'s [tool.name] slips, failing to open the hatch on [target]'s [affected.name].</span>",
|
||||
"<span class='warning'>Your [tool] slips, failing to open the hatch on [target]'s [affected.name].</span>",
|
||||
chat_message_type = MESSAGE_TYPE_COMBAT
|
||||
)
|
||||
if(istype(surgery, /datum/surgery/dissect))
|
||||
to_chat(user, "[target.surgery_container.dissection_failure_text[surgery.step_number]]")
|
||||
else
|
||||
var/obj/item/organ/external/affected = target.get_organ(target_zone)
|
||||
user.visible_message(
|
||||
"<span class='warning'>[user]'s [tool.name] slips, failing to open the hatch on [target]'s [affected.name].</span>",
|
||||
"<span class='warning'>Your [tool] slips, failing to open the hatch on [target]'s [affected.name].</span>",
|
||||
chat_message_type = MESSAGE_TYPE_COMBAT
|
||||
)
|
||||
return SURGERY_STEP_RETRY
|
||||
|
||||
/datum/surgery_step/robotics/external/close_hatch
|
||||
@@ -195,31 +213,40 @@
|
||||
time = 2.4 SECONDS
|
||||
|
||||
/datum/surgery_step/robotics/external/close_hatch/begin_step(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool, datum/surgery/surgery)
|
||||
var/obj/item/organ/external/affected = target.get_organ(target_zone)
|
||||
user.visible_message(
|
||||
"[user] begins to close and secure the hatch on [target]'s [affected.name] with \the [tool].",
|
||||
"You begin to close and secure the hatch on [target]'s [affected.name] with \the [tool].",
|
||||
chat_message_type = MESSAGE_TYPE_COMBAT
|
||||
)
|
||||
if(istype(surgery, /datum/surgery/dissect))
|
||||
to_chat(user, "[target.surgery_container.dissection_text[surgery.step_number]]")
|
||||
else
|
||||
var/obj/item/organ/external/affected = target.get_organ(target_zone)
|
||||
user.visible_message(
|
||||
"[user] begins to close and secure the hatch on [target]'s [affected.name] with \the [tool].",
|
||||
"You begin to close and secure the hatch on [target]'s [affected.name] with \the [tool].",
|
||||
chat_message_type = MESSAGE_TYPE_COMBAT
|
||||
)
|
||||
return ..()
|
||||
|
||||
/datum/surgery_step/robotics/external/close_hatch/end_step(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool, datum/surgery/surgery)
|
||||
var/obj/item/organ/external/affected = target.get_organ(target_zone)
|
||||
user.visible_message(
|
||||
"<span class='notice'>[user] closes and secures the hatch on [target]'s [affected.name] with \the [tool].</span>",
|
||||
"<span class='notice'>You close and secure the hatch on [target]'s [affected.name] with \the [tool].</span>",
|
||||
chat_message_type = MESSAGE_TYPE_COMBAT
|
||||
)
|
||||
tool.play_tool_sound(target)
|
||||
affected.open = ORGAN_CLOSED
|
||||
if(istype(surgery, /datum/surgery/dissect))
|
||||
to_chat(user, "[target.surgery_container.dissection_success_text[surgery.step_number]]")
|
||||
else
|
||||
var/obj/item/organ/external/affected = target.get_organ(target_zone)
|
||||
user.visible_message(
|
||||
"<span class='notice'>[user] closes and secures the hatch on [target]'s [affected.name] with \the [tool].</span>",
|
||||
"<span class='notice'>You close and secure the hatch on [target]'s [affected.name] with \the [tool].</span>",
|
||||
chat_message_type = MESSAGE_TYPE_COMBAT
|
||||
)
|
||||
tool.play_tool_sound(target)
|
||||
affected.open = ORGAN_CLOSED
|
||||
return SURGERY_STEP_CONTINUE
|
||||
|
||||
/datum/surgery_step/robotics/external/close_hatch/fail_step(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool, datum/surgery/surgery)
|
||||
var/obj/item/organ/external/affected = target.get_organ(target_zone)
|
||||
user.visible_message(
|
||||
"<span class='warning'>[user]'s [tool.name] slips, failing to close the hatch on [target]'s [affected.name].</span>",
|
||||
"<span class='warning'>Your [tool.name] slips, failing to close the hatch on [target]'s [affected.name].</span>",
|
||||
chat_message_type = MESSAGE_TYPE_COMBAT)
|
||||
if(istype(surgery, /datum/surgery/dissect))
|
||||
to_chat(user, "[target.surgery_container.dissection_failure_text[surgery.step_number]]")
|
||||
else
|
||||
var/obj/item/organ/external/affected = target.get_organ(target_zone)
|
||||
user.visible_message(
|
||||
"<span class='warning'>[user]'s [tool.name] slips, failing to close the hatch on [target]'s [affected.name].</span>",
|
||||
"<span class='warning'>Your [tool.name] slips, failing to close the hatch on [target]'s [affected.name].</span>",
|
||||
chat_message_type = MESSAGE_TYPE_COMBAT)
|
||||
return SURGERY_STEP_RETRY
|
||||
|
||||
/datum/surgery_step/robotics/external/close_hatch/premature
|
||||
@@ -631,40 +658,47 @@
|
||||
time = 10 SECONDS
|
||||
|
||||
/datum/surgery_step/robotics/external/amputate/begin_step(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool, datum/surgery/surgery)
|
||||
var/obj/item/organ/external/affected = target.get_organ(target_zone)
|
||||
user.visible_message(
|
||||
"[user] starts to decouple [target]'s [affected.name] with [tool].",
|
||||
"You start to decouple [target]'s [affected.name] with [tool].",
|
||||
chat_message_type = MESSAGE_TYPE_COMBAT
|
||||
)
|
||||
if(istype(surgery, /datum/surgery/dissect))
|
||||
to_chat(user, "[target.surgery_container.dissection_text[surgery.step_number]]")
|
||||
else
|
||||
var/obj/item/organ/external/affected = target.get_organ(target_zone)
|
||||
user.visible_message(
|
||||
"[user] starts to decouple [target]'s [affected.name] with [tool].",
|
||||
"You start to decouple [target]'s [affected.name] with [tool].",
|
||||
chat_message_type = MESSAGE_TYPE_COMBAT
|
||||
)
|
||||
|
||||
affected.custom_pain("Your [affected.amputation_point] is being ripped apart!")
|
||||
affected.custom_pain("Your [affected.amputation_point] is being ripped apart!")
|
||||
return ..()
|
||||
|
||||
/datum/surgery_step/robotics/external/amputate/end_step(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool, datum/surgery/surgery)
|
||||
var/obj/item/organ/external/affected = target.get_organ(target_zone)
|
||||
user.visible_message(
|
||||
"<span class='notice'>[user] has decoupled [target]'s [affected.name] with [tool].</span>",
|
||||
"<span class='notice'>You have decoupled [target]'s [affected.name] with [tool].</span>",
|
||||
chat_message_type = MESSAGE_TYPE_COMBAT
|
||||
)
|
||||
if(istype(surgery, /datum/surgery/dissect))
|
||||
to_chat(user, "[target.surgery_container.dissection_success_text[surgery.step_number]]")
|
||||
else
|
||||
var/obj/item/organ/external/affected = target.get_organ(target_zone)
|
||||
user.visible_message(
|
||||
"<span class='notice'>[user] has decoupled [target]'s [affected.name] with [tool].</span>",
|
||||
"<span class='notice'>You have decoupled [target]'s [affected.name] with [tool].</span>",
|
||||
chat_message_type = MESSAGE_TYPE_COMBAT
|
||||
)
|
||||
|
||||
add_attack_logs(user, target, "Surgically removed [affected.name] from. INTENT: [uppertext(user.a_intent)]")//log it
|
||||
|
||||
add_attack_logs(user, target, "Surgically removed [affected.name] from. INTENT: [uppertext(user.a_intent)]")//log it
|
||||
|
||||
var/atom/movable/thing = affected.droplimb(1, DROPLIMB_SHARP)
|
||||
if(isitem(thing))
|
||||
user.put_in_hands(thing)
|
||||
var/atom/movable/thing = affected.droplimb(1, DROPLIMB_SHARP)
|
||||
if(isitem(thing))
|
||||
user.put_in_hands(thing)
|
||||
|
||||
return SURGERY_STEP_CONTINUE
|
||||
|
||||
/datum/surgery_step/robotics/external/amputate/fail_step(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool, datum/surgery/surgery)
|
||||
|
||||
user.visible_message(
|
||||
"<span class='warning'>[user]'s hand slips!</span>",
|
||||
"<span class='warning'>Your hand slips!</span>",
|
||||
chat_message_type = MESSAGE_TYPE_COMBAT
|
||||
)
|
||||
if(istype(surgery, /datum/surgery/dissect))
|
||||
to_chat(user, "[target.surgery_container.dissection_failure_text[surgery.step_number]]")
|
||||
else
|
||||
user.visible_message(
|
||||
"<span class='warning'>[user]'s hand slips!</span>",
|
||||
"<span class='warning'>Your hand slips!</span>",
|
||||
chat_message_type = MESSAGE_TYPE_COMBAT
|
||||
)
|
||||
return SURGERY_STEP_RETRY
|
||||
|
||||
/datum/surgery_step/robotics/external/customize_appearance
|
||||
|
||||
@@ -359,7 +359,8 @@
|
||||
implement_speed_mod = allowed_tools[implement_type] / 100.0
|
||||
|
||||
// They also have some interesting ways that surgery success/fail prob get evaluated, maybe worth looking at
|
||||
speed_mod /= (get_location_modifier(target) * 1 + surgery.speed_modifier) * implement_speed_mod
|
||||
if(!istype(surgery, /datum/surgery/dissect))
|
||||
speed_mod /= (get_location_modifier(target) * 1 + surgery.speed_modifier) * implement_speed_mod
|
||||
var/modded_time = time * speed_mod
|
||||
|
||||
if(slowdown_immune(user))
|
||||
@@ -367,7 +368,8 @@
|
||||
|
||||
if(implement_type) // If this is set, we aren't in an allow_hand or allow_any_item step.
|
||||
prob_success = allowed_tools[implement_type]
|
||||
prob_success *= get_location_modifier(target)
|
||||
if(!istype(surgery, /datum/surgery/dissect))
|
||||
prob_success *= get_location_modifier(target)
|
||||
|
||||
if(!do_after(user, modded_time, target = target))
|
||||
surgery.step_in_progress = FALSE
|
||||
|
||||
@@ -458,7 +458,8 @@ job_slot_amounts = [
|
||||
{name = "Medical Doctor", lowpop = 5, highpop = 6},
|
||||
{name = "Virologist", lowpop = 1, highpop = 1}, # Science
|
||||
{name = "Roboticist", lowpop = 2, highpop = 2},
|
||||
{name = "Scientist", lowpop = 6, highpop = 7}, # Security
|
||||
{name = "Scientist", lowpop = 4, highpop = 5},
|
||||
{name = "Xenobiologist", lowpop = 2, highpop = 2}, # Security
|
||||
{name = "Detective", lowpop = 1, highpop = 1},
|
||||
{name = "Security Officer", lowpop = 8, highpop = 9},
|
||||
{name = "Warden", lowpop = 1, highpop = 1},
|
||||
|
||||
|
Before Width: | Height: | Size: 9.0 KiB After Width: | Height: | Size: 12 KiB |
|
Before Width: | Height: | Size: 1.3 KiB After Width: | Height: | Size: 1.4 KiB |
|
Before Width: | Height: | Size: 4.7 KiB After Width: | Height: | Size: 4.9 KiB |
|
Before Width: | Height: | Size: 2.2 KiB After Width: | Height: | Size: 2.5 KiB |
|
Before Width: | Height: | Size: 2.2 KiB After Width: | Height: | Size: 2.5 KiB |
|
After Width: | Height: | Size: 1.3 KiB |
|
Before Width: | Height: | Size: 86 KiB After Width: | Height: | Size: 142 KiB |
|
Before Width: | Height: | Size: 111 KiB After Width: | Height: | Size: 197 KiB |