[Top][All Lists]
[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);
[Prev in Thread] |
Current Thread |
[Next in Thread] |
- [Stratagus-CVS] stratagus data/ccl/missiles.ccl src/include/mis...,
Jimmy Salmon <=