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); } }
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; } }