mirror of
https://github.com/SPLURT-Station/S.P.L.U.R.T-Station-13.git
synced 2025-12-10 18:02:57 +00:00
Merge remote-tracking branch 'upstream/master'
This commit is contained in:
@@ -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)
|
||||
|
||||
@@ -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.
|
||||
|
||||
@@ -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")
|
||||
|
||||
@@ -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't seem to have any genitals...
|
||||
|
||||
Reference in New Issue
Block a user