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

View File

@@ -48,3 +48,6 @@
- tweak: Increased max age from 85 to 16,777,216 - tweak: Increased max age from 85 to 16,777,216
Mazen421: Mazen421:
- rscadd: Two extra pipe lines in the center of Taustation - 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 if(CHECK_BITFIELD(genital.genital_flags, GENITAL_INTERNAL)) //Not those though
continue continue
var/list/genital_entry = list() 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 genital_entry["key"] = REF(genital) //The key is the reference to the object
var/visibility = "Invalid" var/visibility = "Invalid"
if(CHECK_BITFIELD(genital.genital_flags, GENITAL_THROUGH_CLOTHES)) if(CHECK_BITFIELD(genital.genital_flags, GENITAL_THROUGH_CLOTHES))
@@ -107,10 +107,15 @@
genital_entry["visibility"] = visibility genital_entry["visibility"] = visibility
genital_entry["possible_choices"] = GLOB.genitals_visibility_toggles genital_entry["possible_choices"] = GLOB.genitals_visibility_toggles
genital_entry["extra_choices"] = list(GEN_ALLOW_EGG_STUFFING) 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) genitals += list(genital_entry)
if(iscarbon(self) && !self.getorganslot(ORGAN_SLOT_ANUS)) if(iscarbon(self) && !self.getorganslot(ORGAN_SLOT_ANUS))
var/simulated_ass = list() var/simulated_ass = list()
simulated_ass["name"] = "anus" simulated_ass["name"] = "Anus"
simulated_ass["key"] = "anus" simulated_ass["key"] = "anus"
var/visibility = "Invalid" var/visibility = "Invalid"
switch(self.anus_exposed) switch(self.anus_exposed)
@@ -156,35 +161,35 @@
genital_interactibles += list(genital_entry) genital_interactibles += list(genital_entry)
.["genital_interactibles"] = genital_interactibles .["genital_interactibles"] = genital_interactibles
var/datum/preferences/prefs = usr?.client.prefs var/datum/preferences/prefs = self?.client.prefs
if(prefs) if(prefs)
//Getting char prefs //Getting char prefs
.["erp_pref"] = pref_to_num(prefs.erppref) .["erp_pref"] = pref_to_num(prefs.erppref)
.["noncon_pref"] = pref_to_num(prefs.nonconpref) .["noncon_pref"] = pref_to_num(prefs.nonconpref)
.["vore_pref"] = pref_to_num(prefs.vorepref) .["vore_pref"] = pref_to_num(prefs.vorepref)
.["extreme_pref"] = pref_to_num(prefs.extremepref) .["extreme_pref"] = pref_to_num(prefs.extremepref)
.["extreme_harm"] = pref_to_num(prefs.extremeharm) .["extreme_harm"] = pref_to_num(prefs.extremeharm)
.["unholy_pref"] = pref_to_num(prefs.unholypref) .["unholy_pref"] = pref_to_num(prefs.unholypref)
//Getting preferences //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) .["lewd_verb_sounds"] = !CHECK_BITFIELD(prefs.toggles, LEWD_VERB_SOUNDS)
.["arousable"] = prefs.arousable .["arousable"] = prefs.arousable
.["genital_examine"] = CHECK_BITFIELD(prefs.cit_toggles, GENITAL_EXAMINE) .["genital_examine"] = !!CHECK_BITFIELD(prefs.cit_toggles, GENITAL_EXAMINE)
.["vore_examine"] = CHECK_BITFIELD(prefs.cit_toggles, VORE_EXAMINE) .["vore_examine"] = !!CHECK_BITFIELD(prefs.cit_toggles, VORE_EXAMINE)
.["medihound_sleeper"] = CHECK_BITFIELD(prefs.cit_toggles, MEDIHOUND_SLEEPER) .["medihound_sleeper"] = !!CHECK_BITFIELD(prefs.cit_toggles, MEDIHOUND_SLEEPER)
.["eating_noises"] = CHECK_BITFIELD(prefs.cit_toggles, EATING_NOISES) .["eating_noises"] = !!CHECK_BITFIELD(prefs.cit_toggles, EATING_NOISES)
.["digestion_noises"] = CHECK_BITFIELD(prefs.cit_toggles, DIGESTION_NOISES) .["digestion_noises"] = !!CHECK_BITFIELD(prefs.cit_toggles, DIGESTION_NOISES)
.["trash_forcefeed"] = CHECK_BITFIELD(prefs.cit_toggles, TRASH_FORCEFEED) .["trash_forcefeed"] = !!CHECK_BITFIELD(prefs.cit_toggles, TRASH_FORCEFEED)
.["forced_fem"] = CHECK_BITFIELD(prefs.cit_toggles, FORCED_FEM) .["forced_fem"] = !!CHECK_BITFIELD(prefs.cit_toggles, FORCED_FEM)
.["forced_masc"] = CHECK_BITFIELD(prefs.cit_toggles, FORCED_MASC) .["forced_masc"] = !!CHECK_BITFIELD(prefs.cit_toggles, FORCED_MASC)
.["hypno"] = CHECK_BITFIELD(prefs.cit_toggles, HYPNO) .["hypno"] = !!CHECK_BITFIELD(prefs.cit_toggles, HYPNO)
.["bimbofication"] = CHECK_BITFIELD(prefs.cit_toggles, BIMBOFICATION) .["bimbofication"] = !!CHECK_BITFIELD(prefs.cit_toggles, BIMBOFICATION)
.["breast_enlargement"] = CHECK_BITFIELD(prefs.cit_toggles, BREAST_ENLARGEMENT) .["breast_enlargement"] = !!CHECK_BITFIELD(prefs.cit_toggles, BREAST_ENLARGEMENT)
.["penis_enlargement"] = CHECK_BITFIELD(prefs.cit_toggles, PENIS_ENLARGEMENT) .["penis_enlargement"] = !!CHECK_BITFIELD(prefs.cit_toggles, PENIS_ENLARGEMENT)
.["butt_enlargement"] = CHECK_BITFIELD(prefs.cit_toggles, BUTT_ENLARGEMENT) .["butt_enlargement"] = !!CHECK_BITFIELD(prefs.cit_toggles, BUTT_ENLARGEMENT)
.["belly_inflation"] = CHECK_BITFIELD(prefs.cit_toggles, BELLY_INFLATION) .["belly_inflation"] = !!CHECK_BITFIELD(prefs.cit_toggles, BELLY_INFLATION)
.["never_hypno"] = !CHECK_BITFIELD(prefs.cit_toggles, NEVER_HYPNO) .["never_hypno"] = !CHECK_BITFIELD(prefs.cit_toggles, NEVER_HYPNO)
.["no_aphro"] = !CHECK_BITFIELD(prefs.cit_toggles, NO_APHRO) .["no_aphro"] = !CHECK_BITFIELD(prefs.cit_toggles, NO_APHRO)
.["no_ass_slap"] = !CHECK_BITFIELD(prefs.cit_toggles, NO_ASS_SLAP) .["no_ass_slap"] = !CHECK_BITFIELD(prefs.cit_toggles, NO_ASS_SLAP)
.["no_auto_wag"] = !CHECK_BITFIELD(prefs.cit_toggles, NO_AUTO_WAG) .["no_auto_wag"] = !CHECK_BITFIELD(prefs.cit_toggles, NO_AUTO_WAG)
@@ -210,13 +215,34 @@
return FALSE return FALSE
if("genital") if("genital")
var/mob/living/carbon/self = usr var/mob/living/carbon/self = usr
if(params["genital"] == "anus") if("visibility" in params)
self.anus_toggle_visibility(params["visibility"]) if(params["genital"] == "anus")
return TRUE self.anus_toggle_visibility(params["visibility"])
var/obj/item/organ/genital/genital = locate(params["genital"], self.internal_organs) return TRUE
if(genital && (genital in self.internal_organs)) var/obj/item/organ/genital/genital = locate(params["genital"], self.internal_organs)
genital.toggle_visibility(params["visibility"]) if(genital && (genital in self.internal_organs))
return TRUE 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 else
return FALSE return FALSE
if("genital_interaction") if("genital_interaction")

View File

@@ -2,8 +2,8 @@ import { filter, map, sortBy } from 'common/collections';
import { flow } from 'common/fp'; import { flow } from 'common/fp';
import { createSearch } from 'common/string'; import { createSearch } from 'common/string';
import { useBackend, useLocalState } from '../backend'; import { useBackend, useLocalState } from '../backend';
import { BlockQuote, Button, LabeledList, Icon, Input, Section, Table, Tabs, Stack, ProgressBar, Divider } from '../components'; import { BlockQuote, Button, Flex, LabeledList, Icon, Input, Section, Table, Tabs, Stack, ProgressBar, Divider } from '../components';
import { TableRow } from '../components/Table'; import { TableCell, TableRow } from '../components/Table';
import { Window } from '../layouts'; import { Window } from '../layouts';
type HeaderInfo = { type HeaderInfo = {
@@ -34,6 +34,8 @@ type GenitalData = {
extras: string, extras: string,
extra_choices: string[], extra_choices: string[],
possible_choices: string[], possible_choices: string[],
can_arouse: boolean,
arousal_state: boolean,
} }
type GenitalManagerInfo = { type GenitalManagerInfo = {
@@ -65,27 +67,27 @@ type CharacterPrefsInfo = {
} }
type ContentPrefsInfo = { type ContentPrefsInfo = {
verb_consent: number, verb_consent: boolean,
lewd_verb_sounds: number, lewd_verb_sounds: boolean,
arousable: number, arousable: boolean,
genital_examine: number, genital_examine: boolean,
vore_examine: number, vore_examine: boolean,
medihound_sleeper: number, medihound_sleeper: boolean,
eating_noises: number, eating_noises: boolean,
digestion_noises: number, digestion_noises: boolean,
trash_forcefeed: number, trash_forcefeed: boolean,
forced_fem: number, forced_fem: boolean,
forced_masc: number, forced_masc: boolean,
hypno: number, hypno: boolean,
bimbofication: number, bimbofication: boolean,
breast_enlargement: number, breast_enlargement: boolean,
penis_enlargement: number, penis_enlargement: boolean,
butt_enlargement: number, butt_enlargement: boolean,
belly_inflation: number, belly_inflation: boolean,
never_hypno: number, never_hypno: boolean,
no_aphro: number, no_aphro: boolean,
no_ass_slap: number, no_ass_slap: boolean,
no_auto_wag: number, no_auto_wag: boolean,
} }
export const MobInteraction = (props, context) => { export const MobInteraction = (props, context) => {
@@ -131,12 +133,12 @@ export const MobInteraction = (props, context) => {
</Table> </Table>
</Section> </Section>
<Section> <Section>
<Tabs> <Tabs fluid textAlign="center">
<Tabs.Tab selected={tabIndex === 0} onClick={() => setTabIndex(0)}> <Tabs.Tab selected={tabIndex === 0} onClick={() => setTabIndex(0)}>
Interactions Interactions
</Tabs.Tab> </Tabs.Tab>
<Tabs.Tab selected={tabIndex === 1} onClick={() => setTabIndex(1)}> <Tabs.Tab selected={tabIndex === 1} onClick={() => setTabIndex(1)}>
Genital Visibility Genital Options
</Tabs.Tab> </Tabs.Tab>
<Tabs.Tab selected={tabIndex === 2} onClick={() => setTabIndex(2)}> <Tabs.Tab selected={tabIndex === 2} onClick={() => setTabIndex(2)}>
Character Prefs Character Prefs
@@ -151,7 +153,7 @@ export const MobInteraction = (props, context) => {
{tabIndex === 0 && ( {tabIndex === 0 && (
<InteractionsTab /> <InteractionsTab />
) || tabIndex === 1 && ( ) || tabIndex === 1 && (
<GenitalVisibilityTab /> <GenitalTab />
) || tabIndex === 2 && ( ) || tabIndex === 2 && (
<CharacterPrefsTab /> <CharacterPrefsTab />
) || tabIndex === 3 && ( ) || tabIndex === 3 && (
@@ -243,42 +245,73 @@ const ModeToIcon = {
"Allows egg stuffing": "egg", "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 { act, data } = useBackend<GenitalInfo>(context);
const genitals = data.genitals || []; const genitals = data.genitals || [];
return ( return (
genitals.length ? ( genitals.length ? (
<Stack direction="column"> <Flex direction="column">
<LabeledList> {genitals.map(genital => (
{genitals.map(genital => ( <Section key={genital.key} title={genital.name} textAlign="center">
<LabeledList.Item key={genital.key} label={genital.name}> <Table>
{genital.possible_choices.map(choice => ( <TableCell width="50%" textAlign="center">
<Button Visibility<br />
key={choice} {genital.possible_choices.map(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 => (
<Button <Button
width={((1 / genital.possible_choices.length) * 97) + "%"}
key={choice} key={choice}
tooltip={choice} tooltip={choice}
icon={ModeToIcon[choice]} icon={ModeToIcon[choice]}
color={genital.extras === choice ? "green" : "default"} color={genital.visibility === choice ? "green" : "default"}
onClick={() => act('genital', { onClick={() => act('genital', {
genital: genital.key, genital: genital.key,
visibility: choice, visibility: choice,
})} /> })} />
)) : null} ))}
</LabeledList.Item> </TableCell>
))} <TableCell textAlign="center">
</LabeledList> Actions<br />
</Stack> <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"> <Section align="center">
You don&apos;t seem to have any genitals... You don&apos;t seem to have any genitals...