generate.ts 2.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119
  1. setup.generateNPC = function(dict:NPCsDict,purpose:string,flags:NPCGenerateOptions):NPC{
  2. const npcId = dict.create(purpose);
  3. const npc = dict.npc(npcId);
  4. const generators = flags.generators ?? ['default'];
  5. for(const generatorId of generators){
  6. if(!setup.npcGenerators[generatorId]){
  7. console.warn('Generator missing in setup.generateNPC:',generatorId);
  8. continue;
  9. }
  10. const generator = setup.npcGenerators[generatorId];
  11. flags = generator(flags);
  12. }
  13. for(const [fieldKey,fieldValue] of Object.entries(flags.fields ?? {}))
  14. npc[fieldKey] = fieldValue;
  15. return npc;
  16. }
  17. setup.npcGenerators = {};
  18. setup.npcGenerators.default = function(flags:NPCGenerateOptions){
  19. if(flags.fields.gender == EGender.FEMALE)
  20. flags = setup.npcGenerators.female(flags);
  21. else
  22. flags = setup.npcGenerators.male(flags);
  23. flags.fields.lastname ??= setup.randomName('sur');
  24. flags.fields.rel ??= 50;
  25. flags.fields.fam ??= 0;
  26. flags.fields.desc = '';
  27. return flags;
  28. }
  29. setup.npcGenerators.female = function(flags:NPCGenerateOptions){
  30. flags.fields.firstname ??= setup.randomName('female');
  31. return flags;
  32. };
  33. setup.npcGenerators.male = function(flags:NPCGenerateOptions){
  34. flags.fields.firstname ??= setup.randomName('male');
  35. flags.fields.image = setup.getRandomNpcImage({gender:EGender.MALE}).path;
  36. return flags;
  37. };
  38. const enum EAgeBracket{
  39. UNKNOWN=-1,
  40. /**
  41. * 0-0.5
  42. */
  43. Newborn,
  44. /**
  45. * 0.5-1
  46. */
  47. Infant,
  48. /**
  49. * 2-4
  50. */
  51. Toddler,
  52. /**
  53. * 5-12
  54. */
  55. Kid,
  56. /**
  57. * 13-17
  58. */
  59. Teen,
  60. /**
  61. * 18-29
  62. */
  63. YoungAdult,
  64. /**
  65. * 30-44
  66. */
  67. Adult,
  68. /**
  69. * 45-64
  70. */
  71. MiddleAged,
  72. /**
  73. * 65-79
  74. */
  75. Old,
  76. /**
  77. * 80+
  78. */
  79. Ancient,
  80. }
  81. setup.getRandomNpcImage = function(filters:{[key:string]:any}):NPCImageDefinition{
  82. const filterFunction = function(npcImage:NPCImageDefinition){
  83. for(const [filterKey,filterValue] of Object.entries(filters)){
  84. if(npcImage[filterKey] !== filterValue)
  85. return false;
  86. }
  87. return true;
  88. }
  89. const allImagesAsArray = Object.entries(setup.npcImages).map(entry=>Object.assign({id:entry[0]},entry[1]));
  90. const allImagesFiltered = allImagesAsArray.filter(filterFunction);
  91. if(allImagesFiltered.length)
  92. return allImagesFiltered.random();
  93. console.error('Failed to retrieve random image in getRandomNpcImage with filters:',filters);
  94. return {path:'characters/random/null.webp', gender: EGender.UNKNOWN,age:EAgeBracket.UNKNOWN};
  95. }
  96. setup.npcImages = {};
  97. setup.npcImages.i10 = {
  98. path:'characters/random/10.jpg',
  99. gender: EGender.FEMALE,
  100. age: EAgeBracket.Teen
  101. }