1 /***************************************************************************
2                           submarine.h  -  description
3                              -------------------
4     begin                : Sat Mar 16 2002
5     copyright            : (C) 2002 by Michael Bridak
6     email                : michael.bridak@verizon.net
7 $Id: submarine.h,v 1.5 2003/04/14 05:51:04 mbridak Exp $
8  ***************************************************************************/
9 
10 /***************************************************************************
11  *                                                                         *
12  *   This program is free software; you can redistribute it and/or modify  *
13  *   it under the terms of the GNU General Public License as published by  *
14  *   the Free Software Foundation; either version 2 of the License.     *
15  *    .                                   *
16  *                                                                         *
17  ***************************************************************************/
18 
19 #ifndef SUBMARINE_H
20 #define SUBMARINE_H
21 
22 #include <stdio.h>
23 #include "coord.h"
24 #include "map.h"
25 #include "stack.h"
26 #include "towedarray.h"
27 
28 #ifndef TRUE
29 #define TRUE 1
30 #endif
31 #ifndef FALSE
32 #define FALSE 0
33 #endif
34 
35 #define TYPE_SUB 0
36 #define TYPE_SHIP 1
37 #define TYPE_AIR 2
38 #define TYPE_TORPEDO 3
39 #define TYPE_NOISEMAKER 4
40 #define TYPE_HELICOPTER 5
41 
42 #define FRIEND 1
43 #define FOE 0
44 #define UNKNOWN 2
45 #define NEUTRAL 3
46 
47 #define CONTACT_SOLID 100
48 #define CONTACT_WEAK 25
49 #define CONTACT_PING 5
50 #define PING_NOISE 200
51 
52 #define CLASS_NAME_SIZE 32
53 #define CLASS_TYPE_SIZE 8
54 #define CLASS_LOSANGELES 1
55 #define CLASS_AKULA 2
56 #define CLASS_DESTROYER 3
57 #define CLASS_MERCHANT 4
58 #define CLASS_TORPEDO 5
59 #define CLASS_NOISEMAKER 6
60 #define CLASS_TYPHOON 7
61 #define CLASS_NIMITZ 8
62 #define CLASS_TBILISI 9
63 #define CLASS_ALPHA 10
64 #define CLASS_OHIO 11
65 #define CLASS_HELICOPTER 12
66 
67 // status of tubes
68 #define MAX_TUBES 6
69 #define TUBE_EMPTY 0
70 #define TUBE_TORPEDO 1
71 #define TUBE_NOISEMAKER 2
72 
73 
74 // Actions to do with tubes
75 // these have weird nmbers for legacy reasons
76 #define         LOAD_TORPEDO 66
77 #define         LOAD_NOISEMAKER 67
78 #define         UNLOAD_TUBE 68
79 #define         FIRE_TUBE 69
80 
81 // torpedo tube status codes
82 #define TUBE_ERROR_NUMBER  1 // we were passed an invalid tube number
83 #define TUBE_ERROR_FULL 2    // tube has something in it
84 #define TUBE_ERROR_ACTION 3  // we were passed an invalid action
85 #define TUBE_ERROR_NO_TORPEDO 4  // we are out of torpedos
86 #define TUBE_ERROR_NO_NOISE 5    // we are out of noise makers
87 #define TUBE_ERROR_TORPEDO_SUCCESS 6  // tube loaded successfully
88 #define TUBE_ERROR_NOISEMAKER_SUCCESS 7  // tube loaded successfully
89 #define TUBE_ERROR_UNLOAD_SUCCESS 8   // we cleared the tube ok
90 #define TUBE_ERROR_FIRE_FAIL 9      // could not fire torpedo
91 #define TUBE_ERROR_FIRE_SUCCESS 10  // we fired a torpedo
92 #define TUBE_ERROR_FIRE_NOISEMAKER 11   // we fired a noisemaker
93 
94 #define TORPEDO_FUEL 600
95 #define HITTING_RANGE 50
96 #define HITTING_DEPTH 25
97 #define OUT_OF_FUEL 1
98 #define HIT_TARGET 2
99 #define STATUS_OK 3
100 
101 #define DAMAGE_OK 1
102 #define DAMAGE_SINK 2
103 
104 #define CHANCE_COURSE 1000
105 #define RUDDER_CHANGE 0.025
106 #define PLANES_CHANGE 0.2  // originally around 0.185
107 
108 #define MISSION_NONE 0
109 #define MISSION_SINK 1
110 #define MISSION_FIND 2
111 #define MISSION_ALIVE 3
112 
113 #define YARDS_TO_MILES 0.000568
114 #define MILES_TO_YARDS 1760
115 #define PERISCOPE_DEPTH 50
116 
117 #define MAX_TORPEDOES_FIRED 1
118 #define MAX_NOISEMAKERS_FIRED 1
119 #define MAX_PLAYER_WEAPONS 6
120 #define MAX_TORPEDO_RANGE 8
121 #define TORPEDO_RANGE_ATTACK 4
122 #define TORPEDO_RANGE_PASSIVE 3
123 
124 #define DISTRACTED_CHANCE 4   // 1 in 4 chance a torpedo will chase noisemaker
125 
126 // types of behaviour
127 #define MOOD_ATTACK 1
128 #define MOOD_PASSIVE 2
129 #define MOOD_CONVOY 3
130 
131 #define CONVOY_CHANGE_COURSE 1200
132 
133 // radio messages for surface ships
134 #define RADIO_NONE 0
135 #define RADIO_UNDER_ATTACK 1
136 #define RADIO_HEAR_TORPEDO 2
137 // maybe add impending attack, detected sub, reform convoy...
138 
139 
140 
141 
142 /**
143   *@author Michael Bridak
144   */
145 
146 typedef struct
147 {
148    void *sub;
149    void *next;
150    int contact_strength;
151 } Target;
152 
153 
154 class Submarine : public Coord,  public Stack  {
155 public:
156 	float NauticalMiles;
157 	float HisPassiveSonarCrosssection;
158 	float EffectiveTargetSpeed;
159 	float AmbientNoise;
160 	float OwnShipNoise;
161 	float flowandambientnoise;
162 	float TotalNoise;
163 	float TargetNoise;
164 	float Gb;
165 	float Lbp;
166 	float NoiseFromSpeed;
167 	float BasisNoiseLevel;
168 	float value;
169 	float SeaState; // Anyone want to model the weather.
170         int current_target;   // who are we tracking?
171 	int Active; /*Flag to see if ship is in the world.*/
172 	int ShipType; /*SubSurface, Surface, Air */
173         int ShipClass;  // specific type (Los Angels, Akula, etc)
174         char ClassName[CLASS_NAME_SIZE];
175         char ClassType[CLASS_TYPE_SIZE];
176 	int Friend; /*Flag to mark if ship is a friend/foe/neither*/
177 	float Depth; /*How deep are we?*/
178 	int DesiredDepth; /*You want to go how deep!*/
179 	int MaxDepth; /*Why is my hull crushing!*/
180 	int DesiredSpeed; /*Scotty warp speed!*/
181 	int MaxSpeed; /*Captin I've given her all she's got!*/
182 	int MinSpeed; /*You want to go how fast in reverse!?*/
183 	int DesiredHeading;
184 	int Rudder; /*bend me and she will turn*/
185 	int TorpedosOnBoard; /*Where are all the fish!*/
186         int NoiseMakers;    // to destract the torpedos
187 	int CavitationFlag;
188 	int BaseNoise; /*how noisey are we just sittin' here*/
189 	float PSCS; /*Passive Sonar Crosssection*/
190 	float RadiatedNoise(); /*Tell 'em how loud we are.*/
191 	void CheckForCavitation(); /*self explanitory */
192 	void Handeling(); /*Turn Left/Right go Up/Down Etc...*/
193 	float CheckNegSpeed(float); /*if Speed is negative return inverse value*/
194 	double DistanceToTarget(Submarine *Target);
195 	double BearingToTarget(Submarine *Target);
196         double BearingToOrigin(Submarine *Target);
197 	float DEAngle(Submarine *Target);
198         int hull_strength;
199         int mission_status;
200         int mission_timer;
201         int has_sonar;
202         int mood;
203         int convoy_course_change;
204         int radio_message;
205         int torpedo_tube[MAX_TUBES];
206         int pinging;       // are we using active sonar?
207         int using_radar;
208         MAP *map;
209 
210         Submarine *next;     // also for torpedos, though could be used
211                              // later for ships
212         Submarine *target;   // for torpedoes
213         Target *last_target;
214         Submarine *owner;     // torpedoes are owned by ships/subs
215         int fuel_remaining;  // mostly for torpedos,
216                              // but maybe for electric subs later
217         int origin_x, origin_y;    // where did this torp come from?
218 
219 	Submarine();
220 	~Submarine();
221         void Init();
222 
223         // We should be able to track targets
224         Target *targets;
225         int Add_Target(Submarine *new_sub, float contact_strength);
226         void Remove_Target(Submarine *old_sub);
227         void Cancel_Target(Submarine *old_sub);
228         int Can_Detect(Submarine *a_sub);
229 
230         // returns target index or -1 if none is available
231         Submarine *Next_Target();
232 
233         // Load information on this type of ship/sub
234         int Load_Class(char *from_file);
235         int Load_Mission(FILE *from_file);
236         int Use_Tube(int action, int tube_number);
237 
238         Submarine *Fire_Tube(Submarine *target, char *ship_file);
239         int Can_Hear(Submarine *target);
240         int Torpedo_AI(Submarine *all_subs);
241         // figure out what to do with surface ships
242         // Submarine *Ship_AI(Submarine *all_ships, Submarine *all_torpedoes);
243         // like ship AI in 3D
244         Submarine *Sub_AI(Submarine *all_ships, Submarine *all_torpedoes, void *helicopters);
245         int Check_Status();         // see if our torpedo is ok
246         int Take_Damage();         // we were hit!
247         int Count_Torpedoes(Submarine *all_torpedoes); // how many have I fired?
248         int Count_Noisemakers(Submarine *all_noise); // how many have I launched?
249         Submarine *Have_Enemy_Target(Submarine *all_ships);
250         Submarine *Launch_Noisemaker(Submarine *all_torpedoes, Submarine *chased_by);  // AI function
251         int Is_Distracted_By_Noisemaker(Submarine *noisemaker);  // is this torpedo distracted?
252         int Radio_Signal(Submarine *all_ships, int my_signal);
253         int Send_Ping(Submarine *all_ships);
254         int InBaffles(Submarine *target, int sensor, TowedArray *TB16);
255 };
256 
257 #endif
258 
259