More vector-arithmetic abstraction.
[super-star-trek.git] / src / sst.py
index 28203dd85152e9157e7ef95926f4bfe9aadba03c..1133bcfc83fff5bf93c01b3bacffb13ddb3c2610 100644 (file)
@@ -250,12 +250,12 @@ class coord:
         return coord(self.i*other, self.j*other)
     def __div__(self, other):
         return coord(self.i/other, self.j/other)
+    def __mod__(self, other):
+        return coord(self.i % other, self.j % other)
     def __rdiv__(self, other):
         return coord(self.i/other, self.j/other)
     def roundtogrid(self):
         return coord(int(round(self.i)), int(round(self.j)))
-    def trunctogrid(self):
-        return coord(int(round(self.i)), int(round(self.j)))
     def distance(self, other=None):
         if not other: other = coord(0, 0)
         return math.sqrt((self.i - other.i)**2 + (self.j - other.j)**2)
@@ -273,13 +273,15 @@ class coord:
         else:
             s.j = self.j / abs(self.j)
         return s
+    def quadrant(self):
+        return (self / QUADSIZE).roundtogrid()
+    def sector(self):
+        return self.roundtogrid() % QUADSIZE
     def scatter(self):
         s = coord()
         s.i = self.i + randrange(-1, 2)
         s.j = self.j + randrange(-1, 2)
         return s
-    def __hash__(self):
-        return hash((x, y))
     def __str__(self):
         if self.i == None or self.j == None:
             return "Nowhere"
@@ -3641,12 +3643,8 @@ def imove(course=None, novapush=False):
                     attack(torps_ok=False)
                 if game.alldone:
                     return
-            # compute final position -- new quadrant and sector 
-            x = (QUADSIZE*game.quadrant.i)+game.sector.i
-            y = (QUADSIZE*game.quadrant.j)+game.sector.j
-            w.i = int(round(x+QUADSIZE*course.distance*bigger*deltax))
-            w.j = int(round(y+QUADSIZE*course.distance*bigger*deltay))
             # check for edge of galaxy 
+            w = course.final
             kinks = 0
             while True:
                 kink = False
@@ -3927,6 +3925,10 @@ class course:
     def __init__(self, bearing, distance, origin=None): 
         self.distance = distance
         self.bearing = bearing
+        if origin is None:
+            self.origin = cartesian(game.quadrant, game.sector)
+        else:
+            self.origin = origin
         # The bearing() code we inherited from FORTRAN is actually computing
         # clockface directions!
         if self.bearing < 0.0:
@@ -3940,7 +3942,7 @@ class course:
         bigger = max(abs(self.increment.i), abs(self.increment.j))
         self.increment /= bigger
         self.moves = int(round(10*self.distance*bigger))
-        self.final = self.location + distance*bigger*self.increment
+        self.final = (self.location + self.moves*self.increment).roundtogrid()
     def next(self, grain=1):
         "Next step on course."
         self.moves -=1
@@ -3953,9 +3955,9 @@ class course:
         else:
             return False
     def quadrant(self):
-        return (self.location / QUADSIZE).roundtogrid()
+        return self.location.quadrant()
     def sector(self):
-        return coord(int(round(self.location.i)) % QUADSIZE, int(round(self.location.j)) % QUADSIZE)
+        return self.location.sector()
     def power(self, warp):
        return self.distance*(warp**3)*(game.shldup+1)
     def time(self, warp):