This commit is contained in:
Letter N
2021-02-19 10:32:24 +08:00
parent b3bfeb9858
commit 501d33cddd
9 changed files with 229 additions and 186 deletions

View File

@@ -126,6 +126,7 @@ GLOBAL_LIST_INIT(ai_core_display_screens, list(
"Not Malf",
"Patriot",
"Pirate",
"Portrait",
"President",
"Rainbow",
"Clown",

View File

@@ -285,7 +285,7 @@
/obj/screen/robot/lamp
name = "headlamp"
icon_state = "lamp0"
icon_state = "lamp_off"
var/mob/living/silicon/robot/robot
/obj/screen/robot/lamp/Click()

View File

@@ -613,7 +613,7 @@
var/mob/chosen = players[1]
if (chosen.client)
chosen.client.prefs.copy_to(spawnedMob)
spawnedMob.key = chosen.key
chosen.transfer_ckey(spawnedMob)
players -= chosen
if (ishuman(spawnedMob) && ispath(humanoutfit, /datum/outfit))
var/mob/living/carbon/human/H = spawnedMob

View File

@@ -19,7 +19,7 @@
update_slab_info()
for(var/mob/M in GLOB.player_list)
if(is_servant_of_ratvar(M) || isobserver(M))
M.playsound_local(M, 'sound/magic/clockwork/scripture_tier_up.ogg', 50, FALSE, pressure_affected = FALSE)
M.playsound_local(M, 'sound/magic/clockwork/scripture_tier_up.ogg', 20, FALSE, pressure_affected = FALSE)
/proc/update_slab_info(obj/item/clockwork/slab/set_slab)
generate_all_scripture()

View File

@@ -21,8 +21,10 @@
var/recollecting = TRUE //if we're looking at fancy recollection. tutorial enabled by default
var/recollection_category = "Default"
var/list/quickbound = list(/datum/clockwork_scripture/spatial_gateway, \
/datum/clockwork_scripture/ranged_ability/kindle, /datum/clockwork_scripture/ranged_ability/hateful_manacles) //quickbound scripture, accessed by index
var/list/quickbound = list(
/datum/clockwork_scripture/spatial_gateway,
/datum/clockwork_scripture/ranged_ability/kindle,
/datum/clockwork_scripture/ranged_ability/hateful_manacles) //quickbound scripture, accessed by index
var/maximum_quickbound = 5 //how many quickbound scriptures we can have
var/obj/structure/destructible/clockwork/trap/linking //If we're linking traps together, which ones we're doing
@@ -326,6 +328,7 @@
"requirement" = "Unlock powerful equipment and structures by converting five servants or if [DisplayPower(JUDGEMENT_UNLOCK_THRESHOLD)] of power is reached..",
"ready" = SSticker.scripture_states[SCRIPTURE_JUDGEMENT]
)
// no need to learn shit, ratvar is free
.["recollection_categories"] = list()
if(GLOB.ratvar_awakens)
return
@@ -340,19 +343,25 @@
)
.["rec_section"] = get_recollection(recollection_category)
generate_all_scripture()
//needs a new place to live, preferably when clockcult unlocks/downgrades a tier. Smart enough to earlyreturn.
//needs a new place to live, preferably when clockcult unlocks/downgrades a tier.
//comsig maybe?
/obj/item/clockwork/slab/ui_act(action, params)
. = ..()
if(.)
return
switch(action)
if("toggle")
recollecting = !recollecting
. = TRUE
if("recite")
INVOKE_ASYNC(src, .proc/recite_scripture, text2path(params["script"]), usr, FALSE)
. = TRUE
if("bind")
var/datum/clockwork_scripture/path = text2path(params["script"]) //we need a path and not a string
if(!ispath(path, /datum/clockwork_scripture) || !initial(path.quickbind) || initial(path.tier) == SCRIPTURE_PERIPHERAL) //fuck you href bus
to_chat(usr, "<span class='warning'>Nice try using href exploits</span>")
return
return FALSE
var/found_index = quickbound.Find(path)
if(found_index) //hey, we already HAVE this bound
if(LAZYLEN(quickbound) == found_index) //if it's the last scripture, remove it instead of leaving a null
@@ -361,6 +370,7 @@
quickbound[found_index] = null //otherwise, leave it as a null so the scripture maintains position
update_quickbind()
else
// todo: async this due to ((input)) but its fine for now
var/target_index = input("Position of [initial(path.name)], 1 to [maximum_quickbound]?", "Input") as num|null
if(isnum(target_index) && target_index > 0 && target_index <= maximum_quickbound && !..())
var/datum/clockwork_scripture/S
@@ -368,10 +378,11 @@
S = quickbound[target_index]
if(S != path)
quickbind_to_slot(path, target_index)
. = TRUE
if("rec_category")
recollection_category = params["category"]
update_static_data()
return TRUE
. = TRUE
/obj/item/clockwork/slab/proc/quickbind_to_slot(datum/clockwork_scripture/scripture, index) //takes a typepath(typecast for initial()) and binds it to a slot
if(!ispath(scripture) || !scripture || (scripture in quickbound))

View File

@@ -23,6 +23,7 @@
locked = FALSE //unlock cover
update_mobility()
if(!QDELETED(builtInCamera) && builtInCamera.status)
builtInCamera.toggle_cam(src,0)
toggle_headlamp(TRUE) //So borg lights are disabled when killed.

View File

@@ -1,3 +1,11 @@
/**
* @file
* @copyright 2021 LetterN (https://github.com/LetterN)
* @author Original LetterN (https://github.com/LetterN)
* @author Changes arturlang
* @license MIT
*/
import { useBackend, useSharedState } from '../backend';
import { map } from 'common/collections';
import { Section, Tabs, Table, Button, Box, NoticeBox, Divider } from '../components';
@@ -15,14 +23,9 @@ export const ClockworkSlab = (props, context) => {
const { act, data } = useBackend(context);
const {
recollection = true,
recollection_categories = [],
rec_section = null,
rec_binds = [],
scripture = {},
tier_infos = {},
power = "0 W",
power_unformatted = 0,
HONOR_RATVAR = false, // is ratvar free yet?
} = data;
const [
tab,
@@ -42,117 +45,7 @@ export const ClockworkSlab = (props, context) => {
height={420}>
<Window.Content scrollable>
{recollection ? ( // tutorial
<Section
title="Recollection"
buttons={(
<Button
icon="cog"
tooltipPosition={"left"}
onClick={() => act('toggle')}>
Recital
</Button>
)}>
<Box>
{HONOR_RATVAR ? (
<Box
as="span"
textColor="#BE8700"
fontSize={2}
bold>
{REC_RATVAR}
</Box>
) : (
<Fragment>
<Box
as="span"
textColor="#BE8700"
fontSize={2} // 2rem
bold>
Chetr nyy hagehguf naq ubabe Ratvar.
</Box>
<NoticeBox>
NOTICE: This information is out of date.
Read the Ark &amp; You primer in your backpack
or read the wiki page for current info.
</NoticeBox>
<Box>
These pages serve as the archives of Ratvar, the
Clockwork Justiciar. This section of your slab
has information on being as a Servant, advice
for what to do next, and pointers for serving the
master well. You should recommended that you check this
area for help if you get stuck or need guidance on
what to do next.
<br /> <br />
Disclaimer: Many objects, terms, and phrases, such as
Servant, Cache, and Slab, are capitalized like proper
nouns. This is a quirk of the Ratvarian language do
not let it confuse you! You are free to use the names
in pronoun form when speaking in normal languages.
</Box>
</Fragment>
)}
</Box>
{recollection_categories?.map(cat => (
<Fragment key={cat.name}>
<br />
<Button
tooltip={cat.desc}
tooltipPosition={'right'}
onClick={() => act('rec_category', {
"category": cat.name,
})} >
{cat.name}
</Button>
</Fragment>
))}
<Divider />
<Box>
<Box
as={'span'}
textColor={'#BE8700'}
fontSize={2.3}>
{rec_section?.title ? (
rec_section.title
) : (
'500 Slab Internal archives not found.'
)}
</Box>
<br /><br />
{rec_section?.info ? (
rec_section.info
) : (
"One of the cogscarabs must've misplaced this section."
)}
</Box>
<br />
<Divider />
<Box>
<Box
as={'span'}
textColor={'#BE8700'}
fontSize={2.3}>
Quickbound Scripture
</Box>
<br />
<Box as={'span'} italic>
You can have up to five scriptures bound to
action buttons for easy use.
</Box>
<br /><br />
{rec_binds?.map(bind => (
<Fragment key={bind.name ? bind.name : "none"}>
A <b>Quickbind</b> slot ({rec_binds.indexOf(bind)+1}),
currently set to&nbsp;
<span style={`color:${bind ? bind.color : "#BE8700"}`}>
{bind?.name ? bind.name : "None"}
</span>
.
<br />
</Fragment>
))}
</Box>
</Section>
<CSTutorial />
) : (
<Section
title="Power"
@@ -216,54 +109,7 @@ export const ClockworkSlab = (props, context) => {
</Box>
<Divider />
<Table>
{scriptInTab?.map(script => (
<Table.Row
key={script.name}
className="candystripe">
<Table.Cell
italic={!!script.important}
color={script.fontcolor}>
<b>
{script.name}
</b>
{`
${script.descname}
${script.invokers || ''}
`}
</Table.Cell>
<Table.Cell
collapsing
textAlign="right">
<Button
disabled={
script.required_unformatted >= power_unformatted
}
tooltip={script.tip}
tooltipPosition={'left'}
onClick={() => act('recite', {
'script': script.type,
})} >
{`Recite ${script.required}`}
</Button>
</Table.Cell>
<Table.Cell
collapsing
textAlign="center">
<Button
fluid
disabled={!script.quickbind}
onClick={() => act('bind', {
'script': script.type,
})}>
content={script.bound ? (
`Unbind ${script.bound}`
) : (
'Quickbind'
)}
</Button>
</Table.Cell>
</Table.Row>
))}
<CSScripture scriptInTab={scriptInTab} />
</Table>
</Section>
</Section>
@@ -272,3 +118,187 @@ export const ClockworkSlab = (props, context) => {
</Window>
);
};
export const CSScripture = (props, context) => {
const { act, data } = useBackend(context);
const {
power_unformatted = 0,
} = data;
const {
scriptInTab,
} = props;
return (
scriptInTab?.map(script => (
<Table.Row
key={script.name}
className="candystripe">
<Table.Cell
italic={!!script.important}
color={script.fontcolor}>
<b>
{script.name}
</b>
{`
${script.descname}
${script.invokers || ''}
`}
</Table.Cell>
<Table.Cell
collapsing
textAlign="right">
<Button
disabled={
script.required_unformatted >= power_unformatted
}
tooltip={script.tip}
tooltipPosition={'left'}
onClick={() => act('recite', {
'script': script.type,
})} >
{`Recite ${script.required}`}
</Button>
</Table.Cell>
<Table.Cell
collapsing
textAlign="center">
<Button
fluid
disabled={!script.quickbind}
onClick={() => act('bind', {
'script': script.type,
})}>
content={script.bound ? (
`Unbind ${script.bound}`
) : (
'Quickbind'
)}
</Button>
</Table.Cell>
</Table.Row>
))
);
};
export const CSTutorial = (props, context) => {
const { act, data } = useBackend(context);
const {
recollection_categories = [],
rec_section = null,
rec_binds = [],
HONOR_RATVAR = false, // is ratvar free yet?
} = data;
return (
<Section
title="Recollection"
buttons={(
<Button
icon="cog"
tooltipPosition={"left"}
onClick={() => act('toggle')}>
Recital
</Button>
)}>
<Box>
{HONOR_RATVAR ? (
<Box
as="span"
textColor="#BE8700"
fontSize={2}
bold>
{REC_RATVAR}
</Box>
) : (
<Fragment>
<Box
as="span"
textColor="#BE8700"
fontSize={2} // 2rem
bold>
Chetr nyy hagehguf naq ubabe Ratvar.
</Box>
<NoticeBox warning>
NOTICE: This information is out of date.
Read the Ark &amp; You primer in your backpack
or read the wiki page for current info.
</NoticeBox>
These pages serve as the archives of Ratvar, the
Clockwork Justiciar. This section of your slab
has information on being as a Servant, advice
for what to do next, and pointers for serving the
master well. You should recommended that you check this
area for help if you get stuck or need guidance on
what to do next.
<br /> <br />
<NoticeBox info>
Disclaimer: Many objects, terms, and phrases, such as
Servant, Cache, and Slab, are capitalized like proper
nouns. This is a quirk of the Ratvarian language do
not let it confuse you! You are free to use the names
in pronoun form when speaking in normal languages.
</NoticeBox>
</Fragment>
)}
</Box>
{recollection_categories?.map(cat => (
<Fragment key={cat.name}>
<br />
<Button
tooltip={cat.desc}
tooltipPosition={'right'}
onClick={() => act('rec_category', {
"category": cat.name,
})} >
{cat.name}
</Button>
</Fragment>
))}
<Divider />
<Box>
<Box
as={'span'}
textColor={'#BE8700'}
fontSize={2.3}>
{rec_section?.title ? (
rec_section.title
) : (
'500 Slab Internal archives not found.'
)}
</Box>
<br /><br />
{rec_section?.info ? (
rec_section.info
) : (
"One of the cogscarabs must've misplaced this section."
)}
</Box>
<br />
<Divider />
<Box>
<Box
as={'span'}
textColor={'#BE8700'}
fontSize={2.3}>
Quickbound Scripture
</Box>
<br />
<Box as={'span'} italic>
You can have up to five scriptures bound to
action buttons for easy use.
</Box>
<br /><br />
{rec_binds?.map(bind => (
<Fragment key={bind.name ? bind.name : "none"}>
A <b>Quickbind</b> slot ({rec_binds.indexOf(bind)+1}),
currently set to&nbsp;
<span style={`color:${bind ? bind.color : "#BE8700"}`}>
{bind?.name ? bind.name : "None"}
</span>
.
<br />
</Fragment>
))}
</Box>
</Section>
);
};

View File

@@ -15,7 +15,7 @@ const SWIPE_NEEDED = "SWIPE_NEEDED";
const sortByCreditCost = sortBy(shuttle => shuttle.creditCost);
const AlertButton = (props, context) => {
export const AlertButton = (props, context) => {
const { act, data } = useBackend(context);
const { alertLevelTick, canSetAlertLevel } = data;
const { alertLevel, setShowAlertLevelConfirm } = props;
@@ -44,7 +44,7 @@ const AlertButton = (props, context) => {
);
};
const MessageModal = (props, context) => {
export const MessageModal = (props, context) => {
const { data } = useBackend(context);
const { maxMessageLength } = data;
@@ -106,7 +106,7 @@ const MessageModal = (props, context) => {
);
};
const NoConnectionModal = () => {
export const NoConnectionModal = () => {
return (
<Dimmer>
<Flex direction="column" textAlign="center" width="300px">
@@ -140,7 +140,7 @@ const NoConnectionModal = () => {
);
};
const PageBuyingShuttle = (props, context) => {
export const PageBuyingShuttle = (props, context) => {
const { act, data } = useBackend(context);
return (
@@ -196,7 +196,7 @@ const PageBuyingShuttle = (props, context) => {
);
};
const PageChangingStatus = (props, context) => {
export const PageChangingStatus = (props, context) => {
const { act, data } = useBackend(context);
const { maxStatusLineLength } = data;
@@ -294,7 +294,7 @@ const PageChangingStatus = (props, context) => {
);
};
const PageMain = (props, context) => {
export const PageMain = (props, context) => {
const { act, data } = useBackend(context);
const {
alertLevel,
@@ -336,9 +336,9 @@ const PageMain = (props, context) => {
return (
<Box>
<Section title="Emergency Shuttle">
{
shuttleCalled
? <Button.Confirm
{shuttleCalled
? (
<Button.Confirm
icon="space-shuttle"
content="Recall Emergency Shuttle"
color="bad"
@@ -353,7 +353,8 @@ const PageMain = (props, context) => {
tooltipPosition="bottom-right"
onClick={() => act("recallShuttle")}
/>
: <Button
) : (
<Button
icon="space-shuttle"
content="Call Emergency Shuttle"
disabled={shuttleCanEvacOrFailReason !== 1}
@@ -364,8 +365,7 @@ const PageMain = (props, context) => {
}
tooltipPosition="bottom-right"
onClick={() => setCallingShuttle(true)}
/>
}
/>)}
{!!shuttleCalledPreviously && (
shuttleLastCalled && (
@@ -605,7 +605,7 @@ const PageMain = (props, context) => {
);
};
const PageMessages = (props, context) => {
export const PageMessages = (props, context) => {
const { act, data } = useBackend(context);
const messages = data.messages || [];

File diff suppressed because one or more lines are too long