Advertisement
daniele2013

Daniel's Fantasy

Mar 3rd, 2015
40
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 78.56 KB | None | 0 0
  1. // MAIN.C //
  2. #include "utility.h"
  3.  
  4. int main()
  5. {
  6.     initscr();
  7.     keypad(stdscr,TRUE);
  8.     cbreak();
  9.     noecho();
  10.     int c;
  11.     start_color();
  12.     init_pair(1,COLOR_WHITE, COLOR_BLUE);
  13.     init_pair(2,COLOR_GREEN, COLOR_GREEN);
  14.     init_pair(3,COLOR_BLACK, COLOR_GREEN);
  15.     init_pair(4,COLOR_BLACK, COLOR_YELLOW);
  16.     init_pair(5,COLOR_CYAN, COLOR_BLUE);
  17.     init_pair(6,COLOR_RED, COLOR_GREEN);
  18.     init_pair(7,COLOR_CYAN, COLOR_CYAN);
  19.     init_pair(8,COLOR_YELLOW, COLOR_YELLOW);
  20.     init_pair(9,COLOR_BLACK, COLOR_BLACK);
  21.     init_pair(10,COLOR_RED, COLOR_YELLOW);
  22.     while(1){
  23.         printw("\t****************************\n");
  24.         printw("\t*                          *\n");
  25.         printw("\t*                          *\n");
  26.         printw("\t*     DANIEL'S FANTASY     *\n");
  27.         printw("\t*                          *\n");
  28.         printw("\t*                          *\n");
  29.         printw("\t*      <PREMI INVIO>       *\n");
  30.         printw("\t****************************\n");
  31.         refresh();
  32.         while((c = getch()) != 10);
  33.         clear();
  34.         game();
  35.     }
  36. //    int i = 0;
  37. //    char *stringhe[] = {"1. Ciao", "2. Addio","3. Arivederci","4. Salutiamo!","5. Alla prossima!","6. Wow!","7. Accidenti...","8. Perfetto...!"};
  38. //    do{
  39. //        print2(stringhe,8,i);
  40. //        c = getch();
  41. //        switch(c){
  42. //        case KEY_UP:
  43. //            if((i - 1) > -1 && (i - 1) < 8)
  44. //                i--;
  45. //            break;
  46. //        case KEY_DOWN:
  47. //            if((i + 1) > -1 && (i + 1) < 8)
  48. //                i++;
  49. //            break;
  50. //        }
  51. //    }while(1);
  52.     endwin();
  53.     return 0;
  54. }
  55.  
  56.  
  57. // UTILITY.C //
  58.  
  59. #include "utility.h"
  60.  
  61. /*
  62.     0 - oggetto generico
  63.     1 - arma
  64.     2 - protezione
  65.     3 - accessorio
  66.     4 - oggetto usabile (cura ecc...)
  67. */
  68.  
  69. arma armi[M_ARMI] = {
  70.     {"spada di legno lunga",3},
  71.     {"bacchetta magica corta",2},
  72.     {"pugnale corto",1},
  73.     {"becco rapace",1},
  74.     {"spada di ferro corta",5},
  75.     {"spada di ferro media",7},
  76.     {"spada di ferro lunga",10},
  77.     {"bastone incantato leggero",4},
  78.     {"bastone incantato lungo carismatico",6},
  79.     {"bastone incantato lungo maestoso",10},
  80.     {"nunchaku",3},
  81.     {"daga",5},
  82.     {"arco lungo",7}
  83. };
  84.  
  85. protezione protezioni[M_PROT] = {
  86.     {"armatura di ferro",1},
  87.     {"mantello corto",1},
  88.     {"scudo grande di ferro",3},
  89.     {"pelliccia pesante",1},
  90.     {"armatura di acciaio",5},
  91.     {"armatura d'oro",7},
  92.     {"armatura di platino",10},
  93.     {"cappa corta incantata",4},
  94.     {"mantello lungo incantato",6},
  95.     {"mantello lungo incantato maestoso", 10},
  96.     {"scudo grande d'argento",3},
  97.     {"scudo grande d'oro",5},
  98.     {"granscudo di platino",7}
  99. };
  100.  
  101. accessorio accessori[M_ACC] = {
  102.     {"scarpe leggere",0,1},
  103.     {"scarpe pesanti",0,4},
  104.     {"scarpe veloci",0,7},
  105.     {"orecchini incantati",0,5},
  106.     {"orecchini stregati",0,10},
  107.     {"anello stregato",7,0},
  108.     {"cintura bianca",1,1},
  109.     {"cintura blu",3,3},
  110.     {"cintura nera",6,6},
  111.     {"cintura rossa",10,10},
  112.     {"guanti di ferro",7,5},
  113.     {"guanti di pezza",3,3},
  114.     {"guanti d'oro",10,10},
  115. };
  116.  
  117. Cura cure[M_CURE] = {
  118.     {"pozione",20},
  119.     {"granpozione",50},
  120.     {"extrapozione",300},
  121.     {"midelisir",625},
  122.     {"elisir",1250}
  123. };
  124.  
  125. Mostro mostri[M_MOSTRI] = {
  126.     {"Cane",50,5,2,25,250,{"pozione",4}},
  127.     {"Lupo",70,6,3,25,200,{"zanna scheggiata",0}},
  128.     {"Aquila reale",75,6,5,30,0,{"becco rapace",1}},
  129.     {"Gnomo dispettoso",60,4,7,40,10,{"anello stregato",3}},
  130.     {"Orso",125,8,1,30,100,{"pelliccia pesante",2}},
  131.     {"Pianta carnivora gigante",150,8,7,30,240,{"granpozione",4}},
  132.     {"Spirito errante",150,7,10,35,100,{"bastone incantato lungo carismatico",1}},
  133.     {"Nano delle foreste",225,12,8,50,400,{"spada di ferro media",1}},
  134.     {"Troll",250,15,11,70,100,{"midelisir",4}},
  135.     {"Orco delle caverne",250,16,9,65,450,{"armatura di platino",2}},
  136.     {"Drago",500,100,85,1000,20000,{"bastone incantato lungo maestoso",1}},
  137.     {"Basilisco",425,75,70,750,10000,{"elisir",4}}
  138. };
  139.  
  140. Mostro boss[4] = {
  141.     {"Ciclope",400,60,50,0,1000,{"spada di ferro corta",1}},
  142.     {"Demone draconico infernale",700,75,60,0,2000,{"arco lungo",1}},
  143.     {"Angelo decaduto",2000,110,85,0,0,{"bastone incantato lungo maestoso",1}},
  144.     {"Rape monster",10000,200,140,0,0,{"elisir",4}}
  145. };
  146.  
  147. int inputInt(){
  148.     int x;
  149.     char c;
  150.     puts("Scrivi un numero:");
  151.     while(scanf("%d", &x) != 1){
  152.         puts("input errato...riprova:");
  153.         do{
  154.             c = getchar();
  155.         }while(c != '\n');
  156.     }
  157.     do{
  158.         c = getchar();
  159.     }while(c != '\n');
  160.     return x;
  161. }
  162.  
  163. int **allocaMat(int righe, int colonne){
  164.     int i;
  165.     int **new = (int **)malloc(righe*sizeof(int *));
  166.     for(i = 0; i < righe; i++){
  167.         new[i] = (int *)malloc(colonne*sizeof(int));
  168.     }
  169.     return new;
  170. }
  171.  
  172. char **allocaMatchar(int righe, int colonne){
  173.     int i;
  174.     char **new = (char **)malloc(righe*sizeof(char *));
  175.     for(i = 0; i < righe; i++){
  176.         new[i] = (char *)malloc(colonne*sizeof(char));
  177.     }
  178.     return new;
  179. }
  180.  
  181. Matrice newMatrice(){
  182.     Matrice new = (Matrice)malloc(sizeof(matrice));
  183.     new->righe = inputInt();
  184.     new->colonne = inputInt();
  185.     new->matrice = allocaMat(new->righe,new->colonne);
  186.     return new;
  187. }
  188.  
  189. Matchar newMatchar(){
  190.     Matchar new = (Matchar)malloc(sizeof(matchar));
  191.     new->righe = inputInt();
  192.     new->colonne = inputInt();
  193.     new->matrice = allocaMatchar(new->righe,new->colonne);
  194.     return new;
  195. }
  196.  
  197. void setMatrice(Matrice this){
  198.     int i, j;
  199.     for(i = 0; i < this->righe; i++)
  200.         for(j = 0; j < this->colonne; j++)
  201.             this->matrice[i][j] = inputInt();
  202. }
  203.  
  204. void setRandomMatrice(Matrice this){
  205.     int i, j;
  206.     for(i = 0; i < this->righe; i++)
  207.         for(j = 0; j < this->colonne; j++)
  208.             this->matrice[i][j] = (rand() % 2);
  209. }
  210.  
  211. void setRandomMatchar(Matchar this){
  212.     int i, j, c, d;
  213.     for(i = 0; i < this->righe; i++){
  214.         for(j = 0; j < this->colonne; j++){
  215.             do{
  216.                 c = rand() % 100;
  217.             }while(c != 32 && c != 94);
  218.             this->matrice[i][j] = c;
  219.         }
  220.     }
  221.     for(i = 0; i < (this->righe * this->colonne); i++){
  222.         c = rand() % this->righe;
  223.         d = rand() % this->colonne;
  224.         if(this->matrice[c][d] == 94)
  225.             this->matrice[c][d] = ' ';
  226.     }
  227. }
  228.  
  229. void initMatchar(Matchar this){
  230.     int i, j;
  231.     for(i = 0; i < this->righe; i++)
  232.         for(j = 0; j < this->colonne; j++)
  233.             this->matrice[i][j] = ' ';
  234. }
  235.  
  236. void initMatrice(Matrice this){
  237.     int i, j;
  238.     for(i = 0; i < this->righe; i++)
  239.         for(j = 0; j < this->colonne; j++)
  240.             this->matrice[i][j] = 0;
  241. }
  242.  
  243. void getMatrice(Matrice this){
  244.     int i, j;
  245.     for(i = 0; i < this->colonne + 2; i++)
  246.         printf("#");
  247.     puts("");
  248.     for(i = 0; i < this->righe; i++){
  249.         printf("#");
  250.         for(j = 0; j < this->colonne; j++)
  251.             printf("%d\t", this->matrice[i][j]);
  252.         puts("#");
  253.     }
  254.     for(i = 0; i < this->colonne + 2; i++)
  255.         printf("#");
  256.     puts("");
  257. }
  258.  
  259. void getMatchar(Matchar this){
  260.     int i, j;
  261.     attron(COLOR_PAIR(5));
  262.     for(i = 0; i < this->colonne + 2; i++)
  263.         printw("#");
  264.     attroff(COLOR_PAIR(5));
  265. //    printw("\n");
  266.     for(i = 0; i < this->righe; i++){
  267.         attron(COLOR_PAIR(5));
  268.         printw("\n#");
  269.         attroff(COLOR_PAIR(5));
  270.         for(j = 0; j < this->colonne; j++){
  271.             if(this->matrice[i][j] == '@'){
  272.                 attron(COLOR_PAIR(1));
  273.                 printw("%c", this->matrice[i][j]);
  274.                 attroff(COLOR_PAIR(1));
  275.                 continue;
  276.             }
  277.             else if(this->matrice[i][j] == ' '){
  278.                 attron(COLOR_PAIR(2));
  279.                 printw("%c", this->matrice[i][j]);
  280.                 attroff(COLOR_PAIR(2));
  281.                 continue;
  282.             }
  283.             else if(this->matrice[i][j] == ',' || this->matrice[i][j] == '.'){
  284.                 attron(COLOR_PAIR(3));
  285.                 printw("%c", this->matrice[i][j]);
  286.                 attroff(COLOR_PAIR(3));
  287.                 continue;
  288.             }
  289.             else if(this->matrice[i][j] == 'm' || this->matrice[i][j] == 'M' || this->matrice[i][j] == 'g'){
  290.                 attron(COLOR_PAIR(6));
  291.                 printw("%c", this->matrice[i][j]);
  292.                 attroff(COLOR_PAIR(6));
  293.                 continue;
  294.             }
  295.             else if(this->matrice[i][j] == '#'){
  296.                 attron(COLOR_PAIR(7));
  297.                 printw("%c", this->matrice[i][j]);
  298.                 attroff(COLOR_PAIR(7));
  299.                 continue;
  300.             }
  301.             else if(this->matrice[i][j] == '*'){
  302.                 attron(COLOR_PAIR(8));
  303.                 printw("%c", this->matrice[i][j]);
  304.                 attroff(COLOR_PAIR(8));
  305.                 continue;
  306.             }
  307.             else if(this->matrice[i][j] == '+'){
  308.                 attron(COLOR_PAIR(9));
  309.                 printw("%c", this->matrice[i][j]);
  310.                 attroff(COLOR_PAIR(9));
  311.                 continue;
  312.             }
  313.             else if(this->matrice[i][j] == 'N'){
  314.                 attron(COLOR_PAIR(10));
  315.                 printw("%c", this->matrice[i][j]);
  316.                 attroff(COLOR_PAIR(10));
  317.                 continue;
  318.             }
  319.             else{
  320.                 attron(COLOR_PAIR(4));
  321.                 printw("%c", this->matrice[i][j]);
  322.                 attroff(COLOR_PAIR(4));
  323.                 continue;
  324.             }
  325.         }
  326.         attron(COLOR_PAIR(5));
  327.         printw("#");
  328.         attroff(COLOR_PAIR(5));
  329.     }
  330.     attron(COLOR_PAIR(5));
  331.     for(i = 0; i < this->colonne + 2; i++)
  332.         printw("#\n");
  333.     attroff(COLOR_PAIR(5));
  334.     printw("\n");
  335.     refresh();
  336. }
  337.  
  338. void saveMatchar(Matchar this, FILE *f){
  339.     int i, j;
  340.     fprintf(f,"%d %d\n",this->righe, this->colonne);
  341.     for(i = 0; i < this->righe; i++){
  342.         for(j = 0; j < this->colonne; j++)
  343.             fprintf(f,"%c", this->matrice[i][j]);
  344.         fputs("\n",f);
  345.     }
  346. }
  347.  
  348. Matchar loadMatchar(char *nomefile){
  349.     char app[ML];
  350.     sprintf(app,"./maps/%s",nomefile);
  351.     FILE *f = fopen(app,"r");
  352.     Matchar new = (Matchar)malloc(sizeof(matchar));
  353.     int righe, colonne;
  354.     new->righe = 25;
  355.     new->colonne = 75;
  356.     new->matrice = allocaMatchar(new->righe,new->colonne);
  357.     for(righe = 0; righe < new->righe; righe++){
  358.         fgetc(f);
  359.         for(colonne = 0; colonne < new->colonne; colonne++)
  360.             fscanf(f,"%c",&(new->matrice[righe][colonne]));
  361.     }
  362.     return new;
  363. }
  364.  
  365. int choose(int min, int max){
  366.     int x;
  367.     do{
  368.         x = inputInt();
  369.         if(x < min || x > max)
  370.             puts("input fuori intervallo...riprova:");
  371.     }while(x < min || x > max);
  372.     return x;
  373. }
  374.  
  375. void menu1(Matchar this){
  376.     int c;
  377.     system("cls");
  378.     printf("1) mappa piccola (10 x 30)\n2) mappa media (25 x 75)\n3) mappa grande (50 x 150)\n> ");
  379.     c = choose(1,3);
  380.     switch(c){
  381.         case 1:
  382.             this->righe = 10;
  383.             this->colonne = 30;
  384.             this->matrice = allocaMatchar(10,30);
  385.             break;
  386.         case 2:
  387.             this->righe = 25;
  388.             this->colonne = 75;
  389.             this->matrice = allocaMatchar(25,75);
  390.             break;
  391.         case 3:
  392.             this->righe = 50;
  393.             this->colonne = 150;
  394.             this->matrice = allocaMatchar(50,150);
  395.             break;
  396.     }
  397.     system("cls");
  398.     printf("1) mappa vuota\n2) mappa random\n> ");
  399.     c = choose(1,2);
  400.     switch(c){
  401.         case 1:
  402.             initMatchar(this);
  403.             edita(this);
  404.             break;
  405.         case 2:
  406.             srand(time(NULL));
  407.             setRandomMatchar(this);
  408.             edita(this);
  409.             break;
  410.     }
  411. }
  412.  
  413. void edita(Matchar this){
  414.     Pos c;
  415.     int d,e;
  416.     while(1){
  417.         system("cls");
  418.         getMatchar(this);
  419.         printf("\n1) continua editing\n2) esci\n> ");
  420.         d = choose(1,2);
  421.         switch(d){
  422.             case 1:
  423.                 puts("Scrivi le coordinate:");
  424.                 c.x = choose(0,this->colonne - 1);
  425.                 c.y = choose(0,this->righe - 1);
  426.                 printf("\n1) vuoto\n2) muro\n> ");
  427.                 e = choose(1,2);
  428.                 switch(e){
  429.                     case 1:
  430.                         this->matrice[c.y][c.x] = ' ';
  431.                         break;
  432.                     case 2:
  433.                         this->matrice[c.y][c.x] = '#';
  434.                         break;
  435.                 }
  436.                 break;
  437.             case 2:
  438.                 return;
  439.         }
  440.     }
  441. }
  442.  
  443. void start(Matchar this, Giocatore eroe){
  444.     srand(time(NULL));
  445.     flushinp();
  446.     timeout(350);
  447.     char s = ' ';
  448.     Pos coord;
  449.     Pos npg1, npg2;
  450.     Oggetto o;
  451.     cercaPng1(this,&npg1);
  452.     cercaPosizione(this,&coord);
  453.     int c1, c2, d1, d2;
  454.     c1 = this->colonne / 3;
  455.     c2 = c1 * 2;
  456.     d1 = M_MOSTRI / 3;
  457.     d2 = (d1 * 2);
  458.     Punti a = NULL, b = NULL;
  459.     this->matrice[coord.y][coord.x] = '@';
  460.     this->matrice[npg1.y][npg1.x] = 'g';
  461.     eroe->passi = 10;
  462.     int c, d, v = 0, casual;
  463.     while(1){
  464.         this->matrice[npg1.y][npg1.x] = ' ';
  465.         a = removeTesta(a,&npg1);
  466.         if(a == NULL)
  467.             a = moveMonster(this,npg1);
  468.         this->matrice[npg1.y][npg1.x] = 'g';
  469.         if(strcmp(this->scenario,"caverna.txt") == 0){
  470.             this->matrice[npg2.y][npg2.x] = ' ';
  471.             b = removeTesta(b,&npg2);
  472.             if(b == NULL)
  473.                 b = moveMonster(this,npg2);
  474.             this->matrice[npg2.y][npg2.x] = 'g';
  475.         }
  476.         if(eroe->passi == 0){
  477.             timeout(-1);
  478.             if(((coord.x)) <= c1)
  479.                 v = battle(eroe,mostri[rand()% d1]);
  480.             else if(((coord.x)) > c1 && ((coord.x)) <= c2)
  481.                 v = battle(eroe,mostri[(rand()% d1)+d1]);
  482.             else
  483.                 v = battle(eroe,mostri[(rand()% d1)+d2]);
  484.             flushinp();
  485.             timeout(350);
  486.         }
  487.         clear();
  488.         printw("frecce - 4 direzioni\tINVIO - azione/interagisci/parla\n1 - pausa\n2 - salva posizione\t3 - esci\n");
  489.         getMatchar(this);
  490.         c = getch();
  491.         switch(c){
  492.             case KEY_LEFT:
  493.                 eroe->passi--;
  494.                 if((d = (coord.x) - 1) >= 0)
  495.                 if(this->matrice[coord.y][(coord.x) - 1] != '#' && this->matrice[coord.y][(coord.x) - 1] != 94 && this->matrice[coord.y][(coord.x) - 1] != '.' && this->matrice[coord.y][(coord.x) - 1] != ',' && this->matrice[coord.y][(coord.x) - 1] != 'M' && this->matrice[coord.y][(coord.x) - 1] != 'N' && this->matrice[coord.y][(coord.x) - 1] != 'g'){
  496.                     this->matrice[coord.y][coord.x] = s;
  497.                     (coord.x)--;
  498.                     s = this->matrice[coord.y][(coord.x)];
  499.                     this->matrice[coord.y][coord.x] = '@';
  500.                 }
  501.                 break;
  502.             case KEY_DOWN:
  503.                 eroe->passi--;
  504.                 if((d = (coord.y) + 1) < this->righe)
  505.                 if(this->matrice[(coord.y) + 1][coord.x] != '#' && this->matrice[coord.y + 1][(coord.x)] != 94 && this->matrice[coord.y + 1][(coord.x)] != '.' && this->matrice[coord.y + 1][(coord.x)] != ',' && this->matrice[coord.y + 1][(coord.x)] != 'M' && this->matrice[coord.y + 1][(coord.x)] != 'N' && this->matrice[coord.y + 1][(coord.x)] != 'g'){
  506.                     this->matrice[coord.y][coord.x] = s;
  507.                     (coord.y)++;
  508.                     s = this->matrice[coord.y][coord.x];
  509.                     this->matrice[coord.y][coord.x] = '@';
  510.                 }
  511.                 break;
  512.             case KEY_RIGHT:
  513.                 eroe->passi--;
  514.                 if((d = (coord.x) + 1) < this->colonne)
  515.                 if(this->matrice[coord.y][(coord.x) + 1] != '#' && this->matrice[coord.y][(coord.x) + 1] != 94 && this->matrice[coord.y][(coord.x) + 1] != '.' && this->matrice[coord.y][(coord.x) + 1] != ',' && this->matrice[coord.y][(coord.x) + 1] != 'M' && this->matrice[coord.y][(coord.x) + 1] != 'N' && this->matrice[coord.y][(coord.x) + 1] != 'g'){
  516.                     this->matrice[coord.y][coord.x] = s;
  517.                     (coord.x)++;
  518.                     s = this->matrice[coord.y][coord.x];
  519.                     this->matrice[coord.y][coord.x] = '@';
  520.                 }
  521.                 break;
  522.             case KEY_UP:
  523.                 eroe->passi--;
  524.                 if((d = (coord.y) - 1) >= 0)
  525.                 if(this->matrice[(coord.y) - 1][coord.x] != '#' && this->matrice[coord.y - 1][(coord.x)] != 94 && this->matrice[coord.y - 1][(coord.x)] != '.' && this->matrice[coord.y - 1][(coord.x)] != ',' && this->matrice[coord.y - 1][(coord.x)] != 'M' && this->matrice[coord.y - 1][(coord.x)] != 'N' && this->matrice[coord.y - 1][(coord.x)] != 'g'){
  526.                     this->matrice[coord.y][coord.x] = s;
  527.                     (coord.y)--;
  528.                     s = this->matrice[coord.y][coord.x];
  529.                     this->matrice[coord.y][coord.x] = '@';
  530.                 }
  531.                 break;
  532.             case 50:
  533.                 timeout(-1);
  534.                 salva(eroe,this);
  535.                 flushinp();
  536.                 timeout(350);
  537.                 break;
  538.             case 51:
  539.                 timeout(-1);
  540.                 printw("\n1) salva ed esci\n2) esci senza salvare\n\n");
  541.                 refresh();
  542.                 do{
  543.                     d = getch();
  544.                     if(d < 49 || d > 50){
  545.                         printw("riprova:\n");
  546.                         refresh();
  547.                     }
  548.                 }while(d < 49 || d > 50);
  549.                 switch(d){
  550.                     case 49:
  551.                         salva(eroe,this);
  552.                         printw("Fatto!\nPremi un tasto...");
  553.                         refresh();
  554.                         getch();
  555.                         clear();
  556.                         return;
  557.                     case 50:
  558.                         printw("Premi un tasto...");
  559.                         refresh();
  560.                         getch();
  561.                         clear();
  562.                         return;
  563.                 }
  564.             case 10:
  565.                 timeout(-1);
  566.                 if(s == '+'){
  567.                     if(strcmp(this->scenario,"inizio.txt") == 0){
  568.                         loadLivello(this,"caverna.txt");
  569.                         cercaPng1(this,&npg1);
  570.                         cercaPng1(this,&npg2);
  571.                         a = freePunti(a);
  572.                         b = freePunti(b);
  573.                         a = singolo(npg1);
  574.                         b = singolo(npg2);
  575.                         eroe->passi = (rand() % 10) + 10;
  576.                         strcpy(eroe->scenario,"caverna.txt");
  577.                     }
  578.                     else{
  579.                         loadLivello(this,"inizio.txt");
  580.                         cercaPng1(this,&npg1);
  581.                         a = freePunti(a);
  582.                         a = singolo(npg1);
  583.                         eroe->passi = (rand() % 10) + 10;
  584.                         strcpy(eroe->scenario,"inizio.txt");
  585.                     }
  586.                 }
  587.                 else if(this->matrice[coord.y - 1][coord.x] == 'N' || this->matrice[coord.y + 1][coord.x] == 'N' || this->matrice[coord.y][coord.x - 1] == 'N' || this->matrice[coord.y][coord.x + 1] == 'N'){
  588.                     clear();
  589.                     negozio(eroe,this);
  590.                 }
  591.                 else if(this->matrice[coord.y - 1][coord.x] == '.' || this->matrice[coord.y + 1][coord.x] == '.' || this->matrice[coord.y][coord.x - 1] == '.' || this->matrice[coord.y][coord.x + 1] == '.'){
  592.                     strcpy(o.nome,cure[rand() % 5].nome);
  593.                     o.tipo = 4;
  594.                     printw("Ottieni un %s !\n", o.nome);
  595.                     eroe->inv = addInventario(eroe->inv,o);
  596.                     getch();
  597.                     if(this->matrice[coord.y - 1][coord.x] == '.'){
  598.                         this->matrice[coord.y - 1][coord.x] = ' ';
  599.                     }
  600.                     else if(this->matrice[coord.y + 1][coord.x] == '.'){
  601.                         this->matrice[coord.y + 1][coord.x] = ' ';
  602.                     }
  603.                     else if(this->matrice[coord.y][coord.x - 1] == '.'){
  604.                         this->matrice[coord.y][coord.x - 1] = ' ';
  605.                     }
  606.                     else if(this->matrice[coord.y][coord.x + 1] == '.'){
  607.                         this->matrice[coord.y][coord.x + 1] = ' ';
  608.                     }
  609.                 }
  610.                 else if(this->matrice[coord.y - 1][coord.x] == ',' || this->matrice[coord.y + 1][coord.x] == ',' || this->matrice[coord.y][coord.x - 1] == ',' || this->matrice[coord.y][coord.x + 1] == ','){
  611.                     casual = rand() % 3;
  612.                     switch(casual){
  613.                         case 0:
  614.                             strcpy(o.nome,armi[rand() % M_ARMI].nome);
  615.                             o.tipo = 1;
  616.                             printw("Ottieni un %s !\n", o.nome);
  617.                             eroe->inv = addInventario(eroe->inv,o);
  618.                             getch();
  619.                             break;
  620.                         case 1:
  621.                             strcpy(o.nome,protezioni[rand() % M_PROT].nome);
  622.                             o.tipo = 2;
  623.                             printw("Ottieni un %s !\n", o.nome);
  624.                             eroe->inv = addInventario(eroe->inv,o);
  625.                             getch();
  626.                             break;
  627.                         case 2:
  628.                             strcpy(o.nome,accessori[rand() % M_ACC].nome);
  629.                             o.tipo = 3;
  630.                             printw("Ottieni un %s !\n", o.nome);
  631.                             eroe->inv = addInventario(eroe->inv,o);
  632.                             getch();
  633.                             break;
  634.                     }
  635.                     if(this->matrice[coord.y - 1][coord.x] == ','){
  636.                         this->matrice[coord.y - 1][coord.x] = ' ';
  637.                     }
  638.                     else if(this->matrice[coord.y + 1][coord.x] == ','){
  639.                         this->matrice[coord.y + 1][coord.x] = ' ';
  640.                     }
  641.                     else if(this->matrice[coord.y][coord.x - 1] == ','){
  642.                         this->matrice[coord.y][coord.x - 1] = ' ';
  643.                     }
  644.                     else if(this->matrice[coord.y][coord.x + 1] == ','){
  645.                         this->matrice[coord.y][coord.x + 1] = ' ';
  646.                     }
  647.                 }
  648.                 else if(this->matrice[coord.y - 1][coord.x] == 'M' || this->matrice[coord.y + 1][coord.x] == 'M' || this->matrice[coord.y][coord.x - 1] == 'M' || this->matrice[coord.y][coord.x + 1] == 'M'){
  649.                     switch(eroe->boss_sconfitti){
  650.                         case 0:
  651.                             v = battle(eroe,boss[0]);
  652.                             break;
  653.                         case 1:
  654.                             v = battle(eroe,boss[1]);
  655.                             break;
  656.                         case 2:
  657.                             v = battle(eroe,boss[2]);
  658.                             break;
  659.                         case 3:
  660.                             v = battle(eroe,boss[3]);
  661.                             break;
  662.                         default:
  663.                             printw("Boss gia' sconfitto...\n");
  664.                             refresh();
  665.                             getch();
  666.                             break;
  667.                         }
  668.                         if(v == 0){
  669.                             eroe->boss_sconfitti++;
  670.                             if(this->matrice[coord.y - 1][coord.x] == 'M'){
  671.                                 this->matrice[coord.y - 1][coord.x] = ' ';
  672.                             }
  673.                             else if(this->matrice[coord.y + 1][coord.x] == 'M'){
  674.                                 this->matrice[coord.y + 1][coord.x] = ' ';
  675.                             }
  676.                             else if(this->matrice[coord.y][coord.x - 1] == 'M'){
  677.                                 this->matrice[coord.y][coord.x - 1] = ' ';
  678.                             }
  679.                             else if(this->matrice[coord.y][coord.x + 1] == 'M'){
  680.                                 this->matrice[coord.y][coord.x + 1] = ' ';
  681.                             }
  682.                         }
  683.                 }
  684.                 else if(this->matrice[coord.y - 1][coord.x] == 'g' || this->matrice[coord.y + 1][coord.x] == 'g' || this->matrice[coord.y][coord.x - 1] == 'g' || this->matrice[coord.y][coord.x + 1] == 'g'){
  685.                     parla(this,eroe);
  686.                     refresh();
  687.                     getch();
  688.                 }
  689.                 flushinp();
  690.                 timeout(350);
  691.                 break;
  692.             case 49:
  693.                 timeout(-1);
  694.                 pausa(eroe,this);
  695.                 flushinp();
  696.                 timeout(350);
  697.                 break;
  698.         }
  699.     }
  700. }
  701.  
  702. Matchar load(Giocatore eroe){
  703.     Matchar this = (Matchar)malloc(sizeof(matchar));
  704.     char *str, app[1024], dir[ML];
  705.     int i = 0, c, j = 0;
  706.     char **stringhe = (char **)malloc(ML * sizeof(char*));
  707.     for(c = 0; c < ML; c++)
  708.         stringhe[c] = (char *)malloc(ML * sizeof(char));
  709.     DIR *d;
  710.     strcpy(dir,"dati");
  711.     struct stat s;
  712.     struct dirent *file;
  713.     str = (char *)malloc(1024 * sizeof(char));
  714.     strcpy(str,"");
  715.     d = opendir("dati");
  716.     if(!d){
  717.         printw("\n\nNon ci sono salvataggi!");
  718.         refresh();
  719.         sleep(3);
  720.         return NULL;
  721.     }
  722.     while( (file = readdir(d)) != NULL ){
  723.         sprintf(app,"%s", file->d_name);
  724.         stat(file->d_name,&s);
  725.         if(strcmp(file->d_name,".") == 0 || strcmp(file->d_name,"..") == 0)
  726.             continue;
  727.         strcat(app,"\n");
  728.         strcpy(stringhe[i++],app);
  729. //        stringhe[i-1][strlen(stringhe[i-1]) - 5] = '\0';
  730.     }
  731.     while((c = getch()) != KEY_F(1)){
  732.         switch(c){
  733.             case KEY_DOWN:
  734.                 if((j + 1) > -1 && (j + 1) < i)
  735.                     j++;
  736.                 print(stringhe,i,j);
  737.                 break;
  738.             case KEY_UP:
  739.                 if((j - 1) > -1 && (j - 1) < i)
  740.                     j--;
  741.                 print(stringhe,i,j);
  742.                 break;
  743.             case 10:
  744.                 this = carica(eroe,stringhe[j]);
  745.                 return this;
  746.             }
  747.     }
  748.     return this;
  749. }
  750.  
  751. void game(){
  752.     int c, i = 0;
  753.     char *scelte[] = {"1. new game","2. load game","3. exit"};
  754.     Matchar mappa = NULL;
  755.     Giocatore eroe = newGiocatore();
  756.     clear();
  757.     print(scelte,3,i);
  758.     while((c = getch()) != KEY_F(1))
  759.     switch(c){
  760.         case KEY_DOWN:
  761.             if((i + 1) > -1 && (i + 1) < 3)
  762.                 i++;
  763.             print(scelte,3,i);
  764.             break;
  765.         case KEY_UP:
  766.             if((i - 1) > -1 && (i - 1) < 3)
  767.                 i--;
  768.             print(scelte,3,i);
  769.             break;
  770.         case 10:
  771.             switch(i){
  772.                 case 0:
  773.                     mappa = new_game(eroe);
  774.                     story(mappa,eroe);
  775.                     break;
  776.                 case 1:
  777.                     mappa = load(eroe);
  778.                     if(!mappa)
  779.                         break;
  780.                     story(mappa,eroe);
  781.                     break;
  782.                 case 2:
  783.                     exit(1);
  784.             }
  785.             break;
  786.     }
  787. }
  788.  
  789. Matchar new_game(Giocatore eroe){
  790.     int i = 0;
  791.     Matchar mappa = (Matchar)malloc(sizeof(matchar));
  792.     mappa->colonne = 75;
  793.     mappa->righe = 25;
  794.     mappa->matrice = (char **)malloc(25 * sizeof(char *));
  795.     for(i = 0; i < 75; i++)
  796.         mappa->matrice[i] = (char *)malloc(75 * sizeof(char));
  797.     loadLivello(mappa, "inizio.txt");
  798.     creaGiocatore(eroe);
  799.     return mappa;
  800. }
  801.  
  802. void story(Matchar mappa, Giocatore eroe){
  803.     start(mappa,eroe);
  804. }
  805.  
  806. int battle(Giocatore eroe, Mostro m){
  807.     char *scelte[] = {
  808.         "1. attacca",
  809.         "2. oggetti",
  810.         "3. fuggi"
  811.     };
  812.     char l;
  813.     int c, d, e, i = 0, contr;
  814.     clear();
  815.     printw("Battaglia!\n");
  816.     while(eroe->vita > 0 && m.vita > 0){
  817.         print(scelte,3,i);
  818.         printw("\n\n%s %d/%d\t-\t%s %d\n\n", eroe->nome, eroe->vita, eroe->salute, m.nome, m.vita);
  819.         refresh();
  820.         c = getch();
  821.         switch(c){
  822.             case KEY_DOWN:
  823.                 if((i + 1) > -1 && (i + 1) < 3)
  824.                     i++;
  825.                 break;
  826.             case KEY_UP:
  827.                 if((i - 1) > -1 && (i - 1) < 3)
  828.                     i--;
  829.                 break;
  830.             case 10:
  831.                 switch(i){
  832.                     case 0:
  833.                         e = rand() % 12;
  834.                         printw("%s attacca...\n", eroe->nome);
  835.                         if(e == 0){
  836.                             if(eroe->attacco >= eroe->difesa){
  837.                                 m.vita -= 1;
  838.                                 printw("...fetecchia (attacco scarsissimo)\n");
  839.                             }
  840.                             else
  841.                                 printw("...ma non gli hai fatto un graffio...! (difesa nemica troppo alta)\n");
  842.                         }
  843.                         else if(e == 11){
  844.                             contr = eroe->attacco * 2;
  845.                             if(contr > m.difesa){
  846.                                 m.vita -= (eroe->attacco * 2);
  847.                                 printw("...azz! (danno doppio)\n");
  848.                             }
  849.                             else
  850.                                 printw("...ma non gli hai fatto un graffio...! (difesa nemica troppo alta)\n");
  851.                         }
  852.                         else{
  853.                             contr = ((eroe->attacco * 2) - m.difesa);
  854.                             if(contr > 0)
  855.                                 m.vita -= contr;
  856.                             else
  857.                                 printw("...ma non gli hai fatto un graffio...! (difesa nemica troppo alta)\n");
  858.                         }
  859.                         if(m.vita <= 0)
  860.                             break;
  861.                         e = rand() % 12;
  862.                         printw("%s attacca...\n", m.nome);
  863.                         refresh();
  864.                         if(e == 0){
  865.                             if(m.attacco > eroe->difesa){
  866.                                 eroe->vita -= 1;
  867.                                 printw("...ma si e' distratto facendoti pochissimi danni!\n");
  868.                             }
  869.                             else
  870.                                 printw("...ma sei troppo forte per lui! (difesa piu' alta)\n");
  871.                         }
  872.                         else if(e == 11){
  873.                             contr = m.attacco * 2;
  874.                             if(contr > eroe->difesa){
  875.                                 eroe->vita -= contr;
  876.                                 printw("...e ti ha fatto anche malissimo! (danno doppio)\n");
  877.                             }
  878.                             else
  879.                                 printw("...ma sei troppo forte per lui! (difesa piu' alta)\n");
  880.                         }
  881.                         else{
  882.                             contr = ((m.attacco * 2) - eroe->difesa);
  883.                             if(contr > 0)
  884.                                 eroe->vita -= contr;
  885.                             else
  886.                                 printw("...ma sei troppo forte per lui! (difesa piu' alta)\n");
  887.                         }
  888.                         if(eroe->vita <= 0)
  889.                             break;
  890.                         sleep(2);
  891.                         system("cls");
  892.                         break;
  893.                     case 1:
  894.                         do{
  895.                             clear();
  896.                             printw("Vuoi usare qualcosa? [ 1 si - 2 no ]\n");
  897.                             do{
  898.                                 d = getch();
  899.                                 if(d < 49 || d > 50){
  900.                                     printw("riprova:\n");
  901.                                     refresh();
  902.                                 }
  903.                             }while(d < 49 || d > 50);
  904.                             switch(d){
  905.                                 case 49:
  906.                                     settaEquip(eroe,1);
  907.                                     break;
  908.                                 case 50:
  909.                                     break;
  910.                             }
  911.                         }while(d != 50);
  912.                         clear();
  913.                         break;
  914.                     case 2:
  915.                         printw("GAMBE!\n");
  916.                         printw("Premi un tasto...");
  917.                         refresh();
  918.                         getch();
  919.                         eroe->passi = (rand() % 10) + 10;
  920.                         clear();
  921.                         return 1;
  922.                 }
  923.                 break;
  924.         }
  925.     }
  926.     if(eroe->vita >= 0){
  927.     printw("...e vince!\n");
  928.         printw("Dannies + [ %d ]\nExp + [ %d ]\nOttieni un %s.\n", m.dannies,m.esperienza,m.object.nome);
  929.         eroe->dannies += m.dannies;
  930.         eroe->esperienza += m.esperienza;
  931.         level_up(eroe);
  932.         eroe->inv = addInventario(eroe->inv,m.object);
  933.         refresh();
  934.         getch();
  935.         eroe->passi = (rand() % 10) + 10;
  936.         return 0;
  937.     }
  938.     else{
  939.         printw("...e perdi!!");
  940.         eroe->vita = eroe->salute;
  941.         getch();
  942.         eroe->passi = (rand() % 10) + 10;
  943.         return 1;
  944.     }
  945.     do{
  946.         scanw("%c", &l);
  947.     }while(l == '\n');
  948. }
  949.  
  950. void level_up(Giocatore eroe){
  951.         int c = (eroe->esperienza / 100) + 1;
  952.         if(eroe->livello < 100)
  953.             if(eroe->livello < c){
  954.                 eroe->livello = c;
  955.                 if(eroe->vita < 9999){
  956.                     eroe->vita = eroe->salute += (50 * c);
  957.                     if(eroe->vita > 9999)
  958.                         eroe->vita = 9999;
  959.                 }
  960.                 if(eroe->livello % 2){
  961.                     if(eroe->attacco < 255){
  962.                         eroe->attacco += 3*c;
  963.                         if(eroe->attacco > 255)
  964.                             eroe->attacco = 255;
  965.                     }
  966.                     if(eroe->difesa < 255){
  967.                         eroe->difesa += c;
  968.                         if(eroe->difesa > 255)
  969.                             eroe->difesa = 255;
  970.                     }
  971.                 }
  972.                 else{
  973.                     if(eroe->attacco < 255){
  974.                         eroe->attacco += c;
  975.                         if(eroe->attacco > 255)
  976.                             eroe->attacco = 255;
  977.                     }
  978.                     if(eroe->difesa < 255){
  979.                         eroe->difesa += 3*c;
  980.                         if(eroe->difesa > 255)
  981.                             eroe->difesa = 255;
  982.                     }
  983.                 }
  984.                 printw("Level up! Sali al livello %d!\n", eroe->livello);
  985.             }
  986. }
  987.  
  988. void salva(const Giocatore eroe, const Matchar mappa){
  989.     char app[ML], app1[ML], dir[ML];
  990.     sprintf(dir,"dati\\");
  991.     sprintf(app1,"_%d_x_%d.txt",mappa->righe,mappa->colonne);
  992.     strcpy(app,eroe->nome);
  993.     strcat(app,app1);
  994.     strcat(dir,app);
  995.     FILE *f;
  996.     do{
  997.         f = fopen(dir,"w");
  998.         if(!f)
  999.             mkdir("dati", S_IRWXU | S_IRWXG | S_IROTH | S_IXOTH);
  1000.     }while(!f);
  1001.     fprintf(f,"%s: %d %d %d %d %s: %f %f %d %d\n",
  1002.     eroe->nome,eroe->vita,eroe->salute,eroe->esperienza,eroe->dannies,eroe->classe,eroe->attacco,eroe->difesa,\
  1003.     eroe->progresso,eroe->livello);
  1004.     fprintf(f,"%s:%s:%s\n",eroe->equip->arma->nome,eroe->equip->protezione->nome,eroe->equip->accessorio->nome);
  1005.     salvaInv(eroe->inv,f);
  1006.     saveMatchar(mappa,f);
  1007.     fclose(f);
  1008. }
  1009.  
  1010. Matchar carica(Giocatore eroe, char *nomefile){
  1011.     Matchar mappa = (Matchar)malloc(sizeof(matchar));
  1012.     FILE *f;
  1013.     int x;
  1014.     char app[20];
  1015.     strcpy(app,"./dati/");
  1016.     strcat(app,nomefile);
  1017.     app[strlen(app)-1] = '\0';
  1018.     f = fopen(app,"r");
  1019.     if(f){
  1020.         x = 0;
  1021.         if(eroe ==  NULL){
  1022.             printw("non c'e' alcun eroe!!");
  1023.             refresh();
  1024.         }
  1025.         while(!feof(f)){
  1026.             eroe->nome[x++] = fgetc(f);
  1027.             if(eroe->nome[x-1] == ':'){
  1028.                 break;
  1029.             }
  1030.         }
  1031.         eroe->nome[x-1]='\0';
  1032.         printw("c%sc\n", eroe->nome);
  1033.         fscanf(f,"%d%d%d%d",&(eroe->vita), &(eroe->salute), &(eroe->esperienza),&(eroe->dannies));
  1034.         x = 0;
  1035.         fgetc(f);
  1036.         while(!feof(f)){
  1037.             eroe->classe[x++] = fgetc(f);
  1038.             if(eroe->classe[x-1] == ':'){
  1039.                 break;
  1040.             }
  1041.         }
  1042.         eroe->classe[x-1]='\0';
  1043.         fscanf(f,"%f%f%d%d",&(eroe->attacco),&(eroe->difesa),&(eroe->progresso),&(eroe->livello));
  1044.         fgetc(f);
  1045.         x=0;
  1046.         while(!feof(f)){
  1047.             eroe->equip->arma->nome[x++] = fgetc(f);
  1048.             if(eroe->equip->arma->nome[x-1] == ':'){
  1049.                 break;
  1050.             }
  1051.         }
  1052.         eroe->equip->arma->nome[x-1]='\0';
  1053.         x = 0;
  1054.         while(!feof(f)){
  1055.             eroe->equip->protezione->nome[x++] = fgetc(f);
  1056.             if(eroe->equip->protezione->nome[x-1] == ':'){
  1057.                 break;
  1058.             }
  1059.         }
  1060.         eroe->equip->protezione->nome[x-1]='\0';
  1061.         x = 0;
  1062.         while(!feof(f)){
  1063.             eroe->equip->accessorio->nome[x++] = fgetc(f);
  1064.             if(eroe->equip->accessorio->nome[x-1] == '\n'){
  1065.                 break;
  1066.             }
  1067.         }
  1068.         eroe->equip->accessorio->nome[x-1]='\0';
  1069.         eroe->inv = caricaInv(f);
  1070.         fscanf(f,"%s",eroe->scenario);
  1071.         mappa = loadMatchar(eroe->scenario);
  1072.         printw("\ncont7\n");
  1073.         return mappa;
  1074.     }
  1075.     else{
  1076.         printw("File non trovato!");
  1077.         refresh();
  1078.         return NULL;
  1079.     }
  1080. }
  1081.  
  1082. void creaGiocatore(const Giocatore eroe){
  1083.     char *stringhe[] = {
  1084.         "1. Guerriero","2. Mago","3. Difensore"
  1085.     };
  1086.     int d, i = 0;
  1087.     Oggetto o = {"messaggio di benvenuto",0};
  1088.     Oggetto o1 = {"pozione",4};
  1089.     Oggetto a1 = {"spada di legno lunga",1};
  1090.     Oggetto a2 = {"bacchetta magica corta",1};
  1091.     Oggetto a3 = {"pugnale corto",1};
  1092.     Oggetto p1 = {"armatura di ferro",2};
  1093.     Oggetto p2 = {"mantello corto",2};
  1094.     Oggetto p3 = {"scudo grande di ferro",2};
  1095.     Oggetto s1 = {"scarpe leggere",3};
  1096.     clear();
  1097.     echo();
  1098.     printw("Che nome vuoi?\n> ");
  1099.     refresh();
  1100.     scanw("%[^\n]s", eroe->nome);
  1101.     noecho();
  1102.     eroe->inv = addInventario(eroe->inv,o);
  1103.     i = 0;
  1104.     while(i < 3){
  1105.         eroe->inv = addInventario(eroe->inv,o1);
  1106.         i++;
  1107.     }
  1108.     eroe->progresso = 0;
  1109.     eroe->livello = 1;
  1110.     eroe->vita = 1000;
  1111.     eroe->salute = 1000;
  1112.     eroe->esperienza = 0;
  1113.     eroe->dannies = 0;
  1114.     eroe->boss_sconfitti = 0;
  1115.     strcpy(eroe->equip->arma->nome,"-");
  1116.     strcpy(eroe->equip->protezione->nome,"-");
  1117.     strcpy(eroe->equip->accessorio->nome,"-");
  1118.     i = 0;
  1119.     noecho();
  1120.     print(stringhe,3,i);
  1121.     do{
  1122.         print(stringhe,3,i);
  1123.         d = getch();
  1124.         switch(d){
  1125.             case KEY_DOWN:
  1126.                 if((i + 1) > -1 && (i + 1) < 3)
  1127.                     i++;
  1128.                 break;
  1129.             case KEY_UP:
  1130.                 if((i - 1) > -1 && (i - 1) < 3)
  1131.                     i--;
  1132.                 break;
  1133.             case 10:
  1134.                 switch(i){
  1135.                     case 0:
  1136.                         eroe->inv = addInventario(eroe->inv,a1);
  1137.                         eroe->inv = addInventario(eroe->inv,p1);
  1138.                         eroe->inv = addInventario(eroe->inv,s1);
  1139.                         eroe->attacco = 3;
  1140.                         eroe->difesa = 1;
  1141.                         strcpy(eroe->classe,"Guerriero");
  1142.                         printw("Fatto!\nPremi un tasto per continuare...\n");
  1143.                         refresh();
  1144.                         getch();
  1145.                         break;
  1146.                     case 1:
  1147.                         eroe->inv = addInventario(eroe->inv,a2);
  1148.                         eroe->inv = addInventario(eroe->inv,p2);
  1149.                         eroe->inv = addInventario(eroe->inv,s1);
  1150.                         eroe->attacco = 2;
  1151.                         eroe->difesa = 1;
  1152.                         strcpy(eroe->classe,"Mago");
  1153.                         printw("Fatto!\nPremi un tasto per continuare...\n");
  1154.                         refresh();
  1155.                         getch();
  1156.                         break;
  1157.                     case 2:
  1158.                         eroe->inv = addInventario(eroe->inv,a3);
  1159.                         eroe->inv = addInventario(eroe->inv,p3);
  1160.                         eroe->inv = addInventario(eroe->inv,s1);
  1161.                         eroe->attacco = 1;
  1162.                         eroe->difesa = 3;
  1163.                         strcpy(eroe->classe,"Difensore");
  1164.                         printw("Fatto!\nPremi un tasto per continuare...\n");
  1165.                         refresh();
  1166.                         getch();
  1167.                         break;
  1168.                 }
  1169.                 break;
  1170.         }
  1171.     }while(d != 10);
  1172. }
  1173.  
  1174. void pausa(const Giocatore eroe, const Matchar mappa){
  1175.     int c;
  1176.     clear();
  1177.     do{
  1178.         printw("Nome: [ %s ]\nLivello: [ %d ]\nHP: [ %d / %d]\nClasse: [ %s ]\nAttacco: [ %.0f ]\nDifesa: [ %.0f ]\nExp: [ %d ]\nDannies: [ %d ]\n\n",\
  1179.         eroe->nome, eroe->livello, eroe->vita, eroe->salute, eroe->classe, eroe->attacco, eroe->difesa, eroe->esperienza, eroe->dannies);
  1180.         printw("1) Cambia nome\n2) Usa oggetti\n3) Salva progressi\n4) Ritorna al gioco\n\n");
  1181.         refresh();
  1182.         do{
  1183.             c = getch();
  1184.             if(c < 49 || c > 52){
  1185.                 printw("riprova:\n");
  1186.                 refresh();
  1187.             }
  1188.         }while(c < 49 || c > 52);
  1189.         switch(c){
  1190.             case 49:
  1191.                 settaNome(eroe);
  1192.                 clear();
  1193.                 break;
  1194.             case 50:
  1195.                 settaEquip(eroe,0);
  1196.                 clear();
  1197.                 break;
  1198.             case 51:
  1199.                 salva(eroe, mappa);
  1200.                 clear();
  1201.                 break;
  1202.             case 52:
  1203.                 return;
  1204.         }
  1205.     }while(1);
  1206. }
  1207.  
  1208. void cercaPosizione(Matchar this, Pos *pos){
  1209.     int i, j;
  1210.     for(i = 0; i < this->righe;i++){
  1211.         for(j = 0; j < this->colonne; j++){
  1212.             if(this->matrice[i][j] == '@'){
  1213.                 (pos->x) = j;
  1214.                 (pos->y) = i;
  1215.                 this->matrice[i][j] = ' ';
  1216.                 return;
  1217.             }
  1218.         }
  1219.     }
  1220.     pos->x = pos->y = 0;
  1221. }
  1222.  
  1223. Inventario caricaInv(FILE *f){
  1224.     Inventario inv = NULL;
  1225.     Oggetto obj;
  1226.     int x = 0, c;
  1227.     while(!feof(f)){
  1228.         obj.nome[x++] = fgetc(f);
  1229.         if(obj.nome[x-1] == ':')
  1230.             break;
  1231.         if(obj.nome[x-1] == '\n')
  1232.             return inv;
  1233.     }
  1234.     obj.nome[x-1] = '\0';
  1235.     fscanf(f,"%d",&(obj.tipo));
  1236.     inv = addInventario(inv,obj);
  1237.     while(!feof(f)){
  1238.         x = 0;
  1239.         while(!feof(f)){
  1240.             obj.nome[x++] = fgetc(f);
  1241.             if(obj.nome[x-1] == ':')
  1242.                 break;
  1243.             if(obj.nome[x-1] == '\n')
  1244.                 return inv;
  1245.             if(obj.nome[x-1] == ' ' && (c = x-1) == 0)
  1246.                 x--;
  1247.         }
  1248.         obj.nome[x-1] = '\0';
  1249.         fscanf(f,"%d",&(obj.tipo));
  1250.         inv = addInventario(inv,obj);
  1251.     }
  1252.     return inv;
  1253. }
  1254.  
  1255. void salvaInv(Inventario inv, FILE *f){
  1256.     Inventario app = inv;
  1257.     if(!inv)
  1258.         return;
  1259.     while(app){
  1260.         fprintf(f,"%s: %d ",(app->object).nome,(app->object).tipo);
  1261.         app = app->next;
  1262.     }
  1263.     fprintf(f,"\n");
  1264. }
  1265.  
  1266. int cercaInventario(Inventario inv, char *nome){
  1267.     Inventario app = inv;
  1268.     while(app){
  1269.         if(strcmp((app->object).nome,nome) == 0)
  1270.             return (app->object).tipo;
  1271.         app = app->next;
  1272.     }
  1273.     return -1;
  1274. }
  1275.  
  1276. void settaEquip(const Giocatore eroe, int toggle){
  1277.     int d, heal, oldw, att, def, f, g, i;
  1278.     char **nome = inventString(eroe->inv);
  1279.     int quanti = conta(eroe->inv);
  1280.     Oggetto o;
  1281.     if(!(eroe->equip))
  1282.         printw("Non hai niente addosso...\n");
  1283.     else{
  1284.         printw("Protezione: [ %s ]\nArma: [ %s ]\nAccessorio: [ %s ]\n\n", eroe->equip->protezione->nome, \
  1285.         eroe->equip->arma->nome, eroe->equip->accessorio->nome);
  1286.     }
  1287.     refresh();
  1288.     if((eroe->inv) == NULL)
  1289.         printw("Non hai niente nell'inventario...\n");
  1290.     else{
  1291.         i = 0;
  1292.         do{
  1293.             print2(nome,quanti,i);
  1294.             move(7,0);
  1295.             printw("\nSU | GIU' o F1 per uscire\n");
  1296.             refresh();
  1297.             g = getch();
  1298.             switch(g){
  1299.                 case KEY_DOWN:
  1300.                     if((i + 1) > -1 && (i + 1) < quanti)
  1301.                         i++;
  1302.                     break;
  1303.                 case KEY_UP:
  1304.                     if((i - 1) > -1 && (i - 1) < quanti)
  1305.                         i--;
  1306.                     break;
  1307.                 case 10:
  1308.                 d = cercaInventario(eroe->inv,nome[i]);
  1309.                 switch(d){
  1310.                     case 0:
  1311.                         printw("[ %s ]\nPremi un tasto...", nome[i]);
  1312.                         refresh();
  1313.                         getch();
  1314.                         clear();
  1315.                         break;
  1316.                     case 1:
  1317.                         printw("E' un'arma: vuoi equipaggiarla? [ 1 si - 2 no ]\n");
  1318.                         do{
  1319.                             f = getch();
  1320.                             if(f < 49 || f > 50){
  1321.                                 printw("riprova:");
  1322.                                 refresh();
  1323.                             }
  1324.                         }while(f < 49 || f > 50);
  1325.                         switch(f){
  1326.                             case 49:
  1327.                                 if(eroe->equip != NULL){
  1328.                                     if(strcmp(eroe->equip->arma->nome,"-") != 0){
  1329.                                         oldw = cercaArma(armi,eroe->equip->arma->nome);
  1330.                                         eroe->attacco -= oldw;
  1331.                                     }
  1332.                                     strcpy(o.nome,eroe->equip->arma->nome);
  1333.                                     o.tipo = d;
  1334.                                     eroe->inv = addInventario(eroe->inv,o);
  1335.                                     heal = cercaArma(armi,nome[i]);
  1336.                                     eroe->attacco += heal;
  1337.                                     strcpy(eroe->equip->arma->nome,nome[i]);
  1338.                                     rimuoviOggetto(eroe->inv,nome[i]);
  1339.                                 }
  1340.                                 else{
  1341.                                     eroe->equip = (Equipaggiamento)malloc(sizeof(equipaggiamento));
  1342.                                     eroe->equip->arma = (Arma)malloc(sizeof(arma));
  1343.                                     heal = cercaArma(armi,nome[i]);
  1344.                                     eroe->attacco += heal;
  1345.                                     strcpy(eroe->equip->arma->nome,nome[i]);
  1346.                                     rimuoviOggetto(eroe->inv,nome[i]);
  1347.                                 }
  1348.                                 clear();
  1349.                                 break;
  1350.                             case 50:
  1351.                                 break;
  1352.                         }
  1353.                         break;
  1354.                     case 2:
  1355.                         printw("E' una protezione: vuoi equipaggiarla? [ 1  si - 2 no ]\n");
  1356.                         do{
  1357.                             f = getch();
  1358.                             if(f < 49 || f > 50){
  1359.                                 printw("riprova:");
  1360.                                 refresh();
  1361.                             }
  1362.                         }while(f < 49 || f > 50);
  1363.                         switch(f){
  1364.                             case 49:
  1365.                                 if(eroe->equip != NULL){
  1366.                                     if(strcmp(eroe->equip->protezione->nome,"-") != 0){
  1367.                                         oldw = cercaProtezione(protezioni,eroe->equip->protezione->nome);
  1368.                                         eroe->difesa -= oldw;
  1369.                                     }
  1370.                                     strcpy(o.nome,eroe->equip->protezione->nome);
  1371.                                     o.tipo = d;
  1372.                                     eroe->inv = addInventario(eroe->inv,o);
  1373.                                     heal = cercaProtezione(protezioni,nome[i]);
  1374.                                     eroe->difesa += heal;
  1375.                                     strcpy(eroe->equip->protezione->nome,nome[i]);
  1376.                                     rimuoviOggetto(eroe->inv,nome[i]);
  1377.                                 }
  1378.                                 else{
  1379.                                     eroe->equip = (Equipaggiamento)malloc(sizeof(equipaggiamento));
  1380.                                     eroe->equip->protezione = (Protezione)malloc(sizeof(protezione));
  1381.                                     heal = cercaProtezione(protezioni,nome[i]);
  1382.                                     eroe->difesa += heal;
  1383.                                     strcpy(eroe->equip->protezione->nome,nome[i]);
  1384.                                     rimuoviOggetto(eroe->inv,nome[i]);
  1385.                                 }
  1386.                                 clear();
  1387.                                 break;
  1388.                             case 50:
  1389.                                 break;
  1390.                         }
  1391.                         break;
  1392.                     case 3:
  1393.                         printw("E' un accessorio: vuoi equipaggiarlo? [ 1 si - 2 no ]\n");
  1394.                         do{
  1395.                             f = getch();
  1396.                             if(f < 49 || f > 50){
  1397.                                 printw("riprova:");
  1398.                                 refresh();
  1399.                             }
  1400.                         }while(f < 49 || f > 50);
  1401.                         switch(f){
  1402.                             case 49:
  1403.                                 if(eroe->equip != NULL){
  1404.                                     if(strcmp(eroe->equip->accessorio->nome,"-") != 0){
  1405.                                         cercaAccessorio(accessori,eroe->equip->accessorio->nome,&att,&def);
  1406.                                         eroe->attacco -= att;
  1407.                                         eroe->difesa -= def;
  1408.                                     }
  1409.                                     strcpy(o.nome,eroe->equip->accessorio->nome);
  1410.                                     o.tipo = d;
  1411.                                     eroe->inv = addInventario(eroe->inv,o);
  1412.                                     cercaAccessorio(accessori,nome[i],&att,&def);
  1413.                                     eroe->attacco += att;
  1414.                                     eroe->difesa += def;
  1415.                                     strcpy(eroe->equip->accessorio->nome,nome[i]);
  1416.                                     rimuoviOggetto(eroe->inv,nome[i]);
  1417.                                 }
  1418.                                 else{
  1419.                                     eroe->equip = (Equipaggiamento)malloc(sizeof(equipaggiamento));
  1420.                                     eroe->equip->accessorio = (Accessorio)malloc(sizeof(accessorio));
  1421.                                     cercaAccessorio(accessori,nome[i],&att,&def);
  1422.                                     eroe->attacco += att;
  1423.                                     eroe->difesa += def;
  1424.                                     strcpy(eroe->equip->accessorio->nome,nome[i]);
  1425.                                     rimuoviOggetto(eroe->inv,nome[i]);
  1426.                                 }
  1427.                                 clear();
  1428.                                 break;
  1429.                             case 50:
  1430.                                 break;
  1431.                         }
  1432.                         break;
  1433.                     case 4:
  1434.                         if(eroe->vita == eroe->salute)
  1435.                             printw("Salute al massimo!\n");
  1436.                         else{
  1437.                             eroe->inv = rimuoviOggetto(eroe->inv,nome[i]);
  1438.                             heal = cercaCura(cure,nome[i]);
  1439.                             if((eroe->salute - eroe->vita) > heal)
  1440.                                 eroe->vita +=heal;
  1441.                             else
  1442.                                 eroe->vita += (eroe->salute - eroe->vita);
  1443.                         }
  1444.                         printw("Premi un tasto...");
  1445.                         refresh();
  1446.                         getch();
  1447.                         clear();
  1448.                         break;
  1449.                     default:
  1450.                         printw("Oggetto appena usato!\n");
  1451.                         refresh();
  1452.                         getch();
  1453.                         break;
  1454.                 }
  1455.                 break;
  1456.             }
  1457.         }while(g != KEY_F(1));
  1458.     }
  1459. }
  1460.  
  1461. Inventario rimuoviOggetto(Inventario top, char *nome) {
  1462.     Inventario tmp;
  1463.     if (top != NULL){
  1464.         if (strcmp((top->object).nome,nome) == 0) {
  1465.             tmp = top->next;
  1466.             free(top);
  1467.             top = NULL;
  1468.             top=tmp;
  1469.         }
  1470.         else
  1471.             top->next = rimuoviOggetto(top->next,nome);
  1472.     }
  1473.     return top;
  1474. }
  1475.  
  1476. int cercaCura(Cura *cura, char *nome){
  1477.     int i;
  1478.     for(i = 0; i < M_CURE; i++){
  1479.         if(strcmp(cura[i].nome,nome) == 0)
  1480.             return cura[i].vita;
  1481.     }
  1482.     return -1;
  1483. }
  1484.  
  1485. int cercaArma(arma *weapon, char *nome){
  1486.     int i;
  1487.     for(i = 0; i < M_ARMI; i++){
  1488.         if(strcmp(weapon[i].nome,nome) == 0)
  1489.             return weapon[i].attacco;
  1490.     }
  1491.     return -1;
  1492. }
  1493.  
  1494. int cercaProtezione(protezione *prot, char *nome){
  1495.     int i;
  1496.     for(i = 0; i < M_PROT; i++){
  1497.         if(strcmp(prot[i].nome,nome) == 0)
  1498.             return prot[i].difesa;
  1499.     }
  1500.     return -1;
  1501. }
  1502.  
  1503. void cercaAccessorio(accessorio *acc, char *nome, int *atk, int *def){
  1504.     int i;
  1505.     for(i = 0; i < M_ACC; i++){
  1506.         if(strcmp(acc[i].nome,nome) == 0){
  1507.             *atk = acc[i].attacco;
  1508.             *def = acc[i].difesa;
  1509.             break;
  1510.         }
  1511.     }
  1512. }
  1513.  
  1514. void mappaMostri(Matchar this){
  1515.     int i, c, d;
  1516.     for(i = 0; i < (this->righe * this->colonne) / 5; i++){
  1517.         c = rand() % this->righe;
  1518.         d = rand() % this->colonne;
  1519.         if(this->matrice[c][d] == ' ')
  1520.             this->matrice[c][d] = 'm';
  1521.     }
  1522.     this->matrice[this->righe - 1][this->colonne - 1] = 'M';
  1523. }
  1524.  
  1525. void mappaOggetti(Matchar this){
  1526.     int i, c, d, e;
  1527.     for(i = 0; i < (this->righe * this->colonne) / 5; i++){
  1528.         c = rand() % this->righe;
  1529.         d = rand() % this->colonne;
  1530.         if(this->matrice[c][d] == 94){
  1531.             e = rand() % 2;
  1532.             if(e == 0)
  1533.                 this->matrice[c][d] = '.';
  1534.             else if(e == 1)
  1535.                 this->matrice[c][d] = ',';
  1536.         }
  1537.     }
  1538. }
  1539.  
  1540. int leggiInventario(Inventario inv, int toggle){
  1541.     Inventario app = inv;
  1542.     int i = 1, c = 0, atk, def;
  1543.     if(toggle == 0){
  1544.         while(app){
  1545.             if(strcmp((app->object).nome,"-") == 0){
  1546.                 app = app->next;
  1547.                 continue;
  1548.             }
  1549.             else{
  1550.                 printw("%d) %s - ", i, (app->object).nome);
  1551.                 if((app->object).tipo == 0)
  1552.                     printw("Oggetto\n");
  1553.                 else if((app->object).tipo == 1){
  1554.                     printw("Arma [ attacco + %d ]\n", cercaArma(armi,(app->object).nome));
  1555.                     c++;
  1556.                 }
  1557.                 else if((app->object).tipo == 2){
  1558.                     printw("Protezione [ difesa + %d ]\n", cercaProtezione(protezioni,(app->object).nome));
  1559.                     c++;
  1560.                 }
  1561.                 else if((app->object).tipo == 3){
  1562.                     cercaAccessorio(accessori,(app->object).nome,&atk,&def);
  1563.                     printw("Accessorio [ attacco + %d | difesa + %d ]\n", atk, def);
  1564.                     c++;
  1565.                 }
  1566.                 else if((app->object).tipo == 4){
  1567.                     printw("Cura [ salute + %d ]\n", cercaCura(cure,(app->object).nome));
  1568.                 }
  1569.                 app = app->next;
  1570.                 i++;
  1571.                 refresh();
  1572.             }
  1573.         }
  1574.     }
  1575.     else if(toggle == 1){
  1576.         while(app){
  1577.             if((app->object).tipo == 4){
  1578.                 printw("%d) %s - ", i, (app->object).nome);
  1579.                 printw("Cura [ salute + %d ]\n", cercaCura(cure,(app->object).nome));
  1580.                 i++;
  1581.             }
  1582.             app = app->next;
  1583.             refresh();
  1584.         }
  1585.     }
  1586.     return c;
  1587. }
  1588.  
  1589. Inventario addInventario(Inventario inv, Oggetto object){
  1590.     Inventario new = (Inventario)malloc(sizeof(inventario));
  1591.     strcpy((new->object).nome,object.nome);
  1592.     (new->object).tipo = object.tipo;
  1593.     new->next = inv;
  1594.     return new;
  1595. }
  1596.  
  1597.  
  1598. void print(char **stringhe, int quanti, int quale){
  1599.     int i;
  1600.     clear();
  1601.     printw("Scegli:\n\n");
  1602.     for(i = 0; i < quanti; i++){
  1603.         if(i == quale){
  1604.             attron(COLOR_PAIR(1));
  1605.             printw(" > %s\n",stringhe[i]);
  1606.             attroff(COLOR_PAIR(1));
  1607.             continue;
  1608.         }
  1609.         printw(" > %s\n", stringhe[i]);
  1610.     }
  1611.     refresh();
  1612. }
  1613.  
  1614. Giocatore newGiocatore(){
  1615.     Giocatore new = (Giocatore)malloc(sizeof(giocatore));
  1616.     new->equip = (Equipaggiamento)malloc(sizeof(equipaggiamento));
  1617.     new->equip->arma = (Arma)malloc(sizeof(arma));
  1618.     new->equip->accessorio = (Accessorio)malloc(sizeof(accessorio));
  1619.     new->equip->protezione = (Protezione)malloc(sizeof(protezione));
  1620.     new->inv = NULL;
  1621.     return new;
  1622. }
  1623.  
  1624.  
  1625. void settaNome(const Giocatore eroe){
  1626.     printw("Il tuo nome attuale e' [ %s ]\n\n", eroe->nome);
  1627.     printw("Che nome vuoi?\n> ");
  1628.     echo();
  1629.     scanw("%[^\n]s", eroe->nome);
  1630.     noecho();
  1631. }
  1632.  
  1633. void printFile(const char *filename){
  1634.     FILE *f = fopen(filename,"r");
  1635.     char c;
  1636.     while(!feof(f)){
  1637.         c = fgetc(f);
  1638.         if(c == EOF)
  1639.             break;
  1640.         printf("%c",c);
  1641.     }
  1642.     fclose(f);
  1643. }
  1644.  
  1645. void loadLivello(Matchar this, char *nomeScena){
  1646.     int i, j;
  1647.     char c;
  1648.     strcpy(this->scenario,nomeScena);
  1649.     FILE *f = fopen(nomeScena,"r");
  1650.     if(f){
  1651.         for(i = 0; i < this->righe; i++){
  1652.             for(j = 0; j < this->colonne; j++)
  1653.                 fscanf(f,"%c", &(this->matrice[i][j]));
  1654.             fscanf(f,"%c", &c);
  1655.         }
  1656.         fclose(f);
  1657.     }
  1658.     else{
  1659.         printw("OPS!");
  1660.         refresh();
  1661.         getch();
  1662.     }
  1663. }
  1664.  
  1665. void negozio(Giocatore eroe, Matchar this){
  1666.     char *neg1[] = {"1. Pozione - cura [ 50 d ]","2. Granpozione - cura [ 100 d ]","3. Spada di ferro corta [ 150 d ]","4. Spada di ferro media [ 50 d ]","5. Nunchaku [ 50 d ]","6. Daga [ 50 d ]","7. Scudo grande di ferro [ 50 d ]","8. Armatura di acciaio [ 50 d ]","9. Cappa corta incantata [ 50 d ]","10. Scudo grande d'oro [ 50 d ]"};
  1667.     char *neg2[] = {"1. Extrapozione - cura [ 250 d ]","2. Midelisir - cura [ 400 d ]","3. Elisir - cura [ 1000 d ]"};
  1668.     int c, i = 0;
  1669.     Oggetto o;
  1670.     if(strcmp(this->scenario,"inizio.txt") == 0){
  1671.         refresh();
  1672.         print(neg1,2,i);
  1673.         printw("\n\n:- NEGOZIO -:\n\nDANNIES : %d\n\nSU | GIU' o F1 per uscire\n\n", eroe->dannies);
  1674.         while((c = getch()) != KEY_F(1)){
  1675.             switch(c){
  1676.                 case KEY_DOWN:
  1677.                     if((i + 1) > -1 && (i + 1) < 2)
  1678.                         i++;
  1679.                     refresh();
  1680.                     print(neg1,2,i);
  1681.                     printw("\n\n:- NEGOZIO -:\n\nDANNIES : %d\n\nSU | GIU' o F1 per uscire\n\n", eroe->dannies);
  1682.                     break;
  1683.                 case KEY_UP:
  1684.                     if((i - 1) > -1 && (i - 1) < 2)
  1685.                         i--;
  1686.                     refresh();
  1687.                     print(neg1,2,i);
  1688.                     printw("\n\n:- NEGOZIO -:\n\nDANNIES : %d\n\nSU | GIU' o F1 per uscire\n\n", eroe->dannies);
  1689.                     break;
  1690.                 case 10:
  1691.                     switch(i){
  1692.                         case 0:
  1693.                             if(eroe->dannies < 50){
  1694.                                 printw("Soldi non sufficienti!\n");
  1695.                                 refresh();
  1696.                                 getch();
  1697.                             }
  1698.                             else{
  1699.                                 eroe->dannies -= 50;
  1700.                                 strcpy(o.nome,"pozione");
  1701.                                 o.tipo = 4;
  1702.                                 eroe->inv = addInventario(eroe->inv,o);
  1703.                                 printw("Preso!\n");
  1704.                                 refresh();
  1705.                                 getch();
  1706.                             }
  1707.                             break;
  1708.                         case 1:
  1709.                             if(eroe->dannies < 100){
  1710.                                 printw("Soldi non sufficienti!\n");
  1711.                                 refresh();
  1712.                                 getch();
  1713.                             }
  1714.                             else{
  1715.                                 eroe->dannies -= 100;
  1716.                                 strcpy(o.nome,"granpozione");
  1717.                                 o.tipo = 4;
  1718.                                 eroe->inv = addInventario(eroe->inv,o);
  1719.                                 printw("Preso!\n");
  1720.                                 refresh();
  1721.                                 getch();
  1722.                             }
  1723.                             break;
  1724.                         case 2:
  1725.                             if(eroe->dannies < 50){
  1726.                                 printw("Soldi non sufficienti!\n");
  1727.                                 refresh();
  1728.                                 getch();
  1729.                             }
  1730.                             break;
  1731.                         case 3:
  1732.                             if(eroe->dannies < 50){
  1733.                                 printw("Soldi non sufficienti!\n");
  1734.                                 refresh();
  1735.                                 getch();
  1736.                             }
  1737.                             break;
  1738.                         case 4:
  1739.                             if(eroe->dannies < 50){
  1740.                                 printw("Soldi non sufficienti!\n");
  1741.                                 refresh();
  1742.                                 getch();
  1743.                             }
  1744.                             break;
  1745.                         case 5:
  1746.                             if(eroe->dannies < 50){
  1747.                                 printw("Soldi non sufficienti!\n");
  1748.                                 refresh();
  1749.                                 getch();
  1750.                             }
  1751.                             break;
  1752.                         case 6:
  1753.                             if(eroe->dannies < 50){
  1754.                                 printw("Soldi non sufficienti!\n");
  1755.                                 refresh();
  1756.                                 getch();
  1757.                             }
  1758.                             break;
  1759.                         case 7:
  1760.                             if(eroe->dannies < 50){
  1761.                                 printw("Soldi non sufficienti!\n");
  1762.                                 refresh();
  1763.                                 getch();
  1764.                             }
  1765.                             break;
  1766.                         case 8:
  1767.                             if(eroe->dannies < 50){
  1768.                                 printw("Soldi non sufficienti!\n");
  1769.                                 refresh();
  1770.                                 getch();
  1771.                             }
  1772.                             break;
  1773.                         case 9:
  1774.                             if(eroe->dannies < 50){
  1775.                                 printw("Soldi non sufficienti!\n");
  1776.                                 refresh();
  1777.                                 getch();
  1778.                             }
  1779.                             break;
  1780.                     }
  1781.             }
  1782.         }
  1783.     }
  1784.     else{
  1785.         refresh();
  1786.         print(neg2,3,i);
  1787.         printw("\n\n:- NEGOZIO -:\n\nDANNIES : %d\n\nSU | GIU' o F1 per uscire\n\n", eroe->dannies);
  1788.         while((c = getch()) != KEY_F(1)){
  1789.             switch(c){
  1790.                 case KEY_DOWN:
  1791.                     if((i + 1) > -1 && (i + 1) < 3)
  1792.                         i++;
  1793.                     refresh();
  1794.                     print(neg2,3,i);
  1795.                     printw("\n\n:- NEGOZIO -:\n\nDANNIES : %d\n\nSU | GIU' o F1 per uscire\n\n", eroe->dannies);
  1796.                     break;
  1797.                 case KEY_UP:
  1798.                     if((i - 1) > -1 && (i - 1) < 3)
  1799.                         i--;
  1800.                     refresh();
  1801.                     print(neg2,3,i);
  1802.                     printw("\n\n:- NEGOZIO -:\n\nDANNIES : %d\n\nSU | GIU' o F1 per uscire\n\n", eroe->dannies);
  1803.                     break;
  1804.                 case 10:
  1805.                     switch(i){
  1806.                         case 0:
  1807.                             if(eroe->dannies < 250){
  1808.                                 printw("Soldi non sufficienti!\n");
  1809.                                 refresh();
  1810.                                 getch();
  1811.                             }
  1812.                             else{
  1813.                                 eroe->dannies -= 250;
  1814.                                 strcpy(o.nome,"extrapozione");
  1815.                                 o.tipo = 4;
  1816.                                 eroe->inv = addInventario(eroe->inv,o);
  1817.                                 printw("Preso!\n");
  1818.                                 refresh();
  1819.                                 getch();
  1820.                             }
  1821.                             break;
  1822.                         case 1:
  1823.                             if(eroe->dannies < 400){
  1824.                                 printw("Soldi non sufficienti!\n");
  1825.                                 refresh();
  1826.                                 getch();
  1827.                             }
  1828.                             else{
  1829.                                 eroe->dannies -= 400;
  1830.                                 strcpy(o.nome,"midelisir");
  1831.                                 o.tipo = 4;
  1832.                                 eroe->inv = addInventario(eroe->inv,o);
  1833.                                 printw("Preso!\n");
  1834.                                 refresh();
  1835.                                 getch();
  1836.                             }
  1837.                             break;
  1838.                         case 2:
  1839.                             if(eroe->dannies < 1000){
  1840.                                 printw("Soldi non sufficienti!\n");
  1841.                                 refresh();
  1842.                                 getch();
  1843.                             }
  1844.                             else{
  1845.                                 eroe->dannies -= 1000;
  1846.                                 strcpy(o.nome,"elisir");
  1847.                                 o.tipo = 4;
  1848.                                 eroe->inv = addInventario(eroe->inv,o);
  1849.                                 printw("Preso!\n");
  1850.                                 refresh();
  1851.                                 getch();
  1852.                             }
  1853.                             break;
  1854.                     }
  1855.                     break;
  1856.             }
  1857.         }
  1858.     }
  1859. }
  1860.  
  1861. char **inventString(Inventario inv){
  1862.     Inventario app = inv;
  1863.     char **strings;
  1864.     int i, cont = 0;
  1865.     while(app){
  1866.         cont++;
  1867.         app = app->next;
  1868.     }
  1869.     app = inv;
  1870.     strings = (char **)malloc(cont * sizeof(char *));
  1871.     for(i = 0; i < cont; i++){
  1872.         strings[i] = (char *)malloc(ML * sizeof(char));
  1873.     }
  1874.     i = 0;
  1875.     while(app){
  1876.         if(strcmp((app->object).nome,"-") != 0)
  1877.             strcpy(strings[i++],(app->object).nome);
  1878.         app = app->next;
  1879.     }
  1880.     return strings;
  1881. }
  1882.  
  1883. int conta(Inventario inv){
  1884.     int i = 0;
  1885.     Inventario app = inv;
  1886.     while(app){
  1887.         if(strcmp((app->object).nome,"-") != 0)
  1888.             i++;
  1889.         app = app->next;
  1890.     }
  1891.     return i;
  1892. }
  1893.  
  1894. void cercaPng1(Matchar this, Pos *coord){
  1895.     int i, j;
  1896.     for(i = 0; i < this->righe; i++)
  1897.         for(j = 0; j < this->colonne; j++)
  1898.             if(this->matrice[i][j] == 'g'){
  1899.                 coord->x = j;
  1900.                 coord->y = i;
  1901.                 this->matrice[i][j] = ' ';
  1902.                 return;
  1903.             }
  1904. }
  1905.  
  1906. Punti singolo(Pos pos){
  1907.     Punti a = (Punti)malloc(sizeof(punti));
  1908.     a->pos = pos;
  1909.     a->next = NULL;
  1910.     return a;
  1911. }
  1912.  
  1913. Punti addCoda(Punti old, Pos pos){
  1914.     if(!old)
  1915.         return singolo(pos);
  1916.     else
  1917.         old->next = addCoda(old->next,pos);
  1918.     return old;
  1919. }
  1920.  
  1921. Punti moveMonster(Matchar ok, Pos then){
  1922.     Punti a = singolo(then);
  1923.     then.x += 1;
  1924. //    if(then.x > ok->colonne)
  1925. //        then.x = then.x - ok->colonne;
  1926.     a = addCoda(a,then);
  1927.     then.x += 1;
  1928. //    if(then.x > ok->colonne)
  1929. //        then.x = then.x - ok->colonne;
  1930.     a = addCoda(a,then);
  1931.     then.x -= 1;
  1932. //    if(then.x < 0)
  1933. //        then.x = ok->colonne + then.x;
  1934.     a = addCoda(a,then);
  1935.     then.x -= 1;
  1936. //    if(then.x < 0)
  1937. //        then.x = ok->colonne + then.x;
  1938.     a = addCoda(a,then);
  1939.     then.y += 1;
  1940. //    if(then.y > ok->righe)
  1941. //        then.y = then.y - ok->righe;
  1942.     a = addCoda(a,then);
  1943.     then.y += 1;
  1944. //    if(then.y > ok->righe)
  1945. //        then.y = then.y - ok->righe;
  1946.     a = addCoda(a,then);
  1947.     then.y -= 1;
  1948. //    if(then.y < 0)
  1949. //        then.y = ok->righe + then.y;
  1950.     a = addCoda(a,then);
  1951.     then.y -= 1;
  1952. //    if(then.y < 0)
  1953. //        then.y = ok->righe + then.y;
  1954.     a = addCoda(a,then);
  1955.     then.x -= 1;
  1956. //    if(then.x < 0)
  1957. //        then.x = ok->colonne + then.x;
  1958.     a = addCoda(a,then);
  1959.     then.x -= 1;
  1960. //    if(then.x < 0)
  1961. //        then.x = ok->colonne + then.x;
  1962.     a = addCoda(a,then);
  1963.     then.x += 1;
  1964. //    if(then.x > ok->colonne)
  1965. //        then.x = then.x - ok->colonne;
  1966.     a = addCoda(a,then);
  1967.     then.x += 1;
  1968. //    if(then.x > ok->colonne)
  1969. //        then.x = then.x - ok->colonne;
  1970.     a = addCoda(a,then);
  1971.     then.y -= 1;
  1972. //    if(then.y < 0)
  1973. //        then.y = ok->righe + then.y;
  1974.     a = addCoda(a,then);
  1975.     then.y -= 1;
  1976. //    if(then.y < 0)
  1977. //        then.y = ok->righe + then.y;
  1978.     a = addCoda(a,then);
  1979.     then.y += 1;
  1980. //    if(then.y > ok->righe)
  1981. //        then.y = then.y - ok->righe;
  1982.     a = addCoda(a,then);
  1983.     then.y += 1;
  1984. //    if(then.y > ok->righe)
  1985. //        then.y = then.y - ok->righe;
  1986.     a = addCoda(a,then);
  1987.     return a;
  1988. }
  1989.  
  1990. Punti removeTesta(Punti a, Pos *then){
  1991.     if(a){
  1992.         then->x = (a->pos).x;
  1993.         then->y = (a->pos).y;
  1994.         a = a->next;
  1995.     }
  1996.     return a;
  1997. }
  1998.  
  1999. Punti freePunti(Punti old){
  2000.     if(old){
  2001.         old->next = freePunti(old->next);
  2002.         free(old);
  2003.         old = NULL;
  2004.     }
  2005.     return old;
  2006. }
  2007.  
  2008. void print2(char **stringhe, int quante, int quale){
  2009.     int i;
  2010.     clear();
  2011.     printw("Scegli un oggetto:\n\n");
  2012.     for(i = quale; i < quale + 5; i++){
  2013.         if(i == quale){
  2014.             attron(COLOR_PAIR(1));
  2015.             printw("%d. %s\n", i + 1, stringhe[i]);
  2016.             attroff(COLOR_PAIR(1));
  2017.             continue;
  2018.         }
  2019.         else if(i == quante)
  2020.             break;
  2021.         printw("%d. %s\n", i + 1, stringhe[i]);
  2022.     }
  2023.     refresh();
  2024. }
  2025.  
  2026. void parla(Matchar this, Giocatore eroe){
  2027.     char *scelte[] = {"Si","No"};
  2028.     int c, i = 0, v;
  2029.     if(strcmp(this->scenario,"inizio.txt") == 0){
  2030.         printw("Ciao! Vuoi sentire una storia?");
  2031.         refresh();
  2032.         getch();
  2033.         while(1){
  2034.             print(scelte,2,i);
  2035.             c = getch();
  2036.             switch(c){
  2037.                 case KEY_UP:
  2038.                     i--;
  2039.                     if(i < 0)
  2040.                         i = 1;
  2041.                     break;
  2042.                 case KEY_DOWN:
  2043.                     i++;
  2044.                     if(i == 2)
  2045.                         i = 0;
  2046.                     break;
  2047.                 case 10:
  2048.                     switch(i){
  2049.                         case 1:
  2050.                             printw("Vabbe', ciao allora :-\\");
  2051.                             refresh();
  2052.                             getch();
  2053.                             break;
  2054.                         case 0:
  2055.                             printw("LOL no!! :^D");
  2056.                             refresh();
  2057.                             getch();
  2058.                             break;
  2059.                     }
  2060.                     return;
  2061.             }
  2062.         }
  2063.     }
  2064.     else{
  2065.         printw("Cerchi rogne?!");
  2066.         refresh();
  2067.         getch();
  2068.         while(1){
  2069.             print(scelte,2,i);
  2070.             c = getch();
  2071.             switch(c){
  2072.                 case KEY_UP:
  2073.                     i--;
  2074.                     if(i < 0)
  2075.                         i = 1;
  2076.                     break;
  2077.                 case KEY_DOWN:
  2078.                     i++;
  2079.                     if(i == 2)
  2080.                         i = 0;
  2081.                     break;
  2082.                 case 10:
  2083.                     switch(i){
  2084.                         case 0:
  2085.                             printw("LE AVRAI!!");
  2086.                             refresh();
  2087.                             getch();
  2088.                             v = battle(eroe,boss[3]);
  2089.                             clear();
  2090.                             if(v == 1){
  2091.                                 printw("Pfff...pivello!!");
  2092.                                 refresh();
  2093.                                 getch();
  2094.                             }
  2095.                             else{
  2096.                                 printw("\n\nMmh...sei forte...VABBEH...");
  2097.                                 refresh();
  2098.                                 getch();
  2099.                             }
  2100.                             break;
  2101.                         case 1:
  2102.                             printw("MEGLIO PER TE!!");
  2103.                             refresh();
  2104.                             getch();
  2105.                             break;
  2106.                     }
  2107.                     return;
  2108.             }
  2109.         }
  2110.     }
  2111. }
  2112.  
  2113. // UTILITY.H //
  2114.  
  2115. #ifndef HEADER_240D4408939FB0C2
  2116. #define HEADER_240D4408939FB0C2
  2117.  
  2118. #include <stdio.h>
  2119. #include <stdlib.h>
  2120. #include <string.h>
  2121. #include <time.h>
  2122. #include <unistd.h>
  2123. #include <fcntl.h>
  2124. #include <signal.h>
  2125. #include <string.h>
  2126. #include <sys/types.h>
  2127. #include <sys/stat.h>
  2128. #include <dirent.h>
  2129. #include <curses.h>
  2130. #include <math.h>
  2131.  
  2132. #define M_ARMI 13
  2133. #define M_PROT 13
  2134. #define M_ACC 13
  2135. #define M_CURE 5
  2136. #define M_MOSTRI 12
  2137. #define ML 1024
  2138.  
  2139. typedef struct matrice matrice;
  2140. typedef matrice *Matrice;
  2141. typedef struct matchar matchar;
  2142. typedef matchar *Matchar;
  2143. typedef struct posizione Pos;
  2144.  
  2145. typedef struct giocatore giocatore;
  2146. typedef giocatore *Giocatore;
  2147. typedef struct equipaggiamento equipaggiamento;
  2148. typedef equipaggiamento *Equipaggiamento;
  2149. typedef struct inventario inventario;
  2150. typedef inventario *Inventario;
  2151. typedef struct protezione protezione;
  2152. typedef protezione *Protezione;
  2153. typedef struct arma arma;
  2154. typedef arma *Arma;
  2155. typedef struct accessorio accessorio;
  2156. typedef accessorio *Accessorio;
  2157. typedef struct mostro Mostro;
  2158. typedef struct oggetto Oggetto;
  2159. typedef struct cura Cura;
  2160. typedef struct listaPunti punti;
  2161. typedef punti *Punti;
  2162.  
  2163. struct oggetto{
  2164.     char nome[ML];
  2165.     int tipo;
  2166. };
  2167.  
  2168. struct cura{
  2169.     char nome[ML];
  2170.     int vita;
  2171. };
  2172.  
  2173. struct protezione{
  2174.     char nome[ML];
  2175.     int difesa;
  2176. };
  2177.  
  2178. struct arma{
  2179.     char nome[ML];
  2180.     int attacco;
  2181. };
  2182.  
  2183.  struct accessorio{
  2184.     char nome[ML];
  2185.     int attacco;
  2186.     int difesa;
  2187. };
  2188.  
  2189. struct equipaggiamento{
  2190.     Protezione protezione;
  2191.     Arma arma;
  2192.     Accessorio accessorio;
  2193. };
  2194.  
  2195. struct giocatore{
  2196.     char nome[ML];
  2197.     char scenario[ML];
  2198.     int vita;
  2199.     int salute;
  2200.     int esperienza;
  2201.     int dannies;
  2202.     char classe[ML];
  2203.     float attacco;
  2204.     float difesa;
  2205.     int progresso;
  2206.     int livello;
  2207.     int passi;
  2208.     int boss_sconfitti;
  2209.     Equipaggiamento equip;
  2210.     Inventario inv;
  2211. };
  2212.  
  2213. struct inventario{
  2214.     Oggetto object;
  2215.     struct inventario *next;
  2216. };
  2217.  
  2218. struct mostro{
  2219.     char nome[ML];
  2220.     int vita;
  2221.     int attacco;
  2222.     int difesa;
  2223.     int esperienza;
  2224.     int dannies;
  2225.     Oggetto object;
  2226. };
  2227.  
  2228.  
  2229. Giocatore newGiocatore();
  2230.  
  2231. void settaNome(const Giocatore eroe);
  2232.  
  2233. void start();
  2234.  
  2235. /* funzione di input per gli interi con controllo degli errori
  2236.    pre: richiesta di acquisizione di un intero
  2237.    post: viene restituito effettivamente un intero
  2238. */
  2239. int inputInt();
  2240.  
  2241. void printFile(const char *filename);
  2242.  
  2243. /* funzione di scelta di un opzione
  2244.    pre: richiesta di scelta di un intero nell'intervallo [min, max]
  2245.    post: viene restituito un intero all'interno dell'intervallo [min, max]
  2246. */
  2247. int choose(int min, int max);
  2248.  
  2249. struct posizione{
  2250.     int x;
  2251.     int y;
  2252. };
  2253.  
  2254. struct matrice{
  2255.     int **matrice;
  2256.     int righe;
  2257.     int colonne;
  2258. };
  2259.  
  2260. struct matchar{
  2261.     char **matrice;
  2262.     int righe;
  2263.     int colonne;
  2264.     char scenario[ML];
  2265. };
  2266.  
  2267.  
  2268. struct listaPunti{
  2269.     Pos pos;
  2270.     struct listaPunti *next;
  2271. };
  2272.  
  2273. int inputInt();
  2274. int **allocaMat(int righe, int colonne);
  2275. char **allocaMatchar(int righe, int colonne);
  2276. Matrice newMatrice();
  2277. Matchar newMatchar();
  2278. void setMatrice(Matrice this);
  2279. void setRandomMatrice(Matrice this);
  2280. void setRandomMatchar(Matchar this);
  2281. void initMatchar(Matchar this);
  2282. void initMatrice(Matrice this);
  2283. void getMatrice(Matrice this);
  2284. void getMatchar(Matchar this);
  2285. void mappaMostri(Matchar this);
  2286. void mappaOggetti(Matchar this);
  2287.  
  2288. void saveMatchar(Matchar this,FILE *f);
  2289. void saveMatrice(Matrice this);
  2290. Matchar loadMatchar(char *nomefile);
  2291. void loadMatrice(Matchar this);
  2292.  
  2293. void start(Matchar this, Giocatore eroe);
  2294. Matchar menu();
  2295. void menu1(Matchar this);
  2296. /* v da fare v */
  2297. Matchar menu2();
  2298. void edita(Matchar this);
  2299. int choose(int min, int max);
  2300.  
  2301. void game();
  2302. Matchar new_game(Giocatore eroe);
  2303. Matchar load(Giocatore eroe);
  2304. void story(Matchar mappa, Giocatore eroe);
  2305. int battle(Giocatore eroe, Mostro m);
  2306. void level_up(Giocatore eroe);
  2307.  
  2308. void salva(const Giocatore eroe, const Matchar mappa);
  2309. Matchar carica(Giocatore eroe, char *nomefile);
  2310.  
  2311. void creaGiocatore(const Giocatore eroe);
  2312. void pausa(Giocatore eroe, Matchar mappa);
  2313. void cercaPosizione(Matchar this, Pos *pos);
  2314. Inventario caricaInv(FILE *f);
  2315. void salvaInv(Inventario inv, FILE *f);
  2316. int cercaInventario(Inventario inv, char *nome);
  2317. void settaEquip(const Giocatore eroe, int toggle);
  2318. int cercaCura(Cura *cura, char *nome);
  2319. int cercaArma(arma *weapon, char *nome);
  2320. int cercaProtezione(protezione *prot, char *nome);
  2321. void cercaAccessorio(accessorio *acc, char *nome, int *atk, int *def);
  2322. Inventario rimuoviOggetto(Inventario inv, char *nome);
  2323. int leggiInventario(Inventario inv, int toggle);
  2324. Inventario addInventario(Inventario inv, Oggetto object);
  2325.  
  2326. void print(char **stringhe, int quanti, int quale);
  2327. void loadLivello(Matchar this, char *nomeScena);
  2328. void negozio(Giocatore eroe, Matchar this);
  2329. char **inventString(Inventario inv);
  2330. int conta(Inventario inv);
  2331. void cercaPng1(Matchar this, Pos *coord);
  2332.  
  2333. Punti singolo(Pos pos);
  2334. Punti addCoda(Punti old, Pos pos);
  2335. Punti moveMonster(Matchar ok, Pos then);
  2336. Punti removeTesta(Punti a, Pos *then);
  2337.  
  2338. Punti freePunti(Punti old);
  2339.  
  2340. void print2(char **stringhe, int quante, int quale);
  2341. void parla(Matchar this, Giocatore eroe);
  2342.  
  2343. #endif // header guard
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement