REM-Client 3a1dfd26: Sol Skies' open world in the client - world map, moving frame, jump drives of a class, a system's cruise

REM-Client main now carries the Sol Skies engine work (merged with REM-Client 08eb3573): the open
world (systems placed on a world map, crossings without loading, the frame moving with the ship),
the jump drives of a class (Sol's and Sirius', the list of systems to jump to), a system's own
cruise (universe.ini cruise_max_speed), the interstellar star sphere and music
(DATA\UNIVERSE\interstellar.ini, optional), the HUD's speed in km/s at high speeds and the system
chart for large systems. Without a world map on the server everything works as before.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
2026-11-12 14:57:07 +01:00
co-authored by Claude Opus 5.5
parent 4efe36d6d7
commit a05f4ce461
30 changed files with 60 additions and 9 deletions
+2 -2
View File
@@ -221,7 +221,7 @@
<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>
<span class="big">{{ speed }}<span class="u">{{ speed_u }}</span></span><span class="cap">SPEED</span>
</div>
</div>
</div>
@@ -235,7 +235,7 @@
<div class="brow hull"><span class="l">HULL</span><div class="bar"><div class="chips"><div class="sg" data-class-lit="hull_n &gt; 0"></div><div class="sg" data-class-lit="hull_n &gt; 1"></div><div class="sg" data-class-lit="hull_n &gt; 2"></div><div class="sg" data-class-lit="hull_n &gt; 3"></div><div class="sg" data-class-lit="hull_n &gt; 4"></div><div class="sg" data-class-lit="hull_n &gt; 5"></div><div class="sg" data-class-lit="hull_n &gt; 6"></div><div class="sg" data-class-lit="hull_n &gt; 7"></div><div class="sg" data-class-lit="hull_n &gt; 8"></div><div class="sg" data-class-lit="hull_n &gt; 9"></div><div class="sg" data-class-lit="hull_n &gt; 10"></div><div class="sg" data-class-lit="hull_n &gt; 11"></div><div class="sg" data-class-lit="hull_n &gt; 12"></div><div class="sg" data-class-lit="hull_n &gt; 13"></div><div class="sg" data-class-lit="hull_n &gt; 14"></div><div class="sg" data-class-lit="hull_n &gt; 15"></div></div></div></div>
</div>
<div class="sep"></div>
<div class="val speed"><span class="cap">SPEED</span>{{ speed }}<span class="u">m/s</span></div>
<div class="val speed"><span class="cap">SPEED</span>{{ speed }}<span class="u">{{ speed_u }}</span></div>
</div>
</div>
+52 -1
View File
@@ -111,6 +111,50 @@
.ln { display: none; }
.mi .s { opacity: 0; }
.bookmark .s { opacity: 1; }
/* LARGE SKIES: a system view is drawn by this window alone (#map.own, set by the window): a dark
chart with a grid that follows the zoom, the lanes as lines, and markers of a fixed size on
the screen, shaded to look like bodies -- lit from the upper left */
/* the box is cleared and the real objects are drawn under it (rem_navmap_models): see-through
once the window stands */
#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; }
#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; }
#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;
decorator: radial-gradient(circle at 50% 50%, #ffffff 0%, #fff3b8 18%, #f2c94cd0 34%, #f2a93c50 60%, #f2a93c00 100%); }
#map.own .station .s { left: -6dp; top: -6dp; width: 12dp; height: 12dp; background-color: #3f9fd0;
border-width: 2dp; border-top-color: #e6f7ff; border-left-color: #b9e6fb; border-right-color: #1f5f86; border-bottom-color: #0e3550;
decorator: linear-gradient(135deg, #8fd6f5 0%, #3f9fd0 50%, #1d6a94 100%); }
#map.own .gate .s { border-top-color: #e3ceff; border-left-color: #c9a8f5; border-right-color: #6a45a0; border-bottom-color: #432a6b; }
#map.own .hole .s { border-top-color: #ffc1b8; border-left-color: #f58e80; border-right-color: #9b3528; border-bottom-color: #5f1c14; }
#map.own .platform .s { left: -4dp; top: -4dp; width: 8dp; height: 8dp; background-color: #d9584a;
border-width: 1dp; border-top-color: #ffc9c2; border-left-color: #f59a8f; border-right-color: #8f2c21; border-bottom-color: #591710; }
#map.own .object .s { left: -4dp; top: -4dp; width: 8dp; height: 8dp; border-radius: 4dp; background-color: #8197ad;
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; }
#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; }
</style>
</head>
<body class="window" data-model="navmap">
@@ -126,16 +170,21 @@
<div class="split">
<div class="mapframe"><div id="map" data-class-blank="universe &amp;&amp; uncharted">
<div class="region" data-for="r : regions" data-style-left="r.left" data-style-top="r.top">{{ r.name }}</div>
<div class="gl v fine" data-for="g : grid_fv" data-style-left="g.left" data-style-top="g.top" data-style-height="g.name"></div>
<div class="gl h fine" data-for="g : grid_fh" data-style-top="g.top" data-style-left="g.left" data-style-width="g.name"></div>
<div class="gl v sect" data-for="g : grid_sv" data-style-left="g.left" data-style-top="g.top" data-style-height="g.name"></div>
<div class="gl h sect" data-for="g : grid_sh" data-style-top="g.top" data-style-left="g.left" data-style-width="g.name"></div>
<div class="gcol" data-for="g : grid_cols" data-style-left="g.left">{{ g.name }}</div>
<div class="gnum" data-for="g : grid_rows" data-style-top="g.top">{{ g.name }}</div>
<div class="uncharted-note" data-if="universe && uncharted && items.size == 0">No uncharted system visited yet.</div>
<div class="ln" data-for="l : lines" data-class-jump="l.cls == 'jump'" data-class-lane="l.cls == 'lane'" data-class-route="l.cls == 'route'" data-class-waypath="l.cls == 'waypath'" data-style-left="l.left" data-style-top="l.top" data-style-width="l.width" data-style-transform="l.transform"></div>
<div class="mi" data-for="i : items" data-attr-class="'mi ' + i.cls + (i.selected ? ' sel' : '')" data-style-left="i.left" data-style-top="i.top">
<div class="mi" data-for="i : items" data-attr-class="'mi ' + i.cls + (i.selected ? ' sel' : '') + (i.real ? ' real' : '')" data-style-left="i.left" data-style-top="i.top">
<div class="ring2" data-if="i.selected"></div>
<div class="s" data-style-transform="i.rot"></div>
<div class="bc" data-if="i.color != ''" data-style-background-color="i.color"></div>
<div class="lbl" data-if="i.label != ''" data-style-left="i.lleft" data-style-top="i.ltop">{{ i.label }}</div>
</div>
<div class="roundedge"></div>
<div class="pop" data-if="popup" data-style-left="pop_left" data-style-top="pop_top">
<div class="pt">{{ pick_name }}</div>
<div class="pb" data-if="can_open" data-action="tool" data-arg="open">Open system</div>
@@ -150,6 +199,8 @@
</div>
<div class="zoom">
<span class="v">{{ zoom }}</span>
<div class="btn" data-action="zoomall">All</div>
<div class="btn" data-action="zoomship">Ship</div>
<div class="btn" data-action="zoomout">-</div>
<div class="btn" data-action="zoomin">+</div>
</div>