"
dat += "Clothing & Equipment" dat += "Underwear:[underwear]" @@ -1955,10 +1903,8 @@ GLOBAL_LIST_EMPTY(preferences_datums) grad_style = previous_list_item(grad_style, GLOB.hair_gradients_list) - if("select_bg") - var/new_bg = input(user, "Select a background:", "Character Preference") as null|anything in bgstate_options - if(new_bg) - bgstate = new_bg + if("cycle_bg") + bgstate = next_list_item(bgstate, bgstate_options) if("underwear") var/new_underwear = input(user, "Choose your character's underwear:", "Character Preference") as null|anything in GLOB.underwear_list @@ -2347,81 +2293,6 @@ GLOBAL_LIST_EMPTY(preferences_datums) new_dors = input(user, "Choose your character's dorsal tube type:", "Character Preference") as null|anything in GLOB.xeno_dorsal_list if(new_dors) features["xenodorsal"] = new_dors - - // HYPER EDIT: Cosmetic body parts - if("cosmetic_head") - var/list/selectable_parts = list() - for(var/path in GLOB.cosmetic_heads) - var/datum/cosmetic_part/possible_part = GLOB.cosmetic_heads[path] - var/list/supported_species = possible_part.supported_species - if(!show_mismatched_markings && supported_species && !supported_species.Find(pref_species.id)) - continue - selectable_parts[possible_part.name] = path - if(!selectable_parts.len) - to_chat(user, "There are no valid alt heads for this species!") - var/new_cosmetic_part - var/question = "Choose your character's alt head style:" - new_cosmetic_part = input(user, question, "Character Preference") as null|anything in selectable_parts - if(new_cosmetic_part) - features["cosmetic_head"] = GLOB.cosmetic_heads[selectable_parts[new_cosmetic_part]] - update_preview_icon() - - if("cosmetic_chest") - var/list/selectable_parts = list() - for(var/path in GLOB.cosmetic_chests) - var/datum/cosmetic_part/possible_part = GLOB.cosmetic_chests[path] - var/list/supported_species = possible_part.supported_species - if(!show_mismatched_markings && supported_species && !supported_species.Find(pref_species.id)) - continue - selectable_parts[possible_part.name] = path - if(!selectable_parts.len) - to_chat(user, "There are no valid alt chests for this species!") - var/new_cosmetic_part - var/question = "Choose your character's alt chest style:" - new_cosmetic_part = input(user, question, "Character Preference") as null|anything in selectable_parts - if(new_cosmetic_part) - features["cosmetic_chest"] = GLOB.cosmetic_chests[selectable_parts[new_cosmetic_part]] - update_preview_icon() - - // currently symmetrical - if("cosmetic_arms") - var/list/selectable_parts = list() - for(var/path in GLOB.cosmetic_arms) - var/datum/cosmetic_part/possible_part = GLOB.cosmetic_arms[path] - var/list/supported_species = possible_part.supported_species - if(!show_mismatched_markings && supported_species && !supported_species.Find(pref_species.id)) - continue - selectable_parts[possible_part.name] = path - if(!selectable_parts.len) - to_chat(user, "There are no valid alt arms for this species!") - var/new_cosmetic_part - var/question = "Choose your character's alt arms style:" - new_cosmetic_part = input(user, question, "Character Preference") as null|anything in selectable_parts - if(new_cosmetic_part) - features["cosmetic_l_arm"] = GLOB.cosmetic_arms[selectable_parts[new_cosmetic_part]] - features["cosmetic_r_arm"] = GLOB.cosmetic_arms[selectable_parts[new_cosmetic_part]] - update_preview_icon() - - if("cosmetic_legs") - var/list/selectable_parts = list() - for(var/path in GLOB.cosmetic_legs) - var/datum/cosmetic_part/possible_part = GLOB.cosmetic_legs[path] - var/list/supported_species = possible_part.supported_species - if(!show_mismatched_markings && supported_species && !supported_species.Find(pref_species.id)) - continue - selectable_parts[possible_part.name] = path - if(!selectable_parts.len) - to_chat(user, "There are no valid alt legs for this species!") - var/new_cosmetic_part - var/question = "Choose your character's alt legs style:" - new_cosmetic_part = input(user, question, "Character Preference") as null|anything in selectable_parts - if(new_cosmetic_part) - features["cosmetic_l_leg"] = GLOB.cosmetic_legs[selectable_parts[new_cosmetic_part]] - features["cosmetic_r_leg"] = GLOB.cosmetic_legs[selectable_parts[new_cosmetic_part]] - update_preview_icon() - - // End hyper edit - //Genital code if("cock_color") var/new_cockcolor = input(user, "Penis color:", "Character Preference") as color|null @@ -2569,10 +2440,9 @@ GLOBAL_LIST_EMPTY(preferences_datums) features["belly_size"] = clamp(new_bellysize, BELLY_MIN_SIZE, BELLY_MAX_SIZE) if("butt_size") - var/new_buttsize = input(user, "Butt size :\n([BUTT_MIN_SIZE]-[BUTT_MAX_SIZE_SELECTABLE])", "Character Preference") as num|null + var/new_buttsize = input(user, "Butt size :\n([BUTT_MIN_SIZE]-[BUTT_MAX_SIZE])", "Character Preference") as num|null if(new_buttsize != null) - features["butt_size"] = clamp(new_buttsize, BUTT_MIN_SIZE, BUTT_MAX_SIZE_SELECTABLE) - //Restricted to 5 in menu, because we have chems to make them big IC, like with breasts and what not. + features["butt_size"] = clamp(new_buttsize, BUTT_MIN_SIZE, BUTT_MAX_SIZE) if("vag_shape") var/new_shape @@ -2822,9 +2692,6 @@ GLOBAL_LIST_EMPTY(preferences_datums) if("all") be_random_body = !be_random_body - if("cosmetic_markings") - features["cosmetic_markings"] = !features["cosmetic_markings"] - if("hear_midis") toggles ^= SOUND_MIDI diff --git a/code/modules/client/preferences_savefile.dm b/code/modules/client/preferences_savefile.dm index a77f504f8..80fab69e6 100644 --- a/code/modules/client/preferences_savefile.dm +++ b/code/modules/client/preferences_savefile.dm @@ -576,7 +576,6 @@ SAVEFILE UPDATING/VERSIONING - 'Simplified', or rather, more coder-friendly ~Car all_quirks -= V cit_character_pref_load(S) - hyper_character_pref_load(S) return 1 @@ -672,7 +671,6 @@ SAVEFILE UPDATING/VERSIONING - 'Simplified', or rather, more coder-friendly ~Car WRITE_FILE(S["all_quirks"] , all_quirks) cit_character_pref_save(S) - hyper_character_pref_save(S) return 1 diff --git a/code/modules/clothing/suits/miscellaneous.dm b/code/modules/clothing/suits/miscellaneous.dm index b56cb7a95..6e002119b 100644 --- a/code/modules/clothing/suits/miscellaneous.dm +++ b/code/modules/clothing/suits/miscellaneous.dm @@ -28,6 +28,46 @@ allowed = list (/obj/item/gun/energy/laser/redtag) resistance_flags = NONE +/* + * Posshim's Corpus atire + */ +/obj/item/clothing/suit/hooded/corpus/ + name = "Standard Voidsuit" + desc = "Standard issue voidsuit in the name of Grofit!" + icon_state = "corpus" + item_state = "armor" + body_parts_covered = CHEST|GROIN|LEGS|ARMS|FEET|HANDS + hoodtype = /obj/item/clothing/head/hooded/corpus + flags_inv = HIDEGLOVES|HIDESHOES|HIDEJUMPSUIT //"Hide shoes" but digi shoes dont get hidden, too bad! + min_cold_protection_temperature = FIRE_SUIT_MIN_TEMP_PROTECT + mutantrace_variation = NO_MUTANTRACE_VARIATION //There is no need for a digi variant, it's a costume + +/obj/item/clothing/suit/hooded/corpus/s //sec + name = "Enforcer Voidsuit" + desc = "Delux issue grofit voidsuit. Let the middle class know You're in charge." + icon_state = "corpuss" + hoodtype = /obj/item/clothing/head/hooded/corpus/s //Enjoy this nice red outfit Kinaris! There is NO NEED for a pink one! xoxo -VivI Fanteriso + +/obj/item/clothing/suit/hooded/corpus/c //command + name = "Commander Voidsuit" + desc = "Premium issue correctional worker attire. Grease the gears of production." + icon_state = "corpusc" + hoodtype = /obj/item/clothing/head/hooded/corpus/c + +/obj/item/clothing/head/hooded/corpus + name = "Voidsuit helmet" + desc = "galvanized reinforced helm to protect against the elements" + icon_state = "corpus" + body_parts_covered = HEAD + flags_inv = HIDEHAIR|HIDEEARS|HIDEFACIALHAIR|HIDEFACE|HIDEMASK|HIDESNOUT|HIDENECK //hide your ugly face with this one simple trick! + min_cold_protection_temperature = FIRE_SUIT_MIN_TEMP_PROTECT + +/obj/item/clothing/head/hooded/corpus/s //sec + icon_state = "corpuss" + +/obj/item/clothing/head/hooded/corpus/c //command + icon_state = "corpusc" + /* * Costume */ diff --git a/code/modules/food_and_drinks/food/snacks_pastry.dm b/code/modules/food_and_drinks/food/snacks_pastry.dm index 7e0d0a31a..e01b770ba 100644 --- a/code/modules/food_and_drinks/food/snacks_pastry.dm +++ b/code/modules/food_and_drinks/food/snacks_pastry.dm @@ -461,120 +461,6 @@ tastes = list("meat" = 2, "dough" = 2, "laziness" = 1) foodtype = GRAIN | ANTITOXIC -/obj/item/reagent_containers/food/snacks/donkpocket/taco - name = "\improper Taco-pocket" - desc = "Es hora de adentrarse en el espacio de bolsillo más salvaje jamás conocido. ¡jajaja!" - icon_state = "donkpockettaco" - list_reagents = list(/datum/reagent/consumable/nutriment = 4, /datum/reagent/consumable/capsaicin = 2) - cooked_type = /obj/item/reagent_containers/food/snacks/donkpocket/warm/taco - filling_color = "#CD853F" - tastes = list("meat" = 2, "dough" = 2, "spice" = 2, "vegetables" = 2, "cheese" = 2) - foodtype = GRAIN | VEGETABLES | MEAT - -/obj/item/reagent_containers/food/snacks/donkpocket/warm/taco - name = "warm Taco-pocket" - desc = "Es hora de adentrarse en el espacio de bolsillo más salvaje jamás conocido. ¡jajaja!" - icon_state = "donkpockettaco" - bonus_reagents = list(/datum/reagent/medicine/omnizine = 1) - list_reagents = list(/datum/reagent/consumable/nutriment = 4, /datum/reagent/consumable/capsaicin = 2) - tastes = list("meat" = 2, "dough" = 2, "spice" = 2, "vegetables" = 2, "cheese" = 2) - foodtype = GRAIN | VEGETABLES | MEAT - -/obj/item/reagent_containers/food/snacks/donkpocket/plasma - name = "\improper Poison-pocket" - desc = "NOTE: WARNING. For slime species consumption only. Call ###-##-### if injested" - icon_state = "donkpocketplasma" - list_reagents = list(/datum/reagent/toxin/carpotoxin = 2, /datum/reagent/toxin/plasma = 2, /datum/reagent/fuel = 2) - cooked_type = /obj/item/reagent_containers/food/snacks/donkpocket/warm/plasma - filling_color = "#CD853F" - tastes = list("meat" = 2, "dough" = 2, "poison" = 2, "welding fuel" = 2) - foodtype = GRAIN | TOXIC | MEAT - -/obj/item/reagent_containers/food/snacks/donkpocket/warm/plasma - name = "warm Poison-pocket" - desc = "NOTE: WARNING. For slime species consumption only. Call ###-##-### if injested" - icon_state = "donkpocketplasma" - bonus_reagents = list(/datum/reagent/toxin/carpotoxin = 2, /datum/reagent/toxin/plasma = 2, /datum/reagent/fuel = 2) - list_reagents = list(/datum/reagent/consumable/nutriment = 4) - tastes = list("meat" = 2, "dough" = 2, "poison" = 2, "welding fuel" = 2) - foodtype = GRAIN | TOXIC | MEAT - -/obj/item/reagent_containers/food/snacks/donkpocket/breakfast - name = "\improper Breakfast-pocket" - desc = "Now for all you early morning Joes!." - icon_state = "donkpocketbreakfast" - list_reagents = list(/datum/reagent/consumable/nutriment = 4) - cooked_type = /obj/item/reagent_containers/food/snacks/donkpocket/warm/breakfast - filling_color = "#CD853F" - tastes = list("meat" = 2, "dough" = 2, "eggs" =2, "bacon" =2) - foodtype = GRAIN | DAIRY | MEAT | BREAKFAST - -/obj/item/reagent_containers/food/snacks/donkpocket/warm/breakfast //IT'S BEEN ELEVEN FUCKING HOURS I HATE BYOND I HATE BYOND I HATE BEYOND!!! - name = "warm Breakfast-pocket" - desc = "Now for all you early morning Joes!." - icon_state = "donkpocketbreakfast" - bonus_reagents = list(/datum/reagent/medicine/omnizine = 1) - list_reagents = list(/datum/reagent/consumable/nutriment = 4) - tastes = list("meat" = 2, "dough" = 2, "eggs" = 2, "bacon" = 2) - foodtype = GRAIN | DAIRY | MEAT | BREAKFAST | ANTITOXIC - -/obj/item/reagent_containers/food/snacks/donkpocket/moth - name = "\improper Moth-pocket" - desc = "Donk Corp is now reaching out to all species! Dig in moths one and all." - icon_state = "donkpocketmoth" - list_reagents = list(/datum/reagent/consumable/nutriment = 4) - cooked_type = /obj/item/reagent_containers/food/snacks/donkpocket/warm/moth - filling_color = "#CD853F" - tastes = list("lint" = 2, "dough" = 2, "felt" = 2) - foodtype = GRAIN | DAIRY | CLOTH - -/obj/item/reagent_containers/food/snacks/donkpocket/warm/moth - name = "warm Moth-pocket" - desc = "Donk Corp is now reaching out to all species! Dig in moths one and all." - icon_state = "donkpocketmoth" - bonus_reagents = list(/datum/reagent/medicine/omnizine = 1) - list_reagents = list(/datum/reagent/consumable/nutriment = 4) - tastes = list("lint" = 2, "dough" = 2, "felt" = 2) - foodtype = GRAIN | DAIRY | CLOTH - -/obj/item/reagent_containers/food/snacks/donkpocket/vegan - name = "\improper Vegan-pocket" - desc = "For all you Animal Rights Consortium members out there!." - icon_state = "donkpocketvegan" - list_reagents = list(/datum/reagent/consumable/nutriment = 2) - cooked_type = /obj/item/reagent_containers/food/snacks/donkpocket/warm/vegan - filling_color = "#CD853F" - tastes = list("vegetables" = 2, "dough" = 2) - foodtype = GRAIN | VEGETABLES - -/obj/item/reagent_containers/food/snacks/donkpocket/warm/vegan - name = "warm Vegan-pocket" - desc = "For all you Animal Rights Consortium members out there!." - icon_state = "donkpocketvegan" - bonus_reagents = list(/datum/reagent/medicine/omnizine = 1) - list_reagents = list(/datum/reagent/consumable/nutriment = 3) - tastes = list("vegetables" = 2, "dough" = 2) - foodtype = GRAIN | VEGETABLES - -/obj/item/reagent_containers/food/snacks/donkpocket/sm - name = "\improper Super-pocket" - desc = "You're probably not in a good spot if you're laying eyes on this." - icon_state = "donkpocketsm" - list_reagents = list(/datum/reagent/consumable/nutriment = 99) - cooked_type = /obj/item/reagent_containers/food/snacks/donkpocket/warm/sm - filling_color = "#CD853F" - tastes = list("white-noise" = 2) - foodtype = TOXIC - -/obj/item/reagent_containers/food/snacks/donkpocket/warm/sm - name = "warm Super-pocket" - desc = "You're probably not in a good spot if you're laying eyes on this." - icon_state = "donkpocketsm" - bonus_reagents = list(/datum/reagent/medicine/omnizine = 1) - list_reagents = list(/datum/reagent/consumable/nutriment = 99) - tastes = list("white-noise" = 2) - foodtype = TOXIC - /obj/item/reagent_containers/food/snacks/dankpocket name = "\improper Dank-pocket" desc = "The food of choice for the seasoned botanist." @@ -668,7 +554,7 @@ cooked_type = /obj/item/reagent_containers/food/snacks/donkpocket/warm/berry filling_color = "#CD853F" tastes = list("dough" = 2, "jam" = 2) - foodtype = GRAIN | SUGAR + foodtype = GRAIN /obj/item/reagent_containers/food/snacks/donkpocket/warm/berry name = "warm Berry-pocket" @@ -677,7 +563,7 @@ bonus_reagents = list(/datum/reagent/medicine/omnizine = 1) list_reagents = list(/datum/reagent/consumable/nutriment = 4, /datum/reagent/medicine/omnizine = 1, /datum/reagent/consumable/berryjuice = 3) tastes = list("dough" = 2, "warm jam" = 2) - foodtype = GRAIN | SUGAR + foodtype = GRAIN /obj/item/reagent_containers/food/snacks/donkpocket/gondola name = "\improper Gondola-pocket" diff --git a/code/modules/food_and_drinks/recipes/tablecraft/recipes_pastry.dm b/code/modules/food_and_drinks/recipes/tablecraft/recipes_pastry.dm index 9100bab34..7c34fc8c2 100644 --- a/code/modules/food_and_drinks/recipes/tablecraft/recipes_pastry.dm +++ b/code/modules/food_and_drinks/recipes/tablecraft/recipes_pastry.dm @@ -362,159 +362,6 @@ datum/crafting_recipe/food/donut/meat tastes = list("meat" = 2, "dough" = 2) foodtype = GRAIN | VEGETABLES -/datum/crafting_recipe/food/donkpocket/taco - time = 15 - name = "Taco-pocket" - reqs = list( - /obj/item/reagent_containers/food/snacks/pastrybase = 1, - /obj/item/reagent_containers/food/snacks/meatball = 1, - /obj/item/reagent_containers/food/snacks/grown/carrot = 1, - /obj/item/reagent_containers/food/snacks/grown/citrus/lime = 1, - ) - result = /obj/item/reagent_containers/food/snacks/donkpocket/taco - subcategory = CAT_PASTRY - -/obj/item/reagent_containers/food/snacks/donkpocket/taco - name = "\improper Taco-pocket" - desc = "Es hora de adentrarse en el espacio de bolsillo más salvaje jamás conocido. ¡jajaja!" - icon_state = "donkpockettaco" - list_reagents = list(/datum/reagent/consumable/nutriment = 4, /datum/reagent/consumable/capsaicin = 2) - cooked_type = /obj/item/reagent_containers/food/snacks/donkpocket/warm/taco - filling_color = "#CD853F" - tastes = list("meat" = 2, "dough" = 2, "spice" = 2, "vegetables" = 2, "cheese" = 2) - foodtype = GRAIN | VEGETABLES | MEAT - -/obj/item/reagent_containers/food/snacks/donkpocket/warm/taco - name = "warm Taco-pocket" - desc = "Es hora de adentrarse en el espacio de bolsillo más salvaje jamás conocido. ¡jajaja!" - icon_state = "donkpockettaco" - bonus_reagents = list(/datum/reagent/medicine/omnizine = 1) - list_reagents = list(/datum/reagent/consumable/nutriment = 4, /datum/reagent/consumable/capsaicin = 2) - tastes = list("meat" = 2, "dough" = 2, "spice" = 2, "vegetables" = 2, "cheese" = 2) - foodtype = GRAIN | VEGETABLES | MEAT - -/datum/crafting_recipe/food/donkpocket/plasma - time = 15 - name = "Plasma-pocket" - reqs = list( - /obj/item/reagent_containers/food/snacks/pastrybase = 1, - /obj/item/reagent_containers/food/snacks/meatball = 1, - /datum/reagent/fuel = 1, - /datum/reagent/toxin/plasma = 1, - ) - result = /obj/item/reagent_containers/food/snacks/donkpocket/plasma - subcategory = CAT_PASTRY - -/obj/item/reagent_containers/food/snacks/donkpocket/plasma - name = "\improper Poison-pocket" - desc = "NOTE: WARNING. For slime species consumption only. Call ###-##-### if injested" - icon_state = "donkpocketplasma" - list_reagents = list(/datum/reagent/toxin/carpotoxin = 2, /datum/reagent/toxin/plasma = 2, /datum/reagent/fuel = 2) - cooked_type = /obj/item/reagent_containers/food/snacks/donkpocket/warm/plasma - filling_color = "#CD853F" - tastes = list("meat" = 2, "dough" = 2, "poison" = 2, "welding fuel" = 2) - foodtype = GRAIN | TOXIC | MEAT - -/obj/item/reagent_containers/food/snacks/donkpocket/warm/plasma - name = "warm Poison-pocket" - desc = "NOTE: WARNING. For slime species consumption only. Call ###-##-### if injested" - icon_state = "donkpocketplasma" - bonus_reagents = list(/datum/reagent/toxin/carpotoxin = 2, /datum/reagent/toxin/plasma = 2, /datum/reagent/fuel = 2) - list_reagents = list(/datum/reagent/consumable/nutriment = 4) - tastes = list("meat" = 2, "dough" = 2, "poison" = 2, "welding fuel" = 2) - foodtype = GRAIN | TOXIC | MEAT - -/datum/crafting_recipe/food/donkpocket/breakfast - time = 15 - name = "Breakfast-pocket" - reqs = list( - /obj/item/reagent_containers/food/snacks/pastrybase = 1, - /obj/item/reagent_containers/food/snacks/cheesewedge = 1, - /obj/item/reagent_containers/food/snacks/friedegg = 1, - /obj/item/reagent_containers/food/snacks/meat/cutlet = 1, - ) - result = /obj/item/reagent_containers/food/snacks/donkpocket/breakfast - subcategory = CAT_PASTRY - -/obj/item/reagent_containers/food/snacks/donkpocket/breakfast - name = "\improper Breakfast-pocket" - desc = "Now for all you early morning Joes!." - icon_state = "donkpocketbreakfast" - list_reagents = list(/datum/reagent/consumable/nutriment = 4) - cooked_type = /obj/item/reagent_containers/food/snacks/donkpocket/warm/breakfast - filling_color = "#CD853F" - tastes = list("meat" = 2, "dough" = 2, "eggs" = 2, "bacon" = 2) - foodtype = GRAIN | DAIRY | MEAT | BREAKFAST - -/obj/item/reagent_containers/food/snacks/donkpocket/warm/breakfast - name = "warm Breakfast-pocket" - desc = "Now for all you early morning Joes!." - icon_state = "donkpocketbreakfast" - bonus_reagents = list(/datum/reagent/medicine/omnizine = 1) - list_reagents = list(/datum/reagent/consumable/nutriment = 4) - tastes = list("meat" = 2, "dough" = 2, "eggs" = 2, "bacon" = 2) - foodtype = GRAIN | DAIRY | MEAT | BREAKFAST | ANTITOXIC - -/datum/crafting_recipe/food/donkpocket/moth - time = 15 - name = "Moth-pocket" - reqs = list( - /obj/item/reagent_containers/food/snacks/pastrybase = 1, - /obj/item/reagent_containers/food/snacks/cheesewedge = 1, - /obj/item/stack/sheet/cloth = 1, - ) - result = /obj/item/reagent_containers/food/snacks/donkpocket/moth - subcategory = CAT_PASTRY - -/obj/item/reagent_containers/food/snacks/donkpocket/moth - name = "\improper Moth-pocket" - desc = "Donk Corp is now reaching out to all species! Dig in moths one and all." - icon_state = "donkpocketmoth" - list_reagents = list(/datum/reagent/consumable/nutriment = 4) - cooked_type = /obj/item/reagent_containers/food/snacks/donkpocket/warm/moth - filling_color = "#CD853F" - tastes = list("lint" = 2, "dough" = 2, "felt" = 2) - foodtype = GRAIN | DAIRY | CLOTH - -/obj/item/reagent_containers/food/snacks/donkpocket/warm/moth - name = "warm Moth-pocket" - desc = "Donk Corp is now reaching out to all species! Dig in moths one and all." - icon_state = "donkpocketmoth" - bonus_reagents = list(/datum/reagent/medicine/omnizine = 1) - list_reagents = list(/datum/reagent/consumable/nutriment = 4) - tastes = list("lint" = 2, "dough" = 2, "felt" = 2) - foodtype = GRAIN | DAIRY | CLOTH - -/datum/crafting_recipe/food/donkpocket/vegan - time = 15 - name = "Vegan-pocket" - reqs = list( - /obj/item/reagent_containers/food/snacks/pastrybase = 1, - /obj/item/reagent_containers/food/snacks/grown/cabbage = 1, - /obj/item/reagent_containers/food/snacks/grown/mushroom/chanterelle = 1, - ) - result = /obj/item/reagent_containers/food/snacks/donkpocket/vegan - subcategory = CAT_PASTRY - -/obj/item/reagent_containers/food/snacks/donkpocket/vegan - name = "\improper Vegan-pocket" - desc = "For all you Animal Rights Consortium members out there!." - icon_state = "donkpocketvegan" - list_reagents = list(/datum/reagent/consumable/nutriment = 2) - cooked_type = /obj/item/reagent_containers/food/snacks/donkpocket/warm/vegan - filling_color = "#CD853F" - tastes = list("vegetables" = 2, "dough" = 2) - foodtype = GRAIN | VEGETABLES - -/obj/item/reagent_containers/food/snacks/donkpocket/warm/vegan - name = "warm Vegan-pocket" - desc = "For all you Animal Rights Consortium members out there!." - icon_state = "donkpocketvegan" - bonus_reagents = list(/datum/reagent/medicine/omnizine = 1) - list_reagents = list(/datum/reagent/consumable/nutriment = 3) - tastes = list("vegetables" = 2, "dough" = 2) - foodtype = GRAIN | VEGETABLES - /datum/crafting_recipe/food/donkpocket/spicy time = 15 name = "Spicy-pocket" diff --git a/code/modules/hydroponics/grown.dm b/code/modules/hydroponics/grown.dm index 330744ebf..5895c6de3 100644 --- a/code/modules/hydroponics/grown.dm +++ b/code/modules/hydroponics/grown.dm @@ -33,9 +33,6 @@ // This is for adminspawn or map-placed growns. They get the default stats of their seed type. seed = new seed() seed.adjust_potency(50-seed.potency) - else if(!seed) - stack_trace("Grown initialized without seed. Okay.") - return INITIALIZE_HINT_QDEL pixel_x = rand(-5, 5) pixel_y = rand(-5, 5) @@ -43,11 +40,13 @@ if(dried_type == -1) dried_type = src.type - for(var/datum/plant_gene/trait/T in seed.genes) - T.on_new(src, loc) - seed.prepare_result(src) - AddElement(/datum/element/item_scaling, TRANSFORM_USING_VARIABLE(seed.potency, 100) + 0.5, 1) //Makes the resulting produce's sprite larger or smaller based on potency! - add_juice() + if(seed) + for(var/datum/plant_gene/trait/T in seed.genes) + T.on_new(src, loc) + seed.prepare_result(src) + transform *= TRANSFORM_USING_VARIABLE(seed.potency, 100) + 0.5 //Makes the resulting produce's sprite larger or smaller based on potency! + add_juice() + /obj/item/reagent_containers/food/snacks/grown/proc/add_juice() diff --git a/code/modules/jobs/job_types/captain.dm b/code/modules/jobs/job_types/captain.dm index 61e7d291f..92652190c 100644 --- a/code/modules/jobs/job_types/captain.dm +++ b/code/modules/jobs/job_types/captain.dm @@ -65,7 +65,7 @@ Captain satchel = /obj/item/storage/backpack/satchel/cap duffelbag = /obj/item/storage/backpack/duffelbag/captain - implants = list(/obj/item/implant/mindshield, /obj/item/implant/kinaris) + implants = list(/obj/item/implant/mindshield) accessory = /obj/item/clothing/accessory/medal/gold/captain chameleon_extras = list(/obj/item/gun/energy/e_gun, /obj/item/stamp/captain) diff --git a/code/modules/jobs/job_types/security.dm b/code/modules/jobs/job_types/security.dm index 94bd75059..0a0c83508 100644 --- a/code/modules/jobs/job_types/security.dm +++ b/code/modules/jobs/job_types/security.dm @@ -62,7 +62,7 @@ Head of Security duffelbag = /obj/item/storage/backpack/duffelbag/sec box = /obj/item/storage/box/security - implants = list(/obj/item/implant/mindshield, /obj/item/implant/kinaris) + implants = list(/obj/item/implant/mindshield) chameleon_extras = list(/obj/item/gun/energy/e_gun/hos, /obj/item/stamp/hos) diff --git a/code/modules/mob/dead/new_player/login.dm b/code/modules/mob/dead/new_player/login.dm index c691b799d..acd966416 100644 --- a/code/modules/mob/dead/new_player/login.dm +++ b/code/modules/mob/dead/new_player/login.dm @@ -43,14 +43,7 @@ S.cd = "/" var/slot S["default_slot"] >> slot - var/differing_version_notification = 0 if(slot) S.cd = "/character[slot]" - var/slot_version = 0 - S["version"] >> slot_version - if(slot_version && slot_version < SAVEFILE_VERSION_MAX) - S.cd = "/" - S["new_differences_notification"] >> differing_version_notification - if(!differing_version_notification || differing_version_notification <= slot_version) - S["new_differences_notification"] << slot_version - to_chat(src, "There were recent changes with characters, and your savefiles are outdated. Your characters may not look the same depending on what changed.") + if(S["version"] < SAVEFILE_VERSION_MAX) + to_chat(src, "Your characters are outdated from recent updates. Please make sure if everything is within reasonable levels.") diff --git a/code/modules/mob/living/carbon/carbon.dm b/code/modules/mob/living/carbon/carbon.dm index c436e5808..168b31410 100644 --- a/code/modules/mob/living/carbon/carbon.dm +++ b/code/modules/mob/living/carbon/carbon.dm @@ -487,9 +487,6 @@ if(HAS_TRAIT(src, TRAIT_NOHUNGER)) return 1 - if(!has_mouth()) - return 1 - if(nutrition < 100 && !blood) if(message) visible_message("[src] dry heaves!", \ diff --git a/code/modules/mob/living/carbon/human/human.dm b/code/modules/mob/living/carbon/human/human.dm index 1765e6873..92ad4fa08 100644 --- a/code/modules/mob/living/carbon/human/human.dm +++ b/code/modules/mob/living/carbon/human/human.dm @@ -5,24 +5,30 @@ icon_state = "caucasian_m" appearance_flags = KEEP_TOGETHER|TILE_BOUND|PIXEL_SCALE|LONG_GLIDE - /mob/living/carbon/human/Initialize() add_verb(src, /mob/living/proc/mob_sleep) add_verb(src, /mob/living/proc/lay_down) time_initialized = world.time + //initialize limbs first create_bodyparts() + //initialize dna. for spawned humans; overwritten by other code create_dna(src) randomize_human(src) dna.initialize_dna() + if(dna.species) set_species(dna.species.type) + //initialise organs create_internal_organs() //most of it is done in set_species now, this is only for parent call physiology = new() + AddComponent(/datum/component/personal_crafting) + . = ..() + RegisterSignal(src, COMSIG_COMPONENT_CLEAN_ACT, /mob/living/carbon/human/clean_blood) diff --git a/code/modules/mob/living/carbon/human/species.dm b/code/modules/mob/living/carbon/human/species.dm index 287dd4d29..a036dbb7f 100644 --- a/code/modules/mob/living/carbon/human/species.dm +++ b/code/modules/mob/living/carbon/human/species.dm @@ -318,24 +318,15 @@ GLOBAL_LIST_EMPTY(roundstart_races) var/mob/living/carbon/human/H = C if(NOGENITALS in H.dna.species.species_traits) H.give_genitals(TRUE) //call the clean up proc to delete anything on the mob then return. + // EDIT ENDS - if(NOMOUTH in species_traits) - for(var/obj/item/bodypart/head/head in C.bodyparts) - head.mouth = FALSE - - /datum/species/proc/on_species_loss(mob/living/carbon/human/C, datum/species/new_species, pref_load) if(C.dna.species.exotic_bloodtype) if(!new_species.exotic_bloodtype) C.dna.blood_type = random_blood_type() else C.dna.blood_type = new_species.exotic_bloodtype - - if(NOMOUTH in species_traits) - for(var/obj/item/bodypart/head/head in C.bodyparts) - head.mouth = TRUE - if(DIGITIGRADE in species_traits) C.Digitigrade_Leg_Swap(TRUE) for(var/X in inherent_traits) @@ -511,7 +502,6 @@ GLOBAL_LIST_EMPTY(roundstart_races) var/list/standing = list() var/obj/item/bodypart/head/HD = H.get_bodypart(BODY_ZONE_HEAD) - H.handle_cosmetic_parts() if(HD && !(HAS_TRAIT(H, TRAIT_HUSK))) // lipstick @@ -604,7 +594,6 @@ GLOBAL_LIST_EMPTY(roundstart_races) //CITADEL EDIT - Do not forget to add this to relevent_layers list just above too! H.remove_overlay(BODY_TAUR_LAYER) //END EDIT - H.handle_cosmetic_parts() if(!mutant_bodyparts) return @@ -689,17 +678,21 @@ GLOBAL_LIST_EMPTY(roundstart_races) if("mam_tail" in mutant_bodyparts) if(H.wear_suit && (H.wear_suit.flags_inv & HIDETAUR) || (!H.dna.features["taur"] == "None")) bodyparts_to_add -= "mam_tail" + if("mam_waggingtail" in mutant_bodyparts) if(H.wear_suit && (H.wear_suit.flags_inv & HIDETAUR) || (!H.dna.features["taur"] == "None")) 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 & HIDEEARS) || (H.wear_mask && (H.wear_mask.flags_inv & HIDEEARS)) || !HD || HD.status == BODYPART_ROBOTIC) bodyparts_to_add -= "mam_ears" + if("mam_snouts" in mutant_bodyparts) //Take a closer look at that snout! if((H.wear_mask && (H.wear_mask.flags_inv & HIDESNOUT)) || (H.head && (H.head.flags_inv & HIDESNOUT)) || !HD || HD.status == BODYPART_ROBOTIC) bodyparts_to_add -= "mam_snouts" + if("taur" in mutant_bodyparts) if(!H.dna.features["taur"] || H.dna.features["taur"] == "None" || (H.wear_suit && (H.wear_suit.flags_inv & HIDETAUR))) bodyparts_to_add -= "taur" @@ -1654,8 +1647,8 @@ GLOBAL_LIST_EMPTY(roundstart_races) ) if (target.canbearoused) target.adjustArousalLoss(5) - if (HAS_TRAIT(target, TRAIT_MASO)) - target.mob_climax_instant() + if (target.getArousalLoss() >= 100 && ishuman(target) && HAS_TRAIT(target, TRAIT_MASO) && target.has_dna()) + target.mob_climax(forced_climax=TRUE) if (!HAS_TRAIT(target, TRAIT_NYMPHO)) stop_wagging_tail(target) @@ -2012,7 +2005,8 @@ GLOBAL_LIST_EMPTY(roundstart_races) H.update_damage_overlays() if(HAS_TRAIT(H, TRAIT_MASO)) H.adjustArousalLoss(damage * brutemod * H.physiology.brute_mod) - H.mob_climax_instant() + if (H.getArousalLoss() >= 100 && ishuman(H) && H.has_dna()) + H.mob_climax(forced_climax=TRUE) else//no bodypart, we deal damage with a more general method. H.adjustBruteLoss(damage * hit_percent * brutemod * H.physiology.brute_mod) diff --git a/code/modules/mob/living/carbon/human/update_icons.dm b/code/modules/mob/living/carbon/human/update_icons.dm index 6b68f3b8a..4c224a515 100644 --- a/code/modules/mob/living/carbon/human/update_icons.dm +++ b/code/modules/mob/living/carbon/human/update_icons.dm @@ -690,8 +690,6 @@ generate/load female uniform sprites matching all previously decided variables . += "-[BP.digitigrade_type]" if(BP.dmg_overlay_type) . += "-[BP.dmg_overlay_type]" - if(BP.cosmetic_icon) - . += "-cosm[BP.cosmetic_icon]" if(BP.body_markings) . += "-[BP.body_markings]" else diff --git a/code/modules/mob/living/carbon/life.dm b/code/modules/mob/living/carbon/life.dm index fc3c25c15..ca11c14d0 100644 --- a/code/modules/mob/living/carbon/life.dm +++ b/code/modules/mob/living/carbon/life.dm @@ -77,7 +77,8 @@ var/mob/living/carbon/human/B = src if(HAS_TRAIT(B, TRAIT_CHOKE_SLUT)) B.adjustArousalLoss(7) - B.mob_climax_instant() + if (B.getArousalLoss() >= 100 && ishuman(B) && B.has_dna()) + B.mob_climax(forced_climax=TRUE) else SEND_SIGNAL(src, COMSIG_ADD_MOOD_EVENT, "suffocation", /datum/mood_event/suffocation) else diff --git a/code/modules/mob/living/silicon/robot/robot_modules.dm b/code/modules/mob/living/silicon/robot/robot_modules.dm index cfafd99e9..585a882bb 100644 --- a/code/modules/mob/living/silicon/robot/robot_modules.dm +++ b/code/modules/mob/living/silicon/robot/robot_modules.dm @@ -200,10 +200,6 @@ INVOKE_ASYNC(RM, .proc/do_transform_animation) SEND_SIGNAL(R, COMSIG_CYBORG_MODULE_CHANGE) //hyperstation edit qdel(src) - //Skyrat change start - R.radio.extra_channels = RM.added_channels - R.radio.recalculateChannels() - //Skyrat change stop return RM /obj/item/robot_module/proc/be_transformed_to(obj/item/robot_module/old_module) diff --git a/code/modules/mob/login.dm b/code/modules/mob/login.dm index 3fc7e3c11..0d37b98c1 100644 --- a/code/modules/mob/login.dm +++ b/code/modules/mob/login.dm @@ -57,9 +57,7 @@ var/datum/callback/CB = foo CB.Invoke() - if(client.prefs) - mind?.hide_ckey = client.prefs.hide_ckey - client.fps = client.prefs.clientfps + mind?.hide_ckey = client?.prefs?.hide_ckey log_message("Client [key_name(src)] has taken ownership of mob [src]([src.type])", LOG_OWNERSHIP) SEND_SIGNAL(src, COMSIG_MOB_CLIENT_LOGIN, client) client.init_verbs() diff --git a/code/modules/power/apc.dm b/code/modules/power/apc.dm index ac9a37eb2..b291a295c 100644 --- a/code/modules/power/apc.dm +++ b/code/modules/power/apc.dm @@ -104,8 +104,6 @@ var/icon_update_needed = FALSE var/obj/machinery/computer/apc_control/remote_control = null - var/obj/effect/light/lighteffect //light effect - /obj/machinery/power/apc/unlocked locked = FALSE @@ -187,8 +185,6 @@ addtimer(CALLBACK(src, .proc/update), 5) /obj/machinery/power/apc/Destroy() - if(lighteffect) - lighteffect.Del() GLOB.apcs_list -= src if(malfai && operating) @@ -324,13 +320,6 @@ // And now, separately for cleanness, the lighting changing if(update_state & UPSTATE_ALLGOOD) - if(!lighteffect)//make the light - lighteffect = new/obj/effect/light - lighteffect.loc = src.loc - lighteffect.alpha = 50 - lighteffect.pixel_x = pixel_x - lighteffect.pixel_y = pixel_y - switch(charging) if(APC_NOT_CHARGING) light_color = LIGHT_COLOR_RED @@ -339,7 +328,6 @@ if(APC_FULLY_CHARGED) light_color = LIGHT_COLOR_GREEN set_light(lon_range) - lighteffect.color = light_color else if(update_state & UPSTATE_BLUESCREEN) light_color = LIGHT_COLOR_BLUE set_light(lon_range) @@ -348,10 +336,6 @@ icon_update_needed = FALSE -/obj/machinery/power/apc/Move() - if(lighteffect) - lighteffect.loc = src.loc //move the light overlay - /obj/machinery/power/apc/proc/check_updates() var/last_update_state = update_state var/last_update_overlay = update_overlay diff --git a/code/modules/power/lighting.dm b/code/modules/power/lighting.dm index 0db3695fc..39072d5b4 100644 --- a/code/modules/power/lighting.dm +++ b/code/modules/power/lighting.dm @@ -223,9 +223,6 @@ var/bulb_emergency_pow_mul = 0.75 // the multiplier for determining the light's power in emergency mode var/bulb_emergency_pow_min = 0.5 // the minimum value for the light's power in emergency mode - var/obj/effect/light/lighteffect //light effect - - /obj/machinery/light/broken status = LIGHT_BROKEN icon_state = "tube-broken" @@ -245,8 +242,6 @@ icon_state = "bulb-broken" /obj/machinery/light/Move() - if(lighteffect) - lighteffect.loc = src.loc if(status != LIGHT_BROKEN) break_light_tube(1) return ..() @@ -290,8 +285,6 @@ /obj/machinery/light/Destroy() var/area/A = get_area(src) - if(lighteffect) - lighteffect.Del() if(A) on = FALSE // A.update_lights() @@ -299,35 +292,24 @@ return ..() /obj/machinery/light/update_icon() - if(!lighteffect) //dont have a light bloom, make it. - lighteffect = new/obj/effect/light/large - lighteffect.loc = src.loc cut_overlays() switch(status) // set icon_states if(LIGHT_OK) var/area/A = get_area(src) if(emergency_mode || (A && A.fire)) icon_state = "[base_state]_emergency" - lighteffect.alpha = 0 else icon_state = "[base_state]" if(on) - lighteffect.alpha = CLAMP(light_power*35, 5, 100) - lighteffect.color = light_color var/mutable_appearance/glowybit = mutable_appearance(overlayicon, base_state, ABOVE_LIGHTING_LAYER, ABOVE_LIGHTING_PLANE) glowybit.alpha = CLAMP(light_power*250, 30, 200) add_overlay(glowybit) if(LIGHT_EMPTY) icon_state = "[base_state]-empty" - lighteffect.alpha = 0 if(LIGHT_BURNED) icon_state = "[base_state]-burned" - lighteffect.alpha = 0 if(LIGHT_BROKEN) icon_state = "[base_state]-broken" - lighteffect.alpha = 0 - if(!on) - lighteffect.alpha = 0 return // update the icon_state and luminosity of the light depending on its state diff --git a/code/modules/projectiles/guns/energy/kinetic_accelerator.dm b/code/modules/projectiles/guns/energy/kinetic_accelerator.dm index a3fe88a39..66073dbd1 100644 --- a/code/modules/projectiles/guns/energy/kinetic_accelerator.dm +++ b/code/modules/projectiles/guns/energy/kinetic_accelerator.dm @@ -266,7 +266,7 @@ icon_state = "modkit" w_class = WEIGHT_CLASS_SMALL require_module = 1 - module_type = list(/obj/item/robot_module/miner, /obj/item/robot_module/orepup) + module_type = /obj/item/robot_module/miner var/denied_type = null var/maximum_of_type = 1 var/cost = 30 diff --git a/code/modules/projectiles/projectile.dm b/code/modules/projectiles/projectile.dm index 65b86570c..63bd0bc52 100644 --- a/code/modules/projectiles/projectile.dm +++ b/code/modules/projectiles/projectile.dm @@ -197,10 +197,7 @@ L.visible_message("[L] is hit by \a [src][organ_hit_text]!", \ "[L] is hit by \a [src][organ_hit_text]!", null, COMBAT_MESSAGE_RANGE) if(candink && def_zone == BODY_ZONE_HEAD) - if(prob(2)) - playsound(src, 'hyperstation/sound/weapons/dinkalternate.ogg', 30, 0) - else - playsound(src, 'sound/weapons/dink.ogg', 30, 1) + playsound(src, 'sound/weapons/dink.ogg', 30, 1) L.on_hit(src) var/reagent_note diff --git a/code/modules/reagents/reagent_containers.dm b/code/modules/reagents/reagent_containers.dm index 150c9db70..6d93a5e13 100644 --- a/code/modules/reagents/reagent_containers.dm +++ b/code/modules/reagents/reagent_containers.dm @@ -65,12 +65,6 @@ var/who = (isnull(user) || eater == user) ? "your" : "[eater.p_their()]" to_chat(user, "You have to remove [who] [covered] first!") return 0 - if(!eater.has_mouth()) - if(eater == user) - to_chat(eater, "You have no mouth, and cannot eat.") - else - to_chat(user, "You can't feed [eater], because they have no mouth!") - return 0 return 1 /obj/item/reagent_containers/ex_act() diff --git a/code/modules/ruins/objects_and_mobs/sin_ruins.dm b/code/modules/ruins/objects_and_mobs/sin_ruins.dm index 5fba1aa4b..18e90b3a6 100644 --- a/code/modules/ruins/objects_and_mobs/sin_ruins.dm +++ b/code/modules/ruins/objects_and_mobs/sin_ruins.dm @@ -282,16 +282,16 @@ . = ..() if(.) return - if(chalice_taken) + if(chalice_taken == 1) to_chat(user, "You hear a voice in your head... \"My chalice has already been taken, dear. I cannot give you another...\"") return if(user.getArousalLoss() < 100) to_chat(user, "You hear a voice in your head... \"You are not horny enough to receive my blessing, dear~\"") return - var/mob/living/carbon/user_carbon = user - user_carbon.mob_climax_instant() - to_chat(user, "You hear a voice in your head... \"You are worthy of my blessing, dear~\"") - to_chat(user, "You feel overpowering pleasure surge through your entire body.") - var/A = new /obj/item/reagent_containers/chalice/lust - user.put_in_hands(A) - chalice_taken = TRUE \ No newline at end of file + if (ishuman(user) && user.has_dna()) + user.mob_climax(forced_climax=TRUE) + to_chat(user, "You hear a voice in your head... \"You are worth of my blessing dear~\"") + to_chat(user, "You feel overpowering pleasure surge through your entire body.") + var/A = new /obj/item/reagent_containers/chalice/lust + user.put_in_hands(A) + chalice_taken = 1 \ No newline at end of file diff --git a/code/modules/surgery/bodyparts/bodyparts.dm b/code/modules/surgery/bodyparts/bodyparts.dm index b0208f9db..4a1bc2113 100644 --- a/code/modules/surgery/bodyparts/bodyparts.dm +++ b/code/modules/surgery/bodyparts/bodyparts.dm @@ -44,13 +44,6 @@ var/skin_tone = "" var/body_gender = "" var/species_id = "" - /** - * HYPER: when getting the appearance of a limb, the game will check - * for `cosmetic_icon` first. if there is none, it will default back - * to `species_id`. this allows us to use custom body part types for - * each limb in character customization. - */ - var/datum/cosmetic_part/cosmetic_icon var/color_src var/base_bp_icon //Overrides the icon being used for this limb. This is mainly for downstreams, implemented and maintained as a favor in return for implementing synths. And also because should_draw_* for icon overrides was pretty messy. You're welcome. var/should_draw_gender = FALSE @@ -398,22 +391,12 @@ else body_markings = "plain" auxmarking = "plain" + markings_color = list(colorlist) + else body_markings = null auxmarking = null - if(cosmetic_icon && is_organic_limb()) - if(cosmetic_icon.icon) - base_bp_icon = cosmetic_icon.icon - use_digitigrade = cosmetic_icon.support_digitigrade ? use_digitigrade : NOT_DIGITIGRADE - color_src = cosmetic_icon.color_src ? cosmetic_icon.color_src : MUTCOLORS - if(!H.dna.features["cosmetic_markings"]) - body_markings = null - auxmarking = null - - if((MUTCOLORS in S.species_traits) || (MUTCOLORS_PARTSONLY in S.species_traits)) - markings_color = list(colorlist) - if(!dropping_limb && H.dna.check_mutation(HULK)) mutation_color = "00aa00" else @@ -453,11 +436,6 @@ var/image_dir = 0 var/icon_gender = (body_gender == FEMALE) ? "f" : "m" //gender of the icon, if applicable - var/is_husk = species_id == "husk" - - /// HYPER: allow for custom limb icons in character customization - var/has_cosmetic_state = !isnull(cosmetic_icon) && !isnull(cosmetic_icon.icon_state) - var/limb_style = has_cosmetic_state ? cosmetic_icon.icon_state : species_id if(dropped) image_dir = SOUTH @@ -486,7 +464,7 @@ if(animal_origin) if(is_organic_limb()) limb.icon = 'icons/mob/animal_parts.dmi' - if(is_husk) + if(species_id == "husk") limb.icon_state = "[animal_origin]_husk_[body_zone]" else limb.icon_state = "[animal_origin]_[body_zone]" @@ -501,21 +479,21 @@ if(is_organic_limb()) limb.icon = base_bp_icon || 'icons/mob/human_parts.dmi' if(should_draw_gender) - limb.icon_state = "[limb_style]_[body_zone]_[icon_gender]" + limb.icon_state = "[species_id]_[body_zone]_[icon_gender]" else if (use_digitigrade) if(base_bp_icon == DEFAULT_BODYPART_ICON_ORGANIC) //Compatibility hack for the current iconset. limb.icon_state = "digitigrade_[use_digitigrade]_[body_zone]" else - limb.icon_state = "[limb_style]_digitigrade_[use_digitigrade]_[body_zone]" + limb.icon_state = "[species_id]_digitigrade_[use_digitigrade]_[body_zone]" else - limb.icon_state = "[limb_style]_[body_zone]" + limb.icon_state = "[species_id]_[body_zone]" // Body markings if(body_markings) - if(is_husk) + if(species_id == "husk") marking = image('modular_citadel/icons/mob/markings_notmammals.dmi', "husk_[body_zone]", -MARKING_LAYER, image_dir) - else if(is_husk && use_digitigrade) + else if(species_id == "husk" && use_digitigrade) marking = image('modular_citadel/icons/mob/markings_notmammals.dmi', "husk_digitigrade_[use_digitigrade]_[body_zone]", -MARKING_LAYER, image_dir) else if(!use_digitigrade) @@ -530,10 +508,10 @@ // Citadel End if(aux_zone) - aux = image(limb.icon, "[limb_style]_[aux_zone]", -aux_layer, image_dir) + aux = image(limb.icon, "[species_id]_[aux_zone]", -aux_layer, image_dir) . += aux if(body_markings) - if(is_husk) + if(species_id == "husk") auxmarking = image('modular_citadel/icons/mob/markings_notmammals.dmi', "husk_[aux_zone]", -aux_layer, image_dir) else auxmarking = image(body_markings_icon, "[body_markings]_[aux_zone]", -aux_layer, image_dir) @@ -550,16 +528,16 @@ aux = image(limb.icon, "[aux_zone]", -aux_layer, image_dir) . += aux if(!isnull(auxmarking)) - if(is_husk) + if(species_id == "husk") auxmarking = image('modular_citadel/icons/mob/markings_notmammals.dmi', "husk_[aux_zone]", -aux_layer, image_dir) else auxmarking = image(body_markings_icon, "[body_markings]_[aux_zone]", -aux_layer, image_dir) . += auxmarking if(!isnull(body_markings)) - if(is_husk) + if(species_id == "husk") marking = image('modular_citadel/icons/mob/markings_notmammals.dmi', "husk_[body_zone]", -MARKING_LAYER, image_dir) - else if(is_husk && use_digitigrade) + else if(species_id == "husk" && use_digitigrade) marking = image('modular_citadel/icons/mob/markings_notmammals.dmi', "husk_digitigrade_[use_digitigrade]_[body_zone]", -MARKING_LAYER, image_dir) else if(!use_digitigrade) @@ -572,27 +550,20 @@ . += marking return - if(!color_src) - return - switch(color_src) - if(MUTCOLORS) - var/draw_color = mutation_color || species_color || (skin_tone && skintone2hex(skin_tone)) - if(draw_color) - limb.color = "#[draw_color]" - if(aux_zone) - aux.color = "#[draw_color]" - if(MATRIXED) - limb.color = list(markings_color) + if(color_src) //TODO - add color matrix support for base species limbs + var/draw_color = mutation_color || species_color || (skin_tone && skintone2hex(skin_tone)) + if(draw_color) + limb.color = "#[draw_color]" if(aux_zone) - aux.color = list(markings_color) + aux.color = "#[draw_color]" + if(!isnull(auxmarking)) + auxmarking.color = list(markings_color) - if(!isnull(auxmarking)) - auxmarking.color = list(markings_color) - if(!isnull(body_markings)) - if(is_husk) - marking.color = "#141414" - else - marking.color = list(markings_color) + if(!isnull(body_markings)) + if(species_id == "husk") + marking.color = "#141414" + else + marking.color = list(markings_color) /obj/item/bodypart/deconstruct(disassembled = TRUE) diff --git a/code/modules/surgery/bodyparts/head.dm b/code/modules/surgery/bodyparts/head.dm index 45f791b3c..a71cc199c 100644 --- a/code/modules/surgery/bodyparts/head.dm +++ b/code/modules/surgery/bodyparts/head.dm @@ -34,9 +34,6 @@ var/lip_color = "white" //If the head is a special sprite var/custom_head - - // if head has mouth; may depend on species - var/mouth = TRUE /obj/item/bodypart/head/can_dismember(obj/item/I) if(!((owner.stat == DEAD) || owner.InFullCritical())) diff --git a/code/modules/surgery/organs/stomach.dm b/code/modules/surgery/organs/stomach.dm index 1c45d5df6..afa991ca7 100644 --- a/code/modules/surgery/organs/stomach.dm +++ b/code/modules/surgery/organs/stomach.dm @@ -120,27 +120,6 @@ return owner.vomit(stun = FALSE) - -/obj/item/organ/stomach/synthliz - name = "synthliz stomach" +/obj/item/organ/stomach/ipc + name = "ipc stomach" icon_state = "stomach-ipc" - -// ipc power cell from oracle -/obj/item/organ/stomach/cell - name = "micro-cell" - icon_state = "microcell" - w_class = WEIGHT_CLASS_NORMAL - zone = BODY_ZONE_CHEST - slot = ORGAN_SLOT_STOMACH - status = ORGAN_ROBOTIC - attack_verb = list("assault and battery'd") - desc = "A micro-cell, for IPC use only. Do not swallow." - -/obj/item/organ/stomach/cell/emp_act(severity) - switch(severity) - if(1) - owner.nutrition = 50 - to_chat(owner, "Alert: Heavy EMP Detected. Rebooting power cell to prevent damage.") - if(2) - owner.nutrition = 250 - to_chat(owner, "Alert: EMP Detected. Cycling battery.") \ No newline at end of file diff --git a/code/modules/surgery/organs/vocal_cords.dm b/code/modules/surgery/organs/vocal_cords.dm index 7c6fe05ca..b2d19c586 100644 --- a/code/modules/surgery/organs/vocal_cords.dm +++ b/code/modules/surgery/organs/vocal_cords.dm @@ -581,7 +581,7 @@ for(var/V in listeners) var/mob/living/carbon/human/H = V if(H.canbearoused && H.has_dna() && HAS_TRAIT(H, TRAIT_NYMPHO)) // probably a redundant check but for good measure - H.mob_climax_instant() + H.mob_climax(forced_climax=TRUE) */ else if((findtext(message, family_friendly_words))) cooldown = COOLDOWN_MEME @@ -1123,7 +1123,7 @@ if(E.phase > 1) if(HAS_TRAIT(H, TRAIT_NYMPHO) && H.canbearoused && E.lewd) // probably a redundant check but for good measure addtimer(CALLBACK(GLOBAL_PROC, .proc/to_chat, H, "Your [E.enthrallGender] pushes you over the limit, overwhelming your body with pleasure."), 5) - H.mob_climax_instant() + H.mob_climax(forced_climax=TRUE) H.SetStun(20) H.setArousalLoss(H.min_arousal) E.resistanceTally = 0 //makes resistance 0, but resets arousal, resistance buildup is faster unaroused (massively so). diff --git a/code/modules/vending/autodrobe.dm b/code/modules/vending/autodrobe.dm index 4d8b21ac2..2dbaf5394 100644 --- a/code/modules/vending/autodrobe.dm +++ b/code/modules/vending/autodrobe.dm @@ -8,7 +8,8 @@ vend_reply = "Thank you for using AutoDrobe!" products = list(/obj/item/clothing/suit/chickensuit = 1, /obj/item/clothing/head/chicken = 1, - /obj/item/clothing/suit/hooded/wintercoat/corpus = 1, + /obj/item/clothing/suit/hooded/corpus = 1, + /obj/item/clothing/suit/hooded/corpus/c = 1, /obj/item/clothing/under/gladiator = 1, /obj/item/clothing/head/helmet/gladiator = 1, /obj/item/clothing/under/gimmick/rank/captain/suit = 1, @@ -111,9 +112,6 @@ /obj/item/clothing/head/wig/random = 3, /obj/item/clothing/suit/ran = 2, /obj/item/clothing/head/ran = 2, - /obj/item/clothing/suit/threepwoodjacket = 3, - /obj/item/clothing/under/threepwood = 2, - /obj/item/clothing/shoes/threepwoodboots = 1, /obj/item/clothing/under/vaultsuit = 3) contraband = list(/obj/item/clothing/suit/judgerobe = 1, /obj/item/clothing/head/powdered_wig = 1, @@ -122,26 +120,25 @@ /obj/item/clothing/glasses/sunglasses/blindfold = 1, /obj/item/clothing/mask/muzzle = 2) premium = list(/obj/item/clothing/suit/pirate/captain = 2, - /obj/item/clothing/head/pirate/captain = 2, - /obj/item/clothing/head/helmet/roman/fake = 1, - /obj/item/clothing/head/helmet/roman/legionnaire/fake = 1, - /obj/item/clothing/under/roman = 1, - /obj/item/clothing/shoes/roman = 1, - /obj/item/shield/riot/roman/fake = 1, - /obj/item/clothing/head/delinquent = 1, // One per vendor, please dear god don't mass produce these. - /obj/item/skub = 1, - /obj/item/clothing/under/lobster = 1, // CIT CHANGES - /obj/item/clothing/head/lobsterhat = 1, - /obj/item/clothing/head/drfreezehat = 1, - /obj/item/clothing/suit/dracula = 1, - /obj/item/clothing/suit/drfreeze_coat = 1, - /obj/item/clothing/suit/gothcoat = 2, - /obj/item/clothing/under/draculass = 1, - /obj/item/clothing/under/drfreeze = 1, //End of Cit Changes + /obj/item/clothing/head/pirate/captain = 2, + /obj/item/clothing/head/helmet/roman/fake = 1, + /obj/item/clothing/head/helmet/roman/legionnaire/fake = 1, + /obj/item/clothing/under/roman = 1, + /obj/item/clothing/shoes/roman = 1, + /obj/item/shield/riot/roman/fake = 1, + /obj/item/clothing/head/delinquent = 1, // One per vendor, please dear god don't mass produce these. + /obj/item/skub = 1, + /obj/item/clothing/under/lobster = 1, // CIT CHANGES + /obj/item/clothing/head/lobsterhat = 1, + /obj/item/clothing/head/drfreezehat = 1, + /obj/item/clothing/suit/dracula = 1, + /obj/item/clothing/suit/drfreeze_coat = 1, + /obj/item/clothing/suit/gothcoat = 2, + /obj/item/clothing/under/draculass = 1, + /obj/item/clothing/under/drfreeze = 1, //End of Cit Changes /obj/item/clothing/under/wedding_dress = 1, - /obj/item/clothing/under/tuxedo = 1, - /obj/item/clothing/suit/hooded/wintercoat/corpus/command = 1, - /obj/item/storage/belt/cummerbund = 1) + /obj/item/clothing/under/tuxedo = 1, + /obj/item/storage/belt/cummerbund = 1) refill_canister = /obj/item/vending_refill/autodrobe /obj/machinery/vending/autodrobe/all_access diff --git a/code/modules/vending/wardrobes.dm b/code/modules/vending/wardrobes.dm index 5f9dee9d4..0d1e1f3df 100644 --- a/code/modules/vending/wardrobes.dm +++ b/code/modules/vending/wardrobes.dm @@ -19,7 +19,7 @@ /obj/item/clothing/under/rank/security/skirt = 5, /obj/item/clothing/under/rank/security/grey = 5, /obj/item/clothing/under/pants/khaki = 5, - /obj/item/clothing/suit/hooded/wintercoat/corpus/sec = 5) + /obj/item/clothing/suit/hooded/corpus/s = 5) premium = list(/obj/item/clothing/under/rank/security/navyblue = 5, /obj/item/clothing/suit/security/officer = 5, /obj/item/clothing/head/beret/sec/navyofficer = 5, diff --git a/hyperstation/code/effects/lighting.dm b/hyperstation/code/effects/lighting.dm deleted file mode 100644 index 02e07bfcd..000000000 --- a/hyperstation/code/effects/lighting.dm +++ /dev/null @@ -1,18 +0,0 @@ -/obj/effect/light/ - name = "bloom" - icon = 'hyperstation/icons/effects/lighting.dmi' - icon_state = "light" - plane = ABOVE_LIGHTING_PLANE - blend_mode = BLEND_ADD - mouse_opacity = 0 - anchored = TRUE //no more flying around. - -/obj/effect/light/medium - icon = 'hyperstation/icons/effects/lightingmed.dmi' - pixel_x = -16 - pixel_y = -16 - -/obj/effect/light/large - icon = 'hyperstation/icons/effects/lightinglarge.dmi' - pixel_x = -48 - pixel_y = -48 \ No newline at end of file diff --git a/hyperstation/code/game/objects/items/devices/radio/radio.dm b/hyperstation/code/game/objects/items/devices/radio/radio.dm deleted file mode 100644 index 67ea054ff..000000000 --- a/hyperstation/code/game/objects/items/devices/radio/radio.dm +++ /dev/null @@ -1,2 +0,0 @@ -/obj/item/radio - var/list/extra_channels = list() //Allows indivudal channels, used for borgs diff --git a/hyperstation/code/game/objects/railings.dm b/hyperstation/code/game/objects/railings.dm index 8140ad908..2c01a1721 100644 --- a/hyperstation/code/game/objects/railings.dm +++ b/hyperstation/code/game/objects/railings.dm @@ -16,7 +16,6 @@ var/heat_resistance = 800 var/health = 70 var/maxhealth = 70 - layer = BELOW_MOB_LAYER resistance_flags = ACID_PROOF @@ -165,14 +164,6 @@ usr.visible_message("[user] climbed over \the [src]!") usr.do_twist(targetangle = 45, timer = 8) -/obj/structure/railing/Initialize(mapload) //mobs will show under the south railing sprite, thanks Cyanosis for helping with the fix - . = ..() - if(!mapload) - return - if(!(dir & SOUTH)) - return - layer = ABOVE_MOB_LAYER - /obj/structure/railing/handrail name = "handrail" desc = "A waist high handrail, perhaps you could climb over it." diff --git a/hyperstation/code/modules/arousal/arousalhud.dm b/hyperstation/code/modules/arousal/arousalhud.dm index 318edefd0..509438813 100644 --- a/hyperstation/code/modules/arousal/arousalhud.dm +++ b/hyperstation/code/modules/arousal/arousalhud.dm @@ -11,15 +11,7 @@ for(var/obj/item/organ/genital/G in U.internal_organs) if(!G.nochange) if(!G.dontlist) - var/genital_visibility = "[G.name] (Visible)" - switch(G.mode) - if(GENITALS_HIDDEN) - genital_visibility = "[G.name] (Hidden)" - if(GENITALS_CLOTHES) - genital_visibility = "[G.name] (Hidden by Clothes)" - if(GENITALS_VISIBLE) - genital_visibility = "[G.name] (Visible)" - dat += "[genital_visibility]" + dat += "[G.mode == "hidden" ? "[G.name] (Hidden)" : (G.mode == "clothes" ? "[G.name] (Hidden by Clothes)" : (G.mode == "visable" ? "[G.name] (Visable)" : "[G.name] (Visable)"))] " dat += {" Contexual Options "} var/obj/item/organ/genital/penis/P = user.getorganslot("penis") @@ -53,17 +45,20 @@ if(Belly.inflatable) dat += "Deflate belly" dat += "(Shrink your belly down a size) " - - if(user.pulling && !isnoncarbon(user.pulling)) // do not fuck animals + + + if(user.pulling) dat += "Climax over [user.pulling]" //you can cum on objects if you really want... dat += "(Orgasm over a person or object.) " - if(iscarbon(user.pulling)) - dat += "Climax with [user.pulling]" - dat += {"(Orgasm with another person.) "} - var/mob/living/carbon/human/H = user.pulling - if(H && H.breedable && P) - dat += "Impregnate [U.pulling] ([clamp(U.impregchance,0,100)]%)" - dat += "(Climax inside another person, and attempt to knock them up.) " + if(isliving(user.pulling)) + if(iscarbon(user.pulling)) + dat += "Climax with [user.pulling]" + dat += {"(Orgasm with another person.) "} + + var/mob/living/carbon/human/H = user.pulling + if(H.breedable && P && H) + dat += "Impregnate [U.pulling] ([clamp(U.impregchance,0,100)]%)" + dat += "(Climax inside another person, and attempt to knock them up.) " else dat += "Climax over" dat += "(Requires a partner) " @@ -86,9 +81,11 @@ dat += "Old Menu" dat += "Toggle Undergarments " dat += " " + var/datum/browser/popup = new(user, "arousal", "Arousal Panel") popup.set_content(dat) popup.set_title_image(user.browse_rsc_icon(icon, icon_state), 500,600) + popup.open() @@ -143,7 +140,7 @@ T.toggle_visibility(picked_visibility) if(href_list["masturbate"]) - if (H.isPercentAroused(33)) //requires 33% arousal. + if (H.arousalloss >= (H.max_arousal / 100) * 33) //requires 33% arousal. H.solomasturbate() return else @@ -151,7 +148,7 @@ return if(href_list["container"]) - if (H.isPercentAroused(33)) //requires 33% arousal. + if (H.arousalloss >= (H.max_arousal / 100) * 33) //requires 33% arousal. H.cumcontainer() return else @@ -159,7 +156,7 @@ return if(href_list["clothesplosion"]) - if (H.isPercentAroused(33)) //Requires 33% arousal. + if (H.arousalloss >= (H.max_arousal / 100) * 33) //Requires 33% arousal. H.clothesplosion() return else @@ -167,7 +164,7 @@ return if(href_list["climaxself"]) - if (H.isPercentAroused(33)) //requires 33% arousal. + if (H.arousalloss >= (H.max_arousal / 100) * 33) //requires 33% arousal. H.climaxself() return else @@ -175,7 +172,7 @@ return if(href_list["climax"]) - if (H.isPercentAroused(33)) //requires 33% arousal. + if (H.arousalloss >= (H.max_arousal / 100) * 33) //requires 33% arousal. H.climaxalone(FALSE) return else @@ -183,7 +180,7 @@ return if(href_list["climaxover"]) - if (H.isPercentAroused(33)) //requires 33% arousal. + if (H.arousalloss >= (H.max_arousal / 100) * 33) //requires 33% arousal. H.climaxover(usr.pulling) return else @@ -191,7 +188,7 @@ return if(href_list["climaxwith"]) - if (H.isPercentAroused(33)) //requires 33% arousal. + if (H.arousalloss >= (H.max_arousal / 100) * 33) //requires 33% arousal. H.climaxwith(usr.pulling) return else @@ -199,7 +196,7 @@ return if(href_list["impreg"]) - if (H.isPercentAroused(33)) //requires 33% arousal. + if (H.arousalloss >= (H.max_arousal / 100) * 33) //requires 33% arousal. H.impregwith(usr.pulling) return else @@ -334,7 +331,7 @@ obj/screen/arousal/proc/kiss() return //We got hands, let's pick an organ var/obj/item/organ/genital/picked_organ - picked_organ = pick_climax_genitals(masturbation=TRUE, title="Masturbation") + picked_organ = pick_masturbate_genitals() if(picked_organ) src << browse(null, "window=arousal") //closes the window mob_masturbate(picked_organ) @@ -368,31 +365,55 @@ obj/screen/arousal/proc/kiss() to_chat(src, "You cannot climax without choosing genitals.") return -/mob/living/carbon/human/proc/climaxwith(mob/living/carbon/human/partner) - if(!partner) - to_chat(src, "You cannot do this alone.") - return +/mob/living/carbon/human/proc/climaxwith(mob/living/T) + + var/mob/living/carbon/human/L = pick_partner() var/obj/item/organ/genital/picked_organ picked_organ = pick_climax_genitals() - if(!picked_organ) + if(picked_organ) + var/mob/living/partner = L + if(partner) + src << browse(null, "window=arousal") //alls fine, we can close the window now. + var/obj/item/organ/genital/penis/P = picked_organ + var/spillage = "No" //default to no, just incase player has items on to prevent climax + if(!P.condom == 1&&!P.sounding == 1) //you cant climax with a condom on or sounding in. + spillage = input(src, "Would your fluids spill outside?", "Choose overflowing option", "Yes") as anything in list("Yes", "No") + if(spillage == "Yes") + mob_climax_partner(picked_organ, partner, TRUE, FALSE, FALSE) + else + mob_climax_partner(picked_organ, partner, FALSE, FALSE, FALSE) + else + to_chat(src, "You cannot do this alone.") + return + else //They either lack organs that can masturbate, or they didn't pick one. to_chat(src, "You cannot climax without choosing genitals.") return - src << browse(null, "window=arousal") // close arousal window - mob_climax_inside_spillage(picked_organ, partner, impreg=FALSE) -/mob/living/carbon/human/proc/climaxover(atom/partner) + +/mob/living/carbon/human/proc/climaxover(mob/living/T) + + var/mob/living/carbon/human/L = T var/obj/item/organ/genital/picked_organ picked_organ = pick_climax_genitals() - if(!picked_organ) + if(picked_organ) + src << browse(null, "window=arousal") //alls fine, we can close the window now. + var/mob/living/partner = L + if(partner) + var/obj/item/organ/genital/penis/P = picked_organ + if(P.condom == 1) + to_chat(src, "You cannot do this action with a condom on.") + return + if(P.sounding == 1) + to_chat(src, "You cannot do this action with a sounding in.") + return + mob_climax_partner(picked_organ, partner, FALSE, FALSE, TRUE) + else + to_chat(src, "You cannot do this alone.") + return + else //They either lack organs that can masturbate, or they didn't pick one. to_chat(src, "You cannot climax without choosing genitals.") return - src << browse(null, "window=arousal") //alls fine, we can close the window now. - if(!partner || isnoncarbon(partner)) - to_chat(src, "You cannot do this alone.") - return - mob_climax_cover(picked_organ, partner) - /mob/living/carbon/human/proc/clothesplosion() if(usr.restrained(TRUE)) @@ -407,29 +428,39 @@ obj/screen/arousal/proc/kiss() H.visible_message("[H] explodes out of their clothes!'") -/mob/living/carbon/human/proc/impregwith(mob/living/carbon/T) - var/mob/living/carbon/human/partner = pick_partner() - var/obj/item/organ/genital/penis/picked_organ = src.getorganslot("penis") - // wow that is a lot of conditionals huh - if(!picked_organ) // no penis :( - to_chat(src, "You cannot impregnate someone without a penis.") - return - if(!partner) - to_chat(src, "You cannot do this alone.") - return - if(!partner.breedable) //check if impregable. - to_chat(src, "Your partner cannot be impregnated.") - //some fuckery happening, you shouldnt even get to this point tbh. - return - if(picked_organ.condom) - to_chat(src, "You cannot impregnate someone with a condom on.") - return - if(picked_organ.sounding) - to_chat(src, "You cannot impregnate someone with a sounding rod in.") - return - src << browse(null, "window=arousal") //alls fine, we can close the window now. - mob_climax_inside_spillage(picked_organ, partner, impreg=TRUE) +/mob/living/carbon/human/proc/impregwith(mob/living/T) + + var/mob/living/carbon/human/L = pick_partner() + var/obj/item/organ/genital/picked_organ + picked_organ = src.getorganslot("penis") //Impregnation must be done with a penis. + if(picked_organ) + var/mob/living/partner = L + if(partner) + if(!partner.breedable)//check if impregable. + to_chat(src, "Your partner cannot be impregnated.")//some fuckary happening, you shouldnt even get to this point tbh. + return + var/obj/item/organ/genital/penis/P = picked_organ + //you cant impreg with a condom on or sounding in. + if(P.condom == 1) + to_chat(src, "You cannot do this action with a condom on.") + return + if(P.sounding == 1) + to_chat(src, "You cannot do this action with a sounding in.") + return + src << browse(null, "window=arousal") //alls fine, we can close the window now. + //Keeping this for messy fun + var/spillage = input(src, "Would your fluids spill outside?", "Choose overflowing option", "Yes") as anything in list("Yes", "No") + if(spillage == "Yes") + mob_climax_partner(picked_organ, partner, TRUE, TRUE, FALSE) + else + mob_climax_partner(picked_organ, partner, FALSE, TRUE, FALSE) + else + to_chat(src, "You cannot do this alone.") + return + else //no penis :( + to_chat(src, "You cannot impregnate without a penis.") + return /mob/living/carbon/human/proc/cumcontainer(mob/living/T) //We'll need hands and no restraints. @@ -469,11 +500,6 @@ obj/screen/arousal/proc/kiss() cum_splatter_icon.Blend(icon('hyperstation/icons/effects/cumoverlay.dmi', "cum_obj"), ICON_MULTIPLY) add_overlay(cum_splatter_icon) -/mob/living/carbon/add_cum_overlay(type="normal") - var/mutable_appearance/cumoverlay = mutable_appearance('hyperstation/icons/effects/cumoverlay.dmi') - cumoverlay.icon_state = "cum_[type]" - add_overlay(cumoverlay) - /atom/proc/wash_cum() cut_overlay(mutable_appearance('hyperstation/icons/effects/cumoverlay.dmi', "cum_normal")) cut_overlay(mutable_appearance('hyperstation/icons/effects/cumoverlay.dmi', "cum_large")) @@ -497,7 +523,7 @@ obj/screen/arousal/proc/kiss() return //We got hands, let's pick an organ var/obj/item/organ/genital/picked_organ - picked_organ = pick_climax_genitals(masturbation=TRUE, title="Masturbation") + picked_organ = pick_masturbate_genitals() if(picked_organ) src << browse(null, "window=arousal") //closes the window mob_masturbate(picked_organ, cover = TRUE) diff --git a/hyperstation/code/modules/arousal/organs/genitals.dm b/hyperstation/code/modules/arousal/organs/genitals.dm deleted file mode 100644 index 9da552021..000000000 --- a/hyperstation/code/modules/arousal/organs/genitals.dm +++ /dev/null @@ -1,6 +0,0 @@ -/obj/item/organ/genital/proc/get_fluid_source() - if(producing) - return src.reagents - if(linked_organ && linked_organ.producing) - return linked_organ.reagents - return null \ No newline at end of file diff --git a/hyperstation/code/modules/cargo/packs/misc.dm b/hyperstation/code/modules/cargo/packs/misc.dm index 21eb315b2..d1b88903f 100644 --- a/hyperstation/code/modules/cargo/packs/misc.dm +++ b/hyperstation/code/modules/cargo/packs/misc.dm @@ -5,31 +5,3 @@ contains = list(/obj/item/polepack/, /obj/item/wrench/) crate_name = "stripper pole crate" - -/datum/supply_pack/organic/donkpockets - name = "Donkpocket Shipment" - desc = "We at Donk corp provide a wide five selection of holovid ready dinner pockets for all your dietary needs from extra-cheese to vegan to even mothpeople. Product of Donk co." - cost = 1500 - contains = list() - crate_name = "Donk Crate" - crate_type = /obj/structure/closet/crate/freezer - var/num_contained = 5 - //Put the types you want to contain inside this list below. - var/can_contain = list( /obj/item/storage/box/donkpockets, - /obj/item/storage/box/donkpockets/donkpockettaco, - /obj/item/storage/box/donkpockets/donkpocketplasma, - /obj/item/storage/box/donkpockets/donkpocketbreakfast, - /obj/item/storage/box/donkpockets/donkpocketmoth, - /obj/item/storage/box/donkpockets/donkpocketvegan, - /obj/item/storage/box/donkpockets/donkpocketspicy, - /obj/item/storage/box/donkpockets/donkpocketteriyaki, - /obj/item/storage/box/donkpockets/donkpocketpizza, - /obj/item/storage/box/donkpockets/donkpocketberry, - /obj/item/storage/box/donkpockets/donkpockethonk - ) - -/datum/supply_pack/organic/donkpockets/fill(obj/structure/closet/crate/C) - contains = list() - for(var/i = 0; i < num_contained; i++) - contains += pick(can_contain) - . = ..() \ No newline at end of file diff --git a/hyperstation/code/modules/client/hyper_pref_savefile.dm b/hyperstation/code/modules/client/hyper_pref_savefile.dm deleted file mode 100644 index a0a71216b..000000000 --- a/hyperstation/code/modules/client/hyper_pref_savefile.dm +++ /dev/null @@ -1,36 +0,0 @@ -/datum/preferences/proc/hyper_character_pref_load(savefile/S) - S["feature_cosmetic_head"] >> features["cosmetic_head"] - S["feature_cosmetic_chest"] >> features["cosmetic_chest"] - S["feature_cosmetic_l_arm"] >> features["cosmetic_l_arm"] - S["feature_cosmetic_r_arm"] >> features["cosmetic_r_arm"] - S["feature_cosmetic_l_leg"] >> features["cosmetic_l_leg"] - S["feature_cosmetic_r_leg"] >> features["cosmetic_r_leg"] - S["cosmetic_markings"] >> features["cosmetic_markings"] - var/cosmetic_head = sanitize_inlist(features["cosmetic_head"], GLOB.cosmetic_heads, "default") - var/cosmetic_chest = sanitize_inlist(features["cosmetic_chest"], GLOB.cosmetic_chests, "default") - var/cosmetic_l_arm = sanitize_inlist(features["cosmetic_l_arm"], GLOB.cosmetic_arms, "default") - var/cosmetic_r_arm = sanitize_inlist(features["cosmetic_r_arm"], GLOB.cosmetic_arms, "default") - var/cosmetic_l_leg = sanitize_inlist(features["cosmetic_l_leg"], GLOB.cosmetic_legs, "default") - var/cosmetic_r_leg = sanitize_inlist(features["cosmetic_r_leg"], GLOB.cosmetic_legs, "default") - features["cosmetic_head"] = GLOB.cosmetic_heads[cosmetic_head] - features["cosmetic_chest"] = GLOB.cosmetic_chests[cosmetic_chest] - features["cosmetic_l_arm"] = GLOB.cosmetic_arms[cosmetic_l_arm] - features["cosmetic_r_arm"] = GLOB.cosmetic_arms[cosmetic_r_arm] - features["cosmetic_l_leg"] = GLOB.cosmetic_legs[cosmetic_l_leg] - features["cosmetic_r_leg"] = GLOB.cosmetic_legs[cosmetic_r_leg] - - -/datum/preferences/proc/hyper_character_pref_save(savefile/S) - var/datum/cosmetic_part/head = features["cosmetic_head"] - var/datum/cosmetic_part/chest = features["cosmetic_chest"] - var/datum/cosmetic_part/l_arm = features["cosmetic_l_arm"] - var/datum/cosmetic_part/r_arm = features["cosmetic_r_arm"] - var/datum/cosmetic_part/l_leg = features["cosmetic_l_leg"] - var/datum/cosmetic_part/r_leg = features["cosmetic_r_leg"] - WRITE_FILE(S["feature_cosmetic_head"], head.id) - WRITE_FILE(S["feature_cosmetic_chest"], chest.id) - WRITE_FILE(S["feature_cosmetic_l_arm"], l_arm.id) - WRITE_FILE(S["feature_cosmetic_r_arm"], r_arm.id) - WRITE_FILE(S["feature_cosmetic_l_leg"], l_leg.id) - WRITE_FILE(S["feature_cosmetic_r_leg"], r_leg.id) - WRITE_FILE(S["cosmetic_markings"], features["cosmetic_markings"]) \ No newline at end of file diff --git a/hyperstation/code/modules/clothing/suits/misc.dm b/hyperstation/code/modules/clothing/suits/misc.dm index 0793aaa26..31ef1643f 100644 --- a/hyperstation/code/modules/clothing/suits/misc.dm +++ b/hyperstation/code/modules/clothing/suits/misc.dm @@ -21,43 +21,4 @@ name = "\improper Hellraider's Vest" desc = "An open leather vest with battlescarred metal shoulderpads, discovered in a dimensional anomaly. Smells of gunpowder and plasma." icon_state = "guncaster_alt" - item_state = "guncaster_alt" - -/* - * Posshim's Corpus atire - */ - //Making this a subset of wintercoats/winterhoods since poss intends it to have wintercoat stats --Archie - -/obj/item/clothing/suit/hooded/wintercoat/corpus - name = "Standard Voidsuit" - desc = "Standard issue voidsuit in the name of Grofit!" - icon_state = "corpus" - item_state = "armor" - body_parts_covered = CHEST|GROIN|LEGS|ARMS|FEET|HANDS - hoodtype = /obj/item/clothing/head/hooded/winterhood/corpus - flags_inv = HIDEGLOVES|HIDESHOES|HIDEJUMPSUIT //"Hide shoes" but digi shoes dont get hidden, too bad! - mutantrace_variation = NO_MUTANTRACE_VARIATION //There is no need for a digi variant, it's a costume - -/obj/item/clothing/suit/hooded/wintercoat/corpus/sec - name = "Enforcer Voidsuit" - desc = "Delux issue grofit voidsuit. Let the middle class know You're in charge." - icon_state = "corpuss" - hoodtype = /obj/item/clothing/head/hooded/winterhood/corpus/sec //Enjoy this nice red outfit Kinaris! There is NO NEED for a pink one! xoxo -VivI Fanteriso - -/obj/item/clothing/suit/hooded/wintercoat/corpus/command - name = "Commander Voidsuit" - desc = "Premium issue correctional worker attire. Grease the gears of production." - icon_state = "corpusc" - hoodtype = /obj/item/clothing/head/hooded/winterhood/corpus/command - -/obj/item/clothing/head/hooded/winterhood/corpus - name = "Voidsuit helmet" - desc = "galvanized reinforced helm to protect against the elements" - icon_state = "corpus" - flags_inv = HIDEHAIR|HIDEEARS|HIDEFACIALHAIR|HIDEFACE|HIDEMASK|HIDESNOUT|HIDENECK //hide your ugly face with this one simple trick! - -/obj/item/clothing/head/hooded/winterhood/corpus/sec - icon_state = "corpuss" - -/obj/item/clothing/head/hooded/winterhood/corpus/command - icon_state = "corpusc" \ No newline at end of file + item_state = "guncaster_alt" \ No newline at end of file diff --git a/hyperstation/code/modules/mob/dead/new_player/cosmetic_parts.dm b/hyperstation/code/modules/mob/dead/new_player/cosmetic_parts.dm deleted file mode 100644 index a08db8726..000000000 --- a/hyperstation/code/modules/mob/dead/new_player/cosmetic_parts.dm +++ /dev/null @@ -1,154 +0,0 @@ -/* -COSMETIC PARTS - -this system allows you to change the _base_ appearance of a limb independent -of species or markings. this, for example, allows us to create "hybrids" like a -mammal with avian legs. - -keep in mind that this does not change the species of a leg! in the above example, -the mammal's bird-legs are still mammal legs. this matters in some places, like -body part transplants; mis-matched species will cause extra damage if the surgery -fails and the part is rejected. so you can't attach mammal-bird legs to avians -safely. -*/ - -/datum/cosmetic_part - /** A unique string that is used to identify this part for save files. Allows name changes without breaking saves */ - var/id - /** The name of the cosmetic part. This shows up in the preferences dropdown. */ - var/name - var/icon = 'hyperstation/icons/mob/char_parts.dmi' - var/icon_state - /** How colors are determined for this part. MUTCOLORS for base color, MATRIXED to allow multiple channels. */ - var/color_src = MUTCOLORS - /** Whether or not this cosmetic part has an alternate form for digitigrade legs. */ - var/support_digitigrade = TRUE - /** Species IDs that support this cosmetic part. Bypassed with "show mismatched markings" option. */ - var/list/supported_species - -/datum/cosmetic_part/head -/datum/cosmetic_part/chest -/datum/cosmetic_part/arms -/datum/cosmetic_part/legs - -// HEADS -// ========================================= - -/datum/cosmetic_part/head/default - id = "default" - name = "default" - icon = null - -/datum/cosmetic_part/head/ipc_round - id = "ipc_round" - name = "round ipc head" - icon_state = "ipc_round" - supported_species = list("ipc") - - -// CHESTS -// ========================================= - -/datum/cosmetic_part/chest/default - id = "default" - name = "default" - icon = null - -/datum/cosmetic_part/chest/ipc_sleek - id = "ipc_sleek" - name = "sleek ipc chest" - icon_state = "ipc_sleek" - supported_species = list("ipc") - color_src = MATRIXED - -/datum/cosmetic_part/chest/ipc_jointed - id = "ipc_jointed" - name = "jointed ipc chest" - icon_state = "ipc_jointed" - supported_species = list("ipc") - color_src = MATRIXED - - -// ARMS -// ========================================= - -/datum/cosmetic_part/arms/default - id = "default" - name = "default" - icon = null - -/datum/cosmetic_part/arms/avian_alt - id = "avian_alt" - name = "avian claws" - icon_state = "avian_alt" - supported_species = list("mammal", "avian", "aquatic", "insect", "xeno", "synthliz") - -/datum/cosmetic_part/arms/insect - id = "insect" - name = "insect arms" - icon = 'modular_citadel/icons/mob/mutant_bodyparts.dmi' - icon_state = "insect" - supported_species = list("mammal", "avian", "aquatic", "insect", "xeno", "synthliz") - -/datum/cosmetic_part/arms/ipc_sleek - id = "ipc_sleek" - name = "sleek ipc arms" - icon_state = "ipc_sleek" - supported_species = list("ipc") - color_src = MATRIXED - -/datum/cosmetic_part/arms/ipc_jointed - id = "ipc_jointed" - name = "jointed ipc arms" - icon_state = "ipc_jointed" - supported_species = list("ipc") - color_src = MATRIXED - - -// LEGS -// ========================================= - -/datum/cosmetic_part/legs/default - id = "default" - name = "default" - icon = null - -/datum/cosmetic_part/legs/avian - id = "avian" - name = "avian legs" - icon = 'modular_citadel/icons/mob/mutant_bodyparts.dmi' - icon_state = "avian" - supported_species = list("mammal", "avian", "aquatic", "insect", "xeno", "synthliz") - support_digitigrade = FALSE - -/datum/cosmetic_part/legs/mammal - id = "mammal" - name = "mammal legs" - icon = 'modular_citadel/icons/mob/mutant_bodyparts.dmi' - icon_state = "mammal" - supported_species = list("mammal", "avian", "aquatic", "insect", "xeno", "synthliz") - support_digitigrade = TRUE - -/datum/cosmetic_part/legs/insect - id = "insect" - name = "insect legs" - icon = 'modular_citadel/icons/mob/mutant_bodyparts.dmi' - icon_state = "insect" - supported_species = list("mammal", "avian", "aquatic", "insect", "xeno", "synthliz") - support_digitigrade = TRUE - -/datum/cosmetic_part/legs/ipc_sleek - id = "ipc_sleek" - name = "sleek ipc legs" - icon_state = "ipc_sleek" - supported_species = list("ipc") - color_src = MATRIXED - support_digitigrade = FALSE - -/datum/cosmetic_part/legs/ipc_jointed - id = "ipc_jointed" - name = "jointed ipc legs" - icon_state = "ipc_jointed" - supported_species = list("ipc") - color_src = MATRIXED - support_digitigrade = FALSE \ No newline at end of file diff --git a/hyperstation/code/modules/mob/dead/new_player/sprite_accessories.dm b/hyperstation/code/modules/mob/dead/new_player/sprite_accessories.dm index 34dc50426..f76d2ddf0 100644 --- a/hyperstation/code/modules/mob/dead/new_player/sprite_accessories.dm +++ b/hyperstation/code/modules/mob/dead/new_player/sprite_accessories.dm @@ -87,11 +87,6 @@ SNOUTS icon_state = "feasterndnw" icon = 'hyperstation/icons/mob/char_snouts.dmi' -/datum/sprite_accessory/mam_snouts/knshuttle // Dahlular and Arcstaisia @ hyperstation, april 2022. Feel free to remove comment. Just remember this is snowflakey Kinaris stuff. - name = "Kinaris - Shuttle (Hyper)" - icon_state = "knshuttle" - icon = 'hyperstation/icons/mob/char_snouts.dmi' - /datum/sprite_accessory/mam_snouts/fchemlight name = "RadDog (Top) (Hyper)" icon_state = "fchemlight" @@ -148,11 +143,6 @@ EARS icon_state = "easternd" icon = 'hyperstation/icons/mob/char_ears.dmi' -/datum/sprite_accessory/mam_ears/knshuttle // Dahlular and Arcstaisia @ hyperstation, april 2022. Feel free to remove comment. Just remember this is snowflakey Kinaris stuff. - name = "Kinaris - Shuttle (Hyper)" - icon_state = "knshuttle" - icon = 'hyperstation/icons/mob/char_ears.dmi' - /datum/sprite_accessory/mam_ears/chemlight name = "RadDog (Hyper)" icon_state = "chemlight" @@ -195,13 +185,6 @@ WINGS icon_state = "insect" icon = 'hyperstation/icons/mob/char_wings.dmi' -/datum/sprite_accessory/deco_wings/knshuttle // Dahlular and Arcstaisia @ hyperstation, april 2022. Feel free to remove comment. Just remember this is snowflakey Kinaris stuff. - name = "Kinaris - Shuttle (Hyper)" - icon_state = "knshuttle" - icon = 'hyperstation/icons/mob/char_wings.dmi' - //recommended_species = list("synthliz") need to give synths a deco wing slot - color_src = MATRIXED - /datum/sprite_accessory/deco_wings/minibat // sarcoph @ hyperstation, march 2022 name = "Mini Bat (Hyper)" icon_state = "minibat" @@ -341,18 +324,6 @@ TAILS + ANIMATED TAILS icon_state = "easternd" icon = 'hyperstation/icons/mob/char_tails.dmi' -/datum/sprite_accessory/mam_tails/knshuttle // Dahlular and Arcstaisia @ hyperstation, april 2022. Feel free to remove comment. Just remember this is snowflakey Kinaris stuff. - name = "Kinaris - Shuttle (Hyper)" - icon_state = "knshuttle" - icon = 'hyperstation/icons/mob/char_tails.dmi' - recommended_species = list("synthliz") - -/datum/sprite_accessory/mam_tails_animated/knshuttle - name = "Kinaris - Shuttle (Hyper)" - icon_state = "knshuttle" - icon = 'hyperstation/icons/mob/char_tails.dmi' - recommended_species = list("synthliz") - /datum/sprite_accessory/mam_tails/chemlight name = "RadDog (Hyper)" icon_state = "chemlight" @@ -427,11 +398,6 @@ from modular_citadel/code/modules/mob/dead/new_player/sprite_accessories.dm: icon_state = "easternd" icon = 'hyperstation/icons/mob/char_markings.dmi' -/datum/sprite_accessory/mam_body_markings/knshuttle // Dahlular and Arcstaisia @ hyperstation, april 2022. Feel free to remove comment. Just remember this is snowflakey Kinaris stuff. - name = "Kinaris - Shuttle (Hyper)" - icon_state = "knshuttle" - icon = 'hyperstation/icons/mob/char_markings.dmi' - //doged was here /datum/sprite_accessory/mam_body_markings/chemlight name = "RadDog (Hyper)" @@ -475,92 +441,6 @@ from modular_citadel/code/modules/mob/dead/new_player/sprite_accessories.dm: taur_mode = PAW_TAURIC ckeys_allowed = list("chemlight") - -/* -IPCS -========================================================== -*/ - -/* -from modular_citadel/code/modules/mob/dead/new_player/sprite_accessories.dm: - -/datum/sprite_accessory/antenna - icon = 'modular_citadel/icons/mob/ipc_antennas.dmi' - color_src = MUTCOLORS3 - recommended_species = list("ipc") - -/datum/sprite_accessory/screen - icon = 'modular_citadel/icons/mob/ipc_screens.dmi' - color_src = null -*/ - -/datum/sprite_accessory/antenna/idog_down - name = "Dog, down (Hyper)" - icon_state = "idog_down" - color_src = MATRIXED - -/datum/sprite_accessory/antenna/idog_up - name = "Dog, up (Hyper)" - icon_state = "idog_up" - color_src = MATRIXED - -/datum/sprite_accessory/antenna/headset - name = "Headphones (Hyper)" - icon_state = "headset" - color_src = MATRIXED - -/datum/sprite_accessory/antenna/aquatic - name = "Fins (Hyper)" - icon_state = "aquatic" - color_src = MATRIXED - -/datum/sprite_accessory/screen/ghost - name = "Ghost (Hyper)" - icon_state = "ghost" - -/datum/sprite_accessory/screen/heartbeat - name = "Heartbeat (Hyper)" - icon_state = "heartbeat" - -/datum/sprite_accessory/screen/ocean - name = "Ocean (Hyper)" - icon_state = "ocean" - -/datum/sprite_accessory/antenna/catears - name = "Pointy Ears (Hyper)" - icon_state = "catears" - color_src = MATRIXED - -/datum/sprite_accessory/screen/valley - name = "Valley (Hyper)" - icon_state = "valley" - -/datum/sprite_accessory/screen/visor - name = "Black Visor (Hyper)" - icon = 'hyperstation/icons/mob/ipc_screen_visor.dmi' - icon_state = "visor_black" - -/datum/sprite_accessory/screen/visor/blue - name = "Blue Visor (Hyper)" - icon_state = "visor_blue" - -/datum/sprite_accessory/screen/visor/green - name = "Green Visor (Hyper)" - icon_state = "visor_green" - -/datum/sprite_accessory/screen/visor/red - name = "Red Visor (Hyper)" - icon_state = "visor_red" - -/datum/sprite_accessory/screen/visor/white - name = "White Visor (Hyper)" - icon_state = "visor_white" - -/datum/sprite_accessory/screen/visor/yellow - name = "Yellow Visor (Hyper)" - icon_state = "visor_yellow" - - /* HAIRSTYLES ========================================================== @@ -600,4 +480,4 @@ from code/modules/mob/dead/new_player/sprite_accessories/hair_head.dm: /datum/sprite_accessory/hair/emoh name = "Emo (Hyper)" - icon_state = "hair_emoh" + icon_state = "hair_emoh" \ No newline at end of file diff --git a/hyperstation/code/modules/mob/living/carbon/carbon.dm b/hyperstation/code/modules/mob/living/carbon/carbon.dm index 3af2e9447..ec2f69c1d 100644 --- a/hyperstation/code/modules/mob/living/carbon/carbon.dm +++ b/hyperstation/code/modules/mob/living/carbon/carbon.dm @@ -13,11 +13,6 @@ /mob/living/carbon/handle_status_effects() ..() handle_pain() - -/mob/living/carbon/has_mouth() - var/obj/item/bodypart/head/head = get_bodypart(BODY_ZONE_HEAD) - if(head && head.mouth) - return TRUE /mob/living/carbon/proc/handle_pain() var/pain_amount = 0 diff --git a/hyperstation/code/modules/mob/living/carbon/human/cosmetic_part_handler.dm b/hyperstation/code/modules/mob/living/carbon/human/cosmetic_part_handler.dm deleted file mode 100644 index 25b93526f..000000000 --- a/hyperstation/code/modules/mob/living/carbon/human/cosmetic_part_handler.dm +++ /dev/null @@ -1,17 +0,0 @@ -/obj/item/bodypart/proc/apply_cosmetic(datum/cosmetic_part/part) - if(!is_organic_limb() || animal_origin || !part) - return - cosmetic_icon = part - - -/mob/living/carbon/human/proc/handle_cosmetic_parts() - var/features = dna.features - var/list/body_zones = list(BODY_ZONE_HEAD, BODY_ZONE_CHEST, BODY_ZONE_L_ARM, BODY_ZONE_R_ARM, BODY_ZONE_L_LEG, BODY_ZONE_R_LEG) - for(var/zone in body_zones) - var/datum/cosmetic_part/cosmetic_pref = features["cosmetic_" + zone] - if(!istype(cosmetic_pref, /datum/cosmetic_part)) - continue - var/datum/cosmetic_part/part = cosmetic_pref - var/obj/item/bodypart/body_part = get_bodypart(zone) - if(body_part && part) - body_part.apply_cosmetic(part) \ No newline at end of file diff --git a/hyperstation/code/modules/mob/living/carbon/human/species_types/ipc.dm b/hyperstation/code/modules/mob/living/carbon/human/species_types/ipc.dm deleted file mode 100644 index b3e22f9ef..000000000 --- a/hyperstation/code/modules/mob/living/carbon/human/species_types/ipc.dm +++ /dev/null @@ -1,58 +0,0 @@ -// APC powercord: oracle port - -/obj/item/apc_powercord - name = "power cord" - desc = "An internal power cord hooked up to a battery. Useful if you run on electricity. Not so much otherwise." - icon = 'icons/obj/power.dmi' - icon_state = "wire1" - - -/obj/item/apc_powercord/afterattack(atom/target, mob/user, proximity_flag, click_parameters) - if(!istype(target, /obj/machinery/power/apc) || !ishuman(user) || !proximity_flag) - return ..() - user.changeNext_move(CLICK_CD_MELEE) - var/mob/living/carbon/human/H = user - var/obj/item/organ/stomach/cell/battery = H.getorganslot(ORGAN_SLOT_STOMACH) - if(!battery) - to_chat(H, "You try to siphon energy from \the [target], but your power cell is gone!") - return - - if(istype(H) && H.nutrition >= NUTRITION_LEVEL_ALMOST_FULL) - to_chat(user, "You are already fully charged!") - return - - if(istype(target, /obj/machinery/power/apc)) - var/obj/machinery/power/apc/A = target - if(A.cell && A.cell.charge > A.cell.maxcharge*0.25) - powerdraw_loop(A, H) - return - else - to_chat(user, "There is not enough charge to draw from that APC.") - return - - -/obj/item/apc_powercord/proc/powerdraw_loop(obj/machinery/power/apc/A, mob/living/carbon/human/H) - H.visible_message("[H] inserts a power connector into the [A].", "You begin to draw power from the [A].") - while(do_after(H, 10, target = A)) - if(!istype(A)) - return - if(loc != H) - to_chat(H, "You must keep your connector out while charging!") - break - if(A.cell.charge == 0) - to_chat(H, "The [A] doesn't have enough charge to spare.") - break - A.charging = 1 - if(A.cell.charge >= 500) - H.nutrition += 50 - A.cell.charge -= 250 - to_chat(H, "You siphon off some of the stored charge for your own use.") - else - H.nutrition += A.cell.charge/10 - A.cell.charge = 0 - to_chat(H, "You siphon off as much as the [A] can spare.") - break - if(H.nutrition > NUTRITION_LEVEL_WELL_FED) - to_chat(H, "You are now fully charged.") - break - H.visible_message("[H] unplugs from the [A].", "You unplug from the [A].") \ No newline at end of file diff --git a/hyperstation/code/modules/mob/living/silicon/robot/examine_vr.dm b/hyperstation/code/modules/mob/living/silicon/robot/examine_vr.dm deleted file mode 100644 index f3b04a440..000000000 --- a/hyperstation/code/modules/mob/living/silicon/robot/examine_vr.dm +++ /dev/null @@ -1,8 +0,0 @@ -/mob/living/silicon/robot/proc/examine_bellies_borg() - - var/message = "" - for(var/belly in vore_organs) - var/obj/belly/B = belly - message += B.get_examine_msg() - - return message diff --git a/hyperstation/code/modules/mob/living/silicon/robot/robot.dm b/hyperstation/code/modules/mob/living/silicon/robot/robot.dm index 20c7e7679..4752f0c95 100644 --- a/hyperstation/code/modules/mob/living/silicon/robot/robot.dm +++ b/hyperstation/code/modules/mob/living/silicon/robot/robot.dm @@ -1,3 +1,3 @@ //This file is empty right now, but leaves room for people to put shit here in the future for those who are lazy /mob/living/silicon/robot - var/datum/action/cyborg_small_sprite/small_sprite_action //This gets replaced every time the cyborg changes modules --Cyanosis + var/datum/action/cyborg_small_sprite/small_sprite_action //This gets replaced every time the cyborg changes modules --Cyanosis \ No newline at end of file diff --git a/hyperstation/code/modules/mob/living/silicon/robot/robot_modules.dm b/hyperstation/code/modules/mob/living/silicon/robot/robot_modules.dm index d42f3dbeb..dbef0ad93 100644 --- a/hyperstation/code/modules/mob/living/silicon/robot/robot_modules.dm +++ b/hyperstation/code/modules/mob/living/silicon/robot/robot_modules.dm @@ -1,60 +1,11 @@ //This file is empty right now, but leaves room for people to put shit here in the future for those who are lazy -/obj/item/robot_module - var/list/added_channels = list() //Borg radio stuffs - -//service -/obj/item/robot_module/butler - added_channels = list(RADIO_CHANNEL_SERVICE = 1) - -/obj/item/robot_module/clown - added_channels = list(RADIO_CHANNEL_SERVICE = 1) - -/obj/item/robot_module/janitor - added_channels = list(RADIO_CHANNEL_SERVICE = 1) - -//engineering -/obj/item/robot_module/engineering - added_channels = list(RADIO_CHANNEL_ENGINEERING = 1) - -//medical -/obj/item/robot_module/medical - added_channels = list(RADIO_CHANNEL_MEDICAL = 1) - -//security -/obj/item/robot_module/peacekeeper - added_channels = list(RADIO_CHANNEL_SECURITY = 1) - -/obj/item/robot_module/security - added_channels = list(RADIO_CHANNEL_SECURITY = 1) - -//supply -/obj/item/robot_module/miner - added_channels = list(RADIO_CHANNEL_SUPPLY = 1) // Probably already handled by other code when spawned with pre-set module, but whatever. - -//dogborgs -/obj/item/robot_module/k9 - added_channels = list(RADIO_CHANNEL_SECURITY = 1) - -/obj/item/robot_module/medihound - added_channels = list(RADIO_CHANNEL_MEDICAL = 1) - -/obj/item/robot_module/scrubpup - added_channels = list(RADIO_CHANNEL_SERVICE = 1) - -/obj/item/robot_module/borgi - added_channels = list(RADIO_CHANNEL_SERVICE = 1) - -/obj/item/robot_module/orepup - added_channels = list(RADIO_CHANNEL_SUPPLY = 1) - - //This proc gets called whenever a new robot module is being applied --Cyanosis /obj/item/robot_module/proc/handle_sprite_action(mob/living/silicon/robot/R, is_huge = FALSE) ASSERT(istype(R)) if(R.small_sprite_action) QDEL_NULL(R.small_sprite_action) - if(!is_huge) //only from the expander upgrade. The borg won't have an action if they don't have the expander upgrade + if(!is_huge) //only from the expander upgrade. The borg won't have an action if they don't have the expander upgrade return for(var/P in typesof(/datum/action/cyborg_small_sprite)) var/datum/action/cyborg_small_sprite/action = P diff --git a/hyperstation/code/modules/mob/living/simple_animal/friendly/farm_animals.dm b/hyperstation/code/modules/mob/living/simple_animal/friendly/farm_animals.dm index f5c7df2e2..3d12f301b 100644 --- a/hyperstation/code/modules/mob/living/simple_animal/friendly/farm_animals.dm +++ b/hyperstation/code/modules/mob/living/simple_animal/friendly/farm_animals.dm @@ -241,6 +241,6 @@ /mob/living/simple_animal/chicken/examine() . = ..() - . += "This one is [gender]." + . += "this one is [gender]." if(happiness<20) . += "It looks stressed." diff --git a/hyperstation/code/modules/mob/mob_helpers.dm b/hyperstation/code/modules/mob/mob_helpers.dm index 0a47f7b0a..00f9c8631 100644 --- a/hyperstation/code/modules/mob/mob_helpers.dm +++ b/hyperstation/code/modules/mob/mob_helpers.dm @@ -27,7 +27,3 @@ mob/proc/checkloadappearance() else to_chat(H, "You either took too long or chose not to change. Alrighty. Remember, you have 90 seconds from spawn to get to a mirror and still do it if you wish.") return - -// oracle port -/mob/proc/has_mouth() - return FALSE \ No newline at end of file diff --git a/hyperstation/code/modules/research/designs/medical_designs.dm b/hyperstation/code/modules/research/designs/medical_designs.dm deleted file mode 100644 index 825bcd2a2..000000000 --- a/hyperstation/code/modules/research/designs/medical_designs.dm +++ /dev/null @@ -1,69 +0,0 @@ -/datum/design/ipc_liver - name = "IPC Reagent Processor" - id = "ipc_liver" - build_type = PROTOLATHE - materials = list(MAT_METAL = 2000, MAT_GLASS = 1000) - build_path = /obj/item/organ/liver/ipc - category = list("Medical Designs") - departmental_flags = DEPARTMENTAL_FLAG_MEDICAL - construction_time = 100 - -/datum/design/ipc_eyes - name = "IPC Eyes" - id = "ipc_eyes" - build_type = PROTOLATHE - materials = list(MAT_METAL = 1000, MAT_GLASS = 2000) - build_path = /obj/item/organ/eyes/ipc - category = list("Medical Designs") - departmental_flags = DEPARTMENTAL_FLAG_MEDICAL - construction_time = 100 - -/datum/design/ipc_tongue - name = "Positronic Voicebox" - id = "ipc_tongue" - build_type = PROTOLATHE - materials = list(MAT_METAL = 2000, MAT_GLASS = 1000) - build_path = /obj/item/organ/tongue/robot/ipc - category = list("Medical Designs") - departmental_flags = DEPARTMENTAL_FLAG_MEDICAL - construction_time = 100 - -/datum/design/ipc_stomach - name = "Micro-cell" - id = "ipc_stomach" - build_type = PROTOLATHE - materials = list(MAT_METAL = 2000, MAT_GLASS = 1000, MAT_PLASMA = 200) - build_path = /obj/item/organ/stomach/cell - category = list("Medical Designs") - departmental_flags = DEPARTMENTAL_FLAG_MEDICAL - construction_time = 100 - -/datum/design/synthliz_stomach - name = "Synthetic Lizardperson Stomach" - id = "synthliz_stomach" - build_type = PROTOLATHE - materials = list(MAT_METAL = 2000, MAT_GLASS = 1000) - build_path = /obj/item/organ/stomach/synthliz - category = list("Medical Designs") - departmental_flags = DEPARTMENTAL_FLAG_MEDICAL - construction_time = 100 - -/datum/design/power_cord - name = "IPC Power Cord" - id = "power_cord" - build_type = PROTOLATHE - materials = list(MAT_METAL = 2000, MAT_GLASS = 1000) - build_path = /obj/item/organ/cyberimp/arm/power_cord - category = list("Medical Designs") - departmental_flags = DEPARTMENTAL_FLAG_MEDICAL - construction_time = 100 - - -/datum/techweb_node/ipc_organs - id = "ipc_organs" - display_name = "IPC Parts" - description = "We have the technology to replace him." - prereq_ids = list("cyber_organs","robotics") - design_ids = list("ipc_liver", "ipc_eyes", "ipc_tongue", "ipc_stomach", "synthliz_stomach", "power_cord") - research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 1500) - export_price = 5000 diff --git a/hyperstation/code/modules/surgery/organs/augments_arms.dm b/hyperstation/code/modules/surgery/organs/augments_arms.dm index 933b584eb..8430fcac5 100644 --- a/hyperstation/code/modules/surgery/organs/augments_arms.dm +++ b/hyperstation/code/modules/surgery/organs/augments_arms.dm @@ -23,11 +23,3 @@ w_class = WEIGHT_CLASS_BULKY sharpness = IS_SHARP_ACCURATE attack_verb = list("slashed", "cut") - - -// oracle port -/obj/item/organ/cyberimp/arm/power_cord - name = "power cord implant" - desc = "An internal power cord hooked up to a battery. Useful if you run on volts." - contents = newlist(/obj/item/apc_powercord) - zone = "l_arm" \ No newline at end of file diff --git a/hyperstation/code/obj/condom.dm b/hyperstation/code/obj/condom.dm index 2c3122fe2..727ff4739 100644 --- a/hyperstation/code/obj/condom.dm +++ b/hyperstation/code/obj/condom.dm @@ -115,6 +115,7 @@ obj/item/condom/update_icon() return if(!P.condom) return + var/obj/item/condom/filled/C = new P.linked_organ.reagents.trans_to(C, P.linked_organ.reagents.total_volume) C.loc = loc diff --git a/hyperstation/code/obj/farming/farming.dm b/hyperstation/code/obj/farming/farming.dm index ad4671774..8c203d78d 100644 --- a/hyperstation/code/obj/farming/farming.dm +++ b/hyperstation/code/obj/farming/farming.dm @@ -1,5 +1,5 @@ -/obj/item/reagent_containers/food/snacks/grown/wheat - var/stacktype = /obj/item/stack/tile/hay +/obj/item/reagent_containers/food/snacks/grown/wheat/ + var stacktype = /obj/item/stack/tile/hay var/tile_coefficient = 0.02 // same as grass /obj/item/reagent_containers/food/snacks/grown/wheat/attack_self(mob/user) diff --git a/hyperstation/code/obj/fleshlight.dm b/hyperstation/code/obj/fleshlight.dm index 421cfb8f6..125c7ec34 100644 --- a/hyperstation/code/obj/fleshlight.dm +++ b/hyperstation/code/obj/fleshlight.dm @@ -45,9 +45,11 @@ inuse = 1 if(!(C == user)) //if we are targeting someone else. C.visible_message("[user] is trying to use [src] on [C]'s penis.", "[user] is trying to use [src] on your penis.") + if(!do_mob(user, C, 3 SECONDS)) //3 second delay inuse = 0 return + //checked if not used on yourself, if not, carry on. playsound(src, 'sound/lewd/slaps.ogg', 30, 1, -1) //slapping sound inuse = 0 @@ -55,22 +57,27 @@ C.visible_message("[user] pumps [src] on [C]'s penis.", "[user] pumps [src] up and down on your penis.") else user.visible_message("[user] pumps [src] on their penis.", "You pump the fleshlight on your penis.") + if(prob(30)) //30% chance to make them moan. C.emote("moan") + C.do_jitter_animation() C.adjustArousalLoss(20) //make the target more aroused. - if(C.can_orgasm() && ishuman(C)) - var/mob/living/carbon/human/user_human = C - user_human.mob_climax_outside(P, mb_time=0) // instant, because we already did a warmup + if (C.getArousalLoss() >= 100 && ishuman(C) && C.has_dna()) + C.mob_climax(forced_climax=TRUE) //make them cum if they are over the edge. + return + else to_chat(user, "You don't see anywhere to use this on.") + inuse = 0 ..() //Hyperstation 13 portal fleshlight //kinky! + /obj/item/portallight name = "portal fleshlight" desc = "A silver love(TM) fleshlight, used to stimulate someones penis, with bluespace tech that allows lovers to hump at a distance." @@ -88,6 +95,7 @@ var/paired = 0 var/obj/item/portalunderwear var/useable = FALSE + var/option = "" /obj/item/portallight/examine(mob/user) . = ..() @@ -96,109 +104,136 @@ else . += "The device is paired, and awaiting input. " -/obj/item/portallight/attack(mob/living/carbon/user, mob/living/holder) +/obj/item/portallight/attack(mob/living/carbon/C, mob/living/user) //use portallight! nearly the same as the fleshlight apart from you have a buddy! + var/obj/item/organ/genital/penis/P = C.getorganslot("penis") + if(inuse) //just to stop stacking and causing people to cum instantly return - if(!UpdateUsability()) - to_chat(holder, "\The [src] appears to be currently unusable.") - return - var/option = "Fuck" - if(user == holder) + if(!useable) + to_chat(user, "It seems the device has failed or your partner is not wearing their device.") + + if(C == user)//if your using it on yourself, more options! otherwise, just fuck. option = input(usr, "Choose action", "Portal Fleshlight", "Fuck") in list("Fuck", "Lick", "Touch") - var/obj/item/organ/genital/target_genital = portalunderwear.loc - var/mob/living/carbon/human/target = target_genital.owner - var/obj/item/organ/genital/penis/P = user.getorganslot("penis") - if(option == "Fuck" && !P.is_exposed()) - to_chat(holder, "You don't see anywhere to use this on.") + else + option = "Fuck" + + var/obj/item/organ/genital/G + if(istype(portalunderwear.loc, /obj/item/organ/genital)) //Sanity check. Without this it will runtime error. + G = portalunderwear.loc + if(!G) return - /* - WARMUP START - prevents spam/instant climax - */ - inuse = TRUE - if(user != holder) - user.visible_message("[holder] is trying to use [src] on [user]'s penis.",\ - "[holder] is trying to use [src] on your penis.") - if(!do_mob(holder, user, 3 SECONDS)) - inuse = FALSE + var/mob/living/carbon/human/M = G.owner + + if(option == "Fuck"&&!P.is_exposed()) //we are trying to fuck with no penis! + to_chat(user, "You don't see anywhere to use this on.") + return + else //other options dont need checks + inuse = 1 + if(!(C == user)) //if we are targeting someone else. + C.visible_message("[user] is trying to use [src] on [C]'s penis.", "[user] is trying to use [src] on your penis.") + + if(!do_mob(user, C, 3 SECONDS)) //3 second delay + inuse = 0 + return + + //checked if not used on yourself, if not, carry on. + if(option == "Fuck") + playsound(src, 'sound/lewd/slaps.ogg', 30, 1, -1) //slapping sound for fuck. + + inuse = 0 + if(!(C == user)) + C.visible_message("[user] pumps [src] on [C]'s penis.", "[user] pumps [src] up and down on your penis.") + else + if(option == "Fuck") + user.visible_message("[user] pumps [src] on their penis.", "You pump the fleshlight on your penis.") + if(option == "Lick") + user.visible_message("[user] licks into [src].", "You lick into [src].") + if(option == "Touch") + user.visible_message("[user] touches softly against [src].", "You touch softly on [src].") + + + if(prob(30)) //30% chance to make your partner moan. + M.emote("moan") + + if(option == "Fuck")// normal fuck + to_chat(M, "You feel a [P.length] inch, [P.shape] shaped penis pumping through the portal into your [G.name].")//message your partner, and kinky! + if(prob(30)) //30% chance to make them moan. + C.emote("moan") + if(prob(30)) //30% chance to make your partner moan. + M.emote("moan") + C.adjustArousalLoss(20) + M.adjustArousalLoss(20) + M.do_jitter_animation() //make your partner shake too! + + if (M.getArousalLoss() >= 100 && ishuman(M) && prob(5))//Why not have a probability to cum when someone's getting nailed with max arousal?~ + if(G.is_exposed()) //Oh yea, if vagina is not exposed, the climax will not cause a spill + M.mob_climax_outside(G, spillage = TRUE) + else + M.mob_climax_outside(G, spillage = FALSE) + + if (C.getArousalLoss() >= 100 && ishuman(C) && C.has_dna()) + var/mob/living/carbon/human/O = C + + if( (P.condom == 1) || (P.sounding == 1)) //If coundomed and/or sounded, do not fire impreg chance + O.mob_climax_partner(P, M, FALSE, FALSE, FALSE, TRUE) + else //Else, fire impreg chance + if(G.name == "vagina") //no more spontaneous impregnations through the butt! + O.mob_climax_partner(P, M, FALSE, TRUE, FALSE, TRUE) + else + O.mob_climax_partner(P, M, FALSE, FALSE, FALSE, TRUE) + + if(option == "Lick") + to_chat(M, "You feel a tongue lick you through the portal against your [G.name].") + M.adjustArousalLoss(10) + if(option == "Touch") + to_chat(M, "You feel someone touching your [G.name] through the portal.") + M.adjustArousalLoss(5) + return - inuse = FALSE - /* - WARMUP END - proceed with the action - */ - switch(option) - if("Fuck") - playsound(src, 'sound/lewd/slaps.ogg', 30, 1, -1) - if(user == holder) - holder.visible_message("[holder] pumps [src] on their penis.", - "You pump the fleshlight on your penis.") - else - user.visible_message("[holder] pumps [src] on [user]'s penis.",\ - "[holder] pumps [src] up and down on your penis.") - to_chat(target, "You feel a [P.length] inch, [P.shape] shaped penis pumping through the portal into your [target_genital.name].") - if(prob(30)) - user.emote("moan") - user.adjustArousalLoss(20) - target.adjustArousalLoss(20) - target.do_jitter_animation() - if(target.can_orgasm() && prob(5)) - target.mob_climax_outside(target_genital, spillage=target_genital.is_exposed()) - if(user.can_orgasm()) - var/mob/living/carbon/human/O = user - var/impreg_chance = target_genital.name == "vagina" && !P.condom && !P.sounding - if(O.mob_climax_in_partner(P, target, spillage=FALSE, remote=TRUE) && impreg_chance) - target.impregnate(by=O) - if("Lick") - holder.visible_message("[holder] licks into [src].",\ - "You lick into [src].") - to_chat(target, "You feel a tongue lick you through the portal against your [target_genital.name].") - target.adjustArousalLoss(10) - if("Touch") - holder.visible_message("[holder] touches softly against [src].",\ - "You touch softly on [src].") - to_chat(target, "You feel someone touching your [target_genital.name] through the portal.") - target.adjustArousalLoss(5) - if(prob(30)) - target.emote("moan") ..() /obj/item/portallight/proc/updatesleeve() //get their looks and vagina colour! - cut_overlays() - if(!UpdateUsability()) + cut_overlays()//remove current overlays + + var/obj/item/organ/genital/G + if(istype(portalunderwear.loc, /obj/item/organ/genital)) //Sanity check. Without this it will runtime. + G = portalunderwear.loc + if(!G) + useable = FALSE return - var/obj/item/organ/genital/G = portalunderwear.loc - var/mob/living/carbon/human/H = G.owner // H is verified by UpdateUsability() - var/sleeve_species = "normal" - switch(H.dna.species.name) - if("Lizardperson") - sleeve_species = "lizard" - if("Slimeperson") - sleeve_species = "slime" - if("Avian") - sleeve_species = "avian" - sleeve = mutable_appearance('hyperstation/icons/obj/fleshlight.dmi', "portal_sleeve_[sleeve_species]") - sleeve.color = "#" + H.dna.features["mcolor"] - add_overlay(sleeve) - if(G.name == "vagina") - organ = mutable_appearance('hyperstation/icons/obj/fleshlight.dmi', "portal_vag") - organ.color = portalunderwear.loc.color - if(G.name == "anus") - organ = mutable_appearance('hyperstation/icons/obj/fleshlight.dmi', "portal_anus") - organ.color = "#" + H.dna.features["mcolor"] - add_overlay(organ) -/obj/item/portallight/proc/UpdateUsability() - var/useable = FALSE - if(portalunderwear && istype(portalunderwear.loc, /obj/item/organ/genital)) - var/obj/item/organ/genital/loc_genitals = portalunderwear.loc - if(loc_genitals.owner && ishuman(loc_genitals.owner)) - useable = TRUE - src.useable = useable - return useable + var/mob/living/carbon/human/H = G.owner + if(H) //if the portal panties are on someone. + sleeve = mutable_appearance('hyperstation/icons/obj/fleshlight.dmi', "portal_sleeve_normal") + if(H.dna.species.name == "Lizardperson") // lizard nerd + sleeve = mutable_appearance('hyperstation/icons/obj/fleshlight.dmi', "portal_sleeve_lizard") + + if(H.dna.species.name == "Slimeperson") // slime nerd + sleeve = mutable_appearance('hyperstation/icons/obj/fleshlight.dmi', "portal_sleeve_slime") + + if(H.dna.species.name == "Avian") // bird nerd + sleeve = mutable_appearance('hyperstation/icons/obj/fleshlight.dmi', "portal_sleeve_avian") + + sleeve.color = "#" + H.dna.features["mcolor"] + add_overlay(sleeve) + + if(G.name == "vagina") + organ = mutable_appearance('hyperstation/icons/obj/fleshlight.dmi', "portal_vag") + organ.color = portalunderwear.loc.color + if(G.name == "anus") + organ = mutable_appearance('hyperstation/icons/obj/fleshlight.dmi', "portal_anus") + organ.color = "#" + H.dna.features["mcolor"] + + useable = TRUE + add_overlay(organ) + else + useable = FALSE //Hyperstation 13 portal underwear //can be attached to vagina or anus, just like the vibrator, still requires pairing with the portallight + /obj/item/portalpanties name = "portal panties" desc = "A silver love(TM) pair of portal underwear, with bluespace tech allows lovers to hump at a distance. Needs to be paired with a portal fleshlight before use." @@ -217,6 +252,7 @@ else . += "The device is paired, and awaiting attachment. " + /obj/item/portalpanties/attackby(obj/item/I, mob/living/user) //pairing if(istype(I, /obj/item/portallight)) var/obj/item/portallight/P = I @@ -232,9 +268,11 @@ ..() //just allows people to hit it with other objects, if they so wished. /obj/item/portalpanties/attack(mob/living/carbon/C, mob/living/user) + if(!portallight) //we arent paired yet! noobie trap, let them know. to_chat(user, "[src] can only be attached once paired with a portal fleshlight.") return + var/obj/item/organ/genital/picked_organ var/mob/living/carbon/human/S = user var/mob/living/carbon/human/T = C @@ -244,17 +282,21 @@ "[user] is trying to put [src] on you!") if(!do_mob(user, C, 3 SECONDS))//warn them and have a delay of 5 seconds to apply. return + if((picked_organ.name == "vagina")||(picked_organ.name == "anus")) //only fits on a vagina or anus + src.shapetype = picked_organ.name if(!picked_organ.equipment) to_chat(user, "You wrap [src] around [T]'s [picked_organ.name].") else to_chat(user, "They already have [picked_organ.equipment.name] there.") return + if(!user.transferItemToLoc(src, picked_organ)) //check if you can put it in return src.attached = TRUE picked_organ.equipment = src + var/obj/item/portallight/P = portallight //now we need to send what they look like, but saddly if the person changes colour for what ever reason, it wont update. but dont tell people shh. if(P) //just to make sure @@ -270,7 +312,6 @@ var/obj/item/portallight/P = portallight P.updatesleeve() - /obj/item/storage/box/portallight name = "Portal Fleshlight and Underwear" icon = 'hyperstation/icons/obj/fleshlight.dmi' diff --git a/hyperstation/code/obj/kinkyclothes.dm b/hyperstation/code/obj/kinkyclothes.dm index e7be65751..3a5e44318 100644 --- a/hyperstation/code/obj/kinkyclothes.dm +++ b/hyperstation/code/obj/kinkyclothes.dm @@ -160,6 +160,9 @@ obj/item/clothing/neck/stole/black var/firstpickup = TRUE var/pickupsound = TRUE +/obj/item/clothing/under/vaultsuit/no_sound + pickupsound = FALSE + /obj/item/clothing/under/vaultsuit/equipped(mob/user, slot) . = ..() if(!pickupsound) @@ -195,44 +198,3 @@ obj/item/clothing/neck/stole/black body_parts_covered = CHEST|LEGS|ARMS min_cold_protection_temperature = FIRE_SUIT_MIN_TEMP_PROTECT -/obj/item/clothing/suit/threepwoodjacket - name = "threepwood's jacket" - desc = "A jacket fit for a Mighty Pirate!" - icon = 'hyperstation/icons/obj/clothing/suits.dmi' - icon_state = "threepwoodjacket" - alternate_worn_icon = 'hyperstation/icons/mobs/suits.dmi' - item_state = "b_suit" - var/firstpickup = TRUE - var/pickupsound = TRUE - -/obj/item/clothing/suit/threepwoodjacket/equipped(mob/user, slot) - . = ..() - if(!pickupsound) - return - if(!ishuman(user)) - return - if(slot == SLOT_WEAR_SUIT) - if(!firstpickup) - SEND_SOUND(user, sound('hyperstation/sound/effects/vaultsuit/FalloutEXPUp.ogg', volume = 00)) - else - firstpickup = FALSE - SEND_SOUND(user, sound('hyperstation/sound/effects/vaultsuit/bartandfink.ogg', volume = 60)) - return - -/obj/item/clothing/under/threepwood - name = "threepwood's outfit" - desc = "An outfit fit for a Mighty Pirate!." - icon = 'hyperstation/icons/obj/clothing/uniforms.dmi' - icon_state = "threepwood" - alternate_worn_icon = 'hyperstation/icons/mobs/uniforms.dmi' - item_state = "w_suit" - can_adjust = FALSE - -/obj/item/clothing/shoes/threepwoodboots - name = "threepwood's boots" - desc = "A pair of boots fit for a Mighty Pirate!." - icon = 'hyperstation/icons/obj/clothing/shoes.dmi' - icon_state = "threepwoodboots" - alternate_worn_icon = 'hyperstation/icons/obj/clothing/shoes.dmi' - item_state = "threepwoodboots" - alternate_worn_icon = 'hyperstation/icons/mobs/feet.dmi' \ No newline at end of file diff --git a/hyperstation/code/obj/pregnancytester.dm b/hyperstation/code/obj/pregnancytester.dm index d08610271..974fda3ab 100644 --- a/hyperstation/code/obj/pregnancytester.dm +++ b/hyperstation/code/obj/pregnancytester.dm @@ -8,6 +8,7 @@ var/results = "null" w_class = WEIGHT_CLASS_TINY + /obj/item/pregnancytest/attack_self(mob/user) if(QDELETED(src)) return @@ -15,26 +16,28 @@ return if(isAI(user)) return - if(user.stat > CONSCIOUS)//unconscious or dead + if(user.stat > 0)//unconscious or dead return - Test(user) + if(status == 1) + return //Already been used once, pregnancy tests only work once. + test(user) + +/obj/item/pregnancytest/proc/force(mob/living/user) + //Force it negative + icon_state = "negative" + name = "[results] pregnancy test" + status = 1 + to_chat(user, "You use the pregnancy test, the display reads negative!") + + +/obj/item/pregnancytest/proc/test(mob/living/user) -/obj/item/pregnancytest/proc/Test(mob/living/user) - if(status) - return - var/_results = FALSE var/obj/item/organ/genital/womb/W = user.getorganslot("womb") - if(!W) - return // no reason to waste the single-use on them - if(W.pregnant) - _results = TRUE - UpdateResult(user, _results) - -/obj/item/pregnancytest/proc/UpdateResult(mob/living/user, results) - var/result_text = results ? "positive" : "negative" - src.results = result_text - icon_state = result_text - name = "[results] preganancy test" - status = TRUE - if(user) - to_chat(user, "You use the pregnancy test, the display reads [results]!") \ No newline at end of file + if(W.pregnant == 1) + results = "positive" + icon_state = "positive" + name = "[results] pregnancy test" + status = 1 + to_chat(user, "You use the pregnancy test, the display reads positive!") + else + force(user) \ No newline at end of file diff --git a/hyperstation/code/obj/vibrator.dm b/hyperstation/code/obj/vibrator.dm index 40e1446e9..51f495945 100644 --- a/hyperstation/code/obj/vibrator.dm +++ b/hyperstation/code/obj/vibrator.dm @@ -132,13 +132,14 @@ Code: if(2) //med, can make you cum to_chat(U, "You feel intense pleasure surge through your [G.name]") U.do_jitter_animation() - U.mob_climax_instant() + if (U.getArousalLoss() >= 100 && ishuman(U) && U.has_dna()) + U.mob_climax(forced_climax=TRUE) if(3) //high, makes you stun to_chat(U, "You feel overpowering pleasure surge through your [G.name]") U.Jitter(3) U.Stun(30) - if (U.can_orgasm()) - U.mob_climax_instant() + if (U.getArousalLoss() >= 100 && ishuman(U) && U.has_dna()) + U.mob_climax(forced_climax=TRUE) if(prob(50)) U.emote("moan") diff --git a/hyperstation/icons/effects/lighting.dmi b/hyperstation/icons/effects/lighting.dmi deleted file mode 100644 index 3f59b47d2..000000000 Binary files a/hyperstation/icons/effects/lighting.dmi and /dev/null differ diff --git a/hyperstation/icons/effects/lightinglarge.dmi b/hyperstation/icons/effects/lightinglarge.dmi deleted file mode 100644 index fb1eeebc8..000000000 Binary files a/hyperstation/icons/effects/lightinglarge.dmi and /dev/null differ diff --git a/hyperstation/icons/effects/lightingmed.dmi b/hyperstation/icons/effects/lightingmed.dmi deleted file mode 100644 index 0b87ce7dc..000000000 Binary files a/hyperstation/icons/effects/lightingmed.dmi and /dev/null differ diff --git a/hyperstation/icons/mob/char_ears.dmi b/hyperstation/icons/mob/char_ears.dmi index b4b572a05..bf248620b 100644 Binary files a/hyperstation/icons/mob/char_ears.dmi and b/hyperstation/icons/mob/char_ears.dmi differ diff --git a/hyperstation/icons/mob/char_markings.dmi b/hyperstation/icons/mob/char_markings.dmi index 916587c6b..e311b1d0f 100644 Binary files a/hyperstation/icons/mob/char_markings.dmi and b/hyperstation/icons/mob/char_markings.dmi differ diff --git a/hyperstation/icons/mob/char_parts.dmi b/hyperstation/icons/mob/char_parts.dmi deleted file mode 100644 index 4982376a0..000000000 Binary files a/hyperstation/icons/mob/char_parts.dmi and /dev/null differ diff --git a/hyperstation/icons/mob/char_snouts.dmi b/hyperstation/icons/mob/char_snouts.dmi index 92c21d9c1..06ce5d3be 100644 Binary files a/hyperstation/icons/mob/char_snouts.dmi and b/hyperstation/icons/mob/char_snouts.dmi differ diff --git a/hyperstation/icons/mob/char_tails.dmi b/hyperstation/icons/mob/char_tails.dmi index 0695ae639..6e2005e12 100644 Binary files a/hyperstation/icons/mob/char_tails.dmi and b/hyperstation/icons/mob/char_tails.dmi differ diff --git a/hyperstation/icons/mob/char_wings.dmi b/hyperstation/icons/mob/char_wings.dmi index 8384776ec..2a7b34cf1 100644 Binary files a/hyperstation/icons/mob/char_wings.dmi and b/hyperstation/icons/mob/char_wings.dmi differ diff --git a/hyperstation/icons/mob/ipc_screen_visor.dmi b/hyperstation/icons/mob/ipc_screen_visor.dmi deleted file mode 100644 index 1bf897228..000000000 Binary files a/hyperstation/icons/mob/ipc_screen_visor.dmi and /dev/null differ diff --git a/hyperstation/icons/obj/genitals/belly.dmi b/hyperstation/icons/obj/genitals/belly.dmi index af5d45f1c..3324744b7 100644 Binary files a/hyperstation/icons/obj/genitals/belly.dmi and b/hyperstation/icons/obj/genitals/belly.dmi differ diff --git a/hyperstation/icons/obj/genitals/butt.dmi b/hyperstation/icons/obj/genitals/butt.dmi index d5d8ee53e..55f746287 100644 Binary files a/hyperstation/icons/obj/genitals/butt.dmi and b/hyperstation/icons/obj/genitals/butt.dmi differ diff --git a/hyperstation/icons/obj/railings.dmi b/hyperstation/icons/obj/railings.dmi index 2bccd88f7..1604e6bdd 100644 Binary files a/hyperstation/icons/obj/railings.dmi and b/hyperstation/icons/obj/railings.dmi differ diff --git a/hyperstation/sound/effects/vaultsuit/bartandfink.ogg b/hyperstation/sound/effects/vaultsuit/bartandfink.ogg deleted file mode 100644 index 9b76713f2..000000000 Binary files a/hyperstation/sound/effects/vaultsuit/bartandfink.ogg and /dev/null differ diff --git a/hyperstation/sound/weapons/dinkalternate.ogg b/hyperstation/sound/weapons/dinkalternate.ogg deleted file mode 100644 index e7d00f8b6..000000000 Binary files a/hyperstation/sound/weapons/dinkalternate.ogg and /dev/null differ diff --git a/icons/mob/dogborg.dmi b/icons/mob/dogborg.dmi index 3aaaa0493..ec63120ae 100644 Binary files a/icons/mob/dogborg.dmi and b/icons/mob/dogborg.dmi differ diff --git a/icons/obj/clothing/shoes.dmi b/icons/obj/clothing/shoes.dmi index b0150ed51..7815d52d6 100644 Binary files a/icons/obj/clothing/shoes.dmi and b/icons/obj/clothing/shoes.dmi differ diff --git a/icons/obj/food/food.dmi b/icons/obj/food/food.dmi index 88607735c..bd4b429fc 100644 Binary files a/icons/obj/food/food.dmi and b/icons/obj/food/food.dmi differ diff --git a/icons/obj/surgery.dmi b/icons/obj/surgery.dmi index 3cf1c4bc1..b0e6ab7bf 100644 Binary files a/icons/obj/surgery.dmi and b/icons/obj/surgery.dmi differ diff --git a/modular_citadel/code/datums/status_effects/chems.dm b/modular_citadel/code/datums/status_effects/chems.dm index 433c20135..92aa3b21b 100644 --- a/modular_citadel/code/datums/status_effects/chems.dm +++ b/modular_citadel/code/datums/status_effects/chems.dm @@ -620,7 +620,7 @@ else if (lowertext(customTriggers[trigger]) == "cum")//aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa if (HAS_TRAIT(C, TRAIT_NYMPHO) && lewd) if (C.getArousalLoss() > 80) - C.mob_climax_instant() + C.mob_climax(forced_climax=TRUE) C.SetStun(10)//We got your stun effects in somewhere, Kev. else C.adjustArousalLoss(10) diff --git a/modular_citadel/code/modules/arousal/arousal.dm b/modular_citadel/code/modules/arousal/arousal.dm index 8b8780b46..5e37cbbe7 100644 --- a/modular_citadel/code/modules/arousal/arousal.dm +++ b/modular_citadel/code/modules/arousal/arousal.dm @@ -11,6 +11,7 @@ /mob/living/carbon/human canbearoused = TRUE + var/saved_underwear = ""//saves their underwear so it can be toggled later var/saved_undershirt = "" var/saved_socks = "" @@ -61,6 +62,7 @@ /mob/living/proc/handle_arousal() + /mob/living/carbon/handle_arousal() if(canbearoused && dna) var/datum/species/S @@ -108,11 +110,8 @@ if(updating_arousal) updatearousal() -/** - * despite the name of this, it actually returns a number between 0 and 100 - */ /mob/living/proc/getPercentAroused() - var/percentage = ((arousalloss / max_arousal) * 100) + var/percentage = ((100 / max_arousal) * arousalloss) return percentage /mob/living/proc/isPercentAroused(percentage)//returns true if the mob's arousal (measured in a percent of 100) is greater than the arg percentage. @@ -128,25 +127,26 @@ /mob/living/carbon/updatearousal() . = ..() - for(var/obj/item/organ/genital/genital in internal_organs) - if(istype(genital)) + + for(var/obj/item/organ/genital/G in internal_organs) + if(istype(G)) var/datum/sprite_accessory/S - switch(genital.type) + switch(G.type) if(/obj/item/organ/genital/penis) - S = GLOB.cock_shapes_list[genital.shape] + S = GLOB.cock_shapes_list[G.shape] if(/obj/item/organ/genital/testicles) - S = GLOB.balls_shapes_list[genital.shape] + S = GLOB.balls_shapes_list[G.shape] if(/obj/item/organ/genital/vagina) - S = GLOB.vagina_shapes_list[genital.shape] + S = GLOB.vagina_shapes_list[G.shape] if(/obj/item/organ/genital/breasts) - S = GLOB.breasts_shapes_list[genital.shape] + S = GLOB.breasts_shapes_list[G.shape] if(S?.alt_aroused) - genital.aroused_state = isPercentAroused(genital.aroused_amount) - if(getArousalLoss() >= isPercentAroused(33)) - genital.aroused_state = TRUE + G.aroused_state = isPercentAroused(G.aroused_amount) + if(getArousalLoss() >= ((max_arousal / 100) * 33)) + G.aroused_state = TRUE else - genital.aroused_state = FALSE - genital.update_appearance() + G.aroused_state = FALSE + G.update_appearance() @@ -166,13 +166,41 @@ return FALSE else if(hud_used.arousal) - var/arousal_state = "arousal0" - if(stat != DEAD) - var/arousal_percent = getPercentAroused() - var/arousal_rounded = FLOOR(arousal_percent, 10) - arousal_state = "arousal[arousal_rounded]" - hud_used.arousal.icon_state = arousal_state - return TRUE + if(stat == DEAD) + hud_used.arousal.icon_state = "arousal0" + return TRUE + if(getArousalLoss() == max_arousal) + hud_used.arousal.icon_state = "arousal100" + return TRUE + if(getArousalLoss() >= (max_arousal / 100) * 90)//M O D U L A R , W O W + hud_used.arousal.icon_state = "arousal90" + return TRUE + if(getArousalLoss() >= (max_arousal / 100) * 80)//M O D U L A R , W O W + hud_used.arousal.icon_state = "arousal80" + return TRUE + if(getArousalLoss() >= (max_arousal / 100) * 70)//M O D U L A R , W O W + hud_used.arousal.icon_state = "arousal70" + return TRUE + if(getArousalLoss() >= (max_arousal / 100) * 60)//M O D U L A R , W O W + hud_used.arousal.icon_state = "arousal60" + return TRUE + if(getArousalLoss() >= (max_arousal / 100) * 50)//M O D U L A R , W O W + hud_used.arousal.icon_state = "arousal50" + return TRUE + if(getArousalLoss() >= (max_arousal / 100) * 40)//M O D U L A R , W O W + hud_used.arousal.icon_state = "arousal40" + return TRUE + if(getArousalLoss() >= (max_arousal / 100) * 30)//M O D U L A R , W O W + hud_used.arousal.icon_state = "arousal30" + return TRUE + if(getArousalLoss() >= (max_arousal / 100) * 20)//M O D U L A R , W O W + hud_used.arousal.icon_state = "arousal10" + return TRUE + if(getArousalLoss() >= (max_arousal / 100) * 10)//M O D U L A R , W O W + hud_used.arousal.icon_state = "arousal10" + return TRUE + else + hud_used.arousal.icon_state = "arousal0" /obj/screen/arousal name = "arousal" @@ -189,654 +217,637 @@ if(M.canbearoused) ui_interact(usr) -/** - * Checks if this mob can orgasm. Criteria includes: - * - Mob is human - * - Mob is capable of arousal - * - Mob has DNA - * - Mob is aroused past a certain threshold - * - * Arguments: - * - `arousal` - The minimum arousal needed to pass the check. Default is `100`. - * - * Returns: `TRUE`/`FALSE` - Whether or not the mob passes all of the above checks. - */ -/mob/living/proc/can_orgasm(arousal=100) - if(src.canbearoused && src.getArousalLoss() >= arousal && ishuman(src) && src.has_dna()) - return TRUE - return FALSE - - -/mob/living/proc/mob_climax() +/mob/living/proc/mob_climax()//This is just so I can test this shit without being forced to add actual content to get rid of arousal. Will be a very basic proc for a while. set name = "Masturbate" set category = "IC" if(canbearoused && !restrained() && !stat) if(mb_cd_timer <= world.time) //start the cooldown even if it fails mb_cd_timer = world.time + mb_cd_length - if(isPercentAroused(33))//33% arousal or greater required + if(getArousalLoss() >= ((max_arousal / 100) * 33))//33% arousal or greater required src.visible_message("[src] starts masturbating!", \ - "You start masturbating.") + "You start masturbating.") if(do_after(src, 30, target = src)) src.visible_message("[src] relieves [p_them()]self!", \ - "You have relieved yourself.") + "You have relieved yourself.") SEND_SIGNAL(src, COMSIG_ADD_MOOD_EVENT, "orgasm", /datum/mood_event/orgasm) setArousalLoss(min_arousal) else to_chat(src, "You aren't aroused enough for that.") -/** - * Arguments: - * - `genital`: Genitals being used for this interaction. - * - `cover`: Whether or not the mob is climaxing over themselves. - * - `mb_time`: Warm-up time for this interaction. - */ -/mob/living/carbon/human/proc/mob_masturbate(obj/item/organ/genital/genital, cover=FALSE, mb_time=3 SECONDS) +//These are various procs that we'll use later, split up for readability instead of having one, huge proc. +//For all of these, we assume the arguments given are proper and have been checked beforehand. +/mob/living/carbon/human/proc/mob_masturbate(obj/item/organ/genital/G, cover = FALSE, mb_time = 30) //Masturbation, keep it gender-neutral var/total_fluids = 0 - var/datum/reagents/fluid_source = genital.get_fluid_source() - var/condomed = FALSE - var/sounded = FALSE - if(genital.name == "penis") + var/datum/reagents/fluid_source = null + var/condomed = 0 + var/sounded = 0 + + if(G.name == "penis")//if the select organ is a penis var/obj/item/organ/genital/penis/P = src.getorganslot("penis") - condomed = P.condom - sounded = P.sounding - if(!fluid_source) - to_chat(src, "Your [genital.name] is unable to produce it's own fluids, it's missing the organs for it.") - return + if(P.condom) //if the penis is condomed + condomed = 1 + if(P.sounding) + sounded = 1 + if(G.producing) //Can it produce its own fluids, such as breasts? + fluid_source = G.reagents + else + if(!G.linked_organ) + to_chat(src, "Your [G.name] is unable to produce it's own fluids, it's missing the organs for it.") + return + fluid_source = G.linked_organ.reagents total_fluids = fluid_source.total_volume if(mb_time) - src.visible_message("[src] starts to [genital.masturbation_verb] [p_their()] [genital.name].", \ - "You start to [genital.masturbation_verb] your [genital.name].", \ - "You start to [genital.masturbation_verb] your [genital.name].") + src.visible_message("[src] starts to [G.masturbation_verb] [p_their()] [G.name].", \ + "You start to [G.masturbation_verb] your [G.name].", \ + "You start to [G.masturbation_verb] your [G.name].") + if(do_after(src, mb_time, target = src)) if(total_fluids > 5 &&!condomed &&!sounded) fluid_source.reaction(src.loc, TOUCH, 1, 0) fluid_source.clear_reagents() - if(!condomed && !sounded)//For when you want to make a mess of yourself. - if(cover) - fluid_source.trans_to(src, total_fluids*genital.fluid_transfer_factor) - total_fluids -= total_fluids*genital.fluid_transfer_factor - if(total_fluids > 80) // now thats a big cum! - src.add_cum_overlay("large") - if(total_fluids > 5) - fluid_source.reaction(src.loc, TOUCH, 1, 0) - var/mob/living/carbon/human/H = src - if(H && genital.name == "penis") - H.cumdrip_rate += rand(5,10) - fluid_source.clear_reagents() - src.visible_message("[src] climaxes over [p_their()] self, using [p_their()] [genital.name]!", \ - "You orgasm over yourself, using your [genital.name].", \ - "You have climaxed over something, using your [genital.name].") - src.add_cum_overlay() - else - src.visible_message("[src] orgasms, cumming[istype(src.loc, /turf/open/floor) ? " onto [src.loc]" : ""]!", \ - "You cum[istype(src.loc, /turf/open/floor) ? " onto [src.loc]" : ""].", \ - "You have relieved yourself.") - if(condomed) //condomed - src.visible_message("[src] orgasms, climaxing into [p_their()] condom!", \ - "You cum into your condom.", \ - "You have relieved yourself.") - if(sounded) //sounded - src.visible_message("[src] orgasms, but the rod blocks anything from leaking out!", \ - "You cum with the rod inside.", \ - "You don't quite feel totally relieved.") - if(total_fluids > 0 && condomed && !sounded) - src.condomclimax() - SEND_SIGNAL(src, COMSIG_ADD_MOOD_EVENT, "orgasm", /datum/mood_event/orgasm) - if(genital.can_climax) - setArousalLoss(min_arousal) + if(!condomed && !sounded && !cover) + src.visible_message("[src] orgasms, cumming[istype(src.loc, /turf/open/floor) ? " onto [src.loc]" : ""]!", \ + "You cum[istype(src.loc, /turf/open/floor) ? " onto [src.loc]" : ""].", \ + "You have relieved yourself.") + if(!condomed &&!sounded && cover)//For when you want to make a mess of yourself. + fluid_source.trans_to(src, total_fluids*G.fluid_transfer_factor) + total_fluids -= total_fluids*G.fluid_transfer_factor + if(total_fluids > 80) // now thats a big cum! + if(isliving(src)) + var/mutable_appearance/cumoverlaylarge = mutable_appearance('hyperstation/icons/effects/cumoverlay.dmi') + cumoverlaylarge.icon_state = "cum_large" + src.add_overlay(cumoverlaylarge) -/** - * Mob climaxes using provided genitals without a partner. This is in contrast with `mob_climax_instant()`, - * which does not have a warm-up time and uses all genitals at once to climax. - * - * Arguments: - * - `genital`: The selected genitals for this interaction. Determines fluid type. - * - `mb_time`: The warm-up time for this interaction. - * - `spillage`: Whether or not climaxing causes this mob to spill fluids on the floor. - */ -/mob/living/carbon/human/proc/mob_climax_outside(obj/item/organ/genital/genital, spillage=TRUE, mb_time=3 SECONDS) - var/total_fluids = 0 - var/datum/reagents/fluid_source = genital.get_fluid_source() - var/unable_to_come = FALSE - if(fluid_source) - total_fluids = fluid_source.total_volume - else - unable_to_come = TRUE - if(unable_to_come) - src.visible_message("[src] shudders, their [genital.name] unable to cum.", \ - "Your [genital.name] cannot cum, giving no relief.", \ - "Your [genital.name] cannot cum, giving no relief.") - return - total_fluids = fluid_source.total_volume - if(mb_time) //as long as it's not instant, give a warning - src.visible_message("[src] looks like they're about to cum.", \ - "You feel yourself about to orgasm.", \ - "You feel yourself about to orgasm.") - if(do_after(src, mb_time, target = src)) - if(spillage) if(total_fluids > 5) fluid_source.reaction(src.loc, TOUCH, 1, 0) + var/mob/living/carbon/human/H = src + if(H && G.name == "penis") + H.cumdrip_rate += rand(5,10) fluid_source.clear_reagents() - src.visible_message("[src] orgasms[istype(src.loc, /turf/open/floor) ? ", spilling onto [src.loc]" : ""], with [p_their()] [genital.name]!", \ - "You climax[istype(src.loc, /turf/open/floor) ? ", spilling onto [src.loc]" : ""] with your [genital.name].", \ - "You climax using your [genital.name].") - else - src.visible_message("[src] orgasms with [p_their()] [genital.name]!", \ - "You climax with your [genital.name].", \ - "You climax using your [genital.name].") + src.visible_message("[src] climaxes over [p_their()] self, using [p_their()] [G.name]!", \ + "You orgasm over yourself, using your [G.name].", \ + "You have climaxed over something, using your [G.name].") + if(isliving(src)) + var/mutable_appearance/cumoverlay = mutable_appearance('hyperstation/icons/effects/cumoverlay.dmi') + cumoverlay.icon_state = "cum_normal" + src.add_overlay(cumoverlay) + else + src.add_cum_overlay() + + if(condomed) //condomed + src.visible_message("[src] orgasms, climaxing into [p_their()] condom ", \ + "You cum into your condom.", \ + "You have relieved yourself.") + if(sounded) //sounded + src.visible_message("[src] orgasms, but the rod blocks anything from leaking out!", \ + "You cum with the rod inside.", \ + "You don't quite feel totally relieved.") + if(total_fluids > 0 &&condomed &&!sounded) + src.condomclimax() + SEND_SIGNAL(src, COMSIG_ADD_MOOD_EVENT, "orgasm", /datum/mood_event/orgasm) - if(genital.can_climax) + if(G.can_climax) setArousalLoss(min_arousal) -/** - * Climax over a partner with a selected organ. This is external and creates spills on the partner/floor, - * and does not have a chance to impregnate. For this interaction, the partner may be an object instead of - * a person (but it cannot be an animal). - * - * Arguments: - * - `genital`: The genital being used for this interaction. Determines fluid type and volume. - * - `partner`: The thing being used as a partner. Generally an object or a person. - * - `mb_time`: The warm-up time for this interaction. Default is 3 seconds - */ -/mob/living/carbon/human/proc/mob_climax_cover(obj/item/organ/genital/genital, atom/partner, mb_time=3 SECONDS) - if(isnoncarbon(partner)) // deny animals - return FALSE - if(istype(genital, /obj/item/organ/genital/penis)) - var/obj/item/organ/genital/penis/P = genital - if(P.condom) - to_chat(src, "You cannot do this action with a condom on.") - return - if(P.sounding) - to_chat(src, "You cannot do this action with a sounding in.") - return +/mob/living/carbon/human/proc/mob_climax_outside(obj/item/organ/genital/G, mb_time = 30, spillage = TRUE) //This is used for forced orgasms and other hands-free climaxes var/total_fluids = 0 - var/datum/reagents/fluid_source = genital.get_fluid_source() - if(!fluid_source) - to_chat(src, "Your [genital.name] is unable to produce it's own fluids, it's missing the organs for it.") - return - total_fluids = fluid_source.total_volume - if(mb_time) - src.visible_message("[src] is about to climax with [partner]!", \ - "You're about to climax with [partner]!", \ - "You're preparing to climax with something!") - if(!do_after(src, mb_time, target = src)) - return - if(!in_range(src, partner)) - return - var/transferred_units = total_fluids * genital.fluid_transfer_factor - fluid_source.trans_to(partner, transferred_units) - total_fluids -= transferred_units - if(total_fluids > 5) - fluid_source.reaction(partner.loc, TOUCH, 1, 0) - fluid_source.clear_reagents() - if(ismob(partner)) - var/mob/living/carbon/partner_carbon = partner - if(partner_carbon) - var/cum_overlay = "normal" - if(total_fluids > 80) - cum_overlay = "large" - partner_carbon.add_cum_overlay(cum_overlay) - var/mob/living/carbon/human/partner_human = partner_carbon - if(partner_human) - partner_human.cumdrip_rate += rand(5,10) + var/datum/reagents/fluid_source = null + var/unable_to_come = FALSE + + if(G.producing) //Can it produce its own fluids, such as breasts? + fluid_source = G.reagents + total_fluids = fluid_source.total_volume else - partner.add_cum_overlay() - src.visible_message("[src] climaxes over [partner], using [p_their()] [genital.name]!", \ - "You orgasm over [partner], using your [genital.name].", \ - "You have climaxed over something, using your [genital.name].") - SEND_SIGNAL(src, COMSIG_ADD_MOOD_EVENT, "orgasm", /datum/mood_event/orgasm) - setArousalLoss(min_arousal) + if(!G.linked_organ) + unable_to_come = TRUE + else + fluid_source = G.linked_organ.reagents + total_fluids = fluid_source.total_volume + + if(unable_to_come) + src.visible_message("[src] shudders, their [G.name] unable to cum.", \ + "Your [G.name] cannot cum, giving no relief.", \ + "Your [G.name] cannot cum, giving no relief.") + else + total_fluids = fluid_source.total_volume + if(mb_time) //as long as it's not instant, give a warning + src.visible_message("[src] looks like they're about to cum.", \ + "You feel yourself about to orgasm.", \ + "You feel yourself about to orgasm.") + if(do_after(src, mb_time, target = src)) + if(spillage) + if(total_fluids > 5) + fluid_source.reaction(src.loc, TOUCH, 1, 0) + + fluid_source.clear_reagents() + src.visible_message("[src] orgasms[istype(src.loc, /turf/open/floor) ? ", spilling onto [src.loc]" : ""], with [p_their()] [G.name]!", \ + "You climax[istype(src.loc, /turf/open/floor) ? ", spilling onto [src.loc]" : ""] with your [G.name].", \ + "You climax using your [G.name].") + else //Else from spillage check, also note subtle text change + src.visible_message("[src] orgasms with [p_their()] [G.name]!", \ + "You climax with your [G.name].", \ + "You climax using your [G.name].") + + SEND_SIGNAL(src, COMSIG_ADD_MOOD_EVENT, "orgasm", /datum/mood_event/orgasm) + if(G.can_climax) + setArousalLoss(min_arousal) -/** - * Climax inside a partner using a selected organ. - * - * Arguments: - * - `genital`: The genital being used for this interaction. Determines type/volume of fluids. - * - `partner`: The person that this mob is climaxing in. - * - `spillage`: Whether or not the fluids will spill on the ground. - * - `remote`: Whether or not this interaction is being triggered long-distance. - * - `mb_time`: Warm-up time for this interaction. - * - * Returns: `TRUE`/`FALSE` - whether or not this interaction succeeded. - */ -/mob/living/carbon/human/proc/mob_climax_in_partner(obj/item/organ/genital/genital, mob/living/carbon/partner, spillage=TRUE, remote=FALSE, mb_time=3 SECONDS) - if(isnoncarbon(partner)) // deny animals - return FALSE +/mob/living/carbon/human/proc/mob_climax_partner(obj/item/organ/genital/G, mob/living/L, spillage = TRUE, impreg = FALSE,cover = FALSE,remote = FALSE, mb_time = 30) //Used for climaxing with any living thing var/total_fluids = 0 - var/datum/reagents/fluid_source = genital.get_fluid_source() - if(!fluid_source) - to_chat(src, "Your [genital.name] is unable to produce it's own fluids, it's missing the organs for it.") - return FALSE + var/datum/reagents/fluid_source = null + + if(G.producing) //Can it produce its own fluids, such as breasts? + fluid_source = G.reagents + else + if(!G.linked_organ) + to_chat(src, "Your [G.name] is unable to produce it's own fluids, it's missing the organs for it.") + return + fluid_source = G.linked_organ.reagents total_fluids = fluid_source.total_volume - var/partner_text = partner + + if(mb_time && !remote) //Skip warning if this is an instant climax. + src.visible_message("[src] is about to climax with [L]!", \ + "You're about to climax with [L]!", \ + "You're preparing to climax with something!") if(remote) - partner_text = "someone" - src.visible_message("[src] is about to climax with [partner_text]!", \ - "You're about to climax with [partner_text]!", \ - "You're preparing to climax with something!") - if(!do_after(src, mb_time, target = src)) - return FALSE - if(!remote && !in_range(src, partner)) - return FALSE - if(spillage) - fluid_source.trans_to(partner, total_fluids*genital.fluid_transfer_factor) - total_fluids -= total_fluids*genital.fluid_transfer_factor - if(total_fluids > 5) - fluid_source.reaction(partner.loc, TOUCH, 1, 0) - var/mob/living/carbon/human/H = partner - if(H) - H.cumdrip_rate += rand(5,10) - fluid_source.clear_reagents() - src.visible_message("[src] climaxes with [partner], overflowing and spilling, using [p_their()] [genital.name]!",\ - "You orgasm with [partner], spilling out of them, using your [genital.name].",\ - "You have climaxed with someone, spilling out of them, using your [genital.name].") - SEND_SIGNAL(src, COMSIG_ADD_MOOD_EVENT, "orgasm", /datum/mood_event/orgasm) - SEND_SIGNAL(partner, COMSIG_ADD_MOOD_EVENT, "orgasm", /datum/mood_event/orgasm) + src.visible_message("[src] is about to climax with someone!", \ + "You're about to climax with someone!", \ + "You're preparing to climax with something!") + + if(cover)//covering the partner in cum, this overrides other options. + if(do_after(src, mb_time, target = src) && in_range(src, L)) + fluid_source.trans_to(L, total_fluids*G.fluid_transfer_factor) + total_fluids -= total_fluids*G.fluid_transfer_factor + if(total_fluids > 80) // now thats a big cum! + if(isliving(L)) + var/mutable_appearance/cumoverlaylarge = mutable_appearance('hyperstation/icons/effects/cumoverlay.dmi') + cumoverlaylarge.icon_state = "cum_large" + L.add_overlay(cumoverlaylarge) + + if(total_fluids > 5) + fluid_source.reaction(L.loc, TOUCH, 1, 0) + var/mob/living/carbon/human/H = L + if(H) + H.cumdrip_rate += rand(5,10) + fluid_source.clear_reagents() + src.visible_message("[src] climaxes over [L], using [p_their()] [G.name]!", \ + "You orgasm over [L], using your [G.name].", \ + "You have climaxed over something, using your [G.name].") + SEND_SIGNAL(src, COMSIG_ADD_MOOD_EVENT, "orgasm", /datum/mood_event/orgasm) + + if(isliving(L)) + var/mutable_appearance/cumoverlay = mutable_appearance('hyperstation/icons/effects/cumoverlay.dmi') + cumoverlay.icon_state = "cum_normal" + L.add_overlay(cumoverlay) + else + L.add_cum_overlay() + + setArousalLoss(min_arousal) + if(G.can_climax) + setArousalLoss(min_arousal) + + if(spillage && !cover) + if(do_after(src, mb_time, target = src)) + if(!in_range(src, L) && !remote) + return + fluid_source.trans_to(L, total_fluids*G.fluid_transfer_factor) + total_fluids -= total_fluids*G.fluid_transfer_factor + if(total_fluids > 5) + fluid_source.reaction(L.loc, TOUCH, 1, 0) + var/mob/living/carbon/human/H = L + if(H) + H.cumdrip_rate += rand(5,10) + fluid_source.clear_reagents() + src.visible_message("[src] climaxes with [L][spillage ? ", overflowing and spilling":""], using [p_their()] [G.name]!", \ + "You orgasm with [L][spillage ? ", spilling out of them":""], using your [G.name].", \ + "You have climaxed with someone[spillage ? ", spilling out of them":""], using your [G.name].") + SEND_SIGNAL(src, COMSIG_ADD_MOOD_EVENT, "orgasm", /datum/mood_event/orgasm) + SEND_SIGNAL(L, COMSIG_ADD_MOOD_EVENT, "orgasm", /datum/mood_event/orgasm) + + if(G.can_climax) + setArousalLoss(min_arousal) + else //knots, portal fleshlights, and other non-spilling orgasms - var/can_inflate = TRUE - if(istype(genital, /obj/item/organ/genital/penis)) - var/obj/item/organ/genital/penis/P = genital - if(P.condom)//condomed. - can_inflate = FALSE - src.condomclimax() - if(can_inflate) - fluid_source.trans_to(partner, total_fluids) - if(!spillage && total_fluids > 80) // hyper - cum inflation, ONLY if not wearing a condom - partner.expand_belly(1) - src.visible_message("[src] climaxes with [partner_text], [p_their()] [genital.name] spilling nothing!", \ - "You ejaculate with [partner_text], your [genital.name] spilling nothing.", \ - "You have climaxed inside someone, your [genital.name] spilling nothing.") - if(remote) - to_chat(partner, "You feel someone ejaculate inside you.") - SEND_SIGNAL(src, COMSIG_ADD_MOOD_EVENT, "orgasm", /datum/mood_event/orgasm) - SEND_SIGNAL(partner, COMSIG_ADD_MOOD_EVENT, "orgasm", /datum/mood_event/orgasm) - if(genital.can_climax) - setArousalLoss(min_arousal) + if(!cover) + if(!remote && !in_range(src, L)) + return + if(do_after(src, mb_time, target = src)) + var/mob/living/carbon/H = L + if(!spillage && total_fluids > 80) //hyper inflation; requires a big cumshot to expand + H.expand_belly(1) + var/obj/item/organ/genital/penis/P = G + if (P.condom)//condomed. + src.condomclimax() + else + fluid_source.trans_to(L, total_fluids) + total_fluids = 0 + if(!remote) + src.visible_message("[src] climaxes with [L], [p_their()] [G.name] spilling nothing!", \ + "You ejaculate with [L], your [G.name] spilling nothing.", \ + "You have climaxed inside someone, your [G.name] spilling nothing.") + else + src.visible_message("[src] climaxes with someone, using [p_their()] [G.name]!", \ + "You ejaculate with someone, using your [G.name].", \ + "You have climaxed inside someone, using your [G.name].") + to_chat(L, "You feel someone ejaculate inside you.") + + SEND_SIGNAL(src, COMSIG_ADD_MOOD_EVENT, "orgasm", /datum/mood_event/orgasm) + SEND_SIGNAL(L, COMSIG_ADD_MOOD_EVENT, "orgasm", /datum/mood_event/orgasm) + + if(G.can_climax) + setArousalLoss(min_arousal) + //Hyper - antag code - var/mob/living/carbon/partner_carbon = partner if(src.mind.special_role == ROLE_LEWD_TRAITOR) for(var/datum/objective/obj in src.mind.objectives) - if (partner_carbon.mind == obj.target) - partner_carbon.mind.sexed = TRUE //sexed + if (L.mind == obj.target) + L.mind.sexed = TRUE //sexed to_chat(src, "You feel deep satisfaction with yourself.") - return TRUE + + //Hyper - impreg + if(impreg) + //Role them odds, only people with the dicks can send the chance to the person with the settings enabled at the momment. + if(prob(L.impregchance)) + var/obj/item/organ/genital/womb/W = L.getorganslot("womb") + if(W) //check if they have a womb. + if (L.breedable == 1 && W.pregnant == 0) //Dont get pregnant again, if you are pregnant. + log_game("Debug: [L] has been impregnated by [src]") + to_chat(L, "You feel your hormones change, and a motherly instinct take over.") //leting them know magic has happened. + W.pregnant = 1 + if (HAS_TRAIT(L, TRAIT_HEAT)) + SEND_SIGNAL(L, COMSIG_ADD_MOOD_EVENT, "heat", /datum/mood_event/heat) //well done you perv. + REMOVE_TRAIT(L, TRAIT_HEAT, ROUNDSTART_TRAIT) //take the heat away, you satisfied it! + + //Make breasts produce quicker. + var/obj/item/organ/genital/breasts/B = L.getorganslot("breasts") + if (B.fluid_mult < 0.5 && B) + B.fluid_mult = 0.5 -/** - * User chooses whether or not their climax will spill outside of their partner. - * - * Arguments: - * - `picked_organ`: The user's genital being used. - * - `partner`: This mob's partner for the interaction. - * - `impreg`: Whether or not this interaction has a chance to impregnate. - */ -/mob/living/carbon/human/proc/mob_climax_inside_spillage(obj/item/organ/genital/picked_organ, mob/living/carbon/partner, impreg=FALSE) - var/obj/item/organ/genital/penis/_penis = picked_organ - if(picked_organ.name != "penis" || _penis.sounding || _penis.condom) - mob_climax_in_partner(picked_organ, partner, spillage=FALSE) - return - var/_question = "Would your fluids spill outside?" - var/_title = "Choose overflowing option" - var/spillage = input(src, _question, _title, "Yes") as anything in list("Yes", "No") - if(mob_climax_in_partner(picked_organ, partner, spillage == "Yes") && impreg) - partner.impregnate(by=src) +/mob/living/carbon/human/proc/mob_fill_container(obj/item/organ/genital/G, obj/item/reagent_containers/container, mb_time = 30) //For beaker-filling, beware the bartender + var/total_fluids = 0 + var/datum/reagents/fluid_source = null -/** - * Attempt to climax into a container it, filling it with whatever fluids are - * associated to the selected genitals. - * - * Arguments: - * - `genital`: The genital being used for climax. - * - `container`: The container being targeted. - * - `mb_time`: The warm-up time for this interaction. - */ -/mob/living/carbon/human/proc/mob_fill_container(obj/item/organ/genital/genital, obj/item/reagent_containers/container, mb_time=3 SECONDS) + if(G.name == "penis")//if the select organ is a penis + var/obj/item/organ/genital/penis/P = src.getorganslot("penis") + if(P.condom) //if the penis is condomed + to_chat(src, "You cannot fill containers when there is a condom over your [G.name].") + return + if(P.sounding) //if the penis is sounded + to_chat(src, "You cannot fill containers when there is a rod inside your [G.name].") + return + if(G.producing) //Can it produce its own fluids, such as breasts? + fluid_source = G.reagents + else + if(!G.linked_organ) + to_chat(src, "Your [G.name] is unable to produce it's own fluids, it's missing the organs for it.") + return + fluid_source = G.linked_organ.reagents + total_fluids = fluid_source.total_volume + if(!container) //Something weird happened to_chat(src, "You need a container to do this!") return - var/total_fluids = 0 - var/datum/reagents/fluid_source = genital.get_fluid_source() - if(!fluid_source) - to_chat(src, "Your [genital.name] is unable to produce it's own fluids, it's missing the organs for it.") - return - total_fluids = fluid_source.total_volume - if(genital.name == "penis") - var/obj/item/organ/genital/penis/P = src.getorganslot("penis") - if(P.condom) - to_chat(src, "You cannot fill containers when there is a condom over your [genital.name].") - return - if(P.sounding) - to_chat(src, "You cannot fill containers when there is a rod inside your [genital.name].") - return - src.visible_message("[src] starts to [genital.masturbation_verb] their [genital.name] over [container].", \ - "You start to [genital.masturbation_verb] your [genital.name] over [container].", \ - "You start to [genital.masturbation_verb] your [genital.name] over something.") + + src.visible_message("[src] starts to [G.masturbation_verb] their [G.name] over [container].", \ + "You start to [G.masturbation_verb] your [G.name] over [container].", \ + "You start to [G.masturbation_verb] your [G.name] over something.") if(do_after(src, mb_time, target = src) && in_range(src, container)) fluid_source.trans_to(container, total_fluids) - src.visible_message("[src] uses [p_their()] [genital.name] to fill [container]!", \ - "You used your [genital.name] and fill [container] with a total of [total_fluids]u's.", \ - "You have relieved some pressure.") + src.visible_message("[src] uses [p_their()] [G.name] to fill [container]!", \ + "You used your [G.name] and fill [container] with a total of [total_fluids]u's.", \ + "You have relieved some pressure.") SEND_SIGNAL(src, COMSIG_ADD_MOOD_EVENT, "orgasm", /datum/mood_event/orgasm) container.add_cum_overlay() //your aim is bad... - if(genital.can_climax) + if(G.can_climax) setArousalLoss(min_arousal) -/** - * Prompts the user to select one of their target's genitals to interact with. - * The target must have their genitals visible to be selectable. - * - * Returns: `null`|`obj/item/organ/genital`: The selected genital. - */ -/mob/living/carbon/human/proc/target_genitals(mob/living/carbon/human/T) +/mob/living/carbon/human/proc/pick_masturbate_genitals() var/obj/item/organ/genital/ret_organ var/list/genitals_list = list() - for(var/obj/item/organ/genital/genital in T.internal_organs) - if(genital.is_exposed() && !genital.dontlist) - genitals_list += genital + var/list/worn_stuff = get_equipped_items() + + for(var/obj/item/organ/genital/G in internal_organs) + if(G.can_masturbate_with) //filter out what you can't masturbate with + if(G.is_exposed(worn_stuff)) //Nude or through_clothing + if(!G.dontlist) + genitals_list += G + if(genitals_list.len) + ret_organ = input(src, "with what?", "Masturbate", null) as null|obj in genitals_list + return ret_organ + return null //error stuff + +/mob/living/carbon/human/proc/target_genitals(mob/living/carbon/human/T) //used for targeting others + var/obj/item/organ/genital/ret_organ + var/list/genitals_list = list() + var/list/worn_stuff = get_equipped_items() + + for(var/obj/item/organ/genital/G in T.internal_organs) + if(G.is_exposed(worn_stuff)) //Nude or through_clothing + if(!G.dontlist) + genitals_list += G if(genitals_list.len) ret_organ = input(src, "", "Genitals", null) as null|obj in genitals_list return ret_organ return null //error stuff - -/** - * Prompts the user to select genitals. The genitals must be exposed to be selectable. - * - * Arguments: - * - `masturbation`: Whether or not this is being used for masturbation interactions. - * - `title`: The title of the prompt window. - * - * Returns: `null`|`obj/item/organ/genital`: The selected genital. - */ -/mob/living/carbon/human/proc/pick_climax_genitals(masturbation=FALSE, title="Climax") +/mob/living/carbon/human/proc/pick_climax_genitals() var/obj/item/organ/genital/ret_organ var/list/genitals_list = list() - for(var/obj/item/organ/genital/genital in internal_organs) - if(genital.can_climax && genital.is_exposed() && !genital.dontlist) - if(!masturbation || genital.can_masturbate_with) - genitals_list += genital + var/list/worn_stuff = get_equipped_items() + + for(var/obj/item/organ/genital/G in internal_organs) + if(G.can_climax) //filter out what you can't masturbate with + if(G.is_exposed(worn_stuff)) //Nude or through_clothing + if(!G.dontlist) + genitals_list += G if(genitals_list.len) - ret_organ = input(src, "with what?", title, null) as null|obj in genitals_list + ret_organ = input(src, "with what?", "Climax", null) as null|obj in genitals_list return ret_organ return null //error stuff - -/** - * Prompts the user to select a mob that they are either pulling or being pulled by. - * - * Arguments: - * - `needs_exposed`: Whether or not the partner must have exposed genitals. - * Returns: `null`|`mob/living/carbon`: The selected mob. - */ -/mob/living/carbon/human/proc/pick_partner(needs_exposed=TRUE) - var/list/partners = list(src.pulling, src.pulledby) +/mob/living/carbon/human/proc/pick_partner_overide() //used for cumming on people without genitals exposed + var/list/partners = list() + if(src.pulling) + partners += src.pulling //Yes, even objects for now + if(src.pulledby) + partners += src.pulledby + //Now we got both of them, let's check if they're proper for(var/I in partners) - if(!iscarbon(I)) - partners -= I - continue - if(!needs_exposed) - continue - var/mob/living/carbon/C = I - if(!C.exposed_genitals.len && !C.is_groin_exposed() && !C.is_chest_exposed()) - partners -= I + if(isliving(I)) + else + partners -= I //No fucking objects + //NOW the list should only contain correct partners if(!partners.len) - return null - return input(src, "With whom?", "Sexual partner", null) as null|mob in partners + return null //No one left. + return input(src, "With whom?", "Sexual partner", null) in partners //pick one, default to null +/mob/living/carbon/human/proc/pick_partner() + var/list/partners = list() + if(src.pulling) + partners += src.pulling //Yes, even objects for now + if(src.pulledby) + partners += src.pulledby + //Now we got both of them, let's check if they're proper + for(var/I in partners) + if(isliving(I)) + if(iscarbon(I)) + var/mob/living/carbon/C = I + if(!C.exposed_genitals.len) //Nothing through_clothing + if(!C.is_groin_exposed()) //No pants undone + if(!C.is_chest_exposed()) //No chest exposed + partners -= I //Then not proper, remove them + else + partners -= I //No fucking objects + //NOW the list should only contain correct partners + if(!partners.len) + return null //No one left. + return input(src, "With whom?", "Sexual partner", null) in partners //pick one, default to null -/** - * Prompts the user to provide a container (or food item) based on what's in their hands. - * - * Returns: `null`|`obj/item/reagent_containers` - The selected container. - */ /mob/living/carbon/human/proc/pick_climax_container() var/obj/item/reagent_containers/SC = null var/list/containers_list = list() + for(var/obj/item/reagent_containers/container in held_items) if(container.is_open_container() || istype(container, /obj/item/reagent_containers/food/snacks)) containers_list += container + if(containers_list.len) - SC = input(src, "Into or onto what? (Cancel for nowhere)", null) as null|obj in containers_list + SC = input(src, "Into or onto what?(Cancel for nowhere)", null) as null|obj in containers_list if(SC) if(in_range(src, SC)) return SC - return null + return null //If nothing correct, give null. -/** - * The old arousal menu. This shows a BYOND-style input selection menu that - * emulates the same functionality as the newer one. - */ -/mob/living/carbon/human/mob_climax() - if(!canbearoused || !has_dna()) +//Here's the main proc itself +/mob/living/carbon/human/mob_climax(forced_climax=FALSE) //Forced is instead of the other proc, makes you cum if you have the tools for it, ignoring restraints + if(stat == DEAD) //corpses can't cum return if(mb_cd_timer > world.time) - to_chat(src, "You need to wait [DisplayTimeText((mb_cd_timer - world.time), TRUE)] before you can do that again!") + if(!forced_climax) //Don't spam the message to the victim if forced to come too fast + to_chat(src, "You need to wait [DisplayTimeText((mb_cd_timer - world.time), TRUE)] before you can do that again!") return mb_cd_timer = (world.time + mb_cd_length) - if(stat == DEAD) - to_chat(src, "You can't do that while dead!") - return - if(stat == UNCONSCIOUS) - to_chat(src, "You must be conscious to do that!") - return - if(getArousalLoss() < 33) - to_chat(src, "You aren't aroused enough for that!") - return - var/list/choices = list("Masturbate", "Climax alone", "Climax with partner","Climax over partner", "Fill container", "Remove condom", "Remove sounding rod") - var/choice = input(src, "Select sexual activity", "Sexual activity:") as null|anything in choices - switch(choice) - if("Remove sounding rod") - if(restrained(TRUE)) //TRUE ignores grabs - to_chat(src, "You can't do that while restrained!") - return - var/free_hands = get_num_arms() - if(!free_hands) - to_chat(src, "You need at least one free arm.") - return - var/obj/item/organ/genital/penis/P = src.getorganslot("penis") - if(!P.sounding) - to_chat(src, "You don't have a rod inside!") - return - if(P.sounding) - to_chat(src, "You pull the rod off from the tip of your penis!") - src.removesounding() - return + + + if(canbearoused && has_dna()) + if(stat==2) + to_chat(src, "You can't do that while dead!") + return + if(forced_climax) //Something forced us to cum, this is not a masturbation thing and does not progress to the other checks + for(var/obj/item/organ/O in internal_organs) + if(istype(O, /obj/item/organ/genital)) + var/obj/item/organ/genital/G = O + if(!G.can_climax) //Skip things like wombs and testicles + continue + var/mob/living/partner + var/check_target + var/list/worn_stuff = get_equipped_items() + + if(G.is_exposed(worn_stuff)) + if(src.pulling) //Are we pulling someone? Priority target, we can't be making option menus for this, has to be quick + if(isliving(src.pulling)) //Don't fuck objects + check_target = src.pulling + if(src.pulledby && !check_target) //prioritise pulled over pulledby + if(isliving(src.pulledby)) + check_target = src.pulledby + //Now we should have a partner, or else we have to come alone + if(check_target) + if(iscarbon(check_target)) //carbons can have clothes + var/mob/living/carbon/C = check_target + if(C.exposed_genitals.len || C.is_groin_exposed() || C.is_chest_exposed()) //Are they naked enough? + partner = C + if(partner) //Did they pass the clothing checks? + mob_climax_partner(G, partner, mb_time = 0) //Instant climax due to forced + continue //You've climaxed once with this organ, continue on + //not exposed OR if no partner was found while exposed, climax alone + mob_climax_outside(G, mb_time = 0) //removed climax timer for sudden, forced orgasms + //Now all genitals that could climax, have. + //Since this was a forced climax, we do not need to continue with the other stuff + return + //If we get here, then this is not a forced climax and we gotta check a few things. + + if(stat==1) //No sleep-masturbation, you're unconscious. + to_chat(src, "You must be conscious to do that!") + return + if(getArousalLoss() < 33) //flat number instead of percentage + to_chat(src, "You aren't aroused enough for that!") return - if("Remove condom") - if(restrained(TRUE)) //TRUE ignores grabs - to_chat(src, "You can't do that while restrained!") - return - var/free_hands = get_num_arms() - if(!free_hands) - to_chat(src, "You need at least one free arm.") - return - var/obj/item/organ/genital/penis/P = src.getorganslot("penis") - if(!P.condom) - to_chat(src, "You don't have a condom on!") - return - if(P.condom) - to_chat(src, "You tug the condom off the end of your penis!") - src.removecondom() - return - return + //Ok, now we check what they want to do. + var/choice = input(src, "Select sexual activity", "Sexual activity:") in list("Masturbate", "Climax alone", "Climax with partner","Climax over partner", "Fill container", "Remove condom", "Remove sounding rod") - if("Masturbate") - if(restrained(TRUE)) //TRUE ignores grabs - to_chat(src, "You can't do that while restrained!") - return - var/free_hands = get_num_arms() - if(!free_hands) - to_chat(src, "You need at least one free arm.") - return - for(var/helditem in held_items)//how many hands are free - if(isobj(helditem)) - free_hands-- - if(free_hands <= 0) - to_chat(src, "You're holding too many things.") - return - //We got hands, let's pick an organ - var/obj/item/organ/genital/picked_organ - picked_organ = pick_climax_genitals(masturbation=TRUE, title="Masturbation") - if(picked_organ) - mob_masturbate(picked_organ) - return - else //They either lack organs that can masturbate, or they didn't pick one. - to_chat(src, "You cannot masturbate without choosing genitals.") - return - - if("Climax alone") - if(restrained(TRUE)) //TRUE ignores grabs - to_chat(src, "You can't do that while restrained!") - return - var/free_hands = get_num_arms() - if(!free_hands) - to_chat(src, "You need at least one free arm.") - return - for(var/helditem in held_items)//how many hands are free - if(isobj(helditem)) - free_hands-- - if(free_hands <= 0) - to_chat(src, "You're holding too many things.") - return - //We got hands, let's pick an organ - var/obj/item/organ/genital/picked_organ - picked_organ = pick_climax_genitals() - if(picked_organ) - mob_climax_outside(picked_organ) - return - else //They either lack organs that can masturbate, or they didn't pick one. - to_chat(src, "You cannot climax without choosing genitals.") - return - - if("Climax with partner") - //We need no hands, we can be restrained and so on, so let's pick an organ - var/obj/item/organ/genital/picked_organ - picked_organ = pick_climax_genitals() - if(!picked_organ) - to_chat(src, "You cannot climax without choosing genitals.") - return - var/mob/living/carbon/partner = pick_partner() //Get someone - if(!partner) - to_chat(src, "You cannot do this alone.") - return - var/obj/item/organ/genital/penis/P = picked_organ - var/impreg = "No" - if(partner.breedable && picked_organ.name == "penis" && !P.condom && !P.sounding) - var/impreg_question = "Would this action carry the risk of pregnancy?" - var/impreg_title = "Choose a option" - impreg = input(src, impreg_question, impreg_title, "Yes") as anything in list("Yes", "No") - mob_climax_inside_spillage(picked_organ, partner, impreg == "Yes") - - if("Climax over partner") - var/obj/item/organ/genital/picked_organ - picked_organ = pick_climax_genitals() - if(picked_organ) - var/mob/living/carbon/partner = pick_partner(needs_exposed=FALSE) //Get your partner, clothed or not. - if(partner) - mob_climax_cover(picked_organ, partner) - else - to_chat(src, "You cannot do this alone.") - - if("Fill container") - //We'll need hands and no restraints. - if(restrained(TRUE)) //TRUE ignores grabs - to_chat(src, "You can't do that while restrained!") - return - var/free_hands = get_num_arms() - if(!free_hands) - to_chat(src, "You need at least one free arm.") - return - for(var/helditem in held_items)//how many hands are free - if(isobj(helditem)) - free_hands-- - if(free_hands <= 0) - to_chat(src, "You're holding too many things.") - return - //We got hands, let's pick an organ - var/obj/item/organ/genital/picked_organ - picked_organ = pick_climax_genitals() //Gotta be climaxable, not just masturbation, to fill with fluids. - if(picked_organ) - //Good, got an organ, time to pick a container - var/obj/item/reagent_containers/fluid_container = pick_climax_container() - if(fluid_container) - mob_fill_container(picked_organ, fluid_container) + switch(choice) + if("Remove sounding rod") + if(restrained(TRUE)) //TRUE ignores grabs + to_chat(src, "You can't do that while restrained!") return - else - to_chat(src, "You cannot do this without anything to fill.") + var/free_hands = get_num_arms() + if(!free_hands) + to_chat(src, "You need at least one free arm.") + return + var/obj/item/organ/genital/penis/P = src.getorganslot("penis") + if(!P.sounding) + to_chat(src, "You don't have a rod inside!") + return + if(P.sounding) + to_chat(src, "You pull the rod off from the tip of your penis!") + src.removesounding() return - else //They either lack organs that can climax, or they didn't pick one. - to_chat(src, "You cannot fill anything without choosing genitals.") return - else //Somehow another option was taken, maybe something interrupted the selection or it was cancelled - return //Just end it in that case. + if("Remove condom") + if(restrained(TRUE)) //TRUE ignores grabs + to_chat(src, "You can't do that while restrained!") + return + var/free_hands = get_num_arms() + if(!free_hands) + to_chat(src, "You need at least one free arm.") + return + var/obj/item/organ/genital/penis/P = src.getorganslot("penis") + if(!P.condom) + to_chat(src, "You don't have a condom on!") + return + if(P.condom) + to_chat(src, "You tug the condom off the end of your penis!") + src.removecondom() + return + return -/** - * Causes a mob to climax on the spot. There is no warmup time, nor a - * menu for selecting genitals. Instead, the mob will climax using all - * climaxable genitals, either onto their location (floor) or on whatever - * is pulling/being pulled by them. - */ -/mob/living/carbon/proc/mob_climax_instant(arousal=100) - if(stat == DEAD) //corpses can't cum - to_chat(src, "You can't do that while dead!") - return - if(!can_orgasm(arousal)) - return - var/mob/living/carbon/human/user_human = src - for(var/obj/item/organ/O in internal_organs) - if(!istype(O, /obj/item/organ/genital)) - continue - var/obj/item/organ/genital/current_genital = O - if(!current_genital.can_climax) - continue // no wombs or testicles - var/mob/living/carbon/partner - var/check_target - if(current_genital.is_exposed()) - if(src.pulling) - if(iscarbon(src.pulling)) - check_target = src.pulling - else if(src.pulledby) - if(iscarbon(src.pulledby)) - check_target = src.pulledby - if(check_target) - var/mob/living/carbon/C = check_target - if(C.exposed_genitals.len || C.is_groin_exposed() || C.is_chest_exposed()) - partner = C - if(partner) - user_human.mob_climax_in_partner(current_genital, partner, mb_time=0) - continue - user_human.mob_climax_outside(current_genital, mb_time=0) - return + if("Masturbate") + if(restrained(TRUE)) //TRUE ignores grabs + to_chat(src, "You can't do that while restrained!") + return + var/free_hands = get_num_arms() + if(!free_hands) + to_chat(src, "You need at least one free arm.") + return + for(var/helditem in held_items)//how many hands are free + if(isobj(helditem)) + free_hands-- + if(free_hands <= 0) + to_chat(src, "You're holding too many things.") + return + //We got hands, let's pick an organ + var/obj/item/organ/genital/picked_organ + picked_organ = pick_masturbate_genitals() + if(picked_organ) + mob_masturbate(picked_organ) + return + else //They either lack organs that can masturbate, or they didn't pick one. + to_chat(src, "You cannot masturbate without choosing genitals.") + return + if("Climax alone") + if(restrained(TRUE)) //TRUE ignores grabs + to_chat(src, "You can't do that while restrained!") + return + var/free_hands = get_num_arms() + if(!free_hands) + to_chat(src, "You need at least one free arm.") + return + for(var/helditem in held_items)//how many hands are free + if(isobj(helditem)) + free_hands-- + if(free_hands <= 0) + to_chat(src, "You're holding too many things.") + return + //We got hands, let's pick an organ + var/obj/item/organ/genital/picked_organ + picked_organ = pick_climax_genitals() + if(picked_organ) + mob_climax_outside(picked_organ) + return + else //They either lack organs that can masturbate, or they didn't pick one. + to_chat(src, "You cannot climax without choosing genitals.") + return + + if("Climax with partner") + //We need no hands, we can be restrained and so on, so let's pick an organ + var/obj/item/organ/genital/picked_organ + picked_organ = pick_climax_genitals() + if(picked_organ) + var/mob/living/partner = pick_partner() //Get someone + if(partner) + var/obj/item/organ/genital/penis/P = picked_organ + if(partner.breedable == 1 && picked_organ.name == "penis"&&!P.condom == 1&&!P.sounding == 1) + var/impreg = input(src, "Would this action carry the risk of pregnancy?", "Choose a option", "Yes") as anything in list("Yes", "No") + if(impreg == "Yes") //If we are impregging + var/spillage = input(src, "Would your fluids spill outside?", "Choose overflowing option", "Yes") as anything in list("Yes", "No") + if(spillage == "Yes") + mob_climax_partner(picked_organ, partner, TRUE, TRUE, FALSE) + else + mob_climax_partner(picked_organ, partner, FALSE, TRUE, FALSE) + else + var/spillage = input(src, "Would your fluids spill outside?", "Choose overflowing option", "Yes") as anything in list("Yes", "No") + if(spillage == "Yes") + mob_climax_partner(picked_organ, partner, TRUE, FALSE, FALSE) + else + mob_climax_partner(picked_organ, partner, FALSE, FALSE, FALSE) //Wow, im trash at coding, I need to find a better way of coding this, ill rewrite it later.-quote + return + + else //If we arent impregging + var/spillage = input(src, "Would your fluids spill outside?", "Choose overflowing option", "Yes") as anything in list("Yes", "No") + if(spillage == "Yes") + mob_climax_partner(picked_organ, partner, TRUE, FALSE, FALSE) + else + mob_climax_partner(picked_organ, partner, FALSE, FALSE, FALSE) + return + + else + to_chat(src, "You cannot do this alone.") + return + else //They either lack organs that can masturbate, or they didn't pick one. + to_chat(src, "You cannot climax without choosing genitals.") + return + if("Climax over partner") + var/obj/item/organ/genital/picked_organ + picked_organ = pick_climax_genitals() + if(picked_organ) + var/mob/living/partner = pick_partner_overide() //Get your partner, clothed or not. + if(partner) + mob_climax_partner(picked_organ, partner, FALSE, FALSE, TRUE) + else + to_chat(src, "You cannot do this alone.") + + if("Fill container") + //We'll need hands and no restraints. + if(restrained(TRUE)) //TRUE ignores grabs + to_chat(src, "You can't do that while restrained!") + return + var/free_hands = get_num_arms() + if(!free_hands) + to_chat(src, "You need at least one free arm.") + return + for(var/helditem in held_items)//how many hands are free + if(isobj(helditem)) + free_hands-- + if(free_hands <= 0) + to_chat(src, "You're holding too many things.") + return + //We got hands, let's pick an organ + var/obj/item/organ/genital/picked_organ + picked_organ = pick_climax_genitals() //Gotta be climaxable, not just masturbation, to fill with fluids. + if(picked_organ) + //Good, got an organ, time to pick a container + var/obj/item/reagent_containers/fluid_container = pick_climax_container() + if(fluid_container) + mob_fill_container(picked_organ, fluid_container) + return + else + to_chat(src, "You cannot do this without anything to fill.") + return + else //They either lack organs that can climax, or they didn't pick one. + to_chat(src, "You cannot fill anything without choosing genitals.") + return + else //Somehow another option was taken, maybe something interrupted the selection or it was cancelled + return //Just end it in that case. -/** - * Rolls a chance for the mob to get pregnant, assuming they are capable of doing so. - * - * Arguments: - * - `by` - The mob that is impregnating this one. - */ -/mob/living/carbon/proc/impregnate(mob/living/carbon/by) - var/obj/item/organ/genital/womb/W = getorganslot("womb") - if(!W || W.pregnant || !breedable) - return - if(!prob(impregchance)) - return - W.pregnant = TRUE - log_game("DEBUG: [src] has been impregnated by [by]") - to_chat(src, "You feel your hormones change, and a motherly instinct take over.") - if(HAS_TRAIT(src, TRAIT_HEAT)) - SEND_SIGNAL(src, COMSIG_ADD_MOOD_EVENT, "heat", /datum/mood_event/heat) - REMOVE_TRAIT(src, TRAIT_HEAT, ROUNDSTART_TRAIT) - var/obj/item/organ/genital/breasts/B = src.getorganslot("breasts") - if (B && B.fluid_mult < 0.5) - B.fluid_mult = 0.5 \ No newline at end of file diff --git a/modular_citadel/code/modules/arousal/organs/anus.dm b/modular_citadel/code/modules/arousal/organs/anus.dm index 73cedd56d..11a31bc68 100644 --- a/modular_citadel/code/modules/arousal/organs/anus.dm +++ b/modular_citadel/code/modules/arousal/organs/anus.dm @@ -36,12 +36,6 @@ size_name = "hefty" if(5) size_name = "godly" - if(6) - size_name = "gigantic" - if(7) - size_name = "unfathomably large" - if(8) - size_name = "absolute dumptruck" else size_name = "nonexistant" diff --git a/modular_citadel/code/modules/arousal/organs/genitals.dm b/modular_citadel/code/modules/arousal/organs/genitals.dm index 9edea910a..bdf4d7856 100644 --- a/modular_citadel/code/modules/arousal/organs/genitals.dm +++ b/modular_citadel/code/modules/arousal/organs/genitals.dm @@ -78,21 +78,22 @@ if("Always visible") through_clothes = TRUE hidden = FALSE - mode = GENITALS_VISIBLE + mode = "visible" if(!(src in owner.exposed_genitals)) owner.exposed_genitals += src if("Hidden by clothes") through_clothes = FALSE hidden = FALSE - mode = GENITALS_CLOTHES + mode = "clothes" if(src in owner.exposed_genitals) owner.exposed_genitals -= src if("Always hidden") through_clothes = FALSE hidden = TRUE - mode = GENITALS_HIDDEN + mode = "hidden" if(src in owner.exposed_genitals) owner.exposed_genitals -= src + if(ishuman(owner)) //recast to use update genitals proc var/mob/living/carbon/human/H = owner H.update_genitals() diff --git a/modular_citadel/code/modules/client/loadout/shoes.dm b/modular_citadel/code/modules/client/loadout/shoes.dm index 284a9afde..d4da69d2c 100644 --- a/modular_citadel/code/modules/client/loadout/shoes.dm +++ b/modular_citadel/code/modules/client/loadout/shoes.dm @@ -111,9 +111,4 @@ /datum/gear/cowboyboots/black name = "Cowboy Boots, Black" category = SLOT_SHOES - path = /obj/item/clothing/shoes/cowboyboots/black - -/datum/gear/threepwoodboots - name = "theepwood's boots" - category = SLOT_SHOES - path = /obj/item/clothing/shoes/threepwoodboots + path = /obj/item/clothing/shoes/cowboyboots/black diff --git a/modular_citadel/code/modules/client/loadout/suit.dm b/modular_citadel/code/modules/client/loadout/suit.dm index eb02a07db..7797e1f7b 100644 --- a/modular_citadel/code/modules/client/loadout/suit.dm +++ b/modular_citadel/code/modules/client/loadout/suit.dm @@ -259,8 +259,3 @@ name = "Bathrobe" category = SLOT_WEAR_SUIT path = /obj/item/clothing/suit/bathrobe - -/datum/gear/uniform/threepwoodjacket - name = "threepwood's jacket" - category = SLOT_WEAR_SUIT - path = /obj/item/clothing/suit/threepwoodjacket diff --git a/modular_citadel/code/modules/client/loadout/uniform.dm b/modular_citadel/code/modules/client/loadout/uniform.dm index d688ee979..fcc6846c2 100644 --- a/modular_citadel/code/modules/client/loadout/uniform.dm +++ b/modular_citadel/code/modules/client/loadout/uniform.dm @@ -541,10 +541,4 @@ name = "vault jumpsuit" category = SLOT_W_UNIFORM path = /obj/item/clothing/under/vaultsuit - cost = 1 - -/datum/gear/threepwood - name = "threepwood's outfit" - category = SLOT_W_UNIFORM - path = /obj/item/clothing/under/threepwood cost = 1 \ No newline at end of file diff --git a/modular_citadel/code/modules/client/preferences_savefile.dm b/modular_citadel/code/modules/client/preferences_savefile.dm index 3067e680a..fae7e9e0d 100644 --- a/modular_citadel/code/modules/client/preferences_savefile.dm +++ b/modular_citadel/code/modules/client/preferences_savefile.dm @@ -2,9 +2,9 @@ //ipcs S["feature_ipc_screen"] >> features["ipc_screen"] S["feature_ipc_antenna"] >> features["ipc_antenna"] + features["ipc_screen"] = sanitize_inlist(features["ipc_screen"], GLOB.ipc_screens_list) features["ipc_antenna"] = sanitize_inlist(features["ipc_antenna"], GLOB.ipc_antennas_list) - //Citadel features["flavor_text"] = sanitize_text(features["flavor_text"], initial(features["flavor_text"])) features["ooc_text"] = sanitize_text(features["ooc_text"], initial(features["ooc_text"])) @@ -35,7 +35,6 @@ LAZYADD(chosen_gear, path) gear_points -= initial(path.cost) - /datum/preferences/proc/cit_character_pref_save(savefile/S) //ipcs WRITE_FILE(S["feature_ipc_screen"], features["ipc_screen"]) diff --git a/modular_citadel/code/modules/integrated_electronics/subtypes/manipulation.dm b/modular_citadel/code/modules/integrated_electronics/subtypes/manipulation.dm index e3eab59c5..547c1a576 100644 --- a/modular_citadel/code/modules/integrated_electronics/subtypes/manipulation.dm +++ b/modular_citadel/code/modules/integrated_electronics/subtypes/manipulation.dm @@ -25,12 +25,12 @@ if(ismob(M) && M.canbearoused && arousal_gain != 0) var/orgasm = FALSE if(arousal_gain > 0) - if(M.can_orgasm()) + if(M.getArousalLoss() >= 100 && ishuman(M) && M.has_dna()) var/mob/living/carbon/human/H = M var/orgasm_message = pick("A sharp pulse of electricity pushes you to orgasm!", "You feel a jolt of electricity force you into orgasm!") H.visible_message("\The [assembly] electrodes shock [H]!", "[orgasm_message]") playsound(src, "sound/effects/light_flicker.ogg", 30, 1) - H.mob_climax_instant() + H.mob_climax(forced_climax=TRUE) orgasm = TRUE else M.adjustArousalLoss(arousal_gain) diff --git a/modular_citadel/code/modules/mob/dead/new_player/sprite_accessories.dm b/modular_citadel/code/modules/mob/dead/new_player/sprite_accessories.dm index 5002d4f52..c2f6f2e58 100644 --- a/modular_citadel/code/modules/mob/dead/new_player/sprite_accessories.dm +++ b/modular_citadel/code/modules/mob/dead/new_player/sprite_accessories.dm @@ -2121,7 +2121,7 @@ datum/sprite_accessory/ears/human/gret /datum/sprite_accessory/antenna icon = 'modular_citadel/icons/mob/ipc_antennas.dmi' - color_src = MUTCOLORS3 + color_src = MUTCOLORS2 recommended_species = list("ipc") /datum/sprite_accessory/antenna/none diff --git a/modular_citadel/code/modules/mob/living/carbon/human/species_types/furrypeople.dm b/modular_citadel/code/modules/mob/living/carbon/human/species_types/furrypeople.dm index fe0e28949..2aa99b95a 100644 --- a/modular_citadel/code/modules/mob/living/carbon/human/species_types/furrypeople.dm +++ b/modular_citadel/code/modules/mob/living/carbon/human/species_types/furrypeople.dm @@ -261,7 +261,7 @@ mutant_heart = /obj/item/organ/heart/ipc mutantlungs = /obj/item/organ/lungs/ipc mutantliver = /obj/item/organ/liver/ipc - mutantstomach = /obj/item/organ/stomach/synthliz + mutantstomach = /obj/item/organ/stomach/ipc mutanteyes = /obj/item/organ/eyes/ipc exotic_bloodtype = "SY" diff --git a/modular_citadel/code/modules/mob/living/carbon/human/species_types/ipc.dm b/modular_citadel/code/modules/mob/living/carbon/human/species_types/ipc.dm index be91215e9..f1f7c07a3 100644 --- a/modular_citadel/code/modules/mob/living/carbon/human/species_types/ipc.dm +++ b/modular_citadel/code/modules/mob/living/carbon/human/species_types/ipc.dm @@ -6,8 +6,7 @@ icon_limbs = DEFAULT_BODYPART_ICON_CITADEL blacklisted = 0 sexes = 0 - species_traits = list(MUTCOLORS,NOEYES,NOTRANSSTING,NOMOUTH) - inherent_traits = list(TRAIT_NOTHIRST) + species_traits = list(MUTCOLORS,NOEYES,NOTRANSSTING) inherent_biotypes = MOB_ROBOTIC|MOB_HUMANOID mutant_bodyparts = list("ipc_screen", "ipc_antenna") default_features = list("ipc_screen" = "Blank", "ipc_antenna" = "None") @@ -17,9 +16,8 @@ mutant_heart = /obj/item/organ/heart/ipc mutantlungs = /obj/item/organ/lungs/ipc mutantliver = /obj/item/organ/liver/ipc - mutantstomach = /obj/item/organ/stomach/cell + mutantstomach = /obj/item/organ/stomach/ipc mutanteyes = /obj/item/organ/eyes/ipc - mutant_organs = list(/obj/item/organ/cyberimp/arm/power_cord) // oracle port exotic_bloodtype = "HF" diff --git a/modular_citadel/code/modules/mob/living/silicon/robot/robot_modules.dm b/modular_citadel/code/modules/mob/living/silicon/robot/robot_modules.dm index 39684f180..cce251f72 100644 --- a/modular_citadel/code/modules/mob/living/silicon/robot/robot_modules.dm +++ b/modular_citadel/code/modules/mob/living/silicon/robot/robot_modules.dm @@ -10,9 +10,6 @@ /mob/living/silicon/robot/modules/borgi set_module = /obj/item/robot_module/borgi -/mob/living/silicon/robot/modules/orepup - set_module = /obj/item/robot_module/orepup - /mob/living/silicon/robot/proc/get_cit_modules() var/list/modulelist = list() modulelist["MediHound"] = /obj/item/robot_module/medihound @@ -20,7 +17,6 @@ modulelist["Security K-9"] = /obj/item/robot_module/k9 modulelist["Scrub Puppy"] = /obj/item/robot_module/scrubpup modulelist["Borgi"] = /obj/item/robot_module/borgi - modulelist["Orepup"] = /obj/item/robot_module/orepup return modulelist /obj/item/robot_module @@ -265,13 +261,14 @@ cyborg_icon_override = 'modular_citadel/icons/mob/robots.dmi' has_snowflake_deadsprite = TRUE +/* /obj/item/robot_module/orepup name = "Ore Pup" basic_modules = list( /obj/item/storage/bag/ore/cyborg, /obj/item/analyzer/nose, /obj/item/storage/bag/borgdelivery, - /obj/item/dogborg/sleeper/compactor/ore, + /obj/item/dogborg/sleeper/ore, /obj/item/pickaxe/drill/cyborg, /obj/item/shovel, /obj/item/crowbar/cyborg, @@ -285,33 +282,20 @@ /obj/item/clockwork/slab/cyborg/miner, /obj/item/clockwork/weapon/ratvarian_spear, /obj/item/borg/sight/xray/truesight_lens) - cyborg_base_icon = "blade" - moduleselect_icon = "miner" - sleeper_overlay = "bladesleeper" + cyborg_base_icon = "orepup" + moduleselect_icon = "orepup" + sleeper_overlay = "osleeper" cyborg_icon_override = 'modular_citadel/icons/mob/widerobot.dmi' has_snowflake_deadsprite = TRUE cyborg_pixel_offset = -16 - -/obj/item/robot_module/orepup/be_transformed_to(obj/item/robot_module/old_module) +/obj/item/robot_module/miner/do_transform_animation() var/mob/living/silicon/robot/R = loc - var/static/list/orepup_models - if(!orepup_models) - orepup_models = list( - "blade" = image(icon = 'modular_citadel/icons/mob/widerobot.dmi', icon_state = "blade"), - "vale" = image(icon = 'modular_citadel/icons/mob/widerobot.dmi', icon_state = "valemine") - ) - orepup_models = sortList(orepup_models) - var/orepup_borg_icon = show_radial_menu(R, R , orepup_models, custom_check = CALLBACK(src, .proc/check_menu, R), radius = 42, require_near = TRUE, tooltips = TRUE) - if(!orepup_borg_icon) - return - switch(orepup_borg_icon) - if("blade") - cyborg_base_icon = "blade" - if("vale") - cyborg_base_icon = "valemine" - sleeper_overlay = "valeminesleeper" - has_snowflake_deadsprite = TRUE - return ..() + R.cut_overlays() + R.setDir(SOUTH) + flick("orepup_transform", R) + do_transform_delay() + R.update_headlamp() +*/ /obj/item/robot_module/medical/be_transformed_to(obj/item/robot_module/old_module) var/mob/living/silicon/robot/R = loc @@ -369,7 +353,7 @@ cyborg_base_icon = "haydeemedical" cyborg_icon_override = 'modular_citadel/icons/mob/robots.dmi' hat_offset = 3 - + if("qualified_doctor") cyborg_base_icon = "qualified_doctor" cyborg_icon_override = 'modular_citadel/icons/mob/robots.dmi' diff --git a/modular_citadel/code/modules/reagents/reagents/cit_reagents.dm b/modular_citadel/code/modules/reagents/reagents/cit_reagents.dm index 30c528cc0..324b44db3 100644 --- a/modular_citadel/code/modules/reagents/reagents/cit_reagents.dm +++ b/modular_citadel/code/modules/reagents/reagents/cit_reagents.dm @@ -197,7 +197,7 @@ /datum/reagent/drug/aphrodisiacplus/overdose_process(mob/living/M) if(M && M.canbearoused && !(M.client?.prefs.cit_toggles & NO_APHRO) && prob(33)) - if(prob(5) && M.can_orgasm()) + if(prob(5) && M.getArousalLoss() >= 100 && ishuman(M) && M.has_dna()) if(prob(5)) //Less spam to_chat(M, "Your libido is going haywire!") if(M.min_arousal < 50) diff --git a/modular_citadel/icons/mob/ipc_antennas.dmi b/modular_citadel/icons/mob/ipc_antennas.dmi index 77c4930ef..9f20aa442 100644 Binary files a/modular_citadel/icons/mob/ipc_antennas.dmi and b/modular_citadel/icons/mob/ipc_antennas.dmi differ diff --git a/modular_citadel/icons/mob/ipc_screens.dmi b/modular_citadel/icons/mob/ipc_screens.dmi index 938cfe555..c7d44da5a 100644 Binary files a/modular_citadel/icons/mob/ipc_screens.dmi and b/modular_citadel/icons/mob/ipc_screens.dmi differ diff --git a/modular_citadel/icons/mob/mutant_bodyparts.dmi b/modular_citadel/icons/mob/mutant_bodyparts.dmi index 7b9b87f50..b4fad43ba 100644 Binary files a/modular_citadel/icons/mob/mutant_bodyparts.dmi and b/modular_citadel/icons/mob/mutant_bodyparts.dmi differ diff --git a/modular_citadel/icons/mob/widerobot.dmi b/modular_citadel/icons/mob/widerobot.dmi index 50c29bb75..4ff89322d 100644 Binary files a/modular_citadel/icons/mob/widerobot.dmi and b/modular_citadel/icons/mob/widerobot.dmi differ diff --git a/modular_citadel/icons/obj/genitals/breasts_onmob.dmi b/modular_citadel/icons/obj/genitals/breasts_onmob.dmi index e8573ec54..cd960abbc 100644 Binary files a/modular_citadel/icons/obj/genitals/breasts_onmob.dmi and b/modular_citadel/icons/obj/genitals/breasts_onmob.dmi differ diff --git a/modular_citadel/icons/obj/genitals/hud.dmi b/modular_citadel/icons/obj/genitals/hud.dmi index e090dbd84..bf2adcb1f 100644 Binary files a/modular_citadel/icons/obj/genitals/hud.dmi and b/modular_citadel/icons/obj/genitals/hud.dmi differ |