// Koko pelin käyttämät tietotyypit ja pelitilanteen hallintaan liittyvät // funktiot. #ifndef HAKKERIPELI_HH #define HAKKERIPELI_HH #include #include class Hakkeri; enum Siirtotyyppi {EISIIRTOA, KOODAA, PUSKUROI, REITITA, RESETOI, HYOKKAA, TANKKAA, ODOTA}; struct Siirto { Siirto(Siirtotyyppi ntyyppi); Siirtotyyppi tyyppi; // Siirron tyyppi - määrää muiden kenttien käytön int maara; // KOODAA: maara on koodattavan viruksen taso. // PUSKUROI: maara on puskuroitavien virusten määrä. // REITITA: maara on reititettävien virusten määrä, // ei välttämättä sama kuin reitityskohteiden määrä. // RESETOI: kenttä ei ole käytössä. // HYOKKAA: kenttä ei ole käytössä. // TANKKAA: tankattavan kolan määrä. // ODOTA: kenttä ei ole käytössä. Hakkeri *kohde; // Vain HYOKKAA-komennossa, jossa osoitin hyökkäyksen // kohteena olevaan hakkeriin std::vector reitityskohteet; // Vain REITITA-komennossa, jossa // vektori osoittimista annettuihin reitityskohteisiin. }; struct Asetukset { Asetukset(); // Yleisasetustiedoston tiedot. int koodauskulutus; int reitityskulutus; int puskurointikulutus; int tankkauskulutus; int ryhmanvarastot; int kolauusiutuminen; }; struct Hakkeriryhma { Hakkeriryhma(const std::string &ryhmannimi); std::string nimi; // Hakkeriryhmän nimi. std::vector hakkerit; // Osoittimet ryhmän hakkereihin. int vuoro; // Vuorossa olevan hakkerin indeksi. }; struct Pelitilanne { Pelitilanne(); Asetukset asetukset; // Pelin yleisasetukset. std::vector ryhmat; // Peliin kuuluvat hakkeriryhmät. int vuoro; // Vuorossa olevan ryhmän indeksi. bool lopetettu; // True, jos pelissä ei enää suoriteta vuoroja. }; // Lukee yleisasetustiedoston Asetukset-rakenteeseen. // Voi tuottaa poikkeuksen Lukuvirhe. void lueYleisasetukset(std::istream &virta, Asetukset &tulos); // Lukee hakkeriryhmän tiedostosta ja luo Hakkeri-oliot, sekä tallentaa // osoittimet niihin Hakkeriryhma-rakenteeseen. // Tämä rakenne tallennetaan Pelitilanteen sisältämään vektoriin. // Voi tuottaa poikkeuksen Lukuvirhe. void lueHakkeriryhma(std::istream &virta, Pelitilanne &pelitilanne); // Ylikuormitetut asetustiedostojen lukufunktiot, jotka ottavat virran // sijasta tiedostonimen parametrikseen. // Voi tuottaa poikkeukset Avausvirhe ja Lukuvirhe. // Tuotetuissa poikkeuksissa on parametrina tiedoston nimi. void lueYleisasetukset(const std::string &tiedostonimi, Asetukset &tulos); void lueHakkeriryhma(const std::string &tiedostonimi, Pelitilanne &pelitilanne); // Etsii hakkerin nimeä annetuista ryhmistä. Palauttaa osoittimen, tai // null jos hakkeria ei löydy. Hakkeri *etsiHakkeri(const std::string &nimi, const std::vector &ryhmat); // Palauttaa osoittimen vuorossa olevaan hakkeriin. Hakkeri *haeVuoro(const Pelitilanne &pelitilanne); // Laskee siirron kolakulutuksen. int laskeKulutus(const Siirto &siirto, const Asetukset &asetukset); // Suorittaa siirron ja tulostaa siirtoon liittyvät ilmoitukset. // Vaihtaa vuoron tarvittaessa. void suoritaSiirto(const Siirto &siirto, Pelitilanne &pelitilanne, std::ostream &out); // Tarkistaa, että ryhmä on yhä mukana pelissä. bool ryhmaMukana(const Hakkeriryhma &ryhma); // Tarkistaa, että jokaisessa ryhmässä on vähintään yksi aktiivinen hakkeri. // Palauttaa truen jos näin ei ole. bool peliLoppu(const std::vector &ryhmat); // Tulostaa vuorossa olevan ryhmän ja hakkerin nimen virtaan. void tulostaVuoro(const Pelitilanne &pelitilanne, std::ostream &out); // Vapauttaa dynaamisesti luodut Hakkeri-oliot ja tyhjentää vektorit. void vapautaHakkerit(std::vector &ryhmat); // Tulostaa pelitilanteen TILANNE-komentoa varten. void tulostaTilanne(const std::vector &ryhmat, std::ostream &out); #endif