New REM client: REM-Client a099656, 64-bit (HUD ship status: the ship as a wireframe with its damage in the shield ring, power / thrust / speed wings; inventory: smaller, credits, the picked piece's figures; main menu, loading bar and message box in the HUD look)

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
2026-11-06 13:32:46 +01:00
co-authored by Claude Opus 5.5
parent f5511d92bb
commit 2835d6bee1
6 changed files with 90 additions and 50 deletions
Binary file not shown.
+5 -3
View File
@@ -14,9 +14,11 @@
display: block;
decorator: ninepatch(fw, fw-i);
}
.box-head { display: flex; flex-direction: row; align-items: center; padding: 12dp 18dp; border-bottom: 1dp #24405c; }
.box-head .title { font-family: "Saira SemiCondensed"; font-weight: 600; font-size: 19dp; letter-spacing: 1.2dp; text-transform: uppercase; flex: 1; }
.box-body { padding: 16dp 18dp; }
/* the windows' head (rem.rcss .win-head): clear of the cut corner, the title with its three slashes */
.box-head { display: flex; flex-direction: row; align-items: center; padding: 12dp 18dp 12dp 28dp; border-bottom: 1dp #2b6f9e; }
.box-head .title { font-family: "Saira SemiCondensed"; font-weight: 600; font-size: 20dp; letter-spacing: 2dp; text-transform: uppercase; color: #e8f4ff; }
.box-head .sl { flex: 1; font-family: "Saira SemiCondensed"; font-weight: 600; font-size: 20dp; letter-spacing: -1dp; color: #5cc8f0; margin-left: 10dp; }
.box-body { padding: 16dp 18dp 16dp 28dp; }
.box-body .text { white-space: pre-line; line-height: 1.5; font-size: 15dp; max-height: 320dp; overflow-y: auto; }
.box-body input.text { margin-top: 12dp; }
.box-foot { display: flex; flex-direction: row; justify-content: flex-end; padding: 0 18dp 14dp 18dp; }
+45 -19
View File
@@ -32,16 +32,36 @@
.cruise { left: 50%; margin-left: -300dp; top: 90dp; width: 64dp; height: 56dp; display: flex; justify-content: center; align-items: center; }
.cruise .ico { width: 40dp; height: 40dp; }
/* --- bottom centre: thrust | shield / hull / power | speed, one panel ----------------- */
.core { left: 50%; margin-left: -240dp; bottom: 8dp; width: 480dp; height: 66dp; padding: 0 16dp; display: flex; flex-direction: row; align-items: center; }
.core .val { width: 76dp; text-align: center; font-weight: 600; font-size: 22dp; color: #e8f4ff; }
.core .val .u { font-weight: 400; font-size: 11dp; color: #8fb3d0; margin-left: 4dp; }
.core .cap { display: block; font-weight: 600; font-size: 9dp; letter-spacing: 1.5dp; color: #8fb3d0; }
.core .thrust.low { color: #ef6a5b; }
.core .sep { width: 1dp; height: 42dp; background-color: #2b6f9e; margin: 0 10dp; }
.bars { flex: 1; display: flex; flex-direction: column; justify-content: center; }
.brow { display: flex; flex-direction: row; align-items: center; height: 15dp; }
.brow .l { width: 52dp; font-weight: 600; font-size: 10dp; letter-spacing: 1.5dp; color: #b9d4ea; }
/* --- bottom centre: the ship in its shield ring (the hull the red ring inside); power and thrust as a
wing on the left, the speed as one on the right -- arcs of a large circle under the panel rising to the
ring; the rings and wings are lit segments, each turned about its circle's centre (seg16 / seg32) */
.fp.core { left: 50%; margin-left: -310dp; bottom: 8dp; width: 620dp; height: 170dp; decorator: none; font-effect: shadow(1dp 1dp #000000cc); }
.core .disc { position: absolute; left: 242dp; top: 24dp; width: 134dp; height: 134dp; border: 1dp #2b6f9e; border-radius: 68dp; }
.core .ship { display: block; position: absolute; left: 280dp; top: 58dp; width: 60dp; height: 56dp; }
.core .pc { position: absolute; left: 242dp; top: 114dp; width: 136dp; text-align: center; font-weight: 600; font-size: 11dp; letter-spacing: 1dp; }
.core .pc .s { color: #4fc6ee; margin-right: 8dp; }
.core .pc .h { color: #e0484e; }
.sg2 { position: absolute; }
.ring.sg2 { left: 304.75dp; top: 88.5dp; width: 10.5dp; height: 7dp; background-color: #4fc6ee26; }
.ring.sg2.lit { background-color: #4fc6ee; }
.hring.sg2 { left: 306dp; top: 90.5dp; width: 8dp; height: 3dp; background-color: #e0484e33; }
.hring.sg2.lit { background-color: #e0484e; }
.parc.sg2 { left: 305dp; top: 416dp; width: 10dp; height: 8dp; background-color: #f0943c26; }
.parc.sg2.lit { background-color: #f0943c; }
.tarc.sg2 { left: 305dp; top: 418dp; width: 10dp; height: 4dp; background-color: #dbe6f026; }
.tarc.sg2.lit { background-color: #dbe6f0; }
.tarc.low.sg2.lit { background-color: #ef6a5b; }
.sarc.sg2 { left: 305dp; top: 414dp; width: 10dp; height: 12dp; background-color: #5cc8f026; }
.sarc.sg2.lit { background-color: #5cc8f0; }
.core .side { position: absolute; top: 106dp; width: 180dp; }
.core .side.l { left: 50dp; text-align: right; }
.core .side.r { left: 390dp; text-align: left; }
.core .cap { font-weight: 600; font-size: 10dp; letter-spacing: 1.5dp; color: #8fb3d0; margin: 0 6dp; }
.core .big { font-weight: 600; font-size: 26dp; color: #e8f4ff; }
.core .big.low { color: #ef6a5b; }
.core .big .u { font-weight: 400; font-size: 12dp; color: #8fb3d0; margin-left: 4dp; }
.core .pw { display: block; font-weight: 600; font-size: 13dp; color: #f0943c; }
.core .pw .cap { color: #f0943c; }
.bar { position: relative; flex: 1; height: 8dp; }
.chips { position: absolute; left: 0; top: 0; right: 0; height: 8dp; display: flex; flex-direction: row; }
.sg { flex: 1; height: 8dp; margin-right: 2dp; }
@@ -141,18 +161,24 @@
<!-- bottom centre -->
<div class="grp g1" data-grp="1" data-style-transform="grp[1].tf" data-class-gone="!grp[1].shown && !editing" data-class-faded="!grp[1].shown && editing">
<div class="tag" data-if="editing" style="left: 50%; margin-left: -240dp; bottom: 82dp;"><span class="eye" data-action="eye" data-arg="1">{{ grp[1].shown ? 'Hide' : 'Show' }}</span>Ship status</div>
<div class="tag" data-if="editing" style="left: 50%; margin-left: -310dp; bottom: 184dp;"><span class="eye" data-action="eye" data-arg="1">{{ grp[1].shown ? 'Hide' : 'Show' }}</span>Ship status</div>
<div data-if="core || editing">
<div class="fp all core">
<div class="val thrust" data-class-low="thrust_low"><span class="cap">THRUST</span>{{ thrust }}</div>
<div class="sep"></div>
<div class="bars">
<div class="brow power"><span class="l">POWER</span><div class="bar"><div class="chips"><div class="sg" data-class-lit="power_n > 0"></div><div class="sg" data-class-lit="power_n > 1"></div><div class="sg" data-class-lit="power_n > 2"></div><div class="sg" data-class-lit="power_n > 3"></div><div class="sg" data-class-lit="power_n > 4"></div><div class="sg" data-class-lit="power_n > 5"></div><div class="sg" data-class-lit="power_n > 6"></div><div class="sg" data-class-lit="power_n > 7"></div><div class="sg" data-class-lit="power_n > 8"></div><div class="sg" data-class-lit="power_n > 9"></div><div class="sg" data-class-lit="power_n > 10"></div><div class="sg" data-class-lit="power_n > 11"></div><div class="sg" data-class-lit="power_n > 12"></div><div class="sg" data-class-lit="power_n > 13"></div><div class="sg" data-class-lit="power_n > 14"></div><div class="sg" data-class-lit="power_n > 15"></div></div></div></div>
<div class="brow shield"><span class="l">SHIELD</span><div class="bar"><div class="chips"><div class="sg" data-class-lit="shield_n > 0"></div><div class="sg" data-class-lit="shield_n > 1"></div><div class="sg" data-class-lit="shield_n > 2"></div><div class="sg" data-class-lit="shield_n > 3"></div><div class="sg" data-class-lit="shield_n > 4"></div><div class="sg" data-class-lit="shield_n > 5"></div><div class="sg" data-class-lit="shield_n > 6"></div><div class="sg" data-class-lit="shield_n > 7"></div><div class="sg" data-class-lit="shield_n > 8"></div><div class="sg" data-class-lit="shield_n > 9"></div><div class="sg" data-class-lit="shield_n > 10"></div><div class="sg" data-class-lit="shield_n > 11"></div><div class="sg" data-class-lit="shield_n > 12"></div><div class="sg" data-class-lit="shield_n > 13"></div><div class="sg" data-class-lit="shield_n > 14"></div><div class="sg" data-class-lit="shield_n > 15"></div></div></div></div>
<div class="brow hull"><span class="l">HULL</span><div class="bar"><div class="chips"><div class="sg" data-class-lit="hull_n > 0"></div><div class="sg" data-class-lit="hull_n > 1"></div><div class="sg" data-class-lit="hull_n > 2"></div><div class="sg" data-class-lit="hull_n > 3"></div><div class="sg" data-class-lit="hull_n > 4"></div><div class="sg" data-class-lit="hull_n > 5"></div><div class="sg" data-class-lit="hull_n > 6"></div><div class="sg" data-class-lit="hull_n > 7"></div><div class="sg" data-class-lit="hull_n > 8"></div><div class="sg" data-class-lit="hull_n > 9"></div><div class="sg" data-class-lit="hull_n > 10"></div><div class="sg" data-class-lit="hull_n > 11"></div><div class="sg" data-class-lit="hull_n > 12"></div><div class="sg" data-class-lit="hull_n > 13"></div><div class="sg" data-class-lit="hull_n > 14"></div><div class="sg" data-class-lit="hull_n > 15"></div></div></div></div>
<div class="disc"></div>
<shipwire class="ship"/>
<div class="sg2 ring" data-for="i : seg32" data-class-lit="shield_n * 2 &gt; i" data-style-transform="'rotate(' + (i * 11.25 + 5.6) + 'deg) translateY(-60dp)'"></div>
<div class="sg2 hring" data-for="i : seg32" data-class-lit="hull_n * 2 &gt; i" data-style-transform="'rotate(' + (i * 11.25 + 5.6) + 'deg) translateY(-48dp)'"></div>
<div class="sg2 parc" data-for="i : seg16" data-class-lit="power_n &gt; i" data-style-transform="'rotate(' + (i * 2 - 42) + 'deg) translateY(-370dp)'"></div>
<div class="sg2 tarc" data-for="i : seg16" data-class-lit="thrust_n &gt; i" data-class-low="thrust_low" data-style-transform="'rotate(' + (i * 2 - 42) + 'deg) translateY(-384dp)'"></div>
<div class="sg2 sarc" data-for="i : seg16" data-class-lit="speed_n &gt; i" data-style-transform="'rotate(' + (42 - i * 2) + 'deg) translateY(-372dp)'"></div>
<div class="pc"><span class="s">{{ shield_t }}%</span><span class="h">{{ hull_t }}%</span></div>
<div class="side l">
<span class="cap">THRUST</span><span class="big" data-class-low="thrust_low">{{ thrust }}</span>
<span class="pw"><span class="cap">POWER</span>{{ power_t }}%</span>
</div>
<div class="side r">
<span class="big">{{ speed }}<span class="u">m/s</span></span><span class="cap">SPEED</span>
</div>
<div class="sep"></div>
<div class="val speed"><span class="cap">SPEED</span>{{ speed }}<span class="u">m/s</span></div>
</div>
</div>
+13 -4
View File
@@ -15,8 +15,8 @@
.inv .n { font-size: 14dp; }
.inv .note { font-size: 12dp; color: #8197ad; }
.inv .c { font-family: "IBM Plex Mono"; color: #8197ad; margin-left: 8dp; }
#ship { flex: 1; min-height: 200dp; decorator: vertical-gradient(#0a1424 #05080d); margin-bottom: 12dp; }
.card { height: 180dp; overflow-y: auto; white-space: pre-line; line-height: 1.45; padding: 12dp; background-color: #5cc8f008; }
#ship { flex: 1; min-height: 140dp; decorator: vertical-gradient(#0a1424 #05080d); margin-bottom: 12dp; }
.card { height: 110dp; overflow-y: auto; white-space: pre-line; line-height: 1.45; padding: 12dp; background-color: #5cc8f008; }
.pick-head { display: flex; flex-direction: row; align-items: center; margin-bottom: 8dp; }
.pick-head img { width: 40dp; height: 40dp; margin-right: 12dp; }
.pick-head .t { font-family: "Saira SemiCondensed"; font-weight: 600; font-size: 18dp; }
@@ -35,10 +35,18 @@
.inv.held.selected { border-left-color: #f2b13c; }
.holdrow { display: flex; flex-direction: row; margin-bottom: 8dp; }
.holdrow .dstat { margin-left: 0; }
.holdrow .dstat + .dstat { margin-left: 18dp; }
.holdrow .hbar { width: 140dp; }
.holdrow .sv { font-size: 17dp; }
.jet .btn { margin: 0; }
/* the picked piece's figures (rem_ui_stats), two to a row */
.figs { display: flex; flex-direction: row; flex-wrap: wrap; margin-bottom: 8dp; padding: 6dp 10dp; background-color: #5cc8f008; }
.figs .fg { width: 50%; display: flex; flex-direction: row; padding: 2dp 8dp 2dp 0; box-sizing: border-box; }
.figs .fl { flex: 1; white-space: nowrap; overflow: hidden; color: #8fb3d0; font-size: 13dp; }
.figs .fv { font-family: "IBM Plex Mono"; font-size: 13dp; color: #e8f4ff; }
</style>
</head>
<body class="window" data-model="inventory">
<body class="window medium" data-model="inventory">
<div class="win-head">
<img class="head-ico" src="3db:INTERFACE/REM/IMAGES/icon_cargo.3db"/>
<span class="title">INVENTORY</span><span class="sl">\\\</span>
@@ -56,7 +64,7 @@
<div class="content">
<div class="split">
<div class="colm list-col">
<div class="holdrow"><div class="dstat"><span class="sk">HOLD</span><div class="hbar"><div class="hf" data-class-warn="hold_pct &gt;= 75" data-class-bad="hold_pct &gt;= 100" data-style-width="hold_pct + '%'"></div><span class="ht">{{ hold }}</span></div></div></div>
<div class="holdrow"><div class="dstat"><span class="sk">CREDITS</span><span class="sv">{{ credits }}</span></div><div class="dstat"><span class="sk">HOLD</span><div class="hbar"><div class="hf" data-class-warn="hold_pct &gt;= 75" data-class-bad="hold_pct &gt;= 100" data-style-width="hold_pct + '%'"></div><span class="ht">{{ hold }}</span></div></div></div>
<input class="text search" type="text" data-value="search" maxlength="40" style="margin-bottom: 8dp;"/>
<div class="list">
<div class="sec" data-if="hps.size &gt; 0">HARDPOINTS<span class="cnt">{{ hp_used }} / {{ hps.size }}</span></div>
@@ -84,6 +92,7 @@
<div id="ship"></div>
<div data-if="has_pick">
<div class="pick-head"><img data-if="pick.icon != ''" data-attr-src="pick.icon"/><div><div class="t">{{ pick.name }}</div><div class="hint">{{ pick.note }}</div></div></div>
<div class="figs" data-if="stats.size &gt; 0"><div class="fg" data-for="f : stats"><span class="fl">{{ f.label }}</span><span class="fv">{{ f.value }}</span></div></div>
<div class="card">{{ info }}</div>
<div class="jet" data-if="mount_label != ''"><div class="btn primary" data-action="mount">{{ mount_label }}<div class="tip">{{ mount_tip }}</div></div></div>
<div class="jet" data-if="can_jettison">
+10 -6
View File
@@ -4,16 +4,20 @@
<link type="text/rcss" href="rem.rcss"/>
<style>
body.loaddoc { position: absolute; left: 0; top: 0; right: 0; bottom: 0; display: block; background-color: transparent; pointer-events: none; }
.load { position: absolute; left: 50%; bottom: 60dp; transform: translateX(-50%); width: 420dp; padding: 10dp 16dp 12dp 16dp; decorator: ninepatch(fw, fw-i); }
.load .t { font-family: "Saira SemiCondensed"; font-weight: 700; font-size: 18dp; letter-spacing: 4dp; color: #dbe6f0; text-align: center; margin-bottom: 8dp; }
.load .track { position: relative; height: 4dp; background-color: #24405c; border-radius: 2dp; }
.load .sweep { position: absolute; top: 0; width: 25%; height: 4dp; background-color: #f2b13c; border-radius: 2dp; }
/* a small HUD panel (cut corners): the title with its three slashes, a segmented rail as the HUD's
bars with the amber sweep running over it (the loading screen's own phase: no real progress) */
.load { position: absolute; left: 50%; bottom: 60dp; transform: translateX(-50%); width: 460dp; padding: 12dp 22dp 16dp 26dp; decorator: ninepatch(fw, fw-i); }
.load .t { font-family: "Saira SemiCondensed"; font-weight: 600; font-size: 18dp; letter-spacing: 3dp; color: #e8f4ff; margin-bottom: 10dp; }
.load .t .sl { margin-left: 10dp; letter-spacing: -1dp; color: #5cc8f0; }
.load .track { position: relative; height: 8dp; display: flex; flex-direction: row; }
.load .sg { flex: 1; height: 8dp; margin-right: 2dp; background-color: #f2b13c26; }
.load .sweep { position: absolute; top: 0; width: 25%; height: 8dp; background-color: #f2b13ccc; }
</style>
</head>
<body class="loaddoc" data-model="loading">
<div class="load" data-if="shown">
<div class="t">LOADING</div>
<div class="track"><div class="sweep" data-style-left="sweep"></div></div>
<div class="t">LOADING<span class="sl">\\\</span></div>
<div class="track"><div class="sg"></div><div class="sg"></div><div class="sg"></div><div class="sg"></div><div class="sg"></div><div class="sg"></div><div class="sg"></div><div class="sg"></div><div class="sg"></div><div class="sg"></div><div class="sg"></div><div class="sg"></div><div class="sg"></div><div class="sg"></div><div class="sg"></div><div class="sg"></div><div class="sg"></div><div class="sg"></div><div class="sg"></div><div class="sg"></div><div class="sweep" data-style-left="sweep"></div></div>
</div>
</body>
</rml>
+17 -18
View File
@@ -3,38 +3,37 @@
<title>Main menu</title>
<link type="text/rcss" href="rem.rcss"/>
<style>
/* a panel down the left edge over the menu scene */
/* a panel at the left in the flight HUD's frame (cut corners, rem.rcss hudframes): the title with
its three slashes, the entries as the windows' side tabs -- amber the first, cyan under the mouse */
body.menu
{
position: absolute;
left: 0;
left: 28dp;
top: 20%;
width: 420dp;
height: 80%;
background-color: #070b12d9;
border-right: 1dp #3d6d96;
border-top: 1dp #3d6d96;
border-top-right-radius: 4dp;
width: 400dp;
bottom: 28dp;
decorator: ninepatch(fw, fw-i);
display: flex;
flex-direction: column;
padding: 0 36dp;
padding: 0 0 0 0;
}
.brand { margin-top: 30dp; margin-bottom: 30dp; }
.brand .t { font-family: "Saira SemiCondensed"; font-weight: 700; font-size: 46dp; letter-spacing: 6dp; color: #dbe6f0; }
.brand .s { font-family: "Saira SemiCondensed"; font-size: 15dp; letter-spacing: 4dp; text-transform: uppercase; color: #f2b13c; margin-top: -4dp; }
.entry { padding: 13dp 16dp; margin-bottom: 8dp; border-left: 3dp #3d6d96; background-color: #5cc8f008; }
.entry:hover { border-left-color: #5cc8f0; background-color: #5cc8f010; }
.entry.primary { border-left-color: #f2b13c; }
.entry .l { font-family: "Saira SemiCondensed"; font-weight: 600; font-size: 20dp; letter-spacing: 2dp; text-transform: uppercase; }
.brand { padding: 22dp 28dp 16dp 32dp; border-bottom: 1dp #2b6f9e; margin-bottom: 18dp; }
.brand .t { font-family: "Saira SemiCondensed"; font-weight: 700; font-size: 40dp; letter-spacing: 6dp; color: #e8f4ff; white-space: nowrap; }
.brand .t .sl { margin-left: 12dp; font-weight: 600; font-size: 34dp; letter-spacing: -1dp; color: #5cc8f0; }
.brand .s { font-family: "Saira SemiCondensed"; font-weight: 600; font-size: 14dp; letter-spacing: 4dp; text-transform: uppercase; color: #f2b13c; margin-top: -4dp; }
.entry { margin: 0 24dp 6dp 24dp; padding: 11dp 16dp; border-left: 2dp #2b6f9e; background-color: #5cc8f008; }
.entry:hover { border-left-color: #5cc8f0; background-color: #5cc8f01a; }
.entry.primary { border-left-color: #f2b13c; background-color: #f2b13c14; }
.entry .l { font-family: "Saira SemiCondensed"; font-weight: 600; font-size: 18dp; letter-spacing: 2dp; text-transform: uppercase; color: #dbe6f0; }
.entry.primary .l { color: #f2b13c; }
.entry:hover .l { color: #5cc8f0; }
.entry .h { font-size: 13dp; color: #8197ad; margin-top: 2dp; }
.foot { margin-top: auto; margin-bottom: 24dp; font-family: "IBM Plex Mono"; font-size: 12dp; color: #8197ad; }
.foot { margin: auto 28dp 22dp 32dp; padding-top: 10dp; border-top: 1dp #24405c; font-family: "IBM Plex Mono"; font-size: 12dp; color: #8197ad; }
</style>
</head>
<body class="menu" data-model="mainmenu">
<div class="brand">
<div class="t">REMNANT</div>
<div class="t">REMNANT<span class="sl">\\\</span></div>
<div class="s">Freelancer</div>
</div>
<div class="entry" data-for="e : entries" data-class-primary="e.primary" data-action="command" data-attr-data-arg="e.command">