@reldens/game-data-generator 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/README.md +21 -0
- package/examples/generate-monsters-attributes-per-level.js +60 -0
- package/examples/generate-monsters-experience-per-level.js +29 -0
- package/examples/generate-players-experience-per-level.js +17 -0
- package/examples/generated/.gitkeep +0 -0
- package/examples/monsters-attributes-per-level.json +9802 -0
- package/examples/monsters-experience-per-level.json +2401 -0
- package/examples/players-experience-per-level.json +601 -0
- package/index.js +15 -0
- package/lib/files/file-handler.js +43 -0
- package/lib/generator/game-data-generator.js +45 -0
- package/lib/generator/monsters-attributes-per-level.js +90 -0
- package/lib/generator/monsters-experience-per-level.js +129 -0
- package/lib/generator/players-experience-per-level.js +82 -0
- package/lib/validator/monsters-attributes-per-level-validator.js +33 -0
- package/lib/validator/monsters-experience-per-level-validator.js +29 -0
- package/lib/validator/players-experience-per-level-validator.js +29 -0
- package/package.json +40 -0
|
@@ -0,0 +1,90 @@
|
|
|
1
|
+
/**
|
|
2
|
+
*
|
|
3
|
+
* Reldens - Game Data Generator - MonsterAttributesPerLevel
|
|
4
|
+
*
|
|
5
|
+
*/
|
|
6
|
+
|
|
7
|
+
const { MonstersAttributesPerLevelValidator } = require('../validator/monsters-attributes-per-level-validator');
|
|
8
|
+
const { GameDataGenerator } = require('./game-data-generator');
|
|
9
|
+
const { sc, Logger} = require('@reldens/utils');
|
|
10
|
+
|
|
11
|
+
class MonsterAttributesPerLevel extends GameDataGenerator
|
|
12
|
+
{
|
|
13
|
+
|
|
14
|
+
constructor(props)
|
|
15
|
+
{
|
|
16
|
+
super();
|
|
17
|
+
this.optionsValidator = new MonstersAttributesPerLevelValidator();
|
|
18
|
+
this.typeScaleFactors = {};
|
|
19
|
+
this.monsters = {};
|
|
20
|
+
this.setReady(props);
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
setOptions(options)
|
|
24
|
+
{
|
|
25
|
+
// required:
|
|
26
|
+
this.monsterBase = sc.get(options, 'monsterBase', false);
|
|
27
|
+
this.typeTemplates = sc.get(options, 'typeTemplates', false);
|
|
28
|
+
this.monsterTypesVariations = sc.get(options, 'monsterTypesVariations', false);
|
|
29
|
+
this.variationsScaleFactorsMinMax = sc.get(options, 'variationsScaleFactorsMinMax', false);
|
|
30
|
+
// optional:
|
|
31
|
+
this.jsonFileName = sc.get(options, 'jsonFileName', 'monsters-attributes-per-level-'+this.currentDate+'.json');
|
|
32
|
+
this.generateFolderPath = sc.get(options, 'generateFolderPath', 'generated');
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
async generate()
|
|
36
|
+
{
|
|
37
|
+
this.isReady = this.validate();
|
|
38
|
+
if(!this.isReady){
|
|
39
|
+
return false;
|
|
40
|
+
}
|
|
41
|
+
// define scale factors for each monster type:
|
|
42
|
+
for (let monsterType of this.monsterTypesVariations) {
|
|
43
|
+
let factor = this.variationsScaleFactorsMinMax[monsterType];
|
|
44
|
+
this.typeScaleFactors[monsterType] = Math.random() * (factor.max - factor.min) + factor.min;
|
|
45
|
+
}
|
|
46
|
+
await this.fileHandler.createFolder(this.generateFolderPath);
|
|
47
|
+
await this.fileHandler.writeFile(
|
|
48
|
+
this.fileHandler.joinPaths(this.generateFolderPath, this.jsonFileName),
|
|
49
|
+
JSON.stringify(this.generateMonstersData())
|
|
50
|
+
);
|
|
51
|
+
Logger.info('Data saved! Check the "generated" folder.');
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
generateMonstersData()
|
|
55
|
+
{
|
|
56
|
+
for (let level = 1; level <= 100; level ++) {
|
|
57
|
+
this.monsters[level] = {};
|
|
58
|
+
this.generateMonster(level);
|
|
59
|
+
}
|
|
60
|
+
return this.monsters;
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
generateMonster(level)
|
|
64
|
+
{
|
|
65
|
+
let typesKeys = Object.keys(this.typeTemplates);
|
|
66
|
+
for (let monstersType of this.monsterTypesVariations) {
|
|
67
|
+
this.monsters[level][monstersType] = {};
|
|
68
|
+
for (let typeKey of typesKeys) {
|
|
69
|
+
this.monsters[level][monstersType][typeKey] = this.applyTemplate(typeKey, level, monstersType);
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
applyTemplate(typeKey, level, monsterType)
|
|
75
|
+
{
|
|
76
|
+
let base = this.monsterBase;
|
|
77
|
+
let result = {...base};
|
|
78
|
+
let scaleTypeFactor = this.typeScaleFactors[monsterType];
|
|
79
|
+
let templatesProperties = Object.keys(this.typeTemplates[typeKey]);
|
|
80
|
+
for (let key of templatesProperties) {
|
|
81
|
+
let range = this.typeTemplates[typeKey][key];
|
|
82
|
+
let scale = Math.random() * (range.max - range.min) + range.min;
|
|
83
|
+
result[key] = Math.round(base[key] * (1 + scale / 100) * (1 + level / 20) * scaleTypeFactor);
|
|
84
|
+
}
|
|
85
|
+
return result;
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
module.exports.MonsterAttributesPerLevel = MonsterAttributesPerLevel;
|
|
@@ -0,0 +1,129 @@
|
|
|
1
|
+
/**
|
|
2
|
+
*
|
|
3
|
+
* Reldens - Game Data Generator - MonstersExperiencePerLevel
|
|
4
|
+
*
|
|
5
|
+
*/
|
|
6
|
+
|
|
7
|
+
const { MonstersExperiencePerLevelValidator } = require('../validator/monsters-experience-per-level-validator');
|
|
8
|
+
const { GameDataGenerator } = require('./game-data-generator');
|
|
9
|
+
const { Logger, sc } = require('@reldens/utils');
|
|
10
|
+
|
|
11
|
+
class MonstersExperiencePerLevel extends GameDataGenerator
|
|
12
|
+
{
|
|
13
|
+
|
|
14
|
+
constructor(props)
|
|
15
|
+
{
|
|
16
|
+
super();
|
|
17
|
+
this.optionsValidator = new MonstersExperiencePerLevelValidator();
|
|
18
|
+
this.experiencePerVariationAndLevel = {};
|
|
19
|
+
this.setReady(props);
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
setOptions(options)
|
|
23
|
+
{
|
|
24
|
+
// required:
|
|
25
|
+
this.levelsExperienceByKey = sc.get(options, 'levelsExperienceByKey', false);
|
|
26
|
+
this.variations = sc.get(options, 'variations', false);
|
|
27
|
+
this.decrementProportionPerLevel = sc.get(options, 'decrementProportionPerLevel', false);
|
|
28
|
+
// optional:
|
|
29
|
+
this.jsonFileName = sc.get(options, 'jsonFileName', 'monsters-experience-per-level-'+this.currentDate+'.json');
|
|
30
|
+
this.generateFolderPath = sc.get(options, 'generateFolderPath', 'generated');
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
async generate()
|
|
34
|
+
{
|
|
35
|
+
this.isReady = this.validate();
|
|
36
|
+
if(!this.isReady){
|
|
37
|
+
return false;
|
|
38
|
+
}
|
|
39
|
+
await this.fileHandler.createFolder(this.generateFolderPath);
|
|
40
|
+
await this.fileHandler.writeFile(
|
|
41
|
+
this.fileHandler.joinPaths(this.generateFolderPath, this.jsonFileName),
|
|
42
|
+
JSON.stringify(this.generateExperience())
|
|
43
|
+
);
|
|
44
|
+
Logger.info('Data saved! Check the "generated" folder.');
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
generateExperience()
|
|
48
|
+
{
|
|
49
|
+
let levelsKeys = Object.keys(this.levelsExperienceByKey);
|
|
50
|
+
let variationsKeys = Object.keys(this.variations);
|
|
51
|
+
let decrementProportion = {};
|
|
52
|
+
for (let variationKey of variationsKeys) {
|
|
53
|
+
decrementProportion[variationKey] = 0;
|
|
54
|
+
}
|
|
55
|
+
for (let levelKey of levelsKeys) {
|
|
56
|
+
this.experiencePerVariationAndLevel[levelKey] = this.levelsExperienceByKey[levelKey];
|
|
57
|
+
let reqExp = this.levelsExperienceByKey[levelKey].req;
|
|
58
|
+
for (let variationKey of variationsKeys) {
|
|
59
|
+
decrementProportion[variationKey] = Number(this.decrementProportionPerLevel[levelKey] || decrementProportion[variationKey]);
|
|
60
|
+
let newVariationValue = this.calculateVariation(this.variations[variationKey], decrementProportion[variationKey]);
|
|
61
|
+
let newVariationExperience = this.calculateExperience(newVariationValue, reqExp);
|
|
62
|
+
let previousLevel = this.experiencePerVariationAndLevel[Number(levelKey) - 1];
|
|
63
|
+
let previousExp = 0;
|
|
64
|
+
if (previousLevel) {
|
|
65
|
+
previousExp = this.experiencePerVariationAndLevel[Number(levelKey) - 1][variationKey].exp;
|
|
66
|
+
if(previousExp > newVariationExperience){
|
|
67
|
+
let fixedValidation = false;
|
|
68
|
+
for (let i = 0.9; i >= 0.1; i -= 0.1) {
|
|
69
|
+
let testDecrementProportion = this.roundToPrecision(decrementProportion[variationKey] * i, 5);
|
|
70
|
+
let testNewVariationValue = this.calculateVariation(this.variations[variationKey], testDecrementProportion);
|
|
71
|
+
let testNewVariationExperience = this.calculateExperience(testNewVariationValue, reqExp);
|
|
72
|
+
if (previousExp <= testNewVariationExperience) {
|
|
73
|
+
Logger.warning('Level decrement fixed.', {
|
|
74
|
+
levelKey,
|
|
75
|
+
variationKey,
|
|
76
|
+
decrementProportion: decrementProportion[variationKey],
|
|
77
|
+
testDecrementProportion
|
|
78
|
+
});
|
|
79
|
+
decrementProportion[variationKey] = testDecrementProportion;
|
|
80
|
+
newVariationValue = testNewVariationValue;
|
|
81
|
+
newVariationExperience = testNewVariationExperience;
|
|
82
|
+
fixedValidation = true;
|
|
83
|
+
break;
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
if (!fixedValidation) {
|
|
87
|
+
Logger.warning('Level decrement not fixed.', {
|
|
88
|
+
levelKey,
|
|
89
|
+
variationKey,
|
|
90
|
+
decrementProportion: decrementProportion[variationKey]
|
|
91
|
+
});
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
let kills = Math.ceil(reqExp / newVariationExperience);
|
|
96
|
+
this.variations[variationKey] = newVariationValue;
|
|
97
|
+
this.experiencePerVariationAndLevel[levelKey][variationKey] = {
|
|
98
|
+
decrementProportion: decrementProportion[variationKey],
|
|
99
|
+
randomVariation: this.variations[variationKey],
|
|
100
|
+
exp: this.roundToPrecision(newVariationExperience, 2),
|
|
101
|
+
kills: kills
|
|
102
|
+
}
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
return this.experiencePerVariationAndLevel;
|
|
106
|
+
}
|
|
107
|
+
|
|
108
|
+
calculateExperience(variationValue, reqExp)
|
|
109
|
+
{
|
|
110
|
+
return this.roundToPrecision((variationValue * reqExp) / 100, 0);
|
|
111
|
+
}
|
|
112
|
+
|
|
113
|
+
calculateVariation(variationValue, decrementProportion)
|
|
114
|
+
{
|
|
115
|
+
let newVariation = this.roundToPrecision(variationValue - decrementProportion, 5);
|
|
116
|
+
if (newVariation <= 0) {
|
|
117
|
+
newVariation = variationValue;
|
|
118
|
+
}
|
|
119
|
+
return newVariation;
|
|
120
|
+
}
|
|
121
|
+
|
|
122
|
+
roundToPrecision(number, precision = 4)
|
|
123
|
+
{
|
|
124
|
+
return Number(number.toFixed(precision));
|
|
125
|
+
}
|
|
126
|
+
|
|
127
|
+
}
|
|
128
|
+
|
|
129
|
+
module.exports.MonstersExperiencePerLevel = MonstersExperiencePerLevel;
|
|
@@ -0,0 +1,82 @@
|
|
|
1
|
+
/**
|
|
2
|
+
*
|
|
3
|
+
* Reldens - Game Data Generator - PlayersExperiencePerLevel
|
|
4
|
+
*
|
|
5
|
+
*/
|
|
6
|
+
|
|
7
|
+
const { PlayersExperiencePerLevelValidator } = require('../validator/players-experience-per-level-validator');
|
|
8
|
+
const { GameDataGenerator } = require('./game-data-generator');
|
|
9
|
+
const { Logger, sc } = require('@reldens/utils');
|
|
10
|
+
|
|
11
|
+
class PlayersExperiencePerLevel extends GameDataGenerator
|
|
12
|
+
{
|
|
13
|
+
|
|
14
|
+
constructor(props)
|
|
15
|
+
{
|
|
16
|
+
super();
|
|
17
|
+
this.optionsValidator = new PlayersExperiencePerLevelValidator();
|
|
18
|
+
this.levels = {};
|
|
19
|
+
this.setReady(props);
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
setOptions(options)
|
|
23
|
+
{
|
|
24
|
+
// required:
|
|
25
|
+
// experience required to reach level 2 from level 1 (example: 10):
|
|
26
|
+
this.startExp = sc.get(options, 'startExp', false);
|
|
27
|
+
// initial growth per level (example: 1.1):
|
|
28
|
+
this.baseGrowthFactor = sc.get(options, 'baseGrowthFactor', false);
|
|
29
|
+
// maximum level you want to calculate up to (example: 100):
|
|
30
|
+
this.maxLevel = sc.get(options, 'maxLevel', false);
|
|
31
|
+
// optional:
|
|
32
|
+
// increase in growth factor per level (example: 0.01):
|
|
33
|
+
this.growthIncrease = sc.get(options, 'growthIncrease', 0);
|
|
34
|
+
this.jsonFileName = sc.get(options, 'jsonFileName', 'players-experience-per-level-'+this.currentDate+'.json');
|
|
35
|
+
this.generateFolderPath = sc.get(options, 'generateFolderPath', 'generated');
|
|
36
|
+
this.baseGrowthFactorPerLevel = sc.get(options, 'baseGrowthFactorPerLevel', {});
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
async generate()
|
|
40
|
+
{
|
|
41
|
+
this.isReady = this.validate();
|
|
42
|
+
if(!this.isReady){
|
|
43
|
+
return;
|
|
44
|
+
}
|
|
45
|
+
await this.fileHandler.createFolder(this.generateFolderPath);
|
|
46
|
+
await this.fileHandler.writeFile(
|
|
47
|
+
this.fileHandler.joinPaths(this.generateFolderPath, this.jsonFileName),
|
|
48
|
+
JSON.stringify(this.calculateLevelExpDynamicGrowth())
|
|
49
|
+
);
|
|
50
|
+
Logger.info('Data saved! Check the "generated" folder.');
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
calculateLevelExpDynamicGrowth()
|
|
54
|
+
{
|
|
55
|
+
let totalExp = 0;
|
|
56
|
+
let growthFactor = this.baseGrowthFactor;
|
|
57
|
+
for (let level = 1; level <= this.maxLevel; level++) {
|
|
58
|
+
if (level === 1) {
|
|
59
|
+
totalExp = this.startExp;
|
|
60
|
+
this.levels[level] = {req: this.startExp, total: this.startExp, growthFactor: growthFactor};
|
|
61
|
+
|
|
62
|
+
continue;
|
|
63
|
+
}
|
|
64
|
+
growthFactor = this.roundToPrecision(this.baseGrowthFactorPerLevel[level] || growthFactor);
|
|
65
|
+
let previousLevelReqExp = this.levels[level - 1].req;
|
|
66
|
+
let reqExp = Math.floor(previousLevelReqExp * growthFactor);
|
|
67
|
+
// increase the growth factor for the next level:
|
|
68
|
+
growthFactor = this.roundToPrecision(growthFactor + this.growthIncrease);
|
|
69
|
+
totalExp += reqExp;
|
|
70
|
+
this.levels[level] = {diff: reqExp - previousLevelReqExp, req: reqExp, total: totalExp, growthFactor};
|
|
71
|
+
}
|
|
72
|
+
return this.levels;
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
roundToPrecision(number, precision = 4)
|
|
76
|
+
{
|
|
77
|
+
return Number(number.toFixed(precision));
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
module.exports.PlayersExperiencePerLevel = PlayersExperiencePerLevel;
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
/**
|
|
2
|
+
*
|
|
3
|
+
* Reldens - Game Data Generator - MonstersAttributesPerLevelValidator
|
|
4
|
+
*
|
|
5
|
+
*/
|
|
6
|
+
|
|
7
|
+
const { Logger, sc } = require('@reldens/utils');
|
|
8
|
+
|
|
9
|
+
class MonstersAttributesPerLevelValidator
|
|
10
|
+
{
|
|
11
|
+
validate(options)
|
|
12
|
+
{
|
|
13
|
+
if(!sc.get(options, 'monsterBase')){
|
|
14
|
+
Logger.error('Missing required option: "monsterBase".');
|
|
15
|
+
return false;
|
|
16
|
+
}
|
|
17
|
+
if(!sc.get(options, 'typeTemplates')){
|
|
18
|
+
Logger.error('Missing required option: "typeTemplates".');
|
|
19
|
+
return false;
|
|
20
|
+
}
|
|
21
|
+
if(!sc.get(options, 'monsterTypesVariations')){
|
|
22
|
+
Logger.error('Missing required option: "monsterTypesVariations".');
|
|
23
|
+
return false;
|
|
24
|
+
}
|
|
25
|
+
if(!sc.get(options, 'variationsScaleFactorsMinMax')){
|
|
26
|
+
Logger.error('Missing required option: "variationsScaleFactorsMinMax".');
|
|
27
|
+
return false;
|
|
28
|
+
}
|
|
29
|
+
return true;
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
module.exports.MonstersAttributesPerLevelValidator = MonstersAttributesPerLevelValidator;
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
/**
|
|
2
|
+
*
|
|
3
|
+
* Reldens - Game Data Generator - MonstersExperiencePerLevelValidator
|
|
4
|
+
*
|
|
5
|
+
*/
|
|
6
|
+
|
|
7
|
+
const { Logger, sc } = require('@reldens/utils');
|
|
8
|
+
|
|
9
|
+
class MonstersExperiencePerLevelValidator
|
|
10
|
+
{
|
|
11
|
+
validate(options)
|
|
12
|
+
{
|
|
13
|
+
if(!sc.get(options, 'levelsExperienceByKey')){
|
|
14
|
+
Logger.error('Missing required option: "levelsExperienceByKey".');
|
|
15
|
+
return false;
|
|
16
|
+
}
|
|
17
|
+
if(!sc.get(options, 'variations')){
|
|
18
|
+
Logger.error('Missing required option: "variations".');
|
|
19
|
+
return false;
|
|
20
|
+
}
|
|
21
|
+
if(!sc.get(options, 'decrementProportionPerLevel')){
|
|
22
|
+
Logger.error('Missing required option: "decrementProportionPerLevel".');
|
|
23
|
+
return false;
|
|
24
|
+
}
|
|
25
|
+
return true;
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
module.exports.MonstersExperiencePerLevelValidator = MonstersExperiencePerLevelValidator;
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
/**
|
|
2
|
+
*
|
|
3
|
+
* Reldens - Game Data Generator - PlayersExperiencePerLevelValidator
|
|
4
|
+
*
|
|
5
|
+
*/
|
|
6
|
+
|
|
7
|
+
const { Logger, sc } = require('@reldens/utils');
|
|
8
|
+
|
|
9
|
+
class PlayersExperiencePerLevelValidator
|
|
10
|
+
{
|
|
11
|
+
validate(options)
|
|
12
|
+
{
|
|
13
|
+
if(!sc.get(options, 'startExp')){
|
|
14
|
+
Logger.error('Missing required option: "startExp".');
|
|
15
|
+
return false;
|
|
16
|
+
}
|
|
17
|
+
if(!sc.get(options, 'baseGrowthFactor')){
|
|
18
|
+
Logger.error('Missing required option: "baseGrowthFactor".');
|
|
19
|
+
return false;
|
|
20
|
+
}
|
|
21
|
+
if(!sc.get(options, 'maxLevel')){
|
|
22
|
+
Logger.error('Missing required option: "maxLevel".');
|
|
23
|
+
return false;
|
|
24
|
+
}
|
|
25
|
+
return true;
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
module.exports.PlayersExperiencePerLevelValidator = PlayersExperiencePerLevelValidator;
|
package/package.json
ADDED
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@reldens/game-data-generator",
|
|
3
|
+
"scope": "@reldens",
|
|
4
|
+
"version": "0.1.0",
|
|
5
|
+
"description": "Reldens - Game Data Generator",
|
|
6
|
+
"author": "Damian A. Pastorini",
|
|
7
|
+
"license": "MIT",
|
|
8
|
+
"homepage": "https://github.com/damian-pastorini/game-data-generator",
|
|
9
|
+
"source": true,
|
|
10
|
+
"main": "index.js",
|
|
11
|
+
"repository": {
|
|
12
|
+
"type": "git",
|
|
13
|
+
"url": "https://github.com/damian-pastorini/game-data-generator.git"
|
|
14
|
+
},
|
|
15
|
+
"keywords": [
|
|
16
|
+
"reldens",
|
|
17
|
+
"game",
|
|
18
|
+
"data",
|
|
19
|
+
"generate",
|
|
20
|
+
"generator",
|
|
21
|
+
"random",
|
|
22
|
+
"nodejs",
|
|
23
|
+
"javascript",
|
|
24
|
+
"js",
|
|
25
|
+
"rpg",
|
|
26
|
+
"multiplayer",
|
|
27
|
+
"npc",
|
|
28
|
+
"player",
|
|
29
|
+
"enemy",
|
|
30
|
+
"enemies",
|
|
31
|
+
"level",
|
|
32
|
+
"experience"
|
|
33
|
+
],
|
|
34
|
+
"bugs": {
|
|
35
|
+
"url": "https://github.com/damian-pastorini/game-data-generator/issues"
|
|
36
|
+
},
|
|
37
|
+
"dependencies": {
|
|
38
|
+
"@reldens/utils": "^0.23.0"
|
|
39
|
+
}
|
|
40
|
+
}
|