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