Mercurial > mm7
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 { |