diff --git a/admin-web/index.html b/admin-web/index.html
index 1109aec..01eed40 100644
--- a/admin-web/index.html
+++ b/admin-web/index.html
@@ -572,28 +572,17 @@
if (h.destinationTownId != null) rows.push(`
destinationTownId${e(h.destinationTownId)}
`);
if (h.restKind) rows.push(``);
if (live && live.online) {
- if (live.adventureActive && live.adventureEndsAt) {
- rows.push(`мини-приключение${statusCountdownLine(live.adventureEndsAt)}
`);
- } else {
- rows.push(`мини-приключениене активно
`);
- }
if (live.restUntil) rows.push(`отдых / restUntil${statusCountdownLine(live.restUntil)}
`);
if (live.townLeaveAt) rows.push(`в городе до выхода${statusCountdownLine(live.townLeaveAt)}
`);
if (live.nextTownNPCRollAt) rows.push(`след. событие NPC в городе${statusCountdownLine(live.nextTownNPCRollAt)}
`);
- if (live.roadsideRestActive && live.roadsideRestEndAt) {
- rows.push(`отдых у обочины${statusCountdownLine(live.roadsideRestEndAt)}
`);
- }
if (live.wanderingMerchantDeadline) {
rows.push(`окно бродячего торговца${statusCountdownLine(live.wanderingMerchantDeadline)}
`);
}
- } else {
- rows.push(`мини-приключениегерой не в игре — оставшееся время приключения не считается (нужна открытая игра)
`);
}
if (tp) {
if (tp.restUntil) rows.push(`отдых (из БД)${e(tp.restKind || "")}: ${statusCountdownLine(tp.restUntil)}
`);
if (tp.townLeaveAt) rows.push(`выход из города (из БД)${statusCountdownLine(tp.townLeaveAt)}
`);
if (tp.nextTownNPCRollAt) rows.push(`NPC в городе (из БД)${statusCountdownLine(tp.nextTownNPCRollAt)}
`);
- if (tp.roadsideRestEndAt) rows.push(`обочина (из БД)${statusCountdownLine(tp.roadsideRestEndAt)}
`);
}
let pollNote = "";
if (state._heroPollTimer && state._heroPollUntil) {
@@ -1155,10 +1144,7 @@
-
-
-
diff --git a/frontend/src/game/engine.ts b/frontend/src/game/engine.ts
index 7b9480c..626d55a 100644
--- a/frontend/src/game/engine.ts
+++ b/frontend/src/game/engine.ts
@@ -368,10 +368,7 @@ export class GameEngine {
}
}
- // Roadside rest: hero_state anchor stays on the road; display follows hero_move (+ lateral offset).
- // Snapping here would cancel the forest offset every tick.
- const skipPositionSnap = activity === 'resting';
- if (!skipPositionSnap) {
+ {
const tdx = newX - this._targetPositionX;
const tdy = newY - this._targetPositionY;
if (
@@ -780,19 +777,7 @@ export class GameEngine {
now,
);
- const roadsideResting =
- state.phase === GamePhase.Resting &&
- state.hero.serverActivityState?.toLowerCase() === 'resting' &&
- state.hero.restKind === 'roadside';
- if (roadsideResting) {
- this.renderer.drawCampfire(
- this._heroDisplayX,
- this._heroDisplayY,
- now,
- );
- } else {
- this.renderer.clearCampfire();
- }
+ this.renderer.clearCampfire();
// Thought bubble during rest/town pauses
if (this._thoughtText) {
diff --git a/frontend/src/game/types.ts b/frontend/src/game/types.ts
index 93865ff..30209e0 100644
--- a/frontend/src/game/types.ts
+++ b/frontend/src/game/types.ts
@@ -118,7 +118,7 @@ export interface HeroState {
position: Position;
/** Server `state` field (walking | resting | in_town | …); used for movement/render parity */
serverActivityState?: string;
- /** Server rest flavor: "town" | "roadside" */
+ /** Server rest flavor: "town" */
restKind?: string;
attackSpeed: number;
damage: number;