New to charm, how would i go about turning this into a state manager?

import { atom } from "@rbxts/charm";
import { Players } from "@rbxts/services";

// Define interfaces for the state
interface PlayerMovementState {
readonly running: boolean;
readonly dashing: boolean;
}

interface PlayerCombatState {
readonly attacking: boolean;
readonly blocking: boolean;
}

export interface PlayerState {
readonly movement: PlayerMovementState;
readonly combat: PlayerCombatState;
}

// Default states
const DEFAULT_MOVEMENT_STATE: PlayerMovementState = {
running: false,
dashing: false,
} as const;

const DEFAULT_COMBAT_STATE: PlayerCombatState = {
attacking: false,
blocking: false,
} as const;

export const DEFAULT_PLAYER_STATE: PlayerState = {
movement: DEFAULT_MOVEMENT_STATE,
combat: DEFAULT_COMBAT_STATE,
} as const;

// Type for the player state map
type PlayerStateMap = {
readonly [K in string]?: PlayerState;
};
import { atom } from "@rbxts/charm";
import { Players } from "@rbxts/services";

// Define interfaces for the state
interface PlayerMovementState {
readonly running: boolean;
readonly dashing: boolean;
}

interface PlayerCombatState {
readonly attacking: boolean;
readonly blocking: boolean;
}

export interface PlayerState {
readonly movement: PlayerMovementState;
readonly combat: PlayerCombatState;
}

// Default states
const DEFAULT_MOVEMENT_STATE: PlayerMovementState = {
running: false,
dashing: false,
} as const;

const DEFAULT_COMBAT_STATE: PlayerCombatState = {
attacking: false,
blocking: false,
} as const;

export const DEFAULT_PLAYER_STATE: PlayerState = {
movement: DEFAULT_MOVEMENT_STATE,
combat: DEFAULT_COMBAT_STATE,
} as const;

// Type for the player state map
type PlayerStateMap = {
readonly [K in string]?: PlayerState;
};
1 Reply
Acurrz
AcurrzOP3w ago
using flamework for services and controllers after looking at the example would this suffice for simple state management?
import { atom } from "@rbxts/charm";
import { Players } from "@rbxts/services";

// Define interfaces for the state
interface PlayerMovementState {
readonly running: boolean;
readonly dashing: boolean;
}

interface PlayerCombatState {
readonly attacking: boolean;
readonly blocking: boolean;
}

export interface PlayerState {
readonly movement: PlayerMovementState;
readonly combat: PlayerCombatState;
}

// Default states
const DEFAULT_MOVEMENT_STATE: PlayerMovementState = {
running: false,
dashing: false,
} as const;

const DEFAULT_COMBAT_STATE: PlayerCombatState = {
attacking: false,
blocking: false,
} as const;

export const DEFAULT_PLAYER_STATE: PlayerState = {
movement: DEFAULT_MOVEMENT_STATE,
combat: DEFAULT_COMBAT_STATE,
} as const;

// Type for the player state map

type PlayerStateMap = {
readonly [K in string]?: PlayerState;
};

export const states = {
players: atom<PlayerStateMap>({}),
};

export function getPlayerStates(name: string) {
return states.players()[name];
}

export function setPlayerStates(name: string, playerStates: PlayerState) {
states.players((state) => ({
...state,
[name]: playerStates,
}));
}

export function updatePlayerStates(name: string, updater: (state: PlayerState) => PlayerState) {
states.players((state) => ({
...state,
[name]: state[name] && updater(state[name]),
}));
}
import { atom } from "@rbxts/charm";
import { Players } from "@rbxts/services";

// Define interfaces for the state
interface PlayerMovementState {
readonly running: boolean;
readonly dashing: boolean;
}

interface PlayerCombatState {
readonly attacking: boolean;
readonly blocking: boolean;
}

export interface PlayerState {
readonly movement: PlayerMovementState;
readonly combat: PlayerCombatState;
}

// Default states
const DEFAULT_MOVEMENT_STATE: PlayerMovementState = {
running: false,
dashing: false,
} as const;

const DEFAULT_COMBAT_STATE: PlayerCombatState = {
attacking: false,
blocking: false,
} as const;

export const DEFAULT_PLAYER_STATE: PlayerState = {
movement: DEFAULT_MOVEMENT_STATE,
combat: DEFAULT_COMBAT_STATE,
} as const;

// Type for the player state map

type PlayerStateMap = {
readonly [K in string]?: PlayerState;
};

export const states = {
players: atom<PlayerStateMap>({}),
};

export function getPlayerStates(name: string) {
return states.players()[name];
}

export function setPlayerStates(name: string, playerStates: PlayerState) {
states.players((state) => ({
...state,
[name]: playerStates,
}));
}

export function updatePlayerStates(name: string, updater: (state: PlayerState) => PlayerState) {
states.players((state) => ({
...state,
[name]: state[name] && updater(state[name]),
}));
}

Did you find this page helpful?