Merge pull request #13473 from Tupinambis/spooder
Ports Arachnids (Spider People) from WaspStation
This commit is contained in:
@@ -86,6 +86,7 @@ GLOBAL_LIST_INIT(turfs_without_ground, typecacheof(list(
|
||||
#define isinsect(A) (is_species(A, /datum/species/insect))
|
||||
#define isxenoperson(A) (is_species(A, /datum/species/xeno))
|
||||
#define isstartjelly(A) (is_species(A, /datum/species/jelly/roundstartslime))
|
||||
#define isarachnid(A) (is_species(A, /datum/species/arachnid))
|
||||
|
||||
//more carbon mobs
|
||||
#define ismonkey(A) (istype(A, /mob/living/carbon/monkey))
|
||||
|
||||
@@ -32,6 +32,9 @@
|
||||
init_sprite_accessory_subtypes(/datum/sprite_accessory/caps, GLOB.caps_list)
|
||||
init_sprite_accessory_subtypes(/datum/sprite_accessory/insect_wings, GLOB.insect_wings_list)
|
||||
init_sprite_accessory_subtypes(/datum/sprite_accessory/insect_fluff, GLOB.insect_fluffs_list)
|
||||
init_sprite_accessory_subtypes(/datum/sprite_accessory/arachnid_legs, GLOB.arachnid_legs_list)
|
||||
init_sprite_accessory_subtypes(/datum/sprite_accessory/arachnid_spinneret, GLOB.arachnid_spinneret_list)
|
||||
init_sprite_accessory_subtypes(/datum/sprite_accessory/arachnid_mandibles, GLOB.arachnid_mandibles_list)
|
||||
init_sprite_accessory_subtypes(/datum/sprite_accessory/deco_wings, GLOB.deco_wings_list)
|
||||
|
||||
//CIT CHANGES START HERE, ADDS SNOWFLAKE BODYPARTS AND MORE
|
||||
|
||||
@@ -76,6 +76,12 @@
|
||||
init_sprite_accessory_subtypes(/datum/sprite_accessory/insect_fluff, GLOB.insect_fluffs_list)
|
||||
if(!GLOB.insect_markings_list.len)
|
||||
init_sprite_accessory_subtypes(/datum/sprite_accessory/insect_markings, GLOB.insect_markings_list)
|
||||
if(!GLOB.arachnid_legs_list.len)
|
||||
init_sprite_accessory_subtypes(/datum/sprite_accessory/arachnid_legs, GLOB.arachnid_legs_list)
|
||||
if(!GLOB.arachnid_spinneret_list.len)
|
||||
init_sprite_accessory_subtypes(/datum/sprite_accessory/arachnid_spinneret, GLOB.arachnid_spinneret_list)
|
||||
if(!GLOB.arachnid_mandibles_list.len)
|
||||
init_sprite_accessory_subtypes(/datum/sprite_accessory/arachnid_mandibles, GLOB.arachnid_mandibles_list)
|
||||
|
||||
//CIT CHANGES - genitals and such
|
||||
if(!GLOB.cock_shapes_list.len)
|
||||
@@ -177,6 +183,9 @@
|
||||
"insect_wings" = pick(GLOB.insect_wings_list),
|
||||
"insect_fluff" = "None",
|
||||
"insect_markings" = pick(GLOB.insect_markings_list),
|
||||
"arachnid_legs" = pick(GLOB.arachnid_legs_list),
|
||||
"arachnid_spinneret" = pick(GLOB.arachnid_spinneret_list),
|
||||
"arachnid_mandibles" = pick(GLOB.arachnid_mandibles_list),
|
||||
"taur" = "None",
|
||||
"mam_body_markings" = snowflake_markings_list.len ? pick(snowflake_markings_list) : "None",
|
||||
"mam_ears" = snowflake_ears_list ? pick(snowflake_ears_list) : "None",
|
||||
@@ -278,6 +287,13 @@
|
||||
if(!findname(.))
|
||||
break
|
||||
|
||||
/proc/random_unique_arachnid_name(attempts_to_find_unique_name=10)
|
||||
for(var/i in 1 to attempts_to_find_unique_name)
|
||||
. = capitalize(pick(GLOB.arachnid_first)) + " " + capitalize(pick(GLOB.arachnid_last))
|
||||
|
||||
if(!findname(.))
|
||||
break
|
||||
|
||||
#define SKINTONE2HEX(skin_tone) GLOB.skin_tones[skin_tone] || skin_tone
|
||||
|
||||
/proc/random_skin_tone()
|
||||
|
||||
@@ -16,6 +16,9 @@
|
||||
/proc/moth_name()
|
||||
return "[pick(GLOB.moth_first)] [pick(GLOB.moth_last)]"
|
||||
|
||||
/proc/arachnid_name()
|
||||
return "[pick(GLOB.arachnid_first)] [pick(GLOB.arachnid_last)]"
|
||||
|
||||
/proc/church_name()
|
||||
var/static/church_name
|
||||
if (church_name)
|
||||
|
||||
@@ -38,6 +38,9 @@ GLOBAL_LIST_EMPTY(r_wings_list)
|
||||
GLOBAL_LIST_EMPTY(insect_wings_list)
|
||||
GLOBAL_LIST_EMPTY(insect_fluffs_list)
|
||||
GLOBAL_LIST_EMPTY(insect_markings_list)
|
||||
GLOBAL_LIST_EMPTY(arachnid_legs_list)
|
||||
GLOBAL_LIST_EMPTY(arachnid_spinneret_list)
|
||||
GLOBAL_LIST_EMPTY(arachnid_mandibles_list)
|
||||
GLOBAL_LIST_EMPTY(caps_list)
|
||||
|
||||
//a way to index the right bodypart list given the type of bodypart
|
||||
@@ -60,6 +63,9 @@ GLOBAL_LIST_INIT(mutant_reference_list, list(
|
||||
"insect_wings" = GLOB.insect_wings_list,
|
||||
"insect_fluff" = GLOB.insect_fluffs_list,
|
||||
"insect_markings" = GLOB.insect_markings_list,
|
||||
"arachnid_legs" = GLOB.arachnid_legs_list,
|
||||
"arachnid_spinneret" = GLOB.arachnid_spinneret_list,
|
||||
"arachnid_mandibles" = GLOB.arachnid_mandibles_list,
|
||||
"caps" = GLOB.caps_list,
|
||||
"ipc_screen" = GLOB.ipc_screens_list,
|
||||
"ipc_antenna" = GLOB.ipc_antennas_list,
|
||||
@@ -275,7 +281,7 @@ GLOBAL_LIST_INIT(roundstart_tongues, list("default","human tongue" = /obj/item/o
|
||||
//locked parts are those that your picked species requires to have
|
||||
//unlocked parts are those that anyone can choose on customisation regardless
|
||||
//parts not in unlocked, but in all, are thus locked
|
||||
GLOBAL_LIST_INIT(all_mutant_parts, list("tail_lizard" = "Tail", "mam_tail" = "Tail", "tail_human" = "Tail", "snout" = "Snout", "frills" = "Frills", "spines" = "Spines", "body_markings" = "Body Markings", "mam_body_markings" = "Species Markings" , "mam_ears" = "Ears", "ears" = "Ears", "mam_snouts" = "Snout", "legs" = "Legs", "deco_wings" = "Decorative Wings", "insect_wings" = "Insect Wings", "insect_fluff" = "Insect Fluff", "taur" = "Tauric Body", "insect_markings" = "Insect Markings", "wings" = "Wings", "xenohead" = "Caste Head", "xenotail" = "Tail", "xenodorsal" = "Dorsal Spines", "ipc_screen" = "Screen", "ipc_antenna" = "Antenna", "meat_type" = "Meat Type", "horns" = "Horns"))
|
||||
GLOBAL_LIST_INIT(all_mutant_parts, list("tail_lizard" = "Tail", "mam_tail" = "Tail", "tail_human" = "Tail", "snout" = "Snout", "frills" = "Frills", "spines" = "Spines", "body_markings" = "Body Markings", "mam_body_markings" = "Species Markings" , "mam_ears" = "Ears", "ears" = "Ears", "mam_snouts" = "Snout", "legs" = "Legs", "deco_wings" = "Decorative Wings", "insect_wings" = "Insect Wings", "insect_fluff" = "Insect Fluff", "taur" = "Tauric Body", "insect_markings" = "Insect Markings", "wings" = "Wings", "arachnid_legs" = "Arachnid Legs", "arachnid_spinneret" = "Spinneret", "arachnid_mandibles" = "Mandibles", "xenohead" = "Caste Head", "xenotail" = "Tail", "xenodorsal" = "Dorsal Spines", "ipc_screen" = "Screen", "ipc_antenna" = "Antenna", "meat_type" = "Meat Type", "horns" = "Horns"))
|
||||
GLOBAL_LIST_INIT(unlocked_mutant_parts, list("horns", "insect_fluff"))
|
||||
|
||||
//parts in either of the above two lists that require a second option that allows them to be coloured
|
||||
|
||||
@@ -16,6 +16,8 @@ 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_first, world.file2list("strings/names/moth_first.txt"))
|
||||
GLOBAL_LIST_INIT(moth_last, world.file2list("strings/names/moth_last.txt"))
|
||||
GLOBAL_LIST_INIT(arachnid_first, world.file2list("strings/names/arachnid_first.txt"))
|
||||
GLOBAL_LIST_INIT(arachnid_last, world.file2list("strings/names/arachnid_last.txt"))
|
||||
GLOBAL_LIST_INIT(plasmaman_names, world.file2list("strings/names/plasmaman.txt"))
|
||||
GLOBAL_LIST_INIT(ethereal_names, world.file2list("strings/names/ethereal.txt"))
|
||||
GLOBAL_LIST_INIT(posibrain_names, world.file2list("strings/names/posibrain.txt"))
|
||||
|
||||
@@ -198,7 +198,8 @@ SUBSYSTEM_DEF(traumas)
|
||||
"aliens" = typecacheof(list(/datum/species/abductor, /datum/species/jelly, /datum/species/pod, /datum/species/shadow)),
|
||||
"anime" = typecacheof(list(/datum/species/human/felinid)),
|
||||
"cats" = typecacheof(list(/datum/species/human/felinid)),
|
||||
"syndicate" = typecacheof(list(/datum/species/corporate, /datum/species/zombie/infectious))
|
||||
"syndicate" = typecacheof(list(/datum/species/corporate, /datum/species/zombie/infectious)),
|
||||
"arachnid" = typecacheof(list(/datum/species/arachnid))
|
||||
)
|
||||
|
||||
return ..()
|
||||
|
||||
@@ -342,8 +342,9 @@
|
||||
to_chat(user, "<span class='warning'>You can't lay webs here!</span>")
|
||||
failed = TRUE
|
||||
var/turf/T = get_turf(user)
|
||||
var/obj/structure/spider/stickyweb/genetic/W = locate() in T
|
||||
if(W)
|
||||
var/obj/structure/spider/stickyweb/W = locate() in T
|
||||
var/obj/structure/arachnid/W2 = locate() in T
|
||||
if(W || W2)
|
||||
to_chat(user, "<span class='warning'>There's already a web here!</span>")
|
||||
failed = TRUE
|
||||
if(failed)
|
||||
|
||||
@@ -0,0 +1,70 @@
|
||||
/obj/structure/arachnid
|
||||
name = "large web"
|
||||
icon = 'icons/effects/effects.dmi'
|
||||
desc = "It's stringy and sticky, but the threads are larger than what spiderlings could produce."
|
||||
anchored = TRUE
|
||||
density = FALSE
|
||||
max_integrity = 20
|
||||
|
||||
/obj/structure/arachnid/New()
|
||||
..()
|
||||
icon_state = pick(list("stickyweb1", "stickyweb2"))
|
||||
|
||||
|
||||
/obj/structure/arachnid/play_attack_sound(damage_amount, damage_type = BRUTE, damage_flag = 0)
|
||||
if(damage_type == BURN)//the stickiness of the web mutes all attack sounds except fire damage type
|
||||
playsound(loc, 'sound/items/welder.ogg', 100, TRUE)
|
||||
|
||||
/obj/structure/arachnid/run_obj_armor(damage_amount, damage_type, damage_flag = 0, attack_dir)
|
||||
if(damage_flag == "melee")
|
||||
switch(damage_type)
|
||||
if(BURN)
|
||||
damage_amount *= 2
|
||||
if(BRUTE)
|
||||
damage_amount *= 0.5
|
||||
. = ..()
|
||||
|
||||
/obj/structure/arachnid/temperature_expose(datum/gas_mixture/air, exposed_temperature, exposed_volume)
|
||||
if(exposed_temperature > 300)
|
||||
take_damage(5, BURN, 0, 0)
|
||||
|
||||
/obj/structure/arachnid/CanPass(atom/movable/mover, turf/target)
|
||||
. = ..()
|
||||
if(isarachnid(mover))
|
||||
|
||||
return TRUE
|
||||
else if(isliving(mover))
|
||||
if(isarachnid(mover.pulledby))
|
||||
|
||||
return TRUE
|
||||
if(prob(20))
|
||||
to_chat(mover, "<span class='danger'>You get stuck in \the [src] for a moment.</span>")
|
||||
return FALSE
|
||||
|
||||
/obj/structure/arachnid/cocoon
|
||||
name = "cocoon"
|
||||
desc = "Something wrapped in silky spider web."
|
||||
icon_state = "cocoon1"
|
||||
anchored = FALSE
|
||||
density = FALSE
|
||||
max_integrity = 60
|
||||
|
||||
/obj/structure/arachnid/cocoon/Initialize()
|
||||
icon_state = pick("cocoon1","cocoon2","cocoon3")
|
||||
. = ..()
|
||||
|
||||
/obj/structure/arachnid/cocoon/container_resist(mob/living/user)
|
||||
var/breakout_time = 150 // DECI not DECA ffs
|
||||
to_chat(user, "<span class='notice'>You struggle against the tight bonds... (This will take about [DisplayTimeText(breakout_time)].)</span>")
|
||||
visible_message("<span class='notice'>You see something struggling and writhing in \the [src]!</span>")
|
||||
if(do_after(user,(breakout_time), target = src))
|
||||
if(!user || user.stat != CONSCIOUS || user.loc != src)
|
||||
return
|
||||
qdel(src)
|
||||
|
||||
/obj/structure/arachnid/cocoon/Destroy()
|
||||
var/turf/T = get_turf(src)
|
||||
src.visible_message("<span class='warning'>\The [src] splits open.</span>")
|
||||
for(var/atom/movable/A in contents)
|
||||
A.forceMove(T)
|
||||
return ..()
|
||||
@@ -43,6 +43,9 @@
|
||||
H.dna.features["insect_wings"] = pick(GLOB.insect_wings_list)
|
||||
H.dna.features["deco_wings"] = pick(GLOB.deco_wings_list)
|
||||
H.dna.features["insect_fluff"] = pick(GLOB.insect_fluffs_list)
|
||||
H.dna.features["arachnid_legs"] = pick(GLOB.arachnid_legs_list)
|
||||
H.dna.features["arachnid_spinneret"] = pick(GLOB.arachnid_spinneret_list)
|
||||
H.dna.features["arachnid_mandibles"] = pick(GLOB.arachnid_mandibles_list)
|
||||
H.dna.features["flavor_text"] = "" //Oh no.
|
||||
H.dna.features["body_model"] = H.gender
|
||||
|
||||
|
||||
@@ -120,6 +120,9 @@ GLOBAL_LIST_EMPTY(preferences_datums)
|
||||
"insect_wings" = "Plain",
|
||||
"insect_fluff" = "None",
|
||||
"insect_markings" = "None",
|
||||
"arachnid_legs" = "Plain",
|
||||
"arachnid_spinneret" = "Plain",
|
||||
"arachnid_mandibles" = "Plain",
|
||||
"mam_body_markings" = "Plain",
|
||||
"mam_ears" = "None",
|
||||
"mam_snouts" = "None",
|
||||
@@ -1715,6 +1718,24 @@ GLOBAL_LIST_EMPTY(preferences_datums)
|
||||
if(new_ipc_antenna)
|
||||
features["ipc_antenna"] = new_ipc_antenna
|
||||
|
||||
if("arachnid_legs")
|
||||
var/new_arachnid_legs
|
||||
new_arachnid_legs = input(user, "Choose your character's variant of arachnid legs:", "Character Preference") as null|anything in GLOB.arachnid_legs_list
|
||||
if(new_arachnid_legs)
|
||||
features["arachnid_legs"] = new_arachnid_legs
|
||||
|
||||
if("arachnid_spinneret")
|
||||
var/new_arachnid_spinneret
|
||||
new_arachnid_spinneret = input(user, "Choose your character's spinneret markings:", "Character Preference") as null|anything in GLOB.arachnid_spinneret_list
|
||||
if(new_arachnid_spinneret)
|
||||
features["arachnid_spinneret"] = new_arachnid_spinneret
|
||||
|
||||
if("arachnid_mandibles")
|
||||
var/new_arachnid_mandibles
|
||||
new_arachnid_mandibles = input(user, "Choose your character's variant of mandibles:", "Character Preference") as null|anything in GLOB.arachnid_mandibles_list
|
||||
if (new_arachnid_mandibles)
|
||||
features["arachnid_mandibles"] = new_arachnid_mandibles
|
||||
|
||||
if("tail_lizard")
|
||||
var/new_tail
|
||||
new_tail = input(user, "Choose your character's tail:", "Character Preference") as null|anything in GLOB.tails_list_lizard
|
||||
@@ -1880,6 +1901,24 @@ GLOBAL_LIST_EMPTY(preferences_datums)
|
||||
if(new_insect_markings)
|
||||
features["insect_markings"] = new_insect_markings
|
||||
|
||||
if("arachnid_legs")
|
||||
var/new_arachnid_legs
|
||||
new_arachnid_legs = input(user, "Choose your character's variant of arachnid legs:", "Character Preference") as null|anything in GLOB.arachnid_legs_list
|
||||
if(new_arachnid_legs)
|
||||
features["arachnid_legs"] = new_arachnid_legs
|
||||
|
||||
if("arachnid_spinneret")
|
||||
var/new_arachnid_spinneret
|
||||
new_arachnid_spinneret = input(user, "Choose your character's spinneret markings:", "Character Preference") as null|anything in GLOB.arachnid_spinneret_list
|
||||
if(new_arachnid_spinneret)
|
||||
features["arachnid_spinneret"] = new_arachnid_spinneret
|
||||
|
||||
if("arachnid_mandibles")
|
||||
var/new_arachnid_mandibles
|
||||
new_arachnid_mandibles = input(user, "Choose your character's variant of mandibles:", "Character Preference") as null|anything in GLOB.arachnid_mandibles_list
|
||||
if (new_arachnid_mandibles)
|
||||
features["arachnid_mandibles"] = new_arachnid_mandibles
|
||||
|
||||
if("s_tone")
|
||||
var/list/choices = GLOB.skin_tones - GLOB.nonstandard_skin_tones
|
||||
if(CONFIG_GET(flag/allow_custom_skintones))
|
||||
@@ -1919,6 +1958,7 @@ GLOBAL_LIST_EMPTY(preferences_datums)
|
||||
features["xenotail"] = "None"
|
||||
features["tail_human"] = "None"
|
||||
features["tail_lizard"] = "None"
|
||||
features["arachnid_spinneret"] = "None"
|
||||
|
||||
if("ears")
|
||||
var/list/snowflake_ears_list = list()
|
||||
|
||||
@@ -563,6 +563,9 @@ SAVEFILE UPDATING/VERSIONING - 'Simplified', or rather, more coder-friendly ~Car
|
||||
S["feature_insect_wings"] >> features["insect_wings"]
|
||||
S["feature_insect_fluff"] >> features["insect_fluff"]
|
||||
S["feature_insect_markings"] >> features["insect_markings"]
|
||||
S["feature_arachnid_legs"] >> features["arachnid_legs"]
|
||||
S["feature_arachnid_spinneret"] >> features["arachnid_spinneret"]
|
||||
S["feature_arachnid_mandibles"] >> features["arachnid_mandibles"]
|
||||
S["feature_horns_color"] >> features["horns_color"]
|
||||
S["feature_wings_color"] >> features["wings_color"]
|
||||
S["persistent_scars"] >> persistent_scars
|
||||
@@ -747,6 +750,9 @@ SAVEFILE UPDATING/VERSIONING - 'Simplified', or rather, more coder-friendly ~Car
|
||||
features["insect_fluff"] = sanitize_inlist(features["insect_fluff"], GLOB.insect_fluffs_list)
|
||||
features["insect_markings"] = sanitize_inlist(features["insect_markings"], GLOB.insect_markings_list, "None")
|
||||
features["insect_wings"] = sanitize_inlist(features["insect_wings"], GLOB.insect_wings_list)
|
||||
features["arachnid_legs"] = sanitize_inlist(features["arachnid_legs"], GLOB.arachnid_legs_list, "Plain")
|
||||
features["arachnid_spinneret"] = sanitize_inlist(features["arachnid_spinneret"], GLOB.arachnid_spinneret_list, "Plain")
|
||||
features["arachnid_mandibles"] = sanitize_inlist(features["arachnid_mandibles"], GLOB.arachnid_mandibles_list, "Plain")
|
||||
|
||||
var/static/size_min
|
||||
if(!size_min)
|
||||
@@ -886,6 +892,9 @@ SAVEFILE UPDATING/VERSIONING - 'Simplified', or rather, more coder-friendly ~Car
|
||||
WRITE_FILE(S["feature_insect_wings"] , features["insect_wings"])
|
||||
WRITE_FILE(S["feature_insect_fluff"] , features["insect_fluff"])
|
||||
WRITE_FILE(S["feature_insect_markings"] , features["insect_markings"])
|
||||
WRITE_FILE(S["feature_arachnid_legs"] , features["arachnid_legs"])
|
||||
WRITE_FILE(S["feature_arachnid_spinneret"] , features["arachnid_spinneret"])
|
||||
WRITE_FILE(S["feature_arachnid_mandibles"] , features["arachnid_mandibles"])
|
||||
WRITE_FILE(S["feature_meat"] , features["meat_type"])
|
||||
|
||||
WRITE_FILE(S["feature_has_cock"], features["has_cock"])
|
||||
|
||||
@@ -0,0 +1,15 @@
|
||||
/datum/language/arachnid
|
||||
name = "Rachnidian"
|
||||
desc = "A language that exploits the multiple limbs of arachnids to do subtle dance like movements to communicate.\
|
||||
A proper speaker's movements are quick and sharp enough to make audible whiffs and thumps however, which are intelligible over the radio."
|
||||
speech_verb = "chitter"
|
||||
ask_verb = "chitter"
|
||||
exclaim_verb = "chitter"
|
||||
key = "r"
|
||||
flags = NO_STUTTER | LANGUAGE_HIDE_ICON_IF_NOT_UNDERSTOOD
|
||||
|
||||
icon_state = "arachnid"
|
||||
|
||||
/datum/language/arachnid/scramble(input)
|
||||
. = prob(65) ? "<i>wiff</i>" : "<i>thump</i>"
|
||||
. += (copytext(input, length(input)) == "?") ? "?" : "!"
|
||||
@@ -330,6 +330,12 @@ Key procs
|
||||
spoken_languages = list(/datum/language/common = list(LANGUAGE_ATOM),
|
||||
/datum/language/voltaic = list(LANGUAGE_ATOM))
|
||||
|
||||
/datum/language_holder/arachnid
|
||||
understood_languages = list(/datum/language/common = list(LANGUAGE_ATOM),
|
||||
/datum/language/arachnid = list(LANGUAGE_ATOM))
|
||||
spoken_languages = list(/datum/language/common = list(LANGUAGE_ATOM),
|
||||
/datum/language/arachnid = list(LANGUAGE_ATOM))
|
||||
|
||||
/datum/language_holder/empty
|
||||
understood_languages = list()
|
||||
spoken_languages = list()
|
||||
|
||||
@@ -0,0 +1,68 @@
|
||||
/datum/sprite_accessory/arachnid_legs
|
||||
icon = 'icons/mob/arachnid_legs.dmi'
|
||||
relevant_layers = list(BODY_BEHIND_LAYER, BODY_ADJ_LAYER, BODY_FRONT_LAYER)
|
||||
mutant_part_string = "arachnid_legs"
|
||||
color_src = 0
|
||||
|
||||
/datum/sprite_accessory/arachnid_legs/none
|
||||
name = "None"
|
||||
icon_state = null
|
||||
relevant_layers = null
|
||||
|
||||
/datum/sprite_accessory/arachnid_legs/plain
|
||||
name = "Plain"
|
||||
icon_state = "plain"
|
||||
|
||||
/datum/sprite_accessory/arachnid_legs/fuzzy
|
||||
name = "Fuzzy"
|
||||
icon_state = "fuzzy"
|
||||
|
||||
/datum/sprite_accessory/arachnid_legs/spiky
|
||||
name = "Spiky"
|
||||
icon_state = "spiky"
|
||||
|
||||
/datum/sprite_accessory/arachnid_spinneret
|
||||
icon = 'icons/mob/arachnid_spinneret.dmi'
|
||||
relevant_layers = list(BODY_BEHIND_LAYER, BODY_ADJ_LAYER, BODY_FRONT_LAYER)
|
||||
mutant_part_string = "spinneret"
|
||||
color_src = 0
|
||||
|
||||
/datum/sprite_accessory/arachnid_spinneret/none
|
||||
name = "None"
|
||||
icon_state = null
|
||||
relevant_layers = null
|
||||
|
||||
/datum/sprite_accessory/arachnid_spinneret/plain
|
||||
name = "Plain"
|
||||
icon_state = "plain"
|
||||
|
||||
/datum/sprite_accessory/arachnid_spinneret/fuzzy
|
||||
name = "Fuzzy"
|
||||
icon_state = "fuzzy"
|
||||
|
||||
/datum/sprite_accessory/arachnid_spinneret/black_widow
|
||||
name = "Black Widow"
|
||||
icon_state = "blackwidow"
|
||||
|
||||
/datum/sprite_accessory/arachnid_mandibles
|
||||
icon = 'icons/mob/arachnid_mandibles.dmi'
|
||||
relevant_layers = list(BODY_ADJ_LAYER, BODY_FRONT_LAYER)
|
||||
mutant_part_string = "mandibles"
|
||||
color_src = 0
|
||||
|
||||
/datum/sprite_accessory/arachnid_mandibles/none
|
||||
name = "None"
|
||||
icon_state = null
|
||||
relevant_layers = null
|
||||
|
||||
/datum/sprite_accessory/arachnid_mandibles/plain
|
||||
name = "Plain"
|
||||
icon_state = "plain"
|
||||
|
||||
/datum/sprite_accessory/arachnid_mandibles/fuzzy
|
||||
name = "Fuzzy"
|
||||
icon_state = "fuzzy"
|
||||
|
||||
/datum/sprite_accessory/arachnid_mandibles/spiky
|
||||
name = "Spiky"
|
||||
icon_state = "spiky"
|
||||
@@ -1250,3 +1250,6 @@
|
||||
|
||||
/mob/living/carbon/human/species/roundstartslime
|
||||
race = /datum/species/jelly/roundstartslime
|
||||
|
||||
/mob/living/carbon/human/species/arachnid
|
||||
race = /datum/species/arachnid
|
||||
|
||||
@@ -118,7 +118,9 @@ GLOBAL_LIST_EMPTY(roundstart_race_names)
|
||||
//the ids you can use for your species, if empty, it means default only and not changeable
|
||||
var/list/allowed_limb_ids
|
||||
|
||||
//the type of eyes this species has
|
||||
//override for the icon path used when setting bodypart overlays. Intended for species that don't fit in the standard 32x32 files.
|
||||
var/override_bp_icon
|
||||
//the icon state of the eyes this species has
|
||||
var/eye_type = "normal"
|
||||
|
||||
///////////
|
||||
|
||||
@@ -0,0 +1,155 @@
|
||||
/datum/species/arachnid
|
||||
name = "Arachnid"
|
||||
id = "arachnid"
|
||||
override_bp_icon = 'icons/mob/arachnid_parts.dmi'
|
||||
say_mod = "chitters"
|
||||
default_color = "00FF00"
|
||||
species_traits = list(LIPS, NOEYES, NO_UNDERWEAR)
|
||||
inherent_biotypes = MOB_ORGANIC|MOB_HUMANOID|MOB_BUG
|
||||
mutant_bodyparts = list("arachnid_legs" = "Plain", "arachnid_spinneret" = "Plain", "arachnid_mandibles" = "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/spider
|
||||
liked_food = MEAT | RAW
|
||||
disliked_food = FRUIT | GROSS
|
||||
toxic_food = VEGETABLES | DAIRY
|
||||
mutanteyes = /obj/item/organ/eyes/night_vision/arachnid
|
||||
mutanttongue = /obj/item/organ/tongue/arachnid
|
||||
species_language_holder = /datum/language_holder/arachnid
|
||||
brutemod = 1.1
|
||||
var/web_cooldown = 200
|
||||
var/web_ready = TRUE
|
||||
var/spinner_rate = 25
|
||||
|
||||
/datum/species/arachnid/random_name(gender,unique,lastname)
|
||||
if(unique)
|
||||
return random_unique_arachnid_name()
|
||||
|
||||
var/randname = arachnid_name()
|
||||
|
||||
if(lastname)
|
||||
randname += " [lastname]"
|
||||
|
||||
return randname
|
||||
|
||||
/datum/species/arachnid/handle_chemicals(datum/reagent/chem, mob/living/carbon/human/H)
|
||||
. = ..()
|
||||
if(chem.type == /datum/reagent/toxin/pestkiller)
|
||||
H.adjustToxLoss(3)
|
||||
H.reagents.remove_reagent(chem.type, REAGENTS_METABOLISM)
|
||||
|
||||
/datum/species/arachnid/check_weakness(obj/item/weapon, mob/living/attacker)
|
||||
if(istype(weapon, /obj/item/melee/flyswatter))
|
||||
return 9 //flyswatters deal 10x damage to arachnids
|
||||
return 0
|
||||
|
||||
/datum/species/arachnid/on_species_gain(mob/living/carbon/human/H, datum/species/old_species)
|
||||
. = ..()
|
||||
var/datum/action/innate/spin_web/SW = new
|
||||
var/datum/action/innate/spin_cocoon/SC = new
|
||||
SC.Grant(H)
|
||||
SW.Grant(H)
|
||||
|
||||
/datum/species/arachnid/on_species_loss(mob/living/carbon/human/H)
|
||||
. = ..()
|
||||
var/datum/action/innate/spin_web/SW = locate(/datum/action/innate/spin_web) in H.actions
|
||||
var/datum/action/innate/spin_cocoon/SC = locate(/datum/action/innate/spin_cocoon) in H.actions
|
||||
SC?.Remove(H)
|
||||
SW?.Remove(H)
|
||||
|
||||
/datum/action/innate/spin_web
|
||||
name = "Spin Web"
|
||||
check_flags = AB_CHECK_RESTRAINED|AB_CHECK_STUN|AB_CHECK_CONSCIOUS
|
||||
icon_icon = 'icons/mob/actions/actions_animal.dmi'
|
||||
button_icon_state = "lay_web"
|
||||
|
||||
/datum/action/innate/spin_cocoon
|
||||
name = "Spin Cocoon"
|
||||
check_flags = AB_CHECK_RESTRAINED|AB_CHECK_STUN|AB_CHECK_CONSCIOUS
|
||||
icon_icon = 'icons/mob/actions/actions_animal.dmi'
|
||||
button_icon_state = "wrap_0"
|
||||
|
||||
/datum/action/innate/spin_web/Activate()
|
||||
var/mob/living/carbon/human/species/arachnid/H = owner
|
||||
var/datum/species/arachnid/E = H.dna.species
|
||||
if(H.stat == "DEAD")
|
||||
return
|
||||
if(E.web_ready == FALSE)
|
||||
to_chat(H, "<span class='warning'>You need to wait a while to regenerate web fluid.</span>")
|
||||
return
|
||||
var/turf/T = get_turf(H)
|
||||
if(!T)
|
||||
to_chat(H, "<span class='warning'>There's no room to spin your web here!</span>")
|
||||
return
|
||||
var/obj/structure/spider/stickyweb/W = locate() in T
|
||||
var/obj/structure/arachnid/W2 = locate() in T
|
||||
if(W || W2)
|
||||
to_chat(H, "<span class='warning'>There's already a web here!</span>")
|
||||
return
|
||||
// Should have some minimum amount of food before trying to activate
|
||||
var/nutrition_threshold = NUTRITION_LEVEL_FED
|
||||
if (H.nutrition >= nutrition_threshold)
|
||||
to_chat(H, "<i>You begin spinning some web...</i>")
|
||||
if(!do_after(H, 10 SECONDS, 1, T))
|
||||
to_chat(H, "<span class='warning'>Your web spinning was interrupted!</span>")
|
||||
return
|
||||
H.adjust_nutrition(-E.spinner_rate)
|
||||
addtimer(VARSET_CALLBACK(E, web_ready, TRUE), E.web_cooldown)
|
||||
to_chat(H, "<i>You use up a fair amount of energy weaving a web on the ground with your spinneret!</i>")
|
||||
new /obj/structure/arachnid(T, owner)
|
||||
|
||||
else
|
||||
to_chat(H, "<span class='warning'>You're too hungry to spin web right now, eat something first!</span>")
|
||||
return
|
||||
/*
|
||||
This took me far too long to figure out so I'm gonna document it here.
|
||||
1) Create an innate action for the species
|
||||
2) Have that action trigger a RegisterSignal for mob clicking
|
||||
3) Trigger the cocoonAtom proc on that signal
|
||||
4) Validate the target then start spinning
|
||||
5) if you're not interrupted, force move the target to the cocoon created at their location.
|
||||
*/
|
||||
/datum/action/innate/spin_cocoon/Activate()
|
||||
var/mob/living/carbon/human/species/arachnid/H = owner
|
||||
var/datum/species/arachnid/E = H.dna.species
|
||||
if(H.stat == "DEAD")
|
||||
return
|
||||
if(E.web_ready == FALSE)
|
||||
to_chat(H, "<span class='warning'>You need to wait awhile to regenerate web fluid.</span>")
|
||||
return
|
||||
var/nutrition_threshold = NUTRITION_LEVEL_FED
|
||||
if (H.nutrition >= nutrition_threshold)
|
||||
to_chat(H, "<span class='warning'>You pull out a strand from your spinneret, ready to wrap a target. <BR>\
|
||||
(Press ALT+CLICK on the target to start wrapping.)</span>")
|
||||
H.adjust_nutrition(E.spinner_rate * -0.5)
|
||||
addtimer(VARSET_CALLBACK(E, web_ready, TRUE), E.web_cooldown)
|
||||
RegisterSignal(H, list(COMSIG_MOB_ALTCLICKON), .proc/cocoonAtom)
|
||||
return
|
||||
else
|
||||
to_chat(H, "<span class='warning'>You're too hungry to spin web right now, eat something first!</span>")
|
||||
return
|
||||
|
||||
/datum/action/innate/spin_cocoon/proc/cocoonAtom(mob/living/carbon/human/species/arachnid/H, atom/movable/A)
|
||||
UnregisterSignal(H, list(COMSIG_MOB_ALTCLICKON))
|
||||
var/datum/species/arachnid/E = H.dna.species
|
||||
if (!H || !isarachnid(H))
|
||||
return COMSIG_MOB_CANCEL_CLICKON
|
||||
else
|
||||
if(E.web_ready == FALSE)
|
||||
to_chat(H, "<span class='warning'>You need to wait awhile to regenerate web fluid.</span>")
|
||||
return
|
||||
if(!do_after(H, 10 SECONDS, 1, A))
|
||||
to_chat(H, "<span class='warning'>Your web spinning was interrupted!</span>")
|
||||
return
|
||||
H.adjust_nutrition(E.spinner_rate * -3)
|
||||
var/obj/structure/arachnid/cocoon/C = new(A.loc)
|
||||
if(isliving(A))
|
||||
C.icon_state = pick("cocoon_large1","cocoon_large2","cocoon_large3")
|
||||
A.forceMove(C)
|
||||
H.visible_message("<span class='danger'>[H] wraps [A] into a large cocoon!</span>")
|
||||
return
|
||||
else
|
||||
A.forceMove(C)
|
||||
H.visible_message("<span class='danger'>[H] wraps [A] into a cocoon!</span>")
|
||||
return
|
||||
@@ -368,7 +368,8 @@
|
||||
var/turf/T = get_turf(S)
|
||||
|
||||
var/obj/structure/spider/stickyweb/W = locate() in T
|
||||
if(W)
|
||||
var/obj/structure/arachnid/W2 = locate() in T
|
||||
if(W || W2)
|
||||
to_chat(S, "<span class='warning'>There's already a web here!</span>")
|
||||
return
|
||||
|
||||
|
||||
@@ -1969,7 +1969,7 @@ All effects don't start immediately, but rather get worse over time; the rate is
|
||||
|
||||
/datum/reagent/consumable/ethanol/bug_spray/on_mob_life(mob/living/carbon/M)
|
||||
//Bugs should not drink Bug spray.
|
||||
if(isinsect(M) || isflyperson(M))
|
||||
if(isinsect(M) || isflyperson(M) || isarachnid(M))
|
||||
M.adjustToxLoss(1,0)
|
||||
return ..()
|
||||
|
||||
|
||||
@@ -781,6 +781,12 @@
|
||||
race = /datum/species/lizard/ashwalker
|
||||
mutationtext = "<span class='danger'>The pain subsides. You feel... savage.</span>"
|
||||
|
||||
/datum/reagent/mutationtoxin/arachnid
|
||||
name = "Arachnid Mutation Toxin"
|
||||
description = "A glowing toxin."
|
||||
color = "#5EFF3B" //RGB: 94, 255, 59
|
||||
race = /datum/species/arachnid
|
||||
mutationtext = "<span class='danger'>The pain subsides. You feel... silky.</span>"
|
||||
|
||||
//DANGEROUS RACES
|
||||
/datum/reagent/mutationtoxin/shadow
|
||||
|
||||
@@ -715,21 +715,27 @@
|
||||
required_reagents = list(/datum/reagent/toxin/mindbreaker = 1, /datum/reagent/medicine/synaptizine = 1, /datum/reagent/water = 1)
|
||||
|
||||
/datum/chemical_reaction/cat
|
||||
name = "felinid mutation toxic"
|
||||
name = "felinid mutation toxin"
|
||||
id = /datum/reagent/mutationtoxin/felinid
|
||||
results = list(/datum/reagent/mutationtoxin/felinid = 1)
|
||||
required_reagents = list(/datum/reagent/toxin/mindbreaker = 1, /datum/reagent/ammonia = 1, /datum/reagent/water = 1, /datum/reagent/pax/catnip = 1, /datum/reagent/mutationtoxin = 1)
|
||||
required_temp = 450
|
||||
|
||||
/datum/chemical_reaction/moff
|
||||
name = "insect mutation toxic"
|
||||
name = "insect mutation toxin"
|
||||
id = /datum/reagent/mutationtoxin/insect
|
||||
results = list(/datum/reagent/mutationtoxin/insect = 1)
|
||||
required_reagents = list(/datum/reagent/liquid_dark_matter = 2, /datum/reagent/ammonia = 5, /datum/reagent/lithium = 1, /datum/reagent/mutationtoxin = 1)
|
||||
required_temp = 320
|
||||
|
||||
/datum/chemical_reaction/mutationtoxin/arachnid
|
||||
name = "arachnid mutation toxin"
|
||||
id = /datum/reagent/mutationtoxin/arachnid
|
||||
results = list(/datum/reagent/mutationtoxin/arachnid = 1)
|
||||
required_reagents = list(/datum/reagent/mutationtoxin/insect = 1, /datum/reagent/toxin/heparin = 10)
|
||||
|
||||
/datum/chemical_reaction/notlight //Harder to make do to it being a hard race to play
|
||||
name = "shadow muatatuin toxic"
|
||||
name = "shadow mutation toxin"
|
||||
id = /datum/reagent/mutationtoxin/shadow
|
||||
results = list(/datum/reagent/mutationtoxin/shadow = 1)
|
||||
required_reagents = list(/datum/reagent/liquid_dark_matter = 5, /datum/reagent/medicine/synaptizine = 10, /datum/reagent/medicine/oculine = 10, /datum/reagent/mutationtoxin = 1)
|
||||
|
||||
@@ -656,8 +656,11 @@
|
||||
body_markings = null
|
||||
aux_marking = null
|
||||
|
||||
if(species_id in GLOB.greyscale_limb_types) //should they have greyscales?
|
||||
base_bp_icon = DEFAULT_BODYPART_ICON_ORGANIC
|
||||
if(S.override_bp_icon)
|
||||
base_bp_icon = S.override_bp_icon
|
||||
else
|
||||
if(species_id in GLOB.greyscale_limb_types) //should they have greyscales?
|
||||
base_bp_icon = DEFAULT_BODYPART_ICON_ORGANIC
|
||||
|
||||
if(base_bp_icon != DEFAULT_BODYPART_ICON)
|
||||
color_src = mut_colors ? MUTCOLORS : ((H.dna.skin_tone_override && S.use_skintones == USE_SKINTONES_GRAYSCALE_CUSTOM) ? CUSTOM_SKINTONE : SKINTONE)
|
||||
|
||||
@@ -430,6 +430,12 @@
|
||||
if(severity >= 70)
|
||||
owner.adjustOrganLoss(ORGAN_SLOT_EYES, 20)
|
||||
|
||||
/obj/item/organ/eyes/night_vision/arachnid
|
||||
name = "arachnid eyes"
|
||||
desc = "These eyes seem to have increased sensitivity to bright light, offset by basic night vision."
|
||||
see_in_dark = 4
|
||||
flash_protect = -1
|
||||
|
||||
#undef BLURRY_VISION_ONE
|
||||
#undef BLURRY_VISION_TWO
|
||||
#undef BLIND_VISION_THREE
|
||||
|
||||
@@ -258,3 +258,22 @@
|
||||
/obj/item/organ/tongue/ethereal/Initialize(mapload)
|
||||
. = ..()
|
||||
languages_possible = languages_possible_ethereal
|
||||
|
||||
/obj/item/organ/tongue/arachnid
|
||||
name = "inner mandible"
|
||||
desc = "A set of soft, spoon-esque mandibles closer to the mouth opening, that allow for basic speech, and the ability to speak Rachnidian."
|
||||
say_mod = "chitters"
|
||||
var/static/list/languages_possible_arachnid = typecacheof(list(
|
||||
/datum/language/common,
|
||||
/datum/language/draconic,
|
||||
/datum/language/codespeak,
|
||||
/datum/language/monkey,
|
||||
/datum/language/narsie,
|
||||
/datum/language/beachbum,
|
||||
/datum/language/aphasia,
|
||||
/datum/language/arachnid,
|
||||
))
|
||||
|
||||
/obj/item/organ/tongue/arachnid/Initialize(mapload)
|
||||
. = ..()
|
||||
languages_possible = languages_possible_arachnid
|
||||
@@ -477,6 +477,7 @@ ROUNDSTART_RACES xeno
|
||||
ROUNDSTART_RACES slimeperson
|
||||
ROUNDSTART_RACES guilmon
|
||||
ROUNDSTART_RACES ipc
|
||||
ROUNDSTART_RACES arachnid
|
||||
|
||||
##-------------------------------------------------------------------------------------------
|
||||
|
||||
|
||||
Binary file not shown.
|
Before Width: | Height: | Size: 5.3 KiB After Width: | Height: | Size: 5.5 KiB |
Binary file not shown.
|
After Width: | Height: | Size: 2.0 KiB |
Binary file not shown.
|
After Width: | Height: | Size: 498 B |
Binary file not shown.
|
After Width: | Height: | Size: 1.2 KiB |
Binary file not shown.
|
After Width: | Height: | Size: 1.1 KiB |
@@ -0,0 +1,30 @@
|
||||
Zerzir
|
||||
Lalnuth
|
||||
Avisreb
|
||||
Qeqarnai
|
||||
Rhikkiezhith
|
||||
Necaqtex
|
||||
Aqi
|
||||
Shozhish
|
||||
Sraiza
|
||||
Ranqu
|
||||
Zellalshi
|
||||
Necoq
|
||||
Zaqod
|
||||
Salaree
|
||||
Xavis
|
||||
Cheqirni
|
||||
Nieqi
|
||||
Cakirkix
|
||||
Ivad
|
||||
Shenqazhe
|
||||
Azurte
|
||||
Lizire
|
||||
Ivur
|
||||
Kavur
|
||||
Raicheca
|
||||
Iqashe
|
||||
Eq'za
|
||||
Sak'sad
|
||||
Hiezih
|
||||
Cessix
|
||||
@@ -0,0 +1,30 @@
|
||||
Ik'sir
|
||||
Sechathi
|
||||
Qok'sut
|
||||
Yeqied
|
||||
Iravhoh
|
||||
Kriaqux
|
||||
Yikih
|
||||
Khaqa
|
||||
Azasnet
|
||||
Qhecid
|
||||
Qhin'qu
|
||||
Zhechikzor
|
||||
Qhovi
|
||||
Hirath
|
||||
Szornud
|
||||
Zasokaq
|
||||
Lhaqish
|
||||
Qhiretid
|
||||
Avizad
|
||||
Qallazi
|
||||
Qhizrud
|
||||
Qicirne
|
||||
Sezuveth
|
||||
Zelriker
|
||||
Rhiallor
|
||||
Zhaliesh
|
||||
Qoutirk'ab
|
||||
Chavi
|
||||
Riel'shes
|
||||
Khentax
|
||||
@@ -951,6 +951,7 @@
|
||||
#include "code\game\objects\structures.dm"
|
||||
#include "code\game\objects\effects\alien_acid.dm"
|
||||
#include "code\game\objects\effects\anomalies.dm"
|
||||
#include "code\game\objects\effects\arachnid_web.dm"
|
||||
#include "code\game\objects\effects\blessing.dm"
|
||||
#include "code\game\objects\effects\bump_teleporter.dm"
|
||||
#include "code\game\objects\effects\contraband.dm"
|
||||
@@ -2303,6 +2304,7 @@
|
||||
#include "code\modules\keybindings\keybind\robot.dm"
|
||||
#include "code\modules\keybindings\keybind\targeting.dm"
|
||||
#include "code\modules\language\aphasia.dm"
|
||||
#include "code\modules\language\arachnid.dm"
|
||||
#include "code\modules\language\beachbum.dm"
|
||||
#include "code\modules\language\codespeak.dm"
|
||||
#include "code\modules\language\common.dm"
|
||||
@@ -2421,6 +2423,7 @@
|
||||
#include "code\modules\mob\dead\new_player\preferences_setup.dm"
|
||||
#include "code\modules\mob\dead\new_player\sprite_accessories\_sprite_accessories.dm"
|
||||
#include "code\modules\mob\dead\new_player\sprite_accessories\alienpeople.dm"
|
||||
#include "code\modules\mob\dead\new_player\sprite_accessories\arachnid.dm"
|
||||
#include "code\modules\mob\dead\new_player\sprite_accessories\body_markings.dm"
|
||||
#include "code\modules\mob\dead\new_player\sprite_accessories\caps.dm"
|
||||
#include "code\modules\mob\dead\new_player\sprite_accessories\Citadel_Snowflake.dm"
|
||||
@@ -2552,6 +2555,7 @@
|
||||
#include "code\modules\mob\living\carbon\human\species_types\abductor.dm"
|
||||
#include "code\modules\mob\living\carbon\human\species_types\android.dm"
|
||||
#include "code\modules\mob\living\carbon\human\species_types\angel.dm"
|
||||
#include "code\modules\mob\living\carbon\human\species_types\arachnid.dm"
|
||||
#include "code\modules\mob\living\carbon\human\species_types\anthromorph.dm"
|
||||
#include "code\modules\mob\living\carbon\human\species_types\bugmen.dm"
|
||||
#include "code\modules\mob\living\carbon\human\species_types\corporate.dm"
|
||||
|
||||
Reference in New Issue
Block a user