Mercurial > mm7
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() |