Compare commits
4 Commits
Author | SHA1 | Date |
---|---|---|
|
c0a714d2b0 | |
|
91d5095890 | |
|
7851e64fd5 | |
|
12ca58d43e |
|
@ -1,6 +1,6 @@
|
||||||
{
|
{
|
||||||
"name": "opt-cc",
|
"name": "opt-cc",
|
||||||
"version": "1.9.4",
|
"version": "1.9.7",
|
||||||
"author": "Florian Hartwich <hardi@noarch.de>",
|
"author": "Florian Hartwich <hardi@noarch.de>",
|
||||||
"private": true,
|
"private": true,
|
||||||
"scripts": {
|
"scripts": {
|
||||||
|
|
|
@ -85,6 +85,7 @@
|
||||||
+ `LIGHT`
|
+ `LIGHT`
|
||||||
+ `HEAVY`
|
+ `HEAVY`
|
||||||
+ `AIR`
|
+ `AIR`
|
||||||
|
+ `BOAT`
|
||||||
+ `UNKNOWN`
|
+ `UNKNOWN`
|
||||||
+ shooterVehicle: `FV-720 Mora` (string, optional) - vehicle in whiock the shooting player sat
|
+ shooterVehicle: `FV-720 Mora` (string, optional) - vehicle in whiock the shooting player sat
|
||||||
+ magazine: `30 mm APFSDS` (string, optional) - magazine name used to execute the kill
|
+ magazine: `30 mm APFSDS` (string, optional) - magazine name used to execute the kill
|
||||||
|
|
|
@ -6,6 +6,8 @@ A war as used in statistics
|
||||||
+ title: `Battle No.1` (string, required) - the display neme of the war
|
+ title: `Battle No.1` (string, required) - the display neme of the war
|
||||||
+ date: `2018-02-24T20:01:25.825Z` (string, required) - war start timestamp
|
+ date: `2018-02-24T20:01:25.825Z` (string, required) - war start timestamp
|
||||||
+ endDate: `2018-02-24T22:31:26.855Z` (string, required) - war end timestamp
|
+ endDate: `2018-02-24T22:31:26.855Z` (string, required) - war end timestamp
|
||||||
|
+ fractionMappingBlufor: `BLUFOR` (enum[string], required) - display name mapping for Blufor fraction
|
||||||
|
+ fractionMappingOpfor: `OPFOR` (enum[string], required) - display name mapping for Opfor fraction
|
||||||
+ ptBlufor: 11 (number, required) - final points fraction Blufor
|
+ ptBlufor: 11 (number, required) - final points fraction Blufor
|
||||||
+ ptOpfor: 12 (number, required) - final points fraction Opfor
|
+ ptOpfor: 12 (number, required) - final points fraction Opfor
|
||||||
+ playersBlufor: 36 (number, required) - player count of fraction Blufor
|
+ playersBlufor: 36 (number, required) - player count of fraction Blufor
|
||||||
|
|
Before Width: | Height: | Size: 15 KiB After Width: | Height: | Size: 21 KiB |
Before Width: | Height: | Size: 65 KiB After Width: | Height: | Size: 65 KiB |
|
@ -10,7 +10,7 @@ const DecorationSchema = new Schema({
|
||||||
},
|
},
|
||||||
fraction: {
|
fraction: {
|
||||||
type: String,
|
type: String,
|
||||||
enum: ['BLUFOR', 'OPFOR', 'GLOBAL'],
|
enum: ['BLUFOR', 'OPFOR', 'ARF', 'SWORD', 'GLOBAL'],
|
||||||
required: true,
|
required: true,
|
||||||
},
|
},
|
||||||
description: {
|
description: {
|
||||||
|
|
|
@ -30,7 +30,7 @@ const LogVehicleKillSchema = new Schema({
|
||||||
},
|
},
|
||||||
vehicleClass: {
|
vehicleClass: {
|
||||||
type: String,
|
type: String,
|
||||||
enum: ['LIGHT', 'HEAVY', 'AIR', 'UNKNOWN'],
|
enum: ['LIGHT', 'HEAVY', 'AIR', 'BOAT', 'UNKNOWN'],
|
||||||
required: true,
|
required: true,
|
||||||
},
|
},
|
||||||
magazine: {
|
magazine: {
|
||||||
|
|
|
@ -42,6 +42,12 @@ const PlayerSchema = new Schema({
|
||||||
set: (v) => Math.round(v),
|
set: (v) => Math.round(v),
|
||||||
required: true,
|
required: true,
|
||||||
},
|
},
|
||||||
|
vehicleBoat: {
|
||||||
|
type: Number,
|
||||||
|
get: (v) => Math.round(v),
|
||||||
|
set: (v) => Math.round(v),
|
||||||
|
required: true,
|
||||||
|
},
|
||||||
death: {
|
death: {
|
||||||
type: Number,
|
type: Number,
|
||||||
get: (v) => Math.round(v),
|
get: (v) => Math.round(v),
|
||||||
|
|
|
@ -14,6 +14,16 @@ const WarSchema = new Schema({
|
||||||
endDate: {
|
endDate: {
|
||||||
type: Date,
|
type: Date,
|
||||||
},
|
},
|
||||||
|
fractionMappingBlufor: {
|
||||||
|
type: String,
|
||||||
|
enum: ['BLUFOR', 'OPFOR', 'ARF', 'SWORD'],
|
||||||
|
default: 'BLUFOR',
|
||||||
|
},
|
||||||
|
fractionMappingOpfor: {
|
||||||
|
type: String,
|
||||||
|
enum: ['BLUFOR', 'OPFOR', 'ARF', 'SWORD'],
|
||||||
|
default: 'OPFOR',
|
||||||
|
},
|
||||||
ptBlufor: {
|
ptBlufor: {
|
||||||
type: Number,
|
type: Number,
|
||||||
get: (v) => Math.round(v),
|
get: (v) => Math.round(v),
|
||||||
|
|
|
@ -37,7 +37,11 @@ decorationRouter.route('/')
|
||||||
.get((req, res, next) => {
|
.get((req, res, next) => {
|
||||||
const filter = {};
|
const filter = {};
|
||||||
if (req.query.fractFilter) {
|
if (req.query.fractFilter) {
|
||||||
filter.fraction = req.query.fractFilter.toUpperCase();
|
filter.fraction = {
|
||||||
|
'$in': req.query.fractFilter
|
||||||
|
.toUpperCase()
|
||||||
|
.split(','),
|
||||||
|
};
|
||||||
}
|
}
|
||||||
if (req.query.q) {
|
if (req.query.q) {
|
||||||
filter.name = {$regex: req.query.q, $options: 'i'};
|
filter.name = {$regex: req.query.q, $options: 'i'};
|
||||||
|
|
|
@ -26,92 +26,100 @@ campaignPlayer.route('/ranking/:campaignId')
|
||||||
const warIds = wars.map((obj) => {
|
const warIds = wars.map((obj) => {
|
||||||
return obj._id;
|
return obj._id;
|
||||||
});
|
});
|
||||||
PlayerModel.find({warId: {'$in': warIds}}, (err, items) => {
|
WarModel.findOne({campaign: req.params.campaignId}, {}, {sort: {'date': -1}}, (err, latestWar) => {
|
||||||
if (err) return next(err);
|
PlayerModel.find({warId: {'$in': warIds}}, (err, items) => {
|
||||||
if (!items || items.length === 0) {
|
if (err) return next(err);
|
||||||
const err = new Error('No players for given campaignId');
|
if (!items || items.length === 0) {
|
||||||
err.status = codes.notfound;
|
const err = new Error('No players for given campaignId');
|
||||||
return next(err);
|
err.status = codes.notfound;
|
||||||
}
|
return next(err);
|
||||||
|
|
||||||
const rankingItems = [];
|
|
||||||
|
|
||||||
// check only first player to have valid steamUUID - then decide if tracked by name or by ID
|
|
||||||
const usesUUID = isSteamUUID(items[0].steamUUID);
|
|
||||||
|
|
||||||
new Set(items.map(usesUUID ? (x) => x.steamUUID : (x) => x.name))
|
|
||||||
.forEach((player) => {
|
|
||||||
const playerInstances = items.filter(
|
|
||||||
usesUUID ? (p) => p.steamUUID === player : (p) => p.name === player);
|
|
||||||
const resItem = {
|
|
||||||
name: usesUUID ? playerInstances[playerInstances.length - 1].name : player,
|
|
||||||
kill: 0,
|
|
||||||
vehicleLight: 0,
|
|
||||||
vehicleHeavy: 0,
|
|
||||||
vehicleAir: 0,
|
|
||||||
death: 0,
|
|
||||||
friendlyFire: 0,
|
|
||||||
revive: 0,
|
|
||||||
respawn: 0,
|
|
||||||
flagTouch: 0,
|
|
||||||
travelDistance: 0,
|
|
||||||
driverDistance: 0,
|
|
||||||
};
|
|
||||||
for (let i = 0; i < playerInstances.length; i++) {
|
|
||||||
const player = playerInstances[i];
|
|
||||||
resItem.kill += player.kill;
|
|
||||||
resItem.death += player.death;
|
|
||||||
resItem.friendlyFire += player.friendlyFire;
|
|
||||||
resItem.vehicleLight += player.vehicleLight;
|
|
||||||
resItem.vehicleHeavy += player.vehicleHeavy;
|
|
||||||
resItem.vehicleAir += player.vehicleAir;
|
|
||||||
resItem.revive += player.revive;
|
|
||||||
resItem.respawn += player.respawn;
|
|
||||||
resItem.flagTouch += player.flagTouch;
|
|
||||||
if (player.travelDistance) {
|
|
||||||
resItem.travelDistance += Math.round(player.travelDistance / 1000); // meters -> km
|
|
||||||
}
|
|
||||||
if (player.driverDistance) {
|
|
||||||
resItem.driverDistance += Math.round(player.driverDistance / 1000); // meters -> km
|
|
||||||
}
|
|
||||||
}
|
|
||||||
resItem.warCount = playerInstances.length;
|
|
||||||
resItem.fraction = playerInstances[playerInstances.length - 1].fraction;
|
|
||||||
rankingItems.push(resItem);
|
|
||||||
});
|
|
||||||
|
|
||||||
const getSortedField = (fieldName) => {
|
|
||||||
let num = 1;
|
|
||||||
const filteredSortResult = rankingItems.map((item) => {
|
|
||||||
return {
|
|
||||||
name: item.name,
|
|
||||||
fraction: item.fraction,
|
|
||||||
[fieldName]: item[fieldName],
|
|
||||||
};
|
|
||||||
})
|
|
||||||
.sort((a, b) => b[fieldName] - a[fieldName]);
|
|
||||||
const res = JSON.parse(JSON.stringify(filteredSortResult));
|
|
||||||
for (const entity of res) {
|
|
||||||
entity.num = num++;
|
|
||||||
}
|
}
|
||||||
return res;
|
|
||||||
};
|
|
||||||
|
|
||||||
res.locals.items = {
|
const rankingItems = [];
|
||||||
kill: getSortedField('kill'),
|
|
||||||
death: getSortedField('death'),
|
// check only first player to have valid steamUUID - then decide if tracked by name or by ID
|
||||||
friendlyFire: getSortedField('friendlyFire'),
|
const usesUUID = isSteamUUID(items[0].steamUUID);
|
||||||
vehicleLight: getSortedField('vehicleLight'),
|
|
||||||
vehicleHeavy: getSortedField('vehicleHeavy'),
|
new Set(items.map(usesUUID ? (x) => x.steamUUID : (x) => x.name))
|
||||||
vehicleAir: getSortedField('vehicleAir'),
|
.forEach((player) => {
|
||||||
revive: getSortedField('revive'),
|
const playerInstances = items.filter(
|
||||||
respawn: getSortedField('respawn'),
|
usesUUID ? (p) => p.steamUUID === player : (p) => p.name === player);
|
||||||
flagTouch: getSortedField('flagTouch'),
|
const resItem = {
|
||||||
travelDistance: getSortedField('travelDistance'),
|
name: usesUUID ? playerInstances[playerInstances.length - 1].name : player,
|
||||||
driverDistance: getSortedField('driverDistance'),
|
kill: 0,
|
||||||
warCount: getSortedField('warCount'),
|
vehicleLight: 0,
|
||||||
};
|
vehicleHeavy: 0,
|
||||||
next();
|
vehicleAir: 0,
|
||||||
|
death: 0,
|
||||||
|
friendlyFire: 0,
|
||||||
|
revive: 0,
|
||||||
|
respawn: 0,
|
||||||
|
flagTouch: 0,
|
||||||
|
travelDistance: 0,
|
||||||
|
driverDistance: 0,
|
||||||
|
};
|
||||||
|
for (let i = 0; i < playerInstances.length; i++) {
|
||||||
|
const player = playerInstances[i];
|
||||||
|
resItem.kill += player.kill;
|
||||||
|
resItem.death += player.death;
|
||||||
|
resItem.friendlyFire += player.friendlyFire;
|
||||||
|
resItem.vehicleLight += player.vehicleLight;
|
||||||
|
resItem.vehicleHeavy += player.vehicleHeavy;
|
||||||
|
resItem.vehicleAir += player.vehicleAir;
|
||||||
|
resItem.revive += player.revive;
|
||||||
|
resItem.respawn += player.respawn;
|
||||||
|
resItem.flagTouch += player.flagTouch;
|
||||||
|
if (player.travelDistance) {
|
||||||
|
resItem.travelDistance += Math.round(player.travelDistance / 1000); // meters -> km
|
||||||
|
}
|
||||||
|
if (player.driverDistance) {
|
||||||
|
resItem.driverDistance += Math.round(player.driverDistance / 1000); // meters -> km
|
||||||
|
}
|
||||||
|
}
|
||||||
|
resItem.warCount = playerInstances.length;
|
||||||
|
|
||||||
|
const latestPlayerFraction = playerInstances[playerInstances.length - 1].fraction;
|
||||||
|
resItem.fraction =
|
||||||
|
(latestPlayerFraction === 'OPFOR') ?
|
||||||
|
latestWar.fractionMappingOpfor :
|
||||||
|
latestWar.fractionMappingBlufor;
|
||||||
|
|
||||||
|
rankingItems.push(resItem);
|
||||||
|
});
|
||||||
|
|
||||||
|
const getSortedField = (fieldName) => {
|
||||||
|
let num = 1;
|
||||||
|
const filteredSortResult = rankingItems.map((item) => {
|
||||||
|
return {
|
||||||
|
name: item.name,
|
||||||
|
fraction: item.fraction,
|
||||||
|
[fieldName]: item[fieldName],
|
||||||
|
};
|
||||||
|
})
|
||||||
|
.sort((a, b) => b[fieldName] - a[fieldName]);
|
||||||
|
const res = JSON.parse(JSON.stringify(filteredSortResult));
|
||||||
|
for (const entity of res) {
|
||||||
|
entity.num = num++;
|
||||||
|
}
|
||||||
|
return res;
|
||||||
|
};
|
||||||
|
|
||||||
|
res.locals.items = {
|
||||||
|
kill: getSortedField('kill'),
|
||||||
|
death: getSortedField('death'),
|
||||||
|
friendlyFire: getSortedField('friendlyFire'),
|
||||||
|
vehicleLight: getSortedField('vehicleLight'),
|
||||||
|
vehicleHeavy: getSortedField('vehicleHeavy'),
|
||||||
|
vehicleAir: getSortedField('vehicleAir'),
|
||||||
|
revive: getSortedField('revive'),
|
||||||
|
respawn: getSortedField('respawn'),
|
||||||
|
flagTouch: getSortedField('flagTouch'),
|
||||||
|
travelDistance: getSortedField('travelDistance'),
|
||||||
|
driverDistance: getSortedField('driverDistance'),
|
||||||
|
warCount: getSortedField('warCount'),
|
||||||
|
};
|
||||||
|
next();
|
||||||
|
});
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
})
|
})
|
||||||
|
|
|
@ -168,7 +168,6 @@ users.route('/:id')
|
||||||
res.locals.items = item;
|
res.locals.items = item;
|
||||||
} else {
|
} else {
|
||||||
err.status = codes.wrongrequest;
|
err.status = codes.wrongrequest;
|
||||||
console.log(err);
|
|
||||||
err.message += ' in fields: ' + Object.getOwnPropertyNames(err.errors);
|
err.message += ' in fields: ' + Object.getOwnPropertyNames(err.errors);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -172,6 +172,11 @@ wars.route('/:id')
|
||||||
return next(err);
|
return next(err);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// TODO: temp solution for CC-93 - add boat kills to light vehicle kills until FE available
|
||||||
|
items.forEach((player) => {
|
||||||
|
player.vehicleLight = player.vehicleLight + player.vehicleBoat;
|
||||||
|
});
|
||||||
|
|
||||||
const responseObj = item.toObject();
|
const responseObj = item.toObject();
|
||||||
responseObj.players = items;
|
responseObj.players = items;
|
||||||
res.locals.items = responseObj;
|
res.locals.items = responseObj;
|
||||||
|
|
|
@ -19,8 +19,7 @@ const {exec} = require('child_process');
|
||||||
// cluster mode
|
// cluster mode
|
||||||
const cluster = require('cluster');
|
const cluster = require('cluster');
|
||||||
const envWorkerNum = process.env.NODE_WORKER_COUNT;
|
const envWorkerNum = process.env.NODE_WORKER_COUNT;
|
||||||
const cpuCount = require('os').cpus().length;
|
const numWorkers = (envWorkerNum) ? envWorkerNum : 2;
|
||||||
const numWorkers = (envWorkerNum) ? envWorkerNum : cpuCount;
|
|
||||||
|
|
||||||
// own modules
|
// own modules
|
||||||
const config = require('./config/config');
|
const config = require('./config/config');
|
||||||
|
|
Before Width: | Height: | Size: 53 KiB After Width: | Height: | Size: 53 KiB |
Before Width: | Height: | Size: 61 KiB After Width: | Height: | Size: 55 KiB |
Before Width: | Height: | Size: 10 KiB After Width: | Height: | Size: 15 KiB |
|
@ -1,813 +0,0 @@
|
||||||
info face="DejaVu Sans" size=19 bold=0 italic=0 charset="" unicode=0 stretchH=100 smooth=1 aa=1 padding=1,1,1,1 spacing=-2,-2
|
|
||||||
common lineHeight=23 base=18 scaleW=512 scaleH=512 pages=1 packed=0
|
|
||||||
page id=0 file="DEVAJU_SANS_19.png"
|
|
||||||
chars count=193
|
|
||||||
char id=0 x=298 y=0 width=13 height=20 xoffset=-1 yoffset=3 xadvance=11 page=0 chnl=0
|
|
||||||
char id=10 x=0 y=0 width=22 height=22 xoffset=-1 yoffset=-1 xadvance=19 page=0 chnl=0
|
|
||||||
char id=32 x=0 y=0 width=0 height=0 xoffset=-1 yoffset=17 xadvance=6 page=0 chnl=0
|
|
||||||
char id=33 x=500 y=42 width=4 height=16 xoffset=2 yoffset=3 xadvance=8 page=0 chnl=0
|
|
||||||
char id=34 x=67 y=75 width=7 height=7 xoffset=1 yoffset=3 xadvance=9 page=0 chnl=0
|
|
||||||
char id=35 x=40 y=59 width=15 height=16 xoffset=0 yoffset=3 xadvance=15 page=0 chnl=0
|
|
||||||
char id=36 x=287 y=0 width=11 height=20 xoffset=1 yoffset=2 xadvance=13 page=0 chnl=0
|
|
||||||
char id=37 x=22 y=59 width=18 height=16 xoffset=0 yoffset=3 xadvance=18 page=0 chnl=0
|
|
||||||
char id=38 x=55 y=59 width=15 height=16 xoffset=0 yoffset=3 xadvance=14 page=0 chnl=0
|
|
||||||
char id=39 x=507 y=59 width=4 height=7 xoffset=1 yoffset=3 xadvance=6 page=0 chnl=0
|
|
||||||
char id=40 x=240 y=0 width=7 height=20 xoffset=1 yoffset=2 xadvance=8 page=0 chnl=0
|
|
||||||
char id=41 x=247 y=0 width=7 height=20 xoffset=0 yoffset=2 xadvance=7 page=0 chnl=0
|
|
||||||
char id=42 x=489 y=59 width=11 height=11 xoffset=-1 yoffset=3 xadvance=9 page=0 chnl=0
|
|
||||||
char id=43 x=199 y=59 width=14 height=14 xoffset=1 yoffset=5 xadvance=16 page=0 chnl=0
|
|
||||||
char id=44 x=74 y=75 width=5 height=7 xoffset=0 yoffset=14 xadvance=6 page=0 chnl=0
|
|
||||||
char id=45 x=119 y=75 width=7 height=4 xoffset=0 yoffset=10 xadvance=7 page=0 chnl=0
|
|
||||||
char id=46 x=115 y=75 width=4 height=5 xoffset=1 yoffset=14 xadvance=6 page=0 chnl=0
|
|
||||||
char id=47 x=51 y=22 width=9 height=18 xoffset=-1 yoffset=3 xadvance=6 page=0 chnl=0
|
|
||||||
char id=48 x=0 y=59 width=12 height=16 xoffset=0 yoffset=3 xadvance=12 page=0 chnl=0
|
|
||||||
char id=49 x=396 y=42 width=11 height=16 xoffset=1 yoffset=3 xadvance=13 page=0 chnl=0
|
|
||||||
char id=50 x=407 y=42 width=11 height=16 xoffset=0 yoffset=3 xadvance=12 page=0 chnl=0
|
|
||||||
char id=51 x=418 y=42 width=11 height=16 xoffset=0 yoffset=3 xadvance=12 page=0 chnl=0
|
|
||||||
char id=52 x=429 y=42 width=13 height=16 xoffset=-1 yoffset=3 xadvance=12 page=0 chnl=0
|
|
||||||
char id=53 x=442 y=42 width=11 height=16 xoffset=0 yoffset=3 xadvance=12 page=0 chnl=0
|
|
||||||
char id=54 x=453 y=42 width=12 height=16 xoffset=0 yoffset=3 xadvance=12 page=0 chnl=0
|
|
||||||
char id=55 x=465 y=42 width=11 height=16 xoffset=1 yoffset=3 xadvance=13 page=0 chnl=0
|
|
||||||
char id=56 x=476 y=42 width=12 height=16 xoffset=0 yoffset=3 xadvance=12 page=0 chnl=0
|
|
||||||
char id=57 x=488 y=42 width=12 height=16 xoffset=0 yoffset=3 xadvance=12 page=0 chnl=0
|
|
||||||
char id=58 x=430 y=59 width=4 height=12 xoffset=1 yoffset=7 xadvance=6 page=0 chnl=0
|
|
||||||
char id=59 x=152 y=59 width=5 height=15 xoffset=0 yoffset=6 xadvance=6 page=0 chnl=0
|
|
||||||
char id=60 x=171 y=59 width=14 height=14 xoffset=1 yoffset=5 xadvance=16 page=0 chnl=0
|
|
||||||
char id=61 x=30 y=75 width=14 height=8 xoffset=1 yoffset=8 xadvance=16 page=0 chnl=0
|
|
||||||
char id=62 x=185 y=59 width=14 height=14 xoffset=1 yoffset=5 xadvance=16 page=0 chnl=0
|
|
||||||
char id=63 x=12 y=59 width=10 height=16 xoffset=0 yoffset=3 xadvance=10 page=0 chnl=0
|
|
||||||
char id=64 x=268 y=0 width=19 height=20 xoffset=0 yoffset=2 xadvance=19 page=0 chnl=0
|
|
||||||
char id=65 x=78 y=42 width=15 height=16 xoffset=-1 yoffset=3 xadvance=13 page=0 chnl=0
|
|
||||||
char id=66 x=93 y=42 width=12 height=16 xoffset=1 yoffset=3 xadvance=13 page=0 chnl=0
|
|
||||||
char id=67 x=105 y=42 width=13 height=16 xoffset=0 yoffset=3 xadvance=13 page=0 chnl=0
|
|
||||||
char id=68 x=118 y=42 width=14 height=16 xoffset=1 yoffset=3 xadvance=15 page=0 chnl=0
|
|
||||||
char id=69 x=132 y=42 width=11 height=16 xoffset=1 yoffset=3 xadvance=12 page=0 chnl=0
|
|
||||||
char id=70 x=143 y=42 width=10 height=16 xoffset=1 yoffset=3 xadvance=11 page=0 chnl=0
|
|
||||||
char id=71 x=153 y=42 width=14 height=16 xoffset=0 yoffset=3 xadvance=15 page=0 chnl=0
|
|
||||||
char id=72 x=167 y=42 width=13 height=16 xoffset=1 yoffset=3 xadvance=15 page=0 chnl=0
|
|
||||||
char id=73 x=504 y=22 width=4 height=16 xoffset=1 yoffset=3 xadvance=6 page=0 chnl=0
|
|
||||||
char id=74 x=233 y=0 width=7 height=20 xoffset=-2 yoffset=3 xadvance=6 page=0 chnl=0
|
|
||||||
char id=75 x=180 y=42 width=13 height=16 xoffset=1 yoffset=3 xadvance=13 page=0 chnl=0
|
|
||||||
char id=76 x=193 y=42 width=11 height=16 xoffset=1 yoffset=3 xadvance=11 page=0 chnl=0
|
|
||||||
char id=77 x=204 y=42 width=15 height=16 xoffset=1 yoffset=3 xadvance=17 page=0 chnl=0
|
|
||||||
char id=78 x=219 y=42 width=13 height=16 xoffset=1 yoffset=3 xadvance=15 page=0 chnl=0
|
|
||||||
char id=79 x=232 y=42 width=15 height=16 xoffset=0 yoffset=3 xadvance=15 page=0 chnl=0
|
|
||||||
char id=80 x=247 y=42 width=11 height=16 xoffset=1 yoffset=3 xadvance=11 page=0 chnl=0
|
|
||||||
char id=81 x=11 y=22 width=15 height=19 xoffset=0 yoffset=3 xadvance=15 page=0 chnl=0
|
|
||||||
char id=82 x=258 y=42 width=13 height=16 xoffset=1 yoffset=3 xadvance=13 page=0 chnl=0
|
|
||||||
char id=83 x=271 y=42 width=12 height=16 xoffset=0 yoffset=3 xadvance=12 page=0 chnl=0
|
|
||||||
char id=84 x=283 y=42 width=14 height=16 xoffset=-1 yoffset=3 xadvance=12 page=0 chnl=0
|
|
||||||
char id=85 x=297 y=42 width=13 height=16 xoffset=1 yoffset=3 xadvance=14 page=0 chnl=0
|
|
||||||
char id=86 x=310 y=42 width=15 height=16 xoffset=-1 yoffset=3 xadvance=13 page=0 chnl=0
|
|
||||||
char id=87 x=325 y=42 width=21 height=16 xoffset=-1 yoffset=3 xadvance=19 page=0 chnl=0
|
|
||||||
char id=88 x=346 y=42 width=15 height=16 xoffset=-1 yoffset=3 xadvance=13 page=0 chnl=0
|
|
||||||
char id=89 x=361 y=42 width=14 height=16 xoffset=-1 yoffset=3 xadvance=12 page=0 chnl=0
|
|
||||||
char id=90 x=375 y=42 width=13 height=16 xoffset=0 yoffset=3 xadvance=13 page=0 chnl=0
|
|
||||||
char id=91 x=254 y=0 width=7 height=20 xoffset=1 yoffset=2 xadvance=8 page=0 chnl=0
|
|
||||||
char id=92 x=60 y=22 width=9 height=18 xoffset=-1 yoffset=3 xadvance=6 page=0 chnl=0
|
|
||||||
char id=93 x=261 y=0 width=7 height=20 xoffset=0 yoffset=2 xadvance=7 page=0 chnl=0
|
|
||||||
char id=94 x=16 y=75 width=14 height=8 xoffset=1 yoffset=2 xadvance=16 page=0 chnl=0
|
|
||||||
char id=95 x=126 y=75 width=12 height=4 xoffset=-1 yoffset=20 xadvance=10 page=0 chnl=0
|
|
||||||
char id=96 x=100 y=75 width=8 height=6 xoffset=0 yoffset=1 xadvance=10 page=0 chnl=0
|
|
||||||
char id=97 x=255 y=59 width=11 height=13 xoffset=0 yoffset=6 xadvance=12 page=0 chnl=0
|
|
||||||
char id=98 x=308 y=22 width=11 height=17 xoffset=1 yoffset=2 xadvance=12 page=0 chnl=0
|
|
||||||
char id=99 x=266 y=59 width=10 height=13 xoffset=0 yoffset=6 xadvance=10 page=0 chnl=0
|
|
||||||
char id=100 x=319 y=22 width=11 height=17 xoffset=0 yoffset=2 xadvance=12 page=0 chnl=0
|
|
||||||
char id=101 x=276 y=59 width=12 height=13 xoffset=0 yoffset=6 xadvance=12 page=0 chnl=0
|
|
||||||
char id=102 x=330 y=22 width=9 height=17 xoffset=0 yoffset=2 xadvance=7 page=0 chnl=0
|
|
||||||
char id=103 x=339 y=22 width=11 height=17 xoffset=0 yoffset=6 xadvance=12 page=0 chnl=0
|
|
||||||
char id=104 x=350 y=22 width=11 height=17 xoffset=1 yoffset=2 xadvance=12 page=0 chnl=0
|
|
||||||
char id=105 x=361 y=22 width=4 height=17 xoffset=1 yoffset=2 xadvance=6 page=0 chnl=0
|
|
||||||
char id=106 x=39 y=0 width=6 height=21 xoffset=-1 yoffset=2 xadvance=6 page=0 chnl=0
|
|
||||||
char id=107 x=365 y=22 width=12 height=17 xoffset=1 yoffset=2 xadvance=11 page=0 chnl=0
|
|
||||||
char id=108 x=377 y=22 width=4 height=17 xoffset=1 yoffset=2 xadvance=6 page=0 chnl=0
|
|
||||||
char id=109 x=288 y=59 width=18 height=13 xoffset=1 yoffset=6 xadvance=19 page=0 chnl=0
|
|
||||||
char id=110 x=306 y=59 width=11 height=13 xoffset=1 yoffset=6 xadvance=12 page=0 chnl=0
|
|
||||||
char id=111 x=317 y=59 width=12 height=13 xoffset=0 yoffset=6 xadvance=12 page=0 chnl=0
|
|
||||||
char id=112 x=381 y=22 width=11 height=17 xoffset=1 yoffset=6 xadvance=12 page=0 chnl=0
|
|
||||||
char id=113 x=392 y=22 width=11 height=17 xoffset=0 yoffset=6 xadvance=12 page=0 chnl=0
|
|
||||||
char id=114 x=329 y=59 width=8 height=13 xoffset=1 yoffset=6 xadvance=9 page=0 chnl=0
|
|
||||||
char id=115 x=337 y=59 width=10 height=13 xoffset=0 yoffset=6 xadvance=10 page=0 chnl=0
|
|
||||||
char id=116 x=388 y=42 width=8 height=16 xoffset=0 yoffset=3 xadvance=8 page=0 chnl=0
|
|
||||||
char id=117 x=347 y=59 width=11 height=13 xoffset=1 yoffset=6 xadvance=13 page=0 chnl=0
|
|
||||||
char id=118 x=358 y=59 width=13 height=13 xoffset=-1 yoffset=6 xadvance=11 page=0 chnl=0
|
|
||||||
char id=119 x=371 y=59 width=17 height=13 xoffset=-1 yoffset=6 xadvance=16 page=0 chnl=0
|
|
||||||
char id=120 x=388 y=59 width=13 height=13 xoffset=-1 yoffset=6 xadvance=11 page=0 chnl=0
|
|
||||||
char id=121 x=403 y=22 width=13 height=17 xoffset=0 yoffset=6 xadvance=11 page=0 chnl=0
|
|
||||||
char id=122 x=401 y=59 width=10 height=13 xoffset=0 yoffset=6 xadvance=10 page=0 chnl=0
|
|
||||||
char id=123 x=45 y=0 width=10 height=21 xoffset=1 yoffset=2 xadvance=12 page=0 chnl=0
|
|
||||||
char id=124 x=22 y=0 width=4 height=22 xoffset=1 yoffset=2 xadvance=6 page=0 chnl=0
|
|
||||||
char id=125 x=55 y=0 width=10 height=21 xoffset=1 yoffset=2 xadvance=12 page=0 chnl=0
|
|
||||||
char id=126 x=79 y=75 width=14 height=7 xoffset=1 yoffset=8 xadvance=16 page=0 chnl=0
|
|
||||||
char id=160 x=0 y=0 width=0 height=0 xoffset=-1 yoffset=17 xadvance=6 page=0 chnl=0
|
|
||||||
char id=161 x=504 y=42 width=4 height=16 xoffset=2 yoffset=3 xadvance=8 page=0 chnl=0
|
|
||||||
char id=162 x=501 y=0 width=10 height=19 xoffset=1 yoffset=3 xadvance=12 page=0 chnl=0
|
|
||||||
char id=163 x=70 y=59 width=11 height=16 xoffset=0 yoffset=3 xadvance=12 page=0 chnl=0
|
|
||||||
char id=164 x=213 y=59 width=14 height=14 xoffset=-1 yoffset=5 xadvance=12 page=0 chnl=0
|
|
||||||
char id=165 x=81 y=59 width=14 height=16 xoffset=-1 yoffset=3 xadvance=12 page=0 chnl=0
|
|
||||||
char id=166 x=26 y=22 width=4 height=19 xoffset=1 yoffset=3 xadvance=6 page=0 chnl=0
|
|
||||||
char id=167 x=30 y=22 width=10 height=19 xoffset=0 yoffset=3 xadvance=10 page=0 chnl=0
|
|
||||||
char id=168 x=138 y=75 width=8 height=4 xoffset=1 yoffset=2 xadvance=10 page=0 chnl=0
|
|
||||||
char id=169 x=416 y=22 width=16 height=17 xoffset=2 yoffset=2 xadvance=20 page=0 chnl=0
|
|
||||||
char id=170 x=434 y=59 width=9 height=12 xoffset=-1 yoffset=3 xadvance=8 page=0 chnl=0
|
|
||||||
char id=171 x=443 y=59 width=11 height=12 xoffset=0 yoffset=6 xadvance=11 page=0 chnl=0
|
|
||||||
char id=172 x=44 y=75 width=15 height=8 xoffset=1 yoffset=8 xadvance=17 page=0 chnl=0
|
|
||||||
char id=173 x=119 y=75 width=7 height=4 xoffset=0 yoffset=10 xadvance=7 page=0 chnl=0
|
|
||||||
char id=174 x=432 y=22 width=16 height=17 xoffset=2 yoffset=2 xadvance=20 page=0 chnl=0
|
|
||||||
char id=175 x=146 y=75 width=8 height=4 xoffset=1 yoffset=2 xadvance=10 page=0 chnl=0
|
|
||||||
char id=176 x=59 y=75 width=8 height=8 xoffset=1 yoffset=3 xadvance=10 page=0 chnl=0
|
|
||||||
char id=177 x=227 y=59 width=14 height=14 xoffset=1 yoffset=5 xadvance=16 page=0 chnl=0
|
|
||||||
char id=178 x=500 y=59 width=7 height=10 xoffset=0 yoffset=3 xadvance=7 page=0 chnl=0
|
|
||||||
char id=179 x=0 y=75 width=8 height=10 xoffset=-1 yoffset=3 xadvance=7 page=0 chnl=0
|
|
||||||
char id=180 x=108 y=75 width=7 height=6 xoffset=2 yoffset=1 xadvance=10 page=0 chnl=0
|
|
||||||
char id=181 x=448 y=22 width=12 height=17 xoffset=1 yoffset=6 xadvance=13 page=0 chnl=0
|
|
||||||
char id=182 x=40 y=22 width=11 height=19 xoffset=0 yoffset=3 xadvance=12 page=0 chnl=0
|
|
||||||
char id=183 x=115 y=75 width=4 height=5 xoffset=1 yoffset=8 xadvance=6 page=0 chnl=0
|
|
||||||
char id=184 x=93 y=75 width=7 height=7 xoffset=1 yoffset=17 xadvance=10 page=0 chnl=0
|
|
||||||
char id=185 x=8 y=75 width=8 height=10 xoffset=-1 yoffset=3 xadvance=7 page=0 chnl=0
|
|
||||||
char id=186 x=454 y=59 width=10 height=12 xoffset=-1 yoffset=3 xadvance=9 page=0 chnl=0
|
|
||||||
char id=187 x=464 y=59 width=11 height=12 xoffset=1 yoffset=6 xadvance=12 page=0 chnl=0
|
|
||||||
char id=188 x=69 y=22 width=20 height=18 xoffset=-1 yoffset=2 xadvance=18 page=0 chnl=0
|
|
||||||
char id=189 x=89 y=22 width=19 height=18 xoffset=-1 yoffset=2 xadvance=18 page=0 chnl=0
|
|
||||||
char id=190 x=108 y=22 width=21 height=18 xoffset=-1 yoffset=2 xadvance=19 page=0 chnl=0
|
|
||||||
char id=191 x=95 y=59 width=10 height=16 xoffset=0 yoffset=3 xadvance=10 page=0 chnl=0
|
|
||||||
char id=192 x=311 y=0 width=15 height=20 xoffset=-1 yoffset=-1 xadvance=13 page=0 chnl=0
|
|
||||||
char id=193 x=326 y=0 width=15 height=20 xoffset=-1 yoffset=-1 xadvance=13 page=0 chnl=0
|
|
||||||
char id=194 x=341 y=0 width=15 height=20 xoffset=-1 yoffset=-1 xadvance=13 page=0 chnl=0
|
|
||||||
char id=195 x=65 y=0 width=16 height=21 xoffset=-2 yoffset=-2 xadvance=12 page=0 chnl=0
|
|
||||||
char id=196 x=356 y=0 width=16 height=20 xoffset=-1 yoffset=-1 xadvance=14 page=0 chnl=0
|
|
||||||
char id=197 x=81 y=0 width=15 height=21 xoffset=-1 yoffset=-2 xadvance=13 page=0 chnl=0
|
|
||||||
char id=198 x=105 y=59 width=20 height=16 xoffset=-2 yoffset=3 xadvance=18 page=0 chnl=0
|
|
||||||
char id=199 x=372 y=0 width=13 height=20 xoffset=0 yoffset=3 xadvance=13 page=0 chnl=0
|
|
||||||
char id=200 x=385 y=0 width=11 height=20 xoffset=1 yoffset=-1 xadvance=12 page=0 chnl=0
|
|
||||||
char id=201 x=396 y=0 width=11 height=20 xoffset=1 yoffset=-1 xadvance=12 page=0 chnl=0
|
|
||||||
char id=202 x=407 y=0 width=11 height=20 xoffset=1 yoffset=-1 xadvance=12 page=0 chnl=0
|
|
||||||
char id=203 x=418 y=0 width=11 height=20 xoffset=1 yoffset=-1 xadvance=12 page=0 chnl=0
|
|
||||||
char id=204 x=429 y=0 width=7 height=20 xoffset=-1 yoffset=-1 xadvance=6 page=0 chnl=0
|
|
||||||
char id=205 x=436 y=0 width=7 height=20 xoffset=0 yoffset=-1 xadvance=6 page=0 chnl=0
|
|
||||||
char id=206 x=443 y=0 width=8 height=20 xoffset=-1 yoffset=-1 xadvance=6 page=0 chnl=0
|
|
||||||
char id=207 x=451 y=0 width=8 height=20 xoffset=0 yoffset=-1 xadvance=7 page=0 chnl=0
|
|
||||||
char id=208 x=125 y=59 width=16 height=16 xoffset=0 yoffset=3 xadvance=16 page=0 chnl=0
|
|
||||||
char id=209 x=96 y=0 width=13 height=21 xoffset=1 yoffset=-2 xadvance=15 page=0 chnl=0
|
|
||||||
char id=210 x=109 y=0 width=15 height=21 xoffset=0 yoffset=-2 xadvance=15 page=0 chnl=0
|
|
||||||
char id=211 x=124 y=0 width=15 height=21 xoffset=0 yoffset=-2 xadvance=15 page=0 chnl=0
|
|
||||||
char id=212 x=139 y=0 width=15 height=21 xoffset=0 yoffset=-2 xadvance=15 page=0 chnl=0
|
|
||||||
char id=213 x=154 y=0 width=15 height=21 xoffset=0 yoffset=-2 xadvance=15 page=0 chnl=0
|
|
||||||
char id=214 x=459 y=0 width=15 height=20 xoffset=0 yoffset=-1 xadvance=15 page=0 chnl=0
|
|
||||||
char id=215 x=241 y=59 width=14 height=14 xoffset=1 yoffset=5 xadvance=16 page=0 chnl=0
|
|
||||||
char id=216 x=129 y=22 width=16 height=18 xoffset=-1 yoffset=2 xadvance=15 page=0 chnl=0
|
|
||||||
char id=217 x=169 y=0 width=13 height=21 xoffset=1 yoffset=-2 xadvance=14 page=0 chnl=0
|
|
||||||
char id=218 x=182 y=0 width=13 height=21 xoffset=1 yoffset=-2 xadvance=14 page=0 chnl=0
|
|
||||||
char id=219 x=195 y=0 width=13 height=21 xoffset=1 yoffset=-2 xadvance=14 page=0 chnl=0
|
|
||||||
char id=220 x=474 y=0 width=13 height=20 xoffset=1 yoffset=-1 xadvance=14 page=0 chnl=0
|
|
||||||
char id=221 x=487 y=0 width=14 height=20 xoffset=-1 yoffset=-1 xadvance=12 page=0 chnl=0
|
|
||||||
char id=222 x=141 y=59 width=11 height=16 xoffset=1 yoffset=3 xadvance=11 page=0 chnl=0
|
|
||||||
char id=223 x=460 y=22 width=12 height=17 xoffset=1 yoffset=2 xadvance=13 page=0 chnl=0
|
|
||||||
char id=224 x=145 y=22 width=11 height=18 xoffset=0 yoffset=1 xadvance=12 page=0 chnl=0
|
|
||||||
char id=225 x=156 y=22 width=11 height=18 xoffset=0 yoffset=1 xadvance=12 page=0 chnl=0
|
|
||||||
char id=226 x=167 y=22 width=11 height=18 xoffset=0 yoffset=1 xadvance=12 page=0 chnl=0
|
|
||||||
char id=227 x=472 y=22 width=11 height=17 xoffset=0 yoffset=2 xadvance=12 page=0 chnl=0
|
|
||||||
char id=228 x=483 y=22 width=11 height=17 xoffset=0 yoffset=2 xadvance=12 page=0 chnl=0
|
|
||||||
char id=229 x=0 y=22 width=11 height=20 xoffset=0 yoffset=-1 xadvance=12 page=0 chnl=0
|
|
||||||
char id=230 x=411 y=59 width=19 height=13 xoffset=0 yoffset=6 xadvance=19 page=0 chnl=0
|
|
||||||
char id=231 x=494 y=22 width=10 height=17 xoffset=0 yoffset=6 xadvance=10 page=0 chnl=0
|
|
||||||
char id=232 x=178 y=22 width=12 height=18 xoffset=0 yoffset=1 xadvance=12 page=0 chnl=0
|
|
||||||
char id=233 x=190 y=22 width=12 height=18 xoffset=0 yoffset=1 xadvance=12 page=0 chnl=0
|
|
||||||
char id=234 x=202 y=22 width=12 height=18 xoffset=0 yoffset=1 xadvance=12 page=0 chnl=0
|
|
||||||
char id=235 x=0 y=42 width=12 height=17 xoffset=0 yoffset=2 xadvance=12 page=0 chnl=0
|
|
||||||
char id=236 x=214 y=22 width=8 height=18 xoffset=-2 yoffset=1 xadvance=6 page=0 chnl=0
|
|
||||||
char id=237 x=222 y=22 width=8 height=18 xoffset=0 yoffset=1 xadvance=6 page=0 chnl=0
|
|
||||||
char id=238 x=230 y=22 width=9 height=18 xoffset=-2 yoffset=1 xadvance=6 page=0 chnl=0
|
|
||||||
char id=239 x=12 y=42 width=8 height=17 xoffset=-1 yoffset=2 xadvance=6 page=0 chnl=0
|
|
||||||
char id=240 x=20 y=42 width=12 height=17 xoffset=0 yoffset=2 xadvance=12 page=0 chnl=0
|
|
||||||
char id=241 x=32 y=42 width=11 height=17 xoffset=1 yoffset=2 xadvance=12 page=0 chnl=0
|
|
||||||
char id=242 x=239 y=22 width=12 height=18 xoffset=0 yoffset=1 xadvance=12 page=0 chnl=0
|
|
||||||
char id=243 x=251 y=22 width=12 height=18 xoffset=0 yoffset=1 xadvance=12 page=0 chnl=0
|
|
||||||
char id=244 x=263 y=22 width=12 height=18 xoffset=0 yoffset=1 xadvance=12 page=0 chnl=0
|
|
||||||
char id=245 x=43 y=42 width=12 height=17 xoffset=0 yoffset=2 xadvance=12 page=0 chnl=0
|
|
||||||
char id=246 x=55 y=42 width=12 height=17 xoffset=0 yoffset=2 xadvance=12 page=0 chnl=0
|
|
||||||
char id=247 x=475 y=59 width=14 height=12 xoffset=1 yoffset=6 xadvance=16 page=0 chnl=0
|
|
||||||
char id=248 x=157 y=59 width=14 height=15 xoffset=-1 yoffset=5 xadvance=12 page=0 chnl=0
|
|
||||||
char id=249 x=275 y=22 width=11 height=18 xoffset=1 yoffset=1 xadvance=13 page=0 chnl=0
|
|
||||||
char id=250 x=286 y=22 width=11 height=18 xoffset=1 yoffset=1 xadvance=13 page=0 chnl=0
|
|
||||||
char id=251 x=297 y=22 width=11 height=18 xoffset=1 yoffset=1 xadvance=13 page=0 chnl=0
|
|
||||||
char id=252 x=67 y=42 width=11 height=17 xoffset=1 yoffset=2 xadvance=13 page=0 chnl=0
|
|
||||||
char id=253 x=26 y=0 width=13 height=22 xoffset=0 yoffset=1 xadvance=11 page=0 chnl=0
|
|
||||||
char id=254 x=208 y=0 width=11 height=21 xoffset=1 yoffset=2 xadvance=12 page=0 chnl=0
|
|
||||||
char id=255 x=219 y=0 width=14 height=21 xoffset=-1 yoffset=2 xadvance=12 page=0 chnl=0
|
|
||||||
kernings count=615
|
|
||||||
kerning first=65 second=171 amount=-1
|
|
||||||
kerning first=194 second=87 amount=-1
|
|
||||||
kerning first=86 second=58 amount=-2
|
|
||||||
kerning first=89 second=229 amount=-3
|
|
||||||
kerning first=196 second=65 amount=1
|
|
||||||
kerning first=45 second=66 amount=-1
|
|
||||||
kerning first=221 second=67 amount=-1
|
|
||||||
kerning first=45 second=71 amount=1
|
|
||||||
kerning first=187 second=88 amount=-1
|
|
||||||
kerning first=45 second=74 amount=1
|
|
||||||
kerning first=221 second=79 amount=-1
|
|
||||||
kerning first=45 second=81 amount=1
|
|
||||||
kerning first=65 second=84 amount=-1
|
|
||||||
kerning first=76 second=85 amount=-1
|
|
||||||
kerning first=45 second=86 amount=-1
|
|
||||||
kerning first=66 second=87 amount=-1
|
|
||||||
kerning first=45 second=88 amount=-1
|
|
||||||
kerning first=82 second=89 amount=-1
|
|
||||||
kerning first=65 second=192 amount=1
|
|
||||||
kerning first=84 second=97 amount=-3
|
|
||||||
kerning first=221 second=101 amount=-3
|
|
||||||
kerning first=65 second=102 amount=-1
|
|
||||||
kerning first=70 second=105 amount=-1
|
|
||||||
kerning first=89 second=250 amount=-2
|
|
||||||
kerning first=89 second=117 amount=-2
|
|
||||||
kerning first=192 second=119 amount=-1
|
|
||||||
kerning first=243 second=120 amount=-1
|
|
||||||
kerning first=82 second=253 amount=-1
|
|
||||||
kerning first=84 second=121 amount=-3
|
|
||||||
kerning first=76 second=217 amount=-1
|
|
||||||
kerning first=84 second=187 amount=-1
|
|
||||||
kerning first=192 second=193 amount=1
|
|
||||||
kerning first=65 second=194 amount=1
|
|
||||||
kerning first=221 second=196 amount=-1
|
|
||||||
kerning first=171 second=198 amount=1
|
|
||||||
kerning first=89 second=252 amount=-2
|
|
||||||
kerning first=75 second=210 amount=-1
|
|
||||||
kerning first=76 second=211 amount=-1
|
|
||||||
kerning first=75 second=212 amount=-1
|
|
||||||
kerning first=89 second=225 amount=-3
|
|
||||||
kerning first=84 second=228 amount=-2
|
|
||||||
kerning first=75 second=45 amount=-2
|
|
||||||
kerning first=84 second=231 amount=-3
|
|
||||||
kerning first=75 second=233 amount=-1
|
|
||||||
kerning first=87 second=234 amount=-1
|
|
||||||
kerning first=120 second=235 amount=-1
|
|
||||||
kerning first=80 second=244 amount=-1
|
|
||||||
kerning first=87 second=245 amount=-1
|
|
||||||
kerning first=120 second=246 amount=-1
|
|
||||||
kerning first=86 second=249 amount=-1
|
|
||||||
kerning first=192 second=253 amount=-1
|
|
||||||
kerning first=82 second=67 amount=-1
|
|
||||||
kerning first=221 second=213 amount=-1
|
|
||||||
kerning first=120 second=245 amount=-1
|
|
||||||
kerning first=87 second=111 amount=-1
|
|
||||||
kerning first=84 second=196 amount=-1
|
|
||||||
kerning first=195 second=65 amount=1
|
|
||||||
kerning first=89 second=210 amount=-1
|
|
||||||
kerning first=65 second=119 amount=-1
|
|
||||||
kerning first=192 second=121 amount=-1
|
|
||||||
kerning first=75 second=84 amount=-1
|
|
||||||
kerning first=79 second=46 amount=-1
|
|
||||||
kerning first=82 second=249 amount=-1
|
|
||||||
kerning first=80 second=101 amount=-1
|
|
||||||
kerning first=76 second=213 amount=-1
|
|
||||||
kerning first=221 second=243 amount=-3
|
|
||||||
kerning first=80 second=243 amount=-1
|
|
||||||
kerning first=70 second=225 amount=-2
|
|
||||||
kerning first=107 second=111 amount=-1
|
|
||||||
kerning first=75 second=235 amount=-1
|
|
||||||
kerning first=86 second=45 amount=-1
|
|
||||||
kerning first=87 second=242 amount=-1
|
|
||||||
kerning first=120 second=111 amount=-1
|
|
||||||
kerning first=107 second=249 amount=-1
|
|
||||||
kerning first=86 second=225 amount=-1
|
|
||||||
kerning first=193 second=84 amount=-1
|
|
||||||
kerning first=196 second=118 amount=-1
|
|
||||||
kerning first=75 second=250 amount=-1
|
|
||||||
kerning first=221 second=214 amount=-1
|
|
||||||
kerning first=195 second=119 amount=-1
|
|
||||||
kerning first=70 second=246 amount=-1
|
|
||||||
kerning first=87 second=194 amount=-1
|
|
||||||
kerning first=192 second=194 amount=1
|
|
||||||
kerning first=89 second=233 amount=-3
|
|
||||||
kerning first=120 second=244 amount=-1
|
|
||||||
kerning first=84 second=244 amount=-2
|
|
||||||
kerning first=76 second=121 amount=-2
|
|
||||||
kerning first=84 second=225 amount=-3
|
|
||||||
kerning first=76 second=219 amount=-1
|
|
||||||
kerning first=211 second=221 amount=-1
|
|
||||||
kerning first=195 second=192 amount=1
|
|
||||||
kerning first=107 second=253 amount=-1
|
|
||||||
kerning first=86 second=235 amount=-1
|
|
||||||
kerning first=86 second=250 amount=-1
|
|
||||||
kerning first=80 second=97 amount=-1
|
|
||||||
kerning first=221 second=97 amount=-3
|
|
||||||
kerning first=196 second=253 amount=-1
|
|
||||||
kerning first=82 second=234 amount=-1
|
|
||||||
kerning first=221 second=199 amount=-1
|
|
||||||
kerning first=196 second=171 amount=-1
|
|
||||||
kerning first=70 second=250 amount=-1
|
|
||||||
kerning first=86 second=227 amount=-1
|
|
||||||
kerning first=82 second=192 amount=-1
|
|
||||||
kerning first=187 second=192 amount=-1
|
|
||||||
kerning first=107 second=245 amount=-1
|
|
||||||
kerning first=193 second=65 amount=1
|
|
||||||
kerning first=84 second=117 amount=-3
|
|
||||||
kerning first=221 second=224 amount=-3
|
|
||||||
kerning first=80 second=224 amount=-1
|
|
||||||
kerning first=65 second=121 amount=-1
|
|
||||||
kerning first=89 second=235 amount=-3
|
|
||||||
kerning first=71 second=84 amount=-1
|
|
||||||
kerning first=45 second=87 amount=-1
|
|
||||||
kerning first=87 second=58 amount=-1
|
|
||||||
kerning first=89 second=212 amount=-1
|
|
||||||
kerning first=84 second=171 amount=-2
|
|
||||||
kerning first=187 second=195 amount=-1
|
|
||||||
kerning first=195 second=196 amount=1
|
|
||||||
kerning first=121 second=46 amount=-3
|
|
||||||
kerning first=89 second=199 amount=-1
|
|
||||||
kerning first=213 second=45 amount=1
|
|
||||||
kerning first=107 second=255 amount=-1
|
|
||||||
kerning first=45 second=89 amount=-2
|
|
||||||
kerning first=79 second=88 amount=-1
|
|
||||||
kerning first=187 second=84 amount=-2
|
|
||||||
kerning first=82 second=84 amount=-1
|
|
||||||
kerning first=187 second=193 amount=-1
|
|
||||||
kerning first=195 second=86 amount=-1
|
|
||||||
kerning first=196 second=193 amount=1
|
|
||||||
kerning first=65 second=221 amount=-1
|
|
||||||
kerning first=75 second=214 amount=-1
|
|
||||||
kerning first=84 second=246 amount=-2
|
|
||||||
kerning first=222 second=46 amount=-1
|
|
||||||
kerning first=195 second=121 amount=-1
|
|
||||||
kerning first=193 second=195 amount=1
|
|
||||||
kerning first=45 second=79 amount=1
|
|
||||||
kerning first=80 second=193 amount=-1
|
|
||||||
kerning first=253 second=58 amount=-1
|
|
||||||
kerning first=221 second=193 amount=-1
|
|
||||||
kerning first=171 second=89 amount=-1
|
|
||||||
kerning first=82 second=255 amount=-1
|
|
||||||
kerning first=86 second=229 amount=-1
|
|
||||||
kerning first=87 second=244 amount=-1
|
|
||||||
kerning first=194 second=192 amount=1
|
|
||||||
kerning first=193 second=193 amount=1
|
|
||||||
kerning first=89 second=79 amount=-1
|
|
||||||
kerning first=193 second=253 amount=-1
|
|
||||||
kerning first=210 second=45 amount=1
|
|
||||||
kerning first=192 second=171 amount=-1
|
|
||||||
kerning first=87 second=171 amount=-1
|
|
||||||
kerning first=45 second=210 amount=1
|
|
||||||
kerning first=195 second=194 amount=1
|
|
||||||
kerning first=88 second=67 amount=-1
|
|
||||||
kerning first=194 second=89 amount=-1
|
|
||||||
kerning first=87 second=246 amount=-1
|
|
||||||
kerning first=70 second=117 amount=-1
|
|
||||||
kerning first=82 second=232 amount=-1
|
|
||||||
kerning first=214 second=221 amount=-1
|
|
||||||
kerning first=82 second=86 amount=-1
|
|
||||||
kerning first=187 second=86 amount=-2
|
|
||||||
kerning first=221 second=105 amount=-1
|
|
||||||
kerning first=82 second=46 amount=-1
|
|
||||||
kerning first=75 second=252 amount=-1
|
|
||||||
kerning first=89 second=187 amount=-1
|
|
||||||
kerning first=211 second=88 amount=-1
|
|
||||||
kerning first=196 second=194 amount=1
|
|
||||||
kerning first=86 second=101 amount=-1
|
|
||||||
kerning first=70 second=233 amount=-1
|
|
||||||
kerning first=221 second=226 amount=-3
|
|
||||||
kerning first=80 second=65 amount=-1
|
|
||||||
kerning first=221 second=65 amount=-1
|
|
||||||
kerning first=80 second=226 amount=-1
|
|
||||||
kerning first=87 second=196 amount=-1
|
|
||||||
kerning first=192 second=196 amount=1
|
|
||||||
kerning first=102 second=46 amount=-1
|
|
||||||
kerning first=89 second=101 amount=-3
|
|
||||||
kerning first=70 second=234 amount=-1
|
|
||||||
kerning first=80 second=229 amount=-1
|
|
||||||
kerning first=214 second=88 amount=-1
|
|
||||||
kerning first=86 second=244 amount=-1
|
|
||||||
kerning first=221 second=251 amount=-2
|
|
||||||
kerning first=86 second=252 amount=-1
|
|
||||||
kerning first=214 second=45 amount=1
|
|
||||||
kerning first=76 second=84 amount=-3
|
|
||||||
kerning first=84 second=67 amount=-1
|
|
||||||
kerning first=75 second=101 amount=-1
|
|
||||||
kerning first=75 second=79 amount=-1
|
|
||||||
kerning first=84 second=111 amount=-3
|
|
||||||
kerning first=88 second=213 amount=-1
|
|
||||||
kerning first=84 second=58 amount=-2
|
|
||||||
kerning first=221 second=228 amount=-3
|
|
||||||
kerning first=80 second=228 amount=-1
|
|
||||||
kerning first=66 second=89 amount=-1
|
|
||||||
kerning first=75 second=121 amount=-1
|
|
||||||
kerning first=88 second=235 amount=-1
|
|
||||||
kerning first=82 second=242 amount=-1
|
|
||||||
kerning first=221 second=252 amount=-2
|
|
||||||
kerning first=194 second=121 amount=-1
|
|
||||||
kerning first=82 second=196 amount=-1
|
|
||||||
kerning first=187 second=196 amount=-1
|
|
||||||
kerning first=84 second=45 amount=-2
|
|
||||||
kerning first=89 second=192 amount=-1
|
|
||||||
kerning first=84 second=233 amount=-3
|
|
||||||
kerning first=89 second=195 amount=-1
|
|
||||||
kerning first=194 second=195 amount=1
|
|
||||||
kerning first=87 second=227 amount=-1
|
|
||||||
kerning first=107 second=242 amount=-1
|
|
||||||
kerning first=195 second=84 amount=-1
|
|
||||||
kerning first=84 second=253 amount=-3
|
|
||||||
kerning first=75 second=221 amount=-1
|
|
||||||
kerning first=88 second=232 amount=-1
|
|
||||||
kerning first=86 second=224 amount=-1
|
|
||||||
kerning first=196 second=89 amount=-1
|
|
||||||
kerning first=84 second=114 amount=-3
|
|
||||||
kerning first=87 second=117 amount=-1
|
|
||||||
kerning first=75 second=245 amount=-1
|
|
||||||
kerning first=120 second=234 amount=-1
|
|
||||||
kerning first=107 second=117 amount=-1
|
|
||||||
kerning first=193 second=89 amount=-1
|
|
||||||
kerning first=213 second=221 amount=-1
|
|
||||||
kerning first=76 second=87 amount=-2
|
|
||||||
kerning first=107 second=243 amount=-1
|
|
||||||
kerning first=82 second=243 amount=-1
|
|
||||||
kerning first=45 second=221 amount=-2
|
|
||||||
kerning first=221 second=249 amount=-2
|
|
||||||
kerning first=193 second=192 amount=1
|
|
||||||
kerning first=84 second=193 amount=-1
|
|
||||||
kerning first=84 second=250 amount=-3
|
|
||||||
kerning first=84 second=234 amount=-3
|
|
||||||
kerning first=45 second=211 amount=1
|
|
||||||
kerning first=192 second=221 amount=-1
|
|
||||||
kerning first=82 second=199 amount=-1
|
|
||||||
kerning first=89 second=214 amount=-1
|
|
||||||
kerning first=76 second=221 amount=-3
|
|
||||||
kerning first=75 second=244 amount=-1
|
|
||||||
kerning first=89 second=58 amount=-3
|
|
||||||
kerning first=75 second=220 amount=-1
|
|
||||||
kerning first=82 second=117 amount=-1
|
|
||||||
kerning first=192 second=87 amount=-1
|
|
||||||
kerning first=70 second=196 amount=-2
|
|
||||||
kerning first=211 second=45 amount=1
|
|
||||||
kerning first=87 second=229 amount=-1
|
|
||||||
kerning first=70 second=114 amount=-1
|
|
||||||
kerning first=107 second=251 amount=-1
|
|
||||||
kerning first=87 second=233 amount=-1
|
|
||||||
kerning first=89 second=194 amount=-1
|
|
||||||
kerning first=194 second=194 amount=1
|
|
||||||
kerning first=86 second=245 amount=-1
|
|
||||||
kerning first=193 second=119 amount=-1
|
|
||||||
kerning first=194 second=102 amount=-1
|
|
||||||
kerning first=82 second=111 amount=-1
|
|
||||||
kerning first=196 second=192 amount=1
|
|
||||||
kerning first=221 second=245 amount=-3
|
|
||||||
kerning first=193 second=196 amount=1
|
|
||||||
kerning first=89 second=224 amount=-3
|
|
||||||
kerning first=193 second=86 amount=-1
|
|
||||||
kerning first=208 second=221 amount=-1
|
|
||||||
kerning first=82 second=246 amount=-1
|
|
||||||
kerning first=221 second=235 amount=-3
|
|
||||||
kerning first=80 second=235 amount=-1
|
|
||||||
kerning first=195 second=87 amount=-1
|
|
||||||
kerning first=221 second=212 amount=-1
|
|
||||||
kerning first=255 second=58 amount=-1
|
|
||||||
kerning first=75 second=171 amount=-1
|
|
||||||
kerning first=86 second=195 amount=-1
|
|
||||||
kerning first=89 second=234 amount=-3
|
|
||||||
kerning first=81 second=45 amount=1
|
|
||||||
kerning first=192 second=65 amount=1
|
|
||||||
kerning first=221 second=45 amount=-2
|
|
||||||
kerning first=213 second=89 amount=-1
|
|
||||||
kerning first=70 second=227 amount=-2
|
|
||||||
kerning first=89 second=244 amount=-3
|
|
||||||
kerning first=86 second=255 amount=-1
|
|
||||||
kerning first=86 second=65 amount=-1
|
|
||||||
kerning first=221 second=225 amount=-3
|
|
||||||
kerning first=80 second=225 amount=-1
|
|
||||||
kerning first=75 second=85 amount=-1
|
|
||||||
kerning first=82 second=193 amount=-1
|
|
||||||
kerning first=76 second=253 amount=-2
|
|
||||||
kerning first=194 second=171 amount=-1
|
|
||||||
kerning first=89 second=171 amount=-2
|
|
||||||
kerning first=194 second=86 amount=-1
|
|
||||||
kerning first=86 second=251 amount=-1
|
|
||||||
kerning first=84 second=194 amount=-1
|
|
||||||
kerning first=210 second=46 amount=-1
|
|
||||||
kerning first=196 second=255 amount=-1
|
|
||||||
kerning first=70 second=111 amount=-1
|
|
||||||
kerning first=120 second=233 amount=-1
|
|
||||||
kerning first=84 second=115 amount=-3
|
|
||||||
kerning first=114 second=45 amount=-1
|
|
||||||
kerning first=194 second=221 amount=-1
|
|
||||||
kerning first=45 second=118 amount=-1
|
|
||||||
kerning first=89 second=196 amount=-1
|
|
||||||
kerning first=221 second=232 amount=-3
|
|
||||||
kerning first=114 second=171 amount=-1
|
|
||||||
kerning first=65 second=87 amount=-1
|
|
||||||
kerning first=88 second=199 amount=-1
|
|
||||||
kerning first=245 second=120 amount=-1
|
|
||||||
kerning first=75 second=251 amount=-1
|
|
||||||
kerning first=192 second=102 amount=-1
|
|
||||||
kerning first=70 second=101 amount=-1
|
|
||||||
kerning first=70 second=121 amount=-2
|
|
||||||
kerning first=196 second=119 amount=-1
|
|
||||||
kerning first=196 second=86 amount=-1
|
|
||||||
kerning first=89 second=105 amount=-1
|
|
||||||
kerning first=75 second=218 amount=-1
|
|
||||||
kerning first=80 second=46 amount=-3
|
|
||||||
kerning first=221 second=46 amount=-4
|
|
||||||
kerning first=70 second=58 amount=-1
|
|
||||||
kerning first=89 second=45 amount=-2
|
|
||||||
kerning first=212 second=46 amount=-1
|
|
||||||
kerning first=84 second=227 amount=-2
|
|
||||||
kerning first=70 second=194 amount=-2
|
|
||||||
kerning first=80 second=192 amount=-1
|
|
||||||
kerning first=221 second=192 amount=-1
|
|
||||||
kerning first=89 second=211 amount=-1
|
|
||||||
kerning first=45 second=214 amount=1
|
|
||||||
kerning first=107 second=246 amount=-1
|
|
||||||
kerning first=66 second=86 amount=-1
|
|
||||||
kerning first=87 second=250 amount=-1
|
|
||||||
kerning first=210 second=89 amount=-1
|
|
||||||
kerning first=76 second=220 amount=-1
|
|
||||||
kerning first=89 second=65 amount=-1
|
|
||||||
kerning first=194 second=65 amount=1
|
|
||||||
kerning first=222 second=58 amount=-1
|
|
||||||
kerning first=82 second=252 amount=-1
|
|
||||||
kerning first=193 second=121 amount=-1
|
|
||||||
kerning first=192 second=195 amount=1
|
|
||||||
kerning first=87 second=195 amount=-1
|
|
||||||
kerning first=84 second=199 amount=-1
|
|
||||||
kerning first=87 second=97 amount=-1
|
|
||||||
kerning first=187 second=66 amount=-1
|
|
||||||
kerning first=171 second=86 amount=-1
|
|
||||||
kerning first=82 second=45 amount=-1
|
|
||||||
kerning first=118 second=45 amount=-1
|
|
||||||
kerning first=89 second=251 amount=-2
|
|
||||||
kerning first=75 second=67 amount=-1
|
|
||||||
kerning first=86 second=232 amount=-1
|
|
||||||
kerning first=84 second=101 amount=-3
|
|
||||||
kerning first=120 second=101 amount=-1
|
|
||||||
kerning first=192 second=118 amount=-1
|
|
||||||
kerning first=107 second=250 amount=-1
|
|
||||||
kerning first=196 second=84 amount=-1
|
|
||||||
kerning first=65 second=193 amount=1
|
|
||||||
kerning first=75 second=111 amount=-1
|
|
||||||
kerning first=70 second=245 amount=-1
|
|
||||||
kerning first=70 second=224 amount=-2
|
|
||||||
kerning first=80 second=196 amount=-1
|
|
||||||
kerning first=89 second=228 amount=-3
|
|
||||||
kerning first=86 second=234 amount=-1
|
|
||||||
kerning first=75 second=211 amount=-1
|
|
||||||
kerning first=86 second=253 amount=-1
|
|
||||||
kerning first=84 second=99 amount=-3
|
|
||||||
kerning first=107 second=252 amount=-1
|
|
||||||
kerning first=195 second=193 amount=1
|
|
||||||
kerning first=196 second=196 amount=1
|
|
||||||
kerning first=86 second=46 amount=-2
|
|
||||||
kerning first=102 second=58 amount=-1
|
|
||||||
kerning first=82 second=87 amount=-1
|
|
||||||
kerning first=187 second=87 amount=-1
|
|
||||||
kerning first=75 second=253 amount=-1
|
|
||||||
kerning first=120 second=243 amount=-1
|
|
||||||
kerning first=187 second=89 amount=-2
|
|
||||||
kerning first=221 second=242 amount=-3
|
|
||||||
kerning first=80 second=242 amount=-1
|
|
||||||
kerning first=45 second=84 amount=-2
|
|
||||||
kerning first=76 second=214 amount=-1
|
|
||||||
kerning first=221 second=233 amount=-3
|
|
||||||
kerning first=221 second=195 amount=-1
|
|
||||||
kerning first=171 second=221 amount=-1
|
|
||||||
kerning first=66 second=221 amount=-1
|
|
||||||
kerning first=196 second=121 amount=-1
|
|
||||||
kerning first=82 second=250 amount=-1
|
|
||||||
kerning first=82 second=233 amount=-1
|
|
||||||
kerning first=196 second=102 amount=-1
|
|
||||||
kerning first=76 second=212 amount=-1
|
|
||||||
kerning first=221 second=117 amount=-2
|
|
||||||
kerning first=79 second=89 amount=-1
|
|
||||||
kerning first=70 second=226 amount=-2
|
|
||||||
kerning first=76 second=218 amount=-1
|
|
||||||
kerning first=195 second=253 amount=-1
|
|
||||||
kerning first=84 second=243 amount=-3
|
|
||||||
kerning first=88 second=79 amount=-1
|
|
||||||
kerning first=89 second=111 amount=-3
|
|
||||||
kerning first=84 second=224 amount=-2
|
|
||||||
kerning first=87 second=193 amount=-1
|
|
||||||
kerning first=75 second=255 amount=-1
|
|
||||||
kerning first=89 second=249 amount=-2
|
|
||||||
kerning first=89 second=67 amount=-1
|
|
||||||
kerning first=89 second=227 amount=-3
|
|
||||||
kerning first=193 second=255 amount=-1
|
|
||||||
kerning first=246 second=120 amount=-1
|
|
||||||
kerning first=75 second=234 amount=-1
|
|
||||||
kerning first=192 second=84 amount=-1
|
|
||||||
kerning first=87 second=101 amount=-1
|
|
||||||
kerning first=107 second=233 amount=-1
|
|
||||||
kerning first=84 second=195 amount=-1
|
|
||||||
kerning first=87 second=243 amount=-1
|
|
||||||
kerning first=213 second=46 amount=-1
|
|
||||||
kerning first=75 second=249 amount=-1
|
|
||||||
kerning first=221 second=58 amount=-3
|
|
||||||
kerning first=119 second=46 amount=-2
|
|
||||||
kerning first=79 second=45 amount=1
|
|
||||||
kerning first=194 second=253 amount=-1
|
|
||||||
kerning first=86 second=171 amount=-2
|
|
||||||
kerning first=68 second=89 amount=-1
|
|
||||||
kerning first=80 second=194 amount=-1
|
|
||||||
kerning first=221 second=194 amount=-1
|
|
||||||
kerning first=242 second=120 amount=-1
|
|
||||||
kerning first=195 second=255 amount=-1
|
|
||||||
kerning first=84 second=226 amount=-2
|
|
||||||
kerning first=210 second=88 amount=-1
|
|
||||||
kerning first=89 second=245 amount=-3
|
|
||||||
kerning first=70 second=65 amount=-2
|
|
||||||
kerning first=70 second=97 amount=-2
|
|
||||||
kerning first=70 second=228 amount=-2
|
|
||||||
kerning first=107 second=235 amount=-1
|
|
||||||
kerning first=221 second=229 amount=-3
|
|
||||||
kerning first=80 second=233 amount=-1
|
|
||||||
kerning first=66 second=171 amount=-1
|
|
||||||
kerning first=86 second=194 amount=-1
|
|
||||||
kerning first=87 second=114 amount=-1
|
|
||||||
kerning first=213 second=88 amount=-1
|
|
||||||
kerning first=221 second=234 amount=-3
|
|
||||||
kerning first=80 second=234 amount=-1
|
|
||||||
kerning first=84 second=105 amount=-1
|
|
||||||
kerning first=70 second=251 amount=-1
|
|
||||||
kerning first=194 second=255 amount=-1
|
|
||||||
kerning first=82 second=235 amount=-1
|
|
||||||
kerning first=194 second=118 amount=-1
|
|
||||||
kerning first=120 second=242 amount=-1
|
|
||||||
kerning first=87 second=224 amount=-1
|
|
||||||
kerning first=221 second=171 amount=-2
|
|
||||||
kerning first=70 second=195 amount=-2
|
|
||||||
kerning first=195 second=171 amount=-1
|
|
||||||
kerning first=114 second=46 amount=-2
|
|
||||||
kerning first=255 second=46 amount=-3
|
|
||||||
kerning first=76 second=210 amount=-1
|
|
||||||
kerning first=86 second=192 amount=-1
|
|
||||||
kerning first=84 second=65 amount=-1
|
|
||||||
kerning first=70 second=193 amount=-2
|
|
||||||
kerning first=70 second=253 amount=-2
|
|
||||||
kerning first=87 second=45 amount=-1
|
|
||||||
kerning first=194 second=84 amount=-1
|
|
||||||
kerning first=195 second=118 amount=-1
|
|
||||||
kerning first=75 second=89 amount=-1
|
|
||||||
kerning first=89 second=232 amount=-3
|
|
||||||
kerning first=71 second=89 amount=-1
|
|
||||||
kerning first=212 second=89 amount=-1
|
|
||||||
kerning first=65 second=118 amount=-1
|
|
||||||
kerning first=84 second=251 amount=-3
|
|
||||||
kerning first=87 second=226 amount=-1
|
|
||||||
kerning first=196 second=221 amount=-1
|
|
||||||
kerning first=119 second=58 amount=-1
|
|
||||||
kerning first=212 second=88 amount=-1
|
|
||||||
kerning first=89 second=46 amount=-4
|
|
||||||
kerning first=210 second=221 amount=-1
|
|
||||||
kerning first=86 second=242 amount=-1
|
|
||||||
kerning first=195 second=89 amount=-1
|
|
||||||
kerning first=193 second=102 amount=-1
|
|
||||||
kerning first=75 second=217 amount=-1
|
|
||||||
kerning first=221 second=211 amount=-1
|
|
||||||
kerning first=221 second=246 amount=-3
|
|
||||||
kerning first=65 second=86 amount=-1
|
|
||||||
kerning first=75 second=232 amount=-1
|
|
||||||
kerning first=194 second=119 amount=-1
|
|
||||||
kerning first=80 second=246 amount=-1
|
|
||||||
kerning first=102 second=171 amount=-1
|
|
||||||
kerning first=86 second=121 amount=-1
|
|
||||||
kerning first=75 second=242 amount=-1
|
|
||||||
kerning first=70 second=243 amount=-1
|
|
||||||
kerning first=193 second=87 amount=-1
|
|
||||||
kerning first=86 second=111 amount=-1
|
|
||||||
kerning first=82 second=121 amount=-1
|
|
||||||
kerning first=84 second=46 amount=-2
|
|
||||||
kerning first=88 second=233 amount=-1
|
|
||||||
kerning first=192 second=86 amount=-1
|
|
||||||
kerning first=88 second=234 amount=-1
|
|
||||||
kerning first=75 second=199 amount=-1
|
|
||||||
kerning first=45 second=213 amount=1
|
|
||||||
kerning first=68 second=221 amount=-1
|
|
||||||
kerning first=70 second=255 amount=-2
|
|
||||||
kerning first=221 second=250 amount=-2
|
|
||||||
kerning first=86 second=243 amount=-1
|
|
||||||
kerning first=65 second=196 amount=1
|
|
||||||
kerning first=87 second=65 amount=-1
|
|
||||||
kerning first=88 second=212 amount=-1
|
|
||||||
kerning first=194 second=196 amount=1
|
|
||||||
kerning first=87 second=252 amount=-1
|
|
||||||
kerning first=70 second=235 amount=-1
|
|
||||||
kerning first=107 second=121 amount=-1
|
|
||||||
kerning first=114 second=120 amount=-1
|
|
||||||
kerning first=75 second=219 amount=-1
|
|
||||||
kerning first=196 second=87 amount=-1
|
|
||||||
kerning first=102 second=45 amount=-1
|
|
||||||
kerning first=82 second=101 amount=-1
|
|
||||||
kerning first=221 second=227 amount=-3
|
|
||||||
kerning first=80 second=227 amount=-1
|
|
||||||
kerning first=75 second=243 amount=-1
|
|
||||||
kerning first=88 second=210 amount=-1
|
|
||||||
kerning first=87 second=249 amount=-1
|
|
||||||
kerning first=89 second=242 amount=-3
|
|
||||||
kerning first=70 second=232 amount=-1
|
|
||||||
kerning first=214 second=89 amount=-1
|
|
||||||
kerning first=221 second=210 amount=-1
|
|
||||||
kerning first=82 second=244 amount=-1
|
|
||||||
kerning first=211 second=89 amount=-1
|
|
||||||
kerning first=86 second=246 amount=-1
|
|
||||||
kerning first=82 second=58 amount=-1
|
|
||||||
kerning first=70 second=46 amount=-3
|
|
||||||
kerning first=211 second=46 amount=-1
|
|
||||||
kerning first=195 second=221 amount=-1
|
|
||||||
kerning first=80 second=245 amount=-1
|
|
||||||
kerning first=107 second=101 amount=-1
|
|
||||||
kerning first=193 second=221 amount=-1
|
|
||||||
kerning first=82 second=195 amount=-1
|
|
||||||
kerning first=65 second=65 amount=1
|
|
||||||
kerning first=89 second=243 amount=-3
|
|
||||||
kerning first=80 second=111 amount=-1
|
|
||||||
kerning first=86 second=117 amount=-1
|
|
||||||
kerning first=221 second=111 amount=-3
|
|
||||||
kerning first=84 second=235 amount=-3
|
|
||||||
kerning first=84 second=255 amount=-3
|
|
||||||
kerning first=84 second=229 amount=-2
|
|
||||||
kerning first=70 second=192 amount=-2
|
|
||||||
kerning first=88 second=171 amount=-1
|
|
||||||
kerning first=82 second=171 amount=-1
|
|
||||||
kerning first=193 second=171 amount=-1
|
|
||||||
kerning first=82 second=194 amount=-1
|
|
||||||
kerning first=187 second=194 amount=-1
|
|
||||||
kerning first=45 second=212 amount=1
|
|
||||||
kerning first=65 second=253 amount=-1
|
|
||||||
kerning first=82 second=245 amount=-1
|
|
||||||
kerning first=76 second=86 amount=-2
|
|
||||||
kerning first=86 second=228 amount=-1
|
|
||||||
kerning first=86 second=196 amount=-1
|
|
||||||
kerning first=86 second=233 amount=-1
|
|
||||||
kerning first=84 second=249 amount=-3
|
|
||||||
kerning first=88 second=45 amount=-1
|
|
||||||
kerning first=79 second=221 amount=-1
|
|
||||||
kerning first=88 second=211 amount=-1
|
|
||||||
kerning first=89 second=97 amount=-3
|
|
||||||
kerning first=87 second=228 amount=-1
|
|
||||||
kerning first=192 second=255 amount=-1
|
|
||||||
kerning first=171 second=84 amount=-1
|
|
||||||
kerning first=84 second=245 amount=-2
|
|
||||||
kerning first=89 second=213 amount=-1
|
|
||||||
kerning first=86 second=187 amount=-1
|
|
||||||
kerning first=75 second=117 amount=-1
|
|
||||||
kerning first=76 second=79 amount=-1
|
|
||||||
kerning first=65 second=89 amount=-1
|
|
||||||
kerning first=70 second=229 amount=-2
|
|
||||||
kerning first=253 second=46 amount=-3
|
|
||||||
kerning first=86 second=97 amount=-1
|
|
||||||
kerning first=80 second=232 amount=-1
|
|
||||||
kerning first=107 second=234 amount=-1
|
|
||||||
kerning first=70 second=244 amount=-1
|
|
||||||
kerning first=84 second=192 amount=-1
|
|
||||||
kerning first=107 second=244 amount=-1
|
|
||||||
kerning first=86 second=226 amount=-1
|
|
||||||
kerning first=70 second=249 amount=-1
|
|
||||||
kerning first=75 second=246 amount=-1
|
|
||||||
kerning first=70 second=252 amount=-1
|
|
||||||
kerning first=193 second=118 amount=-1
|
|
||||||
kerning first=87 second=232 amount=-1
|
|
||||||
kerning first=118 second=46 amount=-1
|
|
||||||
kerning first=244 second=120 amount=-1
|
|
||||||
kerning first=84 second=119 amount=-3
|
|
||||||
kerning first=89 second=193 amount=-1
|
|
||||||
kerning first=121 second=58 amount=-1
|
|
||||||
kerning first=194 second=193 amount=1
|
|
||||||
kerning first=74 second=45 amount=-1
|
|
||||||
kerning first=87 second=46 amount=-2
|
|
||||||
kerning first=70 second=242 amount=-1
|
|
||||||
kerning first=87 second=225 amount=-1
|
|
||||||
kerning first=71 second=221 amount=-1
|
|
||||||
kerning first=75 second=87 amount=-1
|
|
||||||
kerning first=212 second=221 amount=-1
|
|
||||||
kerning first=65 second=255 amount=-1
|
|
||||||
kerning first=111 second=120 amount=-1
|
|
||||||
kerning first=87 second=192 amount=-1
|
|
||||||
kerning first=192 second=192 amount=1
|
|
||||||
kerning first=75 second=213 amount=-1
|
|
||||||
kerning first=88 second=101 amount=-1
|
|
||||||
kerning first=88 second=214 amount=-1
|
|
||||||
kerning first=187 second=221 amount=-2
|
|
||||||
kerning first=82 second=221 amount=-1
|
|
||||||
kerning first=82 second=65 amount=-1
|
|
||||||
kerning first=187 second=65 amount=-1
|
|
||||||
kerning first=195 second=195 amount=1
|
|
||||||
kerning first=80 second=195 amount=-1
|
|
||||||
kerning first=208 second=89 amount=-1
|
|
||||||
kerning first=214 second=46 amount=-1
|
|
||||||
kerning first=212 second=45 amount=1
|
|
||||||
kerning first=87 second=251 amount=-1
|
|
||||||
kerning first=84 second=252 amount=-3
|
|
||||||
kerning first=76 second=255 amount=-2
|
|
||||||
kerning first=118 second=58 amount=-1
|
|
||||||
kerning first=193 second=194 amount=1
|
|
||||||
kerning first=76 second=89 amount=-3
|
|
||||||
kerning first=87 second=235 amount=-1
|
|
||||||
kerning first=82 second=251 amount=-1
|
|
||||||
kerning first=86 second=193 amount=-1
|
|
||||||
kerning first=221 second=187 amount=-1
|
|
||||||
kerning first=195 second=102 amount=-1
|
|
||||||
kerning first=120 second=232 amount=-1
|
|
||||||
kerning first=107 second=232 amount=-1
|
|
||||||
kerning first=84 second=232 amount=-3
|
|
||||||
kerning first=89 second=246 amount=-3
|
|
||||||
kerning first=221 second=244 amount=-3
|
|
||||||
kerning first=196 second=195 amount=1
|
|
||||||
kerning first=192 second=89 amount=-1
|
|
||||||
kerning first=84 second=242 amount=-2
|
|
||||||
kerning first=65 second=195 amount=1
|
|
||||||
kerning first=89 second=226 amount=-3
|
|
Before Width: | Height: | Size: 18 KiB |
|
@ -8,6 +8,7 @@ const VehicleClasses = Object.freeze({
|
||||||
LIGHT: 'Leicht',
|
LIGHT: 'Leicht',
|
||||||
HEAVY: 'Schwer',
|
HEAVY: 'Schwer',
|
||||||
AIR: 'Flug',
|
AIR: 'Flug',
|
||||||
|
BOAT: 'Boot',
|
||||||
UNKNOWN: 'Unbekannt',
|
UNKNOWN: 'Unbekannt',
|
||||||
});
|
});
|
||||||
|
|
||||||
|
@ -72,7 +73,9 @@ const parseWarLog = (lineArray, war) => {
|
||||||
'Qilin (Unbewaffnet)', 'Qilin (Bewaffnet)', 'Ifrit',
|
'Qilin (Unbewaffnet)', 'Qilin (Bewaffnet)', 'Ifrit',
|
||||||
'Tempest-Transporter', 'Tempest-Transporter (abgedeckt)', 'Tempest Sanitätsfahrzeug',
|
'Tempest-Transporter', 'Tempest-Transporter (abgedeckt)', 'Tempest Sanitätsfahrzeug',
|
||||||
'Remote Designator [CSAT]', 'UBF Saif',
|
'Remote Designator [CSAT]', 'UBF Saif',
|
||||||
'Quad Bike', 'HuntIR',
|
'Quad Bike', 'HuntIR', 'Offroad',
|
||||||
|
// boats
|
||||||
|
'RHIB', 'Kampfboot', 'SDV',
|
||||||
];
|
];
|
||||||
|
|
||||||
const addPlayerIfNotExists = (inputPlayer, steamUUID) => {
|
const addPlayerIfNotExists = (inputPlayer, steamUUID) => {
|
||||||
|
@ -80,6 +83,10 @@ const parseWarLog = (lineArray, war) => {
|
||||||
if (player && player.name && player.fraction && !playerArrayContains(stats.players, player)) {
|
if (player && player.name && player.fraction && !playerArrayContains(stats.players, player)) {
|
||||||
player['warId'] = war._id;
|
player['warId'] = war._id;
|
||||||
player['steamUUID'] = steamUUID;
|
player['steamUUID'] = steamUUID;
|
||||||
|
player['vehicleLight'] = 0;
|
||||||
|
player['vehicleHeavy'] = 0;
|
||||||
|
player['vehicleAir'] = 0;
|
||||||
|
player['vehicleBoat'] = 0;
|
||||||
stats.players.push(player);
|
stats.players.push(player);
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
@ -335,21 +342,27 @@ const parseWarLog = (lineArray, war) => {
|
||||||
stats.players[i]['kill'] = stats.kills.filter(
|
stats.players[i]['kill'] = stats.kills.filter(
|
||||||
(kill) => kill.shooter === playerName && !kill.friendlyFire).length;
|
(kill) => kill.shooter === playerName && !kill.friendlyFire).length;
|
||||||
|
|
||||||
// TODO: use vehicle class description from enum
|
stats.vehicles
|
||||||
stats.players[i]['vehicleLight'] = stats.vehicles.filter(
|
.filter((vehicle) => VEHICLE_BLACKLIST.indexOf(vehicle.target) < 0)
|
||||||
(vehicle) => (vehicle.shooter === playerName ||
|
.forEach((vehicle) => {
|
||||||
(vehicle.additionalShooter && vehicle.additionalShooter.indexOf(playerName)) > -1) && vehicle.vehicleClass ===
|
if (vehicle.shooter === playerName ||
|
||||||
'LIGHT' && VEHICLE_BLACKLIST.indexOf(vehicle.target) < 0).length;
|
(vehicle.additionalShooter && vehicle.additionalShooter.indexOf(playerName)) > -1) {
|
||||||
|
switch (vehicle.vehicleClass) {
|
||||||
stats.players[i]['vehicleHeavy'] = stats.vehicles.filter(
|
case 'LIGHT':
|
||||||
(vehicle) => (vehicle.shooter === playerName ||
|
stats.players[i].vehicleLight++;
|
||||||
(vehicle.additionalShooter && vehicle.additionalShooter.indexOf(playerName)) > -1) && vehicle.vehicleClass ===
|
break;
|
||||||
'HEAVY' && VEHICLE_BLACKLIST.indexOf(vehicle.target) < 0).length;
|
case 'HEAVY':
|
||||||
|
stats.players[i].vehicleHeavy++;
|
||||||
stats.players[i]['vehicleAir'] = stats.vehicles.filter(
|
break;
|
||||||
(vehicle) => (vehicle.shooter === playerName ||
|
case 'AIR':
|
||||||
(vehicle.additionalShooter && vehicle.additionalShooter.indexOf(playerName)) > -1) && vehicle.vehicleClass ===
|
stats.players[i].vehicleAir++;
|
||||||
'AIR' && VEHICLE_BLACKLIST.indexOf(vehicle.target) < 0).length;
|
break;
|
||||||
|
case 'BOAT':
|
||||||
|
stats.players[i].vehicleBoat++;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
stats.players[i]['friendlyFire'] = stats.kills.filter(
|
stats.players[i]['friendlyFire'] = stats.kills.filter(
|
||||||
(kill) => kill.shooter === playerName && kill.friendlyFire).length;
|
(kill) => kill.shooter === playerName && kill.friendlyFire).length;
|
||||||
|
|
|
@ -50,16 +50,16 @@ let createSignature = (userId, res, next) => {
|
||||||
.then((image) => {
|
.then((image) => {
|
||||||
loadedImage = image;
|
loadedImage = image;
|
||||||
}).then(() => {
|
}).then(() => {
|
||||||
return jimp.loadFont(__dirname + '/font/DEVAJU_SANS_19.fnt');
|
return jimp.loadFont(jimp.FONT_SANS_16_BLACK);
|
||||||
})
|
})
|
||||||
.then((font) => {
|
.then((font) => {
|
||||||
loadedImage.print(font, 128, 8, user.username);
|
loadedImage.print(font, 118, 22, user.username);
|
||||||
})
|
})
|
||||||
.then(() => {
|
.then(() => {
|
||||||
return jimp.loadFont(__dirname + '/font/DEJAVU_SANS_13.fnt');
|
return jimp.loadFont(__dirname + '/font/DEJAVU_SANS_13.fnt');
|
||||||
})
|
})
|
||||||
.then((font) => {
|
.then((font) => {
|
||||||
loadedImage.print(font, 128, 35, user.squadId.name);
|
loadedImage.print(font, 118, 49, user.squadId.name);
|
||||||
return font;
|
return font;
|
||||||
})
|
})
|
||||||
.then((font) => {
|
.then((font) => {
|
||||||
|
@ -75,22 +75,22 @@ let createSignature = (userId, res, next) => {
|
||||||
|
|
||||||
if (result) {
|
if (result) {
|
||||||
if (user.squadId.fraction === 'BLUFOR') {
|
if (user.squadId.fraction === 'BLUFOR') {
|
||||||
rankW = 25;
|
rankW = 33;
|
||||||
rankH = 60;
|
rankH = 80;
|
||||||
rankX = 36;
|
rankX = 38;
|
||||||
rankY = 34;
|
rankY = 20;
|
||||||
} else {
|
} else {
|
||||||
rankW = 37;
|
rankW = 38;
|
||||||
rankH = 58;
|
rankH = 60;
|
||||||
rankX = 30;
|
rankX = 35;
|
||||||
rankY = 34;
|
rankY = 36;
|
||||||
}
|
}
|
||||||
|
|
||||||
jimp.read(resourceDir + 'rank/' + result._id + fileExt)
|
jimp.read(resourceDir + 'rank/' + result._id + fileExt)
|
||||||
.then((rankImage) => {
|
.then((rankImage) => {
|
||||||
rankImage.resize(rankW, rankH);
|
rankImage.resize(rankW, rankH);
|
||||||
loadedImage
|
loadedImage
|
||||||
.print(font, 128, 55, result.name)
|
.print(font, 118, 69, result.name)
|
||||||
.composite(rankImage, rankX, rankY);
|
.composite(rankImage, rankX, rankY);
|
||||||
})
|
})
|
||||||
.then(() => {
|
.then(() => {
|
||||||
|
@ -123,10 +123,10 @@ let addDecorationsAndSave = (userId, loadedImage, res, next) => {
|
||||||
const medalH = 40;
|
const medalH = 40;
|
||||||
const ribbonW = 53;
|
const ribbonW = 53;
|
||||||
const ribbonH = 15;
|
const ribbonH = 15;
|
||||||
let medalPx = 630;
|
let medalPx = 690;
|
||||||
let medalPy = 5;
|
let medalPy = 9;
|
||||||
let ribbonPx = 598;
|
let ribbonPx = 658;
|
||||||
let ribbonPy = 95;
|
let ribbonPy = 107;
|
||||||
|
|
||||||
AwardingModel.find({
|
AwardingModel.find({
|
||||||
'userId': userId,
|
'userId': userId,
|
||||||
|
@ -146,21 +146,22 @@ let addDecorationsAndSave = (userId, loadedImage, res, next) => {
|
||||||
if (award.decorationId.isMedal) {
|
if (award.decorationId.isMedal) {
|
||||||
decorationImage.resize(medalW, medalH);
|
decorationImage.resize(medalW, medalH);
|
||||||
loadedImage.composite(decorationImage, medalPx, medalPy);
|
loadedImage.composite(decorationImage, medalPx, medalPy);
|
||||||
if (medalPy === 5) {
|
if (medalPy === 9) {
|
||||||
medalPx = medalPx - 1 - medalW;
|
medalPx = medalPx - 1 - medalW;
|
||||||
} else {
|
} else {
|
||||||
medalPx = medalPx + 1 + medalW;
|
medalPx = medalPx + 1 + medalW;
|
||||||
}
|
}
|
||||||
if (medalPx <= 300) {
|
if (medalPx <= 300) {
|
||||||
|
medalPx = medalPx + 1 + medalW;
|
||||||
medalPy = medalPy + 3 + medalH;
|
medalPy = medalPy + 3 + medalH;
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
decorationImage.resize(ribbonW, ribbonH);
|
decorationImage.resize(ribbonW, ribbonH);
|
||||||
loadedImage.composite(decorationImage, ribbonPx, ribbonPy);
|
loadedImage.composite(decorationImage, ribbonPx, ribbonPy);
|
||||||
ribbonPx = ribbonPx - 2 - ribbonW;
|
ribbonPx = ribbonPx - 2 - ribbonW;
|
||||||
if (ribbonPx <= 154) {
|
if (ribbonPx <= 200) {
|
||||||
ribbonPy = ribbonPy - 3 - ribbonH;
|
ribbonPy = ribbonPy - 3 - ribbonH;
|
||||||
ribbonPx = 598;
|
ribbonPx = 657;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
callback();
|
callback();
|
||||||
|
|
|
@ -23,7 +23,7 @@
|
||||||
[(ngModel)]="appUserSquadId">
|
[(ngModel)]="appUserSquadId">
|
||||||
<option [value]="null">{{'user.submit.field.squad.not.assigned' | translate}}</option>
|
<option [value]="null">{{'user.submit.field.squad.not.assigned' | translate}}</option>
|
||||||
<option *ngFor="let squad of squads" [ngValue]="squad._id">
|
<option *ngFor="let squad of squads" [ngValue]="squad._id">
|
||||||
{{squad.fraction == 'BLUFOR'? fraction.BLUFOR : fraction.OPFOR}}: {{squad.name}}
|
{{squad.fraction == 'BLUFOR'? fraction.ARF : fraction.SWORD}}: {{squad.name}}
|
||||||
</option>
|
</option>
|
||||||
</select>
|
</select>
|
||||||
<show-error displayName="{{'user.submit.field.squad' | translate}}" controlPath="squad"></show-error>
|
<show-error displayName="{{'user.submit.field.squad' | translate}}" controlPath="squad"></show-error>
|
||||||
|
|
|
@ -6,8 +6,8 @@
|
||||||
<a>{{appUser.username}}</a>
|
<a>{{appUser.username}}</a>
|
||||||
</span>
|
</span>
|
||||||
<br>
|
<br>
|
||||||
<small *ngIf="appUser.squad && appUser.squad.fraction == 'OPFOR'">{{fraction.OPFOR}} - {{appUser.squad.name}}</small>
|
<small *ngIf="appUser.squad && appUser.squad.fraction == 'OPFOR'">{{fraction.SWORD}} - {{appUser.squad.name}}</small>
|
||||||
<small *ngIf="appUser.squad && appUser.squad.fraction == 'BLUFOR'">{{fraction.BLUFOR}} - {{appUser.squad.name}}</small>
|
<small *ngIf="appUser.squad && appUser.squad.fraction == 'BLUFOR'">{{fraction.ARF}} - {{appUser.squad.name}}</small>
|
||||||
<small *ngIf="!appUser.squad">{{'users.list.item.label.no.squad' | translate}}</small>
|
<small *ngIf="!appUser.squad">{{'users.list.item.label.no.squad' | translate}}</small>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
|
|
@ -8,7 +8,7 @@
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<h3 class="text-center" style="font-weight: 600"
|
<h3 class="text-center" style="font-weight: 600"
|
||||||
[style.color]="user.squadId?.fraction === 'BLUFOR' ? fraction.COLOR_BLUFOR : fraction.COLOR_OPFOR">
|
[style.color]="user.squadId?.fraction === 'BLUFOR' ? fraction.COLOR_ARF : fraction.COLOR_SWORD">
|
||||||
{{'public.army.member.headline' | translate:{name: user.username} }}
|
{{'public.army.member.headline' | translate:{name: user.username} }}
|
||||||
</h3>
|
</h3>
|
||||||
|
|
||||||
|
|
|
@ -7,7 +7,7 @@
|
||||||
</div>
|
</div>
|
||||||
<div class=" middle-row">
|
<div class=" middle-row">
|
||||||
<div class="name-cell">
|
<div class="name-cell">
|
||||||
<div [style.color]="squadFraction === 'BLUFOR' ? fraction.COLOR_BLUFOR : fraction.COLOR_OPFOR"
|
<div [style.color]="squadFraction === 'BLUFOR' ? fraction.COLOR_ARF : fraction.COLOR_SWORD"
|
||||||
*ngFor="let member of squad.members">
|
*ngFor="let member of squad.members">
|
||||||
<span class="member-link"
|
<span class="member-link"
|
||||||
(click)="select(member._id)">
|
(click)="select(member._id)">
|
||||||
|
|
|
@ -2,8 +2,8 @@
|
||||||
<h1>{{'public.army.headline' | translate}}</h1>
|
<h1>{{'public.army.headline' | translate}}</h1>
|
||||||
|
|
||||||
<div class="pull-left army-column" *ngIf="!isSmallLayout || singleViewSelected === fraction.BLUFOR">
|
<div class="pull-left army-column" *ngIf="!isSmallLayout || singleViewSelected === fraction.BLUFOR">
|
||||||
<h3 class="army-head" [style.color]="fraction.COLOR_BLUFOR">
|
<h3 class="army-head" [style.color]="fraction.COLOR_ARF">
|
||||||
{{fraction.BLUFOR}}
|
{{fraction.ARF}}
|
||||||
<button mat-icon-button class="switch-btn-blufor"
|
<button mat-icon-button class="switch-btn-blufor"
|
||||||
(click)="singleViewSwitch(fraction.OPFOR)">
|
(click)="singleViewSwitch(fraction.OPFOR)">
|
||||||
<mat-icon svgIcon="chevron-right"></mat-icon>
|
<mat-icon svgIcon="chevron-right"></mat-icon>
|
||||||
|
@ -18,12 +18,12 @@
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div class="pull-right army-column" *ngIf="!isSmallLayout || singleViewSelected === fraction.OPFOR">
|
<div class="pull-right army-column" *ngIf="!isSmallLayout || singleViewSelected === fraction.OPFOR">
|
||||||
<h3 class="army-head" [style.color]="fraction.COLOR_OPFOR">
|
<h3 class="army-head" [style.color]="fraction.COLOR_SWORD">
|
||||||
<button mat-icon-button class="switch-btn-opfor"
|
<button mat-icon-button class="switch-btn-opfor"
|
||||||
(click)="singleViewSwitch(fraction.BLUFOR)">
|
(click)="singleViewSwitch(fraction.BLUFOR)">
|
||||||
<mat-icon svgIcon="chevron-right"></mat-icon>
|
<mat-icon svgIcon="chevron-right"></mat-icon>
|
||||||
</button>
|
</button>
|
||||||
{{fraction.OPFOR}}
|
{{fraction.SWORD}}
|
||||||
</h3>
|
</h3>
|
||||||
<cc-army-squad *ngFor="let squad of army[1].squads"
|
<cc-army-squad *ngFor="let squad of army[1].squads"
|
||||||
[squad]="squad"
|
[squad]="squad"
|
||||||
|
|
|
@ -6,6 +6,8 @@
|
||||||
<a>{{decoration.name}}</a>
|
<a>{{decoration.name}}</a>
|
||||||
</span>
|
</span>
|
||||||
<br>
|
<br>
|
||||||
|
<small *ngIf="decoration.fraction == 'ARF'">{{fraction.ARF}}</small>
|
||||||
|
<small *ngIf="decoration.fraction == 'SWORD'">{{fraction.SWORD}}</small>
|
||||||
<small *ngIf="decoration.fraction == 'OPFOR'">{{fraction.OPFOR}}</small>
|
<small *ngIf="decoration.fraction == 'OPFOR'">{{fraction.OPFOR}}</small>
|
||||||
<small *ngIf="decoration.fraction == 'BLUFOR'">{{fraction.BLUFOR}}</small>
|
<small *ngIf="decoration.fraction == 'BLUFOR'">{{fraction.BLUFOR}}</small>
|
||||||
<small *ngIf="decoration.fraction == 'GLOBAL'">{{'decorations.list.filter.global' | translate}}</small>
|
<small *ngIf="decoration.fraction == 'GLOBAL'">{{'decorations.list.filter.global' | translate}}</small>
|
||||||
|
|
|
@ -1,6 +1,8 @@
|
||||||
<div class="select-list">
|
<div class="select-list">
|
||||||
<cc-list-filter
|
<cc-list-filter
|
||||||
[filterButtons]="[{label: fraction.BLUFOR, value: 'BLUFOR'},
|
[filterButtons]="[{label: fraction.ARF, value: 'ARF'},
|
||||||
|
{label: fraction.SWORD, value: 'SWORD'},
|
||||||
|
{label: fraction.BLUFOR, value: 'BLUFOR'},
|
||||||
{label: fraction.OPFOR, value: 'OPFOR'},
|
{label: fraction.OPFOR, value: 'OPFOR'},
|
||||||
{label: 'decorations.list.filter.global', value: 'GLOBAL'}]"
|
{label: 'decorations.list.filter.global', value: 'GLOBAL'}]"
|
||||||
[addButton]="{svgIcon: 'add', tooltip: 'decorations.list.button.add'}"
|
[addButton]="{svgIcon: 'add', tooltip: 'decorations.list.button.add'}"
|
||||||
|
|
|
@ -17,6 +17,8 @@
|
||||||
<select id="fraction" name="fraction" class="form-control btn dropdown-toggle"
|
<select id="fraction" name="fraction" class="form-control btn dropdown-toggle"
|
||||||
required
|
required
|
||||||
[(ngModel)]="decoration.fraction">
|
[(ngModel)]="decoration.fraction">
|
||||||
|
<option value="{{fraction.ARF}}">{{fraction.ARF}}</option>
|
||||||
|
<option value="{{fraction.SWORD}}">{{fraction.SWORD}}</option>
|
||||||
<option value="OPFOR">{{fraction.OPFOR}}</option>
|
<option value="OPFOR">{{fraction.OPFOR}}</option>
|
||||||
<option value="BLUFOR">{{fraction.BLUFOR}}</option>
|
<option value="BLUFOR">{{fraction.BLUFOR}}</option>
|
||||||
<option value="GLOBAL">{{'decorations.submit.field.fraction.global' | translate}}</option>
|
<option value="GLOBAL">{{'decorations.submit.field.fraction.global' | translate}}</option>
|
||||||
|
|
|
@ -17,8 +17,8 @@
|
||||||
<select id="fraction" name="fraction" class="form-control btn dropdown-toggle"
|
<select id="fraction" name="fraction" class="form-control btn dropdown-toggle"
|
||||||
required
|
required
|
||||||
[(ngModel)]="rank.fraction">
|
[(ngModel)]="rank.fraction">
|
||||||
<option value="OPFOR">{{fraction.OPFOR}}</option>
|
<option value="OPFOR">{{fraction.SWORD}}</option>
|
||||||
<option value="BLUFOR">{{fraction.BLUFOR}}</option>
|
<option value="BLUFOR">{{fraction.ARF}}</option>
|
||||||
</select>
|
</select>
|
||||||
<show-error displayName="{{'ranks.submit.field.fraction' | translate}}" controlPath="fraction"></show-error>
|
<show-error displayName="{{'ranks.submit.field.fraction' | translate}}" controlPath="fraction"></show-error>
|
||||||
</div>
|
</div>
|
||||||
|
|
|
@ -6,8 +6,8 @@
|
||||||
<a>{{rank.name}}</a>
|
<a>{{rank.name}}</a>
|
||||||
</span>
|
</span>
|
||||||
<br>
|
<br>
|
||||||
<small *ngIf="rank.fraction == 'OPFOR'">{{fraction.OPFOR}}</small>
|
<small *ngIf="rank.fraction == 'OPFOR'">{{fraction.SWORD}}</small>
|
||||||
<small *ngIf="rank.fraction == 'BLUFOR'">{{fraction.BLUFOR}}</small>
|
<small *ngIf="rank.fraction == 'BLUFOR'">{{fraction.ARF}}</small>
|
||||||
<small> {{'ranks.list.item.label.level' | translate:{level: rank.level} }}</small>
|
<small> {{'ranks.list.item.label.level' | translate:{level: rank.level} }}</small>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
<div class="select-list">
|
<div class="select-list">
|
||||||
<cc-list-filter
|
<cc-list-filter
|
||||||
[filterButtons]="[{label: fraction.BLUFOR, value: 'BLUFOR'},
|
[filterButtons]="[{label: fraction.ARF, value: 'BLUFOR'},
|
||||||
{label: fraction.OPFOR, value: 'OPFOR'}]"
|
{label: fraction.SWORD, value: 'OPFOR'}]"
|
||||||
[addButton]="{svgIcon: 'add', tooltip: 'ranks.list.button.add'}"
|
[addButton]="{svgIcon: 'add', tooltip: 'ranks.list.button.add'}"
|
||||||
(executeSearch)="filterRanks($event)"
|
(executeSearch)="filterRanks($event)"
|
||||||
(openAddFrom)="openNewRankForm()">
|
(openAddFrom)="openNewRankForm()">
|
||||||
|
|
|
@ -17,8 +17,8 @@
|
||||||
<select id="fraction" name="fraction" class="form-control btn dropdown-toggle"
|
<select id="fraction" name="fraction" class="form-control btn dropdown-toggle"
|
||||||
required
|
required
|
||||||
[(ngModel)]="squad.fraction">
|
[(ngModel)]="squad.fraction">
|
||||||
<option value="OPFOR">{{fraction.OPFOR}}</option>
|
<option value="OPFOR">{{fraction.SWORD}}</option>
|
||||||
<option value="BLUFOR">{{fraction.BLUFOR}}</option>
|
<option value="BLUFOR">{{fraction.ARF}}</option>
|
||||||
</select>
|
</select>
|
||||||
<show-error displayName="{{'squad.submit.field.fraction' | translate}}" controlPath="fraction"></show-error>
|
<show-error displayName="{{'squad.submit.field.fraction' | translate}}" controlPath="fraction"></show-error>
|
||||||
</div>
|
</div>
|
||||||
|
|
|
@ -6,8 +6,8 @@
|
||||||
<a>{{squad.name}}</a>
|
<a>{{squad.name}}</a>
|
||||||
</span>
|
</span>
|
||||||
<br>
|
<br>
|
||||||
<small *ngIf="squad.fraction == 'OPFOR'">{{fraction.OPFOR}}</small>
|
<small *ngIf="squad.fraction == 'OPFOR'">{{fraction.ARF}}</small>
|
||||||
<small *ngIf="squad.fraction == 'BLUFOR'">{{fraction.BLUFOR}}</small>
|
<small *ngIf="squad.fraction == 'BLUFOR'">{{fraction.SWORD}}</small>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div class="col-xs-4">
|
<div class="col-xs-4">
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
<div class="select-list">
|
<div class="select-list">
|
||||||
<cc-list-filter
|
<cc-list-filter
|
||||||
[filterButtons]="[{label: fraction.BLUFOR, value: 'BLUFOR'},
|
[filterButtons]="[{label: fraction.ARF, value: 'BLUFOR'},
|
||||||
{label: fraction.OPFOR, value: 'OPFOR'}]"
|
{label: fraction.SWORD, value: 'OPFOR'}]"
|
||||||
[addButton]="{svgIcon: 'add', tooltip: 'squad.list.tooltip.new'}"
|
[addButton]="{svgIcon: 'add', tooltip: 'squad.list.tooltip.new'}"
|
||||||
(executeSearch)="filterSquads($event)"
|
(executeSearch)="filterSquads($event)"
|
||||||
(openAddFrom)="openNewSquadForm()">
|
(openAddFrom)="openNewSquadForm()">
|
||||||
|
|
|
@ -13,7 +13,8 @@
|
||||||
style="min-width: 200px;">
|
style="min-width: 200px;">
|
||||||
<option [value]="0">{{'users.award.field.decoration.placeholder' | translate}}</option>
|
<option [value]="0">{{'users.award.field.decoration.placeholder' | translate}}</option>
|
||||||
<option *ngFor="let deco of decorations" [value]="deco._id">
|
<option *ngFor="let deco of decorations" [value]="deco._id">
|
||||||
{{deco.fraction == 'BLUFOR'? fraction.BLUFOR : deco.fraction == 'OPFOR'? fraction.OPFOR : 'Global'}}:
|
{{deco.fraction == 'BLUFOR' ? fraction.BLUFOR : deco.fraction == 'OPFOR' ? fraction.OPFOR : deco.fraction ==
|
||||||
|
'ARF' ? fraction.ARF : deco.fraction == 'SWORD' ? fraction.SWORD : 'Global'}}:
|
||||||
{{deco.name}}
|
{{deco.name}}
|
||||||
</option>
|
</option>
|
||||||
</select>
|
</select>
|
||||||
|
@ -93,8 +94,8 @@
|
||||||
</td>
|
</td>
|
||||||
<td class="text-center">
|
<td class="text-center">
|
||||||
{{award.confirmed === 0 ?
|
{{award.confirmed === 0 ?
|
||||||
awardStatus['users.award.table.status.in.progress'] : (award.confirmed === 1 ?
|
awardStatus['users.award.table.status.in.progress'] : (award.confirmed === 1 ?
|
||||||
awardStatus['users.award.table.status.approved']: awardStatus['users.award.table.status.rejected'])}}
|
awardStatus['users.award.table.status.approved'] : awardStatus['users.award.table.status.rejected'])}}
|
||||||
</td>
|
</td>
|
||||||
<td class="text-center">
|
<td class="text-center">
|
||||||
<label>
|
<label>
|
||||||
|
|
|
@ -23,7 +23,7 @@
|
||||||
(change)="toggleRanks()">
|
(change)="toggleRanks()">
|
||||||
<option [value]="0">{{'user.submit.field.squad.not.assigned' | translate}}</option>
|
<option [value]="0">{{'user.submit.field.squad.not.assigned' | translate}}</option>
|
||||||
<option *ngFor="let squad of squads" [ngValue]="squad">
|
<option *ngFor="let squad of squads" [ngValue]="squad">
|
||||||
{{squad.fraction == 'BLUFOR'? fraction.BLUFOR : fraction.OPFOR}}: {{squad.name}}
|
{{squad.fraction == 'BLUFOR'? fraction.ARF : fraction.SWORD}}: {{squad.name}}
|
||||||
</option>
|
</option>
|
||||||
</select>
|
</select>
|
||||||
<show-error displayName="{{'user.submit.field.squad' | translate}}" controlPath="squad"></show-error>
|
<show-error displayName="{{'user.submit.field.squad' | translate}}" controlPath="squad"></show-error>
|
||||||
|
|
|
@ -6,8 +6,8 @@
|
||||||
<a>{{user.username}}</a>
|
<a>{{user.username}}</a>
|
||||||
</span>
|
</span>
|
||||||
<br>
|
<br>
|
||||||
<small *ngIf="user.squadId && user.squadId.fraction == 'OPFOR'">{{fraction.OPFOR}} - {{user.squadId.name}}</small>
|
<small *ngIf="user.squadId && user.squadId.fraction == 'OPFOR'">{{fraction.SWORD}} - {{user.squadId.name}}</small>
|
||||||
<small *ngIf="user.squadId && user.squadId.fraction == 'BLUFOR'">{{fraction.BLUFOR}} - {{user.squadId.name}}
|
<small *ngIf="user.squadId && user.squadId.fraction == 'BLUFOR'">{{fraction.ARF}} - {{user.squadId.name}}
|
||||||
</small>
|
</small>
|
||||||
<small *ngIf="!user.squadId">{{'users.list.item.label.no.squad' | translate}}</small>
|
<small *ngIf="!user.squadId">{{'users.list.item.label.no.squad' | translate}}</small>
|
||||||
</div>
|
</div>
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
<div class="select-list">
|
<div class="select-list">
|
||||||
<cc-list-filter
|
<cc-list-filter
|
||||||
[filterButtons]="[{label: fraction.BLUFOR, value: 'BLUFOR'},
|
[filterButtons]="[{label: fraction.ARF, value: 'BLUFOR'},
|
||||||
{label: fraction.OPFOR, value: 'OPFOR'},
|
{label: fraction.SWORD, value: 'OPFOR'},
|
||||||
{label: 'users.list.filter.no.squad', value: 'UNASSIGNED'}]"
|
{label: 'users.list.filter.no.squad', value: 'UNASSIGNED'}]"
|
||||||
[addButton]="{svgIcon: 'add-user', tooltip: 'users.list.tooltip.new'}"
|
[addButton]="{svgIcon: 'add-user', tooltip: 'users.list.tooltip.new'}"
|
||||||
(executeSearch)="filterUsers(undefined, $event)"
|
(executeSearch)="filterUsers(undefined, $event)"
|
||||||
|
|
|
@ -1,4 +1,5 @@
|
||||||
import {Observable} from 'rxjs';
|
import {Observable} from 'rxjs';
|
||||||
|
import {Fraction} from '../utils/fraction.enum';
|
||||||
|
|
||||||
export interface AppUser {
|
export interface AppUser {
|
||||||
_id?: string;
|
_id?: string;
|
||||||
|
@ -59,6 +60,8 @@ export interface War {
|
||||||
endDate?: string;
|
endDate?: string;
|
||||||
ptBlufor?: number;
|
ptBlufor?: number;
|
||||||
ptOpfor?: number;
|
ptOpfor?: number;
|
||||||
|
fractionMappingBlufor?: Fraction.SWORD | Fraction.ARF | 'BLUFOR' | 'OPFOR';
|
||||||
|
fractionMappingOpfor?: Fraction.SWORD | Fraction.ARF | 'BLUFOR' | 'OPFOR';
|
||||||
playersBlufor?: number;
|
playersBlufor?: number;
|
||||||
playersOpfor?: number;
|
playersOpfor?: number;
|
||||||
budgetBlufor?: number;
|
budgetBlufor?: number;
|
||||||
|
|
|
@ -2,6 +2,8 @@
|
||||||
<h1>{{'public.decorations.headline' | translate}}</h1>
|
<h1>{{'public.decorations.headline' | translate}}</h1>
|
||||||
|
|
||||||
<div class="fraction-side-bar">
|
<div class="fraction-side-bar">
|
||||||
|
<div [ngClass]="{active: active === 'ARF'}" (click)="switchFraction('ARF')">{{fraction.ARF}}</div>
|
||||||
|
<div [ngClass]="{active: active === 'SWORD'}" (click)="switchFraction('SWORD')">{{fraction.SWORD}}</div>
|
||||||
<div [ngClass]="{active: active === 'BLUFOR'}" (click)="switchFraction('BLUFOR')">{{fraction.BLUFOR}}</div>
|
<div [ngClass]="{active: active === 'BLUFOR'}" (click)="switchFraction('BLUFOR')">{{fraction.BLUFOR}}</div>
|
||||||
<div [ngClass]="{active: active === 'OPFOR'}" (click)="switchFraction('OPFOR')">{{fraction.OPFOR}}</div>
|
<div [ngClass]="{active: active === 'OPFOR'}" (click)="switchFraction('OPFOR')">{{fraction.OPFOR}}</div>
|
||||||
<div [ngClass]="{active: active === 'GLOBAL'}" (click)="switchFraction('GLOBAL')">GLOBAL</div>
|
<div [ngClass]="{active: active === 'GLOBAL'}" (click)="switchFraction('GLOBAL')">GLOBAL</div>
|
||||||
|
|
|
@ -45,10 +45,11 @@ export class DecorationOverviewComponent implements OnInit, OnDestroy {
|
||||||
}
|
}
|
||||||
|
|
||||||
const fract = queryParams.fraction;
|
const fract = queryParams.fraction;
|
||||||
if (fract && (fract === 'BLUFOR' || fract === 'OPFOR' || fract === 'GLOBAL')) {
|
if (fract && (fract === 'ARF' || fract === 'SWORD' ||
|
||||||
|
fract === 'BLUFOR' || fract === 'OPFOR' || fract === 'GLOBAL')) {
|
||||||
this.switchFraction(queryParams.fraction);
|
this.switchFraction(queryParams.fraction);
|
||||||
} else {
|
} else {
|
||||||
this.switchFraction('BLUFOR');
|
this.switchFraction('ARF');
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
};
|
};
|
||||||
|
|
|
@ -5,8 +5,7 @@
|
||||||
[class]="decoration.isMedal ? 'img-medal' : 'img-ribbon'">
|
[class]="decoration.isMedal ? 'img-medal' : 'img-ribbon'">
|
||||||
</div>
|
</div>
|
||||||
<mat-card-content>
|
<mat-card-content>
|
||||||
<div [style.background]="decoration.fraction === 'BLUFOR' ?
|
<div [style.background]="getColor(decoration.fraction)">
|
||||||
fraction.COLOR_BLUFOR : decoration.fraction === 'OPFOR' ? fraction.COLOR_OPFOR : '#666666'">
|
|
||||||
{{decoration.name}}
|
{{decoration.name}}
|
||||||
</div>
|
</div>
|
||||||
<div class="decoration-description">
|
<div class="decoration-description">
|
||||||
|
|
|
@ -17,6 +17,21 @@ export class DecorationPanelComponent {
|
||||||
|
|
||||||
readonly fraction = Fraction;
|
readonly fraction = Fraction;
|
||||||
|
|
||||||
|
getColor(fractionKey) {
|
||||||
|
switch (fractionKey) {
|
||||||
|
case 'ARF':
|
||||||
|
return this.fraction.COLOR_ARF;
|
||||||
|
case 'SWORD':
|
||||||
|
return this.fraction.COLOR_SWORD;
|
||||||
|
case 'BLUFOR':
|
||||||
|
return this.fraction.COLOR_BLUFOR;
|
||||||
|
case 'OPFOR':
|
||||||
|
return this.fraction.COLOR_OPFOR;
|
||||||
|
default:
|
||||||
|
return this.fraction.COLOR_NEUTRAL;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
selectDecoration() {
|
selectDecoration() {
|
||||||
this.select.emit(this.decoration);
|
this.select.emit(this.decoration);
|
||||||
}
|
}
|
||||||
|
|
|
@ -2,7 +2,7 @@
|
||||||
<h1>{{'public.ranks.headline' | translate}}</h1>
|
<h1>{{'public.ranks.headline' | translate}}</h1>
|
||||||
|
|
||||||
<div class="column-container pull-left">
|
<div class="column-container pull-left">
|
||||||
<h3 [style.color]="fraction.COLOR_BLUFOR">{{fraction.BLUFOR}}</h3>
|
<h3 [style.color]="fraction.COLOR_ARF">{{fraction.ARF}}</h3>
|
||||||
|
|
||||||
<table mat-table [dataSource]="ranksBlufor" class="mat-elevation-z8">
|
<table mat-table [dataSource]="ranksBlufor" class="mat-elevation-z8">
|
||||||
|
|
||||||
|
@ -19,7 +19,7 @@
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div class="column-container pull-right">
|
<div class="column-container pull-right">
|
||||||
<h3 [style.color]="fraction.COLOR_OPFOR">{{fraction.OPFOR}}</h3>
|
<h3 [style.color]="fraction.COLOR_SWORD">{{fraction.SWORD}}</h3>
|
||||||
|
|
||||||
<table mat-table [dataSource]="ranksOpfor" class="pull-right mat-elevation-z8">
|
<table mat-table [dataSource]="ranksOpfor" class="pull-right mat-elevation-z8">
|
||||||
|
|
||||||
|
|
|
@ -13,8 +13,6 @@ export class RankPanelComponent {
|
||||||
|
|
||||||
@Output() select = new EventEmitter();
|
@Output() select = new EventEmitter();
|
||||||
|
|
||||||
readonly fraction = Fraction;
|
|
||||||
|
|
||||||
selectRank() {
|
selectRank() {
|
||||||
this.select.emit(this.rank);
|
this.select.emit(this.rank);
|
||||||
}
|
}
|
||||||
|
|
|
@ -24,8 +24,8 @@
|
||||||
<span mat-line>
|
<span mat-line>
|
||||||
{{user.username}}
|
{{user.username}}
|
||||||
</span>
|
</span>
|
||||||
<span mat-line [style.color]="user.squadId.fraction === 'BLUFOR' ? fraction.COLOR_BLUFOR :fraction.COLOR_OPFOR">
|
<span mat-line [style.color]="user.squadId.fraction === 'BLUFOR' ? fraction.COLOR_ARF :fraction.COLOR_SWORD">
|
||||||
{{user.squadId.fraction === 'BLUFOR' ? fraction.BLUFOR : fraction.OPFOR}} - {{user.squadId.name}}
|
{{user.squadId.fraction === 'BLUFOR' ? fraction.ARF : fraction.SWORD}} - {{user.squadId.name}}
|
||||||
</span>
|
</span>
|
||||||
</a>
|
</a>
|
||||||
</mat-nav-list>
|
</mat-nav-list>
|
||||||
|
|
|
@ -35,12 +35,10 @@
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div class="div-table-row" [style.display]="decoPreviewDisplay" style="margin-top: 5px; margin-bottom:10px">
|
<div class="div-table-row" [style.display]="decoPreviewDisplay" style="margin-top: 5px; margin-bottom:10px">
|
||||||
<div class="col-sm-1 decoration-preview">
|
<div class="decoration-preview">
|
||||||
<img class="center-block" #decoPreview>
|
<img class="center-block" #decoPreview>
|
||||||
</div>
|
</div>
|
||||||
<div class="col-sm-2"
|
<div style="border-radius: 0px 15px 15px 0px; font-style: oblique; padding: 0 10px" #decoDescription>
|
||||||
style="border-radius: 0px 15px 15px 0px; font-style: oblique" #decoDescription>
|
|
||||||
|
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
|
|
@ -7,6 +7,7 @@ import {DecorationService} from '../../services/army-management/decoration.servi
|
||||||
import {UserService} from '../../services/army-management/user.service';
|
import {UserService} from '../../services/army-management/user.service';
|
||||||
import {LoginService} from '../../services/app-user-service/login-service';
|
import {LoginService} from '../../services/app-user-service/login-service';
|
||||||
import {SnackBarService} from '../../services/user-interface/snack-bar/snack-bar.service';
|
import {SnackBarService} from '../../services/user-interface/snack-bar/snack-bar.service';
|
||||||
|
import {Fraction} from '../../utils/fraction.enum';
|
||||||
|
|
||||||
|
|
||||||
@Component({
|
@Component({
|
||||||
|
@ -47,7 +48,13 @@ export class RequestAwardComponent implements OnInit {
|
||||||
this.userService.findUsers({squadId: currentUser.squad._id}).subscribe(users => {
|
this.userService.findUsers({squadId: currentUser.squad._id}).subscribe(users => {
|
||||||
this.users = users;
|
this.users = users;
|
||||||
});
|
});
|
||||||
this.decorationService.findDecorations('', currentUser.squad.fraction).subscribe(decorations => {
|
|
||||||
|
const selectableFractions = [
|
||||||
|
(currentUser.squad.fraction === Fraction.BLUFOR) ? Fraction.ARF : Fraction.SWORD,
|
||||||
|
currentUser.squad.fraction
|
||||||
|
];
|
||||||
|
|
||||||
|
this.decorationService.findDecorations('', selectableFractions).subscribe(decorations => {
|
||||||
this.decorations = decorations;
|
this.decorations = decorations;
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
|
@ -28,7 +28,7 @@
|
||||||
<ng-container matColumnDef="name">
|
<ng-container matColumnDef="name">
|
||||||
<th mat-header-cell *matHeaderCellDef>{{'stats.highscore.header.name' | translate}}</th>
|
<th mat-header-cell *matHeaderCellDef>{{'stats.highscore.header.name' | translate}}</th>
|
||||||
<td mat-cell *matCellDef="let element"
|
<td mat-cell *matCellDef="let element"
|
||||||
[style.color]="element['fraction'] === 'BLUFOR' ? fraction.COLOR_BLUFOR : fraction.COLOR_OPFOR">
|
[style.color]="fractionHelpers.getFractionColor(element['fraction'])">
|
||||||
{{element.name}}
|
{{element.name}}
|
||||||
</td>
|
</td>
|
||||||
</ng-container>
|
</ng-container>
|
||||||
|
|
|
@ -1,11 +1,11 @@
|
||||||
import {Component, OnInit} from '@angular/core';
|
import {Component, OnInit} from '@angular/core';
|
||||||
import {ActivatedRoute} from '@angular/router';
|
import {ActivatedRoute} from '@angular/router';
|
||||||
import {PlayerService} from '../../../services/logs/player.service';
|
import {PlayerService} from '../../../services/logs/player.service';
|
||||||
import {Fraction} from '../../../utils/fraction.enum';
|
|
||||||
import {FormControl} from '@angular/forms';
|
import {FormControl} from '@angular/forms';
|
||||||
import {Observable} from 'rxjs/Observable';
|
import {Observable} from 'rxjs/Observable';
|
||||||
import {Player} from '../../../models/model-interfaces';
|
import {Player} from '../../../models/model-interfaces';
|
||||||
import {PlayerUtils} from '../../../utils/player-utils';
|
import {PlayerUtils} from '../../../utils/player-utils';
|
||||||
|
import {FractionHelpers} from '../../../utils/global.helpers';
|
||||||
|
|
||||||
|
|
||||||
@Component({
|
@Component({
|
||||||
|
@ -25,7 +25,7 @@ export class StatisticHighScoreComponent implements OnInit {
|
||||||
|
|
||||||
playerAttributeDisplayNames = PlayerUtils.attributeDisplayNames.slice(2, PlayerUtils.attributeDisplayNames.length);
|
playerAttributeDisplayNames = PlayerUtils.attributeDisplayNames.slice(2, PlayerUtils.attributeDisplayNames.length);
|
||||||
|
|
||||||
readonly fraction = Fraction;
|
readonly fractionHelpers = FractionHelpers;
|
||||||
|
|
||||||
constructor(private route: ActivatedRoute,
|
constructor(private route: ActivatedRoute,
|
||||||
private playerService: PlayerService) {
|
private playerService: PlayerService) {
|
||||||
|
|
|
@ -4,6 +4,8 @@ import {CampaignService} from '../../../services/logs/campaign.service';
|
||||||
import {ChartUtils} from '../../../utils/chart-utils';
|
import {ChartUtils} from '../../../utils/chart-utils';
|
||||||
import {Fraction} from '../../../utils/fraction.enum';
|
import {Fraction} from '../../../utils/fraction.enum';
|
||||||
import {WarService} from '../../../services/logs/war.service';
|
import {WarService} from '../../../services/logs/war.service';
|
||||||
|
import {FractionHelpers} from '../../../utils/global.helpers';
|
||||||
|
import {War} from '../../../models/model-interfaces';
|
||||||
|
|
||||||
|
|
||||||
@Component({
|
@Component({
|
||||||
|
@ -22,9 +24,7 @@ export class StatisticOverviewComponent implements OnInit {
|
||||||
playerData: any[] = [];
|
playerData: any[] = [];
|
||||||
currentData: any[] = [];
|
currentData: any[] = [];
|
||||||
|
|
||||||
colorScheme = {
|
colorScheme;
|
||||||
domain: [Fraction.COLOR_BLUFOR, Fraction.COLOR_OPFOR]
|
|
||||||
};
|
|
||||||
gradient = false;
|
gradient = false;
|
||||||
xAxis = true;
|
xAxis = true;
|
||||||
yAxis = true;
|
yAxis = true;
|
||||||
|
@ -81,44 +81,71 @@ export class StatisticOverviewComponent implements OnInit {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
initChart(wars: any[]) {
|
initChart(wars: War[]) {
|
||||||
const pointsObj = ChartUtils.getMultiDataArray(Fraction.BLUFOR, Fraction.OPFOR);
|
const fractions: string[] = [];
|
||||||
const pointsSumObj = ChartUtils.getMultiDataArray(Fraction.BLUFOR, Fraction.OPFOR);
|
this.colorScheme = {
|
||||||
const playersObj = ChartUtils.getMultiDataArray(Fraction.BLUFOR, Fraction.OPFOR);
|
domain: []
|
||||||
|
};
|
||||||
|
|
||||||
|
if (wars.find(war => war.fractionMappingBlufor === 'BLUFOR' || war.fractionMappingOpfor === 'BLUFOR')) {
|
||||||
|
fractions.push(Fraction.BLUFOR);
|
||||||
|
this.colorScheme.domain.push(FractionHelpers.getFractionColor('BLUFOR'));
|
||||||
|
}
|
||||||
|
if (wars.find(war => war.fractionMappingBlufor === 'OPFOR' || war.fractionMappingOpfor === 'OPFOR')) {
|
||||||
|
fractions.push(Fraction.OPFOR);
|
||||||
|
this.colorScheme.domain.push(FractionHelpers.getFractionColor('OPFOR'));
|
||||||
|
}
|
||||||
|
if (wars.find(war => war.fractionMappingBlufor === Fraction.ARF || war.fractionMappingOpfor === Fraction.ARF)) {
|
||||||
|
fractions.push(Fraction.ARF);
|
||||||
|
this.colorScheme.domain.push(FractionHelpers.getFractionColor(Fraction.ARF));
|
||||||
|
}
|
||||||
|
if (wars.find(war => war.fractionMappingBlufor === Fraction.SWORD || war.fractionMappingOpfor === Fraction.SWORD)) {
|
||||||
|
fractions.push(Fraction.SWORD);
|
||||||
|
this.colorScheme.domain.push(FractionHelpers.getFractionColor(Fraction.SWORD));
|
||||||
|
}
|
||||||
|
|
||||||
|
const pointsObj = ChartUtils.getMultiDataArray(...fractions);
|
||||||
|
const pointsSumObj = ChartUtils.getMultiDataArray(...fractions);
|
||||||
|
const playersObj = ChartUtils.getMultiDataArray(...fractions);
|
||||||
|
|
||||||
for (let i = wars.length - 1; i >= 0; i--) {
|
for (let i = wars.length - 1; i >= 0; i--) {
|
||||||
const war = wars[i];
|
const war = wars[i];
|
||||||
if (!war) {
|
if (!war) {
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
const bluforIndex = fractions.findIndex(fraction =>
|
||||||
|
fraction === FractionHelpers.getFractionName(war, 'BLUFOR'));
|
||||||
|
const opforIndex = fractions.findIndex(
|
||||||
|
fraction => fraction === FractionHelpers.getFractionName(war, 'OPFOR'));
|
||||||
|
|
||||||
const j = wars.length - i - 1;
|
const j = wars.length - i - 1;
|
||||||
const warDate = (this.id === 'all') ? new Date(war.date) : ChartUtils.getShortDateString(war.date);
|
const warDate = (this.id === 'all') ? new Date(war.date) : ChartUtils.getShortDateString(war.date);
|
||||||
|
pointsObj[bluforIndex].series.push({
|
||||||
pointsObj[0].series.push({
|
|
||||||
name: warDate,
|
name: warDate,
|
||||||
value: war.ptBlufor
|
value: war.ptBlufor
|
||||||
});
|
});
|
||||||
pointsObj[1].series.push({
|
pointsObj[opforIndex].series.push({
|
||||||
name: warDate,
|
name: warDate,
|
||||||
value: war.ptOpfor
|
value: war.ptOpfor
|
||||||
});
|
});
|
||||||
pointsSumObj[0].series.push({
|
pointsSumObj[bluforIndex].series.push({
|
||||||
name: warDate,
|
name: warDate,
|
||||||
value: pointsSumObj[0].series[j - 1] ?
|
value: pointsSumObj[bluforIndex].series[j - 1] ?
|
||||||
pointsSumObj[0].series[j - 1].value + war.ptBlufor :
|
pointsSumObj[bluforIndex].series[j - 1].value + war.ptBlufor :
|
||||||
war.ptBlufor
|
war.ptBlufor
|
||||||
});
|
});
|
||||||
pointsSumObj[1].series.push({
|
pointsSumObj[opforIndex].series.push({
|
||||||
name: warDate,
|
name: warDate,
|
||||||
value: pointsSumObj[1].series[j - 1]
|
value: pointsSumObj[opforIndex].series[j - 1]
|
||||||
? pointsSumObj[1].series[j - 1].value + war.ptOpfor :
|
? pointsSumObj[opforIndex].series[j - 1].value + war.ptOpfor :
|
||||||
war.ptOpfor
|
war.ptOpfor
|
||||||
});
|
});
|
||||||
playersObj[0].series.push({
|
playersObj[bluforIndex].series.push({
|
||||||
name: warDate,
|
name: warDate,
|
||||||
value: war.playersBlufor
|
value: war.playersBlufor
|
||||||
});
|
});
|
||||||
playersObj[1].series.push({
|
playersObj[opforIndex].series.push({
|
||||||
name: warDate,
|
name: warDate,
|
||||||
value: war.playersOpfor
|
value: war.playersOpfor
|
||||||
});
|
});
|
||||||
|
|
|
@ -1,8 +1,8 @@
|
||||||
import {Component, ElementRef, Input, OnChanges, OnInit, SimpleChanges, ViewChild} from '@angular/core';
|
import {Component, ElementRef, Input, OnChanges, OnInit, SimpleChanges, ViewChild} from '@angular/core';
|
||||||
import {ChartUtils} from '../../../utils/chart-utils';
|
import {ChartUtils} from '../../../utils/chart-utils';
|
||||||
import {Fraction} from '../../../utils/fraction.enum';
|
|
||||||
import {War} from '../../../models/model-interfaces';
|
import {War} from '../../../models/model-interfaces';
|
||||||
import {TranslateService} from '@ngx-translate/core';
|
import {TranslateService} from '@ngx-translate/core';
|
||||||
|
import {FractionHelpers} from '../../../utils/global.helpers';
|
||||||
|
|
||||||
|
|
||||||
@Component({
|
@Component({
|
||||||
|
@ -12,8 +12,6 @@ import {TranslateService} from '@ngx-translate/core';
|
||||||
})
|
})
|
||||||
export class FractionStatsComponent implements OnInit, OnChanges {
|
export class FractionStatsComponent implements OnInit, OnChanges {
|
||||||
|
|
||||||
readonly fraction = Fraction;
|
|
||||||
|
|
||||||
@ViewChild('overview') private overviewContainer: ElementRef;
|
@ViewChild('overview') private overviewContainer: ElementRef;
|
||||||
|
|
||||||
@Input() war: War;
|
@Input() war: War;
|
||||||
|
@ -41,10 +39,9 @@ export class FractionStatsComponent implements OnInit, OnChanges {
|
||||||
tmpStabilizeData;
|
tmpStabilizeData;
|
||||||
tmpPlayerCountData;
|
tmpPlayerCountData;
|
||||||
|
|
||||||
colorScheme = {
|
colorScheme;
|
||||||
domain: [Fraction.COLOR_BLUFOR, Fraction.COLOR_OPFOR, Fraction.COLOR_BLUFOR_LIGHT, Fraction.COLOR_OPFOR_LIGHT,
|
fractionNameBlufor;
|
||||||
Fraction.COLOR_BLUFOR_DARK, Fraction.COLOR_OPFOR_DARK, Fraction.COLOR_BLUFOR_GREY, Fraction.COLOR_OPFOR_GREY]
|
fractionNameOpfor;
|
||||||
};
|
|
||||||
|
|
||||||
labels;
|
labels;
|
||||||
labelsKeys;
|
labelsKeys;
|
||||||
|
@ -77,6 +74,21 @@ export class FractionStatsComponent implements OnInit, OnChanges {
|
||||||
|
|
||||||
ngOnChanges(changes: SimpleChanges) {
|
ngOnChanges(changes: SimpleChanges) {
|
||||||
if (changes.war || changes.logData) {
|
if (changes.war || changes.logData) {
|
||||||
|
this.fractionNameBlufor = FractionHelpers.getFractionName(this.war, 'BLUFOR');
|
||||||
|
this.fractionNameOpfor = FractionHelpers.getFractionName(this.war, 'OPFOR');
|
||||||
|
this.colorScheme = {
|
||||||
|
domain: [
|
||||||
|
FractionHelpers.getFractionColor('BLUFOR', this.war),
|
||||||
|
FractionHelpers.getFractionColor('OPFOR', this.war),
|
||||||
|
FractionHelpers.getFractionColor('BLUFOR', this.war, 'LIGHT'),
|
||||||
|
FractionHelpers.getFractionColor('OPFOR', this.war, 'LIGHT'),
|
||||||
|
FractionHelpers.getFractionColor('BLUFOR', this.war, 'DARK'),
|
||||||
|
FractionHelpers.getFractionColor('OPFOR', this.war, 'DARK'),
|
||||||
|
FractionHelpers.getFractionColor('BLUFOR', this.war, 'GREY'),
|
||||||
|
FractionHelpers.getFractionColor('OPFOR', this.war, 'GREY'),
|
||||||
|
]
|
||||||
|
};
|
||||||
|
|
||||||
this.initialized = {
|
this.initialized = {
|
||||||
budget: false,
|
budget: false,
|
||||||
kill: false,
|
kill: false,
|
||||||
|
@ -433,7 +445,7 @@ export class FractionStatsComponent implements OnInit, OnChanges {
|
||||||
name: t,
|
name: t,
|
||||||
series: [
|
series: [
|
||||||
{
|
{
|
||||||
name: Fraction.BLUFOR,
|
name: this.fractionNameBlufor,
|
||||||
value: flagStatusMap.blufor[lastExistingIdx] ? 1 : 0
|
value: flagStatusMap.blufor[lastExistingIdx] ? 1 : 0
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
|
@ -442,7 +454,7 @@ export class FractionStatsComponent implements OnInit, OnChanges {
|
||||||
name: t,
|
name: t,
|
||||||
series: [
|
series: [
|
||||||
{
|
{
|
||||||
name: Fraction.OPFOR,
|
name: this.fractionNameOpfor,
|
||||||
value: flagStatusMap.opfor[lastExistingIdx] ? -1 : 0
|
value: flagStatusMap.opfor[lastExistingIdx] ? -1 : 0
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
|
@ -453,17 +465,17 @@ export class FractionStatsComponent implements OnInit, OnChanges {
|
||||||
}
|
}
|
||||||
|
|
||||||
initializeTempCollections() {
|
initializeTempCollections() {
|
||||||
this.tmpPointData = ChartUtils.getMultiDataArray(Fraction.BLUFOR, Fraction.OPFOR);
|
this.tmpPointData = ChartUtils.getMultiDataArray(this.fractionNameBlufor, this.fractionNameOpfor);
|
||||||
this.tmpBudgetData = ChartUtils.getMultiDataArray(Fraction.BLUFOR, Fraction.OPFOR);
|
this.tmpBudgetData = ChartUtils.getMultiDataArray(this.fractionNameBlufor, this.fractionNameOpfor);
|
||||||
this.tmpKillData = ChartUtils.getMultiDataArray(Fraction.BLUFOR, Fraction.OPFOR);
|
this.tmpKillData = ChartUtils.getMultiDataArray(this.fractionNameBlufor, this.fractionNameOpfor);
|
||||||
this.tmpFrienlyFireData = ChartUtils.getMultiDataArray(Fraction.BLUFOR, Fraction.OPFOR);
|
this.tmpFrienlyFireData = ChartUtils.getMultiDataArray(this.fractionNameBlufor, this.fractionNameOpfor);
|
||||||
this.tmpVehicleData = ChartUtils.getMultiDataArray(Fraction.BLUFOR, Fraction.OPFOR,
|
this.tmpVehicleData = ChartUtils.getMultiDataArray(this.fractionNameBlufor, this.fractionNameOpfor,
|
||||||
Fraction.BLUFOR.concat(' Leicht'), Fraction.OPFOR.concat(' Leicht'), Fraction.BLUFOR.concat(' Schwer'),
|
this.fractionNameBlufor.concat(' Leicht'), this.fractionNameOpfor.concat(' Leicht'), this.fractionNameBlufor.concat(' Schwer'),
|
||||||
Fraction.OPFOR.concat(' Schwer'), Fraction.BLUFOR.concat(' Luft'), Fraction.OPFOR.concat(' Luft'));
|
this.fractionNameOpfor.concat(' Schwer'), this.fractionNameBlufor.concat(' Luft'), this.fractionNameOpfor.concat(' Luft'));
|
||||||
this.tmpTransportData = ChartUtils.getMultiDataArray(Fraction.BLUFOR, Fraction.OPFOR);
|
this.tmpTransportData = ChartUtils.getMultiDataArray(this.fractionNameBlufor, this.fractionNameOpfor);
|
||||||
this.tmpReviveData = ChartUtils.getMultiDataArray(Fraction.BLUFOR, Fraction.OPFOR);
|
this.tmpReviveData = ChartUtils.getMultiDataArray(this.fractionNameBlufor, this.fractionNameOpfor);
|
||||||
this.tmpStabilizeData = ChartUtils.getMultiDataArray(Fraction.BLUFOR, Fraction.OPFOR);
|
this.tmpStabilizeData = ChartUtils.getMultiDataArray(this.fractionNameBlufor, this.fractionNameOpfor);
|
||||||
this.tmpPlayerCountData = ChartUtils.getMultiDataArray(Fraction.BLUFOR, Fraction.OPFOR);
|
this.tmpPlayerCountData = ChartUtils.getMultiDataArray(this.fractionNameBlufor, this.fractionNameOpfor);
|
||||||
|
|
||||||
[this.tmpKillData, this.tmpFrienlyFireData, this.tmpVehicleData, this.tmpReviveData, this.tmpStabilizeData,
|
[this.tmpKillData, this.tmpFrienlyFireData, this.tmpVehicleData, this.tmpReviveData, this.tmpStabilizeData,
|
||||||
this.tmpTransportData].forEach(tmp => {
|
this.tmpTransportData].forEach(tmp => {
|
||||||
|
@ -509,10 +521,10 @@ export class FractionStatsComponent implements OnInit, OnChanges {
|
||||||
|
|
||||||
axisFormatY(val) {
|
axisFormatY(val) {
|
||||||
if (val === 1) {
|
if (val === 1) {
|
||||||
return Fraction.BLUFOR;
|
return this.fractionNameBlufor;
|
||||||
}
|
}
|
||||||
if (val === -1) {
|
if (val === -1) {
|
||||||
return Fraction.OPFOR;
|
return this.fractionNameOpfor;
|
||||||
}
|
}
|
||||||
return '';
|
return '';
|
||||||
}
|
}
|
||||||
|
|
|
@ -8,7 +8,7 @@
|
||||||
<mat-header-cell *matHeaderCellDef
|
<mat-header-cell *matHeaderCellDef
|
||||||
mat-sort-header="{{tableHead[0].prop}}">{{tableHead[0].head | translate}}</mat-header-cell>
|
mat-sort-header="{{tableHead[0].prop}}">{{tableHead[0].head | translate}}</mat-header-cell>
|
||||||
<mat-cell *matCellDef="let element"
|
<mat-cell *matCellDef="let element"
|
||||||
[style.color]="element['fraction'] === 'BLUFOR' ? fraction.COLOR_BLUFOR : fraction.COLOR_OPFOR">
|
[style.color]="fractionHelpers.getFractionColor(element['fraction'],war)">
|
||||||
{{element.name}}
|
{{element.name}}
|
||||||
</mat-cell>
|
</mat-cell>
|
||||||
</ng-container>
|
</ng-container>
|
||||||
|
@ -16,8 +16,7 @@
|
||||||
<ng-container matColumnDef="{{tableHead[1].prop}}">
|
<ng-container matColumnDef="{{tableHead[1].prop}}">
|
||||||
<mat-header-cell *matHeaderCellDef
|
<mat-header-cell *matHeaderCellDef
|
||||||
mat-sort-header="{{tableHead[1].prop}}">{{tableHead[1].head | translate}}</mat-header-cell>
|
mat-sort-header="{{tableHead[1].prop}}">{{tableHead[1].head | translate}}</mat-header-cell>
|
||||||
<mat-cell *matCellDef="let element">{{element.fraction ===
|
<mat-cell *matCellDef="let element">{{fractionHelpers.getFractionName(war, element.fraction)}}</mat-cell>
|
||||||
'BLUFOR' ? fraction.BLUFOR : fraction.OPFOR}}</mat-cell>
|
|
||||||
</ng-container>
|
</ng-container>
|
||||||
|
|
||||||
<ng-container *ngFor="let column of tableHead.slice(2, tableHead.length)" matColumnDef="{{column.prop}}">
|
<ng-container *ngFor="let column of tableHead.slice(2, tableHead.length)" matColumnDef="{{column.prop}}">
|
||||||
|
|
|
@ -6,6 +6,7 @@ import {saveAs} from 'file-saver/FileSaver';
|
||||||
import {MatSort} from '@angular/material';
|
import {MatSort} from '@angular/material';
|
||||||
import {SortUtils} from '../../../utils/sort-utils';
|
import {SortUtils} from '../../../utils/sort-utils';
|
||||||
import {TranslateService} from '@ngx-translate/core';
|
import {TranslateService} from '@ngx-translate/core';
|
||||||
|
import {FractionHelpers} from '../../../utils/global.helpers';
|
||||||
|
|
||||||
@Component({
|
@Component({
|
||||||
selector: 'cc-scoreboard',
|
selector: 'cc-scoreboard',
|
||||||
|
@ -16,6 +17,8 @@ export class ScoreboardComponent implements OnChanges {
|
||||||
|
|
||||||
readonly fraction = Fraction;
|
readonly fraction = Fraction;
|
||||||
|
|
||||||
|
readonly fractionHelpers = FractionHelpers;
|
||||||
|
|
||||||
@Input() war: War;
|
@Input() war: War;
|
||||||
|
|
||||||
@Input() fractionFilterSelected: string;
|
@Input() fractionFilterSelected: string;
|
||||||
|
|
|
@ -2,20 +2,28 @@
|
||||||
<div class="war-header-container">
|
<div class="war-header-container">
|
||||||
<div class="pull-left head-field">
|
<div class="pull-left head-field">
|
||||||
<h4>{{'stats.scoreboard.standings' | translate}}</h4>
|
<h4>{{'stats.scoreboard.standings' | translate}}</h4>
|
||||||
<span [style.color]="fraction.COLOR_BLUFOR"
|
<span [style.color]="fractionHelpers.getFractionColor('BLUFOR',war)"
|
||||||
style="font-weight: bold; margin-right: 10px">{{fraction.BLUFOR}} {{war.ptBlufor}}</span>
|
style="font-weight: bold; margin-right: 10px">
|
||||||
|
{{fractionHelpers.getFractionName(war, 'BLUFOR')}} {{war.ptBlufor}}
|
||||||
|
</span>
|
||||||
<span style="font-size: x-large">|</span>
|
<span style="font-size: x-large">|</span>
|
||||||
<span [style.color]="fraction.COLOR_OPFOR"
|
<span [style.color]="fractionHelpers.getFractionColor('OPFOR',war)"
|
||||||
style="font-weight: bold; margin-left: 10px;">{{war.ptOpfor}} {{fraction.OPFOR}}</span>
|
style="font-weight: bold; margin-left: 10px;">
|
||||||
|
{{war.ptOpfor}} {{fractionHelpers.getFractionName(war, 'OPFOR')}}
|
||||||
|
</span>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div class="pull-left head-field" style="margin-top:0" *ngIf="isSmallLayout">
|
<div class="pull-left head-field" style="margin-top:0" *ngIf="isSmallLayout">
|
||||||
<h4>{{'stats.scoreboard.participants' | translate}}</h4>
|
<h4>{{'stats.scoreboard.participants' | translate}}</h4>
|
||||||
<span [style.color]="fraction.COLOR_BLUFOR"
|
<span [style.color]="fractionHelpers.getFractionColor('BLUFOR',war)"
|
||||||
style="font-weight: bold; margin-right: 10px">{{fraction.BLUFOR}} {{war.playersBlufor}}</span>
|
style="font-weight: bold; margin-right: 10px">
|
||||||
|
{{fractionHelpers.getFractionName(war, 'BLUFOR')}} {{war.playersBlufor}}
|
||||||
|
</span>
|
||||||
<span style="font-size: 13px;font-weight: bold;">vs</span>
|
<span style="font-size: 13px;font-weight: bold;">vs</span>
|
||||||
<span [style.color]="fraction.COLOR_OPFOR"
|
<span [style.color]="fractionHelpers.getFractionColor('OPFOR',war)"
|
||||||
style="font-weight: bold; margin-left: 10px;">{{war.playersOpfor}} {{fraction.OPFOR}}</span>
|
style="font-weight: bold; margin-left: 10px;">
|
||||||
|
{{war.playersOpfor}} {{fractionHelpers.getFractionName(war, 'OPFOR')}}
|
||||||
|
</span>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div class="pull-left head-field-pie-chart" *ngIf="!isSmallLayout">
|
<div class="pull-left head-field-pie-chart" *ngIf="!isSmallLayout">
|
||||||
|
|
|
@ -8,6 +8,7 @@ import {LogsService} from '../../../services/logs/logs.service';
|
||||||
import {ScoreboardComponent} from '../scoreboard/scoreboard.component';
|
import {ScoreboardComponent} from '../scoreboard/scoreboard.component';
|
||||||
import {BaseConfig} from '../../../app.config';
|
import {BaseConfig} from '../../../app.config';
|
||||||
import {Observable} from 'rxjs';
|
import {Observable} from 'rxjs';
|
||||||
|
import {FractionHelpers} from '../../../utils/global.helpers';
|
||||||
|
|
||||||
|
|
||||||
@Component({
|
@Component({
|
||||||
|
@ -19,6 +20,8 @@ export class WarHeaderComponent implements OnInit {
|
||||||
|
|
||||||
readonly fraction = Fraction;
|
readonly fraction = Fraction;
|
||||||
|
|
||||||
|
readonly fractionHelpers = FractionHelpers;
|
||||||
|
|
||||||
war: War;
|
war: War;
|
||||||
|
|
||||||
@ViewChild('scoreboard') scoreBoardComponent: ScoreboardComponent;
|
@ViewChild('scoreboard') scoreBoardComponent: ScoreboardComponent;
|
||||||
|
@ -43,9 +46,7 @@ export class WarHeaderComponent implements OnInit {
|
||||||
|
|
||||||
playerChart: any[] = [];
|
playerChart: any[] = [];
|
||||||
|
|
||||||
colorScheme = {
|
colorScheme;
|
||||||
domain: [Fraction.COLOR_OPFOR, Fraction.COLOR_BLUFOR]
|
|
||||||
};
|
|
||||||
|
|
||||||
constructor(private route: ActivatedRoute,
|
constructor(private route: ActivatedRoute,
|
||||||
private warService: WarService,
|
private warService: WarService,
|
||||||
|
@ -64,8 +65,18 @@ export class WarHeaderComponent implements OnInit {
|
||||||
this.fractionStatsInitialized = false;
|
this.fractionStatsInitialized = false;
|
||||||
this.fractionFilterSelected = undefined;
|
this.fractionFilterSelected = undefined;
|
||||||
|
|
||||||
|
this.colorScheme = {
|
||||||
|
domain: [
|
||||||
|
FractionHelpers.getFractionColor('OPFOR', war),
|
||||||
|
FractionHelpers.getFractionColor('BLUFOR', war)
|
||||||
|
]
|
||||||
|
};
|
||||||
|
|
||||||
this.playerChart =
|
this.playerChart =
|
||||||
ChartUtils.getSingleDataArray(Fraction.OPFOR, war.playersOpfor, Fraction.BLUFOR, war.playersBlufor);
|
ChartUtils.getSingleDataArray(
|
||||||
|
FractionHelpers.getFractionName(war, 'OPFOR'), war.playersOpfor,
|
||||||
|
FractionHelpers.getFractionName(war, 'BLUFOR'), war.playersBlufor
|
||||||
|
);
|
||||||
Object.assign(this, [this.playerChart]);
|
Object.assign(this, [this.playerChart]);
|
||||||
});
|
});
|
||||||
|
|
||||||
|
|
|
@ -25,6 +25,33 @@
|
||||||
</select>
|
</select>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
<div class="form-group">
|
||||||
|
<label for="fractionMappingBlufor">{{'stats.war.submit.mapping.blufor' | translate}}</label>
|
||||||
|
<select id="fractionMappingBlufor" name="fractionMappingBlufor" class="form-control btn dropdown-toggle"
|
||||||
|
required
|
||||||
|
[(ngModel)]="war.fractionMappingBlufor">
|
||||||
|
<option value="{{fraction.ARF}}">{{fraction.ARF}}</option>
|
||||||
|
<option value="{{fraction.SWORD}}">{{fraction.SWORD}}</option>
|
||||||
|
<option value="OPFOR">{{fraction.OPFOR}}</option>
|
||||||
|
<option value="BLUFOR">{{fraction.BLUFOR}}</option>
|
||||||
|
</select>
|
||||||
|
<show-error displayName="{{'stats.war.submit.mapping.blufor' | translate}}" controlPath="fraction"></show-error>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="form-group">
|
||||||
|
<label for="fractionMappingOpfor">{{'stats.war.submit.mapping.opfor' | translate}}</label>
|
||||||
|
<select id="fractionMappingOpfor" name="fractionMappingOpfor" class="form-control btn dropdown-toggle"
|
||||||
|
required
|
||||||
|
[(ngModel)]="war.fractionMappingOpfor">
|
||||||
|
<option value="{{fraction.ARF}}">{{fraction.ARF}}</option>
|
||||||
|
<option value="{{fraction.SWORD}}">{{fraction.SWORD}}</option>
|
||||||
|
<option value="OPFOR">{{fraction.OPFOR}}</option>
|
||||||
|
<option value="BLUFOR">{{fraction.BLUFOR}}</option>
|
||||||
|
</select>
|
||||||
|
<show-error displayName="{{'stats.war.submit.mapping.opfor' | translate}}" controlPath="fraction"></show-error>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
|
||||||
<div class="form-group" *ngIf="!war._id">
|
<div class="form-group" *ngIf="!war._id">
|
||||||
<label for="log">{{'stats.war.submit.logfile' | translate}}</label>
|
<label for="log">{{'stats.war.submit.logfile' | translate}}</label>
|
||||||
<input id="log" name="log" class="ui-button form-control" type="file"
|
<input id="log" name="log" class="ui-button form-control" type="file"
|
||||||
|
@ -35,24 +62,24 @@
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div class="form-group" *ngIf="war._id">
|
<div class="form-group" *ngIf="war._id">
|
||||||
<label for="ptBlufor">{{'stats.war.submit.points' | translate}} {{fraction.BLUFOR}}</label>
|
<label for="ptBlufor">{{'stats.war.submit.points' | translate}} {{fractionHelpers.getFractionName(war, "BLUFOR")}}</label>
|
||||||
<input type="number" class="form-control"
|
<input type="number" class="form-control"
|
||||||
[(ngModel)]="war.ptBlufor"
|
[(ngModel)]="war.ptBlufor"
|
||||||
name="ptBlufor"
|
name="ptBlufor"
|
||||||
id="ptBlufor"
|
id="ptBlufor"
|
||||||
required min="0"/>
|
required min="0"/>
|
||||||
<show-error displayName="{{'stats.war.submit.points' | translate}} {{fraction.BLUFOR}}"
|
<show-error displayName="{{'stats.war.submit.points' | translate}}"
|
||||||
controlPath="ptBlufor"></show-error>
|
controlPath="ptBlufor"></show-error>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div class="form-group" *ngIf="war._id">
|
<div class="form-group" *ngIf="war._id">
|
||||||
<label for="ptOpfor">{{'stats.war.submit.points' | translate}} {{fraction.OPFOR}}</label>
|
<label for="ptOpfor">{{'stats.war.submit.points' | translate}} {{fractionHelpers.getFractionName(war, "OPFOR")}}</label>
|
||||||
<input type="number" class="form-control"
|
<input type="number" class="form-control"
|
||||||
[(ngModel)]="war.ptOpfor"
|
[(ngModel)]="war.ptOpfor"
|
||||||
name="ptOpfor"
|
name="ptOpfor"
|
||||||
id="ptOpfor"
|
id="ptOpfor"
|
||||||
required min="0"/>
|
required min="0"/>
|
||||||
<show-error displayName="{{'stats.war.submit.points' | translate}} {{fraction.OPFOR}}"
|
<show-error displayName="{{'stats.war.submit.points' | translate}}"
|
||||||
controlPath="ptOpfor"></show-error>
|
controlPath="ptOpfor"></show-error>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
|
|
@ -9,6 +9,7 @@ import {SpinnerService} from '../../../services/user-interface/spinner/spinner.s
|
||||||
import {Subscription} from 'rxjs';
|
import {Subscription} from 'rxjs';
|
||||||
import {Fraction} from '../../../utils/fraction.enum';
|
import {Fraction} from '../../../utils/fraction.enum';
|
||||||
import {TranslateService} from '@ngx-translate/core';
|
import {TranslateService} from '@ngx-translate/core';
|
||||||
|
import {FractionHelpers} from '../../../utils/global.helpers';
|
||||||
|
|
||||||
|
|
||||||
@Component({
|
@Component({
|
||||||
|
@ -28,6 +29,8 @@ export class WarSubmitComponent {
|
||||||
|
|
||||||
readonly fraction = Fraction;
|
readonly fraction = Fraction;
|
||||||
|
|
||||||
|
readonly fractionHelpers = FractionHelpers;
|
||||||
|
|
||||||
showFileError = false;
|
showFileError = false;
|
||||||
|
|
||||||
loading = false;
|
loading = false;
|
||||||
|
|
|
@ -1,12 +1,23 @@
|
||||||
export enum Fraction {
|
export enum Fraction {
|
||||||
|
COLOR_NEUTRAL = '#222222',
|
||||||
|
ARF = 'ARF',
|
||||||
|
COLOR_ARF = '#336699',
|
||||||
|
COLOR_ARF_LIGHT = '#6666dd',
|
||||||
|
COLOR_ARF_DARK = '#0C0CA6',
|
||||||
|
COLOR_ARF_GREY = '#515179',
|
||||||
|
SWORD = 'SWORD',
|
||||||
|
COLOR_SWORD = '#8b8b8b',
|
||||||
|
COLOR_SWORD_GREY = '#282828',
|
||||||
|
COLOR_SWORD_DARK = '#101010',
|
||||||
|
COLOR_SWORD_LIGHT = '#b8b8b8',
|
||||||
BLUFOR = 'NATO',
|
BLUFOR = 'NATO',
|
||||||
OPFOR = 'CSAT',
|
|
||||||
COLOR_BLUFOR = '#3c5fa1',
|
COLOR_BLUFOR = '#3c5fa1',
|
||||||
COLOR_BLUFOR_LIGHT = '#6666dd',
|
COLOR_BLUFOR_LIGHT = '#6666dd',
|
||||||
COLOR_BLUFOR_DARK = '#0C0CA6',
|
COLOR_BLUFOR_DARK = '#0C0CA6',
|
||||||
COLOR_BLUFOR_GREY = '#515179',
|
COLOR_BLUFOR_GREY = '#515179',
|
||||||
|
OPFOR = 'CSAT',
|
||||||
COLOR_OPFOR = '#a90100',
|
COLOR_OPFOR = '#a90100',
|
||||||
COLOR_OPFOR_DARK = '#890F0F',
|
COLOR_OPFOR_DARK = '#890F0F',
|
||||||
COLOR_OPFOR_LIGHT = '#fb5555',
|
COLOR_OPFOR_LIGHT = '#fb5555',
|
||||||
COLOR_OPFOR_GREY = '#955c5f'
|
COLOR_OPFOR_GREY = '#955c5f',
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,4 +1,6 @@
|
||||||
import {MatButtonToggleGroup} from '@angular/material';
|
import {MatButtonToggleGroup} from '@angular/material';
|
||||||
|
import {War} from '../models/model-interfaces';
|
||||||
|
import {Fraction} from './fraction.enum';
|
||||||
|
|
||||||
export const CSSHelpers = {
|
export const CSSHelpers = {
|
||||||
getBackgroundCSS: (imageUrl) => {
|
getBackgroundCSS: (imageUrl) => {
|
||||||
|
@ -10,6 +12,90 @@ export const CSSHelpers = {
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
export const FractionHelpers = {
|
||||||
|
getFractionColor: (fraction, war?: War, style?) => {
|
||||||
|
let switchInput;
|
||||||
|
if (war) {
|
||||||
|
switchInput = (fraction === 'BLUFOR' ? war.fractionMappingBlufor : war.fractionMappingOpfor);
|
||||||
|
} else {
|
||||||
|
switchInput = fraction;
|
||||||
|
}
|
||||||
|
|
||||||
|
switch (switchInput) {
|
||||||
|
case Fraction.ARF:
|
||||||
|
switch (style) {
|
||||||
|
case 'LIGHT':
|
||||||
|
return Fraction.COLOR_ARF_LIGHT;
|
||||||
|
case 'DARK':
|
||||||
|
return Fraction.COLOR_ARF_DARK;
|
||||||
|
case 'GREY':
|
||||||
|
return Fraction.COLOR_ARF_GREY;
|
||||||
|
default:
|
||||||
|
return Fraction.COLOR_ARF;
|
||||||
|
}
|
||||||
|
case 'BLUFOR':
|
||||||
|
switch (style) {
|
||||||
|
case 'LIGHT':
|
||||||
|
return Fraction.COLOR_BLUFOR_LIGHT;
|
||||||
|
case 'DARK':
|
||||||
|
return Fraction.COLOR_BLUFOR_DARK;
|
||||||
|
case 'GREY':
|
||||||
|
return Fraction.COLOR_BLUFOR_GREY;
|
||||||
|
default:
|
||||||
|
return Fraction.COLOR_BLUFOR;
|
||||||
|
}
|
||||||
|
case 'OPFOR':
|
||||||
|
switch (style) {
|
||||||
|
case 'LIGHT':
|
||||||
|
return Fraction.COLOR_OPFOR_LIGHT;
|
||||||
|
case 'DARK':
|
||||||
|
return Fraction.COLOR_OPFOR_DARK;
|
||||||
|
case 'GREY':
|
||||||
|
return Fraction.COLOR_OPFOR_GREY;
|
||||||
|
default:
|
||||||
|
return Fraction.COLOR_OPFOR;
|
||||||
|
}
|
||||||
|
case Fraction.SWORD:
|
||||||
|
switch (style) {
|
||||||
|
case 'LIGHT':
|
||||||
|
return Fraction.COLOR_SWORD_LIGHT;
|
||||||
|
case 'DARK':
|
||||||
|
return Fraction.COLOR_SWORD_DARK;
|
||||||
|
case 'GREY':
|
||||||
|
return Fraction.COLOR_SWORD_GREY;
|
||||||
|
default:
|
||||||
|
return Fraction.COLOR_SWORD;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
|
||||||
|
getFractionColors: (war: War, fraction) => {
|
||||||
|
switch (fraction === 'BLUFOR' ? war.fractionMappingBlufor : war.fractionMappingOpfor) {
|
||||||
|
case Fraction.ARF:
|
||||||
|
return Fraction.COLOR_ARF;
|
||||||
|
case 'BLUFOR':
|
||||||
|
return Fraction.COLOR_BLUFOR;
|
||||||
|
case 'OPFOR':
|
||||||
|
return Fraction.COLOR_OPFOR;
|
||||||
|
case Fraction.SWORD:
|
||||||
|
return Fraction.COLOR_SWORD;
|
||||||
|
}
|
||||||
|
},
|
||||||
|
|
||||||
|
getFractionName: (war: War, fraction) => {
|
||||||
|
switch (fraction === 'BLUFOR' ? war.fractionMappingBlufor : war.fractionMappingOpfor) {
|
||||||
|
case Fraction.ARF:
|
||||||
|
return Fraction.ARF;
|
||||||
|
case 'BLUFOR':
|
||||||
|
return Fraction.BLUFOR;
|
||||||
|
case 'OPFOR':
|
||||||
|
return Fraction.OPFOR;
|
||||||
|
case Fraction.SWORD:
|
||||||
|
return Fraction.SWORD;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
export const UIHelpers = {
|
export const UIHelpers = {
|
||||||
toggleReleaseButton: (currentVal, group?: MatButtonToggleGroup) => {
|
toggleReleaseButton: (currentVal, group?: MatButtonToggleGroup) => {
|
||||||
if (group) {
|
if (group) {
|
||||||
|
|
Before Width: | Height: | Size: 809 KiB After Width: | Height: | Size: 832 KiB |
|
@ -88,6 +88,8 @@
|
||||||
"stats.war.submit.button.submit": "Bestätigen",
|
"stats.war.submit.button.submit": "Bestätigen",
|
||||||
"stats.war.submit.button.cancel": "Abbrechen",
|
"stats.war.submit.button.cancel": "Abbrechen",
|
||||||
"stats.war.submit.error.file.format": "Logfile muss im Format RPT, LOG oder TXT vorliegen",
|
"stats.war.submit.error.file.format": "Logfile muss im Format RPT, LOG oder TXT vorliegen",
|
||||||
|
"stats.war.submit.mapping.blufor": "Fraktion Zuordnung NATO",
|
||||||
|
"stats.war.submit.mapping.opfor": "Fraktion Zuordnung CSAT",
|
||||||
|
|
||||||
"stats.campaign.submit.headline.new": "Neue Kampagne hinzufügen",
|
"stats.campaign.submit.headline.new": "Neue Kampagne hinzufügen",
|
||||||
"stats.campaign.submit.headline.edit": "Kampagne editieren",
|
"stats.campaign.submit.headline.edit": "Kampagne editieren",
|
||||||
|
|
|
@ -95,6 +95,8 @@
|
||||||
"stats.war.submit.button.submit": "Submit",
|
"stats.war.submit.button.submit": "Submit",
|
||||||
"stats.war.submit.button.cancel": "Cancel",
|
"stats.war.submit.button.cancel": "Cancel",
|
||||||
"stats.war.submit.error.file.format": "Logfile requires RPT, LOG or TXT format",
|
"stats.war.submit.error.file.format": "Logfile requires RPT, LOG or TXT format",
|
||||||
|
"stats.war.submit.mapping.blufor": "Fraction Mapping NATO",
|
||||||
|
"stats.war.submit.mapping.opfor": "Fraction Mapping CSAT",
|
||||||
|
|
||||||
"stats.campaign.submit.headline.new": "Add new campaign",
|
"stats.campaign.submit.headline.new": "Add new campaign",
|
||||||
"stats.campaign.submit.headline.edit": "Edit campaign",
|
"stats.campaign.submit.headline.edit": "Edit campaign",
|
||||||
|
|