comparison Engine/Party.cpp @ 2565:117c219bf913

Party, items and stuff are abstracted from savegame file representation
author a.parshin
date Wed, 20 May 2015 15:12:33 +0200
parents c674d547cc7c
children 30eb6dcac768
comparison
equal deleted inserted replaced
2564:f9bdfe26d03d 2565:117c219bf913
270 total_exp += pPlayers[i].uExperience; 270 total_exp += pPlayers[i].uExperience;
271 return (unsigned int)(min(total_exp / 1000, UINT_MAX)); //min wasn't present, but could be incorrect without it 271 return (unsigned int)(min(total_exp / 1000, UINT_MAX)); //min wasn't present, but could be incorrect without it
272 } 272 }
273 273
274 //----- (0049137D) -------------------------------------------------------- 274 //----- (0049137D) --------------------------------------------------------
275 void Party::CreateDefaultParty(char bGiveItems) 275 void Party::CreateDefaultParty(bool bDebugGiveItems)
276 { 276 {
277 Player *pCharacter; // esi@3 277 Player *pCharacter; // esi@3
278 int uSkillIdx; // eax@11 278 int uSkillIdx; // eax@11
279 unsigned int v16; // [sp-4h] [bp-44h]@26 279 unsigned int v16; // [sp-4h] [bp-44h]@26
280 signed int uNumPlayers; // [sp+18h] [bp-28h]@1 280 signed int uNumPlayers; // [sp+18h] [bp-28h]@1
283 pHireling1Name[0] = 0; 283 pHireling1Name[0] = 0;
284 pHireling2Name[0] = 0; 284 pHireling2Name[0] = 0;
285 this->hirelingScrollPosition = 0; 285 this->hirelingScrollPosition = 0;
286 memset(&pHirelings, 0, sizeof(pHirelings)); 286 memset(&pHirelings, 0, sizeof(pHirelings));
287 287
288 strcpy(this->pPlayers[0].pName, pGlobalTXT_LocalizationStrings[509]); //Zoltan 288 strcpy(this->pPlayers[0].pName, pGlobalTXT_LocalizationStrings[509]); // Zoltan
289 this->pPlayers[0].uPrevFace = 17; 289 this->pPlayers[0].uPrevFace = 17;
290 this->pPlayers[0].uCurrentFace = 17; 290 this->pPlayers[0].uCurrentFace = 17;
291 this->pPlayers[0].uPrevVoiceID = 17; 291 this->pPlayers[0].uPrevVoiceID = 17;
292 this->pPlayers[0].uVoiceID = 17; 292 this->pPlayers[0].uVoiceID = 17;
293 this->pPlayers[0].uMight = 30; 293 this->pPlayers[0].uMight = 30;
295 this->pPlayers[0].uWillpower = 5; 295 this->pPlayers[0].uWillpower = 5;
296 this->pPlayers[0].uEndurance = 13; 296 this->pPlayers[0].uEndurance = 13;
297 this->pPlayers[0].uAccuracy = 13; 297 this->pPlayers[0].uAccuracy = 13;
298 this->pPlayers[0].uSpeed = 14; 298 this->pPlayers[0].uSpeed = 14;
299 this->pPlayers[0].uLuck = 7; 299 this->pPlayers[0].uLuck = 7;
300 this->pPlayers[0].pActiveSkills[PLAYER_SKILL_LEATHER] = 1; // leather 300 this->pPlayers[0].pActiveSkills[PLAYER_SKILL_LEATHER] = 1;
301 this->pPlayers[0].pActiveSkills[PLAYER_SKILL_ARMSMASTER] = 1; // armsmaster 301 this->pPlayers[0].pActiveSkills[PLAYER_SKILL_ARMSMASTER] = 1;
302 this->pPlayers[0].pActiveSkills[PLAYER_SKILL_BOW] = 1; // bow 302 this->pPlayers[0].pActiveSkills[PLAYER_SKILL_BOW] = 1;
303 this->pPlayers[0].pActiveSkills[PLAYER_SKILL_SWORD] = 1; // sword 303 this->pPlayers[0].pActiveSkills[PLAYER_SKILL_SWORD] = 1;
304
305 strcpy(this->pPlayers[1].pName, pGlobalTXT_LocalizationStrings[506]); // Roderic
304 this->pPlayers[1].uPrevFace = 3; 306 this->pPlayers[1].uPrevFace = 3;
305 this->pPlayers[1].uCurrentFace = 3; 307 this->pPlayers[1].uCurrentFace = 3;
306 this->pPlayers[1].uPrevVoiceID = 3; 308 this->pPlayers[1].uPrevVoiceID = 3;
307 this->pPlayers[1].uVoiceID = 3; 309 this->pPlayers[1].uVoiceID = 3;
308 strcpy(this->pPlayers[1].pName, pGlobalTXT_LocalizationStrings[506]); //Roderic
309 this->pPlayers[1].uMight = 13; 310 this->pPlayers[1].uMight = 13;
310 this->pPlayers[1].uIntelligence = 9; 311 this->pPlayers[1].uIntelligence = 9;
311 this->pPlayers[1].uWillpower = 9; 312 this->pPlayers[1].uWillpower = 9;
312 this->pPlayers[1].uEndurance = 13; 313 this->pPlayers[1].uEndurance = 13;
313 this->pPlayers[1].uAccuracy = 13; 314 this->pPlayers[1].uAccuracy = 13;
314 this->pPlayers[1].uSpeed = 13; 315 this->pPlayers[1].uSpeed = 13;
315 this->pPlayers[1].uLuck = 13; 316 this->pPlayers[1].uLuck = 13;
316 this->pPlayers[1].pActiveSkills[PLAYER_SKILL_LEATHER] = 1; // leather 317 this->pPlayers[1].pActiveSkills[PLAYER_SKILL_LEATHER] = 1;
317 this->pPlayers[1].pActiveSkills[PLAYER_SKILL_STEALING] = 1; // stealing 318 this->pPlayers[1].pActiveSkills[PLAYER_SKILL_STEALING] = 1;
318 this->pPlayers[1].pActiveSkills[PLAYER_SKILL_DAGGER] = 1; // dagger 319 this->pPlayers[1].pActiveSkills[PLAYER_SKILL_DAGGER] = 1;
319 this->pPlayers[1].pActiveSkills[PLAYER_SKILL_TRAP_DISARM] = 1; // disarm trap 320 this->pPlayers[1].pActiveSkills[PLAYER_SKILL_TRAP_DISARM] = 1;
321
322 strcpy(this->pPlayers[2].pName, pGlobalTXT_LocalizationStrings[508]); // Serena
320 this->pPlayers[2].uPrevFace = 14; 323 this->pPlayers[2].uPrevFace = 14;
321 this->pPlayers[2].uCurrentFace = 14; 324 this->pPlayers[2].uCurrentFace = 14;
322 this->pPlayers[2].uPrevVoiceID = 14; 325 this->pPlayers[2].uPrevVoiceID = 14;
323 this->pPlayers[2].uVoiceID = 14; 326 this->pPlayers[2].uVoiceID = 14;
324 strcpy(this->pPlayers[2].pName, pGlobalTXT_LocalizationStrings[508]); // Serena
325 this->pPlayers[2].uMight = 12; 327 this->pPlayers[2].uMight = 12;
326 this->pPlayers[2].uIntelligence = 9; 328 this->pPlayers[2].uIntelligence = 9;
327 this->pPlayers[2].uWillpower = 20; 329 this->pPlayers[2].uWillpower = 20;
328 this->pPlayers[2].uEndurance = 22; 330 this->pPlayers[2].uEndurance = 22;
329 this->pPlayers[2].uAccuracy = 7; 331 this->pPlayers[2].uAccuracy = 7;
330 this->pPlayers[2].uSpeed = 13; 332 this->pPlayers[2].uSpeed = 13;
331 this->pPlayers[2].uLuck = 7; 333 this->pPlayers[2].uLuck = 7;
332 this->pPlayers[2].pActiveSkills[PLAYER_SKILL_ALCHEMY] = 1; // alchemy 334 this->pPlayers[2].pActiveSkills[PLAYER_SKILL_ALCHEMY] = 1;
333 this->pPlayers[2].pActiveSkills[PLAYER_SKILL_LEATHER] = 1; // leather 335 this->pPlayers[2].pActiveSkills[PLAYER_SKILL_LEATHER] = 1;
334 this->pPlayers[2].pActiveSkills[PLAYER_SKILL_BODY] = 1; // body 336 this->pPlayers[2].pActiveSkills[PLAYER_SKILL_BODY] = 1;
335 this->pPlayers[2].pActiveSkills[PLAYER_SKILL_MACE] = 1; // mace 337 this->pPlayers[2].pActiveSkills[PLAYER_SKILL_MACE] = 1;
338
336 strcpy(this->pPlayers[3].pName, pGlobalTXT_LocalizationStrings[507]); // Alexis 339 strcpy(this->pPlayers[3].pName, pGlobalTXT_LocalizationStrings[507]); // Alexis
337 this->pPlayers[3].uPrevFace = 10; 340 this->pPlayers[3].uPrevFace = 10;
338 this->pPlayers[3].uCurrentFace = 10; 341 this->pPlayers[3].uCurrentFace = 10;
339 this->pPlayers[3].uEndurance = 13; 342 this->pPlayers[3].uEndurance = 13;
340 this->pPlayers[3].uAccuracy = 13; 343 this->pPlayers[3].uAccuracy = 13;
347 this->pPlayers[3].uLuck = 7; 350 this->pPlayers[3].uLuck = 7;
348 this->pPlayers[3].pActiveSkills[PLAYER_SKILL_LEATHER] = 1; // leather 351 this->pPlayers[3].pActiveSkills[PLAYER_SKILL_LEATHER] = 1; // leather
349 this->pPlayers[3].pActiveSkills[PLAYER_SKILL_AIR] = 1; // air 352 this->pPlayers[3].pActiveSkills[PLAYER_SKILL_AIR] = 1; // air
350 this->pPlayers[3].pActiveSkills[PLAYER_SKILL_FIRE] = 1; // fire 353 this->pPlayers[3].pActiveSkills[PLAYER_SKILL_FIRE] = 1; // fire
351 this->pPlayers[3].pActiveSkills[PLAYER_SKILL_STAFF] = 1; // staff 354 this->pPlayers[3].pActiveSkills[PLAYER_SKILL_STAFF] = 1; // staff
355
352 for (uNumPlayers = 0; uNumPlayers < 4; uNumPlayers++) 356 for (uNumPlayers = 0; uNumPlayers < 4; uNumPlayers++)
353 { 357 {
354 pCharacter = &pParty->pPlayers[uNumPlayers]; 358 pCharacter = &pParty->pPlayers[uNumPlayers];
359
355 if (pCharacter->classType == PLAYER_CLASS_KNIGHT) 360 if (pCharacter->classType == PLAYER_CLASS_KNIGHT)
356 pCharacter->sResMagicBase = 10; //player[i].pResMagicBase 361 pCharacter->sResMagicBase = 10;
362
357 pCharacter->lastOpenedSpellbookPage = 0; 363 pCharacter->lastOpenedSpellbookPage = 0;
358 for (int i = 0; i < 9; i++)//for Magic Book 364 for (int i = 0; i < 9; i++)//for Magic Book
359 { 365 {
360 if (pPlayers[uNumPlayers].pActiveSkills[12+i]) 366 if (pPlayers[uNumPlayers].pActiveSkills[12+i])
361 { 367 {
362 pCharacter->lastOpenedSpellbookPage = i; 368 pCharacter->lastOpenedSpellbookPage = i;
363 break; 369 break;
364 } 370 }
365 } 371 }
372
366 pCharacter->uExpressionTimePassed = 0; 373 pCharacter->uExpressionTimePassed = 0;
367 Dst.Reset(); 374
368 if ( bGiveItems ) 375 if (bDebugGiveItems)
369 { 376 {
377 Dst.Reset();
370 pItemsTable->GenerateItem(2, 40, &Dst); //ring 378 pItemsTable->GenerateItem(2, 40, &Dst); //ring
371 pCharacter->AddItem2(-1, &Dst); 379 pCharacter->AddItem2(-1, &Dst);
372 for (uSkillIdx = 0; uSkillIdx < 36; uSkillIdx++) 380 for (uSkillIdx = 0; uSkillIdx < 36; uSkillIdx++)
373 { 381 {
374 if ( pCharacter->pActiveSkills[uSkillIdx] ) 382 if ( pCharacter->pActiveSkills[uSkillIdx] )
455 { 463 {
456 if ( pCharacter->pInventoryItemList[i].uItemID != 0) 464 if ( pCharacter->pInventoryItemList[i].uItemID != 0)
457 pCharacter->pInventoryItemList[i].SetIdentified(); 465 pCharacter->pInventoryItemList[i].SetIdentified();
458 } 466 }
459 } 467 }
468
460 pCharacter->sHealth = pCharacter->GetMaxHealth(); 469 pCharacter->sHealth = pCharacter->GetMaxHealth();
461 pCharacter->sMana = pCharacter->GetMaxMana(); 470 pCharacter->sMana = pCharacter->GetMaxMana();
462 } 471 }
463 } 472 }
464 473
465 //----- (004917CE) -------------------------------------------------------- 474 //----- (004917CE) --------------------------------------------------------
466 int Party::Reset() 475 void Party::Reset()
467 { 476 {
468 Zero(); 477 Zero();
469 478
470 field_708 = 15; 479 field_708 = 15;
471 sEyelevel = 160; 480 sEyelevel = 160;
472 uNumGold = 200; 481 uNumGold = 200;
473 uNumFoodRations = 7; 482 uNumFoodRations = 7;
474 483
475
476 alignment = PartyAlignment_Neutral; 484 alignment = PartyAlignment_Neutral;
477 SetUserInterface(alignment, true); 485 SetUserInterface(alignment, true);
478 486
479 uTimePlayed = 0x21C00u; 487 // 0x21C00 = 138240
488 // 138240 x 0.234375 = 32400
489 // 32400 / 60 / 60 = 9 am
490 uTimePlayed = 0x21C00;
480 uLastRegenerationTime = 0x21C00; 491 uLastRegenerationTime = 0x21C00;
481 492
482 bTurnBasedModeOn = false; 493 bTurnBasedModeOn = false;
483 494
484 uActiveCharacter = 1; 495 uActiveCharacter = 1;
485 ::pPlayers.ZerothIndex() = &pPlayers[0]; 496 ::pPlayers.ZerothIndex() = &pPlayers[0];
486 for (uint i = 0; i < 4; ++i) 497 for (uint i = 0; i < 4; ++i)
487 ::pPlayers[i + 1] = &pPlayers[i]; 498 ::pPlayers[i + 1] = &pPlayers[i];
488 499
489 pPlayers[0].Reset(PLAYER_CLASS_KNIGHT); 500 pPlayers[0].Reset(PLAYER_CLASS_KNIGHT);
490 pPlayers[1].Reset(PLAYER_CLASS_THEIF);
491 pPlayers[2].Reset(PLAYER_CLASS_CLERIC);
492 pPlayers[3].Reset(PLAYER_CLASS_SORCERER);
493 pPlayers[0].uCurrentFace = 17; 501 pPlayers[0].uCurrentFace = 17;
494 pPlayers[0].uPrevVoiceID = 17; 502 pPlayers[0].uPrevVoiceID = 17;
495 pPlayers[0].uVoiceID = 17; 503 pPlayers[0].uVoiceID = 17;
496 pPlayers[0].SetInitialStats(); 504 pPlayers[0].SetInitialStats();
497 505
498 pPlayers[0].uSex = pPlayers[0].GetSexByVoice(); 506 pPlayers[0].uSex = pPlayers[0].GetSexByVoice();
499 pPlayers[0].RandomizeName(); 507 pPlayers[0].RandomizeName();
500 strcpy(pPlayers[0].pName, pGlobalTXT_LocalizationStrings[509]); 508 strcpy(pPlayers[0].pName, pGlobalTXT_LocalizationStrings[509]);
501 509
502 510
511 pPlayers[1].Reset(PLAYER_CLASS_THEIF);
503 pPlayers[1].uCurrentFace = 3; 512 pPlayers[1].uCurrentFace = 3;
504 pPlayers[1].uPrevVoiceID = 3; 513 pPlayers[1].uPrevVoiceID = 3;
505 pPlayers[1].uVoiceID = 3; 514 pPlayers[1].uVoiceID = 3;
506 pPlayers[1].SetInitialStats(); 515 pPlayers[1].SetInitialStats();
507 pPlayers[1].uSex = pPlayers[1].GetSexByVoice(); 516 pPlayers[1].uSex = pPlayers[1].GetSexByVoice();
508 pPlayers[1].RandomizeName(); 517 pPlayers[1].RandomizeName();
509 strcpy(pPlayers[1].pName, pGlobalTXT_LocalizationStrings[506]); 518 strcpy(pPlayers[1].pName, pGlobalTXT_LocalizationStrings[506]);
519
520 pPlayers[2].Reset(PLAYER_CLASS_CLERIC);
510 pPlayers[2].uCurrentFace = 14; 521 pPlayers[2].uCurrentFace = 14;
511 pPlayers[2].uPrevVoiceID = 14; 522 pPlayers[2].uPrevVoiceID = 14;
512 pPlayers[2].uVoiceID = 14; 523 pPlayers[2].uVoiceID = 14;
513 pPlayers[2].SetInitialStats(); 524 pPlayers[2].SetInitialStats();
514 pPlayers[2].uSex = pPlayers[3].GetSexByVoice(); 525 pPlayers[2].uSex = pPlayers[3].GetSexByVoice();
515 pPlayers[2].RandomizeName(); 526 pPlayers[2].RandomizeName();
516 strcpy(pPlayers[2].pName, pGlobalTXT_LocalizationStrings[508]); 527 strcpy(pPlayers[2].pName, pGlobalTXT_LocalizationStrings[508]);
528
529 pPlayers[3].Reset(PLAYER_CLASS_SORCERER);
517 pPlayers[3].uCurrentFace = 10; 530 pPlayers[3].uCurrentFace = 10;
518 pPlayers[3].uPrevVoiceID = 10; 531 pPlayers[3].uPrevVoiceID = 10;
519 pPlayers[3].uVoiceID = 10; 532 pPlayers[3].uVoiceID = 10;
520 pPlayers[3].SetInitialStats(); 533 pPlayers[3].SetInitialStats();
521 pPlayers[3].uSex = pPlayers[3].GetSexByVoice(); 534 pPlayers[3].uSex = pPlayers[3].GetSexByVoice();
537 } 550 }
538 551
539 for (uint i = 1; i < 20; ++i) 552 for (uint i = 1; i < 20; ++i)
540 pPartyBuffs[i].Reset(); 553 pPartyBuffs[i].Reset();
541 554
542
543 current_character_screen_window = WINDOW_CharacterWindow_Stats; // default character ui - stats 555 current_character_screen_window = WINDOW_CharacterWindow_Stats; // default character ui - stats
544 uFlags = 0; 556 uFlags = 0;
545 memset(_autonote_bits, 0, sizeof(_autonote_bits)); 557 memset(_autonote_bits, 0, sizeof(_autonote_bits));
546 memset(_quest_bits, 0, sizeof(_quest_bits)); 558 memset(_quest_bits, 0, sizeof(_quest_bits));
547 pIsArtifactFound.fill(0); 559 pIsArtifactFound.fill(0);
548 _449B7E_toggle_bit(_quest_bits, PARTY_QUEST_EMERALD_RED_POTION_ACTIVE, 1);
549 _449B7E_toggle_bit(_quest_bits, PARTY_QUEST_EMERALD_SEASHELL_ACTIVE, 1);
550 _449B7E_toggle_bit(_quest_bits, PARTY_QUEST_EMERALD_LONGBOW_ACTIVE, 1);
551 _449B7E_toggle_bit(_quest_bits, PARTY_QUEST_EMERALD_PLATE_ACTIVE, 1);
552 _449B7E_toggle_bit(_quest_bits, PARTY_QUEST_EMERALD_LUTE_ACTIVE, 1);
553 _449B7E_toggle_bit(_quest_bits, PARTY_QUEST_EMERALD_HAT_ACTIVE, 1);
554 560
555 PartyTimes._shop_ban_times.fill(0); 561 PartyTimes._shop_ban_times.fill(0);
556 562
557 memcpy(pNPCStats->pNewNPCData, pNPCStats->pNPCData, 0x94BCu); 563 memcpy(pNPCStats->pNewNPCData, pNPCStats->pNPCData, 0x94BCu);
558 memcpy(pNPCStats->pGroups_copy, pNPCStats->pGroups, 0x66u); 564 memcpy(pNPCStats->pGroups_copy, pNPCStats->pGroups, 0x66u);
559 pNPCStats->pNewNPCData[3].uFlags |= 128;//|= 0x80u; Lady Margaret 565 pNPCStats->pNewNPCData[3].uFlags |= 128;//|= 0x80u; Lady Margaret
560 _494035_timed_effects__water_walking_damage__etc(); 566 _494035_timed_effects__water_walking_damage__etc();
561 pEventTimer->Pause(); 567 pEventTimer->Pause();
562 return 0;
563 } 568 }
564 569
565 570
566 //----- (0043AD34) -------------------------------------------------------- 571 //----- (0043AD34) --------------------------------------------------------
567 void Party::Yell() 572 void Party::Yell()