# magicalc.py

Dec 30th, 2015
210
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
1. """
2.    MagiCalc -- Magical Probability Calculator, Python edition
3.    by tchnmncr, hyperritual.com
4.
5.    The MagiCalc class calculates magically modified probability per Peter J.
6.     Carroll's equations of magic in _The Octavo_, _The Apophenion_, and _Liber
7.     Kaos_. The public methods all require five parameters in the range of 0 to
8.     1 (numbers outside the range are constrained to 0 or 1) for natural proba-
9.     bility, gnosis, link, subliminalization, and belief, respectively. For a
10.     graphical version of MagiCalc made with Processing, see
11.     http://hyperritual.com/blog/magicalc-2/.
12.
13.     Ideally, I would rewrite the class to use Python's decimal module, but for
14.     now it uses float arithmetic.
15.
16.     The public methods are:
17.     calc_spell: returns the calculated spell probability
18.     calc_antispell: returns the calculated antispell probability
19.     spell_is_strong: returns True if p_m > p, else False
20.     antispell_is_strong: returns True if p_m < p, else False
21.     calc_spell_verbose: prints the values for m and p_m, and tells you
22.         whether p_m > p
23.     calc_antispell_verbose: prints the values for m and p_m, and tells you
24.         whether p_m < p
25.
26.     Again, each method has five parameters in the form of
27.     calc_spell(p, g, l, s, b)
28.     e.g.,
29.     calc_spell(0.5, 0.9, 0.8, 0.9, 0.7)
30.
31.     Usage examples:
32.     >>> mc = MagiCalc() # instantiates a magical probability calculator
33.     >>> print(mc.calc_spell(0.5, 0.9, 0.8, 0.9, 0.7))
34.     0.60287648000000005
35.     >>> print(mc.calc_antispell(0.5, 0.9, 0.8, 0.9, 0.7))
36.     0.39712351999999995
37.     >>> print(mc.spell_is_strong(0.5, 0.9, 0.8, 0.9, 0.7))
38.     True
39.     >>> print(mc.antispell_is_strong(0.5, 0.9, 0.8, 0.9, 0.7))
40.     True
41.     >>> mc.calc_spell_verbose(.5, 1, 1, 1, .5)
42.     ** Spell Calculation **
43.     Magic: 0.5
44.     Magical probability: 0.625
46.     >>> mc.calc_antispell_verbose(.5, 1, 1, 1, .5)
47.     ** Antispell Calculation **
48.     Magic: 0.5
49.     Magical probability: 0.375
51.     >>> print(mc) # prints the current values of p, g, l, s, b, m, and p_m
52.
53. """
54.
55. class MagiCalc(object):
56.
57.     p = 0.0    # natural (i.e. unmodified) probability
58.     g = 0.0    # gnosis
59.     l = 0.0    # link
60.     s = 0.0    # subliminalization
61.     b = 0.0    # belief
62.     m = 0.0    # magic (i.e. magical power)
63.     p_m = 0.0  # magical (i.e. modified) probability
64.
65.     def __constrain(self, n, min_n, max_n):
66.         return max(min(max_n, n), min_n)
67.
68.     def __set_pglsb(self, p, g, l, s, b):
69.         self.p = float(self.__constrain(p, 0.0, 1.0))
70.         self.g = float(self.__constrain(g, 0.0, 1.0))
71.         self.l = float(self.__constrain(l, 0.0, 1.0))
72.         self.s = float(self.__constrain(s, 0.0, 1.0))
73.         self.b = float(self.__constrain(b, 0.0, 1.0))
74.
75.     def calc_spell(self, p, g, l, s, b):
76.         self.__set_pglsb(p, g, l, s, b)
77.         self.m = self.g * self.l * self.s * self.b
78.         self.p_m = self.p + (1 - self.p) * self.m ** (1 / self.p)
79.         return self.p_m
80.
81.     def calc_antispell(self, p, g, l, s, b):
82.         self.__set_pglsb(p, g, l, s, b)
83.         self.m = self.g * self.l * self.s * self.b
84.         self.p_m = self.p - self.p * self.m ** (1 / (1 - self.p))
85.         return self.p_m
86.
87.     def spell_is_strong(self, p, g, l, s, b):
88.         self.calc_spell(p, g, l, s, b)
89.         if self.p_m > self.p:
90.             return True
91.         else:
92.             return False
93.
94.     def antispell_is_strong(self, p, g, l, s, b):
95.         self.calc_antispell(p, g, l, s, b)
96.         if self.p_m < self.p:
97.             return True
98.         else:
99.             return False
100.
101.     def calc_spell_verbose(self, p, g, l, s, b):
102.         self.calc_spell(p, g, l, s, b)
103.         print()
104.         print("** Spell Calculation **")
105.         print("Magic:", self.m)
106.         print("Magical probability:", self.p_m)
107.         if self.p_m > self.p:
109.         else:
110.             print("You're gonna need a bigger wand.")
111.         print()
112.
113.     def calc_antispell_verbose(self, p, g, l, s, b):
114.         self.calc_antispell(p, g, l, s, b)
115.         print()
116.         print("** Antispell Calculation **")
117.         print("Magic:", round(self.m, 3))
118.         print("Magical probability:", self.p_m)
119.         if self.p_m < self.p: