Rise
The Vieneo Province
CargoManagement.cpp
Go to the documentation of this file.
1 #include "../Instrument.h"
2 #include "../../Bus.h"
3 
4 CargoManagement::CargoManagement(int prmX, int prmY, float prmXScale, float prmYScale, Bus* prmBus, Logger* prmLogger, DeviceObject* prmDevice, std::vector<Font*> prmFonts) :
5  Instrument(prmX, prmY, prmXScale, prmYScale, prmBus, prmLogger, prmDevice, prmFonts)
6 {
7  logger->AddToCallStack("CargoManagement::ctor");
8  defaultFont = 1;
9 
10  for (int t = 0; t < 64; t++)
11  rowType[t].clear();
12  ZeroMemory(rowValue, 64 * 4);
13 }
14 
15 void CargoManagement::RenderRow(const WCHAR* row, DWORD color, int rowId, std::string type, int value)
16 {
17  logger->AddToCallStack("CargoManagement::RenderRow");
18  const int lineHeight = 12;
19 
20  if (rowId == uiRow && !rowType[rowId].empty())
21  {
22  DrawTextW(L"███████████████████████████████████████████████████████████████████████████████", 0, rowId*lineHeight, 0, DT_NOCLIP, 0xFF00A0A0);
23  }
24 
25  DrawTextW(row, 0, rowId*lineHeight, 0, DT_NOCLIP, color);
26 
27  rowType[rowId] = type;
28  rowValue[rowId] = value;
29 }
30 
32 {
33  logger->AddToCallStack("CargoManagement::Render");
34  float totalWeightLbs = 0.0f;
35  int totalSouls = 0;
36  int rowId = 0;
37 
38  RenderRow(L"MANIFEST WGT KG REGISTRY DESCRIPTION QUANTITY NOTES", 0xFF00FFFF, rowId++);
39  RenderRow(L"------------- ------ ------------ -------------------- -------- ---------------", 0xFF00FFFF, rowId++);
40 
41  WCHAR row[999];
42  WCHAR column[99];
43  switch (playerships[0].type)
44  {
45  case VehicleType::C98: swprintf_s(column, 99, L"C-98 MuVER"); break;
46  case VehicleType::E10: swprintf_s(column, 99, L"E-10 Saint"); break;
47  case VehicleType::P13: swprintf_s(column, 99, L"P-13 Prowler"); break;
48  case VehicleType::A4: swprintf_s(column, 99, L"A-4 Wanderer"); break;
49  case VehicleType::C2: swprintf_s(column, 99, L"C-2 Dasher"); break;
50  case VehicleType::T120: swprintf_s(column, 99, L"T-120 Steerhead"); break;
51  case VehicleType::T121: swprintf_s(column, 99, L"T-121 Steerhead"); break;
52  case VehicleType::E11: swprintf_s(column, 99, L"E-11 Saint"); break;
53  case VehicleType::T27: swprintf_s(column, 99, L"T-27 Mammoth"); break;
54  case VehicleType::C2A: swprintf_s(column, 99, L"C-2A Dasher"); break;
55  case VehicleType::W6Manx: swprintf_s(column, 99, L"W-6 Manx"); break;
56  case VehicleType::T19: swprintf_s(column, 99, L"T-19 Stratomaster"); break;
57  default: swprintf_s(column, 99, L"Unknown"); break;
58  }
59  swprintf_s(row, 999, L"Empty Weight %6.0f IVR %-6S* %-18s %S", ourcockpit.emptyWeightLbs / Kg2Lbs, playerships[0].IVR, column, playerships[0].owner);
60  RenderRow(row, 0xFFAAAAAA, rowId++);
61  totalWeightLbs += ourcockpit.emptyWeightLbs;
62 
63  swprintf_s(row, 999, L"Fuel %6.0f", fuel / Kg2Lbs);
64  RenderRow(row, 0xFFAAAAAA, rowId++, "Fuel");
65  totalWeightLbs += fuel;
66 
67  bool hasAvionics = false;
68  for (short t = 0; t < MAX_AVIOPERSHIP; t++)
69  {
70  switch (ourcockpit.vdat.avionictype[t])
71  {
72  case 1: // 320LRS
73  if (!hasAvionics)
74  swprintf_s(row, 999, L"Avionics Bays 13 320K-LRS ON");
75  else
76  swprintf_s(row, 999, L" 13 320K-LRS ON");
77  hasAvionics = true;
78  totalWeightLbs += 28.0f;
79  RenderRow(row, 0xFFAAAAAA, rowId++);// , "Avionics", t);
80  break;
81  case 2: // 40SRS
82  if (!hasAvionics)
83  swprintf_s(row, 999, L"Avionics Bays 2 40K-SRS ON");
84  else
85  swprintf_s(row, 999, L" 2 40K-SRS ON");
86  hasAvionics = true;
87  totalWeightLbs += 3.5f;
88  RenderRow(row, 0xFFAAAAAA, rowId++);// , "Avionics", t);
89  break;
90  case 3: // JVC Radio
91  if (!hasAvionics)
92  swprintf_s(row, 999, L"Avionics Bays 2 JVC Radio ");
93  else
94  swprintf_s(row, 999, L" 2 JVC Radio ");
96  wcscat_s(row, 999, L"ON");
97  else
98  wcscat_s(row, 999, L"OFF");
99  hasAvionics = true;
100  totalWeightLbs += 4.75f;
101  RenderRow(row, 0xFFAAAAAA, rowId++, "Avionics", ourcockpit.vdat.avionictype[t]);
102  break;
103  case 4: // Remote Assay
104  if (!hasAvionics)
105  swprintf_s(row, 999, L"Avionics Bays 6 Remote Assay ");
106  else
107  swprintf_s(row, 999, L" 6 Remote Assay ");
109  wcscat_s(row, 999, L"ON");
110  else
111  wcscat_s(row, 999, L"OFF");
112  hasAvionics = true;
113  totalWeightLbs += 13.9f;
114  RenderRow(row, 0xFFAAAAAA, rowId++, "Avionics", ourcockpit.vdat.avionictype[t]);
115  break;
116  case 5: // Weather Radar
117  if (!hasAvionics)
118  swprintf_s(row, 999, L"Avionics Bays 8 Weather Radar ");
119  else
120  swprintf_s(row, 999, L" 8 Weather Radar ");
122  wcscat_s(row, 999, L"ON");
123  else
124  wcscat_s(row, 999, L"OFF");
125  hasAvionics = true;
126  totalWeightLbs += 17.8574f;
127  RenderRow(row, 0xFFAAAAAA, rowId++, "Avionics", ourcockpit.vdat.avionictype[t]);
128  break;
129  }
130  }
131 
132  bool hasWeapons = false;
133  for (short t = 0; t < MAX_WEAPPERSHIP; t++)
134  {
135  switch (ourcockpit.vdat.weapontype[t])
136  {
137  case 1:
138  if (!hasWeapons)
139  swprintf_s(row, 999, L"Weapons Bays 113 Fuzer %.0f%%", weapontimer[t] / weaponfuzerreadyC * 100.0f);
140  else
141  swprintf_s(row, 999, L" 113 Fuzer %.0f%%", weapontimer[t] / weaponfuzerreadyC * 100.0f);
142  hasWeapons = true;
143  totalWeightLbs += 248.0f;
144  RenderRow(row, 0xFFAAAAAA, rowId++);// , "Weapons", t);
145  break;
146  case 2:
147  if (!hasWeapons)
148  swprintf_s(row, 999, L"Weapons Bays 282 Sinker %.0f%%", weapontimer[t] / weaponsinkerreadyC * 100.0f);
149  else
150  swprintf_s(row, 999, L" 282 Sinker %.0f%%", weapontimer[t] / weaponsinkerreadyC * 100.0f);
151  hasWeapons = true;
152  totalWeightLbs += 619.5f;
153  RenderRow(row, 0xFFAAAAAA, rowId++);// , "Weapons", t);
154  break;
155  case 3:
156  const float tempWeightLbs = 102.5f + ourcockpit.vdat.weaponreload * 188.0f;
157  if (!hasWeapons)
158  swprintf_s(row, 999, L"Weapons Bays %6.0f Longarm %i Rounds %.0f%%", tempWeightLbs / Kg2Lbs, ourcockpit.vdat.weaponreload, weapontimer[t] / weaponlongarmreadyC * 100.0f);
159  else
160  swprintf_s(row, 999, L" %6.0f Longarm %i Rounds %.0f%%", tempWeightLbs / Kg2Lbs, ourcockpit.vdat.weaponreload, weapontimer[t] / weaponlongarmreadyC * 100.0f);
161  hasWeapons = true;
162  totalWeightLbs += tempWeightLbs;
163  RenderRow(row, 0xFFAAAAAA, rowId++);// , "Weapons", t);
164  break;
165  }
166  }
167 
168  for (int i = 0; i < ourcockpit.bays; i++)
169  {
170  if (i == 0 && (ourcockpit.texturelib == VehicleType::T120 || ourcockpit.texturelib == VehicleType::T121))
171  wcscpy_s(column, 99, L"Cargo Bed ");
172  else
173  swprintf_s(column, 99, L"Cargo Bay %-2i ", i + 1);
174  wcscpy_s(row, 999, column);
175 
176  if (bus->CargoBays[i] != 0)
177  {
178  const Sscan cargobay = bus->Scanner.Get(bus->CargoBays[i]);
179  if (cargobay.initialized)
180  {
181  if (cargobay.scandata.modeX.weightLbs.is_set())
182  {
183  swprintf_s(column, 99, L"%6.0f ", cargobay.scandata.modeX.weightLbs.get() / Kg2Lbs);
184  wcscat_s(row, 999, column);
185  totalWeightLbs += cargobay.scandata.modeX.weightLbs.get();
186  }
187  else
188  {
189  logger->Log("WeightLbs not set on cargo bay!", Logger::Level::Error);
190  }
191 
192  if (cargobay.scandata.modeAC.type >= 10 && cargobay.scandata.modeAC.type < 19)
193  swprintf_s(column, 99, L"PODS%-6S ", cargobay.scandata.modeAC.IVR);
194  else if (cargobay.scandata.modeX.pilot.is_set() && cargobay.scandata.modeX.pilot.get())
195  {
196  swprintf_s(column, 99, L"IVR %-6S* ", cargobay.scandata.modeAC.IVR);
197  totalSouls++;
198  }
199  else
200  swprintf_s(column, 99, L"IVR %-6S ", cargobay.scandata.modeAC.IVR);
201  wcscat_s(row, 999, column);
202 
203  switch (cargobay.scandata.modeAC.type)
204  {
205  case VehicleType::C98: swprintf_s(column, 99, L"MuVER "); break;
206  case VehicleType::C2: swprintf_s(column, 99, L"C-2 "); break;
207  case VehicleType::PODS_PAX: swprintf_s(column, 99, L"Pax "); break;
208  case VehicleType::PODS_CNST: swprintf_s(column, 99, L"Const "); break;
209  case VehicleType::PODS_CARGOAFT: swprintf_s(column, 99, L"Crgo AFT "); break;
210  case VehicleType::PODS_FUEL: swprintf_s(column, 99, L"AuxFuel "); break;
211  case VehicleType::PODS_CARGOTOP: swprintf_s(column, 99, L"Crgo TOP "); break;
212  case VehicleType::PODS_MUNITIONS: swprintf_s(column, 99, L"Munition "); break;
213  case VehicleType::C2A: swprintf_s(column, 99, L"C-2A "); break;
214  default: swprintf_s(column, 99, L"UNKNOWN "); break;
215  }
216  wcscat_s(row, 999, column);
217 
218  if (cargobay.scandata.modeAC.type == PODS_FUEL)
219  {
220  if (cargobay.scandata.modeX.load_quantity.is_set() && cargobay.scandata.modeX.load_type.is_set() &&
221  cargobay.scandata.modeX.load_quantity.get() > 0)
222  swprintf_s(column, 99, L"Fuel %i kg ", cargobay.scandata.modeX.load_quantity.get());
223  else
224  swprintf_s(column, 99, L" ");
225  }
226  else if (cargobay.scandata.modeAC.type == PODS_MUNITIONS)
227  {
228  if (cargobay.scandata.modeX.load_quantity.is_set() && cargobay.scandata.modeX.load_type.is_set() &&
229  cargobay.scandata.modeX.load_quantity.get() > 0)
230  {
231  switch (cargobay.scandata.modeX.load_type.get())
232  {
233  case CargoLoadType::None: swprintf_s(column, 99, L" "); break;
234  case CargoLoadType::WeaponLongarms: swprintf_s(column, 99, L"Longarm %i Rounds ", cargobay.scandata.modeX.load_quantity.get()); break;
235  default: swprintf_s(column, 99, L"UNKNOWN "); break;
236  }
237  }
238  else
239  swprintf_s(column, 99, L" ");
240  }
241  else
242  {
243  if (cargobay.scandata.modeX.load_type.is_set())
244  {
245  if (cargobay.scandata.modeX.load_quantity.is_set())
246  {
247  switch (cargobay.scandata.modeX.load_type.get())
248  {
249  case CargoLoadType::None: swprintf_s(column, 99, L" "); break;
250  case CargoLoadType::CargoRare: swprintf_s(column, 99, L"Rare %i MT ", cargobay.scandata.modeX.load_quantity.get()); break;
251  case CargoLoadType::CargoFood: swprintf_s(column, 99, L"Foodstuffs %i MT ", cargobay.scandata.modeX.load_quantity.get()); break;
252  case CargoLoadType::CargoCommon: swprintf_s(column, 99, L"Common %i MT ", cargobay.scandata.modeX.load_quantity.get()); break;
253  case CargoLoadType::CargoFuelOre: swprintf_s(column, 99, L"Fuel Ore %i MT ", cargobay.scandata.modeX.load_quantity.get()); break;
254  case CargoLoadType::CargoGoods: swprintf_s(column, 99, L"Consumer %i MT ", cargobay.scandata.modeX.load_quantity.get()); break;
255  case CargoLoadType::CargoFab: swprintf_s(column, 99, L"Fabricated %i MT ", cargobay.scandata.modeX.load_quantity.get()); break;
256  case CargoLoadType::Passengers: swprintf_s(column, 99, L"Ticketed %i ", cargobay.scandata.modeX.load_quantity.get());
257  totalSouls += cargobay.scandata.modeX.load_quantity.get();
258  break;
259  case CargoLoadType::Colonists: swprintf_s(column, 99, L"Laborers %i ", cargobay.scandata.modeX.load_quantity.get());
260  totalSouls += cargobay.scandata.modeX.load_quantity.get();
261  break;
262  case CargoLoadType::Prisoners: swprintf_s(column, 99, L"Prisoners %i ", cargobay.scandata.modeX.load_quantity.get());
263  totalSouls += cargobay.scandata.modeX.load_quantity.get();
264  break;
265  case CargoLoadType::Residential: swprintf_s(column, 99, L"Estate %ix ", cargobay.scandata.modeX.load_quantity.get()); break;
266  case CargoLoadType::Mining: swprintf_s(column, 99, L"Mine %ix ", cargobay.scandata.modeX.load_quantity.get()); break;
267  case CargoLoadType::Farmstead: swprintf_s(column, 99, L"Farmstead %ix ", cargobay.scandata.modeX.load_quantity.get()); break;
268  case CargoLoadType::Township: swprintf_s(column, 99, L"Township %ix ", cargobay.scandata.modeX.load_quantity.get()); break;
269  case CargoLoadType::Airfield: swprintf_s(column, 99, L"Airfield %ix ", cargobay.scandata.modeX.load_quantity.get()); break;
270  default: swprintf_s(column, 99, L"UNKNOWN "); break;
271  }
272  }
273  else
274  {
275  swprintf_s(column, 99, L"LOAD_QUANTITY ERROR ");
276  }
277  }
278  else
279  {
280  swprintf_s(column, 99, L" ");
281  }
282  }
283  column[21] = 0; // truncate since variable length with %i's
284  wcscat_s(row, 999, column);
285 
286  if (cargobay.scandata.modeX.load_quantity.is_set() && cargobay.scandata.modeX.load_quantity.get() > 0)
287  {
288  switch (cargobay.scandata.modeX.load_dest.get())
289  {
290  case 0: wcscpy_s(column, 99, L"Undeclared"); break;
291  case 1: wcscpy_s(column, 99, L"Deois Airport"); break; // air traffic
292  case 2: wcscpy_s(column, 99, L"LA Eyeworks"); break;
293  case 3: wcscpy_s(column, 99, L"Fleet Bank"); break;
294  case 4: wcscpy_s(column, 99, L"ATI Tower"); break;
295  case 5: wcscpy_s(column, 99, L"Zana Zoom's"); break;
296  case 6: wcscpy_s(column, 99, L"UI Building"); break;
297  case REF_DOCKCPOC: wcscpy_s(column, 99, L"CPOC"); break;
298  case REF_DOCKTAC: wcscpy_s(column, 99, L"TAC"); break;
299  case 12: wcscpy_s(column, 99, L"Arcridge"); break;
300  case 13: wcscpy_s(column, 99, L"Junk Ore Inc"); break;
301  case 14: wcscpy_s(column, 99, L"Deois Airport"); break; // ground traffic
302  case 15: wcscpy_s(column, 99, L"Law Offices"); break;
303  case 16: wcscpy_s(column, 99, L"Police Station"); break;
304  default:wcscpy_s(column, 99, L"UNKNOWN"); break;
305  }
306  wcscat_s(row, 999, column);
307  }
308  }
309  else
310  {
311  swprintf_s(column, 99, L"SCAN DATA NOT INITIALIZED");
312  wcscat_s(row, 999, column);
313  }
314  }
315 
316  RenderRow(row, 0xFFFFFFFF, rowId++, "Bay", i);
317  }
318 
320  swprintf_s(row, 999, L"Crew %6i %-12S %-20S Driver", ourcockpit.playerWeightKg, ourcockpit.handle, ourcockpit.character);
321  else
322  swprintf_s(row, 999, L"Crew %6i %-12S %-20S Pilot", ourcockpit.playerWeightKg, ourcockpit.handle, ourcockpit.character);
323  RenderRow(row, 0xFFAAAAAA, rowId++);// , "Crew", 0);
324  totalWeightLbs += ourcockpit.playerWeightKg*Kg2Lbs;
325  totalSouls++;
326 
327  float stowageWeightLbs;
328  if (ourcockpit.cargoloadtype > CargoLoadType::CargoEnum && ourcockpit.cargoloadtype < CargoLoadType::PaxEnum) // pax
329  {
330  stowageWeightLbs = ourcockpit.cargoload * 225.0f; // 185 average with carry-on + 40 lbs baggage average
331  totalSouls += ourcockpit.cargoload;
332 
333  swprintf_s(row, 999, L"Stowage %6.0f ", stowageWeightLbs / Kg2Lbs);
334  switch (ourcockpit.cargoloadtype)
335  {
336  case CargoLoadType::Passengers: swprintf_s(column, 99, L"Pax Ticketed %i ", ourcockpit.cargoload); break;
337  case CargoLoadType::Colonists: swprintf_s(column, 99, L"Pax Laborers %i ", ourcockpit.cargoload); break;
338  case CargoLoadType::Prisoners: swprintf_s(column, 99, L"Pax Prisoners %i ", ourcockpit.cargoload); break;
339  default: swprintf_s(column, 99, L"Pax UNKNOWN %i ", ourcockpit.cargoload); break;
340  }
341  column[31] = 0; // truncate since variable length with %i's
342  wcscat_s(row, 999, column);
343 
344  switch (ourcockpit.paxdest)
345  {
346  case 0: wcscpy_s(column, 99, L"Undeclared"); break;
347  case 1: wcscpy_s(column, 99, L"Deois Airport"); break;
348  case 2: wcscpy_s(column, 99, L"LA Eyeworks"); break;
349  case 3: wcscpy_s(column, 99, L"Fleet Bank"); break;
350  case 4: wcscpy_s(column, 99, L"ATI Tower"); break;
351  case 5: wcscpy_s(column, 99, L"Zana Zoom's"); break;
352  case 6: wcscpy_s(column, 99, L"UI Building"); break;
353  case REF_DOCKCPOC: wcscpy_s(column, 99, L"CPOC"); break;
354  case REF_DOCKTAC: wcscpy_s(column, 99, L"TAC"); break;
355  case 12: wcscpy_s(column, 99, L"Arcridge"); break;
356  case 13: wcscpy_s(column, 99, L"Junk Ore Inc"); break;
357  case 14: wcscpy_s(column, 99, L"Deois Airport"); break; // ground traffic
358  case 15: wcscpy_s(column, 99, L"Law Offices"); break;
359  case 16: wcscpy_s(column, 99, L"Police Station"); break;
360  default:wcscpy_s(column, 99, L"UNKNOWN"); break;
361  }
362  wcscat_s(row, 999, column);
363  }
364  else
365  {
366  stowageWeightLbs = ourcockpit.cargoload * 1000.0f * Kg2Lbs;
367  swprintf_s(row, 999, L"Stowage %6.0f ", stowageWeightLbs / Kg2Lbs);
368  switch (ourcockpit.cargoloadtype)
369  {
370  case CargoLoadType::None: swprintf_s(column, 99, L" "); break;
371  case CargoLoadType::CargoRare: swprintf_s(column, 99, L"Cargo Rare %i MT ", ourcockpit.cargoload); break;
372  case CargoLoadType::CargoFood: swprintf_s(column, 99, L"Cargo Foodstuffs %i MT ", ourcockpit.cargoload); break;
373  case CargoLoadType::CargoCommon: swprintf_s(column, 99, L"Cargo Common %i MT ", ourcockpit.cargoload); break;
374  case CargoLoadType::CargoFuelOre: swprintf_s(column, 99, L"Cargo Fuel Ore %i MT ", ourcockpit.cargoload); break;
375  case CargoLoadType::CargoGoods: swprintf_s(column, 99, L"Cargo Consumer %i MT ", ourcockpit.cargoload); break;
376  case CargoLoadType::CargoFab: swprintf_s(column, 99, L"Cargo Fabricated %i MT ", ourcockpit.cargoload); break;
377  case CargoLoadType::Residential: swprintf_s(column, 99, L"Estate %ix ", ourcockpit.cargoload); break;
378  case CargoLoadType::Mining: swprintf_s(column, 99, L"Mine %ix ", ourcockpit.cargoload); break;
379  case CargoLoadType::Farmstead: swprintf_s(column, 99, L"Farmstead %ix ", ourcockpit.cargoload); break;
380  case CargoLoadType::Township: swprintf_s(column, 99, L"Township %ix ", ourcockpit.cargoload); break;
381  case CargoLoadType::Airfield: swprintf_s(column, 99, L"Airfield %ix ", ourcockpit.cargoload); break;
382  default: swprintf_s(column, 99, L"Cargo UNKNOWN %i MT ", ourcockpit.cargoload); break;
383  }
384  column[31] = 0; // truncate since variable length with %i's
385  wcscat_s(row, 999, column);
386  }
387  RenderRow(row, 0xFFAAAAAA, rowId++);
388  totalWeightLbs += stowageWeightLbs;
389 
390 
393  for (UINT i = 0; i < ourcockpit.personalInventory.size(); i++)
394  {
395  float inventoryWeight = 0.0f;
396  switch (ourcockpit.personalInventory.at(i))
397  {
398  case 1: wcscpy_s(column, 99, L"Lock Pick Set"); inventoryWeight = 1.48f; break;
399  case 2: wcscpy_s(column, 99, L"Binoculars"); inventoryWeight = 3.2f; break;
400  case 3: wcscpy_s(column, 99, L"ATM"); inventoryWeight = 209.0f; break;
401  case 4: wcscpy_s(column, 99, L"Night Vision"); inventoryWeight = 3.2f; break;
402  case 5: wcscpy_s(column, 99, L"E-11 Upgrade Voucher"); inventoryWeight = 0.0f; break;
403  case 6: wcscpy_s(column, 99, L"Sunglasses"); inventoryWeight = 0.1f; break;
404  case 7: wcscpy_s(column, 99, L"Fireworks"); inventoryWeight = 178.0f; break;
405  case 8: wcscpy_s(column, 99, L"Temp Runway Lights"); inventoryWeight = 495.0f; break;
406  case 9: wcscpy_s(column, 99, L"Colony Up-link"); inventoryWeight = 40.0f; break;
407  default: wcscpy_s(column, 99, L"UNKNOWN"); inventoryWeight = 0.0f; break;
408  }
409  if (i == 0)
410  swprintf_s(row, 999, L"Baggage %6.0f %s", inventoryWeight / Kg2Lbs, column);
411  else
412  swprintf_s(row, 999, L" %6.0f %s", inventoryWeight / Kg2Lbs, column);
413 
414  RenderRow(row, 0xFFAAAAAA, rowId++, "Baggage", i);
415  totalWeightLbs += inventoryWeight;
416  }
417  if (ourcockpit.personalInventory.empty())
418  swprintf_s(row, 999, L"Baggage %6.0f Cash (CR) %.0f", cash*0.001f, cash);
419  else
420  swprintf_s(row, 999, L" %6.0f Cash (CR) %.0f", cash*0.001f, cash);
421  RenderRow(row, 0xFFAAAAAA, rowId++);
422  totalWeightLbs += cash * 0.001f*Kg2Lbs; // cash is in kg
423 
424 
425 
427  for (UINT i = 0; i < ourcockpit.vehicleInventory.size(); i++)
428  {
429  float inventoryWeight = 0.0f;
430  switch (ourcockpit.vehicleInventory.at(i))
431  {
432  case KitType::LockPick:
433  wcscpy_s(column, 99, L"Lock Pick Set"); inventoryWeight = 1.48f; break;
434  case KitType::Binoculars:
435  wcscpy_s(column, 99, L"Binoculars"); inventoryWeight = 3.2f; break;
436  case KitType::ATM:
437  wcscpy_s(column, 99, L"ATM"); inventoryWeight = 209.0f; break;
438  case KitType::NightVision:
439  wcscpy_s(column, 99, L"Night Vision"); inventoryWeight = 3.2f; break;
440  case KitType::E11Upgrade:
441  wcscpy_s(column, 99, L"E-11 Upgrade Voucher"); inventoryWeight = 0.0f; break;
442  case KitType::Sunglasses:
443  wcscpy_s(column, 99, L"Sunglasses"); inventoryWeight = 0.1f; break;
444  case KitType::Firework:
445  wcscpy_s(column, 99, L"Fireworks"); inventoryWeight = 178.0f; break;
446  case KitType::TemporaryRunwayLighting:
447  wcscpy_s(column, 99, L"Temp Runway Lights"); inventoryWeight = 495.0f; break;
448  case KitType::UpLink:
449  wcscpy_s(column, 99, L"Colony Up-link"); inventoryWeight = 40.0f; break;
450  default: wcscpy_s(column, 99, L"UNKNOWN"); inventoryWeight = 0.0f; break;
451  }
452  if (i == 0)
453  swprintf_s(row, 999, L"Cabin %6.0f %s", inventoryWeight / Kg2Lbs, column);
454  else
455  swprintf_s(row, 999, L" %6.0f %s", inventoryWeight / Kg2Lbs, column);
456 
457  RenderRow(row, 0xFFAAAAAA, rowId++, "Cabin", i);
458  totalWeightLbs += inventoryWeight;
459  }
460 
461 
462  const float loadedC = (totalWeightLbs - ourcockpit.emptyWeightLbs) / (ourcockpit.maxGrossLbs - ourcockpit.emptyWeightLbs);
463  swprintf_s(row, 999, L"Total Weight %6.0f ", totalWeightLbs / Kg2Lbs);
464 
465  if (totalWeightLbs >= 300000.0f)
466  wcscat_s(row, 999, L"Heavy ");
467  else
468  wcscat_s(row, 999, L" ");
469 
470  swprintf_s(column, 99, L"%i Souls", totalSouls);
471  wcscat_s(row, 999, column);
472 
473  if (loadedC > 1.0f)
474  RenderRow(row, D3DCOLOR_ARGB(255, 255, 0, 0), rowId++);
475  else if (loadedC > 0.75f)
476  RenderRow(row, D3DCOLOR_ARGB(255, 255, 255, 0), rowId++);
477  else
478  RenderRow(row, D3DCOLOR_ARGB(255, 0, 255, 0), rowId++);
479 
480  if (!g_bTextInput)
481  {
482  if (rowType[uiRow] == "Bay" && bus->CargoBays[rowValue[uiRow]] != 0)
483  {
484  DrawTextW(L"Shift+U Unload Shift+S Scan Shift+F Fuel", 0, 300, 0, DT_NOCLIP, 0xFF00A0A0, 0);
485  }
486  else if (rowType[uiRow] == "Cabin" || rowType[uiRow] == "Baggage")
487  {
488  DrawTextW(L"Shift+U Use Shift+S Swap Shift+T Transfr", 0, 300, 0, DT_NOCLIP, 0xFF00A0A0, 0);
489  }
490  else if (rowType[uiRow] == "Fuel")
491  {
492  DrawTextW(L"Shift+J Jettison", 0, 300, 0, DT_NOCLIP, 0xFF00A0A0, 0);
493  }
494  else if (rowType[uiRow] == "Avionics")
495  {
496  DrawTextW(L"Shift+U Use", 0, 300, 0, DT_NOCLIP, 0xFF00A0A0, 0);
497  }
498  }
499 }
500 
501 bool CargoManagement::HandleKeyPress(short key, bool shift)
502 {
503  logger->AddToCallStack("CargoManagement::HandleKeyPress");
504  if (!shift || key == 42) return false;
505 
506  switch (key)
507  {
508  case 208:
509  case 80: // arrow down
510  if (uiRow < 62) uiRow++;
511  while (rowType[uiRow].empty() && uiRow < 62) uiRow++;
512  return true;
513  case 200:
514  case 72: // arrow up
515  if (uiRow > 0) uiRow--;
516  while (rowType[uiRow].empty() && uiRow > 0) uiRow--;
517  return true;
518  case 22: // u
519  if (rowType[uiRow] == "Bay")
520  {
522  if (bus->CargoBays[rowValue[uiRow]] != 0)
523  {
524  Command command;
525  command.name = "UnloadCargoBay";
526  command.ivalues[0] = rowValue[uiRow]; // bay number starting with 0
527  command.ivalues[1] = bus->CargoBays[rowValue[uiRow]]; // vehicle ID
528  bus->commandStream.emplace_back(command);
529  return true;
530  }
531  }
532  else if (rowType[uiRow] == "Cabin" || rowType[uiRow] == "Baggage")
533  {
534  Command command;
535  command.name = "UseInventoryItem";
536  command.ivalues[0] = rowValue[uiRow]; // inventoryId
537  command.bValue = rowType[uiRow] == "Baggage"; // onPerson
538  bus->commandStream.emplace_back(command);
539  return true;
540  }
541  else if (rowType[uiRow] == "Avionics")
542  {
543  Command command;
544  command.name = "ToggleAvionics";
545  command.ivalues[0] = rowValue[uiRow]; // item type
546  bus->commandStream.emplace_back(command);
547  return true;
548  }
549  break;
550  case 31: // s
551  if (rowType[uiRow] == "Bay")
552  {
553  if (bus->CargoBays[rowValue[uiRow]] != 0)
554  {
555  Command command;
556  command.name = "ChangeMfdPage";
557  command.sValue = "Scanner";
558  bus->commandStream.emplace_back(command);
559 
560  command.name = "ScanCargoBay";
561  command.ivalues[0] = bus->CargoBays[rowValue[uiRow]]; // vehicle ID
562  bus->commandStream.emplace_back(command);
563  return true;
564  }
565  }
566  else if (rowType[uiRow] == "Baggage")
567  {
568  Command command;
569  command.name = "SwapInventoryItem";
570  command.ivalues[0] = rowValue[uiRow]; // inventoryId
571  command.ivalues[1] = 0; // personal2vehicle
572  command.bValue = true; // was inVehicle
573  bus->commandStream.emplace_back(command);
574  return true;
575  }
576  else if (rowType[uiRow] == "Cabin")
577  {
578  Command command;
579  command.name = "SwapInventoryItem";
580  command.ivalues[0] = rowValue[uiRow]; // inventoryId
581  command.ivalues[1] = 1; // vehicle2personal
582  command.bValue = false; // was onPerson
583  bus->commandStream.emplace_back(command);
584  return true;
585  }
586  break;
587  case 33: // f
588  if (rowType[uiRow] == "Bay")
589  {
590  if (bus->CargoBays[rowValue[uiRow]] != 0)
591  {
592  temptarget = bus->CargoBays[rowValue[uiRow]]; // vehicle ID
593  g_bTextInput = 6;
594  outgoing[0] = 0; // clear buffer
595  sprintf_s(prompt, sizeof(prompt), "[±kg]");
596  return true;
597  }
598  }
599  break;
600  case 36: // j for jettison
601  if (rowType[uiRow] == "Fuel")
602  {
603  g_bTextInput = 8;
604  outgoing[0] = 0; // clear buffer
605  sprintf_s(prompt, sizeof(prompt), "[-kg]");
606  return true;
607  }
608  break;
609  case 20: // t
610  if (rowType[uiRow] == "Baggage")
611  {
612  Command command;
613  command.name = "TransferInventoryItem";
614  command.ivalues[0] = rowValue[uiRow]; // inventoryItemType
615  command.ivalues[1] = 0; // personal inventory
616  command.bValue = true; // onPerson
617  bus->commandStream.emplace_back(command);
618  return true;
619  }
620  if (rowType[uiRow] == "Cabin")
621  {
622  Command command;
623  command.name = "TransferInventoryItem";
624  command.ivalues[0] = rowValue[uiRow]; // inventoryItemType
625  command.ivalues[1] = 1; // personal inventory
626  command.bValue = false; // onPerson
627  bus->commandStream.emplace_back(command);
628  return true;
629  }
630  }
631  return false;
632 }
Scockpit ourcockpit
Definition: globals.cpp:176
void Render() override
char IVR[6]
Definition: scanDb.h:16
bool bValue
Definition: Command.h:22
unsigned char type
Definition: scanDb.h:17
float fuel
Definition: globals.cpp:143
std::string rowType[64]
Definition: Instrument.h:100
int ivalues[2]
Definition: Command.h:21
std::vector< Command > commandStream
Definition: Bus.h:342
Nullable< float > weightLbs
Definition: scanDb.h:34
bool radioPower
Definition: globals.h:606
CargoManagement(int prmX, int prmY, float prmXScale, float prmYScale, Bus *prmBus, Logger *prmLogger, DeviceObject *prmDevice, std::vector< Font *> prmFonts)
Definition: Logger.h:9
char bays
Definition: globals.h:627
bool weatherRadarPower
Definition: globals.h:606
scanDb Scanner
Definition: Bus.h:379
unsigned char cargoload
Definition: globals.h:673
unsigned char paxdest
Definition: globals.h:673
s_network_objects playerships[MAX_SCAN]
Definition: globals.cpp:174
float cash
Definition: globals.cpp:146
unsigned char cargoloadtype
Definition: globals.h:673
short texturelib
Definition: globals.h:612
unsigned char playerWeightKg
Definition: globals.h:665
char handle[13]
Definition: globals.h:667
float weapontimer[2]
Definition: globals.cpp:142
std::vector< unsigned char > personalInventory
Definition: globals.h:675
#define weaponsinkerreadyC
Definition: globals.h:68
char g_bTextInput
Definition: globals.cpp:108
Nullable< unsigned short > load_quantity
Definition: scanDb.h:32
Definition: Bus.h:16
std::string name
Definition: Command.h:11
#define Kg2Lbs
Definition: globals.h:31
void RenderRow(const WCHAR *row, DWORD color, int rowId, std::string type="", int value=0)
Bus * bus
Definition: Instrument.h:18
Nullable< short > load_dest
Definition: scanDb.h:33
UINT defaultFont
Definition: Instrument.h:20
char outgoing[80]
Definition: globals.cpp:107
#define weaponlongarmreadyC
Definition: globals.h:69
unsigned short temptarget
Definition: globals.cpp:119
Definition: Command.h:5
std::string sValue
Definition: Command.h:20
bool remoteAssayPower
Definition: globals.h:606
void Log(const char *msg, Level level=Info, int errorCode=0)
Definition: Logger.cpp:11
Nullable< int > pilot
Definition: scanDb.h:36
int rowValue[64]
Definition: Instrument.h:101
unsigned short CargoBays[MAX_PODSPERSHIP]
Definition: Bus.h:365
Logger * logger
Definition: Instrument.h:19
SmodeX modeX
Definition: scanDb.h:43
Sscandata scandata
Definition: scanDb.h:49
char character[30]
Definition: globals.h:666
float maxGrossLbs
Definition: globals.h:630
bool is_set() const
Definition: Nullable.h:87
SmodeAC modeAC
Definition: scanDb.h:41
Definition: scanDb.h:46
#define weaponfuzerreadyC
Definition: globals.h:67
char prompt[80]
Definition: globals.cpp:109
Sscan Get(USHORT vehicleId) const
Definition: scanDb.cpp:87
Nullable< unsigned char > load_type
Definition: scanDb.h:31
char owner[13]
Definition: globals.h:585
bool gndvehicle
Definition: globals.h:604
void AddToCallStack(const char *msg)
Definition: Logger.cpp:86
bool initialized
Definition: scanDb.h:48
std::vector< unsigned char > vehicleInventory
Definition: globals.h:676
float emptyWeightLbs
Definition: globals.h:629
T get() const
Definition: Nullable.h:80
bool HandleKeyPress(short key, bool shift) override
SVesselDC vdat
Definition: globals.h:669