From 303bdec6f55bd00a9b4d1aa9570f493bfe740368 Mon Sep 17 00:00:00 2001 From: Shadowlight213 Date: Fri, 22 Apr 2016 13:36:43 -0700 Subject: [PATCH 1/9] Angel WIP commit 1 Added basic angel wing Mutant parts --- code/__HELPERS/global_lists.dm | 2 ++ code/__HELPERS/mobs.dm | 4 ++- code/_globalvars/lists/flavor_misc.dm | 2 ++ code/modules/client/preferences.dm | 17 +++++++++- code/modules/mob/living/carbon/human/emote.dm | 29 ++++++++++++++++++ .../mob/living/carbon/human/species.dm | 16 ++++++++++ .../mob/living/carbon/human/species_types.dm | 4 +-- .../mob/new_player/sprite_accessories.dm | 14 +++++++++ icons/mob/mutant_bodyparts.dmi | Bin 43982 -> 46470 bytes 9 files changed, 84 insertions(+), 4 deletions(-) diff --git a/code/__HELPERS/global_lists.dm b/code/__HELPERS/global_lists.dm index 436b4c76c78..8468f237be7 100644 --- a/code/__HELPERS/global_lists.dm +++ b/code/__HELPERS/global_lists.dm @@ -22,6 +22,8 @@ init_sprite_accessory_subtypes(/datum/sprite_accessory/snouts, snouts_list) init_sprite_accessory_subtypes(/datum/sprite_accessory/horns, horns_list) init_sprite_accessory_subtypes(/datum/sprite_accessory/ears, ears_list) + init_sprite_accessory_subtypes(/datum/sprite_accessory/wings, wings_list) + init_sprite_accessory_subtypes(/datum/sprite_accessory/wings_open, wings_open_list) init_sprite_accessory_subtypes(/datum/sprite_accessory/frills, frills_list) init_sprite_accessory_subtypes(/datum/sprite_accessory/spines, spines_list) init_sprite_accessory_subtypes(/datum/sprite_accessory/spines_animated, animated_spines_list) diff --git a/code/__HELPERS/mobs.dm b/code/__HELPERS/mobs.dm index 39c68439420..3cd1649b6db 100644 --- a/code/__HELPERS/mobs.dm +++ b/code/__HELPERS/mobs.dm @@ -64,9 +64,11 @@ init_sprite_accessory_subtypes(/datum/sprite_accessory/spines, spines_list) if(!body_markings_list.len) init_sprite_accessory_subtypes(/datum/sprite_accessory/body_markings, body_markings_list) + if(!wings_list.len) + init_sprite_accessory_subtypes(/datum/sprite_accessory/wings, wings_list) //For now we will always return none for tail_human and ears. - return(list("mcolor" = pick("FFFFFF","7F7F7F", "7FFF7F", "7F7FFF", "FF7F7F", "7FFFFF", "FF7FFF", "FFFF7F"), "tail_lizard" = pick(tails_list_lizard), "tail_human" = "None", "snout" = pick(snouts_list), "horns" = pick(horns_list), "ears" = "None", "frills" = pick(frills_list), "spines" = pick(spines_list), "body_markings" = pick(body_markings_list))) + return(list("mcolor" = pick("FFFFFF","7F7F7F", "7FFF7F", "7F7FFF", "FF7F7F", "7FFFFF", "FF7FFF", "FFFF7F"), "tail_lizard" = pick(tails_list_lizard), "tail_human" = "None", "wings" = "None", "snout" = pick(snouts_list), "horns" = pick(horns_list), "ears" = "None", "frills" = pick(frills_list), "spines" = pick(spines_list), "body_markings" = pick(body_markings_list))) /proc/random_hair_style(gender) switch(gender) diff --git a/code/_globalvars/lists/flavor_misc.dm b/code/_globalvars/lists/flavor_misc.dm index 5116c62e83e..52727a50626 100644 --- a/code/_globalvars/lists/flavor_misc.dm +++ b/code/_globalvars/lists/flavor_misc.dm @@ -25,6 +25,8 @@ var/global/list/animated_tails_list_human = list() var/global/list/snouts_list = list() var/global/list/horns_list = list() var/global/list/ears_list = list() +var/global/list/wings_list = list() +var/global/list/wings_open_list = list() var/global/list/frills_list = list() var/global/list/spines_list = list() var/global/list/animated_spines_list = list() diff --git a/code/modules/client/preferences.dm b/code/modules/client/preferences.dm index 7ffb0c72eb0..4e10cc4a9bc 100644 --- a/code/modules/client/preferences.dm +++ b/code/modules/client/preferences.dm @@ -59,7 +59,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", "frills" = "None", "spines" = "None", "body_markings" = "None") + 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/custom_names = list("clown", "mime", "ai", "cyborg", "religion", "deity") var/adminmusicvolume = 50 @@ -324,6 +324,15 @@ var/list/preferences_datums = list() dat += "" + if("wings" in pref_species.mutant_bodyparts) //TODO: make specific body parts be toggleable via config or something. + dat += "" + + dat += "

Wings

" + + dat += "[features["wings"]]
" + + dat += "" + dat += "" @@ -946,6 +955,12 @@ var/list/preferences_datums = list() if(new_ears) features["ears"] = new_ears + if("wings") + var/new_wings + new_wings = input(user, "Choose your character's wings:", "Character Preference") as null|anything in wings_list + if(new_wings) + features["wings"] = new_wings + if("frills") var/new_frills new_frills = input(user, "Choose your character's frills:", "Character Preference") as null|anything in frills_list diff --git a/code/modules/mob/living/carbon/human/emote.dm b/code/modules/mob/living/carbon/human/emote.dm index 600150027a8..be33b925595 100644 --- a/code/modules/mob/living/carbon/human/emote.dm +++ b/code/modules/mob/living/carbon/human/emote.dm @@ -129,6 +129,19 @@ if (!src.restrained()) message = "[src] flaps \his wings." m_type = 2 + if(((dna.features["wings"] != "None") && !("wings" in dna.species.mutant_bodyparts))) + OpenWings() + spawn(1) + CloseWings() + + if ("wings") + if (!src.restrained()) + if(dna && dna.species &&((dna.features["wings"] != "None") && ("wings" in dna.species.mutant_bodyparts))) + message = "[src] opens \his wings." + OpenWings() + else if(dna && dna.species &&((dna.features["wings"] != "None") && ("wingsopen" in dna.species.mutant_bodyparts))) + message = "[src] closes \his wings." + CloseWings() if ("gasp","gasps") if (miming) @@ -383,4 +396,20 @@ if("waggingtail_human" in dna.species.mutant_bodyparts) dna.species.mutant_bodyparts -= "waggingtail_human" dna.species.mutant_bodyparts |= "tail_human" + update_body() + +/mob/living/carbon/human/proc/OpenWings() + if(!dna || !dna.species) + return + if("wings" in dna.species.mutant_bodyparts) + dna.species.mutant_bodyparts -= "wings" + dna.species.mutant_bodyparts |= "wingsopen" + update_body() + +/mob/living/carbon/human/proc/CloseWings() + if(!dna || !dna.species) + return + if("wings_open" in dna.species.mutant_bodyparts) + dna.species.mutant_bodyparts -= "wingsopen" + dna.species.mutant_bodyparts |= "wings" update_body() \ No newline at end of file diff --git a/code/modules/mob/living/carbon/human/species.dm b/code/modules/mob/living/carbon/human/species.dm index 638a318f7f0..2b3f1c1c4fb 100644 --- a/code/modules/mob/living/carbon/human/species.dm +++ b/code/modules/mob/living/carbon/human/species.dm @@ -366,6 +366,17 @@ if(!H.dna.features["ears"] || H.dna.features["ears"] == "None" || H.head && (H.head.flags_inv & HIDEHAIR) || (H.wear_mask && (H.wear_mask.flags_inv & HIDEHAIR))) bodyparts_to_add -= "ears" + if("wings" in mutant_bodyparts) + if(!H.dna.features["wings"] || H.dna.features["wings"] == "None" || (H.wear_suit && (H.wear_suit.flags_inv & HIDEJUMPSUIT))) + bodyparts_to_add -= "wings" + + if("wings_open" in mutant_bodyparts) + if(H.wear_suit && (H.wear_suit.flags_inv & HIDEJUMPSUIT)) + bodyparts_to_add -= "wings_open" + else if ("wings" in mutant_bodyparts) + bodyparts_to_add -= "wings_open" + + if(!bodyparts_to_add) return @@ -399,6 +410,10 @@ S = ears_list[H.dna.features["ears"]] if("body_markings") S = body_markings_list[H.dna.features["body_markings"]] + if("wings") + S = wings_list[H.dna.features["wings"]] + if("wingsopen") + S = wings_open_list[H.dna.features["wings"]] if(!S || S.icon_state == "none") continue @@ -417,6 +432,7 @@ else icon_string = "m_[bodypart]_[S.icon_state]_[layer]" + world.log << icon_string I = image("icon" = 'icons/mob/mutant_bodyparts.dmi', "icon_state" = icon_string, "layer" =- layer) if(!(H.disabilities & HUSK)) diff --git a/code/modules/mob/living/carbon/human/species_types.dm b/code/modules/mob/living/carbon/human/species_types.dm index df97e03d43b..ae3631a6c66 100644 --- a/code/modules/mob/living/carbon/human/species_types.dm +++ b/code/modules/mob/living/carbon/human/species_types.dm @@ -7,8 +7,8 @@ id = "human" default_color = "FFFFFF" specflags = list(EYECOLOR,HAIR,FACEHAIR,LIPS) - mutant_bodyparts = list("tail_human", "ears") - default_features = list("mcolor" = "FFF", "tail_human" = "None", "ears" = "None") + mutant_bodyparts = list("tail_human", "ears", "wings") + default_features = list("mcolor" = "FFF", "tail_human" = "None", "ears" = "None", "wings" = "None") use_skintones = 1 skinned_type = /obj/item/stack/sheet/animalhide/human diff --git a/code/modules/mob/new_player/sprite_accessories.dm b/code/modules/mob/new_player/sprite_accessories.dm index 930d7a33a15..c5e022ca2a3 100644 --- a/code/modules/mob/new_player/sprite_accessories.dm +++ b/code/modules/mob/new_player/sprite_accessories.dm @@ -1295,6 +1295,20 @@ hasinner = 1 color_src = HAIR +/datum/sprite_accessory/wings/none + name = "None" + icon_state = "none" + +/datum/sprite_accessory/wings_open/angel + name = "Angel" + icon_state = "angel" + color_src = 0 + +/datum/sprite_accessory/wings/angel + name = "Angel" + icon_state = "angel" + color_src = 0 + /datum/sprite_accessory/frills icon = 'icons/mob/mutant_bodyparts.dmi' diff --git a/icons/mob/mutant_bodyparts.dmi b/icons/mob/mutant_bodyparts.dmi index 108699d328c772f7ecd8e86b39f02e277dd59f13..9e4d555ed728ae1c55f3081ff697ee88555eb245 100644 GIT binary patch delta 13461 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 WjzP(^%iuB8nN>PQCkZDmUjKi~hmAx4 delta 10939 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 XOcvuLX8>`&Nt;_Ckc6fFhX From 6d6e9818cb475c03da6a1ed81bcf47f836866681 Mon Sep 17 00:00:00 2001 From: Shadowlight213 Date: Sun, 24 Apr 2016 17:41:10 -0700 Subject: [PATCH 2/9] More WIP Initial work on spacemove in atmosphere Getting stunned now launches you and doubles the stun. --- code/__HELPERS/global_lists.dm | 1 + code/_globalvars/lists/flavor_misc.dm | 13 +++++--- code/modules/client/preferences.dm | 2 +- .../mob/living/carbon/carbon_defense.dm | 33 +++++++++++++++++++ .../mob/living/carbon/carbon_movement.dm | 23 ++++++++++++- code/modules/mob/living/carbon/human/emote.dm | 2 +- code/modules/mob/living/carbon/life.dm | 1 + .../mob/living/simple_animal/simple_animal.dm | 1 - code/modules/mob/mob_defines.dm | 3 +- .../mob/new_player/sprite_accessories.dm | 8 ++++- 10 files changed, 76 insertions(+), 11 deletions(-) diff --git a/code/__HELPERS/global_lists.dm b/code/__HELPERS/global_lists.dm index 8468f237be7..de2442c7c40 100644 --- a/code/__HELPERS/global_lists.dm +++ b/code/__HELPERS/global_lists.dm @@ -27,6 +27,7 @@ init_sprite_accessory_subtypes(/datum/sprite_accessory/frills, frills_list) 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) //Species diff --git a/code/_globalvars/lists/flavor_misc.dm b/code/_globalvars/lists/flavor_misc.dm index 52727a50626..9eb72f5b6e6 100644 --- a/code/_globalvars/lists/flavor_misc.dm +++ b/code/_globalvars/lists/flavor_misc.dm @@ -19,18 +19,21 @@ var/global/list/socks_list = list() //stores /datum/sprite_accessory/socks inde //Lizard Bits (all datum lists indexed by name) var/global/list/body_markings_list = list() var/global/list/tails_list_lizard = list() -var/global/list/tails_list_human = list() var/global/list/animated_tails_list_lizard = list() -var/global/list/animated_tails_list_human = list() var/global/list/snouts_list = list() var/global/list/horns_list = list() -var/global/list/ears_list = list() -var/global/list/wings_list = list() -var/global/list/wings_open_list = list() var/global/list/frills_list = list() var/global/list/spines_list = list() var/global/list/animated_spines_list = list() + //Mutant Human bits +var/global/list/tails_list_human = list() +var/global/list/animated_tails_list_human = list() +var/global/list/ears_list = list() +var/global/list/wings_list = list() +var/global/list/wings_open_list = list() +var/global/list/r_wings_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 diff --git a/code/modules/client/preferences.dm b/code/modules/client/preferences.dm index 4e10cc4a9bc..763112798db 100644 --- a/code/modules/client/preferences.dm +++ b/code/modules/client/preferences.dm @@ -957,7 +957,7 @@ var/list/preferences_datums = list() if("wings") var/new_wings - new_wings = input(user, "Choose your character's wings:", "Character Preference") as null|anything in wings_list + new_wings = input(user, "Choose your character's wings:", "Character Preference") as null|anything in r_wings_list if(new_wings) features["wings"] = new_wings diff --git a/code/modules/mob/living/carbon/carbon_defense.dm b/code/modules/mob/living/carbon/carbon_defense.dm index fad49701ae8..7b6e8a5ca11 100644 --- a/code/modules/mob/living/carbon/carbon_defense.dm +++ b/code/modules/mob/living/carbon/carbon_defense.dm @@ -94,3 +94,36 @@ adjustFireLoss(M.powerlevel * rand(6,10)) updatehealth() return 1 + +/mob/living/carbon/Stun(amount, updating_canmove = 1) + if(dna && dna.features["wings"]) + if((dna.features["wings"] == "Angel") && flying) + flyslip(src) + amount *= 2 + ..() + + +/mob/living/carbon/proc/flyslip(mob/living/carbon/C) + var/obj/buckled_obj + if(C.buckled) + buckled_obj = C.buckled + + C << "Your wings spazz out and launch you!" + + playsound(C.loc, 'sound/misc/slip.ogg', 50, 1, -3) + + C.accident(C.l_hand) + C.accident(C.r_hand) + + var/olddir = C.dir + + C.stop_pulling() + if(buckled_obj) + buckled_obj.unbuckle_mob(C) + step(buckled_obj, olddir) + else + for(var/i=1, i<5, i++) + spawn (i) + step(C, olddir) + C.spin(1,1) + return 1 \ No newline at end of file diff --git a/code/modules/mob/living/carbon/carbon_movement.dm b/code/modules/mob/living/carbon/carbon_movement.dm index 574e88fd908..8a9011de231 100644 --- a/code/modules/mob/living/carbon/carbon_movement.dm +++ b/code/modules/mob/living/carbon/carbon_movement.dm @@ -28,6 +28,9 @@ var/const/GALOSHES_DONT_HELP = 4 if(istype(T) && movement_dir && T.allow_thrust(0.01)) return 1 + if(flying) + return 1 + var/obj/item/weapon/tank/jetpack/J = get_jetpack() if(istype(J) && (movement_dir || J.stabilizers) && J.allow_thrust(0.01, src)) return 1 @@ -41,5 +44,23 @@ var/const/GALOSHES_DONT_HELP = 4 src.nutrition -= HUNGER_FACTOR/10 if(src.m_intent == "run") src.nutrition -= HUNGER_FACTOR/10 + if(src.flying) + src.nutrition -= HUNGER_FACTOR/10 if((src.disabilities & FAT) && src.m_intent == "run" && src.bodytemperature <= 360) - src.bodytemperature += 2 \ No newline at end of file + src.bodytemperature += 2 + + + +/mob/living/carbon/proc/HandleFlight() + if(flying) + var/turf/T = get_turf(src) + if(!T) // No more runtimes from being stuck in nullspace. + return 0 + + var/datum/gas_mixture/environment = T.return_air() + if(environment && !(environment.return_pressure() > 30)) + flying = 0 + float(0) + + if(flying) + float(1) \ No newline at end of file diff --git a/code/modules/mob/living/carbon/human/emote.dm b/code/modules/mob/living/carbon/human/emote.dm index be33b925595..82b0139885a 100644 --- a/code/modules/mob/living/carbon/human/emote.dm +++ b/code/modules/mob/living/carbon/human/emote.dm @@ -409,7 +409,7 @@ /mob/living/carbon/human/proc/CloseWings() if(!dna || !dna.species) return - if("wings_open" in dna.species.mutant_bodyparts) + if("wingsopen" in dna.species.mutant_bodyparts) dna.species.mutant_bodyparts -= "wingsopen" dna.species.mutant_bodyparts |= "wings" update_body() \ No newline at end of file diff --git a/code/modules/mob/living/carbon/life.dm b/code/modules/mob/living/carbon/life.dm index bc3c607c8b4..632b0c3520a 100644 --- a/code/modules/mob/living/carbon/life.dm +++ b/code/modules/mob/living/carbon/life.dm @@ -27,6 +27,7 @@ //Updates the number of stored chemicals for powers handle_changeling() + HandleFlight() /////////////// // BREATHING // diff --git a/code/modules/mob/living/simple_animal/simple_animal.dm b/code/modules/mob/living/simple_animal/simple_animal.dm index b7dc4777098..43a274fe55c 100644 --- a/code/modules/mob/living/simple_animal/simple_animal.dm +++ b/code/modules/mob/living/simple_animal/simple_animal.dm @@ -60,7 +60,6 @@ //simple_animal access var/obj/item/weapon/card/id/access_card = null //innate access uses an internal ID card - var/flying = 0 //whether it's flying or touching the ground. var/buffed = 0 //In the event that you want to have a buffing effect on the mob, but don't want it to stack with other effects, any outside force that applies a buff to a simple mob should at least set this to 1, so we have something to check against var/gold_core_spawnable = 0 //if 1 can be spawned by plasma with gold core, 2 are 'friendlies' spawned with blood diff --git a/code/modules/mob/mob_defines.dm b/code/modules/mob/mob_defines.dm index 2d8684ded9d..2ccf83f0fce 100644 --- a/code/modules/mob/mob_defines.dm +++ b/code/modules/mob/mob_defines.dm @@ -141,4 +141,5 @@ var/list/permanent_huds = list() - var/resize = 1 //Badminnery resize \ No newline at end of file + var/resize = 1 //Badminnery resize + var/flying = 0 //whether it's flying or touching the ground. \ No newline at end of file diff --git a/code/modules/mob/new_player/sprite_accessories.dm b/code/modules/mob/new_player/sprite_accessories.dm index c5e022ca2a3..7f082492def 100644 --- a/code/modules/mob/new_player/sprite_accessories.dm +++ b/code/modules/mob/new_player/sprite_accessories.dm @@ -16,7 +16,7 @@ from doing this unless you absolutely know what you are doing, and have defined a conversion in savefile.dm */ -/proc/init_sprite_accessory_subtypes(prototype, list/L, list/male, list/female) +/proc/init_sprite_accessory_subtypes(prototype, list/L, list/male, list/female,var/roundstart = FALSE)//Roundstart argument builds a specific list for roundstart parts where some parts may be locked if(!istype(L)) L = list() if(!istype(male)) @@ -27,6 +27,10 @@ for(var/path in typesof(prototype)) if(path == prototype) continue + if(roundstart) + var/datum/sprite_accessory/P = path + if(initial(P.locked)) + continue var/datum/sprite_accessory/D = new path() if(D.icon_state) @@ -52,6 +56,7 @@ var/gender_specific //Something that can be worn by either gender, but looks different on each var/color_src = MUTCOLORS //Currently only used by mutantparts so don't worry about hair and stuff. This is the source that this accessory will get its color from. Default is MUTCOLOR, but can also be HAIR, FACEHAIR, EYECOLOR and 0 if none. var/hasinner //Decides if this sprite has an "inner" part, such as the fleshy parts on ears. + var/locked = 0 //Is this part locked from roundstart selection? Used for parts that apply effects ////////////////////// // Hair Definitions // @@ -1308,6 +1313,7 @@ name = "Angel" icon_state = "angel" color_src = 0 + locked = TRUE /datum/sprite_accessory/frills icon = 'icons/mob/mutant_bodyparts.dmi' From 643f46d33fafc645589f52d71f31fb88834a9468 Mon Sep 17 00:00:00 2001 From: Shadowlight213 Date: Thu, 28 Apr 2016 15:30:11 -0700 Subject: [PATCH 3/9] Change to angel species. --- .../mob/living/carbon/carbon_defense.dm | 33 ----- .../mob/living/carbon/carbon_movement.dm | 21 --- code/modules/mob/living/carbon/human/emote.dm | 2 +- .../mob/living/carbon/human/human_defense.dm | 4 + .../mob/living/carbon/human/human_movement.dm | 6 + .../mob/living/carbon/human/species.dm | 33 ++++- .../mob/living/carbon/human/species_types.dm | 130 ++++++++++++++++++ code/modules/mob/living/carbon/life.dm | 1 - .../mob/living/simple_animal/simple_animal.dm | 2 +- code/modules/mob/mob_defines.dm | 3 +- 10 files changed, 175 insertions(+), 60 deletions(-) diff --git a/code/modules/mob/living/carbon/carbon_defense.dm b/code/modules/mob/living/carbon/carbon_defense.dm index 7b6e8a5ca11..fad49701ae8 100644 --- a/code/modules/mob/living/carbon/carbon_defense.dm +++ b/code/modules/mob/living/carbon/carbon_defense.dm @@ -94,36 +94,3 @@ adjustFireLoss(M.powerlevel * rand(6,10)) updatehealth() return 1 - -/mob/living/carbon/Stun(amount, updating_canmove = 1) - if(dna && dna.features["wings"]) - if((dna.features["wings"] == "Angel") && flying) - flyslip(src) - amount *= 2 - ..() - - -/mob/living/carbon/proc/flyslip(mob/living/carbon/C) - var/obj/buckled_obj - if(C.buckled) - buckled_obj = C.buckled - - C << "Your wings spazz out and launch you!" - - playsound(C.loc, 'sound/misc/slip.ogg', 50, 1, -3) - - C.accident(C.l_hand) - C.accident(C.r_hand) - - var/olddir = C.dir - - C.stop_pulling() - if(buckled_obj) - buckled_obj.unbuckle_mob(C) - step(buckled_obj, olddir) - else - for(var/i=1, i<5, i++) - spawn (i) - step(C, olddir) - C.spin(1,1) - return 1 \ No newline at end of file diff --git a/code/modules/mob/living/carbon/carbon_movement.dm b/code/modules/mob/living/carbon/carbon_movement.dm index 8a9011de231..06013720f78 100644 --- a/code/modules/mob/living/carbon/carbon_movement.dm +++ b/code/modules/mob/living/carbon/carbon_movement.dm @@ -28,9 +28,6 @@ var/const/GALOSHES_DONT_HELP = 4 if(istype(T) && movement_dir && T.allow_thrust(0.01)) return 1 - if(flying) - return 1 - var/obj/item/weapon/tank/jetpack/J = get_jetpack() if(istype(J) && (movement_dir || J.stabilizers) && J.allow_thrust(0.01, src)) return 1 @@ -44,23 +41,5 @@ var/const/GALOSHES_DONT_HELP = 4 src.nutrition -= HUNGER_FACTOR/10 if(src.m_intent == "run") src.nutrition -= HUNGER_FACTOR/10 - if(src.flying) - src.nutrition -= HUNGER_FACTOR/10 if((src.disabilities & FAT) && src.m_intent == "run" && src.bodytemperature <= 360) src.bodytemperature += 2 - - - -/mob/living/carbon/proc/HandleFlight() - if(flying) - var/turf/T = get_turf(src) - if(!T) // No more runtimes from being stuck in nullspace. - return 0 - - var/datum/gas_mixture/environment = T.return_air() - if(environment && !(environment.return_pressure() > 30)) - flying = 0 - float(0) - - if(flying) - float(1) \ No newline at end of file diff --git a/code/modules/mob/living/carbon/human/emote.dm b/code/modules/mob/living/carbon/human/emote.dm index 82b0139885a..9a9853243c6 100644 --- a/code/modules/mob/living/carbon/human/emote.dm +++ b/code/modules/mob/living/carbon/human/emote.dm @@ -131,7 +131,7 @@ m_type = 2 if(((dna.features["wings"] != "None") && !("wings" in dna.species.mutant_bodyparts))) OpenWings() - spawn(1) + spawn(20) CloseWings() if ("wings") diff --git a/code/modules/mob/living/carbon/human/human_defense.dm b/code/modules/mob/living/carbon/human/human_defense.dm index aa75cc72d46..3306d42d5f9 100644 --- a/code/modules/mob/living/carbon/human/human_defense.dm +++ b/code/modules/mob/living/carbon/human/human_defense.dm @@ -369,3 +369,7 @@ skipcatch = 1 //can't catch the now embedded item return ..() + +/mob/living/carbon/human/Stun(amount, updating_canmove = 1) + amount = dna.species.spec_stun(src,amount) + ..() \ No newline at end of file diff --git a/code/modules/mob/living/carbon/human/human_movement.dm b/code/modules/mob/living/carbon/human/human_movement.dm index f2723f7bd5c..f1a749e2c1c 100644 --- a/code/modules/mob/living/carbon/human/human_movement.dm +++ b/code/modules/mob/living/carbon/human/human_movement.dm @@ -54,3 +54,9 @@ S.step_action() +/* +/mob/living/carbon/human/Process_Spacemove(movement_dir = 0) //Temporary laziness thing. Will change to handles by species reee. + ..() + if(dna && dna.species.id == "angel" && dna.species.flying) + return 1 +*/ \ No newline at end of file diff --git a/code/modules/mob/living/carbon/human/species.dm b/code/modules/mob/living/carbon/human/species.dm index 2b3f1c1c4fb..4367b884fca 100644 --- a/code/modules/mob/living/carbon/human/species.dm +++ b/code/modules/mob/living/carbon/human/species.dm @@ -48,6 +48,7 @@ var/burnmod = 1 // multiplier for burn damage var/coldmod = 1 // multiplier for cold damage var/heatmod = 1 // multiplier for heat damage + var/stunmod = 1 // multiplier for stun duration var/punchdamagelow = 0 //lowest possible punch damage var/punchdamagehigh = 9 //highest possible punch damage var/punchstunthreshold = 9//damage at which punches from this race will stun //yes it should be to the attacked race but it's not useful that way even if it's logical @@ -87,7 +88,7 @@ // PROCS // /////////// - + var/flying = 0 //Called when admins use the Set Species verb, let's species //do some init stuff on the mob that got SS'd if necessary @@ -1386,6 +1387,36 @@ /datum/species/proc/ExtinguishMob(mob/living/carbon/human/H) return + + +//////// +//Stun// +//////// + +/datum/species/proc/spec_stun(mob/living/carbon/human/H,amount) + . = stunmod * amount + + + + + + + + + + + + + + + + + + + + + + #undef HUMAN_MAX_OXYLOSS #undef HUMAN_CRIT_MAX_OXYLOSS diff --git a/code/modules/mob/living/carbon/human/species_types.dm b/code/modules/mob/living/carbon/human/species_types.dm index ae3631a6c66..c57052b29ae 100644 --- a/code/modules/mob/living/carbon/human/species_types.dm +++ b/code/modules/mob/living/carbon/human/species_types.dm @@ -740,3 +740,133 @@ SYNDICATE BLACK OPS specflags = list(RADIMMUNE,VIRUSIMMUNE,NOBLOOD,PIERCEIMMUNE,EYECOLOR) sexes = 0 +/datum/species/angel + name = "Angel" + id = "angel" + 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" = "Angel") + use_skintones = 1 + flying = 0 + skinned_type = /obj/item/stack/sheet/animalhide/human + + var/datum/action/innate/flight/fly + +/* +/datum/species/human/qualifies_for_rank(rank, list/features) + if((!features["tail_human"] || features["tail_human"] == "None") && (!features["ears"] || features["ears"] == "None")) + return 1 //Pure humans are always allowed in all roles. + + //Mutants are not allowed in most roles. + if(rank in security_positions) //This list does not include lawyers. + return 0 + if(rank in science_positions) + return 0 + if(rank in medical_positions) + return 0 + if(rank in engineering_positions) + return 0 + if(rank == "Quartermaster") //QM is not contained in command_positions but we still want to bar mutants from it. + return 0 + return ..() + + +/datum/species/human/handle_chemicals(datum/reagent/chem, mob/living/carbon/human/H) + if(chem.id == "mutationtoxin") + H << "Your flesh rapidly mutates!" + H.set_species(/datum/species/jelly/slime) + H.reagents.del_reagent(chem.type) + H.faction |= "slime" + return 1 + +*/ + +/datum/species/angel/on_species_gain(mob/living/carbon/human/H) + ..() + if(H.dna && H.dna.species &&((H.dna.features["wings"] != "Angel") && ("wings" in H.dna.species.mutant_bodyparts))) + H.dna.features["wings"] = "Angel" + H.update_body() + if(ishuman(H)) + fly = new + fly.Grant(H) + + +/datum/species/angel/on_species_loss(mob/living/carbon/human/H) + if(fly) + fly.Remove(H) + ..() + +/datum/species/angel/spec_life(mob/living/carbon/human/H) + ..() + HandleFlight(H) + + + + + +/datum/species/angel/proc/HandleFlight(mob/living/carbon/human/H) + if(flying) + var/turf/T = get_turf(src) + if(!T) // No more runtimes from being stuck in nullspace. + return 0 + + var/datum/gas_mixture/environment = T.return_air() + if(environment && !(environment.return_pressure() > 30)) + flying = 0 + stunmod = 1 + H.float(0) + return + H.float(1) + else + H.float(0) + + +/datum/action/innate/flight + name = "Toggle Flight" + check_flags = AB_CHECK_CONSCIOUS + button_icon_state = "slimesplit" + background_icon_state = "bg_alien" + +/datum/action/innate/flight/Activate() + var/mob/living/carbon/human/H = owner + var/datum/species/angel/A = H.dna.species + A.flying = !A.flying + if(A.flying) + H << "You beat your wings and begin to hover gently above the ground..." + A.stunmod = 2 + else + H << "You settle gently back onto the ground..." + A.stunmod = 1 + + +/datum/species/angel/proc/flyslip(mob/living/carbon/human/H) + var/obj/buckled_obj + if(H.buckled) + buckled_obj = H.buckled + + H << "Your wings spazz out and launch you!" + + playsound(H.loc, 'sound/misc/slip.ogg', 50, 1, -3) + + H.accident(H.l_hand) + H.accident(H.r_hand) + + var/olddir = H.dir + + H.stop_pulling() + if(buckled_obj) + buckled_obj.unbuckle_mob(H) + step(buckled_obj, olddir) + else + for(var/i=1, i<5, i++) + spawn (i) + step(H, olddir) + H.spin(1,1) + return 1 + + +/datum/species/angel/spec_stun(mob/living/carbon/human/H,amount) + if(flying) + flyslip(H) + ..() \ No newline at end of file diff --git a/code/modules/mob/living/carbon/life.dm b/code/modules/mob/living/carbon/life.dm index 632b0c3520a..bc3c607c8b4 100644 --- a/code/modules/mob/living/carbon/life.dm +++ b/code/modules/mob/living/carbon/life.dm @@ -27,7 +27,6 @@ //Updates the number of stored chemicals for powers handle_changeling() - HandleFlight() /////////////// // BREATHING // diff --git a/code/modules/mob/living/simple_animal/simple_animal.dm b/code/modules/mob/living/simple_animal/simple_animal.dm index 43a274fe55c..54af43cb90c 100644 --- a/code/modules/mob/living/simple_animal/simple_animal.dm +++ b/code/modules/mob/living/simple_animal/simple_animal.dm @@ -60,7 +60,7 @@ //simple_animal access var/obj/item/weapon/card/id/access_card = null //innate access uses an internal ID card - + var/flying = 0 //whether it's flying or touching the ground. var/buffed = 0 //In the event that you want to have a buffing effect on the mob, but don't want it to stack with other effects, any outside force that applies a buff to a simple mob should at least set this to 1, so we have something to check against var/gold_core_spawnable = 0 //if 1 can be spawned by plasma with gold core, 2 are 'friendlies' spawned with blood diff --git a/code/modules/mob/mob_defines.dm b/code/modules/mob/mob_defines.dm index 2ccf83f0fce..2d8684ded9d 100644 --- a/code/modules/mob/mob_defines.dm +++ b/code/modules/mob/mob_defines.dm @@ -141,5 +141,4 @@ var/list/permanent_huds = list() - var/resize = 1 //Badminnery resize - var/flying = 0 //whether it's flying or touching the ground. \ No newline at end of file + var/resize = 1 //Badminnery resize \ No newline at end of file From 0ccc96f2b811e7f2e86192350fe04e48ae39dc43 Mon Sep 17 00:00:00 2001 From: Shadowlight213 Date: Fri, 29 Apr 2016 13:10:26 -0700 Subject: [PATCH 4/9] More WIP with changing to species. --- code/modules/client/preferences.dm | 2 +- .../mob/living/carbon/human/human_movement.dm | 9 +-- .../mob/living/carbon/human/species.dm | 8 +- .../mob/living/carbon/human/species_types.dm | 79 +++++++++++++------ 4 files changed, 67 insertions(+), 31 deletions(-) diff --git a/code/modules/client/preferences.dm b/code/modules/client/preferences.dm index 763112798db..74be360759d 100644 --- a/code/modules/client/preferences.dm +++ b/code/modules/client/preferences.dm @@ -324,7 +324,7 @@ var/list/preferences_datums = list() dat += "" - if("wings" in pref_species.mutant_bodyparts) //TODO: make specific body parts be toggleable via config or something. + if("wings" in pref_species.mutant_bodyparts && r_wings_list.len >1) dat += "" dat += "

Wings

" diff --git a/code/modules/mob/living/carbon/human/human_movement.dm b/code/modules/mob/living/carbon/human/human_movement.dm index f1a749e2c1c..0bc87b8520a 100644 --- a/code/modules/mob/living/carbon/human/human_movement.dm +++ b/code/modules/mob/living/carbon/human/human_movement.dm @@ -22,7 +22,7 @@ . = 1 /mob/living/carbon/human/mob_negates_gravity() - return shoes && shoes.negates_gravity() + return ((shoes && shoes.negates_gravity()) || dna.species.negates_gravity()) /mob/living/carbon/human/Move(NewLoc, direct) . = ..() @@ -54,9 +54,8 @@ S.step_action() -/* + /mob/living/carbon/human/Process_Spacemove(movement_dir = 0) //Temporary laziness thing. Will change to handles by species reee. - ..() - if(dna && dna.species.id == "angel" && dna.species.flying) + if(..()) return 1 -*/ \ No newline at end of file + return dna.species.space_move() diff --git a/code/modules/mob/living/carbon/human/species.dm b/code/modules/mob/living/carbon/human/species.dm index 3ebb16dfbca..bd62732800f 100644 --- a/code/modules/mob/living/carbon/human/species.dm +++ b/code/modules/mob/living/carbon/human/species.dm @@ -1398,9 +1398,15 @@ . = stunmod * amount +////////////// +//Space Move// +////////////// +/datum/species/proc/space_move() + return 0 - +/datum/species/proc/negates_gravity() + return 0 diff --git a/code/modules/mob/living/carbon/human/species_types.dm b/code/modules/mob/living/carbon/human/species_types.dm index c57052b29ae..771b2f49580 100644 --- a/code/modules/mob/living/carbon/human/species_types.dm +++ b/code/modules/mob/living/carbon/human/species_types.dm @@ -749,6 +749,7 @@ SYNDICATE BLACK OPS default_features = list("mcolor" = "FFF", "tail_human" = "None", "ears" = "None", "wings" = "Angel") use_skintones = 1 flying = 0 + blacklisted = 1 skinned_type = /obj/item/stack/sheet/animalhide/human var/datum/action/innate/flight/fly @@ -787,7 +788,7 @@ SYNDICATE BLACK OPS if(H.dna && H.dna.species &&((H.dna.features["wings"] != "Angel") && ("wings" in H.dna.species.mutant_bodyparts))) H.dna.features["wings"] = "Angel" H.update_body() - if(ishuman(H)) + if(ishuman(H)&& !fly) fly = new fly.Grant(H) @@ -795,49 +796,58 @@ SYNDICATE BLACK OPS /datum/species/angel/on_species_loss(mob/living/carbon/human/H) if(fly) fly.Remove(H) + flying = 0 + ToggleFlight(H,0) + if(H.dna && H.dna.species &&((H.dna.features["wings"] != "None") && ("wings" in H.dna.species.mutant_bodyparts))) + H.dna.features["wings"] = "None" + H.update_body() ..() /datum/species/angel/spec_life(mob/living/carbon/human/H) - ..() HandleFlight(H) - - - - /datum/species/angel/proc/HandleFlight(mob/living/carbon/human/H) if(flying) - var/turf/T = get_turf(src) - if(!T) // No more runtimes from being stuck in nullspace. - return 0 - - var/datum/gas_mixture/environment = T.return_air() - if(environment && !(environment.return_pressure() > 30)) - flying = 0 - stunmod = 1 + if(!CanFly(H)) + ToggleFlight(H,0) H.float(0) - return + return 0 H.float(1) + return 1 else H.float(0) + return 0 + +/datum/species/angel/proc/CanFly(mob/living/carbon/human/H) + var/turf/T = get_turf(H) + if(!T) + return 0 + + var/datum/gas_mixture/environment = T.return_air() + if(environment && !(environment.return_pressure() > 30)) + return 0 + else + return 1 + /datum/action/innate/flight name = "Toggle Flight" - check_flags = AB_CHECK_CONSCIOUS + check_flags = AB_CHECK_CONSCIOUS|AB_CHECK_RESTRAINED|AB_CHECK_STUNNED|AB_CHECK_LYING button_icon_state = "slimesplit" background_icon_state = "bg_alien" /datum/action/innate/flight/Activate() var/mob/living/carbon/human/H = owner var/datum/species/angel/A = H.dna.species - A.flying = !A.flying - if(A.flying) - H << "You beat your wings and begin to hover gently above the ground..." - A.stunmod = 2 - else - H << "You settle gently back onto the ground..." - A.stunmod = 1 + if(A.CanFly(H)) + A.flying = !A.flying + if(A.flying) + H << "You beat your wings and begin to hover gently above the ground..." + A.ToggleFlight(H,A.flying) + else + H << "You settle gently back onto the ground..." + A.ToggleFlight(H,A.flying) /datum/species/angel/proc/flyslip(mob/living/carbon/human/H) @@ -869,4 +879,25 @@ SYNDICATE BLACK OPS /datum/species/angel/spec_stun(mob/living/carbon/human/H,amount) if(flying) flyslip(H) - ..() \ No newline at end of file + ToggleFlight(H,0) + ..() + +/datum/species/angel/negates_gravity() + return flying + +/datum/species/angel/space_move() + return flying + +/datum/species/angel/proc/ToggleFlight(mob/living/carbon/human/H,flight) + if(flight) + flying = 1 + stunmod = 2 + speedmod = -1 + H.pass_flags |= PASSTABLE + H.OpenWings() + else + flying = 0 + stunmod = 1 + speedmod = 0 + H.pass_flags &= ~PASSTABLE + H.CloseWings() \ No newline at end of file From 9573fdec0e0737b360ea0d389fcadf7f3dd1924d Mon Sep 17 00:00:00 2001 From: Shadowlight213 Date: Sun, 8 May 2016 16:39:54 -0700 Subject: [PATCH 5/9] Speed in nograv works correctly now Dismemberment support added as well as a way to use the limbs of another species for dismemberment for visually identical species Flying var changed to species flag --- code/__DEFINES/flags.dm | 2 + code/game/objects/structures/mirror.dm | 2 +- code/modules/mob/living/carbon/human/human.dm | 4 + .../mob/living/carbon/human/human_defense.dm | 2 +- .../mob/living/carbon/human/species.dm | 41 ++++----- .../mob/living/carbon/human/species_types.dm | 83 ++++++++----------- .../mob/living/carbon/human/update_icons.dm | 2 +- code/modules/mob/living/living.dm | 5 +- code/modules/mob/mob.dm | 7 +- code/modules/surgery/bodyparts/bodyparts.dm | 2 +- code/modules/surgery/bodyparts/helpers.dm | 7 ++ 11 files changed, 75 insertions(+), 82 deletions(-) diff --git a/code/__DEFINES/flags.dm b/code/__DEFINES/flags.dm index d5c37b89886..c0301b9bfa1 100644 --- a/code/__DEFINES/flags.dm +++ b/code/__DEFINES/flags.dm @@ -68,6 +68,8 @@ #define MUTCOLORS_PARTSONLY 32768 //Used if we want the mutant colour to be only used by mutant bodyparts. Don't combine this with MUTCOLORS, or it will be useless. +#define FLYING 65536 + /* These defines are used specifically with the atom/movable/languages bitmask. They are used in atom/movable/Hear() and atom/movable/say() to determine whether hearers can understand a message. diff --git a/code/game/objects/structures/mirror.dm b/code/game/objects/structures/mirror.dm index bf412453520..064c0e3dd94 100644 --- a/code/game/objects/structures/mirror.dm +++ b/code/game/objects/structures/mirror.dm @@ -120,7 +120,7 @@ name = "magic mirror" desc = "Turn and face the strange... face." icon_state = "magic_mirror" - var/list/races_blacklist = list("skeleton", "agent") + var/list/races_blacklist = list("skeleton", "agent", "angel") var/list/choosable_races = list() /obj/structure/mirror/magic/New() diff --git a/code/modules/mob/living/carbon/human/human.dm b/code/modules/mob/living/carbon/human/human.dm index 9ae245d91b8..000e40768aa 100644 --- a/code/modules/mob/living/carbon/human/human.dm +++ b/code/modules/mob/living/carbon/human/human.dm @@ -990,3 +990,7 @@ if(HM.quality != POSITIVE) dna.remove_mutation(HM.name) ..() + +/mob/living/carbon/human/update_gravity(has_gravity,override = 0) + override = dna.species.override_float + ..() \ No newline at end of file diff --git a/code/modules/mob/living/carbon/human/human_defense.dm b/code/modules/mob/living/carbon/human/human_defense.dm index 255c64f9bfc..709af9ac1cb 100644 --- a/code/modules/mob/living/carbon/human/human_defense.dm +++ b/code/modules/mob/living/carbon/human/human_defense.dm @@ -372,4 +372,4 @@ /mob/living/carbon/human/Stun(amount, updating_canmove = 1) amount = dna.species.spec_stun(src,amount) - ..() + ..() \ No newline at end of file diff --git a/code/modules/mob/living/carbon/human/species.dm b/code/modules/mob/living/carbon/human/species.dm index fe4710799a9..222bff80f8e 100644 --- a/code/modules/mob/living/carbon/human/species.dm +++ b/code/modules/mob/living/carbon/human/species.dm @@ -21,6 +21,7 @@ /datum/species var/id = null // if the game needs to manually check your race to do something not included in a proc here, it will use this + var/limbs_id = null //this is used if you want to use a different species limb sprites. Mainly used for angels as they look like humans. var/name = null // this is the fluff name. these will be left generic (such as 'Lizardperson' for the lizard race) so servers can change them to whatever var/roundstart = 0 // can this mob be chosen at roundstart? (assuming the config option is checked?) var/default_color = "#FFF" // if alien colors are disabled, this is the color that will be used by that race @@ -86,11 +87,19 @@ var/has_dismemberment = 1 //Whether or not this species uses dismemberment for its limbs + //Flight and floating + var/override_float = 0 + /////////// // PROCS // /////////// - var/flying = 0 + +/datum/species/New() + if(!limbs_id) //if we havent set a limbs id to use, just use our own id + limbs_id = id + ..() + //Called when admins use the Set Species verb, let's species //do some init stuff on the mob that got SS'd if necessary @@ -452,7 +461,6 @@ else icon_string = "m_[bodypart]_[S.icon_state]_[layer]" - world.log << icon_string I = image("icon" = 'icons/mob/mutant_bodyparts.dmi', "icon_state" = icon_string, "layer" =- layer) if(!(H.disabilities & HUSK)) @@ -848,6 +856,9 @@ if(!(H.status_flags & IGNORESLOWDOWN)) if(!has_gravity(H)) + if(specflags & FLYING) + . += speedmod + return // If there's no gravity we have the sanic speed of jetpack. var/obj/item/weapon/tank/jetpack/J = H.back var/obj/item/clothing/suit/space/hardsuit/C = H.wear_suit @@ -886,10 +897,11 @@ if(H.bodytemperature < BODYTEMP_COLD_DAMAGE_LIMIT) . += (BODYTEMP_COLD_DAMAGE_LIMIT - H.bodytemperature) / COLD_SLOWDOWN_FACTOR - var/leg_amount = H.get_num_legs() - . += 6 - 3*leg_amount //the fewer the legs, the slower the mob - if(!leg_amount) - . += 6 - 3*H.get_num_arms() //crawling is harder with fewer arms + if(!(specflags & FLYING)) + var/leg_amount = H.get_num_legs() + . += 6 - 3*leg_amount //the fewer the legs, the slower the mob + if(!leg_amount) + . += 6 - 3*H.get_num_arms() //crawling is harder with fewer arms . += speedmod @@ -1471,7 +1483,6 @@ /datum/species/proc/spec_stun(mob/living/carbon/human/H,amount) . = stunmod * amount - ////////////// //Space Move// ////////////// @@ -1483,22 +1494,6 @@ return 0 - - - - - - - - - - - - - - - - #undef HUMAN_MAX_OXYLOSS #undef HUMAN_CRIT_MAX_OXYLOSS diff --git a/code/modules/mob/living/carbon/human/species_types.dm b/code/modules/mob/living/carbon/human/species_types.dm index 0f40916250e..8800e78329b 100644 --- a/code/modules/mob/living/carbon/human/species_types.dm +++ b/code/modules/mob/living/carbon/human/species_types.dm @@ -742,41 +742,13 @@ SYNDICATE BLACK OPS mutant_bodyparts = list("tail_human", "ears", "wings") default_features = list("mcolor" = "FFF", "tail_human" = "None", "ears" = "None", "wings" = "Angel") use_skintones = 1 - flying = 0 + no_equip = list(slot_back) blacklisted = 1 + limbs_id = "human" skinned_type = /obj/item/stack/sheet/animalhide/human var/datum/action/innate/flight/fly -/* -/datum/species/human/qualifies_for_rank(rank, list/features) - if((!features["tail_human"] || features["tail_human"] == "None") && (!features["ears"] || features["ears"] == "None")) - return 1 //Pure humans are always allowed in all roles. - - //Mutants are not allowed in most roles. - if(rank in security_positions) //This list does not include lawyers. - return 0 - if(rank in science_positions) - return 0 - if(rank in medical_positions) - return 0 - if(rank in engineering_positions) - return 0 - if(rank == "Quartermaster") //QM is not contained in command_positions but we still want to bar mutants from it. - return 0 - return ..() - - -/datum/species/human/handle_chemicals(datum/reagent/chem, mob/living/carbon/human/H) - if(chem.id == "mutationtoxin") - H << "Your flesh rapidly mutates!" - H.set_species(/datum/species/jelly/slime) - H.reagents.del_reagent(chem.type) - H.faction |= "slime" - return 1 - -*/ - /datum/species/angel/on_species_gain(mob/living/carbon/human/H) ..() if(H.dna && H.dna.species &&((H.dna.features["wings"] != "Angel") && ("wings" in H.dna.species.mutant_bodyparts))) @@ -790,7 +762,8 @@ SYNDICATE BLACK OPS /datum/species/angel/on_species_loss(mob/living/carbon/human/H) if(fly) fly.Remove(H) - flying = 0 + if(FLYING in specflags) + specflags -= FLYING ToggleFlight(H,0) if(H.dna && H.dna.species &&((H.dna.features["wings"] != "None") && ("wings" in H.dna.species.mutant_bodyparts))) H.dna.features["wings"] = "None" @@ -801,7 +774,7 @@ SYNDICATE BLACK OPS HandleFlight(H) /datum/species/angel/proc/HandleFlight(mob/living/carbon/human/H) - if(flying) + if(FLYING in specflags) if(!CanFly(H)) ToggleFlight(H,0) H.float(0) @@ -812,22 +785,26 @@ SYNDICATE BLACK OPS H.float(0) return 0 - - /datum/species/angel/proc/CanFly(mob/living/carbon/human/H) + if(H.stat || H.stunned || H.weakened) + return 0 + if(H.wear_suit && (H.wear_suit.flags_inv & HIDEJUMPSUIT)) //Jumpsuits have tail holes, so it makes sense they have wing holes too + H << "Your suit blocks your wings from extending!" + return 0 var/turf/T = get_turf(H) if(!T) return 0 var/datum/gas_mixture/environment = T.return_air() if(environment && !(environment.return_pressure() > 30)) + H << "The atmosphere is too thin for you to fly!" return 0 else return 1 /datum/action/innate/flight name = "Toggle Flight" - check_flags = AB_CHECK_CONSCIOUS|AB_CHECK_RESTRAINED|AB_CHECK_STUNNED|AB_CHECK_LYING + check_flags = AB_CHECK_CONSCIOUS|AB_CHECK_RESTRAINED|AB_CHECK_STUNNED button_icon_state = "slimesplit" background_icon_state = "bg_alien" @@ -835,14 +812,17 @@ SYNDICATE BLACK OPS var/mob/living/carbon/human/H = owner var/datum/species/angel/A = H.dna.species if(A.CanFly(H)) - A.flying = !A.flying - if(A.flying) - H << "You beat your wings and begin to hover gently above the ground..." - A.ToggleFlight(H,A.flying) - else + if(FLYING in A.specflags) H << "You settle gently back onto the ground..." - A.ToggleFlight(H,A.flying) - + A.specflags -= FLYING + A.ToggleFlight(H,0) + H.update_canmove() + else + H << "You beat your wings and begin to hover gently above the ground..." + A.specflags += FLYING + H.resting = 0 + A.ToggleFlight(H,1) + H.update_canmove() /datum/species/angel/proc/flyslip(mob/living/carbon/human/H) var/obj/buckled_obj @@ -871,27 +851,30 @@ SYNDICATE BLACK OPS /datum/species/angel/spec_stun(mob/living/carbon/human/H,amount) - if(flying) + if(FLYING in specflags) flyslip(H) - ToggleFlight(H,0) - ..() + . = ..() /datum/species/angel/negates_gravity() - return flying + if(FLYING in specflags) + return 1 /datum/species/angel/space_move() - return flying + if(FLYING in specflags) + return 1 /datum/species/angel/proc/ToggleFlight(mob/living/carbon/human/H,flight) - if(flight) - flying = 1 + if(flight && CanFly(H)) stunmod = 2 speedmod = -1 + specflags += FLYING + override_float = 1 H.pass_flags |= PASSTABLE H.OpenWings() else - flying = 0 stunmod = 1 speedmod = 0 + specflags -= FLYING + override_float = 0 H.pass_flags &= ~PASSTABLE H.CloseWings() \ No newline at end of file diff --git a/code/modules/mob/living/carbon/human/update_icons.dm b/code/modules/mob/living/carbon/human/update_icons.dm index 6cb5cda6feb..37a207da1ee 100644 --- a/code/modules/mob/living/carbon/human/update_icons.dm +++ b/code/modules/mob/living/carbon/human/update_icons.dm @@ -583,7 +583,7 @@ var/global/list/limb_icon_cache = list() //produces a key based on the human's limbs /mob/living/carbon/human/proc/generate_icon_render_key() - . = "[dna.species.id]" + . = "[dna.species.limbs_id]" if(dna.check_mutation(HULK)) . += "-coloured-hulk" diff --git a/code/modules/mob/living/living.dm b/code/modules/mob/living/living.dm index 06f6492e9ae..ef89ac463a4 100644 --- a/code/modules/mob/living/living.dm +++ b/code/modules/mob/living/living.dm @@ -716,14 +716,15 @@ Sorry Giacom. Please don't be mad :( /mob/living/proc/get_visible_name() return name -/mob/living/update_gravity(has_gravity) +/mob/living/update_gravity(has_gravity,override = 0) if(!ticker || !ticker.mode) return if(has_gravity) clear_alert("weightless") else throw_alert("weightless", /obj/screen/alert/weightless) - float(!has_gravity) + if(!override) + float(!has_gravity) /mob/living/proc/float(on) if(throwing) diff --git a/code/modules/mob/mob.dm b/code/modules/mob/mob.dm index 870064d2447..23cddc84d61 100644 --- a/code/modules/mob/mob.dm +++ b/code/modules/mob/mob.dm @@ -678,21 +678,22 @@ var/next_mob_id = 0 var/buckle_lying = !(buckled && !buckled.buckle_lying) var/has_legs = get_num_legs() var/has_arms = get_num_arms() + var/ignore_legs = get_leg_ignore() if(ko || resting || stunned) drop_r_hand() drop_l_hand() unset_machine() if(pulling) stop_pulling() - else if(has_legs) + else if(has_legs || ignore_legs) lying = 0 if(buckled) lying = 90*buckle_lying else - if((ko || resting || !has_legs) && !lying) + if((ko || resting || (!has_legs && !ignore_legs)) && !lying) fall(ko) - canmove = !(ko || resting || stunned || buckled || (!has_legs && !has_arms)) + canmove = !(ko || resting || stunned || buckled || (!has_legs && !ignore_legs && !has_arms)) density = !lying if(lying) if(layer == initial(layer)) //to avoid special cases like hiding larvas. diff --git a/code/modules/surgery/bodyparts/bodyparts.dm b/code/modules/surgery/bodyparts/bodyparts.dm index 0313dfa5325..62a7dbc4a3e 100644 --- a/code/modules/surgery/bodyparts/bodyparts.dm +++ b/code/modules/surgery/bodyparts/bodyparts.dm @@ -174,7 +174,7 @@ should_draw_greyscale = FALSE var/datum/species/S = H.dna.species - species_id = S.id + species_id = S.limbs_id if(S.use_skintones) skin_tone = H.skin_tone diff --git a/code/modules/surgery/bodyparts/helpers.dm b/code/modules/surgery/bodyparts/helpers.dm index 1dd5b807a62..54d19bf14af 100644 --- a/code/modules/surgery/bodyparts/helpers.dm +++ b/code/modules/surgery/bodyparts/helpers.dm @@ -51,6 +51,13 @@ /mob/proc/get_num_legs() return 2 +/mob/proc/get_leg_ignore() + return 0 + +/mob/living/carbon/human/get_leg_ignore() + if(FLYING in dna.species.specflags) + return 1 + /mob/living/carbon/human/get_num_arms() . = 0 for(var/X in bodyparts) From fbeeaeae1452ceb4c68d3402bb878d93648ca3d0 Mon Sep 17 00:00:00 2001 From: Shadowlight213 Date: Mon, 9 May 2016 23:00:59 -0700 Subject: [PATCH 6/9] NEW SPRITES! make flying give immunity to chasms --- code/modules/mining/mine_turfs.dm | 2 ++ .../mob/living/carbon/human/species.dm | 10 ++++++++-- .../mob/new_player/sprite_accessories.dm | 15 +++++++++++++++ icons/mob/mutant_bodyparts.dmi | Bin 47645 -> 45150 bytes icons/mob/wings.dmi | Bin 0 -> 10451 bytes 5 files changed, 25 insertions(+), 2 deletions(-) create mode 100644 icons/mob/wings.dmi diff --git a/code/modules/mining/mine_turfs.dm b/code/modules/mining/mine_turfs.dm index 02a75bcc1fa..d54b00a1a73 100644 --- a/code/modules/mining/mine_turfs.dm +++ b/code/modules/mining/mine_turfs.dm @@ -580,6 +580,8 @@ visible_message("[H] falls into [src]!") J.chasm_react(H) return + if(H.dna.species && (FLYING in H.dna.species.specflags)) + return drop(AM) diff --git a/code/modules/mob/living/carbon/human/species.dm b/code/modules/mob/living/carbon/human/species.dm index a30a7e14ebf..79b4265a5d1 100644 --- a/code/modules/mob/living/carbon/human/species.dm +++ b/code/modules/mob/living/carbon/human/species.dm @@ -461,7 +461,10 @@ else icon_string = "m_[bodypart]_[S.icon_state]_[layer]" - I = image("icon" = 'icons/mob/mutant_bodyparts.dmi', "icon_state" = icon_string, "layer" =- 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) if(!(H.disabilities & HUSK)) if(!forced_colour) @@ -487,7 +490,10 @@ else icon_string = "m_[bodypart]inner_[S.icon_state]_[layer]" - I = image("icon" = 'icons/mob/mutant_bodyparts.dmi', "icon_state" = icon_string, "layer" =- 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) standing += I diff --git a/code/modules/mob/new_player/sprite_accessories.dm b/code/modules/mob/new_player/sprite_accessories.dm index 7f082492def..29f6e091ec0 100644 --- a/code/modules/mob/new_player/sprite_accessories.dm +++ b/code/modules/mob/new_player/sprite_accessories.dm @@ -57,6 +57,9 @@ var/color_src = MUTCOLORS //Currently only used by mutantparts so don't worry about hair and stuff. This is the source that this accessory will get its color from. Default is MUTCOLOR, but can also be HAIR, FACEHAIR, EYECOLOR and 0 if none. var/hasinner //Decides if this sprite has an "inner" part, such as the fleshy parts on ears. var/locked = 0 //Is this part locked from roundstart selection? Used for parts that apply effects + var/dimension_x = 32 + var/dimension_y = 32 + var/center = FALSE //Should we center the sprite? ////////////////////// // Hair Definitions // @@ -1304,15 +1307,27 @@ name = "None" icon_state = "none" +/datum/sprite_accessory/wings_open + icon = 'icons/mob/wings.dmi' + /datum/sprite_accessory/wings_open/angel name = "Angel" icon_state = "angel" color_src = 0 + dimension_x = 46 + center = TRUE + dimension_y = 34 + +/datum/sprite_accessory/wings + icon = 'icons/mob/wings.dmi' /datum/sprite_accessory/wings/angel name = "Angel" icon_state = "angel" color_src = 0 + dimension_x = 46 + center = TRUE + dimension_y = 34 locked = TRUE /datum/sprite_accessory/frills diff --git a/icons/mob/mutant_bodyparts.dmi b/icons/mob/mutant_bodyparts.dmi index 19b9a2f45f36a4f59425235079dfb8ff88593560..518a57469e54f8ced1d063d6b4213559a3a7d29d 100644 GIT binary patch delta 11046 zcmb_?2UJsOw{|GDD~N4G0YyYWL@7#DBv@di1QZ-a1Og(`27>f{GB#w84pJp5O%w>y zdl(RD0!oVzASeM05s}bL|K9`7jL!Y;ckj2>&tk3Qob$HxzI#9WdG^l31^&@7{+RvH zg}@6I-e(-V>^+@5yqz)b2!wxnnMH^D_}=Z-X?Wckbum=Dx5`G0exCm2Qi5%4GUDJ` zk+E?4a!HZg!z|%?4Q%o6-rcwC#e>;rp?daE{o7931NQqa1y?5&kz5}?{d8!rGwPC& znL*)gp>at`i?Pxi5$kQqJ(08d!o`;%9c0Y2U%Glz3k`fc^2aj<7O1kech=}mm2Ew; zR|qw4i|p0*u3h{iFGE`B;TBsXM?rsKCv!13Lwi)&$qk>CPofb1Cfg9Tg89;sK3TC* zOM&mC*!Rb6HO4i)Q#pHfHg;%kS~?OXkW=^Kv{UW1!mzi|2*-83R}nTxh|=mw-Ozz7 zt@d?`ewOUS) zov~bZgnfvwdQxnY($)~b0nGfsw@}Y z|57Q6H99bzTyLhAZjF|bacuaR-A*5=hK`~9TFP`z#)Q?xT6Fdok=+_MOHQs%+b!Xq2P->CRW^ z104TbZF=bG(eUz2%EylDN4*Lso+vf#nMny~-8iw8R+KmVR--|ia>p#Zj4J4U&Xvz@ z{!-6cGD+99+VT)FBA~giwCMM@Ph#a;oRkcR_tcB67W76$>(`fzC|f`2)8VH+Tz=y< z8C>F6gdde``qG`S-o-)4&-P_=n}_&3TkilRw!YTwMTL@B{^K{D zdCGD2%MTmS57$U|+%lk)OYDqU_xtTTU4LMIyLsp0Z*Lp!B>EP<{%!no<#FFJV@8&c z$bnzql)M|e*|=86?#5d?q1NAsC25DQ|F%)cM!DnRwDS_qg&xbUTV^0`?sckQjI)X@ zn$etA{`kjtPR1h>PsL*+1moTBh(Jyk1U`pJhJN&|vDWxSk485*8olAD{GmQAw_wP7tXD)~(uG^Ygx@8ozIX9@cRTh(-}slZ+0&YR<3)VqW$2{G zR5?b{Owrs@n;edvQ1fZ(t;T3Msh~{p%}4af6DLlLIKAvQ*cR16|R9R&{i`sH(m`V?kt3J!AmU+vKQINFKwqdxPfj<3<>A zy^ros*DFXqAp`Ow!HTzEclaiU;A%9c=xud2H6w+`K_k3PogoM6sNckys^MPTFZ#hJ zCdk^v#H9KX-iEV4P$RedB{SaBYUR9=2fA~(x5AWqxVM-LMu4Gw_Vee@6U?Sn9ojtu z1FIn_^3h^%G=ViTYi4*v$r{HQ9J~w~&Ckz!`}p(+lqg=ou|Pj2y+f%Nd=AYn8znUx z+tm8s7$@X4MNcg+)Q~xf*4EZl2cGLf8HDO;L-68Cy-Da$`Q=l))$N$Ha;5sOAM}sv zFFEXLXLqJ)*i6L?QiLl{!v_R`1&>r}no>`jzlx}l2zd}9T}U`#FgZa(PjSM$JCl#i z_#Ve&4)nQK&{A_QR|{SD{aRm0wJhY8uJI$9eLzX^lvzbBvc+D>aw+yfkg3L%6wpl7+}noUx4uC+YwHO(9B9^*!1 z8EJMot+%%~+vuu3r#UsEG_bXH6DNt%MO}>1I%H3mv_rsuI$xEHL|4Aa^kN0T7wmo2 zG4K&@oTvsN5El#FNba9!I_o;^^XuyK5@UFiOlDv^VIAB>LYWW#%pXeMb}m-7V_*L< z{SAz?Z=)DD@PTK~FE$EZ*c9usJM%UhwQ@&SUv>;U!2Y6O$A2*FY+2O#Q{0t1h`rL= zJiwENXNk&uiKnwHTc86{(8?`DOzZ|t@W{5`Fd5q}WmaIH5JOnGgI%a+6py%T7!hyW zzo&-(rK_xOW&Vq%nR)JS=lwPw1l@`PL*`|Ohi}GWrtVv@>?eM$?|cy|=AmsMtmHoC z-oc+x$Xj7eISaFAwB}CbshibW>&7JDwq~At z#_EQ*8F=92qX}E1-fvxcuad)+I6|CC{TV5s$gC?jZn}X$ECeg=m1*JA(Ar}WH;z|) zOAqznFPwd(KO~qTa{ET`^?a4mY6xRytDxu zavufi9ipYBvN4uHA?EQslq(+NLMJ%SETT|cje96@ZG@QH~xOv3Jqp|ZQYpu7vXnc5&u)$?_UwTVVgR<$rZrNE_3}I_7yt3OeG%t zV5y%U02O?H^)D{?CMi4mVr$>_87=vwN%LA;EGR>gnG2k8_hNh+o2Gt=8yj8HS|&hw zFtMZWbau4#RPZf%yBWiGVKuMc2DdSmr_MF%3_C;-Ln$IfAv4)~1Z;RB3U-orU;E5G z3=)T`5{pDmQ+S#(pPC+5k&}%4dF#f?KM7aP_}0kJpuXByE#Yr#6afQOtnyTP%;-_5 z+7NG#GigZ zpAd+#pWQR9F7~R9G&kRQB_}U~|GE9x+G10?hW;m6n6ClaRYaqu#ki1%6dMp?nqQKN z0bC80&n&Sx`fIZmxXB)eJOTo$yf?(JSj##?X8G>DV&*XmhCxVmJ`E{y+|i#o`~i#Vm`z`$o# zvAlhYOZx9@OvJhI3l!+eZ84D)7#Y@&efV&-+^x(_{6nKJfsA>A`a?UBjfsc$(7T&p zi_}GUnFO6lJrw?fp%*|a7{#CL#ecoaE%K*t_W#ZDR*+55mjC)+=DliJYOrf;#%@Ud zha>f`P9$r4_eZC?xMJFT$=F?gI@n(mKmbku;~6%483&cRk=!aso43i--BXivEi}O0 zbKUh~(!P!7e%@tZWk>c;HDAvnRq5=gT54$@ak^J~H`Wz8#2_C&HRFDA4cM}4H6!j2 zIM5t!jT@V2HY)HHa6E;Bzm{0z$OGjztu-YXql>{o~zCE zv>EQsz8&I!HcJ0=ud0;$`=GO3YbV4gE=Ss+Jz^fx`C1nAcxZ$YZIAdk;dHyf{?`gp zXF>})D=dW!_q(4bE*vX|)42%s)C;w}y{72gIZ&%4=3%-$L_2=YCBVzk;`SCtx~Gsw z>x+iI$jzFsF0`QKw<#MDl|^xS)BBez+3TCO>G?NE257DI5E|P#7BkL=mGS50MZdN` z!nZ7#Lq6LkC{Z8MsM3Ja5l0jW&LS6M1B_+IGIT3a5+v5uPHDm*ju1w8Acf%=glKI& z{4_p4O(Q-uRsxE2X()3ep?+z#uh3XlkACrgz+OHC4Q5%Pbi%MIs)9VL(VJLOICDbp zwpi{y9%)~n=1&arj>oU^T6yK`)lBrb6?#u^9HbKtpNd2@6ziiJtgWn!e`&cjR4zRC z2Xq~nunS|y1#U$fQiOqzUbSSvb;%daxrm0|+bP(Hh0d#gqVE3$cnSz*g7P*GFL&4c z{|yx{B5Xrt$Bx`vaS!MpcDjn~tFx>@Ogi!_-ujQm`%j01zDM{~)c#?8|LJ)DdN?WB zF@R;|B)6xS?a~9muxniHY>DHI?1O%|8VJ6xm0P?)_~lsFbqM+{pN-QK6B8GFgj`7K3+vu- zLJ7{K@+;L*R-Th&Rn#RzE~ZpofoX6xrCa`a#}=|3I7FctHZ&=+~DMwVF#zbVZezbT)}T`@lC6HSH%qcp15TT~PhZC2fy zc|%+Quo(aD8;FUWYJ5p?=-_85E6q}F=EV=w%!c*{s&Xi4W$VUb+CCn+pMf=M(-<#{ z3j)zXX^{ByBx3&P+!@0t0e4UB1iQGkFfC9P78X6w{qf2<0DD-fQ~g^nmb2ChF$FZS z;t@Y+0u#yj^LI=ktTH&A2k$1gl0sT7Y3&AF$^5dybPDf}zb_11A+L~-6a8d<1orBJ zWOW5;<~r5#^S10RrziQY3CA+Siwn>3X};J$hfuP9<@T6w;0P)W|$IoGw`OXgdNKltJt{jujy91t**lkEDbxI_(j-% zlkDCcaugeg=06uNL&5W{gTPLeSve^ibA14kXPgLn5F-9I6;mf>Bfjz+p?kJUQQZpL z{~S$t%E(nEC!7tZ5Zq@+>pGarMiwi(nT#>5jPXbAGQmzVg)n9BasYhE-Z6Xc@^TNN!0->pMvCa`v4z1~@& zbJ`1@7WzCST3#}t^K1)zCie402L8O@Lo}rRT8PKX zac*(Kz5te&vLJFvan)=O(8PYUXF&v3#&{G<0}(2bD-~QAa=-Gy7FV4I?AaZw4B*cT z=sE~%hm8cf!e*&@|K0jl%mG+=?jdAj(W(Jo2ZQ;Zlm@2zoizy{bc1EbZvG1|*jM13 zWyy!IHIW_DSLRdsX1dZmJ321(I31V}_N#HjnjcL5I~(LjG^86hL;}-KX6Jryfg%XR zTncvM4-U67)v711L149DRU-KEo3%%?!`dL=K9UH;hmIbsQC^hD`|gYr9Z-FwlPJ2b zXFfW0V{Z(gBVb?&g)0J|&*eoX`^}Cza9A?=S2nPU5<+M8*?e49>)=s=?|RLe_UWUk z=mwz6%&)mM=+$~?zLMDHv4ZW(;eqF0`^TnT)gEc-%&MYC2dASh*IeI&K*%IJ@E7(u z-?Q50A!AKRN)2&`vQ-(zjoQ}o3?=KPoknV-{&+yNoW-WVI(}C+5-7aX(`?kW*1&+) zr{I8_bh)2cY$KoeLP$?Htoa%aCVDC;>#BAUBp?@3c};DtF^e;*a$co{4`4eTe`$s7 z>wQ#e1N3%Sir%(+?~y5VU|2<#lJ&+8FNwYxz@({LEzWJgLohS4^%;)qdfd?gvSo-J zJ2={pVDg(E^-8?1epik6?n4TJ^LOUJI%Vn6D*h`V4{JYwdm!21aK{kZn_TWzBU4`W z(pR#0pxQHzx6ZXdL5=|x{mToQR2q#&%XUQ|qTa01D6e0i^E?2)Iu4GS>*aa<7obdr z56xqEZs(`dZvq`)Hnkn-fP`bYdwHZMeS;v|fwcvJWAf{xx8-hr0Z>57B(q3kRpaO- zi`bdUd^1nLrbOa-3#3>c6V{n*wK2rrjOyk%98yMT?mIVb$F=qwov(=9sg z0h?$51M^`9J|2kmb~4Zyg5%7+xc zz_{*pE|1!6tM9XKpaJz`!xQsBY`e_bfGb`QO_hfdId<`ORbs+2C=n0|Bs==A9dzzA z97;N^m4@e}>it^3#2lJ{(wkmgSzsGw++Ac6(6@<%wGs`tRZk^fiPEu12cI<30fFB?W}RAJ!Jg`D5D8DC$-$w_%p&}K_@X3>0jURVKi zB8YJF*l$lOsLCf=_~n~}efcMnKYUeqZ*{RzMJ0m&i?YzBVg;n?UnQ( z|ImzYhQ?(T1`)Lq^eJc!`0HH2S_xfU03IAAWpj{j|MB69{09C1&ceXc?3Mnes^V?# zh(ej?g)6~9<^7k|^)#bjm!;jHN!RYU8OhOij69A!kHg_#wr{HU5S#en@(O7_ZW6RwTV~wQ3V}!^1DGM=$x*(flRwHYAgOKl zfbLHn`1Myk7HsV1hZ`z|pdT}B3ZVbIGU$JJoARn#g209Sm@$k^b8XLbPF2iKm`p8A zIfZsb2Zd804Th=GRrpoj1bGU$M};SVodohB-2XVyw`SziG7A+Ruk5Av07NdB*{biz z9PO$aagXQ#F$tR+WF}AuVeT7SzkVE-69(+Q6{V8#xoA$^5l&IbyOL*oo6}E&(Onj@ z)(%VbVnjtnA1l=d0ee46EGhO(tBJKR@qTpx;4~BaHq@3w4A*5v&I;^5pAt{b$b7-gLCcMqkIOYM;`#Kj-5x$YHhkY z^k+`f?<0XaaK9jJ9GftT_7=bQG|h_-2$d&+J<-a5&PYlY8MNJKV6{0-Pih0&cIzp$ zVw-|Rq?u!)qX-peK-^)Sv62M=maDHe#%8;XP`cwDXmbGw4S29;eQOE_(7JI1cG6He zJ4p^=D3!S}luWsFvHs!$pti{MLpW`s7=KGpPkB|A;!iB@6<5shHmP zx2Hg>e&myOjCZ~pJAd?@Pdw7d^21lx)SRICNfam$tiN;sShaAt!I_g6W=u&Vpm+s} zAF0nDyr_O)wYPr~eE|;Ff3!>vNX>{~DMhBWZ+XmIUwL`lNTghMt zq#mZHdxyz24l^;w2AHxHOHAnhm^g+D0RZ_n_kiNZCc>Kbx`G6=RM#NWpR&8;LE7Sg zkI6}pw)l53_#CX9bkBN4?G=gKgFlbT{75IDxDcaUhUXK@bE9`xfH)QbXEW;E+8}G7 z-}=Cc`)onF1C)4Pc<&N*f1VKMs7rZw(Ga4ew=u~3d9@@%1Fq{nUK$1G zcSXJpLQ$Z2_Po17Hgz7zk5j3vT?qL)-he|Vrh${}Eo=`KZ@>+xNQ`3>&u}%`khA4x zalF)4o-AW(-3cxVBpUOwb$!Ceh<0)?l-m|9`bD0=tLT!@Gg$Ao%O1Qs^9HpCMyx3*Si*r_I?V+=NEBSyUp>0IyB!C+z`1mF zbzL7E*bY9-gfWf(J*vY1#q&8R1vU&Dl#avYu1B7PMuX-)H2;b*QG-eF4_lYcaBbj| z>Rc4UuFss3jIfx0L4hhjM$w4t_wO$ZTS3HM@7(2xu(G!9EH8NRBgXxZYKMME^Henq>mq92F=gD)s5*V3c9gb%nVG=7JbH8tfqgUlKo9{<%yCVezooe{4*}@_;tyioH@orf#2{`ciH#+Ym0z@>6(i1c+~;m19@3+D$12d@ej zRn7DI@lY>knngFlE>|Za}y>1gWC@e0&l&L0i94C|Ljt^gvm? zpKa^`q~I`%q>5Ue>`Yr&njzuJYgTP}a3D0C4Y2^uY4E;8%V#HWXL*d?0=I?8Xf%5s znax{VhS1F_?`G!-JQ5+tj|?GcI>;byEsI8AkP>=4_GAY*K}oOq4VOvXNN9GCmksm@ z3EsuX-%Q}MB4_`_!>G#m`1sF7TON>xh#HO|xR80&GLJifHZznDnHS;tXKtWBNAq%6 z%}Aa(_<;bA=?5j*@IHt>x5CN8FH7Ze$XvDTgdPY(8cd5KaM<&oAxs6lRwjm9{#ABZ zgd9rZ^hb!w10DX(HfV_*kYr}ao0~*2F%Tn355MO1%ojG&yO1?Ah4Yi|_u?W;&-9+p z+=du)mUU~$UU*;S6xMq_8<64=E7mRtYp(&upa$7{+1l#F0xxNDaDHk80;PLy3&frJ zB>HgW4UoJKNi({oJ~WZ!7#{1Zz!U>=VYGodw$_Nht%fZ%mTNMe4wa+G2Iq(!}7l?48e>BU ztxFl_*Xjvloh@rL58%KRa0|5=1-}j-i3P|nG9L1yx*q0~#Rf6UAWXQwxFb1Pac-xR zO+A~6v@c0v@A3fEGV_kZ_q@nA#U8)-1=M9?kq7w3{W$`CnV3Ubv&4xOgW=8#3`YjE zF*%!(gqX%V@{3zZojijRL1}XQn}*wY%PF!YIB6BQPP|f9r%o4 zCiPT!g$3Q;e!hDpyETOc0lN||_+7`^Pq6onA}MMgj@oJ`q>F(9!i8QM(r?@3$TArN zcI_uc9tXOF{v{TI&$1WCE%n~D{osdjVZ%@^sjpadtgx`qlRemOtkcj)5F)b|!PpqMeBtuNdudpCqNQ&Eh+ko9V3@0F2g<*W1Qw6g zeqC~t>}#eG+`||GJ}KiJq64nKvrh;pA|QZx7D-i#_0l7EFZ9m*+}BCtm5ZTybl#&^ zY_AA!@jz4suG@zj?Je#SS%HfhBz7(?F5b?rC4#WrbhH7EEEO1XS26Be$`XO7atK-r zl(}_Vg_Js|lFS1!?gJERY{v78r(xhjL?=4%D`tyyA5L>U1^sH`W#SLhVu(F1+3Q;) zTowhS67;o6^7q%^2oPgC2gN+(>oAR335{yepN}rjB!cJXi6AV)W0|)BpvPnC)6>&$ z6MlL@`02v@%v?EX2K*=tu2}RPbQMs{UPdLiR!A*HRwS6wo8a3Z)fgn8_$*o+a~S;c zs6?Io#FVgT{0FQ($~u@rm94(uCvbkf!r&T9clukC#Gj0i*v1^}S#xM+nZV=p$iQQr zQ{EPTBV0NjpC$&0sE@&(0egK~X0p6qfjB%wv9=3;VF2TZ-|qMbi=%L#iK+^|Pd*{u+pY_!m)9@z_|Ec-!#xJ2();i7ic3 Sd%YHZZlGs!rtp;Q&Ho2h^;%s3 delta 13761 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 f;Y!@LZG1Rx{YjzpCij=%Cdxq166U9^ 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

o)pXhg>V0>Ao>5< zHKYB1J# Date: Sat, 21 May 2016 17:20:30 -0700 Subject: [PATCH 7/9] Fixes cat ears --- code/modules/mob/living/carbon/human/emote.dm | 6 ++++-- code/modules/mob/new_player/sprite_accessories.dm | 3 +++ 2 files changed, 7 insertions(+), 2 deletions(-) diff --git a/code/modules/mob/living/carbon/human/emote.dm b/code/modules/mob/living/carbon/human/emote.dm index 9a9853243c6..25b62417d9c 100644 --- a/code/modules/mob/living/carbon/human/emote.dm +++ b/code/modules/mob/living/carbon/human/emote.dm @@ -132,7 +132,7 @@ if(((dna.features["wings"] != "None") && !("wings" in dna.species.mutant_bodyparts))) OpenWings() spawn(20) - CloseWings() + CloseWings() if ("wings") if (!src.restrained()) @@ -142,6 +142,8 @@ else if(dna && dna.species &&((dna.features["wings"] != "None") && ("wingsopen" in dna.species.mutant_bodyparts))) message = "[src] closes \his wings." CloseWings() + else + src << "Unusable emote '[act]'. Say *help for a list." if ("gasp","gasps") if (miming) @@ -340,7 +342,7 @@ src << "Unusable emote '[act]'. Say *help for a list." if ("help") //This can stay at the bottom. - src << "Help for human emotes. You can use these emotes with say \"*emote\":\n\naflap, airguitar, blink, blink_r, blush, bow-(none)/mob, burp, choke, chuckle, clap, collapse, cough, cry, custom, dance, dap, deathgasp, drool, eyebrow, faint, flap, frown, gasp, giggle, glare-(none)/mob, grin, groan, grumble, handshake, hug-(none)/mob, jump, laugh, look-(none)/mob, me, moan, mumble, nod, pale, point-(atom), raise, salute, scream, shake, shiver, shrug, sigh, signal-#1-10, sit, smile, sneeze, sniff, snore, stare-(none)/mob, sulk, sway, tremble, twitch, twitch_s, wave, whimper, wink, wag, yawn" + src << "Help for human emotes. You can use these emotes with say \"*emote\":\n\naflap, airguitar, blink, blink_r, blush, bow-(none)/mob, burp, choke, chuckle, clap, collapse, cough, cry, custom, dance, dap, deathgasp, drool, eyebrow, faint, flap, frown, gasp, giggle, glare-(none)/mob, grin, groan, grumble, handshake, hug-(none)/mob, jump, laugh, look-(none)/mob, me, moan, mumble, nod, pale, point-(atom), raise, salute, scream, shake, shiver, shrug, sigh, signal-#1-10, sit, smile, sneeze, sniff, snore, stare-(none)/mob, sulk, sway, tremble, twitch, twitch_s, wave, whimper, wink, wings, wag, yawn" else ..(act) diff --git a/code/modules/mob/new_player/sprite_accessories.dm b/code/modules/mob/new_player/sprite_accessories.dm index 29f6e091ec0..9da3d6ec762 100644 --- a/code/modules/mob/new_player/sprite_accessories.dm +++ b/code/modules/mob/new_player/sprite_accessories.dm @@ -1293,6 +1293,9 @@ name = "Angeler" icon_state = "angler" +/datum/sprite_accessory/ears + icon = 'icons/mob/mutant_bodyparts.dmi' + /datum/sprite_accessory/ears/none name = "None" icon_state = "none" From d2b5ed20f47d862a8f2a343a4ed88890444224d6 Mon Sep 17 00:00:00 2001 From: Shadowlight213 Date: Sat, 21 May 2016 20:38:24 -0700 Subject: [PATCH 8/9] makes toggle purrbation work on angels --- code/datums/datumvars.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/datums/datumvars.dm b/code/datums/datumvars.dm index 1908392d673..8225802a820 100644 --- a/code/datums/datumvars.dm +++ b/code/datums/datumvars.dm @@ -927,7 +927,7 @@ body usr << "Mob doesn't exist anymore" return - if(H.dna.species.id == "human") + if(("tail_human" in H.dna.species.mutant_bodyparts) && ("ears" in H.dna.species.mutant_bodyparts)) if(H.dna.features["tail_human"] == "None" || H.dna.features["ears"] == "None") usr << "Put [H] on purrbation." H << "Something is nya~t right." From 4797ea3ba868a1e56eab437a7b6163ca19d762c1 Mon Sep 17 00:00:00 2001 From: Shadowlight213 Date: Mon, 23 May 2016 19:03:31 -0700 Subject: [PATCH 9/9] Fixes up layers so it looks better. Removes restrain check on wings. --- code/__DEFINES/misc.dm | 39 +++++++++--------- .../mob/living/carbon/human/species.dm | 4 +- .../mob/living/carbon/human/species_types.dm | 2 +- icons/mob/wings.dmi | Bin 10451 -> 10452 bytes 4 files changed, 24 insertions(+), 21 deletions(-) diff --git a/code/__DEFINES/misc.dm b/code/__DEFINES/misc.dm index 9b9bc263e6d..52873b19e8f 100644 --- a/code/__DEFINES/misc.dm +++ b/code/__DEFINES/misc.dm @@ -23,24 +23,25 @@ #define FRIDAY_13TH "Friday the 13th" //Human Overlays Indexes///////// -#define MUTATIONS_LAYER 27 //mutations. Tk headglows, cold resistance glow, etc -#define SPECIES_LAYER 26 // mutantrace colors... these are on a seperate layer in order to prvent -#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 MUTATIONS_LAYER 28 //mutations. Tk headglows, cold resistance glow, etc +#define SPECIES_LAYER 27 // mutantrace colors... these are on a seperate layer in order to prvent +#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 SUIT_LAYER 16 +#define BELT_LAYER 15 //Possible make this an overlay of somethign required to wear a belt? +#define SUIT_STORE_LAYER 14 +#define BODY_WING_LAYER 13 //Optimum layer for wing mutant parts. below hair and headgear, and above shit on the body. Can't do better without directional layers +#define BACK_LAYER 12 +#define EARS_LAYER 11 +#define GLASSES_LAYER 10 #define HAIR_LAYER 9 //TODO: make part of head layer? #define FACEMASK_LAYER 8 #define HEAD_LAYER 7 @@ -50,7 +51,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 28 //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" diff --git a/code/modules/mob/living/carbon/human/species.dm b/code/modules/mob/living/carbon/human/species.dm index ca3ed98709e..8b8e34ada7d 100644 --- a/code/modules/mob/living/carbon/human/species.dm +++ b/code/modules/mob/living/carbon/human/species.dm @@ -334,12 +334,13 @@ /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) + var/list/relevent_layers = list(BODY_BEHIND_LAYER, BODY_ADJ_LAYER, BODY_FRONT_LAYER, BODY_WING_LAYER) var/list/standing = list() H.remove_overlay(BODY_BEHIND_LAYER) H.remove_overlay(BODY_ADJ_LAYER) H.remove_overlay(BODY_FRONT_LAYER) + H.remove_overlay(BODY_WING_LAYER) if(!mutant_bodyparts) return @@ -501,6 +502,7 @@ H.apply_overlay(BODY_BEHIND_LAYER) H.apply_overlay(BODY_ADJ_LAYER) H.apply_overlay(BODY_FRONT_LAYER) + H.apply_overlay(BODY_WING_LAYER) /datum/species/proc/spec_life(mob/living/carbon/human/H) return diff --git a/code/modules/mob/living/carbon/human/species_types.dm b/code/modules/mob/living/carbon/human/species_types.dm index 7cfd8084ebe..ea7bd579327 100644 --- a/code/modules/mob/living/carbon/human/species_types.dm +++ b/code/modules/mob/living/carbon/human/species_types.dm @@ -788,7 +788,7 @@ SYNDICATE BLACK OPS /datum/action/innate/flight name = "Toggle Flight" - check_flags = AB_CHECK_CONSCIOUS|AB_CHECK_RESTRAINED|AB_CHECK_STUNNED + check_flags = AB_CHECK_CONSCIOUS|AB_CHECK_STUNNED button_icon_state = "slimesplit" background_icon_state = "bg_alien" diff --git a/icons/mob/wings.dmi b/icons/mob/wings.dmi index 6cd4730ec867639134f507890bcdae64040758cf..84cf9bd083b543eec08e1b07311d079dbbb7eaf6 100644 GIT binary patch delta 153 zcmV;K0A~NwQPfe8B!7f@R9JLGWpiV4X>fFDZ*Bkpc$|gHF$%*V6b9hgcZ#26FAcHd zTZ*ALBv%k2uPQXAs3h0V0Xp>CzaG!&Wfz#)(jld$J%gcdcT#6sTLeQtNJU8@HZVp_ zwfQDsbelU<4%PV_LGh4a<{%fFDZ*Bkpc$|gHF%H5Y6b9g#cZxslZnWa~ z7DHng+A9!}K7qv228g}B2k7AbeLbGz%g!*9rLUBlwhV^8TuB{iX%P(lAQdHr*uc1J zs?9e6qg&mPa;VPdARjk$q?S}F7@E|(_*E(xx0By?$^TA|aSb*wlcgW3EiOHgKm2vE Gu_Gud2uF7S