Skip to content

Commit

Permalink
DOG INCOMING!
Browse files Browse the repository at this point in the history
  • Loading branch information
blackdragonTOW committed Jun 17, 2024
1 parent 05f7bf1 commit d039ce1
Show file tree
Hide file tree
Showing 45 changed files with 530 additions and 5 deletions.
1 change: 1 addition & 0 deletions code/__DEFINES/human.dm
Original file line number Diff line number Diff line change
Expand Up @@ -191,6 +191,7 @@
#define SYNTH_GEN_ONE "First Generation Synthetic"
#define SYNTH_GEN_TWO "Second Generation Synthetic"
#define SYNTH_GEN_THREE "Third Generation Synthetic"
#define SYNTH_K9 "Synthetic K9"

#define PLAYER_SYNTHS list(SYNTH_GEN_ONE, SYNTH_GEN_TWO, SYNTH_GEN_THREE)
#define SYNTH_TYPES list(SYNTH_COLONY, SYNTH_COLONY_GEN_ONE, SYNTH_COLONY_GEN_TWO, SYNTH_COMBAT, SYNTH_INFILTRATOR, SYNTH_WORKING_JOE, SYNTH_GEN_ONE, SYNTH_GEN_TWO, SYNTH_GEN_THREE)
Expand Down
1 change: 1 addition & 0 deletions code/__DEFINES/job.dm
Original file line number Diff line number Diff line change
Expand Up @@ -65,6 +65,7 @@ GLOBAL_LIST_INIT(job_squad_roles, JOB_SQUAD_ROLES_LIST)
#define JOB_COMBAT_REPORTER "Combat Correspondent"
#define JOB_MESS_SERGEANT "Mess Technician"
#define JOB_SYNTH "Synthetic"
#define JOB_SYNTH_K9 "Synthetic K9"
#define JOB_WORKING_JOE "Working Joe"

#define JOB_CO "Commanding Officer"
Expand Down
2 changes: 2 additions & 0 deletions code/__DEFINES/mobs.dm
Original file line number Diff line number Diff line change
Expand Up @@ -217,6 +217,7 @@
#define SPECIAL_BONEBREAK (1<<13) //species do not get their bonebreak chance modified by endurance
#define NO_SHRAPNEL (1<<14)
#define HAS_HARDCRIT (1<<15)
#define NO_OVERLAYS (1<<16) // Stop OnMob overlays from appearing on sprite

//=================================================

Expand Down Expand Up @@ -345,6 +346,7 @@ GLOBAL_LIST_INIT(default_xeno_onmob_icons, list(
#define SPECIES_HUMAN "Human"
#define SPECIES_YAUTJA "Yautja"
#define SPECIES_SYNTHETIC "Synthetic"
#define SPECIES_SYNTHETIC_K9 "Synthetic K9"
#define SPECIES_MONKEY "Monkey"
#define SPECIES_ZOMBIE "Zombie"

Expand Down
3 changes: 3 additions & 0 deletions code/__DEFINES/paygrade_defs/marines.dm
Original file line number Diff line number Diff line change
Expand Up @@ -78,3 +78,6 @@

/// MO10S, Commandant of the Marine Corps
#define PAY_SHORT_MO10S "MO10S"

/// SYN_K9, Synthetic K9
#define PAY_SHORT_SYN_K9 "K9"
6 changes: 5 additions & 1 deletion code/datums/factions/uscm.dm
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,9 @@
if(JOB_SQUAD_ENGI) marine_rk = "engi"
if(JOB_SQUAD_SPECIALIST) marine_rk = "spec"
if(JOB_SQUAD_TEAM_LEADER) marine_rk = "tl"
if(JOB_SQUAD_MEDIC) marine_rk = "med"
if(JOB_SQUAD_MEDIC)
if(current_human.rank_fallback == "medk9") marine_rk = "medk9" //We don't need Medics to lose their job when converting to K9 Handlers as it would duplicate JOB_SQUAD_MEDIC
else marine_rk = "med"
if(JOB_SQUAD_SMARTGUN) marine_rk = "gun"
if(JOB_XO) marine_rk = "xo"
if(JOB_CO) marine_rk = "co"
Expand Down Expand Up @@ -127,6 +129,8 @@
border_rk = "command"
if(JOB_SYNTH)
marine_rk = "syn"
if(JOB_SYNTH_K9)
marine_rk = "syn_k9"
if(JOB_MESS_SERGEANT)
marine_rk = "messtech"
// Provost
Expand Down
10 changes: 10 additions & 0 deletions code/datums/paygrades/factions/uscm/marine.dm
Original file line number Diff line number Diff line change
Expand Up @@ -231,3 +231,13 @@
ranking = 25
pay_multiplier = 7
officer_grade = GRADE_FLAG

//Historical Background: Combat Dogs were given the lowest officer rank possible, they have no notional command but if someone were to abuse the animal, the offender could be charged with assaulting an officer.
/datum/paygrade/marine/k9
paygrade = PAY_SHORT_SYN_K9
name = "Second Lieutenant Combat Lifesaver"
prefix = "2ndLt Combat Lifesaver"
rank_pin = /obj/item/clothing/accessory/ranks/marine/o1
ranking = 12
pay_multiplier = 1
officer_grade = GRADE_OFFICER
25 changes: 25 additions & 0 deletions code/datums/skills/synthetic.dm
Original file line number Diff line number Diff line change
Expand Up @@ -88,3 +88,28 @@ SYNTHETIC
SKILL_DOMESTIC = SKILL_DOMESTIC_MASTER,
SKILL_ANTAG = SKILL_ANTAG_AGENT,
)

/datum/skills/synth_k9
name = "Synthetic K9"
skills = list(
SKILL_CQC = SKILL_CQC_MASTER,
SKILL_ENGINEER = SKILL_ENGINEER_DEFAULT,
SKILL_CONSTRUCTION = SKILL_CONSTRUCTION_DEFAULT,
SKILL_FIREARMS = SKILL_FIREARMS_CIVILIAN,
SKILL_SPEC_WEAPONS = SKILL_SPEC_ALL,
SKILL_LEADERSHIP = SKILL_LEAD_NOVICE,
SKILL_OVERWATCH = SKILL_OVERWATCH_DEFAULT,
SKILL_MEDICAL = SKILL_MEDICAL_MASTER,
SKILL_SURGERY = SKILL_SURGERY_DEFAULT,
SKILL_RESEARCH = SKILL_RESEARCH_DEFAULT,
SKILL_MELEE_WEAPONS = SKILL_MELEE_SUPER,
SKILL_PILOT = SKILL_PILOT_EXPERT,
SKILL_POLICE = SKILL_POLICE_SKILLED,
SKILL_FIREMAN = SKILL_FIREMAN_MAX,
SKILL_POWERLOADER = SKILL_POWERLOADER_DEFAULT,
SKILL_VEHICLE = SKILL_VEHICLE_DEFAULT,
SKILL_JTAC = SKILL_JTAC_NOVICE,
SKILL_INTEL = SKILL_INTEL_NOVICE,
SKILL_DOMESTIC = SKILL_DOMESTIC_MASTER,
SKILL_NAVIGATIONS = SKILL_NAVIGATIONS_DEFAULT,
)
28 changes: 28 additions & 0 deletions code/game/machinery/vending/vendor_types/crew/k9_synth.dm
Original file line number Diff line number Diff line change
@@ -0,0 +1,28 @@
/obj/structure/machinery/cm_vending/clothing/k9_synth
name = "\improper Wey-Yu Synthetic K9 Equipment Requisitions"
desc = "An automated equipment vendor for Synthetic K9s."
show_points = FALSE
req_access = list(ACCESS_MARINE_SYNTH)
vendor_role = list(JOB_SYNTH_K9)

/obj/structure/machinery/cm_vending/clothing/k9_synth/get_listed_products(mob/user)
return GLOB.cm_vending_clothing_k9_synth

//------------GEAR---------------

GLOBAL_LIST_INIT(cm_vending_clothing_k9_synth, list(
list("STANDARD EQUIPMENT (TAKE ALL)", 0, null, null, null),
list("Headset", 0, /obj/item/device/radio/headset/almayer/mcom/synth, MARINE_CAN_BUY_EAR, VENDOR_ITEM_MANDATORY),
list("K9 Serial ID Tags", 0, /obj/item/clothing/under/rank/synthetic/synth_k9, MARINE_CAN_BUY_UNIFORM, VENDOR_ITEM_MANDATORY),
list("Name Changer", 0, /obj/item/k9_name_changer/, MARINE_CAN_BUY_ACCESSORY, VENDOR_ITEM_MANDATORY),

list("HANDLER KIT (CHOOSE 1)", 0, null, null, null),
list("Squad Corpsman -> K9 Handler", 0, /obj/item/storage/box/kit/k9_handler, MARINE_CAN_BUY_ESSENTIALS, VENDOR_ITEM_RECOMMENDED),
list("Military Police -> K9 Handler", 0, /obj/item/storage/box/kit/k9_handler, MARINE_CAN_BUY_ESSENTIALS, VENDOR_ITEM_REGULAR),

list("CARRYPACK (CHOOSE 1)", 0, null, null, null),
list("Medical Carry Harness", 0, /obj/item/storage/backpack/marine/k9_synth/medicalpack, MARINE_CAN_BUY_BACKPACK, VENDOR_ITEM_RECOMMENDED),
list("Cargo Carry Harness", 0, /obj/item/storage/backpack/marine/k9_synth/cargopack, MARINE_CAN_BUY_BACKPACK, VENDOR_ITEM_REGULAR),
list("MP Carry Harness", 0, /obj/item/storage/backpack/marine/k9_synth/mppack, MARINE_CAN_BUY_BACKPACK, VENDOR_ITEM_REGULAR),

))
2 changes: 2 additions & 0 deletions code/game/objects/items.dm
Original file line number Diff line number Diff line change
Expand Up @@ -162,6 +162,8 @@
var/ground_offset_x = 0
/// How much to offset the item randomly either way alongside Y visually
var/ground_offset_y = 0
/// bypass any species specific OnMob overlay blockers
var/force_overlays_on = FALSE

/obj/item/Initialize(mapload, ...)
. = ..()
Expand Down
32 changes: 32 additions & 0 deletions code/game/objects/items/cosmetics.dm
Original file line number Diff line number Diff line change
Expand Up @@ -146,3 +146,35 @@
sharp = FALSE
edge = FALSE
force = 0

/obj/item/k9_name_changer/
name = "K9 Name Implanter"
desc = "Syncs the implanted W-Y Serial Chip to the unit's prefered name."
icon = 'icons/obj/items/items.dmi'
icon_state = "efundcard"
w_class = SIZE_TINY

/obj/item/k9_name_changer/attack_self(mob/user)
. = ..()
var/newname = capitalize(input(usr, "What do you wish to be named?", "Name:") as null|text)
if(!newname)
return

var/verify = input("Are you SURE you wish to be named: [newname]?") in list("yes","no")

if(verify == "yes")
user.change_real_name(user, newname)
if(istype(user, /mob/living/carbon/human))
var/mob/living/carbon/human/H = user
if(H.wear_id)
H.wear_id.name = "[H.real_name]'s ID Card"
H.wear_id.registered_name = "[H.real_name]"
if(H.wear_id.assignment)
H.wear_id.name += " ([H.wear_id.assignment])"

var/genderswap = input("Which gender?") in list("male","female")

user.gender = genderswap
qdel(src)
else
return
60 changes: 60 additions & 0 deletions code/game/objects/items/devices/scanners.dm
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@ PLANT ANALYZER
MASS SPECTROMETER
REAGENT SCANNER
FORENSIC SCANNER
K9 SCANNER
*/
/obj/item/device/t_scanner
name = "\improper T-ray scanner"
Expand Down Expand Up @@ -476,3 +477,62 @@ FORENSIC SCANNER
flags_atom = FPRINT
flags_equip_slot = SLOT_WAIST
inherent_traits = list(TRAIT_TOOL_TRADEBAND)

/obj/item/device/k9_scanner
name = "\improper K9 Tracking Device"
desc = "A small handheld tool used to track Synthetic K9 helpers, they tend to run off to strange places at inopportune times..."
icon_state = "tracking0"
item_state = "tracking1"
pickup_sound = 'sound/handling/multitool_pickup.ogg'
drop_sound = 'sound/handling/multitool_drop.ogg'
flags_atom = FPRINT
force = 5
w_class = SIZE_TINY
throwforce = 5
throw_range = 15
throw_speed = SPEED_VERY_FAST

matter = list("metal" = 50,"glass" = 20)

var/tracked_k9

/obj/item/device/k9_scanner/attack(mob/attacked_mob as mob, mob/user as mob)
if(!istype(attacked_mob, /mob/living/carbon/human))
to_chat(user, SPAN_BOLDWARNING("ERROR: Cannot Sync To This."))
return
var/mob/living/carbon/human/attacked_human = attacked_mob

if(!istype(attacked_human.species, /datum/species/synthetic/synth_k9))
to_chat(user, SPAN_BOLDWARNING("ERROR: Cannot Sync To This."))
return
//we now know the attacked mob is a k9
tracked_k9 = attacked_mob
icon_state = "tracking1"
to_chat(user, SPAN_BOLDWARNING("[src] Is Now Synced To: [attacked_mob]."))
return

/obj/item/device/k9_scanner/attack_self(mob/user)
. = ..()
if (tracked_k9 == null)
to_chat(user, SPAN_BOLDWARNING("ERROR: No K9 Unit Currently Tracked. Use Scanner on K9 Unit to track them."))
return

var/turf/self_turf = get_turf(src)
var/turf/scanner_turf = get_turf(tracked_k9)
var/area/self_area = get_area(self_turf)
var/area/scanner_area = get_area(scanner_turf)

if(self_turf.z != scanner_turf.z || self_area.fake_zlevel != scanner_area.fake_zlevel)
to_chat(user, SPAN_BOLDWARNING("The [src] lights up: <b>UNABLE TO FIND LINKED K9 UNIT ON THIS LEVEL!<b>"))
playsound(src, 'sound/machines/buzz-sigh.ogg', 15, TRUE)
return

var/dist = get_dist(self_turf, scanner_turf)
var/direction = dir2text(Get_Compass_Dir(self_turf, scanner_turf))
if(dist > 1)
to_chat(user, SPAN_BOLDNOTICE("[src] lights up: [tracked_k9] is <b>'[dist] meters to the [direction]</b>'"))
else
to_chat(user, SPAN_BOLDNOTICE("[src] lights up: <b>--><--</b>"))
playsound(src, 'sound/machines/ping.ogg', 15, TRUE)

return
38 changes: 38 additions & 0 deletions code/game/objects/items/pamphlets.dm
Original file line number Diff line number Diff line change
Expand Up @@ -99,6 +99,44 @@
ID.set_assignment((user.assigned_squad ? (user.assigned_squad.name + " ") : "") + "Spotter")
GLOB.data_core.manifest_modify(user.real_name, WEAKREF(user), "Spotter")

/obj/item/pamphlet/skill/k9_handler
name = "K9 Handler instructional pamphlet"
desc = "A pamphlet used to quickly impart vital knowledge. This one has the image of a Synthetic K9 Rescue unit on it."
icon_state = "pamphlet_k9_handler"
trait = /datum/character_trait/skills/k9_handler
bypass_pamphlet_limit = TRUE

/obj/item/pamphlet/skill/k9_handler/can_use(mob/living/carbon/human/user)
var/species = user.species
if(species == SPECIES_SYNTHETIC_K9)
to_chat(user, SPAN_WARNING("You don't need to use this! Give it to another marine to make them your handler."))
return FALSE

if(user.job != JOB_SQUAD_MEDIC)
to_chat(user, SPAN_WARNING("Only squad corpsmen can use this."))
return

var/obj/item/card/id/ID = user.wear_id
if(!istype(ID)) //not wearing an ID
to_chat(user, SPAN_WARNING("You should wear your ID before doing this."))
return FALSE
if(!ID.check_biometrics(user))
to_chat(user, SPAN_WARNING("You should wear your ID before doing this."))
return FALSE

return ..()

/obj/item/pamphlet/skill/k9_handler/on_use(mob/living/carbon/human/user)
. = ..()
user.rank_fallback = "medk9"
user.hud_set_squad()
user.assigned_equipment_preset.minimap_icon = "medic_k9"
user.update_minimap_icon()

var/obj/item/card/id/ID = user.wear_id
ID.set_assignment((user.assigned_squad ? (user.assigned_squad.name + " ") : "") + "K9 Handler")
GLOB.data_core.manifest_modify(user.real_name, WEAKREF(user), "K9 Handler")

/obj/item/pamphlet/skill/machinegunner
name = "heavy machinegunner instructional pamphlet"
desc = "A pamphlet used to quickly impart vital knowledge. This one has an engineering and a machinegun insignia."
Expand Down
20 changes: 20 additions & 0 deletions code/game/objects/items/storage/backpack.dm
Original file line number Diff line number Diff line change
Expand Up @@ -452,6 +452,26 @@
xeno_icon_state = "medicpack"
xeno_types = list(/mob/living/carbon/xenomorph/runner, /mob/living/carbon/xenomorph/praetorian, /mob/living/carbon/xenomorph/drone, /mob/living/carbon/xenomorph/warrior, /mob/living/carbon/xenomorph/defender, /mob/living/carbon/xenomorph/sentinel, /mob/living/carbon/xenomorph/spitter)

/obj/item/storage/backpack/marine/k9_synth/
icon_override = 'icons/mob/humans/species/synth_k9/onmob/synth_k9_overlays.dmi'
uniform_restricted = list(/obj/item/clothing/under/rank/synthetic/synth_k9) //K9 Synth only
force_overlays_on = TRUE

/obj/item/storage/backpack/marine/k9_synth/cargopack
name = "\improper M209 portable K9 backpack"
desc = "Form fitted for the K9 Rescue Unit line of synthetics. Designed to lug gear into the battlefield."
icon_state = "marinepack_k9"

/obj/item/storage/backpack/marine/k9_synth/medicalpack
name = "\improper M210 portable K9 medical backpack"
desc = "Form fitted for the K9 Rescue Unit line of synthetics. For carrying medical supplies."
icon_state = "marinepack_medic_k9"

/obj/item/storage/backpack/marine/k9_synth/mppack
name = "\improper M553 portable K9 police backpack"
desc = "Form fitted for the K9 Rescue Unit line of synthetics. For carrying MP Equipment."
icon_state = "mppack_k9"

/obj/item/storage/backpack/marine/medic/upp
name = "\improper UPP corpsman backpack"
desc = "Uncommon issue backpack worn by UPP medics from isolated sectors. You can swear you can see a faded USCM symbol."
Expand Down
1 change: 1 addition & 0 deletions code/modules/asset_cache/asset_list_items.dm
Original file line number Diff line number Diff line change
Expand Up @@ -256,6 +256,7 @@
list("ass", "hudsquad_ass"),
list("Eng", "hudsquad_engi"),
list("Med", "hudsquad_med"),
list("medk9", "hudsquad_medk9"),
list("SG", "hudsquad_gun"),
list("Spc", "hudsquad_spec"),
list("TL", "hudsquad_tl"),
Expand Down
5 changes: 5 additions & 0 deletions code/modules/character_traits/skills.dm
Original file line number Diff line number Diff line change
Expand Up @@ -90,6 +90,11 @@
trait_desc = "Boosts the JTAC skill by 1. Crewmember received additional training in using JTAC equipment and Ghillie outfits."
skill = SKILL_JTAC

/datum/character_trait/skills/k9_handler
trait_name = "K9 Handler Training"
trait_desc = "Allows the user to interface with Wey-Yu Synthetic K9 Units for rescue purposes"
skill = SKILL_JTAC

/datum/character_trait/skills/powerloader
trait_name = "Powerloader Usage Training"
trait_desc = "Boosts the powerloader skill to 1. Crewmember received training in operating powerloaders."
Expand Down
9 changes: 9 additions & 0 deletions code/modules/clothing/under/marine_uniform.dm
Original file line number Diff line number Diff line change
Expand Up @@ -940,6 +940,15 @@
worn_state = "rdalt"
flags_jumpsuit = FALSE

/obj/item/clothing/under/rank/synthetic/synth_k9
name = "\improper W-Y K9 Serial Identification Collar"
desc = "Contains a serialized manufacturing number related to this unit's manufacturing date and time."
icon = 'icons/mob/humans/species/synth_k9/onmob/synth_k9_overlays.dmi'
flags_item = NODROP
icon_state = "k9_dogtags"
worn_state = "k9_dogtags"
flags_jumpsuit = FALSE

/obj/item/clothing/under/rank/synthetic/frontier
name = "\improper frontier jumpsuit"
desc = "A cargo jumpsuit dressed down for full range of motion and state-of-the-art frontier temperature control. It's the best thing an engineer can wear in the Outer Veil."
Expand Down
12 changes: 12 additions & 0 deletions code/modules/cm_marines/equipment/kit_boxes.dm
Original file line number Diff line number Diff line change
Expand Up @@ -577,6 +577,18 @@
new /obj/item/device/binoculars/range/designator/spotter(src)
new /obj/item/pamphlet/skill/spotter(src)

/obj/item/storage/box/kit/k9_handler
name = "\improper K9 Handler Kit"
desc = "Contains the equipment needed for a K9 Handler to perform their duties."
pro_case_overlay = "k9_handler"

/obj/item/storage/box/kit/k9_handler/fill_preset_inventory()
new /obj/item/device/k9_scanner(src)
new /obj/item/storage/firstaid/synth(src)
new /obj/item/device/helmet_visor/welding_visor(src)
new /obj/item/device/binoculars(src)
new /obj/item/pamphlet/skill/k9_handler(src)

/obj/item/storage/box/kit/engineering_supply_kit
name = "\improper Engineering Supply Kit"

Expand Down
1 change: 1 addition & 0 deletions code/modules/cm_marines/marines_consoles.dm
Original file line number Diff line number Diff line change
Expand Up @@ -928,6 +928,7 @@ GLOBAL_LIST_EMPTY_TYPED(crewmonitor, /datum/crewmonitor)
JOB_CARGO_TECH = 61,
JOB_MESS_SERGEANT = 62,
// 70-139: SQUADS (look below)
JOB_SYNTH_K9 = 71,
// 140+: Civilian/other
JOB_CORPORATE_LIAISON = 140,
JOB_PASSENGER = 141,
Expand Down
Loading

0 comments on commit d039ce1

Please sign in to comment.