Advertisement
Guest User

Untitled

a guest
Apr 25th, 2019
95
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 2.43 KB | None | 0 0
  1. import Spell.{spellFive, spellFour, spellOne, spellThree, spellTwo}
  2.  
  3. object Spell {
  4. case object spellOne extends Spell("one", 96, 6.5)
  5. case object spellTwo extends Spell("two", 54, 4.5)
  6. case object spellThree extends Spell("three", 48, 4.5)
  7. case object spellFour extends Spell("four", 48, 4.5)
  8. case object spellFive extends Spell("five", 36, 4.5)
  9. }
  10.  
  11. class Spell(val name: String, val duration: Double, val castTime: Double) {
  12. var remainingDuration = 0.0
  13.  
  14. def cast(): Double = {
  15. remainingDuration = duration + castTime
  16.  
  17. println(s"Cast $name")
  18.  
  19. castTime
  20. }
  21.  
  22. def elapse(time: Double): Unit = {
  23. remainingDuration = Math.max(0.0, remainingDuration - time)
  24. }
  25. }
  26.  
  27. object EQ {
  28.  
  29. var time = 0.0
  30. val allSpells = List(spellOne, spellTwo, spellThree, spellFour, spellFive)
  31. val normalSpells = List(spellTwo, spellThree, spellFour, spellFive)
  32.  
  33. def main(args: Array[String]): Unit = {
  34. while(time < 500) {
  35.  
  36. val spell = if(allSpells.forall(s => s.remainingDuration == 0.0)) {
  37. normalSpells.minBy(s => s.duration - s.remainingDuration)
  38. } else {
  39. val sorted = normalSpells.sortBy(s => s.remainingDuration - s.castTime).toVector
  40.  
  41. val currentSpell = sorted.head
  42.  
  43. val waitTime = getWaitTime(0, sorted, currentSpell.remainingDuration - currentSpell.castTime, 0)
  44. if(waitTime > 0) {
  45. println(s"wait $waitTime")
  46.  
  47. time += waitTime
  48. allSpells.foreach(s => s.elapse(waitTime))
  49. }
  50.  
  51. currentSpell
  52. }
  53.  
  54. val castTime = if(spellOne.remainingDuration < (spell.castTime + spellOne.castTime)) {
  55. val wait = spellOne.remainingDuration - spellOne.castTime
  56. if(wait > 0) {
  57. println(s"wait $wait")
  58. time += wait
  59. allSpells.foreach(s => s.elapse(wait))
  60. }
  61.  
  62. spellOne.cast()
  63. } else {
  64. spell.cast()
  65. }
  66.  
  67. time += castTime
  68. allSpells.foreach(s => s.elapse(castTime))
  69.  
  70. println(allSpells.map(s => {
  71. s"${s.name}, remaining: ${s.remainingDuration}"
  72. }))
  73. }
  74. }
  75.  
  76. def getWaitTime(i: Int, sorted: Vector[Spell], time: Double, extraTime: Double): Double = {
  77.  
  78. if(time <= 0) {
  79. 0
  80. } else if(i >= sorted.length) {
  81. time
  82. } else {
  83. val spell = sorted(i)
  84.  
  85. var wait = time
  86.  
  87. while(spell.remainingDuration - wait - spell.castTime - extraTime < 0) {
  88. wait -= 0.5
  89. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement