REM-Client 35d5ebdf: native system navigation, jump-drive HUD and nearby suns

This commit is contained in:
flathack committed 2026-11-15 13:14:02 +01:00
1 parent 3bce4e7b3e
commit 9f67091863
5 files changed
+97 -34

No files matched your search

+62
View File
@@ -1,4 +1,66 @@
REM-Client committed deployment provenance (64-bit)
recorded: 2026-11-15T13:14:02.634257+01:00
source: 35d5ebdfaea115b2e1d37cda3529d484b87e1adc (main)
server companion source: fb484cbbb849bd49ce5ce965e7c042860ec13d5a (main; no server files included in REM-Mod)
change: native system selection and off-screen arrows; maneuver-bar Jump Drive with icon; visited-system policy preserving waypoint jumps; up to five nearby suns visible inside systems
verification: committed client src/assets fingerprint matches the validated build; deployed executable, HUD and icons match build/source byte-for-byte
source fingerprint (SHA-256, sorted changed src/assets path/NUL/content/NUL): acdc5cb80d232a594fb5033365d147fa90093e8c3049c8637045fa0b11efae39
validation: prior Release x64 client build, 17 portable navmap/nearby-sun tests and 4 focused server jump tests passed; server policy patch unchanged by rebase (stable patch ID verified)
integration: Mod includes upstream through 3bce4e7b; server source includes upstream mission fix cb80cb7
server runtime: existing deployed build uses b913d882 plus the identical jump-policy patch; upstream cb80cb7 mission fix is not in that binary; no server rebuild or restart for this commit
visual: latest markers and nearby suns not yet verified in live gameplay
runtime: REM-LOCAL uses REM-Mod/EXE directly; personal saves/settings and generated caches excluded
SHA-256 EXE/Freelancer.exe: c5793e61d1cde37045148b521c6ba31704d9da9105de927e6622c4d78cefccbb
SHA-256 EXE/remui/hud.rml: a3ed855b0f8a8b481c5d3632696aea12fe639e65ff265c41244f83796ca6fd07
SHA-256 EXE/remui/img/jump-drive.png: d2a1c098814ea1c1e71d27f5a21df834f93dcc59e6f25d40d68c91cc19fd1a6a
SHA-256 EXE/remui/img/jump-drive.svg: 693bba062e06d169621d00ce10c3113cc44996572dddc9395cedaf3fb5cf090f
Previous deployment record:
REM-Client incremental nearby system suns (64-bit)
date: 2026-11-15T13:09:03.525408+01:00
source: 53aa6e1efc215b624fa324fd748d713beb71099d + uncommitted navigation/HUD and nearby-sun changes
source fingerprint (SHA-256, sorted changed src/assets path/NUL/content/NUL): acdc5cb80d232a594fb5033365d147fa90093e8c3049c8637045fa0b11efae39
change: up to five nearby system suns visible inside systems; three typical system spacings range with outer-third smooth fade; bounded 1.2-second replacement fades; preserve local sun, 3D directions, subtler local size/brightness; normal star-sphere and custom skybox paths
files: EXE/Freelancer.exe
build: Release|x64 rem_interstellar_sky and space_scene_obj_draw compiled and full client linked successfully; dependency DLLs unchanged
validation: 17 portable navmap/nearby-sun tests, zero failures; includes range limits, own-system exclusion, hard count cap, fade-before-replacement and sector reset; diff checks clean; runtime exe byte-identical to build
visual: live in-system brightness, camera motion and occlusion not yet visually verified
runtime: REM-LOCAL uses REM-Mod/EXE directly; restart Freelancer to load; server and personal saves/settings unchanged
SHA-256 EXE/Freelancer.exe: c5793e61d1cde37045148b521c6ba31704d9da9105de927e6622c4d78cefccbb
Previous deployment record:
REM-Client incremental system target marker correction (64-bit)
date: 2026-11-15T12:52:14.943338+01:00
source: 53aa6e1efc215b624fa324fd748d713beb71099d + uncommitted navigation/HUD changes
source fingerprint (SHA-256, sorted changed src/assets path/NUL/content/NUL): 4f9458796080d6009d190517fc361005215b4081c9b0749c3460257cc9d68f9b
change: replace missing Unicode glyphs with geometric contact corners and the native CurrentTargetArrow montage; use native contact projection/near-plane clipping with overlay z=0; selected system corners no longer use scene depth
files: EXE/Freelancer.exe, EXE/remui/hud.rml
build: Release|x64 hud_status_core, hud_targetable_objects and rem_ui_hud compiled; full client _BuildLinkAction successful
validation: installed HUD font lacks former U+25C7/U+25B2 symbols; native arrow assets exist; old glyph markers/edge overlay removed; diff checks clean; runtime files match source/build byte-for-byte
visual: actual in-game camera sweep and new markers not yet visually verified
runtime: REM-LOCAL launches REM-Mod/EXE directly; restart Freelancer to load the update; server unchanged, no restart needed
SHA-256 EXE/Freelancer.exe: 37fdf7327372310ddbd1d29e2ef13bfeaafa4ec8754919879530880ed1cfca16
SHA-256 EXE/remui/hud.rml: a3ed855b0f8a8b481c5d3632696aea12fe639e65ff265c41244f83796ca6fd07
Previous deployment record:
REM-Client incremental navigation selection and maneuver-bar Jump Drive (64-bit)
date: 2026-11-15T12:37:23.150724+01:00
source: 53aa6e1efc215b624fa324fd748d713beb71099d + uncommitted navigation selection, HUD and waypoint activation changes
source fingerprint (SHA-256, sorted changed src/assets path/NUL/content/NUL): d022b04d37dc6e84c28e4cd803dc53d29e33f4666839c6ceeb45078ccd6f6737
change: native-style system target reticle; selectable visited system markers and contacts; Jump Drive beside Formation with custom icon, disabled without drive; old destination dropdown removed; preserve precise waypoint jumps and nearby approach
files: EXE/Freelancer.exe, EXE/remui/hud.rml, EXE/remui/img/jump-drive.png, EXE/remui/img/jump-drive.svg
build: Release|x64 client compilation and _BuildLinkAction completed; existing dependency DLLs retained
validation: 15 portable navmap/waypoint tests and 4 focused server jump tests passed; diff whitespace checks clean; deployed files match build/source byte-for-byte
visual: icon inspected; new HUD and target selection not yet checked in live gameplay
server companion: visit-bit enforcement built separately and activated after authorized graceful restart; HTTP status, MySQL and UDP 2302 verified; no server files shipped here
runtime: REM-LOCAL launches REM-Mod/EXE directly; restart Freelancer to load this build; saves and personal settings retained
SHA-256 EXE/Freelancer.exe: f19e274fa59037c2833e81539b01038ad1276911a628c6d90eb65459f3b2bb31
SHA-256 EXE/remui/hud.rml: 9c9f90e3a02bf97e2031559afe003c49d64baee4804ee74ee1f6fb42a7f75c96
SHA-256 EXE/remui/img/jump-drive.png: d2a1c098814ea1c1e71d27f5a21df834f93dcc59e6f25d40d68c91cc19fd1a6a
SHA-256 EXE/remui/img/jump-drive.svg: 693bba062e06d169621d00ce10c3113cc44996572dddc9395cedaf3fb5cf090f
Previous deployment record:
REM-Client committed deployment provenance (64-bit)
recorded: 2026-11-15T01:03:58.313717+01:00
source: 53aa6e1efc215b624fa324fd748d713beb71099d (main)
server companion source: b913d88279560c0a3780f9021b1e35b38447a140 (main; no server files included in REM-Mod)
Binary file not shown.
+26 -34
View File
@@ -22,15 +22,34 @@
.sp { flex: 1; }
/* --- the maneuver bar, top centre: icon over its name, the active one amber ----------- */
.mans { left: 50%; margin-left: -300dp; top: 8dp; width: 600dp; height: 76dp; padding: 0 18dp; display: flex; flex-direction: row; justify-content: center; align-items: center; }
.mans { left: 50%; margin-left: -370dp; top: 8dp; width: 740dp; height: 76dp; padding: 0 18dp; display: flex; flex-direction: row; justify-content: center; align-items: center; }
.mans .ib { flex: 1; display: flex; flex-direction: column; align-items: center; height: 62dp; padding: 6dp 4dp 0 4dp; border-left: 1dp #2b6f9e; border-radius: 0; }
.mans .ib:first-child { border-left-width: 0; }
.mans .ib.on { border-left-width: 0; }
.mans .ico { width: 34dp; height: 34dp; margin: 0; }
.mans .lb { margin-top: 2dp; font-weight: 600; font-size: 12dp; letter-spacing: 1dp; color: #b9d4ea; white-space: nowrap; text-transform: uppercase; }
.mans .ib.on .lb { color: #f2b13c; }
.mans .jump-control { position: relative; }
.mans .jump-control.off { pointer-events: none; }
.mans .jump-control .ico { image-color: #b9d4ea; }
.mans .jump-control.on .ico { image-color: #f2b13c; }
.mans .jump-control .state { font-size: 10dp; color: #b9d4ea; white-space: nowrap; }
.jump-progress { position: absolute; bottom: 0; left: 0; right: 0; height: 2dp; background-color: #2b6f9e; }
.jump-progress .fill { height: 2dp; background-color: #f2b13c; }
.jump-info { position: absolute; top: 84dp; left: 50%; margin-left: -220dp; width: 440dp; text-align: center; color: #b9d4ea; font-size: 12dp; font-effect: shadow(1dp 1dp #03070d); pointer-events: none; }
.system-pick { position: absolute; width: 24dp; height: 24dp; margin-left: -12dp; margin-top: -12dp; pointer-events: auto; cursor: pointer; color: #b9d4ea; text-align: center; }
/* REM: geometric contact corners, independent of font glyph coverage. */
.system-pick .corner { position: absolute; width: 4dp; height: 4dp; border-color: #b9d4eaaa; }
.system-pick .tl { left: 6dp; top: 6dp; border-left: 1dp; border-top: 1dp; }
.system-pick .tr { right: 6dp; top: 6dp; border-right: 1dp; border-top: 1dp; }
.system-pick .bl { left: 6dp; bottom: 6dp; border-left: 1dp; border-bottom: 1dp; }
.system-pick .br { right: 6dp; bottom: 6dp; border-right: 1dp; border-bottom: 1dp; }
.system-pick:hover .corner { border-color: #ffffff; }
.system-pick .name { display: none; position: absolute; top: 24dp; left: -88dp; width: 200dp; font-size: 14dp; font-effect: shadow(1dp 1dp #03070d); }
.system-pick:hover .name { display: block; }
.system-pick:hover { color: #ffffff; }
/* a tab hanging from the bar (fts: no top edge, its sides start on the bar's bottom edge), clear of its cut */
.cruise { left: 50%; margin-left: -286dp; top: 84dp; width: 64dp; height: 52dp; display: flex; justify-content: center; align-items: center; }
.cruise { left: 50%; margin-left: -356dp; top: 84dp; width: 64dp; height: 52dp; display: flex; justify-content: center; align-items: center; }
.fp.cruise { decorator: ninepatch(fts, fts-i); }
.cruise .ico { width: 40dp; height: 40dp; }
@@ -130,32 +149,8 @@
/* the cloak's time left (rem-server [Native.Cloak] MaxSeconds) */
.cloakbar { height: 4dp; margin: 2dp 6dp 0 11dp; background-color: #b98cf222; }
.cloakbar .fill { height: 100%; background-color: #b98cf2; }
/* the jump drive (rem-server [Native.JumpDrive]): charging, cooling down */
.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;
color: #f2d23c; font-size: 16dp; letter-spacing: 1dp; font-effect: shadow(1dp 1dp #000000cc); }
/* --- the cruise engine's countdown / charge (HUD_CruiseProgress). With the ring: an arc of 16 segments (-55 to +55 degrees) around
@@ -211,14 +206,15 @@
</style>
</head>
<body class="hud" data-model="hud" data-class-editing="editing" data-style-opacity="opacity">
<div id="sysmark"><div class="bk tl"></div><div class="bk tr"></div><div class="bk bl"></div><div class="bk br"></div><div class="dot"></div><div class="t">{{ sysmark_name }}<span class="d">{{ sysmark_dist }}</span></div></div>
<div id="sysarrow"><div class="a" id="sysarrow_tip">&#9650;</div><div class="t" id="sysarrow_text">{{ sysmark_name }}<span class="d">{{ sysmark_dist }}</span></div></div>
<div class="system-pick" data-for="s : system_picks" data-style-left="s.left" data-style-top="s.top" data-action="system_pick" data-attr-data-arg="s.id"><span class="corner tl"></span><span class="corner tr"></span><span class="corner bl"></span><span class="corner br"></span><span class="name">{{ s.name }}</span></div>
<!-- maneuvers -->
<div class="grp g0" data-grp="0" data-style-transform="grp[0].tf" data-class-gone="!grp[0].shown && !editing" data-class-faded="!grp[0].shown && editing">
<div class="tag" data-if="editing" style="left: 50%; margin-left: 310dp; top: 40dp;"><span class="eye" data-action="eye" data-arg="0">{{ grp[0].shown ? 'Hide' : 'Show' }}</span>Maneuvers</div>
<div class="tag" data-if="editing" style="left: 50%; margin-left: 380dp; top: 40dp;"><span class="eye" data-action="eye" data-arg="0">{{ grp[0].shown ? 'Hide' : 'Show' }}</span>Maneuvers</div>
<div class="fp all mans" data-if="maneuvers_shown || editing">
<div class="ib" data-for="m : maneuvers" data-class-on="m.active" data-class-off="m.disabled" data-action="maneuver" data-attr-data-arg="m.key"><img class="ico" data-attr-src="m.icon"/><span class="lb">{{ m.label }}</span></div>
<div class="ib jump-control" data-class-off="!jump_shown" data-class-on="jump_busy" data-action="jump" title="Jump to the selected system or waypoint. Click again to cancel."><img class="ico" src="img/jump-drive.png"/><span class="lb">Jump Drive</span><span class="state">{{ jump_text }}</span><div class="jump-progress" data-if="jump_shown &amp;&amp; jump_bar"><div class="fill" data-style-width="jump_width"></div></div></div>
</div>
<div class="jump-info" data-if="jump_shown &amp;&amp; jump_goal != ''">{{ jump_goal }} · {{ jump_dist }} {{ jump_fuel }}</div>
<div class="fp small cruise" data-if="(maneuvers_shown && has_cruise) || editing" data-action="maneuver" data-arg="4">
<div class="ib" data-class-on="cruise_on"><img class="ico" src="3db:interface/HUD/hud_mnvrwarp.3db"/></div>
</div>
@@ -300,7 +296,7 @@
<div class="tname">{{ target_name }}</div>
<div class="tsub">{{ target_sub }} {{ target_rank }} {{ target_range }}</div>
<div class="tsub" data-if="target_crew != ''" style="color: #f2b13c; margin-top: -6dp;">{{ target_crew }}</div>
<div class="tbar hull"><span class="l">HULL</span><div class="bar"><div class="chips"><div class="sg" data-class-lit="target_hull_n > 0"></div><div class="sg" data-class-lit="target_hull_n > 1"></div><div class="sg" data-class-lit="target_hull_n > 2"></div><div class="sg" data-class-lit="target_hull_n > 3"></div><div class="sg" data-class-lit="target_hull_n > 4"></div><div class="sg" data-class-lit="target_hull_n > 5"></div><div class="sg" data-class-lit="target_hull_n > 6"></div><div class="sg" data-class-lit="target_hull_n > 7"></div><div class="sg" data-class-lit="target_hull_n > 8"></div><div class="sg" data-class-lit="target_hull_n > 9"></div><div class="sg" data-class-lit="target_hull_n > 10"></div><div class="sg" data-class-lit="target_hull_n > 11"></div><div class="sg" data-class-lit="target_hull_n > 12"></div><div class="sg" data-class-lit="target_hull_n > 13"></div><div class="sg" data-class-lit="target_hull_n > 14"></div><div class="sg" data-class-lit="target_hull_n > 15"></div></div></div></div>
<div class="tbar hull" data-if="!target_system"><span class="l">HULL</span><div class="bar"><div class="chips"><div class="sg" data-class-lit="target_hull_n > 0"></div><div class="sg" data-class-lit="target_hull_n > 1"></div><div class="sg" data-class-lit="target_hull_n > 2"></div><div class="sg" data-class-lit="target_hull_n > 3"></div><div class="sg" data-class-lit="target_hull_n > 4"></div><div class="sg" data-class-lit="target_hull_n > 5"></div><div class="sg" data-class-lit="target_hull_n > 6"></div><div class="sg" data-class-lit="target_hull_n > 7"></div><div class="sg" data-class-lit="target_hull_n > 8"></div><div class="sg" data-class-lit="target_hull_n > 9"></div><div class="sg" data-class-lit="target_hull_n > 10"></div><div class="sg" data-class-lit="target_hull_n > 11"></div><div class="sg" data-class-lit="target_hull_n > 12"></div><div class="sg" data-class-lit="target_hull_n > 13"></div><div class="sg" data-class-lit="target_hull_n > 14"></div><div class="sg" data-class-lit="target_hull_n > 15"></div></div></div></div>
<div class="tbar shield" data-if="target_has_shield"><span class="l">SHIELD</span><div class="bar"><div class="chips"><div class="sg" data-class-lit="target_shield_n > 0"></div><div class="sg" data-class-lit="target_shield_n > 1"></div><div class="sg" data-class-lit="target_shield_n > 2"></div><div class="sg" data-class-lit="target_shield_n > 3"></div><div class="sg" data-class-lit="target_shield_n > 4"></div><div class="sg" data-class-lit="target_shield_n > 5"></div><div class="sg" data-class-lit="target_shield_n > 6"></div><div class="sg" data-class-lit="target_shield_n > 7"></div><div class="sg" data-class-lit="target_shield_n > 8"></div><div class="sg" data-class-lit="target_shield_n > 9"></div><div class="sg" data-class-lit="target_shield_n > 10"></div><div class="sg" data-class-lit="target_shield_n > 11"></div><div class="sg" data-class-lit="target_shield_n > 12"></div><div class="sg" data-class-lit="target_shield_n > 13"></div><div class="sg" data-class-lit="target_shield_n > 14"></div><div class="sg" data-class-lit="target_shield_n > 15"></div></div></div></div>
<div class="tbtns">
<div class="ib" data-for="b : target_buttons" data-action="tbutton" data-attr-data-arg="b.key"><img class="ico" data-attr-src="b.icon"/></div>
@@ -348,10 +344,6 @@
</div>
<div class="w cloak" data-if="has_cloak" data-class-on="cloak_on" data-action="cloak"><span class="k"></span><span class="n">{{ cloak_name }}</span><span class="a">{{ cloak_bar ? cloak_left : (cloak_on ? 'ON' : 'OFF') }}</span></div>
<div class="cloakbar" data-if="has_cloak && cloak_bar"><div class="fill" data-style-width="cloak_width"></div></div>
<div class="w jump" data-if="jump_shown" data-class-on="jump_busy" data-action="jump"><span class="k"></span><span class="n">Jump Drive</span><span class="f">{{ jump_fuel }}</span><span class="a">{{ jump_text }}</span></div>
<div class="cloakbar jumpbar" data-if="jump_shown && jump_bar"><div class="fill" data-style-width="jump_width"></div></div>
<div class="w jump goal" data-if="jump_shown && jump_goal != ''"><span class="k"></span><span class="n">{{ jump_goal }}</span><span class="a">{{ jump_dist }}</span></div>
<div class="w jump wpelse" data-if="jump_shown && wp_else" data-class-reach="wp_else_reach" data-action="wpjump"><span class="k"></span><span class="n">{{ wp_else_text }}</span><span class="a">{{ wp_else_dist }}</span></div>
</div></div>
</div>
</div>
Binary file not shown.

After

Width:  |  Height:  |  Size: 3.6 KiB

+9
View File
@@ -0,0 +1,9 @@
<svg xmlns="http://www.w3.org/2000/svg" width="128" height="128" viewBox="0 0 128 128">
<!-- REM: a ship crossing an open jump ring; monochrome for HUD tinting. -->
<g fill="none" stroke="#fff" stroke-width="6" stroke-linecap="round" stroke-linejoin="round">
<path d="M53 19C80 4 104 24 104 64s-24 60-51 45"/>
<path d="M61 30c16-9 30 6 30 34s-14 43-30 34" stroke-width="3" opacity=".65"/>
<path d="M13 46h26M7 64h24M13 82h26" stroke-width="4"/>
</g>
<path fill="#fff" d="M37 36l47 28-47 28 8-22 21-6-21-6z"/>
</svg>

After

Width:  |  Height:  |  Size: 536 B