Show personal map records on join and replay

This commit is contained in:
2026-10-19 14:11:54 -04:00
parent 9ef5932d36
commit e93182cd02
11 changed files with 620 additions and 200 deletions
+38 -17
View File
@@ -175,18 +175,16 @@ show_help()
}
// An undefined snapshot is the explicit unavailable view for manual requests.
show_record(snapshot)
show_record(snapshot, personal)
{
if (isDefined(level.tws_service_ended))
return;
self service_ensure();
state = self.tws_service;
service_advance(state, getTime());
count = 0;
if (isDefined(snapshot))
count = snapshot.lines.size;
state.generation++;
state.record = service_request("record", service_page_count(count, 3), state.generation);
state.record = service_request("record", 1, state.generation);
state.record.personal = personal;
state.record.snapshot = snapshot;
service_render(state);
}
@@ -344,12 +342,21 @@ service_ensure()
self thread service_end_game(state);
}
service_record_rows(request)
{
if (request.kind == "reminder")
return 1;
if (request.kind == "record" && isDefined(request.snapshot) && request.snapshot.round > 0)
return request.snapshot.lines.size;
return 0;
}
// Allocate only the active view. Alpha-zero elements still occupy HUD slots.
service_view_create(state, request)
{
service_view_destroy(state);
state.view_kind = request.kind;
state.view_paged = request.pages > 1;
state.view_paged = request.kind == "help" && request.pages > 1;
if (state.view_paged)
state.page_counter = service_text(self, state, level.hud_service_right,
level.hud_service_title_y, "right", 1.0, "", level.hud_c_dim);
@@ -375,15 +382,16 @@ service_view_create(state, request)
state.record_title = service_text(self, state, level.hud_service_right,
level.hud_service_record_y, "right", 1.1, "", level.hud_c_count);
rows = 3;
if (request.kind == "reminder")
rows = 1;
rows = service_record_rows(request);
for (i = 0; i < rows; i++)
state.rows[i] = service_text(self, state, level.hud_service_right,
level.hud_service_holders_y + i * level.hud_service_holders_pitch,
"right", 1.05, "", level.hud_c_label);
if (isDefined(state.page_counter))
state.page_counter.y = level.hud_service_holders_y + 3 * level.hud_service_holders_pitch;
// Give the personal record its own heading after every holder and a blank row.
if (isDefined(request.personal))
state.personal_title = service_text(self, state, level.hud_service_right,
level.hud_service_holders_y + (rows + 1) * level.hud_service_holders_pitch,
"right", 1.1, "", level.hud_c_count);
}
service_view_destroy(state)
@@ -401,6 +409,8 @@ service_view_destroy(state)
state.command_rows = [];
state.description_rows = [];
state.record_title = undefined;
state.personal_title = undefined;
state.personal_text = undefined;
state.rows = [];
state.page_text = undefined;
state.record_header_text = undefined;
@@ -441,8 +451,10 @@ service_render(state)
service_view_destroy(state);
return;
}
paged = request.pages > 1;
if (!isDefined(state.view_kind) || state.view_kind != request.kind || state.view_paged != paged)
paged = request.kind == "help" && request.pages > 1;
if (!isDefined(state.view_kind) || state.view_kind != request.kind || state.view_paged != paged ||
state.rows.size != service_record_rows(request) ||
isDefined(state.personal_title) != isDefined(request.personal))
service_view_create(state, request);
for (i = 0; i < state.elems.size; i++)
state.elems[i].alpha = 0;
@@ -478,13 +490,13 @@ service_render(state)
return;
}
header = "Map record unavailable";
header = "Map Record unavailable";
snapshot = request.snapshot;
if (isDefined(snapshot))
{
header = "No recorded high round yet";
if (snapshot.round > 0)
header = "Map record | Round " + snapshot.round;
header = "Map Record | Round " + snapshot.round;
}
if (!isDefined(state.record_header_text) || state.record_header_text != header)
{
@@ -492,6 +504,15 @@ service_render(state)
state.record_header_text = header;
}
state.record_title.alpha = 1;
if (isDefined(request.personal))
{
if (!isDefined(state.personal_text) || state.personal_text != request.personal)
{
state.personal_title SetText(request.personal);
state.personal_text = request.personal;
}
state.personal_title.alpha = 1;
}
if (!isDefined(snapshot) || snapshot.round == 0)
return;
if (request.kind == "reminder")
@@ -500,9 +521,9 @@ service_render(state)
state.rows[0].alpha = 1;
return;
}
for (i = 0; i < 3; i++)
for (i = 0; i < state.rows.size; i++)
{
index = page * 3 + i;
index = i;
if (index < snapshot.lines.size)
{
text = snapshot.lines[index];