Class based on storing volume, pressure, and substance percents. Inferior to Fluid. https://git.b64.win/prototype/Fluid

Fluid.moon 2.2KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677
  1. -- it is up to user to ensure that total breached volume is lower
  2. -- than the total volume
  3. class Fluid
  4. new: (opts={}) =>
  5. @volume = opts.volume or 1
  6. @pressure = opts.pressure or 1
  7. @contents = opts.contents or {}
  8. -- breaches stored on high pressure side of Fluids
  9. @breaches = {}
  10. update: (dt) =>
  11. leak = 0 -- total leak rate (pressure)
  12. for breach in *@breaches
  13. -- difference in pressure * relative size of hole
  14. rate = (@pressure - breach.pressure) * (breach.size / @volume) * dt
  15. leak += rate
  16. breach.pressure += rate * (@volume / breach.volume)
  17. breach.pressure = 0 if breach.pressure < 0
  18. amount = breach.pressure * breach.volume
  19. modifier = 1 - @volume * rate / amount
  20. for item, percentage in pairs breach.contents
  21. breach.contents[item] = percentage * modifier
  22. for item, percentage in pairs @contents
  23. percentage = (@volume * rate * percentage) / amount
  24. if breach.contents[item]
  25. breach.contents[item] += percentage
  26. else
  27. breach.contents[item] = percentage
  28. @pressure -= leak
  29. for i = 1, #@breaches
  30. if @breaches[i].pressure > @pressure
  31. other = table.remove @breaches, i
  32. other\breach(@, other.size)
  33. i -= 1
  34. amount: (key) =>
  35. if key
  36. if @contents[key]
  37. return @volume * @pressure * @contents[key]
  38. else
  39. return 0
  40. else
  41. return @volume * @pressure
  42. remove: (key, amount=1) =>
  43. total = @amount key
  44. if total >= amount
  45. percentage = amount / total
  46. @contents[key] -= @contents[key] * percentage
  47. percentage = amount / @amount!
  48. @pressure -= @pressure * percentage
  49. for item, p in pairs @contents
  50. @contents[item] += p * percentage
  51. return true
  52. else
  53. return false
  54. breach: (other, size) =>
  55. if other.pressure > @pressure
  56. other\breach(@, size)
  57. else
  58. other.size = size or 1
  59. table.insert @breaches, other
  60. print: =>
  61. print "Volume", @volume, "Pressure", @pressure, "#", @amount!
  62. percentage, amount = 0, 0
  63. for k,v in pairs @contents
  64. x = @amount k
  65. print k, v, x
  66. percentage += v
  67. amount += x
  68. print "", "Total:", percentage, amount