Merge remote-tracking branch 'upstream/master'

This commit is contained in:
BongaTheProto
2022-12-15 01:25:03 -05:00
4 changed files with 145 additions and 79 deletions

View File

@@ -53163,9 +53163,11 @@
dir = 4
},
/obj/item/clothing/gloves/color/latex{
pixel_y = 10
},
/obj/item/clothing/suit/apron/surgical,
/obj/item/clothing/mask/surgical{
pixel_y = -6
},
/turf/open/floor/plasteel/white,
/area/medical/surgery)
@@ -53201,9 +53203,11 @@
dir = 8
},
/obj/item/clothing/gloves/color/latex{
pixel_y = 10
},
/obj/item/clothing/suit/apron/surgical,
/obj/item/clothing/mask/surgical{
pixel_y = -6
},
/turf/open/floor/plasteel/white,
/area/medical/surgery)

View File

@@ -48,3 +48,6 @@
- tweak: Increased max age from 85 to 16,777,216
Mazen421:
- rscadd: Two extra pipe lines in the center of Taustation
2022-12-14:
SandPoot:
- tweak: Interaction's tabs are now centered and fluid, getting a better look overrall.

View File

@@ -87,7 +87,7 @@
if(CHECK_BITFIELD(genital.genital_flags, GENITAL_INTERNAL)) //Not those though
continue
var/list/genital_entry = list()
genital_entry["name"] = "[genital.name]" //Prevents code from adding a prefix
genital_entry["name"] = "[capitalize(genital.name)]" //Prevents code from adding a prefix
genital_entry["key"] = REF(genital) //The key is the reference to the object
var/visibility = "Invalid"
if(CHECK_BITFIELD(genital.genital_flags, GENITAL_THROUGH_CLOTHES))
@@ -107,10 +107,15 @@
genital_entry["visibility"] = visibility
genital_entry["possible_choices"] = GLOB.genitals_visibility_toggles
genital_entry["extra_choices"] = list(GEN_ALLOW_EGG_STUFFING)
genital_entry["can_arouse"] = (
!!CHECK_BITFIELD(genital.genital_flags, GENITAL_CAN_AROUSE) \
&& !(HAS_TRAIT(get_genitals, TRAIT_PERMABONER) \
|| HAS_TRAIT(get_genitals, TRAIT_NEVERBONER)))
genital_entry["arousal_state"] = genital.aroused_state
genitals += list(genital_entry)
if(iscarbon(self) && !self.getorganslot(ORGAN_SLOT_ANUS))
var/simulated_ass = list()
simulated_ass["name"] = "anus"
simulated_ass["name"] = "Anus"
simulated_ass["key"] = "anus"
var/visibility = "Invalid"
switch(self.anus_exposed)
@@ -156,35 +161,35 @@
genital_interactibles += list(genital_entry)
.["genital_interactibles"] = genital_interactibles
var/datum/preferences/prefs = usr?.client.prefs
var/datum/preferences/prefs = self?.client.prefs
if(prefs)
//Getting char prefs
.["erp_pref"] = pref_to_num(prefs.erppref)
.["noncon_pref"] = pref_to_num(prefs.nonconpref)
.["vore_pref"] = pref_to_num(prefs.vorepref)
.["noncon_pref"] = pref_to_num(prefs.nonconpref)
.["vore_pref"] = pref_to_num(prefs.vorepref)
.["extreme_pref"] = pref_to_num(prefs.extremepref)
.["extreme_harm"] = pref_to_num(prefs.extremeharm)
.["unholy_pref"] = pref_to_num(prefs.unholypref)
//Getting preferences
.["verb_consent"] = CHECK_BITFIELD(prefs.toggles, VERB_CONSENT)
.["verb_consent"] = !!CHECK_BITFIELD(prefs.toggles, VERB_CONSENT)
.["lewd_verb_sounds"] = !CHECK_BITFIELD(prefs.toggles, LEWD_VERB_SOUNDS)
.["arousable"] = prefs.arousable
.["genital_examine"] = CHECK_BITFIELD(prefs.cit_toggles, GENITAL_EXAMINE)
.["vore_examine"] = CHECK_BITFIELD(prefs.cit_toggles, VORE_EXAMINE)
.["medihound_sleeper"] = CHECK_BITFIELD(prefs.cit_toggles, MEDIHOUND_SLEEPER)
.["eating_noises"] = CHECK_BITFIELD(prefs.cit_toggles, EATING_NOISES)
.["digestion_noises"] = CHECK_BITFIELD(prefs.cit_toggles, DIGESTION_NOISES)
.["trash_forcefeed"] = CHECK_BITFIELD(prefs.cit_toggles, TRASH_FORCEFEED)
.["forced_fem"] = CHECK_BITFIELD(prefs.cit_toggles, FORCED_FEM)
.["forced_masc"] = CHECK_BITFIELD(prefs.cit_toggles, FORCED_MASC)
.["hypno"] = CHECK_BITFIELD(prefs.cit_toggles, HYPNO)
.["bimbofication"] = CHECK_BITFIELD(prefs.cit_toggles, BIMBOFICATION)
.["breast_enlargement"] = CHECK_BITFIELD(prefs.cit_toggles, BREAST_ENLARGEMENT)
.["penis_enlargement"] = CHECK_BITFIELD(prefs.cit_toggles, PENIS_ENLARGEMENT)
.["butt_enlargement"] = CHECK_BITFIELD(prefs.cit_toggles, BUTT_ENLARGEMENT)
.["belly_inflation"] = CHECK_BITFIELD(prefs.cit_toggles, BELLY_INFLATION)
.["never_hypno"] = !CHECK_BITFIELD(prefs.cit_toggles, NEVER_HYPNO)
.["arousable"] = prefs.arousable
.["genital_examine"] = !!CHECK_BITFIELD(prefs.cit_toggles, GENITAL_EXAMINE)
.["vore_examine"] = !!CHECK_BITFIELD(prefs.cit_toggles, VORE_EXAMINE)
.["medihound_sleeper"] = !!CHECK_BITFIELD(prefs.cit_toggles, MEDIHOUND_SLEEPER)
.["eating_noises"] = !!CHECK_BITFIELD(prefs.cit_toggles, EATING_NOISES)
.["digestion_noises"] = !!CHECK_BITFIELD(prefs.cit_toggles, DIGESTION_NOISES)
.["trash_forcefeed"] = !!CHECK_BITFIELD(prefs.cit_toggles, TRASH_FORCEFEED)
.["forced_fem"] = !!CHECK_BITFIELD(prefs.cit_toggles, FORCED_FEM)
.["forced_masc"] = !!CHECK_BITFIELD(prefs.cit_toggles, FORCED_MASC)
.["hypno"] = !!CHECK_BITFIELD(prefs.cit_toggles, HYPNO)
.["bimbofication"] = !!CHECK_BITFIELD(prefs.cit_toggles, BIMBOFICATION)
.["breast_enlargement"] = !!CHECK_BITFIELD(prefs.cit_toggles, BREAST_ENLARGEMENT)
.["penis_enlargement"] = !!CHECK_BITFIELD(prefs.cit_toggles, PENIS_ENLARGEMENT)
.["butt_enlargement"] = !!CHECK_BITFIELD(prefs.cit_toggles, BUTT_ENLARGEMENT)
.["belly_inflation"] = !!CHECK_BITFIELD(prefs.cit_toggles, BELLY_INFLATION)
.["never_hypno"] = !CHECK_BITFIELD(prefs.cit_toggles, NEVER_HYPNO)
.["no_aphro"] = !CHECK_BITFIELD(prefs.cit_toggles, NO_APHRO)
.["no_ass_slap"] = !CHECK_BITFIELD(prefs.cit_toggles, NO_ASS_SLAP)
.["no_auto_wag"] = !CHECK_BITFIELD(prefs.cit_toggles, NO_AUTO_WAG)
@@ -210,13 +215,34 @@
return FALSE
if("genital")
var/mob/living/carbon/self = usr
if(params["genital"] == "anus")
self.anus_toggle_visibility(params["visibility"])
return TRUE
var/obj/item/organ/genital/genital = locate(params["genital"], self.internal_organs)
if(genital && (genital in self.internal_organs))
genital.toggle_visibility(params["visibility"])
return TRUE
if("visibility" in params)
if(params["genital"] == "anus")
self.anus_toggle_visibility(params["visibility"])
return TRUE
var/obj/item/organ/genital/genital = locate(params["genital"], self.internal_organs)
if(genital && (genital in self.internal_organs))
genital.toggle_visibility(params["visibility"])
return TRUE
if("set_arousal" in params)
var/obj/item/organ/genital/genital = locate(params["genital"], self.internal_organs)
if(!genital || (genital \
&& (!CHECK_BITFIELD(genital.genital_flags, GENITAL_CAN_AROUSE) \
|| HAS_TRAIT(self, TRAIT_PERMABONER) \
|| HAS_TRAIT(self, TRAIT_NEVERBONER))))
return FALSE
var/original_state = genital.aroused_state
genital.set_aroused_state(params["set_arousal"])// i'm not making it just `!aroused_state` because
if(original_state != genital.aroused_state) // someone just might port skyrat's new genitals
to_chat(self, "<span class='userlove'>[genital.aroused_state ? genital.arousal_verb : genital.unarousal_verb].</span>")
. = TRUE
else
to_chat(self, "<span class='userlove'>You can't make that genital [genital.aroused_state ? "unaroused" : "aroused"]!</span>")
. = FALSE
genital.update_appearance()
if(ishuman(self))
var/mob/living/carbon/human/human = self
human.update_genitals()
return
else
return FALSE
if("genital_interaction")

View File

@@ -2,8 +2,8 @@ import { filter, map, sortBy } from 'common/collections';
import { flow } from 'common/fp';
import { createSearch } from 'common/string';
import { useBackend, useLocalState } from '../backend';
import { BlockQuote, Button, LabeledList, Icon, Input, Section, Table, Tabs, Stack, ProgressBar, Divider } from '../components';
import { TableRow } from '../components/Table';
import { BlockQuote, Button, Flex, LabeledList, Icon, Input, Section, Table, Tabs, Stack, ProgressBar, Divider } from '../components';
import { TableCell, TableRow } from '../components/Table';
import { Window } from '../layouts';
type HeaderInfo = {
@@ -34,6 +34,8 @@ type GenitalData = {
extras: string,
extra_choices: string[],
possible_choices: string[],
can_arouse: boolean,
arousal_state: boolean,
}
type GenitalManagerInfo = {
@@ -65,27 +67,27 @@ type CharacterPrefsInfo = {
}
type ContentPrefsInfo = {
verb_consent: number,
lewd_verb_sounds: number,
arousable: number,
genital_examine: number,
vore_examine: number,
medihound_sleeper: number,
eating_noises: number,
digestion_noises: number,
trash_forcefeed: number,
forced_fem: number,
forced_masc: number,
hypno: number,
bimbofication: number,
breast_enlargement: number,
penis_enlargement: number,
butt_enlargement: number,
belly_inflation: number,
never_hypno: number,
no_aphro: number,
no_ass_slap: number,
no_auto_wag: number,
verb_consent: boolean,
lewd_verb_sounds: boolean,
arousable: boolean,
genital_examine: boolean,
vore_examine: boolean,
medihound_sleeper: boolean,
eating_noises: boolean,
digestion_noises: boolean,
trash_forcefeed: boolean,
forced_fem: boolean,
forced_masc: boolean,
hypno: boolean,
bimbofication: boolean,
breast_enlargement: boolean,
penis_enlargement: boolean,
butt_enlargement: boolean,
belly_inflation: boolean,
never_hypno: boolean,
no_aphro: boolean,
no_ass_slap: boolean,
no_auto_wag: boolean,
}
export const MobInteraction = (props, context) => {
@@ -131,12 +133,12 @@ export const MobInteraction = (props, context) => {
</Table>
</Section>
<Section>
<Tabs>
<Tabs fluid textAlign="center">
<Tabs.Tab selected={tabIndex === 0} onClick={() => setTabIndex(0)}>
Interactions
</Tabs.Tab>
<Tabs.Tab selected={tabIndex === 1} onClick={() => setTabIndex(1)}>
Genital Visibility
Genital Options
</Tabs.Tab>
<Tabs.Tab selected={tabIndex === 2} onClick={() => setTabIndex(2)}>
Character Prefs
@@ -151,7 +153,7 @@ export const MobInteraction = (props, context) => {
{tabIndex === 0 && (
<InteractionsTab />
) || tabIndex === 1 && (
<GenitalVisibilityTab />
<GenitalTab />
) || tabIndex === 2 && (
<CharacterPrefsTab />
) || tabIndex === 3 && (
@@ -243,42 +245,73 @@ const ModeToIcon = {
"Allows egg stuffing": "egg",
};
const GenitalVisibilityTab = (props, context) => {
/*
Greetings you, yes you, adding more stuff to actions,
To not have as much headache as i did,
do not attempt to make a sum of 100% with the buttons
as it will mess up math somewhere and overflow.
Also this is adjusted only for the current size,
if anyone feels like shrinking,
their window it will overflow anyways.
Single items is fine.
*/
const GenitalTab = (props, context) => {
const { act, data } = useBackend<GenitalInfo>(context);
const genitals = data.genitals || [];
return (
genitals.length ? (
<Stack direction="column">
<LabeledList>
{genitals.map(genital => (
<LabeledList.Item key={genital.key} label={genital.name}>
{genital.possible_choices.map(choice => (
<Button
key={choice}
tooltip={choice}
icon={ModeToIcon[choice]}
color={genital.visibility === choice ? "green" : "default"}
onClick={() => act('genital', {
genital: genital.key,
visibility: choice,
})} />
))}
{genital.extra_choices instanceof Array
? genital.extra_choices.map(choice => (
<Flex direction="column">
{genitals.map(genital => (
<Section key={genital.key} title={genital.name} textAlign="center">
<Table>
<TableCell width="50%" textAlign="center">
Visibility<br />
{genital.possible_choices.map(choice => (
<Button
width={((1 / genital.possible_choices.length) * 97) + "%"}
key={choice}
tooltip={choice}
icon={ModeToIcon[choice]}
color={genital.extras === choice ? "green" : "default"}
color={genital.visibility === choice ? "green" : "default"}
onClick={() => act('genital', {
genital: genital.key,
visibility: choice,
})} />
)) : null}
</LabeledList.Item>
))}
</LabeledList>
</Stack>
))}
</TableCell>
<TableCell textAlign="center">
Actions<br />
<Button
width="50%"
key={genital.arousal_state}
tooltip={genital.can_arouse
? ((genital.arousal_state ? "Unarouse" : "Arouse") + " your " + genital.name.toLowerCase())
: "You cannot modify arousal on your " + genital.name.toLowerCase()}
icon="heart"
color={genital.can_arouse ? (genital.arousal_state ? "green" : "default") : "grey"}
onClick={() => act('genital', {
genital: genital.key,
set_arousal: !genital.arousal_state,
})} />
{genital.extra_choices instanceof Array
? genital.extra_choices.map(choice => (
<Button
width="50%"
key={choice}
tooltip={choice}
icon={ModeToIcon[choice]}
color={genital.extras === choice ? "green" : "default"}
onClick={() => act('genital', {
genital: genital.key,
visibility: choice,
})} />
)) : null}
</TableCell>
</Table>
</Section>
))}
</Flex>
) : (
<Section align="center">
You don&apos;t seem to have any genitals...