diff --git a/code/game/jobs/job/science.dm b/code/game/jobs/job/science.dm
index 71fad0750b..ac2fb4b174 100644
--- a/code/game/jobs/job/science.dm
+++ b/code/game/jobs/job/science.dm
@@ -112,7 +112,10 @@
outfit_type = /decl/hierarchy/outfit/job/science/xenobiologist
job_description = "A Xenobiologist studies esoteric lifeforms, usually in the relative safety of their lab. They attempt to find ways to benefit \
from the byproducts of these lifeforms, and their main subject at present is the Giant Slime."
- alt_titles = list("Xenobotanist" = /datum/alt_title/xenobot)
+ alt_titles = list(
+ "Xenobotanist" = /datum/alt_title/xenobot,
+ "Xenofauna Technician" = /datum/alt_title/xenovet
+ )
// Xenibiologist Alt Titles
/datum/alt_title/xenobot
@@ -120,6 +123,11 @@
title_blurb = "A Xenobotanist grows and cares for a variety of abnormal, custom made, and frequently dangerous plant life. When the products of these plants \
is both safe and beneficial to the station, they may choose to introduce it to the rest of the crew."
+/datum/alt_title/xenovet
+ title = "Xenofauna Technician"
+ title_blurb = "A Xenofauna Technician works with the alien fauna living in the territory around the station, often out in the field. They are also responsible \
+ for training and tending to the station's small drake population."
+
//////////////////////////////////
// Roboticist
//////////////////////////////////
diff --git a/code/game/jobs/jobs.dm b/code/game/jobs/jobs.dm
index 0ef50a6875..4368837344 100644
--- a/code/game/jobs/jobs.dm
+++ b/code/game/jobs/jobs.dm
@@ -44,6 +44,7 @@ var/global/const/CHAPLAIN =(1<<10)
var/global/const/ASSISTANT =(1<<11)
var/global/const/BRIDGE =(1<<12)
var/global/const/HERMIT =(1<<13)
+var/global/const/DOGGO =(1<<14)
/proc/guest_jobbans(var/job)
return ( (job in SSjob.get_job_titles_in_department(DEPARTMENT_COMMAND)) || (job in SSjob.get_job_titles_in_department(DEPARTMENT_SYNTHETIC)) || (job in SSjob.get_job_titles_in_department(DEPARTMENT_SECURITY)) )
diff --git a/code/modules/client/preference_setup/general/02_language.dm b/code/modules/client/preference_setup/general/02_language.dm
index faadc6e514..366e006fc7 100644
--- a/code/modules/client/preference_setup/general/02_language.dm
+++ b/code/modules/client/preference_setup/general/02_language.dm
@@ -16,7 +16,7 @@
var/datum/species/S = GLOB.all_species[pref.species]
if(!istype(S))
return
-
+
if(pref.alternate_languages.len > S.num_alternate_languages)
pref.alternate_languages.len = S.num_alternate_languages // Truncate to allowed length
diff --git a/code/modules/mob/living/simple_mob/subtypes/animal/_animal_harness.dm b/code/modules/mob/living/simple_mob/subtypes/animal/_animal_harness.dm
index 856055b7f7..2833c3caf9 100644
--- a/code/modules/mob/living/simple_mob/subtypes/animal/_animal_harness.dm
+++ b/code/modules/mob/living/simple_mob/subtypes/animal/_animal_harness.dm
@@ -4,6 +4,8 @@
color = COLOR_BEASTY_BROWN
max_w_class = ITEMSIZE_LARGE
max_storage_space = INVENTORY_STANDARD_SPACE
+ icon_state = "harness"
+ icon = 'icons/mob/drake_harness.dmi'
/// Null, or a list of (/obj/item/foo = "item key"), or (/path = ("item key", proc/handler)).
var/list/attachable_types
diff --git a/code/modules/mob/living/simple_mob/subtypes/animal/animal.dm b/code/modules/mob/living/simple_mob/subtypes/animal/animal.dm
index b37b5da8ea..5074c18622 100644
--- a/code/modules/mob/living/simple_mob/subtypes/animal/animal.dm
+++ b/code/modules/mob/living/simple_mob/subtypes/animal/animal.dm
@@ -35,6 +35,7 @@
/mob/living/simple_mob/animal/get_examine_desc()
return flavor_text || desc
+
/mob/living/simple_mob/animal/verb/set_flavour_text()
set name = "Set Flavour Text"
set category = "IC"
diff --git a/code/modules/mob/living/simple_mob/subtypes/animal/sif/grafadreka/grafadreka.dm b/code/modules/mob/living/simple_mob/subtypes/animal/sif/grafadreka/grafadreka.dm
index 4a118ddb84..0f9ae20ca7 100644
--- a/code/modules/mob/living/simple_mob/subtypes/animal/sif/grafadreka/grafadreka.dm
+++ b/code/modules/mob/living/simple_mob/subtypes/animal/sif/grafadreka/grafadreka.dm
@@ -1,10 +1,9 @@
/mob/living/simple_mob/animal/sif/grafadreka
name = "grafadreka"
desc = "A large, sleek snow drake with heavy claws, powerful jaws and many pale spines along its body."
- player_msg = "You are a large Sivian pack predator in symbiosis with the local bioluminescent bacteria. You can eat glowing \
- tree fruit to fuel your ranged spitting attack and poisonous bite (on harm intent), as well as healing saliva \
- (on help intent).
There are humans moving through your territory; whether you help them get home safely, or treat them as a snack, \
- is up to you."
+ player_msg = {"You are a large Sivian pack predator.
+There are humans moving through your territory; whether you help them get home safely, or treat them as a snack, is up to you.
+You can eat glowing tree fruit to fuel your ranged spitting attack and poisonous bite (on harm intent), as well as healing saliva (on help intent)."}
color = "#608894"
icon = 'icons/mob/drake_adult.dmi'
catalogue_data = list(/datum/category_item/catalogue/fauna/grafadreka)
@@ -96,7 +95,13 @@
/// A convenience value for whether this drake is the trained subtype.
var/trained_drake = FALSE
+ var/list/understands_languages
+// universal_understand is buggy and produces double lines, so we'll just do this hack instead.
+/mob/living/simple_mob/animal/sif/grafadreka/say_understands(mob/other, datum/language/speaking)
+ if (!speaking || (speaking.name in understands_languages))
+ return TRUE
+ return ..()
/mob/living/simple_mob/animal/sif/grafadreka/Initialize()
charisma = rand(5, 15)
diff --git a/code/modules/mob/living/simple_mob/subtypes/animal/sif/grafadreka/grafadreka_harness.dm b/code/modules/mob/living/simple_mob/subtypes/animal/sif/grafadreka/grafadreka_harness.dm
index 8f2c7a92af..039e29964a 100644
--- a/code/modules/mob/living/simple_mob/subtypes/animal/sif/grafadreka/grafadreka_harness.dm
+++ b/code/modules/mob/living/simple_mob/subtypes/animal/sif/grafadreka/grafadreka_harness.dm
@@ -8,6 +8,7 @@
var/const/ATTACHED_RADIO = "radio"
var/const/ATTACHED_ARMOR = "armor plate"
var/const/ATTACHED_LIGHT = "light"
+ var/const/ATTACHED_ID = "access card"
/// An attachable_types list shared between drake harness instances.
var/static/list/grafadreka_attachable_types = list(
@@ -21,9 +22,14 @@
ATTACHED_ARMOR,
/obj/item/storage/internal/animal_harness/grafadreka/proc/UpdateArmor
),
+ /obj/item/card/id = ATTACHED_ID,
/obj/item/flashlight = ATTACHED_LIGHT
)
+/obj/item/storage/internal/animal_harness/grafadreka/GetIdCard()
+ return attached_items[ATTACHED_ID]
+
+
/obj/item/storage/internal/animal_harness/grafadreka/Destroy()
attachable_types = null
return ..()
@@ -60,36 +66,3 @@
/obj/item/storage/mre/menu13
))
new mre_type (src)
-
-
-// Station/Science drake harness contents on spawn
-/obj/item/storage/internal/animal_harness/grafadreka/expedition/CreateAttachments()
- var/mob/living/owner = loc
- if (!istype(owner))
- return
- attached_items[ATTACHED_RADIO] = new /obj/item/radio (owner)
- new /obj/item/stack/medical/bruise_pack (src)
- new /obj/item/stack/medical/ointment (src)
- new /obj/item/storage/mre/menu13 (src) // The good stuff
- var/obj/item/gps/explorer/on/gps = new (owner)
- gps.SetTag(owner.name)
- attached_items[ATTACHED_GPS] = gps
- attached_items[ATTACHED_LIGHT] = new /obj/item/flashlight/glowstick/grafadreka (owner)
-
-
-
-/obj/item/flashlight/glowstick/grafadreka
- name = "high duration glowstick"
- action_button_name = null
-
-
-/obj/item/flashlight/glowstick/grafadreka/Initialize()
- . = ..()
- var/obj/item/flashlight/glowstick/archetype = pick(typesof(/obj/item/flashlight/glowstick) - type)
- flashlight_colour = initial(archetype.flashlight_colour)
- icon_state = initial(archetype.icon_state)
- item_state = initial(archetype.item_state)
- fuel = rand(3200, 4800)
- on = TRUE
- update_icon()
- START_PROCESSING(SSobj, src)
diff --git a/code/modules/mob/living/simple_mob/subtypes/animal/sif/grafadreka/grafadreka_hatchling.dm b/code/modules/mob/living/simple_mob/subtypes/animal/sif/grafadreka/grafadreka_hatchling.dm
index 99297698de..8d21001ccf 100644
--- a/code/modules/mob/living/simple_mob/subtypes/animal/sif/grafadreka/grafadreka_hatchling.dm
+++ b/code/modules/mob/living/simple_mob/subtypes/animal/sif/grafadreka/grafadreka_hatchling.dm
@@ -3,6 +3,11 @@
icon = 'icons/mob/drake_baby.dmi'
mob_size = MOB_SMALL
desc = "An immature snow drake, not long out of the shell."
+
+ player_msg = {"You are a very small Sivian pack predator.
+The Sivian forest is dark and full of terrors, and you are young and weak. Try to stay alive.
+You can eat glowing tree fruit to fuel your ranged spitting attack and poisonous bite (on harm intent), as well as healing saliva (on help intent)."}
+
is_baby = TRUE
offset_compiled_icon = null
diff --git a/code/modules/mob/living/simple_mob/subtypes/animal/sif/grafadreka/grafadreka_misc.dm b/code/modules/mob/living/simple_mob/subtypes/animal/sif/grafadreka/grafadreka_misc.dm
index 0b6668009e..f3e05ded4a 100644
--- a/code/modules/mob/living/simple_mob/subtypes/animal/sif/grafadreka/grafadreka_misc.dm
+++ b/code/modules/mob/living/simple_mob/subtypes/animal/sif/grafadreka/grafadreka_misc.dm
@@ -106,17 +106,6 @@ Field studies suggest analytical abilities on par with some species of cepholapo
weaken = 0
eyeblur = 2
-
-/obj/structure/animal_den/ghost_join/grafadreka
- name = "drake den"
- critter = /mob/living/simple_mob/animal/sif/grafadreka
-
-
-/obj/structure/animal_den/ghost_join/grafadreka_hatchling
- name = "drake hatchling den"
- critter = /mob/living/simple_mob/animal/sif/grafadreka/hatchling
-
-
/mob/living/simple_mob/animal/sif/grafadreka/rainbow/setup_colours()
glow_colour = get_random_colour(TRUE)
fur_colour = get_random_colour(TRUE)
diff --git a/code/modules/mob/living/simple_mob/subtypes/animal/sif/grafadreka/grafadreka_trained.dm b/code/modules/mob/living/simple_mob/subtypes/animal/sif/grafadreka/grafadreka_trained.dm
index a0e834c60d..5002a5307c 100644
--- a/code/modules/mob/living/simple_mob/subtypes/animal/sif/grafadreka/grafadreka_trained.dm
+++ b/code/modules/mob/living/simple_mob/subtypes/animal/sif/grafadreka/grafadreka_trained.dm
@@ -1,9 +1,9 @@
/mob/living/simple_mob/animal/sif/grafadreka/trained
- desc = "A large, sleek snow drake with heavy claws, powerful jaws and many pale spines along its body. This one is wearing some kind of harness; maybe it belongs to someone."
- player_msg = "You are a large Sivian pack predator in symbiosis with the local bioluminescent bacteria. You can eat glowing \
- tree fruit to fuel your ranged spitting attack and poisonous bite (on harm intent), as well as healing saliva \
- (on help intent).
Using grab intent you can pick up and drop items on by clicking them or yourself, \
- and can interact with some simple machines like buttons and levers.
Unlike your wild kin, you are trained and work happily with your two-legged packmates."
+ desc = "A sleek snow drake with heavy claws, powerful jaws and many sharp spines along its body. This one is wearing some kind of harness; maybe it belongs to someone."
+ player_msg = {"You are a large Sivian pack predator.
+Unlike your wild kin, you are trained and work happily with your two-legged packmates.
+You can eat glowing tree fruit to fuel your ranged spitting attack and poisonous bite (on harm intent), as well as healing saliva (on help intent).
+Using grab intent you can pick up and drop items by clicking them or yourself, and can interact with some simple machines like buttons and levers."}
faction = "station"
ai_holder_type = null // These guys should not exist without players.
gender = PLURAL // Will take gender from prefs = set to non-NEUTER here to avoid randomizing in Initialize().
@@ -11,6 +11,10 @@
dexterity = MOB_DEXTERITY_SIMPLE_MACHINES
harness = /obj/item/storage/internal/animal_harness/grafadreka/trained
trained_drake = TRUE
+ understands_languages = list(
+ LANGUAGE_GALCOM,
+ LANGUAGE_SIVIAN
+ )
/// On clicking with an item, stuff that should use behaviors instead of being placed in storage.
var/static/list/allow_type_to_pass = list(
@@ -19,23 +23,21 @@
/obj/item/reagent_containers/syringe
)
- var/static/list/trained_drake_languages = list(
- LANGUAGE_GALCOM,
- LANGUAGE_SIVIAN
- )
-
-
/mob/living/simple_mob/animal/sif/grafadreka/trained/Destroy()
if (istype(harness))
QDEL_NULL(harness)
return ..()
+/mob/living/simple_mob/animal/sif/grafadreka/trained/GetIdCard()
+ return harness?.GetIdCard()
+
+
/mob/living/simple_mob/animal/sif/grafadreka/trained/add_glow()
. = ..()
if (. && harness)
var/image/I = .
- I.icon_state = "[I.icon_state]-pannier"
+ I.icon_state = "[I.icon_state]-[harness.icon_state]"
/mob/living/simple_mob/animal/sif/grafadreka/trained/Logout()
@@ -61,17 +63,10 @@
return harness.handle_attack_hand(user)
-// universal_understand is buggy and produces double lines, so we'll just do this hack instead.
-/mob/living/simple_mob/animal/sif/grafadreka/trained/say_understands(mob/other, datum/language/speaking)
- if (!speaking || (speaking.name in trained_drake_languages))
- return TRUE
- return ..()
-
-
/mob/living/simple_mob/animal/sif/grafadreka/trained/update_icon()
. = ..()
if (harness)
- var/image/I = image(icon, "[current_icon_state]-pannier")
+ var/image/I = image(harness.icon, "[current_icon_state]-[harness.icon_state]")
I.color = harness.color
I.appearance_flags |= (RESET_COLOR|PIXEL_SCALE|KEEP_APART)
if (offset_compiled_icon)
diff --git a/code/modules/reagents/reagent_containers/syringes.dm b/code/modules/reagents/reagent_containers/syringes.dm
index 6b0a01e89c..abe757b16a 100644
--- a/code/modules/reagents/reagent_containers/syringes.dm
+++ b/code/modules/reagents/reagent_containers/syringes.dm
@@ -352,6 +352,16 @@
mode = SYRINGE_INJECT
update_icon()
+/obj/item/reagent_containers/syringe/bicaridine
+ name = "Syringe (bicaridine)"
+ desc = "Contains bicaridine."
+
+/obj/item/reagent_containers/syringe/bicaridine/Initialize()
+ . = ..()
+ reagents.add_reagent("bicaridine", 15)
+ mode = SYRINGE_INJECT
+ update_icon()
+
/obj/item/reagent_containers/syringe/antiviral
name = "Syringe (spaceacillin)"
desc = "Contains antiviral agents."
diff --git a/icons/mob/drake_adult.dmi b/icons/mob/drake_adult.dmi
index 4d797a9c41..9a21b50bbc 100644
Binary files a/icons/mob/drake_adult.dmi and b/icons/mob/drake_adult.dmi differ
diff --git a/icons/mob/drake_harness.dmi b/icons/mob/drake_harness.dmi
new file mode 100644
index 0000000000..a9de55e0c7
Binary files /dev/null and b/icons/mob/drake_harness.dmi differ
diff --git a/maps/cynosure/cynosure-2.dmm b/maps/cynosure/cynosure-2.dmm
index 64f1349f58..f9a03efa9a 100644
--- a/maps/cynosure/cynosure-2.dmm
+++ b/maps/cynosure/cynosure-2.dmm
@@ -11814,14 +11814,10 @@
/turf/simulated/floor/tiled,
/area/surface/station/security/lockerroom)
"fpa" = (
-/obj/effect/floor_decal/steeldecal/steel_decals5{
- dir = 4
+/obj/structure/dogbed,
+/obj/effect/landmark/start{
+ name = "Trained Drake"
},
-/obj/effect/floor_decal/steeldecal/steel_decals6,
-/obj/effect/floor_decal/steeldecal/steel_decals6{
- dir = 4
- },
-/obj/machinery/recharge_station,
/turf/simulated/floor/tiled/techmaint,
/area/surface/station/garage)
"fpB" = (
@@ -14053,6 +14049,9 @@
/obj/effect/landmark/start{
name = "Survivalist"
},
+/obj/effect/landmark/start{
+ name = "Trained Drake"
+ },
/turf/simulated/floor/outdoors/mask,
/area/surface/outside/plains/normal)
"gve" = (
@@ -19334,6 +19333,12 @@
},
/turf/simulated/floor/tiled/steel_grid,
/area/surface/station/rnd/hallway/stairwell)
+"jaH" = (
+/obj/effect/floor_decal/steeldecal/steel_decals5{
+ dir = 4
+ },
+/turf/simulated/floor/tiled/techmaint,
+/area/surface/station/garage)
"jaW" = (
/obj/effect/floor_decal/industrial/hatch/yellow,
/obj/machinery/door/airlock/external{
@@ -35869,8 +35874,10 @@
/turf/simulated/floor/tiled/milspec/sterile,
/area/shuttle/large_escape_pod1/station)
"qew" = (
-/obj/structure/table/steel_reinforced,
-/turf/simulated/floor/tiled,
+/obj/effect/floor_decal/industrial/danger{
+ dir = 4
+ },
+/turf/simulated/floor/tiled/techmaint,
/area/surface/station/garage)
"qeP" = (
/obj/machinery/atmospherics/tvalve/mirrored/bypass,
@@ -37181,6 +37188,14 @@
},
/turf/simulated/floor/carpet,
/area/surface/station/library)
+"qCU" = (
+/obj/structure/dogbed,
+/obj/effect/landmark/start{
+ name = "Trained Drake"
+ },
+/obj/item/reagent_containers/food/snacks/xenomeat/spidermeat,
+/turf/simulated/floor/tiled/techmaint,
+/area/surface/station/garage)
"qCW" = (
/obj/effect/floor_decal/industrial/warning{
dir = 8
@@ -40457,6 +40472,9 @@
/obj/effect/landmark/start{
name = "Survivalist"
},
+/obj/effect/landmark/start{
+ name = "Trained Drake"
+ },
/turf/simulated/floor/outdoors/dirt/sif,
/area/surface/outpost/checkpoint)
"scm" = (
@@ -42356,18 +42374,6 @@
/turf/simulated/floor/tiled,
/area/surface/station/hallway/primary/groundfloor/east)
"sXq" = (
-/obj/effect/floor_decal/borderfloor{
- dir = 1
- },
-/obj/effect/floor_decal/industrial/danger{
- dir = 1
- },
-/obj/effect/floor_decal/borderfloor/corner{
- dir = 8
- },
-/obj/effect/floor_decal/corner/green/bordercorner{
- dir = 8
- },
/turf/simulated/floor/tiled/techmaint,
/area/surface/station/garage)
"sXx" = (
@@ -51949,9 +51955,10 @@
/turf/simulated/floor/plating,
/area/surface/station/ai/upload)
"xwh" = (
-/obj/machinery/mech_recharger,
-/obj/effect/landmark/robot_platform/explorer,
-/turf/simulated/floor/tiled/dark,
+/obj/structure/table/steel_reinforced,
+/obj/item/reagent_containers/syringe/bicaridine,
+/obj/item/book/manual/drake_handling,
+/turf/simulated/floor/tiled/techmaint,
/area/surface/station/garage)
"xxc" = (
/obj/effect/floor_decal/corner/white/diagonal,
@@ -82222,7 +82229,7 @@ nCe
sSy
ufW
fpa
-sXq
+fDL
kYh
mLL
aOC
@@ -82479,9 +82486,9 @@ nCe
alv
ufW
xwh
-kqo
-vFY
-vFY
+sXq
+sXq
+sXq
lze
aOr
syY
@@ -82735,10 +82742,10 @@ nCe
nCe
cPd
seC
-esv
-kqo
-qBQ
-vQG
+qCU
+sXq
+jaH
+jaH
qZC
kPd
piz
@@ -82993,9 +83000,9 @@ twu
fIk
xUd
qew
-kqo
-vFY
-vFY
+sXq
+qBQ
+vQG
mbv
kPd
kPd
@@ -83251,8 +83258,8 @@ jmX
seC
uFA
kqo
-qBQ
-iaO
+vFY
+vFY
fDL
dzm
huS
@@ -83508,8 +83515,8 @@ fIk
ufW
tdK
kqo
-vFY
-vFY
+qBQ
+iaO
mjO
uBH
mtC
diff --git a/maps/cynosure/cynosure-7.dmm b/maps/cynosure/cynosure-7.dmm
index d3c8493065..c2495e65f3 100644
--- a/maps/cynosure/cynosure-7.dmm
+++ b/maps/cynosure/cynosure-7.dmm
@@ -274,6 +274,9 @@
/obj/effect/landmark/start{
name = "Survivalist"
},
+/obj/effect/landmark/start{
+ name = "Trained Drake"
+ },
/turf/simulated/floor/wood/sif,
/area/surface/wilderness/shack)
"Mf" = (
diff --git a/maps/cynosure/cynosure_jobs.dm b/maps/cynosure/cynosure_jobs.dm
index f8067fcbce..1860bf1a51 100644
--- a/maps/cynosure/cynosure_jobs.dm
+++ b/maps/cynosure/cynosure_jobs.dm
@@ -1,5 +1,4 @@
#define CRASH_SURVIVOR_TITLE "Crash Survivor"
-#define DRAKE_SURVIVOR_TITLE "Tamed Drake"
// Pilots
@@ -87,11 +86,7 @@ var/global/const/access_explorer = 43
offmap_spawn = TRUE
substitute_announce_title = "Colonist"
banned_job_species = null
- announce_arrival_and_despawn = FALSE
- alt_titles = list(
- CRASH_SURVIVOR_TITLE = /datum/alt_title/crash_survivor,
- DRAKE_SURVIVOR_TITLE = /datum/alt_title/working_drake
- )
+ alt_titles = list(CRASH_SURVIVOR_TITLE = /datum/alt_title/crash_survivor)
var/const/SPAWN_DAMAGE_MULT = 0.15
var/const/TOTAL_INJURIES = 3
var/static/list/pod_templates = list(
@@ -111,11 +106,6 @@ var/global/const/access_explorer = 43
title_blurb = "Crashing in the wilderness of Sif's anomalous region is not a recommended holiday activity."
title_outfit = /decl/hierarchy/outfit/job/survivalist/crash_survivor
-/datum/alt_title/working_drake
- title = DRAKE_SURVIVOR_TITLE
- title_outfit = /decl/hierarchy/outfit/siffet
- title_blurb = "Some of the bolder colonists in Sif's anomalous region have partially domesticated some of the the local predators as working animals."
-
/datum/job/survivalist/equip(mob/living/carbon/human/H, alt_title)
. = ..()
if(.)
@@ -209,54 +199,111 @@ var/global/const/access_explorer = 43
existing_points = get_existing_spawn_points()
return existing_points
+#undef CRASH_SURVIVOR_TITLE
-/datum/job/survivalist/handle_nonhuman_mob(var/mob/living/carbon/human/player, var/alt_title)
+/datum/job/trained_animal
+ title = "Trained Drake"
+ departments = list(DEPARTMENT_PLANET)
+ department_flag = CIVILIAN
+ flag = DOGGO
+ selection_color = "#6085a8"
+ total_positions = 2
+ spawn_positions = 1
+ faction = "Station"
+ supervisors = "your conscience"
+ economic_modifier = 1
+ access = list()
+ minimal_access = list()
+ outfit_type = /decl/hierarchy/outfit/siffet
+ job_description = "A number of the bolder folks in Sif's anomalous region have partially domesticated some of the local wildlife as working animals."
+ assignable = FALSE
+ has_headset = FALSE
+ account_allowed = FALSE
+ offmap_spawn = TRUE
+ announce_arrival_and_despawn = FALSE
+ banned_job_species = null
- if(alt_title == DRAKE_SURVIVOR_TITLE)
+ alt_titles = list(
+ "Expedition Drake" = /datum/alt_title/drake/explorer_drake,
+ "Wild Drake" = /datum/alt_title/drake/wild_drake,
+ "Wild Hatchling" = /datum/alt_title/drake/wild_hatchling
+ )
- var/mob/living/simple_mob/animal/sif/grafadreka/trained/doggo = new(player.loc)
+/datum/alt_title/drake
+ title = "Trained Drake"
+ title_blurb = "A number of the bolder folks in Sif's anomalous region have partially domesticated some of the local wildlife as working animals."
+ var/drake_type = /mob/living/simple_mob/animal/sif/grafadreka/trained
- // Copy over some prefs.
- if(player.client && player.client.prefs)
+/datum/alt_title/drake/explorer_drake
+ title = "Expedition Drake"
+ title_blurb = "The Cynosure Xenobiology department has spearheaded an effort to train some of the intelligent local wildlife to assist with Exploration field operations."
+ drake_type = /mob/living/simple_mob/animal/sif/grafadreka/trained/station
- var/datum/preferences/P = player.client.prefs
- doggo.gender = P.identifying_gender
- doggo.flavor_text = LAZYACCESS(P.flavor_texts, "general")
+/datum/alt_title/drake/wild_drake
+ title = "Wild Drake"
+ title_blurb = "Several packs of wild grafadreka have been pushed into the Anomalous Region by changing climate and rough weather, and sometimes come into contact with the locals."
+ drake_type = /mob/living/simple_mob/animal/sif/grafadreka
+/datum/alt_title/drake/wild_hatchling
+ title = "Wild Hatchling"
+ title_blurb = "Wild grafadreka are not particularly good parents, and their hatchlings often wander away or are abandoned to their own devices."
+ drake_type = /mob/living/simple_mob/animal/sif/grafadreka/hatchling
+
+/datum/job/trained_animal/handle_nonhuman_mob(var/mob/living/carbon/human/player, var/alt_title)
+
+ var/datum/alt_title/drake/drake_setup = alt_titles[alt_title] || /datum/alt_title/drake
+ var/drake_type = istype(drake_setup) ? drake_setup.drake_type : initial(drake_setup.drake_type)
+ var/mob/living/critter = new drake_type(player.loc)
+
+ // Copy over some prefs.
+ if(player.client && player.client.prefs)
+
+ // Set various strings and preference-loaded values.
+ var/datum/preferences/P = player.client.prefs
+ critter.gender = P.identifying_gender
+ critter.flavor_text = LAZYACCESS(P.flavor_texts, "general")
+
+ if(player.mind)
+ critter.name = player.mind.name
+ critter.real_name = critter.name
+
+ if(istype(critter, /mob/living/simple_mob/animal/sif/grafadreka))
+ var/mob/living/simple_mob/animal/sif/grafadreka/drake = critter
// Protect against unset defaults creating a drake-shaped void.
var/col = rgb(P.r_eyes, P.g_eyes, P.b_eyes)
if(col != COLOR_BLACK)
- doggo.eye_colour = col
+ drake.eye_colour = col
col = rgb(P.r_facial, P.g_facial, P.b_facial)
if(col != COLOR_BLACK)
- doggo.fur_colour = col
+ drake.fur_colour = col
col = rgb(P.r_hair, P.g_hair, P.b_hair)
if(col != COLOR_BLACK)
- doggo.base_colour = col
- doggo.update_icon()
+ drake.base_colour = col
+ drake.update_icon()
+
+ for(var/language in P.alternate_languages)
+ LAZYDISTINCTADD(drake.understands_languages, language)
+
+ var/obj/item/storage/internal/animal_harness/grafadreka/harness = drake.harness
+ if (istype(harness))
+ var/obj/item/gps/gps = harness.attached_items[harness.ATTACHED_GPS]
+ if (gps)
+ gps.SetTag(drake.name)
// Transfer over key.
if(player.mind)
- doggo.name = player.mind.name
- doggo.real_name = doggo.name
- player.mind.transfer_to(doggo)
- doggo.mind.original = doggo
+ player.mind.transfer_to(critter)
+ critter.mind.original = critter
else
- doggo.key = player.key
+ critter.key = player.key
+ qdel(player)
// Pass the mob back.
- qdel(player)
- prompt_rename(doggo)
- var/obj/item/storage/internal/animal_harness/grafadreka/harness = doggo.harness
- if (!istype(harness))
- return doggo
- var/obj/item/gps/gps = harness.attached_items[harness.ATTACHED_GPS]
- if (gps)
- gps.SetTag(doggo.name)
- return doggo
+ prompt_rename(critter)
+ return critter
- return ..()
-/datum/job/survivalist/proc/prompt_rename(var/mob/player)
+
+/datum/job/trained_animal/proc/prompt_rename(var/mob/player)
set waitfor = FALSE
sleep(1 SECOND)
@@ -273,5 +320,98 @@ var/global/const/access_explorer = 43
if(player.mind)
player.mind.name = player.real_name
-#undef CRASH_SURVIVOR_TITLE
-#undef DRAKE_SURVIVOR_TITLE
+
+/obj/item/card/id/drake_expedition
+ name = "animal access card"
+ access = list(access_explorer, access_research)
+
+
+/obj/item/storage/internal/animal_harness/grafadreka/expedition
+ name = "expedition harness"
+ color = null
+ icon_state = "explorer"
+
+
+/obj/item/flashlight/glowstick/grafadreka
+ name = "high duration glowstick"
+ action_button_name = null
+
+
+/obj/item/flashlight/glowstick/grafadreka/Initialize()
+ . = ..()
+ var/obj/item/flashlight/glowstick/archetype = pick(typesof(/obj/item/flashlight/glowstick) - type)
+ flashlight_colour = initial(archetype.flashlight_colour)
+ icon_state = initial(archetype.icon_state)
+ item_state = initial(archetype.item_state)
+ fuel = rand(3200, 4800)
+ on = TRUE
+ update_icon()
+ START_PROCESSING(SSobj, src)
+
+
+// Station/Science drake harness contents on spawn
+/obj/item/storage/internal/animal_harness/grafadreka/expedition/CreateAttachments()
+ var/mob/living/owner = loc
+ if(!istype(owner))
+ return
+ attached_items[ATTACHED_ID] = new /obj/item/card/id/drake_expedition (owner)
+ attached_items[ATTACHED_RADIO] = new /obj/item/radio (owner)
+ new /obj/item/stack/medical/bruise_pack (src)
+ new /obj/item/stack/medical/ointment (src)
+ new /obj/item/storage/mre/menu13 (src) // The good stuff
+ var/obj/item/gps/explorer/on/gps = new (owner)
+ gps.SetTag(owner.name)
+ attached_items[ATTACHED_GPS] = gps
+ attached_items[ATTACHED_LIGHT] = new /obj/item/flashlight/glowstick/grafadreka (owner)
+
+
+/mob/living/simple_mob/animal/sif/grafadreka/trained/station
+ player_msg = {"You are a large Sivian pack predator working with the Science team.
+You have been trained by the Xenobiology department to assist with expeditions and field work, and are an official part of the Exploration staff."
+You can eat glowing tree fruit to fuel your ranged spitting attack and poisonous bite (on harm intent), as well as healing saliva (on help intent).
+Using grab intent you can pick up and drop items by clicking them or yourself, and can interact with some simple machines like buttons and levers."}
+ harness = /obj/item/storage/internal/animal_harness/grafadreka/expedition
+
+/obj/item/book/manual/drake_handling
+ name = "Care And Handling Of The Sivian Snow Drake v0.1.12b"
+ icon_state = "book3"
+ author = "Xenoscience Team"
+ title = "Care And Handling Of The Sivian Snow Drake v0.1.12b"
+
+/obj/item/book/manual/drake_handling/Initialize()
+ . = ..()
+ dat = {"
+
This seems to be a notebook full of handwritten notes, loosely organized by topic. There's a crude index scribbled on the inside of the cover, but it's not very useful.
+Grafadreka (drakes) are actually pretty timid and easily spooked despite their size and appearance. In the wild, they hunt in groups and will hit and run using their stunning spit, avoiding direct engagement unless given no other option. They seem to have an inherent social structure, with a dominant packmember taking the lead but the pack as a whole working as a team. May be useful for training?
+Instinctive aggression towards spiders & smaller Sivian wildlife - can be trained out of them with difficulty. Wild populations can live entirely off spider meat or carrion.
+Quite social animals - will seek out humans or other creatures in the absence of packmembers just for company. Very food motivated! Seem to enjoy working with personnel out in the field or hanging out in social areas like the bar.
+Egg-layers - nests of 1-3 eggs in caves north of Cynosure - influenced by different environment? Terrible parents, hatchlings always wandering off & getting eaten by spiders.
+Signal training very successful - almost every drake responds positively to audible cues like summon whistles, vocal cues like 'up' and 'down' - strong indicators of language understanding.
+Can be encouraged to be careful with spitting - related to pack hunting instincts? - not always reliable.
+Good visual memory, can be trained to seek out specific kinds of object with vocal cues - implies use of tools could be trainable if they had better manual dexterity.
+Can understand buttons/levers, door panels, access cards and automatic doors.
+