Exemplo n.º 1
0
void doBattle() {
    int round = 1;
    int nme_idx;
    int gold_amt = 0;
    int expGiven = 0;
    int key;
    int damage = 0;
    int canFlee = 0;
    bool didFlee = FALSE;
    ENEMY the_enemy;

    /* Pick an enemy randomly from the list */
    nme_idx = rollDie(0,MAX_ENEMIES);
    if (nme_idx == MAX_ENEMIES) nme_idx = MAX_ENEMIES - 1;

    /*
        Keep a temporary copy so we can kill
        it without hurting the prototypes
    */
    the_enemy = enemies[nme_idx];

    /*
        If the enemy has an e_weapon of -1
        we give them one randomly
    */
    if (the_enemy.e_weapon == -1) {
        nme_idx = rollDie(0,MAX_WEAPONS);
        if (nme_idx == MAX_WEAPONS) nme_idx = MAX_WEAPONS - 1;
        the_enemy.e_weapon = nme_idx;
    }

    /* Calculate victory condition values */
    expGiven = rollDie(1,the_enemy.exp);
    if (the_enemy.max_gold != 0) gold_amt = rollDie(1,the_enemy.max_gold);

    while (the_enemy.hp > 0 && player.is_dead == FALSE && player.hp > 0 && didFlee == FALSE) {
        flushinp();
        battleStats(the_enemy,round);

        wattrset(win,A_BOLD);
        mvwprintw(win,7,12,"[A]ttack");
        mvwprintw(win,8,12,"[F]lee");
        wattrset(win,A_NORMAL);

        noecho();
        keypad(win, TRUE);
        raw();

        key = wgetch(win);
        flushinp();

        switch(key) {
            case 'F':
            case 'f':
                canFlee = rollDie(1,6) + rollDie(1,6) + rollDie(1,6);
                if (player.agi > canFlee) {
                    battleStats(the_enemy,round);
                    mvwprintw(win,10,3,"%s flees from the battle!",player.player_name);
                    wrefresh(win);
                    napms(500);
                    didFlee = TRUE;
                    walk_counter = 0;
                } else {
                    battleStats(the_enemy,round);
                    mvwprintw(win,10,3,"%s attempts to flee but fails!",player.player_name);
                    wrefresh(win);
                    napms(1000);
                    enemyAttack(the_enemy,round);
                    round++;
                }
                break;
            case 'A':
            case 'a':
                //keypad(win,FALSE);
                battleStats(the_enemy,round);
                mvwprintw(win,10,3,"%s attacks the %s...",player.player_name,the_enemy.enemy_name,weapons[player.weapon].weapon_name);
                //napms(750);
                if (playerDidHit(the_enemy) == TRUE) {
                    damage = (player.str + weapons[player.weapon].basehit + player.attack_bonus + rollDie(1,weapons[player.weapon].base_str)) - (the_enemy.def + the_enemy.armor);
                    if (damage <= 0) {
                        mvwprintw(win,11,5,"...%s's strike glances off the %s!",player.player_name,the_enemy.enemy_name);
                    } else {
                        mvwprintw(win,11,5,"...%s hits the %s for %i damage!",player.player_name,the_enemy.enemy_name,damage);
                        the_enemy.hp -= damage;
                    }
                } else {
                    mvwprintw(win,11,5,"...%s misses!",player.player_name);
                }
                wrefresh(win);
                napms(750);
                if (the_enemy.hp > 0) {
                    enemyAttack(the_enemy,round);
                    round++;
                }
                break;
            default:
                wattrset(win,A_REVERSE);
                mvwprintw(win,10,10,"Invalid Option. Try again.");
                wattrset(win,A_NORMAL);
                wrefresh(win);
                napms(500);
                break;
        }
        if (player.hp < 0) player.hp = 0;
        if (player.hp == 0) player.is_dead = TRUE;
        drawStatsArea();
    }

    flushinp();
    if (player.is_dead == TRUE) {
        wbkgd(win,COLOR_PAIR(4) | A_DIM);
        wclear(win);
        box(win,ACS_VLINE,ACS_HLINE);
        mvwprintw(win,10,20,"Thou art dead!");
        mvwprintw(win,12,20,"Press any key...");
        wrefresh(win);
        wgetch(win);
        game_state = GAME_DONE;
    } else if (didFlee == FALSE) {
        //wclear(encounterwin);
        if (player.gold + gold_amt >= INT_MAX) player.gold = INT_MAX; else player.gold += gold_amt;
        player.slain++;
        walk_counter = 0;
        wbkgd(win,COLOR_PAIR(1) | A_DIM);
        wclear(win);
        box(win,ACS_VLINE,ACS_HLINE);

        mvwprintw(win,3,10,"Victory!");
        mvwprintw(win,5,5,"%s hast slain the %s!",player.player_name,the_enemy.enemy_name);
        mvwprintw(win,6,5,"%s found %i gold on the %s",player.player_name,gold_amt,the_enemy.enemy_name);
        if (expGiven > 0)
            mvwprintw(win,7,5,"%s gained %i XP from the battle",player.player_name,expGiven);

        if (levelUp(expGiven) == 1) {
            wattrset(win,A_BOLD);
            mvwprintw(win, 9, 5,"%s has gained a level!",player.player_name);
            wattrset(win,A_NORMAL);
        }
        wattrset(win,A_REVERSE);
        mvwprintw(win,13,10,"Press any key to continue thine journey...");
        wattrset(win,A_NORMAL);
        wrefresh(win);
        drawStatsArea();
        wgetch(win);
    }
}
Exemplo n.º 2
0
void SpriteSystem::update(float dt)
{
    m_fBeginElaseTime += dt;//记录游戏开始多久后可以攻击,时间取决于怪物跑动的时间
    
    if (m_fBeginElaseTime >= __RUN_ACTION_TIME &&GameManager::getInstance()->isGameOver == false)//4秒后允许攻击
    {
        enemyAttack(dt);
    }
    
    //显示技能按钮
    for (unsigned int i = 0; i < m_vHeros.size(); i++)
    {
        BaseSprite* hero = m_vHeros.at(i);
        if (hero->getSpriteState() != SPRITESTATE_DEAD)
        {
            this->showLifeButton(hero);
            this->showPowerButton(hero);
        }
    }
    
    //更新敌人生命值
    for (unsigned int i = 0; i < m_vEnemys.size(); i++)
    {
        BaseSprite* enemy = m_vEnemys.at(i);
        if (enemy->getSpriteState() != SPRITESTATE_DEAD)
        {
            showLifeTop(enemy);
        }
    }
    
    switch (gameResult())
    {
        case 0://未完成
            break;
        case 1://胜利
        {
            unscheduleUpdate();
            //给PlayLayer发信号
            Message* msg = Message::instance();
            msg->setMesType(Message_GameSuccess_);
            PlayLayer::s_messageQ->push(msg);
            //人物动画效果
            //添加一个层
            OverScene* overScene = OverScene::create(1);
            this->addChild(overScene,100);
            
        }
            break;
        case 2://失败
        {
            unscheduleUpdate();
            //给PlayLayer发信号
            Message* msg = Message::instance();
            msg->setMesType(Message_GameFailed_);
            PlayLayer::s_messageQ->push(msg);
        
            //人物动画效果
            //添加一个层
            OverScene* overScene = OverScene::create(2);
            this->addChild(overScene,100);
        }
            break;
        default:
            break;
    }
}