void use_skill(int keypress) { /* this function is entered with a keypress from ac_fight0 and so on*/ /* the keypress is used to determine what attack is used */ /* 1. the player already chose the attack (int keypress), now it's time for the enemy */ // TODO enemy always uses skill 0 /* 2. calculate damage */ /* player does damage */ /* Wu Xing cycles: Wood causes +FIRE, -EARTH Fire causes +EARTH, -METAL Earth causes +METAL, -WATER Metal causes +WATER, -WOOD Water causes +WOOD, -FIRE */ if (keypress <= 4 && strcmp(player.skill[keypress]->name,"Unused") != 0) { // Player attacks skill_effect(&player, &enemy, player.skill[keypress]); // Enemy attack skill_effect(&enemy, &player, enemy.skill[0]); /* 3. check for dead player/enemy */ int enemy_dead = fight_check_dead(); /* 4. update stats and display them IF THE ENEMY DIDN'T DIE */ if (!enemy_dead) { ncurs_fightinfo(&player, 0); ncurs_fightinfo(&enemy, 3); } wrefresh(game_win); } else { ncurs_log_sysmsg(_("You dont have a skill in slot %d"), keypress+1); } }
void combat_seeifready() { // loop through all the players in combat int allready = 1; //if (is_online(partymember1.id) || is_online(partymember2.id)) // it's multiplayer combat if (combat_ismulti()) // it's multiplayer combat { // loop through all the effects of all party members taking part in the fight for (int i = 0; i <= 2; i++) if (player_party.characters[i]->incombat) { if (player_party.characters[i]->turnready < 0) { ncurs_log_sysmsg("still waiting for: %s",player_party.characters[i]->name); allready = 0; // still waiting for a keypress } } } else // it's single player combat { allready = 1; } // COMBAT EFFECTS START HERE if (allready) // if everyone is ready, do combat stuff { ncurs_log_sysmsg(_("all players have committed turns, calculating effects")); ncurs_log_sysmsg(_("Combat resolution============================")); // combat stuff begins here // players attack enemies for (int i = 0; i <= 2; i++) if (player_party.characters[i]->incombat) skill_effect(player_party.characters[i], enemy_party.characters[player_party.characters[i]->combattarget],player_party.characters[i]->skill[player_party.characters[i]->turnready]); // enemies attack players // choose which player to attack int dest = 0; int players = 0; for (int i = 0; i <= 2; i++) if (player_party.characters[i]->incombat) players++; // players now holds the number of players in combat, randomize one of them int i = 0; // enemies attack here for (int j = 0; j <= 2; j++) { if (enemy_party.characters[j]->incombat) // only enemies who are in combat attack { while (i == 0) // loop until you find an acceptable target, then attack { dest = rand() % players; // dest holds a number from 0..players in combat if (player_party.characters[dest]->incombat) // this player is in combat -> acceptable target i = 1; } // TODO: random enemy skill (enemies should have more than one skill.. skill_effect(enemy_party.characters[j], player_party.characters[dest], enemy_party.characters[j]->skill[0]); } } ncurs_log_sysmsg(_("=============================================")); // combat stuff ends here // reset turnready for (int i = 0; i <= 2; i++) if (player_party.characters[i]->incombat) player_party.characters[i]->turnready = -1; /* 3. check for dead player/enemy */ int all_enemies_dead = fight_check_dead(); /* 4. update stats and display them IF THE ENEMY DIDN'T DIE */ if (!all_enemies_dead) ac_update_fightscreen(); else { ncurs_clear_fightwindows(); ncurs_modal_msg(_("All enemies are slain! The battle is over")); // ac_dungeons makes the player go up a dungeon level // -> to stay at the same level, decrease the level here player.dungeon_lvl--; ac_dungeons(); } } }