aboutsummaryrefslogtreecommitdiff
path: root/engines/xeen/party.h
blob: 7e5010427f8b544da85c0c37849ae0af00936321 (plain)
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
/* ScummVM - Graphic Adventure Engine
 *
 * ScummVM is the legal property of its developers, whose names
 * are too numerous to list here. Please refer to the COPYRIGHT
 * file distributed with this source distribution.
 *
 * 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; if not, write to the Free Software
 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
 *
 */

#ifndef XEEN_PARTY_H
#define XEEN_PARTY_H

#include "common/scummsys.h"
#include "common/array.h"
#include "common/rect.h"
#include "common/serializer.h"
#include "xeen/items.h"

namespace Xeen {

enum Direction { DIR_NORTH = 0, DIR_EAST = 1, DIR_SOUTH = 2, DIR_WEST = 3 };

enum Difficulty { ADVENTURER = 0, WARRIOR = 1 };

enum Sex { MALE = 0, FEMALE = 1, YES_PLEASE = 2 };

enum Race { HUMAN = 0, ELF = 1, DWARF = 2, GNOME = 3, HALF_ORC = 4 };

enum CharacterClass { KNIGHT = 0, PALADIN = 1, ARCHER = 2, CLERIC = 3,
	SORCERER = 4, ROBBER = 5, NINJA = 6, BARBARIAN = 7, DRUID = 8, RANGER = 9
};

enum Skill { THIEVERY = 0, ARMS_MASTER = 1, ASTROLOGER = 2, BODYBUILDER = 3,
	CARTOGRAPHER = 4, CRUSADER = 5, DIRECTION_SENSE = 6, LINGUIST = 7, 
	MERCHANT = 8, MOUNTAINEER = 9, NAVIGATOR = 10, PATHFINDER = 11,
	PRAYER_MASTER = 12, PRESTIDIGITATION = 13, SWIMMING = 14, TRACKING = 15,
	SPOT_DOORS = 16, DANGER_SENSE = 17
};

enum Condition { CURSED = 0, HEART_BROKEN = 1, WEAK = 2, POISONED = 3,
	DISEASED = 4, INSANE = 5, IN_LOVE = 6, DRUNK = 7, SLEEP = 8, 
	DEPRESSED = 9, CONFUSED = 10, PARALYZED = 11, UNCONSCIOUS = 12,
	DEAD = 13, STONED = 14, ERADICATED = 15,
	NO_CONDITION = 16
};

#define ITEMS_COUNT 36
#define TOTAL_CHARACTERS 30
#define XEEN_TOTAL_CHARACTERS 24
#define MAX_ACTIVE_PARTY 6

class XeenEngine;

class AttributePair {
public:	
	int _permanent;
	int _temporary;
public:
	AttributePair();
	void synchronize(Common::Serializer &s);
};

class PlayerStruct {
public:
	Common::String _name;
	Sex _sex;
	Race _race;
	int _xeenSide;
	CharacterClass _class;
	AttributePair _might;
	AttributePair _intellect;
	AttributePair _personality;
	AttributePair _endurance;
	AttributePair _speed;
	AttributePair _accuracy;
	AttributePair _luck;
	int _ACTemp;
	AttributePair _level;
	int _dbDay;
	int _tempAge;
	int _skills[18];
	bool _awards[512];
	bool _spells[312];
	int _lloydMap;
	Common::Point _lloydPosition;
	bool _hasSpells;
	int _currentSpell;
	int _quickOption;
	XeenItem _weapons[9];
	XeenItem _armor[9];
	XeenItem _accessories[9];
	XeenItem _misc[9];
	int _lloydSide;
	AttributePair _fireResistence;
	AttributePair _coldResistence;
	AttributePair _electricityResistence;
	AttributePair _poisonResistence;
	AttributePair _energyResistence;
	AttributePair _magicResistence;
	int _conditions[16];
	int _townUnknown;
	int _unknown2;
	int _currentHp;
	int _currentSp;
	int _ybDay;
	uint32 _experience;
	int _currentAdventuringSpell;
	int _currentCombatSpell;
public:
	PlayerStruct();
	void synchronize(Common::Serializer &s);

	Condition findCondition() const;

	int getYear(int partyYear, bool ignoreTemp);

	int getMaxHp();
};

class Roster: public Common::Array<PlayerStruct> {
public:
	Roster() {}

	void synchronize(Common::Serializer &s);
};

class Party {
public:
	// Dynamic data that's saved
	int _partyCount;
	int _realPartyCount;
	int _partyMembers[8];
	Direction _mazeDirection;
	Common::Point _mazePosition;
	int _mazeId;
	int _priorMazeId;
	bool _levitateActive;
	bool _automapOn;
	bool _wizardEyeActive;
	bool _clairvoyanceActive;
	bool _walkOnWaterActive;
	bool _blessedActive;
	bool _powerShieldActive;
	bool _holyBonusActive;
	bool _heroismActive;
	Difficulty _difficulty;
	XeenItem _blacksmithWeapons[ITEMS_COUNT];
	XeenItem _blacksmithArmor[ITEMS_COUNT];
	XeenItem _blacksmithAccessories[ITEMS_COUNT];
	XeenItem _blacksmithMisc[ITEMS_COUNT];
	bool _cloudsEnd;
	bool _darkSideEnd;
	bool _worldEnd;
	int hour_maybe;
	int _day;
	int _year;
	int _minutes;
	int _food;
	int _lightCount;
	int _torchCount;
	int _fireResistence;
	int _electricityResistence;
	int _coldResistence;
	int _poisonResistence;
	int _deathCount;
	int _winCount;
	int _lossCount;
	int _gold;
	int _gems;
	int _bankGold;
	int _bankGems;
	int _totalTime;
	bool _rested;
	bool _gameFlags[512];
	bool _autoNotes[128];
	bool _quests[64];
	int _questItems[85];
	XeenItem _blacksmithWeapons2[ITEMS_COUNT];
	XeenItem _blacksmithArmor2[ITEMS_COUNT];
	XeenItem _blacksmithAccessories2[ITEMS_COUNT];
	XeenItem _blacksmithMisc2[ITEMS_COUNT];
	bool _characterFlags[30][24];
public:
	// Other party related runtime data
	Common::Array<PlayerStruct *> _activeParty;
	int _combatPartyCount;
public:
	Party();

	void synchronize(Common::Serializer &s);

	bool checkSkill(Skill skillId);

	bool isInParty(int charId);
};

} // End of namespace Xeen

#endif	/* XEEN_PARTY_H */