pc_drugs.ts 3.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115
  1. class Drugs{
  2. _drugs:{[key:string]:DrugInCharacter} = {};
  3. get activeEffects():{[key: string]:Effect}{
  4. return Object.fromEntries(this.activeEffectIds.map((effectId)=>[effectId,setup.getEffect(effectId)]));
  5. }
  6. get activeEffectIds(){
  7. var activeEffects = [];
  8. for(const [drugId,drugData] of Object.entries(this._drugs)){
  9. const drugSettings = setup.getDrug(drugId);
  10. const effects = drugSettings.effects ?? {};
  11. const currentVol = drugData.vol;
  12. let mainEffect = undefined;
  13. for(const [effectId,effectData] of Object.entries(effects)){
  14. const condition = effectData.condition;
  15. if('min' in condition && condition.min > currentVol)
  16. continue;
  17. if('max' in condition && condition.max <= currentVol)
  18. continue;
  19. mainEffect = effectData.effect;
  20. activeEffects.push(mainEffect);
  21. break;
  22. }
  23. const byproductEffects = drugSettings.byproduct?.effects ?? {};
  24. for(const [effectId,effectData] of Object.entries(byproductEffects)){
  25. const condition = effectData.condition;
  26. if('min' in condition && condition.min > currentVol)
  27. continue;
  28. if('max' in condition && condition.max <= currentVol)
  29. continue;
  30. if(condition.mainEffectsInactive && mainEffect)
  31. continue;
  32. activeEffects.push(effectData.effect);
  33. break;
  34. }
  35. }
  36. return activeEffects;
  37. }
  38. deteriorate(minutes){
  39. let newDrugsValue = {};
  40. for(const [drugId,drugData] of Object.entries(this._drugs)){
  41. let newDrugData:DrugInCharacter = {vol:0};
  42. const drugSettings = setup.getDrug(drugId);
  43. const deterioration = drugSettings.deterioration * minutes;
  44. const newVolume = Math.max(0,drugData.vol - deterioration);
  45. newDrugData.vol = newVolume;
  46. if(drugSettings.byproduct){
  47. const byproductDeterioration = drugSettings.byproduct.deterioration * minutes;
  48. const newByproduct = Math.max(0,(drugData.byproduct ?? 0) - byproductDeterioration);
  49. newDrugData.byproduct = newByproduct;
  50. }
  51. if(newDrugData.vol || newDrugData.byproduct)
  52. newDrugsValue[drugId] = newDrugData;
  53. }
  54. this._drugs = newDrugsValue;
  55. }
  56. vol(drugId){
  57. return this._drugs[drugId]?.vol ?? 0;
  58. }
  59. volInc(drugId, inc){
  60. const drugSettings = setup.getDrug(drugId);
  61. this._drugs[drugId] ??= {vol:0};
  62. this._drugs[drugId].vol += inc;
  63. if(drugSettings.byproduct){
  64. const byproductBuildup = drugSettings.byproduct.buildup ?? 1;
  65. this._drugs[drugId].byproduct ??= 0;
  66. this._drugs[drugId].byproduct += inc * byproductBuildup;
  67. }
  68. }
  69. volSet(drugId,v){
  70. if(typeof v != "number" || isNaN(v)){
  71. console.error("Trying to set drug to non-number",drugId,v);
  72. return;
  73. }
  74. this._drugs[drugId] ??= {vol:0};
  75. const difference = v - this._drugs[drugId].vol;
  76. if(difference > 0)
  77. this.volInc(drugId,difference);
  78. else
  79. this._drugs[drugId].vol = v;
  80. }
  81. constructor(drugs={}){this._drugs=drugs}
  82. _init(data){
  83. Object.keys(data).forEach(function (pn) {
  84. this[pn] = clone(data[pn]);
  85. }, this);
  86. return this;
  87. }
  88. clone = function () {
  89. return (new setup.Drugs())._init(this);
  90. };
  91. toJSON = function () {
  92. var ownData = {};
  93. Object.keys(this).forEach(function (data) {
  94. if(typeof this[data] !== "function")
  95. ownData[data] = clone(this[data]);
  96. }, this);
  97. return JSON.reviveWrapper('(new setup.Drugs())._init($ReviveData$)', ownData);
  98. };
  99. }
  100. setup.Drugs = Drugs;