Advertisement
nanogyth

Ultima Exodus: undead spell rng

Dec 17th, 2014
243
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 1.84 KB | None | 0 0
  1. def rng_gen(seed=0, stop=None):
  2.     if stop is None:
  3.         stop = seed
  4.     a = seed
  5.     while True:
  6.         yield a
  7.         a = (17*a + 23)%256
  8.         if a == stop:
  9.             break
  10.  
  11. def calc_fight(start):
  12.     a = start
  13.     mob_str = []
  14.     count = 0
  15.     for _ in range(8):
  16.         a = (17*a + 23)%256 #roll for mob, 50%
  17.         if (a * 0x80 // 256) & 0x08 != 0:
  18.             a = (17*a + 23)%256 #roll for extra hp, d15
  19.             mob_str += "1"
  20.             count += 1
  21.         else:
  22.             mob_str += "0"
  23.     if mob_str[3] == "0":
  24.         mob_str[3] = "1"
  25.         count += 1
  26.     mobs = count
  27.     mob_strs = [mob_str[:]]
  28.     #18+139+77 = ~234 battle setup/teardown
  29.     #(14+32)/2 +81 = 104 per undead cast
  30.     #98 per mob killed
  31.     #338 + 98X for fastest battle
  32.     frames = 338 + 98*count
  33.     while True:
  34.         for i in range(8):
  35.             if mob_str[i] == '1':
  36.                 a = (17*a + 23)%256 #roll for hit, 75%
  37.                 if a < 192:
  38.                     count -= 1
  39.                     a = (17*a + 23)%256 #roll for damage, 255
  40.                     mob_str[i] = '0'
  41.         if count == 0:
  42.             break
  43.         mob_strs.append(mob_str[:])
  44.         for _ in range(count+1):
  45.             a = (17*a + 23)%256 #roll for movement, plus extra??
  46.         #(12+16)/2 = ~14 per turn passed *3
  47.         #60 for monsters turn + 25 per mob
  48.         #104+3*14+60+25*X = 206 +25X for undead recast
  49.         frames += 206 + 25*count
  50.     a = (17*a + 23)%256 #extra spin on victory
  51.     return mob_strs, mobs, a, frames
  52.        
  53. rng_map = {n:i for i,n in enumerate(rng_gen())}
  54.  
  55. for i,n in enumerate(rng_gen()):
  56.     ms, c, a, f = calc_fight(n)
  57.     ms_out = " ".join("".join(m) for m in ms)
  58.     score = int(f/c-140.25)
  59.     print("{:02x} {:02x} {:02x} {:02x} {:4d} {} {:3d} {} ".format(i,n,a,rng_map[a],f,c,score,ms_out,))
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement