Merge remote-tracking branch 'refs/remotes/Citadel-Station-13/master'

This commit is contained in:
Poojawa
2016-08-24 02:26:08 -05:00
41 changed files with 2192 additions and 72314 deletions

File diff suppressed because it is too large Load Diff

View File

@@ -71,6 +71,8 @@
#define EASYDISMEMBER 20
#define EASYLIMBATTACHMENT 21
#define TOXINLOVER 22
#define MUTCOLORS2 23
#define MUTCOLORS3 24
#define FLYING 65536

View File

@@ -23,24 +23,23 @@
#define FRIDAY_13TH "Friday the 13th"
//Human Overlays Indexes/////////
#define MUTATIONS_LAYER 27 //mutations. Tk headglows, cold resistance glow, etc
#define BODY_BEHIND_LAYER 26 //certain mutantrace features (tail when looking south) that must appear behind the body parts
#define BODYPARTS_LAYER 25 //Initially "AUGMENTS", this was repurposed to be a catch-all bodyparts flag
#define BODY_ADJ_LAYER 24 //certain mutantrace features (snout, body markings) that must appear above the body parts
#define BODY_LAYER 23 //underwear, undershirts, socks, eyes, lips(makeup)
#define FRONT_MUTATIONS_LAYER 22 //mutations that should appear above body, body_adj and bodyparts layer (e.g. laser eyes)
#define DAMAGE_LAYER 21 //damage indicators (cuts and burns)
#define UNIFORM_LAYER 20
#define ID_LAYER 19
#define SHOES_LAYER 18
#define GLOVES_LAYER 17
#define EARS_LAYER 16
#define SUIT_LAYER 15
#define GLASSES_LAYER 14
#define BELT_LAYER 13 //Possible make this an overlay of somethign required to wear a belt?
#define SUIT_STORE_LAYER 12
#define BACK_LAYER 11
#define TAIL_LAYER 10
#define MUTATIONS_LAYER 26 //mutations. Tk headglows, cold resistance glow, etc
#define BODY_BEHIND_LAYER 25 //certain mutantrace features (tail when looking south) that must appear behind the body parts
#define BODYPARTS_LAYER 24 //Initially "AUGMENTS", this was repurposed to be a catch-all bodyparts flag
#define BODY_ADJ_LAYER 23 //certain mutantrace features (snout, body markings) that must appear above the body parts
#define BODY_LAYER 22 //underwear, undershirts, socks, eyes, lips(makeup)
#define FRONT_MUTATIONS_LAYER 21 //mutations that should appear above body, body_adj and bodyparts layer (e.g. laser eyes)
#define DAMAGE_LAYER 20 //damage indicators (cuts and burns)
#define UNIFORM_LAYER 19
#define ID_LAYER 18
#define SHOES_LAYER 17
#define GLOVES_LAYER 16
#define EARS_LAYER 15
#define SUIT_LAYER 14
#define GLASSES_LAYER 13
#define BELT_LAYER 12 //Possible make this an overlay of somethign required to wear a belt?
#define SUIT_STORE_LAYER 11
#define BACK_LAYER 10
#define HAIR_LAYER 9 //TODO: make part of head layer?
#define FACEMASK_LAYER 8
#define HEAD_LAYER 7
@@ -50,7 +49,7 @@
#define R_HAND_LAYER 3 //Having the two hands seperate seems rather silly, merge them together? It'll allow for code to be reused on mobs with arbitarily many hands
#define BODY_FRONT_LAYER 2
#define FIRE_LAYER 1 //If you're on fire
#define TOTAL_LAYERS 27 //KEEP THIS UP-TO-DATE OR SHIT WILL BREAK ;_;
#define TOTAL_LAYERS 26 //KEEP THIS UP-TO-DATE OR SHIT WILL BREAK ;_;
//Human Overlay Index Shortcuts for alternate_worn_layer, layers
//Because I *KNOW* somebody will think layer+1 means "above"
@@ -146,6 +145,7 @@
#define CLICK_CD_MELEE 8
#define CLICK_CD_RANGE 4
#define CLICK_CD_CLICK_ABILITY 6
#define CLICK_CD_BREAKOUT 100
#define CLICK_CD_HANDCUFFED 10
#define CLICK_CD_RESIST 20
@@ -255,6 +255,8 @@
#define MAT_URANIUM "$uranium"
#define MAT_PLASMA "$plasma"
#define MAT_BANANIUM "$bananium"
#define MAT_TITANIUM "$titanium"
#define MAT_BIOMASS "$biomass"
//check_target_facings() return defines
@@ -303,6 +305,9 @@ var/list/bloody_footprints_cache = list()
#define POLLTYPE_TEXT "TEXT"
#define POLLTYPE_RATING "NUMVAL"
#define POLLTYPE_MULTI "MULTICHOICE"
#define POLLTYPE_IRV "IRV"
//lighting area defines
#define DYNAMIC_LIGHTING_DISABLED 0 //dynamic lighting disabled (area stays at full brightness)
@@ -313,6 +318,9 @@ var/list/bloody_footprints_cache = list()
//subtypesof(), typesof() without the parent path
#define subtypesof(typepath) ( typesof(typepath) - typepath )
//Gets the turf this atom inhabits
#define get_turf(A) (get_step(A, 0))
//Bot types
#define SEC_BOT 1 // Secutritrons (Beepsky) and ED-209s
#define MULE_BOT 2 // MULEbots
@@ -459,3 +467,28 @@ var/global/list/ghost_others_options = list(GHOST_OTHERS_SIMPLE, GHOST_OTHERS_DE
#define debug_world(msg) if (Debug2) world << "DEBUG: [msg]"
#define debug_admins(msg) if (Debug2) admins << "DEBUG: [msg]"
#define debug_world_log(msg) if (Debug2) world.log << "DEBUG: [msg]"
#define COORD(A) "([A.x],[A.y],[A.z])"
#define INCREMENT_TALLY(L, stat) if(L[stat]){L[stat]++}else{L[stat] = 1}
// Inventory depth: limits how many nested storage items you can access directly.
// 1: stuff in mob, 2: stuff in backpack, 3: stuff in box in backpack, etc
#define INVENTORY_DEPTH 3
#define STORAGE_VIEW_DEPTH 2
// Medal names
#define BOSS_KILL_MEDAL "Killer"
#define ALL_KILL_MEDAL "Exterminator" //Killing all of x type
// Score names
#define LEGION_SCORE "Legion Killed"
#define COLOSSUS_SCORE "Colossus Killed"
#define BUBBLEGUM_SCORE "Bubblegum Killed"
#define DRAKE_SCORE "Drakes Killed"
#define BOSS_SCORE "Bosses Killed"
#define TENDRIL_CLEAR_SCORE "Tendrils Killed"

View File

@@ -28,6 +28,7 @@
#define CHAT_GHOSTWHISPER 128
#define CHAT_GHOSTPDA 256
#define CHAT_GHOSTRADIO 512
#define CHAT_LOOC 1024
#define TOGGLES_DEFAULT_CHAT (CHAT_OOC|CHAT_DEAD|CHAT_GHOSTEARS|CHAT_GHOSTSIGHT|CHAT_PRAYER|CHAT_RADIO|CHAT_PULLR|CHAT_GHOSTWHISPER|CHAT_GHOSTPDA|CHAT_GHOSTRADIO)

View File

@@ -28,7 +28,11 @@
init_sprite_accessory_subtypes(/datum/sprite_accessory/spines, spines_list)
init_sprite_accessory_subtypes(/datum/sprite_accessory/spines_animated, animated_spines_list)
init_sprite_accessory_subtypes(/datum/sprite_accessory/wings, r_wings_list,roundstart = TRUE)
//mammal bodyparts (fucking furries)
init_sprite_accessory_subtypes(/datum/sprite_accessory/mam_body_markings, mam_body_markings_list)
init_sprite_accessory_subtypes(/datum/sprite_accessory/mam_tails, mam_tails_list)
init_sprite_accessory_subtypes(/datum/sprite_accessory/mam_ears, mam_ears_list)
init_sprite_accessory_subtypes(/datum/sprite_accessory/mam_tails_animated, mam_tails_animated_list)
//Species
for(var/spath in subtypesof(/datum/species))

View File

@@ -720,29 +720,16 @@ Turf and target are seperate in case you want to teleport some distance from a t
else
return zone
//Gets the turf this atom inhabits
/proc/get_turf(atom/A)
if (!istype(A))
return
for(A, A && !isturf(A), A=A.loc); //semicolon is for the empty statement
return A
/*
Gets the turf this atom's *ICON* appears to inhabit
It takes into account:
* Pixel_x/y
* Matrix x/y
NOTE: if your atom has non-standard bounds then this proc
will handle it, but:
* if the bounds are even, then there are an even amount of "middle" turfs, the one to the EAST, NORTH, or BOTH is picked
(this may seem bad, but you're atleast as close to the center of the atom as possible, better than byond's default loc being all the way off)
* if the bounds are odd, the true middle turf of the atom is returned
*/
/proc/get_turf_pixel(atom/movable/AM)
@@ -1015,7 +1002,6 @@ var/list/WALLITEMS_INVERSE = list(
/*
rough example of the "cone" made by the 3 dirs checked
B
\
\
@@ -1031,7 +1017,6 @@ B --><-- A
/
/
B
*/
@@ -1409,4 +1394,11 @@ proc/pick_closest_path(value)
admins_warned = 1
spawn(25)
message_admins(msg)
stack_trace(msg)
stack_trace(msg)
/proc/random_nukecode()
var/val = rand(0, 99999)
var/str = "[val]"
while(length(str) < 5)
str = "0" + str
. = str

View File

@@ -34,6 +34,12 @@ var/global/list/wings_list = list()
var/global/list/wings_open_list = list()
var/global/list/r_wings_list = list()
//Mammal Specific Mutant Human Bits
var/global/list/mam_body_markings_list = list()
var/global/list/mam_ears_list = list()
var/global/list/mam_tails_list = list()
var/global/list/mam_tails_animated_list = list()
var/global/list/ghost_forms_with_directions_list = list("ghost") //stores the ghost forms that support directional sprites
var/global/list/ghost_forms_with_accessories_list = list("ghost") //stores the ghost forms that support hair and other such things

114
code/citadel/_helpers.dm Normal file
View File

@@ -0,0 +1,114 @@
//THIS FOLDER CONTAINS CONSTANTS, PROCS, DEFINES, AND OTHER THINGS//
////////////////////////////////////////////////////////////////////
var/const/SIZEPLAY_TINY=1
var/const/SIZEPLAY_MICRO=2
var/const/SIZEPLAY_NORMAL=3
var/const/SIZEPLAY_MACRO=4
var/const/SIZEPLAY_HUGE=5
/proc/get_matrix_largest()
var/matrix/mtrx=new()
return mtrx.Scale(2)
/proc/get_matrix_large()
var/matrix/mtrx=new()
return mtrx.Scale(1.5)
/proc/get_matrix_norm()
var/matrix/mtrx=new()
return mtrx
/proc/get_matrix_small()
var/matrix/mtrx=new()
return mtrx.Scale(0.7)
/proc/get_matrix_smallest()
var/matrix/mtrx=new()
return mtrx.Scale(0.5)
proc/kpcode_race_getlist(var/restrict=0)
var/list/race_options = list()
for(var/r_id in species_list)
var/datum/species/R = kpcode_race_get(r_id)
if(!R.restricted||R.restricted==restrict)
race_options[r_id]=kpcode_race_get(r_id)
return race_options
proc/kpcode_race_get(var/name="human")
name=kpcode_race_san(name)
if(!name||name=="") name="human"
if(species_list[name])
var/type_to_use=species_list[name]
var/datum/species/return_this=new type_to_use()
return return_this
else
return kpcode_race_get()
proc/kpcode_race_san(var/input)
if(!input)input="human"
if(istype(input,/datum/species))
input=input:id
return input
proc/kpcode_race_restricted(var/name="human")
name=kpcode_race_san(name)
if(kpcode_race_get(name))
var/datum/species/D=kpcode_race_get(name)
return D.restricted
return 2
/*
proc/kpcode_race_tail(var/name="human")
name=kpcode_race_san(name)
if(kpcode_race_get(name))
var/datum/species/D=kpcode_race_get(name)
return D.tail
return 0
proc/kpcode_race_taur(var/name="human")
name=kpcode_race_san(name)
if(kpcode_race_get(name))
var/datum/species/D=kpcode_race_get(name)
if(D.taur==1)
return D.id
return D.taur
return 0
proc/kpcode_race_generic(var/name="human")
name=kpcode_race_san(name)
if(kpcode_race_get(name))
var/datum/species/D=kpcode_race_get(name)
return D.generic
return 0
proc/kpcode_race_adjective(var/name="human")
name=kpcode_race_san(name)
if(kpcode_race_get(name))
var/datum/species/D=kpcode_race_get(name)
return D.adjective
return 0
proc/kpcode_get_generic(var/mob/living/M)
if(istype(M,/mob/living/carbon/human))
if(M:dna)
return kpcode_race_generic(M:dna:mutantrace())
else
return kpcode_race_generic("human")
if(istype(M,/mob/living/carbon/monkey))
return "monkey"
if(istype(M,/mob/living/carbon/alien))
return "xeno"
if(istype(M,/mob/living/simple_animal))
return M.name
return "something"
proc/kpcode_get_adjective(var/mob/living/M)
if(istype(M,/mob/living/carbon/human))
if(M:dna)
return kpcode_race_adjective(M:dna:mutantrace())
else
return kpcode_race_adjective("human")
if(istype(M,/mob/living/carbon/monkey))
return "cranky"
if(istype(M,/mob/living/carbon/alien))
return "alien"
if(istype(M,/mob/living/simple_animal))
return "beastly"
return "something"
*/

47
code/citadel/organs.dm Normal file
View File

@@ -0,0 +1,47 @@
/obj/item/organ/stomach
name = "stomach"
icon_state = "stomach"
zone = "chest"
slot = "stomach"
w_class = 3
/obj/item/organ/stomach/prepare_eat()
var/obj/S = ..()
S.reagents.add_reagent("sacid", 2)
return S
/obj/item/organ/penis
name = "penis"
icon_state = "penis"
zone = "groin"
slot = "penis"
w_class = 3
var/shape = "human"
var/size = "normal"
var/testicles
/obj/item/organ/testicles
name = "testicles"
icon_state = "testicles"
zone = "groin"
slot = "testicles"
w_class = 3
var/size = "normal"
/obj/item/organ/vagina
name = "vagina"
icon_state = "vagina"
zone = "groin"
slot = "vagina"
w_class = 3
var/shape = "human"
var/ovaries
/obj/item/organ/womb
name = "womb"
icon_state = "womb"
zone = "groin"
slot = "womb"
w_class = 3

View File

@@ -206,7 +206,7 @@ var/const/VORE_SIZEDIFF_ANY=5
owner.nutrition+=400
digestion_count+=1
//owner.updateappearance
owner.update_body()
//owner.update_body()
continue //hopefully won't break much
if(oxygen)
M.oxyloss=0//Temp fix
@@ -307,7 +307,7 @@ var/const/VORE_SIZEDIFF_ANY=5
if(istype(A, /obj/item/weapon/reagent_containers/food/snacks))
qdel(A)
//owner.updateappearance()
owner.update_body()
//owner.update_body()
return 1
proc/add(var/mob/living/addit)
@@ -322,7 +322,7 @@ var/const/VORE_SIZEDIFF_ANY=5
if(M)
M.last_organ_in=src
//updateappearance(owner)
owner.update_body()
//owner.update_body()
proc/flavour_text(var/source, var/mob/living/prey, var/extra_info=0)
if(extra_info==VORE_EXTRA_FULLTOUR&&(remembered_bans&VORE_EXTRA_FULLTOUR))
extra_info=0
@@ -476,7 +476,7 @@ var/const/VORE_SIZEDIFF_ANY=5
mprey.vore_transform_index=0
mprey.vore_transfer_index=0
//updateappearance(owner)
owner.update_body()
//owner.update_body()
/* proc/refresh_list()
for(var/mob/living/M in contents)
@@ -1336,22 +1336,6 @@ var/const/VORE_SIZEDIFF_ANY=5
body_parts_covered = CHEST|GROIN|ARMS
fitted = 0
/obj/item/clothing/under/maid/narky
name = "narky outfit"
desc = "How cute~"
icon_state = "narkymaid"
item_state = "narkymaid"
item_color = "narkymaid"
/obj/item/clothing/under/diaper
name = "space diaper"
desc = "Oh, my."
icon_state = "diaper"
item_state = "diaper"
item_color = "diaper"
body_parts_covered = GROIN
fitted = 0
/obj/item/clothing/under/schoolgirl/red
icon_state = "schoolgirlred"
item_state = "schoolgirlred"
@@ -1374,34 +1358,6 @@ var/const/VORE_SIZEDIFF_ANY=5
desc = "Foxcom Special Edition"
icon_state = "pooj"
/obj/item/clothing/shoes/sandal/pavi
desc = "A pair of rather amazing, purple sandals"
name = "pavi sandals"
icon_state = "pavi"
/obj/item/clothing/suit/narkycuff
name = "cuffs"
desc = "For when a Narky feels stylish or kinky."
icon_state = "narkycuff"
item_state = "narkycuff"
gender=PLURAL
body_parts_covered = ARMS
allowed = list(/obj/item/weapon/gun/energy/laser/sizeray)
/obj/item/clothing/shoes/narkyanklet
name = "anklets"
desc = "For when a Narky wants to tie people to his paws without string."
icon_state = "narkyanklet"
item_state = "narkyanklet"
body_parts_covered = LEGS
/obj/item/weapon/storage/backpack/kittypack
name = "kitty backpack"
desc = "Mr. Noodles!"
icon_state = "kittypack"
item_state = "kittypack"
//Sppoky stuffs!
/obj/item/clothing/suit/costume/spooky_spook
name = "spooky ghost costume"
@@ -1409,60 +1365,6 @@ var/const/VORE_SIZEDIFF_ANY=5
icon_state = "spooky_spook"
item_state = "spooky_spook"
/obj/item/clothing/suit/costume/narky_fursuit
name = "\improper Narky fursuit"
desc = "Dress up like a Narky! Narky is terrified of these."
icon_state = "narky_fursuit"
item_state = "narky_fursuit"
allowed = list(/obj/item/weapon/gun/energy/laser/sizeray)
/obj/item/clothing/head/costume/narky_fursuit
name = "\improper Narky fursuit head"
desc = "Dress up like a Narky! Narky is terrified of these."
icon_state = "narky_fursuit"
/obj/item/clothing/suit/costume/clone
name = "sharpshooter costume"
desc = "Best shot at the academy!"
icon_state = "clone"
item_state = "clone"
/obj/item/clothing/head/costume/clone
name = "sharpshooter helmet"
desc = "Best shot at the academy!"
icon_state = "clone"
/obj/item/clothing/suit/costume/batman
name = "\improper Dark West costume"
desc = "You're not safe, and neither is this bomb."
icon_state = "batman"
item_state = "batman"
/obj/item/clothing/head/costume/batman
name = "\improper Dark West mask"
desc = "You're not safe, and neither is this bomb."
icon_state = "batman"
/obj/item/clothing/under/costume/spiderman
name = "\improper Human Spider costume"
desc = "Does whatever he does."
icon_state = "spiderman"
item_state = "spiderman"
item_color = "spiderman"
/obj/item/clothing/mask/costume/spiderman
name = "\improper Human Spider mask"
desc = "Does whatever he does."
icon_state = "spiderman"
item_state = "spiderman"
/obj/item/clothing/under/costume/zeerust
name = "zeerust captain costume"
desc = "In a game of chess, you must never let your opponent see your pieces."
icon_state = "zeerust"
item_state = "zeerust"
item_color = "zeerust"
/obj/structure/sign/portrait
name = "portrait"
@@ -1897,7 +1799,7 @@ var/list/traitor_test_list = null
var/mob/living/carbon/human/humz=src
humz.underwear_active=!humz.underwear_active
//updateappearance(src)
src.update_body()
//src.update_body()
else
src<<"Humans only."
@@ -2106,6 +2008,7 @@ var/list/traitor_test_list = null
/mob/proc/kpcode_mob_offset()
return
/*
/mob/proc/update_body()
if(istype(src,/mob/living/carbon/human))
//updateappearance(mutcolor_update=0)
@@ -2113,7 +2016,7 @@ var/list/traitor_test_list = null
/*if(istype(src,/mob/living/carbon)) //Endless loop for nonhuman mobs. base proc is /human only so nonhumans would get stuck with this being their only option.
//updateappearance(mutcolor_update=0)
src.update_body()*/
*/
/mob/living/kpcode_mob_offset()
if(istype(src,/mob/living/carbon/human))
var/mob/living/carbon/human/H=src

View File

@@ -1,5 +1,3 @@
/////////////////////////// DNA DATUM
/datum/dna
var/unique_enzymes
var/struc_enzymes
@@ -76,51 +74,6 @@
L[DNA_FACIAL_HAIR_COLOR_BLOCK] = sanitize_hexcolor(H.facial_hair_color)
L[DNA_SKIN_TONE_BLOCK] = construct_block(skin_tones.Find(H.skin_tone), skin_tones.len)
L[DNA_EYE_COLOR_BLOCK] = sanitize_hexcolor(H.eye_color)
if(H.heterochromia)
L[DNA_EYE_COLOR_TWO_BLOCK] = sanitize_hexcolor(H.heterochromia)
L[DNA_EYE_COLOR_SWITCH_BLOCK] = construct_block(2,2)
else
L[DNA_EYE_COLOR_TWO_BLOCK] = sanitize_hexcolor(H.eye_color)
L[DNA_EYE_COLOR_SWITCH_BLOCK] = construct_block(1,2)
var/colour_switch=0
if(special_color[1])
L[DNA_COLOR_ONE_BLOCK] = sanitize_hexcolor(special_color[1])
colour_switch+=1
else
L[DNA_COLOR_ONE_BLOCK] = random_string(DNA_BLOCK_SIZE,hex_characters)
if(special_color[2])
L[DNA_COLOR_TWO_BLOCK] = sanitize_hexcolor(special_color[2])
colour_switch+=2
else
L[DNA_COLOR_TWO_BLOCK] = random_string(DNA_BLOCK_SIZE,hex_characters)
if(special_color[3])
L[DNA_COLOR_THR_BLOCK] = sanitize_hexcolor(special_color[3])
colour_switch+=4
else
L[DNA_COLOR_THR_BLOCK] = random_string(DNA_BLOCK_SIZE,hex_characters)
L[DNA_COLOR_SWITCH_BLOCK] = construct_block(colour_switch+1,DNA_COLOR_SWITCH_MAX+1)
/*if(species_list[mutantrace])
L[DNA_MUTANTRACE_BLOCK] = construct_block(species_list.Find(mutantrace), species_list.len+1)
else
L[DNA_MUTANTRACE_BLOCK] = construct_block(species_list.len+1, species_list.len+1)*/
L[DNA_MUTANTRACE_BLOCK] = generate_race_block()
if(mutant_tails.Find(mutanttail))
L[DNA_MUTANTTAIL_BLOCK] = construct_block(mutant_tails.Find(mutanttail), mutant_tails.len+1)
else
L[DNA_MUTANTTAIL_BLOCK] = construct_block(mutant_tails.len+1, mutant_tails.len+1)
if(mutant_wings.Find(mutantwing))
L[DNA_MUTANTWING_BLOCK] = construct_block(mutant_wings.Find(mutantwing), mutant_wings.len+1)
else
L[DNA_MUTANTWING_BLOCK] = construct_block(mutant_wings.len+1, mutant_wings.len+1)
L[DNA_WINGCOLOR_BLOCK] = sanitize_hexcolor(wingcolor)
L[DNA_TAUR_BLOCK] = construct_block(taur+1, 2)
var/cock_block=0
if(cock["has"])
cock_block+=1
if(vagina)
cock_block+=2
L[DNA_COCK_BLOCK] = construct_block(cock_block+1, 4)
for(var/i=1, i<=DNA_UNI_IDENTITY_BLOCKS, i++)
if(L[i])
@@ -294,49 +247,6 @@ mob/living/carbon/human/updateappearance(icon_update=1, mutcolor_update=0, mutat
eye_color = sanitize_hexcolor(getblock(structure, DNA_EYE_COLOR_BLOCK))
facial_hair_style = facial_hair_styles_list[deconstruct_block(getblock(structure, DNA_FACIAL_HAIR_STYLE_BLOCK), facial_hair_styles_list.len)]
hair_style = hair_styles_list[deconstruct_block(getblock(structure, DNA_HAIR_STYLE_BLOCK), hair_styles_list.len)]
var/mutantrace_c = deconstruct_block(getblock(structure, DNA_MUTANTRACE_BLOCK), species_list.len+1)
if(mutantrace_c<=species_list.len && kpcode_race_restricted(species_list[mutantrace_c])!=2)
dna.species=kpcode_race_get(species_list[mutantrace_c])
var/mutanttail_c = deconstruct_block(getblock(structure, DNA_MUTANTTAIL_BLOCK), mutant_tails.len+1)
if(mutanttail_c<=mutant_tails.len)
dna.mutanttail=mutant_tails[mutanttail_c]
else
dna.mutanttail=null
var/mutantwing_c = deconstruct_block(getblock(structure, DNA_MUTANTWING_BLOCK), mutant_wings.len+1)
if(mutantwing_c<=mutant_wings.len)
dna.mutantwing=mutant_wings[mutantwing_c]
else
dna.mutantwing=null
dna.wingcolor = sanitize_hexcolor(getblock(structure, DNA_WINGCOLOR_BLOCK))
var/colour_switch=deconstruct_block(getblock(structure, DNA_COLOR_SWITCH_BLOCK), DNA_COLOR_SWITCH_MAX+1)
colour_switch-=1
if(colour_switch&1)
dna.special_color[1]=sanitize_hexcolor(getblock(structure, DNA_COLOR_ONE_BLOCK))
else
dna.special_color[1]=null
if(colour_switch&2)
dna.special_color[2]=sanitize_hexcolor(getblock(structure, DNA_COLOR_TWO_BLOCK))
else
dna.special_color[2]=null
if(colour_switch&4)
dna.special_color[3]=sanitize_hexcolor(getblock(structure, DNA_COLOR_THR_BLOCK))
else
dna.special_color[3]=null
var/cock_block=deconstruct_block(getblock(structure, DNA_COCK_BLOCK), 4)
cock_block-=1
if(!(cock_block&1))
dna.cock["has"]=0
else if(!dna.cock["has"]&&(cock_block&1))
dna.cock["has"]=1
if(cock_block&2)
dna.vagina=1
else
dna.vagina=0
dna.taur=deconstruct_block(getblock(structure, DNA_TAUR_BLOCK), 2)-1
if(icon_update)
update_body()
update_hair()
@@ -446,4 +356,4 @@ mob/living/carbon/human/updateappearance(icon_update=1, mutcolor_update=0, mutat
value = values
return value
/////////////////////////// DNA HELPER-PROCS
/////////////////////////// DNA HELPER-PROCS

View File

@@ -87,7 +87,7 @@
attacktext = "shocks"
attack_sound = 'sound/effects/EMPulse.ogg'
friendly = "pinches"
speed = 0
speed = 1
faction = list("swarmer")
AIStatus = AI_OFF
pass_flags = PASSTABLE

View File

@@ -10,10 +10,13 @@
icon_state = "xfloor1"
random_icon_states = list("xfloor1", "xfloor2", "xfloor3", "xfloor4", "xfloor5", "xfloor6", "xfloor7")
var/list/viruses = list()
blood_DNA = list("UNKNOWN DNA" = "X*")
blood_DNA = list("UNKNOWN DNA" = "X")
bloodiness = MAX_SHOE_BLOODINESS
blood_state = BLOOD_STATE_XENO
/obj/effect/decal/cleanable/xenoblood/can_bloodcrawl_in()
return 1
/obj/effect/decal/cleanable/xenoblood/Destroy()
for(var/datum/disease/D in viruses)
D.cure(0)
@@ -37,6 +40,9 @@
/obj/effect/decal/cleanable/xenoblood/xsplatter
random_icon_states = list("xgibbl1", "xgibbl2", "xgibbl3", "xgibbl4", "xgibbl5")
/obj/effect/decal/cleanable/xsplatter/can_bloodcrawl_in()
return 1
/obj/effect/decal/cleanable/xenoblood/xgibs
name = "xeno gibs"
desc = "Gnarly..."
@@ -45,6 +51,10 @@
icon_state = "xgib1"
random_icon_states = list("xgib1", "xgib2", "xgib3", "xgib4", "xgib5", "xgib6")
/obj/effect/decal/cleanable/xgibs/can_bloodcrawl_in()
return 1
/obj/effect/decal/cleanable/xenoblood/xgibs/ex_act()
return
@@ -66,4 +76,18 @@
/obj/effect/decal/cleanable/blood/xtracks
icon_state = "xtracks"
random_icon_states = null
blood_DNA = list("UNKNOWN DNA" = "X*")
blood_DNA = list("UNKNOWN DNA" = "X")
/obj/effect/decal/cleanable/xdrip
name = "drips of blood"
desc = "It's green."
gender = PLURAL
icon = 'icons/effects/blood.dmi'
icon_state = "1"
random_icon_states = list("xdrip1","xdrip2","xdrip3","xdrip4","xdrip5")
bloodiness = 0
var/drips = 1
blood_DNA = list("UNKNOWN DNA" = "X")
/obj/effect/decal/cleanable/xdrip/can_bloodcrawl_in()
return 1

View File

@@ -145,6 +145,9 @@
walltype = "shuttle"
smooth = SMOOTH_FALSE
/turf/closed/wall/shuttle/proc/update_icon()
..()
/turf/closed/wall/shuttle/smooth
name = "wall"
icon = 'icons/turf/walls/shuttle_wall.dmi'

View File

@@ -41,13 +41,6 @@ var/list/preferences_datums = list()
var/allow_midround_antag = 1
var/preferred_map = null
//vore code
var/mutant_tail = "none"
var/mutant_wing = "none"
var/wingcolor = "FFF"
//var/special_color[COLOUR_LIST_SIZE]
//var/special_color_one = null
//var/special_color_two = null
var/vore_banned_methods = 0
var/vore_extra_bans = 65535
var/list/vore_ability = list(
@@ -83,7 +76,7 @@ var/list/preferences_datums = list()
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")
var/list/features = list("mcolor" = "FFF","mcolor2" = "FFF","mcolor3" = "FFF", "tail_lizard" = "Smooth", "tail_human" = "None", "snout" = "Round", "horns" = "None", "ears" = "None", "wings" = "None", "frills" = "None", "spines" = "None", "body_markings" = "None", "mam_body_markings" = "None", "mam_ears" = "None", "mam_tail" = "None", "mam_tail_animated" = "None")
var/list/custom_names = list("clown", "mime", "ai", "cyborg", "religion", "deity")
//Mob preview
@@ -211,23 +204,7 @@ var/list/preferences_datums = list()
if(config.mutant_races)
dat += "<b>Species:</b><BR><a href='?_src_=prefs;preference=species;task=input'>[pref_species.id]</a><BR>"
dat += "<b>Human Tail:</b><a href='?_src_=prefs;preference=mutant_tail;task=input'>[mutant_tail]</a><BR>"
dat += "<b>Taur:</b><a href='?_src_=prefs;preference=be_taur;task=input'>[be_taur ? "Yes" : "No"]</a>"
if(!kpcode_cantaur(pref_species.id))
dat += " (not available for [pref_species.id])"
dat += "<BR>"
/*if(special_color[1])
dat += "<span style='border:1px solid #161616; background-color: #[special_color[1]];'>&nbsp;&nbsp;&nbsp;</span> <a href='?_src_=prefs;preference=special_color;which=1;task=input'>Primary</a><BR>"
else
dat += "<a href='?_src_=prefs;preference=special_color;which=1;task=input'>Primary?</a><BR>"
if(special_color[2])
dat += "<span style='border:1px solid #161616; background-color: #[special_color[2]];'>&nbsp;&nbsp;&nbsp;</span> <a href='?_src_=prefs;preference=special_color;which=2;task=input'>Secondary</a><BR>"
else
dat += "<a href='?_src_=prefs;preference=special_color;which=2;task=input'>Secondary?</a><BR>"
if(special_color[3])
dat += "<span style='border:1px solid #161616; background-color: #[special_color[3]];'>&nbsp;&nbsp;&nbsp;</span> <a href='?_src_=prefs;preference=special_color;which=3;task=input'>Tertiary</a><BR>"
else
dat += "<a href='?_src_=prefs;preference=special_color;which=3;task=input'>Tertiary?</a><BR>"*/
else
dat += "<b>Species:</b> Human<BR>"
@@ -236,13 +213,7 @@ var/list/preferences_datums = list()
dat += "<b>Socks:</b><BR><a href ='?_src_=prefs;preference=socks;task=input'>[socks]</a><BR>"
dat += "<b>Backpack:</b><BR><a href ='?_src_=prefs;preference=bag;task=input'>[backbag]</a><BR></td>"
dat += "<b>Size:</b> <a href='?_src_=prefs;preference=character_size;task=input'>[character_size]</a><BR>"
dat += "<b>Vore Preferences:</b> <a href='?_src_=prefs;preference=vore_panel;task=input'>Open</a><BR>"
/*dat += "<h3>Wings</h3>"
dat += "<a href='?_src_=prefs;preference=mutant_wing;task=input'>[mutant_wing]</a><BR>"
dat += "<span style='border: 1px solid #161616; background-color: #[wingcolor];'>&nbsp;&nbsp;&nbsp;</span> <a href='?_src_=prefs;preference=wingcolor;task=input'>Change</a><BR>"*/
// dat += "<b>Size:</b> <a href='?_src_=prefs;preference=character_size;task=input'>[character_size]</a><BR>"
dat += "<a href='byond://?src=\ref[user];preference=flavor_text;task=input'><b>Set Flavor Text</b></a><br>"
if(lentext(flavor_text) <= 40)
if(!lentext(flavor_text))
@@ -294,18 +265,22 @@ var/list/preferences_datums = list()
dat += "</td>"
/*if(config.mutant_races) //We don't allow mutant bodyparts for humans either unless this is true.
if(config.mutant_races) //We don't allow mutant bodyparts for humans either unless this is true.
if((MUTCOLORS in pref_species.specflags) || (MUTCOLORS_PARTSONLY in pref_species.specflags))
dat += "<td valign='top' width='21%'>"
dat += "<h3>Alien/Mutant Color</h3>"
dat += "<h3>Alien/Mutant Colors</h3>"
dat += "<span style='border: 1px solid #161616; background-color: #[features["mcolor"]];'>&nbsp;&nbsp;&nbsp;</span> <a href='?_src_=prefs;preference=mutant_color;task=input'>Change</a><BR>"
dat += "</td>"
dat += "<span style='border: 1px solid #161616; background-color: #[features["mcolor2"]];'>&nbsp;&nbsp;&nbsp;</span> <a href='?_src_=prefs;preference=mutant_color2;task=input'>Change</a><BR>"
dat += "<span style='border: 1px solid #161616; background-color: #[features["mcolor3"]];'>&nbsp;&nbsp;&nbsp;</span> <a href='?_src_=prefs;preference=mutant_color3;task=input'>Change</a><BR>"
dat += "</td>"
//lizard bodyparts
if("tail_lizard" in pref_species.mutant_bodyparts)
dat += "<td valign='top' width='7%'>"
@@ -358,6 +333,33 @@ var/list/preferences_datums = list()
dat += "<a href='?_src_=prefs;preference=body_markings;task=input'>[features["body_markings"]]</a><BR>"
dat += "</td>"
//mammal bodyparts
if("mam_body_markings" in pref_species.mutant_bodyparts)
dat += "<td valign='top' width='7%'>"
dat += "<h3>Mammal Body Markings</h3>"
dat += "<a href='?_src_=prefs;preference=mam_body_markings;task=input'>[features["mam_body_markings"]]</a><BR>"
dat += "</td>"
if("mam_tail" in pref_species.mutant_bodyparts)
dat += "<td valign='top' width='7%'>"
dat += "<h3>Tail</h3>"
dat += "<a href='?_src_=prefs;preference=mam_tail;task=input'>[features["mam_tail"]]</a><BR>"
dat += "</td>"
if("mam_ears" in pref_species.mutant_bodyparts)
dat += "<td valign='top' width='7%'>"
dat += "<h3>Ears</h3>"
dat += "<a href='?_src_=prefs;preference=mam_ears;task=input'>[features["mam_ears"]]</a><BR>"
dat += "</td>"
if(config.mutant_humans)
@@ -387,7 +389,7 @@ var/list/preferences_datums = list()
dat += "<a href='?_src_=prefs;preference=wings;task=input'>[features["wings"]]</a><BR>"
dat += "</td>"*/
dat += "</td>"
dat += "</tr></table>"
@@ -968,63 +970,54 @@ var/list/preferences_datums = list()
eye_color = sanitize_hexcolor(new_eyes)
if("species")
var/result = input(user, "Select a species", "Species Selection") as null|anything in kpcode_race_getlist(user.ckey)
var/result = input(user, "Select a species", "Species Selection") as null|anything in roundstart_species
if(result)
var/newtype = species_list[result]
var/newtype = roundstart_species[result]
pref_species = new newtype()
//if(mutant_color == "#000")
// mutant_color = pref_species.default_color
//Now that we changed our species, we must verify that the mutant colour is still allowed.
var/temp_hsv = RGBtoHSV(features["mcolor"])
if(features["mcolor"] == "#000" || (!(MUTCOLORS_PARTSONLY in pref_species.specflags) && ReadHSV(temp_hsv)[3] < ReadHSV("#7F7F7F")[3]))
features["mcolor"] = pref_species.default_color
if(features["mcolor2"] == "#000" || (!(MUTCOLORS_PARTSONLY in pref_species.specflags) && ReadHSV(temp_hsv)[3] < ReadHSV("#7F7F7F")[3]))
features["mcolor2"] = pref_species.default_color
if(features["mcolor3"] == "#000" || (!(MUTCOLORS_PARTSONLY in pref_species.specflags) && ReadHSV(temp_hsv)[3] < ReadHSV("#7F7F7F")[3]))
features["mcolor3"] = pref_species.default_color
if("mutant_color")
var/new_mutantcolor = input(user, "Choose your character's alien/mutant color:", "Character Preference") as color|null
var/new_mutantcolor = input(user, "Choose your character's primary alien/mutant color:", "Character Preference") as color|null
if(new_mutantcolor)
var/temp_hsv = RGBtoHSV(new_mutantcolor)
if(new_mutantcolor == "#000000")
features["mcolor"] = pref_species.default_color
else if((MUTCOLORS_PARTSONLY in pref_species.specflags) || ReadHSV(temp_hsv)[3] >= ReadHSV("#7F7F7F")[3]) // mutantcolors must be bright, but only if they affect the skin
else if((MUTCOLORS_PARTSONLY in pref_species.specflags) || ReadHSV(temp_hsv)[3] >= ReadHSV("#202020")[3]) // mutantcolors must be bright, but only if they affect the skin
features["mcolor"] = sanitize_hexcolor(new_mutantcolor)
else
user << "<span class='danger'>Invalid color. Your color is not bright enough.</span>"
if("mutant_tail")
var/new_mutant_tail = input(user, "Choose your character's tail for when they are human:", "Character Preference") as null|anything in mutant_tails
if(new_mutant_tail)
mutant_tail = new_mutant_tail
if("mutant_color2")
var/new_mutantcolor = input(user, "Choose your character's secondary alien/mutant color:", "Character Preference") as color|null
if(new_mutantcolor)
var/temp_hsv = RGBtoHSV(new_mutantcolor)
if(new_mutantcolor == "#000000")
features["mcolor2"] = pref_species.default_color
else if((MUTCOLORS_PARTSONLY in pref_species.specflags) || ReadHSV(temp_hsv)[3] >= ReadHSV("#202020")[3]) // mutantcolors must be bright, but only if they affect the skin
features["mcolor2"] = sanitize_hexcolor(new_mutantcolor)
else
user << "<span class='danger'>Invalid color. Your color is not bright enough.</span>"
if("mutant_wing")
var/new_mutant_wing = input(user, "Choose your character's wings:", "Character Preference") as null|anything in mutant_wings
if(new_mutant_wing)
mutant_wing = new_mutant_wing
if("mutant_color3")
var/new_mutantcolor = input(user, "Choose your character's tertiary alien/mutant color:", "Character Preference") as color|null
if(new_mutantcolor)
var/temp_hsv = RGBtoHSV(new_mutantcolor)
if(new_mutantcolor == "#000000")
features["mcolor3"] = pref_species.default_color
else if((MUTCOLORS_PARTSONLY in pref_species.specflags) || ReadHSV(temp_hsv)[3] >= ReadHSV("#202020")[3]) // mutantcolors must be bright, but only if they affect the skin
features["mcolor3"] = sanitize_hexcolor(new_mutantcolor)
else
user << "<span class='danger'>Invalid color. Your color is not bright enough.</span>"
if("wingcolor")
var/new_wingcolor = input(user, "Choose your character's wing colour:", "Character Preference") as color|null
if(new_wingcolor)
wingcolor = sanitize_hexcolor(new_wingcolor)
/*if("special_color")
var/index_tc=href_list["which"]
switch(alert("Use a special colour for #[index_tc]?","Character Preference","Yes","No","Cancel"))
if("Yes")
var/new_color = input(user, "Choose colour #[index_tc]:", "Character Preference") as null|color
if(new_color)
special_color[text2num(index_tc)] = sanitize_hexcolor(new_color)
if("No")
special_color[text2num(index_tc)]=null*/
if("character_size")
var/new_size = input(user, "Choose your character's size:", "Character Preference") in list("huge", "large", "normal", "small", "tiny")
if(new_size)
character_size=new_size
if("vore_panel")
var/obj/vore_preferences/VP=new()
VP.target=src
VP.ShowChoices(user)
if("be_taur")
be_taur = !be_taur
/*
if("tail_lizard")
var/new_tail
new_tail = input(user, "Choose your character's tail:", "Character Preference") as null|anything in tails_list_lizard
@@ -1037,6 +1030,12 @@ var/list/preferences_datums = list()
if(new_tail)
features["tail_human"] = new_tail
if("mam_tail")
var/new_tail
new_tail = input(user, "Choose your character's tail:", "Character Preference") as null|anything in mam_tails_list
if(new_tail)
features["mam_tail"] = new_tail
if("snout")
var/new_snout
new_snout = input(user, "Choose your character's snout:", "Character Preference") as null|anything in snouts_list
@@ -1049,6 +1048,12 @@ var/list/preferences_datums = list()
if(new_horns)
features["horns"] = new_horns
if("mam_ears")
var/new_ears
new_ears = input(user, "Choose your character's ears:", "Character Preference") as null|anything in mam_ears_list
if(new_ears)
features["mam_ears"] = new_ears
if("ears")
var/new_ears
new_ears = input(user, "Choose your character's ears:", "Character Preference") as null|anything in ears_list
@@ -1078,7 +1083,12 @@ var/list/preferences_datums = list()
new_body_markings = input(user, "Choose your character's body markings:", "Character Preference") as null|anything in body_markings_list
if(new_body_markings)
features["body_markings"] = new_body_markings
*/
if("mam_body_markings")
var/new_mam_body_markings
new_mam_body_markings = input(user, "Choose your character's body markings:", "Character Preference") as null|anything in mam_body_markings_list
if(new_mam_body_markings)
features["mam_body_markings"] = new_mam_body_markings
if("s_tone")
var/new_s_tone = input(user, "Choose your character's skin-tone:", "Character Preference") as null|anything in skin_tones
@@ -1086,7 +1096,7 @@ var/list/preferences_datums = list()
skin_tone = new_s_tone
if("ooccolor")
var/new_ooccolor = input(user, "Choose your OOC colour:", "Game Preference") as color|null
var/new_ooccolor = input(user, "Choose your OOC color:", "Game Preference") as color|null
if(new_ooccolor)
ooccolor = sanitize_ooccolor(new_ooccolor)
@@ -1281,30 +1291,6 @@ var/list/preferences_datums = list()
character.gender = gender
character.age = age
if(mutant_tail != "none" && config.mutant_races)
character.dna.mutanttail = mutant_tail
/*(if(mutant_wing != "none" && config.mutant_races)
character.dna.mutantwing = mutant_wing
character.dna.wingcolor=wingcolor*/
if(be_taur)
character.dna.taur=1
//character.dna.special_color = special_color
character.dna.cock=p_cock
character.dna.vagina=p_vagina
character.vore_banned_methods=vore_banned_methods
character.vore_extra_bans=vore_extra_bans
character.vore_ability=vore_ability
if(character_size!="normal")
if(character_size=="small")
character.sizeplay_set(SIZEPLAY_MICRO)
else if(character_size=="tiny")
character.sizeplay_set(SIZEPLAY_TINY)
else if(character_size=="large")
character.sizeplay_set(SIZEPLAY_MACRO)
else
character.sizeplay_set(SIZEPLAY_HUGE)
character.eye_color = eye_color
character.hair_color = hair_color
character.facial_hair_color = facial_hair_color
@@ -1330,4 +1316,4 @@ var/list/preferences_datums = list()
if(icon_updates)
character.update_body()
character.update_hair()
character.update_body_parts()
character.update_body_parts()

View File

@@ -1,4 +1,4 @@
//This is the lowest supported version, anything below this is completely obsolete and the entire savefile will be wiped.
//This is the lowest supported version, anything below this is completely obsolete and the entire savefile will be wiped.
#define SAVEFILE_VERSION_MIN 8
//This is the current version, anything below this will attempt to update (if it's not obsolete)
@@ -8,14 +8,11 @@ SAVEFILE UPDATING/VERSIONING - 'Simplified', or rather, more coder-friendly ~Car
This proc checks if the current directory of the savefile S needs updating
It is to be used by the load_character and load_preferences procs.
(S.cd=="/" is preferences, S.cd=="/character[integer]" is a character slot, etc)
if the current directory's version is below SAVEFILE_VERSION_MIN it will simply wipe everything in that directory
(if we're at root "/" then it'll just wipe the entire savefile, for instance.)
if its version is below SAVEFILE_VERSION_MAX but above the minimum, it will load data but later call the
respective update_preferences() or update_character() proc.
Those procs allow coders to specify format changes so users do not lose their setups and have to redo them again.
Failing all that, the standard sanity checks are performed. They simply check the data is suitable, reverting to
initial() values if necessary.
*/
@@ -195,9 +192,6 @@ SAVEFILE UPDATING/VERSIONING - 'Simplified', or rather, more coder-friendly ~Car
if(needs_update == -2) //fatal, can't load any data
return 0
if(!S["species"] || !config.mutant_races)
S["species"] << new /datum/species/human()
//general preferences
S["ooccolor"] >> ooccolor
S["lastchangelog"] >> lastchangelog
@@ -299,46 +293,52 @@ SAVEFILE UPDATING/VERSIONING - 'Simplified', or rather, more coder-friendly ~Car
return 0
//Species
/*var/species_name
S["species"] >> species_name
if(config.mutant_races && species_name && (species_name in roundstart_species))
var/newtype = roundstart_species[species_name]
var/species_id
S["species"] >> species_id
if(config.mutant_races && species_id && (species_id in roundstart_species))
var/newtype = roundstart_species[species_id]
pref_species = new newtype()
else
pref_species = new /datum/species/human()
var/rando_race = pick(config.roundstart_races)
pref_species = new rando_race()
if(!S["features["mcolor"]"] || S["features["mcolor"]"] == "#000")
S["features["mcolor"]"] << "#FFF"*/
if(!S["species"] || !config.mutant_races)
S["species"] << new /datum/species/human()
//if(!S["mutant_color"] || S["mutant_color"] == "#000")
// S["mutant_color"] << "#FFF"
S["features["mcolor"]"] << "#FFF"
if(!S["features["mcolor2"]"] || S["features["mcolor2"]"] == "#000")
S["features["mcolor2"]"] << "#FFF"
if(!S["features["mcolor3"]"] || S["features["mcolor3"]"] == "#000")
S["features["mcolor3"]"] << "#FFF"
//Character
S["Flavor_Text"] >> flavor_text
S["real_name"] >> real_name
S["name_is_always_random"] >> be_random_name
S["body_is_always_random"] >> be_random_body
S["gender"] >> gender
S["age"] >> age
S["hair_color"] >> hair_color
S["facial_hair_color"] >> facial_hair_color
S["eye_color"] >> eye_color
S["skin_tone"] >> skin_tone
S["hair_style_name"] >> hair_style
S["facial_style_name"] >> facial_hair_style
S["underwear"] >> underwear
S["undershirt"] >> undershirt
S["socks"] >> socks
S["backbag"] >> backbag
S["Flavor_Text"] >> flavor_text
S["real_name"] >> real_name
S["name_is_always_random"] >> be_random_name
S["body_is_always_random"] >> be_random_body
S["gender"] >> gender
S["age"] >> age
S["hair_color"] >> hair_color
S["facial_hair_color"] >> facial_hair_color
S["eye_color"] >> eye_color
S["skin_tone"] >> skin_tone
S["hair_style_name"] >> hair_style
S["facial_style_name"] >> facial_hair_style
S["underwear"] >> underwear
S["undershirt"] >> undershirt
S["socks"] >> socks
S["backbag"] >> backbag
S["feature_mcolor"] >> features["mcolor"]
S["feature_mcolor2"] >> features["mcolor2"]
S["feature_mcolor3"] >> features["mcolor3"]
S["feature_lizard_tail"] >> features["tail_lizard"]
S["feature_lizard_snout"] >> features["snout"]
S["feature_lizard_horns"] >> features["horns"]
S["feature_lizard_frills"] >> features["frills"]
S["feature_lizard_spines"] >> features["spines"]
S["feature_lizard_body_markings"] >> features["body_markings"]
S["feature_mam_body_markings"] >> features["mam_body_markings"]
S["feature_mam_tail"] >> features["mam_tail"]
S["feature_mam_ears"] >> features["mam_ears"]
S["feature_mam_tail_animated"] >> features["mam_tail_animated"]
if(!config.mutant_humans)
features["tail_human"] = "none"
features["ears"] = "none"
@@ -351,22 +351,6 @@ SAVEFILE UPDATING/VERSIONING - 'Simplified', or rather, more coder-friendly ~Car
S["cyborg_name"] >> custom_names["cyborg"]
S["religion_name"] >> custom_names["religion"]
S["deity_name"] >> custom_names["deity"]
S["species"] >> pref_species
//Customs
S["mutant_tail"] >> mutant_tail
S["mutant_wing"] >> mutant_wing
S["wingcolor"] >> wingcolor
//S["special_color_one"] >> special_color_one
//S["special_color_two"] >> special_color_two
//S["special_color"] >> special_color
S["be_taur"] >> be_taur
S["vore_ability"] >> vore_ability
S["vore_banned_methods"]>> vore_banned_methods
S["vore_extra_bans"] >> vore_extra_bans
S["character_size"] >> character_size
S["p_cock"] >> p_cock
S["p_vagina"] >> p_vagina
//Jobs
S["userandomjob"] >> userandomjob
@@ -387,12 +371,14 @@ SAVEFILE UPDATING/VERSIONING - 'Simplified', or rather, more coder-friendly ~Car
//Sanitize
flavor_text = sanitize_text(flavor_text, initial(flavor_text))
real_name = reject_bad_name(real_name)
//if(!(pref_species in species_list))
if(!(pref_species))
pref_species = new /datum/species/human()
//if(!mutant_color || mutant_color == "#000")
// mutant_color = "#FFF"
if(!real_name) real_name = random_unique_name(gender)
if(!features["mcolor"] || features["mcolor"] == "#000")
features["mcolor"] = pick("FFFFFF","7F7F7F", "7FFF7F", "7F7FFF", "FF7F7F", "7FFFFF", "FF7FFF", "FFFF7F")
if(!features["mcolor2"] || features["mcolor"] == "#000")
features["mcolor2"] = pick("FFFFFF","7F7F7F", "7FFF7F", "7F7FFF", "FF7F7F", "7FFFFF", "FF7FFF", "FFFF7F")
if(!features["mcolor3"] || features["mcolor"] == "#000")
features["mcolor3"] = pick("FFFFFF","7F7F7F", "7FFF7F", "7F7FFF", "FF7F7F", "7FFFFF", "FF7FFF", "FFFF7F")
if(!real_name)
real_name = random_unique_name(gender)
be_random_name = sanitize_integer(be_random_name, 0, 1, initial(be_random_name))
be_random_body = sanitize_integer(be_random_body, 0, 1, initial(be_random_body))
gender = sanitize_gender(gender)
@@ -413,8 +399,9 @@ SAVEFILE UPDATING/VERSIONING - 'Simplified', or rather, more coder-friendly ~Car
eye_color = sanitize_hexcolor(eye_color, 3, 0)
skin_tone = sanitize_inlist(skin_tone, skin_tones)
backbag = sanitize_inlist(backbag, backbaglist, initial(backbag))
/*
features["mcolor"] = sanitize_hexcolor(features["mcolor"], 3, 0)
features["mcolor2"] = sanitize_hexcolor(features["mcolor2"], 3, 0)
features["mcolor3"] = sanitize_hexcolor(features["mcolor3"], 3, 0)
features["tail_lizard"] = sanitize_inlist(features["tail_lizard"], tails_list_lizard)
features["tail_human"] = sanitize_inlist(features["tail_human"], tails_list_human, "None")
features["snout"] = sanitize_inlist(features["snout"], snouts_list)
@@ -422,20 +409,10 @@ SAVEFILE UPDATING/VERSIONING - 'Simplified', or rather, more coder-friendly ~Car
features["ears"] = sanitize_inlist(features["ears"], ears_list, "None")
features["frills"] = sanitize_inlist(features["frills"], frills_list)
features["spines"] = sanitize_inlist(features["spines"], spines_list)
features["body_markings"] = sanitize_inlist(features["body_markings"], body_markings_list)*/
mutant_tail = sanitize_text(mutant_tail, initial(mutant_tail))
mutant_wing = sanitize_text(mutant_wing, initial(mutant_wing))
wingcolor = sanitize_hexcolor(wingcolor, 3, 0)
character_size = sanitize_text(character_size, initial(character_size))
// mutant_color = sanitize_hexcolor(mutant_color, 3, 0)
vore_ability=sanitize_vore_list(vore_ability)
if(isnull(vore_banned_methods))vore_banned_methods=0
if(isnull(vore_extra_bans))vore_extra_bans=65535
if(isnull(p_vagina)) p_vagina=gender==FEMALE
if(isnull(p_cock))
p_cock=list("has"=gender==MALE,"type"="human","color"="900")
features["body_markings"] = sanitize_inlist(features["body_markings"], body_markings_list)
features["mam_body_markings"] = sanitize_inlist(features["mam_body_markings"], mam_body_markings_list)
features["mam_ears"] = sanitize_inlist(features["mam_ears"], mam_ears_list)
features["mam_tail"] = sanitize_inlist(features["mam_tail"], mam_tails_list)
userandomjob = sanitize_integer(userandomjob, 0, 1, initial(userandomjob))
job_civilian_high = sanitize_integer(job_civilian_high, 0, 65535, initial(job_civilian_high))
@@ -461,7 +438,7 @@ SAVEFILE UPDATING/VERSIONING - 'Simplified', or rather, more coder-friendly ~Car
S["version"] << SAVEFILE_VERSION_MAX //load_character will sanitize any bad data, so assume up-to-date.
//Character
S["Flavor_Text"] << flavor_text
S["Flavor_Text"] >> flavor_text
S["real_name"] << real_name
S["name_is_always_random"] << be_random_name
S["body_is_always_random"] << be_random_body
@@ -487,25 +464,16 @@ SAVEFILE UPDATING/VERSIONING - 'Simplified', or rather, more coder-friendly ~Car
S["feature_lizard_frills"] << features["frills"]
S["feature_lizard_spines"] << features["spines"]
S["feature_lizard_body_markings"] << features["body_markings"]
S["feature_mam_body_markings"] << features["mam_body_markings"]
S["feature_mam_tail"] << features["mam_tail"]
S["feature_mam_ears"] << features["mam_ears"]
S["feature_mam_tail_animated"] << features["mam_tail_animated"]
S["clown_name"] << custom_names["clown"]
S["mime_name"] << custom_names["mime"]
S["ai_name"] << custom_names["ai"]
S["cyborg_name"] << custom_names["cyborg"]
S["religion_name"] << custom_names["religion"]
S["deity_name"] << custom_names["deity"]
S["species"] << pref_species
//Custom
S["mutant_tail"] << mutant_tail
S["mutant_wing"] << mutant_wing
S["wingcolor"] << wingcolor
//S["special_color"] << special_color
S["be_taur"] << be_taur
S["vore_ability"] << vore_ability
S["vore_banned_methods"]<< vore_banned_methods
S["vore_extra_bans"] << vore_extra_bans
S["character_size"] << character_size
S["p_cock"] << p_cock
S["p_vagina"] << p_vagina
//Jobs
S["userandomjob"] << userandomjob
@@ -535,4 +503,4 @@ SAVEFILE UPDATING/VERSIONING - 'Simplified', or rather, more coder-friendly ~Car
/client/verb/savefile_import(path as text)
var/savefile/S = new /savefile(path)
S.ImportText("/",file("[path].txt"))
*/
*/

View File

@@ -216,37 +216,64 @@
return list("O-", "O+")
if("L")
return list("L")
if("X")
return list("X")
//to add a splatter of blood or other mob liquid.
/mob/living/proc/add_splatter_floor(turf/T, small_drip)
if(get_blood_id() != "blood")
if(get_blood_id() != "blood" && get_blood_id() != "xblood")
return
if(!T)
T = get_turf(src)
var/list/temp_blood_DNA
if(small_drip)
// Only a certain number of drips (or one large splatter) can be on a given turf.
var/obj/effect/decal/cleanable/blood/drip/drop = locate() in T
if(drop)
if(drop.drips < 3)
drop.drips++
drop.overlays |= pick(drop.random_icon_states)
if(ishuman(src))
var/mob/living/carbon/human/H = src
if(H.dna.species.id == "xeno")
var/obj/effect/decal/cleanable/xdrip/xdrop = locate() in T
if(xdrop)
if(xdrop.drips < 3)
xdrop.drips++
xdrop.overlays |= pick(xdrop.random_icon_states)
xdrop.transfer_mob_blood_dna(src)
return
else
temp_blood_DNA = list()
temp_blood_DNA |= xdrop.blood_DNA.Copy()
qdel(xdrop)//the drip is replaced by a bigger splatter
else
xdrop = new(T)
xdrop.transfer_mob_blood_dna(src)
return
else
var/obj/effect/decal/cleanable/blood/drip/drop = locate() in T
if(drop)
if(drop.drips < 3)
drop.drips++
drop.overlays |= pick(drop.random_icon_states)
drop.transfer_mob_blood_dna(src)
return
else
temp_blood_DNA = list()
temp_blood_DNA |= drop.blood_DNA.Copy() //we transfer the dna from the drip to the splatter
qdel(drop)//the drip is replaced by a bigger splatter
else
drop = new(T)
drop.transfer_mob_blood_dna(src)
return
else
temp_blood_DNA = list()
temp_blood_DNA |= drop.blood_DNA.Copy() //we transfer the dna from the drip to the splatter
qdel(drop)//the drip is replaced by a bigger splatter
else
drop = new(T)
drop.transfer_mob_blood_dna(src)
return
// Find a blood decal or create a new one.
var/obj/effect/decal/cleanable/blood/B = locate() in T
if(!B)
B = new /obj/effect/decal/cleanable/blood/splatter(T)
if(ishuman(src))
var/mob/living/carbon/human/H = src
if(H.dna.species.id == "xeno")
B = new /obj/effect/decal/cleanable/xenoblood(T)
else
B = new /obj/effect/decal/cleanable/blood/splatter(T)
else
B = new /obj/effect/decal/cleanable/blood/splatter(T)
B.transfer_mob_blood_dna(src) //give blood info to the blood decal.
if(temp_blood_DNA)
B.blood_DNA |= temp_blood_DNA
@@ -268,4 +295,4 @@
T = get_turf(src)
var/obj/effect/decal/cleanable/oil/B = locate() in T.contents
if(!B)
B = new(T)
B = new(T)

View File

@@ -7,7 +7,7 @@
name = "alien"
voice_name = "alien"
icon = 'icons/mob/alien.dmi'
gender = NEUTER
gender = FEMALE
dna = null
faction = list("alien")
ventcrawler = 2

View File

@@ -333,10 +333,10 @@
m_type = 2
if("wag","wags")
if(dna && dna.species && (("tail_lizard" in dna.species.mutant_bodyparts) || ((dna.features["tail_human"] != "None") && !("waggingtail_human" in dna.species.mutant_bodyparts))))
if(dna && dna.species && (("tail_lizard" in dna.species.mutant_bodyparts) || ((dna.features["mam_tail"] != "None") && !("mam_waggingtail" in dna.species.mutant_bodyparts)) || ((dna.features["tail_human"] != "None") && !("waggingtail_human" in dna.species.mutant_bodyparts))))
message = "<B>[src]</B> wags \his tail."
startTailWag()
else if(dna && dna.species && (("waggingtail_lizard" in dna.species.mutant_bodyparts) || ("waggingtail_human" in dna.species.mutant_bodyparts)))
else if(dna && dna.species && (("waggingtail_lizard" in dna.species.mutant_bodyparts) || ("mam_waggingtail" in dna.species.mutant_bodyparts) || ("waggingtail_human" in dna.species.mutant_bodyparts)))
endTailWag()
else
src << "<span class='notice'>Unusable emote '[act]'. Say *help for a list.</span>"
@@ -384,6 +384,9 @@
if("tail_human" in dna.species.mutant_bodyparts)
dna.species.mutant_bodyparts -= "tail_human"
dna.species.mutant_bodyparts |= "waggingtail_human"
if("mam_tail" in dna.species.mutant_bodyparts)
dna.species.mutant_bodyparts -= "mam_tail"
dna.species.mutant_bodyparts |= "mam_waggingtail"
update_body()
@@ -398,6 +401,9 @@
if("waggingtail_human" in dna.species.mutant_bodyparts)
dna.species.mutant_bodyparts -= "waggingtail_human"
dna.species.mutant_bodyparts |= "tail_human"
if("mam_waggingtail" in dna.species.mutant_bodyparts)
dna.species.mutant_bodyparts -= "mam_waggingtail"
dna.species.mutant_bodyparts |= "mam_tail"
update_body()
/mob/living/carbon/human/proc/OpenWings()

View File

@@ -31,8 +31,6 @@
msg += "<EM>[src.name]</EM>!\n"
var/insuit_handled=0
//uniform
if(w_uniform && !(slot_w_uniform in obscured))
//Ties
@@ -46,10 +44,6 @@
msg += "<span class='warning'>[t_He] [t_is] wearing \icon[w_uniform] [w_uniform.gender==PLURAL?"some":"a"] blood-stained [w_uniform.name][tie_msg]!</span>\n"
else
msg += "[t_He] [t_is] wearing \icon[w_uniform] \a [w_uniform][tie_msg].\n"
if(vore_insuit_datum.has_people())
msg += "<span class='warning'>There is a person-shaped bulge under the fabric!</span>\n"
insuit_handled=1
//head
if(head)
@@ -71,8 +65,6 @@
msg += "<span class='warning'>[t_He] [t_is] carrying \icon[s_store] [s_store.gender==PLURAL?"some":"a"] blood-stained [s_store.name] on [t_his] [wear_suit.name]!</span>\n"
else
msg += "[t_He] [t_is] carrying \icon[s_store] \a [s_store] on [t_his] [wear_suit.name].\n"
if(vore_insuit_datum.has_people()&&!insuit_handled)
msg += "<span class='warning'>The fabric is moving!</span>\n"
//back
if(back)
@@ -254,6 +246,7 @@
msg += "[t_He] [t_is] plump and delicious looking - Like a fat little piggy. A tasty piggy.\n"
else
msg += "[t_He] [t_is] quite chubby.\n"
/*
if( (vore_womb_datum.has_people()||vore_stomach_datum.has_people()) && !(slot_w_uniform in obscured) )
msg += "It seems [t_his] belly is shifting around slighty.\n"
if( (vore_breast_datum.has_people()||vore_breast_datum.digestion_count) && !(slot_w_uniform in obscured) )
@@ -268,7 +261,7 @@
if(vore_tail_datum.transfer_factor)
msg += " It moves slowly toward the base."
msg += "\n"
*/
if(blood_volume < BLOOD_VOLUME_SAFE)
msg += "[t_He] [t_has] pale skin.\n"

View File

@@ -56,6 +56,13 @@
var/siemens_coeff = 1 //base electrocution coefficient
var/exotic_damage_overlay = ""
var/fixed_mut_color = "" //to use MUTCOLOR with a fixed color that's independent of dna.feature["mcolor"]
var/fixed_mut_color2 = ""
var/fixed_mut_color3 = ""
var/generic = "something"
var/adjective = "unknown"
var/restricted = 0 //Set to 1 to not allow anyone to choose it, 2 to hide it from the DNA scanner, and text to restrict it to one person
// var/tail=0
// var/taur=0
var/invis_sight = SEE_INVISIBLE_LIVING
var/darksight = 2
@@ -293,52 +300,14 @@
var/datum/sprite_accessory/socks/U3 = socks_list[H.socks]
if(U3)
standing += image("icon"=U3.icon, "icon_state"="[U3.icon_state]_s", "layer"=-BODY_LAYER)
//Custom Code
if(H.dna&&H.dna.taur&&!kpcode_cantaur(id))H.dna.taur=0//VERY BAD TEMP FIX
if(H.underwear&&H.underwear!="Nude"&&H.underwear_active&& (!H.dna||!H.dna.taur) )
var/datum/sprite_accessory/underwear/U = underwear_list[H.underwear]
if(U)
standing += image("icon"=U.icon, "icon_state"="[U.icon_state]_s", "layer"=-BODY_LAYER)
else if((!H.dna || !H.dna.taur) && (!H.wear_suit || !(H.wear_suit.flags_inv&HIDEJUMPSUIT)) && (!H.w_uniform||!(H.w_uniform.body_parts_covered&GROIN)) )
if(H.dna&&H.dna.cock)
//cock codes here
var/list/cock=H.dna.cock
var/cock_mod=0
var/cock_type=cock["type"]
if(cock["has"]==H.dna.COCK_NORMAL)cock_mod="n"
else if(cock["has"]==H.dna.COCK_HYPER)cock_mod="h"
else if(cock["has"]==H.dna.COCK_DOUBLE)cock_mod="d"
if(cock_mod)
var/icon/chk=new/icon('icons/mob/cock.dmi')
var/list/available_states=chk.IconStates()
if(available_states.Find("[cock_type]_c_[cock_mod]"))
var/image/cockimtmp = image("icon"='icons/mob/cock.dmi', "icon_state"="[cock_type]_c_[cock_mod]", "layer"=-BODY_LAYER)
var/new_color = "#" + cock["color"]
cockimtmp.color = new_color
standing += cockimtmp
if(available_states.Find("[cock_type]_s_[cock_mod]"))
var/image/cockimtmp = image("icon"='icons/mob/cock.dmi', "icon_state"="[cock_type]_s_[cock_mod]", "layer"=-BODY_LAYER)
if(H.dna.special_color[2])
var/new_color = "#" + H.dna.special_color[2]
cockimtmp.color = new_color
standing += cockimtmp
if(H.dna&&H.dna.taur)
var/taur_state="[kpcode_cantaur(H.dna.mutantrace())]_overlay"
if(H.vore_womb_datum.has_people()||H.vore_stomach_datum.has_people())
taur_state+="_f"
standing += generate_colour_icon('icons/mob/special/taur.dmi',"[taur_state]",H.dna.special_color,offset_x=-16,add_layer=-BODY_LAYER)
if(standing.len)
H.overlays_standing[BODY_LAYER] = standing
if(standing.len)
H.overlays_standing[BODY_LAYER] = standing
H.apply_overlay(BODY_LAYER)
/datum/species/proc/handle_mutant_bodyparts(mob/living/carbon/human/H, forced_colour)
var/list/bodyparts_to_add = mutant_bodyparts.Copy()
var/list/relevent_layers = list(BODY_BEHIND_LAYER, BODY_ADJ_LAYER, BODY_FRONT_LAYER)
@@ -367,13 +336,26 @@
if(H.wear_suit && (H.wear_suit.flags_inv & HIDEJUMPSUIT))
bodyparts_to_add -= "tail_human"
if("waggingtail_human" in mutant_bodyparts)
if(H.wear_suit && (H.wear_suit.flags_inv & HIDEJUMPSUIT))
bodyparts_to_add -= "waggingtail_human"
else if ("tail_human" in mutant_bodyparts)
bodyparts_to_add -= "waggingtail_human"
if("mam_tail" in mutant_bodyparts)
if(H.wear_suit && (H.wear_suit.flags_inv & HIDEJUMPSUIT))
bodyparts_to_add -= "mam_tail"
if("mam_waggingtail" in mutant_bodyparts)
if(H.wear_suit && (H.wear_suit.flags_inv & HIDEJUMPSUIT))
bodyparts_to_add -= "mam_waggingtail"
else if ("mam_tail" in mutant_bodyparts)
bodyparts_to_add -= "mam_waggingtail"
if("mam_ears" in mutant_bodyparts)
if(!H.dna.features["mam_ears"] || H.dna.features["mam_ears"] == "None" || H.head && (H.head.flags_inv & HIDEHAIR) || (H.wear_mask && (H.wear_mask.flags_inv & HIDEHAIR)) || !HD || HD.status == ORGAN_ROBOTIC)
bodyparts_to_add -= "mam_ears"
if("spines" in mutant_bodyparts)
if(!H.dna.features["spines"] || H.dna.features["spines"] == "None" || H.wear_suit && (H.wear_suit.flags_inv & HIDEJUMPSUIT))
bodyparts_to_add -= "spines"
@@ -448,16 +430,26 @@
S = wings_list[H.dna.features["wings"]]
if("wingsopen")
S = wings_open_list[H.dna.features["wings"]]
//mammal bodyparts
if("mam_tail")
S = mam_tails_list[H.dna.features["mam_tail"]]
if("mam_waggingtail")
S.= mam_tails_animated_list[H.dna.features["mam_tail"]]
if("mam_body_markings")
S = mam_body_markings_list[H.dna.features["mam_body_markings"]]
if("mam_ears")
S = mam_ears_list[H.dna.features["mam_ears"]]
if(!S || S.icon_state == "none")
continue
//A little rename so we don't have to use tail_lizard or tail_human when naming the sprites.
if(bodypart == "tail_lizard" || bodypart == "tail_human")
if(bodypart == "tail_lizard" || bodypart == "tail_human" || bodypart == "mam_tail")
bodypart = "tail"
else if(bodypart == "waggingtail_lizard" || bodypart == "waggingtail_human")
else if(bodypart == "waggingtail_lizard" || bodypart == "waggingtail_human" || bodypart == "mam_waggingtail")
bodypart = "waggingtail"
if(bodypart == "mam_ears")
bodypart = "ears"
var/icon_string
@@ -479,6 +471,16 @@
I.color = "#[fixed_mut_color]"
else
I.color = "#[H.dna.features["mcolor"]]"
if(MUTCOLORS2)
if(fixed_mut_color2)
I.color = "#[fixed_mut_color2]"
else
I.color = "#[H.dna.features["mcolor2"]]"
if(MUTCOLORS3)
if(fixed_mut_color3)
I.color = "#[fixed_mut_color3]"
else
I.color = "#[H.dna.features["mcolor3"]]"
if(HAIR)
if(hair_color == "mutcolor")
I.color = "#[H.dna.features["mcolor"]]"
@@ -490,6 +492,7 @@
I.color = "#[H.eye_color]"
else
I.color = forced_colour
standing += I
if(S.hasinner)
@@ -505,6 +508,44 @@
standing += I
if(S.extra)
if(S.gender_specific)
icon_string = "[g]_[bodypart]_extra_[S.icon_state]_[layer]"
else
icon_string = "m_[bodypart]_extra_[S.icon_state]_[layer]"
I = image("icon" = S.icon, "icon_state" = icon_string, "layer" =- layer)
if(S.center)
I = center_image(I,S.dimension_x,S.dimension_y)
switch(S.extra_color_src)
if(MUTCOLORS)
if(fixed_mut_color)
I.color = "#[fixed_mut_color]"
else
I.color = "#[H.dna.features["mcolor"]]"
if(MUTCOLORS2)
if(fixed_mut_color2)
I.color = "#[fixed_mut_color2]"
else
I.color = "#[H.dna.features["mcolor2"]]"
if(MUTCOLORS3)
if(fixed_mut_color3)
I.color = "#[fixed_mut_color3]"
else
I.color = "#[H.dna.features["mcolor3"]]"
if(HAIR)
if(hair_color == "mutcolor")
I.color = "#[H.dna.features["mcolor"]]"
else
I.color = "#[H.hair_color]"
if(FACEHAIR)
I.color = "#[H.facial_hair_color]"
if(EYECOLOR)
I.color = "#[H.eye_color]"
standing += I
H.overlays_standing[layer] = standing.Copy()
standing = list()

View File

@@ -6,9 +6,9 @@
name = "Human"
id = "human"
default_color = "FFFFFF"
//specflags = list(EYECOLOR,HAIR,FACEHAIR,LIPS)
mutant_bodyparts = list("tail_human", "ears", "wings")
default_features = list("mcolor" = "FFF", "tail_human" = "None", "ears" = "None", "wings" = "None")
specflags = list(MUTCOLORS_PARTSONLY,EYECOLOR,HAIR,FACEHAIR,LIPS)
mutant_bodyparts = list("tail_human", "ears")
default_features = list("tail_human" = "None", "ears" = "None")
use_skintones = 1
skinned_type = /obj/item/stack/sheet/animalhide/human
@@ -57,7 +57,7 @@
specflags = list(MUTCOLORS,EYECOLOR,LIPS,HAIR,FACEHAIR)
mutant_bodyparts = list("tail_lizard", "snout", "spines", "horns", "frills", "body_markings")
mutant_organs = list(/obj/item/organ/tongue/lizard)
default_features = list("mcolor" = "0F0", "tail" = "Smooth", "snout" = "Round", "horns" = "None", "frills" = "None", "spines" = "None", "body_markings" = "None")
default_features = list("mcolor" = "0F0","mcolor2" = "0F0","mcolor3" = "0F0", "tail" = "Smooth", "snout" = "Round", "horns" = "None", "frills" = "None", "spines" = "None", "body_markings" = "None")
attack_verb = "slash"
attack_sound = 'sound/weapons/slash.ogg'
miss_sound = 'sound/weapons/slashmiss.ogg'
@@ -166,6 +166,7 @@
meat = /obj/item/weapon/reagent_containers/food/snacks/meat/slab/human/mutant/shadow
specflags = list(NOBREATH,NOBLOOD,RADIMMUNE,VIRUSIMMUNE)
dangerous_existence = 1
restricted = 2
/datum/species/shadow/spec_life(mob/living/carbon/human/H)
var/light_amount = 0
@@ -193,6 +194,7 @@
meat = /obj/item/weapon/reagent_containers/food/snacks/meat/slab/human/mutant/slime
exotic_blood = "slimejelly"
var/datum/action/innate/regenerate_limbs/regenerate_limbs
restricted = 2
/datum/species/jelly/on_species_loss(mob/living/carbon/C)
if(regenerate_limbs)
@@ -261,17 +263,17 @@
H << "<span class='notice'>You feel intact enough as it is.</span>"
return
H << "<span class='notice'>You focus intently on your missing [limbs_to_heal.len >= 2 ? "limbs" : "limb"]...</span>"
if(H.blood_volume >= 40*limbs_to_heal.len+BLOOD_VOLUME_OKAY)
if(H.blood_volume >= 150*limbs_to_heal.len+BLOOD_VOLUME_OKAY)
H.regenerate_limbs()
H.blood_volume -= 40*limbs_to_heal.len
H.blood_volume -= 150*limbs_to_heal.len
H << "<span class='notice'>...and after a moment you finish reforming!</span>"
return
else if(H.blood_volume >= 40)//We can partially heal some limbs
while(H.blood_volume >= BLOOD_VOLUME_OKAY+40)
else if(H.blood_volume >= 150)//We can partially heal some limbs
while(H.blood_volume >= BLOOD_VOLUME_OKAY+150)
var/healed_limb = pick(limbs_to_heal)
H.regenerate_limb(healed_limb)
limbs_to_heal -= healed_limb
H.blood_volume -= 40
H.blood_volume -= 150
H << "<span class='warning'>...but there is not enough of you to fix everything! You must attain more mass to heal completely!</span>"
return
H << "<span class='warning'>...but there is not enough of you to go around! You must attain more mass to heal!</span>"
@@ -281,7 +283,7 @@
*/
/datum/species/jelly/slime
// Humans mutated by slime mutagen, produced from green slimes. They are not targetted by slimes.
// Humans mutated by slime mutagen, produced from green slimes. They are not targeted by slimes.
name = "Slimeperson"
id = "slime"
default_color = "00FFFF"
@@ -290,14 +292,15 @@
say_mod = "says"
eyes = "eyes"
hair_color = "mutcolor"
hair_alpha = 150
hair_alpha = 192
ignored_by = list(/mob/living/simple_animal/slime)
burnmod = 0.5
burnmod = 0.9
coldmod = 2
heatmod = 0.5
heatmod = 0.9
var/datum/action/innate/split_body/slime_split
var/list/mob/living/carbon/bodies
var/datum/action/innate/swap_body/swap_body
roundstart = 1
/datum/species/jelly/slime/on_species_loss(mob/living/carbon/C)
if(slime_split)
@@ -314,11 +317,6 @@
/datum/species/jelly/slime/on_species_gain(mob/living/carbon/C, datum/species/old_species)
..()
if(ishuman(C))
slime_split = new
slime_split.Grant(C)
swap_body = new
swap_body.Grant(C)
if(!bodies || !bodies.len)
bodies = list(C)
else
@@ -530,7 +528,7 @@
siemens_coeff = 0
punchdamagelow = 5
punchdamagehigh = 14
punchstunthreshold = 11 //about 40% chance to stun
punchstunthreshold = 12 //about 15% chance to stun
no_equip = list(slot_wear_mask, slot_wear_suit, slot_gloves, slot_shoes, slot_w_uniform)
nojumpsuit = 1
sexes = 1
@@ -541,6 +539,7 @@
dangerous_existence = TRUE
limbs_id = "golem"
fixed_mut_color = "aaa"
restricted = 2
/datum/species/golem/random
name = "Random Golem"
@@ -631,6 +630,7 @@
meat = /obj/item/weapon/reagent_containers/food/snacks/meat/slab/human/mutant/skeleton
specflags = list(NOBREATH,RESISTTEMP,NOBLOOD,RADIMMUNE,VIRUSIMMUNE,PIERCEIMMUNE,NOHUNGER,EASYDISMEMBER,EASYLIMBATTACHMENT)
mutant_organs = list(/obj/item/organ/tongue/bone)
restricted = 2
/*
ZOMBIES
@@ -647,6 +647,7 @@
specflags = list(NOBREATH,RESISTTEMP,NOBLOOD,RADIMMUNE,NOZOMBIE,EASYDISMEMBER,EASYLIMBATTACHMENT, TOXINLOVER)
mutant_organs = list(/obj/item/organ/tongue/zombie)
speedmod = 2
restricted = 2
/datum/species/zombie/infectious
name = "Infectious Zombie"
@@ -693,6 +694,7 @@
sexes = 0
meat = /obj/item/weapon/reagent_containers/food/snacks/meat/slab/human/mutant/zombie
mutant_organs = list(/obj/item/organ/tongue/zombie)
restricted = 2
/datum/species/abductor
name = "Abductor"
@@ -705,6 +707,7 @@
var/scientist = 0 // vars to not pollute spieces list with castes
var/agent = 0
var/team = 1
restricted = 2
var/global/image/plasmaman_on_fire = image("icon"='icons/mob/OnFire.dmi', "icon_state"="plasmaman")
@@ -779,6 +782,8 @@ var/global/image/plasmaman_on_fire = image("icon"='icons/mob/OnFire.dmi', "icon_
var/list/initial_specflags = list(NOTRANSSTING,NOBREATH,VIRUSIMMUNE,NODISMEMBER,NOHUNGER) //for getting these values back for assume_disguise()
var/disguise_fail_health = 75 //When their health gets to this level their synthflesh partially falls off
var/datum/species/fake_species = null //a species to do most of our work for us, unless we're damaged
restricted = 2
roundstart = 0
/datum/species/synth/military
name = "Military Synth"
@@ -788,6 +793,7 @@ var/global/image/plasmaman_on_fire = image("icon"='icons/mob/OnFire.dmi', "icon_
punchdamagehigh = 19
punchstunthreshold = 14 //about 50% chance to stun
disguise_fail_health = 50
restricted = 2
/datum/species/synth/on_species_gain(mob/living/carbon/human/H, datum/species/old_species)
..()
@@ -908,6 +914,7 @@ SYNDICATE BLACK OPS
use_skintones = 0
specflags = list(RADIMMUNE,VIRUSIMMUNE,NOBLOOD,PIERCEIMMUNE,EYECOLOR,NODISMEMBER,NOHUNGER)
sexes = 0
restricted = 2
/datum/species/angel
name = "Angel"
@@ -919,6 +926,7 @@ SYNDICATE BLACK OPS
use_skintones = 1
no_equip = list(slot_back)
blacklisted = 1
restricted = 2
limbs_id = "human"
skinned_type = /obj/item/stack/sheet/animalhide/human
@@ -1052,3 +1060,101 @@ SYNDICATE BLACK OPS
override_float = 0
H.pass_flags &= ~PASSTABLE
H.CloseWings()
//CANID//
datum/species/canid
name = "Canid"
id = "canid"
default_color = "4B4B4B"
specflags = list(MUTCOLORS,EYECOLOR,LIPS,HAIR)
mutant_bodyparts = list("mam_tail", "mam_ears", "mam_body_markings", "snout")
default_features = list("mcolor" = "FFF","mcolor2" = "FFF","mcolor3" = "FFF", "body_markings" = "None", "mam_tail" = "None", "mam_ears" = "None", "mam_body_markings" = "None")
attack_verb = "claw"
attack_sound = 'sound/weapons/slash.ogg'
miss_sound = 'sound/weapons/slashmiss.ogg'
roundstart = 1
/datum/species/canid/spec_death(gibbed, mob/living/carbon/human/H)
if(H)
H.endTailWag()
//FELID//
/datum/species/felid
name = "Felid"
id = "felid"
default_color = "BCAC9B"
specflags = list(MUTCOLORS,EYECOLOR,LIPS,HAIR)
mutant_bodyparts = list("mam_body_markings", "mam_ears", "mam_tail", "snout")
default_features = list("mcolor" = "FFF","mcolor2" = "FFF","mcolor3" = "FFF", "mam_body_markings" = "Belly", "mam_ears" = "Big Cat", "mam_tail" = "Big Cat")
attack_verb = "claw"
attack_sound = 'sound/weapons/slash.ogg'
miss_sound = 'sound/weapons/slashmiss.ogg'
roundstart = 1 //no sprites yet
/datum/species/tajaran/spec_death(gibbed, mob/living/carbon/human/H)
if(H)
H.endTailWag()
//AVIAN//
/datum/species/ave
name = "Avian"
id = "avian"
default_color = "BCAC9B"
specflags = list(MUTCOLORS,EYECOLOR,LIPS,HAIR)
mutant_bodyparts = list("beak", "wings", "avian_tail")
default_features = list("beak" = "None", "wings" = "None")
attack_verb = "peck"
attack_sound = 'sound/weapons/slash.ogg'
miss_sound = 'sound/weapons/slashmiss.ogg'
roundstart = 0 //no sprites yet
blacklisted = 1
//HERBIVOROUS//
//EXOTIC//
/datum/species/xeno
name = "Xenomorph"
id = "xeno"
default_color = "BCAC9B"
say_mod = "hisses"
eyes = "eyes_xeno"
specflags = list(NOGUNS,MUTCOLORS)
mutant_bodyparts = list("xeno_head", "dorsal_tubes")
default_features = list("xeno_head" = "None", "dorsal_tubes" = "None")
attack_verb = "slash"
attack_sound = 'sound/weapons/slash.ogg'
miss_sound = 'sound/weapons/slashmiss.ogg'
burnmod = 1.5
heatmod = 1.5
safe_toxins_max = 9999999
exotic_blood = "xblood"
exotic_damage_overlay = "xeno"
roundstart = 0 //wip
blacklisted = 1 //so xenobio can't steal the broken races
no_equip = list(slot_glasses) //MY EYES, THEY'RE GONE
meat = /obj/item/weapon/reagent_containers/food/snacks/meat/slab/xeno
skinned_type = /obj/item/stack/sheet/animalhide/xeno
/datum/species/xeno/on_species_gain(mob/living/carbon/C, datum/species/old_species)
var/obj/effect/decal/cleanable/xenoblood/xgibs/XG
if(istype(C.gib_type, XG))
return
else
C.gib_type = XG
/datum/species/xeno/on_species_loss(mob/living/carbon/C)
var/obj/effect/decal/cleanable/xenoblood/xgibs/XG
var/obj/effect/decal/cleanable/blood/gibs/HG
if(istype(C.gib_type, XG))
C.gib_type = HG
else
return
/datum/reagent/toxin/acid/xenoblood
name = "acid blood"
id = "xblood"
description = "A highly corrosive substance, it is capable of burning through most natural or man-made materials in short order."
color = "#66CC00"
toxpwr = 0.5
acidpwr = 12

View File

@@ -4,10 +4,8 @@
/* Keep these comments up-to-date if you -insist- on hurting my code-baby ;_;
This system allows you to update individual mob-overlays, without regenerating them all each time.
When we generate overlays we generate the standing version and then rotate the mob as necessary..
As of the time of writing there are 20 layers within this list. Please try to keep this from increasing. //22 and counting, good job guys
var/overlays_standing[20] //For the standing stance
Most of the time we only wish to update one overlay:
e.g. - we dropped the fireaxe out of our left hand and need to remove its icon from our mob
e.g.2 - our hair colour has changed, so we need to update our hair icons on our mob
@@ -15,28 +13,21 @@ In these cases, instead of updating every overlay using the old behaviour (regen
the appropriate update_X proc.
e.g. - update_l_hand()
e.g.2 - update_hair()
Note: Recent changes by aranclanos+carn:
update_icons() no longer needs to be called.
the system is easier to use. update_icons() should not be called unless you absolutely -know- you need it.
IN ALL OTHER CASES it's better to just call the specific update_X procs.
Note: The defines for layer numbers is now kept exclusvely in __DEFINES/misc.dm instead of being defined there,
then redefined and undefiend everywhere else. If you need to change the layering of sprites (or add a new layer)
that's where you should start.
All of this means that this code is more maintainable, faster and still fairly easy to use.
There are several things that need to be remembered:
> Whenever we do something that should cause an overlay to update (which doesn't use standard procs
( i.e. you do something like l_hand = /obj/item/something new(src), rather than using the helper procs)
You will need to call the relevant update_inv_* proc
All of these are named after the variable they update from. They are defined at the mob/ level like
update_clothing was, so you won't cause undefined proc runtimes with usr.update_inv_wear_id() if the usr is a
slime etc. Instead, it'll just return without doing any work. So no harm in calling it for slimes and such.
> There are also these special cases:
update_damage_overlays() //handles damage overlays for brute/burn damage
update_body() //Handles updating your mob's body layer and mutant bodyparts
@@ -44,8 +35,6 @@ There are several things that need to be remembered:
//NOTE: update_mutantrace() is now merged into this!
update_hair() //Handles updating your hair overlay (used to be update_face, but mouth and
eyes were merged into update_body())
*/
//DAMAGE OVERLAYS
@@ -79,59 +68,11 @@ There are several things that need to be remembered:
dna.species.handle_mutant_bodyparts(src)
//mob/living/carbon/human/proc/update_body()
/mob/living/carbon/human/update_body()
/mob/living/carbon/human/proc/update_body()
remove_overlay(BODY_LAYER)
dna.species.handle_body(src)
update_body_parts()
//Tail code
remove_overlay(TAIL_LAYER)
var/list/t_standing = list()
//var/icon/chk=new/icon('icons/mob/tail.dmi')
//var/list/available_states=chk.IconStates()
var/wing = dna ? dna.mutantwing : null
if(wing&&wing!="none"&&!dna.taur)
var/image/wing_s = image("icon" = 'icons/mob/wing.dmi', "icon_state" = "[wing]", "layer" = -TAIL_LAYER)
wing_s.color = "#" + dna.wingcolor
t_standing += wing_s
var/race = dna ? dna.mutantrace() : null
if(race&&kpcode_hastail(race) &&!dna.taur) //Temp taur fix
t_standing+=generate_colour_icon('icons/mob/tail.dmi',"[kpcode_hastail(race)]",dna.special_color,add_layer=-TAIL_LAYER)
/*var/list/standingt = list()
standingt += image("icon"='icons/mob/tail.dmi', "icon_state"="[race]", "layer"=-TAIL_LAYER)
if(dna.special_color_one)
if(available_states.Find("[race]_1"))
var/image/standingt_one = image("icon"='icons/mob/tail.dmi', "icon_state"="[race]_1", "layer"=-TAIL_LAYER)
var/new_color = "#" + dna.special_color_one
standingt_one.color = new_color
standingt += standingt_one
overlays_standing[TAIL_LAYER] = standingt*/
else
if(!race||race=="human")
var/tail = dna ? dna.mutanttail : null
if(tail&&kpcode_hastail(tail) &&!dna.taur) //Temp taur fix
t_standing+=generate_colour_icon('icons/mob/tail.dmi',"[kpcode_hastail(tail)]",dna.special_color,add_layer=-TAIL_LAYER,human=hair_color)
/*var/list/standingt = list()
standingt += image("icon"='icons/mob/tail.dmi', "icon_state"="[kpcode_hastail(tail)]", "pixel_y"=kpcode_tail_offset(tail), "layer"=-TAIL_LAYER) //may need a +(pixel_y/2)
var/image/standingt_one = image("icon"='icons/mob/tail.dmi', "icon_state"="[kpcode_hastail(tail)]_1", "pixel_y"=kpcode_tail_offset(tail), "layer"=-TAIL_LAYER)
var/new_color = "#" + hair_color
standingt_one.color = new_color
standingt += standingt_one
overlays_standing[TAIL_LAYER] = standingt*/
if(dna&&dna.taur)
t_standing+=generate_colour_icon('icons/mob/special/taur.dmi',"[kpcode_cantaur(dna.mutantrace())]_tail",dna.special_color,offset_x=-16,add_layer=-TAIL_LAYER)
if(src.vore_womb_datum.has_people()||src.vore_stomach_datum.has_people())
t_standing+=generate_colour_icon('icons/mob/special/taur.dmi',"[kpcode_cantaur(dna.mutantrace())]_tail_f",dna.special_color,offset_x=-16,add_layer=-TAIL_LAYER)
if(t_standing.len)
overlays_standing[TAIL_LAYER] =t_standing
apply_overlay(TAIL_LAYER)
/mob/living/carbon/human/update_fire()
..("Standing")
@@ -536,23 +477,15 @@ covers:
centering large images
layering images on custom layers
building images from custom icon files
By Remie Richards (yes I'm taking credit because this just removed 90% of the copypaste in update_icons())
state: A string to use as the state, this is FAR too complex to solve in this proc thanks to shitty old code
so it's specified as an argument instead.
default_layer: The layer to draw this on if no other layer is specified
default_icon_file: The icon file to draw states from if no other icon file is specified
isinhands: If true then alternate_worn_icon is skipped so that default_icon_file is used,
in this situation default_icon_file is expected to match either the lefthand_ or righthand_ file var
femalueuniform: A value matching a uniform item's fitted var, if this is anything but NO_FEMALE_UNIFORM, we
generate/load female uniform sprites matching all previously decided variables
*/
/obj/item/proc/build_worn_icon(var/state = "", var/default_layer = 0, var/default_icon_file = null, var/isinhands = FALSE, var/femaleuniform = NO_FEMALE_UNIFORM)
@@ -629,6 +562,8 @@ var/global/list/limb_icon_cache = list()
. += "-coloured-[dna.species.fixed_mut_color]"
else if(dna.features["mcolor"])
. += "-coloured-[dna.features["mcolor"]]"
else if(dna.features["mcolor"] && dna.species.use_skintones)
. += "-coloured-[skin_tone]"
else
. += "-not_coloured"
@@ -651,4 +586,4 @@ var/global/list/limb_icon_cache = list()
if(limb_icon_cache[icon_render_key])
remove_overlay(BODYPARTS_LAYER)
overlays_standing[BODYPARTS_LAYER] = limb_icon_cache[icon_render_key]
apply_overlay(BODYPARTS_LAYER)
apply_overlay(BODYPARTS_LAYER)

View File

@@ -212,11 +212,11 @@
take_organ_damage(min(10*toxpwr, acid_volume * toxpwr))
/mob/living/proc/grabbedby(mob/living/carbon/user, supress_message = 0)
if(user == src)
var/mob/living/target
if(pulling && !pulling.anchored && grab_state >= GRAB_AGGRESSIVE && isliving(pulling))
target = pulling
user.vore_initiate(target,user)
// if(user == src)
// var/mob/living/target
// if(pulling && !pulling.anchored && grab_state >= GRAB_AGGRESSIVE && isliving(pulling))
// target = pulling
// user.vore_initiate(target,user)
if(anchored)
return 0
if(!user.pulling || user.pulling != src)

View File

@@ -20,7 +20,7 @@
ventcrawler = 2
var/datum/mind/origin
var/egg_lain = 0
gold_core_spawnable = 1 //are you sure about this??
// gold_core_spawnable = 1 //are you sure about this?? (NO, THEY WEREN'T. THIS WAS AN AWFUL DECISION)
/mob/living/simple_animal/hostile/headcrab/proc/Infect(mob/living/carbon/victim)
var/obj/item/organ/body_egg/changeling_egg/egg = new(victim)

View File

@@ -60,13 +60,19 @@
var/dimension_x = 32
var/dimension_y = 32
var/center = FALSE //Should we center the sprite?
var/extra = 0 //Used for extra overlays on top of the bodypart that may be colored seperately. Uses the secondary mutant color as default. See species.dm for the actual overlay code.
var/extra_icon = 'icons/mob/mam_bodyparts.dmi'
var/extra_color_src = MUTCOLORS2 //The color source for the extra overlay.
//////////////////////
// Hair Definitions //
//////////////////////
/datum/sprite_accessory/hair
icon = 'icons/mob/human_face.dmi' // default icon for all hairs
/datum/sprite_accessory/hair/bald //Moved to the top so we can all stop scrolling all the way down.
name = "Bald"
icon_state = null
/datum/sprite_accessory/hair/short
name = "Short Hair" // try to capatilize the names please~
icon_state = "hair_a" // you do not need to define _s or _l sub-states, game automatically does this for you
@@ -392,10 +398,6 @@
name = "Balding Hair"
icon_state = "hair_e"
/datum/sprite_accessory/hair/bald
name = "Bald"
icon_state = null
/datum/sprite_accessory/hair/parted
name = "Side Part"
icon_state = "hair_part"
@@ -1125,6 +1127,7 @@
/datum/sprite_accessory/body_markings
icon = 'icons/mob/mutant_bodyparts.dmi'
color_src = MUTCOLORS2
/datum/sprite_accessory/body_markings/none
name = "None"
@@ -1229,6 +1232,8 @@
name = "Aquatic"
icon_state = "aqua"
/datum/sprite_accessory/tails/human
/datum/sprite_accessory/tails/human/none
name = "None"
icon_state = "none"
@@ -1240,12 +1245,10 @@
/datum/sprite_accessory/tails/human/cat
name = "Cat"
icon_state = "cat"
color_src = HAIR
/datum/sprite_accessory/tails_animated/human/cat
name = "Cat"
icon_state = "cat"
color_src = HAIR
/datum/sprite_accessory/snouts
icon = 'icons/mob/mutant_bodyparts.dmi'
@@ -1304,7 +1307,6 @@
name = "Cat"
icon_state = "cat"
hasinner = 1
color_src = HAIR
/datum/sprite_accessory/wings/none
name = "None"
@@ -1405,3 +1407,216 @@
/datum/sprite_accessory/spines_animated/aqautic
name = "Aquatic"
icon_state = "aqua"
//Human Ears/Tails
/datum/sprite_accessory/ears/fox
name = "Fox"
icon_state = "fox"
hasinner = 0
icon = 'icons/mob/mam_bodyparts.dmi'
/datum/sprite_accessory/ears/wolf
name = "Wolf"
icon_state = "wolf"
hasinner = 0
icon = 'icons/mob/mam_bodyparts.dmi'
/datum/sprite_accessory/tails/human/fox
name = "Fox"
icon_state = "fox"
icon = 'icons/mob/mam_bodyparts.dmi'
extra = 1
/datum/sprite_accessory/tails_animated/human/fox
name = "Fox"
icon_state = "fox"
icon = 'icons/mob/mam_bodyparts.dmi'
extra = 1
/datum/sprite_accessory/tails/human/wolf
name = "Wolf"
icon_state = "wolf"
icon = 'icons/mob/mam_bodyparts.dmi'
/datum/sprite_accessory/tails_animated/human/wolf
name = "Wolf"
icon_state = "wolf"
icon = 'icons/mob/mam_bodyparts.dmi'
/datum/sprite_accessory/tails/human/catbig
name = "Cat, Big"
icon_state = "catbig"
icon = 'icons/mob/mam_bodyparts.dmi'
/datum/sprite_accessory/tails_animated/human/catbig
name = "Cat, Big"
icon_state = "catbig"
icon = 'icons/mob/mam_bodyparts.dmi'
/datum/sprite_accessory/ears/fennec
name = "Fennec"
icon_state = "fennec"
icon = 'icons/mob/mam_bodyparts.dmi'
/datum/sprite_accessory/tails/human/fennec
name = "Fennec"
icon_state = "fennec"
icon = 'icons/mob/mam_bodyparts.dmi'
/datum/sprite_accessory/tails_animated/human/fennec
name = "Fennec"
icon_state = "fennec"
icon = 'icons/mob/mam_bodyparts.dmi'
/datum/sprite_accessory/ears/lab
name = "Dog, Floppy"
icon_state = "lab"
hasinner = 0
icon = 'icons/mob/mam_bodyparts.dmi'
/datum/sprite_accessory/tails/human/husky
name = "Husky"
icon_state = "husky"
icon = 'icons/mob/mam_bodyparts.dmi'
extra = 1
/datum/sprite_accessory/tails_animated/human/husky
name = "Husky"
icon_state = "husky"
icon = 'icons/mob/mam_bodyparts.dmi'
extra = 1
//Mammal Bodyparts
/datum/sprite_accessory/mam_ears
icon = 'icons/mob/mam_bodyparts.dmi'
/datum/sprite_accessory/mam_tails
icon = 'icons/mob/mam_bodyparts.dmi'
/datum/sprite_accessory/mam_tails_animated
icon = 'icons/mob/mam_bodyparts.dmi'
//Snouts
/datum/sprite_accessory/snouts/lcanid
name = "Long, Thin"
icon_state = "lcanid"
/datum/sprite_accessory/snouts/scanid
name = "Short, Thin"
icon_state = "scanid"
//Cat, Big
/datum/sprite_accessory/mam_ears/catbig
name = "Cat, Big"
icon_state = "cat"
hasinner = 1
icon = 'icons/mob/mutant_bodyparts.dmi'
/datum/sprite_accessory/mam_tails/catbig
name = "Cat, Big"
icon_state = "catbig"
/datum/sprite_accessory/mam_tails_animated/catbig
name = "Cat, Big"
icon_state = "catbig"
//Wolf
/datum/sprite_accessory/mam_ears/wolf
name = "Wolf"
icon_state = "wolf"
hasinner = 1
/datum/sprite_accessory/mam_tails/wolf
name = "Wolf"
icon_state = "wolf"
/datum/sprite_accessory/mam_tails_animated/wolf
name = "Wolf"
icon_state = "wolf"
//Fox
/datum/sprite_accessory/mam_ears/fox
name = "Fox"
icon_state = "fox"
hasinner = 0
/datum/sprite_accessory/mam_tails/fox
name = "Fox"
icon_state = "fox"
extra = 1
extra_color_src = MUTCOLORS2
/datum/sprite_accessory/mam_tails_animated/fox
name = "Fox"
icon_state = "fox"
extra = 1
extra_color_src = MUTCOLORS2
//Fennec
/datum/sprite_accessory/mam_ears/fennec
name = "Fennec"
icon_state = "fennec"
hasinner = 1
/datum/sprite_accessory/mam_tails/fennec
name = "Fennec"
icon_state = "fennec"
/datum/sprite_accessory/mam_tails_animated/fennec
name = "Fennec"
icon_state = "fennec"
//Lab
/datum/sprite_accessory/mam_ears/lab
name = "Dog, Long"
icon_state = "lab"
hasinner = 0
/datum/sprite_accessory/mam_tails/lab
name = "Lab"
icon_state = "lab"
/datum/sprite_accessory/mam_tails_animated/lab
name = "Lab"
icon_state = "lab"
//Husky
/datum/sprite_accessory/mam_tails/husky
name = "Husky"
icon_state = "husky"
extra = 1
//Mammal Specific Body Markings
/datum/sprite_accessory/mam_body_markings
color_src = MUTCOLORS2
icon = 'icons/mob/mam_bodyparts.dmi'
/datum/sprite_accessory/mam_body_markings/none
name = "None"
icon_state = "none"
/datum/sprite_accessory/mam_body_markings/belly
name = "Belly"
icon_state = "belly"
gender_specific = 1
/*
/datum/sprite_accessory/mam_body_markings/bellyhandsfeet
name = "Belly, Hands, & Feet"
icon_state = "bellyhandsfeet"
gender_specific = 1
extra = 1
extra_color_src = MUTCOLORS3
*/
//Exotic Bodyparts
/*
/datum/sprite_accessory/xeno_dorsal
locked = 1
name = "Dorsal Tubes"
icon_state "dortubes"
/datum/sprite_accessory/tails/xeno
locked = 1
name = "Xenomorph Tail"
icon_state = "xenotail"
*/

View File

@@ -41,7 +41,7 @@ EMOJIS
## To speed things up make the number negative, to slow things down, make the number positive.
## These modify the run/walk speed of all mobs before the mob-specific modifiers are applied.
RUN_DELAY 1
RUN_DELAY 2
WALK_DELAY 4
## The variables below affect the movement of specific mob types.
@@ -277,16 +277,16 @@ JOIN_WITH_MUTANT_RACE
ROUNDSTART_RACES human
## Races because TG is racist
ROUNDSTART_RACES canine
ROUNDSTART_RACES feline
ROUNDSTART_RACES avian
ROUNDSTART_RACES rodent
ROUNDSTART_RACES herbivorous
ROUNDSTART_RACES exotic
ROUNDSTART_RACES canid
ROUNDSTART_RACES felid
#ROUNDSTART_RACES avian
#ROUNDSTART_RACES rodent
#ROUNDSTART_RACES herbivorous
#ROUNDSTART_RACES exotic
## Races that are strictly worse than humans that could probably be turned on without balance concerns
ROUNDSTART_RACES lizard
#ROUNDSTART_RACES fly
ROUNDSTART_RACES fly
ROUNDSTART_RACES plasmaman
#ROUNDSTART_RACES shadow
#ROUNDSTART_RACES shadowling
@@ -306,7 +306,7 @@ ROUNDSTART_RACES plasmaman
## Races that are straight upgrades. If these are on expect powergamers to always pick them
#ROUNDSTART_RACES skeleton
#ROUNDSTART_RACES zombie
#ROUNDSTART_RACES slime
ROUNDSTART_RACES slime
#ROUNDSTART_RACES pod
#ROUNDSTART_RACES military_synth
#ROUNDSTART_RACES agent
@@ -314,7 +314,7 @@ ROUNDSTART_RACES plasmaman
##-------------------------------------------------------------------------------------------
## Uncomment to give players the choice of joining as a human with mutant bodyparts before they join the game
#JOIN_WITH_MUTANT_HUMANS
JOIN_WITH_MUTANT_HUMANS
## Assistant slot cap. Set to -1 for unlimited.
ASSISTANT_CAP -1
@@ -354,9 +354,9 @@ REACTIONARY_EXPLOSIONS
## Small (3, 7, 14)
#BOMBCAP 14
## Default (5, 10, 20) (recommended if you enable REACTIONARY_EXPLOSIONS above)
BOMBCAP 20
#BOMBCAP 20
## LagHell (7, 14, 28)
#BOMBCAP 28
BOMBCAP 28
## Lavaland "Budget"

Binary file not shown.

Before

Width:  |  Height:  |  Size: 101 KiB

After

Width:  |  Height:  |  Size: 101 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 8.7 KiB

After

Width:  |  Height:  |  Size: 12 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 287 KiB

After

Width:  |  Height:  |  Size: 290 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 48 KiB

After

Width:  |  Height:  |  Size: 48 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 42 KiB

After

Width:  |  Height:  |  Size: 43 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 28 KiB

After

Width:  |  Height:  |  Size: 33 KiB

BIN
icons/mob/mam_bodyparts.dmi Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 7.8 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 44 KiB

After

Width:  |  Height:  |  Size: 45 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 137 KiB

After

Width:  |  Height:  |  Size: 140 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 82 KiB

After

Width:  |  Height:  |  Size: 82 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 14 KiB

After

Width:  |  Height:  |  Size: 23 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 381 KiB

After

Width:  |  Height:  |  Size: 426 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 49 KiB

After

Width:  |  Height:  |  Size: 64 KiB

View File

@@ -126,17 +126,8 @@
#include "code\_onclick\hud\robot.dm"
#include "code\_onclick\hud\screen_objects.dm"
#include "code\_onclick\hud\swarmer.dm"
#include "code\citadel\chemistry.dm"
#include "code\citadel\flavour.dm"
#include "code\citadel\genetics.dm"
#include "code\citadel\macro.dm"
#include "code\citadel\panel.dm"
#include "code\citadel\races.dm"
#include "code\citadel\science.dm"
#include "code\citadel\transfer_release.dm"
#include "code\citadel\transformation.dm"
#include "code\citadel\unassigned.dm"
#include "code\citadel\whitelist.dm"
#include "code\citadel\_helpers.dm"
#include "code\citadel\organs.dm"
#include "code\controllers\admin.dm"
#include "code\controllers\configuration.dm"
#include "code\controllers\controller.dm"