stratagus-cvs
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[Stratagus-CVS] stratagus data/ccl/missiles.ccl src/include/mis...


From: Jimmy Salmon
Subject: [Stratagus-CVS] stratagus data/ccl/missiles.ccl src/include/mis...
Date: Sun, 05 Oct 2003 22:56:07 -0400

CVSROOT:        /cvsroot/stratagus
Module name:    stratagus
Branch:         
Changes by:     Jimmy Salmon <address@hidden>   03/10/05 22:56:07

Modified files:
        data/ccl       : missiles.ccl 
        src/include    : missile.h 
        src/missile    : missile.c 

Log message:
        Added parabolic missiles, patch from mohydine

Patches:
Index: stratagus/data/ccl/missiles.ccl
diff -u stratagus/data/ccl/missiles.ccl:1.33 
stratagus/data/ccl/missiles.ccl:1.34
--- stratagus/data/ccl/missiles.ccl:1.33        Fri Oct  3 06:37:04 2003
+++ stratagus/data/ccl/missiles.ccl     Sun Oct  5 22:56:06 2003
@@ -26,7 +26,7 @@
 ;;      along with this program; if not, write to the Free Software
 ;;      Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  
USA
 ;;
-;;     $Id: missiles.ccl,v 1.33 2003/10/03 10:37:04 n0body Exp $
+;;     $Id: missiles.ccl,v 1.34 2003/10/06 02:56:06 jsalmon3 Exp $
 
 ;;     NOTE: the missiles could be sorted for races, but did this make sense?
 
@@ -102,13 +102,13 @@
 (define-missile-type 'missile-catapult-rock
   'file "missiles/catapult_rock.png" 'size '(32 32) 'frames 15
   'impact-sound "explosion"
-  'draw-level 50 'class 'missile-class-point-to-point-with-delay 'sleep 1 
'speed 16 'range 2
+  'draw-level 50 'class 'missile-class-parabolic 'sleep 1 'speed 16 'range 2
   'impact-missile 'missile-impact)
 
 (define-missile-type 'missile-ballista-bolt
   'file "missiles/ballista_bolt.png" 'size '(64 64) 'frames 5
   'draw-level 50 'impact-sound "explosion"
-  'class 'missile-class-point-to-point 'sleep 1 'speed 16 'range 2
+  'class 'missile-class-parabolic 'sleep 1 'speed 16 'range 2
   'impact-missile 'missile-impact)
 
 (define-missile-type 'missile-arrow
@@ -156,7 +156,7 @@
 (define-missile-type 'missile-small-cannon
   'file "missiles/cannon.png" 'size '(32 32) 'frames 15
   'draw-level 50 'impact-sound "explosion"
-  'class 'missile-class-point-to-point-with-delay 'sleep 1 'speed 16 'range 1
+  'class 'missile-class-parabolic 'sleep 1 'speed 16 'range 1
   'impact-missile 'missile-cannon-explosion)
 
 (define-missile-type 'missile-cannon-explosion
Index: stratagus/src/include/missile.h
diff -u stratagus/src/include/missile.h:1.65 
stratagus/src/include/missile.h:1.66
--- stratagus/src/include/missile.h:1.65        Fri Sep 26 16:32:00 2003
+++ stratagus/src/include/missile.h     Sun Oct  5 22:56:07 2003
@@ -26,7 +26,7 @@
 //      Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
 //      02111-1307, USA.
 //
-//     $Id: missile.h,v 1.65 2003/09/26 20:32:00 jsalmon3 Exp $
+//     $Id: missile.h,v 1.66 2003/10/06 02:56:07 jsalmon3 Exp $
 
 #ifndef __MISSILE_H__
 #define __MISSILE_H__
@@ -342,13 +342,13 @@
 **      FIXME:  We need no class or no controller.
 */
 enum _missile_class_ {
-        /**
-        **      Missile does nothing
-        */
+       /**
+       **      Missile does nothing
+       */
        MissileClassNone,
-        /**
-         **      Missile flies from x,y to x1,y1
-         */
+       /**
+       **      Missile flies from x,y to x1,y1
+       */
        MissileClassPointToPoint,
        /**
        **      Missile flies from x,y to x1,y1 and stays there for a moment
@@ -403,6 +403,10 @@
        **      Missile shows the hit points.
        */
        MissileClassHit,
+       /**
+       **           Missile flies from x,y to x1,y1 using a parabolic path
+       */
+       MissileClassParabolic,
 };
 
     ///                Base structure of missile-types
@@ -473,6 +477,11 @@
     int                Dy;                     /// delta y
     int                Xstep;                  /// X step
     int                Ystep;                  /// Y step
+
+    long       Angle;                  /// Angle, for parabolic missiles
+    long       Xl;                     /// internal use. Will be removed later.
+    int                SourceX;                /// Missile Source X
+    int                SourceY;                /// Missile Source Y
 
     unsigned   Local : 1;              /// missile is a local missile
     Missile**  MissileSlot;            /// pointer to missile slot
Index: stratagus/src/missile/missile.c
diff -u stratagus/src/missile/missile.c:1.82 
stratagus/src/missile/missile.c:1.83
--- stratagus/src/missile/missile.c:1.82        Sat Sep 27 00:00:20 2003
+++ stratagus/src/missile/missile.c     Sun Oct  5 22:56:07 2003
@@ -10,7 +10,7 @@
 //
 /address@hidden missile.c      -       The missiles. */
 //
-//     (c) Copyright 1998-2003 by Lutz Sammer
+//     (c) Copyright 1998-2003 by Lutz Sammer and Jimmy Salmon
 //
 //      This program is free software; you can redistribute it and/or modify
 //      it under the terms of the GNU General Public License as published by
@@ -26,7 +26,7 @@
 //      Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
 //      02111-1307, USA.
 //
-//     $Id: missile.c,v 1.82 2003/09/27 04:00:20 jsalmon3 Exp $
+//     $Id: missile.c,v 1.83 2003/10/06 02:56:07 jsalmon3 Exp $
 
 //@{
 
@@ -78,6 +78,7 @@
     "missile-class-fire",
     "missile-class-custom",
     "missile-class-hit",
+    "missile-class-parabolic",
     NULL
 };
 
@@ -288,6 +289,8 @@
     missile->Y = sy - mtype->Height / 2;
     missile->DX = dx - mtype->Width / 2;
     missile->DY = dy - mtype->Height / 2;
+    missile->SourceX = sx;
+    missile->SourceY = sy;
     missile->Type = mtype;
     missile->SpriteFrame = 0;
     missile->State = 0;
@@ -905,6 +908,120 @@
 }
 
 /**
+**     Calculate parabolic trajectories.
+**
+**     @param missile  Missile pointer.
+**     @param amplitude    How high can the missile go. This value depends
+**                         on the missile direction and game perspective.
+*/
+local int ParabolicCalc(Missile* missile, int amplitude)
+{
+    int xmid;
+    long sinu;
+    int thetha;
+
+    missile->Xl -= missile->Xstep;
+    missile->X = missile->Xl / 100;
+
+    xmid = (missile->SourceX + missile->DX) / 2;
+    sinu = (missile->X - xmid) * (missile->X - xmid);
+    thetha = missile->SourceX - xmid;
+    missile->Y = ((missile->Angle * (missile->X - missile->SourceX)) -
+       amplitude * isqrt(-sinu + thetha * thetha) + missile->SourceY * 100) / 
100;
+
+    return 0;
+}
+
+/**
+**     Calculate parabolic trajectories.
+**
+**     @param missile  Missile pointer.
+*/
+local int ParabolicMissile(Missile* missile)
+{
+    int i;
+    int sx;
+    int sy;
+
+    if (!(missile->State & 1)) {
+       int dx;
+       int dy;
+       int xstep;
+       int ystep;
+
+       // initialize
+       dy = missile->DY - missile->Y;
+       ystep = 1;
+       if (dy < 0) {
+           dy = -dy;
+           ystep = -1;
+       }
+       dx = missile->DX - missile->X;
+       xstep = 1;
+       if (dx < 0) {
+           dx = -dx;
+           xstep = -1;
+       }
+       missile->Angle = (100 * (missile->SourceY - missile->DY)) / 
+           (missile->SourceX - missile->DX);
+       missile->Xl = missile->X * 100;
+
+       MissileNewHeadingFromXY(missile, dx * xstep, dy * ystep);
+
+       if (dx == 0 && dy == 0) {
+           return 1;
+       }
+
+       missile->Dx = dx;
+       missile->Dy = dy;
+       dx = missile->SourceX - missile->DX;
+       dy = missile->SourceY - missile->DY;
+       missile->Xstep = (100 * dx) / isqrt(dx * dx + dy * dy);
+       missile->Ystep = ystep;
+       ++missile->State;
+       DebugLevel3Fn("Init: %d,%d\n" _C_ dx _C_ dy);
+       return 0;
+    }
+
+    sx = missile->X;
+    sy = missile->Y;
+
+    //
+    // Move missile
+    //
+    if (missile->Dy == 0) {            // horizontal line
+       for (i = 0; i<missile->Type->Speed; ++i) {
+           if (missile->X == missile->DX) {
+               return 1;
+           }
+           ParabolicCalc(missile, 50);
+       }
+       MissileNewHeadingFromXY(missile, missile->X - sx, missile->Y - sy);
+       return 0;
+    }
+
+    if (missile->Dx == 0) {            // vertical line
+       for (i = 0; i < missile->Type->Speed; ++i) {
+           if (missile->Y == missile->DY) {
+               return 1;
+           }                                   
+           missile->Y += missile->Ystep; //no parabolic missile there.
+       }
+       return 0;
+    }
+
+    for (i = 0; i < missile->Type->Speed; ++i) {
+       if (abs(missile->X - missile->DX) <= 1 &&
+               abs(missile->Y - missile->DY) <= 1) {
+           return 1;
+       }
+       ParabolicCalc(missile, 100);
+       MissileNewHeadingFromXY(missile, missile->X - sx, missile->Y - sy);
+    }
+    return 0;
+}
+
+/**
 **     Missile hits the goal.
 **
 **     @param missile  Missile hitting the goal.
@@ -1119,7 +1236,7 @@
                    neg = 1;
                    missile->SpriteFrame = -missile->SpriteFrame;
                }
-               missile->SpriteFrame += 5;              // FIXME: frames pro row
+               missile->SpriteFrame += 5;              // FIXME: frames per row
                if (missile->SpriteFrame >= 
VideoGraphicFrames(missile->Type->Sprite)) {
                    missile->SpriteFrame-=
                        VideoGraphicFrames(missile->Type->Sprite);
@@ -1140,10 +1257,36 @@
                FreeMissile(missile);
                missile = NULL;
            } else {
-               //
-               //      Animate missile, depends on the way.
-               //              FIXME: becomes bigger than smaller.
-               // FIXME: how?
+               int totalx;
+               int dx;
+               int f;
+               int i;
+               int j;
+
+               neg = 0;
+               if (missile->SpriteFrame < 0) {
+                   neg = 1;
+                   missile->SpriteFrame = -missile->SpriteFrame;
+               }
+               totalx = abs(missile->DX - missile->SourceX);
+               dx = abs(missile->X - missile->SourceX);
+               f = VideoGraphicFrames(missile->Type->Sprite) / 5; // FIXME: 
frames per row
+               f = 2 * f - 1;
+               for (i = 1, j = 1; i <= f; ++i) {
+                   if (dx * f / i < totalx) {
+                       if ((i - 1) * 2 < f) {
+                           j = i - 1;
+                       } else {
+                           j = f - i;
+                       }
+                       missile->SpriteFrame = missile->SpriteFrame % 5 +
+                           j * 5; // FIXME: frames per row
+                       break;
+                   }
+               }
+               if (neg) {
+                   missile->SpriteFrame = -missile->SpriteFrame;
+               }
            }
            break;
 
@@ -1178,7 +1321,7 @@
                    neg = 1;
                    missile->SpriteFrame = -missile->SpriteFrame;
                }
-               missile->SpriteFrame += 5;              // FIXME: frames pro row
+               missile->SpriteFrame += 5;              // FIXME: frames per row
                if (missile->SpriteFrame >= 
VideoGraphicFrames(missile->Type->Sprite)) {
                    missile->SpriteFrame-=
                        VideoGraphicFrames(missile->Type->Sprite);
@@ -1392,6 +1535,46 @@
            }
            break;
        }
+
+       case MissileClassParabolic:
+           missile->Wait = missile->Type->Sleep;
+           if (ParabolicMissile(missile)) {
+               MissileHit(missile);
+               FreeMissile(missile);
+               missile = NULL;
+           } else {
+               int totalx;
+               int dx;
+               int f;
+               int i;
+               int j;
+
+               neg = 0;
+               if (missile->SpriteFrame < 0) {
+                   neg = 1;
+                   missile->SpriteFrame = -missile->SpriteFrame;
+               }
+               totalx = abs(missile->DX - missile->SourceX);
+               dx = abs(missile->X - missile->SourceX);
+               f = VideoGraphicFrames(missile->Type->Sprite) / 5; // FIXME: 
frames per row
+               f = 2 * f - 1;
+               for (i = 1, j = 1; i <= f; ++i) {
+                   if (dx * f / i < totalx) {
+                       if ((i - 1) * 2 < f) {
+                           j = i - 1;
+                       } else {
+                           j = f - i;
+                       }
+                       missile->SpriteFrame = missile->SpriteFrame % 5 +
+                           j * 5; // FIXME: frames per row
+                       break;
+                   }
+               }
+               if (neg) {
+                   missile->SpriteFrame = -missile->SpriteFrame;
+               }
+           }
+           break;
     }
 
     if (missile) {                     // check after movement
@@ -1514,7 +1697,7 @@
     int i;
 
     CLprintf(file,"\n;;; -----------------------------------------\n");
-    CLprintf(file,";;; MODULE: missile-types $Id: missile.c,v 1.82 2003/09/27 
04:00:20 jsalmon3 Exp $\n\n");
+    CLprintf(file,";;; MODULE: missile-types $Id: missile.c,v 1.83 2003/10/06 
02:56:07 jsalmon3 Exp $\n\n");
 
     //
     // Original number to internal missile-type name.
@@ -1609,7 +1792,7 @@
     Missile* const* missiles;
 
     CLprintf(file,"\n;;; -----------------------------------------\n");
-    CLprintf(file,";;; MODULE: missiles $Id: missile.c,v 1.82 2003/09/27 
04:00:20 jsalmon3 Exp $\n\n");
+    CLprintf(file,";;; MODULE: missiles $Id: missile.c,v 1.83 2003/10/06 
02:56:07 jsalmon3 Exp $\n\n");
 
     for (missiles = GlobalMissiles; *missiles; ++missiles) {
        SaveMissile(*missiles, file);




reply via email to

[Prev in Thread] Current Thread [Next in Thread]