Initial Cocos Creator port of main-site Unity WebGL game.
Includes core gameplay, 600 exported levels, visual assets, web bridge, and bootstrap scene. Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
152
assets/scripts/core/Define.ts
Normal file
152
assets/scripts/core/Define.ts
Normal file
@@ -0,0 +1,152 @@
|
||||
/** 与 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));
|
||||
}
|
||||
9
assets/scripts/core/Define.ts.meta
Normal file
9
assets/scripts/core/Define.ts.meta
Normal file
@@ -0,0 +1,9 @@
|
||||
{
|
||||
"ver": "4.0.24",
|
||||
"importer": "typescript",
|
||||
"imported": true,
|
||||
"uuid": "e5d9eb64-9856-42f8-b14c-ab18ad6ff50e",
|
||||
"files": [],
|
||||
"subMetas": {},
|
||||
"userData": {}
|
||||
}
|
||||
27
assets/scripts/core/EventManager.ts
Normal file
27
assets/scripts/core/EventManager.ts
Normal file
@@ -0,0 +1,27 @@
|
||||
export enum EventType {
|
||||
LevelInit = 'LevelInit',
|
||||
InputEnd = 'InputEnd',
|
||||
}
|
||||
|
||||
type Handler = (...args: unknown[]) => void;
|
||||
|
||||
const listeners = new Map<EventType, Handler[]>();
|
||||
|
||||
export const EventManager = {
|
||||
register(type: EventType, handler: Handler) {
|
||||
if (!listeners.has(type)) listeners.set(type, []);
|
||||
const list = listeners.get(type)!;
|
||||
if (!list.includes(handler)) list.push(handler);
|
||||
},
|
||||
remove(type: EventType, handler: Handler) {
|
||||
const list = listeners.get(type);
|
||||
if (!list) return;
|
||||
const i = list.indexOf(handler);
|
||||
if (i >= 0) list.splice(i, 1);
|
||||
},
|
||||
dispatch(type: EventType, ...args: unknown[]) {
|
||||
const list = listeners.get(type);
|
||||
if (!list) return;
|
||||
for (const h of [...list]) h(...args);
|
||||
},
|
||||
};
|
||||
9
assets/scripts/core/EventManager.ts.meta
Normal file
9
assets/scripts/core/EventManager.ts.meta
Normal file
@@ -0,0 +1,9 @@
|
||||
{
|
||||
"ver": "4.0.24",
|
||||
"importer": "typescript",
|
||||
"imported": true,
|
||||
"uuid": "d101e574-7e0a-4ccf-9ead-12d3872afe82",
|
||||
"files": [],
|
||||
"subMetas": {},
|
||||
"userData": {}
|
||||
}
|
||||
Reference in New Issue
Block a user