diff --git a/code/datums/supplypacks.dm b/code/datums/supplypacks.dm
index edd7c212a3b..d00c7deeac6 100644
--- a/code/datums/supplypacks.dm
+++ b/code/datums/supplypacks.dm
@@ -799,6 +799,12 @@ var/list/all_supply_groups = list(supply_emergency,supply_security,supply_engine
cost = 30
containername = "farwa crate"
+/datum/supply_packs/organic/wolpin
+ name = "Wolpin crate"
+ contains = list (/obj/item/weapon/storage/box/wolpincubes)
+ cost = 30
+ containername = "wolpin crate"
+
/datum/supply_packs/organic/skrell
name = "Neaera crate"
contains = list (/obj/item/weapon/storage/box/neaeracubes)
diff --git a/code/game/objects/items/weapons/storage/boxes.dm b/code/game/objects/items/weapons/storage/boxes.dm
index 04615c623e8..dd0a0b76bea 100644
--- a/code/game/objects/items/weapons/storage/boxes.dm
+++ b/code/game/objects/items/weapons/storage/boxes.dm
@@ -412,6 +412,18 @@
new /obj/item/weapon/reagent_containers/food/snacks/monkeycube/wrapped/neaeracube(src)
+/obj/item/weapon/storage/box/wolpincubes
+ name = "wolpin cube box"
+ desc = "Drymate brand wolpin cubes. Just add water!"
+ icon = 'icons/obj/food.dmi'
+ icon_state = "monkeycubebox"
+ storage_slots = 7
+ can_hold = list("/obj/item/weapon/reagent_containers/food/snacks/monkeycube/wrapped/neaeracube")
+ New()
+ ..()
+ for(var/i = 1; i <= 5; i++)
+ new /obj/item/weapon/reagent_containers/food/snacks/monkeycube/wrapped/wolpincube(src)
+
/obj/item/weapon/storage/box/permits
name = "box of construction permits"
desc = "A box for containing construction permits, used to officially declare built rooms as additions to the station."
diff --git a/code/modules/client/client procs.dm b/code/modules/client/client procs.dm
index 67bf068d604..fe67a21a779 100644
--- a/code/modules/client/client procs.dm
+++ b/code/modules/client/client procs.dm
@@ -164,6 +164,13 @@
else
src.DB_species_unlock("Plasmaman",100)
return
+ if("7")
+ if(karma <50)
+ usr << "You do not have enough karma!"
+ return
+ else
+ src.DB_species_unlock("Vulpkanin",50)
+ return
if(href_list["KarmaRefund"])
var/type = href_list["KarmaRefundType"]
var/job = href_list["KarmaRefund"]
diff --git a/code/modules/client/preferences.dm b/code/modules/client/preferences.dm
index 93c4a366bf6..3a5c0bb6357 100644
--- a/code/modules/client/preferences.dm
+++ b/code/modules/client/preferences.dm
@@ -352,7 +352,7 @@ datum/preferences
dat += "
Eyes
"
dat += "Change Color
"
- if(species == "Unathi" || species == "Tajaran" || species == "Skrell" || species == "Slime People")
+ if(species == "Unathi" || species == "Tajaran" || species == "Skrell" || species == "Slime People" || species == "Vulpkanin")
dat += "
Body Color
"
dat += "Change Color "
@@ -970,7 +970,7 @@ datum/preferences
if("age")
age = rand(AGE_MIN, AGE_MAX)
if("hair")
- if(species == "Human" || species == "Unathi" || species == "Tajaran" || species == "Skrell" || species == "Machine" || species == "Wryn")
+ if(species == "Human" || species == "Unathi" || species == "Tajaran" || species == "Skrell" || species == "Machine" || species == "Wryn" || species == "Vulpkanin")
r_hair = rand(0,255)
g_hair = rand(0,255)
b_hair = rand(0,255)
@@ -996,7 +996,7 @@ datum/preferences
if(species == "Human")
s_tone = random_skin_tone()
if("s_color")
- if(species == "Unathi" || species == "Tajaran" || species == "Skrell" || species == "Slime People" || species == "Wryn")
+ if(species == "Unathi" || species == "Tajaran" || species == "Skrell" || species == "Slime People" || species == "Wryn" || species == "Vulpkanin")
r_skin = rand(0,255)
g_skin = rand(0,255)
b_skin = rand(0,255)
@@ -1119,7 +1119,7 @@ datum/preferences
b_type = new_b_type
if("hair")
- if(species == "Human" || species == "Unathi" || species == "Tajaran" || species == "Skrell" || species == "Machine")
+ if(species == "Human" || species == "Unathi" || species == "Tajaran" || species == "Skrell" || species == "Machine" || species == "Vulpkanin")
var/input = "Choose your character's hair colour:"
if(species == "Machine")
input = "Choose your character's frame colour:"
@@ -1202,7 +1202,7 @@ datum/preferences
s_tone = 35 - max(min( round(new_s_tone), 220),1)
if("skin")
- if(species == "Unathi" || species == "Tajaran" || species == "Skrell" || species == "Slime People")
+ if(species == "Unathi" || species == "Tajaran" || species == "Skrell" || species == "Slime People"|| species == "Vulpkanin")
var/new_skin = input(user, "Choose your character's skin colour: ", "Character Preference") as color|null
if(new_skin)
r_skin = hex2num(copytext(new_skin, 2, 4))
diff --git a/code/modules/karma/karma.dm b/code/modules/karma/karma.dm
index ed00a84e97c..db0f6790913 100644
--- a/code/modules/karma/karma.dm
+++ b/code/modules/karma/karma.dm
@@ -202,6 +202,7 @@ You've gained [totalkarma] total karma in your time here.
"}
Unlock Vox -- 45KP
Unlock Slime People -- 45KP
Unlock Plasmaman -- 100KP
+ Unlock Vulpkanin -- 50KP
"}
if (2) // Karma Refunds
diff --git a/code/modules/mob/language.dm b/code/modules/mob/language.dm
index 60b2c20636a..a4fb9ae6d26 100644
--- a/code/modules/mob/language.dm
+++ b/code/modules/mob/language.dm
@@ -180,6 +180,20 @@
new_name += ..(gender,1)
return new_name
+/datum/language/vulpkanin
+ name = "Canilunzt"
+ desc = "The guttural language spoken and utilized by the inhabitants of Vazzend system, composed of growls, barks, yaps, and heavy utilization of ears and tail movements.Vulpkanin speak this language with ease."
+ speech_verb = "rawrs"
+ ask_verb = "rurs"
+ exclaim_verb = "barks"
+ colour = "vulpkanin"
+ key = "w"
+ flags = RESTRICTED
+ syllables = list("rur","ya","cen","rawr","bar","kuk","tek","qat","uk","wu","vuh","tah","tch","schz","auch", \
+ "ist","ein","entch","zwichs","tut","mir","wo","bis","es","vor","nic","gro","lll","enem","zandt","tzch","noch", \
+ "hel","ischt","far","wa","baram","iereng","tech","lach","sam","mak","lich","gen","or","ag","eck","gec","stag","onn", \
+ "bin","ket","jarl","vulf","einech","cresthz","azunein","ghzth")
+
/datum/language/skrell
name = "Skrellian"
desc = "A melodic and complex language spoken by the Skrell of Qerrbalak. Some of the notes are inaudible to humans."
diff --git a/code/modules/mob/living/carbon/human/human.dm b/code/modules/mob/living/carbon/human/human.dm
index a8c1df9b426..de9680dccab 100644
--- a/code/modules/mob/living/carbon/human/human.dm
+++ b/code/modules/mob/living/carbon/human/human.dm
@@ -62,6 +62,10 @@
h_style = "Tajaran Ears"
..(new_loc, "Tajaran")
+/mob/living/carbon/human/vulpkanin/New(var/new_loc)
+ h_style = "Bald"
+ ..(new_loc, "Vulpkanin")
+
/mob/living/carbon/human/unathi/New(var/new_loc)
h_style = "Unathi Horns"
..(new_loc, "Unathi")
diff --git a/code/modules/mob/living/carbon/monkey/monkey.dm b/code/modules/mob/living/carbon/monkey/monkey.dm
index 4375800af54..e414d2d8bb7 100644
--- a/code/modules/mob/living/carbon/monkey/monkey.dm
+++ b/code/modules/mob/living/carbon/monkey/monkey.dm
@@ -24,6 +24,13 @@
icon_state = "tajkey1"
uni_append = list(0x0A0,0xE00) // 0A0E00
+/mob/living/carbon/monkey/vulpkanin
+ name = "wolpin"
+ voice_name = "wolpin"
+ speak_emote = list("yaps")
+ icon_state = "tajkey1"
+ uni_append = list(0x066,0x4FE) // 0A0E00
+
/mob/living/carbon/monkey/skrell
name = "neaera"
voice_name = "neaera"
@@ -106,6 +113,13 @@
dna.species = "Tajaran"
add_language("Siik'tajr")
+/mob/living/carbon/monkey/vulpkanin/New()
+
+ ..()
+ greaterform = "Vulpkanin"
+ dna.species = "Vulpkanin"
+ add_language("Canilunzt")
+
/mob/living/carbon/monkey/diona/New()
..()
diff --git a/code/modules/mob/living/carbon/species.dm b/code/modules/mob/living/carbon/species.dm
index 1727757c9da..c261262cbbc 100644
--- a/code/modules/mob/living/carbon/species.dm
+++ b/code/modules/mob/living/carbon/species.dm
@@ -410,6 +410,38 @@
H.stop_tail_wagging(1)
+/datum/species/vulpkanin
+ name = "Vulpkanin"
+ icobase = 'icons/mob/human_races/r_vulpkanin.dmi'
+ deform = 'icons/mob/human_races/r_vulpkanin.dmi'
+ path = /mob/living/carbon/human/vulpkanin
+ default_language = "Galactic Common"
+ language = "Canilunzt"
+ primitive = /mob/living/carbon/monkey/vulpkanin
+ tail = "vulptail"
+ unarmed_type = /datum/unarmed_attack/claws
+ darksight = 8
+ slowdown = -1
+ brute_mod = 1.1
+ burn_mod = 1.1
+
+ blurb = "Vulpkanin are a species of extremely quick canine-pideds residing on the planet Altam just barely within the \
+ the dual-star Vazzend system. Their politically de-centralized and independent natures have led them to become a species and \
+ culture both feared and respected for their discoveries. Disovery, loyalty, and utilitarianism dominates their lifestyles \
+ to the degree it can cause conflict with more authoritarian entities. They speak a guttural language known as 'Canilunzt' \
+ which has a heavy emphasis on utilizing tail positioning and ear twitches to communicate intent."
+
+ flags = HAS_LIPS | HAS_UNDERWEAR | IS_WHITELISTED
+ bodyflags = FEET_PADDED | HAS_TAIL | HAS_SKIN_COLOR | TAIL_WAGGING
+ dietflags = DIET_OMNI
+
+ flesh_color = "#966464"
+ base_color = "#BE8264"
+
+/datum/species/vulpkanin/handle_death(var/mob/living/carbon/human/H)
+
+ H.stop_tail_wagging(1)
+
/datum/species/skrell
name = "Skrell"
icobase = 'icons/mob/human_races/r_skrell.dmi'
diff --git a/code/modules/mob/living/silicon/ai/ai.dm b/code/modules/mob/living/silicon/ai/ai.dm
index 5545e9f09bc..4533ffcc49b 100644
--- a/code/modules/mob/living/silicon/ai/ai.dm
+++ b/code/modules/mob/living/silicon/ai/ai.dm
@@ -147,6 +147,7 @@ var/list/ai_verbs_default = list(
add_language("Gutter", 0)
add_language("Sinta'unathi", 0)
add_language("Siik'tajr", 0)
+ add_language("Canilunzt", 0)
add_language("Skrellian", 0)
add_language("Vox-pidgin", 0)
add_language("Rootspeak", 0)
diff --git a/code/modules/mob/living/silicon/pai/software_modules.dm b/code/modules/mob/living/silicon/pai/software_modules.dm
index 41fc6bfcb6d..877c6002dc6 100644
--- a/code/modules/mob/living/silicon/pai/software_modules.dm
+++ b/code/modules/mob/living/silicon/pai/software_modules.dm
@@ -484,6 +484,7 @@
if(user.translator_on)
user.add_language("Sinta'unathi")
user.add_language("Siik'tajr")
+ user.add_language("Canilunzt")
user.add_language("Skrellian")
user.add_language("Vox-pidgin")
user.add_language("Rootspeak")
@@ -493,6 +494,7 @@
else
user.remove_language("Sinta'unathi")
user.remove_language("Siik'tajr")
+ user.remove_language("Canilunzt")
user.remove_language("Skrellian")
user.remove_language("Vox-pidgin")
user.remove_language("Rootspeak")
diff --git a/code/modules/mob/living/silicon/robot/robot_modules.dm b/code/modules/mob/living/silicon/robot/robot_modules.dm
index d8adc434d40..d30e96491fd 100644
--- a/code/modules/mob/living/silicon/robot/robot_modules.dm
+++ b/code/modules/mob/living/silicon/robot/robot_modules.dm
@@ -65,6 +65,7 @@
R.add_language("Gutter", 0)
R.add_language("Sinta'unathi", 0)
R.add_language("Siik'tajr", 0)
+ R.add_language("Canilunzt", 0)
R.add_language("Skrellian", 0)
R.add_language("Vox-pidgin", 0)
R.add_language("Rootspeak", 0)
@@ -275,6 +276,7 @@
R.add_language("Gutter", 1)
R.add_language("Sinta'unathi", 1)
R.add_language("Siik'tajr", 1)
+ R.add_language("Canilunzt", 1)
R.add_language("Skrellian", 1)
R.add_language("Vox-pidgin", 1)
R.add_language("Rootspeak", 1)
diff --git a/code/modules/mob/new_player/preferences_setup.dm b/code/modules/mob/new_player/preferences_setup.dm
index ecb36044881..363675b723c 100644
--- a/code/modules/mob/new_player/preferences_setup.dm
+++ b/code/modules/mob/new_player/preferences_setup.dm
@@ -10,11 +10,11 @@ datum/preferences
s_tone = random_skin_tone()
h_style = random_hair_style(gender, species)
f_style = random_facial_hair_style(gender, species)
- if(species == "Human" || species == "Unathi" || species == "Tajaran" || species == "Skrell" || species == "Machine")
+ if(species == "Human" || species == "Unathi" || species == "Tajaran" || species == "Skrell" || species == "Machine" || species == "Vulpkanin")
randomize_hair_color("hair")
randomize_hair_color("facial")
randomize_eyes_color()
- if(species == "Unathi" || species == "Tajaran" || species == "Skrell")
+ if(species == "Unathi" || species == "Tajaran" || species == "Skrell" || species == "Vulpkanin")
randomize_skin_color()
underwear = rand(1,underwear_m.len)
undershirt = rand(1,undershirt_t.len)
diff --git a/code/modules/mob/new_player/sprite_accessories.dm b/code/modules/mob/new_player/sprite_accessories.dm
index 6ba963c5f1b..4f8c7c4f7a1 100644
--- a/code/modules/mob/new_player/sprite_accessories.dm
+++ b/code/modules/mob/new_player/sprite_accessories.dm
@@ -434,7 +434,7 @@
name = "Shaved"
icon_state = "bald"
gender = NEUTER
- species_allowed = list("Human","Unathi","Tajaran","Skrell","Vox","Diona","Kidan","Greys","Machine")
+ species_allowed = list("Human","Unathi","Tajaran","Skrell","Vox","Diona","Kidan","Greys","Machine", "Vulpkanin")
watson
@@ -659,6 +659,33 @@
icon_state = "hair_messy"
species_allowed = list("Tajaran")
+//Vulpkanin
+
+ vulp_hair_none
+ name = "None"
+ icon_state = "bald"
+ species_allowed = list("Vulpkanin")
+
+ vulp_hair_short
+ name = "Kajam"
+ icon_state = "kajam"
+ species_allowed = list("Vulpkanin")
+
+ vulp_hair_long
+ name = "Keid"
+ icon_state = "keid"
+ species_allowed = list("Vulpkanin")
+
+ vulp_hair_fluffy
+ name = "Adhara"
+ icon_state = "adhara"
+ species_allowed = list("Vulpkanin")
+
+ vulp_hair_ponytail
+ name = "Kleeia"
+ icon_state = "kleeia"
+ species_allowed = list("Vulpkanin")
+
vox_quills_short
name = "Short Vox Quills"
icon_state = "vox_shortquills"
@@ -789,6 +816,12 @@
icon = 'icons/mob/human_races/r_tajaran.dmi'
species_allowed = list("Tajaran")
+ vulpkanin
+ name = "Default Vulpkanin skin"
+ icon_state = "default"
+ icon = 'icons/mob/human_races/r_vulpkanin.dmi'
+ species_allowed = list("Vulpkanin")
+
unathi
name = "Default Unathi skin"
icon_state = "default"
diff --git a/code/modules/reagents/reagent_containers/food/snacks.dm b/code/modules/reagents/reagent_containers/food/snacks.dm
index 40f5cb1469d..1ed7f749f3f 100644
--- a/code/modules/reagents/reagent_containers/food/snacks.dm
+++ b/code/modules/reagents/reagent_containers/food/snacks.dm
@@ -1753,6 +1753,13 @@
name = "farwa cube"
monkey_type =/mob/living/carbon/monkey/tajara
+/obj/item/weapon/reagent_containers/food/snacks/monkeycube/wolpincube
+ name = "wolpin cube"
+ monkey_type = /mob/living/carbon/monkey/vulpkanin
+/obj/item/weapon/reagent_containers/food/snacks/monkeycube/wrapped/wolpincube
+ name = "wolpin cube"
+ monkey_type = /mob/living/carbon/monkey/vulpkanin
+
/obj/item/weapon/reagent_containers/food/snacks/monkeycube/stokcube
name = "stok cube"
monkey_type = /mob/living/carbon/monkey/unathi
diff --git a/code/modules/virus2/disease2.dm b/code/modules/virus2/disease2.dm
index f699c68a82d..a72b66e88e1 100644
--- a/code/modules/virus2/disease2.dm
+++ b/code/modules/virus2/disease2.dm
@@ -10,7 +10,7 @@
var/list/datum/disease2/effectholder/effects = list()
var/antigen = 0 // 16 bits describing the antigens, when one bit is set, a cure with that bit can dock here
var/max_stage = 4
- var/list/affected_species = list("Human","Unathi","Skrell","Tajaran","Vox","Kidan","Slime People","Grey","Diona")
+ var/list/affected_species = list("Human","Unathi","Skrell","Tajaran","Vox","Kidan","Slime People","Grey","Diona", "Vulpkanin")
/datum/disease2/disease/New()
uniqueID = rand(0,10000)
diff --git a/code/stylesheet.dm b/code/stylesheet.dm
index 82a6d814154..fac26760073 100644
--- a/code/stylesheet.dm
+++ b/code/stylesheet.dm
@@ -84,6 +84,7 @@ h1.alert, h2.alert {color: #000000;}
.slime {color: #0077AA;}
.clown {color: #ff0000;}
.shadowling {color: #311648;}
+.vulpkanin {color: #B97A57;}
.rough {font-family: "Trebuchet MS", cursive, sans-serif;}
.say_quote {font-family: Georgia, Verdana, sans-serif;}
.sans {font-family: "Comic Sans MS", cursive, sans-serif; font-weight: bold;}
diff --git a/icons/effects/species.dmi b/icons/effects/species.dmi
index 59422946e24..63f67113cdc 100644
Binary files a/icons/effects/species.dmi and b/icons/effects/species.dmi differ
diff --git a/icons/mob/human_face.dmi b/icons/mob/human_face.dmi
index 65178bc773d..2a1ee5d5568 100644
Binary files a/icons/mob/human_face.dmi and b/icons/mob/human_face.dmi differ
diff --git a/icons/mob/human_races/r_vulpkanin.dmi b/icons/mob/human_races/r_vulpkanin.dmi
new file mode 100644
index 00000000000..6f2c8df3dca
Binary files /dev/null and b/icons/mob/human_races/r_vulpkanin.dmi differ