Make it possible to reset a course object.
[super-star-trek.git] / src / sst.py
index 1133bcfc83fff5bf93c01b3bacffb13ddb3c2610..ed133629e9741e916ba61dea9a9d0c705af69b43 100644 (file)
@@ -274,7 +274,8 @@ class coord:
             s.j = self.j / abs(self.j)
         return s
     def quadrant(self):
-        return (self / QUADSIZE).roundtogrid()
+        #print "Location %s -> %s" % (self, (self / QUADSIZE).roundtogrid())
+        return self.roundtogrid() / QUADSIZE
     def sector(self):
         return self.roundtogrid() % QUADSIZE
     def scatter(self):
@@ -2476,7 +2477,7 @@ def events():
                chp.stars = pdest.stars
                pdest.charted = True
            game.probe.moves -= 1 # One less to travel
-           if game.probe.moves == 0 and game.isarmed and pdest.stars:
+           if game.probe.arrived() and game.isarmed and pdest.stars:
                supernova(game.probe)           # fire in the hole!
                unschedule(FDSPROB)
                if game.state.galaxy[game.quadrant().i][game.quadrant().j].supernova: 
@@ -3598,19 +3599,10 @@ def imove(course=None, novapush=False):
         newcnd()
         drawmaps(0)
         setwnd(message_window)
-    w.i = w.j = 0
+
     if game.inorbit:
        prout(_("Helmsman Sulu- \"Leaving standard orbit.\""))
        game.inorbit = False
-    angle = ((15.0 - course.bearing) * 0.5235988)
-    deltax = -math.sin(angle)
-    deltay = math.cos(angle)
-    if math.fabs(deltax) > math.fabs(deltay):
-       bigger = math.fabs(deltax)
-    else:
-       bigger = math.fabs(deltay)
-    deltay /= bigger
-    deltax /= bigger
     # If tractor beam is to occur, don't move full distance 
     if game.state.date+game.optime >= scheduled(FTBEAM):
        trbeam = True
@@ -3619,14 +3611,10 @@ def imove(course=None, novapush=False):
        game.optime = scheduled(FTBEAM) - game.state.date + 1e-5
     # Move within the quadrant 
     game.quad[game.sector.i][game.sector.j] = IHDOT
-    x = game.sector.i
-    y = game.sector.j
     for m in range(course.moves):
-        x += deltax
-        y += deltay
-        w.i = int(round(x))
-        w.j = int(round(y))
-        if not w.valid_sector():
+        course.next()
+        w = course.sector()
+        if course.origin.quadrant() != course.location.quadrant():
             # Leaving quadrant -- allow final enemy attack 
             # Don't do it if being pushed by Nova 
             if len(game.enemies) != 0 and not novapush:
@@ -3634,31 +3622,28 @@ def imove(course=None, novapush=False):
                 for enemy in game.enemies:
                     finald = (w - enemy.kloc).distance()
                     enemy.kavgd = 0.5 * (finald + enemy.kdist)
-                #
                 # Stas Sergeev added the condition
                 # that attacks only happen if Klingons
                 # are present and your skill is good.
-                # 
                 if game.skill > SKILL_GOOD and game.klhere > 0 and not game.state.galaxy[game.quadrant.i][game.quadrant.j].supernova:
                     attack(torps_ok=False)
                 if game.alldone:
                     return
             # check for edge of galaxy 
-            w = course.final
             kinks = 0
             while True:
                 kink = False
-                if w.i < 0:
-                    w.i = -w.i
+                if course.final.i < 0:
+                    course.final.i = -course.final.i
                     kink = True
-                if w.j < 0:
-                    w.j = -w.j
+                if course.final.j < 0:
+                    course.final.j = -course.final.j
                     kink = True
-                if w.i >= GALSIZE*QUADSIZE:
-                    w.i = (GALSIZE*QUADSIZE*2) - w.i
+                if course.final.i >= GALSIZE*QUADSIZE:
+                    course.final.i = (GALSIZE*QUADSIZE*2) - course.final.i
                     kink = True
-                if w.j >= GALSIZE*QUADSIZE:
-                    w.j = (GALSIZE*QUADSIZE*2) - w.j
+                if course.final.j >= GALSIZE*QUADSIZE:
+                    course.final.j = (GALSIZE*QUADSIZE*2) - course.final.j
                     kink = True
                 if kink:
                     kinks += 1
@@ -3677,10 +3662,8 @@ def imove(course=None, novapush=False):
             # Compute final position in new quadrant 
             if trbeam: # Don't bother if we are to be beamed 
                 return
-            game.quadrant.i = w.i/QUADSIZE
-            game.quadrant.j = w.j/QUADSIZE
-            game.sector.i = w.i - (QUADSIZE*game.quadrant.i)
-            game.sector.j = w.j - (QUADSIZE*game.quadrant.j)
+            game.quadrant = course.final.quadrant()
+            game.sector = course.final.sector()
             skip(1)
             prout(_("Entering Quadrant %s.") % game.quadrant)
             game.quad[game.sector.i][game.sector.j] = game.ship
@@ -3693,8 +3676,8 @@ def imove(course=None, novapush=False):
             # object encountered in flight path 
             stopegy = 50.0*course.distance/game.optime
             course.distance = (game.sector - w).distance() / (QUADSIZE * 1.0)
+            game.sector = w
             if iquad in (IHT, IHK, IHC, IHS, IHR, IHQUEST):
-                game.sector = w
                 for enemy in game.enemies:
                     if enemy.kloc == game.sector:
                         break
@@ -3730,9 +3713,7 @@ def imove(course=None, novapush=False):
                 proutn(_("Emergency stop required "))
                 prout(_("%2d units of energy.") % int(stopegy))
                 game.energy -= stopegy
-                final.i = int(round(deltax))
-                final.j = int(round(deltay))
-                game.sector = final
+                game.sector = w
                 if game.energy <= 0:
                     finish(FNRG)
                     return
@@ -3935,17 +3916,23 @@ class course:
             self.bearing += 12.0
         self.angle = ((15.0 - self.bearing) * 0.5235988)
         if origin is None:
-            self.location = cartesian(game.quadrant, game.sector)
+            self.origin = cartesian(game.quadrant, game.sector)
         else:
-            self.location = cartesian(game.quadrant, origin)
+            self.origin = cartesian(game.quadrant, origin)
         self.increment = coord(-math.sin(self.angle), math.cos(self.angle))
         bigger = max(abs(self.increment.i), abs(self.increment.j))
         self.increment /= bigger
         self.moves = int(round(10*self.distance*bigger))
+        self.reset()
         self.final = (self.location + self.moves*self.increment).roundtogrid()
+    def reset(self):
+        self.location = self.origin
+        self.step = 0
+    def arrived(self):
+        return self.location.roundtogrid() == self.final
     def next(self, grain=1):
         "Next step on course."
-        self.moves -=1
+        self.step += 1
         self.nextlocation = self.location + self.increment
         oldloc = (self.location/grain).roundtogrid()
         newloc = (self.nextlocation/grain).roundtogrid()
@@ -4088,28 +4075,15 @@ def warp(course, involuntary):
        if blooey or twarp:
            # If time warp or engine damage, check path 
            # If it is obstructed, don't do warp or damage 
-           angle = ((15.0-course.bearing)*0.5235998)
-           deltax = -math.sin(angle)
-           deltay = math.cos(angle)
-           if math.fabs(deltax) > math.fabs(deltay):
-               bigger = math.fabs(deltax)
-           else:
-               bigger = math.fabs(deltay)
-           deltax /= bigger
-           deltay /= bigger
-           n = 10.0 * course.distance * bigger +0.5
-           x = game.sector.i
-           y = game.sector.j
-           for l in range(1, n+1):
-               x += deltax
-               ix = x + 0.5
-               y += deltay
-               iy = y +0.5
-               if not coord(ix, iy).valid_sector():
-                   break
-               if game.quad[ix][iy] != IHDOT:
+            for m in range(course.moves):
+                course.next()
+                w = course.sector()
+                if not w.valid_sector():
+                    break
+               if game.quad[w.x][w.y] != IHDOT:
                    blooey = False
                    twarp = False
+            course.reset()
     # Activate Warp Engines and pay the cost 
     imove(course, novapush=False)
     if game.alldone: