comparison Arcomage.cpp @ 2214:20995bb8895a

GameResultsApply() full refactored
author Ritor1
date Thu, 13 Feb 2014 23:02:32 +0600
parents 05e74b19991d
children e9625ad08541
comparison
equal deleted inserted replaced
2213:05e74b19991d 2214:20995bb8895a
3368 // 40D402: using guessed type int __fastcall am_40D402(uint, uint); 3368 // 40D402: using guessed type int __fastcall am_40D402(uint, uint);
3369 3369
3370 //----- (0040D444) -------------------------------------------------------- 3370 //----- (0040D444) --------------------------------------------------------
3371 void GameResultsApply() 3371 void GameResultsApply()
3372 { 3372 {
3373 int v0; // esi@1 3373 int winner; // esi@1
3374 int v1; // edi@1 3374 int victory_type; // edi@1
3375 int v2; // eax@1 3375 int pl_resource; // edx@25
3376 int v3; // eax@23 3376 int en_resource; // eax@28
3377 int v4; // edx@25 3377 unsigned int tavern_num; // eax@54
3378 int v5; // ecx@28
3379 int v6; // eax@28
3380 GUIWindow *v7; // ecx@50
3381 signed int v8; // eax@50
3382 char v9; // eax@52
3383 signed int v10; // eax@54
3384 char *v11; // esi@59
3385 char *v12; // esi@65
3386 signed int v14; // [sp-4h] [bp-58h]@46
3387 char pText[64]; // [sp+Ch] [bp-48h]@1 3378 char pText[64]; // [sp+Ch] [bp-48h]@1
3388 POINT xy; // [sp+4Ch] [bp-8h]@1 3379 POINT xy; // [sp+4Ch] [bp-8h]@1
3389 3380
3390 v0 = -1; 3381 winner = -1;
3391 v1 = -1; 3382 victory_type = -1;
3392 //nullsub_1(); 3383 //nullsub_1();
3393 xy.x = 0; 3384 /*strcpy(pText, "The Winner is: ");//"Победил: " Ritor1: архаизм
3394 xy.y = 0;
3395 strcpy(pText, "The Winner is: ");//"Победил: "
3396 // v2 = 0;
3397 xy.y = 160; 3385 xy.y = 160;
3398 xy.x = 320; //- 12 * v2 / 2; 3386 xy.x = 320; //- 12 * v2 / 2;
3399 // am_DrawText(-1, pText, xy); 3387 am_DrawText(-1, pText, &xy);*/
3400 3388
3401 //проверка построена ли башня 3389 //проверка построена ли башня
3402 v1 = 0;
3403 if ( am_Players[0].tower_height < max_tower_height && am_Players[1].tower_height >= max_tower_height )//наша башня не построена, а у врага построена 3390 if ( am_Players[0].tower_height < max_tower_height && am_Players[1].tower_height >= max_tower_height )//наша башня не построена, а у врага построена
3404 v0 = 2;//победил игрок 2(враг) 3391 {
3392 winner = 2;//победил игрок 2(враг)
3393 victory_type = 0;
3394 }
3405 else if ( am_Players[0].tower_height >= max_tower_height && am_Players[1].tower_height < max_tower_height )//наша башня построена, а у врага нет 3395 else if ( am_Players[0].tower_height >= max_tower_height && am_Players[1].tower_height < max_tower_height )//наша башня построена, а у врага нет
3406 v0 = 1;//победил игрок 1(мы) 3396 {
3397 winner = 1;//победил игрок 1(мы)
3398 victory_type = 0;
3399 }
3407 else if ( am_Players[0].tower_height >= max_tower_height && am_Players[1].tower_height >= max_tower_height )//и у нас, и у врага построена 3400 else if ( am_Players[0].tower_height >= max_tower_height && am_Players[1].tower_height >= max_tower_height )//и у нас, и у врага построена
3408 { 3401 {
3409 if ( am_Players[0].tower_height == am_Players[1].tower_height )//наши башни равны 3402 if ( am_Players[0].tower_height == am_Players[1].tower_height )//наши башни равны
3410 { 3403 {
3411 v0 = 0;//никто не победил 3404 winner = 0;//никто не победил
3412 v1 = 4;//ничья 3405 victory_type = 4;//ничья
3413 } 3406 }
3414 else 3407 else//наши башни не равны
3415 v0 = (am_Players[0].tower_height <= am_Players[1].tower_height) + 1;//победил тот, у кого выше 3408 {
3409 winner = (am_Players[0].tower_height <= am_Players[1].tower_height) + 1;//победил тот, у кого выше
3410 victory_type = 0;
3411 }
3416 } 3412 }
3417 3413
3418 //проверка разрушена ли башня 3414 //проверка разрушена ли башня
3419 if ( am_Players[0].tower_height <= 0 && am_Players[1].tower_height > 0 )//наша башня разрушена, а у врага нет 3415 if ( am_Players[0].tower_height <= 0 && am_Players[1].tower_height > 0 )//наша башня разрушена, а у врага нет
3420 v0 = 2;// победил игрок 2(враг) 3416 {
3417 winner = 2;// победил игрок 2(враг)
3418 victory_type = 2;//победил разрушив башню врага
3419 }
3421 else if ( am_Players[0].tower_height > 0 && am_Players[1].tower_height <= 0 )//у врага башня разрушена, а у нас нет 3420 else if ( am_Players[0].tower_height > 0 && am_Players[1].tower_height <= 0 )//у врага башня разрушена, а у нас нет
3422 { 3421 {
3423 v0 = 1;//победил игрок 1(мы) 3422 winner = 1;//победил игрок 1(мы)
3424 v1 = 2; 3423 victory_type = 2;//победил разрушив башню врага
3425 } 3424 }
3426 else if ( am_Players[0].tower_height <= 0 && am_Players[1].tower_height <= 0 )//наша башня разрушена, и у врага разрушена 3425 else if ( am_Players[0].tower_height <= 0 && am_Players[1].tower_height <= 0 )//наша башня разрушена, и у врага разрушена
3427 { 3426 {
3428 if ( am_Players[0].tower_height == am_Players[1].tower_height )//если башни равны 3427 if ( am_Players[0].tower_height == am_Players[1].tower_height )//если башни равны
3429 { 3428 {
3430 if ( am_Players[0].wall_height == am_Players[1].wall_height )//если стены равны 3429 if ( am_Players[0].wall_height == am_Players[1].wall_height )//если стены равны
3431 { 3430 {
3432 v0 = 0; 3431 winner = 0;
3433 v1 = 4; 3432 victory_type = 4;
3434 } 3433 }
3435 else//если стены не равны 3434 else//если стены не равны
3436 { 3435 {
3437 v0 = (am_Players[0].wall_height <= am_Players[1].wall_height) + 1;//победил тот, у кого стена выше 3436 winner = (am_Players[0].wall_height <= am_Players[1].wall_height) + 1;//победил тот, у кого стена выше
3438 v1 = 1; 3437 victory_type = 1;//победа когда больше стена при ничье
3439 } 3438 }
3440 } 3439 }
3441 else 3440 else//башни не равны
3442 v0 = (am_Players[0].tower_height <= am_Players[1].tower_height) + 1;// побеждает тот у кого башня больше 3441 {
3443 } 3442 winner = (am_Players[0].tower_height <= am_Players[1].tower_height) + 1;// побеждает тот у кого башня больше
3443 victory_type = 2;//победил разрушив башню врага
3444 }
3445 }
3444 3446
3445 //проверка набраны ли ресурсы 3447 //проверка набраны ли ресурсы
3446 v3 = am_Players[0].resource_bricks; 3448 //проверка какого ресурса больше всего у игрока 1(нас)
3447 if ( am_Players[0].resource_bricks <= am_Players[0].resource_gems ) 3449 pl_resource = am_Players[0].resource_bricks;//кирпичей больше чем др. ресурсов
3448 { 3450 if ( am_Players[0].resource_gems > am_Players[0].resource_bricks
3449 v3 = am_Players[0].resource_beasts; 3451 && am_Players[0].resource_gems > am_Players[0].resource_beasts )//драг.камней больше всего
3450 v4 = am_Players[0].resource_gems; 3452 pl_resource = am_Players[0].resource_gems;
3451 if ( am_Players[0].resource_gems > am_Players[0].resource_beasts ) 3453 else if ( am_Players[0].resource_beasts > am_Players[0].resource_gems
3452 goto LABEL_28; 3454 && am_Players[0].resource_beasts > am_Players[0].resource_bricks )//зверей больше всего
3453 } 3455 pl_resource = am_Players[0].resource_beasts;
3454 else 3456
3455 { 3457 //проверка какого ресурса больше у игрока 2(врага)
3456 if ( am_Players[0].resource_bricks <= am_Players[0].resource_beasts ) 3458 en_resource = am_Players[1].resource_bricks;//кирпичей больше чем др. ресурсов
3457 { 3459 if ( am_Players[1].resource_gems > am_Players[1].resource_bricks
3458 v4 = am_Players[0].resource_beasts; 3460 && am_Players[1].resource_gems > am_Players[1].resource_beasts )//драг.камней больше всего
3459 goto LABEL_28; 3461 en_resource = am_Players[1].resource_gems;
3460 } 3462 else if ( am_Players[1].resource_beasts > am_Players[1].resource_gems
3461 } 3463 && am_Players[1].resource_beasts > am_Players[1].resource_bricks )//зверей больше всего
3462 v4 = v3; 3464 en_resource = am_Players[1].resource_beasts;
3463 LABEL_28: 3465
3464 v5 = am_Players[1].resource_bricks; 3466 //сравнение ресурсов игроков
3465 v6 = am_Players[1].resource_gems; 3467 if ( winner == -1 && victory_type == -1 )//нет победителя по башням
3466 if ( am_Players[1].resource_bricks <= am_Players[1].resource_gems ) 3468 {
3467 { 3469 if ( pl_resource < max_resources_amount && en_resource >= max_resources_amount )//враг набрал нужное количество
3468 v5 = am_Players[1].resource_beasts; 3470 {
3469 if ( am_Players[1].resource_gems > am_Players[1].resource_beasts ) 3471 winner = 2;// враг победил
3470 goto LABEL_33; 3472 victory_type = 3;//победа собрав нужное количество ресурсов
3471 goto LABEL_32; 3473 }
3472 } 3474 else if ( pl_resource >= max_resources_amount && en_resource < max_resources_amount )//мы набрали нужное количество
3473 v6 = am_Players[1].resource_beasts; 3475 {
3474 if ( am_Players[1].resource_bricks > am_Players[1].resource_beasts ) 3476 winner = 1;// мы победили
3475 LABEL_32: 3477 victory_type = 3;//победа собрав нужное количество ресурсов
3476 v6 = v5; 3478 }
3477 LABEL_33: 3479 else if ( pl_resource >= max_resources_amount && en_resource >= max_resources_amount )//и у нас и у врага нужное количество ресурсов
3478 if ( v0 == -1 ) 3480 {
3479 { 3481 if ( pl_resource == en_resource )// ресурсы равны
3480 if ( v1 != -1 ) 3482 {
3481 goto LABEL_49; 3483 winner = 0;//ресурсы равны
3482 if ( v4 < max_resources_amount ) 3484 victory_type = 4; //ничья
3483 { 3485 }
3484 if ( v6 < max_resources_amount )
3485 goto LABEL_49;
3486 v0 = 2;
3487 }
3488 else
3489 {
3490 if ( v6 < max_resources_amount )
3491 v0 = 1;
3492 else 3486 else
3493 { 3487 {
3494 if ( v4 == v6 ) 3488 winner = (pl_resource <= en_resource) + 1;//ресурсы не равны, побеждает тот у кого больше
3495 goto LABEL_46; 3489 victory_type = 3;//победа собрав нужное количество ресурсов
3496 v0 = (v4 <= v6) + 1; 3490 }
3497 } 3491 }
3498 } 3492 }
3499 v1 = 3; 3493 else if ( winner == 0 && victory_type == 4 )// при ничье по башням и стене
3500 } 3494 {
3501 if ( !v0 && v1 == 4 ) 3495 if ( pl_resource != en_resource )//ресурсы не равны
3502 { 3496 {
3503 if ( v4 != v6 ) 3497 winner = (pl_resource <= en_resource) + 1;//победил тот у кого больше
3504 { 3498 victory_type = 5;//победа когда при ничье большее количество ресурсов
3505 v14 = 5; 3499 }
3506 v0 = (v4 <= v6) + 1; 3500 else //ресурсы равны
3507 goto LABEL_48; 3501 {
3508 } 3502 winner = 0;//нет победителя
3509 LABEL_46: 3503 victory_type = 4; //ничья
3510 v0 = 0; 3504 }
3511 v14 = 4; 3505 }
3512 LABEL_48: 3506
3513 v1 = v14; 3507 //подведение итогов
3514 } 3508 pArcomageGame->Victory_type = victory_type;
3515 LABEL_49: 3509 pArcomageGame->uGameWinner = winner;
3516 pArcomageGame->field_B0 = v1; 3510 if ( winner == 1 )//победитель игрок 1(мы)
3517 pArcomageGame->uGameResult = v0; 3511 {
3518 if ( v0 == 1 ) 3512 if (( window_SpeakInHouse->par1C >= 108 ) && ( window_SpeakInHouse->par1C <= 120 ))//таверны
3519 { 3513 {
3520 3514 if ( !pParty->pArcomageWins[window_SpeakInHouse->par1C - 108] )
3521 v8 = (signed int)window_SpeakInHouse->par1C; 3515 {
3522 if (( v8 >= 108 )&&( v8 <= 120 )) 3516 pParty->pArcomageWins[window_SpeakInHouse->par1C - 108] = 1;
3523 { 3517 pParty->PartyFindsGold(p2DEvents[ window_SpeakInHouse->par1C - 1].fPriceMultiplier * 100.0, 0);//вознаграждение
3524 if ( !pParty->pArcomageWins[v8-108] ) 3518 }
3525 { 3519 }
3526 pParty->pArcomageWins[v8-108] = 1; 3520 //проверка выполнен ли квест по аркомагу
3527 signed int _a = (signed int)(p2DEvents[ window_SpeakInHouse->par1C - 1].fPriceMultiplier * 100.0); 3521 tavern_num = 0;
3528 pParty->PartyFindsGold(_a, 0); 3522 for ( uint i = 108; i <= 120; ++i )
3529 } 3523 {
3530 3524 if ( !pParty->pArcomageWins[i - 108] )
3531 }
3532 v10 = 108;
3533 do
3534 {
3535 if ( !pParty->pArcomageWins[v10-108] )
3536 break; 3525 break;
3537 ++v10; 3526 tavern_num++;
3538 } 3527 }
3539 while ( v10 <= 120 ); 3528 if ( tavern_num == 13 )
3540 3529 _449B7E_toggle_bit(pParty->_quest_bits, 238, 1);// 238 - Won all Arcomage games
3541 if ( v10 == 121 ) 3530
3542 _449B7E_toggle_bit(pParty->_quest_bits, 238, 1); 3531 for ( int i = 0; i < 4; ++i )//внесение записи в Заслуги
3543 3532 {
3544 for (int i=0; i < 4; ++i ) 3533 if ( !_449B57_test_bit(pParty->pPlayers[i]._achieved_awards_bits, 1) )
3545 { 3534 _449B7E_toggle_bit(pParty->pPlayers[i]._achieved_awards_bits, PLAYER_GUILD_BITS__ARCOMAGE_WIN, 1);
3546 v11 = (char *)&pParty->pPlayers[i]._achieved_awards_bits;
3547 if ( !(unsigned __int16)_449B57_test_bit((unsigned __int8 *)v11, 1) )
3548 _449B7E_toggle_bit((unsigned char *)v11, PLAYER_GUILD_BITS__ARCOMAGE_WIN, 1);
3549 } 3535 }
3550 ++pParty->uNumArcomageWins; 3536 ++pParty->uNumArcomageWins;
3551 if ( pParty->uNumArcomageWins > 1000000 ) 3537 if ( pParty->uNumArcomageWins > 1000000 )//ограничение количества побед
3552 pParty->uNumArcomageWins = 1000000; 3538 pParty->uNumArcomageWins = 1000000;
3553 } 3539 }
3554 else 3540 else//проигрыш
3555 { 3541 {
3556 for ( int i = 0; i < 4; ++i ) 3542 for ( int i = 0; i < 4; ++i )//внесение записи в Заслуги
3557 { 3543 {
3558 v12 = (char *)&pParty->pPlayers[i]._achieved_awards_bits; 3544 if ( !_449B57_test_bit(pParty->pPlayers[i]._achieved_awards_bits, 1) )
3559 if ( !(unsigned __int16)_449B57_test_bit((unsigned __int8 *)v12, 1) ) 3545 _449B7E_toggle_bit(pParty->pPlayers[i]._achieved_awards_bits, PLAYER_GUILD_BITS__ARCOMAGE_LOSE, 1);
3560 _449B7E_toggle_bit((unsigned char *)v12, PLAYER_GUILD_BITS__ARCOMAGE_LOSE, 1);
3561 } 3546 }
3562 ++pParty->uNumArcomageLoses; 3547 ++pParty->uNumArcomageLoses;
3563 if ( pParty->uNumArcomageLoses > 1000000 ) 3548 if ( pParty->uNumArcomageLoses > 1000000 )//ограничение количества проигрышей
3564 pParty->uNumArcomageLoses = 1000000; 3549 pParty->uNumArcomageLoses = 1000000;
3565 } 3550 }
3566 } 3551 }
3567 3552
3568 //----- (00409C8B) -------------------------------------------------------- 3553 //----- (00409C8B) --------------------------------------------------------
3669 } 3654 }
3670 3655
3671 //----- (0040D75D) -------------------------------------------------------- 3656 //----- (0040D75D) --------------------------------------------------------
3672 void am_DrawText( int a1, const char *pText, POINT *pXY ) 3657 void am_DrawText( int a1, const char *pText, POINT *pXY )
3673 { 3658 {
3674 pPrimaryWindow->DrawText( pFontComic, pXY->x, pXY->y - ((pFontComic->uFontHeight - 3) >> 1) + 3, 0, pText, 0, 0, 0); 3659 pPrimaryWindow->DrawText( pFontComic, pXY->x, pXY->y - ((pFontComic->uFontHeight - 3) / 2) + 3, 0, pText, 0, 0, 0);
3675 } 3660 }
3676 3661
3677 //----- (0040DB27) -------------------------------------------------------- 3662 //----- (0040DB27) --------------------------------------------------------
3678 void DrawRect( RECT *pXYZW, unsigned __int16 uColor, char bSolidFill ) 3663 void DrawRect( RECT *pXYZW, unsigned __int16 uColor, char bSolidFill )
3679 { 3664 {