tslint changes

This commit is contained in:
Jeremy Simpson
2019-08-30 01:52:40 -07:00
parent 7603879d35
commit 7f7efbb94b
446 changed files with 70650 additions and 70661 deletions
+241 -241
View File
@@ -1,8 +1,8 @@
import { NgZone } from '@angular/core';
import { Method, SocketClient, Bin, getMethods } from 'ag-sockets/dist/browser';
import {
MapInfo, WorldState, PartyMember, PartyFlags, Action, NotificationFlags, Pony, LeaveReason,
SayData, MapState, defaultMapState, Apply, InfoFlags, PonyData, FriendStatusData, WorldMap
MapInfo, WorldState, PartyMember, PartyFlags, Action, NotificationFlags, Pony, LeaveReason,
SayData, MapState, defaultMapState, Apply, InfoFlags, PonyData, FriendStatusData, WorldMap
} from '../common/interfaces';
import { hasFlag, findById } from '../common/utils';
import { isPony } from '../common/pony';
@@ -16,8 +16,8 @@ import { addNotification, removeNotification, markGameAsLoaded, resetGameFields,
import { Model } from '../components/services/model';
import { decodeUpdate } from '../common/encoders/updateDecoder';
import {
updatePonyInfoWithPoof, subscribeRegion, handleUpdates, handleUpdateEntity, handleRemoveEntity, handleSays,
handleEntityInfo, handleUpdatePonies, filterEntityName, handleUpdateFriends
updatePonyInfoWithPoof, subscribeRegion, handleUpdates, handleUpdateEntity, handleRemoveEntity, handleSays,
handleEntityInfo, handleUpdatePonies, filterEntityName, handleUpdateFriends
} from './handlers';
import { nameToHTML } from './emoji';
@@ -27,278 +27,278 @@ const BinNotificationId = Bin.U16;
const BinSayDatas = [BinEntityId, Bin.Str, Bin.U8];
function findPonyById(map: WorldMap, id: number) {
const entity = findEntityById(map, id);
return entity && isPony(entity) ? entity : undefined;
const entity = findEntityById(map, id);
return entity && isPony(entity) ? entity : undefined;
}
export class ClientActions implements SocketClient {
constructor(private gameService: GameService, private game: PonyTownGame, private model: Model, private zone: NgZone) {
}
private apply: Apply = func => this.zone.run(func);
connected() {
resetGameFields(this.game);
this.game.map = createWorldMap();
this.game.player = undefined;
this.game.joined();
this.apply(() => this.gameService.joined());
constructor(private gameService: GameService, private game: PonyTownGame, private model: Model, private zone: NgZone) {
}
private apply: Apply = func => this.zone.run(func);
connected() {
resetGameFields(this.game);
this.game.map = createWorldMap();
this.game.player = undefined;
this.game.joined();
this.apply(() => this.gameService.joined());
const supportsWasm = typeof WebAssembly !== 'undefined';
const info = 0 |
(isInIncognitoMode ? InfoFlags.Incognito : 0) |
(supportsWasm ? InfoFlags.SupportsWASM : 0) |
(supportsLetAndConst() ? InfoFlags.SupportsLetAndConst : 0);
const supportsWasm = typeof WebAssembly !== 'undefined';
const info = 0 |
(isInIncognitoMode ? InfoFlags.Incognito : 0) |
(supportsWasm ? InfoFlags.SupportsWASM : 0) |
(supportsLetAndConst() ? InfoFlags.SupportsLetAndConst : 0);
this.game.send(server => server.actionParam2(Action.Info, info));
}
disconnected() {
resetGameFields(this.game);
this.apply(() => this.gameService.disconnected());
}
invalidVersion() {
DEVELOPMENT && !TESTS && console.error('Invalid version');
}
@Method({ binary: [Bin.U32] })
queue(place: number) {
this.game.placeInQueue = place;
}
@Method({ binary: [Bin.Obj, Bin.Bool] })
worldState(state: WorldState, initial: boolean) {
this.game.placeInQueue = 0;
this.game.setWorldState(state, initial);
}
@Method({ binary: [Bin.Obj, Bin.Obj] })
mapState(info: MapInfo, state: MapState) {
this.game.map = createWorldMap(info, state);
this.game.player = undefined;
this.game.setupMap();
updateMapState(this.game.map, defaultMapState, this.game.map.state);
}
@Method({ binary: [Bin.Obj] })
mapUpdate(state: MapState) {
const prevState = this.game.map.state;
this.game.map.state = state;
updateMapState(this.game.map, prevState, this.game.map.state);
}
@Method({ binary: [] })
mapSwitching() {
this.game.loaded = false;
this.game.placeInQueue = 0;
this.game.send(server => server.actionParam2(Action.Info, info));
}
disconnected() {
resetGameFields(this.game);
this.apply(() => this.gameService.disconnected());
}
invalidVersion() {
DEVELOPMENT && !TESTS && console.error('Invalid version');
}
@Method({ binary: [Bin.U32] })
queue(place: number) {
this.game.placeInQueue = place;
}
@Method({ binary: [Bin.Obj, Bin.Bool] })
worldState(state: WorldState, initial: boolean) {
this.game.placeInQueue = 0;
this.game.setWorldState(state, initial);
}
@Method({ binary: [Bin.Obj, Bin.Obj] })
mapState(info: MapInfo, state: MapState) {
this.game.map = createWorldMap(info, state);
this.game.player = undefined;
this.game.setupMap();
updateMapState(this.game.map, defaultMapState, this.game.map.state);
}
@Method({ binary: [Bin.Obj] })
mapUpdate(state: MapState) {
const prevState = this.game.map.state;
this.game.map.state = state;
updateMapState(this.game.map, prevState, this.game.map.state);
}
@Method({ binary: [] })
mapSwitching() {
this.game.loaded = false;
this.game.placeInQueue = 0;
if (this.game.player) {
this.game.player.vx = 0;
this.game.player.vy = 0;
}
}
@Method({ binary: [Bin.I32, Bin.I32, Bin.U8Array] })
mapTest(width: number, height: number, buffer: Uint8Array) {
const data = new Uint32Array(width * height);
(new Uint8Array(data.buffer)).set(buffer);
this.game.minimap = { width, height, data };
}
@Method({ binary: [BinEntityId, Bin.Str, Bin.Str, Bin.Str, Bin.U16] })
myEntity(id: number, name: string, info: string, characterId: string, crc: number) {
this.game.playerId = id;
this.game.playerName = name;
this.game.playerInfo = info;
this.game.playerCRC = crc;
if (this.game.player) {
this.game.player.vx = 0;
this.game.player.vy = 0;
}
}
@Method({ binary: [Bin.I32, Bin.I32, Bin.U8Array] })
mapTest(width: number, height: number, buffer: Uint8Array) {
const data = new Uint32Array(width * height);
(new Uint8Array(data.buffer)).set(buffer);
this.game.minimap = { width, height, data };
}
@Method({ binary: [BinEntityId, Bin.Str, Bin.Str, Bin.Str, Bin.U16] })
myEntity(id: number, name: string, info: string, characterId: string, crc: number) {
this.game.playerId = id;
this.game.playerName = name;
this.game.playerInfo = info;
this.game.playerCRC = crc;
const pony = findById(this.model.ponies, characterId);
const pony = findById(this.model.ponies, characterId);
if (pony) {
this.model.selectPony(pony);
}
if (pony) {
this.model.selectPony(pony);
}
if (this.game.party) {
this.game.party.members.forEach(m => m.self = m.id === id);
this.game.onPartyUpdate.next();
}
if (this.game.party) {
this.game.party.members.forEach(m => m.self = m.id === id);
this.game.onPartyUpdate.next();
}
const entity = findEntityById(this.game.map, id) as Pony | undefined;
const entity = findEntityById(this.game.map, id) as Pony | undefined;
if (entity) {
entity.name = name;
updatePonyInfoWithPoof(this.game, entity, info, crc);
}
if (entity) {
entity.name = name;
updatePonyInfoWithPoof(this.game, entity, info, crc);
}
this.game.onActionsUpdate.next();
}
@Method({ binary: [[Bin.U8], [Bin.U8Array], Bin.U8Array, [Bin.U8Array], BinSayDatas] })
update(unsubscribes: number[], subscribes: Uint8Array[], updates: Uint8Array | null, regions: Uint8Array[], says: SayData[]) {
removeRegions(this.game.map, unsubscribes);
this.game.onActionsUpdate.next();
}
@Method({ binary: [[Bin.U8], [Bin.U8Array], Bin.U8Array, [Bin.U8Array], BinSayDatas] })
update(unsubscribes: number[], subscribes: Uint8Array[], updates: Uint8Array | null, regions: Uint8Array[], says: SayData[]) {
removeRegions(this.game.map, unsubscribes);
for (const subscribe of subscribes) {
subscribeRegion(this.game, subscribe);
}
for (const subscribe of subscribes) {
subscribeRegion(this.game, subscribe);
}
if (subscribes.length) {
markGameAsLoaded(this.game);
}
if (subscribes.length) {
markGameAsLoaded(this.game);
}
if (updates) {
handleUpdates(this.game, updates);
}
if (updates) {
handleUpdates(this.game, updates);
}
for (const region of regions) {
const { x, y, updates, removes, tiles } = decodeUpdate(region);
for (const region of regions) {
const { x, y, updates, removes, tiles } = decodeUpdate(region);
for (const update of updates) {
handleUpdateEntity(this.game, update);
}
for (const update of updates) {
handleUpdateEntity(this.game, update);
}
for (const id of removes) {
handleRemoveEntity(this.game, id);
}
for (const id of removes) {
handleRemoveEntity(this.game, id);
}
for (const tile of tiles) {
setTileAtRegion(this.game.map, x, y, tile.x, tile.y, tile.type);
}
}
for (const tile of tiles) {
setTileAtRegion(this.game.map, x, y, tile.x, tile.y, tile.type);
}
}
for (const [id, message, type] of says) {
handleSays(this.game, id, message, type);
}
}
@Method({ binary: [Bin.F32, Bin.F32, Bin.Bool] })
fixPosition(x: number, y: number, safe: boolean) {
if (DEVELOPMENT && !TESTS && !safe) {
console.error(`fix position (${x.toFixed(2)}, ${y.toFixed(2)})`);
}
for (const [id, message, type] of says) {
handleSays(this.game, id, message, type);
}
}
@Method({ binary: [Bin.F32, Bin.F32, Bin.Bool] })
fixPosition(x: number, y: number, safe: boolean) {
if (DEVELOPMENT && !TESTS && !safe) {
console.error(`fix position (${x.toFixed(2)}, ${y.toFixed(2)})`);
}
const player = this.game.player;
const player = this.game.player;
if (player) {
player.x = x;
player.y = y;
savePlayerPosition();
}
if (player) {
player.x = x;
player.y = y;
savePlayerPosition();
}
this.game.send(server => server.fixedPosition());
}
@Method({ binary: [BinEntityId, Bin.U8, Bin.Obj] })
actionParam(id: number, action: Action, param: any) {
switch (action) {
case Action.ACL:
if (id === this.game.playerId && param) {
setAclCookie(param);
}
break;
case Action.FriendsCRC:
this.game.nextFriendsCRC = 0;
break;
default:
DEVELOPMENT && !TESTS && console.error(`actionParam: Invalid action: ${action}`);
}
}
@Method({ binary: [Bin.U8] })
left(reason: LeaveReason) {
this.game.player = undefined;
this.game.map = createWorldMap();
this.apply(() => this.gameService.left('clientActions.left', reason));
}
@Method({ binary: [BinNotificationId, BinEntityId, Bin.Str, Bin.Str, Bin.Str, Bin.U8] })
addNotification(id: number, entityId: number, name: string, message: string, note: string, flags: NotificationFlags) {
const defaultCharacter = hasFlag(flags, NotificationFlags.Supporter) ? this.game.supporterPony : this.game.offlinePony;
const pony = (entityId && findPonyById(this.game.map, entityId)) || defaultCharacter;
this.game.send(server => server.fixedPosition());
}
@Method({ binary: [BinEntityId, Bin.U8, Bin.Obj] })
actionParam(id: number, action: Action, param: any) {
switch (action) {
case Action.ACL:
if (id === this.game.playerId && param) {
setAclCookie(param);
}
break;
case Action.FriendsCRC:
this.game.nextFriendsCRC = 0;
break;
default:
DEVELOPMENT && !TESTS && console.error(`actionParam: Invalid action: ${action}`);
}
}
@Method({ binary: [Bin.U8] })
left(reason: LeaveReason) {
this.game.player = undefined;
this.game.map = createWorldMap();
this.apply(() => this.gameService.left('clientActions.left', reason));
}
@Method({ binary: [BinNotificationId, BinEntityId, Bin.Str, Bin.Str, Bin.Str, Bin.U8] })
addNotification(id: number, entityId: number, name: string, message: string, note: string, flags: NotificationFlags) {
const defaultCharacter = hasFlag(flags, NotificationFlags.Supporter) ? this.game.supporterPony : this.game.offlinePony;
const pony = (entityId && findPonyById(this.game.map, entityId)) || defaultCharacter;
const filteredName = filterEntityName(this.game, name, hasFlag(flags, NotificationFlags.NameBad));
message = message.replace(/#NAME#/g, nameToHTML(filteredName || ''));
const filteredName = filterEntityName(this.game, name, hasFlag(flags, NotificationFlags.NameBad));
message = message.replace(/#NAME#/g, nameToHTML(filteredName || ''));
this.apply(() => addNotification(this.game, { id, message, note, pony, flags, open: false, fresh: true }));
}
@Method({ binary: [BinNotificationId] })
removeNotification(id: number) {
this.apply(() => removeNotification(this.game, id));
}
@Method({ binary: [BinEntityId, BinEntityId] })
updateSelection(currentId: number, newId: number) {
if (isSelected(this.game, currentId)) {
this.game.select(newId ? findPonyById(this.game.map, newId) : undefined);
}
}
@Method({ binary: [[BinEntityId, Bin.U8]] })
updateParty(party: [number, PartyFlags][] | undefined) {
const members = party && party.map<PartyMember>(([id, flags]) => ({
id,
pony: findPonyById(this.game.map, id) || this.game.fallbackPonies.get(id),
self: id === this.game.playerId,
leader: hasFlag(flags, PartyFlags.Leader),
pending: hasFlag(flags, PartyFlags.Pending),
offline: hasFlag(flags, PartyFlags.Offline),
}));
this.apply(() => addNotification(this.game, { id, message, note, pony, flags, open: false, fresh: true }));
}
@Method({ binary: [BinNotificationId] })
removeNotification(id: number) {
this.apply(() => removeNotification(this.game, id));
}
@Method({ binary: [BinEntityId, BinEntityId] })
updateSelection(currentId: number, newId: number) {
if (isSelected(this.game, currentId)) {
this.game.select(newId ? findPonyById(this.game.map, newId) : undefined);
}
}
@Method({ binary: [[BinEntityId, Bin.U8]] })
updateParty(party: [number, PartyFlags][] | undefined) {
const members = party && party.map<PartyMember>(([id, flags]) => ({
id,
pony: findPonyById(this.game.map, id) || this.game.fallbackPonies.get(id),
self: id === this.game.playerId,
leader: hasFlag(flags, PartyFlags.Leader),
pending: hasFlag(flags, PartyFlags.Pending),
offline: hasFlag(flags, PartyFlags.Offline),
}));
if (members) {
const missing = members.filter(p => !p.pony).map(p => p.id);
if (members) {
const missing = members.filter(p => !p.pony).map(p => p.id);
if (missing.length) {
this.game.send(server => server.getPonies(missing));
}
}
if (missing.length) {
this.game.send(server => server.getPonies(missing));
}
}
this.apply(() => {
this.game.party = updateParty(this.game.party, members);
this.game.onPartyUpdate.next();
});
}
@Method({ binary: [[BinEntityId, Bin.Obj, Bin.U8Array, Bin.U8Array, BinEntityPlayerState, Bin.Bool]] })
updatePonies(ponies: PonyData[]) {
handleUpdatePonies(this.game, ponies);
}
@Method({ binary: [Bin.Obj, Bin.Bool] })
updateFriends(friends: FriendStatusData[], removeMissing: boolean) {
handleUpdateFriends(this.game, friends, removeMissing);
}
@Method({ binary: [BinEntityId, Bin.Str, Bin.U32, Bin.Bool] })
entityInfo(id: number, name: string, crc: number, nameBad: boolean) {
handleEntityInfo(this.game, id, name, crc, nameBad);
}
@Method({ binary: [Bin.Obj] })
entityList(value: { name: string; x: number; y: number; }[]) {
if (DEVELOPMENT || BETA) {
const list = value.map(({ name, x, y }) => `${name}(${x.toFixed(2)}, ${y.toFixed(2)})`).join('\n');
console.log(`ENTITIES:\n${list}`);
}
}
@Method({ binary: [Bin.Obj] })
testPositions(data: { frame: number; x: number | undefined; y: number | undefined; moved: boolean; }[]) {
if (DEVELOPMENT) {
const round = (x: number) => Math.round(x * 100);
const same = (ax = 0, ay = 0, bx = 0, by = 0) => round(ax) === round(bx) && round(ay) === round(by);
const fmt = (x: number | undefined) => (x === undefined ? '-' : x.toFixed(2)).padStart(5);
this.apply(() => {
this.game.party = updateParty(this.game.party, members);
this.game.onPartyUpdate.next();
});
}
@Method({ binary: [[BinEntityId, Bin.Obj, Bin.U8Array, Bin.U8Array, BinEntityPlayerState, Bin.Bool]] })
updatePonies(ponies: PonyData[]) {
handleUpdatePonies(this.game, ponies);
}
@Method({ binary: [Bin.Obj, Bin.Bool] })
updateFriends(friends: FriendStatusData[], removeMissing: boolean) {
handleUpdateFriends(this.game, friends, removeMissing);
}
@Method({ binary: [BinEntityId, Bin.Str, Bin.U32, Bin.Bool] })
entityInfo(id: number, name: string, crc: number, nameBad: boolean) {
handleEntityInfo(this.game, id, name, crc, nameBad);
}
@Method({ binary: [Bin.Obj] })
entityList(value: { name: string; x: number; y: number; }[]) {
if (DEVELOPMENT || BETA) {
const list = value.map(({ name, x, y }) => `${name}(${x.toFixed(2)}, ${y.toFixed(2)})`).join('\n');
console.log(`ENTITIES:\n${list}`);
}
}
@Method({ binary: [Bin.Obj] })
testPositions(data: { frame: number; x: number | undefined; y: number | undefined; moved: boolean; }[]) {
if (DEVELOPMENT) {
const round = (x: number) => Math.round(x * 100);
const same = (ax = 0, ay = 0, bx = 0, by = 0) => round(ax) === round(bx) && round(ay) === round(by);
const fmt = (x: number | undefined) => (x === undefined ? '-' : x.toFixed(2)).padStart(5);
for (let i = 1; i < data.length; i++) {
if (data[i - 1].frame !== (data[i].frame - 1)) {
data.splice(i, 0, { frame: data[i - 1].frame + 1, x: undefined, y: undefined, moved: false });
}
}
for (let i = 1; i < data.length; i++) {
if (data[i - 1].frame !== (data[i].frame - 1)) {
data.splice(i, 0, { frame: data[i - 1].frame + 1, x: undefined, y: undefined, moved: false });
}
}
const clientIndex = this.game.positions.findIndex(p => p.moved);
const serverIndex = data.findIndex(p => p.moved);
const offset = serverIndex - clientIndex;
const clientIndex = this.game.positions.findIndex(p => p.moved);
const serverIndex = data.findIndex(p => p.moved);
const offset = serverIndex - clientIndex;
const dat = data.map((p, i) => {
const pt = this.game.positions[i - offset] || { x: undefined, y: undefined };
return { frame: p.frame, ax: p.x, ay: p.y, bx: pt.x, by: pt.y, serverMoved: p.moved, clientMoved: pt.moved };
});
const dat = data.map((p, i) => {
const pt = this.game.positions[i - offset] || { x: undefined, y: undefined };
return { frame: p.frame, ax: p.x, ay: p.y, bx: pt.x, by: pt.y, serverMoved: p.moved, clientMoved: pt.moved };
});
const log = dat.map(({ frame, ax, ay, bx, by, serverMoved, clientMoved }, i) =>
`${frame.toString().padStart(7)} | ` +
`${fmt(ax)}, ${fmt(ay)} ${serverMoved ? 'M' : ' '} | ` +
`${fmt(bx)}, ${fmt(by)} ${clientMoved ? 'M' : ' '} | ` +
`${same(ax, ay, bx, by) ? '= ' : ' '} ` +
`${i > 0 && dat[i - 1].frame !== (frame - 1) ? 'I ' : ' '}`)
.join('\n');
const log = dat.map(({ frame, ax, ay, bx, by, serverMoved, clientMoved }, i) =>
`${frame.toString().padStart(7)} | ` +
`${fmt(ax)}, ${fmt(ay)} ${serverMoved ? 'M' : ' '} | ` +
`${fmt(bx)}, ${fmt(by)} ${clientMoved ? 'M' : ' '} | ` +
`${same(ax, ay, bx, by) ? '= ' : ' '} ` +
`${i > 0 && dat[i - 1].frame !== (frame - 1) ? 'I ' : ' '}`)
.join('\n');
console.log(
` frame | server | client | \n` +
`-----------------------------------------------\n` +
`${log}`);
}
}
console.log(
` frame | server | client | \n` +
`-----------------------------------------------\n` +
`${log}`);
}
}
}
/* istanbul ignore next */
if (DEVELOPMENT) {
getMethods(ClientActions)
.filter(m => !m.options.binary)
.forEach(m => console.error(`Missing binary encoding for ClientActions.${m.name}()`));
getMethods(ClientActions)
.filter(m => !m.options.binary)
.forEach(m => console.error(`Missing binary encoding for ClientActions.${m.name}()`));
}