diff --git a/BUILD_INFO.txt b/BUILD_INFO.txt
index 94cc4448..22989911 100644
--- a/BUILD_INFO.txt
+++ b/BUILD_INFO.txt
@@ -1,6 +1,6 @@
REM-Client test build (64-bit)
-date: 2026-11-13 12:40
-commit: a1ca764a (main)
-subject: Equipment dealer: the ship's hardpoints as dots on the 3D ship too; dots that would overlap pushed apart
+date: 2026-11-13 15:48
+commit: 1fca54f4 (main)
+subject: Nav map: the zones at their true positions (nebulae and fields wandered with the floating origin)
tree: clean
build: OK
diff --git a/EXE/Freelancer.exe b/EXE/Freelancer.exe
index 08dbc607..4e903a86 100755
Binary files a/EXE/Freelancer.exe and b/EXE/Freelancer.exe differ
diff --git a/EXE/common.dll b/EXE/common.dll
index 6f00039c..eda18f49 100644
Binary files a/EXE/common.dll and b/EXE/common.dll differ
diff --git a/EXE/remui/hud.rml b/EXE/remui/hud.rml
index d6380dfe..2f4a5bb3 100644
--- a/EXE/remui/hud.rml
+++ b/EXE/remui/hud.rml
@@ -134,6 +134,26 @@
.w.jump { color: #8fb8d8; }
.w.jump .f { margin-left: 8dp; font-size: 13dp; color: #9fb4c8; }
.w.jump.on { color: #f2b45c; border-left-color: #f2b45c; }
+ .w.jump.goal { color: #5cc8f0; border-left-color: #5cc8f0; }
+ .w.jump.wpelse { color: #8197ad; border-left-color: #8197ad; }
+ .w.jump.wpelse.reach { color: #f2b13c; border-left-color: #f2b13c; }
+ /* REM: the system picked as the target - a frame in space in its direction (as the target bracket) */
+ #sysmark { position: absolute; display: none; width: 0; height: 0; }
+ #sysmark.on { display: block; }
+ #sysmark .bk { position: absolute; width: 14dp; height: 14dp; border-color: #5cc8f0; }
+ #sysmark .tl { left: -26dp; top: -26dp; border-left: 2dp; border-top: 2dp; }
+ #sysmark .tr { left: 12dp; top: -26dp; border-right: 2dp; border-top: 2dp; }
+ #sysmark .bl { left: -26dp; top: 12dp; border-left: 2dp; border-bottom: 2dp; }
+ #sysmark .br { left: 12dp; top: 12dp; border-right: 2dp; border-bottom: 2dp; }
+ #sysmark .dot { position: absolute; left: -4dp; top: -4dp; width: 8dp; height: 8dp; border-radius: 4dp; background-color: #f2c94c; }
+ #sysmark .t { position: absolute; left: 32dp; top: -20dp; white-space: nowrap; font-family: "Saira SemiCondensed"; font-size: 15dp; color: #dbf3ff; font-effect: shadow(1dp 1dp #03070d); }
+ #sysmark .t .d { display: block; font-size: 12dp; color: #5cc8f0; }
+ /* REM: ... out of the picture: an arrow at the screen's edge towards it */
+ #sysarrow { position: absolute; display: none; width: 0; height: 0; }
+ #sysarrow.on { display: block; }
+ #sysarrow .a { position: absolute; left: -14dp; top: -14dp; width: 28dp; height: 28dp; line-height: 28dp; text-align: center; font-size: 24dp; color: #5cc8f0; font-effect: shadow(1dp 1dp #03070d); transform-origin: 50% 50%; }
+ #sysarrow .t { position: absolute; width: 120dp; text-align: center; white-space: nowrap; font-family: "Saira SemiCondensed"; font-size: 15dp; color: #dbf3ff; font-effect: shadow(1dp 1dp #03070d); }
+ #sysarrow .t .d { display: block; font-size: 12dp; color: #5cc8f0; }
.cloakbar.jumpbar { background-color: #f2b45c22; }
.cloakbar.jumpbar .fill { background-color: #f2b45c; }
.fp.special { left: 50%; margin-left: -300dp; width: 600dp; bottom: 250dp; decorator: none; pointer-events: none; text-align: center;
@@ -191,6 +211,8 @@
+ {{ sysmark_name }}{{ sysmark_dist }}
+ ▲
{{ sysmark_name }}{{ sysmark_dist }}
{{ grp[0].shown ? 'Hide' : 'Show' }}Maneuvers
@@ -328,6 +350,8 @@
Jump Drive{{ jump_fuel }}{{ jump_text }}
+
{{ jump_goal }}{{ jump_dist }}
+
{{ wp_else_text }}{{ wp_else_dist }}
diff --git a/EXE/remui/navmap.rml b/EXE/remui/navmap.rml
index 781170f2..7f9a7c7a 100644
--- a/EXE/remui/navmap.rml
+++ b/EXE/remui/navmap.rml
@@ -14,9 +14,12 @@
.win-main .content { padding: 0; }
.mapframe { display: flex; flex-direction: column; margin: 0 0 2dp 2dp; border: 18dp #0d1622eb; border-right-width: 0; border-bottom-width: 0; }
.mapfill { flex: 1; min-height: 18dp; background-color: #0d1622eb; }
- #map .gcol, #map .gnum { position: absolute; font-family: "Saira SemiCondensed"; font-size: 13dp; letter-spacing: 1dp; color: #8fb3d0c0; }
- #map .gcol { top: 4dp; width: 20dp; margin-left: -10dp; text-align: center; }
- #map .gnum { left: 6dp; height: 16dp; margin-top: -8dp; line-height: 16dp; }
+ /* REM nav map: the grid's letters and numbers, large and clear over the chart (a dark shadow keeps them
+ readable on nebulae and fields) */
+ #map .gcol, #map .gnum { position: absolute; font-family: "Saira SemiCondensed"; font-size: 20dp; font-weight: bold; letter-spacing: 1dp;
+ color: #cfe6f8; font-effect: shadow(1dp 1dp #03070d); }
+ #map .gcol { top: 6dp; width: 28dp; margin-left: -14dp; text-align: center; }
+ #map .gnum { left: 8dp; height: 24dp; margin-top: -12dp; line-height: 24dp; }
#map .region { position: absolute; width: 200dp; margin-left: -100dp; margin-top: -10dp; text-align: center; font-family: "Saira SemiCondensed"; font-size: 17dp; letter-spacing: 3dp; text-transform: uppercase; color: #dbe6f0b0; }
/* uncharted space has no map art: the whole box dark, never the scene through it */
#map.blank, #map.blank.revealed { background-color: #03070d; }
@@ -44,6 +47,8 @@
/* map items: centred on their point */
.mi { position: absolute; width: 0; height: 0; }
.mi .s { position: absolute; }
+ /* REM nav map: the symbol scaled about the item's point (its real size, at least the class's least size) */
+ .mi .sz { position: absolute; left: 0; top: 0; width: 0; height: 0; }
.mi .lbl { position: absolute; left: 9dp; top: -8dp; white-space: nowrap; font-size: 11dp; color: #b9cbe0; }
.mi.sel .lbl { color: #f2b13c; }
.planet .s { left: -6dp; top: -6dp; width: 12dp; height: 12dp; border-radius: 6dp; background-color: #3d79b8; border: 1dp #8fc2ff; }
@@ -104,6 +109,71 @@
.ln.lane { border-top: 3dp #2f6d8f; }
.ln.route { border-top: 3dp #5cc8f0; }
.ln.waypath { border-top: 3dp #f2b13c; }
+ .ln.hole { border-top: 2dp #ef6a5b90; }
+ /* REM nav map (step 5): the sector view - each visited system's chart at its true size (at least 10 dp) */
+ .sshape { position: absolute; border: 1dp #5cc8f080; background-color: #5cc8f00a; }
+ .sshape.own { border-color: #7cf27cc0; background-color: #7cf27c10; }
+ .sshape.goal { border: 2dp #f2b13c; background-color: #f2b13c14; }
+ .ln.course { border-top: 2dp #f2b13c; }
+ .ln.border { border-top: 1dp #5cc8f040; }
+ .sshape.range { border: 1dp #f2b13c70; background-color: transparent; }
+ #map.sectorview .ln { display: block; }
+ #map.sectorview .mi .s { opacity: 1; }
+ /* REM nav map: the sector view as a game's star map - suns with a glow, borders that light up under the mouse,
+ the picked system ringed */
+ #map.sectorview .sshape { border-color: #5cc8f030; background-color: #5cc8f006; }
+ #map.sectorview .sshape.own { border-color: #7cf27c70; }
+ #map.sectorview .system .s { left: -12dp; top: -12dp; width: 24dp; height: 24dp; border-radius: 12dp; border-width: 0; background-color: #00000000;
+ decorator: radial-gradient(circle at 50% 50%, #ffffff 0%, #fff3b8 16%, #f2c94cd8 30%, #f2a93c55 56%, #f2a93c00 100%);
+ transition: transform 0.25s cubic-out; }
+ #map.sectorview .system.hot .s { transform: scale(1.45); }
+ #map.sectorview .system.unvisited .s { opacity: 0.55; }
+ #map.sectorview .system .lbl { left: 14dp; top: -10dp; font-family: "Saira SemiCondensed"; font-weight: 600; font-size: 14dp; letter-spacing: 1dp;
+ color: #cfe0f0; font-effect: shadow(1dp 1dp #03070d); transition: color 0.2s linear-in-out; }
+ #map.sectorview .system.own .lbl { color: #9df29d; }
+ #map.sectorview .system.hot .lbl { color: #ffffff; }
+ #map.sectorview .system.sel .lbl { color: #f2b13c; }
+ #map.sectorview .sel .ring2 { left: -20dp; top: -20dp; width: 36dp; height: 36dp; border-radius: 20dp; border: 2dp #f2b13c00;
+ border-top-color: #f2b13c; border-bottom-color: #f2b13c; animation: 3s infinite linear spin; }
+ @keyframes spin { from { transform: rotate(0deg); } to { transform: rotate(360deg); } }
+ @keyframes pulse { from { opacity: 0.45; } to { opacity: 1; } }
+ .ln.border { border-top: 1dp #5cc8f066; }
+ .ln.bhot { border-top: 2dp #8fdcff; animation: 0.9s infinite alternate pulse; }
+ .ln.bsel { border-top: 2dp #f2b13c; }
+
+ /* REM nav map: the side - the view switch, the tools, the picked system's card with its jump */
+ .seg { display: flex; flex-direction: row; margin-bottom: 8dp; border: 1dp #24405c; }
+ .seg .sg { flex: 1; text-align: center; padding: 7dp 0; font-family: "Saira SemiCondensed"; font-weight: 600; font-size: 15dp; letter-spacing: 2dp;
+ text-transform: uppercase; color: #8fb8d8; background-color: #0d1622; transition: background-color 0.15s linear-in-out; }
+ .seg .sg:hover { background-color: #122a40; color: #dbf3ff; }
+ .seg .sg.on { background-color: #f2b13c; color: #10161d; }
+ .tools { display: flex; flex-direction: row; flex-wrap: wrap; margin-bottom: 10dp; }
+ .tools .tl { margin: 0 6dp 6dp 0; padding: 3dp 10dp; font-size: 12dp; letter-spacing: 1dp; text-transform: uppercase; color: #8fb8d8; border: 1dp #24405c; }
+ .tools .tl:hover { color: #dbf3ff; border-color: #5cc8f0; }
+ .tools .tl.on { color: #f2b13c; border-color: #f2b13c; }
+ .tools .tl.warn:hover { color: #ef6a5b; border-color: #ef6a5b; }
+ .scard { padding: 14dp; margin-bottom: 10dp; background-color: #5cc8f00c; border-left: 3dp #f2b13c; }
+ .scard .sh { display: flex; flex-direction: row; align-items: center; margin-bottom: 10dp; }
+ .scard .sun { width: 34dp; height: 34dp; border-radius: 17dp; margin-right: 12dp;
+ decorator: radial-gradient(circle at 50% 50%, #ffffff 0%, #fff3b8 18%, #f2c94cd0 36%, #f2a93c40 64%, #f2a93c00 100%); }
+ .scard .n { font-family: "Saira SemiCondensed"; font-weight: 700; font-size: 22dp; letter-spacing: 1dp; }
+ .scard .k { font-size: 12dp; color: #8197ad; letter-spacing: 1dp; text-transform: uppercase; }
+ .scard .row { display: flex; flex-direction: row; font-size: 13dp; color: #8197ad; margin-bottom: 10dp; }
+ .scard .row .v { flex: 1; text-align: right; font-family: "IBM Plex Mono"; color: #dbe6f0; }
+ .scard .why { font-size: 12dp; color: #ef9a5b; margin: 6dp 0 2dp 0; }
+ .scard .acts { display: flex; flex-direction: row; margin-top: 8dp; }
+ .scard .acts .btn { display: block; margin: 0 6dp 0 0; }
+ .scard.hintc { border-left-color: #24405c; font-size: 13dp; color: #8197ad; }
+ .jumpbtn { padding: 9dp 0; text-align: center; font-family: "Saira SemiCondensed"; font-weight: 700; font-size: 17dp; letter-spacing: 3dp;
+ color: #10161d; background-color: #f2b13c; transition: background-color 0.15s linear-in-out; }
+ .jumpbtn:hover { background-color: #ffd27a; }
+ .jumpbtn.off, .jumpbtn.off:hover { color: #6b7d90; background-color: #1a2533; }
+ .wcard { padding: 12dp 14dp; margin-bottom: 10dp; background-color: #5cc8f00c; border-left: 3dp #8197ad; }
+ .wcard.reach { border-left-color: #f2b13c; }
+ .wcard .k { font-size: 12dp; color: #8197ad; letter-spacing: 1dp; text-transform: uppercase; }
+ .wcard .n { font-family: "Saira SemiCondensed"; font-weight: 600; font-size: 18dp; margin: 2dp 0; }
+ .wcard .v { font-size: 13dp; color: #9fb4c8; margin-bottom: 8dp; }
+ .wcard.reach .v { color: #f2b13c; }
/* the original's look (player's wish): lanes, jump links, the route and every marker are drawn by
the original map under the box (NeuroNetNavMap::RemDrawBackground); ours stay as names, the
@@ -120,23 +190,19 @@
#map.own { background-color: #03070d; }
#map.own.revealed { background-color: #03070d00; }
#map.own .real .s { opacity: 0; }
- /* LARGE SKIES: the system chart is round -- the corners are masked with the frame's colour, an
- edge ring drawn over it */
- .roundmask { display: none; position: absolute; left: 0; top: 0; right: 0; bottom: 0;
- decorator: radial-gradient(circle closest-side, #0d162200 99.2%, #0d1622ff 99.8%); }
- .roundedge { display: none; position: absolute; left: 0; top: 0; right: 0; bottom: 0; border: 1dp #3d7fa8; border-radius: 380dp; }
- #map.own .roundmask, #map.own .roundedge { display: block; }
- #map.own .gcol, #map.own .gnum { display: none; }
+ /* REM nav map (step 4): the chart's shape and edge are drawn under the box (rem_navmap_models DrawChartMask:
+ a square for Sirius, a circle for Sol); a square chart has its A..H / 1..8 again (a round one has none) */
#map.own .ln { display: block; }
#map.own .mi .s { opacity: 1; }
#map.own .ln.lane { border-top: 2dp #2a8fc2c0; }
.gl { position: absolute; }
.gl.v { width: 0; }
.gl.h { height: 0; }
- .gl.v.fine { border-left: 1dp #5cc8f014; }
- .gl.h.fine { border-top: 1dp #5cc8f014; }
- .gl.v.sect { border-left: 1dp #5cc8f040; }
- .gl.h.sect { border-top: 1dp #5cc8f040; }
+ .gl.v.fine { border-left: 1dp #5cc8f024; }
+ .gl.h.fine { border-top: 1dp #5cc8f024; }
+ /* REM nav map: the 8 x 8 grid clear over the darkened backdrop */
+ .gl.v.sect { border-left: 2dp #5cc8f090; }
+ .gl.h.sect { border-top: 2dp #5cc8f090; }
#map.own .planet .s { left: -9dp; top: -9dp; width: 18dp; height: 18dp; border-radius: 9dp; border-width: 0; background-color: #3d79b8;
decorator: radial-gradient(circle at 34% 30%, #e4f2ff 0%, #6fb0ea 22%, #2f67a6 55%, #102744 85%, #050c16 100%); }
#map.own .sun .s { left: -17dp; top: -17dp; width: 34dp; height: 34dp; border-radius: 17dp; border-width: 0; background-color: #00000000;
@@ -152,9 +218,51 @@
decorator: radial-gradient(circle at 34% 30%, #f1f6fb 0%, #9db1c6 40%, #47586b 100%); }
#map.own .ring .s { left: -3dp; top: -3dp; width: 6dp; height: 6dp; border-radius: 3dp; background-color: #2a8fc2;
decorator: radial-gradient(circle at 34% 30%, #d6f1ff 0%, #2a8fc2 55%, #0f3f5c 100%); }
- #map.own .player .s { border-bottom-color: #7cf27c; }
+ /* REM nav map: the own ship is drawn as its model (rem_navmap_models); the window rings it, a notch to its heading */
+ #map.own .player .s { left: -17dp; top: -17dp; width: 30dp; height: 30dp; border-radius: 17dp; border: 2dp #7cf27c55;
+ border-top-color: #7cf27c; border-bottom-color: #7cf27c55; }
#map.own .mi .lbl { color: #c9d9ea; font-size: 12dp; }
#map.own .planet .lbl, #map.own .sun .lbl { left: 14dp; top: -9dp; font-size: 13dp; color: #e6f0fa; }
+ /* REM nav map (step 6): the galaxy view - a dark sky (the Orion arm's veil), the nearest stars as scenery, each
+ sector as its main star (colour by spectral type; Sirius with its companion on its orbit), a ring of its
+ systems (the discovered ones lit), the distance between the sectors; the Milky Way small in the corner */
+ #map.galaxyview, #map.galaxyview.revealed, #map.galaxyview.own.revealed, #map.plainsec, #map.plainsec.revealed, #map.plainsec.own.revealed { background-color: #02040a;
+ decorator: radial-gradient(circle at 70% 85%, #1a2c5238 0%, #0b142a20 40%, #02040a00 75%); }
+ #map.galaxyview .ln, #map.galaxyview .mi .s, #map.galaxyview.own .mi .s { display: block; opacity: 1; }
+ #map .mi .b2, #map .mi .ring3 { display: none; }
+ #map .gstar .s { left: -2dp; top: -2dp; width: 4dp; height: 4dp; border-radius: 2dp; background-color: #cfe0f0; }
+ #map .gstar .lbl { left: 7dp; top: -7dp; font-size: 11dp; color: #6f8296; }
+ #map .gsector .s { left: -12dp; top: -12dp; width: 24dp; height: 24dp; border-radius: 12dp; border-width: 0; background-color: #00000000;
+ decorator: radial-gradient(circle at 50% 50%, #ffffff 0%, #fff6c8 16%, #f2c94cd0 32%, #f2a93c50 58%, #f2a93c00 100%); }
+ #map .gsector.sA .s, #map .gsector.sB .s { decorator: radial-gradient(circle at 50% 50%, #ffffff 0%, #e8f4ff 18%, #9cc8ffd8 34%, #5c8cf050 60%, #5c8cf000 100%); }
+ #map .gsector.sM .s, #map .gsector.sK .s { decorator: radial-gradient(circle at 50% 50%, #ffffff 0%, #ffd9b0 16%, #f28c4cd0 32%, #e0603c50 58%, #e0603c00 100%); }
+ #map .gsector .lbl { font-family: "Saira SemiCondensed"; font-weight: 700; font-size: 18dp; letter-spacing: 2dp; color: #e6f0fa;
+ font-effect: shadow(1dp 1dp #03070d); }
+ #map .gsector.here .lbl { color: #9df29d; }
+ #map .gsector.binary .b2 { display: block; position: absolute; left: 0; top: 0; width: 0; height: 0; animation: 14s infinite linear spin; }
+ #map .gsector .b2 .bb { position: absolute; left: 20dp; top: -3dp; width: 6dp; height: 6dp; border-radius: 3dp; background-color: #ffffff;
+ decorator: radial-gradient(circle at 50% 50%, #ffffff 0%, #dbeaff 50%, #9cc8ff00 100%); }
+ #map .gsector.here .ring3 { display: block; position: absolute; left: -46dp; top: -46dp; width: 88dp; height: 88dp; border-radius: 46dp;
+ border: 2dp #7cf27c; animation: 1.6s infinite alternate pulse; }
+ #map .gdot .s { left: -2dp; top: -2dp; width: 4dp; height: 4dp; border-radius: 2dp; background-color: #3d5a78; }
+ #map .gdot.on .s { background-color: #8fdcff; }
+ #map .gdist .lbl { width: 60dp; text-align: center; font-family: "IBM Plex Mono"; font-size: 12dp; color: #8fb8d8; }
+ #map .ln.gline { border-top: 1dp #8fb8d870; }
+ .ginset { position: absolute; left: 10dp; bottom: 10dp; width: 180dp; height: 180dp; border: 1dp #24405c; background-color: #02040ae0; }
+ .ginset img { position: absolute; left: 0; top: 0; width: 180dp; height: 180dp; }
+ .ginset .ghere { position: absolute; left: 83dp; top: 125dp; width: 10dp; height: 10dp; border-radius: 6dp; border: 2dp #7cf27c;
+ animation: 1.2s infinite alternate pulse; }
+ .ginset .gcap { position: absolute; left: 0; right: 0; bottom: 4dp; text-align: center; font-size: 11dp; letter-spacing: 1dp; color: #9df29d;
+ text-transform: uppercase; }
+ .ginset .gname { position: absolute; left: 0; right: 0; top: 4dp; text-align: center; font-size: 11dp; letter-spacing: 2dp; color: #8197ad;
+ text-transform: uppercase; }
+ .gcard { padding: 12dp 14dp; margin-bottom: 8dp; background-color: #5cc8f00c; border-left: 3dp #8fb8d8; }
+ .gcard.own { border-left-color: #7cf27c; }
+ .gcard .n { font-family: "Saira SemiCondensed"; font-weight: 700; font-size: 19dp; letter-spacing: 1dp; }
+ .gcard .k { font-size: 12dp; color: #8197ad; margin: 2dp 0 8dp 0; }
+ /* the sector view has no models: the ship stays the green arrow there */
+ #map.sectorview.own .player .s { left: -8dp; top: -8dp; width: 0; height: 0; border-radius: 0; border-width: 0;
+ border-left: 8dp #00000000; border-right: 8dp #00000000; border-bottom: 16dp #7cf27c; }
@@ -168,7 +276,7 @@
-
+
{{ r.name }}
@@ -177,14 +285,15 @@
{{ g.name }}
{{ g.name }}
No uncharted system visited yet.
-
+
+
-
{{ pick_name }}
Open system
@@ -197,6 +306,13 @@
{{ mark_locked ? 'Unlock bookmark' : 'Lock bookmark' }}
Delete bookmark
+
+
{{ sec_pick_name }}
+
{{ sec_pick_info }}
+
Open system
+
Jump Drive here
+
+

Milky Way
You are here
{{ zoom }}
All
@@ -207,14 +323,39 @@
{{ system }}
-
-
Universe
-
My system
-
Names
-
Clear waypoints
-
Abort mission
+
+
Galaxy
+
Sector
+
System
-
+
+
+
{{ sec_pick_name }}
{{ sec_pick_info }}
+
Distance{{ sec_pick_dist }}
+
Jump drive
+
{{ sec_jump_why }}
+
+
+
+
+
{{ g.name }}
+
{{ g.info }}
+
Open sector
+
+
Sectors show once you have been to one of their systems. Click a star or wheel in to open its sector; wheel out of a sector to come back here.
+
+
Click a system to pick it - its jump is here and in the HUD (the jump drive key). Wheel zooms, drag moves, double click opens a system.
+
+
Waypoint in another system
+
{{ wp_else_text }}
+
{{ wp_else_dist }} - {{ wp_else_reach ? 'in jump range' : 'out of jump range' }}
+
Jump to waypoint
+
+
{{ pick_name }}
{{ pick_kind }}
@@ -273,7 +414,7 @@
{{ wp_note }}
{{ g.name }}{{ g.where }}{{ g.kind == 'following' ? 'Stop following' : 'Follow' }}Following: that pilot's waypoints become yours (and change with theirs) - the HUD shows them.
-
Click the map to pick a place. Wheel zooms, drag moves, double click opens a system.
+
Click the map to pick a place. Wheel zooms, drag moves, double click opens a system.