1 #ifndef _pball_h
2 #define _pball_h
3 
4 //
5 // In diesem Modul wird die Klasse PBallTop deklariert, die der
6 // rechnerspezifischen Klasse PBall als Oberklasse dient.
7 //
8 #ifndef _vec2_h
9 #	include "vec2.h"
10 #endif
11 
12 class Ball;
13 
14 typedef enum {
15 	BillardQueue,
16 	DiscSlider,
17 	DiscThrower
18 } PBallType;
19 
20 class PBallTop {
21 	public:
22 		PBallTop(PBallType type=BillardQueue);
23 		virtual ~PBallTop();
24 
25 		virtual void Warp( const Vec2 &dest ) = 0;
26 
27 typedef void (PBallTop::*PBallFun)();
28 		static void ForAll( PBallFun fun );
29 
30 		void CueMoved();								// Callback an der Kugel
31 		void CueWasHit();								// Callback an der Kugel
32 
33 		virtual void Redraw();
34 		virtual void Update();
35 
36 	protected:
37 		virtual void Press(int button);
38 		virtual void Release(int button);
39 
40 		typedef enum {
41 			Unlocked		=   1,
42 			Moving		=   2,
43 			Aiming		=   4,
44 			Charging		=   8,
45 			OldCharging =  16,
46 			Shooting		=  32,
47 			OldShooting =  64,
48 			ChargeOrShoot	= 120,	// Charging|Shooting
49 			Locked			= 124,	// Aiming|Charging|Shooting
50 			LockedQueue = 128,
51 			UsingTool		= 252,	// Aiming|Charging|Shooting|LockedQueue
52 			PullMoving	= 256,
53 			ReadyToSleep	= 263		// Unlocked|Moving|Aiming|PullMoving
54 		} Mode;
55 		Mode					mode;
56 friend class PBallNorm;				// for WaitForEvents-Implementation
57 
58 		PBallType			pball_type;
59 
60 		Ball *cue;
61 		Ball *default_cue;
62 		Real FindPressed( Ball **best );			// sucht n�chste Kugel
63 		Ball *FindCueBall();							// sucht n�chstgelegene Kugel
64 
65 		void StartAiming( Ball *cueball=0L );	// Zielen mit gew�hlter Kugel
66 		void StartCharging( int old );			// Aufladen
67 		void RestartCharging();
68 		void StartShooting( int old );			// Animation des Sto�es starten
69 		void Shoot();									// Sto� ausl�sen, Kugel loslassen
70 
71 		void StartPullMoving( Ball *cueball=0L );// Kugel auf Tisch bewegen
72 
73 		void StartMoving( Ball *cueball=0L );	// Kugel direkt bewegen
74 	public:
75 		void StopMoving();							// bewegte Kugel loslassen
76 	protected:
77 		void ReleaseBall();							// Kugel loslassen
78 		void GoUnlocked();							// �bergang in Unlock-Zustand
79 
80 	// Pointerbewegung
81 		Vec2	dest;				  	  	// aktuelle Position der Maus
82 //		union {
83 			Real		target_time;		// abs. Zeit, wann Ziel erreicht sein soll
84 			Real		lock_time;			// lock-Zeit nach Schu�
85 //		};
86 		Vec2	q_end;					// Spitze des Queue's (w�hrend lock-Zeit)
87 
88 	public:
89 		static Real WarpTime;			// Zeitspanne f�r einen Maussprung
90 		static Real LockedQueueDelay;	// Nachlauf des gelock'ten Queues
91 
92 	protected:
93 		void WarpRecalc();
94 		void PointerMoveTo( const Vec2 &pointer_position );
95 
96 		virtual void RedrawPointer() = 0;				// Mausanzeige
97 		virtual void SetPointer( int x, int y ) = 0;	// Mausanzeige
98 
99 	// Aiming Tool
100 		int	tool_is_visible;
101 		virtual void StartAimingTool();
102 		virtual void MoveAimingTool();
103 		virtual void EndAimingTool();
104 		virtual void DrawAimingTool(int charge_only=0);
105 		void		SaveAimingState();
106 
107 		int	valid_queue_position;
108 		Vec2	q_end_s, q_s1_s, q_s2_s;
109 		virtual void StartQueue(const Vec2 &end, const Vec2 &s1, const Vec2 &s2);
110 		virtual void MoveQueue(const Vec2 &end, const Vec2 &s1, const Vec2 &s2);
111 		virtual void EndQueue();
112 		virtual void DrawQueue();
113 
114 #define MAX_PREPOS	3
115 		void 		PreCalc();
116 		int		ncalc_pos;
117 		Vec2		calc_pos[MAX_PREPOS];
118 		Vec2		balls_dir;					// Richtung zur Zielkugel
119 		Vec2		my_dir;						// Richtung der Sto�kugel
120 
121 	// Charger
122 		Real		next_chargestep;			// Zeit des n�chsten Aufladens
123 		Real		last_chargestep;			// Zeit des letzten Aufladens
124 		Real		charge;						// Aktuelle Ladung
125 		Real		charge_increment;			// Aktuelle Einheiten pro Sekunde
126 		Real		save_charge;				// Ladung beim Abschu�
127 
128 		int		id;
129 
130 		int		aim_hint;		// Spezialhilfe zum Zielen
131 		int		aim_mode;		// Pointer-Mode beim letzten Zeichnen
132 		Vec2		aim_p;			// Kugelposition beim letzten Zeichnen
133 		Real		aim_r;			// Kugelradius
134 	//	int		aim_x, aim_y;	// alte Pointerposition
135 		Vec2		old_dest;		// alte Pointerposition
136 		Real		aim_charge;
137 		int		int_charge;
138 		char		hint_valid;
139 
140 		int		x_old, y_old;	// alte Pointerposition (von SetPointer)
141 
142 	protected:
143 		static int					id_count;
144 		static class PBallTop	*pball_queue;
145 		class PBallTop				*next;
146 };
147 
148 #ifndef __TURBOC__
149 #	include "xpball.h"
150 #else
151 #	include "dospball.h"
152 #endif
153 
154 #endif
155