Includes core gameplay, 600 exported levels, visual assets, web bridge, and bootstrap scene. Co-authored-by: Cursor <cursoragent@cursor.com>
153 lines
5.1 KiB
TypeScript
153 lines
5.1 KiB
TypeScript
/** 与 Unity Platformer.Core.Define 对齐 */
|
||
|
||
export enum Direction {
|
||
North = 0,
|
||
East = 1,
|
||
South = 2,
|
||
West = 3,
|
||
}
|
||
|
||
export enum MoveState {
|
||
Idle = 0,
|
||
Moving = 1,
|
||
}
|
||
|
||
export enum GridType {
|
||
Across = 0,
|
||
Jump = 1,
|
||
Block = 2,
|
||
Ride = 3,
|
||
None = 4,
|
||
Boundary = 5,
|
||
}
|
||
|
||
export enum Skin {
|
||
Silu = 0,
|
||
Panda = 1,
|
||
RedArmy = 2,
|
||
numMan = 3,
|
||
snow = 4,
|
||
sanxing = 5,
|
||
}
|
||
|
||
export enum GameState {
|
||
Run = 0,
|
||
ResultWin = 1,
|
||
ResultFail = 2,
|
||
}
|
||
|
||
export type MoverRole = 'player' | 'vehicle';
|
||
|
||
export const CELL_SIZE = 1;
|
||
|
||
export const CommonDefine = {
|
||
TilemapGround: 'Ground',
|
||
TilemapBorder: 'Border',
|
||
Prop: 'Prop',
|
||
Vehicle: 'Vehicle',
|
||
BlockBase: 'Baseblock',
|
||
BlockJump: 'JumpBlock',
|
||
};
|
||
|
||
export function addDirection(dir: Direction, delta: number): Direction {
|
||
const n = 4;
|
||
return (((dir + delta) % n) + n) % n as Direction;
|
||
}
|
||
|
||
type MoveKey = string;
|
||
|
||
function mk(role: MoverRole, cur: GridType, next: GridType, jump: boolean): MoveKey {
|
||
return `${role}|${cur}|${next}|${jump ? 1 : 0}`;
|
||
}
|
||
|
||
function buildMoveTable(entries: [MoverRole, GridType, GridType, boolean, number][]): Map<MoveKey, number> {
|
||
const m = new Map<MoveKey, number>();
|
||
for (const [role, cur, next, jump, v] of entries) {
|
||
m.set(mk(role, cur, next, jump), v);
|
||
}
|
||
return m;
|
||
}
|
||
|
||
/** 单人 moveCondition */
|
||
export const moveCondition = buildMoveTable([
|
||
['player', GridType.Across, GridType.Across, false, 1],
|
||
['player', GridType.Jump, GridType.Across, false, 1],
|
||
['player', GridType.Jump, GridType.Across, true, 1],
|
||
['player', GridType.Ride, GridType.Across, false, 1],
|
||
['player', GridType.Ride, GridType.Across, true, 1],
|
||
['player', GridType.Across, GridType.Jump, true, 1],
|
||
['player', GridType.Across, GridType.Ride, false, 1],
|
||
['player', GridType.Across, GridType.Ride, true, 1],
|
||
['player', GridType.Jump, GridType.Ride, false, 1],
|
||
['player', GridType.Jump, GridType.Ride, true, 1],
|
||
['player', GridType.Jump, GridType.Jump, false, 1],
|
||
['player', GridType.Jump, GridType.Jump, true, 1],
|
||
['player', GridType.Ride, GridType.None, false, 1],
|
||
['player', GridType.Ride, GridType.None, true, 1],
|
||
['player', GridType.None, GridType.None, false, 1],
|
||
['player', GridType.None, GridType.None, true, 1],
|
||
['player', GridType.None, GridType.Across, false, 1],
|
||
['player', GridType.None, GridType.Across, true, 1],
|
||
['vehicle', GridType.None, GridType.None, false, 1],
|
||
['vehicle', GridType.None, GridType.None, true, 1],
|
||
['vehicle', GridType.Ride, GridType.None, false, 1],
|
||
]);
|
||
|
||
/** 多人 moveConditionMult(与 Unity Define.moveConditionMult 一致) */
|
||
const multEntries: [MoverRole, GridType, GridType, boolean, number][] = [
|
||
['player', GridType.Across, GridType.Across, false, 1],
|
||
['player', GridType.Across, GridType.Across, true, 1],
|
||
['player', GridType.Jump, GridType.Across, false, 1],
|
||
['player', GridType.Jump, GridType.Across, true, 1],
|
||
['player', GridType.Ride, GridType.Across, false, 1],
|
||
['player', GridType.Ride, GridType.Across, true, 1],
|
||
['player', GridType.Across, GridType.Jump, true, 1],
|
||
['player', GridType.Across, GridType.Jump, false, 1],
|
||
['player', GridType.Across, GridType.Ride, false, 1],
|
||
['player', GridType.Across, GridType.Ride, true, 1],
|
||
['player', GridType.Jump, GridType.Ride, false, 1],
|
||
['player', GridType.Jump, GridType.Ride, true, 1],
|
||
['player', GridType.Jump, GridType.Jump, false, 1],
|
||
['player', GridType.Jump, GridType.Jump, true, 1],
|
||
['player', GridType.Ride, GridType.None, false, 1],
|
||
['player', GridType.Ride, GridType.None, true, 1],
|
||
['player', GridType.None, GridType.None, false, 1],
|
||
['player', GridType.None, GridType.None, true, 1],
|
||
['player', GridType.None, GridType.Across, false, 1],
|
||
['player', GridType.None, GridType.Across, true, 1],
|
||
['player', GridType.Across, GridType.Block, false, 0],
|
||
['player', GridType.Across, GridType.Block, true, 0],
|
||
['vehicle', GridType.Ride, GridType.Block, false, 0],
|
||
['vehicle', GridType.Ride, GridType.Block, true, 0],
|
||
['vehicle', GridType.Ride, GridType.Across, false, 0],
|
||
['vehicle', GridType.Ride, GridType.Across, true, 0],
|
||
['vehicle', GridType.None, GridType.None, false, 1],
|
||
['vehicle', GridType.None, GridType.None, true, 1],
|
||
['vehicle', GridType.Ride, GridType.None, false, 1],
|
||
['vehicle', GridType.Ride, GridType.None, true, 1],
|
||
];
|
||
export const moveConditionMultMap = buildMoveTable(multEntries);
|
||
|
||
export const skinPath: Record<Skin, { unlockLevel: number }> = {
|
||
[Skin.Silu]: { unlockLevel: 0 },
|
||
[Skin.Panda]: { unlockLevel: 400 },
|
||
[Skin.RedArmy]: { unlockLevel: 800 },
|
||
[Skin.numMan]: { unlockLevel: 1200 },
|
||
[Skin.snow]: { unlockLevel: 1600 },
|
||
[Skin.sanxing]: { unlockLevel: 1600 },
|
||
};
|
||
|
||
export function getMoveCondition(mult: boolean): Map<MoveKey, number> {
|
||
return mult ? moveConditionMultMap : moveCondition;
|
||
}
|
||
|
||
export function lookupMove(
|
||
table: Map<MoveKey, number>,
|
||
role: MoverRole,
|
||
cur: GridType,
|
||
next: GridType,
|
||
jump: boolean,
|
||
): number | undefined {
|
||
return table.get(mk(role, cur, next, jump));
|
||
}
|