~swag/armagetronad/0.2.9-sty+ct+ap-fork

« back to all changes in this revision

Viewing changes to src/engine/eSensor.cpp

  • Committer: luke-jr
  • Date: 2006-05-29 01:55:42 UTC
  • Revision ID: svn-v3-list-QlpoOTFBWSZTWZvbKhsAAAdRgAAQABK6798QIABURMgAAaeoNT1TxT1DQbKaeobXKiyAmlWT7Y5MkdJOtXDtB7w7DOGFBHiOBxaUIu7HQyyQSvxdyRThQkJvbKhs:7d95bf1e-0414-0410-9756-b78462a59f44:armagetronad%2Fbranches%2F0.2.8%2Farmagetronad:4612
Unify tags/branches of modules released together

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
1
/*
 
2
 
 
3
*************************************************************************
 
4
 
 
5
ArmageTron -- Just another Tron Lightcycle Game in 3D.
 
6
Copyright (C) 2000  Manuel Moos (manuel@moosnet.de)
 
7
 
 
8
**************************************************************************
 
9
 
 
10
This program is free software; you can redistribute it and/or
 
11
modify it under the terms of the GNU General Public License
 
12
as published by the Free Software Foundation; either version 2
 
13
of the License, or (at your option) any later version.
 
14
 
 
15
This program is distributed in the hope that it will be useful,
 
16
but WITHOUT ANY WARRANTY; without even the implied warranty of
 
17
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 
18
GNU General Public License for more details.
 
19
 
 
20
You should have received a copy of the GNU General Public License
 
21
along with this program; if not, write to the Free Software
 
22
Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
 
23
  
 
24
***************************************************************************
 
25
 
 
26
*/
 
27
 
 
28
#include "eSensor.h"
 
29
#include "eWall.h"
 
30
#include "eDebugLine.h"
 
31
#include "eGrid.h"
 
32
 
 
33
#ifdef DEBUG
 
34
//#define DEBUGLINE
 
35
#endif
 
36
 
 
37
eSensor::eSensor(eGameObject *o,const eCoord &start,const eCoord &d)
 
38
        :eGameObject(o->grid, start,d,o->currentFace,0),owned(o)
 
39
        ,hit(1000),ehit(NULL),lr(0)
 
40
{
 
41
    if (owned)
 
42
    {
 
43
        currentFace=owned->currentFace;
 
44
 
 
45
        // find a better current face if our start postion is not really at the
 
46
        // current position of the owner
 
47
        if ( grid && !currentFace || !currentFace->IsInside( pos ) && currentFace->IsInside( owned->pos ) )
 
48
        {
 
49
            currentFace = o->grid->FindSurroundingFace( pos, currentFace );
 
50
        }
 
51
    }
 
52
    else
 
53
        currentFace=NULL;
 
54
}
 
55
 
 
56
void eSensor::PassEdge(const eWall *w,REAL time,REAL a,int){
 
57
    if (hit>time){
 
58
        if (!w->Massive()){
 
59
            return;
 
60
        }
 
61
 
 
62
        if (owned && !owned->EdgeIsDangerous(w, owned->LastTime(), a))
 
63
            return;
 
64
 
 
65
        lr=0;
 
66
 
 
67
        const eHalfEdge *e = w->Edge();
 
68
 
 
69
        eCoord eEdge_dir=w->Vec();
 
70
        eCoord collPos = w->Point( a );
 
71
 
 
72
        // con << dir << eEdge_dir << '\n';
 
73
        REAL dec=- eEdge_dir*dir;
 
74
 
 
75
        if (dec>0)
 
76
            lr=1;
 
77
        else if (dec<0)
 
78
            lr=-1;
 
79
        else
 
80
            lr=0;
 
81
 
 
82
        hit=time;
 
83
        ehit=e;
 
84
        before_hit=collPos-dir*.000001;
 
85
 
 
86
    }
 
87
}
 
88
 
 
89
//void eSensor::PassEdge(eEdge *e,REAL time,REAL a,int recursion){
 
90
//  PassEdge((const eEdge *)e,time,a,recursion);
 
91
//}
 
92
 
 
93
void eSensor::detect(REAL range){
 
94
    //  eCoord start = pos;
 
95
    //  pos=pos+dir*.01;
 
96
    before_hit=pos+dir*(range-.001);
 
97
    hit=range+.00001f;
 
98
    ehit = 0;
 
99
 
 
100
    /*
 
101
    {
 
102
      ePoint a(pos);
 
103
      ePoint b(pos+dir*range);
 
104
      eEdge e(&a,&b);
 
105
 
 
106
      
 
107
      for(int i=eGameObject::gameObjects.Len()-1;i>=0;i--){
 
108
        eGameObject *target=gameobject::gameObjects(i);
 
109
        
 
110
        if (target->type()==ArmageTron_CYCLE){
 
111
    gCycle *c=(gCycle *)target;
 
112
    if (c->Alive() && c!=owned){
 
113
     const eEdge *oe=c->Edge();
 
114
     if (oe){
 
115
       ePoint *meet=e.IntersectWith(oe);
 
116
     
 
117
       if (meet){ // whoops. Hit!
 
118
         REAL ratio=oe->Ratio(*meet);
 
119
         // gPlayerWall *w=(gPlayerWall *)oe->w;
 
120
         REAL time=e.Ratio(*meet)*range;
 
121
         PassEdge(oe,time,ratio,1);
 
122
         delete meet;
 
123
       }
 
124
     }
 
125
    }
 
126
        }
 
127
      } 
 
128
    }
 
129
    */
 
130
 
 
131
    Move(pos+dir*range,0,range);
 
132
 
 
133
#ifdef DEBUGLINE
 
134
    if (hit < range)
 
135
    {
 
136
        eDebugLine::SetColor  (0, 1, 1);
 
137
        eDebugLine::Draw(start, .1, before_hit, .1);
 
138
 
 
139
        eDebugLine::SetColor  (0, .5, 1);
 
140
        eDebugLine::Draw(before_hit, .1, before_hit, 2.0);
 
141
    }
 
142
    else
 
143
    {
 
144
        eDebugLine::SetColor  (1, 0, 0);
 
145
        eDebugLine::Draw(start, .5, pos, .5);
 
146
    }
 
147
#endif
 
148
}
 
149
 
 
150