-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathgame.h
More file actions
407 lines (360 loc) · 13.3 KB
/
game.h
File metadata and controls
407 lines (360 loc) · 13.3 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
// START A3HEADER
//
// This source file is part of the Atlantis PBM game program.
// Copyright (C) 1995-1999 Geoff Dunbar
//
// 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 the Free Software Foundation; either version 2
// of the License, or (at your option) any later version.
//
// This program is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU General Public License for more details.
//
// You should have received a copy of the GNU General Public License
// along with this program, in the file license.txt. If not, write
// to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
// Boston, MA 02111-1307, USA.
//
// See the Atlantis Project web page for details:
// http://www.prankster.com/project
//
// END A3HEADER
#ifndef GAME_CLASS
#define GAME_CLASS
class Game;
#include "aregion.h"
#include "alist.h"
#include "faction.h"
#include "production.h"
#include "object.h"
#define CURRENT_ATL_VER MAKE_ATL_VER( 4, 0, 4 )
class OrdersCheck
{
public:
OrdersCheck();
virtual ~OrdersCheck();
Aoutfile *pCheckFile;
Unit dummyUnit;
Faction dummyFaction;
Order dummyOrder;
int numshows;
void Error( const AString &error );
};
class Game
{
friend class Faction;
public:
Game();
~Game();
int NewGame();
int OpenGame();
void DummyGame();
int RunGame();
int EditGame( int *pSaveGame );
int SaveGame();
int WritePlayers();
int ReadPlayers();
int ReadPlayersLine( AString *pToken, AString *pLine, Faction *pFac,
int newPlayer );
void WriteNewFac( Faction *pFac );
int ViewMap(const AString &,const AString &);
// LLS
void UnitFactionMap();
// dsnlab
void GameStatistic();
int DoOrdersCheck( const AString &strOrders, const AString &strCheck );
Faction *AddFaction(int nn=-1);
//
// Give this particular game a chance to set up the faction. This is in
// extra.cpp.
//
int SetupFaction( Faction *pFac );
void ViewFactions();
//
// Get a new unit, with its number assigned.
//
Unit *GetNewUnit( Faction *fac, int an = 0 );
//
// Setup the array of units.
//
void SetupUnitNums();
//
// Get a unit by its number.
//
Unit *GetUnit( int num );
int TurnNumber();
private:
//
// Game editing functions.
//
ARegion *EditGameFindRegion();
void EditGameFindUnit();
void EditGameRegion( ARegion *pReg );
void EditGameUnit( Unit *pUnit );
void EditGameUnitItems( Unit *pUnit );
void EditGameUnitSkills( Unit *pUnit );
void EditGameUnitMove( Unit *pUnit );
void PreProcessTurn();
void Do1Move(AString *);
void Do1Set(AString *);
void ReadOrders();
void RunOrders();
void ClearOrders(Faction *);
void MakeFactionReportLists();
void CountAllMages();
void WriteReport();
void DeleteDeadFactions();
//
// Standard creation functions.
//
void CreateCityMons();
void CreateWMons();
void CreateLMons();
//
// Game-specific creation functions (see world.cpp).
//
void CreateWorld();
void CreateNPCFactions();
void CreateCityMon( ARegion *pReg, int percent );
int MakeWMon( ARegion *pReg );
void MakeLMon( Object *pObj );
void WriteSurfaceMap( Aoutfile *f, ARegionArray *pArr, int type );
void WriteUnderworldMap( Aoutfile *f, ARegionArray *pArr, int type );
char GetRChar( ARegion *r );
AString GetXtraMap(ARegion *,int);
AList factions;
AList newfactions; /* List of strings */
AList battles;
ARegionList regions;
int factionseq;
int unitseq;
Unit **ppUnits;
int maxppunits;
int shipseq;
int year;
int month;
enum {
GAME_STATUS_UNINIT,
GAME_STATUS_NEW,
GAME_STATUS_RUNNING,
GAME_STATUS_FINISHED,
};
int gameStatus;
int guardfaction;
int monfaction;
int doExtraInit;
//
// Parsing functions
//
void ParseError( OrdersCheck *pCheck, Unit *pUnit, Faction *pFac,
const AString &strError );
UnitId *ParseUnit(AString * s);
int ParseDir(AString * token);
void ParseOrders(int faction, Aorders *ordersFile, OrdersCheck *pCheck );
void ProcessOrder( int orderNum, Unit *unit, AString *order,
OrdersCheck *pCheck );
void ProcessMoveOrder(Unit *,AString *, OrdersCheck *pCheck );
void ProcessAdvanceOrder(Unit *,AString *, OrdersCheck *pCheck );
Unit *ProcessFormOrder( Unit *former, AString *order,
OrdersCheck *pCheck );
void ProcessAddressOrder(Unit *,AString *, OrdersCheck *pCheck );
void ProcessAvoidOrder(Unit *,AString *, OrdersCheck *pCheck );
void ProcessGuardOrder(Unit *,AString *, OrdersCheck *pCheck );
void ProcessNameOrder(Unit *,AString *, OrdersCheck *pCheck );
void ProcessDescribeOrder(Unit *,AString *, OrdersCheck *pCheck );
void ProcessBehindOrder(Unit *,AString *, OrdersCheck *pCheck );
void ProcessGiveOrder(Unit *,AString *, OrdersCheck *pCheck );
void ProcessDeclareOrder(Faction *,AString *, OrdersCheck *pCheck );
void ProcessStudyOrder(Unit *,AString *, OrdersCheck *pCheck );
void ProcessTeachOrder(Unit *,AString *, OrdersCheck *pCheck );
void ProcessWorkOrder(Unit *, OrdersCheck *pCheck );
void ProcessProduceOrder(Unit *,AString *, OrdersCheck *pCheck );
void ProcessBuyOrder( Unit *, AString *, OrdersCheck *pCheck );
void ProcessSellOrder(Unit *,AString *, OrdersCheck *pCheck );
void ProcessTradeOrder( Unit *, AString *, OrdersCheck *pCheck );
void ProcessAttackOrder(Unit *,AString *, OrdersCheck *pCheck );
void ProcessBuildOrder( Unit *, AString *, OrdersCheck *pCheck );
void ProcessSailOrder(Unit *,AString *, OrdersCheck *pCheck );
void ProcessEnterOrder(Unit *,AString *, OrdersCheck *pCheck );
void ProcessLeaveOrder(Unit *, OrdersCheck *pCheck );
void ProcessPromoteOrder(Unit *,AString *, OrdersCheck *pCheck );
void ProcessTaxOrder(Unit *, OrdersCheck *pCheck );
void ProcessPillageOrder(Unit *, OrdersCheck *pCheck );
void ProcessConsumeOrder(Unit *, AString *, OrdersCheck *pCheck );
void ProcessRevealOrder(Unit *,AString *, OrdersCheck *pCheck );
void ProcessFindOrder(Unit *,AString *, OrdersCheck *pCheck );
void ProcessDestroyOrder(Unit *, OrdersCheck *pCheck );
void ProcessQuitOrder(Unit *,AString *, OrdersCheck *pCheck );
void ProcessRestartOrder(Unit *,AString *, OrdersCheck *pCheck );
void ProcessAssassinateOrder(Unit *,AString *, OrdersCheck *pCheck );
void ProcessStealOrder(Unit *,AString *, OrdersCheck *pCheck );
void ProcessFactionOrder(Unit *,AString *, OrdersCheck *pCheck );
void ProcessClaimOrder(Unit *,AString *, OrdersCheck *pCheck );
void ProcessCombatOrder(Unit *,AString *, OrdersCheck *pCheck );
void ProcessCastOrder(Unit *,AString *, OrdersCheck *pCheck );
void ProcessEntertainOrder(Unit *, OrdersCheck *pCheck );
void ProcessForgetOrder(Unit *,AString *, OrdersCheck *pCheck );
void ProcessReshowOrder(Unit *,AString *, OrdersCheck *pCheck );
void ProcessHoldOrder(Unit *,AString *, OrdersCheck *pCheck );
void ProcessNoaidOrder(Unit *,AString *, OrdersCheck *pCheck );
void ProcessAutoTaxOrder(Unit *,AString *, OrdersCheck *pCheck );
void ProcessOptionOrder(Unit *,AString *, OrdersCheck *pCheck );
void ProcessPasswordOrder(Unit *,AString *, OrdersCheck *pCheck );
void ProcessRouteOrder(Unit *,AString * , OrdersCheck *pCheck);
void ProcessLast_Order(Unit *,AString * , OrdersCheck *pCheck);
void ProcessNospoilsOrder(Unit *, AString *, OrdersCheck *pCheck);
void ProcessSpoilsOrder(Unit *, AString *, OrdersCheck *pCheck);
//
// Game running functions
//
//
// This can be called by parse functions
//
int CountMages(Faction *);
void CountItems (int **);
int CountItem (Faction *, int);
void FindDeadFactions();
void DeleteEmptyUnits();
void DeleteEmptyInRegion(ARegion *);
void EmptyHell();
void DoGuard1Orders();
void DoGiveOrders();
//
// Faction limit functions.
//
// The first 3 are game specific and can be found in extra.cpp. They
// may return -1 to indicate no limit.
//
int AllowedMages( Faction *pFac );
int AllowedTaxes( Faction *pFac );
int AllowedTrades( Faction *pFac );
int TaxCheck( ARegion *pReg, Faction *pFac );
int TradeCheck( ARegion *pReg, Faction *pFac );
// dsnlab
int TradeCheckFishing( ARegion *pReg, Faction *pFac );
int TradeCheckRoadbuild( ARegion *pReg, Faction *pFac );
//
// The DoGiveOrder returns 0 normally, or 1 if no more GIVE orders
// should be allowed
//
int DoGiveOrder(ARegion *,Unit *,GiveOrder *);
//
// These are game specific, and can be found in extra.cpp
//
void CheckUnitMaintenance( int consume );
void CheckFactionMaintenance( int consume );
void CheckAllyMaintenance();
void CheckUnitMaintenanceItem(int item, int value, int consume );
void CheckFactionMaintenanceItem(int item, int value, int consume );
void CheckAllyMaintenanceItem(int item, int value);
void AssessMaintenance();
void GrowWMons(int);
void GrowLMons(int);
void PostProcessUnit(ARegion *,Unit *);
//
// PostProcessUnitExtra can be used to provide game-specific unit
// post processing.
//
void PostProcessUnitExtra(ARegion *,Unit *);
void PostProcessTurn();
//
// CheckVictory is used to see if the game is over.
//
Faction *CheckVictory();
void EndGame( Faction *pVictor );
// dsnlab
void RunTradeOrders ();
void DoTrade (ARegion *);
TradeOrder * GetOrder (Unit *, TradeOrder *);
void RealTrade (ARegion *, int);
void FindMinMaxPrice (ARegion *, int, int &, int &, AList &, AList &);
void RunBuyOrders();
void DoBuy(ARegion *,Market *);
int GetBuyAmount(ARegion *,Market *);
void RunSellOrders();
void DoSell(ARegion *,Market *);
int GetSellAmount(ARegion *,Market *);
void DoAttackOrders();
void CheckWMonAttack(ARegion *,Unit *);
Unit *GetWMonTar(ARegion *,int,Unit *);
int CountWMonTars(ARegion *,Unit *);
void AttemptAttack(ARegion *,Unit *,Unit *,int,int=0);
void DoAutoAttacks();
void DoAutoAttacksRegion(ARegion *);
void DoAdvanceAttack(ARegion *,Unit *);
void DoAutoAttack(ARegion *,Unit *);
void DoAdvanceAttacks(AList *);
void DoAutoAttackOn(ARegion *,Unit *);
void RemoveEmptyObjects();
void RunEnterOrders();
void Do1EnterOrder(ARegion *,Object *,Unit *);
void RunPromoteOrders();
void Do1PromoteOrder(Object *,Unit *);
void RunPillageOrders();
int CountPillagers(ARegion *);
void ClearPillagers(ARegion *);
void RunPillageRegion(ARegion *);
void RunTaxOrders();
void RunTaxRegion(ARegion *);
int CountTaxers(ARegion *);
void RunFindOrders();
void RunFindUnit(Unit *);
void RunDestroyOrders();
void Do1Destroy(ARegion *,Object *,Unit *);
void RunQuitOrders();
void RunForgetOrders();
void Do1Quit(Faction *);
void SinkShips();
void RunStealOrders();
AList * CanSeeSteal(ARegion *,Unit *);
void Do1Steal(ARegion *,Object *,Unit *);
void Do1Assassinate(ARegion *,Object *,Unit *);
void AdjustCityMons( ARegion *pReg );
void AdjustCityMon( ARegion *pReg, Unit *u );
//
// Month long orders
//
void RunMoveOrders();
Location * DoAMoveOrder(Unit *,ARegion *,Object *);
void DoMoveEnter(Unit *,ARegion *,Object **);
void RunMonthOrders();
void RunStudyOrders(ARegion *);
void Do1StudyOrder(Unit *,Object *);
void RunTeachOrders();
void Do1TeachOrder(ARegion *,Unit *);
void RunProduceOrders(ARegion *);
int ValidProd(Unit *,ARegion *,Production *);
int FindAttemptedProd(ARegion *,Production *);
void RunAProduction(ARegion *,Production *);
void RunUnitProduce(ARegion *,Unit *);
void Run1BuildOrder(ARegion *,Object *,Unit *);
void RunSailOrders();
ARegion * Do1SailOrder(ARegion *,Object *,Unit *);
void ClearCastEffects();
void RunCastOrders();
void RunACastOrder(ARegion *,Object *,Unit *);
void RunTeleportOrders();
void RemoveInactiveFactions();
void Olding();
int GetItemBonus (Unit *, int);
//
// include spells.h for spell function declarations
//
#define GAME_SPELLS
#include "spells.h"
#undef GAME_SPELLS
//
// Battle function
//
void KillDead(Location *);
int RunBattle(ARegion *,Unit *,Unit *,int = 0,int = 0);
void GetSides(ARegion *,AList &,AList &,AList &,AList &,Unit *,Unit *,
int = 0,int = 0);
int CanAttack(ARegion *,AList *,Unit *);
void GetAFacs(ARegion *,Unit *,Unit *,AList &,AList &,AList &);
void GetDFacs(ARegion *,Unit *,AList &);
};
#endif