-
-
Notifications
You must be signed in to change notification settings - Fork 444
/
Copy pathfelinid.dm
278 lines (245 loc) · 10.4 KB
/
felinid.dm
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
//Subtype of human
/datum/species/human/felinid
name = "Felinid Human"
id = SPECIES_FELINE
limbs_id = SPECIES_HUMAN
monitor_icon = "paw"
monitor_color = "#f52ab4"
attack_verbs = list("slash")
attack_effect = ATTACK_EFFECT_CLAW
attack_sound = 'sound/weapons/slash.ogg'
miss_sound = 'sound/weapons/slashmiss.ogg'
species_traits = list(EYECOLOR,HAIR,FACEHAIR,LIPS,HAS_FLESH,HAS_BONE,HAS_TAIL)
mutant_bodyparts = list("ears", "tail_human")
default_features = list("mcolor" = "#FFFFFF", "tail_human" = "Cat", "ears" = "Cat", "wings" = "None")
rare_say_mod = list("meows"= 10)
liked_food = SEAFOOD | DAIRY | MICE
disliked_food = GROSS | RAW
toxic_food = TOXIC | CHOCOLATE
mutantears = /obj/item/organ/ears/cat
mutanttail = /obj/item/organ/tail/cat
changesource_flags = MIRROR_BADMIN | WABBAJACK | MIRROR_PRIDE | MIRROR_MAGIC | RACE_SWAP | ERT_SPAWN | SLIME_EXTRACT
swimming_component = /datum/component/swimming/felinid
species_language_holder = /datum/language_holder/felinid
screamsound = list('sound/voice/feline/scream1.ogg', 'sound/voice/feline/scream2.ogg', 'sound/voice/feline/scream3.ogg')
smells_like = "hairballs and litter"
/datum/species/human/felinid/qualifies_for_rank(rank, list/features)
return TRUE
//Curiosity killed the cat's wagging tail.
/datum/species/human/felinid/on_species_gain(mob/living/carbon/C, datum/species/old_species, pref_load)
. = ..()
if(ishuman(C))
var/mob/living/carbon/human/H = C
if(!pref_load) //Hah! They got forcefully purrbation'd. Force default felinid parts on them if they have no mutant parts in those areas!
if(H.dna.features["tail_human"] == "None")
H.dna.features["tail_human"] = "Cat"
if(H.dna.features["ears"] == "None")
H.dna.features["ears"] = "Cat"
if(H.dna.features["ears"] == "Cat")
var/obj/item/organ/ears/cat/ears = new
ears.Insert(H, drop_if_replaced = FALSE)
else
mutantears = /obj/item/organ/ears
if(H.dna.features["tail_human"] == "Cat")
var/obj/item/organ/tail/cat/tail = new
tail.Insert(H, drop_if_replaced = FALSE)
else
mutanttail = initial(old_species.mutanttail)
H.dna.update_uf_block(DNA_HUMAN_TAIL_BLOCK)
H.dna.update_uf_block(DNA_EARS_BLOCK)
/datum/species/human/felinid/on_species_loss(mob/living/carbon/H, datum/species/new_species, pref_load)
var/obj/item/organ/ears/cat/ears = H.getorgan(/obj/item/organ/ears/cat)
var/obj/item/organ/tail/cat/tail = H.getorgan(/obj/item/organ/tail/cat)
if(ears)
var/obj/item/organ/ears/NE
if(new_species && new_species.mutantears)
// Roundstart cat ears override new_species.mutantears, reset it here.
new_species.mutantears = initial(new_species.mutantears)
if(new_species.mutantears)
NE = new new_species.mutantears
if(!NE)
// Go with default ears
NE = new /obj/item/organ/ears
NE.Insert(H, drop_if_replaced = FALSE)
H.dna.update_uf_block(DNA_EARS_BLOCK)
if(tail)
var/obj/item/organ/tail/NT
if(new_species && new_species.mutanttail)
// Roundstart cat tail overrides new_species.mutanttail, reset it here.
new_species.mutanttail = initial(new_species.mutanttail)
if(new_species.mutanttail)
NT = new new_species.mutanttail
if(NT)
NT.Insert(H, drop_if_replaced = FALSE)
else
tail.Remove(H)
H.dna.update_uf_block(DNA_HUMAN_TAIL_BLOCK)
///turn everyone into catgirls. Technically not girls specifically but you get the point.
/proc/mass_purrbation()
for(var/M in GLOB.mob_list)
if(ishuman(M))
purrbation_apply(M)
CHECK_TICK
///turn all catgirls back
/proc/mass_remove_purrbation()
for(var/M in GLOB.mob_list)
if(ishuman(M))
purrbation_remove(M)
CHECK_TICK
///used to transmogrificate spacemen into or from catboys/girls. Arguments H = target spaceman and silent = TRUE/FALSE whether or not we alert them to their transformation with cute flavortext
/proc/purrbation_toggle(mob/living/carbon/human/H, silent = FALSE)
if(!ishumanbasic(H))
var/catgirlcheck = istype(H.getorganslot(ORGAN_SLOT_EARS), /obj/item/organ/ears/cat) || istype(H.getorganslot(ORGAN_SLOT_TAIL), /obj/item/organ/tail/cat) //if they've got cat parts they are likely an unfortunate victim of admin black magic AKA "fun", turn them back
if(catgirlcheck)
purrbation_remove(H, silent)
return FALSE
else
purrbation_apply(H, silent)
return TRUE
if(!iscatperson(H))
purrbation_apply(H, silent)
. = TRUE
else
purrbation_remove(H, silent)
. = FALSE
/proc/purrbation_toggle_onlyhumans(mob/living/carbon/human/H, silent = FALSE) //same as above but doesn't work on nonhumans - used by donor purrbation to reduce *accidental* double-cursed double-mutants //accidental my ASS they knew what they signed up for and they LIKED IT
if(!ishumanbasic(H))
return
if(!iscatperson(H))
purrbation_apply(H, silent)
. = TRUE
else
purrbation_remove(H, silent)
. = FALSE
///turns our poor spaceman into a CATGIRL. Point and laugh.
/proc/purrbation_apply(mob/living/carbon/human/H, silent = FALSE)
if(iscatperson(H))
return
if(!silent)
to_chat(H, "Something is nya~t right.")
playsound(get_turf(H), 'sound/effects/meow1.ogg', 50, 1, -1)
if(!ishumanbasic(H))
var/obj/item/organ/cattification = new /obj/item/organ/tail/cat()
var/old_part = H.getorganslot(ORGAN_SLOT_TAIL)
cattification.Insert(H)
if(istype(old_part, /obj/item/organ/tail/cat)) //Won't delete non-cat tails
qdel(old_part) //No duplicate tails allowed, but different tails can share because it's funny
cattification = new /obj/item/organ/ears/cat()
old_part = H.getorganslot(ORGAN_SLOT_EARS)
cattification.Insert(H)
qdel(old_part)
H.regenerate_icons()
return
H.set_species(/datum/species/human/felinid)
///return the degenerates to their original form
/proc/purrbation_remove(mob/living/carbon/human/H, silent = FALSE)
if(!silent)
to_chat(H, "You are no longer a cat.")
if(!ishumanbasic(H)) //not a basic human, nonhumans tend to have different appearances so turning them into humans would be lazy. Give them their normal ears and shit back
var/obj/item/organ/decattification = H.dna?.species.mutanttail
var/old_part = H.getorganslot(ORGAN_SLOT_TAIL)
qdel(old_part) //do this here since they potentially don't normally have a tail
if(decattification)
decattification = new decattification
if(istype(decattification, /obj/item/organ/tail/lizard))
var/obj/item/organ/tail/lizard/nyaamrrow = decattification
nyaamrrow.tail_type = H.dna.features["tail_lizard"]
nyaamrrow.spines = H.dna.features["spines"]
decattification.Insert(H)
decattification = H.dna?.species.mutantears
old_part = H.getorganslot(ORGAN_SLOT_EARS)
qdel(old_part) //do this here since they potentially don't normally have ears which would SUCK
if(decattification)
decattification = new decattification
decattification.Insert(H)
return
H.set_species(/datum/species/human)
/datum/species/human/felinid/get_scream_sound(mob/living/carbon/human/H)
return pick(screamsound)
/datum/species/human/felinid/spec_life(mob/living/carbon/human/H)
. = ..()
if((H.client && H.client.prefs.read_preference(/datum/preference/toggle/mood_tail_wagging)) && !is_wagging_tail() && H.mood_enabled)
var/datum/component/mood/mood = H.GetComponent(/datum/component/mood)
if(!istype(mood) || !(mood.shown_mood >= MOOD_LEVEL_HAPPY2))
return
var/chance = 0
switch(mood.shown_mood)
if(-INFINITY to MOOD_LEVEL_SAD4)
chance = -0.1
if(MOOD_LEVEL_SAD4 to MOOD_LEVEL_SAD3)
chance = -0.01
if(MOOD_LEVEL_HAPPY2 to MOOD_LEVEL_HAPPY3)
chance = 0.001
if(MOOD_LEVEL_HAPPY3 to MOOD_LEVEL_HAPPY4)
chance = 0.1
if(MOOD_LEVEL_HAPPY4 to INFINITY)
chance = 1
if(prob(abs(chance)))
switch(SIGN(chance))
if(1)
H.emote("wag")
if(-1)
stop_wagging_tail(H)
/datum/species/human/felinid/prepare_human_for_preview(mob/living/carbon/human/human)
human.hair_style = "Hime Cut"
human.hair_color = "fcc" // pink
human.update_hair()
var/obj/item/organ/ears/cat/cat_ears = human.getorgan(/obj/item/organ/ears/cat)
if (cat_ears)
cat_ears.color = human.hair_color
human.update_body()
/datum/species/human/felinid/get_species_description()
return "Felinids are one of the many types of bespoke genetic \
modifications to come of humanity's mastery of genetic science, and are \
also one of the most common. Meow?"
/datum/species/human/felinid/get_species_lore()
return list(
"Bio-engineering at its felinest, Felinids are the peak example of humanity's mastery of genetic code. \
One of many \"Animalid\" variants, Felinids are the most popular and common, as well as one of the \
biggest points of contention in genetic-modification.",
"Body modders were eager to splice human and feline DNA in search of the holy trifecta: ears, eyes, and tail. \
These traits were in high demand, with the corresponding side effects of vocal and neurochemical changes being seen as a minor inconvenience.",
"Sadly for the Felinids, they were not minor inconveniences. Shunned as subhuman and monstrous by many, Felinids (and other Animalids) \
sought their greener pastures out in the colonies, cloistering in communities of their own kind. \
As a result, outer Human space has a high Animalid population.",
)
/datum/species/human/felinid/get_laugh_sound(mob/living/carbon/human/felinid)
if(felinid.gender == FEMALE)
return 'sound/voice/human/womanlaugh.ogg'
return pick(
'sound/voice/human/manlaugh1.ogg',
'sound/voice/human/manlaugh2.ogg',
)
/datum/species/human/felinid/get_cough_sound(mob/living/carbon/human/felinid)
if(felinid.gender == FEMALE)
return pick(
'sound/voice/human/female_cough1.ogg',
'sound/voice/human/female_cough2.ogg',
'sound/voice/human/female_cough3.ogg',
'sound/voice/human/female_cough4.ogg',
'sound/voice/human/female_cough5.ogg',
'sound/voice/human/female_cough6.ogg',
)
return pick(
'sound/voice/human/male_cough1.ogg',
'sound/voice/human/male_cough2.ogg',
'sound/voice/human/male_cough3.ogg',
'sound/voice/human/male_cough4.ogg',
'sound/voice/human/male_cough5.ogg',
'sound/voice/human/male_cough6.ogg',
)
/datum/species/human/felinid/get_cry_sound(mob/living/carbon/human/felinid)
if(felinid.gender == FEMALE)
return pick(
'sound/voice/human/female_cry1.ogg',
'sound/voice/human/female_cry2.ogg',
)
return pick(
'sound/voice/human/male_cry1.ogg',
'sound/voice/human/male_cry2.ogg',
'sound/voice/human/male_cry3.ogg',
)
/datum/species/human/felinid/get_sneeze_sound(mob/living/carbon/human/felinid)
if(felinid.gender == FEMALE)
return 'sound/voice/human/female_sneeze1.ogg'
return 'sound/voice/human/male_sneeze1.ogg'