diff --git a/code/__DEFINES/DNA.dm b/code/__DEFINES/DNA.dm
index 59a11be1555..44d1c8300a0 100644
--- a/code/__DEFINES/DNA.dm
+++ b/code/__DEFINES/DNA.dm
@@ -123,6 +123,7 @@
#define SPECIES_INORGANIC 32
#define SPECIES_UNDEAD 33
#define SPECIES_ROBOTIC 34
+#define NOEYES 35
#define ORGAN_SLOT_BRAIN "brain"
#define ORGAN_SLOT_APPENDIX "appendix"
diff --git a/code/__HELPERS/mobs.dm b/code/__HELPERS/mobs.dm
index d089b48db60..61ce8a91e8c 100644
--- a/code/__HELPERS/mobs.dm
+++ b/code/__HELPERS/mobs.dm
@@ -68,9 +68,11 @@
init_sprite_accessory_subtypes(/datum/sprite_accessory/body_markings, GLOB.body_markings_list)
if(!GLOB.wings_list.len)
init_sprite_accessory_subtypes(/datum/sprite_accessory/wings, GLOB.wings_list)
+ if(!GLOB.moth_wings_list.len)
+ init_sprite_accessory_subtypes(/datum/sprite_accessory/moth_wings, GLOB.moth_wings_list)
//For now we will always return none for tail_human and ears.
- return(list("mcolor" = pick("FFFFFF","7F7F7F", "7FFF7F", "7F7FFF", "FF7F7F", "7FFFFF", "FF7FFF", "FFFF7F"), "tail_lizard" = pick(GLOB.tails_list_lizard), "tail_human" = "None", "wings" = "None", "snout" = pick(GLOB.snouts_list), "horns" = pick(GLOB.horns_list), "ears" = "None", "frills" = pick(GLOB.frills_list), "spines" = pick(GLOB.spines_list), "body_markings" = pick(GLOB.body_markings_list), "legs" = "Normal Legs"))
+ return(list("mcolor" = pick("FFFFFF","7F7F7F", "7FFF7F", "7F7FFF", "FF7F7F", "7FFFFF", "FF7FFF", "FFFF7F"), "tail_lizard" = pick(GLOB.tails_list_lizard), "tail_human" = "None", "wings" = "None", "snout" = pick(GLOB.snouts_list), "horns" = pick(GLOB.horns_list), "ears" = "None", "frills" = pick(GLOB.frills_list), "spines" = pick(GLOB.spines_list), "body_markings" = pick(GLOB.body_markings_list), "legs" = "Normal Legs", "moth_wings" = pick(GLOB.moth_wings_list)))
/proc/random_hair_style(gender)
switch(gender)
@@ -91,27 +93,34 @@
return pick(GLOB.facial_hair_styles_list)
/proc/random_unique_name(gender, attempts_to_find_unique_name=10)
- for(var/i=1, i<=attempts_to_find_unique_name, i++)
+ for(var/i in 1 to attempts_to_find_unique_name)
if(gender==FEMALE)
. = capitalize(pick(GLOB.first_names_female)) + " " + capitalize(pick(GLOB.last_names))
else
. = capitalize(pick(GLOB.first_names_male)) + " " + capitalize(pick(GLOB.last_names))
- if(i != attempts_to_find_unique_name && !findname(.))
+ if(!findname(.))
break
/proc/random_unique_lizard_name(gender, attempts_to_find_unique_name=10)
- for(var/i=1, i<=attempts_to_find_unique_name, i++)
+ for(var/i in 1 to attempts_to_find_unique_name)
. = capitalize(lizard_name(gender))
- if(i != attempts_to_find_unique_name && !findname(.))
+ if(!findname(.))
break
/proc/random_unique_plasmaman_name(attempts_to_find_unique_name=10)
- for(var/i=1, i<=attempts_to_find_unique_name, i++)
+ for(var/i in 1 to attempts_to_find_unique_name)
. = capitalize(plasmaman_name())
- if(i != attempts_to_find_unique_name && !findname(.))
+ if(!findname(.))
+ break
+
+/proc/random_unique_moth_name(attempts_to_find_unique_name=10)
+ for(var/i in 1 to attempts_to_find_unique_name)
+ . = capitalize(moth_name())
+
+ if(!findname(.))
break
/proc/random_skin_tone()
diff --git a/code/__HELPERS/names.dm b/code/__HELPERS/names.dm
index e019af213fb..8fbb5d805bc 100644
--- a/code/__HELPERS/names.dm
+++ b/code/__HELPERS/names.dm
@@ -9,6 +9,9 @@
/proc/plasmaman_name()
return "[pick(GLOB.plasmaman_names)] \Roman[rand(1,99)]"
+/proc/moth_name()
+ return "[pick(GLOB.moth_names)]"
+
/proc/church_name()
var/static/church_name
if (church_name)
diff --git a/code/_globalvars/lists/flavor_misc.dm b/code/_globalvars/lists/flavor_misc.dm
index b819a4ff0aa..c34510c0395 100644
--- a/code/_globalvars/lists/flavor_misc.dm
+++ b/code/_globalvars/lists/flavor_misc.dm
@@ -34,6 +34,7 @@ GLOBAL_LIST_EMPTY(ears_list)
GLOBAL_LIST_EMPTY(wings_list)
GLOBAL_LIST_EMPTY(wings_open_list)
GLOBAL_LIST_EMPTY(r_wings_list)
+GLOBAL_LIST_EMPTY(moth_wings_list)
GLOBAL_LIST_INIT(ghost_forms_with_directions_list, list("ghost")) //stores the ghost forms that support directional sprites
GLOBAL_LIST_INIT(ghost_forms_with_accessories_list, list("ghost")) //stores the ghost forms that support hair and other such things
diff --git a/code/_globalvars/lists/names.dm b/code/_globalvars/lists/names.dm
index ad5e18d3f79..eaaa2c1755c 100644
--- a/code/_globalvars/lists/names.dm
+++ b/code/_globalvars/lists/names.dm
@@ -13,6 +13,7 @@ GLOBAL_LIST_INIT(clown_names, world.file2list("strings/names/clown.txt"))
GLOBAL_LIST_INIT(mime_names, world.file2list("strings/names/mime.txt"))
GLOBAL_LIST_INIT(carp_names, world.file2list("strings/names/carp.txt"))
GLOBAL_LIST_INIT(golem_names, world.file2list("strings/names/golem.txt"))
+GLOBAL_LIST_INIT(moth_names, world.file2list("strings/names/moth.txt"))
GLOBAL_LIST_INIT(plasmaman_names, world.file2list("strings/names/plasmaman.txt"))
GLOBAL_LIST_INIT(posibrain_names, world.file2list("strings/names/posibrain.txt"))
GLOBAL_LIST_INIT(nightmare_names, world.file2list("strings/names/nightmare.txt"))
diff --git a/code/modules/client/preferences.dm b/code/modules/client/preferences.dm
index cae46a051d8..29dfdb22ceb 100644
--- a/code/modules/client/preferences.dm
+++ b/code/modules/client/preferences.dm
@@ -68,7 +68,7 @@ GLOBAL_LIST_EMPTY(preferences_datums)
var/skin_tone = "caucasian1" //Skin color
var/eye_color = "000" //Eye color
var/datum/species/pref_species = new /datum/species/human() //Mutant race
- var/list/features = list("mcolor" = "FFF", "tail_lizard" = "Smooth", "tail_human" = "None", "snout" = "Round", "horns" = "None", "ears" = "None", "wings" = "None", "frills" = "None", "spines" = "None", "body_markings" = "None", "legs" = "Normal Legs")
+ var/list/features = list("mcolor" = "FFF", "tail_lizard" = "Smooth", "tail_human" = "None", "snout" = "Round", "horns" = "None", "ears" = "None", "wings" = "None", "frills" = "None", "spines" = "None", "body_markings" = "None", "legs" = "Normal Legs", "moth_wings" = "Plain")
var/list/custom_names = list("human", "clown", "mime", "ai", "cyborg", "religion", "deity")
var/prefered_security_department = SEC_DEPT_RANDOM
@@ -249,7 +249,7 @@ GLOBAL_LIST_EMPTY(preferences_datums)
dat += ""
- if(EYECOLOR in pref_species.species_traits)
+ if((EYECOLOR in pref_species.species_traits) && !(NOEYES in pref_species.species_traits))
dat += "
"
@@ -330,6 +330,15 @@ GLOBAL_LIST_EMPTY(preferences_datums)
dat += "[features["legs"]] "
+ dat += " | "
+ if("moth_wings" in pref_species.mutant_bodyparts)
+
+ dat += ""
+
+ dat += "Moth wings"
+
+ dat += "[features["moth_wings"]] "
+
dat += " | "
if(CONFIG_GET(flag/join_with_mutant_humans))
@@ -1044,6 +1053,12 @@ GLOBAL_LIST_EMPTY(preferences_datums)
if(new_legs)
features["legs"] = new_legs
+ if("moth_wings")
+ var/new_moth_wings
+ new_moth_wings = input(user, "Choose your character's wings:", "Character Preference") as null|anything in GLOB.moth_wings_list
+ if(new_moth_wings)
+ features["moth_wings"] = new_moth_wings
+
if("s_tone")
var/new_s_tone = input(user, "Choose your character's skin-tone:", "Character Preference") as null|anything in GLOB.skin_tones
if(new_s_tone)
diff --git a/code/modules/client/preferences_savefile.dm b/code/modules/client/preferences_savefile.dm
index 2b13f6953a2..e4f277d561c 100644
--- a/code/modules/client/preferences_savefile.dm
+++ b/code/modules/client/preferences_savefile.dm
@@ -162,7 +162,7 @@ SAVEFILE UPDATING/VERSIONING - 'Simplified', or rather, more coder-friendly ~Car
S["enable_tips"] >> enable_tips
S["tip_delay"] >> tip_delay
S["pda_style"] >> pda_style
- S["pda_color"] >> pda_color
+ S["pda_color"] >> pda_color
//try to fix any outdated data if necessary
if(needs_update >= 0)
@@ -290,6 +290,7 @@ SAVEFILE UPDATING/VERSIONING - 'Simplified', or rather, more coder-friendly ~Car
S["feature_lizard_spines"] >> features["spines"]
S["feature_lizard_body_markings"] >> features["body_markings"]
S["feature_lizard_legs"] >> features["legs"]
+ S["feature_moth_wings"] >> features["moth_wings"]
if(!CONFIG_GET(flag/join_with_mutant_humans))
features["tail_human"] = "none"
features["ears"] = "none"
@@ -359,6 +360,7 @@ SAVEFILE UPDATING/VERSIONING - 'Simplified', or rather, more coder-friendly ~Car
features["spines"] = sanitize_inlist(features["spines"], GLOB.spines_list)
features["body_markings"] = sanitize_inlist(features["body_markings"], GLOB.body_markings_list)
features["feature_lizard_legs"] = sanitize_inlist(features["legs"], GLOB.legs_list, "Normal Legs")
+ features["moth_wings"] = sanitize_inlist(features["moth_wings"], GLOB.moth_wings_list, "Plain")
joblessrole = sanitize_integer(joblessrole, 1, 3, initial(joblessrole))
job_civilian_high = sanitize_integer(job_civilian_high, 0, 65535, initial(job_civilian_high))
@@ -412,6 +414,7 @@ SAVEFILE UPDATING/VERSIONING - 'Simplified', or rather, more coder-friendly ~Car
WRITE_FILE(S["feature_lizard_spines"] , features["spines"])
WRITE_FILE(S["feature_lizard_body_markings"] , features["body_markings"])
WRITE_FILE(S["feature_lizard_legs"] , features["legs"])
+ WRITE_FILE(S["feature_moth_wings"] , features["moth_wings"])
WRITE_FILE(S["human_name"] , custom_names["human"])
WRITE_FILE(S["clown_name"] , custom_names["clown"])
WRITE_FILE(S["mime_name"] , custom_names["mime"])
diff --git a/code/modules/food_and_drinks/food/snacks/meat.dm b/code/modules/food_and_drinks/food/snacks/meat.dm
index e43309892df..6dcad1d683b 100644
--- a/code/modules/food_and_drinks/food/snacks/meat.dm
+++ b/code/modules/food_and_drinks/food/snacks/meat.dm
@@ -108,6 +108,13 @@
tastes = list("maggots" = 1, "the inside of a reactor" = 1)
foodtype = MEAT | RAW | GROSS
+/obj/item/reagent_containers/food/snacks/meat/slab/human/mutant/moth
+ icon_state = "mothmeat"
+ desc = "Unpleasantly powdery and dry. Kind of pretty, though."
+ filling_color = "#BF896B"
+ tastes = list("dust" = 1, "powder" = 1, "meat" = 2)
+ foodtype = MEAT | RAW
+
/obj/item/reagent_containers/food/snacks/meat/slab/human/mutant/skeleton
name = "bone"
icon_state = "skeletonmeat"
@@ -119,14 +126,13 @@
/obj/item/reagent_containers/food/snacks/meat/slab/human/mutant/zombie
name = " meat (rotten)"
- icon_state = "lizardmeat" //Close enough.
+ icon_state = "rottenmeat"
desc = "Halfway to becoming fertilizer for your garden."
filling_color = "#6B8E23"
tastes = list("brains" = 1, "meat" = 1)
foodtype = RAW | MEAT | TOXIC
-
////////////////////////////////////// OTHER MEATS ////////////////////////////////////////////////////////
diff --git a/code/modules/language/moth.dm b/code/modules/language/moth.dm
new file mode 100644
index 00000000000..60df981b4c4
--- /dev/null
+++ b/code/modules/language/moth.dm
@@ -0,0 +1,12 @@
+/datum/language/moth
+ name = "Lepidopterian"
+ desc = "The common language of moths, composed of various noises made of wing fluttering and clicks."
+ speech_verb = "flutters"
+ ask_verb = "clicks"
+ exclaim_verb = "buzzes"
+ key = "m"
+ space_chance = 90
+ syllables = list("bz", "ba", "mah", "fa", "ki", "nr")
+ default_priority = 90
+
+ icon_state = "moth"
diff --git a/code/modules/mob/dead/new_player/sprite_accessories.dm b/code/modules/mob/dead/new_player/sprite_accessories.dm
index 674f44bcd25..57d912067e2 100644
--- a/code/modules/mob/dead/new_player/sprite_accessories.dm
+++ b/code/modules/mob/dead/new_player/sprite_accessories.dm
@@ -1401,3 +1401,72 @@
/datum/sprite_accessory/legs/digitigrade_lizard
name = "Digitigrade Legs"
+
+/datum/sprite_accessory/moth_wings
+ icon = 'icons/mob/wings.dmi'
+ color_src = null
+
+/datum/sprite_accessory/moth_wings/plain
+ name = "Plain"
+ icon_state = "plain"
+
+/datum/sprite_accessory/moth_wings/monarch
+ name = "Monarch"
+ icon_state = "monarch"
+
+/datum/sprite_accessory/moth_wings/luna
+ name = "Luna"
+ icon_state = "luna"
+
+/datum/sprite_accessory/moth_wings/atlas
+ name = "Atlas"
+ icon_state = "atlas"
+
+/datum/sprite_accessory/moth_wings/reddish
+ name = "Reddish"
+ icon_state = "redish"
+
+/datum/sprite_accessory/moth_wings/royal
+ name = "Royal"
+ icon_state = "royal"
+
+/datum/sprite_accessory/moth_wings/gothic
+ name = "Gothic"
+ icon_state = "gothic"
+
+/datum/sprite_accessory/moth_wings/lovers
+ name = "Lovers"
+ icon_state = "lovers"
+
+/datum/sprite_accessory/moth_wings/whitefly
+ name = "White Fly"
+ icon_state = "whitefly"
+
+/datum/sprite_accessory/moth_wings/punished
+ name = "Burnt Off"
+ icon_state = "punished"
+ locked = TRUE
+
+/datum/sprite_accessory/moth_wings/firewatch
+ name = "Firewatch"
+ icon_state = "firewatch"
+
+/datum/sprite_accessory/moth_wings/deathhead
+ name = "Deathshead"
+ icon_state = "deathhead"
+
+/datum/sprite_accessory/moth_wings/poison
+ name = "Poison"
+ icon_state = "poison"
+
+/datum/sprite_accessory/moth_wings/ragged
+ name = "Ragged"
+ icon_state = "ragged"
+
+/datum/sprite_accessory/moth_wings/moonfly
+ name = "Moon Fly"
+ icon_state = "moonfly"
+
+/datum/sprite_accessory/moth_wings/snow
+ name = "Snow"
+ icon_state = "snow"
diff --git a/code/modules/mob/living/carbon/human/species.dm b/code/modules/mob/living/carbon/human/species.dm
index 25dcb9c711e..1378705f847 100644
--- a/code/modules/mob/living/carbon/human/species.dm
+++ b/code/modules/mob/living/carbon/human/species.dm
@@ -451,18 +451,19 @@ GLOBAL_LIST_EMPTY(roundstart_races)
standing += lip_overlay
// eyes
- var/has_eyes = H.getorganslot(ORGAN_SLOT_EYES)
- var/mutable_appearance/eye_overlay
- if(!has_eyes)
- eye_overlay = mutable_appearance('icons/mob/human_face.dmi', "eyes_missing", -BODY_LAYER)
- else
- eye_overlay = mutable_appearance('icons/mob/human_face.dmi', "eyes", -BODY_LAYER)
- if((EYECOLOR in species_traits) && has_eyes)
- eye_overlay.color = "#" + H.eye_color
- if(OFFSET_FACE in H.dna.species.offset_features)
- eye_overlay.pixel_x += H.dna.species.offset_features[OFFSET_FACE][1]
- eye_overlay.pixel_y += H.dna.species.offset_features[OFFSET_FACE][2]
- standing += eye_overlay
+ if(!(NOEYES in species_traits))
+ var/has_eyes = H.getorganslot(ORGAN_SLOT_EYES)
+ var/mutable_appearance/eye_overlay
+ if(!has_eyes)
+ eye_overlay = mutable_appearance('icons/mob/human_face.dmi', "eyes_missing", -BODY_LAYER)
+ else
+ eye_overlay = mutable_appearance('icons/mob/human_face.dmi', "eyes", -BODY_LAYER)
+ if((EYECOLOR in species_traits) && has_eyes)
+ eye_overlay.color = "#" + H.eye_color
+ if(OFFSET_FACE in H.dna.species.offset_features)
+ eye_overlay.pixel_x += H.dna.species.offset_features[OFFSET_FACE][1]
+ eye_overlay.pixel_y += H.dna.species.offset_features[OFFSET_FACE][2]
+ standing += eye_overlay
//Underwear, Undershirts & Socks
if(!(NO_UNDERWEAR in species_traits))
@@ -624,6 +625,8 @@ GLOBAL_LIST_EMPTY(roundstart_races)
S = GLOB.wings_open_list[H.dna.features["wings"]]
if("legs")
S = GLOB.legs_list[H.dna.features["legs"]]
+ if("moth_wings")
+ S = GLOB.moth_wings_list[H.dna.features["moth_wings"]]
if(!S || S.icon_state == "none")
continue
diff --git a/code/modules/mob/living/carbon/human/species_types/flypeople.dm b/code/modules/mob/living/carbon/human/species_types/flypeople.dm
index ba6cce76d4c..282e9044b40 100644
--- a/code/modules/mob/living/carbon/human/species_types/flypeople.dm
+++ b/code/modules/mob/living/carbon/human/species_types/flypeople.dm
@@ -2,7 +2,7 @@
name = "Flyperson"
id = "fly"
say_mod = "buzzes"
- species_traits = list(SPECIES_ORGANIC)
+ species_traits = list(SPECIES_ORGANIC, NOEYES)
mutanttongue = /obj/item/organ/tongue/fly
mutantliver = /obj/item/organ/liver/fly
mutantstomach = /obj/item/organ/stomach/fly
diff --git a/code/modules/mob/living/carbon/human/species_types/mothmen.dm b/code/modules/mob/living/carbon/human/species_types/mothmen.dm
new file mode 100644
index 00000000000..778676b0183
--- /dev/null
+++ b/code/modules/mob/living/carbon/human/species_types/mothmen.dm
@@ -0,0 +1,69 @@
+/datum/species/moth
+ name = "Mothmen"
+ id = "moth"
+ say_mod = "flutters"
+ default_color = "00FF00"
+ species_traits = list(LIPS, SPECIES_ORGANIC, NOEYES)
+ mutant_bodyparts = list("moth_wings")
+ default_features = list("moth_wings" = "Plain")
+ attack_verb = "slash"
+ attack_sound = 'sound/weapons/slash.ogg'
+ miss_sound = 'sound/weapons/slashmiss.ogg'
+ meat = /obj/item/reagent_containers/food/snacks/meat/slab/human/mutant/moth
+ liked_food = VEGETABLES | DAIRY
+ disliked_food = FRUIT | GROSS
+ toxic_food = MEAT | RAW
+
+/datum/species/moth/on_species_gain(mob/living/carbon/C)
+ . = ..()
+ if(ishuman(C))
+ var/mob/living/carbon/human/H = C
+ if(!H.dna.features["moth_wings"])
+ H.dna.features["moth_wings"] = "[(H.client && H.client.prefs && LAZYLEN(H.client.prefs.features) && H.client.prefs.features["moth_wings"]) ? H.client.prefs.features["moth_wings"] : "Plain"]"
+ handle_mutant_bodyparts(H)
+ C.grant_language(/datum/language/moth)
+
+/datum/species/moth/on_species_loss(mob/living/carbon/C)
+ . = ..()
+ C.remove_language(/datum/language/moth)
+
+/datum/species/moth/random_name(gender,unique,lastname)
+ if(unique)
+ return random_unique_moth_name(gender)
+
+ var/randname = moth_name(gender)
+
+ if(lastname)
+ randname += " [lastname]"
+
+ return randname
+
+/datum/species/moth/qualifies_for_rank(rank, list/features)
+ if(CONFIG_GET(flag/enforce_human_authority) && (rank in GLOB.command_positions))
+ return FALSE
+ return TRUE
+
+/datum/species/moth/handle_fire(mob/living/carbon/human/H, no_protection = FALSE)
+ ..()
+ if(H.dna.features["moth_wings"] != "Burnt Off" && H.bodytemperature >= 800 && H.fire_stacks > 0) //do not go into the extremely hot light. you will not survive
+ to_chat(H, "Your precious wings burn to a crisp!")
+ H.dna.features["moth_wings"] = "Burnt Off"
+ handle_mutant_bodyparts(H)
+
+/datum/species/moth/handle_chemicals(datum/reagent/chem, mob/living/carbon/human/H)
+ . = ..()
+ if(chem.id == "pestkiller")
+ H.adjustToxLoss(3)
+ H.reagents.remove_reagent(chem.id, REAGENTS_METABOLISM)
+
+/datum/species/moth/check_weakness(obj/item/weapon, mob/living/attacker)
+ if(istype(weapon, /obj/item/melee/flyswatter))
+ return 9 //flyswatters deal 10x damage to moths
+ return 0
+
+/datum/species/moth/space_move(mob/living/carbon/human/H)
+ . = ..()
+ if(H.loc && !isspaceturf(H.loc) && H.dna.features["moth_wings"] != "Burnt Off")
+ var/datum/gas_mixture/current = H.loc.return_air()
+ if(current && (current.return_pressure() >= ONE_ATMOSPHERE*0.85)) //as long as there's reasonable pressure and no gravity, flight is possible
+ return TRUE
diff --git a/code/modules/reagents/chemistry/reagents/other_reagents.dm b/code/modules/reagents/chemistry/reagents/other_reagents.dm
index f2b09632729..e63950ddb30 100644
--- a/code/modules/reagents/chemistry/reagents/other_reagents.dm
+++ b/code/modules/reagents/chemistry/reagents/other_reagents.dm
@@ -452,6 +452,14 @@
race = /datum/species/fly
mutationtext = "The pain subsides. You feel... buzzy."
+/datum/reagent/mutationtoxin/moth
+ name = "Moth Mutation Toxin"
+ id = "mothmutationtoxin"
+ description = "A glowing toxin."
+ color = "#5EFF3B" //RGB: 94, 255, 59
+ race = /datum/species/moth
+ mutationtext = "The pain subsides. You feel... attracted to light."
+
/datum/reagent/mutationtoxin/pod
name = "Podperson Mutation Toxin"
id = "podmutationtoxin"
diff --git a/code/modules/surgery/organs/tongue.dm b/code/modules/surgery/organs/tongue.dm
index ba988f450db..f3f764c7376 100644
--- a/code/modules/surgery/organs/tongue.dm
+++ b/code/modules/surgery/organs/tongue.dm
@@ -16,7 +16,8 @@
/datum/language/narsie,
/datum/language/beachbum,
/datum/language/ratvar,
- /datum/language/aphasia
+ /datum/language/aphasia,
+ /datum/language/moth
))
/obj/item/organ/tongue/Initialize(mapload)
diff --git a/config/game_options.txt b/config/game_options.txt
index babab059a28..f05b5c9a3fd 100644
--- a/config/game_options.txt
+++ b/config/game_options.txt
@@ -386,6 +386,7 @@ ROUNDSTART_RACES human
## Races that are strictly worse than humans that could probably be turned on without balance concerns
ROUNDSTART_RACES lizard
#ROUNDSTART_RACES fly
+#ROUNDSTART_RACES moth
ROUNDSTART_RACES plasmaman
#ROUNDSTART_RACES shadow
diff --git a/icons/misc/language.dmi b/icons/misc/language.dmi
index 4e627f16c75..dcd10a51b7d 100644
Binary files a/icons/misc/language.dmi and b/icons/misc/language.dmi differ
diff --git a/icons/mob/human_parts.dmi b/icons/mob/human_parts.dmi
index 773ec5f9124..fbb25267bc5 100644
Binary files a/icons/mob/human_parts.dmi and b/icons/mob/human_parts.dmi differ
diff --git a/icons/mob/wings.dmi b/icons/mob/wings.dmi
index 5f261b76fe3..b2990a15094 100644
Binary files a/icons/mob/wings.dmi and b/icons/mob/wings.dmi differ
diff --git a/icons/obj/food/food.dmi b/icons/obj/food/food.dmi
index 26822c2c015..cd15db05527 100644
Binary files a/icons/obj/food/food.dmi and b/icons/obj/food/food.dmi differ
diff --git a/strings/names/moth.txt b/strings/names/moth.txt
new file mode 100644
index 00000000000..ce1e4543f56
--- /dev/null
+++ b/strings/names/moth.txt
@@ -0,0 +1,40 @@
+Attacus
+Ascalapha
+Catocala
+Hyalophora
+Argema
+Opodiphthera
+Actias
+Antheraea
+Sphingidae
+Helicoverpa
+Spodoptera
+Maruca
+Thaumetopoea
+Mythimna
+Plutella
+Timandra
+Eugnorisma
+Eacles
+Epiphyas
+Bombyx
+Ochropleura
+Xanthorhoe
+Mythimna
+Chloroclystis
+Naenia
+Aphomia
+Eupithecia
+Callosamia
+Cryphia
+Acherontia
+Lymantria
+Cydia
+Ostrinia
+Xestia
+Plodia
+Axylia
+Naenia
+Cucullia
+Euplexia
+Diarsia
\ No newline at end of file
diff --git a/tgstation.dme b/tgstation.dme
index 236cb338e42..1f4a189e0ea 100755
--- a/tgstation.dme
+++ b/tgstation.dme
@@ -1603,6 +1603,7 @@
#include "code\modules\language\language_menu.dm"
#include "code\modules\language\machine.dm"
#include "code\modules\language\monkey.dm"
+#include "code\modules\language\moth.dm"
#include "code\modules\language\narsian.dm"
#include "code\modules\language\ratvarian.dm"
#include "code\modules\language\slime.dm"
@@ -1789,6 +1790,7 @@
#include "code\modules\mob\living\carbon\human\species_types\humans.dm"
#include "code\modules\mob\living\carbon\human\species_types\jellypeople.dm"
#include "code\modules\mob\living\carbon\human\species_types\lizardpeople.dm"
+#include "code\modules\mob\living\carbon\human\species_types\mothmen.dm"
#include "code\modules\mob\living\carbon\human\species_types\plasmamen.dm"
#include "code\modules\mob\living\carbon\human\species_types\podpeople.dm"
#include "code\modules\mob\living\carbon\human\species_types\shadowpeople.dm"