Sync TICK_LENGTH constant between client & server
This commit is contained in:
parent
d2fe79b55c
commit
3f07748abd
5 changed files with 12 additions and 8 deletions
|
@ -1,5 +1,5 @@
|
||||||
|
|
||||||
export const INPUT_FREQUENCY = 33; // roughly 30fps
|
export const TICK_LENGTH = 33; // roughly 30fps
|
||||||
|
|
||||||
export interface LockstepProcessor<LocalInput, GlobalInput, State> {
|
export interface LockstepProcessor<LocalInput, GlobalInput, State> {
|
||||||
compareInput(a: GlobalInput, b: GlobalInput): boolean;
|
compareInput(a: GlobalInput, b: GlobalInput): boolean;
|
||||||
|
|
|
@ -3,7 +3,7 @@ import { DrawSet, Layer } from "../applet/Render";
|
||||||
import { ComponentSchema, Data as EcsData } from "../ecs/Components";
|
import { ComponentSchema, Data as EcsData } from "../ecs/Components";
|
||||||
import { Component, copySparse, Join, StateForSchema, Store } from "../ecs/Data";
|
import { Component, copySparse, Join, StateForSchema, Store } from "../ecs/Data";
|
||||||
import { DumbMotion } from "../ecs/Location";
|
import { DumbMotion } from "../ecs/Location";
|
||||||
import { INPUT_FREQUENCY, LockstepProcessor } from "../ecs/Lockstep";
|
import { LockstepProcessor, TICK_LENGTH } from "../ecs/Lockstep";
|
||||||
import { Buttons } from "./Input";
|
import { Buttons } from "./Input";
|
||||||
|
|
||||||
export enum GamePhase {
|
export enum GamePhase {
|
||||||
|
@ -208,7 +208,7 @@ export class Engine implements LockstepProcessor<KeyName[], KeyName[][], Data> {
|
||||||
}
|
}
|
||||||
|
|
||||||
advanceState(state: Data, input: KeyName[][]) {
|
advanceState(state: Data, input: KeyName[][]) {
|
||||||
DumbMotion(state, INPUT_FREQUENCY);
|
DumbMotion(state, TICK_LENGTH);
|
||||||
Join(state, "playerControl", "location").forEach(([player, location]) => {
|
Join(state, "playerControl", "location").forEach(([player, location]) => {
|
||||||
const playerInput = input[player.playerNumber];
|
const playerInput = input[player.playerNumber];
|
||||||
if(playerInput) {
|
if(playerInput) {
|
||||||
|
|
|
@ -4,7 +4,7 @@ import animationFrames from "callbag-animation-frames";
|
||||||
import map from "callbag-map";
|
import map from "callbag-map";
|
||||||
import pipe from "callbag-pipe";
|
import pipe from "callbag-pipe";
|
||||||
|
|
||||||
import { INPUT_FREQUENCY, LockstepProcessor, LockstepState } from "../ecs/Lockstep";
|
import { LockstepProcessor, LockstepState, TICK_LENGTH } from "../ecs/Lockstep";
|
||||||
|
|
||||||
export const enum MessageTypes {
|
export const enum MessageTypes {
|
||||||
/**
|
/**
|
||||||
|
@ -78,7 +78,7 @@ export abstract class LockstepClient<LocalInput, GlobalInput, State> {
|
||||||
this.serverTalkback = data as Server<LocalInput, GlobalInput, State>;
|
this.serverTalkback = data as Server<LocalInput, GlobalInput, State>;
|
||||||
|
|
||||||
// kickoff input sender
|
// kickoff input sender
|
||||||
setTimeout(this.sampleInput, INPUT_FREQUENCY);
|
setTimeout(this.sampleInput, TICK_LENGTH);
|
||||||
} else if (mode == 1) {
|
} else if (mode == 1) {
|
||||||
// server message
|
// server message
|
||||||
const message = data as ServerMessage<GlobalInput, State>;
|
const message = data as ServerMessage<GlobalInput, State>;
|
||||||
|
@ -104,7 +104,7 @@ export abstract class LockstepClient<LocalInput, GlobalInput, State> {
|
||||||
this.state.addLocalInput(this.playerNumber, input);
|
this.state.addLocalInput(this.playerNumber, input);
|
||||||
this.serverTalkback(1, { t: MessageTypes.INPUT, i: input });
|
this.serverTalkback(1, { t: MessageTypes.INPUT, i: input });
|
||||||
}
|
}
|
||||||
setTimeout(this.sampleInput, INPUT_FREQUENCY);
|
setTimeout(this.sampleInput, TICK_LENGTH);
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
|
@ -2,7 +2,7 @@ import { Callbag } from "callbag";
|
||||||
import pipe from "callbag-pipe";
|
import pipe from "callbag-pipe";
|
||||||
import share from "callbag-share";
|
import share from "callbag-share";
|
||||||
|
|
||||||
import { INPUT_FREQUENCY } from "../ecs/Lockstep";
|
import { TICK_LENGTH } from "../ecs/Lockstep";
|
||||||
import {
|
import {
|
||||||
catchTalkback,
|
catchTalkback,
|
||||||
defer,
|
defer,
|
||||||
|
@ -23,7 +23,7 @@ export class LoopbackServer<LocalInput, State> {
|
||||||
private inputBuffer: LocalInput[] = [];
|
private inputBuffer: LocalInput[] = [];
|
||||||
|
|
||||||
private heartbeat = pipe(
|
private heartbeat = pipe(
|
||||||
interval(INPUT_FREQUENCY),
|
interval(TICK_LENGTH),
|
||||||
map(() => ({
|
map(() => ({
|
||||||
t: MessageTypes.INPUT,
|
t: MessageTypes.INPUT,
|
||||||
i: this.inputBuffer.slice()
|
i: this.inputBuffer.slice()
|
||||||
|
|
|
@ -1,8 +1,12 @@
|
||||||
use serde::{Deserialize, Serialize};
|
use serde::{Deserialize, Serialize};
|
||||||
use serde_json::Value;
|
use serde_json::Value;
|
||||||
|
use std::time::Duration;
|
||||||
|
|
||||||
pub mod server;
|
pub mod server;
|
||||||
|
|
||||||
|
/// Roughly 30 fps
|
||||||
|
pub static TICK_LENGTH: Duration = Duration::from_millis(33);
|
||||||
|
|
||||||
pub type PlayerId = usize;
|
pub type PlayerId = usize;
|
||||||
pub type PlayerInput = Value;
|
pub type PlayerInput = Value;
|
||||||
pub type GameState = Value;
|
pub type GameState = Value;
|
||||||
|
|
Loading…
Reference in a new issue