Recompile nanomaps, and add nanomap improvements

This commit is contained in:
ShadowLarkens
2020-09-25 03:52:49 -07:00
parent cf9b39b4a9
commit 92ff2bcbf4
19 changed files with 211 additions and 145 deletions

View File

@@ -38,9 +38,10 @@ var/global/datum/repository/crew/crew_repository = new()
crewmemberData["assignment"] = H.get_assignment(if_no_id="Unknown", if_no_job="No Job") crewmemberData["assignment"] = H.get_assignment(if_no_id="Unknown", if_no_job="No Job")
if(C.sensor_mode >= SUIT_SENSOR_BINARY) if(C.sensor_mode >= SUIT_SENSOR_BINARY)
crewmemberData["dead"] = H.stat > UNCONSCIOUS crewmemberData["dead"] = H.stat == DEAD
if(C.sensor_mode >= SUIT_SENSOR_VITAL) if(C.sensor_mode >= SUIT_SENSOR_VITAL)
crewmemberData["stat"] = H.stat
crewmemberData["oxy"] = round(H.getOxyLoss(), 1) crewmemberData["oxy"] = round(H.getOxyLoss(), 1)
crewmemberData["tox"] = round(H.getToxLoss(), 1) crewmemberData["tox"] = round(H.getToxLoss(), 1)
crewmemberData["fire"] = round(H.getFireLoss(), 1) crewmemberData["fire"] = round(H.getFireLoss(), 1)

View File

@@ -490,16 +490,14 @@
// It REALLY doesnt matter too much if these arent up to date // It REALLY doesnt matter too much if these arent up to date
// They are relatively big // They are relatively big
assets = list( assets = list(
"southern_cross_nanomap_z1.png" = 'icons/_nanomaps/southern_cross_nanomap_z1.png', // VOREStation Edit: We don't need Southern Cross
"southern_cross_nanomap_z10.png" = 'icons/_nanomaps/southern_cross_nanomap_z10.png', // "southern_cross_nanomap_z1.png" = 'icons/_nanomaps/southern_cross_nanomap_z1.png',
"southern_cross_nanomap_z2.png" = 'icons/_nanomaps/southern_cross_nanomap_z2.png', // "southern_cross_nanomap_z10.png" = 'icons/_nanomaps/southern_cross_nanomap_z10.png',
"southern_cross_nanomap_z3.png" = 'icons/_nanomaps/southern_cross_nanomap_z3.png', // "southern_cross_nanomap_z2.png" = 'icons/_nanomaps/southern_cross_nanomap_z2.png',
"southern_cross_nanomap_z5.png" = 'icons/_nanomaps/southern_cross_nanomap_z5.png', // "southern_cross_nanomap_z3.png" = 'icons/_nanomaps/southern_cross_nanomap_z3.png',
"southern_cross_nanomap_z6.png" = 'icons/_nanomaps/southern_cross_nanomap_z6.png', // "southern_cross_nanomap_z5.png" = 'icons/_nanomaps/southern_cross_nanomap_z5.png',
// "southern_cross_nanomap_z6.png" = 'icons/_nanomaps/southern_cross_nanomap_z6.png',
"tether_nanomap_z1.png" = 'icons/_nanomaps/tether_nanomap_z1.png', "tether_nanomap_z1.png" = 'icons/_nanomaps/tether_nanomap_z1.png',
"tether_nanomap_z10.png" = 'icons/_nanomaps/tether_nanomap_z10.png',
"tether_nanomap_z13.png" = 'icons/_nanomaps/tether_nanomap_z13.png',
"tether_nanomap_z14.png" = 'icons/_nanomaps/tether_nanomap_z14.png',
"tether_nanomap_z2.png" = 'icons/_nanomaps/tether_nanomap_z2.png', "tether_nanomap_z2.png" = 'icons/_nanomaps/tether_nanomap_z2.png',
"tether_nanomap_z3.png" = 'icons/_nanomaps/tether_nanomap_z3.png', "tether_nanomap_z3.png" = 'icons/_nanomaps/tether_nanomap_z3.png',
"tether_nanomap_z4.png" = 'icons/_nanomaps/tether_nanomap_z4.png', "tether_nanomap_z4.png" = 'icons/_nanomaps/tether_nanomap_z4.png',
@@ -508,4 +506,8 @@
"tether_nanomap_z7.png" = 'icons/_nanomaps/tether_nanomap_z7.png', "tether_nanomap_z7.png" = 'icons/_nanomaps/tether_nanomap_z7.png',
"tether_nanomap_z8.png" = 'icons/_nanomaps/tether_nanomap_z8.png', "tether_nanomap_z8.png" = 'icons/_nanomaps/tether_nanomap_z8.png',
"tether_nanomap_z9.png" = 'icons/_nanomaps/tether_nanomap_z9.png', "tether_nanomap_z9.png" = 'icons/_nanomaps/tether_nanomap_z9.png',
"tether_nanomap_z10.png" = 'icons/_nanomaps/tether_nanomap_z10.png',
"tether_nanomap_z13.png" = 'icons/_nanomaps/tether_nanomap_z13.png',
"tether_nanomap_z14.png" = 'icons/_nanomaps/tether_nanomap_z14.png',
// VOREStation Edit End
) )

Binary file not shown.

Before

Width:  |  Height:  |  Size: 23 KiB

After

Width:  |  Height:  |  Size: 776 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 4.8 KiB

After

Width:  |  Height:  |  Size: 124 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 4.6 KiB

After

Width:  |  Height:  |  Size: 120 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 12 KiB

After

Width:  |  Height:  |  Size: 650 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 15 KiB

After

Width:  |  Height:  |  Size: 615 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 3.0 KiB

After

Width:  |  Height:  |  Size: 262 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 70 KiB

After

Width:  |  Height:  |  Size: 372 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 69 KiB

After

Width:  |  Height:  |  Size: 365 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 68 KiB

After

Width:  |  Height:  |  Size: 431 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 16 KiB

After

Width:  |  Height:  |  Size: 408 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 17 KiB

After

Width:  |  Height:  |  Size: 576 KiB

View File

@@ -1,38 +1,44 @@
import { Box, Icon, Tooltip } from '.';
import { Component } from 'inferno'; import { Component } from 'inferno';
import { Box, Button, Icon, Tooltip, LabeledList, Slider } from '.';
import { useBackend } from "../backend"; import { useBackend } from "../backend";
import { resolveAsset } from '../assets';
import { logger } from '../logging'; const pauseEvent = e => {
if (e.stopPropagation) { e.stopPropagation(); }
if (e.preventDefault) { e.preventDefault(); }
e.cancelBubble = true;
e.returnValue = false;
return false;
};
export class NanoMap extends Component { export class NanoMap extends Component {
constructor(props) { constructor(props) {
super(props); super(props);
// Auto center based on window size // Auto center based on window size
const Xcenter = (window.innerWidth / 2) - 256;
const Ycenter = (window.innerHeight / 2) - 256;
this.state = { this.state = {
offsetX: 0, offsetX: Xcenter,
offsetY: 0, offsetY: Ycenter,
transform: 'none', transform: 'none',
dragging: false, dragging: false,
originX: null, originX: null,
originY: null, originY: null,
zoom: 1,
}; };
// Dragging
this.handleDragStart = e => { this.handleDragStart = e => {
document.body.style['pointer-events'] = 'none';
this.ref = e.target; this.ref = e.target;
this.setState({ this.setState({
dragging: false, dragging: false,
originX: e.screenX, originX: e.screenX,
originY: e.screenY, originY: e.screenY,
}); });
this.timer = setTimeout(() => {
this.setState({
dragging: true,
});
}, 250);
document.addEventListener('mousemove', this.handleDragMove); document.addEventListener('mousemove', this.handleDragMove);
document.addEventListener('mouseup', this.handleDragEnd); document.addEventListener('mouseup', this.handleDragEnd);
pauseEvent(e);
}; };
this.handleDragMove = e => { this.handleDragMove = e => {
@@ -41,8 +47,8 @@ export class NanoMap extends Component {
const newOffsetX = e.screenX - state.originX; const newOffsetX = e.screenX - state.originX;
const newOffsetY = e.screenY - state.originY; const newOffsetY = e.screenY - state.originY;
if (prevState.dragging) { if (prevState.dragging) {
state.offsetX += (newOffsetX / this.props.zoom); state.offsetX += newOffsetX;
state.offsetY += (newOffsetY / this.props.zoom); state.offsetY += newOffsetY;
state.originX = e.screenX; state.originX = e.screenX;
state.originY = e.screenY; state.originY = e.screenY;
} else { } else {
@@ -50,11 +56,10 @@ export class NanoMap extends Component {
} }
return state; return state;
}); });
pauseEvent(e);
}; };
this.handleDragEnd = e => { this.handleDragEnd = e => {
document.body.style['pointer-events'] = 'auto';
clearTimeout(this.timer);
this.setState({ this.setState({
dragging: false, dragging: false,
originX: null, originX: null,
@@ -62,28 +67,54 @@ export class NanoMap extends Component {
}); });
document.removeEventListener('mousemove', this.handleDragMove); document.removeEventListener('mousemove', this.handleDragMove);
document.removeEventListener('mouseup', this.handleDragEnd); document.removeEventListener('mouseup', this.handleDragEnd);
pauseEvent(e);
}; };
this.handleZoom = (_e, value) => {
this.setState(state => {
const newZoom = Math.min(Math.max(value, 1), 8);
let zoomDiff = (newZoom - state.zoom) * 1.5;
state.zoom = newZoom;
let newOffsetX = state.offsetX - 262 * zoomDiff;
if (newOffsetX < -500) { newOffsetX = -500; }
if (newOffsetX > 500) { newOffsetX = 500; }
let newOffsetY = state.offsetY - 256 * zoomDiff;
if (newOffsetY < -200) { newOffsetY = -200; }
if (newOffsetY > 200) { newOffsetY = 200; }
state.offsetX = newOffsetX;
state.offsetY = newOffsetY;
if (props.onZoom) {
props.onZoom(state.zoom);
}
return state;
});
};
} }
render() { render() {
const { config } = useBackend(this.context); const { config } = useBackend(this.context);
const { offsetX, offsetY } = this.state; const { dragging, offsetX, offsetY, zoom = 1 } = this.state;
const { children, zoom, reset } = this.props; const { children } = this.props;
let matrix
= `matrix(${zoom}, 0, 0, ${zoom}, ${offsetX * zoom}, ${offsetY * zoom})`;
const mapUrl = config.map + "_nanomap_z" + config.mapZLevel + ".png";
// (x * zoom), x Needs to be double the turf- map size. (for virgo, 140x140)
const mapSize = (280 * zoom) + 'px';
const newStyle = { const newStyle = {
width: '560px', width: mapSize,
height: '560px', height: mapSize,
"margin-top": offsetY + "px",
"margin-left": offsetX + "px",
"overflow": "hidden", "overflow": "hidden",
"position": "relative", "position": "relative",
"padding": "0px", "background-image": "url(" + mapUrl + ")",
"background-image":
"url("+config.map+"_nanomap_z"+config.mapZLevel+".png)",
"background-size": "cover", "background-size": "cover",
"background-repeat": "no-repeat",
"text-align": "center", "text-align": "center",
"transform": matrix, "cursor": dragging ? "move" : "auto",
}; };
return ( return (
@@ -96,6 +127,7 @@ export class NanoMap extends Component {
{children} {children}
</Box> </Box>
</Box> </Box>
<NanoMapZoomer zoom={zoom} onZoom={this.handleZoom} />
</Box> </Box>
); );
} }
@@ -105,31 +137,73 @@ const NanoMapMarker = (props, context) => {
const { const {
x, x,
y, y,
zoom, zoom = 1,
icon, icon,
tooltip, tooltip,
color, color,
onClick, onClick,
} = props; } = props;
const rx = (x * 4) - 5;
const ry = (y * 4) - 4;
const handleOnClick = e => {
pauseEvent(e);
onClick(e);
};
const rx = ((x * 2 * zoom) - zoom) - 3;
const ry = ((y * 2 * zoom) - zoom) - 3;
return ( return (
<Box <div>
position="absolute" <Box
className="NanoMap__marker" position="absolute"
lineHeight="0" className="NanoMap__marker"
bottom={ry + 'px'} lineHeight="0"
left={rx + 'px'} bottom={ry + "px"}
onMouseDown={onClick} > left={rx + "px"}
<Icon onMouseDown={handleOnClick}>
name={icon} <Icon
color={color} name={icon}
fontSize="4px" color={color}
/> fontSize="6px"
<Tooltip content={tooltip} scale={zoom} /> />
</Box> <Tooltip content={tooltip} />
</Box>
</div>
); );
}; };
NanoMap.Marker = NanoMapMarker; NanoMap.Marker = NanoMapMarker;
const NanoMapZoomer = (props, context) => {
const { act, config, data } = useBackend(context);
return (
<Box className="NanoMap__zoomer">
<LabeledList>
<LabeledList.Item label="Zoom">
<Slider
minValue="1"
maxValue="8"
stepPixelSize="10"
format={v => v + "x"}
value={props.zoom}
onDrag={(e, v) => props.onZoom(e, v)}
/>
</LabeledList.Item>
<LabeledList.Item label="Z-Level">
{data.map_levels
.sort((a, b) => Number(a) - Number(b))
.map(level => (
<Button
key={level}
selected={~~level === ~~config.mapZLevel}
content={level}
onClick={() => {
act("setZLevel", { "mapZLevel": level });
}} />
))}
</LabeledList.Item>
</LabeledList>
</Box>
);
};
NanoMap.Zoomer = NanoMapZoomer;

View File

@@ -29,7 +29,7 @@ export const AtmosControlContent = (props, context) => {
// sortedAlarms = sortedAlarms.slice(1, 3); // sortedAlarms = sortedAlarms.slice(1, 3);
const [tabIndex, setTabIndex] = useLocalState(context, 'tabIndex', 0); const [tabIndex, setTabIndex] = useLocalState(context, 'tabIndex', 0);
const [mapZoom, setZoom] = useLocalState(context, 'mapZoom', 1); const [zoom, setZoom] = useLocalState(context, 'zoom', 1);
let body; let body;
// Alarms View // Alarms View
@@ -54,30 +54,8 @@ export const AtmosControlContent = (props, context) => {
// you MUST update styles/components/Tooltip.scss // you MUST update styles/components/Tooltip.scss
// and change the @for scss to match. // and change the @for scss to match.
body = ( body = (
<Box textAlign="center"> <Box height="526px" mb="0.5rem" overflow="hidden">
Zoom Level: <NanoMap onZoom={v => setZoom(v)}>
<NumberInput
animated
width="40px"
step={0.5}
stepPixelSize="5"
value={mapZoom}
minValue={1}
maxValue={8}
onChange={(e, value) => setZoom(value)} />
Z-Level:
{data.map_levels
.sort((a, b) => Number(a) - Number(b))
.map(level => (
<Button
key={level}
selected={~~level === ~~config.mapZLevel}
content={level}
onClick={() => {
act("setZLevel", { "mapZLevel": level });
}} />
))}
<NanoMap zoom={mapZoom}>
{sortedAlarms {sortedAlarms
.filter(x => .filter(x =>
(~~x.z === ~~config.mapZLevel) (~~x.z === ~~config.mapZLevel)
@@ -86,7 +64,7 @@ export const AtmosControlContent = (props, context) => {
key={cm.ref} key={cm.ref}
x={cm.x} x={cm.x}
y={cm.y} y={cm.y}
zoom={mapZoom} zoom={zoom}
icon="bell" icon="bell"
tooltip={cm.name} tooltip={cm.name}
color={cm.danger ? 'red' : 'green'} color={cm.danger ? 'red' : 'green'}

View File

@@ -3,9 +3,28 @@ import { flow } from 'common/fp';
import { useBackend, useLocalState } from "../backend"; import { useBackend, useLocalState } from "../backend";
import { Window } from "../layouts"; import { Window } from "../layouts";
import { NanoMap, Box, Table, Button, Tabs, Icon, NumberInput } from "../components"; import { NanoMap, Box, Table, Button, Tabs, Icon, NumberInput } from "../components";
import { TableCell } from '../components/Table';
import { Fragment } from 'inferno'; import { Fragment } from 'inferno';
const getStatText = cm => {
if (cm.dead) {
return "Deceased";
}
if (parseInt(cm.stat, 10) === 1) { // Unconscious
return "Unconscious";
}
return "Living";
};
const getStatColor = cm => {
if (cm.dead) {
return "red";
}
if (parseInt(cm.stat, 10) === 1) { // Unconscious
return "orange";
}
return "green";
};
export const CrewMonitor = () => { export const CrewMonitor = () => {
return ( return (
<Window <Window
@@ -30,10 +49,8 @@ export const CrewMonitorContent = (props, context) => {
sortBy(cm => cm?.realZ), sortBy(cm => cm?.realZ),
])(data.crewmembers || []); ])(data.crewmembers || []);
const [ const [zoom, setZoom] = useLocalState(context, 'zoom', 1);
mapZoom,
setZoom,
] = useLocalState(context, 'number', 1);
let body; let body;
// Data view // Data view
if (tabIndex === 0) { if (tabIndex === 0) {
@@ -52,13 +69,13 @@ export const CrewMonitorContent = (props, context) => {
</Table.Row> </Table.Row>
{crew.map(cm => ( {crew.map(cm => (
<Table.Row key={cm.ref}> <Table.Row key={cm.ref}>
<TableCell> <Table.Cell>
{cm.name} ({cm.assignment}) {cm.name} ({cm.assignment})
</TableCell> </Table.Cell>
<TableCell> <Table.Cell>
<Box inline <Box inline
color={cm.dead ? 'red' : 'green'}> color={getStatColor(cm)}>
{cm.dead ? 'Deceased' : 'Living'} {getStatText(cm)}
</Box> </Box>
{cm.sensor_type >= 2 ? ( {cm.sensor_type >= 2 ? (
<Box inline> <Box inline>
@@ -85,8 +102,8 @@ export const CrewMonitorContent = (props, context) => {
{')'} {')'}
</Box> </Box>
) : null} ) : null}
</TableCell> </Table.Cell>
<TableCell> <Table.Cell>
{cm.sensor_type === 3 ? ( {cm.sensor_type === 3 ? (
data.isAI ? ( data.isAI ? (
<Button fluid <Button fluid
@@ -101,7 +118,7 @@ export const CrewMonitorContent = (props, context) => {
cm.area+" ("+cm.x+", "+cm.y+", "+cm.z+")" cm.area+" ("+cm.x+", "+cm.y+", "+cm.z+")"
) )
) : "Not Available"} ) : "Not Available"}
</TableCell> </Table.Cell>
</Table.Row> </Table.Row>
))} ))}
</Table> </Table>
@@ -110,48 +127,7 @@ export const CrewMonitorContent = (props, context) => {
// Please note, if you ever change the zoom values, // Please note, if you ever change the zoom values,
// you MUST update styles/components/Tooltip.scss // you MUST update styles/components/Tooltip.scss
// and change the @for scss to match. // and change the @for scss to match.
body = ( body = <CrewMonitorMapView />;
<Box textAlign="center">
Zoom Level:
<NumberInput
animated
width="40px"
step={0.5}
stepPixelSize="5"
value={mapZoom}
minValue={1}
maxValue={8}
onChange={(e, value) => setZoom(value)} />
Z-Level:
{data.map_levels
.sort((a, b) => Number(a) - Number(b))
.map(level => (
<Button
key={level}
selected={~~level === ~~config.mapZLevel}
content={level}
onClick={() => {
act("setZLevel", { "mapZLevel": level });
}} />
))}
<NanoMap zoom={mapZoom}>
{crew
.filter(x =>
(x.sensor_type === 3 && ~~x.realZ === ~~config.mapZLevel)
).map(cm => (
<NanoMap.Marker
key={cm.ref}
x={cm.x}
y={cm.y}
zoom={mapZoom}
icon="circle"
tooltip={cm.name}
color={cm.dead ? 'red' : 'green'}
/>
))}
</NanoMap>
</Box>
);
} else { } else {
body = "ERROR"; body = "ERROR";
} }
@@ -178,3 +154,27 @@ export const CrewMonitorContent = (props, context) => {
</Fragment> </Fragment>
); );
}; };
const CrewMonitorMapView = (props, context) => {
const { act, config, data } = useBackend(context);
const [zoom, setZoom] = useLocalState(context, 'zoom', 1);
return (
<Box height="526px" mb="0.5rem" overflow="hidden">
<NanoMap onZoom={v => setZoom(v)}>
{data.crewmembers.filter(x =>
(x.sensor_type === 3 && ~~x.realZ === ~~config.mapZLevel)
).map(cm => (
<NanoMap.Marker
key={cm.ref}
x={cm.x}
y={cm.y}
zoom={zoom}
icon="circle"
tooltip={cm.name + " (" + cm.assignment + ")"}
color={getStatColor(cm)}
/>
))}
</NanoMap>
</Box>
);
};

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View File

@@ -1,7 +1,8 @@
$color-background: rgba(0, 0, 0, 0.33) !default;
.NanoMap__container { .NanoMap__container {
overflow: hidden; overflow: hiddden;
width: 100%; width: 100%;
height: 100vh;
z-index: 1; z-index: 1;
} }
@@ -10,3 +11,13 @@
padding: 0px; padding: 0px;
margin: 0px; margin: 0px;
} }
.NanoMap__zoomer {
z-index: 20;
background-color: $color-background;
position: absolute;
top: 30px;
left: 0;
padding: 0.5rem;
width: 30%;
}