Rise
The Vieneo Province
people.h
Go to the documentation of this file.
1 #pragma once
2 
3 #define PLAYER_RECORD 256
4 
5 #include <io.h> // For _open, _read, _close, _lseek (eof, write)
6 #include <assert.h> // For assert
7 #include <fcntl.h> // For _O_RDWR, _O_BINARY, _O_RDONLY (O_TEXT)
8 #include <sys/stat.h> // For _S_IWRITE, _S_IREAD
9 #include <direct.h> // For _mkdir
10 #include <stdio.h> // For SEEK_SET
11 #include <WinSock2.h>
12 #include <WS2tcpip.h>
13 #include <Windows.h>
14 
15 class PEOPLE
16 {
17  short fileversion;
18 
19 public:
20  long peopletot;
21 
23  {
24  int people;
25  _sopen_s(&people, "Save\\citizens.dat", _O_RDONLY | _O_BINARY | _O_SEQUENTIAL, _SH_DENYNO, _S_IWRITE);
26  if (people != -1)
27  {
28  _read(people, &peopletot, 4);
29  _read(people, &fileversion, 2);
30  if (fileversion == 0)
31  {
32  fileversion = 1;
33  for (long t = 1; t <= peopletot; t++)
34  {
35  SPlayerData tempperson = LoadPerson(t);
36  tempperson.allianceName[0] = 0;
37  SavePerson(t, tempperson);
38  }
39  _lseek(people, 4, SEEK_SET);
40  _write(people, &fileversion, 2);
41  }
42  _close(people);
43  return;
44  }
45  _mkdir("Save"); // for config, messages, waypoints
46  _sopen_s(&people, "Save\\citizens.dat", _O_WRONLY | _O_BINARY | _O_SEQUENTIAL | _O_CREAT | _O_TRUNC, _SH_DENYNO, _S_IWRITE);
47  peopletot = 0;
48  _write(people, &peopletot, 4);
49  fileversion = 1;
50  _write(people, &fileversion, 2);
51  _close(people);
52  };
53 
54  SPlayerData LoadPerson(long temprecord) const
55  {
56  SPlayerData tempperson = SPlayerData();
57  int people;
58  _sopen_s(&people, "Save\\citizens.dat", _O_RDONLY | _O_BINARY | _O_SEQUENTIAL, _SH_DENYNO, _S_IWRITE);
59  _lseek(people, temprecord*PLAYER_RECORD, SEEK_SET);
60  _read(people, &tempperson.age, 1);
61  _read(people, &tempperson.alignment, 1);
62  _read(people, &tempperson.allianceHeadId, 2);
63  _read(people, &tempperson.context, 1);
64  _read(people, &tempperson.eargroup, 2);
65  _read(people, &tempperson.eyecolor, 1);
66  _read(people, &tempperson.facialhair, 2);
67  _read(people, &tempperson.folder, 6);
68  _read(people, &tempperson.frame, 4);
69  _read(people, &tempperson.framegroup, 2);
70  _read(people, &tempperson.haircolor, 1);
71  _read(people, &tempperson.hairgroup, 2);
72  _read(people, &tempperson.callsign, 13);
73  _read(people, &tempperson.headgroup, 1);
74  _read(people, &tempperson.heightCm, 1);
75  _read(people, &tempperson.jawline, 2);
76  _read(people, &tempperson.membersince, sizeof(time_t));
77  _read(people, &tempperson.nosegroup, 2);
78  _read(people, &tempperson.notes, sizeof(WCHAR) * 32);
79  _read(people, &tempperson.characterName, 30);
80  _read(people, &tempperson.rank, 1);
81  _read(people, &tempperson.serial, 2);
82  _read(people, &tempperson.sex, 1);
83  _read(people, &tempperson.skincolor, 1);
84  _read(people, &tempperson.skintone, 1);
85  _read(people, &tempperson.stubbleFreckle, 1);
86  _read(people, &tempperson.vision, 1);
87  _read(people, &tempperson.weight, 1);
88  _read(people, &tempperson.createdate, sizeof(time_t));
89  _read(people, &tempperson.allianceName, 30);
90  _close(people);
91  return tempperson;
92  };
93 
94  void SavePerson(long temprecord, SPlayerData tempperson) const
95  {
96  int people;
97  _sopen_s(&people, "Save\\citizens.dat", _O_WRONLY | _O_BINARY | _O_SEQUENTIAL, _SH_DENYNO, _S_IWRITE);
98  _lseek(people, temprecord*PLAYER_RECORD, SEEK_SET);
99  _write(people, &tempperson.age, 1);
100  _write(people, &tempperson.alignment, 1);
101  _write(people, &tempperson.allianceHeadId, 2);
102  _write(people, &tempperson.context, 1);
103  _write(people, &tempperson.eargroup, 2);
104  _write(people, &tempperson.eyecolor, 1);
105  _write(people, &tempperson.facialhair, 2);
106  _write(people, &tempperson.folder, 6);
107  _write(people, &tempperson.frame, 4);
108  _write(people, &tempperson.framegroup, 2);
109  _write(people, &tempperson.haircolor, 1);
110  _write(people, &tempperson.hairgroup, 2);
111  _write(people, &tempperson.callsign, 13);
112  _write(people, &tempperson.headgroup, 1);
113  _write(people, &tempperson.heightCm, 1);
114  _write(people, &tempperson.jawline, 2);
115  _write(people, &tempperson.membersince, sizeof(time_t));
116  _write(people, &tempperson.nosegroup, 2);
117  _write(people, &tempperson.notes, sizeof(WCHAR) * 32);
118  _write(people, &tempperson.characterName, 30);
119  _write(people, &tempperson.rank, 1);
120  _write(people, &tempperson.serial, 2);
121  _write(people, &tempperson.sex, 1);
122  _write(people, &tempperson.skincolor, 1);
123  _write(people, &tempperson.skintone, 1);
124  _write(people, &tempperson.stubbleFreckle, 1);
125  _write(people, &tempperson.vision, 1);
126  _write(people, &tempperson.weight, 1);
127  _write(people, &tempperson.createdate, sizeof(time_t));
128  _write(people, &tempperson.allianceName, 30);
129  _close(people);
130  };
131 
132  void DeletePerson(long temprecord, char folder)
133  {
134  SPlayerData tempperson = LoadPerson(temprecord);
135  bool exists = false, changed = false;
136  for (short s = 0; s < MAX_TAB; s++)
137  {
138  if (s == folder && tempperson.folder[s])
139  {
140  tempperson.folder[s] = false;
141  changed = true;
142  }
143  if (tempperson.folder[s])
144  exists = true;
145  }
146  if (changed)
147  SavePerson(temprecord, tempperson); // update folder list
148  if (!exists)
149  {
150  for (long t = temprecord; t < peopletot; t++)
151  {
152  tempperson = LoadPerson(t + 1);
153  SavePerson(t, tempperson);
154  }
155  peopletot--;
156  int people;
157  _sopen_s(&people, "Save\\citizens.dat", _O_WRONLY | _O_BINARY | _O_SEQUENTIAL, _SH_DENYNO, _S_IWRITE);
158  if (people != -1)
159  {
160  _write(people, &peopletot, 4);
161  _close(people);
162  }
163  }
164  };
165 
166  long ResidesLocally(unsigned short serial) const
167  {
168  // looks for serial number and returns record # or 0 if DOESNOTEXIST
169  for (long t = 1; t <= peopletot; t++)
170  {
171  SPlayerData tempperson = LoadPerson(t);
172  if (tempperson.serial == serial)
173  return t;
174  }
175  return 0;
176  };
177 
178  char EarliestFolder(unsigned short serial) const
179  {
180  for (long t = 1; t <= peopletot; t++)
181  {
182  SPlayerData tempperson = LoadPerson(t);
183  if (tempperson.serial == serial)
184  {
185  for (char s = 0; s < MAX_TAB; s++)
186  {
187  if (tempperson.folder[s])
188  return s;
189  }
190  return -1;
191  }
192  }
193  return -1;
194  };
195 
196  char GetAlignment(int ownerId) const
197  {
198  for (long t = 1; t <= peopletot; t++)
199  {
200  const SPlayerData tempperson = LoadPerson(t);
201  if (tempperson.serial == ownerId)
202  return tempperson.alignment;
203  }
204  return 1; // neutral
205  };
206 
207  unsigned short AddUpdatePlayer(SPlayerData tempplayer, char folder)
208  {
209  long t = ResidesLocally(tempplayer.serial);
210  if (t)
211  {
212  const SPlayerData localplayer = LoadPerson(t);
213  wcscpy_s(tempplayer.notes, 32, localplayer.notes); // preserve notes
214  memcpy_s(tempplayer.folder, MAX_TAB, localplayer.folder, MAX_TAB); // preserve old folders
215  tempplayer.folder[folder] = true; // add to this folder
216  SavePerson(t, tempplayer);
217  return static_cast<unsigned short>(t);
218  }
219 
220  tempplayer.notes[0] = 0;
221  for (short s = 0; s < MAX_TAB; s++)
222  {
223  if (s == folder)
224  tempplayer.folder[s] = true;
225  else
226  tempplayer.folder[s] = false;
227  }
228  peopletot++;
229  SavePerson(peopletot, tempplayer);
230  int people;
231  _sopen_s(&people, "Save\\citizens.dat", _O_WRONLY | _O_BINARY | _O_SEQUENTIAL, _SH_DENYNO, _S_IWRITE);
232  if (people != -1)
233  {
234  _write(people, &peopletot, 4);
235  _close(people);
236  }
237  return (unsigned short)peopletot;
238  };
239 };
long ResidesLocally(unsigned short serial) const
Definition: people.h:166
SPlayerData LoadPerson(long temprecord) const
Definition: people.h:54
void DeletePerson(long temprecord, char folder)
Definition: people.h:132
unsigned short AddUpdatePlayer(SPlayerData tempplayer, char folder)
Definition: people.h:207
short fileversion
Definition: people.h:17
#define PLAYER_RECORD
Definition: people.h:3
long peopletot
Definition: people.h:20
char EarliestFolder(unsigned short serial) const
Definition: people.h:178
Definition: people.h:15
void SavePerson(long temprecord, SPlayerData tempperson) const
Definition: people.h:94
char GetAlignment(int ownerId) const
Definition: people.h:196
PEOPLE()
Definition: people.h:22