#include <ncurses.h>
#include <string.h>
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>

// Scape Room (SR) - Fanta <fanta@56k.es>
// gcc sr.c -std=c99 -lncurses -o sr

// Game Variables

char   gCommand[50];
int    gScore=0, gIdRoom=0;
float  gVersion=0.1;

// Game Functions

const char* checkRoom(int idRoom){
  if(gIdRoom == 0){
    mvprintw(1,0,"Sotano 9");
    mvprintw(2,0,"La SALA está completamente a oscuras y HUELE raro.\nEn tu BOLSILLO llevas un MECHERO pero no vas a ENCENDERLO porque podría ser peligroso.\n");
  }
  if(gIdRoom == 1){
    mvprintw(1,0,"Sotano 8");
    mvprintw(2,0,"Se cierra la COMPUERTA. La nueva SALA está bien iluminada. En el centro de la SALA una SILLA.\nEn una de las 4 paredes una PUERTA\nEn la PUERTA una CERRADURA.");
  }
  if(gIdRoom == 2){
    mvprintw(1,0,"Sotano 8");
    mvprintw(2,0,"La nueva SALA está bien iluminada. En el centro de la SALA una SILLA rota.\nEn una de las 4 paredes una PUERTA\nEn la PUERTA una CERRADURA.");
  }
  if(gIdRoom == 3){
    mvprintw(1,0,"Sotano 7");
    mvprintw(2,0,"bla bla bla.");
  }
}

int  clearLines(int lineStart, int lineEnd){ for (int i = lineStart; i < lineEnd; i++){ move(i,0); clrtoeol(); refresh(); } }
void exitGame(){ endwin(); exit(0); }
void room(){ clearLines(1,100); checkRoom(gIdRoom); refresh(); }
void score(){ clearLines(1,100); mvprintw(1,0,"%d",gScore); refresh(); }
void version(){ clearLines(1,100); mvprintw(1,0,"%.1f",gVersion); refresh(); }

void readyToInputCommand(){ scanw("%s", gCommand); }
void drawInputArea(){ clearLines(0,1); mvprintw(0,0,"# "); refresh(); }

void help(){
  clearLines(1,100);
  mvprintw(1,0,"help\t Show help");
  mvprintw(2,0,"exit\t Exit of here");
  mvprintw(3,0,"score\t Show the score");
  mvprintw(4,0,"room\t Show room info");
  mvprintw(5,0,"version\t Show Scape Room Version");
  mvprintw(6,0,"clear\t Clear text in output area");
  refresh();
}

void checkInput(){
  if(strcmp("exit",gCommand) == 0){ exitGame(); }
  if(strcmp("help",gCommand) == 0){ help(); }
  if(strcmp("score",gCommand) == 0){ score(); }
  if(strcmp("room",gCommand) == 0){ room(); }
  if(strcmp("version",gCommand) == 0){ version(); }
  if(strcmp("clear",gCommand) == 0){ clearLines(1,100); refresh(); }
  if(strcmp("desc",gCommand) == 0){ room(); }
  if(gIdRoom == 0){ if(strcmp("encender",gCommand) == 0){ clearLines(1,100); mvprintw(1,0,"Enciendes el mechero y MUERES en una explosión. Eres una persona muuy toonta."); refresh(); sleep(5); exitGame(); } }
  if(gIdRoom == 0){ if(strcmp("autor",gCommand) == 0){ clearLines(1,100); mvprintw(1,0,"El AUTOR me habló de sotanos y de una recompensa si consigo salir con vida. Eso creo recordar ahora mismo."); refresh(); } }
  if(gIdRoom == 0){ if(strcmp("enciendas",gCommand) == 0){ clearLines(1,100); mvprintw(1,0,"Enciendes el mechero y MUERES en una explosión. Eres una persona muuy toonta."); refresh(); sleep(5); exitGame(); } }
  if(gIdRoom == 0){ if(strcmp("encenderlo",gCommand) == 0){ clearLines(1,100); mvprintw(1,0,"Enciendes el mechero y MUERES en una explosión. No podías resistir la tentación. Eres una persona muuy toonta la verdad sea dicha."); refresh(); sleep(8); exitGame(); } }
  if(gIdRoom == 0){ if(strcmp("mechero",gCommand) == 0){ clearLines(1,100); mvprintw(1,0,"Lo palpas y es un MECHERO. No lo ENCIENDAS."); refresh(); } }
  if(gIdRoom == 0){ if(strcmp("oler",gCommand) == 0){ clearLines(1,100); mvprintw(1,0,"Claramente HUELE a GASOLINA. Prender el MECHERO sería muy muy peligroso."); refresh(); } }
  if(gIdRoom == 0){ if(strcmp("huele",gCommand) == 0){ clearLines(1,100); mvprintw(1,0,"HUELE a una especie de combustible, como GASOLINA. No ENCIENDAS el MECHERO."); refresh(); } }
  if(gIdRoom == 0){ if(strcmp("gasolina",gCommand) == 0){ clearLines(1,100); mvprintw(1,0,"Cantas una canción que dice así: A ella le gusta la GASOLINA, dame más gasoliiina ...\n\nEscuchas el sonido de una SILLA en el techo, has incomodado a alguien.\n\nAl cabo de unos minutos una COMPUERTA en el techo se abre y cae una cuerda.\nSubes por la cuerda y se te cae el MECHERO.\n\nEstás ahora en otra ROOM."); gScore=10, gIdRoom=1; refresh(); } }
  if(gIdRoom == 0){ if(strcmp("sala",gCommand) == 0){ clearLines(1,100); mvprintw(1,0,"No se ve un CAGARRO en esta SALA. pero tienes un MECHERO que podrías ENCENDER para ver mejor."); refresh(); } }
  if(gIdRoom == 0){ if(strcmp("bolsillo",gCommand) == 0){ clearLines(1,100); mvprintw(1,0,"Palpas tus BOLSILLOS y solamente llevas un MECHERO."); refresh(); } }
  if(gIdRoom == 0){ if(strcmp("bolsillos",gCommand) == 0){ clearLines(1,100); mvprintw(1,0,"Palpas tus BOLSILLOS y solamente llevas un maldito MECHERO."); refresh(); } }
  if(gIdRoom == 0){ if(strcmp("cagarro",gCommand) == 0){ clearLines(1,100); mvprintw(1,0,"No se ve ni se HUELE ningún CAGARRO.\nSi puedes OLER algo que podría ser GASOLINA."); refresh(); } }
  if(gIdRoom == 0){ if(strcmp("ver",gCommand) == 0){ clearLines(1,100); mvprintw(1,0,"No se ve un CAGARRO en esta SALA. Para una descripción usa ROOM o DESC."); refresh(); } }
  if(gIdRoom == 0){ if(strcmp("compuerta",gCommand) == 0){ clearLines(1,100); mvprintw(1,0,"No se ve un CAGARRO pero tienes la impresión de que en el techo de la SALA existe una COMPUERTA a la que no llegas."); refresh(); } }
  if(gIdRoom == 1){ if(strcmp("mechero",gCommand) == 0){ clearLines(1,100); mvprintw(1,0,"Ya no tienes el MECHERO. Se ha caido mientras subias por la cuerda."); refresh(); } }
  if(gIdRoom == 1){ if(strcmp("compuerta",gCommand) == 0){ clearLines(1,100); mvprintw(1,0,"Te colocas encima de la COMPUERTA y se rompe. Caes al sotano 9 y MUERES del golpe."); refresh(); sleep(5); exitGame(); } }
  if(gIdRoom == 1){ if(strcmp("sala",gCommand) == 0){ clearLines(1,100); mvprintw(1,0,"El AUTOR de estas pruebas me dijo que para poder SALIR tendría que pasar por 9 SOTANOS.\nEsta SALA es por tanto el Sotano 8."); refresh(); } }
  if(gIdRoom == 1){ if(strcmp("autor",gCommand) == 0){ clearLines(1,100); mvprintw(1,0,"El AUTOR de las pruebas es un tal Fanta.\nPrometió darme 1 millón de dolares si consigo SALIR con vida de aquí."); refresh(); } }
  if(gIdRoom == 1){ if(strcmp("sotanos",gCommand) == 0){ clearLines(1,100); mvprintw(1,0,"Los direrentes SOTANOS están a diferentes niveles. Para SALIR con vida se tiene que pasar por todos."); refresh(); } }
  if(gIdRoom == 1){ if(strcmp("salir",gCommand) == 0){ clearLines(1,100); mvprintw(1,0,"Todo el mundo quiere SALIR de estos SOTANOS. Pero nadie lo ha conseguido aún."); refresh(); } }
  if(gIdRoom == 1){ if(strcmp("mueres",gCommand) == 0){ clearLines(1,100); mvprintw(1,0,"La vida es lo que pasa mientras MUERES."); refresh(); } }
  if(gIdRoom == 1){ if(strcmp("silla",gCommand) == 0){ clearLines(1,100); mvprintw(1,0,"Te acercas a la SILLA. Se nota que alguien ha estado sentado hace poco tiempo. La palpas y está caliente.\nNotas un BULTO en la SILLA."); refresh(); } }
  if(gIdRoom == 1){ if(strcmp("bulto",gCommand) == 0){ clearLines(1,100); mvprintw(1,0,"El BULTO parece el de una LLAVE. Estaría bien ROMPER la SILLA para sacar la LLAVE."); refresh(); } }
  if(gIdRoom == 1){ if(strcmp("llave",gCommand) == 0){ clearLines(1,100); mvprintw(1,0,"Una LLAVE suele servir para abrir y cerrar cosas. Parece que bajo el BULTO en la SILLA podríamos tener una."); refresh(); } }
  if(gIdRoom == 1){ if(strcmp("romper",gCommand) == 0){ clearLines(1,100); mvprintw(1,0,"Rompes la SILLA y bajo el BULTO se encuentra la LLAVE. Coges la LLAVE."); refresh(); sleep(3); gScore=15, gIdRoom=2; refresh();  } }
  if(gIdRoom == 1){ if(strcmp("puerta",gCommand) == 0){ clearLines(1,100); mvprintw(1,0,"La puerta es bien bonita. Tiene una CERRADURA."); refresh(); } }
  if(gIdRoom == 1){ if(strcmp("puertas",gCommand) == 0){ clearLines(1,100); mvprintw(1,0,"La puerta es bien bonita. Tiene una CERRADURA."); refresh(); } }
  if(gIdRoom == 1){ if(strcmp("cerradura",gCommand) == 0){ clearLines(1,100); mvprintw(1,0,"Si tuvieras una LLAVE podrías probar a meterla en la CERRADURA.\nPero no tienes una LLAVE."); refresh(); } }
  if(gIdRoom == 2){ if(strcmp("mechero",gCommand) == 0){ clearLines(1,100); mvprintw(1,0,"Ya no tienes el MECHERO. Se ha caido mientras subias por la cuerda."); refresh(); } }
  if(gIdRoom == 2){ if(strcmp("compuerta",gCommand) == 0){ clearLines(1,100); mvprintw(1,0,"Te colocas encima de la COMPUERTA y se rompe. Caes y MUERES del golpe y de inmediato."); refresh(); sleep(5); exitGame(); } }
  if(gIdRoom == 2){ if(strcmp("sala",gCommand) == 0){ clearLines(1,100); mvprintw(1,0,"Continuas estando en la SALA llamada Sotano 8."); refresh(); } }
  if(gIdRoom == 2){ if(strcmp("autor",gCommand) == 0){ clearLines(1,100); mvprintw(1,0,"El AUTOR de las pruebas es un tal Fanta.\nEs buena gente."); refresh(); } }
  if(gIdRoom == 2){ if(strcmp("sotanos",gCommand) == 0){ clearLines(1,100); mvprintw(1,0,"Los direrentes SOTANOS están a diferentes niveles. Para SALIR con vida se tiene que pasar por todos."); refresh(); } }
  if(gIdRoom == 2){ if(strcmp("salir",gCommand) == 0){ clearLines(1,100); mvprintw(1,0,"Todo el mundo quiere SALIR de estos SOTANOS. Nadie lo ha conseguido aún."); refresh(); } }
  if(gIdRoom == 2){ if(strcmp("mueres",gCommand) == 0){ clearLines(1,100); mvprintw(1,0,"La vida es lo que pasa mientras MUERES."); refresh(); } }
  if(gIdRoom == 2){ if(strcmp("silla",gCommand) == 0){ clearLines(1,100); mvprintw(1,0,"Has dejado la silla rota. Sacaste de su interior una LLAVE."); refresh(); } }
  if(gIdRoom == 2){ if(strcmp("bulto",gCommand) == 0){ clearLines(1,100); mvprintw(1,0,"El BULTO ya no existe, te has cargado la SILLA para sacar una LLAVE."); refresh(); } }
  if(gIdRoom == 2){ if(strcmp("llave",gCommand) == 0){ clearLines(1,100); mvprintw(1,0,"Una LLAVE plateada tienes en tu poder. Suelen usarse en PUERTAS por ejemplo."); refresh(); } }
  if(gIdRoom == 2){ if(strcmp("romper",gCommand) == 0){ clearLines(1,100); mvprintw(1,0,"Con esto ya has roto suficiente por hoy."); refresh();  } }
  if(gIdRoom == 2){ if(strcmp("puerta",gCommand) == 0){ clearLines(1,100); mvprintw(1,0,"La puerta es bien chingona. Tiene una CERRADURA bien chingona también."); refresh(); } }
  if(gIdRoom == 2){ if(strcmp("puertas",gCommand) == 0){ clearLines(1,100); mvprintw(1,0,"La puerta es bien chingona. Tiene una CERRADURA bien chingona también."); refresh(); } }
  if(gIdRoom == 2){ if(strcmp("cerradura",gCommand) == 0){ clearLines(1,100); mvprintw(1,0,"Metes la LLAVE en la CERRADURA y la PUERTA se abre.\nPasas por la puerta e inmediatamente se cierra quedando la llave por el otro lado (la has perdido manazas)\n\nEstás en un ascensor en el que solamente puedes pulsar un botón para subir.\nPulsas y subes\nAl salir en el nuevo piso alguien te golpea y quedas insconciente\n\nAl recobrar la consciencia estás en medio del sotano 7."); gScore=20, gIdRoom=3; refresh(); } }
}


// Main Function

int main() {
  initscr();
  for(;;){
    drawInputArea();
    readyToInputCommand();
    checkInput();
  }
}
